import { Server, Socket } from "socket.io" import { Server as httpServer } from "http" import * as U from '../Utils' import * as T from '../Types' import socketio = require('socket.io') import middleware = require('socketio-wildcard'); const defaultConfig : socketio.ServerOptions = { cookie: false, path: '/socket.io', } export class PromiseIO { io?: Server httpServer: httpServer private listeners: { [eventName in string]: ((...args: any) => void)[] } = { socket: [], connect: [] } attach(httpServer: httpServer, options: socketio.ServerOptions = defaultConfig) { if(options.path && !options.path.startsWith('/')){ options.path = "/"+options.path } this.httpServer = httpServer this.io = socketio(httpServer, options) this.io!.use(middleware()) this.io!.on('connection', (clientSocket: Socket) => { clientSocket['address'] = clientSocket.handshake.headers["x-real-ip"] || clientSocket.handshake.address const pioSock = U.makePioSocket(clientSocket) 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 } } }