From f6cbb97f1bfddc22697839eaaf4cca92f0dc1701 Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Thu, 10 Apr 2014 08:50:13 -0400 Subject: [PATCH] LP#1268619: websockets: detect connectedness of JS default sockets Signed-off-by: Bill Erickson --- src/javascript/opensrf.js | 20 ++++++++++++++++++-- src/javascript/opensrf_ws.js | 11 ++++++++++- src/javascript/opensrf_ws_shared.js | 4 +++- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/javascript/opensrf.js b/src/javascript/opensrf.js index 997b33f4..f9b0895f 100644 --- a/src/javascript/opensrf.js +++ b/src/javascript/opensrf.js @@ -248,6 +248,13 @@ OpenSRF.Session.prototype.send_xhr = function(osrf_msg, args) { new OpenSRF.XHRequest(osrf_msg, args).send(); }; +OpenSRF.websocketConnected = function() { + return OpenSRF.sharedWebsocketConnected || ( + OpenSRF.websocketConnection && + OpenSRF.websocketConnection.connected() + ); +} + OpenSRF.Session.prototype.send_ws = function(osrf_msg) { if (typeof SharedWorker == 'function') { @@ -303,6 +310,7 @@ OpenSRF.Session.setup_shared_ws = function() { if (data.action == 'message') { // pass all inbound message up the opensrf stack + OpenSRF.sharedWebsocketConnected = true; var msg; try { msg = JSON2js(data.message); @@ -319,8 +327,16 @@ OpenSRF.Session.setup_shared_ws = function() { return; } - if (data.action == 'error') { - throw new Error(data.message); + + if (data.action == 'event') { + console.debug('event type is ' + data.type); + if (data.type.match(/onclose|onerror/)) { + OpenSRF.sharedWebsocketConnected = false; + if (OpenSRF.onWebSocketClosed) + OpenSRF.onWebSocketClosed(); + if (data.type.match(/onerror/)) + throw new Error(data.message); + } } }); diff --git a/src/javascript/opensrf_ws.js b/src/javascript/opensrf_ws.js index 352bd2af..74fc40ee 100644 --- a/src/javascript/opensrf_ws.js +++ b/src/javascript/opensrf_ws.js @@ -21,6 +21,13 @@ OpenSRF.WebSocket = function() { this.pending_messages = []; } +OpenSRF.WebSocket.prototype.connected = function() { + return ( + this.socket && + this.socket.readyState == this.socket.OPEN + ); +} + /** * If our global socket is already open, use it. Otherwise, queue the * message for delivery after the socket is open. @@ -28,7 +35,7 @@ OpenSRF.WebSocket = function() { OpenSRF.WebSocket.prototype.send = function(message) { var self = this; - if (this.socket && this.socket.readyState == this.socket.OPEN) { + if (this.connected()) { // this.socket connection is viable. send our message now. this.socket.send(message); return; @@ -91,5 +98,7 @@ OpenSRF.WebSocket.prototype.send = function(message) { this.socket.onclose = function() { console.debug('closing websocket'); self.socket = null; + if (OpenSRF.onWebSocketClosed) + OpenSRF.onWebSocketClosed(); } } diff --git a/src/javascript/opensrf_ws_shared.js b/src/javascript/opensrf_ws_shared.js index ff0b5868..36c5baf8 100644 --- a/src/javascript/opensrf_ws_shared.js +++ b/src/javascript/opensrf_ws_shared.js @@ -128,6 +128,7 @@ function send_to_websocket(message) { var msg; while ( (msg = pending_ws_messages.shift()) ) websocket.send(msg); + } websocket.onmessage = function(evt) { @@ -189,7 +190,7 @@ function send_to_websocket(message) { websocket.onerror = function(evt) { var err = "WebSocket Error " + evt; console.error(err); - broadcast({action : 'error', message : err}); + broadcast({action : 'event', type : 'onerror', message : err}); websocket.close(); // connection is no good; reset. } @@ -203,6 +204,7 @@ function send_to_websocket(message) { console.debug('closing websocket'); websocket = null; thread_port_map = {}; + broadcast({action : 'event', type : 'onclose'}); } } -- 2.43.2