From 6a090f63ab1076eb307fd0ba3d1cb86619906f9f Mon Sep 17 00:00:00 2001 From: Twilight <46562212+twlite@users.noreply.github.com> Date: Sun, 10 Nov 2024 11:01:13 +0545 Subject: [PATCH] feat(websocket): add ability to remove listener Change listeners array to use a set instead, which prevents addition of duplicated listeners which could possibly lead to memory leaks. --- plugins/websocket/guest-js/index.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/plugins/websocket/guest-js/index.ts b/plugins/websocket/guest-js/index.ts index 8d787742..b71b5847 100644 --- a/plugins/websocket/guest-js/index.ts +++ b/plugins/websocket/guest-js/index.ts @@ -32,9 +32,9 @@ export type Message = export default class WebSocket { id: number - private readonly listeners: Array<(arg: Message) => void> + private readonly listeners: Set<(arg: Message) => void> - constructor(id: number, listeners: Array<(arg: Message) => void>) { + constructor(id: number, listeners: Set<(arg: Message) => void>) { this.id = id this.listeners = listeners } @@ -43,7 +43,7 @@ export default class WebSocket { url: string, config?: ConnectionConfig ): Promise { - const listeners: Array<(arg: Message) => void> = [] + const listeners: Set<(arg: Message) => void> = new Set() const onMessage = new Channel() onMessage.onmessage = (message: Message): void => { @@ -63,8 +63,12 @@ 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): () => void { + this.listeners.add(cb) + + return () => { + this.listeners.delete(cb) + } } async send(message: Message | string | number[]): Promise {