provider: Add override_dialer_options option

This commit is contained in:
Shtorm
2026-09-05 09:23:55 +03:00
parent 64605fc47a
commit 7afda58818
6 changed files with 44 additions and 20 deletions
+15 -5
View File
@@ -36,11 +36,12 @@ type Adapter struct {
callbackAccess sync.Mutex callbackAccess sync.Mutex
callbacks list.List[adapter.ProviderUpdateCallback] callbacks list.List[adapter.ProviderUpdateCallback]
link string link string
enabled bool enabled bool
removeEmojis bool removeEmojis bool
timeout time.Duration overrideDialerOptions *option.DialerOptions
interval time.Duration timeout time.Duration
interval time.Duration
} }
func NewAdapter(ctx context.Context, router adapter.Router, outbound adapter.OutboundManager, logFactory log.Factory, logger log.ContextLogger, providerTag string, providerType string, options option.ProviderHealthCheckOptions) Adapter { func NewAdapter(ctx context.Context, router adapter.Router, outbound adapter.OutboundManager, logFactory log.Factory, logger log.ContextLogger, providerTag string, providerType string, options option.ProviderHealthCheckOptions) Adapter {
@@ -75,6 +76,10 @@ func (a *Adapter) SetRemoveEmojis(remove bool) {
a.removeEmojis = remove a.removeEmojis = remove
} }
func (a *Adapter) SetOverrideDialerOptions(options *option.DialerOptions) {
a.overrideDialerOptions = options
}
func (a *Adapter) Start() error { func (a *Adapter) Start() error {
a.history = service.PtrFromContext[urltest.HistoryStorage](a.ctx) a.history = service.PtrFromContext[urltest.HistoryStorage](a.ctx)
if a.history == nil { if a.history == nil {
@@ -119,6 +124,11 @@ func (a *Adapter) UpdateOutbounds(oldOpts []option.Outbound, newOpts []option.Ou
oldOptByTag[opt.Tag] = opt oldOptByTag[opt.Tag] = opt
} }
for i, opt := range newOpts { for i, opt := range newOpts {
if a.overrideDialerOptions != nil {
if wrapper, ok := opt.Options.(option.DialerOptionsWrapper); ok {
wrapper.ReplaceDialerOptions(*a.overrideDialerOptions)
}
}
var tag string var tag string
if opt.Tag != "" { if opt.Tag != "" {
tag = F.ToString(a.providerTag, "/", opt.Tag) tag = F.ToString(a.providerTag, "/", opt.Tag)
+4
View File
@@ -50,6 +50,10 @@
"path": "subscriptions/my-sub.txt", "path": "subscriptions/my-sub.txt",
// Remove emoji flags from proxy names. // Remove emoji flags from proxy names.
"remove_emojis": true, "remove_emojis": true,
// Override dial fields on every outbound from this provider.
"override_dialer_options": {
// Dial fields
},
"health_check": { "health_check": {
"enabled": true, "enabled": true,
"url": "https://www.gstatic.com/generate_204", "url": "https://www.gstatic.com/generate_204",
+4
View File
@@ -82,6 +82,10 @@
"include": "(?i)hk|jp|sg|us", "include": "(?i)hk|jp|sg|us",
// Remove emoji flags from proxy names. // Remove emoji flags from proxy names.
"remove_emojis": true, "remove_emojis": true,
// Override dial fields on every outbound from this provider.
"override_dialer_options": {
// Dial fields
},
"health_check": { "health_check": {
"enabled": true, "enabled": true,
"url": "https://www.gstatic.com/generate_204", "url": "https://www.gstatic.com/generate_204",
+18 -15
View File
@@ -47,28 +47,31 @@ func (h *Provider) UnmarshalJSONContext(ctx context.Context, content []byte) err
} }
type ProviderLocalOptions struct { type ProviderLocalOptions struct {
Path string `json:"path"` Path string `json:"path"`
RemoveEmojis bool `json:"remove_emojis,omitempty"` RemoveEmojis bool `json:"remove_emojis,omitempty"`
HealthCheck ProviderHealthCheckOptions `json:"health_check,omitempty"` HealthCheck ProviderHealthCheckOptions `json:"health_check,omitempty"`
OverrideDialerOptions *DialerOptions `json:"override_dialer_options,omitempty"`
} }
type ProviderRemoteOptions struct { type ProviderRemoteOptions struct {
URL string `json:"url"` URL string `json:"url"`
UserAgent string `json:"user_agent,omitempty"` UserAgent string `json:"user_agent,omitempty"`
Headers badoption.HTTPHeader `json:"headers,omitempty"` Headers badoption.HTTPHeader `json:"headers,omitempty"`
DownloadDetour string `json:"download_detour,omitempty"` DownloadDetour string `json:"download_detour,omitempty"`
UpdateInterval badoption.Duration `json:"update_interval,omitempty"` UpdateInterval badoption.Duration `json:"update_interval,omitempty"`
Exclude *badoption.Regexp `json:"exclude,omitempty"` Exclude *badoption.Regexp `json:"exclude,omitempty"`
Include *badoption.Regexp `json:"include,omitempty"` Include *badoption.Regexp `json:"include,omitempty"`
RemoveEmojis bool `json:"remove_emojis,omitempty"` RemoveEmojis bool `json:"remove_emojis,omitempty"`
HealthCheck ProviderHealthCheckOptions `json:"health_check,omitempty"` HealthCheck ProviderHealthCheckOptions `json:"health_check,omitempty"`
OverrideDialerOptions *DialerOptions `json:"override_dialer_options,omitempty"`
} }
type ProviderInlineOptions struct { type ProviderInlineOptions struct {
Outbounds []Outbound `json:"outbounds,omitempty"` Outbounds []Outbound `json:"outbounds,omitempty"`
RemoveEmojis bool `json:"remove_emojis,omitempty"` RemoveEmojis bool `json:"remove_emojis,omitempty"`
HealthCheck ProviderHealthCheckOptions `json:"health_check,omitempty"` HealthCheck ProviderHealthCheckOptions `json:"health_check,omitempty"`
OverrideDialerOptions *DialerOptions `json:"override_dialer_options,omitempty"`
} }
type ProviderHealthCheckOptions struct { type ProviderHealthCheckOptions struct {
+2
View File
@@ -52,6 +52,7 @@ func NewProviderInline(ctx context.Context, router adapter.Router, logFactory lo
logger: logger, logger: logger,
} }
p.SetRemoveEmojis(options.RemoveEmojis) p.SetRemoveEmojis(options.RemoveEmojis)
p.SetOverrideDialerOptions(options.OverrideDialerOptions)
p.UpdateOutbounds(nil, options.Outbounds) p.UpdateOutbounds(nil, options.Outbounds)
return p, nil return p, nil
} }
@@ -71,6 +72,7 @@ func NewProviderLocal(ctx context.Context, router adapter.Router, logFactory log
provider: service.FromContext[adapter.ProviderManager](ctx), provider: service.FromContext[adapter.ProviderManager](ctx),
} }
provider.SetRemoveEmojis(options.RemoveEmojis) provider.SetRemoveEmojis(options.RemoveEmojis)
provider.SetOverrideDialerOptions(options.OverrideDialerOptions)
filePath := filemanager.BasePath(ctx, options.Path) filePath := filemanager.BasePath(ctx, options.Path)
provider.path, _ = filepath.Abs(filePath) provider.path, _ = filepath.Abs(filePath)
watcher, err := fswatch.NewWatcher(fswatch.Options{ watcher, err := fswatch.NewWatcher(fswatch.Options{
+1
View File
@@ -101,6 +101,7 @@ func NewProviderRemote(ctx context.Context, router adapter.Router, logFactory lo
include: (*regexp.Regexp)(options.Include), include: (*regexp.Regexp)(options.Include),
} }
p.SetRemoveEmojis(options.RemoveEmojis) p.SetRemoveEmojis(options.RemoveEmojis)
p.SetOverrideDialerOptions(options.OverrideDialerOptions)
return p, nil return p, nil
} }