@browserless.io/browserless 2.12.0-beta-4 → 2.12.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 (146) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/bin/scaffold/README.md +6 -5
  3. package/bin/scaffold/src/hello-world.http.ts +3 -3
  4. package/build/browserless.d.ts +3 -3
  5. package/build/browserless.js +6 -6
  6. package/build/browsers/chromium.cdp.d.ts +12 -12
  7. package/build/browsers/chromium.cdp.js +77 -65
  8. package/build/browsers/chromium.playwright.d.ts +11 -11
  9. package/build/browsers/chromium.playwright.js +42 -34
  10. package/build/browsers/firefox.playwright.d.ts +11 -11
  11. package/build/browsers/firefox.playwright.js +42 -34
  12. package/build/browsers/index.d.ts +14 -14
  13. package/build/browsers/index.js +27 -25
  14. package/build/browsers/webkit.playwright.d.ts +11 -11
  15. package/build/browsers/webkit.playwright.js +43 -35
  16. package/build/config.d.ts +65 -63
  17. package/build/config.js +162 -102
  18. package/build/file-system.d.ts +4 -4
  19. package/build/file-system.js +8 -8
  20. package/build/hooks.d.ts +2 -2
  21. package/build/hooks.js +4 -4
  22. package/build/limiter.d.ts +4 -4
  23. package/build/limiter.js +10 -10
  24. package/build/logger.d.ts +6 -6
  25. package/build/logger.js +12 -12
  26. package/build/metrics.d.ts +12 -12
  27. package/build/metrics.js +23 -23
  28. package/build/monitoring.d.ts +4 -4
  29. package/build/monitoring.js +8 -8
  30. package/build/router.d.ts +8 -8
  31. package/build/router.js +74 -70
  32. package/build/routes/chrome/http/pdf.post.body.json +8 -8
  33. package/build/routes/chrome/http/scrape.post.body.json +8 -8
  34. package/build/routes/chrome/http/screenshot.post.body.json +8 -8
  35. package/build/routes/chromium/http/content.post.body.json +8 -8
  36. package/build/routes/chromium/http/pdf.post.body.json +8 -8
  37. package/build/routes/chromium/http/scrape.post.body.json +8 -8
  38. package/build/routes/chromium/http/screenshot.post.body.json +8 -8
  39. package/build/routes/firefox/ws/playwright.d.ts +1 -1
  40. package/build/routes/firefox/ws/playwright.js +2 -2
  41. package/build/routes/management/http/active.get.d.ts +1 -1
  42. package/build/routes/management/http/active.get.js +3 -1
  43. package/build/routes/management/http/config.get.d.ts +1 -1
  44. package/build/routes/management/http/config.get.js +2 -2
  45. package/build/routes/management/http/metrics-total.get.d.ts +1 -1
  46. package/build/routes/management/http/metrics-total.get.js +2 -2
  47. package/build/routes/management/http/metrics.get.d.ts +1 -1
  48. package/build/routes/management/http/metrics.get.js +2 -2
  49. package/build/routes/management/http/pressure.get.d.ts +1 -1
  50. package/build/routes/management/http/pressure.get.js +2 -2
  51. package/build/routes/management/http/sessions.get.d.ts +1 -1
  52. package/build/routes/management/http/sessions.get.js +2 -2
  53. package/build/routes/management/http/static.get.d.ts +1 -1
  54. package/build/routes/management/http/static.get.js +2 -2
  55. package/build/routes/webkit/ws/playwright.d.ts +1 -1
  56. package/build/routes/webkit/ws/playwright.js +2 -2
  57. package/build/server.d.ts +5 -5
  58. package/build/server.js +11 -11
  59. package/build/shared/browser.ws.d.ts +1 -1
  60. package/build/shared/browser.ws.js +3 -1
  61. package/build/shared/chromium.playwright.ws.d.ts +1 -1
  62. package/build/shared/chromium.playwright.ws.js +2 -2
  63. package/build/shared/chromium.ws.d.ts +1 -1
  64. package/build/shared/chromium.ws.js +3 -1
  65. package/build/shared/content.http.d.ts +1 -1
  66. package/build/shared/content.http.js +2 -2
  67. package/build/shared/download.http.d.ts +1 -1
  68. package/build/shared/download.http.js +60 -58
  69. package/build/shared/function.http.d.ts +1 -1
  70. package/build/shared/function.http.js +2 -2
  71. package/build/shared/json-list.http.d.ts +1 -1
  72. package/build/shared/json-list.http.js +2 -2
  73. package/build/shared/json-new.http.d.ts +1 -1
  74. package/build/shared/json-new.http.js +2 -2
  75. package/build/shared/json-protocol.http.d.ts +1 -1
  76. package/build/shared/json-protocol.http.js +2 -2
  77. package/build/shared/json-version.http.d.ts +1 -1
  78. package/build/shared/json-version.http.js +2 -2
  79. package/build/shared/page.ws.d.ts +1 -1
  80. package/build/shared/page.ws.js +3 -1
  81. package/build/shared/pdf.http.d.ts +1 -1
  82. package/build/shared/pdf.http.js +2 -2
  83. package/build/shared/performance.http.d.ts +1 -1
  84. package/build/shared/performance.http.js +2 -2
  85. package/build/shared/scrape.http.d.ts +1 -1
  86. package/build/shared/scrape.http.js +2 -2
  87. package/build/shared/screenshot.http.d.ts +1 -1
  88. package/build/shared/screenshot.http.js +2 -2
  89. package/build/shared/utils/function/client.d.ts +1 -1
  90. package/build/shared/utils/function/client.js +3 -1
  91. package/build/shim.d.ts +1 -1
  92. package/build/shim.js +2 -2
  93. package/build/token.d.ts +3 -3
  94. package/build/token.js +6 -6
  95. package/build/types.d.ts +4 -4
  96. package/build/webhooks.d.ts +2 -2
  97. package/build/webhooks.js +4 -4
  98. package/package.json +3 -3
  99. package/src/browserless.ts +6 -6
  100. package/src/browsers/chromium.cdp.ts +33 -23
  101. package/src/browsers/chromium.playwright.ts +28 -21
  102. package/src/browsers/firefox.playwright.ts +28 -21
  103. package/src/browsers/index.ts +32 -29
  104. package/src/browsers/webkit.playwright.ts +29 -22
  105. package/src/config.ts +166 -104
  106. package/src/file-system.ts +9 -9
  107. package/src/hooks.ts +4 -4
  108. package/src/limiter.ts +12 -12
  109. package/src/logger.ts +12 -12
  110. package/src/metrics.ts +23 -23
  111. package/src/monitoring.ts +9 -9
  112. package/src/router.ts +31 -31
  113. package/src/routes/firefox/ws/playwright.ts +3 -3
  114. package/src/routes/management/http/active.get.ts +3 -2
  115. package/src/routes/management/http/config.get.ts +2 -2
  116. package/src/routes/management/http/metrics-total.get.ts +2 -2
  117. package/src/routes/management/http/metrics.get.ts +2 -2
  118. package/src/routes/management/http/pressure.get.ts +2 -2
  119. package/src/routes/management/http/sessions.get.ts +2 -2
  120. package/src/routes/management/http/static.get.ts +3 -3
  121. package/src/routes/webkit/ws/playwright.ts +3 -3
  122. package/src/server.ts +14 -16
  123. package/src/shared/browser.ws.ts +4 -2
  124. package/src/shared/chromium.playwright.ws.ts +3 -3
  125. package/src/shared/chromium.ws.ts +4 -2
  126. package/src/shared/content.http.ts +3 -3
  127. package/src/shared/download.http.ts +4 -3
  128. package/src/shared/function.http.ts +3 -3
  129. package/src/shared/json-list.http.ts +2 -2
  130. package/src/shared/json-new.http.ts +2 -2
  131. package/src/shared/json-protocol.http.ts +2 -6
  132. package/src/shared/json-version.http.ts +2 -6
  133. package/src/shared/page.ws.ts +4 -2
  134. package/src/shared/pdf.http.ts +3 -3
  135. package/src/shared/performance.http.ts +3 -3
  136. package/src/shared/scrape.http.ts +3 -3
  137. package/src/shared/screenshot.http.ts +3 -3
  138. package/src/shared/utils/function/client.ts +3 -1
  139. package/src/shim.ts +2 -2
  140. package/src/token.ts +7 -7
  141. package/src/types.ts +7 -7
  142. package/src/webhooks.ts +4 -4
  143. package/static/docs/swagger.json +2 -2
  144. package/static/docs/swagger.min.json +1 -1
  145. package/static/function/client.js +3 -1
  146. package/static/function/index.html +3 -1
@@ -21,67 +21,69 @@ export default class ChromiumDownloadPostRoute extends BrowserHTTPRoute {
21
21
  method = Methods.post;
22
22
  path = [HTTPRoutes.download, HTTPRoutes.chromiumDownload];
23
23
  tags = [APITags.browserAPI];
24
- handler = async (req, res, logger, browser) => new Promise(async (resolve, reject) => {
25
- const config = this.config();
26
- const downloadPath = path.join(await config.getDownloadsDir(), `.browserless.download.${id()}`);
27
- logger.info(`Generating a download directory at "${downloadPath}"`);
28
- await mkdir(downloadPath);
29
- const handler = functionHandler(config, logger, { downloadPath });
30
- const response = await handler(req, browser).catch((e) => {
31
- logger.error(`Error running download code handler: "${e}"`);
32
- reject(e);
33
- return null;
34
- });
35
- if (!response) {
36
- return;
37
- }
38
- const { page } = response;
39
- logger.info(`Download function has returned, finding downloads...`);
40
- async function checkIfDownloadComplete() {
41
- if (res.headersSent) {
42
- logger.trace(`Request headers have been sent, terminating download watch.`);
24
+ async handler(req, res, logger, browser) {
25
+ return new Promise(async (resolve, reject) => {
26
+ const config = this.config();
27
+ const downloadPath = path.join(await config.getDownloadsDir(), `.browserless.download.${id()}`);
28
+ logger.info(`Generating a download directory at "${downloadPath}"`);
29
+ await mkdir(downloadPath);
30
+ const handler = functionHandler(config, logger, { downloadPath });
31
+ const response = await handler(req, browser).catch((e) => {
32
+ logger.error(`Error running download code handler: "${e}"`);
33
+ reject(e);
43
34
  return null;
35
+ });
36
+ if (!response) {
37
+ return;
44
38
  }
45
- const [fileName] = await readdir(downloadPath);
46
- if (!fileName || fileName.endsWith('.crdownload')) {
47
- await sleep(500);
48
- return checkIfDownloadComplete();
39
+ const { page } = response;
40
+ logger.info(`Download function has returned, finding downloads...`);
41
+ async function checkIfDownloadComplete() {
42
+ if (res.headersSent) {
43
+ logger.trace(`Request headers have been sent, terminating download watch.`);
44
+ return null;
45
+ }
46
+ const [fileName] = await readdir(downloadPath);
47
+ if (!fileName || fileName.endsWith('.crdownload')) {
48
+ await sleep(500);
49
+ return checkIfDownloadComplete();
50
+ }
51
+ logger.info(`All files have finished downloading`);
52
+ return path.join(downloadPath, fileName);
49
53
  }
50
- logger.info(`All files have finished downloading`);
51
- return path.join(downloadPath, fileName);
52
- }
53
- const filePath = await checkIfDownloadComplete();
54
- logger.info(`Closing pages.`);
55
- page.close();
56
- page.removeAllListeners();
57
- const rmDownload = once(() => filePath &&
58
- deleteAsync(filePath, { force: true })
59
- .then(() => {
60
- logger.info(`Successfully deleted downloads from disk at "${filePath}"`);
61
- })
62
- .catch((err) => {
63
- logger.error(`Error cleaning up downloaded files: "${err}" at "${filePath}"`);
64
- }));
65
- if (res.headersSent || !filePath) {
66
- rmDownload();
67
- return;
68
- }
69
- const contentType = mimeTypes.get(path.extname(filePath));
70
- if (contentType) {
71
- res.setHeader('Content-Type', contentType);
72
- }
73
- return createReadStream(filePath)
74
- .on('error', (error) => {
75
- if (error) {
54
+ const filePath = await checkIfDownloadComplete();
55
+ logger.info(`Closing pages.`);
56
+ page.close();
57
+ page.removeAllListeners();
58
+ const rmDownload = once(() => filePath &&
59
+ deleteAsync(filePath, { force: true })
60
+ .then(() => {
61
+ logger.info(`Successfully deleted downloads from disk at "${filePath}"`);
62
+ })
63
+ .catch((err) => {
64
+ logger.error(`Error cleaning up downloaded files: "${err}" at "${filePath}"`);
65
+ }));
66
+ if (res.headersSent || !filePath) {
76
67
  rmDownload();
77
- return reject(new NotFound(`Couldn't locate or send downloads in "${downloadPath}"`));
68
+ return;
78
69
  }
79
- })
80
- .on('end', () => {
81
- logger.info(`Downloads successfully sent`);
82
- rmDownload();
83
- return resolve();
84
- })
85
- .pipe(res);
86
- });
70
+ const contentType = mimeTypes.get(path.extname(filePath));
71
+ if (contentType) {
72
+ res.setHeader('Content-Type', contentType);
73
+ }
74
+ return createReadStream(filePath)
75
+ .on('error', (error) => {
76
+ if (error) {
77
+ rmDownload();
78
+ return reject(new NotFound(`Couldn't locate or send downloads in "${downloadPath}"`));
79
+ }
80
+ })
81
+ .on('end', () => {
82
+ logger.info(`Downloads successfully sent`);
83
+ rmDownload();
84
+ return resolve();
85
+ })
86
+ .pipe(res);
87
+ });
88
+ }
87
89
  }
@@ -27,6 +27,6 @@ export default class ChromiumFunctionPostRoute extends BrowserHTTPRoute {
27
27
  method: Methods;
28
28
  path: HTTPRoutes[];
29
29
  tags: APITags[];
30
- handler: (req: Request, res: ServerResponse, logger: Logger, browser: BrowserInstance) => Promise<void>;
30
+ handler(req: Request, res: ServerResponse, logger: Logger, browser: BrowserInstance): Promise<void>;
31
31
  }
32
32
  export {};
@@ -18,7 +18,7 @@ export default class ChromiumFunctionPostRoute extends BrowserHTTPRoute {
18
18
  method = Methods.post;
19
19
  path = [HTTPRoutes.function, HTTPRoutes.chromiumFunction];
20
20
  tags = [APITags.browserAPI];
21
- handler = async (req, res, logger, browser) => {
21
+ async handler(req, res, logger, browser) {
22
22
  const config = this.config();
23
23
  const handler = functionHandler(config, logger);
24
24
  const { contentType, payload, page } = await handler(req, browser);
@@ -44,5 +44,5 @@ export default class ChromiumFunctionPostRoute extends BrowserHTTPRoute {
44
44
  writeResponse(res, 200, payload, contentType);
45
45
  }
46
46
  return;
47
- };
47
+ }
48
48
  }
@@ -11,5 +11,5 @@ export default class ChromiumJSONListGetRoute extends HTTPRoute {
11
11
  method: Methods;
12
12
  path: HTTPRoutes;
13
13
  tags: APITags[];
14
- handler: (_req: Request, res: Response) => Promise<void>;
14
+ handler(_req: Request, res: Response): Promise<void>;
15
15
  }
@@ -14,8 +14,8 @@ export default class ChromiumJSONListGetRoute extends HTTPRoute {
14
14
  method = Methods.get;
15
15
  path = HTTPRoutes.jsonList;
16
16
  tags = [APITags.browserAPI];
17
- handler = async (_req, res) => {
17
+ async handler(_req, res) {
18
18
  const browserManage = this.browserManager();
19
19
  return jsonResponse(res, 200, await browserManage.getJSONList());
20
- };
20
+ }
21
21
  }
@@ -11,5 +11,5 @@ export default class ChromiumJSONNewPutRoute extends HTTPRoute {
11
11
  method: Methods;
12
12
  path: HTTPRoutes;
13
13
  tags: APITags[];
14
- handler: (_req: Request, res: Response) => Promise<void>;
14
+ handler(_req: Request, res: Response): Promise<void>;
15
15
  }
@@ -15,7 +15,7 @@ export default class ChromiumJSONNewPutRoute extends HTTPRoute {
15
15
  method = Methods.put;
16
16
  path = HTTPRoutes.jsonNew;
17
17
  tags = [APITags.browserAPI];
18
- handler = async (_req, res) => {
18
+ async handler(_req, res) {
19
19
  const config = this.config();
20
20
  const externalAddress = config.getExternalWebSocketAddress();
21
21
  const id = pageID();
@@ -31,5 +31,5 @@ export default class ChromiumJSONNewPutRoute extends HTTPRoute {
31
31
  url: 'about:blank',
32
32
  webSocketDebuggerUrl: href,
33
33
  });
34
- };
34
+ }
35
35
  }
@@ -12,5 +12,5 @@ export default class ChromiumJSONProtocolGetRoute extends HTTPRoute {
12
12
  method: Methods;
13
13
  path: HTTPRoutes;
14
14
  tags: APITags[];
15
- handler: (_req: Request, res: Response, logger: Logger) => Promise<void>;
15
+ handler(_req: Request, res: Response, logger: Logger): Promise<void>;
16
16
  }
@@ -11,11 +11,11 @@ export default class ChromiumJSONProtocolGetRoute extends HTTPRoute {
11
11
  method = Methods.get;
12
12
  path = HTTPRoutes.jsonProtocol;
13
13
  tags = [APITags.browserAPI];
14
- handler = async (_req, res, logger) => {
14
+ async handler(_req, res, logger) {
15
15
  const browserManager = this.browserManager();
16
16
  if (!this.cachedProtocol) {
17
17
  this.cachedProtocol = await browserManager.getProtocolJSON(logger);
18
18
  }
19
19
  return jsonResponse(res, 200, this.cachedProtocol);
20
- };
20
+ }
21
21
  }
@@ -12,5 +12,5 @@ export default class ChromiumJSONVersionGetRoute extends HTTPRoute {
12
12
  method: Methods;
13
13
  path: HTTPRoutes;
14
14
  tags: APITags[];
15
- handler: (req: Request, res: Response, logger: Logger) => Promise<void>;
15
+ handler(req: Request, res: Response, logger: Logger): Promise<void>;
16
16
  }
@@ -11,7 +11,7 @@ export default class ChromiumJSONVersionGetRoute extends HTTPRoute {
11
11
  method = Methods.get;
12
12
  path = HTTPRoutes.jsonVersion;
13
13
  tags = [APITags.browserAPI];
14
- handler = async (req, res, logger) => {
14
+ async handler(req, res, logger) {
15
15
  const baseUrl = req.parsed.host;
16
16
  const protocol = req.parsed.protocol.includes('s') ? 'wss' : 'ws';
17
17
  try {
@@ -27,5 +27,5 @@ export default class ChromiumJSONVersionGetRoute extends HTTPRoute {
27
27
  catch (err) {
28
28
  return writeResponse(res, 500, 'There was an error handling your request', contentTypes.text);
29
29
  }
30
- };
30
+ }
31
31
  }
@@ -13,5 +13,5 @@ export default class ChromiumPageWebSocketRoute extends BrowserWebsocketRoute {
13
13
  description: string;
14
14
  path: WebsocketRoutes;
15
15
  tags: APITags[];
16
- handler: (req: Request, socket: Duplex, head: Buffer, _logger: Logger, browser: ChromiumCDP) => Promise<void>;
16
+ handler(req: Request, socket: Duplex, head: Buffer, _logger: Logger, browser: ChromiumCDP): Promise<void>;
17
17
  }
@@ -10,5 +10,7 @@ export default class ChromiumPageWebSocketRoute extends BrowserWebsocketRoute {
10
10
  or by finding the page's unique ID from your library of choice.`);
11
11
  path = WebsocketRoutes.page;
12
12
  tags = [APITags.browserWS];
13
- handler = async (req, socket, head, _logger, browser) => browser.proxyPageWebSocket(req, socket, head);
13
+ async handler(req, socket, head, _logger, browser) {
14
+ return browser.proxyPageWebSocket(req, socket, head);
15
+ }
14
16
  }
@@ -43,5 +43,5 @@ export default class ChromiumPDFPostRoute extends BrowserHTTPRoute {
43
43
  method: Methods;
44
44
  path: HTTPRoutes[];
45
45
  tags: APITags[];
46
- handler: (req: Request, res: ServerResponse, logger: Logger, browser: BrowserInstance) => Promise<void>;
46
+ handler(req: Request, res: ServerResponse, logger: Logger, browser: BrowserInstance): Promise<void>;
47
47
  }
@@ -16,7 +16,7 @@ export default class ChromiumPDFPostRoute extends BrowserHTTPRoute {
16
16
  method = Methods.post;
17
17
  path = [HTTPRoutes.pdf, HTTPRoutes.chromiumPdf];
18
18
  tags = [APITags.browserAPI];
19
- handler = async (req, res, logger, browser) => {
19
+ async handler(req, res, logger, browser) {
20
20
  logger.info('PDF API invoked with body:', req.body);
21
21
  const contentType = !req.headers.accept || req.headers.accept?.includes('*')
22
22
  ? 'application/pdf'
@@ -114,5 +114,5 @@ export default class ChromiumPDFPostRoute extends BrowserHTTPRoute {
114
114
  await new Promise((r) => readStream.pipe(res).once('close', r));
115
115
  page.close().catch(noop);
116
116
  logger.info('PDF API request completed');
117
- };
117
+ }
118
118
  }
@@ -26,5 +26,5 @@ export default class PerformancePost extends BrowserHTTPRoute {
26
26
  method: Methods;
27
27
  path: HTTPRoutes[];
28
28
  tags: APITags[];
29
- handler: (req: Request, res: ServerResponse, _logger: Logger, browser: BrowserInstance) => Promise<void>;
29
+ handler(req: Request, res: ServerResponse, _logger: Logger, browser: BrowserInstance): Promise<void>;
30
30
  }
@@ -11,7 +11,7 @@ export default class PerformancePost extends BrowserHTTPRoute {
11
11
  method = Methods.post;
12
12
  path = [HTTPRoutes.performance, HTTPRoutes.chromiumPerformance];
13
13
  tags = [APITags.browserAPI];
14
- handler = async (req, res, _logger, browser) => {
14
+ async handler(req, res, _logger, browser) {
15
15
  const config = this.config();
16
16
  const response = await main({
17
17
  browser,
@@ -20,5 +20,5 @@ export default class PerformancePost extends BrowserHTTPRoute {
20
20
  timeout: config.getTimeout(),
21
21
  });
22
22
  return jsonResponse(res, 200, response);
23
- };
23
+ }
24
24
  }
@@ -115,5 +115,5 @@ export default class ChromiumScrapePostRoute extends BrowserHTTPRoute {
115
115
  method: Methods;
116
116
  path: HTTPRoutes[];
117
117
  tags: APITags[];
118
- handler: (req: Request, res: ServerResponse, logger: Logger, browser: BrowserInstance) => Promise<void>;
118
+ handler(req: Request, res: ServerResponse, logger: Logger, browser: BrowserInstance): Promise<void>;
119
119
  }
@@ -54,7 +54,7 @@ export default class ChromiumScrapePostRoute extends BrowserHTTPRoute {
54
54
  method = Methods.post;
55
55
  path = [HTTPRoutes.scrape, HTTPRoutes.chromiumScrape];
56
56
  tags = [APITags.browserAPI];
57
- handler = async (req, res, logger, browser) => {
57
+ async handler(req, res, logger, browser) {
58
58
  logger.info('Scrape API invoked with body:', req.body);
59
59
  const contentType = !req.headers.accept || req.headers.accept?.includes('*')
60
60
  ? contentTypes.html
@@ -202,5 +202,5 @@ export default class ChromiumScrapePostRoute extends BrowserHTTPRoute {
202
202
  page.close().catch(noop);
203
203
  logger.info('Scrape API request completed');
204
204
  return jsonResponse(res, 200, response, false);
205
- };
205
+ }
206
206
  }
@@ -46,5 +46,5 @@ export default class ScreenshotPost extends BrowserHTTPRoute {
46
46
  method: Methods;
47
47
  path: HTTPRoutes[];
48
48
  tags: APITags[];
49
- handler: (req: Request, res: ServerResponse, logger: Logger, browser: BrowserInstance) => Promise<void>;
49
+ handler(req: Request, res: ServerResponse, logger: Logger, browser: BrowserInstance): Promise<void>;
50
50
  }
@@ -15,7 +15,7 @@ export default class ScreenshotPost extends BrowserHTTPRoute {
15
15
  method = Methods.post;
16
16
  path = [HTTPRoutes.screenshot, HTTPRoutes.chromiumScreenshot];
17
17
  tags = [APITags.browserAPI];
18
- handler = async (req, res, logger, browser) => {
18
+ async handler(req, res, logger, browser) {
19
19
  logger.info('Screenshot API invoked with body:', req.body);
20
20
  const contentType = !req.headers.accept || req.headers.accept?.includes('*')
21
21
  ? 'image/png'
@@ -125,5 +125,5 @@ export default class ScreenshotPost extends BrowserHTTPRoute {
125
125
  await new Promise((r) => readStream.pipe(res).once('close', r));
126
126
  page.close().catch(noop);
127
127
  logger.info('Screenshot API request completed');
128
- };
128
+ }
129
129
  }
@@ -6,7 +6,7 @@ type codeHandler = (params: {
6
6
  export declare class FunctionRunner {
7
7
  protected browser?: Browser;
8
8
  protected page?: Page;
9
- log: () => {
9
+ log(): {
10
10
  (...data: any[]): void;
11
11
  (message?: any, ...optionalParams: any[]): void;
12
12
  };
@@ -3,7 +3,9 @@ import { _connectToCdpBrowser as connect } from 'puppeteer-core/lib/esm/puppetee
3
3
  export class FunctionRunner {
4
4
  browser;
5
5
  page;
6
- log = () => console.log.bind(console);
6
+ log() {
7
+ return console.log.bind(console);
8
+ }
7
9
  async start(data) {
8
10
  console.log(`/function.js: Got endpoint: "${data.browserWSEndpoint}"`);
9
11
  const { browserWSEndpoint, code, context, options } = data;
package/build/shim.d.ts CHANGED
@@ -6,4 +6,4 @@
6
6
  *
7
7
  * @param req A parsed user requests
8
8
  */
9
- export declare const shimLegacyRequests: (url: URL) => URL;
9
+ export declare function shimLegacyRequests(url: URL): URL;
package/build/shim.js CHANGED
@@ -8,7 +8,7 @@ const shimParam = ['headless', 'stealth', 'ignoreDefaultArgs', 'slowMo'];
8
8
  *
9
9
  * @param req A parsed user requests
10
10
  */
11
- export const shimLegacyRequests = (url) => {
11
+ export function shimLegacyRequests(url) {
12
12
  const { searchParams } = url;
13
13
  const params = [...searchParams];
14
14
  const names = params.map(([k]) => k);
@@ -52,4 +52,4 @@ export const shimLegacyRequests = (url) => {
52
52
  searchParams.set('launch', JSON.stringify(launchParams));
53
53
  }
54
54
  return url;
55
- };
55
+ }
package/build/token.d.ts CHANGED
@@ -4,14 +4,14 @@ import { EventEmitter } from 'events';
4
4
  export declare class Token extends EventEmitter {
5
5
  protected config: Config;
6
6
  constructor(config: Config);
7
- isAuthorized: (req: Request, route: BrowserHTTPRoute | BrowserWebsocketRoute | HTTPRoute | WebSocketRoute) => Promise<boolean>;
7
+ isAuthorized(req: Request, route: BrowserHTTPRoute | BrowserWebsocketRoute | HTTPRoute | WebSocketRoute): Promise<boolean>;
8
8
  /**
9
9
  * Implement any browserless-core-specific shutdown logic here.
10
10
  * Calls the empty-SDK stop method for downstream implementations.
11
11
  */
12
- shutdown: () => Promise<void>;
12
+ shutdown(): Promise<void>;
13
13
  /**
14
14
  * Left blank for downstream SDK modules to optionally implement.
15
15
  */
16
- stop: () => void;
16
+ stop(): void;
17
17
  }
package/build/token.js CHANGED
@@ -6,7 +6,7 @@ export class Token extends EventEmitter {
6
6
  super();
7
7
  this.config = config;
8
8
  }
9
- isAuthorized = async (req, route) => {
9
+ async isAuthorized(req, route) {
10
10
  const token = this.config.getToken();
11
11
  if (token === null) {
12
12
  return true;
@@ -19,16 +19,16 @@ export class Token extends EventEmitter {
19
19
  return false;
20
20
  }
21
21
  return (Array.isArray(token) ? token : [token]).includes(requestToken);
22
- };
22
+ }
23
23
  /**
24
24
  * Implement any browserless-core-specific shutdown logic here.
25
25
  * Calls the empty-SDK stop method for downstream implementations.
26
26
  */
27
- shutdown = async () => {
28
- await this.stop();
29
- };
27
+ async shutdown() {
28
+ return await this.stop();
29
+ }
30
30
  /**
31
31
  * Left blank for downstream SDK modules to optionally implement.
32
32
  */
33
- stop = () => { };
33
+ stop() { }
34
34
  }
package/build/types.d.ts CHANGED
@@ -182,7 +182,7 @@ export declare abstract class HTTPRoute extends BasicHTTPRoute {
182
182
  /**
183
183
  * Handles an inbound HTTP request, and supplies the Request and Response objects from node's HTTP request event
184
184
  */
185
- abstract handler: (req: Request, res: http.ServerResponse, logger: Logger) => Promise<unknown>;
185
+ abstract handler(req: Request, res: http.ServerResponse, logger: Logger): Promise<unknown>;
186
186
  }
187
187
  /**
188
188
  * A HTTP-based route, with a handler, that can fulfill requests but
@@ -196,7 +196,7 @@ export declare abstract class BrowserHTTPRoute extends BasicHTTPRoute {
196
196
  * Handles an inbound HTTP request with a 3rd param of the predefined
197
197
  * browser used for the route -- only Chrome CDP is support currently.
198
198
  */
199
- abstract handler: (req: Request, res: http.ServerResponse, logger: Logger, browser: BrowserInstance) => Promise<unknown>;
199
+ abstract handler(req: Request, res: http.ServerResponse, logger: Logger, browser: BrowserInstance): Promise<unknown>;
200
200
  /**
201
201
  * An optional function to automatically set up or handle new page
202
202
  * creation. Useful for injecting behaviors or other functionality.
@@ -212,7 +212,7 @@ export declare abstract class WebSocketRoute extends Route {
212
212
  /**
213
213
  * Handles an inbound Websocket request, and handles the connection
214
214
  */
215
- abstract handler: (req: Request, socket: stream.Duplex, head: Buffer, logger: Logger) => Promise<unknown>;
215
+ abstract handler(req: Request, socket: stream.Duplex, head: Buffer, logger: Logger): Promise<unknown>;
216
216
  }
217
217
  /**
218
218
  * A WebSocket-based route, with a handler, that can fulfill requests
@@ -279,7 +279,7 @@ export interface BrowserlessSession {
279
279
  isTempDataDir: boolean;
280
280
  launchOptions: CDPLaunchOptions | BrowserServerOptions;
281
281
  numbConnected: number;
282
- resolver: (val: unknown) => void;
282
+ resolver(val: unknown): void;
283
283
  routePath: string | string[];
284
284
  startedOn: number;
285
285
  ttl: number;
@@ -14,9 +14,9 @@ export declare class WebHooks extends EventEmitter {
14
14
  * Implement any browserless-core-specific shutdown logic here.
15
15
  * Calls the empty-SDK stop method for downstream implementations.
16
16
  */
17
- shutdown: () => Promise<void>;
17
+ shutdown(): Promise<void>;
18
18
  /**
19
19
  * Left blank for downstream SDK modules to optionally implement.
20
20
  */
21
- stop: () => void;
21
+ stop(): void;
22
22
  }
package/build/webhooks.js CHANGED
@@ -46,11 +46,11 @@ export class WebHooks extends EventEmitter {
46
46
  * Implement any browserless-core-specific shutdown logic here.
47
47
  * Calls the empty-SDK stop method for downstream implementations.
48
48
  */
49
- shutdown = async () => {
50
- await this.stop();
51
- };
49
+ async shutdown() {
50
+ return await this.stop();
51
+ }
52
52
  /**
53
53
  * Left blank for downstream SDK modules to optionally implement.
54
54
  */
55
- stop = () => { };
55
+ stop() { }
56
56
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@browserless.io/browserless",
3
- "version": "2.12.0-beta-4",
3
+ "version": "2.12.0",
4
4
  "license": "SSPL",
5
5
  "description": "The browserless platform",
6
6
  "author": "browserless.io",
@@ -57,7 +57,7 @@
57
57
  "gradient-string": "^2.0.0",
58
58
  "http-proxy": "^1.18.1",
59
59
  "lighthouse": "^12.0.0",
60
- "micromatch": "^4.0.4",
60
+ "micromatch": "^4.0.7",
61
61
  "playwright-1.40": "npm:playwright-core@1.40.1",
62
62
  "playwright-1.41": "npm:playwright-core@1.41.2",
63
63
  "playwright-1.42": "npm:playwright-core@1.42.1",
@@ -79,7 +79,7 @@
79
79
  "@types/mocha": "^10.0.6",
80
80
  "@types/node": "^20.12.12",
81
81
  "@types/sinon": "^17.0.3",
82
- "@typescript-eslint/eslint-plugin": "^7.9.0",
82
+ "@typescript-eslint/eslint-plugin": "^7.10.0",
83
83
  "@typescript-eslint/parser": "^7.10.0",
84
84
  "assert": "^2.0.0",
85
85
  "chai": "^5.1.1",
@@ -119,15 +119,15 @@ export class Browserless extends EventEmitter {
119
119
  new Router(this.config, this.browserManager, this.limiter, this.Logger);
120
120
  }
121
121
 
122
- protected loadPwVersions = async (): Promise<void> => {
122
+ protected async loadPwVersions(): Promise<void> {
123
123
  const { playwrightVersions } = JSON.parse(
124
124
  (await fs.readFile('package.json')).toString(),
125
125
  );
126
126
 
127
127
  this.config.setPwVersions(playwrightVersions);
128
- };
128
+ }
129
129
 
130
- protected saveMetrics = async (): Promise<void> => {
130
+ protected async saveMetrics(): Promise<void> {
131
131
  const metricsPath = this.config.getMetricsJSONPath();
132
132
  const { cpu, memory } = await this.monitoring.getMachineStats();
133
133
  const metrics = await this.metrics.get();
@@ -163,9 +163,9 @@ export class Browserless extends EventEmitter {
163
163
  false,
164
164
  );
165
165
  }
166
- };
166
+ }
167
167
 
168
- public setMetricsSaveInterval = (interval: number) => {
168
+ public setMetricsSaveInterval(interval: number) {
169
169
  if (interval <= 0) {
170
170
  return console.warn(
171
171
  `Interval value of "${interval}" must be greater than 1. Ignoring`,
@@ -178,7 +178,7 @@ export class Browserless extends EventEmitter {
178
178
  this.saveMetrics,
179
179
  this.metricsSaveInterval,
180
180
  );
181
- };
181
+ }
182
182
 
183
183
  protected routeIsDisabled(route: routeInstances) {
184
184
  return this.disabledRouteNames.some((name) => name === route.name);