rabbit.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package main
  2. import (
  3. "encoding/json"
  4. "git.wanbits.io/joe/franklin/comp"
  5. "git.wanbits.io/joe/kettle/log"
  6. "git.wanbits.io/joe/kettle/utl"
  7. "git.wanbits.io/joe/nnet"
  8. "go.uber.org/zap"
  9. )
  10. type WsRespPacket struct {
  11. Cmd string
  12. Ec int
  13. Result map[string]interface{}
  14. }
  15. func (self *WsRespPacket) ShouldClose() (bool, int32) {
  16. return false, 0
  17. }
  18. type WsReqPacket struct {
  19. Cmd string
  20. Params map[string]interface{}
  21. }
  22. func (self *WsReqPacket) ShouldClose() (bool, int32) {
  23. return false, 0
  24. }
  25. type RabbitCProtocol struct{}
  26. func (self *RabbitCProtocol) ReadPacket(conn nnet.IConn) (nnet.IPacket, error) {
  27. buf := comp.GBufPool.Get()
  28. defer comp.GBufPool.Put(buf)
  29. n, err := conn.Read(buf)
  30. if err != nil {
  31. return nil, err
  32. }
  33. p := &WsRespPacket{}
  34. err = json.Unmarshal(buf[:n], p)
  35. if err != nil {
  36. return nil, err
  37. }
  38. return p, nil
  39. }
  40. func (self *RabbitCProtocol) Serialize(packet nnet.IPacket) ([]byte, error) {
  41. p, ok := packet.(*WsReqPacket)
  42. if !ok {
  43. return nil, utl.ErrInterfaceTransform
  44. }
  45. data, err := json.Marshal(p)
  46. if err != nil {
  47. return nil, err
  48. }
  49. return data, nil
  50. }
  51. func (self *RabbitCProtocol) OnClosed(ses nnet.ISession, reason int32) {
  52. }
  53. func (self *RabbitCProtocol) OnConnected(ses nnet.ISession) (bool, int32) {
  54. return true, 0
  55. }
  56. func (self *RabbitCProtocol) OnMessage(ses nnet.ISession, pkt nnet.IPacket) bool {
  57. p, ok := pkt.(*WsRespPacket)
  58. if !ok {
  59. log.Error("not a WsPacket")
  60. return false
  61. }
  62. // dispatch
  63. cb, ok := rabbit_route_table[p.Cmd]
  64. if !ok {
  65. log.Error("not supported cmd", zap.String("cmd", p.Cmd))
  66. return false
  67. }
  68. cb(ses, p)
  69. return true
  70. }
  71. // server-side dont handle heartbeat.
  72. func (self *RabbitCProtocol) OnHeartbeat(ses nnet.ISession) bool {
  73. return true
  74. }