diff --git a/packages/websocket/src/index.ts b/packages/websocket/src/index.ts index 146a5262..831fec2d 100644 --- a/packages/websocket/src/index.ts +++ b/packages/websocket/src/index.ts @@ -46,6 +46,5 @@ io.Instance = Symbol("@ccms/websocket") export default io export * from './socket-io' export * from './client' -export * from './netty' -export * from './tomcat' +export * from './server' export * from './transport' diff --git a/packages/websocket/src/netty/adapter/httprequest.ts b/packages/websocket/src/netty/adapter/httprequest.ts index b6523605..523ab6ad 100644 --- a/packages/websocket/src/netty/adapter/httprequest.ts +++ b/packages/websocket/src/netty/adapter/httprequest.ts @@ -3,18 +3,19 @@ const SimpleChannelInboundHandler = Java.type('io.netty.channel.SimpleChannelInb const FullHttpRequestMatcher = TypeParameterMatcher.get(base.getClass('io.netty.handler.codec.http.FullHttpRequest')) export abstract class HttpRequestHandlerAdapter { - private _Handler; + private _Handler constructor() { let HttpRequestHandlerAdapterImpl = Java.extend(SimpleChannelInboundHandler, { + isSharable: () => true, acceptInboundMessage: (msg: any) => { return FullHttpRequestMatcher.match(msg) }, channelRead0: this.channelRead0.bind(this) }) - this._Handler = new HttpRequestHandlerAdapterImpl(); + this._Handler = new HttpRequestHandlerAdapterImpl() } - abstract channelRead0(ctx: any, request: any); + abstract channelRead0(ctx: any, request: any) getHandler() { - return this._Handler; + return this._Handler } } diff --git a/packages/websocket/src/netty/adapter/text_websocket_frame.ts b/packages/websocket/src/netty/adapter/text_websocket_frame.ts index f444ad6d..2798a65b 100644 --- a/packages/websocket/src/netty/adapter/text_websocket_frame.ts +++ b/packages/websocket/src/netty/adapter/text_websocket_frame.ts @@ -6,6 +6,7 @@ export abstract class TextWebSocketFrameHandlerAdapter { private _Handler constructor() { let TextWebSocketFrameHandlerAdapterImpl = Java.extend(SimpleChannelInboundHandler, { + isSharable: () => true, userEventTriggered: this.userEventTriggered.bind(this), acceptInboundMessage: (msg: any) => { return TextWebSocketFrameMatcher.match(msg) diff --git a/packages/websocket/src/netty/adapter/websocket.ts b/packages/websocket/src/netty/adapter/websocket.ts index 6873dd7d..1f195d7b 100644 --- a/packages/websocket/src/netty/adapter/websocket.ts +++ b/packages/websocket/src/netty/adapter/websocket.ts @@ -4,6 +4,7 @@ export abstract class WebSocketHandlerAdapter { private _Handler constructor() { let ChannelInboundHandlerAdapterImpl = Java.extend(ChannelInboundHandlerAdapter, { + isSharable: () => true, channelRead: this.channelRead.bind(this), channelInactive: this.channelInactive.bind(this), channelUnregistered: this.exceptionCaught.bind(this), diff --git a/packages/websocket/src/server/index.ts b/packages/websocket/src/server/index.ts new file mode 100644 index 00000000..788f3f3d --- /dev/null +++ b/packages/websocket/src/server/index.ts @@ -0,0 +1,52 @@ +import { EventEmitter } from 'events' + +import { Transport } from '../transport' + +interface ServerOptions { + event?: EventEmitter + root?: string + /** + * name of the path to capture + * @default "/socket.io" + */ + path: string +} + +interface WebSocketServerImpl extends EventEmitter { + close(): void +} + +export class WebSocketServer extends EventEmitter { + options: Partial + private websocketServer: WebSocketServerImpl + + constructor(instance: any, options: Partial) { + super() + if (!instance) { throw new Error('instance can\'t be undefiend!') } + this.options = Object.assign({ + event: new EventEmitter(), + path: '/ws', + root: root + '/wwwroot', + }, options) + this.selectServerImpl(instance) + } + + on(event: "connect", cb: (transport: Transport) => void): this + on(event: "message", cb: (transport: Transport, text: string) => void): this + on(event: "disconnect", cb: (transport: Transport, reason: string) => void): this + on(event: "error", cb: (transport: Transport, cause: Error) => void): this + on(event: string, cb: (transport: Transport, extra?: any) => void): this { + this.websocketServer.on(event, cb) + return this + } + + private selectServerImpl(instance: any) { + let WebSocketServerImpl = undefined + if (instance.class.name.startsWith('io.netty.channel')) { + WebSocketServerImpl = require("../netty").NettyWebSocketServer + } else { + WebSocketServerImpl = require("../tomcat").TomcatWebSocketServer + } + this.websocketServer = new WebSocketServerImpl(instance, this.options) + } +} diff --git a/packages/websocket/src/socket-io/index.ts b/packages/websocket/src/socket-io/index.ts index 06286ab1..d59234e4 100644 --- a/packages/websocket/src/socket-io/index.ts +++ b/packages/websocket/src/socket-io/index.ts @@ -4,8 +4,6 @@ import { ServerEvent } from './constants' import { Namespace } from './namespace' import { Client } from './client' import { Parser } from './parser' -import { PacketTypes, SubPacketTypes } from './types' -import { Packet } from './packet' import { Socket } from './socket' import { Adapter } from './adapter' import { Transport } from '../transport'