| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 | package coreimport (	"bytes"	"context"	"github.com/xtls/xray-core/common"	"github.com/xtls/xray-core/common/errors"	"github.com/xtls/xray-core/common/net"	"github.com/xtls/xray-core/common/net/cnc"	"github.com/xtls/xray-core/features/routing"	"github.com/xtls/xray-core/transport/internet/udp")// CreateObject creates a new object based on the given Xray instance and config. The Xray instance may be nil.func CreateObject(v *Instance, config interface{}) (interface{}, error) {	ctx := v.ctx	if v != nil {		ctx = toContext(v.ctx, v)	}	return common.CreateObject(ctx, config)}// StartInstance starts a new Xray instance with given serialized config.// By default Xray only support config in protobuf format, i.e., configFormat = "protobuf". Caller need to load other packages to add JSON support.//// xray:api:stablefunc StartInstance(configFormat string, configBytes []byte) (*Instance, error) {	config, err := LoadConfig(configFormat, bytes.NewReader(configBytes))	if err != nil {		return nil, err	}	instance, err := New(config)	if err != nil {		return nil, err	}	if err := instance.Start(); err != nil {		return nil, err	}	return instance, nil}// Dial provides an easy way for upstream caller to create net.Conn through Xray.// It dispatches the request to the given destination by the given Xray instance.// Since it is under a proxy context, the LocalAddr() and RemoteAddr() in returned net.Conn// will not show real addresses being used for communication.//// xray:api:stablefunc Dial(ctx context.Context, v *Instance, dest net.Destination) (net.Conn, error) {	ctx = toContext(ctx, v)	dispatcher := v.GetFeature(routing.DispatcherType())	if dispatcher == nil {		return nil, errors.New("routing.Dispatcher is not registered in Xray core")	}	r, err := dispatcher.(routing.Dispatcher).Dispatch(ctx, dest)	if err != nil {		return nil, err	}	var readerOpt cnc.ConnectionOption	if dest.Network == net.Network_TCP {		readerOpt = cnc.ConnectionOutputMulti(r.Reader)	} else {		readerOpt = cnc.ConnectionOutputMultiUDP(r.Reader)	}	return cnc.NewConnection(cnc.ConnectionInputMulti(r.Writer), readerOpt), nil}// DialUDP provides a way to exchange UDP packets through Xray instance to remote servers.// Since it is under a proxy context, the LocalAddr() in returned PacketConn will not show the real address.//// TODO: SetDeadline() / SetReadDeadline() / SetWriteDeadline() are not implemented.//// xray:api:betafunc DialUDP(ctx context.Context, v *Instance) (net.PacketConn, error) {	ctx = toContext(ctx, v)	dispatcher := v.GetFeature(routing.DispatcherType())	if dispatcher == nil {		return nil, errors.New("routing.Dispatcher is not registered in Xray core")	}	return udp.DialDispatcher(ctx, dispatcher.(routing.Dispatcher))}
 |