diff --git a/plugins/websocket/guest-js/index.ts b/plugins/websocket/guest-js/index.ts index 4f7de803..395ba443 100644 --- a/plugins/websocket/guest-js/index.ts +++ b/plugins/websocket/guest-js/index.ts @@ -32,9 +32,10 @@ export type Message = export default class WebSocket { id: number; - private readonly listeners: Array<(arg: Message) => void>; + private readonly listeners: Array<{listener:(arg: Message) => void, id: number}>; + private nextListenerId: number = 0; - constructor(id: number, listeners: Array<(arg: Message) => void>) { + constructor(id: number, listeners: Array<{listener:(arg: Message) => void, id: number}>) { this.id = id; this.listeners = listeners; } @@ -43,12 +44,12 @@ export default class WebSocket { 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); }); }; @@ -63,8 +64,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 {