Add broadcast methods for a binary message
This commit is contained in:
@@ -100,25 +100,44 @@ func (m *Melody) HandleRequest(w http.ResponseWriter, r *http.Request) {
|
|||||||
go m.disconnectHandler(session)
|
go m.disconnectHandler(session)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Broadcasts a message to all sessions.
|
// Broadcasts a text message to all sessions.
|
||||||
func (m *Melody) Broadcast(msg []byte) {
|
func (m *Melody) Broadcast(msg []byte) {
|
||||||
message := &envelope{t: websocket.TextMessage, msg: msg}
|
message := &envelope{t: websocket.TextMessage, msg: msg}
|
||||||
m.hub.broadcast <- message
|
m.hub.broadcast <- message
|
||||||
}
|
}
|
||||||
|
|
||||||
// Broadcasts a message to all sessions that fn returns true for.
|
// Broadcasts a text message to all sessions that fn returns true for.
|
||||||
func (m *Melody) BroadcastFilter(msg []byte, fn func(*Session) bool) {
|
func (m *Melody) BroadcastFilter(msg []byte, fn func(*Session) bool) {
|
||||||
message := &envelope{t: websocket.TextMessage, msg: msg, filter: fn}
|
message := &envelope{t: websocket.TextMessage, msg: msg, filter: fn}
|
||||||
m.hub.broadcast <- message
|
m.hub.broadcast <- message
|
||||||
}
|
}
|
||||||
|
|
||||||
// Broadcasts a message to all sessions except session s.
|
// Broadcasts a text message to all sessions except session s.
|
||||||
func (m *Melody) BroadcastOthers(msg []byte, s *Session) {
|
func (m *Melody) BroadcastOthers(msg []byte, s *Session) {
|
||||||
m.BroadcastFilter(msg, func(q *Session) bool {
|
m.BroadcastFilter(msg, func(q *Session) bool {
|
||||||
return s != q
|
return s != q
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Broadcasts a binary message to all sessions.
|
||||||
|
func (m *Melody) BroadcastBinary(msg []byte) {
|
||||||
|
message := &envelope{t: websocket.BinaryMessage, msg: msg}
|
||||||
|
m.hub.broadcast <- message
|
||||||
|
}
|
||||||
|
|
||||||
|
// Broadcasts a binary message to all sessions that fn returns true for.
|
||||||
|
func (m *Melody) BroadcastBinaryFilter(msg []byte, fn func(*Session) bool) {
|
||||||
|
message := &envelope{t: websocket.BinaryMessage, msg: msg, filter: fn}
|
||||||
|
m.hub.broadcast <- message
|
||||||
|
}
|
||||||
|
|
||||||
|
// Broadcasts a binary message to all sessions except session s.
|
||||||
|
func (m *Melody) BroadcastBinaryOthers(msg []byte, s *Session) {
|
||||||
|
m.BroadcastBinaryFilter(msg, func(q *Session) bool {
|
||||||
|
return s != q
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// Closes the melody instance and all connected sessions.
|
// Closes the melody instance and all connected sessions.
|
||||||
func (m *Melody) Close() {
|
func (m *Melody) Close() {
|
||||||
m.hub.exit <- true
|
m.hub.exit <- true
|
||||||
|
|||||||
+149
@@ -1,6 +1,7 @@
|
|||||||
package melody
|
package melody
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
@@ -212,6 +213,56 @@ func TestBroadcast(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBroadcastBinary(t *testing.T) {
|
||||||
|
broadcast := NewTestServer()
|
||||||
|
broadcast.m.HandleMessageBinary(func(session *Session, msg []byte) {
|
||||||
|
broadcast.m.BroadcastBinary(msg)
|
||||||
|
})
|
||||||
|
server := httptest.NewServer(broadcast)
|
||||||
|
defer server.Close()
|
||||||
|
|
||||||
|
n := 10
|
||||||
|
|
||||||
|
fn := func(msg []byte) bool {
|
||||||
|
conn, _ := NewDialer(server.URL)
|
||||||
|
defer conn.Close()
|
||||||
|
|
||||||
|
listeners := make([]*websocket.Conn, n)
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
listener, _ := NewDialer(server.URL)
|
||||||
|
listeners[i] = listener
|
||||||
|
defer listeners[i].Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
conn.WriteMessage(websocket.BinaryMessage, []byte(msg))
|
||||||
|
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
messageType, ret, err := listeners[i].ReadMessage()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if messageType != websocket.BinaryMessage {
|
||||||
|
t.Errorf("message type should be BinaryMessage")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if !bytes.Equal(msg, ret) {
|
||||||
|
t.Errorf("%v should equal %v", msg, ret)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if !fn([]byte{2, 3, 5, 7, 11}) {
|
||||||
|
t.Errorf("should not be false")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestBroadcastOthers(t *testing.T) {
|
func TestBroadcastOthers(t *testing.T) {
|
||||||
broadcast := NewTestServer()
|
broadcast := NewTestServer()
|
||||||
broadcast.m.HandleMessage(func(session *Session, msg []byte) {
|
broadcast.m.HandleMessage(func(session *Session, msg []byte) {
|
||||||
@@ -259,6 +310,58 @@ func TestBroadcastOthers(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBroadcastBinaryOthers(t *testing.T) {
|
||||||
|
broadcast := NewTestServer()
|
||||||
|
broadcast.m.HandleMessageBinary(func(session *Session, msg []byte) {
|
||||||
|
broadcast.m.BroadcastBinaryOthers(msg, session)
|
||||||
|
})
|
||||||
|
broadcast.m.Config.PongWait = time.Second
|
||||||
|
broadcast.m.Config.PingPeriod = time.Second * 9 / 10
|
||||||
|
server := httptest.NewServer(broadcast)
|
||||||
|
defer server.Close()
|
||||||
|
|
||||||
|
n := 10
|
||||||
|
|
||||||
|
fn := func(msg []byte) bool {
|
||||||
|
conn, _ := NewDialer(server.URL)
|
||||||
|
defer conn.Close()
|
||||||
|
|
||||||
|
listeners := make([]*websocket.Conn, n)
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
listener, _ := NewDialer(server.URL)
|
||||||
|
listeners[i] = listener
|
||||||
|
defer listeners[i].Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
conn.WriteMessage(websocket.BinaryMessage, []byte(msg))
|
||||||
|
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
messageType, ret, err := listeners[i].ReadMessage()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if messageType != websocket.BinaryMessage {
|
||||||
|
t.Errorf("message type should be BinaryMessage")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if !bytes.Equal(msg, ret) {
|
||||||
|
t.Errorf("%v should equal %v", msg, ret)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if !fn([]byte{2, 3, 5, 7, 11}) {
|
||||||
|
t.Errorf("should not be false")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestPingPong(t *testing.T) {
|
func TestPingPong(t *testing.T) {
|
||||||
noecho := NewTestServer()
|
noecho := NewTestServer()
|
||||||
noecho.m.Config.PongWait = time.Second
|
noecho.m.Config.PongWait = time.Second
|
||||||
@@ -326,6 +429,52 @@ func TestBroadcastFilter(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBroadcastBinaryFilter(t *testing.T) {
|
||||||
|
broadcast := NewTestServer()
|
||||||
|
broadcast.m.HandleMessageBinary(func(session *Session, msg []byte) {
|
||||||
|
broadcast.m.BroadcastBinaryFilter(msg, func(q *Session) bool {
|
||||||
|
return session == q
|
||||||
|
})
|
||||||
|
})
|
||||||
|
server := httptest.NewServer(broadcast)
|
||||||
|
defer server.Close()
|
||||||
|
|
||||||
|
fn := func(msg []byte) bool {
|
||||||
|
conn, err := NewDialer(server.URL)
|
||||||
|
defer conn.Close()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
conn.WriteMessage(websocket.BinaryMessage, []byte(msg))
|
||||||
|
|
||||||
|
messageType, ret, err := conn.ReadMessage()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if messageType != websocket.BinaryMessage {
|
||||||
|
t.Errorf("message type should be BinaryMessage")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if !bytes.Equal(msg, ret) {
|
||||||
|
t.Errorf("%v should equal %v", msg, ret)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if !fn([]byte{2, 3, 5, 7, 11}) {
|
||||||
|
t.Errorf("should not be false")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestStop(t *testing.T) {
|
func TestStop(t *testing.T) {
|
||||||
noecho := NewTestServer()
|
noecho := NewTestServer()
|
||||||
server := httptest.NewServer(noecho)
|
server := httptest.NewServer(noecho)
|
||||||
|
|||||||
Reference in New Issue
Block a user