puppeteer-chromium-resolver
Advanced tools
Comparing version 4.0.0 to 5.0.0
136
index.js
@@ -1,7 +0,7 @@ | ||
const path = require('path'); | ||
const fs = require('fs'); | ||
const os = require('os'); | ||
const puppeteer = require('puppeteer-core'); | ||
const PingMonitor = require('ping-monitor'); | ||
const Gauge = require('gauge'); | ||
const path = require("path"); | ||
const fs = require("fs"); | ||
const os = require("os"); | ||
const puppeteer = require("puppeteer-core"); | ||
const PingMonitor = require("ping-monitor"); | ||
const Gauge = require("gauge"); | ||
const gauge = new Gauge(); | ||
@@ -19,3 +19,3 @@ | ||
}; | ||
const list = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white']; | ||
const list = ["black", "red", "green", "yellow", "blue", "magenta", "cyan", "white"]; | ||
list.forEach((name, i) => { | ||
@@ -75,7 +75,7 @@ Color[name] = (str) => { | ||
output('Chromium downloaded to ' + option.userFolder); | ||
output("Chromium downloaded to " + option.userFolder); | ||
let localRevisions = await browserFetcher.localRevisions(); | ||
if (localRevisions && localRevisions.length) { | ||
output('Checking previous local chromium revisions ...'); | ||
output("Checking previous local chromium revisions ..."); | ||
localRevisions = localRevisions.filter(revision => revision !== option.revision); | ||
@@ -87,3 +87,3 @@ if (localRevisions.length > option.cacheRevisions) { | ||
const cleanupOldVersions = localRevisions.map(revision => browserFetcher.remove(revision)); | ||
await Promise.all([...cleanupOldVersions]); | ||
await Promise.all([... cleanupOldVersions]); | ||
} | ||
@@ -108,5 +108,5 @@ } | ||
for (let host of option.hosts) { | ||
for (const host of option.hosts) { | ||
option.host = host; | ||
let res = await downloadFromHost(option); | ||
const res = await downloadFromHost(option); | ||
if (res) { | ||
@@ -119,3 +119,3 @@ return res; | ||
option.retryTimes += 1; | ||
output('Retry Chromium downloading ... '); | ||
output("Retry Chromium downloading ... "); | ||
return await downloadStart(option); | ||
@@ -127,3 +127,3 @@ } | ||
const pingHost = function (host, timeout = 5000) { | ||
const pingHost = function(host, timeout = 5000) { | ||
return new Promise((resolve) => { | ||
@@ -133,4 +133,4 @@ const myMonitor = new PingMonitor({ | ||
}); | ||
let time_start = Date.now(); | ||
let timeout_id = setTimeout(() => { | ||
const time_start = Date.now(); | ||
const timeout_id = setTimeout(() => { | ||
myMonitor.stop(); | ||
@@ -143,3 +143,3 @@ resolve({ | ||
}, timeout); | ||
myMonitor.on('up', function (res, state) { | ||
myMonitor.on("up", function(res, state) { | ||
clearTimeout(timeout_id); | ||
@@ -153,3 +153,3 @@ myMonitor.stop(); | ||
}); | ||
myMonitor.on('down', function (res) { | ||
myMonitor.on("down", function(res) { | ||
clearTimeout(timeout_id); | ||
@@ -163,3 +163,3 @@ myMonitor.stop(); | ||
}); | ||
myMonitor.on('error', function (error) { | ||
myMonitor.on("error", function(error) { | ||
clearTimeout(timeout_id); | ||
@@ -210,3 +210,3 @@ myMonitor.stop(); | ||
let res = await downloadStart(option); | ||
const res = await downloadStart(option); | ||
if (!res) { | ||
@@ -243,3 +243,3 @@ output(`ERROR: Failed to download Chromium after retry ${option.retryTimes} times.`, true); | ||
detectionList.push(path.resolve(current, folderName)); | ||
let parent = path.resolve(current, "../"); | ||
const parent = path.resolve(current, "../"); | ||
if (parent === current) { | ||
@@ -258,6 +258,6 @@ current = ""; | ||
detectionPath = path.resolve(detectionPath); | ||
let browserFetcher = puppeteer.createBrowserFetcher({ | ||
const browserFetcher = puppeteer.createBrowserFetcher({ | ||
path: detectionPath | ||
}); | ||
let revisionInfo = browserFetcher.revisionInfo(option.revision); | ||
const revisionInfo = browserFetcher.revisionInfo(option.revision); | ||
return revisionInfo; | ||
@@ -267,4 +267,4 @@ }; | ||
const detectionHandler = (option) => { | ||
for (let detectionPath of option.detectionList) { | ||
let revisionInfo = detectionPathHandler(option, detectionPath); | ||
for (const detectionPath of option.detectionList) { | ||
const revisionInfo = detectionPathHandler(option, detectionPath); | ||
if (detectionPath === option.userFolder) { | ||
@@ -302,6 +302,6 @@ option.userRevisionInfo = revisionInfo; | ||
try { | ||
fs.mkdirSync(userFolder, '0777'); | ||
fs.mkdirSync(userFolder, "0777"); | ||
// Make double sure we have 0777 permissions; some operating systems | ||
// default umask does not allow write by default. | ||
fs.chmodSync(userFolder, '0777'); | ||
fs.chmodSync(userFolder, "0777"); | ||
} catch (e) { | ||
@@ -318,6 +318,11 @@ output("User path is not writable: " + userFolder); | ||
} | ||
if (option.puppeteerConf) { | ||
return option.puppeteerConf.puppeteer.chromium_revision; | ||
let revisions; | ||
try { | ||
revisions = require("puppeteer-core/lib/cjs/revisions.js"); | ||
} catch (e) {} | ||
//console.log(revisions); | ||
if (revisions) { | ||
return revisions.PUPPETEER_REVISIONS.chromium; | ||
} | ||
return require("./package.json").puppeteer.chromium_revision; | ||
return "756035"; | ||
}; | ||
@@ -329,11 +334,7 @@ | ||
} | ||
const p1 = path.resolve(__dirname, "../puppeteer-core/package.json"); | ||
if (fs.existsSync(p1)) { | ||
return require(p1); | ||
} | ||
const p2 = path.resolve(__dirname, "./node_modules/puppeteer-core/package.json"); | ||
if (fs.existsSync(p2)) { | ||
return require(p2); | ||
} | ||
return null; | ||
let config; | ||
try { | ||
config = require("puppeteer-core/package.json"); | ||
} catch (e) {} | ||
return config; | ||
}; | ||
@@ -347,3 +348,3 @@ | ||
//fix root issue | ||
args: ['--no-sandbox'], | ||
args: ["--no-sandbox"], | ||
executablePath: option.revisionInfo.executablePath | ||
@@ -358,3 +359,3 @@ }).catch((error) => { | ||
//delay close, fix unknown log in console | ||
setTimeout(function () { | ||
setTimeout(function() { | ||
browser.close(); | ||
@@ -365,7 +366,18 @@ }, 1000); | ||
// \ to / | ||
const formatPath = (str) => { | ||
if (str) { | ||
str = str.replace(/\\/g, "/"); | ||
} | ||
return str; | ||
}; | ||
const revisionHandler = (option) => { | ||
let revisionInfo = option.revisionInfo; | ||
const revisionInfo = option.revisionInfo; | ||
revisionInfo.executablePath = formatPath(revisionInfo.executablePath); | ||
revisionInfo.folderPath = formatPath(revisionInfo.folderPath); | ||
revisionInfo.userFolder = formatPath(option.userFolder); | ||
//Chromium | ||
@@ -385,11 +397,32 @@ revisionInfo.launchable = option.launchable; | ||
//Puppeteer | ||
revisionInfo.puppeteer = puppeteer; | ||
if (option.puppeteerConf) { | ||
revisionInfo.puppeteerVersion = option.puppeteerConf.version; | ||
output("Puppeteer version: " + revisionInfo.puppeteerVersion); | ||
} | ||
output("Puppeteer version: " + revisionInfo.puppeteerVersion); | ||
revisionInfo.puppeteer = puppeteer; | ||
return revisionInfo; | ||
}; | ||
const statsPath = path.resolve(__dirname, ".stats.json"); | ||
const saveStats = (revisionInfo) => { | ||
const stats = Object.assign({}, revisionInfo); | ||
delete stats.puppeteer; | ||
fs.writeFileSync(statsPath, JSON.stringify(stats, null, 4)); | ||
output("Stats saved: " + path.relative(process.cwd(), statsPath)); | ||
}; | ||
const getStats = () => { | ||
let stats; | ||
try { | ||
stats = require(statsPath); | ||
} catch (e) { | ||
output("Not found PCR stats, try npm install again.", true); | ||
} | ||
if (stats) { | ||
stats.puppeteer = puppeteer; | ||
} | ||
return stats; | ||
}; | ||
//========================================================================================= | ||
@@ -399,6 +432,6 @@ | ||
let defaultOption = { | ||
const defaultOption = { | ||
revision: "", | ||
detectionPath: "", | ||
folderName: '.chromium-browser-snapshots', | ||
folderName: ".chromium-browser-snapshots", | ||
defaultHosts: ["https://storage.googleapis.com", "https://npm.taobao.org/mirrors"], | ||
@@ -420,3 +453,3 @@ hosts: [], | ||
let localChromium = detectionLocalChromium(option); | ||
const localChromium = detectionLocalChromium(option); | ||
if (!localChromium) { | ||
@@ -428,5 +461,7 @@ await downloadHandler(option); | ||
let revisionInfo = await revisionHandler(option); | ||
const revisionInfo = await revisionHandler(option); | ||
//console.log(revisionInfo); | ||
saveStats(revisionInfo); | ||
//close gauge | ||
@@ -438,2 +473,5 @@ gauge.disable(); | ||
//sync API | ||
resolver.getStats = getStats; | ||
module.exports = resolver; |
@@ -1,3 +0,5 @@ | ||
require("./index.js")({}).then((pcr) => { | ||
const PCR = require("./index.js"); | ||
//console.log(PCR.getStats()); | ||
PCR({}).then((pcr) => { | ||
//console.log(pcr); | ||
}); |
{ | ||
"name": "puppeteer-chromium-resolver", | ||
"version": "4.0.0", | ||
"version": "5.0.0", | ||
"description": "Tool to resolve puppeteer and chromium faster, detect local installed chromium, download chromium with custom mirror host, cache chromium revision out of node_modules, test chromium headless being launchable.", | ||
@@ -9,9 +9,5 @@ "main": "index.js", | ||
"object-assign": "^4.1.1", | ||
"ping-monitor": "^0.4.4", | ||
"puppeteer-core": "^4.0.1" | ||
"ping-monitor": "^0.5.0", | ||
"puppeteer-core": "^5.0.0" | ||
}, | ||
"puppeteer": { | ||
"chromium_revision": "756035", | ||
"firefox_revision": "latest" | ||
}, | ||
"repository": { | ||
@@ -18,0 +14,0 @@ "type": "git", |
@@ -16,2 +16,3 @@ | ||
## Install | ||
@@ -22,20 +23,48 @@ ```sh | ||
## Usage | ||
#### [Async Case](./test/async.js): dynamic detection and downloading chromium | ||
```js | ||
const PCR = require("puppeteer-chromium-resolver"); | ||
const pcr = await PCR(); | ||
const browser = await pcr.puppeteer.launch({ | ||
headless: true, | ||
args: ['--no-sandbox'], | ||
executablePath: pcr.executablePath | ||
}).catch(function (error) { | ||
console.log(error); | ||
}); | ||
const page = await browser.newPage(); | ||
await page.goto('https://www.google.com'); | ||
await browser.close(); | ||
(async () => { | ||
const PCR = require("puppeteer-chromium-resolver"); | ||
const stats = await PCR(); | ||
const browser = await stats.puppeteer.launch({ | ||
headless: false, | ||
args: ["--no-sandbox"], | ||
executablePath: stats.executablePath | ||
}).catch(function(error) { | ||
console.log(error); | ||
}); | ||
const page = await browser.newPage(); | ||
await page.goto("https://www.npmjs.com/package/puppeteer-chromium-resolver"); | ||
await browser.close(); | ||
})(); | ||
``` | ||
#### [Sync Case](./test/sync.js): chromium pre-downloaded when installation, just call API PCR.getStats() | ||
```js | ||
(async () => { | ||
const PCR = require("puppeteer-chromium-resolver"); | ||
const stats = PCR.getStats(); | ||
if (!stats) { | ||
return; | ||
} | ||
const browser = await stats.puppeteer.launch({ | ||
headless: false, | ||
args: ["--no-sandbox"], | ||
executablePath: stats.executablePath | ||
}).catch(function(error) { | ||
console.log(error); | ||
}); | ||
const page = await browser.newPage(); | ||
await page.goto("https://www.npmjs.com/package/puppeteer-chromium-resolver"); | ||
await browser.close(); | ||
})(); | ||
``` | ||
## Option | ||
```js | ||
const pcr = await PCR({ | ||
const stats = await PCR({ | ||
revision: "", | ||
@@ -51,3 +80,3 @@ detectionPath: "", | ||
## Properties | ||
## Return Stats | ||
|Property | Type | | | ||
@@ -62,7 +91,40 @@ | :--------------| :------ | :---------------------- | | ||
|chromiumVersion | String |chromium version | | ||
|puppeteerVersion| String |puppeteer version | | ||
|puppeteer | Object |puppeteer module | | ||
|puppeteerVersion| String |puppeteer version | | ||
## How to make puppeteer work with puppeteer-chromium-resolver | ||
* 1, stop the automatic download of Chromium with config in .npmrc | ||
``` | ||
puppeteer_skip_download = true | ||
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD = true | ||
``` | ||
(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD for puppeteer version 2.x) | ||
* 2, set env PUPPETEER_EXECUTABLE_PATH to PCR executablePath before calling puppeteer.launch() | ||
```js | ||
(async () => { | ||
const PCR = require("puppeteer-chromium-resolver"); | ||
const puppeteer = require("puppeteer"); | ||
const stats = PCR.getStats(); | ||
process.env.PUPPETEER_EXECUTABLE_PATH = stats.executablePath | ||
const browser = await puppeteer.launch({ | ||
headless: false | ||
}); | ||
const page = await browser.newPage(); | ||
await page.goto('https://github.com'); | ||
await browser.close(); | ||
})(); | ||
``` | ||
## CHANGELOG | ||
+ v5.0.0 | ||
- updated puppeteer-core to v5 | ||
- added sync API getStats() | ||
+ v4.0.0 | ||
@@ -69,0 +131,0 @@ - updated puppeteer-core to v4 |
Deprecated
MaintenanceThe maintainer of the package marked it as deprecated. This could indicate that a single version should not be used, or that the package is no longer maintained and any new vulnerabilities will not be fixed.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
19143
5
408
150
2
1
+ Addeddevtools-protocol@0.0.818844(transitive)
+ Addedfind-up@4.1.0(transitive)
+ Addedlocate-path@5.0.0(transitive)
+ Addednode-fetch@2.7.0(transitive)
+ Addedp-limit@2.3.0(transitive)
+ Addedp-locate@4.1.0(transitive)
+ Addedp-try@2.2.0(transitive)
+ Addedpath-exists@4.0.0(transitive)
+ Addedping-monitor@0.5.2(transitive)
+ Addedpkg-dir@4.2.0(transitive)
+ Addedpuppeteer-core@5.5.0(transitive)
+ Addedtr46@0.0.3(transitive)
+ Addedwebidl-conversions@3.0.1(transitive)
+ Addedwhatwg-url@5.0.0(transitive)
- Removedmime@2.6.0(transitive)
- Removedmitt@2.1.0(transitive)
- Removedping-monitor@0.4.4(transitive)
- Removedpuppeteer-core@4.0.1(transitive)
Updatedping-monitor@^0.5.0
Updatedpuppeteer-core@^5.0.0