@browserless.io/browserless 2.7.0 → 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 (84) hide show
  1. package/CHANGELOG.md +16 -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 +3 -3
  57. package/scripts/start.sh +2 -1
  58. package/scripts/test.sh +7 -4
  59. package/src/browserless.ts +8 -9
  60. package/src/exports.ts +1 -0
  61. package/src/logger.ts +31 -0
  62. package/src/router.ts +9 -7
  63. package/src/routes/firefox/ws/playwright.ts +2 -0
  64. package/src/routes/management/http/static.get.ts +15 -10
  65. package/src/routes/webkit/ws/playwright.ts +2 -0
  66. package/src/sdk-utils.ts +20 -2
  67. package/src/server.ts +4 -2
  68. package/src/shared/browser.ws.ts +2 -0
  69. package/src/shared/chromium.playwright.ws.ts +2 -0
  70. package/src/shared/chromium.ws.ts +2 -0
  71. package/src/shared/content.http.ts +2 -0
  72. package/src/shared/download.http.ts +14 -11
  73. package/src/shared/function.http.ts +5 -4
  74. package/src/shared/page.ws.ts +2 -0
  75. package/src/shared/pdf.http.ts +2 -0
  76. package/src/shared/performance.http.ts +2 -0
  77. package/src/shared/scrape.http.ts +2 -0
  78. package/src/shared/screenshot.http.ts +2 -0
  79. package/src/shared/utils/function/handler.ts +8 -12
  80. package/src/types.ts +5 -9
  81. package/static/docs/swagger.json +11 -11
  82. package/static/docs/swagger.min.json +10 -10
  83. package/static/function/client.js +20 -9
  84. package/static/function/index.html +20 -9
package/src/router.ts CHANGED
@@ -6,6 +6,7 @@ import {
6
6
  HTTPManagementRoutes,
7
7
  HTTPRoute,
8
8
  Limiter,
9
+ Logger,
9
10
  Methods,
10
11
  PathTypes,
11
12
  Request,
@@ -30,6 +31,7 @@ export class Router extends EventEmitter {
30
31
  protected config: Config,
31
32
  protected browserManager: BrowserManager,
32
33
  protected limiter: Limiter,
34
+ protected logger: typeof Logger,
33
35
  ) {
34
36
  super();
35
37
  }
@@ -70,7 +72,7 @@ export class Router extends EventEmitter {
70
72
  this.log(`HTTP Request has closed prior to running`);
71
73
  return Promise.resolve();
72
74
  }
73
-
75
+ const logger = new this.logger(route.name, req);
74
76
  if ('browser' in route && route.browser) {
75
77
  const browser = await this.browserManager.getBrowserForRequest(
76
78
  req,
@@ -90,7 +92,7 @@ export class Router extends EventEmitter {
90
92
  try {
91
93
  this.verbose(`Running found HTTP handler.`);
92
94
  return await Promise.race([
93
- handler(req, res, browser),
95
+ handler(req, res, logger, browser),
94
96
  new Promise((resolve, reject) => {
95
97
  res.once('close', () => {
96
98
  if (!res.writableEnded) {
@@ -107,7 +109,7 @@ export class Router extends EventEmitter {
107
109
  }
108
110
  }
109
111
 
110
- return (handler as HTTPRoute['handler'])(req, res);
112
+ return (handler as HTTPRoute['handler'])(req, res, logger);
111
113
  };
112
114
 
113
115
  protected wrapWebSocketHandler =
@@ -120,7 +122,7 @@ export class Router extends EventEmitter {
120
122
  this.log(`WebSocket Request has closed prior to running`);
121
123
  return Promise.resolve();
122
124
  }
123
-
125
+ const logger = new this.logger(route.name, req);
124
126
  if ('browser' in route && route.browser) {
125
127
  const browser = await this.browserManager.getBrowserForRequest(
126
128
  req,
@@ -139,14 +141,14 @@ export class Router extends EventEmitter {
139
141
 
140
142
  try {
141
143
  this.verbose(`Running found WebSocket handler.`);
142
- await handler(req, socket, head, browser);
144
+ await handler(req, socket, head, logger, browser);
143
145
  } finally {
144
146
  this.verbose(`WebSocket Request handler has finished.`);
145
147
  this.browserManager.complete(browser);
146
148
  }
147
149
  return;
148
150
  }
149
- return (handler as WebSocketRoute['handler'])(req, socket, head);
151
+ return (handler as WebSocketRoute['handler'])(req, socket, head, logger);
150
152
  };
151
153
 
152
154
  public registerHTTPRoute(
@@ -230,7 +232,7 @@ export class Router extends EventEmitter {
230
232
  micromatch.isMatch(req.parsed.pathname, p),
231
233
  ) &&
232
234
  r.method === (req.method?.toLocaleLowerCase() as Methods) &&
233
- (accepts.some((a) => a.startsWith('*/*')) ||
235
+ (accepts.some((a) => a.includes('*/*')) ||
234
236
  r.contentTypes.some((contentType) =>
235
237
  accepts.includes(contentType),
236
238
  )) &&
@@ -5,6 +5,7 @@ import {
5
5
  BrowserWebsocketRoute,
6
6
  BrowserlessRoutes,
7
7
  FirefoxPlaywright,
8
+ Logger,
8
9
  Request,
9
10
  SystemQueryParameters,
10
11
  WebsocketRoutes,
@@ -29,6 +30,7 @@ export default class FirefoxPlaywrightWebSocketRoute extends BrowserWebsocketRou
29
30
  req: Request,
30
31
  socket: Duplex,
31
32
  head: Buffer,
33
+ _logger: Logger,
32
34
  browser: FirefoxPlaywright,
33
35
  ): Promise<void> => {
34
36
  const isPlaywright = req.headers['user-agent']
@@ -3,6 +3,7 @@ import {
3
3
  BrowserlessRoutes,
4
4
  HTTPManagementRoutes,
5
5
  HTTPRoute,
6
+ Logger,
6
7
  Methods,
7
8
  NotFound,
8
9
  Request,
@@ -23,21 +24,21 @@ const pathMap: Map<
23
24
  > = new Map();
24
25
 
25
26
  const streamFile = (
26
- debug: debug.Debugger,
27
+ logger: Logger,
27
28
  res: ServerResponse,
28
29
  file: string,
29
30
  contentType?: string,
30
31
  ) =>
31
32
  new Promise((resolve, reject) => {
32
33
  if (contentType) {
33
- debug(`Setting content-type ${contentType}`);
34
+ logger.log(`Setting content-type ${contentType}`);
34
35
  res.setHeader('Content-Type', contentType);
35
36
  }
36
37
 
37
38
  return createReadStream(file)
38
39
  .on('error', (error) => {
39
40
  if (error) {
40
- debug(`Error finding file ${file}, sending 404`);
41
+ logger.error(`Error finding file ${file}, sending 404`);
41
42
  pathMap.delete(file);
42
43
  return reject(
43
44
  new NotFound(`Request for file "${file}" was not found`),
@@ -59,14 +60,16 @@ export default class StaticGetRoute extends HTTPRoute {
59
60
  method = Methods.get;
60
61
  path = HTTPManagementRoutes.static;
61
62
  tags = [APITags.management];
62
- handler = async (req: Request, res: ServerResponse): Promise<unknown> => {
63
+ handler = async (
64
+ req: Request,
65
+ res: ServerResponse,
66
+ logger: Logger,
67
+ ): Promise<unknown> => {
63
68
  const { pathname } = req.parsed;
64
69
  const fileCache = pathMap.get(pathname);
65
- const debug = this.debug();
66
- const verbose = debug.extend('verbose');
67
70
 
68
71
  if (fileCache) {
69
- return streamFile(verbose, res, fileCache.path, fileCache.contentType);
72
+ return streamFile(logger, res, fileCache.path, fileCache.contentType);
70
73
  }
71
74
 
72
75
  const config = this.config();
@@ -93,13 +96,15 @@ export default class StaticGetRoute extends HTTPRoute {
93
96
  }
94
97
 
95
98
  if (foundFilePaths.length > 1) {
96
- debug(
99
+ logger.log(
97
100
  `Multiple files found for request to "${pathname}". Only the first file is served, so please name your files uniquely.`,
98
101
  );
99
102
  }
100
103
 
101
104
  const [foundFilePath] = foundFilePaths;
102
- verbose(`Found new file "${foundFilePath}", caching path and serving`);
105
+ logger.verbose(
106
+ `Found new file "${foundFilePath}", caching path and serving`,
107
+ );
103
108
 
104
109
  const contentType = mimeTypes.get(path.extname(foundFilePath));
105
110
 
@@ -113,6 +118,6 @@ export default class StaticGetRoute extends HTTPRoute {
113
118
  path: foundFilePath,
114
119
  });
115
120
 
116
- return streamFile(verbose, res, foundFilePath, contentType);
121
+ return streamFile(logger, res, foundFilePath, contentType);
117
122
  };
118
123
  }
@@ -4,6 +4,7 @@ import {
4
4
  BrowserServerOptions,
5
5
  BrowserWebsocketRoute,
6
6
  BrowserlessRoutes,
7
+ Logger,
7
8
  Request,
8
9
  SystemQueryParameters,
9
10
  WebkitPlaywright,
@@ -27,6 +28,7 @@ export default class WebKitPlaywrightWebSocketRoute extends BrowserWebsocketRout
27
28
  req: Request,
28
29
  socket: Duplex,
29
30
  head: Buffer,
31
+ _logger: Logger,
30
32
  browser: WebkitPlaywright,
31
33
  ): Promise<void> => {
32
34
  const isPlaywright = req.headers['user-agent']
package/src/sdk-utils.ts CHANGED
@@ -83,8 +83,8 @@ export const prompt = async (question: string) => {
83
83
 
84
84
  export const installDependencies = async (
85
85
  workingDirectory: string,
86
- ): Promise<void> =>
87
- new Promise((resolve, reject) => {
86
+ ): Promise<void> => {
87
+ await new Promise<void>((resolve, reject) => {
88
88
  spawn('npm', ['i'], {
89
89
  cwd: workingDirectory,
90
90
  stdio: 'inherit',
@@ -97,6 +97,24 @@ export const installDependencies = async (
97
97
  );
98
98
  });
99
99
  });
100
+ await new Promise<void>((resolve, reject) => {
101
+ spawn(
102
+ 'npx',
103
+ 'playwright-core install --with-deps chromium firefox webkit'.split(' '),
104
+ {
105
+ cwd: workingDirectory,
106
+ stdio: 'inherit',
107
+ },
108
+ ).once('close', (code) => {
109
+ if (code === 0) {
110
+ return resolve();
111
+ }
112
+ return reject(
113
+ `Error when installing dependencies, see output for more details`,
114
+ );
115
+ });
116
+ });
117
+ };
100
118
 
101
119
  export const buildDockerImage = async (
102
120
  cmd: string,
package/src/server.ts CHANGED
@@ -2,6 +2,7 @@ import * as http from 'http';
2
2
  import * as stream from 'stream';
3
3
  import {
4
4
  BadRequest,
5
+ Logger as BlessLogger,
5
6
  Config,
6
7
  HTTPRoute,
7
8
  Hooks,
@@ -49,6 +50,7 @@ export class HTTPServer extends EventEmitter {
49
50
  protected token: Token,
50
51
  protected router: Router,
51
52
  protected hooks: Hooks,
53
+ protected Logger: typeof BlessLogger,
52
54
  ) {
53
55
  super();
54
56
  this.host = config.getHost();
@@ -263,7 +265,7 @@ export class HTTPServer extends EventEmitter {
263
265
  }
264
266
 
265
267
  return (route as HTTPRoute)
266
- .handler(req, res)
268
+ .handler(req, res, new this.Logger(route.name, req))
267
269
  .then(() => {
268
270
  this.verbose('HTTP connection complete');
269
271
  })
@@ -368,7 +370,7 @@ export class HTTPServer extends EventEmitter {
368
370
  }
369
371
 
370
372
  return (route as WebSocketRoute)
371
- .handler(req, socket, head)
373
+ .handler(req, socket, head, new this.Logger(route.name, req))
372
374
  .then(() => {
373
375
  this.verbose('Websocket connection complete');
374
376
  })
@@ -4,6 +4,7 @@ import {
4
4
  BrowserlessRoutes,
5
5
  CDPLaunchOptions,
6
6
  ChromiumCDP,
7
+ Logger,
7
8
  Request,
8
9
  SystemQueryParameters,
9
10
  WebsocketRoutes,
@@ -31,6 +32,7 @@ export default class ChromiumBrowserWebSocketRoute extends BrowserWebsocketRoute
31
32
  req: Request,
32
33
  socket: Duplex,
33
34
  head: Buffer,
35
+ _logger: Logger,
34
36
  browser: ChromiumCDP,
35
37
  ): Promise<void> => browser.proxyWebSocket(req, socket, head);
36
38
  }
@@ -5,6 +5,7 @@ import {
5
5
  BrowserWebsocketRoute,
6
6
  BrowserlessRoutes,
7
7
  ChromiumPlaywright,
8
+ Logger,
8
9
  Request,
9
10
  SystemQueryParameters,
10
11
  WebsocketRoutes,
@@ -30,6 +31,7 @@ export default class ChromiumPlaywrightWebSocketRoute extends BrowserWebsocketRo
30
31
  req: Request,
31
32
  socket: Duplex,
32
33
  head: Buffer,
34
+ _logger: Logger,
33
35
  browser: ChromiumPlaywright,
34
36
  ): Promise<void> => {
35
37
  const isPlaywright = req.headers['user-agent']
@@ -4,6 +4,7 @@ import {
4
4
  BrowserlessRoutes,
5
5
  CDPLaunchOptions,
6
6
  ChromiumCDP,
7
+ Logger,
7
8
  Request,
8
9
  SystemQueryParameters,
9
10
  WebsocketRoutes,
@@ -26,6 +27,7 @@ export default class ChromiumCDPWebSocketRoute extends BrowserWebsocketRoute {
26
27
  req: Request,
27
28
  socket: Duplex,
28
29
  head: Buffer,
30
+ _logger: Logger,
29
31
  browser: ChromiumCDP,
30
32
  ): Promise<void> => browser.proxyWebSocket(req, socket, head);
31
33
  }
@@ -7,6 +7,7 @@ import {
7
7
  CDPLaunchOptions,
8
8
  ChromiumCDP,
9
9
  HTTPRoutes,
10
+ Logger,
10
11
  Methods,
11
12
  Request,
12
13
  SystemQueryParameters,
@@ -77,6 +78,7 @@ export default class ChromiumContentPostRoute extends BrowserHTTPRoute {
77
78
  handler = async (
78
79
  req: Request,
79
80
  res: ServerResponse,
81
+ _logger: Logger,
80
82
  browser: BrowserInstance,
81
83
  ): Promise<void> => {
82
84
  const contentType =
@@ -6,6 +6,7 @@ import {
6
6
  CDPLaunchOptions,
7
7
  ChromiumCDP,
8
8
  HTTPRoutes,
9
+ Logger,
9
10
  Methods,
10
11
  NotFound,
11
12
  Request,
@@ -61,21 +62,21 @@ export default class ChromiumDownloadPostRoute extends BrowserHTTPRoute {
61
62
  handler = async (
62
63
  req: Request,
63
64
  res: ServerResponse,
65
+ logger: Logger,
64
66
  browser: BrowserInstance,
65
67
  ): Promise<void> =>
66
68
  new Promise(async (resolve, reject) => {
67
- const debug = this.debug();
68
69
  const config = this.config();
69
70
  const downloadPath = path.join(
70
71
  await config.getDownloadsDir(),
71
72
  `.browserless.download.${id()}`,
72
73
  );
73
74
 
74
- debug(`Generating a download directory at "${downloadPath}"`);
75
+ logger.log(`Generating a download directory at "${downloadPath}"`);
75
76
  await mkdir(downloadPath);
76
- const handler = functionHandler(config, debug, { downloadPath });
77
+ const handler = functionHandler(config, logger, { downloadPath });
77
78
  const response = await handler(req, browser).catch((e) => {
78
- debug(`Error running download code handler: "${e}"`);
79
+ logger.log(`Error running download code handler: "${e}"`);
79
80
  reject(e);
80
81
  return null;
81
82
  });
@@ -85,10 +86,12 @@ export default class ChromiumDownloadPostRoute extends BrowserHTTPRoute {
85
86
  }
86
87
 
87
88
  const { page } = response;
88
- debug(`Download function has returned, finding downloads...`);
89
+ logger.log(`Download function has returned, finding downloads...`);
89
90
  async function checkIfDownloadComplete(): Promise<string | null> {
90
91
  if (res.headersSent) {
91
- debug(`Request headers have been sent, terminating download watch.`);
92
+ logger.log(
93
+ `Request headers have been sent, terminating download watch.`,
94
+ );
92
95
  return null;
93
96
  }
94
97
  const [fileName] = await readdir(downloadPath);
@@ -97,13 +100,13 @@ export default class ChromiumDownloadPostRoute extends BrowserHTTPRoute {
97
100
  return checkIfDownloadComplete();
98
101
  }
99
102
 
100
- debug(`All files have finished downloading`);
103
+ logger.log(`All files have finished downloading`);
101
104
 
102
105
  return path.join(downloadPath, fileName);
103
106
  }
104
107
 
105
108
  const filePath = await checkIfDownloadComplete();
106
- debug(`Closing pages.`);
109
+ logger.log(`Closing pages.`);
107
110
  page.close();
108
111
  page.removeAllListeners();
109
112
 
@@ -112,12 +115,12 @@ export default class ChromiumDownloadPostRoute extends BrowserHTTPRoute {
112
115
  filePath &&
113
116
  deleteAsync(filePath, { force: true })
114
117
  .then(() => {
115
- debug(
118
+ logger.log(
116
119
  `Successfully deleted downloads from disk at "${filePath}"`,
117
120
  );
118
121
  })
119
122
  .catch((err) => {
120
- debug(
123
+ logger.log(
121
124
  `Error cleaning up downloaded files: "${err}" at "${filePath}"`,
122
125
  );
123
126
  }),
@@ -144,7 +147,7 @@ export default class ChromiumDownloadPostRoute extends BrowserHTTPRoute {
144
147
  }
145
148
  })
146
149
  .on('end', () => {
147
- debug(`Downloads successfully sent`);
150
+ logger.log(`Downloads successfully sent`);
148
151
  rmDownload();
149
152
  return resolve();
150
153
  })
@@ -7,6 +7,7 @@ import {
7
7
  CDPLaunchOptions,
8
8
  ChromiumCDP,
9
9
  HTTPRoutes,
10
+ Logger,
10
11
  Methods,
11
12
  Request,
12
13
  SystemQueryParameters,
@@ -57,14 +58,14 @@ export default class ChromiumFunctionPostRoute extends BrowserHTTPRoute {
57
58
  handler = async (
58
59
  req: Request,
59
60
  res: ServerResponse,
61
+ logger: Logger,
60
62
  browser: BrowserInstance,
61
63
  ): Promise<void> => {
62
- const debug = this.debug();
63
64
  const config = this.config();
64
- const handler = functionHandler(config, debug);
65
+ const handler = functionHandler(config, logger);
65
66
  const { contentType, payload, page } = await handler(req, browser);
66
67
 
67
- debug(`Got function response of "${contentType}"`);
68
+ logger.log(`Got function response of "${contentType}"`);
68
69
  page.close();
69
70
  page.removeAllListeners();
70
71
 
@@ -76,7 +77,7 @@ export default class ChromiumFunctionPostRoute extends BrowserHTTPRoute {
76
77
  if (!type) {
77
78
  throw new BadRequest(`Couldn't determine function's response type.`);
78
79
  } else {
79
- debug(`Sending file-type response of "${type}"`);
80
+ logger.log(`Sending file-type response of "${type}"`);
80
81
  const readStream = new Stream.PassThrough();
81
82
  readStream.end(response);
82
83
  res.setHeader('Content-Type', type);
@@ -4,6 +4,7 @@ import {
4
4
  BrowserlessRoutes,
5
5
  CDPLaunchOptions,
6
6
  ChromiumCDP,
7
+ Logger,
7
8
  Request,
8
9
  SystemQueryParameters,
9
10
  WebsocketRoutes,
@@ -32,6 +33,7 @@ export default class ChromiumPageWebSocketRoute extends BrowserWebsocketRoute {
32
33
  req: Request,
33
34
  socket: Duplex,
34
35
  head: Buffer,
36
+ _logger: Logger,
35
37
  browser: ChromiumCDP,
36
38
  ): Promise<void> => browser.proxyPageWebSocket(req, socket, head);
37
39
  }
@@ -7,6 +7,7 @@ import {
7
7
  CDPLaunchOptions,
8
8
  ChromiumCDP,
9
9
  HTTPRoutes,
10
+ Logger,
10
11
  Methods,
11
12
  Request,
12
13
  SystemQueryParameters,
@@ -83,6 +84,7 @@ export default class ChromiumPDFPostRoute extends BrowserHTTPRoute {
83
84
  handler = async (
84
85
  req: Request,
85
86
  res: ServerResponse,
87
+ _logger: Logger,
86
88
  browser: BrowserInstance,
87
89
  ): Promise<void> => {
88
90
  const contentType =
@@ -6,6 +6,7 @@ import {
6
6
  CDPLaunchOptions,
7
7
  ChromiumCDP,
8
8
  HTTPRoutes,
9
+ Logger,
9
10
  Methods,
10
11
  Request,
11
12
  SystemQueryParameters,
@@ -47,6 +48,7 @@ export default class PerformancePost extends BrowserHTTPRoute {
47
48
  handler = async (
48
49
  req: Request,
49
50
  res: ServerResponse,
51
+ _logger: Logger,
50
52
  browser: BrowserInstance,
51
53
  ): Promise<void> => {
52
54
  const config = this.config();
@@ -8,6 +8,7 @@ import {
8
8
  ChromiumCDP,
9
9
  HTTPRoutes,
10
10
  InBoundRequest,
11
+ Logger,
11
12
  Methods,
12
13
  OutBoundRequest,
13
14
  Request,
@@ -218,6 +219,7 @@ export default class ChromiumScrapePostRoute extends BrowserHTTPRoute {
218
219
  handler = async (
219
220
  req: Request,
220
221
  res: ServerResponse,
222
+ _logger: Logger,
221
223
  browser: BrowserInstance,
222
224
  ) => {
223
225
  const contentType =
@@ -7,6 +7,7 @@ import {
7
7
  CDPLaunchOptions,
8
8
  ChromiumCDP,
9
9
  HTTPRoutes,
10
+ Logger,
10
11
  Methods,
11
12
  Request,
12
13
  SystemQueryParameters,
@@ -85,6 +86,7 @@ export default class ScreenshotPost extends BrowserHTTPRoute {
85
86
  handler = async (
86
87
  req: Request,
87
88
  res: ServerResponse,
89
+ _logger: Logger,
88
90
  browser: BrowserInstance,
89
91
  ): Promise<void> => {
90
92
  const contentType =
@@ -4,6 +4,7 @@ import {
4
4
  ChromiumCDP,
5
5
  Config,
6
6
  HTTPRoutes,
7
+ Logger,
7
8
  Request,
8
9
  UnwrapPromise,
9
10
  contentTypes,
@@ -16,7 +17,6 @@ import {
16
17
  } from '@browserless.io/browserless';
17
18
  import { FunctionRunner } from './client.js';
18
19
  import { Page } from 'puppeteer-core';
19
- import debug from 'debug';
20
20
  import fs from 'fs';
21
21
  import path from 'path';
22
22
 
@@ -35,11 +35,7 @@ interface HandlerOptions {
35
35
  downloadPath?: string;
36
36
  }
37
37
 
38
- export default (
39
- config: Config,
40
- debug: debug.Debugger,
41
- options: HandlerOptions = {},
42
- ) =>
38
+ export default (config: Config, logger: Logger, options: HandlerOptions = {}) =>
43
39
  async (
44
40
  req: Request,
45
41
  browser: BrowserInstance,
@@ -88,7 +84,7 @@ export default (
88
84
  */
89
85
  page.on('request', async (request) => {
90
86
  const requestUrl = request.url();
91
- debug(`Outbound Page Request: "${requestUrl}"`);
87
+ logger.log(`Outbound Page Request: "${requestUrl}"`);
92
88
  if (requestUrl.startsWith(functionRequestPath)) {
93
89
  const filename = path.basename(requestUrl);
94
90
  if (filename === functionCodeJS) {
@@ -107,7 +103,7 @@ export default (
107
103
  status: 200,
108
104
  });
109
105
  }
110
- debug(
106
+ logger.log(
111
107
  `Static asset request to "${requestUrl}" couldn't be found, 404-ing`,
112
108
  );
113
109
  return request.respond({
@@ -116,18 +112,18 @@ export default (
116
112
  status: 404,
117
113
  });
118
114
  }
119
- debug(`Request: "${requestUrl}" no responder found, continuing...`);
115
+ logger.log(`Request: "${requestUrl}" no responder found, continuing...`);
120
116
  return request.continue();
121
117
  });
122
118
 
123
119
  page.on('response', (res) => {
124
120
  if (res.status() !== 200) {
125
- debug(`Received a non-200 response for request "${res.url()}"`);
121
+ logger.log(`Received a non-200 response for request "${res.url()}"`);
126
122
  }
127
123
  });
128
124
 
129
125
  page.on('console', (event) => {
130
- debug(`${event.type()}: ${event.text()}`);
126
+ logger.log(`${event.type()}: ${event.text()}`);
131
127
  });
132
128
 
133
129
  await page.goto(functionIndexHTML);
@@ -164,7 +160,7 @@ export default (
164
160
  JSON.stringify(options),
165
161
  )
166
162
  .catch((e) => {
167
- debug(`Error running code: ${e}`);
163
+ logger.log(`Error running code: ${e}`);
168
164
  throw new BadRequest(e.message);
169
165
  });
170
166
 
package/src/types.ts CHANGED
@@ -9,6 +9,7 @@ import {
9
9
  FirefoxPlaywright,
10
10
  HTTPManagementRoutes,
11
11
  HTTPRoutes,
12
+ Logger,
12
13
  Methods,
13
14
  Metrics,
14
15
  Request,
@@ -99,7 +100,6 @@ abstract class Route {
99
100
  protected _browserManager: Browserless['browserManager'],
100
101
  protected _config: Browserless['config'],
101
102
  protected _fileSystem: Browserless['fileSystem'],
102
- protected _debug: Browserless['debug'],
103
103
  protected _metrics: Browserless['metrics'],
104
104
  protected _monitoring: Browserless['monitoring'],
105
105
  protected _staticSDKDir: Browserless['staticSDKDir'],
@@ -164,14 +164,6 @@ abstract class Route {
164
164
  */
165
165
  config = () => this._config;
166
166
 
167
- /**
168
- * Helper function that loads the debug module, useful
169
- * for logging messages scoped to the routes path. Defined
170
- * and injected by browserless after initialization.
171
- * @returns Debug
172
- */
173
- debug = () => this._debug;
174
-
175
167
  /**
176
168
  * Helper function that loads the file-system module
177
169
  * for interacting with file-systems. Defined and injected by
@@ -254,6 +246,7 @@ export abstract class HTTPRoute extends BasicHTTPRoute {
254
246
  abstract handler: (
255
247
  req: Request,
256
248
  res: http.ServerResponse,
249
+ logger: Logger,
257
250
  ) => Promise<unknown>;
258
251
  }
259
252
 
@@ -274,6 +267,7 @@ export abstract class BrowserHTTPRoute extends BasicHTTPRoute {
274
267
  abstract handler: (
275
268
  req: Request,
276
269
  res: http.ServerResponse,
270
+ logger: Logger,
277
271
  browser: BrowserInstance,
278
272
  ) => Promise<unknown>;
279
273
 
@@ -298,6 +292,7 @@ export abstract class WebSocketRoute extends Route {
298
292
  req: Request,
299
293
  socket: stream.Duplex,
300
294
  head: Buffer,
295
+ logger: Logger,
301
296
  ) => Promise<unknown>;
302
297
  }
303
298
 
@@ -319,6 +314,7 @@ export abstract class BrowserWebsocketRoute extends Route {
319
314
  req: Request,
320
315
  socket: stream.Duplex,
321
316
  head: Buffer,
317
+ logger: Logger,
322
318
  browser: BrowserInstance,
323
319
  ): Promise<unknown>;
324
320