mirror of https://github.com/XTLS/Xray-core
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.4 KiB
50 lines
1.4 KiB
package singbridge |
|
|
|
import ( |
|
"context" |
|
"io" |
|
|
|
M "github.com/sagernet/sing/common/metadata" |
|
N "github.com/sagernet/sing/common/network" |
|
"github.com/xtls/xray-core/common/buf" |
|
"github.com/xtls/xray-core/common/errors" |
|
"github.com/xtls/xray-core/common/net" |
|
"github.com/xtls/xray-core/features/routing" |
|
"github.com/xtls/xray-core/transport" |
|
) |
|
|
|
var ( |
|
_ N.TCPConnectionHandler = (*Dispatcher)(nil) |
|
_ N.UDPConnectionHandler = (*Dispatcher)(nil) |
|
) |
|
|
|
type Dispatcher struct { |
|
upstream routing.Dispatcher |
|
newErrorFunc func(values ...any) *errors.Error |
|
} |
|
|
|
func NewDispatcher(dispatcher routing.Dispatcher, newErrorFunc func(values ...any) *errors.Error) *Dispatcher { |
|
return &Dispatcher{ |
|
upstream: dispatcher, |
|
newErrorFunc: newErrorFunc, |
|
} |
|
} |
|
|
|
func (d *Dispatcher) NewConnection(ctx context.Context, conn net.Conn, metadata M.Metadata) error { |
|
xConn := NewConn(conn) |
|
return d.upstream.DispatchLink(ctx, ToDestination(metadata.Destination, net.Network_TCP), &transport.Link{ |
|
Reader: xConn, |
|
Writer: xConn, |
|
}) |
|
} |
|
|
|
func (d *Dispatcher) NewPacketConnection(ctx context.Context, conn N.PacketConn, metadata M.Metadata) error { |
|
return d.upstream.DispatchLink(ctx, ToDestination(metadata.Destination, net.Network_UDP), &transport.Link{ |
|
Reader: buf.NewPacketReader(conn.(io.Reader)), |
|
Writer: buf.NewWriter(conn.(io.Writer)), |
|
}) |
|
} |
|
|
|
func (d *Dispatcher) NewError(ctx context.Context, err error) { |
|
errors.LogInfo(ctx, err.Error()) |
|
}
|
|
|