1
1
package server
2
2
3
3
import (
4
- "errors"
5
4
"fmt"
6
5
"io"
7
6
"net/http"
@@ -10,83 +9,84 @@ import (
10
9
"golang.org/x/net/websocket"
11
10
)
12
11
12
+ type Server struct {
13
+ methods map [string ]MethodHandler
14
+ wsserver websocket.Server
15
+ }
16
+
13
17
func New () Server {
14
18
s := Server {}
15
- s .wsserver = websocket. Server { Handler : s . wsHandler , Handshake : handshake }
16
- s .methods = make ( map [ string ] MethodFn )
19
+ s .methods = make ( map [ string ] MethodHandler )
20
+ s .wsserver = websocket. Server { Handler : s . handler , Handshake : s . handshake }
17
21
return s
18
22
}
19
23
20
- type Server struct {
21
- methods map [string ]MethodFn
22
- wsserver websocket.Server
23
- }
24
-
25
24
func (s * Server ) Listen (addr string ) error {
26
25
http .Handle ("/websocket" , s .wsserver )
27
26
http .Handle ("/sockjs/websocket" , s .wsserver )
28
27
return http .ListenAndServe (addr , nil )
29
28
}
30
29
31
- func (s * Server ) Method (name string , fn MethodFn ) {
30
+ func (s * Server ) Method (name string , fn MethodHandler ) {
32
31
s .methods [name ] = fn
33
32
}
34
33
35
- func (s * Server ) wsHandler (ws * websocket.Conn ) {
34
+ func (s * Server ) handshake (config * websocket.Config , req * http.Request ) error {
35
+ // accept all connections
36
+ return nil
37
+ }
38
+
39
+ func (s * Server ) handler (ws * websocket.Conn ) {
40
+ conn := Conn {ws }
41
+ defer ws .Close ()
42
+
36
43
for {
37
44
var msg Message
38
- if err := websocket . JSON . Receive ( ws , & msg ); err != nil {
45
+ if err := conn . ReadJSON ( & msg ); err != nil {
39
46
if err != io .EOF {
40
- fmt .Println ("Read Error: " , err )
47
+ fmt .Println ("Error ( Read Error): " , err , msg )
41
48
}
42
49
43
50
break
44
51
}
45
52
46
53
switch msg .Msg {
47
54
case "connect" :
48
- handleConnect (s , ws , msg )
55
+ s . handleConnect (& conn , msg )
49
56
case "ping" :
50
- handlePing (s , ws , msg )
57
+ s . handlePing (& conn , msg )
51
58
case "method" :
52
- handleMethod (s , ws , msg )
59
+ s . handleMethod (& conn , msg )
53
60
default :
54
- fmt .Println ("Error: unknown message type " , msg )
61
+ fmt .Println ("Error (Unknown Message Type): " , msg )
55
62
// TODO => send "error" ddp message
56
63
break
57
64
}
58
65
}
59
-
60
- ws .Close ()
61
- }
62
-
63
- func handshake (config * websocket.Config , req * http.Request ) error {
64
- // accept all connections
65
- return nil
66
66
}
67
67
68
- func handleConnect (s * Server , ws * websocket. Conn , m Message ) error {
69
- return websocket . JSON . Send ( ws , map [string ]string {
68
+ func (s * Server ) handleConnect ( conn Connection , m Message ) {
69
+ msg := map [string ]string {
70
70
"msg" : "connected" ,
71
71
"session" : random .Id (17 ),
72
- })
72
+ }
73
+
74
+ conn .WriteJSON (msg )
73
75
}
74
76
75
- func handleMethod (s * Server , ws * websocket. Conn , m Message ) error {
77
+ func (s * Server ) handleMethod ( conn Connection , m Message ) {
76
78
fn , ok := s .methods [m .Method ]
77
79
78
80
if ! ok {
79
- err := errors . New ( fmt .Sprintf ( "method %s not found " , m .Method ) )
80
- return err
81
+ fmt .Println ( "Error: (Method '%s' Not Found) " , m .Method )
82
+ return
81
83
}
82
84
83
- ctx := NewMethodContext (m , ws )
85
+ ctx := NewMethodContext (m , conn )
84
86
go fn (ctx )
85
-
86
- return nil
87
87
}
88
88
89
- func handlePing (s * Server , ws * websocket. Conn , m Message ) error {
89
+ func (s * Server ) handlePing ( conn Connection , m Message ) {
90
90
msg := map [string ]string {
91
91
"msg" : "pong" ,
92
92
}
@@ -95,5 +95,5 @@ func handlePing(s *Server, ws *websocket.Conn, m Message) error {
95
95
msg ["id" ] = m .ID
96
96
}
97
97
98
- return websocket . JSON . Send ( ws , msg )
98
+ conn . WriteJSON ( msg )
99
99
}
0 commit comments