feat(frontend): add targetStrategy field to the outbound editor

Xray-core added a top-level targetStrategy to OutboundObject that
controls how the destination domain is resolved before dialing
(AsIs/UseIP*/ForceIP*, any protocol). The panel neither offered a
control for it nor preserved the key across the modal's JSON round
trip, so hand-written values were silently dropped on save.

The form now carries targetStrategy next to sendThrough as a select
of the 11 canonical values; the adapter normalizes wire values to
canonical case (the core matches case-insensitively) and omits the
key when unset. Freedom settings additionally read the new
settings-level targetStrategy with domainStrategy as fallback,
mirroring the core, while still emitting the legacy domainStrategy
key so configs keep working on older cores.
This commit is contained in:
MHSanaei
2026-07-02 23:03:43 +02:00
parent 9f760cf0fa
commit 258d8b7344
18 changed files with 113 additions and 10 deletions
+4 -2
View File
@@ -219,11 +219,13 @@ export const OutboundStreamFormSchema = NetworkSettingsSchema
.and(StreamExtrasSchema);
export type OutboundStreamFormValues = z.infer<typeof OutboundStreamFormSchema>;
// Top-level form base: identity (tag, sendThrough), then the per-protocol
// settings DU, then the stream sub-form, then mux.
// Top-level form base: identity (tag, sendThrough, targetStrategy), then
// the per-protocol settings DU, then the stream sub-form, then mux.
// targetStrategy '' means AsIs (omitted from wire).
export const OutboundFormBaseSchema = z.object({
tag: z.string().default(''),
sendThrough: z.string().default(''),
targetStrategy: z.union([OutboundDomainStrategySchema, z.literal('')]).default(''),
streamSettings: OutboundStreamFormSchema.optional(),
mux: MuxFormSchema.default({
enabled: false,