@browserless.io/browserless 2.12.0-beta-3 → 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.
Files changed (82) hide show
  1. package/build/browsers/chromium.cdp.d.ts +1 -1
  2. package/build/browsers/chromium.cdp.js +2 -2
  3. package/build/browsers/chromium.playwright.d.ts +1 -1
  4. package/build/browsers/chromium.playwright.js +2 -2
  5. package/build/browsers/firefox.playwright.d.ts +1 -1
  6. package/build/browsers/firefox.playwright.js +2 -2
  7. package/build/browsers/index.d.ts +3 -2
  8. package/build/browsers/index.js +36 -17
  9. package/build/browsers/webkit.playwright.d.ts +1 -1
  10. package/build/browsers/webkit.playwright.js +4 -4
  11. package/build/routes/chrome/http/pdf.post.body.json +8 -8
  12. package/build/routes/chrome/http/scrape.post.body.json +8 -8
  13. package/build/routes/chrome/http/screenshot.post.body.json +8 -8
  14. package/build/routes/chromium/http/content.post.body.json +8 -8
  15. package/build/routes/chromium/http/pdf.post.body.json +8 -8
  16. package/build/routes/chromium/http/scrape.post.body.json +8 -8
  17. package/build/types.d.ts +1 -1
  18. package/extensions/ublock/_locales/eu/messages.json +4 -4
  19. package/extensions/ublock/_locales/hi/messages.json +5 -5
  20. package/extensions/ublock/_locales/kn/messages.json +11 -11
  21. package/extensions/ublock/_locales/nb/messages.json +2 -2
  22. package/extensions/ublock/_locales/no/messages.json +2 -2
  23. package/extensions/ublock/_locales/ro/messages.json +1 -1
  24. package/extensions/ublock/_locales/sv/messages.json +1 -1
  25. package/extensions/ublock/_locales/zh_CN/messages.json +2 -2
  26. package/extensions/ublock/assets/assets.json +3 -8
  27. package/extensions/ublock/assets/resources/scriptlets.js +128 -31
  28. package/extensions/ublock/assets/thirdparties/easylist/easylist.txt +4870 -3560
  29. package/extensions/ublock/assets/thirdparties/easylist/easyprivacy.txt +662 -173
  30. package/extensions/ublock/assets/thirdparties/pgl.yoyo.org/as/serverlist +10 -42
  31. package/extensions/ublock/assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat +241 -80
  32. package/extensions/ublock/assets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt +2093 -1224
  33. package/extensions/ublock/assets/ublock/badlists.txt +2 -0
  34. package/extensions/ublock/assets/ublock/badware.min.txt +408 -287
  35. package/extensions/ublock/assets/ublock/filters.min.txt +947 -645
  36. package/extensions/ublock/assets/ublock/privacy.min.txt +43 -8
  37. package/extensions/ublock/assets/ublock/quick-fixes.min.txt +55 -93
  38. package/extensions/ublock/assets/ublock/unbreak.min.txt +52 -19
  39. package/extensions/ublock/css/1p-filters.css +2 -0
  40. package/extensions/ublock/css/codemirror.css +2 -2
  41. package/extensions/ublock/css/dashboard.css +2 -5
  42. package/extensions/ublock/css/epicker-ui.css +3 -3
  43. package/extensions/ublock/css/fa-icons.css +3 -0
  44. package/extensions/ublock/css/logger-ui-inspector.css +1 -0
  45. package/extensions/ublock/css/logger-ui.css +44 -32
  46. package/extensions/ublock/img/fontawesome/fontawesome-defs.svg +1 -0
  47. package/extensions/ublock/js/3p-filters.js +4 -5
  48. package/extensions/ublock/js/biditrie.js +16 -11
  49. package/extensions/ublock/js/cachestorage.js +37 -37
  50. package/extensions/ublock/js/contentscript-extra.js +0 -2
  51. package/extensions/ublock/js/contentscript.js +1 -6
  52. package/extensions/ublock/js/epicker-ui.js +28 -36
  53. package/extensions/ublock/js/fa-icons.js +1 -0
  54. package/extensions/ublock/js/hntrie.js +19 -13
  55. package/extensions/ublock/js/logger-ui-inspector.js +6 -13
  56. package/extensions/ublock/js/logger-ui.js +264 -264
  57. package/extensions/ublock/js/s14e-serializer.js +267 -264
  58. package/extensions/ublock/js/scriptlet-filtering.js +12 -18
  59. package/extensions/ublock/js/scriptlets/dom-inspector.js +1 -5
  60. package/extensions/ublock/js/scriptlets/epicker.js +53 -59
  61. package/extensions/ublock/js/start.js +0 -8
  62. package/extensions/ublock/js/storage.js +2 -9
  63. package/extensions/ublock/js/vapi-background.js +19 -20
  64. package/extensions/ublock/js/vapi-common.js +2 -7
  65. package/extensions/ublock/js/vapi.js +0 -4
  66. package/extensions/ublock/js/webext.js +23 -15
  67. package/extensions/ublock/logger-ui.html +24 -15
  68. package/extensions/ublock/manifest.json +2 -3
  69. package/package.json +2 -2
  70. package/src/browsers/chromium.cdp.ts +2 -2
  71. package/src/browsers/chromium.playwright.ts +2 -2
  72. package/src/browsers/firefox.playwright.ts +2 -3
  73. package/src/browsers/index.ts +49 -21
  74. package/src/browsers/webkit.playwright.ts +4 -4
  75. package/src/routes/chrome/tests/websocket.spec.ts +2 -2
  76. package/src/routes/chromium/tests/websocket.spec.ts +2 -2
  77. package/src/routes/firefox/tests/websocket.spec.ts +2 -4
  78. package/src/routes/webkit/tests/websocket.spec.ts +2 -3
  79. package/src/types.ts +1 -1
  80. package/src/utils.ts +1 -1
  81. package/static/docs/swagger.json +1 -1
  82. package/static/docs/swagger.min.json +1 -1
@@ -37,7 +37,7 @@ import path from 'path';
37
37
 
38
38
  export class BrowserManager {
39
39
  protected browsers: Map<BrowserInstance, BrowserlessSession> = new Map();
40
- protected timers: Map<string, number> = new Map();
40
+ protected timers: Map<string, NodeJS.Timeout> = new Map();
41
41
  protected log = new Logger('browser-manager');
42
42
  protected chromeBrowsers = [ChromiumCDP, ChromeCDP];
43
43
  protected playwrightBrowserNames = [
@@ -226,7 +226,7 @@ export class BrowserManager {
226
226
  {
227
227
  ...session,
228
228
  browser: browser.constructor.name,
229
- browserId: browser.wsEndpoint()?.split('/').pop() as string,
229
+ browserId: session.id,
230
230
  initialConnectURL: new URL(session.initialConnectURL, serverAddress)
231
231
  .href,
232
232
  killURL: session.id
@@ -268,26 +268,54 @@ export class BrowserManager {
268
268
  browser: BrowserInstance,
269
269
  session: BrowserlessSession,
270
270
  ): Promise<void> => {
271
+ const now = Date.now();
272
+ const keepUntil = browser.keepUntil();
273
+ const connected = session.numbConnected;
274
+ const hasKeepUntil = keepUntil > now;
275
+ const keepOpen = connected > 0 || hasKeepUntil;
271
276
  const cleanupACtions: Array<() => Promise<void>> = [];
272
- this.log.info(`${session.numbConnected} Client(s) are currently connected`);
277
+ const priorTimer = this.timers.get(session.id);
273
278
 
274
- // Don't close if there's clients still connected
275
- if (session.numbConnected > 0 || browser.keepAlive()) {
276
- return;
279
+ if (priorTimer) {
280
+ this.log.info(`Deleting prior keep-until timer for "${session.id}"`);
281
+ global.clearTimeout(priorTimer);
277
282
  }
278
283
 
279
- this.log.info(`Closing browser session`);
280
- cleanupACtions.push(() => browser.close());
284
+ this.log.info(
285
+ `${session.numbConnected} Client(s) are currently connected, Keep-until: ${keepUntil}`,
286
+ );
281
287
 
282
- if (session.isTempDataDir) {
283
- this.log.info(
284
- `Deleting "${session.userDataDir}" user-data-dir and session from memory`,
288
+ if (hasKeepUntil) {
289
+ const timeout = keepUntil - now;
290
+ this.log.trace(
291
+ `Setting timer ${timeout.toLocaleString()} for "${session.id}"`,
292
+ );
293
+ this.timers.set(
294
+ session.id,
295
+ global.setTimeout(() => {
296
+ const session = this.browsers.get(browser);
297
+ if (session) {
298
+ this.log.trace(`Timer hit for "${session.id}"`),
299
+ this.close(browser, session);
300
+ }
301
+ }, timeout),
285
302
  );
286
- this.browsers.delete(browser);
287
- cleanupACtions.push(() => this.removeUserDataDir(session.userDataDir));
288
303
  }
289
304
 
290
- await Promise.all(cleanupACtions.map((a) => a()));
305
+ if (!keepOpen) {
306
+ this.log.info(`Closing browser session`);
307
+ cleanupACtions.push(() => browser.close());
308
+
309
+ if (session.isTempDataDir) {
310
+ this.log.info(
311
+ `Deleting "${session.userDataDir}" user-data-dir and session from memory`,
312
+ );
313
+ this.browsers.delete(browser);
314
+ cleanupACtions.push(() => this.removeUserDataDir(session.userDataDir));
315
+ }
316
+
317
+ await Promise.all(cleanupACtions.map((a) => a()));
318
+ }
291
319
  };
292
320
 
293
321
  public getAllSessions = async (): Promise<BrowserlessSessionJSON[]> => {
@@ -459,8 +487,14 @@ export class BrowserManager {
459
487
  userDataDir,
460
488
  });
461
489
 
490
+ const match = (req.headers['user-agent'] || '').match(pwVersionRegex);
491
+ const pwVersion = match ? match[1] : 'default';
492
+
493
+ await browser.launch(launchOptions as object, pwVersion);
494
+ await this.hooks.browser({ browser, meta: req.parsed });
495
+
462
496
  const session: BrowserlessSession = {
463
- id: null,
497
+ id: browser.wsEndpoint()?.split('/').pop() as string,
464
498
  initialConnectURL:
465
499
  path.join(req.parsed.pathname, req.parsed.search) || '',
466
500
  isTempDataDir: !manualUserDataDir,
@@ -475,12 +509,6 @@ export class BrowserManager {
475
509
 
476
510
  this.browsers.set(browser, session);
477
511
 
478
- const match = (req.headers['user-agent'] || '').match(pwVersionRegex);
479
- const pwVersion = match ? match[1] : 'default';
480
-
481
- await browser.launch(launchOptions as object, pwVersion);
482
- await this.hooks.browser({ browser, meta: req.parsed });
483
-
484
512
  browser.on('newPage', async (page) => {
485
513
  await this.onNewPage(req, page);
486
514
  (router.onNewPage || noop)(req.parsed || '', page);
@@ -42,8 +42,8 @@ export class WebkitPlaywright extends EventEmitter {
42
42
  this.removeAllListeners();
43
43
  }
44
44
 
45
- public keepAlive() {
46
- return false;
45
+ public keepUntil() {
46
+ return 0;
47
47
  }
48
48
 
49
49
  public isRunning = (): boolean => this.running;
@@ -88,14 +88,14 @@ export class WebkitPlaywright extends EventEmitter {
88
88
  ): Promise<playwright.BrowserServer> => {
89
89
  this.logger.info(`Launching ${this.constructor.name} Handler`);
90
90
 
91
- const opts = ({
91
+ const opts = {
92
92
  ...options,
93
93
  args: [
94
94
  ...(options.args || []),
95
95
  this.userDataDir ? `-profile=${this.userDataDir}` : '',
96
96
  ],
97
97
  executablePath: playwright.webkit.executablePath(),
98
- });
98
+ };
99
99
 
100
100
  const versionedPw = await this.config.loadPwVersion(version!);
101
101
 
@@ -470,9 +470,9 @@ describe('Chrome WebSocket API', function () {
470
470
  const browser = await pw.chromium.connect(
471
471
  `ws://localhost:3000/chrome/playwright?token=browserless`,
472
472
  );
473
-
473
+
474
474
  await browser.close();
475
- await sleep(100);
475
+ await sleep(100);
476
476
  }
477
477
 
478
478
  const results = metrics.get();
@@ -474,9 +474,9 @@ describe('Chromium WebSocket API', function () {
474
474
  const browser = await pw.chromium.connect(
475
475
  `ws://localhost:3000/playwright/chromium?token=browserless`,
476
476
  );
477
-
477
+
478
478
  await browser.close();
479
- await sleep(100);
479
+ await sleep(100);
480
480
  }
481
481
 
482
482
  const results = metrics.get();
@@ -38,9 +38,7 @@ describe('Firefox Websocket API', function () {
38
38
  await browser.close();
39
39
  });
40
40
 
41
-
42
41
  it('runs multiple versions of playwright', async () => {
43
-
44
42
  const config = new Config();
45
43
  config.setToken('browserless');
46
44
  const metrics = new Metrics();
@@ -53,9 +51,9 @@ describe('Firefox Websocket API', function () {
53
51
  const browser = await pw.firefox.connect(
54
52
  `ws://localhost:3000/playwright/firefox?token=browserless`,
55
53
  );
56
-
54
+
57
55
  await browser.close();
58
- await sleep(100);
56
+ await sleep(100);
59
57
  }
60
58
 
61
59
  const results = metrics.get();
@@ -39,7 +39,6 @@ describe('Webkit Websocket API', function () {
39
39
  await browser.close();
40
40
  });
41
41
 
42
-
43
42
  it('runs multiple versions of playwright', async () => {
44
43
  const config = new Config();
45
44
  config.setToken('browserless');
@@ -53,9 +52,9 @@ describe('Webkit Websocket API', function () {
53
52
  const browser = await pw.webkit.connect(
54
53
  `ws://localhost:3000/playwright/webkit?token=browserless`,
55
54
  );
56
-
55
+
57
56
  await browser.close();
58
- await sleep(100);
57
+ await sleep(100);
59
58
  }
60
59
 
61
60
  const results = metrics.get();
package/src/types.ts CHANGED
@@ -377,7 +377,7 @@ export interface BrowserServerOptions {
377
377
  }
378
378
 
379
379
  export interface BrowserlessSession {
380
- id: string | null;
380
+ id: string;
381
381
  initialConnectURL: string;
382
382
  isTempDataDir: boolean;
383
383
  launchOptions: CDPLaunchOptions | BrowserServerOptions;
package/src/utils.ts CHANGED
@@ -50,7 +50,7 @@ const getAuthHeaderToken = (header: string) => {
50
50
 
51
51
  /**
52
52
  * RegEx to match the Playwright version from the innitial request header.
53
- *
53
+ *
54
54
  * @example
55
55
  * const userAgent = "Playwright/1.43.1 (x64; windows 10.0) node/20.11";
56
56
  * userAgent.match(pwVersionRegex);
@@ -1098,7 +1098,7 @@
1098
1098
  },
1099
1099
  "info": {
1100
1100
  "title": "Browserless",
1101
- "version": "2.12.0-beta-3",
1101
+ "version": "2.12.0-beta-4",
1102
1102
  "x-logo": {
1103
1103
  "altText": "browserless logo",
1104
1104
  "url": "./docs/browserless-logo-inline.svg"
@@ -1098,7 +1098,7 @@
1098
1098
  },
1099
1099
  "info": {
1100
1100
  "title": "Browserless",
1101
- "version": "2.12.0-beta-3",
1101
+ "version": "2.12.0-beta-4",
1102
1102
  "x-logo": {
1103
1103
  "altText": "browserless logo",
1104
1104
  "url": "./docs/browserless-logo-inline.svg"