diff --git a/admin/assets/app.js b/admin/assets/app.js index 8a9ec9b..7ed774d 100644 --- a/admin/assets/app.js +++ b/admin/assets/app.js @@ -2434,6 +2434,86 @@ function toggleUdpgwFields(on) { el.style.pointerEvents = on ? "" : "none"; } + +const XRAY_NATIVE_TUNING_DEFAULTS = { + safe: { + mux_max_sessions: 64, + mux_global_sessions: 8192, + mux_udp_idle_ms: 30000, + mux_udp_read_buffer: 131072, + mux_udp_write_buffer: 131072, + xhttp_max_sessions: 4096, + xhttp_buffered_posts: 32, + xhttp_queue_timeout_ms: 500, + xhttp_flush_ms: 2, + xhttp_flush_bytes: 32768, + h2_max_concurrent_streams: 256, + h2_upload_buffer_conn: 1048576, + h2_upload_buffer_stream: 262144, + trace_packets: false, + }, + "2k": { + mux_max_sessions: 128, + mux_global_sessions: 32768, + mux_udp_idle_ms: 15000, + mux_udp_read_buffer: 262144, + mux_udp_write_buffer: 262144, + xhttp_max_sessions: 16384, + xhttp_buffered_posts: 64, + xhttp_queue_timeout_ms: 250, + xhttp_flush_ms: 5, + xhttp_flush_bytes: 131072, + h2_max_concurrent_streams: 1024, + h2_upload_buffer_conn: 1048576, + h2_upload_buffer_stream: 262144, + trace_packets: false, + }, +}; + +const XRAY_NATIVE_TUNING_FIELDS = { + mux_max_sessions: "cfgXrayMuxMaxSessions", + mux_global_sessions: "cfgXrayMuxGlobalSessions", + mux_udp_idle_ms: "cfgXrayMuxUdpIdleMs", + mux_udp_read_buffer: "cfgXrayMuxUdpRbuf", + mux_udp_write_buffer: "cfgXrayMuxUdpWbuf", + xhttp_max_sessions: "cfgXrayXhttpMaxSessions", + xhttp_buffered_posts: "cfgXrayXhttpBufferedPosts", + xhttp_queue_timeout_ms: "cfgXrayXhttpQueueTimeoutMs", + xhttp_flush_ms: "cfgXrayXhttpFlushMs", + xhttp_flush_bytes: "cfgXrayXhttpFlushBytes", + h2_max_concurrent_streams: "cfgXrayH2MaxStreams", + h2_upload_buffer_conn: "cfgXrayH2UploadConn", + h2_upload_buffer_stream: "cfgXrayH2UploadStream", +}; + +function setXrayNativeTuningDefaults(profile = "2k") { + const t = XRAY_NATIVE_TUNING_DEFAULTS[profile] || XRAY_NATIVE_TUNING_DEFAULTS.safe; + writeXrayNativeTuning(t); +} + +function writeXrayNativeTuning(t = {}) { + const defaults = XRAY_NATIVE_TUNING_DEFAULTS.safe; + Object.entries(XRAY_NATIVE_TUNING_FIELDS).forEach(([key, id]) => { + const el = document.getElementById(id); + if (el) el.value = Number(t[key] || defaults[key] || 0); + }); + const trace = document.getElementById("cfgXrayTracePackets"); + if (trace) trace.checked = !!t.trace_packets; +} + +function readXrayNativeTuning() { + const out = {}; + Object.entries(XRAY_NATIVE_TUNING_FIELDS).forEach(([key, id]) => { + const el = document.getElementById(id); + out[key] = parseInt(el?.value || "0", 10) || 0; + }); + out.trace_packets = !!document.getElementById("cfgXrayTracePackets")?.checked; + return out; +} + +// Inline onclick handlers in index.html need this on window when the bundled JS is served from admin/assets/app.js. +window.setXrayNativeTuningDefaults = setXrayNativeTuningDefaults; + async function loadServerConfig() { const st = document.getElementById("srvCfgStatus"); st.textContent = "Loading…"; @@ -2503,6 +2583,7 @@ async function loadServerConfig() { const x = c.xray || {}; document.getElementById("cfgXrayEnabled").checked = !!x.enabled; document.getElementById("cfgXrayMode").value = xrayModeFromConfig(x); + writeXrayNativeTuning(x.native_tuning || XRAY_NATIVE_TUNING_DEFAULTS.safe); st.textContent = "Config loaded."; } catch (e) { @@ -2576,6 +2657,7 @@ async function saveServerConfig() { api_server: "127.0.0.1:10085", online_window_seconds: 90, stats_poll_seconds: 15, + native_tuning: readXrayNativeTuning(), }, }; diff --git a/admin/index.html b/admin/index.html index 584d1d5..20bf827 100644 --- a/admin/index.html +++ b/admin/index.html @@ -1188,6 +1188,30 @@