diff options
| author | Ruben Beltran del Rio <ruben@unlimited.pizza> | 2021-03-09 22:43:12 +0100 |
|---|---|---|
| committer | Ruben Beltran del Rio <ruben@unlimited.pizza> | 2021-03-09 22:43:12 +0100 |
| commit | bd8e98d7e24c4dbaee7db6ec7955f7c2f6d396a6 (patch) | |
| tree | e5f0dcbc14d3009c17e5f562404fe19f6aceab73 /src/socket_coordinator.js | |
| parent | 862a5f9cdbbda522c608ea63c1e296e81f44de10 (diff) | |
Update to SvelteKit
Diffstat (limited to 'src/socket_coordinator.js')
| -rw-r--r-- | src/socket_coordinator.js | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/socket_coordinator.js b/src/socket_coordinator.js new file mode 100644 index 0000000..f8fb525 --- /dev/null +++ b/src/socket_coordinator.js @@ -0,0 +1,63 @@ +import EventEmitter from 'eventemitter3'; +import { socketServer } from './config/config'; + +const internals = { + + kReconnectInterval: 3000, // How often we attempt to reconnect + + eventEmitter: new EventEmitter(), // internal event emitter + socket: null, // stores the socket connection + retry: null, // stores the retry operation + + connect() { + + console.debug('Connecting socket.'); + internals.socket = new WebSocket(socketServer); + + internals.socket.addEventListener('message', internals.onMessage); + internals.socket.addEventListener('error', internals.onError); + internals.socket.addEventListener('close', internals.onClose); + }, + + // Handles socket errors. + + onError(event) { + + console.error('Socket error. Closing connection'); + internals.socket.close(); + }, + + // Handles socket errors. + + onClose(event) { + + console.debug(`Connection closed: ${event.reason || 'Unknown reason'}. Retrying in ${internals.kReconnectInterval}ms`); + + internals.retry && clearTimeout(internals.retry); + internals.retry = setTimeout(() => { + + console.debug('Reconnecting socket.'); + internals.retry = null; + internals.connect(); + }, internals.kReconnectInterval); + }, + + // Forwards events from the socket to our internal event emitter. + + onMessage(event) { + + internals.eventEmitter.emit('message', event); + } +}; + +export const onMessage = function (listener) { + + if (!internals.socket) { + internals.connect(); + } + + internals.eventEmitter.on('message', (message) => { + + listener(JSON.parse(message.data)); + }); +}; |