retrieve all sessions
This commit is contained in:
@@ -78,3 +78,14 @@ func (h *hub) len() int {
|
||||
|
||||
return len(h.sessions)
|
||||
}
|
||||
|
||||
func (h *hub) all() []*Session {
|
||||
h.rwmutex.RLock()
|
||||
defer h.rwmutex.RUnlock()
|
||||
|
||||
s := make([]*Session, 0, len(h.sessions))
|
||||
for k := range h.sessions {
|
||||
s = append(s, k)
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
@@ -274,6 +274,14 @@ func (m *Melody) BroadcastBinaryOthers(msg []byte, s *Session) error {
|
||||
})
|
||||
}
|
||||
|
||||
// Sessions returns all sessions. An error is returned if the melody session is closed.
|
||||
func (m *Melody) Sessions() ([]*Session, error) {
|
||||
if m.hub.closed() {
|
||||
return nil, errors.New("melody instance is closed")
|
||||
}
|
||||
return m.hub.all(), nil
|
||||
}
|
||||
|
||||
// Close closes the melody instance and all connected sessions.
|
||||
func (m *Melody) Close() error {
|
||||
if m.hub.closed() {
|
||||
|
||||
@@ -163,6 +163,56 @@ func TestLen(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetSessions(t *testing.T) {
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
|
||||
connect := int(rand.Int31n(100))
|
||||
disconnect := rand.Float32()
|
||||
conns := make([]*websocket.Conn, connect)
|
||||
defer func() {
|
||||
for _, conn := range conns {
|
||||
if conn != nil {
|
||||
conn.Close()
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
echo := NewTestServerHandler(func(session *Session, msg []byte) {})
|
||||
server := httptest.NewServer(echo)
|
||||
defer server.Close()
|
||||
|
||||
disconnected := 0
|
||||
for i := 0; i < connect; i++ {
|
||||
conn, err := NewDialer(server.URL)
|
||||
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if rand.Float32() < disconnect {
|
||||
conns[i] = nil
|
||||
disconnected++
|
||||
conn.Close()
|
||||
continue
|
||||
}
|
||||
|
||||
conns[i] = conn
|
||||
}
|
||||
|
||||
time.Sleep(time.Millisecond)
|
||||
|
||||
connected := connect - disconnected
|
||||
|
||||
allsess, err := echo.m.Sessions()
|
||||
if err != nil {
|
||||
t.Fatalf("error retrieving sessions: %v", err.Error())
|
||||
}
|
||||
|
||||
if len(allsess) != connected {
|
||||
t.Errorf("melody sessions %d should equal %d", len(allsess), connected)
|
||||
}
|
||||
}
|
||||
|
||||
func TestEchoBinary(t *testing.T) {
|
||||
echo := NewTestServer()
|
||||
echo.m.HandleMessageBinary(func(session *Session, msg []byte) {
|
||||
|
||||
Reference in New Issue
Block a user