xray.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import { z } from 'zod';
  2. import { DnsObjectSchema } from './dns';
  3. import {
  4. BalancerObjectSchema,
  5. BalancerStrategySettingsSchema,
  6. BalancerStrategyTypeSchema,
  7. RuleObjectSchema,
  8. } from './routing';
  9. export const XraySettingsValueSchema = z.object({
  10. inbounds: z.array(z.unknown()).optional(),
  11. outbounds: z
  12. .array(
  13. z.object({
  14. tag: z.string().optional(),
  15. protocol: z.string().optional(),
  16. settings: z.unknown().optional(),
  17. streamSettings: z.unknown().optional(),
  18. }).loose(),
  19. )
  20. .optional(),
  21. routing: z.object({
  22. rules: z.array(RuleObjectSchema).optional(),
  23. balancers: z.array(BalancerObjectSchema).optional(),
  24. domainStrategy: z.string().optional(),
  25. }).loose().optional(),
  26. dns: DnsObjectSchema.optional(),
  27. log: z.record(z.string(), z.unknown()).optional(),
  28. policy: z.object({
  29. system: z.record(z.string(), z.boolean()).optional(),
  30. levels: z.record(z.string(), z.record(z.string(), z.unknown())).optional(),
  31. }).loose().optional(),
  32. observatory: z.unknown().optional(),
  33. burstObservatory: z.unknown().optional(),
  34. fakedns: z.unknown().optional(),
  35. }).loose();
  36. export const XrayConfigPayloadSchema = z.object({
  37. xraySetting: XraySettingsValueSchema,
  38. inboundTags: z.array(z.string()).optional(),
  39. clientReverseTags: z.array(z.string()).optional(),
  40. outboundTestUrl: z.string().optional(),
  41. // Subscription outbounds are injected at runtime (not persisted in xraySetting).
  42. // They are provided here so the UI can display them and use their tags in
  43. // balancers / routing rules.
  44. subscriptionOutbounds: z.array(z.unknown()).optional(),
  45. subscriptionOutboundTags: z.array(z.string()).optional(),
  46. }).loose();
  47. export const OutboundTrafficRowSchema = z.object({
  48. tag: z.string(),
  49. up: z.number(),
  50. down: z.number(),
  51. });
  52. export const OutboundTrafficListSchema = z.array(OutboundTrafficRowSchema);
  53. export const OutboundTestResultSchema = z.object({
  54. tag: z.string().optional(),
  55. success: z.boolean(),
  56. delay: z.number().optional(),
  57. error: z.string().optional(),
  58. mode: z.string().optional(),
  59. // HTTP-mode extras: status answered by the test URL plus the httptrace
  60. // timing breakdown (dial to local inbound / target TLS via the outbound /
  61. // time to first byte).
  62. httpStatus: z.number().optional(),
  63. connectMs: z.number().optional(),
  64. tlsMs: z.number().optional(),
  65. ttfbMs: z.number().optional(),
  66. endpoints: z
  67. .array(
  68. z.object({
  69. address: z.string(),
  70. delay: z.number().optional(),
  71. success: z.boolean(),
  72. error: z.string().optional(),
  73. }).loose(),
  74. )
  75. .optional(),
  76. }).loose();
  77. // Batch results from /xray/testOutbounds, aligned with the request order.
  78. export const OutboundTestResultListSchema = z.array(OutboundTestResultSchema);
  79. export const RuleFormSchema = z.object({
  80. domain: z.string(),
  81. ip: z.string(),
  82. port: z.string(),
  83. sourcePort: z.string(),
  84. vlessRoute: z.string(),
  85. network: z.string(),
  86. sourceIP: z.string(),
  87. user: z.string(),
  88. inboundTag: z.array(z.string()),
  89. protocol: z.array(z.string()),
  90. attrs: z.array(z.tuple([z.string(), z.string()])),
  91. outboundTag: z.string(),
  92. balancerTag: z.string(),
  93. });
  94. export const BalancerFormSchema = z.object({
  95. tag: z.string().trim().min(1, 'pages.xray.balancerTagRequired'),
  96. strategy: BalancerStrategyTypeSchema.default('random'),
  97. selector: z.array(z.string()).min(1, 'pages.xray.balancerSelectorRequired'),
  98. fallbackTag: z.string().default(''),
  99. settings: BalancerStrategySettingsSchema.optional(),
  100. });
  101. export const OutboundTagSchema = z
  102. .string()
  103. .trim()
  104. .min(1, 'pages.xray.outboundTagRequired');
  105. export type BalancerFormValues = z.infer<typeof BalancerFormSchema>;
  106. export type RuleFormValues = z.infer<typeof RuleFormSchema>;
  107. export type XraySettingsValue = z.infer<typeof XraySettingsValueSchema>;
  108. export type XrayConfigPayload = z.infer<typeof XrayConfigPayloadSchema>;
  109. export type OutboundTrafficRow = z.infer<typeof OutboundTrafficRowSchema>;
  110. export type OutboundTestResult = z.infer<typeof OutboundTestResultSchema>;