func NewRouter(config *Config, space app.Space) *Router { r := &Router{ domainStrategy: config.DomainStrategy, //cache: NewRoutingTable(), rules: make([]Rule, len(config.Rule)), } space.InitializeApplication(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 } if !space.HasApp(dns.APP_ID) { log.Error("Router: DNS is not found in the space.") return app.ErrMissingApplication } r.dnsServer = space.GetApp(dns.APP_ID).(dns.Server) return nil }) return r }
func NewServer(config *ServerConfig, space app.Space, meta *proxy.InboundHandlerMeta) (*Server, error) { if config.GetUser() == nil { return nil, protocol.ErrUserMissing } rawAccount, err := config.User.GetTypedAccount() if err != nil { return nil, errors.New("Shadowsocks|Server: Failed to get user account: " + err.Error()) } account := rawAccount.(*ShadowsocksAccount) s := &Server{ config: config, meta: meta, user: config.GetUser(), account: account, } space.InitializeApplication(func() error { if !space.HasApp(dispatcher.APP_ID) { return app.ErrMissingApplication } s.packetDispatcher = space.GetApp(dispatcher.APP_ID).(dispatcher.PacketDispatcher) return nil }) return s, nil }
func NewCacheServer(space app.Space, config *Config) *CacheServer { server := &CacheServer{ records: make(map[string]*DomainRecord), servers: make([]NameServer, len(config.NameServers)), hosts: config.GetInternalHosts(), } space.InitializeApplication(func() error { if !space.HasApp(dispatcher.APP_ID) { log.Error("DNS: Dispatcher is not found in the space.") return app.ErrMissingApplication } dispatcher := space.GetApp(dispatcher.APP_ID).(dispatcher.PacketDispatcher) 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, dispatcher) } } } if len(config.NameServers) == 0 { server.servers = append(server.servers, &LocalNameServer{}) } return nil }) return server }
func NewDefaultDispatcher(space app.Space) *DefaultDispatcher { d := &DefaultDispatcher{} space.InitializeApplication(func() error { return d.Initialize(space) }) return d }
func NewCacheServer(space app.Space, config *Config) *CacheServer { server := &CacheServer{ records: make(map[string]*DomainRecord), servers: make([]NameServer, len(config.NameServers)), hosts: config.Hosts, } space.InitializeApplication(func() error { if !space.HasApp(dispatcher.APP_ID) { log.Error("DNS: Dispatcher is not found in the space.") return app.ErrMissingApplication } dispatcher := space.GetApp(dispatcher.APP_ID).(dispatcher.PacketDispatcher) for idx, ns := range config.NameServers { if ns.Address().Family().IsDomain() && ns.Address().Domain() == "localhost" { server.servers[idx] = &LocalNameServer{} } else { server.servers[idx] = NewUDPNameServer(ns, dispatcher) } } if len(config.NameServers) == 0 { server.servers = append(server.servers, &LocalNameServer{}) } return nil }) return server }
func NewOutboundProxy(space app.Space) *OutboundProxy { proxy := new(OutboundProxy) space.InitializeApplication(func() error { if !space.HasApp(proxyman.APP_ID_OUTBOUND_MANAGER) { return errors.New("Proxy: Outbound handler manager not found.") } proxy.outboundManager = space.GetApp(proxyman.APP_ID_OUTBOUND_MANAGER).(proxyman.OutboundHandlerManager) return nil }) return proxy }
// NewServer creates a new Server object. func NewServer(config *ServerConfig, space app.Space, meta *proxy.InboundHandlerMeta) *Server { s := &Server{ config: config, meta: meta, } space.InitializeApplication(func() error { if !space.HasApp(dispatcher.APP_ID) { return errors.New("Socks|Server: Dispatcher is not found in the space.") } s.packetDispatcher = space.GetApp(dispatcher.APP_ID).(dispatcher.PacketDispatcher) return nil }) return s }
func NewRouter(config *RouterRuleConfig, space app.Space) *Router { r := &Router{ config: config, cache: NewRoutingTable(), } space.InitializeApplication(func() error { if !space.HasApp(dns.APP_ID) { log.Error("DNS: Router is not found in the space.") return app.ErrMissingApplication } r.dnsServer = space.GetApp(dns.APP_ID).(dns.Server) return nil }) return r }
func NewDokodemoDoor(config *Config, space app.Space, meta *proxy.InboundHandlerMeta) *DokodemoDoor { d := &DokodemoDoor{ config: config, address: config.GetPredefinedAddress(), port: v2net.Port(config.Port), meta: meta, } space.InitializeApplication(func() error { if !space.HasApp(dispatcher.APP_ID) { return errors.New("Dokodemo: Dispatcher is not found in the space.") } d.packetDispatcher = space.GetApp(dispatcher.APP_ID).(dispatcher.PacketDispatcher) return nil }) return d }
func NewDokodemoDoor(config *Config, space app.Space, meta *proxy.InboundHandlerMeta) *DokodemoDoor { d := &DokodemoDoor{ config: config, address: config.Address, port: config.Port, meta: meta, } space.InitializeApplication(func() error { if !space.HasApp(dispatcher.APP_ID) { log.Error("Dokodemo: Dispatcher is not found in the space.") return app.ErrMissingApplication } d.packetDispatcher = space.GetApp(dispatcher.APP_ID).(dispatcher.PacketDispatcher) return nil }) return d }
func NewFreedomConnection(config *Config, space app.Space, meta *proxy.OutboundHandlerMeta) *FreedomConnection { f := &FreedomConnection{ domainStrategy: config.DomainStrategy, timeout: config.Timeout, meta: meta, } space.InitializeApplication(func() error { if config.DomainStrategy == Config_USE_IP { if !space.HasApp(dns.APP_ID) { log.Error("Freedom: DNS server is not found in the space.") return app.ErrMissingApplication } f.dns = space.GetApp(dns.APP_ID).(dns.Server) } return nil }) return f }