Add retry logic when launching browser in NPM driver

main
Elbert Alias 1 year ago
parent d16838e440
commit 9dfa1084f2

@ -369,40 +369,47 @@ class Driver {
} }
async init() { async init() {
this.log('Launching browser...') for (let attempt = 1; attempt <= 3; attempt++) {
this.log(`Launching browser (attempt ${attempt})...`)
try { try {
if (CHROMIUM_WEBSOCKET) { if (CHROMIUM_WEBSOCKET) {
this.browser = await puppeteer.connect({ this.browser = await puppeteer.connect({
ignoreHTTPSErrors: true, ignoreHTTPSErrors: true,
acceptInsecureCerts: true, acceptInsecureCerts: true,
browserWSEndpoint: CHROMIUM_WEBSOCKET, browserWSEndpoint: CHROMIUM_WEBSOCKET,
}) })
} else { } else {
this.browser = await puppeteer.launch({ this.browser = await puppeteer.launch({
ignoreHTTPSErrors: true, ignoreHTTPSErrors: true,
acceptInsecureCerts: true, acceptInsecureCerts: true,
args: chromiumArgs, args: chromiumArgs,
executablePath: CHROMIUM_BIN, executablePath: CHROMIUM_BIN,
}) timeout: 5000,
} })
}
this.browser.on('disconnected', async () => { break
this.log('Browser disconnected') } catch (error) {
this.log(error)
if (!this.destroyed) { if (attempt >= 3) {
try { throw new Error(error.message || error.toString())
await this.init()
} catch (error) {
this.log(error)
}
} }
}) }
} catch (error) {
this.log(error)
throw new Error(error.message || error.toString())
} }
this.browser.on('disconnected', async () => {
this.log('Browser disconnected')
if (!this.destroyed) {
try {
await this.init()
} catch (error) {
this.log(error)
}
}
})
} }
async destroy() { async destroy() {
@ -537,7 +544,7 @@ class Site {
promise, promise,
fallback, fallback,
errorMessage = 'Operation took too long to complete', errorMessage = 'Operation took too long to complete',
maxWait = Math.min(this.options.maxWait, 1000) maxWait = Math.min(this.options.maxWait, 3000)
) { ) {
let timeout = null let timeout = null
@ -1260,7 +1267,7 @@ class Site {
const body = await get(new URL(path, url.href), { const body = await get(new URL(path, url.href), {
userAgent: this.options.userAgent, userAgent: this.options.userAgent,
timeout: Math.min(this.options.maxWait, 1000), timeout: Math.min(this.options.maxWait, 3000),
}) })
this.log(`Probe ok (${path})`) this.log(`Probe ok (${path})`)