func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { space := app.SpaceFromContext(ctx) if space == nil { return nil, errors.New("Shadowsocks|Server: No space in context.") } if config.GetUser() == nil { return nil, protocol.ErrUserMissing } rawAccount, err := config.User.GetTypedAccount() if err != nil { return nil, errors.Base(err).Message("Shadowsocks|Server: Failed to get user account.") } account := rawAccount.(*ShadowsocksAccount) s := &Server{ config: config, user: config.GetUser(), account: account, } space.OnInitialize(func() error { s.packetDispatcher = dispatcher.FromSpace(space) if s.packetDispatcher == nil { return errors.New("Shadowsocks|Server: Dispatcher is not found in space.") } return nil }) return s, nil }
func New(ctx context.Context, config *Config) (*VMessInboundHandler, error) { space := app.SpaceFromContext(ctx) if space == nil { return nil, errors.New("VMess|Inbound: No space in context.") } allowedClients := vmess.NewTimedUserValidator(protocol.DefaultIDHash) for _, user := range config.User { allowedClients.Add(user) } handler := &VMessInboundHandler{ clients: allowedClients, detours: config.Detour, usersByEmail: NewUserByEmail(config.User, config.GetDefaultValue()), } space.OnInitialize(func() error { handler.packetDispatcher = dispatcher.FromSpace(space) if handler.packetDispatcher == nil { return errors.New("VMess|Inbound: Dispatcher is not found in space.") } handler.inboundHandlerManager = proxyman.InboundHandlerManagerFromSpace(space) if handler.inboundHandlerManager == nil { return errors.New("VMess|Inbound: InboundHandlerManager is not found is space.") } return nil }) return handler, nil }
func NewRouter(ctx context.Context, config *Config) (*Router, error) { space := app.SpaceFromContext(ctx) if space == nil { return nil, errors.New("Router: No space in context.") } r := &Router{ domainStrategy: config.DomainStrategy, rules: make([]Rule, len(config.Rule)), } space.OnInitialize(func() error { for idx, rule := range config.Rule { r.rules[idx].Tag = rule.Tag cond, err := rule.BuildCondition() if err != nil { return err } r.rules[idx].Condition = cond } r.dnsServer = dns.FromSpace(space) if r.dnsServer == nil { return errors.New("Router: DNS is not found in the space.") } return nil }) return r, nil }
func NewDefaultDispatcher(ctx context.Context, config *dispatcher.Config) (*DefaultDispatcher, error) { space := app.SpaceFromContext(ctx) if space == nil { return nil, errors.New("DefaultDispatcher: No space in context.") } d := &DefaultDispatcher{} space.OnInitialize(func() error { d.ohm = proxyman.OutboundHandlerManagerFromSpace(space) if d.ohm == nil { return errors.New("DefaultDispatcher: OutboundHandlerManager is not found in the space.") } d.router = router.FromSpace(space) return nil }) return d, nil }
// NewServer creates a new HTTP inbound handler. func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { space := app.SpaceFromContext(ctx) if space == nil { return nil, errors.New("HTTP|Server: No space in context.") } s := &Server{ config: config, } space.OnInitialize(func() error { s.packetDispatcher = dispatcher.FromSpace(space) if s.packetDispatcher == nil { return errors.New("HTTP|Server: Dispatcher not found in space.") } return nil }) return s, nil }
func New(ctx context.Context, config *Config) (*VMessOutboundHandler, error) { space := app.SpaceFromContext(ctx) if space == nil { return nil, errors.New("VMess|Outbound: No space in context.") } serverList := protocol.NewServerList() for _, rec := range config.Receiver { serverList.AddServer(protocol.NewServerSpecFromPB(*rec)) } handler := &VMessOutboundHandler{ serverList: serverList, serverPicker: protocol.NewRoundRobinServerPicker(serverList), } return handler, nil }
func New(ctx context.Context, config *Config) (*Handler, error) { space := app.SpaceFromContext(ctx) if space == nil { return nil, errors.New("Freedom: No space in context.") } f := &Handler{ domainStrategy: config.DomainStrategy, timeout: config.Timeout, destOverride: config.DestinationOverride, } space.OnInitialize(func() error { if config.DomainStrategy == Config_USE_IP { f.dns = dns.FromSpace(space) if f.dns == nil { return errors.New("Freedom: DNS server is not found in the space.") } } return nil }) return f, nil }
func New(ctx context.Context, config *Config) (*DokodemoDoor, error) { space := app.SpaceFromContext(ctx) if space == nil { return nil, errors.New("Dokodemo: No space in context.") } if config.NetworkList == nil || config.NetworkList.Size() == 0 { return nil, errors.New("DokodemoDoor: No network specified.") } d := &DokodemoDoor{ config: config, address: config.GetPredefinedAddress(), port: net.Port(config.Port), } space.OnInitialize(func() error { d.packetDispatcher = dispatcher.FromSpace(space) if d.packetDispatcher == nil { return errors.New("Dokodemo: Dispatcher is not found in the space.") } return nil }) return d, nil }
func NewHandler(ctx context.Context, config *proxyman.OutboundHandlerConfig) (*Handler, error) { h := &Handler{ config: config, } space := app.SpaceFromContext(ctx) if space == nil { return nil, errors.New("Proxyman|OutboundHandler: No space in context.") } space.OnInitialize(func() error { ohm := proxyman.OutboundHandlerManagerFromSpace(space) if ohm == nil { return errors.New("Proxyman|OutboundHandler: No OutboundManager in space.") } h.outboundManager = ohm return nil }) if config.SenderSettings != nil { senderSettings, err := config.SenderSettings.GetInstance() if err != nil { return nil, err } switch s := senderSettings.(type) { case *proxyman.SenderConfig: h.senderSettings = s default: return nil, errors.New("Proxyman|DefaultOutboundHandler: settings is not SenderConfig.") } } proxyHandler, err := config.GetProxyHandler(ctx) if err != nil { return nil, err } h.proxy = proxyHandler return h, nil }
func NewCacheServer(ctx context.Context, config *dns.Config) (*CacheServer, error) { space := app.SpaceFromContext(ctx) if space == nil { return nil, errors.New("DNSCacheServer: No space in context.") } server := &CacheServer{ records: make(map[string]*DomainRecord), servers: make([]NameServer, len(config.NameServers)), hosts: config.GetInternalHosts(), } space.OnInitialize(func() error { disp := dispatcher.FromSpace(space) if disp == nil { return errors.New("DNS: Dispatcher is not found in the space.") } for idx, destPB := range config.NameServers { address := destPB.Address.AsAddress() if address.Family().IsDomain() && address.Domain() == "localhost" { server.servers[idx] = &LocalNameServer{} } else { dest := destPB.AsDestination() if dest.Network == v2net.Network_Unknown { dest.Network = v2net.Network_UDP } if dest.Network == v2net.Network_UDP { server.servers[idx] = NewUDPNameServer(dest, disp) } } } if len(config.NameServers) == 0 { server.servers = append(server.servers, &LocalNameServer{}) } return nil }) return server, nil }