-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbrowser.ts
More file actions
67 lines (61 loc) · 1.77 KB
/
browser.ts
File metadata and controls
67 lines (61 loc) · 1.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**
* Helper module for connecting to a remote headless browser
*
* Usage:
* import { connectBrowser, getPage } from './browser';
*
* // Connect and get a page
* const { browser, page } = await getPage();
* await page.goto('https://example.com');
*
* // Or just connect
* const browser = await connectBrowser();
* const page = await browser.newPage();
*/
import puppeteer, { type Browser, type Page } from 'puppeteer-core';
/**
* Get the browser WebSocket URL from environment
*/
export function getBrowserUrl(): string {
const url = process.env.BROWSER_URL;
if (!url) {
throw new Error(
'BROWSER_URL environment variable is required.\n' +
'Usage: BROWSER_URL=$(./spawn-headless-browser.sh) bun your-script.ts'
);
}
return url;
}
/**
* Connect to the remote browser
*/
export async function connectBrowser(wsEndpoint?: string): Promise<Browser> {
const url = wsEndpoint || getBrowserUrl();
return puppeteer.connect({ browserWSEndpoint: url });
}
/**
* Connect to browser and create a new page
*/
export async function getPage(wsEndpoint?: string): Promise<{ browser: Browser; page: Page }> {
const browser = await connectBrowser(wsEndpoint);
const page = await browser.newPage();
return { browser, page };
}
/**
* Run a function with a browser page, automatically cleaning up
*/
export async function withPage<T>(
fn: (page: Page, browser: Browser) => Promise<T>,
wsEndpoint?: string
): Promise<T> {
const { browser, page } = await getPage(wsEndpoint);
try {
return await fn(page, browser);
} finally {
await page.close();
browser.disconnect();
}
}
// Re-export puppeteer types for convenience
export { type Browser, type Page } from 'puppeteer-core';
export { default as puppeteer } from 'puppeteer-core';