aboutsummaryrefslogtreecommitdiff
path: root/src/socket_coordinator.js
blob: f8fb52512a806db7c99e8a6e62ba01e04c9df365 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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));
  });
};