X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=test%2FAFB.js;h=c77e5e60056093083902762c3fdeb4e411fb85b6;hb=fb78efef43a9ffc8155649818cc7a907dc85cf4a;hp=d0febcd6056b86da46d746202d8aa82f04ef34ae;hpb=e7cd169beafdcdb7f268184b0d8d75dff2c82e9c;p=src%2Fapp-framework-binder.git diff --git a/test/AFB.js b/test/AFB.js index d0febcd6..c77e5e60 100644 --- a/test/AFB.js +++ b/test/AFB.js @@ -13,17 +13,19 @@ var AFB_context; var UUID = undefined; var TOKEN = initialtoken; - AFB_context = function(token, uuid) { + var context = function(token, uuid) { this.token = token; this.uuid = uuid; } - AFB_context.prototype = { + context.prototype = { get token() {return TOKEN;}, set token(tok) {if(tok) TOKEN=tok;}, get uuid() {return UUID;}, set uuid(id) {if(id) UUID=id;} }; + + AFB_context = new context(); } /*********************************************/ /**** ****/ @@ -35,14 +37,21 @@ var AFB_websocket; var CALL = 2; var RETOK = 3; var RETERR = 4; + var EVENT = 5; var PROTO1 = "x-afb-ws-json1"; - AFB_websocket = function(onopen, onabort, ctx) { - this.ws = new WebSocket(urlws, [ PROTO1 ]); + AFB_websocket = function(onopen, onabort) { + var u = urlws; + if (AFB_context.token) { + u = u + '?x-afb-token=' + AFB_context.token; + if (AFB_context.uuid) + u = u + '&x-afb-uuid=' + AFB_context.uuid; + } + this.ws = new WebSocket(u, [ PROTO1 ]); this.pendings = {}; + this.awaitens = {}; this.counter = 0; - this.ctx = ctx || new AFB_context(); this.ws.onopen = onopen.bind(this); this.ws.onerror = onerror.bind(this); this.ws.onclose = onclose.bind(this); @@ -77,24 +86,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]; - this.ctx.token = obj[3]; - var pend; - if (id && id in this.pendings) { - pend = this.pendings[id]; - delete this.pendings[id]; - } + AFB_context.token = obj[3]; switch (code) { 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; } } @@ -103,17 +134,29 @@ 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 (this.ctx.token) arr.push(this.ctx.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(name, handler) { + var id = name; + var list = this.awaitens[id] || (this.awaitens[id] = []); + list.push(handler); } AFB_websocket.prototype = { close: close, - call: call + call: call, + onevent: onevent }; } /*********************************************/