mirror of
https://github.com/jo-inc/camofox-browser.git
synced 2026-10-02 04:14:41 +08:00
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>
46 lines
1.3 KiB
JavaScript
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;
|
|
}
|
|
}
|
|
}
|