Files
camofox-browser/lib/new-page-recovery.js
Pradeep Elankumaran 700a3bf4f5 fix(sessions): lease pages during creation
Refines the session-reaping approach from #8319 without adding admission queues or HTTP 429 behavior.\n\nFixes #8555\nRefs #8319\n\nCo-authored-by: batumilove <batumilove@users.noreply.github.com>
2026-08-01 17:10:58 -07:00

46 lines
1.3 KiB
JavaScript

import { acquirePageLease, releasePageLease, setLeasedPage } from './page-lease.js';
export async function createPageWithSessionRecovery({
userId,
session,
trace = false,
timeoutMs,
withTimeout,
isTimeoutError,
isDeadContextError,
currentSession,
destroySession,
getSession,
log,
}) {
let lease = acquirePageLease(session);
try {
const page = setLeasedPage(lease, await withTimeout(session.context.newPage(), timeoutMs, 'new page'));
return { session, page, lease };
} catch (err) {
releasePageLease(session, lease);
if (!isTimeoutError(err) && !isDeadContextError(err)) throw err;
log('warn', 'new page failed, recreating user session', {
userId,
error: err.message,
});
// Another request may already have replaced this session. Never tear down
// a newer healthy context while recovering the one that failed.
if (currentSession() === session) {
await destroySession(userId, { reason: 'new_page_unresponsive' });
}
session = await getSession(userId, { trace });
lease = acquirePageLease(session);
try {
const page = setLeasedPage(lease, await withTimeout(session.context.newPage(), timeoutMs, 'new page retry'));
return { session, page, lease };
} catch (retryErr) {
releasePageLease(session, lease);
throw retryErr;
}
}
}