You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

message.go 3.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package mq
  2. import (
  3. "bytes"
  4. "fmt"
  5. "reflect"
  6. "unsafe"
  7. "github.com/google/uuid"
  8. jsoniter "github.com/json-iterator/go"
  9. myreflect "gitlink.org.cn/cloudream/common/utils/reflect"
  10. "gitlink.org.cn/cloudream/common/utils/serder"
  11. )
  12. type Message struct {
  13. Headers map[string]string `json:"headers"`
  14. Body MessageBodyTypes `json:"body"`
  15. }
  16. type MessageBodyTypes interface{}
  17. func (m *Message) GetRequestID() string {
  18. return m.Headers["requestID"]
  19. }
  20. func (m *Message) SetRequestID(id string) {
  21. m.Headers["requestID"] = id
  22. }
  23. func (m *Message) MakeRequestID() string {
  24. id := uuid.NewString()
  25. m.Headers["requestID"] = id
  26. return id
  27. }
  28. func (m *Message) SetCodeMessage(code string, msg string) {
  29. m.Headers["responseCode"] = code
  30. m.Headers["responseMessage"] = msg
  31. }
  32. func (m *Message) GetCodeMessage() (string, string) {
  33. return m.Headers["responseCode"], m.Headers["responseMessage"]
  34. }
  35. func MakeMessage(body MessageBodyTypes) Message {
  36. msg := Message{
  37. Headers: make(map[string]string),
  38. Body: body,
  39. }
  40. return msg
  41. }
  42. type typeSet struct {
  43. TopType myreflect.Type
  44. ElementTypes serder.TypeNameResolver
  45. }
  46. var typeSets map[myreflect.Type]typeSet = make(map[reflect.Type]typeSet)
  47. var messageTypeSet *typeSet
  48. // 所有新定义的Message都需要在init中调用此函数
  49. func RegisterMessage[T any]() {
  50. messageTypeSet.ElementTypes.Register(myreflect.TypeOf[T]())
  51. }
  52. // 如果对一个类型T调用了此函数,那么在序列化结构体中包含的T类型字段时,
  53. // 会将字段值的实际类型保存在序列化后的结果中(作为一个字段@type),
  54. // 在反序列化时,会根据类型信息重建原本的字段值。
  55. //
  56. // 只会处理types指定的类型。
  57. func RegisterTypeSet[T any](types ...myreflect.Type) *typeSet {
  58. set := typeSet{
  59. TopType: myreflect.TypeOf[T](),
  60. ElementTypes: serder.NewTypeNameResolver(true),
  61. }
  62. for _, t := range types {
  63. set.ElementTypes.Register(t)
  64. }
  65. typeSets[set.TopType] = set
  66. jsoniter.RegisterTypeEncoderFunc(myreflect.TypeOf[T]().String(),
  67. func(ptr unsafe.Pointer, stream *jsoniter.Stream) {
  68. val := *((*T)(ptr))
  69. var ifVal any = val
  70. if ifVal != nil {
  71. stream.WriteArrayStart()
  72. typeStr, err := set.ElementTypes.TypeToString(myreflect.TypeOfValue(val))
  73. if err != nil {
  74. stream.Error = err
  75. return
  76. }
  77. stream.WriteString(typeStr)
  78. stream.WriteRaw(",")
  79. stream.WriteVal(val)
  80. stream.WriteArrayEnd()
  81. } else {
  82. stream.WriteNil()
  83. }
  84. },
  85. func(p unsafe.Pointer) bool {
  86. return false
  87. })
  88. jsoniter.RegisterTypeDecoderFunc(myreflect.TypeOf[T]().String(),
  89. func(ptr unsafe.Pointer, iter *jsoniter.Iterator) {
  90. vp := (*T)(ptr)
  91. nextTkType := iter.WhatIsNext()
  92. if nextTkType == jsoniter.NilValue {
  93. iter.ReadNil()
  94. var zero T
  95. *vp = zero
  96. } else if nextTkType == jsoniter.ArrayValue {
  97. iter.ReadArray()
  98. typeStr := iter.ReadString()
  99. iter.ReadArray()
  100. typ, err := set.ElementTypes.StringToType(typeStr)
  101. if err != nil {
  102. iter.ReportError("get type from string", err.Error())
  103. return
  104. }
  105. val := reflect.New(typ)
  106. iter.ReadVal(val.Interface())
  107. *vp = val.Elem().Interface().(T)
  108. iter.ReadArray()
  109. } else {
  110. iter.ReportError("parse TypeSet field", fmt.Sprintf("unknow next token type %v", nextTkType))
  111. return
  112. }
  113. })
  114. return &set
  115. }
  116. func Serialize(msg Message) ([]byte, error) {
  117. buf := bytes.NewBuffer(nil)
  118. enc := jsoniter.NewEncoder(buf)
  119. err := enc.Encode(msg)
  120. if err != nil {
  121. return nil, err
  122. }
  123. return buf.Bytes(), nil
  124. }
  125. func Deserialize(data []byte) (*Message, error) {
  126. dec := jsoniter.NewDecoder(bytes.NewBuffer(data))
  127. var msg Message
  128. err := dec.Decode(&msg)
  129. if err != nil {
  130. return nil, err
  131. }
  132. return &msg, nil
  133. }
  134. func init() {
  135. messageTypeSet = RegisterTypeSet[MessageBodyTypes]()
  136. }

公共库