Skip to content

مصنع نقل V2Ray ​

المصدر: transport/v2ray/transport.go، transport/v2ray/quic.go، transport/v2ray/grpc.go، transport/v2ray/grpc_lite.go

نمط المصنع ​

يستخدم مصنع نقل V2Ray أسماء أنواع عامة ومُوزِّع تبديل أنواع لإنشاء وسائل نقل الخادم والعميل. هذه هي نقطة الدخول الوحيدة لإنشاء جميع وسائل نقل V2Ray.

أنواع المُنشئ العامة ​

go
type (
    ServerConstructor[O any] func(
        ctx context.Context,
        logger logger.ContextLogger,
        options O,
        tlsConfig tls.ServerConfig,
        handler adapter.V2RayServerTransportHandler,
    ) (adapter.V2RayServerTransport, error)

    ClientConstructor[O any] func(
        ctx context.Context,
        dialer N.Dialer,
        serverAddr M.Socksaddr,
        options O,
        tlsConfig tls.Config,
    ) (adapter.V2RayClientTransport, error)
)

تُعامل هذه الأنواع العامة هيكل الخيارات O كمعامل، مما يسمح لكل نقل بتعريف نوع إعداداته الخاص مع مشاركة نفس توقيع المُنشئ.

توزيع نقل الخادم ​

go
func NewServerTransport(ctx context.Context, logger logger.ContextLogger,
    options option.V2RayTransportOptions, tlsConfig tls.ServerConfig,
    handler adapter.V2RayServerTransportHandler) (adapter.V2RayServerTransport, error) {
    if options.Type == "" {
        return nil, nil
    }
    switch options.Type {
    case C.V2RayTransportTypeHTTP:
        return v2rayhttp.NewServer(ctx, logger, options.HTTPOptions, tlsConfig, handler)
    case C.V2RayTransportTypeWebsocket:
        return v2raywebsocket.NewServer(ctx, logger, options.WebsocketOptions, tlsConfig, handler)
    case C.V2RayTransportTypeQUIC:
        if tlsConfig == nil {
            return nil, C.ErrTLSRequired
        }
        return NewQUICServer(ctx, logger, options.QUICOptions, tlsConfig, handler)
    case C.V2RayTransportTypeGRPC:
        return NewGRPCServer(ctx, logger, options.GRPCOptions, tlsConfig, handler)
    case C.V2RayTransportTypeHTTPUpgrade:
        return v2rayhttpupgrade.NewServer(ctx, logger, options.HTTPUpgradeOptions, tlsConfig, handler)
    default:
        return nil, E.New("unknown transport type: " + options.Type)
    }
}

السلوكيات الرئيسية:

  • النوع الفارغ يُرجع nil, nil (لم يتم تعيين نقل)
  • QUIC يتطلب TLS -- يُرجع C.ErrTLSRequired إذا كان tlsConfig فارغًا
  • HTTP وWebSocket وHTTP Upgrade يُستوردون ويُستدعون مباشرة
  • gRPC وQUIC يُوزَّعان عبر دوال وسيطة تتعامل مع تبديل علامات البناء

توزيع نقل العميل ​

يتبع NewClientTransport نفس النمط. يستقبل متغير العميل N.Dialer و M.Socksaddr بدلاً من المعالج:

go
func NewClientTransport(ctx context.Context, dialer N.Dialer, serverAddr M.Socksaddr,
    options option.V2RayTransportOptions, tlsConfig tls.Config) (adapter.V2RayClientTransport, error)

لاحظ أن إعدادات TLS هي tls.Config (واجهة العميل) مقابل tls.ServerConfig (واجهة الخادم).

نمط تسجيل QUIC ​

يتطلب نقل QUIC علامة البناء with_quic. بما أن حزمة v2ray الأساسية لا تستطيع استيراد v2rayquic مباشرة (التي قد لا تكون مُترجَمة)، فإنها تستخدم نمط تسجيل:

go
// quic.go
var (
    quicServerConstructor ServerConstructor[option.V2RayQUICOptions]
    quicClientConstructor ClientConstructor[option.V2RayQUICOptions]
)

func RegisterQUICConstructor(
    server ServerConstructor[option.V2RayQUICOptions],
    client ClientConstructor[option.V2RayQUICOptions],
) {
    quicServerConstructor = server
    quicClientConstructor = client
}

func NewQUICServer(...) (adapter.V2RayServerTransport, error) {
    if quicServerConstructor == nil {
        return nil, os.ErrInvalid
    }
    return quicServerConstructor(ctx, logger, options, tlsConfig, handler)
}

تُسجِّل حزمة v2rayquic نفسها عبر init():

go
// v2rayquic/init.go
//go:build with_quic

func init() {
    v2ray.RegisterQUICConstructor(NewServer, NewClient)
}

إذا تمت الترجمة بدون with_quic، تبقى المُنشئات فارغة (nil)، ويُرجع NewQUICServer/NewQUICClient الخطأ os.ErrInvalid.

تبديل علامات بناء gRPC ​

يحتوي gRPC على تنفيذين يُتحكم بهما عبر علامات البناء:

مع with_grpc (grpc.go):

go
//go:build with_grpc

func NewGRPCServer(...) (adapter.V2RayServerTransport, error) {
    if options.ForceLite {
        return v2raygrpclite.NewServer(ctx, logger, options, tlsConfig, handler)
    }
    return v2raygrpc.NewServer(ctx, logger, options, tlsConfig, handler)
}

عندما تكون مكتبة gRPC الكاملة متاحة، لا يزال بإمكان المستخدم فرض التنفيذ الخفيف عبر options.ForceLite.

بدون with_grpc (grpc_lite.go):

go
//go:build !with_grpc

func NewGRPCServer(...) (adapter.V2RayServerTransport, error) {
    return v2raygrpclite.NewServer(ctx, logger, options, tlsConfig, handler)
}

بدون علامة البناء، يُستخدم التنفيذ الخفيف دائمًا بغض النظر عن ForceLite.

الإعدادات ​

json
{
  "transport": {
    "type": "ws",
    "path": "/path",
    "headers": {
      "Host": "example.com"
    },
    "max_early_data": 2048,
    "early_data_header_name": "Sec-WebSocket-Protocol"
  }
}

يحتوي هيكل V2RayTransportOptions على نص Type وهياكل خيارات فرعية لكل نوع نقل (HTTPOptions، WebsocketOptions، QUICOptions، GRPCOptions، HTTPUpgradeOptions). تُستخدم فقط الخيارات الفرعية المطابقة للنوع المحدد.