forked from googollee/go-socket.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
broadcast_local.go
107 lines (92 loc) · 2.2 KB
/
broadcast_local.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package socketio
func newBroadcastLocal(nsp string) *broadcastLocal {
uid := newV4UUID()
return &broadcastLocal{
nsp: nsp,
uid: uid,
roomsSync: newRoomMap(),
}
}
type broadcastLocal struct {
nsp string
uid string
roomsSync *roomMap
}
func (bc *broadcastLocal) forEach(room string, f EachFunc) {
occupants, ok := bc.getOccupants(room)
if !ok {
return
}
occupants.forEach(func(_ string, conn Conn) bool {
f(conn)
return true
})
}
// getOccupants return all occupants of a room
func (bc *broadcastLocal) getOccupants(room string) (*connMap, bool) {
return bc.roomsSync.getConnections(room)
}
func (bc *broadcastLocal) clear(room string) {
bc.roomsSync.delete(room)
}
func (bc *broadcastLocal) join(room string, conn Conn) {
bc.roomsSync.join(room, conn)
}
func (bc *broadcastLocal) leaveAll(conn Conn) {
bc.roomsSync.leaveAll(conn)
}
func (bc *broadcastLocal) leave(room string, conn Conn) {
bc.roomsSync.leave(room, conn)
}
func (bc *broadcastLocal) send(room string, event string, args ...interface{}) {
conns, ok := bc.getOccupants(room)
if !ok {
return
}
conns.forEach(func(_ string, conn Conn) bool {
// TODO: review this concurrent
go conn.Emit(event, args...)
return true
})
}
func (bc *broadcastLocal) sendAll(event string, args ...interface{}) {
bc.roomsSync.forEach(func(_ string, conn *connMap) bool {
conn.forEach(func(_ string, conn Conn) bool {
// TODO: review this concurrent
go conn.Emit(event, args...)
return true
})
return true
})
}
func (bc *broadcastLocal) allRooms() []string {
rooms := make([]string, 0)
bc.roomsSync.forEach(func(room string, _ *connMap) bool {
rooms = append(rooms, room)
return true
})
return rooms
}
func (bc *broadcastLocal) lenRoom(roomID string) int {
var res int
bc.roomsSync.forEach(func(room string, _ *connMap) bool {
if room == roomID {
res++
}
return true
})
return res
}
func (bc *broadcastLocal) getRoomsByConn(connection Conn) []string {
var rooms []string
bc.roomsSync.forEach(func(room string, cm *connMap) bool {
cm.forEach(func(connID string, _ Conn) bool {
if connection.ID() == connID {
rooms = append(rooms, room)
}
return true
})
return true
})
return rooms
}