const {EventEmitter} = require('events'); const SocketServer = require('socket.io'); import {SocketIoParser, allPackets, idFromPacket} from '@avocado/packet'; export class Server extends EventEmitter { constructor(httpServer) { super(); this.io = new SocketServer(httpServer, { parser: SocketIoParser, path: '/avocado', perMessageDeflate: false, serveClient: false, }); this.io.on('connect', (socket) => { this.emit('connect', new ServerSocket(socket)); }); } } class ServerSocket extends EventEmitter { constructor(socket) { super(); this.socket = socket; for (const Packet of allPackets()) { const id = idFromPacket(Packet); this.socket.on(id, (packet) => { this.emit('packet', packet); }); } this.socket.on('disconnect', (...args) => { this.emit('disconnect', ...args); }); } send(packet) { const id = idFromPacket(packet.constructor); this.socket.emit(id, packet.data); } }