@browserless.io/browserless 2.0.0-beta-5 → 2.0.0-beta-7
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/LICENSE +2 -0
- package/README.md +11 -11
- package/bin/browserless.js +169 -11
- package/bin/scaffold/README.md +415 -0
- package/bin/scaffold/package.json +21 -0
- package/bin/scaffold/src/hello-world.http.ts +27 -0
- package/bin/scaffold/tsconfig.json +4 -0
- package/build/browserless.js +18 -15
- package/build/browsers/index.d.ts +2 -18
- package/build/browsers/index.js +43 -14
- package/build/file-system.d.ts +5 -0
- package/build/file-system.js +20 -5
- package/build/file-system.spec.d.ts +1 -0
- package/build/file-system.spec.js +44 -0
- package/build/http.d.ts +3 -3
- package/build/http.js +3 -3
- package/build/router.js +2 -4
- package/build/routes/chromium/http/content-post.body.json +8 -8
- package/build/routes/chromium/http/content-post.d.ts +15 -3
- package/build/routes/chromium/http/content-post.js +14 -15
- package/build/routes/chromium/http/download-post.d.ts +16 -3
- package/build/routes/chromium/http/download-post.js +17 -22
- package/build/routes/chromium/http/function-post.d.ts +16 -3
- package/build/routes/chromium/http/function-post.js +17 -22
- package/build/routes/chromium/http/pdf-post.body.json +8 -8
- package/build/routes/chromium/http/pdf-post.d.ts +15 -3
- package/build/routes/chromium/http/pdf-post.js +19 -15
- package/build/routes/chromium/http/performance.d.ts +15 -3
- package/build/routes/chromium/http/performance.js +15 -23
- package/build/routes/chromium/http/scrape-post.body.json +8 -8
- package/build/routes/chromium/http/scrape-post.d.ts +15 -3
- package/build/routes/chromium/http/scrape-post.js +15 -16
- package/build/routes/chromium/http/screenshot-post.body.json +8 -8
- package/build/routes/chromium/http/screenshot-post.d.ts +15 -3
- package/build/routes/chromium/http/screenshot-post.js +18 -15
- package/build/routes/chromium/tests/websocket.spec.js +20 -1
- package/build/routes/chromium/utils/function/handler.js +2 -2
- package/build/routes/chromium/ws/browser.d.ts +13 -3
- package/build/routes/chromium/ws/browser.js +10 -11
- package/build/routes/chromium/ws/cdp-chromium.d.ts +13 -3
- package/build/routes/chromium/ws/cdp-chromium.js +10 -11
- package/build/routes/chromium/ws/page.d.ts +13 -3
- package/build/routes/chromium/ws/page.js +10 -11
- package/build/routes/chromium/ws/playwright-chromium.d.ts +13 -3
- package/build/routes/chromium/ws/playwright-chromium.js +11 -12
- package/build/routes/firefox/ws/playwright-firefox.d.ts +13 -3
- package/build/routes/firefox/ws/playwright-firefox.js +11 -12
- package/build/routes/management/http/config-get.d.ts +15 -3
- package/build/routes/management/http/config-get.js +15 -20
- package/build/routes/management/http/metrics-get.d.ts +15 -3
- package/build/routes/management/http/metrics-get.js +16 -21
- package/build/routes/management/http/metrics-total-get.d.ts +15 -3
- package/build/routes/management/http/metrics-total-get.js +16 -21
- package/build/routes/management/http/sessions-get.d.ts +15 -3
- package/build/routes/management/http/sessions-get.js +16 -20
- package/build/routes/management/http/static-get.d.ts +15 -3
- package/build/routes/management/http/static-get.js +15 -20
- package/build/routes/webkit/ws/playwright-webkit.d.ts +13 -3
- package/build/routes/webkit/ws/playwright-webkit.js +11 -12
- package/build/server.js +0 -1
- package/build/types.d.ts +48 -38
- package/build/types.js +135 -0
- package/extensions/ublock/1p-filters.html +0 -1
- package/extensions/ublock/3p-filters.html +0 -2
- package/extensions/ublock/_locales/bg/messages.json +6 -6
- package/extensions/ublock/_locales/br_FR/messages.json +14 -14
- package/extensions/ublock/_locales/bs/messages.json +8 -8
- package/extensions/ublock/_locales/ca/messages.json +1 -1
- package/extensions/ublock/_locales/da/messages.json +5 -5
- package/extensions/ublock/_locales/fa/messages.json +1 -1
- package/extensions/ublock/_locales/fi/messages.json +6 -6
- package/extensions/ublock/_locales/hr/messages.json +4 -4
- package/extensions/ublock/_locales/nb/messages.json +1 -1
- package/extensions/ublock/_locales/no/messages.json +1 -1
- package/extensions/ublock/_locales/ro/messages.json +2 -2
- package/extensions/ublock/_locales/ru/messages.json +1 -1
- package/extensions/ublock/_locales/sk/messages.json +1 -1
- package/extensions/ublock/_locales/sv/messages.json +2 -2
- package/extensions/ublock/_locales/te/messages.json +17 -17
- package/extensions/ublock/_locales/vi/messages.json +12 -12
- package/extensions/ublock/_locales/zh_TW/messages.json +13 -13
- package/extensions/ublock/assets/assets.json +3 -3
- package/extensions/ublock/assets/resources/scriptlets.js +218 -97
- package/extensions/ublock/assets/thirdparties/easylist/easylist.txt +3010 -2056
- package/extensions/ublock/assets/thirdparties/easylist/easyprivacy.txt +624 -433
- package/extensions/ublock/assets/thirdparties/pgl.yoyo.org/as/serverlist +93 -24
- package/extensions/ublock/assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat +7 -15
- package/extensions/ublock/assets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt +795 -777
- package/extensions/ublock/assets/ublock/badware.min.txt +138 -72
- package/extensions/ublock/assets/ublock/filters.min.txt +1929 -2735
- package/extensions/ublock/assets/ublock/privacy.min.txt +57 -26
- package/extensions/ublock/assets/ublock/quick-fixes.min.txt +125 -74
- package/extensions/ublock/assets/ublock/unbreak.min.txt +46 -53
- package/extensions/ublock/css/codemirror.css +8 -7
- package/extensions/ublock/css/dom-inspector.css +40 -0
- package/extensions/ublock/css/logger-ui-inspector.css +7 -1
- package/extensions/ublock/css/logger-ui.css +12 -5
- package/extensions/ublock/css/popup-fenix.css +1 -1
- package/extensions/ublock/devtools.html +1 -0
- package/extensions/ublock/js/1p-filters.js +4 -3
- package/extensions/ublock/js/3p-filters.js +25 -31
- package/extensions/ublock/js/about.js +1 -1
- package/extensions/ublock/js/advanced-settings.js +1 -1
- package/extensions/ublock/js/asset-viewer.js +1 -1
- package/extensions/ublock/js/assets.js +74 -44
- package/extensions/ublock/js/background.js +9 -3
- package/extensions/ublock/js/base64-custom.js +1 -1
- package/extensions/ublock/js/benchmarks.js +1 -1
- package/extensions/ublock/js/biditrie.js +1 -1
- package/extensions/ublock/js/broadcast.js +75 -0
- package/extensions/ublock/js/cachestorage.js +68 -45
- package/extensions/ublock/js/click2load.js +1 -1
- package/extensions/ublock/js/cloud-ui.js +1 -1
- package/extensions/ublock/js/code-viewer.js +1 -1
- package/extensions/ublock/js/codemirror/search-thread.js +1 -1
- package/extensions/ublock/js/codemirror/search.js +1 -1
- package/extensions/ublock/js/codemirror/ubo-dynamic-filtering.js +1 -1
- package/extensions/ublock/js/codemirror/ubo-static-filtering.js +98 -24
- package/extensions/ublock/js/commands.js +1 -1
- package/extensions/ublock/js/console.js +1 -1
- package/extensions/ublock/js/contentscript-extra.js +1 -1
- package/extensions/ublock/js/contentscript.js +1 -3
- package/extensions/ublock/js/contextmenu.js +1 -1
- package/extensions/ublock/js/cosmetic-filtering.js +4 -4
- package/extensions/ublock/js/dashboard-common.js +1 -1
- package/extensions/ublock/js/dashboard.js +1 -1
- package/extensions/ublock/js/devtools.js +23 -15
- package/extensions/ublock/js/diff-updater.js +3 -3
- package/extensions/ublock/js/document-blocked.js +1 -1
- package/extensions/ublock/js/dom-inspector.js +68 -0
- package/extensions/ublock/js/dom.js +1 -1
- package/extensions/ublock/js/dyna-rules.js +1 -1
- package/extensions/ublock/js/dynamic-net-filtering.js +1 -1
- package/extensions/ublock/js/epicker-ui.js +35 -59
- package/extensions/ublock/js/fa-icons.js +1 -1
- package/extensions/ublock/js/filtering-context.js +1 -1
- package/extensions/ublock/js/filtering-engines.js +1 -1
- package/extensions/ublock/js/hnswitches.js +1 -1
- package/extensions/ublock/js/hntrie.js +1 -1
- package/extensions/ublock/js/html-filtering.js +1 -1
- package/extensions/ublock/js/httpheader-filtering.js +1 -1
- package/extensions/ublock/js/i18n.js +1 -1
- package/extensions/ublock/js/is-webrtc-supported.js +1 -1
- package/extensions/ublock/js/logger-ui-inspector.js +203 -145
- package/extensions/ublock/js/logger-ui.js +21 -5
- package/extensions/ublock/js/logger.js +6 -2
- package/extensions/ublock/js/lz4.js +2 -2
- package/extensions/ublock/js/messaging.js +266 -166
- package/extensions/ublock/js/mrucache.js +58 -0
- package/extensions/ublock/js/pagestore.js +1 -1
- package/extensions/ublock/js/popup-fenix.js +2 -1
- package/extensions/ublock/js/redirect-engine.js +1 -1
- package/extensions/ublock/js/redirect-resources.js +1 -12
- package/extensions/ublock/js/reverselookup-worker.js +1 -1
- package/extensions/ublock/js/reverselookup.js +1 -1
- package/extensions/ublock/js/scriptlet-filtering-core.js +300 -0
- package/extensions/ublock/js/scriptlet-filtering.js +122 -350
- package/extensions/ublock/js/scriptlets/cosmetic-logger.js +36 -47
- package/extensions/ublock/js/scriptlets/cosmetic-off.js +1 -1
- package/extensions/ublock/js/scriptlets/cosmetic-on.js +1 -1
- package/extensions/ublock/js/scriptlets/cosmetic-report.js +1 -1
- package/extensions/ublock/js/scriptlets/dom-inspector.js +341 -323
- package/extensions/ublock/js/scriptlets/dom-survey-elements.js +1 -1
- package/extensions/ublock/js/scriptlets/dom-survey-scripts.js +1 -1
- package/extensions/ublock/js/scriptlets/epicker.js +80 -89
- package/extensions/ublock/js/scriptlets/load-3p-css.js +1 -1
- package/extensions/ublock/js/scriptlets/load-large-media-all.js +1 -1
- package/extensions/ublock/js/scriptlets/load-large-media-interactive.js +1 -1
- package/extensions/ublock/js/scriptlets/noscript-spoof.js +1 -1
- package/extensions/ublock/js/scriptlets/should-inject-contentscript.js +1 -1
- package/extensions/ublock/js/scriptlets/subscriber.js +1 -1
- package/extensions/ublock/js/scriptlets/updater.js +20 -3
- package/extensions/ublock/js/settings.js +1 -1
- package/extensions/ublock/js/start.js +19 -20
- package/extensions/ublock/js/static-dnr-filtering.js +1 -1
- package/extensions/ublock/js/static-ext-filtering-db.js +1 -1
- package/extensions/ublock/js/static-ext-filtering.js +1 -1
- package/extensions/ublock/js/static-filtering-io.js +1 -1
- package/extensions/ublock/js/static-filtering-parser.js +5 -3
- package/extensions/ublock/js/static-net-filtering.js +57 -37
- package/extensions/ublock/js/storage.js +49 -29
- package/extensions/ublock/js/support.js +4 -4
- package/extensions/ublock/js/tab.js +1 -1
- package/extensions/ublock/js/tasks.js +1 -1
- package/extensions/ublock/js/text-encode.js +1 -1
- package/extensions/ublock/js/text-utils.js +1 -1
- package/extensions/ublock/js/theme.js +1 -1
- package/extensions/ublock/js/traffic.js +2 -1
- package/extensions/ublock/js/ublock.js +15 -11
- package/extensions/ublock/js/uri-utils.js +1 -1
- package/extensions/ublock/js/url-net-filtering.js +1 -1
- package/extensions/ublock/js/utils.js +1 -73
- package/extensions/ublock/js/vapi-background-ext.js +1 -1
- package/extensions/ublock/js/vapi-background.js +92 -83
- package/extensions/ublock/js/vapi-client.js +4 -33
- package/extensions/ublock/js/vapi-common.js +16 -30
- package/extensions/ublock/js/vapi.js +1 -1
- package/extensions/ublock/js/wasm/biditrie.wat +1 -1
- package/extensions/ublock/js/wasm/hntrie.wat +1 -1
- package/extensions/ublock/js/webext.js +1 -1
- package/extensions/ublock/js/whitelist.js +1 -1
- package/extensions/ublock/logger-ui.html +2 -2
- package/extensions/ublock/manifest.json +1 -1
- package/extensions/ublock/support.html +0 -1
- package/extensions/ublock/web_accessible_resources/dom-inspector.html +25 -0
- package/extensions/ublock/web_accessible_resources/epicker-ui.html +0 -1
- package/extensions/ublock/web_accessible_resources/googletagservices_gpt.js +1 -0
- package/package.json +7 -19
- package/scripts/build-open-api.js +7 -4
- package/src/browserless.ts +42 -18
- package/src/browsers/index.ts +48 -20
- package/src/file-system.spec.ts +58 -0
- package/src/file-system.ts +36 -8
- package/src/http.ts +3 -3
- package/src/router.ts +2 -6
- package/src/routes/chromium/http/content-post.ts +13 -16
- package/src/routes/chromium/http/download-post.ts +16 -27
- package/src/routes/chromium/http/function-post.ts +16 -25
- package/src/routes/chromium/http/pdf-post.ts +19 -15
- package/src/routes/chromium/http/performance.ts +14 -26
- package/src/routes/chromium/http/scrape-post.ts +14 -16
- package/src/routes/chromium/http/screenshot-post.ts +18 -15
- package/src/routes/chromium/tests/websocket.spec.ts +28 -1
- package/src/routes/chromium/utils/function/handler.ts +2 -1
- package/src/routes/chromium/ws/browser.ts +10 -12
- package/src/routes/chromium/ws/cdp-chromium.ts +10 -12
- package/src/routes/chromium/ws/page.ts +10 -12
- package/src/routes/chromium/ws/playwright-chromium.ts +10 -12
- package/src/routes/firefox/ws/playwright-firefox.ts +10 -12
- package/src/routes/management/http/config-get.ts +14 -23
- package/src/routes/management/http/metrics-get.ts +15 -24
- package/src/routes/management/http/metrics-total-get.ts +15 -26
- package/src/routes/management/http/sessions-get.ts +15 -23
- package/src/routes/management/http/static-get.ts +14 -22
- package/src/routes/webkit/ws/playwright-webkit.ts +10 -12
- package/src/server.ts +0 -1
- package/src/types.ts +59 -45
- package/static/docs/browserless-logo-inline.svg +1 -0
- package/static/docs/index.html +27 -0
- package/static/docs/swagger.json +33 -33
- package/static/function/client.js +626 -78
- package/extensions/ublock/js/vapi-client-extra.js +0 -312
- package/extensions/ublock/web_accessible_resources/addthis_widget.js +0 -39
- package/extensions/ublock/web_accessible_resources/ligatus_angular-tag.js +0 -29
- package/extensions/ublock/web_accessible_resources/monkeybroker.js +0 -43
- package/extensions/ublock/web_accessible_resources/mxpnl_mixpanel.js +0 -51
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
bestAttempt,
|
|
17
17
|
bestAttemptCatch,
|
|
18
18
|
contentTypes,
|
|
19
|
+
dedent,
|
|
19
20
|
noop,
|
|
20
21
|
rejectRequestPattern,
|
|
21
22
|
rejectResourceTypes,
|
|
@@ -61,14 +62,22 @@ export interface QuerySchema extends SystemQueryParameters {
|
|
|
61
62
|
*/
|
|
62
63
|
export type ResponseSchema = string;
|
|
63
64
|
|
|
64
|
-
|
|
65
|
-
accepts
|
|
66
|
-
auth
|
|
67
|
-
browser
|
|
68
|
-
concurrency
|
|
69
|
-
contentTypes
|
|
70
|
-
description
|
|
71
|
-
|
|
65
|
+
export default class PDFPost extends BrowserHTTPRoute {
|
|
66
|
+
accepts = [contentTypes.json];
|
|
67
|
+
auth = true;
|
|
68
|
+
browser = CDPChromium;
|
|
69
|
+
concurrency = true;
|
|
70
|
+
contentTypes = [contentTypes.pdf];
|
|
71
|
+
description = dedent(`
|
|
72
|
+
A JSON-based API for getting a PDF binary from either a supplied
|
|
73
|
+
"url" or "html" payload in your request. Many options exist for
|
|
74
|
+
injecting cookies, request interceptors, user-agents and waiting for
|
|
75
|
+
selectors, timers and more.
|
|
76
|
+
`);
|
|
77
|
+
method = Methods.post;
|
|
78
|
+
path = HTTPRoutes.pdf;
|
|
79
|
+
tags = [APITags.browserAPI];
|
|
80
|
+
handler = async (
|
|
72
81
|
req: Request,
|
|
73
82
|
res: ServerResponse,
|
|
74
83
|
browser: BrowserInstance,
|
|
@@ -225,10 +234,5 @@ const route: BrowserHTTPRoute = {
|
|
|
225
234
|
});
|
|
226
235
|
|
|
227
236
|
page.close().catch(noop);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
path: HTTPRoutes.pdf,
|
|
231
|
-
tags: [APITags.browserAPI],
|
|
232
|
-
};
|
|
233
|
-
|
|
234
|
-
export default route;
|
|
237
|
+
};
|
|
238
|
+
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
2
|
APITags,
|
|
3
|
-
BadRequest,
|
|
4
3
|
BrowserHTTPRoute,
|
|
5
4
|
BrowserInstance,
|
|
6
5
|
CDPChromium,
|
|
@@ -8,7 +7,6 @@ import {
|
|
|
8
7
|
HTTPRoutes,
|
|
9
8
|
Methods,
|
|
10
9
|
Request,
|
|
11
|
-
ServerError,
|
|
12
10
|
SystemQueryParameters,
|
|
13
11
|
contentTypes,
|
|
14
12
|
jsonResponse,
|
|
@@ -34,27 +32,22 @@ export interface QuerySchema extends SystemQueryParameters {
|
|
|
34
32
|
*/
|
|
35
33
|
export type ResponseSchema = object;
|
|
36
34
|
|
|
37
|
-
|
|
38
|
-
accepts
|
|
39
|
-
auth
|
|
40
|
-
browser
|
|
41
|
-
concurrency
|
|
42
|
-
contentTypes
|
|
43
|
-
description
|
|
44
|
-
|
|
35
|
+
export default class PerformancePost extends BrowserHTTPRoute {
|
|
36
|
+
accepts = [contentTypes.json];
|
|
37
|
+
auth = true;
|
|
38
|
+
browser = CDPChromium;
|
|
39
|
+
concurrency = true;
|
|
40
|
+
contentTypes = [contentTypes.json];
|
|
41
|
+
description = `Run lighthouse performance audits with a supplied "url" in your JSON payload.`;
|
|
42
|
+
method = Methods.post;
|
|
43
|
+
path = HTTPRoutes.performance;
|
|
44
|
+
tags = [APITags.browserAPI];
|
|
45
|
+
handler = async (
|
|
45
46
|
req: Request,
|
|
46
47
|
res: ServerResponse,
|
|
47
48
|
browser: BrowserInstance,
|
|
48
49
|
): Promise<void> => {
|
|
49
|
-
const
|
|
50
|
-
if (!req.body) {
|
|
51
|
-
throw new BadRequest(`No JSON body present`);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (!getConfig) {
|
|
55
|
-
throw new ServerError(`Couldn't load configuration for timeouts`);
|
|
56
|
-
}
|
|
57
|
-
const config = getConfig();
|
|
50
|
+
const config = this.config();
|
|
58
51
|
const response = await main({
|
|
59
52
|
browser,
|
|
60
53
|
context: req.body as BodySchema,
|
|
@@ -62,10 +55,5 @@ const route: BrowserHTTPRoute = {
|
|
|
62
55
|
});
|
|
63
56
|
|
|
64
57
|
return jsonResponse(res, 200, response);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
path: HTTPRoutes.performance,
|
|
68
|
-
tags: [APITags.browserAPI],
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
export default route;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
@@ -198,18 +198,21 @@ const scrape = async (elements: ScrapeElementSelector[]) => {
|
|
|
198
198
|
});
|
|
199
199
|
};
|
|
200
200
|
|
|
201
|
-
|
|
202
|
-
accepts
|
|
203
|
-
auth
|
|
204
|
-
browser
|
|
205
|
-
concurrency
|
|
206
|
-
contentTypes
|
|
207
|
-
description
|
|
201
|
+
export default class ScrapePost extends BrowserHTTPRoute {
|
|
202
|
+
accepts = [contentTypes.json];
|
|
203
|
+
auth = true;
|
|
204
|
+
browser = CDPChromium;
|
|
205
|
+
concurrency = true;
|
|
206
|
+
contentTypes = [contentTypes.json];
|
|
207
|
+
description = dedent(`
|
|
208
208
|
A JSON-based API that returns text, html, and meta-data from a given list of selectors.
|
|
209
209
|
Debugging information is available by sending in the appropriate flags in the "debugOpts"
|
|
210
210
|
property. Responds with an array of JSON objects.
|
|
211
|
-
`)
|
|
212
|
-
|
|
211
|
+
`);
|
|
212
|
+
method = Methods.post;
|
|
213
|
+
path = HTTPRoutes.scrape;
|
|
214
|
+
tags = [APITags.browserAPI];
|
|
215
|
+
handler = async (
|
|
213
216
|
req: Request,
|
|
214
217
|
res: ServerResponse,
|
|
215
218
|
browser: BrowserInstance,
|
|
@@ -430,10 +433,5 @@ const route: BrowserHTTPRoute = {
|
|
|
430
433
|
page.close().catch(noop);
|
|
431
434
|
|
|
432
435
|
return jsonResponse(res, 200, response, false);
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
path: HTTPRoutes.scrape,
|
|
436
|
-
tags: [APITags.browserAPI],
|
|
437
|
-
};
|
|
438
|
-
|
|
439
|
-
export default route;
|
|
436
|
+
};
|
|
437
|
+
}
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
bestAttempt,
|
|
17
17
|
bestAttemptCatch,
|
|
18
18
|
contentTypes,
|
|
19
|
+
dedent,
|
|
19
20
|
noop,
|
|
20
21
|
rejectRequestPattern,
|
|
21
22
|
rejectResourceTypes,
|
|
@@ -64,14 +65,21 @@ export interface BodySchema {
|
|
|
64
65
|
waitForTimeout?: Parameters<Page['waitForTimeout']>[0];
|
|
65
66
|
}
|
|
66
67
|
|
|
67
|
-
|
|
68
|
-
accepts
|
|
69
|
-
auth
|
|
70
|
-
browser
|
|
71
|
-
concurrency
|
|
72
|
-
contentTypes
|
|
73
|
-
description
|
|
74
|
-
|
|
68
|
+
export default class ScreenshotPost extends BrowserHTTPRoute {
|
|
69
|
+
accepts = [contentTypes.json];
|
|
70
|
+
auth = true;
|
|
71
|
+
browser = CDPChromium;
|
|
72
|
+
concurrency = true;
|
|
73
|
+
contentTypes = [contentTypes.png, contentTypes.jpeg, contentTypes.text];
|
|
74
|
+
description = dedent(`
|
|
75
|
+
A JSON-based API for getting a screenshot binary from either a supplied
|
|
76
|
+
"url" or "html" payload in your request. Many options exist including
|
|
77
|
+
cookies, user-agents, setting timers and network mocks.
|
|
78
|
+
`);
|
|
79
|
+
method = Methods.post;
|
|
80
|
+
path = HTTPRoutes.screenshot;
|
|
81
|
+
tags = [APITags.browserAPI];
|
|
82
|
+
handler = async (
|
|
75
83
|
req: Request,
|
|
76
84
|
res: ServerResponse,
|
|
77
85
|
browser: BrowserInstance,
|
|
@@ -253,10 +261,5 @@ const route: BrowserHTTPRoute = {
|
|
|
253
261
|
await new Promise((r) => readStream.pipe(res).once('close', r));
|
|
254
262
|
|
|
255
263
|
page.close().catch(noop);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
path: HTTPRoutes.screenshot,
|
|
259
|
-
tags: [APITags.browserAPI],
|
|
260
|
-
};
|
|
261
|
-
|
|
262
|
-
export default route;
|
|
264
|
+
};
|
|
265
|
+
}
|
|
@@ -170,6 +170,33 @@ describe('WebSocket API', function () {
|
|
|
170
170
|
expect(await exists(userDataDir)).to.be.false;
|
|
171
171
|
});
|
|
172
172
|
|
|
173
|
+
it('allows specified user-data-dirs', async () => {
|
|
174
|
+
const dataDir = '/tmp/data-dir';
|
|
175
|
+
const config = new Config();
|
|
176
|
+
config.setToken('browserless');
|
|
177
|
+
const metrics = new Metrics();
|
|
178
|
+
await start({ config, metrics });
|
|
179
|
+
const launch = JSON.stringify({
|
|
180
|
+
args: [`--user-data-dir=${dataDir}`],
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
const browser = await puppeteer.connect({
|
|
184
|
+
browserWSEndpoint: `ws://localhost:3000?token=browserless&launch=${launch}`,
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
const [{ userDataDir }] = await fetch(
|
|
188
|
+
'http://localhost:3000/sessions?token=browserless',
|
|
189
|
+
).then((r) => r.json());
|
|
190
|
+
|
|
191
|
+
expect(await exists(userDataDir)).to.be.true;
|
|
192
|
+
expect(userDataDir).to.equal(dataDir);
|
|
193
|
+
|
|
194
|
+
await browser.disconnect();
|
|
195
|
+
await sleep(1000);
|
|
196
|
+
|
|
197
|
+
expect(await exists(userDataDir)).to.be.true;
|
|
198
|
+
});
|
|
199
|
+
|
|
173
200
|
it('creates user-data-dirs with userDataDir options', async () => {
|
|
174
201
|
const dataDirLocation = '/tmp/browserless-test-dir';
|
|
175
202
|
const launch = JSON.stringify({
|
|
@@ -201,7 +228,7 @@ describe('WebSocket API', function () {
|
|
|
201
228
|
it('creates user-data-dirs with CLI flags', async () => {
|
|
202
229
|
const dataDirLocation = '/tmp/browserless-test-dir';
|
|
203
230
|
const launch = JSON.stringify({
|
|
204
|
-
args: [`--user-data-dir
|
|
231
|
+
args: [`--user-data-dir=${dataDirLocation}`],
|
|
205
232
|
});
|
|
206
233
|
const config = new Config();
|
|
207
234
|
config.setToken('browserless');
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
contentTypes,
|
|
10
10
|
convertIfBase64,
|
|
11
11
|
exists,
|
|
12
|
+
getTokenFromRequest,
|
|
12
13
|
id,
|
|
13
14
|
makeExternalURL,
|
|
14
15
|
mimeTypes,
|
|
@@ -66,7 +67,7 @@ export default (
|
|
|
66
67
|
const context = JSON.stringify(rawContext);
|
|
67
68
|
const code = convertIfBase64(rawCode);
|
|
68
69
|
const browserWSEndpoint = browser.publicWSEndpoint(
|
|
69
|
-
req
|
|
70
|
+
getTokenFromRequest(req) ?? '',
|
|
70
71
|
);
|
|
71
72
|
|
|
72
73
|
if (!browserWSEndpoint) {
|
|
@@ -13,19 +13,17 @@ export interface QuerySchema extends SystemQueryParameters {
|
|
|
13
13
|
launch?: CDPLaunchOptions | string;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
auth
|
|
18
|
-
browser
|
|
19
|
-
concurrency
|
|
20
|
-
description
|
|
21
|
-
|
|
16
|
+
export default class CDPExistingBrowser extends BrowserWebsocketRoute {
|
|
17
|
+
auth = true;
|
|
18
|
+
browser = CDPChromium;
|
|
19
|
+
concurrency = false;
|
|
20
|
+
description = `Connect to an already-running Chromium with a library like puppeteer, or others, that work over chrome-devtools-protocol.`;
|
|
21
|
+
path = WebsocketRoutes.browser;
|
|
22
|
+
tags = [APITags.browserWS];
|
|
23
|
+
handler = async (
|
|
22
24
|
req: Request,
|
|
23
25
|
socket: Duplex,
|
|
24
26
|
head: Buffer,
|
|
25
27
|
chrome: CDPChromium,
|
|
26
|
-
): Promise<void> => chrome.proxyWebSocket(req, socket, head)
|
|
27
|
-
|
|
28
|
-
tags: [APITags.browserWS],
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export default route;
|
|
28
|
+
): Promise<void> => chrome.proxyWebSocket(req, socket, head);
|
|
29
|
+
}
|
|
@@ -13,19 +13,17 @@ export interface QuerySchema extends SystemQueryParameters {
|
|
|
13
13
|
launch?: CDPLaunchOptions | string;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
auth
|
|
18
|
-
browser
|
|
19
|
-
concurrency
|
|
20
|
-
description
|
|
21
|
-
|
|
16
|
+
export default class CDPChromiumRoute extends BrowserWebsocketRoute {
|
|
17
|
+
auth = true;
|
|
18
|
+
browser = CDPChromium;
|
|
19
|
+
concurrency = true;
|
|
20
|
+
description = `Launch and connect to Chromium with a library like puppeteer or others that work over chrome-devtools-protocol.`;
|
|
21
|
+
path = WebsocketRoutes['/'];
|
|
22
|
+
tags = [APITags.browserWS];
|
|
23
|
+
handler = async (
|
|
22
24
|
req: Request,
|
|
23
25
|
socket: Duplex,
|
|
24
26
|
head: Buffer,
|
|
25
27
|
chrome: CDPChromium,
|
|
26
|
-
): Promise<void> => chrome.proxyWebSocket(req, socket, head)
|
|
27
|
-
|
|
28
|
-
tags: [APITags.browserWS],
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export default route;
|
|
28
|
+
): Promise<void> => chrome.proxyWebSocket(req, socket, head);
|
|
29
|
+
}
|
|
@@ -13,19 +13,17 @@ export interface QuerySchema extends SystemQueryParameters {
|
|
|
13
13
|
launch?: CDPLaunchOptions | string;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
auth
|
|
18
|
-
browser
|
|
19
|
-
concurrency
|
|
20
|
-
description
|
|
21
|
-
|
|
16
|
+
export default class PageWebSocketRoute extends BrowserWebsocketRoute {
|
|
17
|
+
auth = true;
|
|
18
|
+
browser = CDPChromium;
|
|
19
|
+
concurrency = false;
|
|
20
|
+
description = `Connect to Chromium with a library like chrome-remote-interface or others that work over JSON chrome-devtools-protocol.`;
|
|
21
|
+
path = WebsocketRoutes.page;
|
|
22
|
+
tags = [APITags.browserWS];
|
|
23
|
+
handler = async (
|
|
22
24
|
req: Request,
|
|
23
25
|
socket: Duplex,
|
|
24
26
|
head: Buffer,
|
|
25
27
|
chrome: CDPChromium,
|
|
26
|
-
): Promise<void> => chrome.proxyPageWebSocket(req, socket, head)
|
|
27
|
-
|
|
28
|
-
tags: [APITags.browserWS],
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export default route;
|
|
28
|
+
): Promise<void> => chrome.proxyPageWebSocket(req, socket, head);
|
|
29
|
+
}
|
|
@@ -14,12 +14,14 @@ export interface QuerySchema extends SystemQueryParameters {
|
|
|
14
14
|
launch?: BrowserServerOptions | string;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
auth
|
|
19
|
-
browser
|
|
20
|
-
concurrency
|
|
21
|
-
description
|
|
22
|
-
|
|
17
|
+
export default class PlaywrightChromiumRoute extends BrowserWebsocketRoute {
|
|
18
|
+
auth = true;
|
|
19
|
+
browser = PlaywrightChromium;
|
|
20
|
+
concurrency = true;
|
|
21
|
+
description = `Connect to Chromium with any playwright style library.`;
|
|
22
|
+
path = WebsocketRoutes.playwrightChromium;
|
|
23
|
+
tags = [APITags.browserWS];
|
|
24
|
+
handler = async (
|
|
23
25
|
req: Request,
|
|
24
26
|
socket: Duplex,
|
|
25
27
|
head: Buffer,
|
|
@@ -36,9 +38,5 @@ const route: BrowserWebsocketRoute = {
|
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
return browser.proxyWebSocket(req, socket, head);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
tags: [APITags.browserWS],
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
export default route;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
@@ -14,12 +14,14 @@ export interface QuerySchema extends SystemQueryParameters {
|
|
|
14
14
|
launch?: BrowserServerOptions | string;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
auth
|
|
19
|
-
browser
|
|
20
|
-
concurrency
|
|
21
|
-
description
|
|
22
|
-
|
|
17
|
+
export default class PlayWrightFirefoxRoute extends BrowserWebsocketRoute {
|
|
18
|
+
auth = true;
|
|
19
|
+
browser = PlaywrightFirefox;
|
|
20
|
+
concurrency = true;
|
|
21
|
+
description = `Connect to Firefox with any playwright-compliant library.`;
|
|
22
|
+
path = WebsocketRoutes.playwrightFirefox;
|
|
23
|
+
tags = [APITags.browserWS];
|
|
24
|
+
handler = async (
|
|
23
25
|
req: Request,
|
|
24
26
|
socket: Duplex,
|
|
25
27
|
head: Buffer,
|
|
@@ -36,9 +38,5 @@ const route: BrowserWebsocketRoute = {
|
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
return browser.proxyWebSocket(req, socket, head);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
tags: [APITags.browserWS],
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
export default route;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
@@ -4,7 +4,6 @@ import {
|
|
|
4
4
|
HTTPRoute,
|
|
5
5
|
Methods,
|
|
6
6
|
Request,
|
|
7
|
-
ServerError,
|
|
8
7
|
contentTypes,
|
|
9
8
|
jsonResponse,
|
|
10
9
|
} from '@browserless.io/browserless';
|
|
@@ -33,21 +32,18 @@ export interface ResponseSchema {
|
|
|
33
32
|
token: string | null;
|
|
34
33
|
}
|
|
35
34
|
|
|
36
|
-
|
|
37
|
-
accepts
|
|
38
|
-
auth
|
|
39
|
-
browser
|
|
40
|
-
concurrency
|
|
41
|
-
contentTypes
|
|
42
|
-
description
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const config = getConfig();
|
|
35
|
+
export default class ConfigGetRoute extends HTTPRoute {
|
|
36
|
+
accepts = [contentTypes.any];
|
|
37
|
+
auth = true;
|
|
38
|
+
browser = null;
|
|
39
|
+
concurrency = false;
|
|
40
|
+
contentTypes = [contentTypes.json];
|
|
41
|
+
description = `Returns a JSON payload of the current system configuration.`;
|
|
42
|
+
method = Methods.get;
|
|
43
|
+
path = HTTPManagementRoutes.config;
|
|
44
|
+
tags = [APITags.management];
|
|
45
|
+
handler = async (_req: Request, res: ServerResponse): Promise<void> => {
|
|
46
|
+
const config = this.config();
|
|
51
47
|
|
|
52
48
|
const response: ResponseSchema = {
|
|
53
49
|
allowCORS: config.getAllowCORS(),
|
|
@@ -73,10 +69,5 @@ const route: HTTPRoute = {
|
|
|
73
69
|
};
|
|
74
70
|
|
|
75
71
|
return jsonResponse(res, 200, response);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
path: HTTPManagementRoutes.config,
|
|
79
|
-
tags: [APITags.management],
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
export default route;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
IBrowserlessStats,
|
|
6
6
|
Methods,
|
|
7
7
|
Request,
|
|
8
|
-
ServerError,
|
|
9
8
|
contentTypes,
|
|
10
9
|
writeResponse,
|
|
11
10
|
} from '@browserless.io/browserless';
|
|
@@ -13,31 +12,23 @@ import { ServerResponse } from 'http';
|
|
|
13
12
|
|
|
14
13
|
export type ResponseSchema = Array<IBrowserlessStats>;
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
accepts
|
|
18
|
-
auth
|
|
19
|
-
browser
|
|
20
|
-
concurrency
|
|
21
|
-
contentTypes
|
|
22
|
-
description
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const fileSystem = _fileSystem();
|
|
31
|
-
const config = _config();
|
|
15
|
+
export default class MetricsGetRoute extends HTTPRoute {
|
|
16
|
+
accepts = [contentTypes.any];
|
|
17
|
+
auth = true;
|
|
18
|
+
browser = null;
|
|
19
|
+
concurrency = false;
|
|
20
|
+
contentTypes = [contentTypes.json];
|
|
21
|
+
description = `Gets total metric details from the time the server started.`;
|
|
22
|
+
method = Methods.get;
|
|
23
|
+
path = HTTPManagementRoutes.metrics;
|
|
24
|
+
tags = [APITags.management];
|
|
25
|
+
handler = async (_req: Request, res: ServerResponse): Promise<void> => {
|
|
26
|
+
const fileSystem = this.fileSystem();
|
|
27
|
+
const config = this.config();
|
|
32
28
|
|
|
33
29
|
const stats = await fileSystem.read(config.getMetricsJSONPath());
|
|
34
30
|
const response = `[${stats.join(',')}]`;
|
|
35
31
|
|
|
36
32
|
return writeResponse(res, 200, response, contentTypes.json);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
path: HTTPManagementRoutes.metrics,
|
|
40
|
-
tags: [APITags.management],
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
export default route;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
IBrowserlessMetricTotals,
|
|
6
6
|
Methods,
|
|
7
7
|
Request,
|
|
8
|
-
ServerError,
|
|
9
8
|
contentTypes,
|
|
10
9
|
writeResponse,
|
|
11
10
|
} from '@browserless.io/browserless';
|
|
@@ -15,28 +14,23 @@ export type ResponseSchema = IBrowserlessMetricTotals;
|
|
|
15
14
|
|
|
16
15
|
const fiveMinuteIntervalsInAMonth = 8640;
|
|
17
16
|
|
|
18
|
-
|
|
19
|
-
accepts
|
|
20
|
-
auth
|
|
21
|
-
browser
|
|
22
|
-
concurrency
|
|
23
|
-
contentTypes
|
|
24
|
-
description
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const fileSystem = _fileSystem();
|
|
33
|
-
const config = _config();
|
|
34
|
-
|
|
17
|
+
export default class MetricsTotalGetRoute extends HTTPRoute {
|
|
18
|
+
accepts = [contentTypes.any];
|
|
19
|
+
auth = true;
|
|
20
|
+
browser = null;
|
|
21
|
+
concurrency = false;
|
|
22
|
+
contentTypes = [contentTypes.json];
|
|
23
|
+
description = `Gets total metric details summed from the time the server started.`;
|
|
24
|
+
method = Methods.get;
|
|
25
|
+
path = HTTPManagementRoutes.metricsTotal;
|
|
26
|
+
tags = [APITags.management];
|
|
27
|
+
handler = async (_req: Request, res: ServerResponse): Promise<void> => {
|
|
28
|
+
const fileSystem = this.fileSystem();
|
|
29
|
+
const config = this.config();
|
|
35
30
|
const metrics = (await fileSystem.read(config.getMetricsJSONPath())).map(
|
|
36
31
|
(m) => JSON.parse(m),
|
|
37
32
|
);
|
|
38
33
|
const availableMetrics = metrics.length;
|
|
39
|
-
|
|
40
34
|
const totals: IBrowserlessMetricTotals = metrics.reduce(
|
|
41
35
|
(accum, metric) => ({
|
|
42
36
|
error: accum.error + metric.error,
|
|
@@ -80,10 +74,5 @@ const route: HTTPRoute = {
|
|
|
80
74
|
);
|
|
81
75
|
|
|
82
76
|
return writeResponse(res, 200, JSON.stringify(totals), contentTypes.json);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
path: HTTPManagementRoutes.metricsTotal,
|
|
86
|
-
tags: [APITags.management],
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
export default route;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
2
|
APITags,
|
|
3
|
-
BadRequest,
|
|
4
3
|
BrowserlessSessionJSON,
|
|
5
4
|
HTTPManagementRoutes,
|
|
6
5
|
HTTPRoute,
|
|
@@ -13,27 +12,20 @@ import { ServerResponse } from 'http';
|
|
|
13
12
|
|
|
14
13
|
export type ResponseSchema = BrowserlessSessionJSON[];
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
accepts
|
|
18
|
-
auth
|
|
19
|
-
browser
|
|
20
|
-
concurrency
|
|
21
|
-
contentTypes
|
|
22
|
-
description
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const response: ResponseSchema = await browserManager().getAllSessions();
|
|
15
|
+
export default class SessionsGetRoute extends HTTPRoute {
|
|
16
|
+
accepts = [contentTypes.any];
|
|
17
|
+
auth = true;
|
|
18
|
+
browser = null;
|
|
19
|
+
concurrency = false;
|
|
20
|
+
contentTypes = [contentTypes.json];
|
|
21
|
+
description = `Lists all currently running sessions and relevant meta-data excluding potentially open pages.`;
|
|
22
|
+
method = Methods.get;
|
|
23
|
+
path = HTTPManagementRoutes.sessions;
|
|
24
|
+
tags = [APITags.management];
|
|
25
|
+
handler = async (_req: Request, res: ServerResponse): Promise<void> => {
|
|
26
|
+
const browserManager = this.browserManager();
|
|
27
|
+
const response: ResponseSchema = await browserManager.getAllSessions();
|
|
31
28
|
|
|
32
29
|
return jsonResponse(res, 200, response);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
path: HTTPManagementRoutes.sessions,
|
|
36
|
-
tags: [APITags.management],
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
export default route;
|
|
30
|
+
};
|
|
31
|
+
}
|