File size: 1,273 Bytes
bc20498
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
64
65
66
67
68
69
70
'use strict';
const coincident = (require('./server.js'));

class DirectEmitter {
  on(type, handler) {
    this[type] = handler;
    return this;
  }
}

class WebSocketServer extends DirectEmitter {
    constructor() {
      super();
      this.connection = null;
    }
  }

class WebSocketClient extends DirectEmitter {
  constructor(ws) {
    super();
    this.ws = ws;
    this.close = null;
    this.message = null;
    this.error = null;
  }
  once(_, handler) {
    this.message = message => {
      this.send(message);
      handler(message);
    };
  }
  send(message) {
    this.ws.send(message);
  }
}

/**
 * @param {object} globals Globals to expose via coincident
 * @returns
 */
module.exports = globals => {
  const sockets = new Map;
  const wss = new WebSocketServer;
  coincident(wss, globals);
  return {
    /**
     * @param {WebSocket} ws
     * @param {string} message
     */
    message(ws, message) {
      sockets.get(ws).message(message);
    },
    /**
     * @param {WebSocket} ws
     */
    open(ws) {
      const wsc = new WebSocketClient(ws);
      sockets.set(ws, wsc);
      wss.connection(wsc);
    },
    /**
     * @param {WebSocket} ws
     */
    close(ws) {
      sockets.get(ws).close();
      sockets.delete(ws);
    },
  };
};