mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-10-10 16:31:19 +07:00
feat(xray/outbounds): TCP probe mode + Test All + timing breakdown
- service.TestOutbound now dispatches on `mode`:
- "tcp": parallel net.DialTimeout to every server/peer endpoint
(vmess/vless/trojan/ss/socks/http/wireguard). No xray spin-up,
no semaphore — safe to run concurrently across outbounds.
- "http" (default): existing temp-xray + SOCKS path, now with an
httptrace.ClientTrace breakdown (DNS / Connect / TLS / TTFB)
alongside the total delay and status code.
- testSemaphore renamed to httpTestSemaphore — only HTTP probes
serialise, TCP runs free.
- TestOutboundResult carries the per-mode extras: timing fields for
HTTP, per-endpoint dial list for TCP, plus a `mode` echo.
- Controller reads `mode` from the form and passes it through.
- useXraySetting: testOutbound accepts mode (default "tcp"); new
testAllOutbounds(mode) runs a worker pool (concurrency 8 for TCP,
1 for HTTP) and skips blackhole / loopback / blocked outbounds —
also skips freedom / dns under TCP since they have no endpoint.
- OutboundsTab: TCP/HTTP radio toggle and a Test All button land in
the toolbar; the per-row ⚡ now uses the selected mode. Results
surface in a popover with the full timing breakdown plus the
endpoint list for TCP probes. Latency header replaces the duplicate
"check" column title.
Practical effect: testing ten outbounds in TCP mode drops from ~50–100s
(serial HTTP) to ~1–2s (parallel dial × 8). HTTP mode stays as the
authoritative probe and now shows where the latency actually lives.
This commit is contained in:
@@ -40,21 +40,26 @@ const {
|
||||
restartResult,
|
||||
outboundsTraffic,
|
||||
outboundTestStates,
|
||||
testingAll,
|
||||
fetchAll,
|
||||
resetOutboundsTraffic,
|
||||
testOutbound,
|
||||
testAllOutbounds,
|
||||
saveAll,
|
||||
resetToDefault,
|
||||
restartXray,
|
||||
applyOutboundsEvent,
|
||||
} = useXraySetting();
|
||||
|
||||
// Live outbounds traffic — pushed by xray_traffic_job every ~10s.
|
||||
useWebSocket({ outbounds: applyOutboundsEvent });
|
||||
|
||||
async function onTestOutbound(idx) {
|
||||
async function onTestOutbound(idx, mode = 'tcp') {
|
||||
const outbound = templateSettings.value?.outbounds?.[idx];
|
||||
if (outbound) await testOutbound(idx, outbound);
|
||||
if (outbound) await testOutbound(idx, outbound, mode);
|
||||
}
|
||||
|
||||
async function onTestAllOutbounds(mode = 'tcp') {
|
||||
await testAllOutbounds(mode);
|
||||
}
|
||||
|
||||
function onDeleteOutbound(idx) {
|
||||
@@ -278,8 +283,10 @@ function confirmRestart() {
|
||||
<UploadOutlined /> <span>{{ t('pages.xray.Outbounds') }}</span>
|
||||
</template>
|
||||
<OutboundsTab :template-settings="templateSettings" :outbounds-traffic="outboundsTraffic"
|
||||
:outbound-test-states="outboundTestStates" :inbound-tags="inboundTags" :is-mobile="isMobile"
|
||||
@reset-traffic="resetOutboundsTraffic" @test="onTestOutbound" @delete="onDeleteOutbound"
|
||||
:outbound-test-states="outboundTestStates" :testing-all="testingAll"
|
||||
:inbound-tags="inboundTags" :is-mobile="isMobile"
|
||||
@reset-traffic="resetOutboundsTraffic" @test="onTestOutbound"
|
||||
@test-all="onTestAllOutbounds" @delete="onDeleteOutbound"
|
||||
@show-warp="showWarp" @show-nord="showNord" />
|
||||
</a-tab-pane>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user