@browserless.io/browserless 2.12.0-beta-4 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -1
- package/bin/scaffold/README.md +6 -5
- package/bin/scaffold/src/hello-world.http.ts +3 -3
- package/build/browserless.d.ts +3 -3
- package/build/browserless.js +6 -6
- package/build/browsers/chromium.cdp.d.ts +12 -12
- package/build/browsers/chromium.cdp.js +77 -65
- package/build/browsers/chromium.playwright.d.ts +11 -11
- package/build/browsers/chromium.playwright.js +42 -34
- package/build/browsers/firefox.playwright.d.ts +11 -11
- package/build/browsers/firefox.playwright.js +42 -34
- package/build/browsers/index.d.ts +14 -14
- package/build/browsers/index.js +27 -25
- package/build/browsers/webkit.playwright.d.ts +11 -11
- package/build/browsers/webkit.playwright.js +43 -35
- package/build/config.d.ts +65 -63
- package/build/config.js +162 -102
- package/build/file-system.d.ts +4 -4
- package/build/file-system.js +8 -8
- package/build/hooks.d.ts +2 -2
- package/build/hooks.js +4 -4
- package/build/limiter.d.ts +4 -4
- package/build/limiter.js +10 -10
- package/build/logger.d.ts +6 -6
- package/build/logger.js +12 -12
- package/build/metrics.d.ts +12 -12
- package/build/metrics.js +23 -23
- package/build/monitoring.d.ts +4 -4
- package/build/monitoring.js +8 -8
- package/build/router.d.ts +8 -8
- package/build/router.js +74 -70
- package/build/routes/chrome/http/pdf.post.body.json +8 -8
- package/build/routes/chrome/http/scrape.post.body.json +8 -8
- package/build/routes/chrome/http/screenshot.post.body.json +8 -8
- package/build/routes/chromium/http/content.post.body.json +8 -8
- package/build/routes/chromium/http/pdf.post.body.json +8 -8
- package/build/routes/chromium/http/scrape.post.body.json +8 -8
- package/build/routes/chromium/http/screenshot.post.body.json +8 -8
- package/build/routes/firefox/ws/playwright.d.ts +1 -1
- package/build/routes/firefox/ws/playwright.js +2 -2
- package/build/routes/management/http/active.get.d.ts +1 -1
- package/build/routes/management/http/active.get.js +3 -1
- package/build/routes/management/http/config.get.d.ts +1 -1
- package/build/routes/management/http/config.get.js +2 -2
- package/build/routes/management/http/metrics-total.get.d.ts +1 -1
- package/build/routes/management/http/metrics-total.get.js +2 -2
- package/build/routes/management/http/metrics.get.d.ts +1 -1
- package/build/routes/management/http/metrics.get.js +2 -2
- package/build/routes/management/http/pressure.get.d.ts +1 -1
- package/build/routes/management/http/pressure.get.js +2 -2
- package/build/routes/management/http/sessions.get.d.ts +1 -1
- package/build/routes/management/http/sessions.get.js +2 -2
- package/build/routes/management/http/static.get.d.ts +1 -1
- package/build/routes/management/http/static.get.js +2 -2
- package/build/routes/webkit/ws/playwright.d.ts +1 -1
- package/build/routes/webkit/ws/playwright.js +2 -2
- package/build/server.d.ts +5 -5
- package/build/server.js +11 -11
- package/build/shared/browser.ws.d.ts +1 -1
- package/build/shared/browser.ws.js +3 -1
- package/build/shared/chromium.playwright.ws.d.ts +1 -1
- package/build/shared/chromium.playwright.ws.js +2 -2
- package/build/shared/chromium.ws.d.ts +1 -1
- package/build/shared/chromium.ws.js +3 -1
- package/build/shared/content.http.d.ts +1 -1
- package/build/shared/content.http.js +2 -2
- package/build/shared/download.http.d.ts +1 -1
- package/build/shared/download.http.js +60 -58
- package/build/shared/function.http.d.ts +1 -1
- package/build/shared/function.http.js +2 -2
- package/build/shared/json-list.http.d.ts +1 -1
- package/build/shared/json-list.http.js +2 -2
- package/build/shared/json-new.http.d.ts +1 -1
- package/build/shared/json-new.http.js +2 -2
- package/build/shared/json-protocol.http.d.ts +1 -1
- package/build/shared/json-protocol.http.js +2 -2
- package/build/shared/json-version.http.d.ts +1 -1
- package/build/shared/json-version.http.js +2 -2
- package/build/shared/page.ws.d.ts +1 -1
- package/build/shared/page.ws.js +3 -1
- package/build/shared/pdf.http.d.ts +1 -1
- package/build/shared/pdf.http.js +2 -2
- package/build/shared/performance.http.d.ts +1 -1
- package/build/shared/performance.http.js +2 -2
- package/build/shared/scrape.http.d.ts +1 -1
- package/build/shared/scrape.http.js +2 -2
- package/build/shared/screenshot.http.d.ts +1 -1
- package/build/shared/screenshot.http.js +2 -2
- package/build/shared/utils/function/client.d.ts +1 -1
- package/build/shared/utils/function/client.js +3 -1
- package/build/shim.d.ts +1 -1
- package/build/shim.js +2 -2
- package/build/token.d.ts +3 -3
- package/build/token.js +6 -6
- package/build/types.d.ts +4 -4
- package/build/webhooks.d.ts +2 -2
- package/build/webhooks.js +4 -4
- package/package.json +3 -3
- package/src/browserless.ts +6 -6
- package/src/browsers/chromium.cdp.ts +33 -23
- package/src/browsers/chromium.playwright.ts +28 -21
- package/src/browsers/firefox.playwright.ts +28 -21
- package/src/browsers/index.ts +32 -29
- package/src/browsers/webkit.playwright.ts +29 -22
- package/src/config.ts +166 -104
- package/src/file-system.ts +9 -9
- package/src/hooks.ts +4 -4
- package/src/limiter.ts +12 -12
- package/src/logger.ts +12 -12
- package/src/metrics.ts +23 -23
- package/src/monitoring.ts +9 -9
- package/src/router.ts +31 -31
- package/src/routes/firefox/ws/playwright.ts +3 -3
- package/src/routes/management/http/active.get.ts +3 -2
- package/src/routes/management/http/config.get.ts +2 -2
- package/src/routes/management/http/metrics-total.get.ts +2 -2
- package/src/routes/management/http/metrics.get.ts +2 -2
- package/src/routes/management/http/pressure.get.ts +2 -2
- package/src/routes/management/http/sessions.get.ts +2 -2
- package/src/routes/management/http/static.get.ts +3 -3
- package/src/routes/webkit/ws/playwright.ts +3 -3
- package/src/server.ts +14 -16
- package/src/shared/browser.ws.ts +4 -2
- package/src/shared/chromium.playwright.ws.ts +3 -3
- package/src/shared/chromium.ws.ts +4 -2
- package/src/shared/content.http.ts +3 -3
- package/src/shared/download.http.ts +4 -3
- package/src/shared/function.http.ts +3 -3
- package/src/shared/json-list.http.ts +2 -2
- package/src/shared/json-new.http.ts +2 -2
- package/src/shared/json-protocol.http.ts +2 -6
- package/src/shared/json-version.http.ts +2 -6
- package/src/shared/page.ws.ts +4 -2
- package/src/shared/pdf.http.ts +3 -3
- package/src/shared/performance.http.ts +3 -3
- package/src/shared/scrape.http.ts +3 -3
- package/src/shared/screenshot.http.ts +3 -3
- package/src/shared/utils/function/client.ts +3 -1
- package/src/shim.ts +2 -2
- package/src/token.ts +7 -7
- package/src/types.ts +7 -7
- package/src/webhooks.ts +4 -4
- package/static/docs/swagger.json +2 -2
- package/static/docs/swagger.min.json +1 -1
- package/static/function/client.js +3 -1
- package/static/function/index.html +3 -1
|
@@ -21,67 +21,69 @@ export default class ChromiumDownloadPostRoute extends BrowserHTTPRoute {
|
|
|
21
21
|
method = Methods.post;
|
|
22
22
|
path = [HTTPRoutes.download, HTTPRoutes.chromiumDownload];
|
|
23
23
|
tags = [APITags.browserAPI];
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
});
|
|
35
|
-
if (!response) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
const { page } = response;
|
|
39
|
-
logger.info(`Download function has returned, finding downloads...`);
|
|
40
|
-
async function checkIfDownloadComplete() {
|
|
41
|
-
if (res.headersSent) {
|
|
42
|
-
logger.trace(`Request headers have been sent, terminating download watch.`);
|
|
24
|
+
async handler(req, res, logger, browser) {
|
|
25
|
+
return new Promise(async (resolve, reject) => {
|
|
26
|
+
const config = this.config();
|
|
27
|
+
const downloadPath = path.join(await config.getDownloadsDir(), `.browserless.download.${id()}`);
|
|
28
|
+
logger.info(`Generating a download directory at "${downloadPath}"`);
|
|
29
|
+
await mkdir(downloadPath);
|
|
30
|
+
const handler = functionHandler(config, logger, { downloadPath });
|
|
31
|
+
const response = await handler(req, browser).catch((e) => {
|
|
32
|
+
logger.error(`Error running download code handler: "${e}"`);
|
|
33
|
+
reject(e);
|
|
43
34
|
return null;
|
|
35
|
+
});
|
|
36
|
+
if (!response) {
|
|
37
|
+
return;
|
|
44
38
|
}
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
39
|
+
const { page } = response;
|
|
40
|
+
logger.info(`Download function has returned, finding downloads...`);
|
|
41
|
+
async function checkIfDownloadComplete() {
|
|
42
|
+
if (res.headersSent) {
|
|
43
|
+
logger.trace(`Request headers have been sent, terminating download watch.`);
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
const [fileName] = await readdir(downloadPath);
|
|
47
|
+
if (!fileName || fileName.endsWith('.crdownload')) {
|
|
48
|
+
await sleep(500);
|
|
49
|
+
return checkIfDownloadComplete();
|
|
50
|
+
}
|
|
51
|
+
logger.info(`All files have finished downloading`);
|
|
52
|
+
return path.join(downloadPath, fileName);
|
|
49
53
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
logger.error(`Error cleaning up downloaded files: "${err}" at "${filePath}"`);
|
|
64
|
-
}));
|
|
65
|
-
if (res.headersSent || !filePath) {
|
|
66
|
-
rmDownload();
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
const contentType = mimeTypes.get(path.extname(filePath));
|
|
70
|
-
if (contentType) {
|
|
71
|
-
res.setHeader('Content-Type', contentType);
|
|
72
|
-
}
|
|
73
|
-
return createReadStream(filePath)
|
|
74
|
-
.on('error', (error) => {
|
|
75
|
-
if (error) {
|
|
54
|
+
const filePath = await checkIfDownloadComplete();
|
|
55
|
+
logger.info(`Closing pages.`);
|
|
56
|
+
page.close();
|
|
57
|
+
page.removeAllListeners();
|
|
58
|
+
const rmDownload = once(() => filePath &&
|
|
59
|
+
deleteAsync(filePath, { force: true })
|
|
60
|
+
.then(() => {
|
|
61
|
+
logger.info(`Successfully deleted downloads from disk at "${filePath}"`);
|
|
62
|
+
})
|
|
63
|
+
.catch((err) => {
|
|
64
|
+
logger.error(`Error cleaning up downloaded files: "${err}" at "${filePath}"`);
|
|
65
|
+
}));
|
|
66
|
+
if (res.headersSent || !filePath) {
|
|
76
67
|
rmDownload();
|
|
77
|
-
return
|
|
68
|
+
return;
|
|
78
69
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
70
|
+
const contentType = mimeTypes.get(path.extname(filePath));
|
|
71
|
+
if (contentType) {
|
|
72
|
+
res.setHeader('Content-Type', contentType);
|
|
73
|
+
}
|
|
74
|
+
return createReadStream(filePath)
|
|
75
|
+
.on('error', (error) => {
|
|
76
|
+
if (error) {
|
|
77
|
+
rmDownload();
|
|
78
|
+
return reject(new NotFound(`Couldn't locate or send downloads in "${downloadPath}"`));
|
|
79
|
+
}
|
|
80
|
+
})
|
|
81
|
+
.on('end', () => {
|
|
82
|
+
logger.info(`Downloads successfully sent`);
|
|
83
|
+
rmDownload();
|
|
84
|
+
return resolve();
|
|
85
|
+
})
|
|
86
|
+
.pipe(res);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
87
89
|
}
|
|
@@ -27,6 +27,6 @@ export default class ChromiumFunctionPostRoute extends BrowserHTTPRoute {
|
|
|
27
27
|
method: Methods;
|
|
28
28
|
path: HTTPRoutes[];
|
|
29
29
|
tags: APITags[];
|
|
30
|
-
handler
|
|
30
|
+
handler(req: Request, res: ServerResponse, logger: Logger, browser: BrowserInstance): Promise<void>;
|
|
31
31
|
}
|
|
32
32
|
export {};
|
|
@@ -18,7 +18,7 @@ export default class ChromiumFunctionPostRoute extends BrowserHTTPRoute {
|
|
|
18
18
|
method = Methods.post;
|
|
19
19
|
path = [HTTPRoutes.function, HTTPRoutes.chromiumFunction];
|
|
20
20
|
tags = [APITags.browserAPI];
|
|
21
|
-
|
|
21
|
+
async handler(req, res, logger, browser) {
|
|
22
22
|
const config = this.config();
|
|
23
23
|
const handler = functionHandler(config, logger);
|
|
24
24
|
const { contentType, payload, page } = await handler(req, browser);
|
|
@@ -44,5 +44,5 @@ export default class ChromiumFunctionPostRoute extends BrowserHTTPRoute {
|
|
|
44
44
|
writeResponse(res, 200, payload, contentType);
|
|
45
45
|
}
|
|
46
46
|
return;
|
|
47
|
-
}
|
|
47
|
+
}
|
|
48
48
|
}
|
|
@@ -14,8 +14,8 @@ export default class ChromiumJSONListGetRoute extends HTTPRoute {
|
|
|
14
14
|
method = Methods.get;
|
|
15
15
|
path = HTTPRoutes.jsonList;
|
|
16
16
|
tags = [APITags.browserAPI];
|
|
17
|
-
|
|
17
|
+
async handler(_req, res) {
|
|
18
18
|
const browserManage = this.browserManager();
|
|
19
19
|
return jsonResponse(res, 200, await browserManage.getJSONList());
|
|
20
|
-
}
|
|
20
|
+
}
|
|
21
21
|
}
|
|
@@ -15,7 +15,7 @@ export default class ChromiumJSONNewPutRoute extends HTTPRoute {
|
|
|
15
15
|
method = Methods.put;
|
|
16
16
|
path = HTTPRoutes.jsonNew;
|
|
17
17
|
tags = [APITags.browserAPI];
|
|
18
|
-
|
|
18
|
+
async handler(_req, res) {
|
|
19
19
|
const config = this.config();
|
|
20
20
|
const externalAddress = config.getExternalWebSocketAddress();
|
|
21
21
|
const id = pageID();
|
|
@@ -31,5 +31,5 @@ export default class ChromiumJSONNewPutRoute extends HTTPRoute {
|
|
|
31
31
|
url: 'about:blank',
|
|
32
32
|
webSocketDebuggerUrl: href,
|
|
33
33
|
});
|
|
34
|
-
}
|
|
34
|
+
}
|
|
35
35
|
}
|
|
@@ -12,5 +12,5 @@ export default class ChromiumJSONProtocolGetRoute extends HTTPRoute {
|
|
|
12
12
|
method: Methods;
|
|
13
13
|
path: HTTPRoutes;
|
|
14
14
|
tags: APITags[];
|
|
15
|
-
handler
|
|
15
|
+
handler(_req: Request, res: Response, logger: Logger): Promise<void>;
|
|
16
16
|
}
|
|
@@ -11,11 +11,11 @@ export default class ChromiumJSONProtocolGetRoute extends HTTPRoute {
|
|
|
11
11
|
method = Methods.get;
|
|
12
12
|
path = HTTPRoutes.jsonProtocol;
|
|
13
13
|
tags = [APITags.browserAPI];
|
|
14
|
-
|
|
14
|
+
async handler(_req, res, logger) {
|
|
15
15
|
const browserManager = this.browserManager();
|
|
16
16
|
if (!this.cachedProtocol) {
|
|
17
17
|
this.cachedProtocol = await browserManager.getProtocolJSON(logger);
|
|
18
18
|
}
|
|
19
19
|
return jsonResponse(res, 200, this.cachedProtocol);
|
|
20
|
-
}
|
|
20
|
+
}
|
|
21
21
|
}
|
|
@@ -12,5 +12,5 @@ export default class ChromiumJSONVersionGetRoute extends HTTPRoute {
|
|
|
12
12
|
method: Methods;
|
|
13
13
|
path: HTTPRoutes;
|
|
14
14
|
tags: APITags[];
|
|
15
|
-
handler
|
|
15
|
+
handler(req: Request, res: Response, logger: Logger): Promise<void>;
|
|
16
16
|
}
|
|
@@ -11,7 +11,7 @@ export default class ChromiumJSONVersionGetRoute extends HTTPRoute {
|
|
|
11
11
|
method = Methods.get;
|
|
12
12
|
path = HTTPRoutes.jsonVersion;
|
|
13
13
|
tags = [APITags.browserAPI];
|
|
14
|
-
|
|
14
|
+
async handler(req, res, logger) {
|
|
15
15
|
const baseUrl = req.parsed.host;
|
|
16
16
|
const protocol = req.parsed.protocol.includes('s') ? 'wss' : 'ws';
|
|
17
17
|
try {
|
|
@@ -27,5 +27,5 @@ export default class ChromiumJSONVersionGetRoute extends HTTPRoute {
|
|
|
27
27
|
catch (err) {
|
|
28
28
|
return writeResponse(res, 500, 'There was an error handling your request', contentTypes.text);
|
|
29
29
|
}
|
|
30
|
-
}
|
|
30
|
+
}
|
|
31
31
|
}
|
|
@@ -13,5 +13,5 @@ export default class ChromiumPageWebSocketRoute extends BrowserWebsocketRoute {
|
|
|
13
13
|
description: string;
|
|
14
14
|
path: WebsocketRoutes;
|
|
15
15
|
tags: APITags[];
|
|
16
|
-
handler
|
|
16
|
+
handler(req: Request, socket: Duplex, head: Buffer, _logger: Logger, browser: ChromiumCDP): Promise<void>;
|
|
17
17
|
}
|
package/build/shared/page.ws.js
CHANGED
|
@@ -10,5 +10,7 @@ export default class ChromiumPageWebSocketRoute extends BrowserWebsocketRoute {
|
|
|
10
10
|
or by finding the page's unique ID from your library of choice.`);
|
|
11
11
|
path = WebsocketRoutes.page;
|
|
12
12
|
tags = [APITags.browserWS];
|
|
13
|
-
|
|
13
|
+
async handler(req, socket, head, _logger, browser) {
|
|
14
|
+
return browser.proxyPageWebSocket(req, socket, head);
|
|
15
|
+
}
|
|
14
16
|
}
|
|
@@ -43,5 +43,5 @@ export default class ChromiumPDFPostRoute extends BrowserHTTPRoute {
|
|
|
43
43
|
method: Methods;
|
|
44
44
|
path: HTTPRoutes[];
|
|
45
45
|
tags: APITags[];
|
|
46
|
-
handler
|
|
46
|
+
handler(req: Request, res: ServerResponse, logger: Logger, browser: BrowserInstance): Promise<void>;
|
|
47
47
|
}
|
package/build/shared/pdf.http.js
CHANGED
|
@@ -16,7 +16,7 @@ export default class ChromiumPDFPostRoute extends BrowserHTTPRoute {
|
|
|
16
16
|
method = Methods.post;
|
|
17
17
|
path = [HTTPRoutes.pdf, HTTPRoutes.chromiumPdf];
|
|
18
18
|
tags = [APITags.browserAPI];
|
|
19
|
-
|
|
19
|
+
async handler(req, res, logger, browser) {
|
|
20
20
|
logger.info('PDF API invoked with body:', req.body);
|
|
21
21
|
const contentType = !req.headers.accept || req.headers.accept?.includes('*')
|
|
22
22
|
? 'application/pdf'
|
|
@@ -114,5 +114,5 @@ export default class ChromiumPDFPostRoute extends BrowserHTTPRoute {
|
|
|
114
114
|
await new Promise((r) => readStream.pipe(res).once('close', r));
|
|
115
115
|
page.close().catch(noop);
|
|
116
116
|
logger.info('PDF API request completed');
|
|
117
|
-
}
|
|
117
|
+
}
|
|
118
118
|
}
|
|
@@ -26,5 +26,5 @@ export default class PerformancePost extends BrowserHTTPRoute {
|
|
|
26
26
|
method: Methods;
|
|
27
27
|
path: HTTPRoutes[];
|
|
28
28
|
tags: APITags[];
|
|
29
|
-
handler
|
|
29
|
+
handler(req: Request, res: ServerResponse, _logger: Logger, browser: BrowserInstance): Promise<void>;
|
|
30
30
|
}
|
|
@@ -11,7 +11,7 @@ export default class PerformancePost extends BrowserHTTPRoute {
|
|
|
11
11
|
method = Methods.post;
|
|
12
12
|
path = [HTTPRoutes.performance, HTTPRoutes.chromiumPerformance];
|
|
13
13
|
tags = [APITags.browserAPI];
|
|
14
|
-
|
|
14
|
+
async handler(req, res, _logger, browser) {
|
|
15
15
|
const config = this.config();
|
|
16
16
|
const response = await main({
|
|
17
17
|
browser,
|
|
@@ -20,5 +20,5 @@ export default class PerformancePost extends BrowserHTTPRoute {
|
|
|
20
20
|
timeout: config.getTimeout(),
|
|
21
21
|
});
|
|
22
22
|
return jsonResponse(res, 200, response);
|
|
23
|
-
}
|
|
23
|
+
}
|
|
24
24
|
}
|
|
@@ -115,5 +115,5 @@ export default class ChromiumScrapePostRoute extends BrowserHTTPRoute {
|
|
|
115
115
|
method: Methods;
|
|
116
116
|
path: HTTPRoutes[];
|
|
117
117
|
tags: APITags[];
|
|
118
|
-
handler
|
|
118
|
+
handler(req: Request, res: ServerResponse, logger: Logger, browser: BrowserInstance): Promise<void>;
|
|
119
119
|
}
|
|
@@ -54,7 +54,7 @@ export default class ChromiumScrapePostRoute extends BrowserHTTPRoute {
|
|
|
54
54
|
method = Methods.post;
|
|
55
55
|
path = [HTTPRoutes.scrape, HTTPRoutes.chromiumScrape];
|
|
56
56
|
tags = [APITags.browserAPI];
|
|
57
|
-
|
|
57
|
+
async handler(req, res, logger, browser) {
|
|
58
58
|
logger.info('Scrape API invoked with body:', req.body);
|
|
59
59
|
const contentType = !req.headers.accept || req.headers.accept?.includes('*')
|
|
60
60
|
? contentTypes.html
|
|
@@ -202,5 +202,5 @@ export default class ChromiumScrapePostRoute extends BrowserHTTPRoute {
|
|
|
202
202
|
page.close().catch(noop);
|
|
203
203
|
logger.info('Scrape API request completed');
|
|
204
204
|
return jsonResponse(res, 200, response, false);
|
|
205
|
-
}
|
|
205
|
+
}
|
|
206
206
|
}
|
|
@@ -46,5 +46,5 @@ export default class ScreenshotPost extends BrowserHTTPRoute {
|
|
|
46
46
|
method: Methods;
|
|
47
47
|
path: HTTPRoutes[];
|
|
48
48
|
tags: APITags[];
|
|
49
|
-
handler
|
|
49
|
+
handler(req: Request, res: ServerResponse, logger: Logger, browser: BrowserInstance): Promise<void>;
|
|
50
50
|
}
|
|
@@ -15,7 +15,7 @@ export default class ScreenshotPost extends BrowserHTTPRoute {
|
|
|
15
15
|
method = Methods.post;
|
|
16
16
|
path = [HTTPRoutes.screenshot, HTTPRoutes.chromiumScreenshot];
|
|
17
17
|
tags = [APITags.browserAPI];
|
|
18
|
-
|
|
18
|
+
async handler(req, res, logger, browser) {
|
|
19
19
|
logger.info('Screenshot API invoked with body:', req.body);
|
|
20
20
|
const contentType = !req.headers.accept || req.headers.accept?.includes('*')
|
|
21
21
|
? 'image/png'
|
|
@@ -125,5 +125,5 @@ export default class ScreenshotPost extends BrowserHTTPRoute {
|
|
|
125
125
|
await new Promise((r) => readStream.pipe(res).once('close', r));
|
|
126
126
|
page.close().catch(noop);
|
|
127
127
|
logger.info('Screenshot API request completed');
|
|
128
|
-
}
|
|
128
|
+
}
|
|
129
129
|
}
|
|
@@ -3,7 +3,9 @@ import { _connectToCdpBrowser as connect } from 'puppeteer-core/lib/esm/puppetee
|
|
|
3
3
|
export class FunctionRunner {
|
|
4
4
|
browser;
|
|
5
5
|
page;
|
|
6
|
-
log
|
|
6
|
+
log() {
|
|
7
|
+
return console.log.bind(console);
|
|
8
|
+
}
|
|
7
9
|
async start(data) {
|
|
8
10
|
console.log(`/function.js: Got endpoint: "${data.browserWSEndpoint}"`);
|
|
9
11
|
const { browserWSEndpoint, code, context, options } = data;
|
package/build/shim.d.ts
CHANGED
package/build/shim.js
CHANGED
|
@@ -8,7 +8,7 @@ const shimParam = ['headless', 'stealth', 'ignoreDefaultArgs', 'slowMo'];
|
|
|
8
8
|
*
|
|
9
9
|
* @param req A parsed user requests
|
|
10
10
|
*/
|
|
11
|
-
export
|
|
11
|
+
export function shimLegacyRequests(url) {
|
|
12
12
|
const { searchParams } = url;
|
|
13
13
|
const params = [...searchParams];
|
|
14
14
|
const names = params.map(([k]) => k);
|
|
@@ -52,4 +52,4 @@ export const shimLegacyRequests = (url) => {
|
|
|
52
52
|
searchParams.set('launch', JSON.stringify(launchParams));
|
|
53
53
|
}
|
|
54
54
|
return url;
|
|
55
|
-
}
|
|
55
|
+
}
|
package/build/token.d.ts
CHANGED
|
@@ -4,14 +4,14 @@ import { EventEmitter } from 'events';
|
|
|
4
4
|
export declare class Token extends EventEmitter {
|
|
5
5
|
protected config: Config;
|
|
6
6
|
constructor(config: Config);
|
|
7
|
-
isAuthorized
|
|
7
|
+
isAuthorized(req: Request, route: BrowserHTTPRoute | BrowserWebsocketRoute | HTTPRoute | WebSocketRoute): Promise<boolean>;
|
|
8
8
|
/**
|
|
9
9
|
* Implement any browserless-core-specific shutdown logic here.
|
|
10
10
|
* Calls the empty-SDK stop method for downstream implementations.
|
|
11
11
|
*/
|
|
12
|
-
shutdown
|
|
12
|
+
shutdown(): Promise<void>;
|
|
13
13
|
/**
|
|
14
14
|
* Left blank for downstream SDK modules to optionally implement.
|
|
15
15
|
*/
|
|
16
|
-
stop
|
|
16
|
+
stop(): void;
|
|
17
17
|
}
|
package/build/token.js
CHANGED
|
@@ -6,7 +6,7 @@ export class Token extends EventEmitter {
|
|
|
6
6
|
super();
|
|
7
7
|
this.config = config;
|
|
8
8
|
}
|
|
9
|
-
|
|
9
|
+
async isAuthorized(req, route) {
|
|
10
10
|
const token = this.config.getToken();
|
|
11
11
|
if (token === null) {
|
|
12
12
|
return true;
|
|
@@ -19,16 +19,16 @@ export class Token extends EventEmitter {
|
|
|
19
19
|
return false;
|
|
20
20
|
}
|
|
21
21
|
return (Array.isArray(token) ? token : [token]).includes(requestToken);
|
|
22
|
-
}
|
|
22
|
+
}
|
|
23
23
|
/**
|
|
24
24
|
* Implement any browserless-core-specific shutdown logic here.
|
|
25
25
|
* Calls the empty-SDK stop method for downstream implementations.
|
|
26
26
|
*/
|
|
27
|
-
|
|
28
|
-
await this.stop();
|
|
29
|
-
}
|
|
27
|
+
async shutdown() {
|
|
28
|
+
return await this.stop();
|
|
29
|
+
}
|
|
30
30
|
/**
|
|
31
31
|
* Left blank for downstream SDK modules to optionally implement.
|
|
32
32
|
*/
|
|
33
|
-
stop
|
|
33
|
+
stop() { }
|
|
34
34
|
}
|
package/build/types.d.ts
CHANGED
|
@@ -182,7 +182,7 @@ export declare abstract class HTTPRoute extends BasicHTTPRoute {
|
|
|
182
182
|
/**
|
|
183
183
|
* Handles an inbound HTTP request, and supplies the Request and Response objects from node's HTTP request event
|
|
184
184
|
*/
|
|
185
|
-
abstract handler
|
|
185
|
+
abstract handler(req: Request, res: http.ServerResponse, logger: Logger): Promise<unknown>;
|
|
186
186
|
}
|
|
187
187
|
/**
|
|
188
188
|
* A HTTP-based route, with a handler, that can fulfill requests but
|
|
@@ -196,7 +196,7 @@ export declare abstract class BrowserHTTPRoute extends BasicHTTPRoute {
|
|
|
196
196
|
* Handles an inbound HTTP request with a 3rd param of the predefined
|
|
197
197
|
* browser used for the route -- only Chrome CDP is support currently.
|
|
198
198
|
*/
|
|
199
|
-
abstract handler
|
|
199
|
+
abstract handler(req: Request, res: http.ServerResponse, logger: Logger, browser: BrowserInstance): Promise<unknown>;
|
|
200
200
|
/**
|
|
201
201
|
* An optional function to automatically set up or handle new page
|
|
202
202
|
* creation. Useful for injecting behaviors or other functionality.
|
|
@@ -212,7 +212,7 @@ export declare abstract class WebSocketRoute extends Route {
|
|
|
212
212
|
/**
|
|
213
213
|
* Handles an inbound Websocket request, and handles the connection
|
|
214
214
|
*/
|
|
215
|
-
abstract handler
|
|
215
|
+
abstract handler(req: Request, socket: stream.Duplex, head: Buffer, logger: Logger): Promise<unknown>;
|
|
216
216
|
}
|
|
217
217
|
/**
|
|
218
218
|
* A WebSocket-based route, with a handler, that can fulfill requests
|
|
@@ -279,7 +279,7 @@ export interface BrowserlessSession {
|
|
|
279
279
|
isTempDataDir: boolean;
|
|
280
280
|
launchOptions: CDPLaunchOptions | BrowserServerOptions;
|
|
281
281
|
numbConnected: number;
|
|
282
|
-
resolver
|
|
282
|
+
resolver(val: unknown): void;
|
|
283
283
|
routePath: string | string[];
|
|
284
284
|
startedOn: number;
|
|
285
285
|
ttl: number;
|
package/build/webhooks.d.ts
CHANGED
|
@@ -14,9 +14,9 @@ export declare class WebHooks extends EventEmitter {
|
|
|
14
14
|
* Implement any browserless-core-specific shutdown logic here.
|
|
15
15
|
* Calls the empty-SDK stop method for downstream implementations.
|
|
16
16
|
*/
|
|
17
|
-
shutdown
|
|
17
|
+
shutdown(): Promise<void>;
|
|
18
18
|
/**
|
|
19
19
|
* Left blank for downstream SDK modules to optionally implement.
|
|
20
20
|
*/
|
|
21
|
-
stop
|
|
21
|
+
stop(): void;
|
|
22
22
|
}
|
package/build/webhooks.js
CHANGED
|
@@ -46,11 +46,11 @@ export class WebHooks extends EventEmitter {
|
|
|
46
46
|
* Implement any browserless-core-specific shutdown logic here.
|
|
47
47
|
* Calls the empty-SDK stop method for downstream implementations.
|
|
48
48
|
*/
|
|
49
|
-
|
|
50
|
-
await this.stop();
|
|
51
|
-
}
|
|
49
|
+
async shutdown() {
|
|
50
|
+
return await this.stop();
|
|
51
|
+
}
|
|
52
52
|
/**
|
|
53
53
|
* Left blank for downstream SDK modules to optionally implement.
|
|
54
54
|
*/
|
|
55
|
-
stop
|
|
55
|
+
stop() { }
|
|
56
56
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@browserless.io/browserless",
|
|
3
|
-
"version": "2.12.0
|
|
3
|
+
"version": "2.12.0",
|
|
4
4
|
"license": "SSPL",
|
|
5
5
|
"description": "The browserless platform",
|
|
6
6
|
"author": "browserless.io",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"gradient-string": "^2.0.0",
|
|
58
58
|
"http-proxy": "^1.18.1",
|
|
59
59
|
"lighthouse": "^12.0.0",
|
|
60
|
-
"micromatch": "^4.0.
|
|
60
|
+
"micromatch": "^4.0.7",
|
|
61
61
|
"playwright-1.40": "npm:playwright-core@1.40.1",
|
|
62
62
|
"playwright-1.41": "npm:playwright-core@1.41.2",
|
|
63
63
|
"playwright-1.42": "npm:playwright-core@1.42.1",
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"@types/mocha": "^10.0.6",
|
|
80
80
|
"@types/node": "^20.12.12",
|
|
81
81
|
"@types/sinon": "^17.0.3",
|
|
82
|
-
"@typescript-eslint/eslint-plugin": "^7.
|
|
82
|
+
"@typescript-eslint/eslint-plugin": "^7.10.0",
|
|
83
83
|
"@typescript-eslint/parser": "^7.10.0",
|
|
84
84
|
"assert": "^2.0.0",
|
|
85
85
|
"chai": "^5.1.1",
|
package/src/browserless.ts
CHANGED
|
@@ -119,15 +119,15 @@ export class Browserless extends EventEmitter {
|
|
|
119
119
|
new Router(this.config, this.browserManager, this.limiter, this.Logger);
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
protected
|
|
122
|
+
protected async loadPwVersions(): Promise<void> {
|
|
123
123
|
const { playwrightVersions } = JSON.parse(
|
|
124
124
|
(await fs.readFile('package.json')).toString(),
|
|
125
125
|
);
|
|
126
126
|
|
|
127
127
|
this.config.setPwVersions(playwrightVersions);
|
|
128
|
-
}
|
|
128
|
+
}
|
|
129
129
|
|
|
130
|
-
protected
|
|
130
|
+
protected async saveMetrics(): Promise<void> {
|
|
131
131
|
const metricsPath = this.config.getMetricsJSONPath();
|
|
132
132
|
const { cpu, memory } = await this.monitoring.getMachineStats();
|
|
133
133
|
const metrics = await this.metrics.get();
|
|
@@ -163,9 +163,9 @@ export class Browserless extends EventEmitter {
|
|
|
163
163
|
false,
|
|
164
164
|
);
|
|
165
165
|
}
|
|
166
|
-
}
|
|
166
|
+
}
|
|
167
167
|
|
|
168
|
-
public setMetricsSaveInterval
|
|
168
|
+
public setMetricsSaveInterval(interval: number) {
|
|
169
169
|
if (interval <= 0) {
|
|
170
170
|
return console.warn(
|
|
171
171
|
`Interval value of "${interval}" must be greater than 1. Ignoring`,
|
|
@@ -178,7 +178,7 @@ export class Browserless extends EventEmitter {
|
|
|
178
178
|
this.saveMetrics,
|
|
179
179
|
this.metricsSaveInterval,
|
|
180
180
|
);
|
|
181
|
-
}
|
|
181
|
+
}
|
|
182
182
|
|
|
183
183
|
protected routeIsDisabled(route: routeInstances) {
|
|
184
184
|
return this.disabledRouteNames.some((name) => name === route.name);
|