X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=test%2FAFB.js;h=b07efc5e6ca0b31a3b240b15decd49ba15df868b;hb=refs%2Fheads%2Fsandbox%2FDDTLK%2Fpakage;hp=c77e5e60056093083902762c3fdeb4e411fb85b6;hpb=26bca5f8a8c6f9403a84945a5cd914b6da948efd;p=src%2Fapp-framework-binder.git diff --git a/test/AFB.js b/test/AFB.js index c77e5e60..b07efc5e 100644 --- a/test/AFB.js +++ b/test/AFB.js @@ -1,7 +1,32 @@ +/* + * Copyright (C) 2017, 2018 "IoT.bzh" + * Author: José Bollo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ AFB = function(base, initialtoken){ -var urlws = "ws://"+window.location.host+"/"+base; -var urlhttp = "http://"+window.location.host+"/"+base; +if (typeof base != "object") + base = { base: base, token: initialtoken }; + +var initial = { + base: base.base || "api", + token: base.token || initialtoken || "HELLO", + host: base.host || window.location.host, + url: base.url || undefined +}; + +var urlws = initial.url || "ws://"+initial.host+"/"+initial.base; /*********************************************/ /**** ****/ @@ -11,7 +36,7 @@ var urlhttp = "http://"+window.location.host+"/"+base; var AFB_context; { var UUID = undefined; - var TOKEN = initialtoken; + var TOKEN = initial.token; var context = function(token, uuid) { this.token = token; @@ -41,14 +66,16 @@ var AFB_websocket; var PROTO1 = "x-afb-ws-json1"; - AFB_websocket = function(onopen, onabort) { - var u = urlws; + AFB_websocket = function(on_open, on_abort) { + var u = urlws, p = '?'; if (AFB_context.token) { u = u + '?x-afb-token=' + AFB_context.token; - if (AFB_context.uuid) - u = u + '&x-afb-uuid=' + AFB_context.uuid; + p = '&'; } + if (AFB_context.uuid) + u = u + p + 'x-afb-uuid=' + AFB_context.uuid; this.ws = new WebSocket(u, [ PROTO1 ]); + this.url = u; this.pendings = {}; this.awaitens = {}; this.counter = 0; @@ -56,8 +83,8 @@ var AFB_websocket; this.ws.onerror = onerror.bind(this); this.ws.onclose = onclose.bind(this); this.ws.onmessage = onmessage.bind(this); - this.onopen = onopen; - this.onabort = onabort; + this.onopen = on_open; + this.onabort = on_abort; } function onerror(event) { @@ -65,7 +92,7 @@ var AFB_websocket; if (f) { delete this.onopen; delete this.onabort; - f && f(this); + f(this); } this.onerror && this.onerror(this); } @@ -78,9 +105,15 @@ var AFB_websocket; } function onclose(event) { + var err = { + jtype: 'afb-reply', + request: { + status: 'disconnected', + info: 'server hung up' + } + }; for (var id in this.pendings) { - var ferr = this.pendings[id].onerror; - ferr && ferr(null, this); + try { this.pendings[id][1](err); } catch (x) {/*NOTHING*/} } this.pendings = {}; this.onclose && this.onclose(); @@ -105,8 +138,7 @@ var AFB_websocket; if (id in pendings) { var p = pendings[id]; delete pendings[id]; - var f = p[offset]; - f(ans); + try { p[offset](ans); } catch (x) {/*TODO?*/} } } @@ -119,27 +151,39 @@ var AFB_websocket; switch (code) { case RETOK: reply(this.pendings, id, ans, 0); - break; + break; case RETERR: reply(this.pendings, id, ans, 1); - break; + break; case EVENT: default: fire(this.awaitens, id, ans); - break; + break; } } function close() { this.ws.close(); + this.ws.onopen = + this.ws.onerror = + this.ws.onclose = + this.ws.onmessage = + this.onopen = + this.onabort = function(){}; } - function call(method, request) { + function call(method, request, callid) { return new Promise((function(resolve, reject){ var id, arr; - do { - id = String(this.counter = 4095 & (this.counter + 1)); - } while (id in this.pendings); + if (callid) { + id = String(callid); + if (id in this.pendings) + throw new Error("pending callid("+id+") exists"); + } else { + 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);