@browserless.io/browserless 2.8.0 → 2.10.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 (115) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/README.md +41 -3
  3. package/assets/debugger.png +0 -0
  4. package/bin/scaffold/src/hello-world.http.ts +3 -2
  5. package/build/browserless.d.ts +5 -4
  6. package/build/browserless.js +19 -13
  7. package/build/browsers/chrome.cdp.d.ts +2 -2
  8. package/build/browsers/chrome.cdp.js +2 -2
  9. package/build/browsers/chrome.playwright.d.ts +2 -2
  10. package/build/browsers/chrome.playwright.js +2 -2
  11. package/build/browsers/chromium.cdp.d.ts +4 -4
  12. package/build/browsers/chromium.cdp.js +49 -32
  13. package/build/browsers/chromium.playwright.d.ts +4 -4
  14. package/build/browsers/chromium.playwright.js +14 -13
  15. package/build/browsers/firefox.playwright.d.ts +4 -4
  16. package/build/browsers/firefox.playwright.js +14 -13
  17. package/build/browsers/index.d.ts +24 -8
  18. package/build/browsers/index.js +20 -15
  19. package/build/browsers/webkit.playwright.d.ts +4 -4
  20. package/build/browsers/webkit.playwright.js +14 -13
  21. package/build/config.d.ts +3 -0
  22. package/build/config.js +3 -0
  23. package/build/file-system.d.ts +2 -3
  24. package/build/file-system.js +2 -2
  25. package/build/http.d.ts +1 -0
  26. package/build/http.js +1 -0
  27. package/build/index.js +7 -7
  28. package/build/limiter.d.ts +2 -3
  29. package/build/limiter.js +11 -11
  30. package/build/logger.d.ts +16 -9
  31. package/build/logger.js +32 -16
  32. package/build/monitoring.d.ts +2 -3
  33. package/build/monitoring.js +4 -4
  34. package/build/router.d.ts +1 -3
  35. package/build/router.js +21 -22
  36. package/build/routes/chrome/http/content.post.body.json +8 -8
  37. package/build/routes/chrome/http/pdf.post.body.json +8 -8
  38. package/build/routes/chrome/http/scrape.post.body.json +8 -8
  39. package/build/routes/chrome/http/screenshot.post.body.json +8 -8
  40. package/build/routes/chromium/http/content.post.body.json +8 -8
  41. package/build/routes/chromium/http/pdf.post.body.json +8 -8
  42. package/build/routes/chromium/http/scrape.post.body.json +8 -8
  43. package/build/routes/chromium/http/screenshot.post.body.json +8 -8
  44. package/build/routes/management/http/pressure.get.d.ts +63 -0
  45. package/build/routes/management/http/pressure.get.js +56 -0
  46. package/build/routes/management/http/pressure.get.response.json +76 -0
  47. package/build/routes/management/http/static.get.js +3 -3
  48. package/build/routes/management/tests/management.spec.js +16 -0
  49. package/build/server.d.ts +1 -3
  50. package/build/server.js +33 -30
  51. package/build/shared/content.http.d.ts +1 -1
  52. package/build/shared/content.http.js +4 -1
  53. package/build/shared/download.http.js +9 -9
  54. package/build/shared/function.http.js +2 -2
  55. package/build/shared/json-protocol.http.d.ts +3 -3
  56. package/build/shared/json-protocol.http.js +2 -2
  57. package/build/shared/json-version.http.d.ts +3 -3
  58. package/build/shared/json-version.http.js +2 -2
  59. package/build/shared/pdf.http.d.ts +1 -1
  60. package/build/shared/pdf.http.js +6 -4
  61. package/build/shared/performance.http.js +1 -0
  62. package/build/shared/scrape.http.d.ts +1 -1
  63. package/build/shared/scrape.http.js +4 -1
  64. package/build/shared/screenshot.http.d.ts +1 -1
  65. package/build/shared/screenshot.http.js +4 -1
  66. package/build/shared/utils/function/handler.js +7 -7
  67. package/build/shared/utils/performance/child.js +4 -4
  68. package/build/shared/utils/performance/main.d.ts +1 -1
  69. package/build/shared/utils/performance/main.js +5 -7
  70. package/build/shared/utils/performance/types.d.ts +2 -1
  71. package/build/types.d.ts +10 -1
  72. package/build/types.js +10 -1
  73. package/build/utils.d.ts +1 -1
  74. package/build/utils.js +6 -2
  75. package/package.json +18 -15
  76. package/scripts/install-debugger.js +55 -15
  77. package/src/browserless.ts +25 -12
  78. package/src/browsers/chrome.cdp.ts +2 -5
  79. package/src/browsers/chrome.playwright.ts +2 -5
  80. package/src/browsers/chromium.cdp.ts +84 -35
  81. package/src/browsers/chromium.playwright.ts +26 -13
  82. package/src/browsers/firefox.playwright.ts +28 -13
  83. package/src/browsers/index.ts +24 -16
  84. package/src/browsers/webkit.playwright.ts +28 -13
  85. package/src/config.ts +4 -0
  86. package/src/file-system.ts +2 -7
  87. package/src/http.ts +1 -0
  88. package/src/index.ts +7 -7
  89. package/src/limiter.ts +13 -11
  90. package/src/logger.ts +39 -18
  91. package/src/monitoring.ts +6 -8
  92. package/src/router.ts +20 -20
  93. package/src/routes/management/http/pressure.get.ts +135 -0
  94. package/src/routes/management/http/static.get.ts +3 -5
  95. package/src/routes/management/tests/management.spec.ts +26 -0
  96. package/src/server.ts +43 -30
  97. package/src/shared/content.http.ts +5 -1
  98. package/src/shared/download.http.ts +9 -9
  99. package/src/shared/function.http.ts +2 -2
  100. package/src/shared/json-protocol.http.ts +8 -3
  101. package/src/shared/json-version.http.ts +8 -4
  102. package/src/shared/pdf.http.ts +6 -4
  103. package/src/shared/performance.http.ts +1 -0
  104. package/src/shared/scrape.http.ts +5 -1
  105. package/src/shared/screenshot.http.ts +4 -1
  106. package/src/shared/utils/function/handler.ts +7 -7
  107. package/src/shared/utils/performance/child.ts +4 -4
  108. package/src/shared/utils/performance/main.ts +5 -6
  109. package/src/shared/utils/performance/types.ts +2 -1
  110. package/src/types.ts +9 -0
  111. package/src/utils.ts +7 -2
  112. package/static/docs/swagger.json +138 -10
  113. package/static/docs/swagger.min.json +137 -9
  114. package/static/function/client.js +4290 -5542
  115. package/static/function/index.html +4290 -5542
@@ -72,11 +72,11 @@ export default class ChromiumDownloadPostRoute extends BrowserHTTPRoute {
72
72
  `.browserless.download.${id()}`,
73
73
  );
74
74
 
75
- logger.log(`Generating a download directory at "${downloadPath}"`);
75
+ logger.info(`Generating a download directory at "${downloadPath}"`);
76
76
  await mkdir(downloadPath);
77
77
  const handler = functionHandler(config, logger, { downloadPath });
78
78
  const response = await handler(req, browser).catch((e) => {
79
- logger.log(`Error running download code handler: "${e}"`);
79
+ logger.error(`Error running download code handler: "${e}"`);
80
80
  reject(e);
81
81
  return null;
82
82
  });
@@ -86,10 +86,10 @@ export default class ChromiumDownloadPostRoute extends BrowserHTTPRoute {
86
86
  }
87
87
 
88
88
  const { page } = response;
89
- logger.log(`Download function has returned, finding downloads...`);
89
+ logger.info(`Download function has returned, finding downloads...`);
90
90
  async function checkIfDownloadComplete(): Promise<string | null> {
91
91
  if (res.headersSent) {
92
- logger.log(
92
+ logger.trace(
93
93
  `Request headers have been sent, terminating download watch.`,
94
94
  );
95
95
  return null;
@@ -100,13 +100,13 @@ export default class ChromiumDownloadPostRoute extends BrowserHTTPRoute {
100
100
  return checkIfDownloadComplete();
101
101
  }
102
102
 
103
- logger.log(`All files have finished downloading`);
103
+ logger.info(`All files have finished downloading`);
104
104
 
105
105
  return path.join(downloadPath, fileName);
106
106
  }
107
107
 
108
108
  const filePath = await checkIfDownloadComplete();
109
- logger.log(`Closing pages.`);
109
+ logger.info(`Closing pages.`);
110
110
  page.close();
111
111
  page.removeAllListeners();
112
112
 
@@ -115,12 +115,12 @@ export default class ChromiumDownloadPostRoute extends BrowserHTTPRoute {
115
115
  filePath &&
116
116
  deleteAsync(filePath, { force: true })
117
117
  .then(() => {
118
- logger.log(
118
+ logger.info(
119
119
  `Successfully deleted downloads from disk at "${filePath}"`,
120
120
  );
121
121
  })
122
122
  .catch((err) => {
123
- logger.log(
123
+ logger.error(
124
124
  `Error cleaning up downloaded files: "${err}" at "${filePath}"`,
125
125
  );
126
126
  }),
@@ -147,7 +147,7 @@ export default class ChromiumDownloadPostRoute extends BrowserHTTPRoute {
147
147
  }
148
148
  })
149
149
  .on('end', () => {
150
- logger.log(`Downloads successfully sent`);
150
+ logger.info(`Downloads successfully sent`);
151
151
  rmDownload();
152
152
  return resolve();
153
153
  })
@@ -65,7 +65,7 @@ export default class ChromiumFunctionPostRoute extends BrowserHTTPRoute {
65
65
  const handler = functionHandler(config, logger);
66
66
  const { contentType, payload, page } = await handler(req, browser);
67
67
 
68
- logger.log(`Got function response of "${contentType}"`);
68
+ logger.info(`Got function response of "${contentType}"`);
69
69
  page.close();
70
70
  page.removeAllListeners();
71
71
 
@@ -77,7 +77,7 @@ export default class ChromiumFunctionPostRoute extends BrowserHTTPRoute {
77
77
  if (!type) {
78
78
  throw new BadRequest(`Couldn't determine function's response type.`);
79
79
  } else {
80
- logger.log(`Sending file-type response of "${type}"`);
80
+ logger.info(`Sending file-type response of "${type}"`);
81
81
  const readStream = new Stream.PassThrough();
82
82
  readStream.end(response);
83
83
  res.setHeader('Content-Type', type);
@@ -3,6 +3,7 @@ import {
3
3
  BrowserlessRoutes,
4
4
  HTTPRoute,
5
5
  HTTPRoutes,
6
+ Logger,
6
7
  Methods,
7
8
  Request,
8
9
  Response,
@@ -13,7 +14,7 @@ import {
13
14
  export type ResponseSchema = object;
14
15
 
15
16
  export default class ChromiumJSONProtocolGetRoute extends HTTPRoute {
16
- private cachedProtocol: object | undefined;
17
+ protected cachedProtocol: object | undefined;
17
18
 
18
19
  name = BrowserlessRoutes.ChromiumJSONProtocolGetRoute;
19
20
  accepts = [contentTypes.any];
@@ -26,11 +27,15 @@ export default class ChromiumJSONProtocolGetRoute extends HTTPRoute {
26
27
  path = HTTPRoutes.jsonProtocol;
27
28
  tags = [APITags.browserAPI];
28
29
 
29
- handler = async (_req: Request, res: Response): Promise<void> => {
30
+ handler = async (
31
+ _req: Request,
32
+ res: Response,
33
+ logger: Logger,
34
+ ): Promise<void> => {
30
35
  const browserManager = this.browserManager();
31
36
 
32
37
  if (!this.cachedProtocol) {
33
- this.cachedProtocol = await browserManager.getProtocolJSON();
38
+ this.cachedProtocol = await browserManager.getProtocolJSON(logger);
34
39
  }
35
40
 
36
41
  return jsonResponse(res, 200, this.cachedProtocol);
@@ -4,6 +4,7 @@ import {
4
4
  BrowserlessRoutes,
5
5
  HTTPRoute,
6
6
  HTTPRoutes,
7
+ Logger,
7
8
  Methods,
8
9
  Request,
9
10
  Response,
@@ -18,7 +19,7 @@ export type ResponseSchema = UnwrapPromise<
18
19
  >;
19
20
 
20
21
  export default class ChromiumJSONVersionGetRoute extends HTTPRoute {
21
- private cachedJSON: ResponseSchema | undefined;
22
+ protected cachedJSON: ResponseSchema | undefined;
22
23
 
23
24
  name = BrowserlessRoutes.ChromiumJSONVersionGetRoute;
24
25
  accepts = [contentTypes.any];
@@ -30,8 +31,11 @@ export default class ChromiumJSONVersionGetRoute extends HTTPRoute {
30
31
  method = Methods.get;
31
32
  path = HTTPRoutes.jsonVersion;
32
33
  tags = [APITags.browserAPI];
33
-
34
- handler = async (req: Request, res: Response): Promise<void> => {
34
+ handler = async (
35
+ req: Request,
36
+ res: Response,
37
+ logger: Logger,
38
+ ): Promise<void> => {
35
39
  const baseUrl = req.parsed.host;
36
40
  const protocol = req.parsed.protocol.includes('s') ? 'wss' : 'ws';
37
41
 
@@ -39,7 +43,7 @@ export default class ChromiumJSONVersionGetRoute extends HTTPRoute {
39
43
  if (!this.cachedJSON) {
40
44
  const browserManager = this.browserManager();
41
45
  this.cachedJSON = {
42
- ...(await browserManager.getVersionJSON()),
46
+ ...(await browserManager.getVersionJSON(logger)),
43
47
  webSocketDebuggerUrl: `${protocol}://${baseUrl}`,
44
48
  };
45
49
  }
@@ -26,7 +26,6 @@ import {
26
26
  sleep,
27
27
  waitForEvent as waitForEvt,
28
28
  waitForFunction as waitForFn,
29
- writeResponse,
30
29
  } from '@browserless.io/browserless';
31
30
  import { Page } from 'puppeteer-core';
32
31
  import { ServerResponse } from 'http';
@@ -84,17 +83,17 @@ export default class ChromiumPDFPostRoute extends BrowserHTTPRoute {
84
83
  handler = async (
85
84
  req: Request,
86
85
  res: ServerResponse,
87
- _logger: Logger,
86
+ logger: Logger,
88
87
  browser: BrowserInstance,
89
88
  ): Promise<void> => {
89
+ logger.info('PDF API invoked with body:', req.body);
90
90
  const contentType =
91
91
  !req.headers.accept || req.headers.accept?.includes('*')
92
92
  ? 'application/pdf'
93
93
  : req.headers.accept;
94
94
 
95
95
  if (!req.body) {
96
- writeResponse(res, 400, `Couldn't parse JSON body`);
97
- return;
96
+ throw new BadRequest(`Couldn't parse JSON body`);
98
97
  }
99
98
 
100
99
  res.setHeader('Content-Type', contentType);
@@ -174,6 +173,7 @@ export default class ChromiumPDFPostRoute extends BrowserHTTPRoute {
174
173
  !!rejectRequestPattern.find((pattern) => req.url().match(pattern)) ||
175
174
  rejectResourceTypes.includes(req.resourceType())
176
175
  ) {
176
+ logger.debug(`Aborting request ${req.method()}: ${req.url()}`);
177
177
  return req.abort();
178
178
  }
179
179
  const interceptor = requestInterceptors.find((r) =>
@@ -244,5 +244,7 @@ export default class ChromiumPDFPostRoute extends BrowserHTTPRoute {
244
244
  await new Promise((r) => readStream.pipe(res).once('close', r));
245
245
 
246
246
  page.close().catch(noop);
247
+
248
+ logger.info('PDF API request completed');
247
249
  };
248
250
  }
@@ -55,6 +55,7 @@ export default class PerformancePost extends BrowserHTTPRoute {
55
55
  const response = await main({
56
56
  browser,
57
57
  context: req.body as BodySchema,
58
+ logger: _logger,
58
59
  timeout: config.getTimeout(),
59
60
  });
60
61
 
@@ -219,9 +219,10 @@ export default class ChromiumScrapePostRoute extends BrowserHTTPRoute {
219
219
  handler = async (
220
220
  req: Request,
221
221
  res: ServerResponse,
222
- _logger: Logger,
222
+ logger: Logger,
223
223
  browser: BrowserInstance,
224
224
  ) => {
225
+ logger.info('Scrape API invoked with body:', req.body);
225
226
  const contentType =
226
227
  !req.headers.accept || req.headers.accept?.includes('*')
227
228
  ? contentTypes.html
@@ -337,6 +338,7 @@ export default class ChromiumScrapePostRoute extends BrowserHTTPRoute {
337
338
  !!rejectRequestPattern.find((pattern) => req.url().match(pattern)) ||
338
339
  rejectResourceTypes.includes(req.resourceType())
339
340
  ) {
341
+ logger.debug(`Aborting request ${req.method()}: ${req.url()}`);
340
342
  return req.abort();
341
343
  }
342
344
  const interceptor = requestInterceptors.find((r) =>
@@ -435,6 +437,8 @@ export default class ChromiumScrapePostRoute extends BrowserHTTPRoute {
435
437
 
436
438
  page.close().catch(noop);
437
439
 
440
+ logger.info('Scrape API request completed');
441
+
438
442
  return jsonResponse(res, 200, response, false);
439
443
  };
440
444
  }
@@ -86,9 +86,10 @@ export default class ScreenshotPost extends BrowserHTTPRoute {
86
86
  handler = async (
87
87
  req: Request,
88
88
  res: ServerResponse,
89
- _logger: Logger,
89
+ logger: Logger,
90
90
  browser: BrowserInstance,
91
91
  ): Promise<void> => {
92
+ logger.info('Screenshot API invoked with body:', req.body);
92
93
  const contentType =
93
94
  !req.headers.accept || req.headers.accept?.includes('*')
94
95
  ? 'image/png'
@@ -181,6 +182,7 @@ export default class ScreenshotPost extends BrowserHTTPRoute {
181
182
  !!rejectRequestPattern.find((pattern) => req.url().match(pattern)) ||
182
183
  rejectResourceTypes.includes(req.resourceType())
183
184
  ) {
185
+ logger.debug(`Aborting request ${req.method()}: ${req.url()}`);
184
186
  return req.abort();
185
187
  }
186
188
  const interceptor = requestInterceptors.find((r) =>
@@ -264,5 +266,6 @@ export default class ScreenshotPost extends BrowserHTTPRoute {
264
266
  await new Promise((r) => readStream.pipe(res).once('close', r));
265
267
 
266
268
  page.close().catch(noop);
269
+ logger.info('Screenshot API request completed');
267
270
  };
268
271
  }
@@ -84,7 +84,7 @@ export default (config: Config, logger: Logger, options: HandlerOptions = {}) =>
84
84
  */
85
85
  page.on('request', async (request) => {
86
86
  const requestUrl = request.url();
87
- logger.log(`Outbound Page Request: "${requestUrl}"`);
87
+ logger.info(`Outbound Page Request: "${requestUrl}"`);
88
88
  if (requestUrl.startsWith(functionRequestPath)) {
89
89
  const filename = path.basename(requestUrl);
90
90
  if (filename === functionCodeJS) {
@@ -103,7 +103,7 @@ export default (config: Config, logger: Logger, options: HandlerOptions = {}) =>
103
103
  status: 200,
104
104
  });
105
105
  }
106
- logger.log(
106
+ logger.warn(
107
107
  `Static asset request to "${requestUrl}" couldn't be found, 404-ing`,
108
108
  );
109
109
  return request.respond({
@@ -112,18 +112,18 @@ export default (config: Config, logger: Logger, options: HandlerOptions = {}) =>
112
112
  status: 404,
113
113
  });
114
114
  }
115
- logger.log(`Request: "${requestUrl}" no responder found, continuing...`);
115
+ logger.info(`Request: "${requestUrl}" no responder found, continuing...`);
116
116
  return request.continue();
117
117
  });
118
118
 
119
119
  page.on('response', (res) => {
120
- if (res.status() !== 200) {
121
- logger.log(`Received a non-200 response for request "${res.url()}"`);
120
+ if (!res.ok()) {
121
+ logger.warn(`Received a non-200 response for request "${res.url()}"`);
122
122
  }
123
123
  });
124
124
 
125
125
  page.on('console', (event) => {
126
- logger.log(`${event.type()}: ${event.text()}`);
126
+ logger.trace(`${event.type()}: ${event.text()}`);
127
127
  });
128
128
 
129
129
  await page.goto(functionIndexHTML);
@@ -160,7 +160,7 @@ export default (config: Config, logger: Logger, options: HandlerOptions = {}) =>
160
160
  JSON.stringify(options),
161
161
  )
162
162
  .catch((e) => {
163
- logger.log(`Error running code: ${e}`);
163
+ logger.error(`Error running code: ${e}`);
164
164
  throw new BadRequest(e.message);
165
165
  });
166
166
 
@@ -1,16 +1,16 @@
1
1
  import { Message, start } from './types.js';
2
- import { createLogger } from '@browserless.io/browserless';
2
+ import { Logger } from '@browserless.io/browserless';
3
3
  import lighthouse from 'lighthouse';
4
4
 
5
- const debug = createLogger('http:performance:child');
5
+ const logger = new Logger('http:performance:child');
6
6
 
7
- debug(`Child init`);
7
+ logger.info(`Child init`);
8
8
 
9
9
  const send = (msg: Message) => process.send && process.send(msg);
10
10
 
11
11
  const start = async ({ url, config, options }: start) => {
12
12
  try {
13
- debug(`Child got payload, starting lighthouse`);
13
+ logger.info(`Child got payload, starting lighthouse`);
14
14
  const results = await lighthouse(url, options, config);
15
15
 
16
16
  send({
@@ -1,5 +1,4 @@
1
1
  import { Message, mainOptions } from './types.js';
2
- import { createLogger } from '@browserless.io/browserless';
3
2
  import { fork } from 'child_process';
4
3
  import path from 'path';
5
4
 
@@ -10,10 +9,10 @@ const DEFAULT_AUDIT_CONFIG = {
10
9
  export default async ({
11
10
  browser,
12
11
  context,
12
+ logger,
13
13
  timeout,
14
14
  }: mainOptions): Promise<unknown> => {
15
15
  return new Promise((resolve, reject) => {
16
- const debug = createLogger('http:performance:main');
17
16
  const childPath = path.join(
18
17
  './',
19
18
  'build',
@@ -23,7 +22,7 @@ export default async ({
23
22
  'child.js',
24
23
  );
25
24
 
26
- debug(`Starting up child at ${childPath}`);
25
+ logger.trace(`Starting up child at ${childPath}`);
27
26
 
28
27
  const child = fork(childPath);
29
28
  const port = new URL(browser.wsEndpoint() || '').port;
@@ -54,14 +53,14 @@ export default async ({
54
53
  };
55
54
 
56
55
  child.on('error', (err) => {
57
- debug(`Error in child process`, err);
56
+ logger.error(`Error in child process`, err);
58
57
  reject('Performance run error: ' + err.message);
59
58
  close(child.pid);
60
59
  });
61
60
 
62
61
  child.on('message', (payload: Message) => {
63
62
  if (payload.event === 'created') {
64
- debug(`Child process is up, sending performance request`);
63
+ logger.info(`Child process is up, sending performance request`);
65
64
  return child.send({
66
65
  config,
67
66
  event: 'start',
@@ -71,7 +70,7 @@ export default async ({
71
70
  }
72
71
 
73
72
  if (payload.event === 'complete') {
74
- debug(`Performance gathered, closing and resolving request`);
73
+ logger.info(`Performance gathered, closing and resolving request`);
75
74
  close(child.pid);
76
75
  return resolve({
77
76
  data: payload.data,
@@ -1,5 +1,5 @@
1
+ import { BrowserInstance, Logger } from '@browserless.io/browserless';
1
2
  import { Config, Flags } from 'lighthouse';
2
- import { BrowserInstance } from '@browserless.io/browserless';
3
3
 
4
4
  export interface Message {
5
5
  data?: unknown;
@@ -14,6 +14,7 @@ export interface mainOptions {
14
14
  config?: unknown;
15
15
  url: string;
16
16
  };
17
+ logger: Logger;
17
18
  timeout: number;
18
19
  }
19
20
 
package/src/types.ts CHANGED
@@ -103,6 +103,7 @@ abstract class Route {
103
103
  protected _metrics: Browserless['metrics'],
104
104
  protected _monitoring: Browserless['monitoring'],
105
105
  protected _staticSDKDir: Browserless['staticSDKDir'],
106
+ protected _limiter: Browserless['limiter'],
106
107
  ) {}
107
108
 
108
109
  /**
@@ -196,6 +197,13 @@ abstract class Route {
196
197
  */
197
198
  staticSDKDir = () => this._staticSDKDir;
198
199
 
200
+ /**
201
+ * Helper function that loads the limiter module into the router's
202
+ * handler scope.
203
+ * @returns Limiter
204
+ */
205
+ limiter = () => this._limiter;
206
+
199
207
  /**
200
208
  * The HTTP path that this route handles, eg '/my-route' OR an
201
209
  * array of paths that this route can handle.
@@ -650,6 +658,7 @@ export const BrowserlessManagementRoutes = {
650
658
  ConfigGetRoute: 'ConfigGetRoute',
651
659
  MetricsGetRoute: 'MetricsGetRoute',
652
660
  MetricsTotalGetRoute: 'MetricsTotalGetRoute',
661
+ PressureGetRoute: 'PressureGetRoute',
653
662
  SessionsGetRoute: 'SessionsGetRoute',
654
663
  StaticGetRoute: 'StaticGetRoute',
655
664
  };
package/src/utils.ts CHANGED
@@ -790,12 +790,17 @@ export const untildify = (path: string) => {
790
790
  return homeDir ? path.replace(/^~(?=$|\/|\\)/, homeDir) : path;
791
791
  };
792
792
 
793
- export const printLogo = (docsLink: string) => `
793
+ export const printLogo = (docsLink: string, debugURL?: string | boolean) => `
794
794
  ---------------------------------------------------------
795
795
  | browserless.io
796
796
  | To read documentation and more, load in your browser:
797
797
  |
798
- | ${docsLink}
798
+ | OpenAPI: ${docsLink}
799
+ | Full Documentation: https://docs.browserless.io/ ${
800
+ /*prettier-ignore*/
801
+ debugURL ? `
802
+ | Debbuger: ${debugURL}` : ""
803
+ }
799
804
  ---------------------------------------------------------
800
805
  ${gradient(
801
806
  '#ff1a8c',