diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f6de5f0 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +indent_style = tab +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true \ No newline at end of file diff --git a/send.go b/send.go index 07e8130..ae32716 100644 --- a/send.go +++ b/send.go @@ -51,12 +51,21 @@ 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 { - msg := &protocol.Message{ - Type: protocol.MessageTypeEmit, - Method: method, - } + switch args.(type) { + case []byte: + if err := c.conn.WriteBinaryMessage(method, args.([]byte)); err != nil { + return err + } + + return nil + default: + msg := &protocol.Message{ + Type: protocol.MessageTypeEmit, + Method: method, + } - return send(msg, c, args) + return send(msg, c, args) + } } /** diff --git a/transport/transport.go b/transport/transport.go index d64dbf0..17ef0b5 100644 --- a/transport/transport.go +++ b/transport/transport.go @@ -19,6 +19,11 @@ type Connection interface { */ WriteMessage(message string) error + /** + Send binary message with event, block until sent + */ + WriteBinaryMessage(event string, message []byte) error + /** Close current connection */ diff --git a/transport/websocket.go b/transport/websocket.go index 58da673..084a19c 100644 --- a/transport/websocket.go +++ b/transport/websocket.go @@ -5,6 +5,7 @@ import ( "github.com/gorilla/websocket" "io/ioutil" "net/http" + "sync" "time" ) @@ -26,6 +27,8 @@ var ( ErrorHttpUpgradeFailed = errors.New("Http upgrade failed") ) +var socketMu sync.Mutex + type WebsocketConnection struct { socket *websocket.Conn transport *WebsocketTransport @@ -58,6 +61,9 @@ func (wsc *WebsocketConnection) GetMessage() (message string, err error) { } func (wsc *WebsocketConnection) WriteMessage(message string) error { + socketMu.Lock() + defer socketMu.Unlock() + wsc.socket.SetWriteDeadline(time.Now().Add(wsc.transport.SendTimeout)) writer, err := wsc.socket.NextWriter(websocket.TextMessage) if err != nil { @@ -73,6 +79,25 @@ func (wsc *WebsocketConnection) WriteMessage(message string) error { return nil } +func (wsc *WebsocketConnection) WriteBinaryMessage(event string, message []byte) error { + socketMu.Lock() + defer socketMu.Unlock() + + wsc.socket.SetWriteDeadline(time.Now().Add(wsc.transport.SendTimeout)) + + if err := wsc.socket.WriteMessage(websocket.TextMessage, []byte(`451-["` + event + `",{"_placeholder":true,"num":0}]`)); err != nil { + return err + } + + newMessage := []byte{4} + newMessage = append(newMessage, message...) + if err := wsc.socket.WriteMessage(websocket.BinaryMessage, newMessage); err != nil { + return err + } + + return nil +} + func (wsc *WebsocketConnection) Close() { wsc.socket.Close() }