Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

build: migrate from github.com/golang/protobuf to google.golang.org/protobuf #2844

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 0 additions & 1 deletion README.md
Expand Up @@ -36,7 +36,6 @@ This repo relies on the following third-party projects:
- [pires/go-proxyproto](https://github.com/pires/go-proxyproto)
- [seiflotfy/cuckoofilter](https://github.com/seiflotfy/cuckoofilter)
- [google/starlark-go](https://github.com/google/starlark-go)
- [jhump/protoreflect](https://github.com/jhump/protoreflect)
- [inetaf/netaddr](https://github.com/inetaf/netaddr)

- For testing only:
Expand Down
2 changes: 1 addition & 1 deletion app/observatory/burst/burstobserver.go
Expand Up @@ -4,7 +4,7 @@ import (
"context"
"sync"

"github.com/golang/protobuf/proto"
"google.golang.org/protobuf/proto"

core "github.com/v2fly/v2ray-core/v5"
"github.com/v2fly/v2ray-core/v5/app/observatory"
Expand Down
2 changes: 1 addition & 1 deletion app/observatory/command/command.go
Expand Up @@ -8,8 +8,8 @@ package command
import (
"context"

"github.com/golang/protobuf/proto"
"google.golang.org/grpc"
"google.golang.org/protobuf/proto"

core "github.com/v2fly/v2ray-core/v5"
"github.com/v2fly/v2ray-core/v5/app/observatory"
Expand Down
6 changes: 3 additions & 3 deletions app/observatory/multiobservatory/multi.go
Expand Up @@ -3,8 +3,8 @@ package multiobservatory
import (
"context"

"github.com/golang/protobuf/jsonpb"
"github.com/golang/protobuf/proto"
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/proto"

"github.com/v2fly/v2ray-core/v5/common"
"github.com/v2fly/v2ray-core/v5/common/taggedfeatures"
Expand Down Expand Up @@ -34,7 +34,7 @@ func New(ctx context.Context, config *Config) (*Observer, error) {
return &Observer{config: config, ctx: ctx, TaggedFeatures: holder}, nil
}

func (x *Config) UnmarshalJSONPB(unmarshaler *jsonpb.Unmarshaler, bytes []byte) error {
func (x *Config) UnmarshalJSONPB(unmarshaler *protojson.UnmarshalOptions, bytes []byte) error {
var err error
x.Holders, err = taggedfeatures.LoadJSONConfig(context.TODO(), "service", "background", bytes)
return err
Expand Down
2 changes: 1 addition & 1 deletion app/observatory/observer.go
Expand Up @@ -12,7 +12,7 @@ import (
"sync"
"time"

"github.com/golang/protobuf/proto"
"google.golang.org/protobuf/proto"

core "github.com/v2fly/v2ray-core/v5"
"github.com/v2fly/v2ray-core/v5/common"
Expand Down
4 changes: 2 additions & 2 deletions app/router/config.go
Expand Up @@ -7,7 +7,7 @@ import (
"context"
"encoding/json"

"github.com/golang/protobuf/jsonpb"
"google.golang.org/protobuf/encoding/protojson"

"github.com/v2fly/v2ray-core/v5/app/router/routercommon"
"github.com/v2fly/v2ray-core/v5/common/net"
Expand Down Expand Up @@ -186,7 +186,7 @@ func (br *BalancingRule) Build(ohm outbound.Manager, dispatcher routing.Dispatch
}
}

func (br *BalancingRule) UnmarshalJSONPB(unmarshaler *jsonpb.Unmarshaler, bytes []byte) error {
func (br *BalancingRule) UnmarshalJSONPB(unmarshaler *protojson.UnmarshalOptions, bytes []byte) error {
type BalancingRuleStub struct {
Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
OutboundSelector []string `protobuf:"bytes,2,rep,name=outbound_selector,json=outboundSelector,proto3" json:"outbound_selector,omitempty"`
Expand Down
2 changes: 1 addition & 1 deletion app/router/strategy_leastload.go
Expand Up @@ -6,7 +6,7 @@ import (
"sort"
"time"

"github.com/golang/protobuf/proto"
"google.golang.org/protobuf/proto"

core "github.com/v2fly/v2ray-core/v5"
"github.com/v2fly/v2ray-core/v5/app/observatory"
Expand Down
4 changes: 2 additions & 2 deletions app/router/strategy_random.go
Expand Up @@ -3,7 +3,7 @@ package router
import (
"context"

"google.golang.org/protobuf/runtime/protoiface"
"google.golang.org/protobuf/proto"

core "github.com/v2fly/v2ray-core/v5"
"github.com/v2fly/v2ray-core/v5/app/observatory"
Expand Down Expand Up @@ -47,7 +47,7 @@ func (s *RandomStrategy) PickOutbound(candidates []string) string {
})
}
if s.observatory != nil {
var observeReport protoiface.MessageV1
var observeReport proto.Message
var err error
if s.settings.ObserverTag == "" {
observeReport, err = s.observatory.GetObservation(s.ctx)
Expand Down
2 changes: 1 addition & 1 deletion app/subscription/specs/outbound_parser.go
Expand Up @@ -5,7 +5,7 @@ import (
"context"
"encoding/json"

"github.com/golang/protobuf/proto"
"google.golang.org/protobuf/proto"

"github.com/v2fly/v2ray-core/v5/common/registry"
"github.com/v2fly/v2ray-core/v5/common/serial"
Expand Down
4 changes: 2 additions & 2 deletions common/net/address.go
Expand Up @@ -6,7 +6,7 @@ import (
"net"
"strings"

"github.com/golang/protobuf/jsonpb"
"google.golang.org/protobuf/encoding/protojson"
)

var (
Expand Down Expand Up @@ -212,7 +212,7 @@ func NewIPOrDomain(addr Address) *IPOrDomain {
}
}

func (d *IPOrDomain) UnmarshalJSONPB(unmarshaler *jsonpb.Unmarshaler, bytes []byte) error {
func (d *IPOrDomain) UnmarshalJSONPB(unmarshaler *protojson.UnmarshalOptions, bytes []byte) error {
var ipOrDomain string
if err := json.Unmarshal(bytes, &ipOrDomain); err != nil {
return err
Expand Down
4 changes: 2 additions & 2 deletions common/net/network.go
Expand Up @@ -4,7 +4,7 @@ import (
"encoding/json"
"strings"

"github.com/golang/protobuf/jsonpb"
"google.golang.org/protobuf/encoding/protojson"
)

func (n Network) SystemString() string {
Expand All @@ -20,7 +20,7 @@ func (n Network) SystemString() string {
}
}

func (nl *NetworkList) UnmarshalJSONPB(unmarshaler *jsonpb.Unmarshaler, bytes []byte) error {
func (nl *NetworkList) UnmarshalJSONPB(unmarshaler *protojson.UnmarshalOptions, bytes []byte) error {
var networkStrList []string
if err := json.Unmarshal(bytes, &networkStrList); err == nil {
nl.Network = ParseNetworkStringList(networkStrList)
Expand Down
12 changes: 3 additions & 9 deletions common/protoext/extensions.go
@@ -1,7 +1,7 @@
package protoext

import (
"github.com/golang/protobuf/proto"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/types/descriptorpb"
)
Expand All @@ -10,18 +10,12 @@ import (

func GetMessageOptions(msgDesc protoreflect.MessageDescriptor) (*MessageOpt, error) {
msgOpt := msgDesc.Options().(*descriptorpb.MessageOptions)
msgOptRet, err := proto.GetExtension(msgOpt, E_MessageOpt)
if err != nil {
return nil, newError("unable to parse extension from message").Base(err)
}
msgOptRet := proto.GetExtension(msgOpt, E_MessageOpt)
return msgOptRet.(*MessageOpt), nil
}

func GetFieldOptions(fieldDesc protoreflect.FieldDescriptor) (*FieldOpt, error) {
fieldOpt := fieldDesc.Options().(*descriptorpb.FieldOptions)
msgOptRet, err := proto.GetExtension(fieldOpt, E_FieldOpt)
if err != nil {
return nil, newError("unable to parse extension from message").Base(err)
}
msgOptRet := proto.GetExtension(fieldOpt, E_FieldOpt)
return msgOptRet.(*FieldOpt), nil
}
2 changes: 1 addition & 1 deletion common/registry/implementation_set.go
@@ -1,7 +1,7 @@
package registry

import (
"github.com/golang/protobuf/proto"
"google.golang.org/protobuf/proto"

"github.com/v2fly/v2ray-core/v5/common/protoext"
)
Expand Down
29 changes: 11 additions & 18 deletions common/registry/registry.go
@@ -1,15 +1,12 @@
package registry

import (
"bytes"
"context"
"reflect"
"strings"
"sync"

"github.com/golang/protobuf/jsonpb"
"github.com/golang/protobuf/proto"
protov2 "google.golang.org/protobuf/proto"
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/proto"

"github.com/v2fly/v2ray-core/v5/common/protoext"
"github.com/v2fly/v2ray-core/v5/common/protofilter"
Expand Down Expand Up @@ -65,25 +62,23 @@ func (i *implementationRegistry) LoadImplementationByAlias(ctx context.Context,
return nil, newError("unable to create implementation config instance").Base(err)
}

unmarshaler := jsonpb.Unmarshaler{AllowUnknownFields: false}
err = unmarshaler.Unmarshal(bytes.NewReader(data), implementationConfigInstance.(proto.Message))
unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: false}
err = unmarshaler.Unmarshal(data, implementationConfigInstance)
if err != nil {
return nil, newError("unable to parse json content").Base(err)
}

implementationConfigInstancev2 := proto.MessageV2(implementationConfigInstance)

if isRestrictedModeContext(ctx) {
if err := enforceRestriction(implementationConfigInstancev2); err != nil {
if err := enforceRestriction(implementationConfigInstance); err != nil {
return nil, err
}
}

if err := protofilter.FilterProtoConfig(ctx, implementationConfigInstancev2); err != nil {
if err := protofilter.FilterProtoConfig(ctx, implementationConfigInstance); err != nil {
return nil, err
}

return implementationConfigInstance.(proto.Message), nil
return implementationConfigInstance, nil
}

func newImplementationRegistry() *implementationRegistry {
Expand All @@ -95,26 +90,24 @@ var globalImplementationRegistry = newImplementationRegistry()
var initialized = &sync.Once{}

type registerRequest struct {
proto interface{}
proto proto.Message
loader CustomLoader
}

var registerRequests []registerRequest

// RegisterImplementation register an implementation of a type of interface
// loader(CustomLoader) is a private API, its interface is subject to breaking changes
func RegisterImplementation(proto interface{}, loader CustomLoader) error {
func RegisterImplementation(proto proto.Message, loader CustomLoader) error {
registerRequests = append(registerRequests, registerRequest{
proto: proto,
loader: loader,
})
return nil
}

func registerImplementation(proto interface{}, loader CustomLoader) error {
protoReflect := reflect.New(reflect.TypeOf(proto).Elem())
proto2 := protoReflect.Interface().(protov2.Message)
msgDesc := proto2.ProtoReflect().Descriptor()
func registerImplementation(proto proto.Message, loader CustomLoader) error {
msgDesc := proto.ProtoReflect().Descriptor()
fullName := string(msgDesc.FullName())
msgOpts, err := protoext.GetMessageOptions(msgDesc)
if err != nil {
Expand Down
26 changes: 18 additions & 8 deletions common/serial/resolver.go
@@ -1,21 +1,31 @@
package serial

import (
"github.com/golang/protobuf/proto"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/reflect/protoregistry"
)

type AnyResolver interface {
Resolve(typeURL string) (proto.Message, error)
protoregistry.MessageTypeResolver
protoregistry.ExtensionTypeResolver
}

type serialResolver struct{}

func (s serialResolver) Resolve(typeURL string) (proto.Message, error) {
instance, err := GetInstance(typeURL)
if err != nil {
return nil, err
}
return instance.(proto.Message), nil
func (s serialResolver) FindMessageByName(messageName protoreflect.FullName) (protoreflect.MessageType, error) {
return protoregistry.GlobalTypes.FindMessageByName(messageName)
}

func (s serialResolver) FindMessageByURL(url string) (protoreflect.MessageType, error) {
return protoregistry.GlobalTypes.FindMessageByURL(url)
}

func (s serialResolver) FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) {
return protoregistry.GlobalTypes.FindExtensionByName(field)
}

func (s serialResolver) FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) {
return protoregistry.GlobalTypes.FindExtensionByNumber(message, field)
}

func GetResolver() AnyResolver {
Expand Down
36 changes: 26 additions & 10 deletions common/serial/typed_message.go
Expand Up @@ -2,10 +2,11 @@ package serial

import (
"errors"
"reflect"
"strings"

"github.com/golang/protobuf/proto"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/reflect/protoregistry"
"google.golang.org/protobuf/types/known/anypb"
)

Expand All @@ -25,28 +26,43 @@ func ToTypedMessage(message proto.Message) *anypb.Any {

// GetMessageType returns the name of this proto Message.
func GetMessageType(message proto.Message) string {
return proto.MessageName(message)
return string(message.ProtoReflect().Descriptor().FullName())
}

// GetMessageDescriptor returns the MessageDescriptor of the message with fullName.
func GetMessageDescriptor(fullName string) (protoreflect.MessageDescriptor, error) {
mt, err := protoregistry.GlobalFiles.FindDescriptorByName(protoreflect.FullName(fullName))
if err != nil {
return nil, errors.New("Serial: Unknown message name: " + fullName)
}

message, ok := mt.(protoreflect.MessageDescriptor)
if !ok {
return nil, errors.New("Serial: Message with name: " + fullName + " is not a MessageDescriptor")
}
return message, nil
}

// GetInstance creates a new instance of the message with messageType.
func GetInstance(messageType string) (interface{}, error) {
mType := proto.MessageType(messageType)
if mType == nil || mType.Elem() == nil {
func GetInstance(messageType string) (proto.Message, error) {
// mType := proto.MessageType(messageType)
mType, err := protoregistry.GlobalTypes.FindMessageByName(protoreflect.FullName(messageType))
if err != nil {
return nil, errors.New("Serial: Unknown type: " + messageType)
}
return reflect.New(mType.Elem()).Interface(), nil

return mType.New().Interface(), nil
}

func GetInstanceOf(v *anypb.Any) (proto.Message, error) {
instance, err := GetInstance(V2TypeFromURL(v.TypeUrl))
if err != nil {
return nil, err
}
protoMessage := instance.(proto.Message)
if err := proto.Unmarshal(v.Value, protoMessage); err != nil {
if err := proto.Unmarshal(v.Value, instance); err != nil {
return nil, err
}
return protoMessage, nil
return instance, nil
}

func V2Type(v *anypb.Any) string {
Expand Down
16 changes: 16 additions & 0 deletions common/serial/typed_message_test.go
Expand Up @@ -22,3 +22,19 @@ func TestConvertingNilMessage(t *testing.T) {
t.Error("expect nil, but actually not")
}
}

func TestGetMessageDescriptor(t *testing.T) {
_, err := GetMessageDescriptor("")
if err == nil {
t.Error("expect non-nil error, but got nil")
}

md, err := GetMessageDescriptor("google.protobuf.Any")
if err != nil {
t.Error("expect nil error, but got ", err)
}

if md == nil || md.FullName() != "google.protobuf.Any" {
t.Error("expect google.protobuf.Any, but got ", md)
}
}