clashapi.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package experimental
  2. import (
  3. "context"
  4. "os"
  5. "github.com/sagernet/sing-box/adapter"
  6. "github.com/sagernet/sing-box/log"
  7. "github.com/sagernet/sing-box/option"
  8. "github.com/sagernet/sing/common"
  9. )
  10. type ClashServerConstructor = func(ctx context.Context, router adapter.Router, logFactory log.ObservableFactory, options option.ClashAPIOptions) (adapter.ClashServer, error)
  11. var clashServerConstructor ClashServerConstructor
  12. func RegisterClashServerConstructor(constructor ClashServerConstructor) {
  13. clashServerConstructor = constructor
  14. }
  15. func NewClashServer(ctx context.Context, router adapter.Router, logFactory log.ObservableFactory, options option.ClashAPIOptions) (adapter.ClashServer, error) {
  16. if clashServerConstructor == nil {
  17. return nil, os.ErrInvalid
  18. }
  19. return clashServerConstructor(ctx, router, logFactory, options)
  20. }
  21. func CalculateClashModeList(options option.Options) []string {
  22. var clashMode []string
  23. for _, dnsRule := range common.PtrValueOrDefault(options.DNS).Rules {
  24. if dnsRule.DefaultOptions.ClashMode != "" && !common.Contains(clashMode, dnsRule.DefaultOptions.ClashMode) {
  25. clashMode = append(clashMode, dnsRule.DefaultOptions.ClashMode)
  26. }
  27. for _, defaultRule := range dnsRule.LogicalOptions.Rules {
  28. if defaultRule.ClashMode != "" && !common.Contains(clashMode, defaultRule.ClashMode) {
  29. clashMode = append(clashMode, defaultRule.ClashMode)
  30. }
  31. }
  32. }
  33. for _, rule := range common.PtrValueOrDefault(options.Route).Rules {
  34. if rule.DefaultOptions.ClashMode != "" && !common.Contains(clashMode, rule.DefaultOptions.ClashMode) {
  35. clashMode = append(clashMode, rule.DefaultOptions.ClashMode)
  36. }
  37. for _, defaultRule := range rule.LogicalOptions.Rules {
  38. if defaultRule.ClashMode != "" && !common.Contains(clashMode, defaultRule.ClashMode) {
  39. clashMode = append(clashMode, defaultRule.ClashMode)
  40. }
  41. }
  42. }
  43. return clashMode
  44. }