waves/others/warmup.mjs
2025-05-19 19:17:06 -07:00

59 lines
1.5 KiB
JavaScript

import http from 'http';
const endpoints = [
'http://localhost:3000/',
'http://localhost:3000/g',
'http://localhost:3000/a'
];
function httpGet(url, timeout = 5000) {
return new Promise((resolve) => {
const req = http.get(url, (res) => {
res.on('data', () => {});
res.on('end', () => {
resolve({ url, statusCode: res.statusCode });
});
});
req.on('error', (e) => {
resolve({ url, error: e.message });
});
req.setTimeout(timeout, () => {
req.abort();
resolve({ url, error: 'Timeout' });
});
});
}
async function warm(retries = 2) {
const results = await Promise.all(endpoints.map(async (url) => {
for (let i = 0; i <= retries; i++) {
const res = await httpGet(url);
if (!res.error) {
console.log(`[WARMUP] ${url}${res.statusCode}`);
return res;
} else {
console.warn(`[WARMUP] ${url} attempt ${i + 1} failed: ${res.error}`);
}
}
return { url, error: `Failed after ${retries + 1} attempts` };
}));
const failed = results.filter(r => r.error);
if (failed.length) {
console.warn(`[WARMUP] Some endpoints failed to warm:`, failed);
} else {
console.log('[WARMUP] All endpoints warmed successfully');
}
}
async function periodicWarmup(intervalMs = 5 * 60 * 1000) {
while (true) {
await warm();
console.log('[WARMUP] Cycle done');
await new Promise(res => setTimeout(res, intervalMs));
}
}
setTimeout(() => periodicWarmup(), 2000);