fix(warp): префлайт-проверка Cloudflare вместо XHR timeout
На сетях, где api.cloudflareclient.com недоступен (типичный случай из issue #39), генератор сжигал весь временной бюджет - фронтенд умирал по XHR timeout через 30 секунд, не показывая причины. - префлайт: одна проба (4с connect / 6с max) напрямую и через доступный транспорт; если Cloudflare недостижим - мгновенная понятная ошибка «Cloudflare API недоступен...» вместо минутного зависания - бюджеты ужаты до 20с на call_api и 20с на всю регистрацию, чтобы худший случай укладывался в XHR-таймаут LuCI - все ошибочные выходы теперь печатают JSON-конверт и exit(0): фронтенд парсит data.message и показывает настоящую причину (ненулевой код заставлял его писать безликое Unknown error)
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
#!/usr/bin/env bash
|
||||
set -eo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
WARP="$ROOT_DIR/tachyon/files/usr/lib/service/warp_generator.uc"
|
||||
|
||||
fail() {
|
||||
printf 'FAIL: %s\n' "$1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
[ -f "$WARP" ] || fail "warp_generator.uc not found"
|
||||
|
||||
# 1. Pre-flight probe: when the Cloudflare API is unreachable the generator
|
||||
# must fail fast with an actionable message instead of burning its whole
|
||||
# time budget and tripping the LuCI XHR timeout.
|
||||
grep -Fq 'Cloudflare API недоступен с этого роутера' "$WARP" ||
|
||||
fail "generator must report an unreachable Cloudflare API explicitly"
|
||||
grep -Fq "connect-timeout 4 -m 6" "$WARP" ||
|
||||
fail "pre-flight probe must be bounded to a few seconds"
|
||||
|
||||
# 2. Time budgets must stay under the LuCI XHR timeout (~30 s): per-call 20s,
|
||||
# whole registration 20s, so worst case fits inside one browser request.
|
||||
grep -Fq 'let deadline = now_ms() + 20000;' "$WARP" ||
|
||||
fail "call_api budget must be 20s"
|
||||
grep -Fq 'let registration_deadline = now_ms() + 20000;' "$WARP" ||
|
||||
fail "registration budget must be 20s"
|
||||
|
||||
# 3. Error paths print the JSON envelope and exit 0: the frontend parses
|
||||
# stdout (data.success/message) and shows the real reason; a nonzero exit
|
||||
# makes it discard stdout for "Unknown error".
|
||||
[ "$(grep -c 'exit(1);' "$WARP")" -eq 0 ] ||
|
||||
fail "error paths must exit(0) after printing the JSON error envelope"
|
||||
|
||||
# 4. Clash API calls stay bounded.
|
||||
grep -Fq 'curl -s -m 5 ' "$WARP" ||
|
||||
fail "local Clash API curls must carry -m 5"
|
||||
|
||||
printf 'warp preflight checks passed\n'
|
||||
Reference in New Issue
Block a user