import { Server, Socket } from "socket.io" import { Server as httpServer } from "http" import * as U from '../Utils' import * as T from '../Types' const socketio = require('socket.io') export class PromiseIO { io?: Server httpServer: httpServer private listeners: { [eventName in string]: ((...args: any) => void)[] } = { socket: [], connect: [] } static createServer(): PromiseIO { return new PromiseIO(); } attach(httpServer: httpServer) { this.httpServer = httpServer this.io = socketio(httpServer) this.io!.on('connection', (sock: Socket) => { const pioSock = U.makePioSocket(sock) this.listeners['socket'].forEach(listener => listener(pioSock)) this.listeners['connect'].forEach(listener => listener(pioSock)) /* pioSock.on('error', ()=>console.log('error')); pioSock.on('connect_timeout', ()=>console.log('connect_timeout')) pioSock.on('disconnect', ()=>console.log('disconnect')) pioSock.on('reconnect', ()=>console.log('reconnect')) pioSock.on('reconnect_attempt', ()=>console.log('reconnect_attempt')) pioSock.on('reconnecting', ()=>console.log('reconnecting')); pioSock.on('reconnect_failed', ()=>console.log('reconnect_failed')); pioSock.on('reconnecting', ()=>console.log('reconnecting')); */ }) } listen(port: number) { this.httpServer!.listen(port) } on(eventName: string, listener: T.AnyFunction) { if (this.listeners[eventName] == null) { this.listeners[eventName] = [] } this.listeners[eventName].push(listener) } close = () => { if(this.io){ this.io.engine.ws.close() this.io.close() this.io = undefined } } }