5
5
package wsjs
6
6
7
7
import (
8
- "context"
9
8
"syscall/js"
10
9
)
11
10
@@ -26,17 +25,17 @@ func handleJSError(err *error, onErr func()) {
26
25
}
27
26
}
28
27
29
- func New (ctx context. Context , url string , protocols []string ) (c * WebSocket , err error ) {
28
+ func New (url string , protocols []string ) (c WebSocket , err error ) {
30
29
defer handleJSError (& err , func () {
31
- c = nil
30
+ c = WebSocket {}
32
31
})
33
32
34
33
jsProtocols := make ([]interface {}, len (protocols ))
35
34
for i , p := range protocols {
36
35
jsProtocols [i ] = p
37
36
}
38
37
39
- c = & WebSocket {
38
+ c = WebSocket {
40
39
v : js .Global ().Get ("WebSocket" ).New (url , jsProtocols ),
41
40
}
42
41
@@ -57,19 +56,25 @@ type WebSocket struct {
57
56
v js.Value
58
57
}
59
58
60
- func (c * WebSocket ) setBinaryType (typ string ) {
59
+ func (c WebSocket ) setBinaryType (typ string ) {
61
60
c .v .Set ("binaryType" , string (typ ))
62
61
}
63
62
64
- func (c * WebSocket ) BufferedAmount () uint32 {
63
+ func (c WebSocket ) BufferedAmount () uint32 {
65
64
return uint32 (c .v .Get ("bufferedAmount" ).Int ())
66
65
}
67
66
68
- func (c * WebSocket ) addEventListener (eventType string , fn func (e js.Value )) {
69
- c . v . Call ( "addEventListener" , eventType , js .FuncOf (func (this js.Value , args []js.Value ) interface {} {
67
+ func (c WebSocket ) addEventListener (eventType string , fn func (e js.Value )) func ( ) {
68
+ f := js .FuncOf (func (this js.Value , args []js.Value ) interface {} {
70
69
fn (args [0 ])
71
70
return nil
72
- }))
71
+ })
72
+ c .v .Call ("addEventListener" , eventType , f )
73
+
74
+ return func () {
75
+ c .v .Call ("removeEventListener" , eventType , f )
76
+ f .Release ()
77
+ }
73
78
}
74
79
75
80
type CloseEvent struct {
@@ -78,8 +83,8 @@ type CloseEvent struct {
78
83
WasClean bool
79
84
}
80
85
81
- func (c * WebSocket ) OnClose (fn func (CloseEvent )) {
82
- c .addEventListener ("close" , func (e js.Value ) {
86
+ func (c WebSocket ) OnClose (fn func (CloseEvent )) ( remove func ( )) {
87
+ return c .addEventListener ("close" , func (e js.Value ) {
83
88
ce := CloseEvent {
84
89
Code : uint16 (e .Get ("code" ).Int ()),
85
90
Reason : e .Get ("reason" ).String (),
@@ -89,23 +94,23 @@ func (c *WebSocket) OnClose(fn func(CloseEvent)) {
89
94
})
90
95
}
91
96
92
- func (c * WebSocket ) OnError (fn func (e js.Value )) {
93
- c .addEventListener ("error" , fn )
97
+ func (c WebSocket ) OnError (fn func (e js.Value )) ( remove func ( )) {
98
+ return c .addEventListener ("error" , fn )
94
99
}
95
100
96
101
type MessageEvent struct {
97
- Data [] byte
102
+ Data interface {}
98
103
// There are more types to the interface but we don't use them.
99
104
// See https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent
100
105
}
101
106
102
- func (c * WebSocket ) OnMessage (fn func (m MessageEvent )) {
103
- c .addEventListener ("message" , func (e js.Value ) {
104
- var data [] byte
107
+ func (c WebSocket ) OnMessage (fn func (m MessageEvent )) ( remove func ( )) {
108
+ return c .addEventListener ("message" , func (e js.Value ) {
109
+ var data interface {}
105
110
106
111
arrayBuffer := e .Get ("data" )
107
112
if arrayBuffer .Type () == js .TypeString {
108
- data = [] byte ( arrayBuffer .String () )
113
+ data = arrayBuffer .String ()
109
114
} else {
110
115
data = extractArrayBuffer (arrayBuffer )
111
116
}
@@ -119,23 +124,23 @@ func (c *WebSocket) OnMessage(fn func(m MessageEvent)) {
119
124
})
120
125
}
121
126
122
- func (c * WebSocket ) OnOpen (fn func (e js.Value )) {
123
- c .addEventListener ("open" , fn )
127
+ func (c WebSocket ) OnOpen (fn func (e js.Value )) ( remove func ( )) {
128
+ return c .addEventListener ("open" , fn )
124
129
}
125
130
126
- func (c * WebSocket ) Close (code int , reason string ) (err error ) {
131
+ func (c WebSocket ) Close (code int , reason string ) (err error ) {
127
132
defer handleJSError (& err , nil )
128
133
c .v .Call ("close" , code , reason )
129
134
return err
130
135
}
131
136
132
- func (c * WebSocket ) SendText (v string ) (err error ) {
137
+ func (c WebSocket ) SendText (v string ) (err error ) {
133
138
defer handleJSError (& err , nil )
134
139
c .v .Call ("send" , v )
135
140
return err
136
141
}
137
142
138
- func (c * WebSocket ) SendBytes (v []byte ) (err error ) {
143
+ func (c WebSocket ) SendBytes (v []byte ) (err error ) {
139
144
defer handleJSError (& err , nil )
140
145
c .v .Call ("send" , uint8Array (v ))
141
146
return err
0 commit comments