Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: remove node@14 specific extract timeout #5816

Merged
merged 1 commit into from May 7, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
47 changes: 2 additions & 45 deletions src/BrowserFetcher.ts
Expand Up @@ -22,7 +22,7 @@ import * as childProcess from 'child_process';
import * as https from 'https';
import * as http from 'http';

import * as extract from 'extract-zip';
import * as extractZip from 'extract-zip';
import * as debug from 'debug';
import * as removeRecursive from 'rimraf';
import * as URL from 'url';
Expand Down Expand Up @@ -307,7 +307,7 @@ function downloadFile(url: string, destinationPath: string, progressCallback: (x
function install(archivePath: string, folderPath: string): Promise<unknown> {
debugFetcher(`Installing ${archivePath} to ${folderPath}`);
if (archivePath.endsWith('.zip'))
return extractZip(archivePath, folderPath);
return extractZip(archivePath, {dir: folderPath});
else if (archivePath.endsWith('.tar.bz2'))
return extractTar(archivePath, folderPath);
else if (archivePath.endsWith('.dmg'))
Expand All @@ -316,49 +316,6 @@ function install(archivePath: string, folderPath: string): Promise<unknown> {
throw new Error(`Unsupported archive format: ${archivePath}`);
}

async function extractZip(zipPath: string, folderPath: string): Promise<void> {
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 10s 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.startsWith('v14.')) {
let timeoutReject;
const timeoutPromise = new Promise((resolve, reject) => { timeoutReject = reject; });

const timeoutToken = setTimeout(() => {
const error = new Error(`Puppeteer currently does not work on Node v14 due to an upstream bug. Please see: https://github.com/puppeteer/puppeteer/issues/5719 for details.`);
timeoutReject(error);
}, 10 * 1000);

await Promise.race([
extract(zipPath, {dir: folderPath}),
timeoutPromise
]);

clearTimeout(timeoutToken);
} else {
try {
await extract(zipPath, {dir: folderPath});
} catch (error) {
return error;
}
}
}

/**
* @param {string} tarPath
* @param {string} folderPath
Expand Down