1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- package mux
- import (
- "context"
- "net"
- "github.com/sagernet/sing-box/adapter"
- C "github.com/sagernet/sing-box/constant"
- "github.com/sagernet/sing-box/option"
- "github.com/sagernet/sing-mux"
- E "github.com/sagernet/sing/common/exceptions"
- "github.com/sagernet/sing/common/logger"
- M "github.com/sagernet/sing/common/metadata"
- N "github.com/sagernet/sing/common/network"
- )
- type Client = mux.Client
- func NewClientWithOptions(dialer N.Dialer, logger logger.Logger, options option.OutboundMultiplexOptions) (*Client, error) {
- if !options.Enabled {
- return nil, nil
- }
- var brutalOptions mux.BrutalOptions
- if options.Brutal != nil && options.Brutal.Enabled {
- brutalOptions = mux.BrutalOptions{
- Enabled: true,
- SendBPS: uint64(options.Brutal.UpMbps * C.MbpsToBps),
- ReceiveBPS: uint64(options.Brutal.DownMbps * C.MbpsToBps),
- }
- if brutalOptions.SendBPS < mux.BrutalMinSpeedBPS {
- return nil, E.New("brutal: invalid upload speed")
- }
- if brutalOptions.ReceiveBPS < mux.BrutalMinSpeedBPS {
- return nil, E.New("brutal: invalid download speed")
- }
- }
- return mux.NewClient(mux.Options{
- Dialer: &clientDialer{dialer},
- Logger: logger,
- Protocol: options.Protocol,
- MaxConnections: options.MaxConnections,
- MinStreams: options.MinStreams,
- MaxStreams: options.MaxStreams,
- Padding: options.Padding,
- Brutal: brutalOptions,
- })
- }
- type clientDialer struct {
- N.Dialer
- }
- func (d *clientDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
- return d.Dialer.DialContext(adapter.OverrideContext(ctx), network, destination)
- }
- func (d *clientDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
- return d.Dialer.ListenPacket(adapter.OverrideContext(ctx), destination)
- }
|