socket.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package socketio
  2. import (
  3. "net/http"
  4. "sync"
  5. "github.com/googollee/go-engine.io"
  6. )
  7. // Socket is the socket object of socket.io.
  8. type Socket interface {
  9. // Id returns the session id of socket.
  10. Id() string
  11. // Rooms returns the rooms name joined now.
  12. Rooms() []string
  13. // Request returns the first http request when established connection.
  14. Request() *http.Request
  15. // On registers the function f to handle an event.
  16. On(event string, f interface{}) error
  17. // Emit emits an event with given args.
  18. Emit(event string, args ...interface{}) error
  19. // Join joins the room.
  20. Join(room string) error
  21. // Leave leaves the room.
  22. Leave(room string) error
  23. // Disconnect disconnect the socket.
  24. Disconnect()
  25. // BroadcastTo broadcasts an event to the room with given args.
  26. BroadcastTo(room, event string, args ...interface{}) error
  27. }
  28. type socket struct {
  29. *socketHandler
  30. conn engineio.Conn
  31. namespace string
  32. id int
  33. mu sync.Mutex
  34. }
  35. func newSocket(conn engineio.Conn, base *baseHandler) *socket {
  36. ret := &socket{
  37. conn: conn,
  38. }
  39. ret.socketHandler = newSocketHandler(ret, base)
  40. return ret
  41. }
  42. func (s *socket) Id() string {
  43. return s.conn.Id()
  44. }
  45. func (s *socket) Request() *http.Request {
  46. return s.conn.Request()
  47. }
  48. func (s *socket) Emit(event string, args ...interface{}) error {
  49. if err := s.socketHandler.Emit(event, args...); err != nil {
  50. return err
  51. }
  52. if event == "disconnect" {
  53. s.conn.Close()
  54. }
  55. return nil
  56. }
  57. func (s *socket) Disconnect() {
  58. s.conn.Close()
  59. }
  60. func (s *socket) send(args []interface{}) error {
  61. packet := packet{
  62. Type: _EVENT,
  63. Id: -1,
  64. NSP: s.namespace,
  65. Data: args,
  66. }
  67. encoder := newEncoder(s.conn)
  68. return encoder.Encode(packet)
  69. }
  70. func (s *socket) sendConnect() error {
  71. packet := packet{
  72. Type: _CONNECT,
  73. Id: -1,
  74. NSP: s.namespace,
  75. }
  76. encoder := newEncoder(s.conn)
  77. return encoder.Encode(packet)
  78. }
  79. func (s *socket) sendId(args []interface{}) (int, error) {
  80. s.mu.Lock()
  81. packet := packet{
  82. Type: _EVENT,
  83. Id: s.id,
  84. NSP: s.namespace,
  85. Data: args,
  86. }
  87. s.id++
  88. if s.id < 0 {
  89. s.id = 0
  90. }
  91. s.mu.Unlock()
  92. encoder := newEncoder(s.conn)
  93. err := encoder.Encode(packet)
  94. if err != nil {
  95. return -1, nil
  96. }
  97. return packet.Id, nil
  98. }
  99. func (s *socket) loop() error {
  100. defer func() {
  101. s.LeaveAll()
  102. p := packet{
  103. Type: _DISCONNECT,
  104. Id: -1,
  105. }
  106. s.socketHandler.onPacket(nil, &p)
  107. }()
  108. p := packet{
  109. Type: _CONNECT,
  110. Id: -1,
  111. }
  112. encoder := newEncoder(s.conn)
  113. if err := encoder.Encode(p); err != nil {
  114. return err
  115. }
  116. s.socketHandler.onPacket(nil, &p)
  117. for {
  118. decoder := newDecoder(s.conn)
  119. var p packet
  120. if err := decoder.Decode(&p); err != nil {
  121. return err
  122. }
  123. ret, err := s.socketHandler.onPacket(decoder, &p)
  124. if err != nil {
  125. return err
  126. }
  127. switch p.Type {
  128. case _CONNECT:
  129. s.namespace = p.NSP
  130. s.sendConnect()
  131. case _BINARY_EVENT:
  132. fallthrough
  133. case _EVENT:
  134. if p.Id >= 0 {
  135. p := packet{
  136. Type: _ACK,
  137. Id: p.Id,
  138. NSP: s.namespace,
  139. Data: ret,
  140. }
  141. encoder := newEncoder(s.conn)
  142. if err := encoder.Encode(p); err != nil {
  143. return err
  144. }
  145. }
  146. case _DISCONNECT:
  147. return nil
  148. }
  149. }
  150. }