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