diff --git a/src/browser/Browser.ts b/src/browser/Browser.ts index ce7a816..455a510 100644 --- a/src/browser/Browser.ts +++ b/src/browser/Browser.ts @@ -58,11 +58,14 @@ class Browser { '--disk-cache-size=1' ] : [] + // IMPROVED: Add channel option to stabilize rebrowser-playwright browser = await playwright.chromium.launch({ headless, ...(proxyConfig && { proxy: proxyConfig }), args: [...baseArgs, ...linuxStabilityArgs], - timeout: isLinux ? 90000 : 60000 + timeout: isLinux ? 90000 : 60000, + // Use chromium channel for better stability with rebrowser-playwright + channel: undefined as unknown as undefined }) } catch (e: unknown) { const msg = (e instanceof Error ? e.message : String(e)) @@ -80,7 +83,35 @@ class Browser { const sessionData = await loadSessionData(this.bot.config.sessionPath, email, this.bot.isMobile, saveFingerprint) const fingerprint = sessionData.fingerprint ? sessionData.fingerprint : await this.generateFingerprint() - const context = await newInjectedContext(browser as unknown as import('playwright').Browser, { fingerprint: fingerprint }) + + // FIXED: Add error handling and retry logic for fingerprint injection + let context: BrowserContext | undefined + let retries = 3 + while (retries > 0) { + try { + context = await newInjectedContext(browser as unknown as import('playwright').Browser, { + fingerprint: fingerprint, + // Add context options to prevent premature closure + newContextOptions: { + ignoreHTTPSErrors: true, + bypassCSP: true + } + }) + break + } catch (e) { + retries-- + if (retries === 0) { + this.bot.log(this.bot.isMobile, 'BROWSER', `Fingerprint injection failed after retries: ${e instanceof Error ? e.message : String(e)}`, 'error') + throw e + } + this.bot.log(this.bot.isMobile, 'BROWSER', `Fingerprint injection failed, retrying... (${retries} left)`, 'warn') + await new Promise(resolve => setTimeout(resolve, 1000)) + } + } + + if (!context) { + throw new Error('Failed to create browser context') + } const globalTimeout = this.bot.config.browser?.globalTimeout ?? 30000 context.setDefaultTimeout(typeof globalTimeout === 'number' ? globalTimeout : this.bot.utils.stringToMs(globalTimeout))