@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.
- package/CHANGELOG.md +11 -1
- package/bin/browserless.js +8 -4
- package/bin/scaffold/README.md +6 -4
- package/bin/scaffold/src/hello-world.http.ts +6 -1
- package/build/browserless.d.ts +4 -2
- package/build/browserless.js +9 -12
- package/build/exports.d.ts +1 -0
- package/build/exports.js +1 -0
- package/build/logger.d.ts +12 -0
- package/build/logger.js +27 -0
- package/build/router.d.ts +3 -2
- package/build/router.js +10 -6
- package/build/routes/chrome/http/content.post.body.json +8 -8
- package/build/routes/chrome/http/pdf.post.body.json +9 -9
- package/build/routes/chrome/http/scrape.post.body.json +8 -8
- package/build/routes/chrome/http/screenshot.post.body.json +8 -8
- package/build/routes/chromium/http/content.post.body.json +8 -8
- package/build/routes/chromium/http/pdf.post.body.json +9 -9
- package/build/routes/chromium/http/scrape.post.body.json +8 -8
- package/build/routes/chromium/http/screenshot.post.body.json +8 -8
- package/build/routes/firefox/ws/playwright.d.ts +2 -2
- package/build/routes/firefox/ws/playwright.js +1 -1
- package/build/routes/management/http/static.get.d.ts +2 -2
- package/build/routes/management/http/static.get.js +8 -10
- package/build/routes/webkit/ws/playwright.d.ts +2 -2
- package/build/routes/webkit/ws/playwright.js +1 -1
- package/build/sdk-utils.js +23 -10
- package/build/server.d.ts +3 -2
- package/build/server.js +5 -3
- package/build/shared/browser.ws.d.ts +2 -2
- package/build/shared/browser.ws.js +1 -1
- package/build/shared/chromium.playwright.ws.d.ts +2 -2
- package/build/shared/chromium.playwright.ws.js +1 -1
- package/build/shared/chromium.ws.d.ts +2 -2
- package/build/shared/chromium.ws.js +1 -1
- package/build/shared/content.http.d.ts +2 -2
- package/build/shared/content.http.js +1 -1
- package/build/shared/download.http.d.ts +2 -2
- package/build/shared/download.http.js +11 -12
- package/build/shared/function.http.d.ts +2 -2
- package/build/shared/function.http.js +4 -5
- package/build/shared/page.ws.d.ts +2 -2
- package/build/shared/page.ws.js +1 -1
- package/build/shared/pdf.http.d.ts +2 -2
- package/build/shared/pdf.http.js +1 -1
- package/build/shared/performance.http.d.ts +2 -2
- package/build/shared/performance.http.js +1 -1
- package/build/shared/scrape.http.d.ts +2 -2
- package/build/shared/scrape.http.js +1 -1
- package/build/shared/screenshot.http.d.ts +2 -2
- package/build/shared/screenshot.http.js +1 -1
- package/build/shared/utils/function/handler.d.ts +2 -3
- package/build/shared/utils/function/handler.js +7 -7
- package/build/types.d.ts +6 -15
- package/build/types.js +1 -10
- package/package.json +2 -2
- package/src/browserless.ts +8 -9
- package/src/exports.ts +1 -0
- package/src/logger.ts +31 -0
- package/src/router.ts +9 -7
- package/src/routes/firefox/ws/playwright.ts +2 -0
- package/src/routes/management/http/static.get.ts +15 -10
- package/src/routes/webkit/ws/playwright.ts +2 -0
- package/src/sdk-utils.ts +20 -2
- package/src/server.ts +4 -2
- package/src/shared/browser.ws.ts +2 -0
- package/src/shared/chromium.playwright.ws.ts +2 -0
- package/src/shared/chromium.ws.ts +2 -0
- package/src/shared/content.http.ts +2 -0
- package/src/shared/download.http.ts +14 -11
- package/src/shared/function.http.ts +5 -4
- package/src/shared/page.ws.ts +2 -0
- package/src/shared/pdf.http.ts +2 -0
- package/src/shared/performance.http.ts +2 -0
- package/src/shared/scrape.http.ts +2 -0
- package/src/shared/screenshot.http.ts +2 -0
- package/src/shared/utils/function/handler.ts +8 -12
- package/src/types.ts +5 -9
- package/static/docs/swagger.json +11 -11
- package/static/docs/swagger.min.json +10 -10
- package/static/function/client.js +20 -9
- package/static/function/index.html +20 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
|
-
# [Latest](https://github.com/browserless/chrome/compare/v2.
|
|
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)
|
package/bin/browserless.js
CHANGED
|
@@ -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.`);
|
package/bin/scaffold/README.md
CHANGED
|
@@ -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 (
|
|
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
|
};
|
package/build/browserless.d.ts
CHANGED
|
@@ -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'];
|
package/build/browserless.js
CHANGED
|
@@ -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 ||
|
|
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,
|
|
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,
|
|
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);
|
package/build/exports.d.ts
CHANGED
package/build/exports.js
CHANGED
|
@@ -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
|
+
}
|
package/build/logger.js
ADDED
|
@@ -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.
|
|
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@
|
|
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@
|
|
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@
|
|
439
|
+
"__@toStringTag@10944": {
|
|
440
440
|
"type": "string"
|
|
441
441
|
}
|
|
442
442
|
},
|
|
443
443
|
"additionalProperties": false,
|
|
444
444
|
"required": [
|
|
445
|
-
"__@toStringTag@
|
|
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@
|
|
455
|
+
"__@species@11045": {
|
|
456
456
|
"$ref": "#/definitions/SharedArrayBuffer"
|
|
457
457
|
},
|
|
458
|
-
"__@toStringTag@
|
|
458
|
+
"__@toStringTag@10944": {
|
|
459
459
|
"type": "string",
|
|
460
460
|
"const": "SharedArrayBuffer"
|
|
461
461
|
}
|
|
462
462
|
},
|
|
463
463
|
"additionalProperties": false,
|
|
464
464
|
"required": [
|
|
465
|
-
"__@species@
|
|
466
|
-
"__@toStringTag@
|
|
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
|
|
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@
|
|
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@
|
|
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@
|
|
580
|
+
"__@toStringTag@87018": {
|
|
581
581
|
"type": "string"
|
|
582
582
|
}
|
|
583
583
|
},
|
|
584
584
|
"additionalProperties": false,
|
|
585
585
|
"required": [
|
|
586
|
-
"__@toStringTag@
|
|
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@
|
|
596
|
+
"__@species@87119": {
|
|
597
597
|
"$ref": "#/definitions/SharedArrayBuffer"
|
|
598
598
|
},
|
|
599
|
-
"__@toStringTag@
|
|
599
|
+
"__@toStringTag@87018": {
|
|
600
600
|
"type": "string",
|
|
601
601
|
"const": "SharedArrayBuffer"
|
|
602
602
|
}
|
|
603
603
|
},
|
|
604
604
|
"additionalProperties": false,
|
|
605
605
|
"required": [
|
|
606
|
-
"__@species@
|
|
607
|
-
"__@toStringTag@
|
|
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@
|
|
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@
|
|
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@
|
|
486
|
+
"__@toStringTag@108954": {
|
|
487
487
|
"type": "string"
|
|
488
488
|
}
|
|
489
489
|
},
|
|
490
490
|
"additionalProperties": false,
|
|
491
491
|
"required": [
|
|
492
|
-
"__@toStringTag@
|
|
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@
|
|
502
|
+
"__@species@109055": {
|
|
503
503
|
"$ref": "#/definitions/SharedArrayBuffer"
|
|
504
504
|
},
|
|
505
|
-
"__@toStringTag@
|
|
505
|
+
"__@toStringTag@108954": {
|
|
506
506
|
"type": "string",
|
|
507
507
|
"const": "SharedArrayBuffer"
|
|
508
508
|
}
|
|
509
509
|
},
|
|
510
510
|
"additionalProperties": false,
|
|
511
511
|
"required": [
|
|
512
|
-
"__@species@
|
|
513
|
-
"__@toStringTag@
|
|
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@
|
|
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@
|
|
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@
|
|
529
|
+
"__@toStringTag@120132": {
|
|
530
530
|
"type": "string"
|
|
531
531
|
}
|
|
532
532
|
},
|
|
533
533
|
"additionalProperties": false,
|
|
534
534
|
"required": [
|
|
535
|
-
"__@toStringTag@
|
|
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@
|
|
545
|
+
"__@species@120233": {
|
|
546
546
|
"$ref": "#/definitions/SharedArrayBuffer"
|
|
547
547
|
},
|
|
548
|
-
"__@toStringTag@
|
|
548
|
+
"__@toStringTag@120132": {
|
|
549
549
|
"type": "string",
|
|
550
550
|
"const": "SharedArrayBuffer"
|
|
551
551
|
}
|
|
552
552
|
},
|
|
553
553
|
"additionalProperties": false,
|
|
554
554
|
"required": [
|
|
555
|
-
"__@species@
|
|
556
|
-
"__@toStringTag@
|
|
555
|
+
"__@species@120233",
|
|
556
|
+
"__@toStringTag@120132",
|
|
557
557
|
"byteLength"
|
|
558
558
|
]
|
|
559
559
|
},
|