diff options
author | José Bollo <jose.bollo@iot.bzh> | 2016-04-08 17:51:09 +0200 |
---|---|---|
committer | José Bollo <jose.bollo@iot.bzh> | 2016-04-08 17:51:09 +0200 |
commit | e7cd169beafdcdb7f268184b0d8d75dff2c82e9c (patch) | |
tree | b09d01dedbd91b8ecde548c4abd844f5020d858c /test | |
parent | e267cc7d7ab546abea72549e425042403dd76bc6 (diff) |
proposal for a new js interface
Change-Id: Icd9908fa976bf0020eff5ad25995bad1771bfa98
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
Diffstat (limited to 'test')
-rw-r--r-- | test/AFB.html | 42 | ||||
-rw-r--r-- | test/AFB.js | 129 | ||||
-rw-r--r-- | test/index.html | 1 |
3 files changed, 172 insertions, 0 deletions
diff --git a/test/AFB.html b/test/AFB.html new file mode 100644 index 00000000..344eb158 --- /dev/null +++ b/test/AFB.html @@ -0,0 +1,42 @@ +<html> +<head> + <title>Test of AFB Echo</title> + <script type="text/javascript" src="AFB.js"></script> + <script type="text/javascript"> + var afb = new AFB("api", "hello-token"); + var ws; + + function onopen() { + document.getElementById("main").style.visibility = "visible"; + document.getElementById("connected").innerHTML = "Connected to WebSocket server"; + } + function onabort() { + document.getElementById("main").style.visibility = "hidden"; + document.getElementById("connected").innerHTML = "Connected Closed"; + } + function init() { + ws = new afb.ws(onopen, onabort); + } + function replyok(obj) { + document.getElementById("output").innerHTML = "OK: "+JSON.stringify(obj); + } + function replyerr(obj) { + document.getElementById("output").innerHTML = "ERROR: "+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); + } + </script> + +<body onload="init();"> + <h1>WebSocket Echo</h1> + <div id="connected">Not Connected</div> + <div id="main" style="visibility:hidden"> + API: <input type="text" id="api" value="hello" size="80"/><br/> + 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> + </div> + diff --git a/test/AFB.js b/test/AFB.js new file mode 100644 index 00000000..d0febcd6 --- /dev/null +++ b/test/AFB.js @@ -0,0 +1,129 @@ +AFB = function(base, initialtoken){ + +var urlws = "ws://"+window.location.host+"/"+base; +var urlhttp = "http://"+window.location.host+"/"+base; + +/*********************************************/ +/**** ****/ +/**** AFB_context ****/ +/**** ****/ +/*********************************************/ +var AFB_context; +{ + var UUID = undefined; + var TOKEN = initialtoken; + + AFB_context = function(token, uuid) { + this.token = token; + this.uuid = uuid; + } + + AFB_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_websocket ****/ +/**** ****/ +/*********************************************/ +var AFB_websocket; +{ + var CALL = 2; + var RETOK = 3; + var RETERR = 4; + + var PROTO1 = "x-afb-ws-json1"; + + AFB_websocket = function(onopen, onabort, ctx) { + this.ws = new WebSocket(urlws, [ PROTO1 ]); + this.pendings = {}; + 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); + this.ws.onmessage = onmessage.bind(this); + this.onopen = onopen; + this.onabort = onabort; + } + + function onerror(event) { + var f = this.onabort; + if (f) { + delete this.onopen; + delete this.onabort; + f && f(this); + } + this.onerror && this.onerror(this); + } + + function onopen(event) { + var f = this.onopen; + delete this.onopen; + delete this.onabort; + f && f(this); + } + + function onclose(event) { + for (var id in this.pendings) { + var ferr = this.pendings[id].onerror; + ferr && ferr(null, this); + } + this.pendings = {}; + this.onclose && this.onclose(); + } + + 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]; + } + switch (code) { + case RETOK: + pend && pend.onsuccess && pend.onsuccess(ans, this); + break; + case RETERR: + default: + pend && pend.onerror && pend.onerror(ans, this); + break; + } + } + + function close() { + 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)); + } + + AFB_websocket.prototype = { + close: close, + call: call + }; +} +/*********************************************/ +/**** ****/ +/**** ****/ +/**** ****/ +/*********************************************/ +return { + context: AFB_context, + ws: AFB_websocket +}; +}; + diff --git a/test/index.html b/test/index.html index 66b36190..5103a833 100644 --- a/test/index.html +++ b/test/index.html @@ -8,3 +8,4 @@ <li><a href="client-ctx.html">client context</a> <li><a href="sample-post.html">Sample post</a> <li><a href="websock.html">websockets</a> + <li><a href="AFB.html">AFB.js</a> |