inbound-form.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { z } from 'zod';
  2. import { InboundPortSchema, SniffingSchema } from '@/schemas/primitives';
  3. import { InboundSettingsSchema } from '@/schemas/protocols/inbound';
  4. import { SecuritySettingsSchema } from '@/schemas/protocols/security';
  5. import { NetworkSettingsSchema, StreamExtrasSchema } from '@/schemas/protocols/stream';
  6. export const InboundStreamFormSchema = NetworkSettingsSchema
  7. .and(SecuritySettingsSchema)
  8. .and(StreamExtrasSchema);
  9. export type InboundStreamFormValues = z.infer<typeof InboundStreamFormSchema>;
  10. export const TrafficResetSchema = z.enum(['never', 'hourly', 'daily', 'weekly', 'monthly']);
  11. export type TrafficReset = z.infer<typeof TrafficResetSchema>;
  12. export const ShareAddrStrategySchema = z.enum(['node', 'listen', 'custom']);
  13. export type ShareAddrStrategy = z.infer<typeof ShareAddrStrategySchema>;
  14. // Db-side fields layered on top of the xray slice. These mirror the
  15. // DBInbound model — they live in the SQL row, not in xray's config.
  16. export const InboundDbFieldsSchema = z.object({
  17. up: z.number().int().min(0).default(0),
  18. down: z.number().int().min(0).default(0),
  19. total: z.number().int().min(0).default(0),
  20. trafficReset: TrafficResetSchema.default('never'),
  21. lastTrafficResetTime: z.number().int().default(0),
  22. nodeId: z.number().int().nullable().optional(),
  23. shareAddrStrategy: ShareAddrStrategySchema.default('node'),
  24. shareAddr: z.string().default(''),
  25. subSortIndex: z.number().int().min(1).default(1),
  26. });
  27. export type InboundDbFields = z.infer<typeof InboundDbFieldsSchema>;
  28. export const InboundFormBaseSchema = z.object({
  29. remark: z.string().default(''),
  30. enable: z.boolean().default(true),
  31. port: InboundPortSchema,
  32. listen: z.string().default(''),
  33. tag: z.string().default(''),
  34. expiryTime: z.number().int().default(0),
  35. clientStats: z.string().optional(),
  36. sniffing: SniffingSchema.default({
  37. enabled: false,
  38. destOverride: ['http', 'tls', 'quic', 'fakedns'],
  39. metadataOnly: false,
  40. routeOnly: false,
  41. ipsExcluded: [],
  42. domainsExcluded: [],
  43. }),
  44. streamSettings: InboundStreamFormSchema.optional(),
  45. });
  46. export type InboundFormBase = z.infer<typeof InboundFormBaseSchema>;
  47. // Full form values = base + db fields + protocol-discriminated settings.
  48. // Consumers narrow on `.protocol` to access the matching settings branch.
  49. export const InboundFormSchema = InboundFormBaseSchema
  50. .and(InboundDbFieldsSchema)
  51. .and(InboundSettingsSchema);
  52. export type InboundFormValues = z.infer<typeof InboundFormSchema>;
  53. export const FallbackRowSchema = z.object({
  54. rowKey: z.string(),
  55. childId: z.number().int().nullable(),
  56. name: z.string().default(''),
  57. alpn: z.string().default(''),
  58. path: z.string().default(''),
  59. dest: z.string().default(''),
  60. xver: z.number().int().min(0).max(2).default(0),
  61. });
  62. export type FallbackRow = z.infer<typeof FallbackRowSchema>;