7
7
package webrtc
8
8
9
9
import (
10
+ "errors"
10
11
"fmt"
11
12
"syscall/js"
12
13
@@ -26,8 +27,10 @@ type DataChannel struct {
26
27
// syscall/js API. Initially nil.
27
28
onOpenHandler * js.Func
28
29
onCloseHandler * js.Func
30
+ onClosingHandler * js.Func
29
31
onMessageHandler * js.Func
30
32
onBufferedAmountLow * js.Func
33
+ onErrorHandler * js.Func
31
34
32
35
// A reference to the associated api object used by this datachannel
33
36
api * API
@@ -63,6 +66,39 @@ func (d *DataChannel) OnClose(f func()) {
63
66
d .underlying .Set ("onclose" , onCloseHandler )
64
67
}
65
68
69
+ // FYI `OnClosing` is not implemented in the non-JS version of Pion.
70
+
71
+ func (d * DataChannel ) OnClosing (f func ()) {
72
+ if d .onClosingHandler != nil {
73
+ oldHandler := d .onClosingHandler
74
+ defer oldHandler .Release ()
75
+ }
76
+ onClosingHandler := js .FuncOf (func (this js.Value , args []js.Value ) interface {} {
77
+ go f ()
78
+ return js .Undefined ()
79
+ })
80
+ d .onClosingHandler = & onClosingHandler
81
+ d .underlying .Set ("onclosing" , onClosingHandler )
82
+ }
83
+
84
+ func (d * DataChannel ) OnError (f func (err error )) {
85
+ if d .onErrorHandler != nil {
86
+ oldHandler := d .onErrorHandler
87
+ defer oldHandler .Release ()
88
+ }
89
+ onErrorHandler := js .FuncOf (func (this js.Value , args []js.Value ) interface {} {
90
+ event := args [0 ]
91
+ errorObj := event .Get ("error" )
92
+ // FYI RTCError has some extra properties, e.g. `errorDetail`:
93
+ // https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel/error_event
94
+ errorMessage := errorObj .Get ("message" ).String ()
95
+ go f (errors .New (errorMessage ))
96
+ return js .Undefined ()
97
+ })
98
+ d .onErrorHandler = & onErrorHandler
99
+ d .underlying .Set ("onerror" , onErrorHandler )
100
+ }
101
+
66
102
// OnMessage sets an event handler which is invoked on a binary message arrival
67
103
// from a remote peer. Note that browsers may place limitations on message size.
68
104
func (d * DataChannel ) OnMessage (f func (msg DataChannelMessage )) {
@@ -145,12 +181,18 @@ func (d *DataChannel) Close() (err error) {
145
181
if d .onCloseHandler != nil {
146
182
d .onCloseHandler .Release ()
147
183
}
184
+ if d .onClosingHandler != nil {
185
+ d .onClosingHandler .Release ()
186
+ }
148
187
if d .onMessageHandler != nil {
149
188
d .onMessageHandler .Release ()
150
189
}
151
190
if d .onBufferedAmountLow != nil {
152
191
d .onBufferedAmountLow .Release ()
153
192
}
193
+ if d .onErrorHandler != nil {
194
+ d .onErrorHandler .Release ()
195
+ }
154
196
155
197
return nil
156
198
}
0 commit comments