diff --git a/src/BrowserFetcher.ts b/src/BrowserFetcher.ts index cfcb8567e1eed..1f607339d751a 100644 --- a/src/BrowserFetcher.ts +++ b/src/BrowserFetcher.ts @@ -321,10 +321,43 @@ function install(archivePath: string, folderPath: string): Promise { } async function extractZip(zipPath: string, folderPath: string): Promise { - try { - await extract(zipPath, {dir: folderPath}); - } catch (error) { - return error; + const nodeVersion = process.version; + + /* There is currently a bug with extract-zip and Node v14.0.0 that + * causes extractZip to silently fail: + * https://github.com/puppeteer/puppeteer/issues/5719 + * + * Rather than silenty fail if the user is on Node 14 we instead + * detect that and throw an error directing the user to that bug. The + * rejection message below is surfaced to the user in the command + * line. + * + * The issue seems to be in streams never resolving so we wrap the + * call in a timeout and give it 100ms to resolve before deciding on + * an error. + * + * If the user is on Node < 14 we maintain the behaviour we had before + * this patch. + */ + if (nodeVersion === 'v14.0.0') { + await new Promise((resolve, reject) => { + let extractedResolved = false; + setTimeout(async() => { + await extract(zipPath, {dir: folderPath}); + extractedResolved = true; + }, 10); + + if (extractedResolved) + resolve(); + else + reject(`Puppeteer currently does not work on Node v14 due to an upstream bug. Please see: https://github.com/puppeteer/puppeteer/issues/5719 for details.`); + }); + } else { + try { + await extract(zipPath, {dir: folderPath}); + } catch (error) { + return error; + } } }