package core import ( "context" "s-ui/logger" sb "github.com/sagernet/sing-box" "github.com/sagernet/sing-box/adapter" _ "github.com/sagernet/sing-box/experimental/clashapi" _ "github.com/sagernet/sing-box/experimental/v2rayapi" "github.com/sagernet/sing-box/log" "github.com/sagernet/sing-box/option" _ "github.com/sagernet/sing-box/transport/v2rayquic" _ "github.com/sagernet/sing-dns/quic" "github.com/sagernet/sing/service" ) var ( globalCtx context.Context inbound_manager adapter.InboundManager outbound_manager adapter.OutboundManager service_manager adapter.ServiceManager endpoint_manager adapter.EndpointManager router adapter.Router statsTracker *StatsTracker connTracker *ConnTracker factory log.Factory ) type Core struct { isRunning bool instance *Box } func NewCore() *Core { globalCtx = context.Background() globalCtx = sb.Context(globalCtx, InboundRegistry(), OutboundRegistry(), EndpointRegistry(), DNSTransportRegistry(), ServiceRegistry()) return &Core{ isRunning: false, instance: nil, } } func (c *Core) GetCtx() context.Context { return globalCtx } func (c *Core) GetInstance() *Box { return c.instance } func (c *Core) Start(sbConfig []byte) error { var opt option.Options err := opt.UnmarshalJSONContext(globalCtx, sbConfig) if err != nil { logger.Error("Unmarshal config err:", err.Error()) } c.instance, err = NewBox(Options{ Context: globalCtx, Options: opt, }) if err != nil { return err } err = c.instance.Start() if err != nil { return err } globalCtx = service.ContextWith(globalCtx, c) inbound_manager = service.FromContext[adapter.InboundManager](globalCtx) outbound_manager = service.FromContext[adapter.OutboundManager](globalCtx) service_manager = service.FromContext[adapter.ServiceManager](globalCtx) endpoint_manager = service.FromContext[adapter.EndpointManager](globalCtx) router = service.FromContext[adapter.Router](globalCtx) c.isRunning = true return nil } func (c *Core) Stop() error { if c.isRunning { c.isRunning = false return c.instance.Close() } return nil } func (c *Core) IsRunning() bool { return c.isRunning }