From a010e0452566645b0a4a453355e3686a6d6f4415 Mon Sep 17 00:00:00 2001 From: nvzeppelin <47154656+nvzeppelin@users.noreply.github.com> Date: Wed, 29 May 2024 10:50:58 +0000 Subject: [PATCH] [websocket] add functionality to remove listeners --- plugins/websocket/guest-js/index.ts | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) 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 {