diff --git a/src/instance.ts b/src/instance.ts index d88f0be85..a4d7ea82d 100644 --- a/src/instance.ts +++ b/src/instance.ts @@ -14,6 +14,8 @@ import { Api } from "./api/index.ts"; import type { IClient } from "./models/client.ts"; import type { IMessage } from "./models/message.ts"; import type { IConfig } from "./config/index.ts"; +import { MessageType } from "./enums.ts"; +import type WebSocket from "ws"; export interface PeerServerEvents { on(event: "connection", listener: (client: IClient) => void): this; @@ -24,7 +26,9 @@ export interface PeerServerEvents { // eslint-disable-next-line @typescript-eslint/unified-signatures on(event: "disconnect", listener: (client: IClient) => void): this; on(event: "error", listener: (client: Error) => void): this; + on(event: string, listener: (socket: WebSocket, message: IMessage) => void): this; } + type CustomEmitFn = (type: string, payload: object) => void; export const createInstance = ({ app, @@ -38,6 +42,7 @@ export const createInstance = ({ const config = options; const realm: IRealm = new Realm(); const messageHandler = new MessageHandler(realm); + const defaultMessageType:Set = new Set(Object.values(MessageType)); const api = Api({ config, realm, corsOptions: options.corsOptions }); const messagesExpire: IMessagesExpire = new MessagesExpire({ @@ -82,9 +87,14 @@ export const createInstance = ({ app.emit("connection", client); }); - wss.on("message", (client: IClient, message: IMessage) => { - app.emit("message", client, message); - messageHandler.handle(client, message); + wss.on("message", (client: IClient, message: IMessage,socket: CustomEmitFn) => { + if(defaultMessageType.has(message.type)){ + app.emit("message", client, message); + messageHandler.handle(client, message); + } else { + app.emit(message.type,socket,message.payload) + } + }); wss.on("close", (client: IClient) => { diff --git a/src/models/message.ts b/src/models/message.ts index 9707fc958..b10d75ea9 100644 --- a/src/models/message.ts +++ b/src/models/message.ts @@ -4,5 +4,5 @@ export interface IMessage { readonly type: MessageType; readonly src: string; readonly dst: string; - readonly payload?: string | undefined; + readonly payload?: string | object | undefined; } diff --git a/src/services/webSocketServer/index.ts b/src/services/webSocketServer/index.ts index 7d93f8185..eb123536b 100644 --- a/src/services/webSocketServer/index.ts +++ b/src/services/webSocketServer/index.ts @@ -154,8 +154,8 @@ export class WebSocketServer extends EventEmitter implements IWebSocketServer { const message = JSON.parse(data.toString()) as Writable; message.src = client.getId(); - - this.emit("message", client, message); + const _emit = this.customEmit.bind(null, socket); + this.emit("message", client, message, { _emit } ); } catch (e) { this.emit("error", e); } @@ -164,6 +164,10 @@ export class WebSocketServer extends EventEmitter implements IWebSocketServer { this.emit("connection", client); } + customEmit(socket: WebSocket, type: string,payload:object): void { + socket.send(JSON.stringify({ type, payload })) + } + private _sendErrorAndClose(socket: WebSocket, msg: Errors): void { socket.send( JSON.stringify({