@browserless.io/browserless 2.12.0-beta-2 → 2.12.0-beta-4
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/build/browserless.d.ts +1 -0
- package/build/browserless.js +6 -0
- package/build/browsers/chromium.cdp.d.ts +1 -1
- package/build/browsers/chromium.cdp.js +2 -2
- package/build/browsers/chromium.playwright.d.ts +2 -2
- package/build/browsers/chromium.playwright.js +7 -5
- package/build/browsers/firefox.playwright.d.ts +2 -2
- package/build/browsers/firefox.playwright.js +7 -5
- package/build/browsers/index.d.ts +3 -2
- package/build/browsers/index.js +40 -16
- package/build/browsers/webkit.playwright.d.ts +2 -2
- package/build/browsers/webkit.playwright.js +7 -5
- package/build/config.d.ts +11 -0
- package/build/config.js +16 -0
- package/build/routes/chrome/http/content.post.body.json +8 -8
- 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/chrome/tests/websocket.spec.js +18 -3
- 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/chromium/tests/websocket.spec.js +18 -0
- package/build/routes/firefox/tests/websocket.spec.js +18 -1
- package/build/routes/webkit/tests/websocket.spec.js +18 -0
- package/build/types.d.ts +1 -1
- package/build/utils.d.ts +9 -0
- package/build/utils.js +9 -0
- package/docker/chromium/Dockerfile +2 -1
- package/docker/firefox/Dockerfile +2 -1
- package/docker/multi/Dockerfile +1 -1
- package/docker/webkit/Dockerfile +2 -1
- package/extensions/ublock/_locales/eu/messages.json +4 -4
- package/extensions/ublock/_locales/hi/messages.json +5 -5
- package/extensions/ublock/_locales/kn/messages.json +11 -11
- package/extensions/ublock/_locales/nb/messages.json +2 -2
- package/extensions/ublock/_locales/no/messages.json +2 -2
- package/extensions/ublock/_locales/ro/messages.json +1 -1
- package/extensions/ublock/_locales/sv/messages.json +1 -1
- package/extensions/ublock/_locales/zh_CN/messages.json +2 -2
- package/extensions/ublock/assets/assets.json +3 -8
- package/extensions/ublock/assets/resources/scriptlets.js +128 -31
- package/extensions/ublock/assets/thirdparties/easylist/easylist.txt +4870 -3560
- package/extensions/ublock/assets/thirdparties/easylist/easyprivacy.txt +662 -173
- package/extensions/ublock/assets/thirdparties/pgl.yoyo.org/as/serverlist +10 -42
- package/extensions/ublock/assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat +241 -80
- package/extensions/ublock/assets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt +2093 -1224
- package/extensions/ublock/assets/ublock/badlists.txt +2 -0
- package/extensions/ublock/assets/ublock/badware.min.txt +408 -287
- package/extensions/ublock/assets/ublock/filters.min.txt +947 -645
- package/extensions/ublock/assets/ublock/privacy.min.txt +43 -8
- package/extensions/ublock/assets/ublock/quick-fixes.min.txt +55 -93
- package/extensions/ublock/assets/ublock/unbreak.min.txt +52 -19
- package/extensions/ublock/css/1p-filters.css +2 -0
- package/extensions/ublock/css/codemirror.css +2 -2
- package/extensions/ublock/css/dashboard.css +2 -5
- package/extensions/ublock/css/epicker-ui.css +3 -3
- package/extensions/ublock/css/fa-icons.css +3 -0
- package/extensions/ublock/css/logger-ui-inspector.css +1 -0
- package/extensions/ublock/css/logger-ui.css +44 -32
- package/extensions/ublock/img/fontawesome/fontawesome-defs.svg +1 -0
- package/extensions/ublock/js/3p-filters.js +4 -5
- package/extensions/ublock/js/biditrie.js +16 -11
- package/extensions/ublock/js/cachestorage.js +37 -37
- package/extensions/ublock/js/contentscript-extra.js +0 -2
- package/extensions/ublock/js/contentscript.js +1 -6
- package/extensions/ublock/js/epicker-ui.js +28 -36
- package/extensions/ublock/js/fa-icons.js +1 -0
- package/extensions/ublock/js/hntrie.js +19 -13
- package/extensions/ublock/js/logger-ui-inspector.js +6 -13
- package/extensions/ublock/js/logger-ui.js +264 -264
- package/extensions/ublock/js/s14e-serializer.js +267 -264
- package/extensions/ublock/js/scriptlet-filtering.js +12 -18
- package/extensions/ublock/js/scriptlets/dom-inspector.js +1 -5
- package/extensions/ublock/js/scriptlets/epicker.js +53 -59
- package/extensions/ublock/js/start.js +0 -8
- package/extensions/ublock/js/storage.js +2 -9
- package/extensions/ublock/js/vapi-background.js +19 -20
- package/extensions/ublock/js/vapi-common.js +2 -7
- package/extensions/ublock/js/vapi.js +0 -4
- package/extensions/ublock/js/webext.js +23 -15
- package/extensions/ublock/logger-ui.html +24 -15
- package/extensions/ublock/manifest.json +2 -3
- package/package.json +18 -6
- package/src/browserless.ts +11 -0
- package/src/browsers/chromium.cdp.ts +2 -2
- package/src/browsers/chromium.playwright.ts +8 -4
- package/src/browsers/firefox.playwright.ts +8 -5
- package/src/browsers/index.ts +53 -18
- package/src/browsers/webkit.playwright.ts +8 -4
- package/src/config.ts +20 -0
- package/src/routes/chrome/tests/websocket.spec.ts +25 -4
- package/src/routes/chromium/tests/websocket.spec.ts +25 -0
- package/src/routes/firefox/tests/websocket.spec.ts +25 -1
- package/src/routes/webkit/tests/websocket.spec.ts +25 -0
- package/src/types.ts +1 -1
- package/src/utils.ts +9 -0
- package/static/docs/swagger.json +9 -9
- package/static/docs/swagger.min.json +9 -9
- package/static/function/client.js +95 -136
- package/static/function/index.html +95 -136
package/build/browserless.d.ts
CHANGED
|
@@ -36,6 +36,7 @@ export declare class Browserless extends EventEmitter {
|
|
|
36
36
|
token?: Browserless['token'];
|
|
37
37
|
webhooks?: Browserless['webhooks'];
|
|
38
38
|
});
|
|
39
|
+
protected loadPwVersions: () => Promise<void>;
|
|
39
40
|
protected saveMetrics: () => Promise<void>;
|
|
40
41
|
setMetricsSaveInterval: (interval: number) => void;
|
|
41
42
|
protected routeIsDisabled(route: routeInstances): boolean;
|
package/build/browserless.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
1
2
|
import * as path from 'path';
|
|
2
3
|
import { Logger as BlessLogger, BrowserManager, ChromeCDP, ChromiumCDP, ChromiumPlaywright, Config, FileSystem, FirefoxPlaywright, HTTPServer, Hooks, Limiter, Metrics, Monitoring, Router, Token, WebHooks, WebkitPlaywright, availableBrowsers, getRouteFiles, makeExternalURL, printLogo, safeParse, } from '@browserless.io/browserless';
|
|
3
4
|
import { EventEmitter } from 'events';
|
|
@@ -44,6 +45,10 @@ export class Browserless extends EventEmitter {
|
|
|
44
45
|
router ||
|
|
45
46
|
new Router(this.config, this.browserManager, this.limiter, this.Logger);
|
|
46
47
|
}
|
|
48
|
+
loadPwVersions = async () => {
|
|
49
|
+
const { playwrightVersions } = JSON.parse((await fs.readFile('package.json')).toString());
|
|
50
|
+
this.config.setPwVersions(playwrightVersions);
|
|
51
|
+
};
|
|
47
52
|
saveMetrics = async () => {
|
|
48
53
|
const metricsPath = this.config.getMetricsJSONPath();
|
|
49
54
|
const { cpu, memory } = await this.monitoring.getMachineStats();
|
|
@@ -207,6 +212,7 @@ export class Browserless extends EventEmitter {
|
|
|
207
212
|
wsRoutes.forEach((r) => this.router.registerWebSocketRoute(r));
|
|
208
213
|
this.logger.info(`Imported and validated all route files, starting up server.`);
|
|
209
214
|
this.server = new HTTPServer(this.config, this.metrics, this.token, this.router, this.hooks, this.Logger);
|
|
215
|
+
await this.loadPwVersions();
|
|
210
216
|
await this.server.start();
|
|
211
217
|
this.logger.info(`Starting metrics collection.`);
|
|
212
218
|
this.metricsSaveIntervalID = setInterval(() => this.saveMetrics(), this.metricsSaveInterval);
|
|
@@ -26,7 +26,7 @@ export declare class ChromiumCDP extends EventEmitter {
|
|
|
26
26
|
userDataDir: ChromiumCDP['userDataDir'];
|
|
27
27
|
});
|
|
28
28
|
protected cleanListeners(): void;
|
|
29
|
-
|
|
29
|
+
keepUntil(): number;
|
|
30
30
|
getPageId: (page: Page) => string;
|
|
31
31
|
protected onTargetCreated: (target: Target) => Promise<void>;
|
|
32
32
|
isRunning: () => boolean;
|
|
@@ -22,14 +22,14 @@ export declare class ChromiumPlaywright extends EventEmitter {
|
|
|
22
22
|
userDataDir: ChromiumPlaywright['userDataDir'];
|
|
23
23
|
});
|
|
24
24
|
protected cleanListeners(): void;
|
|
25
|
-
|
|
25
|
+
keepUntil(): number;
|
|
26
26
|
isRunning: () => boolean;
|
|
27
27
|
close: () => Promise<void>;
|
|
28
28
|
pages: () => Promise<[]>;
|
|
29
29
|
getPageId: () => string;
|
|
30
30
|
makeLiveURL: () => void;
|
|
31
31
|
newPage: () => Promise<Page>;
|
|
32
|
-
launch: (options?: BrowserServerOptions) => Promise<playwright.BrowserServer>;
|
|
32
|
+
launch: (options?: BrowserServerOptions, version?: string) => Promise<playwright.BrowserServer>;
|
|
33
33
|
wsEndpoint: () => string | null;
|
|
34
34
|
publicWSEndpoint: (token: string | null) => string | null;
|
|
35
35
|
proxyPageWebSocket: () => Promise<void>;
|
|
@@ -22,8 +22,8 @@ export class ChromiumPlaywright extends EventEmitter {
|
|
|
22
22
|
cleanListeners() {
|
|
23
23
|
this.removeAllListeners();
|
|
24
24
|
}
|
|
25
|
-
|
|
26
|
-
return
|
|
25
|
+
keepUntil() {
|
|
26
|
+
return 0;
|
|
27
27
|
}
|
|
28
28
|
isRunning = () => this.running;
|
|
29
29
|
close = async () => {
|
|
@@ -51,9 +51,9 @@ export class ChromiumPlaywright extends EventEmitter {
|
|
|
51
51
|
const browser = await playwright.chromium.connect(this.browserWSEndpoint);
|
|
52
52
|
return await browser.newPage();
|
|
53
53
|
};
|
|
54
|
-
launch = async (options = {}) => {
|
|
54
|
+
launch = async (options = {}, version) => {
|
|
55
55
|
this.logger.info(`Launching ${this.constructor.name} Handler`);
|
|
56
|
-
|
|
56
|
+
const opts = {
|
|
57
57
|
...options,
|
|
58
58
|
args: [
|
|
59
59
|
`--no-sandbox`,
|
|
@@ -61,7 +61,9 @@ export class ChromiumPlaywright extends EventEmitter {
|
|
|
61
61
|
this.userDataDir ? `--user-data-dir=${this.userDataDir}` : '',
|
|
62
62
|
],
|
|
63
63
|
executablePath: this.executablePath,
|
|
64
|
-
}
|
|
64
|
+
};
|
|
65
|
+
const versionedPw = await this.config.loadPwVersion(version);
|
|
66
|
+
this.browser = await versionedPw.chromium.launchServer(opts);
|
|
65
67
|
const browserWSEndpoint = this.browser.wsEndpoint();
|
|
66
68
|
this.logger.info(`${this.constructor.name} is running on ${browserWSEndpoint}`);
|
|
67
69
|
this.running = true;
|
|
@@ -21,14 +21,14 @@ export declare class FirefoxPlaywright extends EventEmitter {
|
|
|
21
21
|
userDataDir: FirefoxPlaywright['userDataDir'];
|
|
22
22
|
});
|
|
23
23
|
protected cleanListeners(): void;
|
|
24
|
-
|
|
24
|
+
keepUntil(): number;
|
|
25
25
|
isRunning: () => boolean;
|
|
26
26
|
close: () => Promise<void>;
|
|
27
27
|
pages: () => Promise<[]>;
|
|
28
28
|
getPageId: () => string;
|
|
29
29
|
makeLiveURL: () => void;
|
|
30
30
|
newPage: () => Promise<Page>;
|
|
31
|
-
launch: (options?: BrowserServerOptions) => Promise<playwright.BrowserServer>;
|
|
31
|
+
launch: (options?: BrowserServerOptions, version?: string) => Promise<playwright.BrowserServer>;
|
|
32
32
|
wsEndpoint: () => string | null;
|
|
33
33
|
publicWSEndpoint: (token: string | null) => string | null;
|
|
34
34
|
proxyPageWebSocket: () => Promise<void>;
|
|
@@ -21,8 +21,8 @@ export class FirefoxPlaywright extends EventEmitter {
|
|
|
21
21
|
cleanListeners() {
|
|
22
22
|
this.removeAllListeners();
|
|
23
23
|
}
|
|
24
|
-
|
|
25
|
-
return
|
|
24
|
+
keepUntil() {
|
|
25
|
+
return 0;
|
|
26
26
|
}
|
|
27
27
|
isRunning = () => this.running;
|
|
28
28
|
close = async () => {
|
|
@@ -46,16 +46,18 @@ export class FirefoxPlaywright extends EventEmitter {
|
|
|
46
46
|
newPage = async () => {
|
|
47
47
|
throw new ServerError(`Can't create new page with ${this.constructor.name}`);
|
|
48
48
|
};
|
|
49
|
-
launch = async (options = {}) => {
|
|
49
|
+
launch = async (options = {}, version) => {
|
|
50
50
|
this.logger.info(`Launching ${this.constructor.name} Handler`);
|
|
51
|
-
|
|
51
|
+
const opts = {
|
|
52
52
|
...options,
|
|
53
53
|
args: [
|
|
54
54
|
...(options.args || []),
|
|
55
55
|
this.userDataDir ? `-profile=${this.userDataDir}` : '',
|
|
56
56
|
],
|
|
57
57
|
executablePath: playwright.firefox.executablePath(),
|
|
58
|
-
}
|
|
58
|
+
};
|
|
59
|
+
const versionedPw = await this.config.loadPwVersion(version);
|
|
60
|
+
this.browser = await versionedPw.firefox.launchServer(opts);
|
|
59
61
|
const browserWSEndpoint = this.browser.wsEndpoint();
|
|
60
62
|
this.logger.info(`${this.constructor.name} is running on ${browserWSEndpoint}`);
|
|
61
63
|
this.browserWSEndpoint = browserWSEndpoint;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
1
2
|
import { BrowserHTTPRoute, BrowserInstance, BrowserServerOptions, BrowserWebsocketRoute, BrowserlessSession, BrowserlessSessionJSON, CDPJSONPayload, CDPLaunchOptions, ChromiumCDP, Config, Hooks, Logger, Request } from '@browserless.io/browserless';
|
|
2
3
|
import { Page } from 'puppeteer-core';
|
|
3
4
|
export declare class BrowserManager {
|
|
4
5
|
protected config: Config;
|
|
5
6
|
protected hooks: Hooks;
|
|
6
7
|
protected browsers: Map<BrowserInstance, BrowserlessSession>;
|
|
7
|
-
protected timers: Map<string,
|
|
8
|
+
protected timers: Map<string, NodeJS.Timeout>;
|
|
8
9
|
protected log: Logger;
|
|
9
10
|
protected chromeBrowsers: (typeof ChromiumCDP)[];
|
|
10
11
|
protected playwrightBrowserNames: string[];
|
|
@@ -38,7 +39,7 @@ export declare class BrowserManager {
|
|
|
38
39
|
running: boolean;
|
|
39
40
|
timeAliveMs: number;
|
|
40
41
|
type: string;
|
|
41
|
-
id: string
|
|
42
|
+
id: string;
|
|
42
43
|
isTempDataDir: boolean;
|
|
43
44
|
launchOptions: CDPLaunchOptions | BrowserServerOptions;
|
|
44
45
|
numbConnected: number;
|
package/build/browsers/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BLESS_PAGE_IDENTIFIER, BadRequest, ChromeCDP, ChromePlaywright, ChromiumCDP, ChromiumPlaywright, FirefoxPlaywright, HTTPManagementRoutes, Logger, NotFound, ServerError, WebkitPlaywright, availableBrowsers, convertIfBase64, exists, generateDataDir, makeExternalURL, noop, parseBooleanParam, } from '@browserless.io/browserless';
|
|
1
|
+
import { BLESS_PAGE_IDENTIFIER, BadRequest, ChromeCDP, ChromePlaywright, ChromiumCDP, ChromiumPlaywright, FirefoxPlaywright, HTTPManagementRoutes, Logger, NotFound, ServerError, WebkitPlaywright, availableBrowsers, convertIfBase64, exists, generateDataDir, makeExternalURL, noop, parseBooleanParam, pwVersionRegex, } from '@browserless.io/browserless';
|
|
2
2
|
import { deleteAsync } from 'del';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
export class BrowserManager {
|
|
@@ -145,7 +145,7 @@ export class BrowserManager {
|
|
|
145
145
|
{
|
|
146
146
|
...session,
|
|
147
147
|
browser: browser.constructor.name,
|
|
148
|
-
browserId:
|
|
148
|
+
browserId: session.id,
|
|
149
149
|
initialConnectURL: new URL(session.initialConnectURL, serverAddress)
|
|
150
150
|
.href,
|
|
151
151
|
killURL: session.id
|
|
@@ -178,20 +178,39 @@ export class BrowserManager {
|
|
|
178
178
|
return sessions;
|
|
179
179
|
};
|
|
180
180
|
close = async (browser, session) => {
|
|
181
|
+
const now = Date.now();
|
|
182
|
+
const keepUntil = browser.keepUntil();
|
|
183
|
+
const connected = session.numbConnected;
|
|
184
|
+
const hasKeepUntil = keepUntil > now;
|
|
185
|
+
const keepOpen = connected > 0 || hasKeepUntil;
|
|
181
186
|
const cleanupACtions = [];
|
|
182
|
-
this.
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
187
|
+
const priorTimer = this.timers.get(session.id);
|
|
188
|
+
if (priorTimer) {
|
|
189
|
+
this.log.info(`Deleting prior keep-until timer for "${session.id}"`);
|
|
190
|
+
global.clearTimeout(priorTimer);
|
|
186
191
|
}
|
|
187
|
-
this.log.info(
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
this.log.
|
|
191
|
-
this.
|
|
192
|
-
|
|
192
|
+
this.log.info(`${session.numbConnected} Client(s) are currently connected, Keep-until: ${keepUntil}`);
|
|
193
|
+
if (hasKeepUntil) {
|
|
194
|
+
const timeout = keepUntil - now;
|
|
195
|
+
this.log.trace(`Setting timer ${timeout.toLocaleString()} for "${session.id}"`);
|
|
196
|
+
this.timers.set(session.id, global.setTimeout(() => {
|
|
197
|
+
const session = this.browsers.get(browser);
|
|
198
|
+
if (session) {
|
|
199
|
+
this.log.trace(`Timer hit for "${session.id}"`),
|
|
200
|
+
this.close(browser, session);
|
|
201
|
+
}
|
|
202
|
+
}, timeout));
|
|
203
|
+
}
|
|
204
|
+
if (!keepOpen) {
|
|
205
|
+
this.log.info(`Closing browser session`);
|
|
206
|
+
cleanupACtions.push(() => browser.close());
|
|
207
|
+
if (session.isTempDataDir) {
|
|
208
|
+
this.log.info(`Deleting "${session.userDataDir}" user-data-dir and session from memory`);
|
|
209
|
+
this.browsers.delete(browser);
|
|
210
|
+
cleanupACtions.push(() => this.removeUserDataDir(session.userDataDir));
|
|
211
|
+
}
|
|
212
|
+
await Promise.all(cleanupACtions.map((a) => a()));
|
|
193
213
|
}
|
|
194
|
-
await Promise.all(cleanupACtions.map((a) => a()));
|
|
195
214
|
};
|
|
196
215
|
getAllSessions = async () => {
|
|
197
216
|
const sessions = Array.from(this.browsers);
|
|
@@ -289,6 +308,9 @@ export class BrowserManager {
|
|
|
289
308
|
? await generateDataDir(undefined, this.config)
|
|
290
309
|
: null);
|
|
291
310
|
const proxyServerArg = launchOptions.args?.find((arg) => arg.includes('--proxy-server='));
|
|
311
|
+
/**
|
|
312
|
+
* If it is a playwright request
|
|
313
|
+
*/
|
|
292
314
|
if (launchOptions.args &&
|
|
293
315
|
proxyServerArg &&
|
|
294
316
|
req.parsed.pathname.startsWith('/playwright')) {
|
|
@@ -304,8 +326,12 @@ export class BrowserManager {
|
|
|
304
326
|
logger,
|
|
305
327
|
userDataDir,
|
|
306
328
|
});
|
|
329
|
+
const match = (req.headers['user-agent'] || '').match(pwVersionRegex);
|
|
330
|
+
const pwVersion = match ? match[1] : 'default';
|
|
331
|
+
await browser.launch(launchOptions, pwVersion);
|
|
332
|
+
await this.hooks.browser({ browser, meta: req.parsed });
|
|
307
333
|
const session = {
|
|
308
|
-
id:
|
|
334
|
+
id: browser.wsEndpoint()?.split('/').pop(),
|
|
309
335
|
initialConnectURL: path.join(req.parsed.pathname, req.parsed.search) || '',
|
|
310
336
|
isTempDataDir: !manualUserDataDir,
|
|
311
337
|
launchOptions,
|
|
@@ -317,8 +343,6 @@ export class BrowserManager {
|
|
|
317
343
|
userDataDir,
|
|
318
344
|
};
|
|
319
345
|
this.browsers.set(browser, session);
|
|
320
|
-
await browser.launch(launchOptions);
|
|
321
|
-
await this.hooks.browser({ browser, meta: req.parsed });
|
|
322
346
|
browser.on('newPage', async (page) => {
|
|
323
347
|
await this.onNewPage(req, page);
|
|
324
348
|
(router.onNewPage || noop)(req.parsed || '', page);
|
|
@@ -21,14 +21,14 @@ export declare class WebkitPlaywright extends EventEmitter {
|
|
|
21
21
|
userDataDir: WebkitPlaywright['userDataDir'];
|
|
22
22
|
});
|
|
23
23
|
protected cleanListeners(): void;
|
|
24
|
-
|
|
24
|
+
keepUntil(): number;
|
|
25
25
|
isRunning: () => boolean;
|
|
26
26
|
close: () => Promise<void>;
|
|
27
27
|
pages: () => Promise<[]>;
|
|
28
28
|
getPageId: () => string;
|
|
29
29
|
makeLiveURL: () => void;
|
|
30
30
|
newPage: () => Promise<Page>;
|
|
31
|
-
launch: (options?: BrowserServerOptions) => Promise<playwright.BrowserServer>;
|
|
31
|
+
launch: (options?: BrowserServerOptions, version?: string) => Promise<playwright.BrowserServer>;
|
|
32
32
|
wsEndpoint: () => string | null;
|
|
33
33
|
publicWSEndpoint: (token: string | null) => string | null;
|
|
34
34
|
proxyPageWebSocket: () => Promise<void>;
|
|
@@ -21,8 +21,8 @@ export class WebkitPlaywright extends EventEmitter {
|
|
|
21
21
|
cleanListeners() {
|
|
22
22
|
this.removeAllListeners();
|
|
23
23
|
}
|
|
24
|
-
|
|
25
|
-
return
|
|
24
|
+
keepUntil() {
|
|
25
|
+
return 0;
|
|
26
26
|
}
|
|
27
27
|
isRunning = () => this.running;
|
|
28
28
|
close = async () => {
|
|
@@ -46,16 +46,18 @@ export class WebkitPlaywright extends EventEmitter {
|
|
|
46
46
|
newPage = async () => {
|
|
47
47
|
throw new ServerError(`Can't create new page with ${this.constructor.name}`);
|
|
48
48
|
};
|
|
49
|
-
launch = async (options = {}) => {
|
|
49
|
+
launch = async (options = {}, version) => {
|
|
50
50
|
this.logger.info(`Launching ${this.constructor.name} Handler`);
|
|
51
|
-
|
|
51
|
+
const opts = {
|
|
52
52
|
...options,
|
|
53
53
|
args: [
|
|
54
54
|
...(options.args || []),
|
|
55
55
|
this.userDataDir ? `-profile=${this.userDataDir}` : '',
|
|
56
56
|
],
|
|
57
57
|
executablePath: playwright.webkit.executablePath(),
|
|
58
|
-
}
|
|
58
|
+
};
|
|
59
|
+
const versionedPw = await this.config.loadPwVersion(version);
|
|
60
|
+
this.browser = await versionedPw.webkit.launchServer(opts);
|
|
59
61
|
const browserWSEndpoint = this.browser.wsEndpoint();
|
|
60
62
|
this.logger.info(`${this.constructor.name} is running on ${browserWSEndpoint}`);
|
|
61
63
|
this.browserWSEndpoint = browserWSEndpoint;
|
package/build/config.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
3
|
import { EventEmitter } from 'events';
|
|
4
|
+
import playwright from 'playwright-core';
|
|
4
5
|
export declare class Config extends EventEmitter {
|
|
5
6
|
protected readonly debug: string;
|
|
6
7
|
protected readonly host: string;
|
|
@@ -34,12 +35,18 @@ export declare class Config extends EventEmitter {
|
|
|
34
35
|
protected rejectAlertURL: string | null;
|
|
35
36
|
protected timeoutAlertURL: string | null;
|
|
36
37
|
protected errorAlertURL: string | null;
|
|
38
|
+
protected pwVersions: {
|
|
39
|
+
[key: string]: string;
|
|
40
|
+
};
|
|
37
41
|
getRoutes: () => string;
|
|
38
42
|
getHost: () => string;
|
|
39
43
|
getPort: () => number;
|
|
40
44
|
getIsWin: () => boolean;
|
|
41
45
|
getToken: () => string | null;
|
|
42
46
|
getDebug: () => string;
|
|
47
|
+
getPwVersions: () => {
|
|
48
|
+
[key: string]: string;
|
|
49
|
+
};
|
|
43
50
|
/**
|
|
44
51
|
* The maximum number of concurrent sessions allowed. Set
|
|
45
52
|
* to "-1" or "Infinity" for no limit.
|
|
@@ -84,6 +91,10 @@ export declare class Config extends EventEmitter {
|
|
|
84
91
|
*/
|
|
85
92
|
getAESKey: () => Buffer;
|
|
86
93
|
getMetricsJSONPath: () => string;
|
|
94
|
+
setPwVersions: (versions: {
|
|
95
|
+
[key: string]: string;
|
|
96
|
+
}) => void;
|
|
97
|
+
loadPwVersion: (version: string) => Promise<typeof playwright>;
|
|
87
98
|
setDataDir: (newDataDir: string) => Promise<string>;
|
|
88
99
|
setRoutes: (newRoutePath: string) => string;
|
|
89
100
|
setConcurrent: (newConcurrent: number) => number;
|
package/build/config.js
CHANGED
|
@@ -4,6 +4,7 @@ import debug from 'debug';
|
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
5
|
import { mkdir } from 'fs/promises';
|
|
6
6
|
import path from 'path';
|
|
7
|
+
import playwright from 'playwright-core';
|
|
7
8
|
import { tmpdir } from 'os';
|
|
8
9
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
9
10
|
/**
|
|
@@ -140,12 +141,14 @@ export class Config extends EventEmitter {
|
|
|
140
141
|
rejectAlertURL = process.env.REJECT_ALERT_URL ?? null;
|
|
141
142
|
timeoutAlertURL = process.env.TIMEOUT_ALERT_URL ?? null;
|
|
142
143
|
errorAlertURL = process.env.ERROR_ALERT_URL ?? null;
|
|
144
|
+
pwVersions = {};
|
|
143
145
|
getRoutes = () => this.routes;
|
|
144
146
|
getHost = () => this.host;
|
|
145
147
|
getPort = () => this.port;
|
|
146
148
|
getIsWin = () => this.isWin;
|
|
147
149
|
getToken = () => this.token;
|
|
148
150
|
getDebug = () => this.debug;
|
|
151
|
+
getPwVersions = () => this.pwVersions;
|
|
149
152
|
/**
|
|
150
153
|
* The maximum number of concurrent sessions allowed. Set
|
|
151
154
|
* to "-1" or "Infinity" for no limit.
|
|
@@ -215,6 +218,19 @@ export class Config extends EventEmitter {
|
|
|
215
218
|
return Buffer.from(aesToken.repeat(keyLength).substring(0, keyLength));
|
|
216
219
|
};
|
|
217
220
|
getMetricsJSONPath = () => this.metricsJSONPath;
|
|
221
|
+
setPwVersions = (versions) => {
|
|
222
|
+
this.pwVersions = versions;
|
|
223
|
+
};
|
|
224
|
+
loadPwVersion = async (version) => {
|
|
225
|
+
const versions = this.getPwVersions();
|
|
226
|
+
try {
|
|
227
|
+
return await import(versions[version] || versions['default']);
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
debug.log('Error importing Playwright. Using default version', err);
|
|
231
|
+
return playwright;
|
|
232
|
+
}
|
|
233
|
+
};
|
|
218
234
|
setDataDir = async (newDataDir) => {
|
|
219
235
|
if (!(await exists(newDataDir))) {
|
|
220
236
|
throw new Error(`New data-directory "${newDataDir}" doesn't exist, did you forget to mount or create it?`);
|
|
@@ -394,14 +394,14 @@
|
|
|
394
394
|
"length": {
|
|
395
395
|
"type": "number"
|
|
396
396
|
},
|
|
397
|
-
"__@toStringTag@
|
|
397
|
+
"__@toStringTag@11009": {
|
|
398
398
|
"type": "string",
|
|
399
399
|
"const": "Uint8Array"
|
|
400
400
|
}
|
|
401
401
|
},
|
|
402
402
|
"required": [
|
|
403
403
|
"BYTES_PER_ELEMENT",
|
|
404
|
-
"__@toStringTag@
|
|
404
|
+
"__@toStringTag@11009",
|
|
405
405
|
"buffer",
|
|
406
406
|
"byteLength",
|
|
407
407
|
"byteOffset",
|
|
@@ -436,13 +436,13 @@
|
|
|
436
436
|
"byteLength": {
|
|
437
437
|
"type": "number"
|
|
438
438
|
},
|
|
439
|
-
"__@toStringTag@
|
|
439
|
+
"__@toStringTag@11009": {
|
|
440
440
|
"type": "string"
|
|
441
441
|
}
|
|
442
442
|
},
|
|
443
443
|
"additionalProperties": false,
|
|
444
444
|
"required": [
|
|
445
|
-
"__@toStringTag@
|
|
445
|
+
"__@toStringTag@11009",
|
|
446
446
|
"byteLength"
|
|
447
447
|
]
|
|
448
448
|
},
|
|
@@ -452,18 +452,18 @@
|
|
|
452
452
|
"byteLength": {
|
|
453
453
|
"type": "number"
|
|
454
454
|
},
|
|
455
|
-
"__@species@
|
|
455
|
+
"__@species@11110": {
|
|
456
456
|
"$ref": "#/definitions/SharedArrayBuffer"
|
|
457
457
|
},
|
|
458
|
-
"__@toStringTag@
|
|
458
|
+
"__@toStringTag@11009": {
|
|
459
459
|
"type": "string",
|
|
460
460
|
"const": "SharedArrayBuffer"
|
|
461
461
|
}
|
|
462
462
|
},
|
|
463
463
|
"additionalProperties": false,
|
|
464
464
|
"required": [
|
|
465
|
-
"__@species@
|
|
466
|
-
"__@toStringTag@
|
|
465
|
+
"__@species@11110",
|
|
466
|
+
"__@toStringTag@11009",
|
|
467
467
|
"byteLength"
|
|
468
468
|
]
|
|
469
469
|
},
|
|
@@ -535,14 +535,14 @@
|
|
|
535
535
|
"length": {
|
|
536
536
|
"type": "number"
|
|
537
537
|
},
|
|
538
|
-
"__@toStringTag@
|
|
538
|
+
"__@toStringTag@87555": {
|
|
539
539
|
"type": "string",
|
|
540
540
|
"const": "Uint8Array"
|
|
541
541
|
}
|
|
542
542
|
},
|
|
543
543
|
"required": [
|
|
544
544
|
"BYTES_PER_ELEMENT",
|
|
545
|
-
"__@toStringTag@
|
|
545
|
+
"__@toStringTag@87555",
|
|
546
546
|
"buffer",
|
|
547
547
|
"byteLength",
|
|
548
548
|
"byteOffset",
|
|
@@ -577,13 +577,13 @@
|
|
|
577
577
|
"byteLength": {
|
|
578
578
|
"type": "number"
|
|
579
579
|
},
|
|
580
|
-
"__@toStringTag@
|
|
580
|
+
"__@toStringTag@87555": {
|
|
581
581
|
"type": "string"
|
|
582
582
|
}
|
|
583
583
|
},
|
|
584
584
|
"additionalProperties": false,
|
|
585
585
|
"required": [
|
|
586
|
-
"__@toStringTag@
|
|
586
|
+
"__@toStringTag@87555",
|
|
587
587
|
"byteLength"
|
|
588
588
|
]
|
|
589
589
|
},
|
|
@@ -593,18 +593,18 @@
|
|
|
593
593
|
"byteLength": {
|
|
594
594
|
"type": "number"
|
|
595
595
|
},
|
|
596
|
-
"__@species@
|
|
596
|
+
"__@species@87656": {
|
|
597
597
|
"$ref": "#/definitions/SharedArrayBuffer"
|
|
598
598
|
},
|
|
599
|
-
"__@toStringTag@
|
|
599
|
+
"__@toStringTag@87555": {
|
|
600
600
|
"type": "string",
|
|
601
601
|
"const": "SharedArrayBuffer"
|
|
602
602
|
}
|
|
603
603
|
},
|
|
604
604
|
"additionalProperties": false,
|
|
605
605
|
"required": [
|
|
606
|
-
"__@species@
|
|
607
|
-
"__@toStringTag@
|
|
606
|
+
"__@species@87656",
|
|
607
|
+
"__@toStringTag@87555",
|
|
608
608
|
"byteLength"
|
|
609
609
|
]
|
|
610
610
|
},
|
|
@@ -441,14 +441,14 @@
|
|
|
441
441
|
"length": {
|
|
442
442
|
"type": "number"
|
|
443
443
|
},
|
|
444
|
-
"__@toStringTag@
|
|
444
|
+
"__@toStringTag@98721": {
|
|
445
445
|
"type": "string",
|
|
446
446
|
"const": "Uint8Array"
|
|
447
447
|
}
|
|
448
448
|
},
|
|
449
449
|
"required": [
|
|
450
450
|
"BYTES_PER_ELEMENT",
|
|
451
|
-
"__@toStringTag@
|
|
451
|
+
"__@toStringTag@98721",
|
|
452
452
|
"buffer",
|
|
453
453
|
"byteLength",
|
|
454
454
|
"byteOffset",
|
|
@@ -483,13 +483,13 @@
|
|
|
483
483
|
"byteLength": {
|
|
484
484
|
"type": "number"
|
|
485
485
|
},
|
|
486
|
-
"__@toStringTag@
|
|
486
|
+
"__@toStringTag@98721": {
|
|
487
487
|
"type": "string"
|
|
488
488
|
}
|
|
489
489
|
},
|
|
490
490
|
"additionalProperties": false,
|
|
491
491
|
"required": [
|
|
492
|
-
"__@toStringTag@
|
|
492
|
+
"__@toStringTag@98721",
|
|
493
493
|
"byteLength"
|
|
494
494
|
]
|
|
495
495
|
},
|
|
@@ -499,18 +499,18 @@
|
|
|
499
499
|
"byteLength": {
|
|
500
500
|
"type": "number"
|
|
501
501
|
},
|
|
502
|
-
"__@species@
|
|
502
|
+
"__@species@98822": {
|
|
503
503
|
"$ref": "#/definitions/SharedArrayBuffer"
|
|
504
504
|
},
|
|
505
|
-
"__@toStringTag@
|
|
505
|
+
"__@toStringTag@98721": {
|
|
506
506
|
"type": "string",
|
|
507
507
|
"const": "SharedArrayBuffer"
|
|
508
508
|
}
|
|
509
509
|
},
|
|
510
510
|
"additionalProperties": false,
|
|
511
511
|
"required": [
|
|
512
|
-
"__@species@
|
|
513
|
-
"__@toStringTag@
|
|
512
|
+
"__@species@98822",
|
|
513
|
+
"__@toStringTag@98721",
|
|
514
514
|
"byteLength"
|
|
515
515
|
]
|
|
516
516
|
},
|
|
@@ -484,14 +484,14 @@
|
|
|
484
484
|
"length": {
|
|
485
485
|
"type": "number"
|
|
486
486
|
},
|
|
487
|
-
"__@toStringTag@
|
|
487
|
+
"__@toStringTag@109964": {
|
|
488
488
|
"type": "string",
|
|
489
489
|
"const": "Uint8Array"
|
|
490
490
|
}
|
|
491
491
|
},
|
|
492
492
|
"required": [
|
|
493
493
|
"BYTES_PER_ELEMENT",
|
|
494
|
-
"__@toStringTag@
|
|
494
|
+
"__@toStringTag@109964",
|
|
495
495
|
"buffer",
|
|
496
496
|
"byteLength",
|
|
497
497
|
"byteOffset",
|
|
@@ -526,13 +526,13 @@
|
|
|
526
526
|
"byteLength": {
|
|
527
527
|
"type": "number"
|
|
528
528
|
},
|
|
529
|
-
"__@toStringTag@
|
|
529
|
+
"__@toStringTag@109964": {
|
|
530
530
|
"type": "string"
|
|
531
531
|
}
|
|
532
532
|
},
|
|
533
533
|
"additionalProperties": false,
|
|
534
534
|
"required": [
|
|
535
|
-
"__@toStringTag@
|
|
535
|
+
"__@toStringTag@109964",
|
|
536
536
|
"byteLength"
|
|
537
537
|
]
|
|
538
538
|
},
|
|
@@ -542,18 +542,18 @@
|
|
|
542
542
|
"byteLength": {
|
|
543
543
|
"type": "number"
|
|
544
544
|
},
|
|
545
|
-
"__@species@
|
|
545
|
+
"__@species@110065": {
|
|
546
546
|
"$ref": "#/definitions/SharedArrayBuffer"
|
|
547
547
|
},
|
|
548
|
-
"__@toStringTag@
|
|
548
|
+
"__@toStringTag@109964": {
|
|
549
549
|
"type": "string",
|
|
550
550
|
"const": "SharedArrayBuffer"
|
|
551
551
|
}
|
|
552
552
|
},
|
|
553
553
|
"additionalProperties": false,
|
|
554
554
|
"required": [
|
|
555
|
-
"__@species@
|
|
556
|
-
"__@toStringTag@
|
|
555
|
+
"__@species@110065",
|
|
556
|
+
"__@toStringTag@109964",
|
|
557
557
|
"byteLength"
|
|
558
558
|
]
|
|
559
559
|
},
|