1
1
package server
2
2
3
3
import (
4
- "encoding/json"
5
- "errors"
6
4
"fmt"
5
+ "io"
7
6
"net/http"
8
7
9
- "github.com/gorilla/websocket"
10
8
"github.com/meteorhacks/goddp/utils/random"
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 .methods = make (map [string ]MethodFn )
16
- s .upgrader = websocket.Upgrader {
17
- ReadBufferSize : 1024 ,
18
- WriteBufferSize : 1024 ,
19
- CheckOrigin : checkOrigin ,
20
- }
21
-
19
+ s .methods = make (map [string ]MethodHandler )
20
+ s .wsserver = websocket.Server {Handler : s .handler , Handshake : s .handshake }
22
21
return s
23
22
}
24
23
25
- type Server struct {
26
- methods map [string ]MethodFn
27
- upgrader websocket.Upgrader
28
- }
29
-
30
24
func (s * Server ) Listen (addr string ) error {
31
- http .HandleFunc ("/websocket" , s .Handler )
32
- http .HandleFunc ("/sockjs/websocket" , s .Handler )
25
+ http .Handle ("/websocket" , s .wsserver )
26
+ http .Handle ("/sockjs/websocket" , s .wsserver )
33
27
return http .ListenAndServe (addr , nil )
34
28
}
35
29
36
- func (s * Server ) Method (name string , fn MethodFn ) {
30
+ func (s * Server ) Method (name string , fn MethodHandler ) {
37
31
s .methods [name ] = fn
38
32
}
39
33
40
- func (s * Server ) Handler (w http.ResponseWriter , r * http.Request ) {
41
- ws , err := s .upgrader .Upgrade (w , r , nil )
42
- if err != nil {
43
- // TODO => handle non-websocket requests
44
- return
45
- }
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 ()
46
42
47
43
for {
48
- msg , err := readMessage (ws )
44
+ var msg Message
45
+ if err := conn .ReadJSON (& msg ); err != nil {
46
+ if err != io .EOF {
47
+ fmt .Println ("Error (Read Error):" , err , msg )
48
+ }
49
49
50
- if err != nil {
51
50
break
52
51
}
53
52
54
53
switch msg .Msg {
55
54
case "connect" :
56
- handleConnect (s , ws , msg )
55
+ s . handleConnect (& conn , msg )
57
56
case "ping" :
58
- handlePing (s , ws , msg )
57
+ s . handlePing (& conn , msg )
59
58
case "method" :
60
- handleMethod (s , ws , msg )
59
+ s . handleMethod (& conn , msg )
61
60
default :
61
+ fmt .Println ("Error (Unknown Message Type):" , msg )
62
62
// TODO => send "error" ddp message
63
63
break
64
64
}
65
65
}
66
-
67
- ws .Close ()
68
- }
69
-
70
- func checkOrigin (r * http.Request ) bool {
71
- return true
72
66
}
73
67
74
- func readMessage (req Request ) (Message , error ) {
75
- t , str , err := req .ReadMessage ()
76
- msg := Message {}
77
-
78
- if err != nil {
79
- return msg , err
80
- }
81
-
82
- if t != 1 {
83
- err = errors .New ("DDP does not supports binary streams yet" )
84
- return msg , err
85
- }
86
-
87
- if err := json .Unmarshal (str , & msg ); err != nil {
88
- return msg , err
89
- }
90
-
91
- return msg , nil
92
- }
93
-
94
- func handleConnect (s * Server , res Response , m Message ) error {
95
- return res .WriteJSON (map [string ]string {
68
+ func (s * Server ) handleConnect (conn Connection , m Message ) {
69
+ msg := map [string ]string {
96
70
"msg" : "connected" ,
97
71
"session" : random .Id (17 ),
98
- })
72
+ }
73
+
74
+ conn .WriteJSON (msg )
99
75
}
100
76
101
- func handleMethod (s * Server , res Response , m Message ) error {
77
+ func (s * Server ) handleMethod ( conn Connection , m Message ) {
102
78
fn , ok := s .methods [m .Method ]
103
79
104
80
if ! ok {
105
- err := errors . New ( fmt .Sprintf ( "method %s not found " , m .Method ) )
106
- return err
81
+ fmt .Println ( "Error: (Method '%s' Not Found) " , m .Method )
82
+ return
107
83
}
108
84
109
- ctx := NewMethodContext (m , res )
85
+ ctx := NewMethodContext (m , conn )
110
86
go fn (ctx )
111
-
112
- return nil
113
87
}
114
88
115
- func handlePing (s * Server , res Response , m Message ) error {
89
+ func (s * Server ) handlePing ( conn Connection , m Message ) {
116
90
msg := map [string ]string {
117
91
"msg" : "pong" ,
118
92
}
@@ -121,5 +95,5 @@ func handlePing(s *Server, res Response, m Message) error {
121
95
msg ["id" ] = m .ID
122
96
}
123
97
124
- return res .WriteJSON (msg )
98
+ conn .WriteJSON (msg )
125
99
}
0 commit comments