any2.go 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. package v2jsonpb
  2. import (
  3. "github.com/golang/protobuf/jsonpb"
  4. "github.com/v2fly/v2ray-core/v4/common/serial"
  5. "google.golang.org/protobuf/proto"
  6. "google.golang.org/protobuf/reflect/protoreflect"
  7. "google.golang.org/protobuf/types/dynamicpb"
  8. "google.golang.org/protobuf/types/known/anypb"
  9. )
  10. type resolver2 struct {
  11. backgroundResolver jsonpb.AnyResolver
  12. }
  13. func (r resolver2) FindMessageByName(message protoreflect.FullName) (protoreflect.MessageType, error) {
  14. panic("implement me")
  15. }
  16. func (r resolver2) FindMessageByURL(url string) (protoreflect.MessageType, error) {
  17. msg, err := r.backgroundResolver.Resolve(url)
  18. if err != nil {
  19. return nil, err
  20. }
  21. return msg.(proto.Message).ProtoReflect().Type(), nil
  22. }
  23. func (r resolver2) FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) {
  24. panic("implement me")
  25. }
  26. func (r resolver2) FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) {
  27. panic("implement me")
  28. }
  29. type V2JsonProtobufAnyTypeDescriptor struct {
  30. protoreflect.MessageDescriptor
  31. }
  32. func (v V2JsonProtobufAnyTypeDescriptor) FullName() protoreflect.FullName {
  33. return "org.v2fly.SynAny"
  34. }
  35. func (v V2JsonProtobufAnyTypeDescriptor) Fields() protoreflect.FieldDescriptors {
  36. panic("implement me")
  37. }
  38. type V2JsonProtobufAnyType struct {
  39. originalType protoreflect.MessageType
  40. syntheticDescriptor V2JsonProtobufAnyTypeDescriptor
  41. }
  42. func (v V2JsonProtobufAnyType) New() protoreflect.Message {
  43. return dynamicpb.NewMessage(v.syntheticDescriptor)
  44. }
  45. func (v V2JsonProtobufAnyType) Zero() protoreflect.Message {
  46. return dynamicpb.NewMessage(v.syntheticDescriptor)
  47. }
  48. func (v V2JsonProtobufAnyType) Descriptor() protoreflect.MessageDescriptor {
  49. return v.syntheticDescriptor
  50. }
  51. type V2JsonProtobufFollowerFieldDescriptor struct {
  52. protoreflect.FieldDescriptor
  53. }
  54. type V2JsonProtobufAnyTypeFieldDescriptor struct {
  55. protoreflect.FieldDescriptor
  56. }
  57. func (v V2JsonProtobufAnyTypeFieldDescriptor) JSONName() string {
  58. return "type"
  59. }
  60. func (v V2JsonProtobufAnyTypeFieldDescriptor) TextName() string {
  61. return "type"
  62. }
  63. type V2JsonProtobufAnyValueField struct {
  64. protoreflect.FieldDescriptor
  65. name string
  66. }
  67. func (v *V2JsonProtobufAnyValueField) Kind() protoreflect.Kind {
  68. return protoreflect.MessageKind
  69. }
  70. func (v *V2JsonProtobufAnyValueField) JSONName() string {
  71. return v.name
  72. }
  73. func (v *V2JsonProtobufAnyValueField) TextName() string {
  74. return v.name
  75. }
  76. type V2JsonProtobufAnyFollower struct {
  77. protoreflect.Message
  78. }
  79. func (v *V2JsonProtobufAnyFollower) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
  80. v.Message.Range(func(descriptor protoreflect.FieldDescriptor, value protoreflect.Value) bool {
  81. return followValue(descriptor, value, f)
  82. })
  83. }
  84. type V2JsonProtobufFollower struct {
  85. protoreflect.Message
  86. }
  87. type V2JsonProtobufListFollower struct {
  88. protoreflect.List
  89. }
  90. func (v V2JsonProtobufListFollower) Len() int {
  91. return v.List.Len()
  92. }
  93. func (v V2JsonProtobufListFollower) Get(i int) protoreflect.Value {
  94. return protoreflect.ValueOfMessage(&V2JsonProtobufFollower{v.List.Get(i).Message()})
  95. }
  96. func (v V2JsonProtobufListFollower) Set(i int, value protoreflect.Value) {
  97. panic("implement me")
  98. }
  99. func (v V2JsonProtobufListFollower) Append(value protoreflect.Value) {
  100. panic("implement me")
  101. }
  102. func (v V2JsonProtobufListFollower) AppendMutable() protoreflect.Value {
  103. panic("implement me")
  104. }
  105. func (v V2JsonProtobufListFollower) Truncate(i int) {
  106. panic("implement me")
  107. }
  108. func (v V2JsonProtobufListFollower) NewElement() protoreflect.Value {
  109. panic("implement me")
  110. }
  111. func (v V2JsonProtobufListFollower) IsValid() bool {
  112. panic("implement me")
  113. }
  114. type V2JsonProtobufMapFollower struct {
  115. protoreflect.Map
  116. ValueKind protoreflect.FieldDescriptor
  117. }
  118. func (v V2JsonProtobufMapFollower) Len() int {
  119. panic("implement me")
  120. }
  121. func (v V2JsonProtobufMapFollower) Range(f func(protoreflect.MapKey, protoreflect.Value) bool) {
  122. v.Map.Range(func(key protoreflect.MapKey, value protoreflect.Value) bool {
  123. return followMapValue(v.ValueKind, value, key, f)
  124. })
  125. }
  126. func (v V2JsonProtobufMapFollower) Has(key protoreflect.MapKey) bool {
  127. panic("implement me")
  128. }
  129. func (v V2JsonProtobufMapFollower) Clear(key protoreflect.MapKey) {
  130. panic("implement me")
  131. }
  132. func (v V2JsonProtobufMapFollower) Get(key protoreflect.MapKey) protoreflect.Value {
  133. panic("implement me")
  134. }
  135. func (v V2JsonProtobufMapFollower) Set(key protoreflect.MapKey, value protoreflect.Value) {
  136. panic("implement me")
  137. }
  138. func (v V2JsonProtobufMapFollower) Mutable(key protoreflect.MapKey) protoreflect.Value {
  139. panic("implement me")
  140. }
  141. func (v V2JsonProtobufMapFollower) NewValue() protoreflect.Value {
  142. panic("implement me")
  143. }
  144. func (v V2JsonProtobufMapFollower) IsValid() bool {
  145. panic("implement me")
  146. }
  147. func (v *V2JsonProtobufFollower) Type() protoreflect.MessageType {
  148. panic("implement me")
  149. }
  150. func (v *V2JsonProtobufFollower) New() protoreflect.Message {
  151. panic("implement me")
  152. }
  153. func (v *V2JsonProtobufFollower) Interface() protoreflect.ProtoMessage {
  154. panic("implement me")
  155. }
  156. func (v *V2JsonProtobufFollower) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
  157. v.Message.Range(func(descriptor protoreflect.FieldDescriptor, value protoreflect.Value) bool {
  158. name := descriptor.FullName()
  159. fullname := v.Message.Descriptor().FullName()
  160. if fullname == "google.protobuf.Any" {
  161. switch name {
  162. case "google.protobuf.Any.type_url":
  163. fd := V2JsonProtobufAnyTypeFieldDescriptor{descriptor}
  164. return f(fd, value)
  165. case "google.protobuf.Any.value":
  166. url := v.Message.Get(v.Message.Descriptor().Fields().ByName("type_url")).String()
  167. fd := &V2JsonProtobufAnyValueField{descriptor, url}
  168. bytesout := v.Message.Get(v.Message.Descriptor().Fields().Get(1)).Bytes()
  169. v2type := serial.V2TypeFromURL(url)
  170. instance, err := serial.GetInstance(v2type)
  171. if err != nil {
  172. panic(err)
  173. }
  174. unmarshaler := proto.UnmarshalOptions{AllowPartial: true, Resolver: resolver2{backgroundResolver: serial.GetResolver()}}
  175. err = unmarshaler.Unmarshal(bytesout, instance.(proto.Message))
  176. if err != nil {
  177. panic(err)
  178. }
  179. return f(fd, protoreflect.ValueOfMessage(&V2JsonProtobufFollower{instance.(proto.Message).ProtoReflect()}))
  180. default:
  181. panic("unexpected any value")
  182. }
  183. }
  184. return followValue(descriptor, value, f)
  185. })
  186. }
  187. func followValue(descriptor protoreflect.FieldDescriptor, value protoreflect.Value, f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) bool {
  188. fd := V2JsonProtobufFollowerFieldDescriptor{descriptor}
  189. if descriptor.Kind() == protoreflect.MessageKind {
  190. if descriptor.IsList() {
  191. value2 := protoreflect.ValueOfList(V2JsonProtobufListFollower{value.List()})
  192. return f(fd, value2)
  193. }
  194. if descriptor.IsMap() {
  195. value2 := protoreflect.ValueOfMap(V2JsonProtobufMapFollower{value.Map(), descriptor.MapValue()})
  196. return f(fd, value2)
  197. }
  198. value2 := protoreflect.ValueOfMessage(&V2JsonProtobufFollower{value.Message()})
  199. return f(fd, value2)
  200. }
  201. return f(fd, value)
  202. }
  203. func followMapValue(descriptor protoreflect.FieldDescriptor, value protoreflect.Value, mapkey protoreflect.MapKey, f func(protoreflect.MapKey, protoreflect.Value) bool) bool {
  204. if descriptor.Kind() == protoreflect.MessageKind {
  205. if descriptor.IsList() {
  206. value2 := protoreflect.ValueOfList(V2JsonProtobufListFollower{value.List()})
  207. return f(mapkey, value2)
  208. }
  209. if descriptor.IsMap() {
  210. value2 := protoreflect.ValueOfMap(V2JsonProtobufMapFollower{value.Map(), descriptor.MapValue()})
  211. return f(mapkey, value2)
  212. }
  213. value2 := protoreflect.ValueOfMessage(&V2JsonProtobufFollower{value.Message()})
  214. return f(mapkey, value2)
  215. }
  216. return f(mapkey, value)
  217. }
  218. func (v *V2JsonProtobufFollower) Has(descriptor protoreflect.FieldDescriptor) bool {
  219. panic("implement me")
  220. }
  221. func (v *V2JsonProtobufFollower) Clear(descriptor protoreflect.FieldDescriptor) {
  222. panic("implement me")
  223. }
  224. func (v *V2JsonProtobufFollower) Set(descriptor protoreflect.FieldDescriptor, value protoreflect.Value) {
  225. panic("implement me")
  226. }
  227. func (v *V2JsonProtobufFollower) Mutable(descriptor protoreflect.FieldDescriptor) protoreflect.Value {
  228. panic("implement me")
  229. }
  230. func (v *V2JsonProtobufFollower) NewField(descriptor protoreflect.FieldDescriptor) protoreflect.Value {
  231. panic("implement me")
  232. }
  233. func (v *V2JsonProtobufFollower) WhichOneof(descriptor protoreflect.OneofDescriptor) protoreflect.FieldDescriptor {
  234. panic("implement me")
  235. }
  236. func (v *V2JsonProtobufFollower) GetUnknown() protoreflect.RawFields {
  237. panic("implement me")
  238. }
  239. func (v *V2JsonProtobufFollower) SetUnknown(fields protoreflect.RawFields) {
  240. panic("implement me")
  241. }
  242. func (v *V2JsonProtobufFollower) IsValid() bool {
  243. panic("implement me")
  244. }
  245. func (v *V2JsonProtobufFollower) ProtoReflect() protoreflect.Message {
  246. return v
  247. }
  248. func (v *V2JsonProtobufFollower) Descriptor() protoreflect.MessageDescriptor {
  249. fullname := v.Message.Descriptor().FullName()
  250. if fullname == "google.protobuf.Any" {
  251. //desc := &V2JsonProtobufAnyType{v.Message.Type(), V2JsonProtobufAnyTypeDescriptor{(&anypb.Any{}).ProtoReflect().Descriptor()}}
  252. desc := &V2JsonProtobufAnyTypeDescriptor{(&anypb.Any{}).ProtoReflect().Descriptor()}
  253. return desc
  254. }
  255. return v.Message.Descriptor()
  256. }
  257. func (v *V2JsonProtobufFollower) Get(fd protoreflect.FieldDescriptor) protoreflect.Value {
  258. panic("implement me")
  259. }