import { Server as HttpServer } from 'http';
import { EventEmitter } from 'events';
import * as util from 'util';
import * as net from 'net';
import * as WebSocket from 'ws';

let ST_STARTED = 1;
let ST_CLOSED = 2;

/**
 * websocket protocol processor
 */
export class WSProcessor extends EventEmitter {
    httpServer: HttpServer;
    wsServer: WebSocket.Server;
    state: number;

    constructor() {
        super();
        this.httpServer = new HttpServer();

        let self = this;
        this.wsServer = new WebSocket.Server({ server: this.httpServer });

        this.wsServer.on('connection', function (socket, request) {
            // emit socket to outside
            self.emit('connection', socket, request);
        });

        this.state = ST_STARTED;
    }


    add(socket: net.Socket, data: Buffer) {
        if (this.state !== ST_STARTED) {
            return;
        }
        this.httpServer.emit('connection', socket);
        if (typeof (socket as any).ondata === 'function') {
            // compatible with stream2
            (socket as any).ondata(data, 0, data.length);
        } else {
            // compatible with old stream
            socket.emit('data', data);
        }
    }

    close() {
        if (this.state !== ST_STARTED) {
            return;
        }
        this.state = ST_CLOSED;
        this.wsServer.close();
        this.wsServer = null;
        this.httpServer = null;
    }
}