Skip to content

Commit 6a090f6

Browse files
authored
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.
1 parent b2aea04 commit 6a090f6

File tree

1 file changed

+9
-5
lines changed

1 file changed

+9
-5
lines changed

plugins/websocket/guest-js/index.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ export type Message =
3232

3333
export default class WebSocket {
3434
id: number
35-
private readonly listeners: Array<(arg: Message) => void>
35+
private readonly listeners: Set<(arg: Message) => void>
3636

37-
constructor(id: number, listeners: Array<(arg: Message) => void>) {
37+
constructor(id: number, listeners: Set<(arg: Message) => void>) {
3838
this.id = id
3939
this.listeners = listeners
4040
}
@@ -43,7 +43,7 @@ export default class WebSocket {
4343
url: string,
4444
config?: ConnectionConfig
4545
): Promise<WebSocket> {
46-
const listeners: Array<(arg: Message) => void> = []
46+
const listeners: Set<(arg: Message) => void> = new Set()
4747

4848
const onMessage = new Channel<Message>()
4949
onMessage.onmessage = (message: Message): void => {
@@ -63,8 +63,12 @@ export default class WebSocket {
6363
}).then((id) => new WebSocket(id, listeners))
6464
}
6565

66-
addListener(cb: (arg: Message) => void): void {
67-
this.listeners.push(cb)
66+
addListener(cb: (arg: Message) => void): () => void {
67+
this.listeners.add(cb)
68+
69+
return () => {
70+
this.listeners.delete(cb)
71+
}
6872
}
6973

7074
async send(message: Message | string | number[]): Promise<void> {

0 commit comments

Comments
 (0)