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)); }); };