messaging.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package ax
  2. import (
  3. "encoding/json"
  4. "log"
  5. "sync"
  6. )
  7. type jsonClientMessage struct {
  8. MsgType string `json:"type"`
  9. Data interface{} `json:"data"`
  10. }
  11. type JsonMessageHandler func (c *Client,
  12. msgtype string, data interface{})
  13. type RawMessageHandler func (c *Client, data []byte) bool
  14. var (
  15. msgMap = make(map[string]JsonMessageHandler)
  16. msgMutex sync.RWMutex
  17. rawHandler RawMessageHandler
  18. )
  19. func JsonSend(c *Client, msgtype string, arg interface{}) error {
  20. msg := &jsonClientMessage {
  21. MsgType: msgtype,
  22. Data: arg,
  23. }
  24. data, err := json.Marshal(msg)
  25. if err != nil {
  26. log.Printf("messaging.Send error %+v", err)
  27. return err
  28. }
  29. c.Send(data)
  30. return nil
  31. }
  32. func JsonInvalidMessage(c *Client, m interface{}) {
  33. log.Printf("Recv invalid JSON message (%+v, %+v)\n", c, m)
  34. }
  35. func JsonHandleMessage(c *Client, msgtype string, data interface{}) bool {
  36. msgMutex.RLock()
  37. handler, exists := msgMap[msgtype]
  38. if !exists {
  39. msgMutex.RUnlock()
  40. return false
  41. }
  42. handler(c, msgtype, data)
  43. msgMutex.RUnlock()
  44. return true
  45. }
  46. func JsonParse(c *Client, m interface{}) {
  47. var msgtype string
  48. var data interface{}
  49. var ok bool
  50. switch v := m.(type) {
  51. case map[string]interface{}:
  52. msgtype, ok = v["type"].(string)
  53. if !ok {
  54. JsonInvalidMessage(c, m)
  55. }
  56. data, ok = v["data"]
  57. if !ok {
  58. JsonInvalidMessage(c, m)
  59. }
  60. JsonHandleMessage(c, msgtype, data)
  61. default:
  62. JsonInvalidMessage(c, m)
  63. }
  64. }
  65. func jsonRecv(c *Client, data []byte) bool {
  66. var m interface{}
  67. err := json.Unmarshal(data, &m)
  68. if err != nil {
  69. return false
  70. }
  71. JsonParse(c, m)
  72. return true
  73. }
  74. func rawRecv(c *Client, data []byte) bool {
  75. r := false
  76. msgMutex.RLock()
  77. if rawHandler != nil {
  78. r = rawHandler(c, data)
  79. }
  80. msgMutex.RUnlock()
  81. return r
  82. }
  83. // Entrypoint for incoming messages
  84. func onRecv(c *Client, data []byte) {
  85. r := rawRecv(c, data)
  86. if !r {
  87. jsonRecv(c, data)
  88. }
  89. }
  90. func OnJson(msgtype string, handler JsonMessageHandler) {
  91. msgMutex.Lock()
  92. msgMap[msgtype] = handler
  93. msgMutex.Unlock()
  94. }
  95. func OnRaw(handler RawMessageHandler) {
  96. msgMutex.Lock()
  97. rawHandler = handler
  98. msgMutex.Unlock()
  99. }