Skip to content

Commit ef47b3a

Browse files
authored
feat: kill & respawn a new browser instance under diconnect (#68)
* build: ensure kill chrome on disconnect avoid zombie process, it's based on puppeteer/puppeteer#1825 * Update packages/browserless/src/index.js Co-Authored-By: Luc <luc.leray@gmail.com> * build: ensure to remove files associated * build: remove unnecessary dependency * build: add debug trace * build: use repo installation * build: add some node builds * build: ensure close browser
1 parent b37f419 commit ef47b3a

File tree

4 files changed

+26
-6
lines changed

4 files changed

+26
-6
lines changed

.travis.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ language: node_js
22

33
node_js:
44
- lts/*
5-
- node
5+
- 10
6+
- 8
67

78
after_success: npm run coverage
89

packages/browserless/package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,12 @@
3434
"@browserless/goto": "^5.10.2",
3535
"@browserless/pdf": "^5.10.2",
3636
"@browserless/screenshot": "^5.10.2",
37+
"debug-logfmt": "~1.0.2",
38+
"del": "~5.0.0",
39+
"fkill": "~6.2.0",
3740
"p-timeout": "~3.1.0",
38-
"require-one-of": "~1.0.11"
41+
"require-one-of": "~1.0.11",
42+
"waitpid2": "github:joshiggins/node-waitpid2"
3943
},
4044
"devDependencies": {
4145
"@browserless/test": "latest",

packages/browserless/src/index.js

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,27 @@
11
'use strict'
22

3+
const debug = require('debug-logfmt')('browserless:goto')
34
const devices = require('@browserless/devices')
45
const requireOneOf = require('require-one-of')
56
const goto = require('@browserless/goto')
67
const pTimeout = require('p-timeout')
8+
const waitpid2 = require('waitpid2')
9+
const fkill = require('fkill')
10+
const del = require('del')
711

812
const EVALUATE_TEXT = page => page.evaluate(() => document.body.innerText)
913

1014
const EVALUATE_HTML = page => page.content()
1115

16+
const killBrowser = async browser => {
17+
while (waitpid2.waitpid(-1, 0 | waitpid2.WNOHANG) === -1);
18+
await browser.close()
19+
const pid = browser.process().pid
20+
await fkill(pid)
21+
const deletedPaths = await del(['/tmp/core.chromium.*', '/tmp/puppeteer_dev_profile*'])
22+
debug('killBrowser', { pid, deletedPaths })
23+
}
24+
1225
module.exports = ({
1326
puppeteer = requireOneOf(['puppeteer', 'puppeteer-core', 'puppeteer-firefox']),
1427
incognito = false,
@@ -17,7 +30,7 @@ module.exports = ({
1730
} = {}) => {
1831
let browser
1932

20-
const createBrowser = async () => {
33+
const spawnBrowser = async () => {
2134
browser = await puppeteer.launch({
2235
ignoreHTTPSErrors: true,
2336
args: [
@@ -38,12 +51,15 @@ module.exports = ({
3851
...launchOpts
3952
})
4053

41-
browser.on('disconnected', createBrowser)
54+
browser.on('disconnected', async () => {
55+
await killBrowser()
56+
spawnBrowser()
57+
})
4258

4359
return browser
4460
}
4561

46-
browser = createBrowser()
62+
browser = spawnBrowser()
4763

4864
const createPage = () =>
4965
Promise.resolve(browser).then(async browser => {

packages/goto/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
"dependencies": {
3131
"@browserless/devices": "^5.5.5",
3232
"@cliqz/adblocker-puppeteer": "~0.13.2",
33-
"debug": "~4.1.1",
3433
"debug-logfmt": "~1.0.2",
3534
"got": "~9.6.0",
3635
"p-timeout": "~3.1.0",

0 commit comments

Comments
 (0)