diff --git a/src/api/websocket-api.js b/src/api/websocket-api.js index 43d2e65..ee952dd 100644 --- a/src/api/websocket-api.js +++ b/src/api/websocket-api.js @@ -20,21 +20,60 @@ ******************************************************************************/ class WebsocketAPI { - addSocket(endpoint, callbacks) { - // create web socket client - const socket = new WebSocket(this.getURL(endpoint), 'live'); - socket.binaryType = 'arraybuffer'; + constructor(endpoint, callbacks) { + this.endpoint = endpoint; + this.callbacks = callbacks; - // register callbacks - if (callbacks.onOpen) socket.onopen = callbacks.onOpen; - if (callbacks.onClose) socket.onclose = callbacks.onClose; - if (callbacks.onMessage) socket.onmessage = callbacks.onMessage; - if (callbacks.onError) socket.onerror = callbacks.onError; + this.isClosing = false; - return socket; + this.connect(endpoint, callbacks); } - getURL(endpoint) { + connect(endpoint, callbacks) { + // create web socket client + this.socket = new WebSocket(WebsocketAPI.getURL(endpoint), 'live'); + this.socket.binaryType = 'arraybuffer'; + this.socket.onclose = this.onClose; + + // register callbacks + if (callbacks.onOpen) + this.socket.onopen = callbacks.onOpen; + if (callbacks.onMessage) + this.socket.onmessage = callbacks.onMessage; + if (callbacks.onError) + this.socket.onerror = callbacks.onError; + } + + reconnect() { + //console.log("Reconnecting: " + this.endpoint); + this.connect(this.endpoint, this.callbacks); + } + + get url() { + return WebsocketAPI.getURL(this.endpoint); + } + + send(data) { + this.socket.send(data); + } + + close(code, reason) { + this.isClosing = true; + this.socket.close(code, reason); + } + + onClose = e => { + if (this.isClosing) { + if (this.callbacks.onClose) + this.callbacks.onClose(e); + } + else { + //console.log("Connection to " + this.endpoint + " dropped. Attempt reconnect in 1 sec"); + window.setTimeout(() => { this.reconnect(); }, 500); + } + } + + static getURL(endpoint) { // create an anchor element (note: no need to append this element to the document) var link = document.createElement('a'); link.href = endpoint; @@ -48,4 +87,4 @@ class WebsocketAPI { } } -export default new WebsocketAPI(); +export default WebsocketAPI; diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index 728a6a0..29e36c0 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -37,10 +37,10 @@ class SimulatorDataDataManager { // replace connection, since endpoint changed this._sockets.close(); - this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier), onError: (error) => this.onError(error, identifier) }); + this._sockets[identifier] = new WebsocketAPI(endpoint, { onOpen: (event) => this.onOpen(event, identifier), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier), onError: (error) => this.onError(error, identifier) }); } } else { - this._sockets[identifier] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, identifier, false), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier), onError: (error) => this.onError(error, identifier) }); + this._sockets[identifier] = new WebsocketAPI(endpoint, { onOpen: (event) => this.onOpen(event, identifier, false), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier), onError: (error) => this.onError(error, identifier) }); } }