@ -1,26 +1,29 @@
|
||||
import { EventEmitter } from 'events'
|
||||
import { SocketIO } from 'socket-io/interfaces';
|
||||
|
||||
const TextWebSocketFrame = Java.type('io.netty.handler.codec.http.websocketx.TextWebSocketFrame')
|
||||
|
||||
export class NettyClient {
|
||||
private event: EventEmitter
|
||||
|
||||
export class NettyClient extends EventEmitter implements SocketIO.EngineSocket {
|
||||
private _id: string;
|
||||
private channel: any
|
||||
constructor(channel: any) {
|
||||
|
||||
server: any;
|
||||
readyState: string;
|
||||
remoteAddress: string;
|
||||
upgraded: boolean;
|
||||
request: any;
|
||||
transport: any;
|
||||
|
||||
constructor(server: any, channel: any) {
|
||||
super();
|
||||
this.server = server;
|
||||
this.channel = channel;
|
||||
this._id = channel.id();
|
||||
this.event = new EventEmitter();
|
||||
}
|
||||
|
||||
get id() {
|
||||
return this._id;
|
||||
}
|
||||
on(event: string, callback: (...args: any[]) => void) {
|
||||
this.event.on(event, callback);
|
||||
}
|
||||
emit(event: string, text: string) {
|
||||
this.event.emit(event, text);
|
||||
}
|
||||
send(text: string) {
|
||||
this.channel.writeAndFlush(new TextWebSocketFrame(text))
|
||||
}
|
||||
|
6
packages/websocket/src/server/config.ts
Normal file
6
packages/websocket/src/server/config.ts
Normal file
@ -0,0 +1,6 @@
|
||||
import { EventEmitter } from 'events'
|
||||
|
||||
export interface NettyWebSocketServerOptions {
|
||||
event: EventEmitter,
|
||||
path?: string;
|
||||
}
|
@ -4,10 +4,7 @@ import { ServerEvent, Keys } from './constants'
|
||||
import { WebSocketDetect } from './websocket_detect'
|
||||
import { WebSocketHandler } from './websocket_handler'
|
||||
import { NettyClient } from './client'
|
||||
|
||||
interface NettyWebSocketServerOptions {
|
||||
path?: string;
|
||||
}
|
||||
import { NettyWebSocketServerOptions } from './config'
|
||||
|
||||
class NettyWebSocketServer {
|
||||
private event: EventEmitter
|
||||
@ -18,20 +15,20 @@ class NettyWebSocketServer {
|
||||
this.event = new EventEmitter();
|
||||
this.allClients = {};
|
||||
this.pipeline = pipeline;
|
||||
let connectEvent = new EventEmitter();
|
||||
let connectEvent = options.event;
|
||||
this.pipeline.addFirst(Keys.Detect, new WebSocketDetect(connectEvent).getHandler())
|
||||
connectEvent.on(ServerEvent.detect, (ctx, channel) => {
|
||||
channel.pipeline().addFirst(Keys.Handler, new WebSocketHandler(connectEvent).getHandler())
|
||||
channel.pipeline().addFirst(Keys.Handler, new WebSocketHandler(options).getHandler())
|
||||
ctx.fireChannelRead(channel)
|
||||
})
|
||||
connectEvent.on(ServerEvent.connect, (ctx) => {
|
||||
let nettyClient = new NettyClient(ctx.channel());
|
||||
let nettyClient = new NettyClient(this, ctx.channel());
|
||||
this.allClients[nettyClient.id] = nettyClient;
|
||||
this.event.emit(ServerEvent.connect, nettyClient);
|
||||
})
|
||||
connectEvent.on(ServerEvent.message, (ctx, msg) => {
|
||||
let channel = ctx.channel();
|
||||
this.allClients[channel.id()]?.emit(ServerEvent.message, msg.text())
|
||||
this.event.emit(ServerEvent.message, this.allClients[channel.id()], msg.text())
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -1,12 +1,13 @@
|
||||
import { TextWebSocketFrameHandlerAdapter } from '../netty'
|
||||
import { EventEmitter } from 'events'
|
||||
import { ServerEvent } from './constants'
|
||||
import { NettyWebSocketServerOptions } from './config';
|
||||
|
||||
export class TextWebSocketFrameHandler extends TextWebSocketFrameHandlerAdapter {
|
||||
private event: EventEmitter;
|
||||
constructor(event: EventEmitter) {
|
||||
constructor(options: NettyWebSocketServerOptions) {
|
||||
super()
|
||||
this.event = event;
|
||||
this.event = options.event;
|
||||
}
|
||||
userEventTriggered(ctx: any, evt: any) {
|
||||
if (evt == 'HANDSHAKE_COMPLETE') {
|
||||
|
@ -4,6 +4,7 @@ import { Keys } from './constants'
|
||||
import { WebSocketHandlerAdapter } from "../netty"
|
||||
import { HttpRequestHandler } from './httprequest'
|
||||
import { TextWebSocketFrameHandler } from './text_websocket_frame'
|
||||
import { NettyWebSocketServerOptions } from './config'
|
||||
|
||||
const CharsetUtil = Java.type('io.netty.util.CharsetUtil')
|
||||
|
||||
@ -13,10 +14,10 @@ const HttpObjectAggregator = Java.type('io.netty.handler.codec.http.HttpObjectAg
|
||||
const WebSocketServerProtocolHandler = Java.type('io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler')
|
||||
|
||||
export class WebSocketHandler extends WebSocketHandlerAdapter {
|
||||
private event: EventEmitter;
|
||||
constructor(event: EventEmitter) {
|
||||
private options: NettyWebSocketServerOptions;
|
||||
constructor(options: NettyWebSocketServerOptions) {
|
||||
super()
|
||||
this.event = event;
|
||||
this.options = options;
|
||||
}
|
||||
channelRead(ctx: any, msg: any) {
|
||||
msg.markReaderIndex()
|
||||
@ -32,8 +33,8 @@ export class WebSocketHandler extends WebSocketHandlerAdapter {
|
||||
pipeline.addLast('chunk', new ChunkedWriteHandler())
|
||||
pipeline.addLast('httpobj', new HttpObjectAggregator(64 * 1024))
|
||||
pipeline.addLast('http_request', new HttpRequestHandler().getHandler())
|
||||
pipeline.addLast('websocket', new WebSocketServerProtocolHandler("/ws", true))
|
||||
pipeline.addLast('websocket_handler', new TextWebSocketFrameHandler(this.event).getHandler())
|
||||
pipeline.addLast('websocket', new WebSocketServerProtocolHandler(this.options.path, true))
|
||||
pipeline.addLast('websocket_handler', new TextWebSocketFrameHandler(this.options).getHandler())
|
||||
}
|
||||
pipeline.remove(Keys.Handler)
|
||||
msg.resetReaderIndex()
|
||||
|
Reference in New Issue
Block a user