Implement route rules

This commit is contained in:
世界
2022-07-02 22:55:10 +08:00
parent 7c57eb70e8
commit 6eae8e361f
40 changed files with 1220 additions and 145 deletions

View File

@@ -21,27 +21,24 @@ type Service struct {
outbounds []adapter.Outbound
}
func NewService(ctx context.Context, options *option.Options) (*Service, error) {
var logOptions option.LogOption
if options.Log != nil {
logOptions = *options.Log
}
logger, err := log.NewLogger(logOptions)
func NewService(ctx context.Context, options option.Options) (*Service, error) {
logger, err := log.NewLogger(common.PtrValueOrDefault(options.Log))
if err != nil {
return nil, err
}
router := route.NewRouter(logger)
var inbounds []adapter.Inbound
var outbounds []adapter.Outbound
if len(options.Inbounds) > 0 {
for i, inboundOptions := range options.Inbounds {
var inboundService adapter.Inbound
inboundService, err = inbound.New(ctx, router, logger, i, inboundOptions)
if err != nil {
return nil, err
}
inbounds = append(inbounds, inboundService)
router, err := route.NewRouter(ctx, logger, common.PtrValueOrDefault(options.Route))
if err != nil {
return nil, err
}
inbounds := make([]adapter.Inbound, 0, len(options.Inbounds))
outbounds := make([]adapter.Outbound, 0, len(options.Outbounds))
for i, inboundOptions := range options.Inbounds {
var inboundService adapter.Inbound
inboundService, err = inbound.New(ctx, router, logger, i, inboundOptions)
if err != nil {
return nil, err
}
inbounds = append(inbounds, inboundService)
}
for i, outboundOptions := range options.Outbounds {
var outboundService adapter.Outbound
@@ -52,13 +49,9 @@ func NewService(ctx context.Context, options *option.Options) (*Service, error)
outbounds = append(outbounds, outboundService)
}
if len(outbounds) == 0 {
outbounds = append(outbounds, outbound.NewDirect(nil, logger, "direct", &option.DirectOutboundOptions{}))
outbounds = append(outbounds, outbound.NewDirect(nil, logger, "direct", option.DirectOutboundOptions{}))
}
router.UpdateOutbounds(outbounds)
err = router.UpdateRules(options.Routes)
if err != nil {
return nil, err
}
return &Service{
router: router,
logger: logger,