aboutsummaryrefslogtreecommitdiff
path: root/src/socket_coordinator.js
diff options
context:
space:
mode:
authorRuben Beltran del Rio <ruben@unlimited.pizza>2021-03-09 22:43:12 +0100
committerRuben Beltran del Rio <ruben@unlimited.pizza>2021-03-09 22:43:12 +0100
commitbd8e98d7e24c4dbaee7db6ec7955f7c2f6d396a6 (patch)
treee5f0dcbc14d3009c17e5f562404fe19f6aceab73 /src/socket_coordinator.js
parent862a5f9cdbbda522c608ea63c1e296e81f44de10 (diff)
Update to SvelteKit
Diffstat (limited to 'src/socket_coordinator.js')
-rw-r--r--src/socket_coordinator.js63
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));
+ });
+};