pinusmod
Version:
[](https://travis-ci.org/node-pinus/pinus)
57 lines (48 loc) • 1.44 kB
text/typescript
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;
}
}