summaryrefslogtreecommitdiff
path: root/src/ws/proto.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/ws/proto.js')
-rw-r--r--src/ws/proto.js211
1 files changed, 211 insertions, 0 deletions
diff --git a/src/ws/proto.js b/src/ws/proto.js
new file mode 100644
index 0000000..5a71157
--- /dev/null
+++ b/src/ws/proto.js
@@ -0,0 +1,211 @@
+/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+
+function get_appropriate_ws_url()
+{
+ // From: https://gist.github.com/2428561
+ var parser = document.createElement('a');
+ parser.href = document.URL;
+
+ // We open the websocket encrypted if this page came on an
+ // https:// url itself, otherwise unencrypted
+ if(parser.protocol == "http:") parser.protocol = "ws:";
+ if(parser.protocol == "https:") parser.protocol = "wss:";
+
+ return parser.href;
+}
+
+var socket_node = new WebSocket(get_appropriate_ws_url(), "lws-node-protocol");
+
+try {
+ socket_node.onopen = function() {
+ var connectEvent = new CustomEvent("connectEvent", {
+ detail: {
+ time: new Date(),
+ },
+ bubbles: true,
+ cancelable: true
+ });
+ document.dispatchEvent(connectEvent);
+ }
+
+ socket_node.onmessage = function got_packet(msg) {
+ var messageEvent = new CustomEvent("messageEvent", {
+ detail: {
+ message: "recv [" + msg.data + "]",
+ time: new Date(),
+ },
+ bubbles: true,
+ cancelable: true
+ });
+ document.dispatchEvent(messageEvent);
+
+ var msgs = new Array();
+ var idx = 0;
+ msgs[idx] = '';
+ var c = 0;
+ var instring = false;
+ for(c = 0; c < msg.data.length; c++) {
+ if(msg.data[c] == '"' && c > 0 && msg.data[c - 1] != '\\') instring = !instring;
+ if(msg.data[c] == ';' && instring == false) {
+ idx++;
+ msgs[idx] = '';
+ }
+ if(msg.data[c] != ';' || instring == true) msgs[idx] += msg.data[c];
+ }
+
+ f = 0;
+ while (f < msgs.length - 1) {
+ var msg = new Array();
+ instring = false;
+ idx = 0;
+
+ // Strip padding and trailing whitespace.
+ var msgstr = msgs[f].replace(/^\s+||\s+$/g,'');
+
+ if(msgstr == ';') {
+ f++;
+ continue;
+ }
+
+ msg[idx] = '';
+ for(c = 0; c < msgstr.length; c++) {
+ if(msgstr[c] == '"' && c > 0 && msgstr[c - 1] != '\\') {
+ instring = !instring;
+ continue;
+ }
+ if(msgstr[c] == ' ' && instring == false) {
+ msg[idx] = msg[idx].replace("\\\\","\\").replace("\\\"","\"");
+ idx++;
+ msg[idx] = '';
+ }
+ if(msgstr[c] != ' ' || instring == true) msg[idx] += msgstr[c];
+ }
+
+ var subscribeid = msg[0];
+ var cmd = msg[1];
+ var id = msg[2];
+
+ if(cmd == "remove") {
+ var removeEvent = new CustomEvent("removeEvent", {
+ detail: {
+ subscribeid: subscribeid,
+ id: id,
+ },
+ bubbles: true,
+ cancelable: true
+ });
+ document.dispatchEvent(removeEvent);
+ }
+ else if(cmd == "move") {
+ var moveEvent = new CustomEvent("moveEvent", {
+ detail: {
+ subscribeid: subscribeid,
+ id: id,
+ parentid: msg[3],
+ },
+ bubbles: true,
+ cancelable: true
+ });
+ document.dispatchEvent(moveEvent);
+ }
+ else if(cmd == "create") {
+ var createEvent = new CustomEvent("createEvent", {
+ detail: {
+ subscribeid: subscribeid,
+ id: id,
+ parentid: msg[3],
+ },
+ bubbles: true,
+ cancelable: true
+ });
+ document.dispatchEvent(createEvent);
+ }
+ else if(cmd == "update") {
+ var updateEvent = new CustomEvent("updateEvent", {
+ detail: {
+ subscribeid: subscribeid,
+ id: id,
+ name: msg[3],
+ value: msg[4],
+ },
+ bubbles: true,
+ cancelable: true
+ });
+ document.dispatchEvent(updateEvent);
+ }
+ f++;
+ }
+ }
+
+ socket_node.onclose = function(){
+ var disconnectEvent = new CustomEvent("disconnectEvent", {
+ detail: {
+ time: new Date(),
+ },
+ bubbles: true,
+ cancelable: true
+ });
+ document.dispatchEvent(disconnectEvent);
+ }
+} catch(exception) {
+ alert('<p>Error' + exception + '</p>');
+}
+
+function transmit(msg)
+{
+ //LogEvent(msg);
+ var messageEvent = new CustomEvent("messageEvent", {
+ detail: {
+ message: "send [" + msg + "]",
+ time: new Date(),
+ },
+ bubbles: true,
+ cancelable: true
+ });
+ document.dispatchEvent(messageEvent);
+
+ socket_node.send(msg);
+}
+
+function login(user, password)
+{
+ transmit("login "+user+" "+password);
+}
+
+function logout()
+{
+ transmit("logout");
+}
+
+function subscribe(id)
+{
+ transmit("subscribe "+id);
+}
+
+function unsubscribe(id)
+{
+ transmit("unsubscribe "+id);
+}
+
+function create(id, parent)
+{
+ transmit("create "+id+" "+parent);
+}
+
+function remove(id)
+{
+ transmit("remove "+id);
+}
+
+function update(id, name, value)
+{
+ transmit("update "+id+" "+name+" "+value);
+}
+
+function move(id, parent)
+{
+ transmit("move "+id+" "+parent);
+}
+
+