Files
3x-ui/frontend/src/lib/xray/outbound-defaults.ts
T
Rouzbeh† b07fad0e69 refactor(wireguard): drop removed workers field (xray v26.6.22) (#5509)
* v3.4.0

* refactor(wireguard): drop removed `workers` field (xray v26.6.22)

xray-core v26.6.22 (PR #6287) removed the WireGuard `workers` (num_workers)
config field; the engine now relies on wireguard-go's internal worker
fallback and no longer reads it. Remove it from the panel so it stops
emitting a key xray ignores.

Removed from the inbound/outbound/outbound-form WireGuard schemas, both
WireGuard forms, the outbound form adapter (both directions) and defaults,
the two affected tests, and the `workers` label in all 13 locales. Existing
configs that still carry workers are simply dropped on parse — no migration
needed since the field had no runtime effect.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Update version

---------

Co-authored-by: MHSanaei <ho3ein.sanaei@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 16:23:02 +02:00

167 lines
5.8 KiB
TypeScript

import { RandomUtil, Wireguard } from '@/utils';
import type { BlackholeOutboundSettings } from '@/schemas/protocols/outbound/blackhole';
import type { DNSOutboundSettings } from '@/schemas/protocols/outbound/dns';
import type { FreedomOutboundSettings } from '@/schemas/protocols/outbound/freedom';
import type { HttpOutboundSettings } from '@/schemas/protocols/outbound/http';
import type { HysteriaOutboundSettings } from '@/schemas/protocols/outbound/hysteria';
import type { LoopbackOutboundSettings } from '@/schemas/protocols/outbound/loopback';
import type { ShadowsocksOutboundSettings } from '@/schemas/protocols/outbound/shadowsocks';
import type { SocksOutboundSettings } from '@/schemas/protocols/outbound/socks';
import type { TrojanOutboundSettings } from '@/schemas/protocols/outbound/trojan';
import type { VlessOutboundSettings } from '@/schemas/protocols/outbound/vless';
import type { VmessOutboundSettings } from '@/schemas/protocols/outbound/vmess';
import type { WireguardOutboundSettings } from '@/schemas/protocols/outbound/wireguard';
// Plain-object factories mirroring `new Outbound.<X>Settings()` from the
// legacy class hierarchy, then `.toJson()`. The output matches the wire
// shape — the same starting state the OutboundFormModal's `ob.settings`
// holds the first time the user picks a protocol.
//
// Required-by-schema fields the legacy class leaves undefined (address,
// port, user-supplied ids/passwords) become empty stubs here. Zod will
// reject the default output until the user fills them in via the form;
// this is intentional and matches the legacy "scaffold object" behavior.
export function createDefaultFreedomOutboundSettings(): FreedomOutboundSettings {
return {};
}
export function createDefaultBlackholeOutboundSettings(): BlackholeOutboundSettings {
return {};
}
export function createDefaultLoopbackOutboundSettings(): LoopbackOutboundSettings {
return { inboundTag: '' };
}
export function createDefaultDNSOutboundSettings(): DNSOutboundSettings {
return {
rewriteNetwork: '',
rewriteAddress: '',
rewritePort: 53,
userLevel: 0,
rules: [],
};
}
export function createDefaultVmessOutboundSettings(): VmessOutboundSettings {
return {
vnext: [{
address: '',
port: 443,
users: [{ id: '', security: 'auto' }],
}],
};
}
export function createDefaultVlessOutboundSettings(): VlessOutboundSettings {
return {
address: '',
port: 443,
id: '',
flow: '',
encryption: 'none',
};
}
export function createDefaultTrojanOutboundSettings(): TrojanOutboundSettings {
return {
servers: [{ address: '', port: 443, password: '' }],
};
}
// Why: legacy constructor leaves method undefined; the form's Select
// snaps to the first option when the user opens it. We pick the same
// modern default the inbound shadowsocks factory uses
// (2022-blake3-aes-128-gcm) so the OutboundFormModal renders a coherent
// initial state instead of an empty Select.
export function createDefaultShadowsocksOutboundSettings(): ShadowsocksOutboundSettings {
return {
servers: [{
address: '',
port: 443,
password: '',
method: '2022-blake3-aes-128-gcm',
}],
};
}
export function createDefaultSocksOutboundSettings(): SocksOutboundSettings {
return {
servers: [{ address: '', port: 1080, users: [] }],
};
}
export function createDefaultHttpOutboundSettings(): HttpOutboundSettings {
return {
servers: [{ address: '', port: 8080, users: [] }],
};
}
interface WireguardOutboundSeed {
secretKey?: string;
}
export function createDefaultWireguardOutboundSettings(
seed: WireguardOutboundSeed = {},
): WireguardOutboundSettings {
const secretKey = seed.secretKey ?? Wireguard.generateKeypair().privateKey;
return {
mtu: 1420,
secretKey,
address: [],
peers: [{
publicKey: '',
allowedIPs: ['0.0.0.0/0', '::/0'],
endpoint: '',
}],
noKernelTun: false,
};
}
export function createDefaultHysteriaOutboundSettings(): HysteriaOutboundSettings {
return { address: '', port: 443, version: 2 };
}
export type AnyOutboundSettings =
| BlackholeOutboundSettings
| DNSOutboundSettings
| FreedomOutboundSettings
| HttpOutboundSettings
| HysteriaOutboundSettings
| LoopbackOutboundSettings
| ShadowsocksOutboundSettings
| SocksOutboundSettings
| TrojanOutboundSettings
| VlessOutboundSettings
| VmessOutboundSettings
| WireguardOutboundSettings;
// Protocol-aware dispatch. Mirrors the legacy
// `Outbound.Settings.getSettings(protocol)` switch. Note: the inbound
// dispatcher returns `null` for unknown protocols and so does this one,
// keeping the contract identical so callers can stay protocol-agnostic.
//
// The `RandomUtil` reference is held to silence unused-import warnings
// when no per-call randomization happens at the dispatcher level —
// individual factories may pull from it via their own seeds.
export function createDefaultOutboundSettings(protocol: string): AnyOutboundSettings | null {
void RandomUtil;
switch (protocol) {
case 'freedom': return createDefaultFreedomOutboundSettings();
case 'blackhole': return createDefaultBlackholeOutboundSettings();
case 'dns': return createDefaultDNSOutboundSettings();
case 'vmess': return createDefaultVmessOutboundSettings();
case 'vless': return createDefaultVlessOutboundSettings();
case 'trojan': return createDefaultTrojanOutboundSettings();
case 'shadowsocks': return createDefaultShadowsocksOutboundSettings();
case 'socks': return createDefaultSocksOutboundSettings();
case 'http': return createDefaultHttpOutboundSettings();
case 'wireguard': return createDefaultWireguardOutboundSettings();
case 'hysteria': return createDefaultHysteriaOutboundSettings();
case 'loopback': return createDefaultLoopbackOutboundSettings();
default: return null;
}
}