fix(hub): restore pre-WS quote path and relieve Gate/account contention

Two audit rounds after WS rollback: lighten hub options snapshot, cache hub balances without extra fetch_balance, soft-poll single-flight, and document fixes in R1/R2 reports.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-08-11 12:30:27 +08:00
parent d592632834
commit bab42b1b53
12 changed files with 209 additions and 39 deletions
+17 -5
View File
@@ -40,6 +40,7 @@
let chainSoftTimer = null;
let lastChainSoftAt = 0;
let chainQuotedAt = 0;
let chainLoadInFlight = false;
let pendingTtlSeconds = 600;
const POSITIONS_STALE_MS = 45000;
const PENDING_POLL_MS = 8000;
@@ -669,6 +670,7 @@
function softRefreshChainThrottled(force) {
if (document.hidden) return;
if (!document.getElementById("options-root")) return;
if (chainLoadInFlight) return;
const now = Date.now();
if (!force && now - lastChainSoftAt < CHAIN_SOFT_POLL_MS) return;
lastChainSoftAt = now;
@@ -1239,11 +1241,16 @@
async function loadChain(opts) {
const soft = !!(opts && opts.soft);
// soft 门禁必须在 seq++ 之前,否则叠刷会抬高 seq 导致 inFlight 永不清理
if (chainLoadInFlight && soft) return;
const uly = state.underlying;
const seq = ++chainLoadSeq;
const btn = document.getElementById("opt-load-chain");
const hadChain = chainHasExpiries(state.chain) && state.chain.underlying === uly;
chainLoadInFlight = true;
if (btn && !soft) btn.disabled = true;
if (!soft) {
// 已有链时不先清空,避免刷新白屏
if (!soft && !hadChain) {
setExpirySelectStatus("加载到期日中…");
const tbody = document.getElementById("opt-strike-tbody");
if (tbody) {
@@ -1254,7 +1261,9 @@
try {
let d = null;
let lastMsg = "";
for (let attempt = 0; attempt < 3; attempt++) {
// soft 只试 1 次,避免与 15s 轮询叠加重试打爆 OKX
const maxAttempts = soft ? 1 : 3;
for (let attempt = 0; attempt < maxAttempts; attempt++) {
if (seq !== chainLoadSeq) return;
d = await apiJson("/api/options/chain?underlying=" + encodeURIComponent(uly));
if (seq !== chainLoadSeq) return;
@@ -1264,8 +1273,8 @@
!!(d && d.rate_limited) ||
/50011|Too Many Requests|过于频繁/i.test(String(lastMsg || ""));
d = null;
if (attempt < 2) {
if (!soft) {
if (attempt < maxAttempts - 1) {
if (!soft && !hadChain) {
setExpirySelectStatus(
rateLimited ? "OKX 限频,稍后重试…" : "重试加载到期日…"
);
@@ -1339,7 +1348,10 @@
"</td></tr>";
}
} finally {
if (seq === chainLoadSeq && btn) btn.disabled = false;
if (seq === chainLoadSeq) {
chainLoadInFlight = false;
if (btn) btn.disabled = false;
}
}
}