@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.
- package/CHANGELOG.md +16 -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 +3 -3
- package/scripts/start.sh +2 -1
- package/scripts/test.sh +7 -4
- 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/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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
})
|
package/src/shared/browser.ws.ts
CHANGED
|
@@ -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
|
-
|
|
75
|
+
logger.log(`Generating a download directory at "${downloadPath}"`);
|
|
75
76
|
await mkdir(downloadPath);
|
|
76
|
-
const handler = functionHandler(config,
|
|
77
|
+
const handler = functionHandler(config, logger, { downloadPath });
|
|
77
78
|
const response = await handler(req, browser).catch((e) => {
|
|
78
|
-
|
|
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
|
-
|
|
89
|
+
logger.log(`Download function has returned, finding downloads...`);
|
|
89
90
|
async function checkIfDownloadComplete(): Promise<string | null> {
|
|
90
91
|
if (res.headersSent) {
|
|
91
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
118
|
+
logger.log(
|
|
116
119
|
`Successfully deleted downloads from disk at "${filePath}"`,
|
|
117
120
|
);
|
|
118
121
|
})
|
|
119
122
|
.catch((err) => {
|
|
120
|
-
|
|
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
|
-
|
|
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,
|
|
65
|
+
const handler = functionHandler(config, logger);
|
|
65
66
|
const { contentType, payload, page } = await handler(req, browser);
|
|
66
67
|
|
|
67
|
-
|
|
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
|
-
|
|
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);
|
package/src/shared/page.ws.ts
CHANGED
|
@@ -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
|
}
|
package/src/shared/pdf.http.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|