mirror of
https://github.com/garrytan/gstack.git
synced 2026-05-19 19:02:29 +08:00
fix: startup health check retries every 1s instead of 10s
Root cause: extension service worker starts before Bun.serve() is listening. First checkHealth() fails, next attempt is 10 seconds later. User stares at "Connecting..." for 10 seconds. Fix: retry every 1s for up to 15 attempts on startup, then switch to 10s polling once connected (or after 15s gives up). Sidebar should connect within 1-2 seconds of server becoming available. 3 new tests verify the fast-retry → slow-poll transition.
This commit is contained in:
@@ -1348,6 +1348,30 @@ describe('sidebar auth race prevention', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('startup health check fast-retry', () => {
|
||||||
|
const bgSrc = fs.readFileSync(path.join(ROOT, '..', 'extension', 'background.js'), 'utf-8');
|
||||||
|
|
||||||
|
test('initial health check retries every 1s (not 10s)', () => {
|
||||||
|
// The server may not be listening when the extension starts because
|
||||||
|
// Chromium launches before Bun.serve(). A 10s gap means the user
|
||||||
|
// stares at "Connecting..." for 10 seconds. 1s retry fixes this.
|
||||||
|
expect(bgSrc).toContain('startupAttempts');
|
||||||
|
expect(bgSrc).toContain('setInterval(async ()');
|
||||||
|
// Fast retry uses 1000ms, not the 10000ms slow poll
|
||||||
|
expect(bgSrc).toContain('}, 1000);');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('startup retry stops after connection or max attempts', () => {
|
||||||
|
expect(bgSrc).toContain('isConnected || startupAttempts >= 15');
|
||||||
|
expect(bgSrc).toContain('clearInterval(startupCheck)');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('slow 10s polling only starts after startup phase completes', () => {
|
||||||
|
expect(bgSrc).toContain('if (!healthInterval)');
|
||||||
|
expect(bgSrc).toContain('setInterval(checkHealth, 10000)');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('sidebar debug visibility when stuck', () => {
|
describe('sidebar debug visibility when stuck', () => {
|
||||||
const spSrc = fs.readFileSync(path.join(ROOT, '..', 'extension', 'sidepanel.js'), 'utf-8');
|
const spSrc = fs.readFileSync(path.join(ROOT, '..', 'extension', 'sidepanel.js'), 'utf-8');
|
||||||
|
|
||||||
|
|||||||
@@ -454,10 +454,25 @@ chrome.tabs.onActivated.addListener((activeInfo) => {
|
|||||||
|
|
||||||
// ─── Startup ────────────────────────────────────────────────────
|
// ─── Startup ────────────────────────────────────────────────────
|
||||||
|
|
||||||
// Load auth token BEFORE first health poll (token no longer in /health response)
|
// Fast-retry health check on startup. The server may not be listening yet
|
||||||
|
// (Chromium launches before Bun.serve starts). Retry every 1s for the
|
||||||
|
// first 15 seconds, then switch to 10s polling.
|
||||||
loadAuthToken().then(() => {
|
loadAuthToken().then(() => {
|
||||||
loadPort().then(() => {
|
loadPort().then(() => {
|
||||||
checkHealth();
|
let startupAttempts = 0;
|
||||||
healthInterval = setInterval(checkHealth, 10000);
|
const startupCheck = setInterval(async () => {
|
||||||
|
startupAttempts++;
|
||||||
|
await checkHealth();
|
||||||
|
if (isConnected || startupAttempts >= 15) {
|
||||||
|
clearInterval(startupCheck);
|
||||||
|
// Switch to slow polling now that we're connected (or gave up)
|
||||||
|
if (!healthInterval) {
|
||||||
|
healthInterval = setInterval(checkHealth, 10000);
|
||||||
|
}
|
||||||
|
if (!isConnected) {
|
||||||
|
console.log('[gstack] Startup health checks failed after 15 attempts, falling back to 10s polling');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 1000);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user