@browserless.io/browserless 2.14.0 → 2.16.0-beta-1

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 (64) hide show
  1. package/CHANGELOG.md +5 -2
  2. package/README.md +7 -6
  3. package/build/browserless.d.ts +0 -2
  4. package/build/browsers/browsers.cdp.d.ts +1 -6
  5. package/build/browsers/browsers.cdp.js +12 -10
  6. package/build/browsers/browsers.playwright.d.ts +33 -37
  7. package/build/browsers/index.d.ts +1 -2
  8. package/build/browsers/index.js +1 -1
  9. package/build/config.d.ts +0 -2
  10. package/build/file-system.d.ts +0 -2
  11. package/build/hooks.d.ts +0 -1
  12. package/build/http.d.ts +0 -1
  13. package/build/limiter.d.ts +5 -0
  14. package/build/limiter.js +3 -0
  15. package/build/limiter.spec.js +20 -1
  16. package/build/metrics.d.ts +0 -1
  17. package/build/monitoring.d.ts +0 -1
  18. package/build/router.d.ts +0 -3
  19. package/build/routes/chrome/http/content.post.body.json +16 -9
  20. package/build/routes/chrome/http/pdf.post.body.json +16 -9
  21. package/build/routes/chrome/http/scrape.post.body.json +16 -9
  22. package/build/routes/chrome/http/screenshot.post.body.json +16 -9
  23. package/build/routes/chromium/http/content.post.body.json +16 -9
  24. package/build/routes/chromium/http/pdf.post.body.json +16 -9
  25. package/build/routes/chromium/http/scrape.post.body.json +16 -9
  26. package/build/routes/chromium/http/screenshot.post.body.json +16 -9
  27. package/build/routes/firefox/ws/playwright.d.ts +0 -2
  28. package/build/routes/management/http/active.get.d.ts +0 -1
  29. package/build/routes/management/http/config.get.d.ts +0 -1
  30. package/build/routes/management/http/metrics-total.get.d.ts +0 -1
  31. package/build/routes/management/http/metrics.get.d.ts +0 -1
  32. package/build/routes/management/http/pressure.get.d.ts +0 -1
  33. package/build/routes/management/http/sessions.get.d.ts +0 -1
  34. package/build/routes/management/http/static.get.d.ts +0 -1
  35. package/build/routes/webkit/ws/playwright.d.ts +0 -2
  36. package/build/server.d.ts +0 -4
  37. package/build/shared/browser.ws.d.ts +0 -2
  38. package/build/shared/chromium.playwright.ws.d.ts +0 -2
  39. package/build/shared/chromium.ws.d.ts +0 -2
  40. package/build/shared/content.http.d.ts +0 -1
  41. package/build/shared/download.http.d.ts +0 -1
  42. package/build/shared/function.http.d.ts +0 -1
  43. package/build/shared/page.ws.d.ts +0 -2
  44. package/build/shared/pdf.http.d.ts +0 -1
  45. package/build/shared/performance.http.d.ts +0 -1
  46. package/build/shared/scrape.http.d.ts +0 -1
  47. package/build/shared/screenshot.http.d.ts +0 -1
  48. package/build/token.d.ts +0 -1
  49. package/build/types.d.ts +0 -3
  50. package/build/utils.d.ts +1 -3
  51. package/build/utils.js +5 -1
  52. package/build/webhooks.d.ts +0 -1
  53. package/package.json +17 -17
  54. package/scripts/build-schemas.js +7 -3
  55. package/src/browsers/browsers.cdp.ts +25 -18
  56. package/src/browsers/browsers.playwright.ts +12 -5
  57. package/src/browsers/index.ts +1 -1
  58. package/src/limiter.spec.ts +28 -1
  59. package/src/limiter.ts +8 -0
  60. package/src/utils.ts +8 -2
  61. package/static/docs/swagger.json +74 -18
  62. package/static/docs/swagger.min.json +73 -17
  63. package/static/function/client.js +229 -94
  64. package/static/function/index.html +229 -94
package/CHANGELOG.md CHANGED
@@ -1,11 +1,14 @@
1
- # [Latest](https://github.com/browserless/chrome/compare/v2.14.0...main)
1
+ # [Latest](https://github.com/browserless/chrome/compare/v2.15.0...main)
2
+ - Dependency updates.
3
+
4
+ # [v2.15.0](https://github.com/browserless/chrome/compare/v2.14.0...v2.15.0)
5
+ - Bug fix to avoid removing healthy jobs from limiter when a job fails
2
6
  - Dependency updates.
3
7
 
4
8
  # [v2.14.0](https://github.com/browserless/chrome/compare/v2.13.0...v2.14.0)
5
9
  **Potentially Breaking**
6
10
  - Merged duplicate code in browsers and fixed name `WebkitPlaywright` to `WebKitPlaywright` (capitalized "K").
7
11
  - Devtools now bundled into the repository at build-time for the `/debugger` route.
8
- -
9
12
  - Dependency updates.
10
13
 
11
14
  # [v2.13.0](https://github.com/browserless/chrome/compare/v2.12.0...v2.13.0)
package/README.md CHANGED
@@ -39,7 +39,6 @@ If you've been struggling to deploy headless browsers without running into issue
39
39
  1. [Full documentation site](https://docs.browserless.io/)
40
40
  2. [Live Debugger (using browserless.io)](https://chrome.browserless.io/)
41
41
  3. [Docker](https://github.com/browserless/browserless/pkgs/container/base)
42
- 4. [Slack](https://join.slack.com/t/browserless/shared_invite/enQtMzA3OTMwNjA3MzY1LTRmMWU5NjQ0MTQ2YTE2YmU3MzdjNmVlMmU4MThjM2UxODNmNzNlZjVkY2U2NjdkMzYyNTgyZTBiMmE3Nzg0MzY)
43
42
 
44
43
  ## Features
45
44
 
@@ -54,14 +53,16 @@ If you've been struggling to deploy headless browsers without running into issue
54
53
  - Error tolerant: if Chrome dies it won't.
55
54
  - Support for running and development on Apple's M1 machines
56
55
 
57
- ### Cloud
56
+ ### Cloud-only
58
57
 
59
58
  Our [cloud accounts](https://www.browserless.io/pricing/) include all the general features plus extras, such as:
60
59
 
61
- - Inbuilt [residential proxy](https://www.browserless.io/blog/2023/09/24/residential-proxying/)
62
- - [/unblock API](https://www.browserless.io/blog/2024/02/26/unblock-api/) for avoiding detectors
63
- - [Hybrid automations](https://www.browserless.io/blog/2024/03/21/hybrid-automations-for-puppeteer/) for streaming login windows during scripts
64
- - Ability to upload and run extensions _(coming soon)_
60
+ - Inbuilt [residential proxy](https://www.browserless.io/blog/residential-proxying/)
61
+ - [/unblock API](https://www.browserless.io/blog/unblock-api) for avoiding detectors
62
+ - [Automated captcha solving](https://www.browserless.io/blog/captcha-solving) for getting past mandatory checks
63
+ - [Hybrid automations](https://www.browserless.io/blog/hybrid-automations-for-puppeteer/) for streaming login windows during scripts
64
+ - [/reconnect API](https://www.browserless.io/blog/reconnect-api) for keeping browsers alive for reuse
65
+ - [REST APIs](https://www.browserless.io/feature/rest-apis) for tasks such as retrieving HTML, PDFs or Lighthouse metrics
65
66
  - SSO, tokens and user roles
66
67
 
67
68
  ## How it works
@@ -1,5 +1,3 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
1
  import { Logger as BlessLogger, BrowserHTTPRoute, BrowserManager, BrowserWebsocketRoute, Config, FileSystem, HTTPRoute, HTTPServer, Hooks, Limiter, Metrics, Monitoring, Router, Token, WebHooks, WebSocketRoute } from '@browserless.io/browserless';
4
2
  import { EventEmitter } from 'events';
5
3
  type routeInstances = HTTPRoute | BrowserHTTPRoute | WebSocketRoute | BrowserWebsocketRoute;
@@ -1,8 +1,3 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
- /// <reference types="node" />
4
- /// <reference types="node" />
5
- /// <reference types="node" />
6
1
  import { BrowserLauncherOptions, Config, Logger, Request } from '@browserless.io/browserless';
7
2
  import { Browser, Page, Target } from 'puppeteer-core';
8
3
  import { Duplex } from 'stream';
@@ -34,7 +29,7 @@ export declare class ChromiumCDP extends EventEmitter {
34
29
  close(): Promise<void>;
35
30
  pages(): Promise<Page[]>;
36
31
  process(): import("child_process").ChildProcess | null;
37
- launch(laucherOpts: BrowserLauncherOptions): Promise<Browser>;
32
+ launch({ options, stealth, }: BrowserLauncherOptions): Promise<Browser>;
38
33
  wsEndpoint(): string | null;
39
34
  publicWSEndpoint(token: string | null): string | null;
40
35
  proxyPageWebSocket(req: Request, socket: Duplex, head: Buffer): Promise<void>;
@@ -1,8 +1,7 @@
1
- import { BLESS_PAGE_IDENTIFIER, ServerError, chromeExecutablePath, noop, once, } from '@browserless.io/browserless';
1
+ import { BLESS_PAGE_IDENTIFIER, ServerError, chromeExecutablePath, noop, once, ublockPath, } from '@browserless.io/browserless';
2
2
  import puppeteer from 'puppeteer-core';
3
3
  import { EventEmitter } from 'events';
4
4
  import StealthPlugin from 'puppeteer-extra-plugin-stealth';
5
- import { fileURLToPath } from 'url';
6
5
  import getPort from 'get-port';
7
6
  import httpProxy from 'http-proxy';
8
7
  import path from 'path';
@@ -111,11 +110,17 @@ export class ChromiumCDP extends EventEmitter {
111
110
  process() {
112
111
  return this.browser?.process() || null;
113
112
  }
114
- async launch(laucherOpts) {
115
- const { options, stealth } = laucherOpts;
113
+ async launch({ options, stealth, }) {
116
114
  this.port = await getPort();
117
115
  this.logger.info(`${this.constructor.name} got open port ${this.port}`);
118
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
116
+ const extensionLaunchArgs = options.args?.find((a) => a.startsWith('--load-extension'));
117
+ // Remove extension flags as we recompile them below with our own
118
+ options.args = options.args?.filter((a) => !a.startsWith('--load-extension') &&
119
+ !a.startsWith('--disable-extensions-except'));
120
+ const extensions = [
121
+ this.blockAds ? ublockPath : null,
122
+ extensionLaunchArgs ? extensionLaunchArgs.split('=')[1] : null,
123
+ ].filter((_) => !!_);
119
124
  const finalOptions = {
120
125
  ...options,
121
126
  args: [
@@ -126,11 +131,8 @@ export class ChromiumCDP extends EventEmitter {
126
131
  ].filter((_) => !!_),
127
132
  executablePath: this.executablePath,
128
133
  };
129
- if (this.blockAds) {
130
- // Necessary to load extensions
131
- finalOptions.headless = false;
132
- const loadExtensionPaths = path.join(__dirname, '..', '..', 'extensions', 'ublock');
133
- finalOptions.args.push('--load-extension=' + loadExtensionPaths, '--disable-extensions-except=' + loadExtensionPaths);
134
+ if (extensions.length) {
135
+ finalOptions.args.push('--load-extension=' + extensions.join(','), '--disable-extensions-except=' + extensions.join(','));
134
136
  }
135
137
  const launch = stealth
136
138
  ? puppeteerStealth.launch.bind(puppeteerStealth)
@@ -1,7 +1,3 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
- /// <reference types="node" />
4
- /// <reference types="node" />
5
1
  import { BrowserLauncherOptions, BrowserServerOptions, Config, Logger, Request } from '@browserless.io/browserless';
6
2
  import playwright, { Page } from 'playwright-core';
7
3
  import { Duplex } from 'stream';
@@ -31,19 +27,19 @@ declare class BasePlaywright extends EventEmitter {
31
27
  protected makeLaunchOptions(opts: BrowserServerOptions): {
32
28
  args: string[];
33
29
  executablePath: string;
34
- chromiumSandbox?: boolean | undefined;
35
- devtools?: boolean | undefined;
36
- downloadsPath?: string | undefined;
37
- headless?: boolean | undefined;
38
- ignoreDefaultArgs?: boolean | string[] | undefined;
30
+ chromiumSandbox?: boolean;
31
+ devtools?: boolean;
32
+ downloadsPath?: string;
33
+ headless?: boolean;
34
+ ignoreDefaultArgs?: boolean | string[];
39
35
  proxy?: {
40
- bypass?: string | undefined;
41
- password?: string | undefined;
36
+ bypass?: string;
37
+ password?: string;
42
38
  server: string;
43
- username?: string | undefined;
44
- } | undefined;
45
- timeout?: number | undefined;
46
- tracesDir?: string | undefined;
39
+ username?: string;
40
+ };
41
+ timeout?: number;
42
+ tracesDir?: string;
47
43
  };
48
44
  keepUntil(): number;
49
45
  isRunning(): boolean;
@@ -70,19 +66,19 @@ export declare class FirefoxPlaywright extends BasePlaywright {
70
66
  protected makeLaunchOptions(opts: BrowserServerOptions): {
71
67
  args: string[];
72
68
  executablePath: string;
73
- chromiumSandbox?: boolean | undefined;
74
- devtools?: boolean | undefined;
75
- downloadsPath?: string | undefined;
76
- headless?: boolean | undefined;
77
- ignoreDefaultArgs?: boolean | string[] | undefined;
69
+ chromiumSandbox?: boolean;
70
+ devtools?: boolean;
71
+ downloadsPath?: string;
72
+ headless?: boolean;
73
+ ignoreDefaultArgs?: boolean | string[];
78
74
  proxy?: {
79
- bypass?: string | undefined;
80
- password?: string | undefined;
75
+ bypass?: string;
76
+ password?: string;
81
77
  server: string;
82
- username?: string | undefined;
83
- } | undefined;
84
- timeout?: number | undefined;
85
- tracesDir?: string | undefined;
78
+ username?: string;
79
+ };
80
+ timeout?: number;
81
+ tracesDir?: string;
86
82
  };
87
83
  }
88
84
  export declare class WebKitPlaywright extends BasePlaywright {
@@ -90,19 +86,19 @@ export declare class WebKitPlaywright extends BasePlaywright {
90
86
  protected makeLaunchOptions(opts: BrowserServerOptions): {
91
87
  args: string[];
92
88
  executablePath: string;
93
- chromiumSandbox?: boolean | undefined;
94
- devtools?: boolean | undefined;
95
- downloadsPath?: string | undefined;
96
- headless?: boolean | undefined;
97
- ignoreDefaultArgs?: boolean | string[] | undefined;
89
+ chromiumSandbox?: boolean;
90
+ devtools?: boolean;
91
+ downloadsPath?: string;
92
+ headless?: boolean;
93
+ ignoreDefaultArgs?: boolean | string[];
98
94
  proxy?: {
99
- bypass?: string | undefined;
100
- password?: string | undefined;
95
+ bypass?: string;
96
+ password?: string;
101
97
  server: string;
102
- username?: string | undefined;
103
- } | undefined;
104
- timeout?: number | undefined;
105
- tracesDir?: string | undefined;
98
+ username?: string;
99
+ };
100
+ timeout?: number;
101
+ tracesDir?: string;
106
102
  };
107
103
  }
108
104
  export {};
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { BrowserHTTPRoute, BrowserInstance, BrowserServerOptions, BrowserWebsocketRoute, BrowserlessSession, BrowserlessSessionJSON, CDPJSONPayload, CDPLaunchOptions, ChromiumCDP, Config, Hooks, Logger, Request } from '@browserless.io/browserless';
3
2
  import { Page } from 'puppeteer-core';
4
3
  export declare class BrowserManager {
@@ -46,7 +45,7 @@ export declare class BrowserManager {
46
45
  resolver(val: unknown): void;
47
46
  routePath: string | string[];
48
47
  startedOn: number;
49
- trackingId?: string | undefined;
48
+ trackingId?: string;
50
49
  ttl: number;
51
50
  userDataDir: string | null;
52
51
  }[]>;
@@ -353,7 +353,7 @@ export class BrowserManager {
353
353
  options: launchOptions,
354
354
  pwVersion,
355
355
  req,
356
- stealth: launchOptions?.stealth
356
+ stealth: launchOptions?.stealth,
357
357
  });
358
358
  await this.hooks.browser({ browser, req });
359
359
  const session = {
package/build/config.d.ts CHANGED
@@ -1,5 +1,3 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
1
  import { EventEmitter } from 'events';
4
2
  import playwright from 'playwright-core';
5
3
  export declare class Config extends EventEmitter {
@@ -1,5 +1,3 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
1
  import { Config, Logger } from '@browserless.io/browserless';
4
2
  import { EventEmitter } from 'events';
5
3
  export declare class FileSystem extends EventEmitter {
package/build/hooks.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { AfterResponse, BeforeRequest, BrowserHook, PageHook } from '@browserless.io/browserless';
3
2
  import { EventEmitter } from 'events';
4
3
  export declare class Hooks extends EventEmitter {
package/build/http.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { BrowserServerOptions, CDPLaunchOptions } from '@browserless.io/browserless';
3
2
  import http from 'http';
4
3
  export declare const errorCodes: {
@@ -18,6 +18,11 @@ export declare class Limiter extends q {
18
18
  protected queued: number;
19
19
  protected logger: Logger;
20
20
  constructor(config: Config, metrics: Metrics, monitor: Monitoring, webhooks: WebHooks, hooks: Hooks);
21
+ protected _errorHandler({ detail: { error }, }: {
22
+ detail: {
23
+ error: unknown;
24
+ };
25
+ }): void;
21
26
  protected handleEnd(): void;
22
27
  protected jobEnd(jobInfo: AfterResponse): void;
23
28
  protected handleSuccess({ detail: { job } }: {
package/build/limiter.js CHANGED
@@ -41,6 +41,9 @@ export class Limiter extends q {
41
41
  this.addEventListener('error', this.handleFail.bind(this));
42
42
  this.addEventListener('end', this.handleEnd.bind(this));
43
43
  }
44
+ _errorHandler({ detail: { error }, }) {
45
+ this.logger.error(error);
46
+ }
44
47
  handleEnd() {
45
48
  this.logQueue('All jobs complete.');
46
49
  }
@@ -91,6 +91,25 @@ describe(`Limiter`, () => {
91
91
  await wait;
92
92
  expect(handlerTwo.calledOnce).to.be.true;
93
93
  });
94
+ it('continues to process jobs even if an earlier job errors', (d) => {
95
+ const config = new Config();
96
+ const monitoring = new Monitoring(config);
97
+ const metrics = new Metrics();
98
+ config.setConcurrent(1);
99
+ config.setQueued(1);
100
+ config.setTimeout(-1);
101
+ const limiter = new Limiter(config, metrics, monitoring, webHooks, hooks);
102
+ const errorJob = () => Promise.reject(new Error('Danger, danger. High voltage!'));
103
+ const okJob = spy();
104
+ const jobOne = limiter.limit(errorJob, asyncNoop, asyncNoop, noop);
105
+ const jobTwo = limiter.limit(okJob, asyncNoop, asyncNoop, noop);
106
+ jobOne();
107
+ jobTwo();
108
+ limiter.addEventListener('end', () => {
109
+ expect(okJob.calledOnce).to.be.true;
110
+ d(undefined);
111
+ });
112
+ });
94
113
  it('bubbles up errors', async () => {
95
114
  const config = new Config();
96
115
  const monitoring = new Monitoring(config);
@@ -103,7 +122,7 @@ describe(`Limiter`, () => {
103
122
  const spy = () => new Promise((_r, rej) => rej(error));
104
123
  const job = limiter.limit(spy, asyncNoop, asyncNoop, noop);
105
124
  await job().catch(noop);
106
- limiter.addEventListener('end', (res) => {
125
+ limiter.addEventListener('error', (res) => {
107
126
  // 'end' callback fires before the failed callback hooks do, so nextTick to wait
108
127
  process.nextTick(() => {
109
128
  expect(res.detail.error).to.eql(error);
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { IBrowserlessStats } from '@browserless.io/browserless';
3
2
  import { EventEmitter } from 'events';
4
3
  export declare class Metrics extends EventEmitter {
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { Config, IResourceLoad, Logger } from '@browserless.io/browserless';
3
2
  import { EventEmitter } from 'events';
4
3
  export declare class Monitoring extends EventEmitter {
package/build/router.d.ts CHANGED
@@ -1,6 +1,3 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
- /// <reference types="node" />
4
1
  import { BrowserHTTPRoute, BrowserManager, BrowserWebsocketRoute, Config, HTTPRoute, Limiter, Logger, Request, Response, WebSocketRoute } from '@browserless.io/browserless';
5
2
  import { EventEmitter } from 'events';
6
3
  import stream from 'stream';
@@ -109,7 +109,14 @@
109
109
  "type": "string"
110
110
  },
111
111
  "viewport": {
112
- "$ref": "#/definitions/Viewport"
112
+ "anyOf": [
113
+ {
114
+ "$ref": "#/definitions/Viewport"
115
+ },
116
+ {
117
+ "type": "null"
118
+ }
119
+ ]
113
120
  },
114
121
  "waitForEvent": {
115
122
  "type": "object",
@@ -401,14 +408,14 @@
401
408
  "length": {
402
409
  "type": "number"
403
410
  },
404
- "__@toStringTag@11034": {
411
+ "__@toStringTag@11070": {
405
412
  "type": "string",
406
413
  "const": "Uint8Array"
407
414
  }
408
415
  },
409
416
  "required": [
410
417
  "BYTES_PER_ELEMENT",
411
- "__@toStringTag@11034",
418
+ "__@toStringTag@11070",
412
419
  "buffer",
413
420
  "byteLength",
414
421
  "byteOffset",
@@ -443,13 +450,13 @@
443
450
  "byteLength": {
444
451
  "type": "number"
445
452
  },
446
- "__@toStringTag@11034": {
453
+ "__@toStringTag@11070": {
447
454
  "type": "string"
448
455
  }
449
456
  },
450
457
  "additionalProperties": false,
451
458
  "required": [
452
- "__@toStringTag@11034",
459
+ "__@toStringTag@11070",
453
460
  "byteLength"
454
461
  ]
455
462
  },
@@ -459,18 +466,18 @@
459
466
  "byteLength": {
460
467
  "type": "number"
461
468
  },
462
- "__@species@11135": {
469
+ "__@species@11171": {
463
470
  "$ref": "#/definitions/SharedArrayBuffer"
464
471
  },
465
- "__@toStringTag@11034": {
472
+ "__@toStringTag@11070": {
466
473
  "type": "string",
467
474
  "const": "SharedArrayBuffer"
468
475
  }
469
476
  },
470
477
  "additionalProperties": false,
471
478
  "required": [
472
- "__@species@11135",
473
- "__@toStringTag@11034",
479
+ "__@species@11171",
480
+ "__@toStringTag@11070",
474
481
  "byteLength"
475
482
  ]
476
483
  },
@@ -111,7 +111,14 @@
111
111
  "type": "string"
112
112
  },
113
113
  "viewport": {
114
- "$ref": "#/definitions/Viewport"
114
+ "anyOf": [
115
+ {
116
+ "$ref": "#/definitions/Viewport"
117
+ },
118
+ {
119
+ "type": "null"
120
+ }
121
+ ]
115
122
  },
116
123
  "waitForEvent": {
117
124
  "type": "object",
@@ -542,14 +549,14 @@
542
549
  "length": {
543
550
  "type": "number"
544
551
  },
545
- "__@toStringTag@98673": {
552
+ "__@toStringTag@88036": {
546
553
  "type": "string",
547
554
  "const": "Uint8Array"
548
555
  }
549
556
  },
550
557
  "required": [
551
558
  "BYTES_PER_ELEMENT",
552
- "__@toStringTag@98673",
559
+ "__@toStringTag@88036",
553
560
  "buffer",
554
561
  "byteLength",
555
562
  "byteOffset",
@@ -584,13 +591,13 @@
584
591
  "byteLength": {
585
592
  "type": "number"
586
593
  },
587
- "__@toStringTag@98673": {
594
+ "__@toStringTag@88036": {
588
595
  "type": "string"
589
596
  }
590
597
  },
591
598
  "additionalProperties": false,
592
599
  "required": [
593
- "__@toStringTag@98673",
600
+ "__@toStringTag@88036",
594
601
  "byteLength"
595
602
  ]
596
603
  },
@@ -600,18 +607,18 @@
600
607
  "byteLength": {
601
608
  "type": "number"
602
609
  },
603
- "__@species@98774": {
610
+ "__@species@88137": {
604
611
  "$ref": "#/definitions/SharedArrayBuffer"
605
612
  },
606
- "__@toStringTag@98673": {
613
+ "__@toStringTag@88036": {
607
614
  "type": "string",
608
615
  "const": "SharedArrayBuffer"
609
616
  }
610
617
  },
611
618
  "additionalProperties": false,
612
619
  "required": [
613
- "__@species@98774",
614
- "__@toStringTag@98673",
620
+ "__@species@88137",
621
+ "__@toStringTag@88036",
615
622
  "byteLength"
616
623
  ]
617
624
  },
@@ -117,7 +117,14 @@
117
117
  "type": "string"
118
118
  },
119
119
  "viewport": {
120
- "$ref": "#/definitions/Viewport"
120
+ "anyOf": [
121
+ {
122
+ "$ref": "#/definitions/Viewport"
123
+ },
124
+ {
125
+ "type": "null"
126
+ }
127
+ ]
121
128
  },
122
129
  "waitForEvent": {
123
130
  "type": "object",
@@ -448,14 +455,14 @@
448
455
  "length": {
449
456
  "type": "number"
450
457
  },
451
- "__@toStringTag@109864": {
458
+ "__@toStringTag@110224": {
452
459
  "type": "string",
453
460
  "const": "Uint8Array"
454
461
  }
455
462
  },
456
463
  "required": [
457
464
  "BYTES_PER_ELEMENT",
458
- "__@toStringTag@109864",
465
+ "__@toStringTag@110224",
459
466
  "buffer",
460
467
  "byteLength",
461
468
  "byteOffset",
@@ -490,13 +497,13 @@
490
497
  "byteLength": {
491
498
  "type": "number"
492
499
  },
493
- "__@toStringTag@109864": {
500
+ "__@toStringTag@110224": {
494
501
  "type": "string"
495
502
  }
496
503
  },
497
504
  "additionalProperties": false,
498
505
  "required": [
499
- "__@toStringTag@109864",
506
+ "__@toStringTag@110224",
500
507
  "byteLength"
501
508
  ]
502
509
  },
@@ -506,18 +513,18 @@
506
513
  "byteLength": {
507
514
  "type": "number"
508
515
  },
509
- "__@species@109965": {
516
+ "__@species@110325": {
510
517
  "$ref": "#/definitions/SharedArrayBuffer"
511
518
  },
512
- "__@toStringTag@109864": {
519
+ "__@toStringTag@110224": {
513
520
  "type": "string",
514
521
  "const": "SharedArrayBuffer"
515
522
  }
516
523
  },
517
524
  "additionalProperties": false,
518
525
  "required": [
519
- "__@species@109965",
520
- "__@toStringTag@109864",
526
+ "__@species@110325",
527
+ "__@toStringTag@110224",
521
528
  "byteLength"
522
529
  ]
523
530
  },
@@ -117,7 +117,14 @@
117
117
  "type": "string"
118
118
  },
119
119
  "viewport": {
120
- "$ref": "#/definitions/Viewport"
120
+ "anyOf": [
121
+ {
122
+ "$ref": "#/definitions/Viewport"
123
+ },
124
+ {
125
+ "type": "null"
126
+ }
127
+ ]
121
128
  },
122
129
  "waitForEvent": {
123
130
  "type": "object",
@@ -491,14 +498,14 @@
491
498
  "length": {
492
499
  "type": "number"
493
500
  },
494
- "__@toStringTag@121132": {
501
+ "__@toStringTag@121528": {
495
502
  "type": "string",
496
503
  "const": "Uint8Array"
497
504
  }
498
505
  },
499
506
  "required": [
500
507
  "BYTES_PER_ELEMENT",
501
- "__@toStringTag@121132",
508
+ "__@toStringTag@121528",
502
509
  "buffer",
503
510
  "byteLength",
504
511
  "byteOffset",
@@ -533,13 +540,13 @@
533
540
  "byteLength": {
534
541
  "type": "number"
535
542
  },
536
- "__@toStringTag@121132": {
543
+ "__@toStringTag@121528": {
537
544
  "type": "string"
538
545
  }
539
546
  },
540
547
  "additionalProperties": false,
541
548
  "required": [
542
- "__@toStringTag@121132",
549
+ "__@toStringTag@121528",
543
550
  "byteLength"
544
551
  ]
545
552
  },
@@ -549,18 +556,18 @@
549
556
  "byteLength": {
550
557
  "type": "number"
551
558
  },
552
- "__@species@121233": {
559
+ "__@species@121629": {
553
560
  "$ref": "#/definitions/SharedArrayBuffer"
554
561
  },
555
- "__@toStringTag@121132": {
562
+ "__@toStringTag@121528": {
556
563
  "type": "string",
557
564
  "const": "SharedArrayBuffer"
558
565
  }
559
566
  },
560
567
  "additionalProperties": false,
561
568
  "required": [
562
- "__@species@121233",
563
- "__@toStringTag@121132",
569
+ "__@species@121629",
570
+ "__@toStringTag@121528",
564
571
  "byteLength"
565
572
  ]
566
573
  },