@browserless.io/browserless 2.7.1 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/bin/browserless.js +8 -4
  3. package/bin/scaffold/README.md +6 -4
  4. package/bin/scaffold/src/hello-world.http.ts +6 -1
  5. package/build/browserless.d.ts +4 -2
  6. package/build/browserless.js +9 -12
  7. package/build/exports.d.ts +1 -0
  8. package/build/exports.js +1 -0
  9. package/build/logger.d.ts +12 -0
  10. package/build/logger.js +27 -0
  11. package/build/router.d.ts +3 -2
  12. package/build/router.js +10 -6
  13. package/build/routes/chrome/http/content.post.body.json +8 -8
  14. package/build/routes/chrome/http/pdf.post.body.json +9 -9
  15. package/build/routes/chrome/http/scrape.post.body.json +8 -8
  16. package/build/routes/chrome/http/screenshot.post.body.json +8 -8
  17. package/build/routes/chromium/http/content.post.body.json +8 -8
  18. package/build/routes/chromium/http/pdf.post.body.json +9 -9
  19. package/build/routes/chromium/http/scrape.post.body.json +8 -8
  20. package/build/routes/chromium/http/screenshot.post.body.json +8 -8
  21. package/build/routes/firefox/ws/playwright.d.ts +2 -2
  22. package/build/routes/firefox/ws/playwright.js +1 -1
  23. package/build/routes/management/http/static.get.d.ts +2 -2
  24. package/build/routes/management/http/static.get.js +8 -10
  25. package/build/routes/webkit/ws/playwright.d.ts +2 -2
  26. package/build/routes/webkit/ws/playwright.js +1 -1
  27. package/build/sdk-utils.js +23 -10
  28. package/build/server.d.ts +3 -2
  29. package/build/server.js +5 -3
  30. package/build/shared/browser.ws.d.ts +2 -2
  31. package/build/shared/browser.ws.js +1 -1
  32. package/build/shared/chromium.playwright.ws.d.ts +2 -2
  33. package/build/shared/chromium.playwright.ws.js +1 -1
  34. package/build/shared/chromium.ws.d.ts +2 -2
  35. package/build/shared/chromium.ws.js +1 -1
  36. package/build/shared/content.http.d.ts +2 -2
  37. package/build/shared/content.http.js +1 -1
  38. package/build/shared/download.http.d.ts +2 -2
  39. package/build/shared/download.http.js +11 -12
  40. package/build/shared/function.http.d.ts +2 -2
  41. package/build/shared/function.http.js +4 -5
  42. package/build/shared/page.ws.d.ts +2 -2
  43. package/build/shared/page.ws.js +1 -1
  44. package/build/shared/pdf.http.d.ts +2 -2
  45. package/build/shared/pdf.http.js +1 -1
  46. package/build/shared/performance.http.d.ts +2 -2
  47. package/build/shared/performance.http.js +1 -1
  48. package/build/shared/scrape.http.d.ts +2 -2
  49. package/build/shared/scrape.http.js +1 -1
  50. package/build/shared/screenshot.http.d.ts +2 -2
  51. package/build/shared/screenshot.http.js +1 -1
  52. package/build/shared/utils/function/handler.d.ts +2 -3
  53. package/build/shared/utils/function/handler.js +7 -7
  54. package/build/types.d.ts +6 -15
  55. package/build/types.js +1 -10
  56. package/package.json +2 -2
  57. package/src/browserless.ts +8 -9
  58. package/src/exports.ts +1 -0
  59. package/src/logger.ts +31 -0
  60. package/src/router.ts +9 -7
  61. package/src/routes/firefox/ws/playwright.ts +2 -0
  62. package/src/routes/management/http/static.get.ts +15 -10
  63. package/src/routes/webkit/ws/playwright.ts +2 -0
  64. package/src/sdk-utils.ts +20 -2
  65. package/src/server.ts +4 -2
  66. package/src/shared/browser.ws.ts +2 -0
  67. package/src/shared/chromium.playwright.ws.ts +2 -0
  68. package/src/shared/chromium.ws.ts +2 -0
  69. package/src/shared/content.http.ts +2 -0
  70. package/src/shared/download.http.ts +14 -11
  71. package/src/shared/function.http.ts +5 -4
  72. package/src/shared/page.ws.ts +2 -0
  73. package/src/shared/pdf.http.ts +2 -0
  74. package/src/shared/performance.http.ts +2 -0
  75. package/src/shared/scrape.http.ts +2 -0
  76. package/src/shared/screenshot.http.ts +2 -0
  77. package/src/shared/utils/function/handler.ts +8 -12
  78. package/src/types.ts +5 -9
  79. package/static/docs/swagger.json +11 -11
  80. package/static/docs/swagger.min.json +10 -10
  81. package/static/function/client.js +20 -9
  82. package/static/function/index.html +20 -9
package/CHANGELOG.md CHANGED
@@ -1,4 +1,14 @@
1
- # [Latest](https://github.com/browserless/chrome/compare/v2.7.1...main)
1
+ # [Latest](https://github.com/browserless/chrome/compare/v2.8.0...main)
2
+ - Dependency updates.
3
+
4
+ # [v2.8.0](https://github.com/browserless/chrome/compare/v2.7.1...v2.8.0)
5
+ **April 12, 2024**
6
+ **Potentially Breaking**
7
+ - New `Logger` class and SDK primitives in support of that.
8
+ - Routes now get an instance of `Logger`, before the `browser` argument or as the last argument for HTTP routes.
9
+
10
+ **Updates**
11
+ - Numerous SDK fixes and updates in the CLI.
2
12
  - Dependency updates.
3
13
 
4
14
  # [v2.7.1](https://github.com/browserless/chrome/compare/v2.7.0...v2.7.1)
@@ -27,7 +27,7 @@ if (typeof process.env.DEBUG === 'undefined') {
27
27
  const log = debug('browserless.io:sdk:log');
28
28
 
29
29
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
30
- const cmd = process.argv[2];
30
+ const cmd = process.argv[2] ?? 'help';
31
31
  const subCMD = process.argv[3];
32
32
  const allowedCMDs = [
33
33
  'build',
@@ -143,7 +143,7 @@ const isConstructor = (reference) => typeof reference === 'function';
143
143
  const start = async (dev = false) => {
144
144
  const { httpRoutes, webSocketRoutes, files } = dev
145
145
  ? await build()
146
- : await getSourceFiles();
146
+ : await getSourceFiles(projectDir);
147
147
 
148
148
  log(`Importing all class overrides if present`);
149
149
 
@@ -152,6 +152,7 @@ const start = async (dev = false) => {
152
152
  Config,
153
153
  FileSystem,
154
154
  Limiter,
155
+ Logger,
155
156
  Metrics,
156
157
  Monitoring,
157
158
  Router,
@@ -164,6 +165,7 @@ const start = async (dev = false) => {
164
165
  importDefault(files, 'config'),
165
166
  importDefault(files, 'file-system'),
166
167
  importDefault(files, 'limiter'),
168
+ importDefault(files, 'logger'),
167
169
  importDefault(files, 'metrics'),
168
170
  importDefault(files, 'monitoring'),
169
171
  importDefault(files, 'router'),
@@ -197,6 +199,7 @@ const start = async (dev = false) => {
197
199
  : Router;
198
200
 
199
201
  const browserless = new Browserless({
202
+ Logger,
200
203
  browserManager,
201
204
  config,
202
205
  fileSystem,
@@ -369,7 +372,7 @@ const create = async () => {
369
372
  }
370
373
  }
371
374
 
372
- log(`Installing npm modules...`);
375
+ log(`Installing browsers and npm modules, this might take a few minutes...`);
373
376
  await installDependencies(installPath);
374
377
 
375
378
  log(
@@ -377,7 +380,8 @@ const create = async () => {
377
380
  );
378
381
  };
379
382
 
380
- const help = () => {
383
+ const help = async () => {
384
+ console.log(`Version: ${(await browserlessPackageJSON).version}`);
381
385
  if (subCMD) {
382
386
  if (!allowedCMDs.includes(subCMD)) {
383
387
  throw new Error(`Unknown command of "${subCMD}" passed.`);
@@ -128,6 +128,7 @@ Internally, we use this same class-based system, so feel free to see how those w
128
128
  import {
129
129
  APITags,
130
130
  HTTPRoute,
131
+ Logger,
131
132
  Methods,
132
133
  contentTypes,
133
134
  writeResponse,
@@ -174,7 +175,7 @@ export default class HelloWorldRoute extends HTTPRoute {
174
175
  // Handler is a function, getting the request and response objects, and is where you'll write the
175
176
  // core logic behind this route. Use utilities like writeResponse or writeJSONResponse to help
176
177
  // return the appropriate response.
177
- handler = async (_req, res): Promise<void> => {
178
+ handler = async (_req, res, _logger: Logger): Promise<void> => {
178
179
  const response: ResponseSchema = 'Hello World!';
179
180
  return writeResponse(res, 200, ResponseSchema, contentTypes.text);
180
181
  };
@@ -189,6 +190,7 @@ import {
189
190
  BrowserWebsocketRoute,
190
191
  ChromiumCDP,
191
192
  CDPLaunchOptions,
193
+ Logger,
192
194
  Request,
193
195
  SystemQueryParameters,
194
196
  WebsocketRoutes,
@@ -226,7 +228,7 @@ export default class ChromiumWebSocketRoute extends BrowserWebsocketRoute {
226
228
  // Routes with a browser type get a browser argument of the Browser instance, otherwise
227
229
  // request, socket, and head are the other 3 arguments. Here we pass them through
228
230
  // and proxy the request into Chromium to handle.
229
- handler = async (req, socket, head, chromium): Promise<void> =>
231
+ handler = async (req, socket, head, logger, chromium): Promise<void> =>
230
232
  chromium.proxyWebSocket(req, socket, head);
231
233
  }
232
234
  ```
@@ -293,7 +295,7 @@ Then, later, in your route you can define some functionality and load the config
293
295
 
294
296
  ```ts
295
297
  // src/pdf.http.ts
296
- import { BrowserHTTPRoute } from '@browserless.io/browserless';
298
+ import { BrowserHTTPRoute, Logger } from '@browserless.io/browserless';
297
299
  import MyConfig from './config';
298
300
 
299
301
  // Export the BodySchema for documentation site to parse, plus
@@ -342,7 +344,7 @@ export default class PDFToS3Route extends BrowserHTTPRoute {
342
344
  tags = [APITags.browserAPI];
343
345
 
344
346
  // Handler's are where we embed the logic that facilitates this route.
345
- handler = async (req, res, browser): Promise<void> => {
347
+ handler = async (req, res, logger, browser): Promise<void> => {
346
348
  // Modules like Config are injected via this internal methods.
347
349
  // Use them to load core modules within the platform.
348
350
  const config = this.config() as MyConfig;
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  APITags,
3
3
  HTTPRoute,
4
+ Logger,
4
5
  Methods,
5
6
  Request,
6
7
  Response,
@@ -21,7 +22,11 @@ export default class HelloWorldHTTPRoute extends HTTPRoute {
21
22
  method = Methods.get;
22
23
  path = '/hello';
23
24
  tags = [APITags.management];
24
- handler = async (_req: Request, res: Response): Promise<void> => {
25
+ handler = async (
26
+ _req: Request,
27
+ _logger: Logger,
28
+ res: Response,
29
+ ): Promise<void> => {
25
30
  const response: ResponseSchema = 'Hello World!';
26
31
  return writeResponse(res, 200, response, contentTypes.text);
27
32
  };
@@ -1,7 +1,7 @@
1
1
  /// <reference types="debug" />
2
2
  /// <reference types="node" />
3
3
  /// <reference types="node" />
4
- import { BrowserManager, Config, FileSystem, HTTPServer, Hooks, Limiter, Metrics, Monitoring, Router, Token, WebHooks } from '@browserless.io/browserless';
4
+ import { Logger as BlessLogger, BrowserManager, Config, FileSystem, HTTPServer, Hooks, Limiter, Metrics, Monitoring, Router, Token, WebHooks } from '@browserless.io/browserless';
5
5
  import { EventEmitter } from 'events';
6
6
  export declare class Browserless extends EventEmitter {
7
7
  protected debug: debug.Debugger;
@@ -10,6 +10,7 @@ export declare class Browserless extends EventEmitter {
10
10
  protected fileSystem: FileSystem;
11
11
  protected hooks: Hooks;
12
12
  protected limiter: Limiter;
13
+ protected Logger: typeof BlessLogger;
13
14
  protected metrics: Metrics;
14
15
  protected monitoring: Monitoring;
15
16
  protected router: Router;
@@ -22,7 +23,8 @@ export declare class Browserless extends EventEmitter {
22
23
  server?: HTTPServer;
23
24
  metricsSaveInterval: number;
24
25
  metricsSaveIntervalID?: NodeJS.Timer;
25
- constructor({ browserManager, config, fileSystem, hooks, limiter, metrics, monitoring, router, token, webhooks, }?: {
26
+ constructor({ browserManager, config, fileSystem, hooks, limiter, Logger: LoggerOverride, metrics, monitoring, router, token, webhooks, }?: {
27
+ Logger?: Browserless['Logger'];
26
28
  browserManager?: Browserless['browserManager'];
27
29
  config?: Browserless['config'];
28
30
  fileSystem?: Browserless['fileSystem'];
@@ -1,5 +1,5 @@
1
1
  import * as path from 'path';
2
- import { BrowserManager, ChromeCDP, ChromiumCDP, ChromiumPlaywright, Config, FileSystem, FirefoxPlaywright, HTTPServer, Hooks, Limiter, Metrics, Monitoring, Router, Token, WebHooks, WebkitPlaywright, availableBrowsers, createLogger, getRouteFiles, makeExternalURL, printLogo, safeParse, } from '@browserless.io/browserless';
2
+ import { Logger as BlessLogger, BrowserManager, ChromeCDP, ChromiumCDP, ChromiumPlaywright, Config, FileSystem, FirefoxPlaywright, HTTPServer, Hooks, Limiter, Metrics, Monitoring, Router, Token, WebHooks, WebkitPlaywright, availableBrowsers, createLogger, getRouteFiles, makeExternalURL, printLogo, safeParse, } from '@browserless.io/browserless';
3
3
  import { EventEmitter } from 'events';
4
4
  import { readFile } from 'fs/promises';
5
5
  import { userInfo } from 'os';
@@ -11,6 +11,7 @@ export class Browserless extends EventEmitter {
11
11
  fileSystem;
12
12
  hooks;
13
13
  limiter;
14
+ Logger;
14
15
  metrics;
15
16
  monitoring;
16
17
  router;
@@ -23,8 +24,9 @@ export class Browserless extends EventEmitter {
23
24
  server;
24
25
  metricsSaveInterval = 5 * 60 * 1000;
25
26
  metricsSaveIntervalID;
26
- constructor({ browserManager, config, fileSystem, hooks, limiter, metrics, monitoring, router, token, webhooks, } = {}) {
27
+ constructor({ browserManager, config, fileSystem, hooks, limiter, Logger: LoggerOverride, metrics, monitoring, router, token, webhooks, } = {}) {
27
28
  super();
29
+ this.Logger = LoggerOverride ?? BlessLogger;
28
30
  this.config = config || new Config();
29
31
  this.metrics = metrics || new Metrics();
30
32
  this.token = token || new Token(this.config);
@@ -38,7 +40,8 @@ export class Browserless extends EventEmitter {
38
40
  limiter ||
39
41
  new Limiter(this.config, this.metrics, this.monitoring, this.webhooks, this.hooks);
40
42
  this.router =
41
- router || new Router(this.config, this.browserManager, this.limiter);
43
+ router ||
44
+ new Router(this.config, this.browserManager, this.limiter, this.Logger);
42
45
  }
43
46
  saveMetrics = async () => {
44
47
  const metricsPath = this.config.getMetricsJSONPath();
@@ -133,16 +136,14 @@ export class Browserless extends EventEmitter {
133
136
  ...internalHttpRouteFiles,
134
137
  ]) {
135
138
  if (httpRoute.endsWith('js')) {
136
- const { name } = path.parse(httpRoute);
137
139
  const [bodySchema, querySchema] = await Promise.all(routeSchemas.map(async (schemaType) => {
138
140
  const schemaPath = path.parse(httpRoute);
139
141
  schemaPath.base = `${schemaPath.name}.${schemaType}.json`;
140
142
  return await readFile(path.format(schemaPath), 'utf-8').catch(() => '');
141
143
  }));
142
144
  const routeImport = `${this.config.getIsWin() ? 'file:///' : ''}${httpRoute}`;
143
- const logger = createLogger(`http:${name}`);
144
145
  const { default: Route, } = await import(routeImport + `?cb=${Date.now()}`);
145
- const route = new Route(this.browserManager, this.config, this.fileSystem, logger, this.metrics, this.monitoring, this.staticSDKDir);
146
+ const route = new Route(this.browserManager, this.config, this.fileSystem, this.metrics, this.monitoring, this.staticSDKDir);
146
147
  if (!this.routeIsDisabled(route)) {
147
148
  route.bodySchema = safeParse(bodySchema);
148
149
  route.querySchema = safeParse(querySchema);
@@ -150,7 +151,6 @@ export class Browserless extends EventEmitter {
150
151
  route.metrics = () => this.metrics;
151
152
  route.monitoring = () => this.monitoring;
152
153
  route.fileSystem = () => this.fileSystem;
153
- route.debug = () => logger;
154
154
  route.staticSDKDir = () => this.staticSDKDir;
155
155
  httpRoutes.push(route);
156
156
  }
@@ -162,23 +162,20 @@ export class Browserless extends EventEmitter {
162
162
  ...internalWsRouteFiles,
163
163
  ]) {
164
164
  if (wsRoute.endsWith('js')) {
165
- const { name } = path.parse(wsRoute);
166
165
  const [, querySchema] = await Promise.all(routeSchemas.map(async (schemaType) => {
167
166
  const schemaPath = path.parse(wsRoute);
168
167
  schemaPath.base = `${schemaPath.name}.${schemaType}.json`;
169
168
  return await readFile(path.format(schemaPath), 'utf-8').catch(() => '');
170
169
  }));
171
170
  const wsImport = `${this.config.getIsWin() ? 'file:///' : ''}${wsRoute}`;
172
- const logger = createLogger(`ws:${name}`);
173
171
  const { default: Route, } = await import(wsImport + `?cb=${Date.now()}`);
174
- const route = new Route(this.browserManager, this.config, this.fileSystem, logger, this.metrics, this.monitoring, this.staticSDKDir);
172
+ const route = new Route(this.browserManager, this.config, this.fileSystem, this.metrics, this.monitoring, this.staticSDKDir);
175
173
  if (!this.routeIsDisabled(route)) {
176
174
  route.querySchema = safeParse(querySchema);
177
175
  route.config = () => this.config;
178
176
  route.metrics = () => this.metrics;
179
177
  route.monitoring = () => this.monitoring;
180
178
  route.fileSystem = () => this.fileSystem;
181
- route.debug = () => logger;
182
179
  route.staticSDKDir = () => this.staticSDKDir;
183
180
  wsRoutes.push(route);
184
181
  }
@@ -203,7 +200,7 @@ export class Browserless extends EventEmitter {
203
200
  httpRoutes.forEach((r) => this.router.registerHTTPRoute(r));
204
201
  wsRoutes.forEach((r) => this.router.registerWebSocketRoute(r));
205
202
  this.debug(`Imported and validated all route files, starting up server.`);
206
- this.server = new HTTPServer(this.config, this.metrics, this.token, this.router, this.hooks);
203
+ this.server = new HTTPServer(this.config, this.metrics, this.token, this.router, this.hooks, this.Logger);
207
204
  await this.server.start();
208
205
  this.debug(`Starting metrics collection.`);
209
206
  this.metricsSaveIntervalID = setInterval(() => this.saveMetrics(), this.metricsSaveInterval);
@@ -5,6 +5,7 @@ export * from './file-system.js';
5
5
  export * from './hooks.js';
6
6
  export * from './http.js';
7
7
  export * from './limiter.js';
8
+ export * from './logger.js';
8
9
  export * from './metrics.js';
9
10
  export * from './mime-types.js';
10
11
  export * from './monitoring.js';
package/build/exports.js CHANGED
@@ -6,6 +6,7 @@ export * from './file-system.js';
6
6
  export * from './hooks.js';
7
7
  export * from './http.js';
8
8
  export * from './limiter.js';
9
+ export * from './logger.js';
9
10
  export * from './metrics.js';
10
11
  export * from './mime-types.js';
11
12
  export * from './monitoring.js';
@@ -0,0 +1,12 @@
1
+ import { Request, createLogger } from '@browserless.io/browserless';
2
+ export declare class Logger {
3
+ protected prefix: string;
4
+ protected request: Request;
5
+ protected _log: ReturnType<typeof createLogger>;
6
+ protected _verbose: ReturnType<typeof createLogger>;
7
+ protected _error: ReturnType<typeof createLogger>;
8
+ constructor(prefix: string, request: Request);
9
+ verbose(...messages: string[]): void;
10
+ log(...messages: string[]): void;
11
+ error(...messages: string[]): void;
12
+ }
@@ -0,0 +1,27 @@
1
+ import { createLogger } from '@browserless.io/browserless';
2
+ export class Logger {
3
+ prefix;
4
+ request;
5
+ _log;
6
+ _verbose;
7
+ _error;
8
+ constructor(prefix, request) {
9
+ this.prefix = prefix;
10
+ this.request = request;
11
+ this._log = createLogger(prefix);
12
+ this._verbose = this._log.extend('verbose');
13
+ this._error = this._log.extend('error');
14
+ }
15
+ verbose(...messages) {
16
+ const ip = this.request.socket.remoteAddress ?? 'Unknown';
17
+ this._verbose(ip, ...messages);
18
+ }
19
+ log(...messages) {
20
+ const ip = this.request.socket.remoteAddress ?? 'Unknown';
21
+ this._log(ip, ...messages);
22
+ }
23
+ error(...messages) {
24
+ const ip = this.request.socket.remoteAddress ?? 'Unknown';
25
+ this._error(ip, ...messages);
26
+ }
27
+ }
package/build/router.d.ts CHANGED
@@ -2,18 +2,19 @@
2
2
  /// <reference types="node" />
3
3
  /// <reference types="node" />
4
4
  /// <reference types="node" />
5
- import { BrowserHTTPRoute, BrowserManager, BrowserWebsocketRoute, Config, HTTPRoute, Limiter, Request, Response, WebSocketRoute } from '@browserless.io/browserless';
5
+ import { BrowserHTTPRoute, BrowserManager, BrowserWebsocketRoute, Config, HTTPRoute, Limiter, Logger, Request, Response, WebSocketRoute } from '@browserless.io/browserless';
6
6
  import { EventEmitter } from 'events';
7
7
  import stream from 'stream';
8
8
  export declare class Router extends EventEmitter {
9
9
  protected config: Config;
10
10
  protected browserManager: BrowserManager;
11
11
  protected limiter: Limiter;
12
+ protected logger: typeof Logger;
12
13
  protected log: import("debug").Debugger;
13
14
  protected verbose: import("debug").Debugger;
14
15
  protected httpRoutes: Array<HTTPRoute | BrowserHTTPRoute>;
15
16
  protected webSocketRoutes: Array<WebSocketRoute | BrowserWebsocketRoute>;
16
- constructor(config: Config, browserManager: BrowserManager, limiter: Limiter);
17
+ constructor(config: Config, browserManager: BrowserManager, limiter: Limiter, logger: typeof Logger);
17
18
  protected getTimeout(req: Request): number | undefined;
18
19
  protected onQueueFullHTTP: (_req: Request, res: Response) => void;
19
20
  protected onQueueFullWebSocket: (_req: Request, socket: stream.Duplex) => void;
package/build/router.js CHANGED
@@ -5,15 +5,17 @@ export class Router extends EventEmitter {
5
5
  config;
6
6
  browserManager;
7
7
  limiter;
8
+ logger;
8
9
  log = createLogger('router');
9
10
  verbose = createLogger('router:verbose');
10
11
  httpRoutes = [];
11
12
  webSocketRoutes = [];
12
- constructor(config, browserManager, limiter) {
13
+ constructor(config, browserManager, limiter, logger) {
13
14
  super();
14
15
  this.config = config;
15
16
  this.browserManager = browserManager;
16
17
  this.limiter = limiter;
18
+ this.logger = logger;
17
19
  }
18
20
  getTimeout(req) {
19
21
  const timer = req.parsed.searchParams.get('timeout');
@@ -40,6 +42,7 @@ export class Router extends EventEmitter {
40
42
  this.log(`HTTP Request has closed prior to running`);
41
43
  return Promise.resolve();
42
44
  }
45
+ const logger = new this.logger(route.name, req);
43
46
  if ('browser' in route && route.browser) {
44
47
  const browser = await this.browserManager.getBrowserForRequest(req, route);
45
48
  if (!isConnected(res)) {
@@ -53,7 +56,7 @@ export class Router extends EventEmitter {
53
56
  try {
54
57
  this.verbose(`Running found HTTP handler.`);
55
58
  return await Promise.race([
56
- handler(req, res, browser),
59
+ handler(req, res, logger, browser),
57
60
  new Promise((resolve, reject) => {
58
61
  res.once('close', () => {
59
62
  if (!res.writableEnded) {
@@ -70,13 +73,14 @@ export class Router extends EventEmitter {
70
73
  this.browserManager.complete(browser);
71
74
  }
72
75
  }
73
- return handler(req, res);
76
+ return handler(req, res, logger);
74
77
  };
75
78
  wrapWebSocketHandler = (route, handler) => async (req, socket, head) => {
76
79
  if (!isConnected(socket)) {
77
80
  this.log(`WebSocket Request has closed prior to running`);
78
81
  return Promise.resolve();
79
82
  }
83
+ const logger = new this.logger(route.name, req);
80
84
  if ('browser' in route && route.browser) {
81
85
  const browser = await this.browserManager.getBrowserForRequest(req, route);
82
86
  if (!isConnected(socket)) {
@@ -89,7 +93,7 @@ export class Router extends EventEmitter {
89
93
  }
90
94
  try {
91
95
  this.verbose(`Running found WebSocket handler.`);
92
- await handler(req, socket, head, browser);
96
+ await handler(req, socket, head, logger, browser);
93
97
  }
94
98
  finally {
95
99
  this.verbose(`WebSocket Request handler has finished.`);
@@ -97,7 +101,7 @@ export class Router extends EventEmitter {
97
101
  }
98
102
  return;
99
103
  }
100
- return handler(req, socket, head);
104
+ return handler(req, socket, head, logger);
101
105
  };
102
106
  registerHTTPRoute(route) {
103
107
  this.verbose(`Registering HTTP ${route.method.toUpperCase()} ${route.path}`);
@@ -141,7 +145,7 @@ export class Router extends EventEmitter {
141
145
  // Once registered, paths are always an array here.
142
146
  r.path.some((p) => micromatch.isMatch(req.parsed.pathname, p)) &&
143
147
  r.method === req.method?.toLocaleLowerCase() &&
144
- (accepts.some((a) => a.startsWith('*/*')) ||
148
+ (accepts.some((a) => a.includes('*/*')) ||
145
149
  r.contentTypes.some((contentType) => accepts.includes(contentType))) &&
146
150
  ((!contentType && r.accepts.includes(contentTypes.any)) ||
147
151
  r.accepts.includes(contentType))) ||
@@ -394,14 +394,14 @@
394
394
  "length": {
395
395
  "type": "number"
396
396
  },
397
- "__@toStringTag@10942": {
397
+ "__@toStringTag@10944": {
398
398
  "type": "string",
399
399
  "const": "Uint8Array"
400
400
  }
401
401
  },
402
402
  "required": [
403
403
  "BYTES_PER_ELEMENT",
404
- "__@toStringTag@10942",
404
+ "__@toStringTag@10944",
405
405
  "buffer",
406
406
  "byteLength",
407
407
  "byteOffset",
@@ -436,13 +436,13 @@
436
436
  "byteLength": {
437
437
  "type": "number"
438
438
  },
439
- "__@toStringTag@10942": {
439
+ "__@toStringTag@10944": {
440
440
  "type": "string"
441
441
  }
442
442
  },
443
443
  "additionalProperties": false,
444
444
  "required": [
445
- "__@toStringTag@10942",
445
+ "__@toStringTag@10944",
446
446
  "byteLength"
447
447
  ]
448
448
  },
@@ -452,18 +452,18 @@
452
452
  "byteLength": {
453
453
  "type": "number"
454
454
  },
455
- "__@species@11043": {
455
+ "__@species@11045": {
456
456
  "$ref": "#/definitions/SharedArrayBuffer"
457
457
  },
458
- "__@toStringTag@10942": {
458
+ "__@toStringTag@10944": {
459
459
  "type": "string",
460
460
  "const": "SharedArrayBuffer"
461
461
  }
462
462
  },
463
463
  "additionalProperties": false,
464
464
  "required": [
465
- "__@species@11043",
466
- "__@toStringTag@10942",
465
+ "__@species@11045",
466
+ "__@toStringTag@10944",
467
467
  "byteLength"
468
468
  ]
469
469
  },
@@ -374,7 +374,7 @@
374
374
  "type": "string"
375
375
  },
376
376
  "footerTemplate": {
377
- "description": "HTML template for the print footer. Has the same constraints and support\nfor special classes as {@link PDFOptionsPDFOptions.headerTemplate}.",
377
+ "description": "HTML template for the print footer. Has the same constraints and support\nfor special classes as {@link PDFOptions.headerTemplate}.",
378
378
  "type": "string"
379
379
  },
380
380
  "printBackground": {
@@ -535,14 +535,14 @@
535
535
  "length": {
536
536
  "type": "number"
537
537
  },
538
- "__@toStringTag@87002": {
538
+ "__@toStringTag@87018": {
539
539
  "type": "string",
540
540
  "const": "Uint8Array"
541
541
  }
542
542
  },
543
543
  "required": [
544
544
  "BYTES_PER_ELEMENT",
545
- "__@toStringTag@87002",
545
+ "__@toStringTag@87018",
546
546
  "buffer",
547
547
  "byteLength",
548
548
  "byteOffset",
@@ -577,13 +577,13 @@
577
577
  "byteLength": {
578
578
  "type": "number"
579
579
  },
580
- "__@toStringTag@87002": {
580
+ "__@toStringTag@87018": {
581
581
  "type": "string"
582
582
  }
583
583
  },
584
584
  "additionalProperties": false,
585
585
  "required": [
586
- "__@toStringTag@87002",
586
+ "__@toStringTag@87018",
587
587
  "byteLength"
588
588
  ]
589
589
  },
@@ -593,18 +593,18 @@
593
593
  "byteLength": {
594
594
  "type": "number"
595
595
  },
596
- "__@species@87103": {
596
+ "__@species@87119": {
597
597
  "$ref": "#/definitions/SharedArrayBuffer"
598
598
  },
599
- "__@toStringTag@87002": {
599
+ "__@toStringTag@87018": {
600
600
  "type": "string",
601
601
  "const": "SharedArrayBuffer"
602
602
  }
603
603
  },
604
604
  "additionalProperties": false,
605
605
  "required": [
606
- "__@species@87103",
607
- "__@toStringTag@87002",
606
+ "__@species@87119",
607
+ "__@toStringTag@87018",
608
608
  "byteLength"
609
609
  ]
610
610
  },
@@ -441,14 +441,14 @@
441
441
  "length": {
442
442
  "type": "number"
443
443
  },
444
- "__@toStringTag@108934": {
444
+ "__@toStringTag@108954": {
445
445
  "type": "string",
446
446
  "const": "Uint8Array"
447
447
  }
448
448
  },
449
449
  "required": [
450
450
  "BYTES_PER_ELEMENT",
451
- "__@toStringTag@108934",
451
+ "__@toStringTag@108954",
452
452
  "buffer",
453
453
  "byteLength",
454
454
  "byteOffset",
@@ -483,13 +483,13 @@
483
483
  "byteLength": {
484
484
  "type": "number"
485
485
  },
486
- "__@toStringTag@108934": {
486
+ "__@toStringTag@108954": {
487
487
  "type": "string"
488
488
  }
489
489
  },
490
490
  "additionalProperties": false,
491
491
  "required": [
492
- "__@toStringTag@108934",
492
+ "__@toStringTag@108954",
493
493
  "byteLength"
494
494
  ]
495
495
  },
@@ -499,18 +499,18 @@
499
499
  "byteLength": {
500
500
  "type": "number"
501
501
  },
502
- "__@species@109035": {
502
+ "__@species@109055": {
503
503
  "$ref": "#/definitions/SharedArrayBuffer"
504
504
  },
505
- "__@toStringTag@108934": {
505
+ "__@toStringTag@108954": {
506
506
  "type": "string",
507
507
  "const": "SharedArrayBuffer"
508
508
  }
509
509
  },
510
510
  "additionalProperties": false,
511
511
  "required": [
512
- "__@species@109035",
513
- "__@toStringTag@108934",
512
+ "__@species@109055",
513
+ "__@toStringTag@108954",
514
514
  "byteLength"
515
515
  ]
516
516
  },
@@ -484,14 +484,14 @@
484
484
  "length": {
485
485
  "type": "number"
486
486
  },
487
- "__@toStringTag@120110": {
487
+ "__@toStringTag@120132": {
488
488
  "type": "string",
489
489
  "const": "Uint8Array"
490
490
  }
491
491
  },
492
492
  "required": [
493
493
  "BYTES_PER_ELEMENT",
494
- "__@toStringTag@120110",
494
+ "__@toStringTag@120132",
495
495
  "buffer",
496
496
  "byteLength",
497
497
  "byteOffset",
@@ -526,13 +526,13 @@
526
526
  "byteLength": {
527
527
  "type": "number"
528
528
  },
529
- "__@toStringTag@120110": {
529
+ "__@toStringTag@120132": {
530
530
  "type": "string"
531
531
  }
532
532
  },
533
533
  "additionalProperties": false,
534
534
  "required": [
535
- "__@toStringTag@120110",
535
+ "__@toStringTag@120132",
536
536
  "byteLength"
537
537
  ]
538
538
  },
@@ -542,18 +542,18 @@
542
542
  "byteLength": {
543
543
  "type": "number"
544
544
  },
545
- "__@species@120211": {
545
+ "__@species@120233": {
546
546
  "$ref": "#/definitions/SharedArrayBuffer"
547
547
  },
548
- "__@toStringTag@120110": {
548
+ "__@toStringTag@120132": {
549
549
  "type": "string",
550
550
  "const": "SharedArrayBuffer"
551
551
  }
552
552
  },
553
553
  "additionalProperties": false,
554
554
  "required": [
555
- "__@species@120211",
556
- "__@toStringTag@120110",
555
+ "__@species@120233",
556
+ "__@toStringTag@120132",
557
557
  "byteLength"
558
558
  ]
559
559
  },