95 lines
2.2 KiB
Go
95 lines
2.2 KiB
Go
package core
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/alireza0/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 {
|
|
c.isRunning = false
|
|
if c.instance != nil {
|
|
return nil
|
|
}
|
|
return c.instance.Close()
|
|
}
|
|
|
|
func (c *Core) IsRunning() bool {
|
|
return c.isRunning
|
|
}
|