Skip to content

Commit a6454e7

Browse files
committed
Use golang websockets
1 parent e5dd457 commit a6454e7

File tree

2 files changed

+30
-54
lines changed

2 files changed

+30
-54
lines changed

server/method_context.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,23 @@ package server
22

33
import (
44
"errors"
5+
6+
"golang.org/x/net/websocket"
57
)
68

79
type MethodContext struct {
810
ID string
911
Args []interface{}
10-
Res Response
12+
Conn *websocket.Conn
1113
Done bool
1214
Updated bool
1315
}
1416

15-
func NewMethodContext(m Message, res Response) MethodContext {
17+
func NewMethodContext(m Message, ws *websocket.Conn) MethodContext {
1618
ctx := MethodContext{}
1719
ctx.ID = m.ID
1820
ctx.Args = m.Params
19-
ctx.Res = res
21+
ctx.Conn = ws
2022
return ctx
2123
}
2224

@@ -27,7 +29,7 @@ func (ctx *MethodContext) SendResult(r interface{}) error {
2729
}
2830

2931
ctx.Done = true
30-
return ctx.Res.WriteJSON(map[string]interface{}{
32+
return websocket.JSON.Send(ctx.Conn, map[string]interface{}{
3133
"msg": "result",
3234
"id": ctx.ID,
3335
"result": r,
@@ -41,7 +43,7 @@ func (ctx *MethodContext) SendError(e string) error {
4143
}
4244

4345
ctx.Done = true
44-
return ctx.Res.WriteJSON(map[string]interface{}{
46+
return websocket.JSON.Send(ctx.Conn, map[string]interface{}{
4547
"msg": "result",
4648
"id": ctx.ID,
4749
"error": map[string]string{
@@ -57,7 +59,7 @@ func (ctx *MethodContext) SendUpdated() error {
5759
}
5860

5961
ctx.Updated = true
60-
return ctx.Res.WriteJSON(map[string]interface{}{
62+
return websocket.JSON.Send(ctx.Conn, map[string]interface{}{
6163
"msg": "updated",
6264
"methods": []string{ctx.ID},
6365
})

server/server.go

Lines changed: 22 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,45 @@
11
package server
22

33
import (
4-
"encoding/json"
54
"errors"
65
"fmt"
6+
"io"
77
"net/http"
88

9-
"github.com/gorilla/websocket"
109
"github.com/meteorhacks/goddp/utils/random"
10+
"golang.org/x/net/websocket"
1111
)
1212

1313
func New() Server {
1414
s := Server{}
15+
s.wsserver = websocket.Server{Handler: s.wsHandler, Handshake: handshake}
1516
s.methods = make(map[string]MethodFn)
16-
s.upgrader = websocket.Upgrader{
17-
ReadBufferSize: 1024,
18-
WriteBufferSize: 1024,
19-
CheckOrigin: checkOrigin,
20-
}
21-
2217
return s
2318
}
2419

2520
type Server struct {
2621
methods map[string]MethodFn
27-
upgrader websocket.Upgrader
22+
wsserver websocket.Server
2823
}
2924

3025
func (s *Server) Listen(addr string) error {
31-
http.HandleFunc("/websocket", s.Handler)
32-
http.HandleFunc("/sockjs/websocket", s.Handler)
26+
http.Handle("/websocket", s.wsserver)
27+
http.Handle("/sockjs/websocket", s.wsserver)
3328
return http.ListenAndServe(addr, nil)
3429
}
3530

3631
func (s *Server) Method(name string, fn MethodFn) {
3732
s.methods[name] = fn
3833
}
3934

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-
}
46-
35+
func (s *Server) wsHandler(ws *websocket.Conn) {
4736
for {
48-
msg, err := readMessage(ws)
37+
var msg Message
38+
if err := websocket.JSON.Receive(ws, &msg); err != nil {
39+
if err != io.EOF {
40+
fmt.Println("Read Error: ", err)
41+
}
4942

50-
if err != nil {
5143
break
5244
}
5345

@@ -59,6 +51,7 @@ func (s *Server) Handler(w http.ResponseWriter, r *http.Request) {
5951
case "method":
6052
handleMethod(s, ws, msg)
6153
default:
54+
fmt.Println("Error: unknown message type", msg)
6255
// TODO => send "error" ddp message
6356
break
6457
}
@@ -67,52 +60,33 @@ func (s *Server) Handler(w http.ResponseWriter, r *http.Request) {
6760
ws.Close()
6861
}
6962

70-
func checkOrigin(r *http.Request) bool {
71-
return true
72-
}
73-
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
63+
func handshake(config *websocket.Config, req *http.Request) error {
64+
// accept all connections
65+
return nil
9266
}
9367

94-
func handleConnect(s *Server, res Response, m Message) error {
95-
return res.WriteJSON(map[string]string{
68+
func handleConnect(s *Server, ws *websocket.Conn, m Message) error {
69+
return websocket.JSON.Send(ws, map[string]string{
9670
"msg": "connected",
9771
"session": random.Id(17),
9872
})
9973
}
10074

101-
func handleMethod(s *Server, res Response, m Message) error {
75+
func handleMethod(s *Server, ws *websocket.Conn, m Message) error {
10276
fn, ok := s.methods[m.Method]
10377

10478
if !ok {
10579
err := errors.New(fmt.Sprintf("method %s not found", m.Method))
10680
return err
10781
}
10882

109-
ctx := NewMethodContext(m, res)
83+
ctx := NewMethodContext(m, ws)
11084
go fn(ctx)
11185

11286
return nil
11387
}
11488

115-
func handlePing(s *Server, res Response, m Message) error {
89+
func handlePing(s *Server, ws *websocket.Conn, m Message) error {
11690
msg := map[string]string{
11791
"msg": "pong",
11892
}
@@ -121,5 +95,5 @@ func handlePing(s *Server, res Response, m Message) error {
12195
msg["id"] = m.ID
12296
}
12397

124-
return res.WriteJSON(msg)
98+
return websocket.JSON.Send(ws, msg)
12599
}

0 commit comments

Comments
 (0)