diff --git a/plugins/websocket/guest-js/index.ts b/plugins/websocket/guest-js/index.ts index 5b5c1b1e62..c8b6084fc8 100644 --- a/plugins/websocket/guest-js/index.ts +++ b/plugins/websocket/guest-js/index.ts @@ -57,26 +57,27 @@ export type Message = | MessageKind<'Close', CloseFrame | null> export default class WebSocket { - id: number - private readonly listeners: Array<(arg: Message) => void> + private nextListenerId: number = 0; + id: number; + private readonly listeners: Array<{listener:(arg: Message) => void, id: number}>; - constructor(id: number, listeners: Array<(arg: Message) => void>) { - this.id = id - this.listeners = listeners + constructor(id: number, listeners: Array<{listener:(arg: Message) => void, id: number}>) { + this.id = id; + this.listeners = listeners; } static async connect( url: string, config?: ConnectionConfig ): Promise { - const listeners: Array<(arg: Message) => void> = [] + const listeners: Array<{listener:(arg: Message) => void, id: number}>) const onMessage = new Channel() onMessage.onmessage = (message: Message): void => { listeners.forEach((l) => { - l(message) - }) - } + l.listener(message); + }); + }; if (config?.headers) { config.headers = Array.from(new Headers(config.headers).entries()) @@ -89,8 +90,20 @@ export default class WebSocket { }).then((id) => new WebSocket(id, listeners)) } - addListener(cb: (arg: Message) => void): void { - this.listeners.push(cb) + addListener(cb: (arg: Message) => void): number { + this.listeners.push({listener: cb, id: this.nextListenerId}); + this.nextListenerId+=1; + return this.nextListenerId-1; + } + + removeListener(id: number): boolean { + if (this.listeners.findIndex(e=>e.id===id)===-1) return false; + let tempListeners = this.listeners.filter(e => e.id !== id); + while (this.listeners.length!==0) this.listeners.pop(); + for (const element of tempListeners) { + this.listeners.push(element); + } + return true; } async send(message: Message | string | number[]): Promise {