@@ -2,7 +2,6 @@ package socketio
2
2
3
3
import (
4
4
"errors"
5
- "fmt"
6
5
"net/url"
7
6
"path"
8
7
"strings"
@@ -14,160 +13,161 @@ import (
14
13
"github.com/googollee/go-socket.io/parser"
15
14
)
16
15
17
- // Server is a go-socket.io server.
16
+ var EmptyAddrErr = errors .New ("empty addr" )
17
+
18
+ // Client is client for socket.io server
18
19
type Client struct {
19
- conn * conn
20
20
namespace string
21
- handlers * namespaceHandlers
22
21
url string
23
- opts * engineio.Options
22
+
23
+ conn * conn
24
+ handlers * namespaceHandlers
25
+
26
+ opts * engineio.Options
24
27
}
25
28
26
- // NewServer returns a server.
27
- func NewClient (uri string , opts * engineio.Options ) (* Client , error ) {
28
- // uri like http://asd.com:8080/namesapce
29
+ // NewClient returns a server
30
+ // addr like http://asd.com:8080/{$namespace}
31
+ func NewClient (addr string , opts * engineio.Options ) (* Client , error ) {
32
+ if addr == "" {
33
+ return nil , EmptyAddrErr
34
+ }
29
35
30
- url , err := url .Parse (uri )
36
+ u , err := url .Parse (addr )
31
37
if err != nil {
32
38
return nil , err
33
39
}
34
- namespace := url .Path
40
+
41
+ namespace := fmtNS (u .Path )
35
42
36
43
// Not allowing other than default
37
- url .Path = path .Join ("/socket.io" , namespace )
38
- url .Path = url .EscapedPath ()
39
- if strings .HasSuffix (url .Path , "socket.io" ) {
40
- url .Path += "/"
44
+ u .Path = path .Join ("/socket.io" , namespace )
45
+ u .Path = u .EscapedPath ()
46
+ if strings .HasSuffix (u .Path , "socket.io" ) {
47
+ u .Path += "/"
41
48
}
42
49
43
- client := & Client {
44
- conn : nil ,
50
+ return & Client {
45
51
namespace : namespace ,
46
- url : url .String (),
52
+ url : u .String (),
47
53
handlers : newNamespaceHandlers (),
48
54
opts : opts ,
49
- }
55
+ }, nil
56
+ }
50
57
51
- fmt .Println (client )
58
+ func fmtNS (ns string ) string {
59
+ if ns == aliasRootNamespace {
60
+ return rootNamespace
61
+ }
52
62
53
- return client , nil
63
+ return ns
54
64
}
55
65
56
- func (s * Client ) Connect () error {
66
+ func (c * Client ) Connect () error {
57
67
dialer := engineio.Dialer {
58
68
Transports : []transport.Transport {polling .Default },
59
69
}
60
- enginioCon , err := dialer .Dial (s .url , nil )
70
+
71
+ enginioCon , err := dialer .Dial (c .url , nil )
61
72
if err != nil {
62
73
return err
63
74
}
64
75
65
- // Set the engine connection
66
- c := newConn (enginioCon , s .handlers )
67
-
68
- s .conn = c
76
+ c .conn = newConn (enginioCon , c .handlers )
69
77
70
- if err := c .connectClient (); err != nil {
78
+ if err := c .conn . connectClient (); err != nil {
71
79
_ = c .Close ()
72
- if root , ok := s .handlers .Get (rootNamespace ); ok && root .onError != nil {
80
+ if root , ok := c .handlers .Get (rootNamespace ); ok && root .onError != nil {
73
81
root .onError (nil , err )
74
82
}
75
83
76
84
return err
77
85
}
78
86
79
- go s .clientError (c )
80
- go s .clientWrite (c )
81
- go s .clientRead (c )
87
+ go c .clientError ()
88
+ go c .clientWrite ()
89
+ go c .clientRead ()
90
+
82
91
return nil
83
92
}
84
93
85
94
// Close closes server.
86
- func (s * Client ) Close () error {
87
- return s .conn .Close ()
95
+ func (c * Client ) Close () error {
96
+ return c .conn .Close ()
88
97
}
89
98
90
- func (s * Client ) Emit (event string , args ... interface {}) {
91
- nsp := s .namespace
92
- if nsp == aliasRootNamespace {
93
- nsp = rootNamespace
94
- }
95
-
96
- ns , ok := s .conn .namespaces .Get (nsp )
99
+ func (c * Client ) Emit (event string , args ... interface {}) {
100
+ nsConn , ok := c .conn .namespaces .Get (c .namespace )
97
101
if ! ok {
98
102
logger .Info ("Connection Namespace not initialized" )
99
103
return
100
104
}
101
- ns .Emit (event , args ... )
105
+
106
+ nsConn .Emit (event , args ... )
102
107
}
103
108
104
109
// OnConnect set a handler function f to handle open event for namespace.
105
- func (s * Client ) OnConnect (f func (Conn ) error ) {
106
- h := s .getNamespace (s .namespace )
110
+ func (c * Client ) OnConnect (f func (Conn ) error ) {
111
+ h := c .getNamespace (c .namespace )
107
112
if h == nil {
108
- h = s .createNamespace (s .namespace )
113
+ h = c .createNamespace (c .namespace )
109
114
}
110
115
111
116
h .OnConnect (f )
112
117
}
113
118
114
119
// OnDisconnect set a handler function f to handle disconnect event for namespace.
115
- func (s * Client ) OnDisconnect (f func (Conn , string )) {
116
- h := s .getNamespace (s .namespace )
120
+ func (c * Client ) OnDisconnect (f func (Conn , string )) {
121
+ h := c .getNamespace (c .namespace )
117
122
if h == nil {
118
- h = s .createNamespace (s .namespace )
123
+ h = c .createNamespace (c .namespace )
119
124
}
120
125
121
126
h .OnDisconnect (f )
122
127
}
123
128
124
129
// OnError set a handler function f to handle error for namespace.
125
- func (s * Client ) OnError (f func (Conn , error )) {
126
- h := s .getNamespace (s .namespace )
130
+ func (c * Client ) OnError (f func (Conn , error )) {
131
+ h := c .getNamespace (c .namespace )
127
132
if h == nil {
128
- h = s .createNamespace (s .namespace )
133
+ h = c .createNamespace (c .namespace )
129
134
}
130
135
131
136
h .OnError (f )
132
137
}
133
138
134
139
// OnEvent set a handler function f to handle event for namespace.
135
- func (s * Client ) OnEvent (event string , f interface {}) {
136
- h := s .getNamespace (s .namespace )
140
+ func (c * Client ) OnEvent (event string , f interface {}) {
141
+ h := c .getNamespace (c .namespace )
137
142
if h == nil {
138
- h = s .createNamespace (s .namespace )
143
+ h = c .createNamespace (c .namespace )
139
144
}
140
145
141
146
h .OnEvent (event , f )
142
147
}
143
148
144
- /////////////////////////
145
- // Private Functions
146
- /////////////////////////
147
-
148
- func (s * Client ) clientError (c * conn ) {
149
+ func (c * Client ) clientError () {
149
150
defer func () {
150
151
if err := c .Close (); err != nil {
151
152
logger .Error ("close connect:" , err )
152
153
}
153
-
154
154
}()
155
155
156
156
for {
157
157
select {
158
- case <- c .quitChan :
158
+ case <- c .conn . quitChan :
159
159
return
160
- case err := <- c .errorChan :
160
+ case err := <- c .conn . errorChan :
161
161
logger .Error ("clientError" , err )
162
162
163
163
var errMsg * errorMessage
164
164
if ! errors .As (err , & errMsg ) {
165
165
continue
166
166
}
167
167
168
- if handler := c .namespace (errMsg .namespace ); handler != nil {
168
+ if handler := c .conn . namespace (errMsg .namespace ); handler != nil {
169
169
if handler .onError != nil {
170
- nsConn , ok := c .namespaces .Get (errMsg .namespace )
170
+ nsConn , ok := c .conn . namespaces .Get (errMsg .namespace )
171
171
if ! ok {
172
172
continue
173
173
}
@@ -178,7 +178,7 @@ func (s *Client) clientError(c *conn) {
178
178
}
179
179
}
180
180
181
- func (s * Client ) clientWrite (c * conn ) {
181
+ func (c * Client ) clientWrite () {
182
182
defer func () {
183
183
if err := c .Close (); err != nil {
184
184
logger .Error ("close connect:" , err )
@@ -188,18 +188,18 @@ func (s *Client) clientWrite(c *conn) {
188
188
189
189
for {
190
190
select {
191
- case <- c .quitChan :
191
+ case <- c .conn . quitChan :
192
192
logger .Info ("clientWrite Writer loop has stopped" )
193
193
return
194
- case pkg := <- c .writeChan :
195
- if err := c .encoder .Encode (pkg .Header , pkg .Data ); err != nil {
196
- c .onError (pkg .Header .Namespace , err )
194
+ case pkg := <- c .conn . writeChan :
195
+ if err := c .conn . encoder .Encode (pkg .Header , pkg .Data ); err != nil {
196
+ c .conn . onError (pkg .Header .Namespace , err )
197
197
}
198
198
}
199
199
}
200
200
}
201
201
202
- func (s * Client ) clientRead (c * conn ) {
202
+ func (c * Client ) clientRead () {
203
203
defer func () {
204
204
if err := c .Close (); err != nil {
205
205
logger .Error ("close connect:" , err )
@@ -211,9 +211,11 @@ func (s *Client) clientRead(c *conn) {
211
211
for {
212
212
var header parser.Header
213
213
214
- if err := c .decoder .DecodeHeader (& header , & event ); err != nil {
215
- c .onError (rootNamespace , err )
214
+ if err := c .conn .decoder .DecodeHeader (& header , & event ); err != nil {
215
+ c .conn .onError (rootNamespace , err )
216
+
216
217
logger .Error ("clientRead Error in Decoder" , err )
218
+
217
219
return
218
220
}
219
221
@@ -224,50 +226,41 @@ func (s *Client) clientRead(c *conn) {
224
226
var err error
225
227
switch header .Type {
226
228
case parser .Ack :
227
- err = ackPacketHandler (c , header )
229
+ err = ackPacketHandler (c . conn , header )
228
230
case parser .Connect :
229
- err = clientConnectPacketHandler (c , header )
231
+ err = clientConnectPacketHandler (c . conn , header )
230
232
case parser .Disconnect :
231
- err = clientDisconnectPacketHandler (c , header )
233
+ err = clientDisconnectPacketHandler (c . conn , header )
232
234
case parser .Event :
233
- err = eventPacketHandler (c , event , header )
235
+ err = eventPacketHandler (c .conn , event , header )
236
+ default :
237
+
234
238
}
235
239
236
240
if err != nil {
237
241
logger .Error ("client read:" , err )
242
+
238
243
return
239
244
}
240
245
}
241
246
}
242
247
243
- func (s * Client ) createNamespace (nsp string ) * namespaceHandler {
244
- if nsp == aliasRootNamespace {
245
- nsp = rootNamespace
246
- }
247
-
248
- handler := newNamespaceHandler (nsp , nil )
249
- s .handlers .Set (nsp , handler )
248
+ func (c * Client ) createNamespace (ns string ) * namespaceHandler {
249
+ handler := newNamespaceHandler (ns , nil )
250
+ c .handlers .Set (ns , handler )
250
251
251
252
return handler
252
253
}
253
254
254
- func (s * Client ) getNamespace (nsp string ) * namespaceHandler {
255
- if nsp == aliasRootNamespace {
256
- nsp = rootNamespace
257
- }
258
-
259
- ret , ok := s .handlers .Get (nsp )
255
+ func (c * Client ) getNamespace (ns string ) * namespaceHandler {
256
+ ret , ok := c .handlers .Get (ns )
260
257
if ! ok {
261
258
return nil
262
259
}
263
260
264
261
return ret
265
262
}
266
263
267
- ////
268
- // Handlers
269
- ////
270
-
271
264
func (c * conn ) connectClient () error {
272
265
rootHandler , ok := c .handlers .Get (rootNamespace )
273
266
if ! ok {
@@ -287,9 +280,5 @@ func (c *conn) connectClient() error {
287
280
Type : parser .Connect ,
288
281
}
289
282
290
- if err := c .encoder .Encode (header ); err != nil {
291
- return err
292
- }
293
-
294
- return nil
283
+ return c .encoder .Encode (header )
295
284
}
0 commit comments