v2jsonpb.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package v2jsonpb
  2. import (
  3. "io"
  4. "google.golang.org/protobuf/encoding/protojson"
  5. "google.golang.org/protobuf/proto"
  6. core "github.com/v2fly/v2ray-core/v5"
  7. "github.com/v2fly/v2ray-core/v5/common"
  8. "github.com/v2fly/v2ray-core/v5/common/buf"
  9. "github.com/v2fly/v2ray-core/v5/common/cmdarg"
  10. "github.com/v2fly/v2ray-core/v5/common/serial"
  11. )
  12. //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen
  13. func loadV2JsonPb(data []byte) (*core.Config, error) {
  14. coreconf := &core.Config{}
  15. jsonpbloader := &protojson.UnmarshalOptions{Resolver: anyresolverv2{serial.GetResolver()}, AllowPartial: true}
  16. err := jsonpbloader.Unmarshal(data, &V2JsonProtobufFollower{coreconf.ProtoReflect()})
  17. if err != nil {
  18. return nil, err
  19. }
  20. return coreconf, nil
  21. }
  22. func dumpV2JsonPb(config proto.Message) ([]byte, error) {
  23. jsonpbdumper := &protojson.MarshalOptions{Resolver: anyresolverv2{serial.GetResolver()}, AllowPartial: true}
  24. bytew, err := jsonpbdumper.Marshal(&V2JsonProtobufFollower{config.ProtoReflect()})
  25. if err != nil {
  26. return nil, err
  27. }
  28. return bytew, nil
  29. }
  30. func DumpV2JsonPb(config proto.Message) ([]byte, error) {
  31. return dumpV2JsonPb(config)
  32. }
  33. const FormatProtobufV2JSONPB = "v2jsonpb"
  34. func init() {
  35. common.Must(core.RegisterConfigLoader(&core.ConfigFormat{
  36. Name: []string{FormatProtobufV2JSONPB},
  37. Extension: []string{".v2pb.json", ".v2pbjson"},
  38. Loader: func(input interface{}) (*core.Config, error) {
  39. switch v := input.(type) {
  40. case string:
  41. r, err := cmdarg.LoadArg(v)
  42. if err != nil {
  43. return nil, err
  44. }
  45. data, err := buf.ReadAllToBytes(r)
  46. if err != nil {
  47. return nil, err
  48. }
  49. return loadV2JsonPb(data)
  50. case []byte:
  51. return loadV2JsonPb(v)
  52. case io.Reader:
  53. data, err := buf.ReadAllToBytes(v)
  54. if err != nil {
  55. return nil, err
  56. }
  57. return loadV2JsonPb(data)
  58. default:
  59. return nil, newError("unknown type")
  60. }
  61. },
  62. }))
  63. }