From 10a0c9131c0e4c80f35a56056a0e4718e72d66b2 Mon Sep 17 00:00:00 2001 From: MHSanaei Date: Fri, 12 Jun 2026 01:21:54 +0200 Subject: [PATCH] fix(hysteria): clamp udpIdleTimeout to xray-core's accepted 2-600s range (#5117) The schema and form inputs allowed any value >= 1, but xray-core rejects UdpIdleTimeout outside 2-600 seconds at startup, so an out-of-range value silently killed the whole config. --- frontend/src/pages/inbounds/form/protocols/hysteria.tsx | 2 +- frontend/src/pages/xray/outbounds/transport/hysteria.tsx | 2 +- frontend/src/schemas/protocols/stream/hysteria.ts | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/src/pages/inbounds/form/protocols/hysteria.tsx b/frontend/src/pages/inbounds/form/protocols/hysteria.tsx index 5a9337789..97845d115 100644 --- a/frontend/src/pages/inbounds/form/protocols/hysteria.tsx +++ b/frontend/src/pages/inbounds/form/protocols/hysteria.tsx @@ -19,7 +19,7 @@ export default function HysteriaFields({ form }: { form: FormInstance }) { label={t('pages.inbounds.form.udpIdleTimeout')} name={['streamSettings', 'hysteriaSettings', 'udpIdleTimeout']} > - + diff --git a/frontend/src/pages/xray/outbounds/transport/hysteria.tsx b/frontend/src/pages/xray/outbounds/transport/hysteria.tsx index 8b45d082a..155a04ccd 100644 --- a/frontend/src/pages/xray/outbounds/transport/hysteria.tsx +++ b/frontend/src/pages/xray/outbounds/transport/hysteria.tsx @@ -25,7 +25,7 @@ export default function HysteriaForm({ form }: { form: FormInstance }) { label={t('pages.inbounds.form.udpIdleTimeout')} name={['streamSettings', 'hysteriaSettings', 'udpIdleTimeout']} > - + diff --git a/frontend/src/schemas/protocols/stream/hysteria.ts b/frontend/src/schemas/protocols/stream/hysteria.ts index c1a6efc6d..23698811c 100644 --- a/frontend/src/schemas/protocols/stream/hysteria.ts +++ b/frontend/src/schemas/protocols/stream/hysteria.ts @@ -25,7 +25,8 @@ export type HysteriaMasquerade = z.infer; export const HysteriaStreamSettingsSchema = z.object({ version: z.literal(2).default(2), auth: z.string().default(''), - udpIdleTimeout: z.number().int().min(1).default(60), + // Xray-core rejects values outside 2-600 seconds at startup. + udpIdleTimeout: z.number().int().min(2).max(600).default(60), masquerade: HysteriaMasqueradeSchema.optional(), }); export type HysteriaStreamSettings = z.infer;