@@ -3,138 +3,84 @@ package server
3
3
import (
4
4
"encoding/json"
5
5
"errors"
6
- "fmt"
7
6
"net/http"
8
7
9
8
"github.com/gorilla/websocket"
10
- "github.com/meteorhacks/goddp/utils/random"
11
9
)
12
10
13
11
type Server struct {
14
- methods map [string ]MethodHandler
12
+ handlers map [string ]Handler
13
+ methods map [string ]MethodFn
15
14
upgrader websocket.Upgrader
16
15
}
17
16
18
17
func New () Server {
19
- server := Server {}
20
- server .methods = make (map [string ]MethodHandler )
21
- server .upgrader = websocket.Upgrader {
18
+ s := Server {}
19
+ s .methods = make (map [string ]MethodFn )
20
+ s .upgrader = websocket.Upgrader {
22
21
ReadBufferSize : 1024 ,
23
22
WriteBufferSize : 1024 ,
24
23
}
25
24
26
- return server
27
- }
25
+ s .handlers = map [string ]Handler {
26
+ "connect" : NewConnectHandler (s ),
27
+ "ping" : NewPingHandler (s ),
28
+ "method" : NewMethodHandler (s ),
29
+ }
28
30
29
- func (s * Server ) Method (n string , h MethodHandler ) {
30
- s .methods [n ] = h
31
+ return s
31
32
}
32
33
33
- func (s * Server ) Listen (ipPort string ) {
34
+ func (s * Server ) Listen (addr string ) {
34
35
http .HandleFunc ("/websocket" , s .Handler )
35
- http .ListenAndServe (ipPort , nil )
36
+ http .ListenAndServe (addr , nil )
37
+ }
38
+
39
+ func (s * Server ) Method (name string , fn MethodFn ) {
40
+ s .methods [name ] = fn
36
41
}
37
42
38
43
func (s * Server ) Handler (w http.ResponseWriter , r * http.Request ) {
39
44
ws , err := s .upgrader .Upgrade (w , r , nil )
40
-
41
45
if err != nil {
42
- fmt . Println ( "Error: could not creating websocket connection" )
46
+ // TODO => handle non- websocket requests
43
47
return
44
48
}
45
49
46
50
for {
47
- msg , err := readMessage (ws )
51
+ msg , err := readMessage (req )
48
52
49
53
if err != nil {
50
- ws .Close ()
51
54
break
52
55
}
53
56
54
- switch {
55
- case msg .Msg == "ping" :
56
- go s .handlePing (ws , msg )
57
- case msg .Msg == "connect" :
58
- go s .handleConnect (ws , msg )
59
- case msg .Msg == "method" :
60
- go s .handleMethod (ws , msg )
61
- default :
62
- fmt .Println ("Error: unknown ddp message" , * msg )
63
- ws .Close ()
57
+ if h , ok := s .handlers [msg .Msg ]; ok {
58
+ go h .handle (res , msg )
59
+ } else {
60
+ // TODO => send "error" ddp message
64
61
break
65
62
}
66
63
}
67
- }
68
-
69
- func (s * Server ) handleConnect (c * websocket.Conn , m * Message ) {
70
- err := c .WriteJSON (map [string ]string {
71
- "msg" : "connected" ,
72
- "session" : random .Id (17 ),
73
- })
74
64
75
- if err != nil {
76
- fmt .Println (err )
77
- }
65
+ ws .Close ()
78
66
}
79
67
80
- func (s * Server ) handlePing (c * websocket.Conn , m * Message ) {
81
- if m .Id != "" {
82
- err := c .WriteJSON (map [string ]string {
83
- "msg" : "pong" ,
84
- "id" : m .Id ,
85
- })
86
-
87
- if err != nil {
88
- fmt .Println (err )
89
- }
90
- } else {
91
- err := c .WriteJSON (map [string ]string {
92
- "msg" : "pong" ,
93
- })
94
-
95
- if err != nil {
96
- fmt .Println (err )
97
- }
98
- }
99
- }
100
-
101
- func (s * Server ) handleMethod (c * websocket.Conn , m * Message ) {
102
- res , _ := s.methods [m.Method ](m .Params )
103
- err := c .WriteJSON (map [string ]interface {}{
104
- "msg" : "result" ,
105
- "id" : m .Id ,
106
- "result" : res ,
107
- })
68
+ func readMessage (req Request ) (Message , error ) {
69
+ t , str , err := req .ReadMessage ()
70
+ msg := Message {}
108
71
109
72
if err != nil {
110
- fmt . Println ( err )
73
+ return msg , err
111
74
}
112
75
113
- err = c .WriteJSON (map [string ]interface {}{
114
- "msg" : "updated" ,
115
- "methods" : []string {m .Id },
116
- })
117
-
118
- if err != nil {
119
- fmt .Println (err )
120
- }
121
- }
122
-
123
- func readMessage (ws * websocket.Conn ) (* Message , error ) {
124
- t , str , err := ws .ReadMessage ()
125
- msg := & Message {}
126
-
127
- if err != nil {
128
- // error reading message
129
- return nil , err
76
+ if t != 1 {
77
+ err = errors .New ("DDP does not supports binary streams yet" )
78
+ return msg , err
130
79
}
131
80
132
- if t != 1 {
133
- // ignore binary data
134
- err = errors .New ("Error: DDP does not supports binary streams yet." )
135
- return nil , err
81
+ if err := json .Unmarshal (str , & msg ); err != nil {
82
+ return msg , err
136
83
}
137
84
138
- err = json .Unmarshal (str , msg )
139
85
return msg , nil
140
86
}
0 commit comments