@@ -4,110 +4,39 @@ import (
4
4
"encoding/json"
5
5
"errors"
6
6
"fmt"
7
- "math/rand"
8
7
"net/http"
9
8
10
9
"github.com/gorilla/websocket"
11
10
)
12
11
13
- type MethodHandler func ([]interface {}) (interface {}, error )
14
-
15
12
type Server struct {
16
- ws * websocket.Conn
17
- methods map [string ]MethodHandler
18
- }
19
-
20
- type Message struct {
21
- Msg string `json:"msg"`
22
- Session string `json:"session"`
23
- Version string `json:"version"`
24
- Support []string `json:"support"`
25
- Id string `json:"id"`
26
- Method string `json:"method"`
27
- Params []interface {} `json:"params"`
28
- Result string `json:"result"`
29
- Methods []string `json:"methods"`
30
- }
31
-
32
- // type ConnectMessage struct {
33
- // Msg string `json:"msg"`
34
- // Session string `json:"session"`
35
- // Version string `json:"version"`
36
- // Support []string `json:"support"`
37
- // }
38
-
39
- // type ConnectedMessage struct {
40
- // Msg string `json:"msg"`
41
- // Session string `json:"session"`
42
- // }
43
-
44
- // type PingWithIdMessage struct {
45
- // Msg string `json:"msg"`
46
- // Id string `json:"id"`
47
- // }
48
-
49
- // type PingWithoutIdMessage struct {
50
- // Msg string `json:"msg"`
51
- // }
52
-
53
- // type PongWithIdMessage struct {
54
- // Msg string `json:"msg"`
55
- // Id string `json:"id"`
56
- // }
57
-
58
- // type PongWithoutIdMessage struct {
59
- // Msg string `json:"msg"`
60
- // }
61
-
62
- // type MethodMessage struct {
63
- // Msg string `json:"msg"`
64
- // Id string `json:"id"`
65
- // Method string `json:"method"`
66
- // Params []interface{} `json:"params"`
67
- // }
68
-
69
- // type ResultWithErrorMessage struct {
70
- // Msg string `json:"msg"`
71
- // Id string `json:"id"`
72
- // Error Error `json:"error"`
73
- // }
74
-
75
- // type ResultWithoutErrorMessage struct {
76
- // Msg string `json:"msg"`
77
- // Id string `json:"id"`
78
- // Result string `json:"result"`
79
- // }
80
-
81
- // type UpdatedMessage struct {
82
- // Msg string `json:"msg"`
83
- // Methods []string `json:"methods"`
84
- // }
85
-
86
- // type Error struct {
87
- // error string
88
- // reason string
89
- // details string
90
- // }
91
-
92
- var upgrader = websocket.Upgrader {
93
- ReadBufferSize : 1024 ,
94
- WriteBufferSize : 1024 ,
13
+ methods map [string ]MethodHandler
14
+ upgrader websocket.Upgrader
95
15
}
96
16
97
17
func New () Server {
98
18
server := Server {}
99
19
server .methods = make (map [string ]MethodHandler )
20
+ server .upgrader = websocket.Upgrader {
21
+ ReadBufferSize : 1024 ,
22
+ WriteBufferSize : 1024 ,
23
+ }
24
+
100
25
return server
101
26
}
102
27
103
28
func (s * Server ) Method (n string , h MethodHandler ) {
104
29
s .methods [n ] = h
105
30
}
106
31
32
+ func (s * Server ) Listen (ipPort string ) {
33
+ http .HandleFunc ("/websocket" , s .handler )
34
+ http .ListenAndServe (ipPort , nil )
35
+ }
36
+
107
37
// create websocket connection from http handler and runs the websocket handler
108
- func (s * Server ) Handler (w http.ResponseWriter , r * http.Request ) {
109
- ws , err := upgrader .Upgrade (w , r , nil )
110
- s .ws = ws
38
+ func (s * Server ) handler (w http.ResponseWriter , r * http.Request ) {
39
+ ws , err := s .upgrader .Upgrade (w , r , nil )
111
40
112
41
if err != nil {
113
42
fmt .Println ("Error: could not creating websocket connection" )
@@ -127,29 +56,29 @@ func (s *Server) Handler(w http.ResponseWriter, r *http.Request) {
127
56
128
57
switch {
129
58
case msg .Msg == "ping" :
130
- go s .HandlePing (ws , & msg )
59
+ go s .handlePing (ws , & msg )
131
60
case msg .Msg == "connect" :
132
- go s .HandleConnect (ws , & msg )
61
+ go s .handleConnect (ws , & msg )
133
62
case msg .Msg == "method" :
134
- go s .HandleMethod (ws , & msg )
63
+ go s .handleMethod (ws , & msg )
135
64
default :
136
65
fmt .Println ("Error: unknown ddp message" , msg )
137
66
}
138
67
}
139
68
}
140
69
141
- func (s * Server ) HandleConnect (c * websocket.Conn , m * Message ) {
70
+ func (s * Server ) handleConnect (c * websocket.Conn , m * Message ) {
142
71
err := c .WriteJSON (map [string ]string {
143
72
"msg" : "connected" ,
144
- "session" : randId (17 ),
73
+ "session" : randomId (17 ),
145
74
})
146
75
147
76
if err != nil {
148
77
fmt .Println (err )
149
78
}
150
79
}
151
80
152
- func (s * Server ) HandlePing (c * websocket.Conn , m * Message ) {
81
+ func (s * Server ) handlePing (c * websocket.Conn , m * Message ) {
153
82
if m .Id != "" {
154
83
err := c .WriteJSON (map [string ]string {
155
84
"msg" : "pong" ,
@@ -170,7 +99,7 @@ func (s *Server) HandlePing(c *websocket.Conn, m *Message) {
170
99
}
171
100
}
172
101
173
- func (s * Server ) HandleMethod (c * websocket.Conn , m * Message ) {
102
+ func (s * Server ) handleMethod (c * websocket.Conn , m * Message ) {
174
103
res , _ := s.methods [m.Method ](m .Params )
175
104
err := c .WriteJSON (map [string ]interface {}{
176
105
"msg" : "result" ,
@@ -203,21 +132,10 @@ func readMessage(ws *websocket.Conn) (Message, error) {
203
132
204
133
if t != 1 {
205
134
// ignore binary data
206
- err = errors .New ("Error: websocket data is binary" )
135
+ err = errors .New ("Error: DDP does not supports binary streams yet. " )
207
136
return msg , err
208
137
}
209
138
210
139
err = json .Unmarshal (str , & msg )
211
140
return msg , err
212
141
}
213
-
214
- // TODO: move this to another package
215
- var letters = []rune ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" )
216
-
217
- func randId (n int ) string {
218
- b := make ([]rune , n )
219
- for i := range b {
220
- b [i ] = letters [rand .Intn (len (letters ))]
221
- }
222
- return string (b )
223
- }
0 commit comments