@browserless.io/browserless 2.8.0 → 2.9.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 +9 -1
- package/README.md +41 -3
- package/assets/debugger.png +0 -0
- package/bin/scaffold/src/hello-world.http.ts +3 -2
- package/build/browserless.d.ts +5 -4
- package/build/browserless.js +15 -11
- package/build/browsers/chrome.cdp.d.ts +2 -2
- package/build/browsers/chrome.cdp.js +2 -2
- package/build/browsers/chrome.playwright.d.ts +2 -2
- package/build/browsers/chrome.playwright.js +2 -2
- package/build/browsers/chromium.cdp.d.ts +4 -4
- package/build/browsers/chromium.cdp.js +49 -32
- package/build/browsers/chromium.playwright.d.ts +4 -4
- package/build/browsers/chromium.playwright.js +14 -13
- package/build/browsers/firefox.playwright.d.ts +4 -4
- package/build/browsers/firefox.playwright.js +14 -13
- package/build/browsers/index.d.ts +24 -8
- package/build/browsers/index.js +20 -15
- package/build/browsers/webkit.playwright.d.ts +4 -4
- package/build/browsers/webkit.playwright.js +14 -13
- package/build/config.d.ts +3 -0
- package/build/config.js +3 -0
- package/build/file-system.d.ts +2 -3
- package/build/file-system.js +2 -2
- package/build/index.js +7 -7
- package/build/limiter.d.ts +2 -3
- package/build/limiter.js +11 -11
- package/build/logger.d.ts +16 -9
- package/build/logger.js +32 -16
- package/build/monitoring.d.ts +2 -3
- package/build/monitoring.js +4 -4
- package/build/router.d.ts +1 -3
- package/build/router.js +21 -22
- package/build/routes/chrome/http/content.post.body.json +8 -8
- package/build/routes/chrome/http/pdf.post.body.json +8 -8
- 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 +8 -8
- 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/management/http/static.get.js +3 -3
- package/build/routes/management/tests/management.spec.js +9 -0
- package/build/server.d.ts +1 -3
- package/build/server.js +33 -30
- package/build/shared/content.http.d.ts +1 -1
- package/build/shared/content.http.js +4 -1
- package/build/shared/download.http.js +9 -9
- package/build/shared/function.http.js +2 -2
- package/build/shared/json-protocol.http.d.ts +3 -3
- package/build/shared/json-protocol.http.js +2 -2
- package/build/shared/json-version.http.d.ts +3 -3
- package/build/shared/json-version.http.js +2 -2
- package/build/shared/pdf.http.d.ts +1 -1
- package/build/shared/pdf.http.js +6 -4
- package/build/shared/performance.http.js +1 -0
- package/build/shared/scrape.http.d.ts +1 -1
- package/build/shared/scrape.http.js +4 -1
- package/build/shared/screenshot.http.d.ts +1 -1
- package/build/shared/screenshot.http.js +4 -1
- package/build/shared/utils/function/handler.js +7 -7
- package/build/shared/utils/performance/child.js +4 -4
- package/build/shared/utils/performance/main.d.ts +1 -1
- package/build/shared/utils/performance/main.js +5 -7
- package/build/shared/utils/performance/types.d.ts +2 -1
- package/build/utils.d.ts +1 -1
- package/build/utils.js +6 -2
- package/package.json +18 -15
- package/scripts/install-debugger.js +55 -15
- package/src/browserless.ts +21 -12
- package/src/browsers/chrome.cdp.ts +2 -5
- package/src/browsers/chrome.playwright.ts +2 -5
- package/src/browsers/chromium.cdp.ts +84 -35
- package/src/browsers/chromium.playwright.ts +26 -13
- package/src/browsers/firefox.playwright.ts +28 -13
- package/src/browsers/index.ts +24 -16
- package/src/browsers/webkit.playwright.ts +28 -13
- package/src/config.ts +4 -0
- package/src/file-system.ts +2 -7
- package/src/index.ts +7 -7
- package/src/limiter.ts +13 -11
- package/src/logger.ts +39 -18
- package/src/monitoring.ts +6 -8
- package/src/router.ts +20 -20
- package/src/routes/management/http/static.get.ts +3 -5
- package/src/routes/management/tests/management.spec.ts +15 -0
- package/src/server.ts +43 -30
- package/src/shared/content.http.ts +5 -1
- package/src/shared/download.http.ts +9 -9
- package/src/shared/function.http.ts +2 -2
- package/src/shared/json-protocol.http.ts +8 -3
- package/src/shared/json-version.http.ts +8 -4
- package/src/shared/pdf.http.ts +6 -4
- package/src/shared/performance.http.ts +1 -0
- package/src/shared/scrape.http.ts +5 -1
- package/src/shared/screenshot.http.ts +4 -1
- package/src/shared/utils/function/handler.ts +7 -7
- package/src/shared/utils/performance/child.ts +4 -4
- package/src/shared/utils/performance/main.ts +5 -6
- package/src/shared/utils/performance/types.ts +2 -1
- package/src/utils.ts +7 -2
- package/static/docs/swagger.json +10 -10
- package/static/docs/swagger.min.json +9 -9
- package/static/function/client.js +1646 -2917
- package/static/function/index.html +1646 -2917
|
@@ -78,9 +78,10 @@ export default class ChromiumContentPostRoute extends BrowserHTTPRoute {
|
|
|
78
78
|
handler = async (
|
|
79
79
|
req: Request,
|
|
80
80
|
res: ServerResponse,
|
|
81
|
-
|
|
81
|
+
logger: Logger,
|
|
82
82
|
browser: BrowserInstance,
|
|
83
83
|
): Promise<void> => {
|
|
84
|
+
logger.info('Content API invoked with body:', req.body);
|
|
84
85
|
const contentType =
|
|
85
86
|
!req.headers.accept || req.headers.accept?.includes('*')
|
|
86
87
|
? contentTypes.html
|
|
@@ -166,6 +167,7 @@ export default class ChromiumContentPostRoute extends BrowserHTTPRoute {
|
|
|
166
167
|
!!rejectRequestPattern.find((pattern) => req.url().match(pattern)) ||
|
|
167
168
|
rejectResourceTypes.includes(req.resourceType())
|
|
168
169
|
) {
|
|
170
|
+
logger.debug(`Aborting request ${req.method()}: ${req.url()}`);
|
|
169
171
|
return req.abort();
|
|
170
172
|
}
|
|
171
173
|
const interceptor = requestInterceptors.find((r) =>
|
|
@@ -233,6 +235,8 @@ export default class ChromiumContentPostRoute extends BrowserHTTPRoute {
|
|
|
233
235
|
|
|
234
236
|
page.close().catch(noop);
|
|
235
237
|
|
|
238
|
+
logger.info('Content API request completed');
|
|
239
|
+
|
|
236
240
|
return writeResponse(res, 200, markup, contentTypes.html);
|
|
237
241
|
};
|
|
238
242
|
}
|
|
@@ -72,11 +72,11 @@ export default class ChromiumDownloadPostRoute extends BrowserHTTPRoute {
|
|
|
72
72
|
`.browserless.download.${id()}`,
|
|
73
73
|
);
|
|
74
74
|
|
|
75
|
-
logger.
|
|
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.
|
|
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.
|
|
89
|
+
logger.info(`Download function has returned, finding downloads...`);
|
|
90
90
|
async function checkIfDownloadComplete(): Promise<string | null> {
|
|
91
91
|
if (res.headersSent) {
|
|
92
|
-
logger.
|
|
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.
|
|
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.
|
|
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.
|
|
118
|
+
logger.info(
|
|
119
119
|
`Successfully deleted downloads from disk at "${filePath}"`,
|
|
120
120
|
);
|
|
121
121
|
})
|
|
122
122
|
.catch((err) => {
|
|
123
|
-
logger.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|
package/src/shared/pdf.http.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
}
|
|
@@ -219,9 +219,10 @@ export default class ChromiumScrapePostRoute extends BrowserHTTPRoute {
|
|
|
219
219
|
handler = async (
|
|
220
220
|
req: Request,
|
|
221
221
|
res: ServerResponse,
|
|
222
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
121
|
-
logger.
|
|
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.
|
|
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.
|
|
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 {
|
|
2
|
+
import { Logger } from '@browserless.io/browserless';
|
|
3
3
|
import lighthouse from 'lighthouse';
|
|
4
4
|
|
|
5
|
-
const
|
|
5
|
+
const logger = new Logger('http:performance:child');
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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/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',
|