diff --git a/README.md b/README.md index dde3d87..cecba7a 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Examples directory contains simple client and server. ### Installation - go get github.com/graarh/golang-socketio + go get github.com/moliqingwa/golang-socketio ### Simple server usage @@ -30,7 +30,7 @@ Examples directory contains simple client and server. } //handle custom event - server.On("send", func(c *gosocketio.Channel, msg Message) string { + server.On("send", func(c *gosocketio.Channel, msg string) string { //send event to all in room c.BroadcastTo("chat", "message", msg) return "OK" @@ -77,7 +77,7 @@ var socket = io('ws://yourdomain.com', {transports: ['websocket']}); // --- caller is default handlers //on connection handler, occurs once for each connected client - server.On(gosocketio.OnConnection, func(c *gosocketio.Channel, args interface{}) { + server.On(gosocketio.OnConnection, func(c *gosocketio.Channel, args string) { //client id is unique log.Println("New client connected, client id is ", c.Id()) diff --git a/client.go b/client.go index deded6c..c73c83a 100644 --- a/client.go +++ b/client.go @@ -1,14 +1,14 @@ package gosocketio import ( - "github.com/graarh/golang-socketio/transport" + "github.com/moliqingwa/golang-socketio/transport" "strconv" ) const ( - webSocketProtocol = "ws://" + webSocketProtocol = "ws://" webSocketSecureProtocol = "wss://" - socketioUrl = "/socket.io/?EIO=3&transport=websocket" + socketioUrl = "/socket.io/?EIO=3&transport=websocket" ) /** @@ -21,7 +21,7 @@ type Client struct { /** Get ws/wss url by host and port - */ +*/ func GetUrl(host string, port int, secure bool) string { var prefix string if secure { diff --git a/examples/client.go b/examples/client.go index 6d1063d..c0730ea 100644 --- a/examples/client.go +++ b/examples/client.go @@ -1,8 +1,8 @@ package main import ( - "github.com/graarh/golang-socketio" - "github.com/graarh/golang-socketio/transport" + "github.com/moliqingwa/golang-socketio" + "github.com/moliqingwa/golang-socketio/transport" "log" "runtime" "time" diff --git a/examples/server.go b/examples/server.go index 340949e..5ce695c 100644 --- a/examples/server.go +++ b/examples/server.go @@ -1,8 +1,8 @@ package main import ( - "github.com/graarh/golang-socketio" - "github.com/graarh/golang-socketio/transport" + "github.com/moliqingwa/golang-socketio" + "github.com/moliqingwa/golang-socketio/transport" "log" "net/http" "time" diff --git a/handler.go b/handler.go index 78c3636..7e996af 100644 --- a/handler.go +++ b/handler.go @@ -1,10 +1,10 @@ package gosocketio import ( - "encoding/json" - "github.com/graarh/golang-socketio/protocol" - "sync" + "github.com/moliqingwa/golang-socketio/protocol" + "log" "reflect" + "sync" ) const ( @@ -27,6 +27,8 @@ type methods struct { onConnection systemHandler onDisconnection systemHandler + + serialize Serialize } /** @@ -93,18 +95,19 @@ func (m *methods) processIncomingMessage(c *Channel, msg *protocol.Message) { return } - if !f.ArgsPresent { - f.callFunc(c, &struct{}{}) - return - } + if f.ArgsPresent { + data := f.getArgs() + err := m.serialize.Unmarshal([]byte(msg.Args), &data) + if err != nil { + return + } - data := f.getArgs() - err := json.Unmarshal([]byte(msg.Args), &data) - if err != nil { - return + f.callFunc(c, data) + } else { + f.callFunc(c, &struct{}{}) } - f.callFunc(c, data) + return case protocol.MessageTypeAckRequest: f, ok := m.findMethod(msg.Method) @@ -116,7 +119,7 @@ func (m *methods) processIncomingMessage(c *Channel, msg *protocol.Message) { if f.ArgsPresent { //data type should be defined for unmarshall data := f.getArgs() - err := json.Unmarshal([]byte(msg.Args), &data) + err := m.serialize.Unmarshal([]byte(msg.Args), &data) if err != nil { return } @@ -130,7 +133,17 @@ func (m *methods) processIncomingMessage(c *Channel, msg *protocol.Message) { Type: protocol.MessageTypeAckResponse, AckId: msg.AckId, } - send(ack, c, result[0].Interface()) + + res := result[0].Interface() + if res != nil { + if json, err := m.serialize.Marshal(&res); err == nil { + send(ack, c, string(json)) + } else { + log.Fatalf("marshal failed, raw=%+v, err=%+v\n", res, err) + } + } else { + send(ack, c, "") + } case protocol.MessageTypeAckResponse: waiter, err := c.ack.getWaiter(msg.AckId) diff --git a/loop.go b/loop.go index 5e73c5b..7b3ce21 100644 --- a/loop.go +++ b/loop.go @@ -3,8 +3,8 @@ package gosocketio import ( "encoding/json" "errors" - "github.com/graarh/golang-socketio/protocol" - "github.com/graarh/golang-socketio/transport" + "github.com/moliqingwa/golang-socketio/protocol" + "github.com/moliqingwa/golang-socketio/transport" "net/http" "sync" "time" diff --git a/send.go b/send.go index 07e8130..f997f6c 100644 --- a/send.go +++ b/send.go @@ -1,9 +1,8 @@ package gosocketio import ( - "encoding/json" "errors" - "github.com/graarh/golang-socketio/protocol" + "github.com/moliqingwa/golang-socketio/protocol" "log" "time" ) @@ -16,7 +15,7 @@ var ( /** Send message packet to socket */ -func send(msg *protocol.Message, c *Channel, args interface{}) error { +func send(msg *protocol.Message, c *Channel, args string) error { //preventing json/encoding "index out of range" panic defer func() { if r := recover(); r != nil { @@ -24,13 +23,8 @@ func send(msg *protocol.Message, c *Channel, args interface{}) error { } }() - if args != nil { - json, err := json.Marshal(&args) - if err != nil { - return err - } - - msg.Args = string(json) + if args != "" { + msg.Args = args } command, err := protocol.Encode(msg) @@ -50,7 +44,7 @@ func send(msg *protocol.Message, c *Channel, args interface{}) error { /** Create packet based on given data and send it */ -func (c *Channel) Emit(method string, args interface{}) error { +func (c *Channel) Emit(method string, args string) error { msg := &protocol.Message{ Type: protocol.MessageTypeEmit, Method: method, @@ -62,7 +56,7 @@ func (c *Channel) Emit(method string, args interface{}) error { /** Create ack packet based on given data and send it and receive response */ -func (c *Channel) Ack(method string, args interface{}, timeout time.Duration) (string, error) { +func (c *Channel) Ack(method string, args string, timeout time.Duration) (string, error) { msg := &protocol.Message{ Type: protocol.MessageTypeAckRequest, AckId: c.ack.getNextId(), diff --git a/serialize.go b/serialize.go new file mode 100644 index 0000000..b0f377d --- /dev/null +++ b/serialize.go @@ -0,0 +1,6 @@ +package gosocketio + +type Serialize interface { + Marshal(v interface{}) ([]byte, error) + Unmarshal(data []byte, v interface{}) error +} diff --git a/server.go b/server.go index 7583633..bf92b6c 100644 --- a/server.go +++ b/server.go @@ -7,8 +7,8 @@ import ( "encoding/json" "errors" "fmt" - "github.com/graarh/golang-socketio/protocol" - "github.com/graarh/golang-socketio/transport" + "github.com/moliqingwa/golang-socketio/protocol" + "github.com/moliqingwa/golang-socketio/transport" "math/rand" "net/http" "sync" @@ -43,7 +43,7 @@ type Server struct { /** Close current channel - */ +*/ func (c *Channel) Close() { if c.server != nil { closeChannel(c, &c.server.methods) @@ -193,7 +193,7 @@ func (s *Server) List(room string) []*Channel { } -func (c *Channel) BroadcastTo(room, method string, args interface{}) { +func (c *Channel) BroadcastTo(room, method string, args string) { if c.server == nil { return } @@ -203,7 +203,7 @@ func (c *Channel) BroadcastTo(room, method string, args interface{}) { /** Broadcast message to all room channels */ -func (s *Server) BroadcastTo(room, method string, args interface{}) { +func (s *Server) BroadcastTo(room, method string, args string) { s.channelsLock.RLock() defer s.channelsLock.RUnlock() @@ -222,7 +222,7 @@ func (s *Server) BroadcastTo(room, method string, args interface{}) { /** Broadcast to all clients */ -func (s *Server) BroadcastToAll(method string, args interface{}) { +func (s *Server) BroadcastToAll(method string, args string) { s.sidsLock.RLock() defer s.sidsLock.RUnlock()