routing.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { z } from 'zod';
  2. export const RuleProtocolSchema = z.enum(['http', 'tls', 'quic', 'bittorrent']);
  3. export type RuleProtocol = z.infer<typeof RuleProtocolSchema>;
  4. const PortValueSchema = z.union([z.number().int().min(0).max(65535), z.string()]);
  5. export const RuleWebhookSchema = z.object({
  6. url: z.string(),
  7. deduplication: z.number().int().min(0).optional(),
  8. headers: z.record(z.string(), z.string()).optional(),
  9. });
  10. export type RuleWebhook = z.infer<typeof RuleWebhookSchema>;
  11. export const RuleObjectSchema = z.object({
  12. type: z.literal('field').default('field'),
  13. enabled: z.boolean().optional(),
  14. comment: z.string().optional(),
  15. domain: z.array(z.string()).optional(),
  16. ip: z.array(z.string()).optional(),
  17. port: PortValueSchema.optional(),
  18. sourcePort: PortValueSchema.optional(),
  19. localPort: PortValueSchema.optional(),
  20. network: z.string().optional(),
  21. sourceIP: z.array(z.string()).optional(),
  22. localIP: z.array(z.string()).optional(),
  23. user: z.array(z.string()).optional(),
  24. vlessRoute: PortValueSchema.optional(),
  25. inboundTag: z.array(z.string()).optional(),
  26. protocol: z.array(z.string()).optional(),
  27. attrs: z.record(z.string(), z.string()).optional(),
  28. process: z.array(z.string()).optional(),
  29. outboundTag: z.string().optional(),
  30. balancerTag: z.string().optional(),
  31. ruleTag: z.string().optional(),
  32. webhook: RuleWebhookSchema.optional(),
  33. });
  34. export type RuleObject = z.infer<typeof RuleObjectSchema>;
  35. export const BalancerStrategyTypeSchema = z.enum([
  36. 'random',
  37. 'roundRobin',
  38. 'leastPing',
  39. 'leastLoad',
  40. ]);
  41. export type BalancerStrategyType = z.infer<typeof BalancerStrategyTypeSchema>;
  42. export const BalancerCostObjectSchema = z.object({
  43. regexp: z.boolean().default(false),
  44. match: z.string(),
  45. value: z.number(),
  46. });
  47. export type BalancerCostObject = z.infer<typeof BalancerCostObjectSchema>;
  48. export const BalancerStrategySettingsSchema = z.object({
  49. expected: z.number().int().min(0).optional(),
  50. maxRTT: z.string().optional(),
  51. tolerance: z.number().min(0).max(1).optional(),
  52. baselines: z.array(z.string()).optional(),
  53. costs: z.array(BalancerCostObjectSchema).optional(),
  54. });
  55. export type BalancerStrategySettings = z.infer<typeof BalancerStrategySettingsSchema>;
  56. export const BalancerStrategySchema = z.object({
  57. type: BalancerStrategyTypeSchema.default('random'),
  58. settings: BalancerStrategySettingsSchema.optional(),
  59. });
  60. export type BalancerStrategy = z.infer<typeof BalancerStrategySchema>;
  61. export const BalancerObjectSchema = z.object({
  62. tag: z.string().trim().min(1),
  63. selector: z.array(z.string()).min(1),
  64. fallbackTag: z.string().optional(),
  65. strategy: BalancerStrategySchema.optional(),
  66. });
  67. export type BalancerObject = z.infer<typeof BalancerObjectSchema>;