adapter.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package socketio
  2. import "sync"
  3. // BroadcastAdaptor is the adaptor to handle broadcasts.
  4. type BroadcastAdaptor interface {
  5. // Join causes the socket to join a room.
  6. Join(room string, socket Socket) error
  7. // Leave causes the socket to leave a room.
  8. Leave(room string, socket Socket) error
  9. // Send will send an event with args to the room. If "ignore" is not nil, the event will be excluded from being sent to "ignore".
  10. Send(ignore Socket, room, event string, args ...interface{}) error
  11. //Len socket in room
  12. Len(room string) int
  13. }
  14. var newBroadcast = newBroadcastDefault
  15. type broadcast struct {
  16. m map[string]map[string]Socket
  17. sync.RWMutex
  18. }
  19. func newBroadcastDefault() BroadcastAdaptor {
  20. return &broadcast{
  21. m: make(map[string]map[string]Socket),
  22. }
  23. }
  24. func (b *broadcast) Join(room string, socket Socket) error {
  25. b.Lock()
  26. sockets, ok := b.m[room]
  27. if !ok {
  28. sockets = make(map[string]Socket)
  29. }
  30. sockets[socket.Id()] = socket
  31. b.m[room] = sockets
  32. b.Unlock()
  33. return nil
  34. }
  35. func (b *broadcast) Leave(room string, socket Socket) error {
  36. b.Lock()
  37. defer b.Unlock()
  38. sockets, ok := b.m[room]
  39. if !ok {
  40. return nil
  41. }
  42. delete(sockets, socket.Id())
  43. if len(sockets) == 0 {
  44. delete(b.m, room)
  45. return nil
  46. }
  47. b.m[room] = sockets
  48. return nil
  49. }
  50. func (b *broadcast) Send(ignore Socket, room, event string, args ...interface{}) error {
  51. b.RLock()
  52. sockets := b.m[room]
  53. for id, s := range sockets {
  54. if ignore != nil && ignore.Id() == id {
  55. continue
  56. }
  57. s.Emit(event, args...)
  58. }
  59. b.RUnlock()
  60. return nil
  61. }
  62. func (b *broadcast) Len(room string) int {
  63. b.RLock()
  64. defer b.RUnlock()
  65. return len(b.m[room])
  66. }