Skip to content

Commit 75f054a

Browse files
authored
Merge pull request #25 from link-assistant/issue-24-000cedc18c0c
feat: integrate browser-commander for browser operations
2 parents 9a57fef + 5448fab commit 75f054a

File tree

5 files changed

+106
-60
lines changed

5 files changed

+106
-60
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
'@link-assistant/web-capture': minor
3+
---
4+
5+
Fully integrate browser-commander library for all browser operations
6+
7+
- Use browser-commander's launchBrowser for both Puppeteer and Playwright
8+
- Pass server-specific args (--no-sandbox, etc.) via the args option
9+
- Configure headless mode and unique userDataDir for server environments
10+
- Update browser-commander dependency from ^0.3.0 to ^0.4.0

package-lock.json

Lines changed: 36 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"changeset:status": "changeset status --since=origin/main"
3333
},
3434
"dependencies": {
35+
"browser-commander": "^0.4.0",
3536
"cheerio": "^1.0.0",
3637
"express": "^4.18.2",
3738
"lino-arguments": "^0.2.1",

src/browser.js

Lines changed: 45 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
1-
// Browser abstraction layer to support both Puppeteer and Playwright
2-
import puppeteer from 'puppeteer';
3-
import playwright from 'playwright';
1+
// Browser abstraction layer using browser-commander for all browser operations
2+
// See: https://github.com/link-foundation/browser-commander
3+
4+
import { launchBrowser } from 'browser-commander';
5+
import os from 'os';
6+
import path from 'path';
7+
8+
/**
9+
* Additional Chrome args needed for headless server environments
10+
* These are appended to browser-commander's default CHROME_ARGS
11+
*/
12+
const SERVER_CHROME_ARGS = [
13+
'--no-sandbox',
14+
'--disable-setuid-sandbox',
15+
'--disable-dev-shm-usage',
16+
];
417

518
/**
619
* Unified browser interface that works with both Puppeteer and Playwright
@@ -26,78 +39,52 @@ import playwright from 'playwright';
2639

2740
/**
2841
* Create a browser instance using the specified engine
42+
* Uses browser-commander's launchBrowser for both Puppeteer and Playwright
2943
* @param {string} engine - 'puppeteer' or 'playwright' (defaults to puppeteer)
3044
* @param {Object} options - Browser launch options
3145
* @returns {Promise<BrowserAdapter>}
3246
*/
3347
export async function createBrowser(engine = 'puppeteer', options = {}) {
3448
const normalizedEngine = engine.toLowerCase();
49+
const engineType =
50+
normalizedEngine === 'playwright' || normalizedEngine === 'pw'
51+
? 'playwright'
52+
: 'puppeteer';
3553

36-
if (normalizedEngine === 'playwright') {
37-
return createPlaywrightBrowser(options);
38-
} else {
39-
return createPuppeteerBrowser(options);
40-
}
41-
}
54+
// Generate unique userDataDir for this session to avoid conflicts
55+
const userDataDir = path.join(
56+
os.tmpdir(),
57+
`web-capture-${engineType}-${Date.now()}`
58+
);
4259

43-
/**
44-
* Create a Puppeteer browser instance
45-
* @param {Object} options - Puppeteer launch options
46-
* @returns {Promise<BrowserAdapter>}
47-
*/
48-
async function createPuppeteerBrowser(options = {}) {
49-
const defaultOptions = {
50-
args: [
51-
'--no-sandbox',
52-
'--disable-setuid-sandbox',
53-
'--disable-dev-shm-usage',
54-
],
55-
};
56-
57-
const browser = await puppeteer.launch({ ...defaultOptions, ...options });
58-
59-
return {
60-
async newPage() {
61-
const page = await browser.newPage();
62-
return createPuppeteerPageAdapter(page);
63-
},
64-
async close() {
65-
await browser.close();
66-
},
67-
type: 'puppeteer',
68-
_browser: browser,
69-
};
70-
}
71-
72-
/**
73-
* Create a Playwright browser instance
74-
* @param {Object} options - Playwright launch options
75-
* @returns {Promise<BrowserAdapter>}
76-
*/
77-
async function createPlaywrightBrowser(options = {}) {
78-
const defaultOptions = {
79-
args: [
80-
'--no-sandbox',
81-
'--disable-setuid-sandbox',
82-
'--disable-dev-shm-usage',
83-
],
84-
};
85-
86-
// Playwright uses chromium by default
87-
const browser = await playwright.chromium.launch({
88-
...defaultOptions,
60+
// Use browser-commander's launchBrowser with server-specific args
61+
// Default to headless for server environments
62+
const { browser, page } = await launchBrowser({
63+
engine: engineType,
64+
args: SERVER_CHROME_ARGS,
65+
headless: true,
66+
userDataDir,
67+
slowMo: 0, // Disable slowMo for server operations
8968
...options,
9069
});
9170

71+
// Close the initial page since we'll create new ones via newPage()
72+
await page.close();
73+
74+
const pageAdapter =
75+
engineType === 'playwright'
76+
? createPlaywrightPageAdapter
77+
: createPuppeteerPageAdapter;
78+
9279
return {
9380
async newPage() {
94-
const page = await browser.newPage();
95-
return createPlaywrightPageAdapter(page);
81+
const newPage = await browser.newPage();
82+
return pageAdapter(newPage);
9683
},
9784
async close() {
9885
await browser.close();
9986
},
100-
type: 'playwright',
87+
type: engineType,
10188
_browser: browser,
10289
};
10390
}

yarn.lock

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2022,6 +2022,13 @@ braces@^3.0.3:
20222022
dependencies:
20232023
fill-range "^7.1.1"
20242024

2025+
browser-commander@^0.4.0:
2026+
version "0.4.0"
2027+
resolved "https://registry.npmjs.org/browser-commander/-/browser-commander-0.4.0.tgz"
2028+
integrity sha512-pEC3LqCySJqqxlwobPIyvrjlWFvkO6HEadhvgD1ZM0VVLuO0uYomICRibpZ3VT9RT85XG/suohO6pNrzMs3d5w==
2029+
dependencies:
2030+
log-lazy "^1.0.4"
2031+
20252032
browserslist@^4.24.0, browserslist@^4.24.4, "browserslist@>= 4.21.0":
20262033
version "4.24.5"
20272034
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz"
@@ -4078,6 +4085,11 @@ lodash.startcase@^4.4.0:
40784085
resolved "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz"
40794086
integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==
40804087

4088+
log-lazy@^1.0.4:
4089+
version "1.0.4"
4090+
resolved "https://registry.npmjs.org/log-lazy/-/log-lazy-1.0.4.tgz"
4091+
integrity sha512-UHTdwIjZymnYIaNA5l6mW7YEQpJYXGhWsRwpblG+BpA8oThnsCj69JPy+CDRo6T2oi39u5TChlcqCfk+Qh6mHg==
4092+
40814093
log-update@^6.1.0:
40824094
version "6.1.0"
40834095
resolved "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz"
@@ -4537,7 +4549,7 @@ [email protected]:
45374549
resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz"
45384550
integrity sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==
45394551

4540-
playwright@^1.49.0:
4552+
playwright@^1.49.0, playwright@>=1.40.0:
45414553
version "1.56.1"
45424554
resolved "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz"
45434555
integrity sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==
@@ -4757,7 +4769,7 @@ [email protected]:
47574769
typed-query-selector "^2.12.0"
47584770
ws "^8.18.2"
47594771

4760-
puppeteer@^24.8.2:
4772+
puppeteer@^24.8.2, puppeteer@>=21.0.0:
47614773
version "24.8.2"
47624774
resolved "https://registry.npmjs.org/puppeteer/-/puppeteer-24.8.2.tgz"
47634775
integrity sha512-Sn6SBPwJ6ASFvQ7knQkR+yG7pcmr4LfXzmoVp3NR0xXyBbPhJa8a8ybtb6fnw1g/DD/2t34//yirubVczko37w==

0 commit comments

Comments
 (0)