Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit f1cce5b

Browse files
committed
Clean up resources after subscription closed
1 parent f6944bc commit f1cce5b

File tree

1 file changed

+45
-14
lines changed

1 file changed

+45
-14
lines changed

Diff for: wasm/bus_bridge.go

+45-14
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ func NewTransportWasmBridge(busRef bus.EventBus) *TransportWasmBridge {
2424
}
2525

2626
func (t *TransportWasmBridge) sendRequestMessageWrapper() js.Func {
27-
return js.FuncOf(func(this js.Value, args []js.Value) interface{} {
27+
jsFunc := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
28+
// release the resources allocated for js.Func once this closure goes out of scope
29+
defer jsFunc.Release()
30+
2831
var destId *uuid.UUID
2932
channel := args[0].String()
3033
payload := args[1].JSValue()
@@ -40,10 +43,14 @@ func (t *TransportWasmBridge) sendRequestMessageWrapper() js.Func {
4043
t.busRef.SendRequestMessage(channel, payload, destId)
4144
return nil
4245
})
46+
return jsFunc
4347
}
4448

4549
func (t *TransportWasmBridge) sendResponseMessageWrapper() js.Func {
46-
return js.FuncOf(func(this js.Value, args []js.Value) interface{} {
50+
jsFunc := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
51+
// release the resources allocated for js.Func once this closure goes out of scope
52+
defer jsFunc.Release()
53+
4754
var destId *uuid.UUID
4855
channel := args[0].String()
4956
payload := args[1].JSValue()
@@ -59,28 +66,41 @@ func (t *TransportWasmBridge) sendResponseMessageWrapper() js.Func {
5966
t.busRef.SendResponseMessage(channel, payload, destId)
6067
return nil
6168
})
69+
return jsFunc
6270
}
6371

6472
func (t *TransportWasmBridge) listenStreamWrapper() js.Func {
65-
return js.FuncOf(func(this js.Value, args []js.Value) interface{} {
73+
jsFunc := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
6674
handler, err := t.busRef.ListenStream(args[0].String())
6775
if err != nil {
6876
errCtor := js.Global().Get("Error")
6977
return errCtor.New(err.Error())
7078
}
7179

80+
closerFuncRef := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
81+
handler.Close()
82+
83+
// release the resources allocated for js.Func when closing the subscription
84+
for _, ref := range jsFuncRefs {
85+
ref.Release()
86+
}
87+
88+
return nil
89+
})
90+
91+
// store js.Func handles for resource cleanup later
92+
jsFuncRefs := []js.Func{jsFunc, getResponseHandlerJsCallbackFunc(handler), closerFuncRef}
93+
7294
return map[string]interface{}{
73-
"handle": getResponseHandlerJsCallbackFunc(handler),
74-
"close": js.FuncOf(func(this js.Value, args []js.Value) interface{} {
75-
handler.Close()
76-
return nil
77-
}),
95+
"handle": jsFuncRefs[1],
96+
"close": jsFuncRefs[2],
7897
}
7998
})
99+
return jsFunc
80100
}
81101

82102
func (t *TransportWasmBridge) listenStreamWithIdWrapper() js.Func {
83-
return js.FuncOf(func(this js.Value, args []js.Value) interface{} {
103+
jsFunc := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
84104
if len(args) <= 1 {
85105
errCtor := js.Global().Get("Error")
86106
js.Global().Get("console").Call("error", errCtor.New("cannot listen to channel. missing destination ID"))
@@ -99,12 +119,23 @@ func (t *TransportWasmBridge) listenStreamWithIdWrapper() js.Func {
99119
return errCtor.New(err.Error())
100120
}
101121

122+
closerFuncRef := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
123+
handler.Close()
124+
125+
// release the resources allocated for js.Func when closing the subscription
126+
for _, ref := range jsFuncRefs {
127+
ref.Release()
128+
}
129+
130+
return nil
131+
})
132+
133+
// store js.Func handles for resource cleanup later
134+
jsFuncRefs := []js.Func{jsFunc, getResponseHandlerJsCallbackFunc(handler), closerFuncRef}
135+
102136
return map[string]interface{}{
103-
"handle": getResponseHandlerJsCallbackFunc(handler),
104-
"close": js.FuncOf(func(this js.Value, args []js.Value) interface{} {
105-
handler.Close()
106-
return nil
107-
}),
137+
"handle": jsFuncRefs[1],
138+
"close": jsFuncRefs[2],
108139
}
109140
})
110141
}

0 commit comments

Comments
 (0)