diff options
author | José Bollo <jose.bollo@iot.bzh> | 2016-04-20 16:51:42 +0200 |
---|---|---|
committer | José Bollo <jose.bollo@iot.bzh> | 2016-04-20 16:51:42 +0200 |
commit | 94ad734842c1359a012f9850b851063637d3e061 (patch) | |
tree | e962852735e0f0b7d492466068b4ea66a96e4cc4 | |
parent | ec24258a5e9d39b5fd1d4f127d2d335a853e0fe5 (diff) |
javascript reference with promise and event
Change-Id: I77633c0be2338ce4d03f84884462836604d932c8
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
-rw-r--r-- | test/AFB.html | 7 | ||||
-rw-r--r-- | test/AFB.js | 61 |
2 files changed, 48 insertions, 20 deletions
diff --git a/test/AFB.html b/test/AFB.html index 344eb158..a1a4bf59 100644 --- a/test/AFB.html +++ b/test/AFB.html @@ -9,6 +9,7 @@ function onopen() { document.getElementById("main").style.visibility = "visible"; document.getElementById("connected").innerHTML = "Connected to WebSocket server"; + ws.onevent("*", gotevent); } function onabort() { document.getElementById("main").style.visibility = "hidden"; @@ -23,10 +24,13 @@ function replyerr(obj) { document.getElementById("output").innerHTML = "ERROR: "+JSON.stringify(obj); } + function gotevent(obj) { + document.getElementById("outevt").innerHTML = JSON.stringify(obj); + } function send(message) { var api = document.getElementById("api").value; var verb = document.getElementById("verb").value; - ws.call(api, verb, {data:message}, replyok, replyerr); + ws.call(api+"/"+verb, {data:message}).then(replyok, replyerr); } </script> @@ -38,5 +42,6 @@ VERB: <input type="text" id="verb" value="ping" size="80"/><br/> Enter Message: <input type="text" name="message" value="" size="80" onchange="send(this.value)"/><br/> Server says... <div id="output"></div> + Events: <div id="outevt"></div> </div> diff --git a/test/AFB.js b/test/AFB.js index 44b1a908..ae2fd8b8 100644 --- a/test/AFB.js +++ b/test/AFB.js @@ -80,28 +80,46 @@ var AFB_websocket; this.onclose && this.onclose(); } + function fire(awaitens, name, data) { + var a = awaitens[name]; + if (a) + a.forEach(function(handler){handler(data);}); + var i = name.indexOf("/"); + if (i >= 0) { + a = awaitens[name.substring(0,i)]; + if (a) + a.forEach(function(handler){handler(data);}); + } + a = awaitens["*"]; + if (a) + a.forEach(function(handler){handler(data);}); + } + + function reply(pendings, id, ans, offset) { + if (id in pendings) { + var p = pendings[id]; + delete pendings[id]; + var f = p[offset]; + f(ans); + } + } + function onmessage(event) { var obj = JSON.parse(event.data); var code = obj[0]; var id = obj[1]; var ans = obj[2]; AFB_context.token = obj[3]; - var pend; - if (id && id in this.pendings) { - pend = this.pendings[id]; - delete this.pendings[id]; - } switch (code) { - case EVENT: - var a = this.awaitens[id]; - if (a) - a.forEach(function(handler){handler(ans);}); case RETOK: - pend && pend.onsuccess && pend.onsuccess(ans, this); + reply(this.pendings, id, ans, 0); break; case RETERR: + reply(this.pendings, id, ans, 1); + break; + case EVENT: default: - pend && pend.onerror && pend.onerror(ans, this); + fire(this.awaitens, id, ans); break; } } @@ -110,16 +128,21 @@ var AFB_websocket; this.ws.close(); } - function call(api, verb, request, onsuccess, onerror) { - var id = String(++this.counter); - this.pendings[id] = { onsuccess: onsuccess, onerror: onerror }; - var arr = [CALL, id, api+"/"+verb, request ]; - if (AFB_context.token) arr.push(AFB_context.token); - this.ws.send(JSON.stringify(arr)); + function call(method, request) { + return new Promise((function(resolve, reject){ + var id, arr; + do { + id = String(this.counter = 4095 & (this.counter + 1)); + } while (id in this.pendings); + this.pendings[id] = [ resolve, reject ]; + arr = [CALL, id, method, request ]; + if (AFB_context.token) arr.push(AFB_context.token); + this.ws.send(JSON.stringify(arr)); + }).bind(this)); } - function onevent(api, name, handler) { - var id = api+"/"+name; + function onevent(name, handler) { + var id = name; var list = this.awaitens[id] || (this.awaitens[id] = []); list.push(handler); } |