summaryrefslogtreecommitdiffstats
path: root/htdocs/iotbzh-Binding.js
blob: d2d870cb7b847a8ea7fa37d14b3a328ac8eb1f89 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
var afb = new AFB("api", "mysecret");
var ws;
var evtidx = 0;
var count = 0;


//**********************************************
// Logger
//**********************************************
var log = {
	command: function (api, verb, query) {
		console.log("subscribe api=" + api + " verb=" + verb + " query=", query);
		var question = urlws + "/" + api + "/" + verb + "?query=" + JSON.stringify(query);
		log._write("question", count + ": " + log.syntaxHighlight(question));
	},

	event: function (obj) {
		console.log("gotevent:" + JSON.stringify(obj));
		log._write("outevt", (evtidx++) + ": " + JSON.stringify(obj));
	},

	reply: function (obj) {
		console.log("replyok:" + JSON.stringify(obj));
		log._write("output", count + ": OK: " + log.syntaxHighlight(obj));
	},

	error: function (obj) {
		console.log("replyerr:" + JSON.stringify(obj));
		log._write("output", count + ": ERROR: " + log.syntaxHighlight(obj));
	},

	_write: function (element, msg) {
		var el = document.getElementById(element);
		el.innerHTML += msg + '\n';

		// auto scroll down
		setTimeout(function () {
			el.scrollTop = el.scrollHeight;
		}, 100);
	},

	syntaxHighlight: function (json) {
		if (typeof json !== 'string') {
			json = JSON.stringify(json, undefined, 2);
		}
		json = json.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
		return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
			var cls = 'number';
			if (/^"/.test(match)) {
				if (/:$/.test(match)) {
					cls = 'key';
				} else {
					cls = 'string';
				}
			} else if (/true|false/.test(match)) {
				cls = 'boolean';
			} else if (/null/.test(match)) {
				cls = 'null';
			}
			return '<span class="' + cls + '">' + match + '</span>';
		});
	},
};

//**********************************************
// Generic function to call binder
//***********************************************
function callbinder(api, verb, query) {
	log.command(api, verb, query);

	// ws.call return a Promise
	return ws.call(api + "/" + verb, query)
		.then(function (res) {
			log.reply(res);
			count++;
			return res;
		})
		.catch(function (err) {
			log.reply(err);
			count++;
			throw err;
		});
}

//**********************************************
// Init - establish Websocket connection
//**********************************************
function init(elemid, api, verb, query) {

	function onopen() {
		document.getElementById("main").style.visibility = "visible";
		document.getElementById("connected").innerHTML = "Binder WS Active";
		document.getElementById("connected").style.background = "lightgreen";
		ws.onevent("*", log.event);
	}

	function onabort() {
		document.getElementById("main").style.visibility = "hidden";
		document.getElementById("connected").innerHTML = "Connected Closed";
		document.getElementById("connected").style.background = "red";
	}

	ws = new afb.ws(onopen, onabort);
}