Fix persistent 429: bust JS cache, stagger all API calls sequentially
- Add ?v=2 cache busting to all JS script tags (old version was cached) - Reduce nginx JS cache from 1y to 1h with must-revalidate - fetchChainData now sequential (was 4 parallel requests per chain) - Increase chain detection delay from 150ms to 300ms Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
7c3f825c80
commit
72efe9731b
|
|
@ -15,11 +15,15 @@ RUN echo 'server { \
|
||||||
try_files $uri $uri/ /index.html; \
|
try_files $uri $uri/ /index.html; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
# Cache static assets \
|
# Cache static assets (short TTL for JS to allow updates) \
|
||||||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ { \
|
location ~* \.(png|jpg|jpeg|gif|ico|svg|woff|woff2)$ { \
|
||||||
expires 1y; \
|
expires 1y; \
|
||||||
add_header Cache-Control "public, immutable"; \
|
add_header Cache-Control "public, immutable"; \
|
||||||
} \
|
} \
|
||||||
|
location ~* \.(js|css)$ { \
|
||||||
|
expires 1h; \
|
||||||
|
add_header Cache-Control "public, must-revalidate"; \
|
||||||
|
} \
|
||||||
\
|
\
|
||||||
# Gzip compression \
|
# Gzip compression \
|
||||||
gzip on; \
|
gzip on; \
|
||||||
|
|
|
||||||
|
|
@ -162,7 +162,7 @@ const SafeAPI = (() => {
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// Chain doesn't have this Safe or API error - skip
|
// Chain doesn't have this Safe or API error - skip
|
||||||
}
|
}
|
||||||
await sleep(150);
|
await sleep(300);
|
||||||
}
|
}
|
||||||
|
|
||||||
return results;
|
return results;
|
||||||
|
|
@ -173,12 +173,14 @@ const SafeAPI = (() => {
|
||||||
* Returns { info, balances, outgoing, incoming }
|
* Returns { info, balances, outgoing, incoming }
|
||||||
*/
|
*/
|
||||||
async function fetchChainData(address, chainId) {
|
async function fetchChainData(address, chainId) {
|
||||||
const [info, balances, outgoing, incoming] = await Promise.all([
|
// Fetch sequentially to avoid rate limits
|
||||||
getSafeInfo(address, chainId),
|
const info = await getSafeInfo(address, chainId);
|
||||||
getBalances(address, chainId),
|
await sleep(200);
|
||||||
getAllMultisigTransactions(address, chainId),
|
const balances = await getBalances(address, chainId);
|
||||||
getAllIncomingTransfers(address, chainId),
|
await sleep(200);
|
||||||
]);
|
const outgoing = await getAllMultisigTransactions(address, chainId);
|
||||||
|
await sleep(200);
|
||||||
|
const incoming = await getAllIncomingTransfers(address, chainId);
|
||||||
|
|
||||||
return { chainId, info, balances, outgoing, incoming };
|
return { chainId, info, balances, outgoing, incoming };
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,9 @@
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Multi-Chain Flow | rWallet.online</title>
|
<title>Multi-Chain Flow | rWallet.online</title>
|
||||||
<script src="https://d3js.org/d3.v7.min.js"></script>
|
<script src="https://d3js.org/d3.v7.min.js"></script>
|
||||||
<script src="js/safe-api.js"></script>
|
<script src="js/safe-api.js?v=2"></script>
|
||||||
<script src="js/data-transform.js"></script>
|
<script src="js/data-transform.js?v=2"></script>
|
||||||
<script src="js/router.js"></script>
|
<script src="js/router.js?v=2"></script>
|
||||||
<style>
|
<style>
|
||||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
body {
|
body {
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,9 @@
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Balance River | rWallet.online</title>
|
<title>Balance River | rWallet.online</title>
|
||||||
<script src="https://d3js.org/d3.v7.min.js"></script>
|
<script src="https://d3js.org/d3.v7.min.js"></script>
|
||||||
<script src="js/safe-api.js"></script>
|
<script src="js/safe-api.js?v=2"></script>
|
||||||
<script src="js/data-transform.js"></script>
|
<script src="js/data-transform.js?v=2"></script>
|
||||||
<script src="js/router.js"></script>
|
<script src="js/router.js?v=2"></script>
|
||||||
<style>
|
<style>
|
||||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
body {
|
body {
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@
|
||||||
<title>Single-Chain Flow | rWallet.online</title>
|
<title>Single-Chain Flow | rWallet.online</title>
|
||||||
<script src="https://d3js.org/d3.v7.min.js"></script>
|
<script src="https://d3js.org/d3.v7.min.js"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/d3-sankey@0.12.3/dist/d3-sankey.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/d3-sankey@0.12.3/dist/d3-sankey.min.js"></script>
|
||||||
<script src="js/safe-api.js"></script>
|
<script src="js/safe-api.js?v=2"></script>
|
||||||
<script src="js/data-transform.js"></script>
|
<script src="js/data-transform.js?v=2"></script>
|
||||||
<script src="js/router.js"></script>
|
<script src="js/router.js?v=2"></script>
|
||||||
<style>
|
<style>
|
||||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
body {
|
body {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue