@ -1,30 +1,34 @@
|
||||
import { EventEmitter } from 'events'
|
||||
import { Parser } from './parser'
|
||||
import { Packet } from './packet';
|
||||
import { NettyClient } from '../server';
|
||||
import { SocketIO } from './interfaces'
|
||||
import { Server, Socket } from './index';
|
||||
import { PacketTypes, SubPacketTypes } from './types';
|
||||
import { ServerEvent } from './constants';
|
||||
|
||||
const parser = new Parser();
|
||||
|
||||
export class Client extends EventEmitter implements SocketIO.Client {
|
||||
id: string;
|
||||
server: Server;
|
||||
conn: NettyClient;
|
||||
conn: SocketIO.EngineSocket;
|
||||
request: any;
|
||||
sockets: { [id: string]: Socket; };
|
||||
nsps: { [nsp: string]: SocketIO.Socket; };
|
||||
connectBuffer: any;
|
||||
|
||||
constructor(server: Server, nettyClient: NettyClient) {
|
||||
constructor(server: Server, engine: SocketIO.EngineSocket) {
|
||||
super();
|
||||
this.server = server;
|
||||
this.conn = nettyClient;
|
||||
this.conn = engine;
|
||||
this.id = this.conn.id + '';
|
||||
this.request = nettyClient.request;
|
||||
this.request = engine.request;
|
||||
this.sockets = {};
|
||||
this.nsps = {};
|
||||
|
||||
this.conn.on(ServerEvent.disconnect, (reason) => {
|
||||
this.onclose(reason)
|
||||
})
|
||||
}
|
||||
connect(name, query) {
|
||||
if (this.server.nsps[name]) {
|
||||
@ -79,11 +83,11 @@ export class Client extends EventEmitter implements SocketIO.Client {
|
||||
// this.decoder.destroy(); // clean up decoder
|
||||
}
|
||||
disconnect() {
|
||||
// if ('open' == this.conn.readyState) {
|
||||
// debug('forcing transport close');
|
||||
this.conn.close();
|
||||
this.onclose('forced server close');
|
||||
// }
|
||||
if ('open' == this.conn.readyState) {
|
||||
// debug('forcing transport close');
|
||||
this.conn.close();
|
||||
this.onclose('forced server close');
|
||||
}
|
||||
}
|
||||
remove(socket: Socket) {
|
||||
if (this.sockets.hasOwnProperty(socket.id)) {
|
||||
|
8
packages/websocket/src/socket-io/constants.ts
Normal file
8
packages/websocket/src/socket-io/constants.ts
Normal file
@ -0,0 +1,8 @@
|
||||
export enum ServerEvent {
|
||||
detect = 'detect',
|
||||
connect = 'connect',
|
||||
connection = 'connection',
|
||||
message = 'message',
|
||||
error = 'error',
|
||||
disconnect = 'disconnect'
|
||||
}
|
@ -1,8 +1,6 @@
|
||||
import { EventEmitter } from 'events'
|
||||
|
||||
import { NettyWebSocketServer, NettyClient } from '../server'
|
||||
import { ServerEvent } from '../server/constants';
|
||||
|
||||
import { ServerEvent } from './constants';
|
||||
import { Namespace } from './namespace';
|
||||
import { Client } from './client';
|
||||
import { SocketIO } from './interfaces'
|
||||
@ -17,8 +15,12 @@ interface ServerOptions extends SocketIO.ServerOptions {
|
||||
root?: string;
|
||||
}
|
||||
|
||||
interface WebSocketServer extends EventEmitter {
|
||||
close(): void
|
||||
}
|
||||
|
||||
class Server implements SocketIO.Server {
|
||||
private nettyServer: NettyWebSocketServer;
|
||||
private websocketServer: WebSocketServer;
|
||||
private allClients: { [key: string]: Client };
|
||||
|
||||
engine: { ws: any; };
|
||||
@ -31,17 +33,24 @@ class Server implements SocketIO.Server {
|
||||
_adapter: Adapter;
|
||||
options: ServerOptions;
|
||||
|
||||
constructor(pipeline: any, options: ServerOptions) {
|
||||
if (!pipeline) { throw new Error('Netty Pipeline can\'t be undefiend!') }
|
||||
constructor(instance: any, options: ServerOptions) {
|
||||
if (!instance) { throw new Error('instance can\'t be undefiend!') }
|
||||
this.allClients = {};
|
||||
this.nsps = {};
|
||||
this.sockets = new Namespace('/', this);
|
||||
this.nsps['/'] = this.sockets;
|
||||
this.initNettyServer(pipeline, Object.assign({
|
||||
event: new EventEmitter(),
|
||||
path: '/socket.io',
|
||||
root: root + '/wwwroot'
|
||||
}, options));
|
||||
if (instance.class.name.startsWith('io.netty.channel')) {
|
||||
let { NettyWebSocketServer } = require("../server")
|
||||
this.websocketServer = new NettyWebSocketServer(instance, Object.assign({
|
||||
event: new EventEmitter(),
|
||||
path: '/socket.io',
|
||||
root: root + '/wwwroot'
|
||||
}, options));
|
||||
} else {
|
||||
let { TomcatWebSocketServer } = require("../tomcat/server")
|
||||
this.websocketServer = new TomcatWebSocketServer(instance, options);
|
||||
}
|
||||
this.initServer()
|
||||
}
|
||||
|
||||
checkRequest(req: any, fn: (err: any, success: boolean) => void): void {
|
||||
@ -114,7 +123,7 @@ class Server implements SocketIO.Server {
|
||||
for (let socket in this.sockets.sockets) {
|
||||
this.sockets.sockets[socket].onclose()
|
||||
}
|
||||
this.nettyServer.close();
|
||||
this.websocketServer.close();
|
||||
}
|
||||
on(event: "connection", listener: (socket: SocketIO.Socket) => void): SocketIO.Namespace;
|
||||
on(event: "connect", listener: (socket: SocketIO.Socket) => void): SocketIO.Namespace;
|
||||
@ -152,17 +161,16 @@ class Server implements SocketIO.Server {
|
||||
fn(false);
|
||||
};
|
||||
|
||||
private initNettyServer(pipeline, options) {
|
||||
this.nettyServer = new NettyWebSocketServer(pipeline, options);
|
||||
this.nettyServer.on(ServerEvent.connect, (nettyClient: NettyClient) => {
|
||||
let client = new Client(this, nettyClient);
|
||||
private initServer() {
|
||||
this.websocketServer.on(ServerEvent.connect, (socket: SocketIO.EngineSocket) => {
|
||||
let client = new Client(this, socket);
|
||||
this.onconnection(client);
|
||||
})
|
||||
this.nettyServer.on(ServerEvent.message, (nettyClient: NettyClient, text) => {
|
||||
this.processPacket(this.parser.decode(text), this.allClients[nettyClient.id]);
|
||||
this.websocketServer.on(ServerEvent.message, (socket: SocketIO.EngineSocket, text) => {
|
||||
this.processPacket(this.parser.decode(text), this.allClients[socket.id]);
|
||||
})
|
||||
this.nettyServer.on(ServerEvent.error, (nettyClient: NettyClient, cause) => {
|
||||
console.error(`Client ${nettyClient.id} cause error: ` + cause)
|
||||
this.websocketServer.on(ServerEvent.error, (socket: SocketIO.EngineSocket, cause) => {
|
||||
console.error(`Client ${socket.id} cause error: ` + cause)
|
||||
console.ex(cause)
|
||||
})
|
||||
}
|
||||
|
@ -830,5 +830,15 @@ export declare namespace SocketIO {
|
||||
* (Transport): transport reference
|
||||
*/
|
||||
transport: any;
|
||||
|
||||
/**
|
||||
* send
|
||||
*/
|
||||
send(text: string);
|
||||
|
||||
/**
|
||||
* close
|
||||
*/
|
||||
close();
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,7 @@ import { EventEmitter } from 'events'
|
||||
|
||||
import { Client } from './client'
|
||||
import { SocketIO } from './interfaces';
|
||||
import { ServerEvent } from '../server';
|
||||
import { ServerEvent } from './constants';
|
||||
import { Socket } from './socket';
|
||||
import { Adapter } from './adapter';
|
||||
import { Server } from './index'
|
||||
|
Reference in New Issue
Block a user