From bd8e98d7e24c4dbaee7db6ec7955f7c2f6d396a6 Mon Sep 17 00:00:00 2001 From: Ruben Beltran del Rio Date: Tue, 9 Mar 2021 22:43:12 +0100 Subject: Update to SvelteKit --- src/socket_coordinator.js | 63 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/socket_coordinator.js (limited to 'src/socket_coordinator.js') 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)); + }); +}; -- cgit