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

Commit b044011

Browse files
authored
ref: clint file (#614)
1 parent cd0c86b commit b044011

File tree

1 file changed

+86
-97
lines changed

1 file changed

+86
-97
lines changed

client.go

+86-97
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package socketio
22

33
import (
44
"errors"
5-
"fmt"
65
"net/url"
76
"path"
87
"strings"
@@ -14,160 +13,161 @@ import (
1413
"github.com/googollee/go-socket.io/parser"
1514
)
1615

17-
// Server is a go-socket.io server.
16+
var EmptyAddrErr = errors.New("empty addr")
17+
18+
// Client is client for socket.io server
1819
type Client struct {
19-
conn *conn
2020
namespace string
21-
handlers *namespaceHandlers
2221
url string
23-
opts *engineio.Options
22+
23+
conn *conn
24+
handlers *namespaceHandlers
25+
26+
opts *engineio.Options
2427
}
2528

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+
}
2935

30-
url, err := url.Parse(uri)
36+
u, err := url.Parse(addr)
3137
if err != nil {
3238
return nil, err
3339
}
34-
namespace := url.Path
40+
41+
namespace := fmtNS(u.Path)
3542

3643
// 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 += "/"
4148
}
4249

43-
client := &Client{
44-
conn: nil,
50+
return &Client{
4551
namespace: namespace,
46-
url: url.String(),
52+
url: u.String(),
4753
handlers: newNamespaceHandlers(),
4854
opts: opts,
49-
}
55+
}, nil
56+
}
5057

51-
fmt.Println(client)
58+
func fmtNS(ns string) string {
59+
if ns == aliasRootNamespace {
60+
return rootNamespace
61+
}
5262

53-
return client, nil
63+
return ns
5464
}
5565

56-
func (s *Client) Connect() error {
66+
func (c *Client) Connect() error {
5767
dialer := engineio.Dialer{
5868
Transports: []transport.Transport{polling.Default},
5969
}
60-
enginioCon, err := dialer.Dial(s.url, nil)
70+
71+
enginioCon, err := dialer.Dial(c.url, nil)
6172
if err != nil {
6273
return err
6374
}
6475

65-
// Set the engine connection
66-
c := newConn(enginioCon, s.handlers)
67-
68-
s.conn = c
76+
c.conn = newConn(enginioCon, c.handlers)
6977

70-
if err := c.connectClient(); err != nil {
78+
if err := c.conn.connectClient(); err != nil {
7179
_ = 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 {
7381
root.onError(nil, err)
7482
}
7583

7684
return err
7785
}
7886

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+
8291
return nil
8392
}
8493

8594
// 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()
8897
}
8998

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)
97101
if !ok {
98102
logger.Info("Connection Namespace not initialized")
99103
return
100104
}
101-
ns.Emit(event, args...)
105+
106+
nsConn.Emit(event, args...)
102107
}
103108

104109
// 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)
107112
if h == nil {
108-
h = s.createNamespace(s.namespace)
113+
h = c.createNamespace(c.namespace)
109114
}
110115

111116
h.OnConnect(f)
112117
}
113118

114119
// 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)
117122
if h == nil {
118-
h = s.createNamespace(s.namespace)
123+
h = c.createNamespace(c.namespace)
119124
}
120125

121126
h.OnDisconnect(f)
122127
}
123128

124129
// 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)
127132
if h == nil {
128-
h = s.createNamespace(s.namespace)
133+
h = c.createNamespace(c.namespace)
129134
}
130135

131136
h.OnError(f)
132137
}
133138

134139
// 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)
137142
if h == nil {
138-
h = s.createNamespace(s.namespace)
143+
h = c.createNamespace(c.namespace)
139144
}
140145

141146
h.OnEvent(event, f)
142147
}
143148

144-
/////////////////////////
145-
// Private Functions
146-
/////////////////////////
147-
148-
func (s *Client) clientError(c *conn) {
149+
func (c *Client) clientError() {
149150
defer func() {
150151
if err := c.Close(); err != nil {
151152
logger.Error("close connect:", err)
152153
}
153-
154154
}()
155155

156156
for {
157157
select {
158-
case <-c.quitChan:
158+
case <-c.conn.quitChan:
159159
return
160-
case err := <-c.errorChan:
160+
case err := <-c.conn.errorChan:
161161
logger.Error("clientError", err)
162162

163163
var errMsg *errorMessage
164164
if !errors.As(err, &errMsg) {
165165
continue
166166
}
167167

168-
if handler := c.namespace(errMsg.namespace); handler != nil {
168+
if handler := c.conn.namespace(errMsg.namespace); handler != nil {
169169
if handler.onError != nil {
170-
nsConn, ok := c.namespaces.Get(errMsg.namespace)
170+
nsConn, ok := c.conn.namespaces.Get(errMsg.namespace)
171171
if !ok {
172172
continue
173173
}
@@ -178,7 +178,7 @@ func (s *Client) clientError(c *conn) {
178178
}
179179
}
180180

181-
func (s *Client) clientWrite(c *conn) {
181+
func (c *Client) clientWrite() {
182182
defer func() {
183183
if err := c.Close(); err != nil {
184184
logger.Error("close connect:", err)
@@ -188,18 +188,18 @@ func (s *Client) clientWrite(c *conn) {
188188

189189
for {
190190
select {
191-
case <-c.quitChan:
191+
case <-c.conn.quitChan:
192192
logger.Info("clientWrite Writer loop has stopped")
193193
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)
197197
}
198198
}
199199
}
200200
}
201201

202-
func (s *Client) clientRead(c *conn) {
202+
func (c *Client) clientRead() {
203203
defer func() {
204204
if err := c.Close(); err != nil {
205205
logger.Error("close connect:", err)
@@ -211,9 +211,11 @@ func (s *Client) clientRead(c *conn) {
211211
for {
212212
var header parser.Header
213213

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+
216217
logger.Error("clientRead Error in Decoder", err)
218+
217219
return
218220
}
219221

@@ -224,50 +226,41 @@ func (s *Client) clientRead(c *conn) {
224226
var err error
225227
switch header.Type {
226228
case parser.Ack:
227-
err = ackPacketHandler(c, header)
229+
err = ackPacketHandler(c.conn, header)
228230
case parser.Connect:
229-
err = clientConnectPacketHandler(c, header)
231+
err = clientConnectPacketHandler(c.conn, header)
230232
case parser.Disconnect:
231-
err = clientDisconnectPacketHandler(c, header)
233+
err = clientDisconnectPacketHandler(c.conn, header)
232234
case parser.Event:
233-
err = eventPacketHandler(c, event, header)
235+
err = eventPacketHandler(c.conn, event, header)
236+
default:
237+
234238
}
235239

236240
if err != nil {
237241
logger.Error("client read:", err)
242+
238243
return
239244
}
240245
}
241246
}
242247

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)
250251

251252
return handler
252253
}
253254

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)
260257
if !ok {
261258
return nil
262259
}
263260

264261
return ret
265262
}
266263

267-
////
268-
// Handlers
269-
////
270-
271264
func (c *conn) connectClient() error {
272265
rootHandler, ok := c.handlers.Get(rootNamespace)
273266
if !ok {
@@ -287,9 +280,5 @@ func (c *conn) connectClient() error {
287280
Type: parser.Connect,
288281
}
289282

290-
if err := c.encoder.Encode(header); err != nil {
291-
return err
292-
}
293-
294-
return nil
283+
return c.encoder.Encode(header)
295284
}

0 commit comments

Comments
 (0)