@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
|
@@ -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
|
},
|
|
@@ -394,14 +394,14 @@
|
|
|
394
394
|
"length": {
|
|
395
395
|
"type": "number"
|
|
396
396
|
},
|
|
397
|
-
"__@toStringTag@
|
|
397
|
+
"__@toStringTag@142053": {
|
|
398
398
|
"type": "string",
|
|
399
399
|
"const": "Uint8Array"
|
|
400
400
|
}
|
|
401
401
|
},
|
|
402
402
|
"required": [
|
|
403
403
|
"BYTES_PER_ELEMENT",
|
|
404
|
-
"__@toStringTag@
|
|
404
|
+
"__@toStringTag@142053",
|
|
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@142053": {
|
|
440
440
|
"type": "string"
|
|
441
441
|
}
|
|
442
442
|
},
|
|
443
443
|
"additionalProperties": false,
|
|
444
444
|
"required": [
|
|
445
|
-
"__@toStringTag@
|
|
445
|
+
"__@toStringTag@142053",
|
|
446
446
|
"byteLength"
|
|
447
447
|
]
|
|
448
448
|
},
|
|
@@ -452,18 +452,18 @@
|
|
|
452
452
|
"byteLength": {
|
|
453
453
|
"type": "number"
|
|
454
454
|
},
|
|
455
|
-
"__@species@
|
|
455
|
+
"__@species@142154": {
|
|
456
456
|
"$ref": "#/definitions/SharedArrayBuffer"
|
|
457
457
|
},
|
|
458
|
-
"__@toStringTag@
|
|
458
|
+
"__@toStringTag@142053": {
|
|
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@142154",
|
|
466
|
+
"__@toStringTag@142053",
|
|
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@207273": {
|
|
539
539
|
"type": "string",
|
|
540
540
|
"const": "Uint8Array"
|
|
541
541
|
}
|
|
542
542
|
},
|
|
543
543
|
"required": [
|
|
544
544
|
"BYTES_PER_ELEMENT",
|
|
545
|
-
"__@toStringTag@
|
|
545
|
+
"__@toStringTag@207273",
|
|
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@207273": {
|
|
581
581
|
"type": "string"
|
|
582
582
|
}
|
|
583
583
|
},
|
|
584
584
|
"additionalProperties": false,
|
|
585
585
|
"required": [
|
|
586
|
-
"__@toStringTag@
|
|
586
|
+
"__@toStringTag@207273",
|
|
587
587
|
"byteLength"
|
|
588
588
|
]
|
|
589
589
|
},
|
|
@@ -593,18 +593,18 @@
|
|
|
593
593
|
"byteLength": {
|
|
594
594
|
"type": "number"
|
|
595
595
|
},
|
|
596
|
-
"__@species@
|
|
596
|
+
"__@species@207374": {
|
|
597
597
|
"$ref": "#/definitions/SharedArrayBuffer"
|
|
598
598
|
},
|
|
599
|
-
"__@toStringTag@
|
|
599
|
+
"__@toStringTag@207273": {
|
|
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@207374",
|
|
607
|
+
"__@toStringTag@207273",
|
|
608
608
|
"byteLength"
|
|
609
609
|
]
|
|
610
610
|
},
|
|
@@ -441,14 +441,14 @@
|
|
|
441
441
|
"length": {
|
|
442
442
|
"type": "number"
|
|
443
443
|
},
|
|
444
|
-
"__@toStringTag@
|
|
444
|
+
"__@toStringTag@229203": {
|
|
445
445
|
"type": "string",
|
|
446
446
|
"const": "Uint8Array"
|
|
447
447
|
}
|
|
448
448
|
},
|
|
449
449
|
"required": [
|
|
450
450
|
"BYTES_PER_ELEMENT",
|
|
451
|
-
"__@toStringTag@
|
|
451
|
+
"__@toStringTag@229203",
|
|
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@229203": {
|
|
487
487
|
"type": "string"
|
|
488
488
|
}
|
|
489
489
|
},
|
|
490
490
|
"additionalProperties": false,
|
|
491
491
|
"required": [
|
|
492
|
-
"__@toStringTag@
|
|
492
|
+
"__@toStringTag@229203",
|
|
493
493
|
"byteLength"
|
|
494
494
|
]
|
|
495
495
|
},
|
|
@@ -499,18 +499,18 @@
|
|
|
499
499
|
"byteLength": {
|
|
500
500
|
"type": "number"
|
|
501
501
|
},
|
|
502
|
-
"__@species@
|
|
502
|
+
"__@species@229304": {
|
|
503
503
|
"$ref": "#/definitions/SharedArrayBuffer"
|
|
504
504
|
},
|
|
505
|
-
"__@toStringTag@
|
|
505
|
+
"__@toStringTag@229203": {
|
|
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@229304",
|
|
513
|
+
"__@toStringTag@229203",
|
|
514
514
|
"byteLength"
|
|
515
515
|
]
|
|
516
516
|
},
|
|
@@ -484,14 +484,14 @@
|
|
|
484
484
|
"length": {
|
|
485
485
|
"type": "number"
|
|
486
486
|
},
|
|
487
|
-
"__@toStringTag@
|
|
487
|
+
"__@toStringTag@240378": {
|
|
488
488
|
"type": "string",
|
|
489
489
|
"const": "Uint8Array"
|
|
490
490
|
}
|
|
491
491
|
},
|
|
492
492
|
"required": [
|
|
493
493
|
"BYTES_PER_ELEMENT",
|
|
494
|
-
"__@toStringTag@
|
|
494
|
+
"__@toStringTag@240378",
|
|
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@240378": {
|
|
530
530
|
"type": "string"
|
|
531
531
|
}
|
|
532
532
|
},
|
|
533
533
|
"additionalProperties": false,
|
|
534
534
|
"required": [
|
|
535
|
-
"__@toStringTag@
|
|
535
|
+
"__@toStringTag@240378",
|
|
536
536
|
"byteLength"
|
|
537
537
|
]
|
|
538
538
|
},
|
|
@@ -542,18 +542,18 @@
|
|
|
542
542
|
"byteLength": {
|
|
543
543
|
"type": "number"
|
|
544
544
|
},
|
|
545
|
-
"__@species@
|
|
545
|
+
"__@species@240479": {
|
|
546
546
|
"$ref": "#/definitions/SharedArrayBuffer"
|
|
547
547
|
},
|
|
548
|
-
"__@toStringTag@
|
|
548
|
+
"__@toStringTag@240378": {
|
|
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@240479",
|
|
556
|
+
"__@toStringTag@240378",
|
|
557
557
|
"byteLength"
|
|
558
558
|
]
|
|
559
559
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
-
import { APITags, BrowserServerOptions, BrowserWebsocketRoute, FirefoxPlaywright, Request, SystemQueryParameters, WebsocketRoutes } from '@browserless.io/browserless';
|
|
3
|
+
import { APITags, BrowserServerOptions, BrowserWebsocketRoute, FirefoxPlaywright, Logger, Request, SystemQueryParameters, WebsocketRoutes } from '@browserless.io/browserless';
|
|
4
4
|
import { Duplex } from 'stream';
|
|
5
5
|
export interface QuerySchema extends SystemQueryParameters {
|
|
6
6
|
launch?: BrowserServerOptions & {
|
|
@@ -17,5 +17,5 @@ export default class FirefoxPlaywrightWebSocketRoute extends BrowserWebsocketRou
|
|
|
17
17
|
description: string;
|
|
18
18
|
path: WebsocketRoutes[];
|
|
19
19
|
tags: APITags[];
|
|
20
|
-
handler: (req: Request, socket: Duplex, head: Buffer, browser: FirefoxPlaywright) => Promise<void>;
|
|
20
|
+
handler: (req: Request, socket: Duplex, head: Buffer, _logger: Logger, browser: FirefoxPlaywright) => Promise<void>;
|
|
21
21
|
}
|
|
@@ -7,7 +7,7 @@ export default class FirefoxPlaywrightWebSocketRoute extends BrowserWebsocketRou
|
|
|
7
7
|
description = `Connect to Firefox with any playwright-compliant library.`;
|
|
8
8
|
path = [WebsocketRoutes.playwrightFirefox, WebsocketRoutes.firefoxPlaywright];
|
|
9
9
|
tags = [APITags.browserWS];
|
|
10
|
-
handler = async (req, socket, head, browser) => {
|
|
10
|
+
handler = async (req, socket, head, _logger, browser) => {
|
|
11
11
|
const isPlaywright = req.headers['user-agent']
|
|
12
12
|
?.toLowerCase()
|
|
13
13
|
.includes('playwright');
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { APITags, HTTPManagementRoutes, HTTPRoute, Methods, Request, contentTypes } from '@browserless.io/browserless';
|
|
2
|
+
import { APITags, HTTPManagementRoutes, HTTPRoute, Logger, Methods, Request, contentTypes } from '@browserless.io/browserless';
|
|
3
3
|
import { ServerResponse } from 'http';
|
|
4
4
|
export default class StaticGetRoute extends HTTPRoute {
|
|
5
5
|
name: string;
|
|
@@ -12,5 +12,5 @@ export default class StaticGetRoute extends HTTPRoute {
|
|
|
12
12
|
method: Methods;
|
|
13
13
|
path: HTTPManagementRoutes;
|
|
14
14
|
tags: APITags[];
|
|
15
|
-
handler: (req: Request, res: ServerResponse) => Promise<unknown>;
|
|
15
|
+
handler: (req: Request, res: ServerResponse, logger: Logger) => Promise<unknown>;
|
|
16
16
|
}
|
|
@@ -2,15 +2,15 @@ import { APITags, BrowserlessRoutes, HTTPManagementRoutes, HTTPRoute, Methods, N
|
|
|
2
2
|
import { createReadStream } from 'fs';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
const pathMap = new Map();
|
|
5
|
-
const streamFile = (
|
|
5
|
+
const streamFile = (logger, res, file, contentType) => new Promise((resolve, reject) => {
|
|
6
6
|
if (contentType) {
|
|
7
|
-
|
|
7
|
+
logger.log(`Setting content-type ${contentType}`);
|
|
8
8
|
res.setHeader('Content-Type', contentType);
|
|
9
9
|
}
|
|
10
10
|
return createReadStream(file)
|
|
11
11
|
.on('error', (error) => {
|
|
12
12
|
if (error) {
|
|
13
|
-
|
|
13
|
+
logger.error(`Error finding file ${file}, sending 404`);
|
|
14
14
|
pathMap.delete(file);
|
|
15
15
|
return reject(new NotFound(`Request for file "${file}" was not found`));
|
|
16
16
|
}
|
|
@@ -29,13 +29,11 @@ export default class StaticGetRoute extends HTTPRoute {
|
|
|
29
29
|
method = Methods.get;
|
|
30
30
|
path = HTTPManagementRoutes.static;
|
|
31
31
|
tags = [APITags.management];
|
|
32
|
-
handler = async (req, res) => {
|
|
32
|
+
handler = async (req, res, logger) => {
|
|
33
33
|
const { pathname } = req.parsed;
|
|
34
34
|
const fileCache = pathMap.get(pathname);
|
|
35
|
-
const debug = this.debug();
|
|
36
|
-
const verbose = debug.extend('verbose');
|
|
37
35
|
if (fileCache) {
|
|
38
|
-
return streamFile(
|
|
36
|
+
return streamFile(logger, res, fileCache.path, fileCache.contentType);
|
|
39
37
|
}
|
|
40
38
|
const config = this.config();
|
|
41
39
|
const sdkDir = this.staticSDKDir();
|
|
@@ -51,10 +49,10 @@ export default class StaticGetRoute extends HTTPRoute {
|
|
|
51
49
|
throw new NotFound(`No route or file found for resource ${req.method}: ${pathname}`);
|
|
52
50
|
}
|
|
53
51
|
if (foundFilePaths.length > 1) {
|
|
54
|
-
|
|
52
|
+
logger.log(`Multiple files found for request to "${pathname}". Only the first file is served, so please name your files uniquely.`);
|
|
55
53
|
}
|
|
56
54
|
const [foundFilePath] = foundFilePaths;
|
|
57
|
-
verbose(`Found new file "${foundFilePath}", caching path and serving`);
|
|
55
|
+
logger.verbose(`Found new file "${foundFilePath}", caching path and serving`);
|
|
58
56
|
const contentType = mimeTypes.get(path.extname(foundFilePath));
|
|
59
57
|
if (contentType) {
|
|
60
58
|
res.setHeader('Content-Type', contentType);
|
|
@@ -64,6 +62,6 @@ export default class StaticGetRoute extends HTTPRoute {
|
|
|
64
62
|
contentType,
|
|
65
63
|
path: foundFilePath,
|
|
66
64
|
});
|
|
67
|
-
return streamFile(
|
|
65
|
+
return streamFile(logger, res, foundFilePath, contentType);
|
|
68
66
|
};
|
|
69
67
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
-
import { APITags, BrowserServerOptions, BrowserWebsocketRoute, Request, SystemQueryParameters, WebkitPlaywright, WebsocketRoutes } from '@browserless.io/browserless';
|
|
3
|
+
import { APITags, BrowserServerOptions, BrowserWebsocketRoute, Logger, Request, SystemQueryParameters, WebkitPlaywright, WebsocketRoutes } from '@browserless.io/browserless';
|
|
4
4
|
import { Duplex } from 'stream';
|
|
5
5
|
export interface QuerySchema extends SystemQueryParameters {
|
|
6
6
|
launch?: BrowserServerOptions | string;
|
|
@@ -13,5 +13,5 @@ export default class WebKitPlaywrightWebSocketRoute extends BrowserWebsocketRout
|
|
|
13
13
|
description: string;
|
|
14
14
|
path: WebsocketRoutes[];
|
|
15
15
|
tags: APITags[];
|
|
16
|
-
handler: (req: Request, socket: Duplex, head: Buffer, browser: WebkitPlaywright) => Promise<void>;
|
|
16
|
+
handler: (req: Request, socket: Duplex, head: Buffer, _logger: Logger, browser: WebkitPlaywright) => Promise<void>;
|
|
17
17
|
}
|
|
@@ -7,7 +7,7 @@ export default class WebKitPlaywrightWebSocketRoute extends BrowserWebsocketRout
|
|
|
7
7
|
description = `Connect to Webkit with any playwright-compliant library.`;
|
|
8
8
|
path = [WebsocketRoutes.playwrightWebkit, WebsocketRoutes.webkitPlaywright];
|
|
9
9
|
tags = [APITags.browserWS];
|
|
10
|
-
handler = async (req, socket, head, browser) => {
|
|
10
|
+
handler = async (req, socket, head, _logger, browser) => {
|
|
11
11
|
const isPlaywright = req.headers['user-agent']
|
|
12
12
|
?.toLowerCase()
|
|
13
13
|
.includes('playwright');
|
package/build/sdk-utils.js
CHANGED
|
@@ -58,17 +58,30 @@ export const prompt = async (question) => {
|
|
|
58
58
|
});
|
|
59
59
|
});
|
|
60
60
|
};
|
|
61
|
-
export const installDependencies = async (workingDirectory) =>
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
61
|
+
export const installDependencies = async (workingDirectory) => {
|
|
62
|
+
await new Promise((resolve, reject) => {
|
|
63
|
+
spawn('npm', ['i'], {
|
|
64
|
+
cwd: workingDirectory,
|
|
65
|
+
stdio: 'inherit',
|
|
66
|
+
}).once('close', (code) => {
|
|
67
|
+
if (code === 0) {
|
|
68
|
+
return resolve();
|
|
69
|
+
}
|
|
70
|
+
return reject(`Error when installing dependencies, see output for more details`);
|
|
71
|
+
});
|
|
70
72
|
});
|
|
71
|
-
|
|
73
|
+
await new Promise((resolve, reject) => {
|
|
74
|
+
spawn('npx', 'playwright-core install --with-deps chromium firefox webkit'.split(' '), {
|
|
75
|
+
cwd: workingDirectory,
|
|
76
|
+
stdio: 'inherit',
|
|
77
|
+
}).once('close', (code) => {
|
|
78
|
+
if (code === 0) {
|
|
79
|
+
return resolve();
|
|
80
|
+
}
|
|
81
|
+
return reject(`Error when installing dependencies, see output for more details`);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
};
|
|
72
85
|
export const buildDockerImage = async (cmd, projectDir) => new Promise((resolve, reject) => {
|
|
73
86
|
const [docker, ...args] = cmd.split(' ');
|
|
74
87
|
spawn(docker, args, {
|
package/build/server.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
/// <reference types="node" />
|
|
6
6
|
import * as http from 'http';
|
|
7
7
|
import * as stream from 'stream';
|
|
8
|
-
import { Config, Hooks, Metrics, Request, Response, Router, Token } from '@browserless.io/browserless';
|
|
8
|
+
import { Logger as BlessLogger, Config, Hooks, Metrics, Request, Response, Router, Token } from '@browserless.io/browserless';
|
|
9
9
|
import { EventEmitter } from 'events';
|
|
10
10
|
export interface HTTPServerOptions {
|
|
11
11
|
concurrent: number;
|
|
@@ -20,12 +20,13 @@ export declare class HTTPServer extends EventEmitter {
|
|
|
20
20
|
protected token: Token;
|
|
21
21
|
protected router: Router;
|
|
22
22
|
protected hooks: Hooks;
|
|
23
|
+
protected Logger: typeof BlessLogger;
|
|
23
24
|
protected server: http.Server;
|
|
24
25
|
protected port: number;
|
|
25
26
|
protected host?: string;
|
|
26
27
|
protected log: import("debug").Debugger;
|
|
27
28
|
protected verbose: import("debug").Debugger;
|
|
28
|
-
constructor(config: Config, metrics: Metrics, token: Token, router: Router, hooks: Hooks);
|
|
29
|
+
constructor(config: Config, metrics: Metrics, token: Token, router: Router, hooks: Hooks, Logger: typeof BlessLogger);
|
|
29
30
|
protected onHTTPUnauthorized: (_req: Request, res: Response) => void;
|
|
30
31
|
protected onWebsocketUnauthorized: (_req: Request, socket: stream.Duplex) => void;
|
|
31
32
|
start(): Promise<void>;
|
package/build/server.js
CHANGED
|
@@ -9,18 +9,20 @@ export class HTTPServer extends EventEmitter {
|
|
|
9
9
|
token;
|
|
10
10
|
router;
|
|
11
11
|
hooks;
|
|
12
|
+
Logger;
|
|
12
13
|
server = http.createServer();
|
|
13
14
|
port;
|
|
14
15
|
host;
|
|
15
16
|
log = createLogger('server');
|
|
16
17
|
verbose = createLogger('server:verbose');
|
|
17
|
-
constructor(config, metrics, token, router, hooks) {
|
|
18
|
+
constructor(config, metrics, token, router, hooks, Logger) {
|
|
18
19
|
super();
|
|
19
20
|
this.config = config;
|
|
20
21
|
this.metrics = metrics;
|
|
21
22
|
this.token = token;
|
|
22
23
|
this.router = router;
|
|
23
24
|
this.hooks = hooks;
|
|
25
|
+
this.Logger = Logger;
|
|
24
26
|
this.host = config.getHost();
|
|
25
27
|
this.port = config.getPort();
|
|
26
28
|
this.log(`Server instantiated with host "${this.host}" on port "${this.port}" using token "${this.config.getToken()}"`);
|
|
@@ -144,7 +146,7 @@ export class HTTPServer extends EventEmitter {
|
|
|
144
146
|
}
|
|
145
147
|
}
|
|
146
148
|
return route
|
|
147
|
-
.handler(req, res)
|
|
149
|
+
.handler(req, res, new this.Logger(route.name, req))
|
|
148
150
|
.then(() => {
|
|
149
151
|
this.verbose('HTTP connection complete');
|
|
150
152
|
})
|
|
@@ -209,7 +211,7 @@ export class HTTPServer extends EventEmitter {
|
|
|
209
211
|
}
|
|
210
212
|
}
|
|
211
213
|
return route
|
|
212
|
-
.handler(req, socket, head)
|
|
214
|
+
.handler(req, socket, head, new this.Logger(route.name, req))
|
|
213
215
|
.then(() => {
|
|
214
216
|
this.verbose('Websocket connection complete');
|
|
215
217
|
})
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
-
import { APITags, BrowserWebsocketRoute, CDPLaunchOptions, ChromiumCDP, Request, SystemQueryParameters, WebsocketRoutes } from '@browserless.io/browserless';
|
|
3
|
+
import { APITags, BrowserWebsocketRoute, CDPLaunchOptions, ChromiumCDP, Logger, Request, SystemQueryParameters, WebsocketRoutes } from '@browserless.io/browserless';
|
|
4
4
|
import { Duplex } from 'stream';
|
|
5
5
|
export interface QuerySchema extends SystemQueryParameters {
|
|
6
6
|
launch?: CDPLaunchOptions | string;
|
|
@@ -13,5 +13,5 @@ export default class ChromiumBrowserWebSocketRoute extends BrowserWebsocketRoute
|
|
|
13
13
|
description: string;
|
|
14
14
|
path: WebsocketRoutes;
|
|
15
15
|
tags: APITags[];
|
|
16
|
-
handler: (req: Request, socket: Duplex, head: Buffer, browser: ChromiumCDP) => Promise<void>;
|
|
16
|
+
handler: (req: Request, socket: Duplex, head: Buffer, _logger: Logger, browser: ChromiumCDP) => Promise<void>;
|
|
17
17
|
}
|
|
@@ -9,5 +9,5 @@ export default class ChromiumBrowserWebSocketRoute extends BrowserWebsocketRoute
|
|
|
9
9
|
must already be launched in order to not return a 404.`);
|
|
10
10
|
path = WebsocketRoutes.browser;
|
|
11
11
|
tags = [APITags.browserWS];
|
|
12
|
-
handler = async (req, socket, head, browser) => browser.proxyWebSocket(req, socket, head);
|
|
12
|
+
handler = async (req, socket, head, _logger, browser) => browser.proxyWebSocket(req, socket, head);
|
|
13
13
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
-
import { APITags, BrowserServerOptions, BrowserWebsocketRoute, ChromiumPlaywright, Request, SystemQueryParameters, WebsocketRoutes } from '@browserless.io/browserless';
|
|
3
|
+
import { APITags, BrowserServerOptions, BrowserWebsocketRoute, ChromiumPlaywright, Logger, Request, SystemQueryParameters, WebsocketRoutes } from '@browserless.io/browserless';
|
|
4
4
|
import { Duplex } from 'stream';
|
|
5
5
|
export interface QuerySchema extends SystemQueryParameters {
|
|
6
6
|
launch?: BrowserServerOptions | string;
|
|
@@ -13,5 +13,5 @@ export default class ChromiumPlaywrightWebSocketRoute extends BrowserWebsocketRo
|
|
|
13
13
|
description: string;
|
|
14
14
|
path: WebsocketRoutes[];
|
|
15
15
|
tags: APITags[];
|
|
16
|
-
handler: (req: Request, socket: Duplex, head: Buffer, browser: ChromiumPlaywright) => Promise<void>;
|
|
16
|
+
handler: (req: Request, socket: Duplex, head: Buffer, _logger: Logger, browser: ChromiumPlaywright) => Promise<void>;
|
|
17
17
|
}
|
|
@@ -10,7 +10,7 @@ export default class ChromiumPlaywrightWebSocketRoute extends BrowserWebsocketRo
|
|
|
10
10
|
WebsocketRoutes.chromiumPlaywright,
|
|
11
11
|
];
|
|
12
12
|
tags = [APITags.browserWS];
|
|
13
|
-
handler = async (req, socket, head, browser) => {
|
|
13
|
+
handler = async (req, socket, head, _logger, browser) => {
|
|
14
14
|
const isPlaywright = req.headers['user-agent']
|
|
15
15
|
?.toLowerCase()
|
|
16
16
|
.includes('playwright');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
-
import { APITags, BrowserWebsocketRoute, CDPLaunchOptions, ChromiumCDP, Request, SystemQueryParameters, WebsocketRoutes } from '@browserless.io/browserless';
|
|
3
|
+
import { APITags, BrowserWebsocketRoute, CDPLaunchOptions, ChromiumCDP, Logger, Request, SystemQueryParameters, WebsocketRoutes } from '@browserless.io/browserless';
|
|
4
4
|
import { Duplex } from 'stream';
|
|
5
5
|
export interface QuerySchema extends SystemQueryParameters {
|
|
6
6
|
launch?: CDPLaunchOptions | string;
|
|
@@ -13,5 +13,5 @@ export default class ChromiumCDPWebSocketRoute extends BrowserWebsocketRoute {
|
|
|
13
13
|
description: string;
|
|
14
14
|
path: WebsocketRoutes[];
|
|
15
15
|
tags: APITags[];
|
|
16
|
-
handler: (req: Request, socket: Duplex, head: Buffer, browser: ChromiumCDP) => Promise<void>;
|
|
16
|
+
handler: (req: Request, socket: Duplex, head: Buffer, _logger: Logger, browser: ChromiumCDP) => Promise<void>;
|
|
17
17
|
}
|
|
@@ -7,5 +7,5 @@ export default class ChromiumCDPWebSocketRoute extends BrowserWebsocketRoute {
|
|
|
7
7
|
description = `Launch and connect to Chromium with a library like puppeteer or others that work over chrome-devtools-protocol.`;
|
|
8
8
|
path = [WebsocketRoutes['/'], WebsocketRoutes.chromium];
|
|
9
9
|
tags = [APITags.browserWS];
|
|
10
|
-
handler = async (req, socket, head, browser) => browser.proxyWebSocket(req, socket, head);
|
|
10
|
+
handler = async (req, socket, head, _logger, browser) => browser.proxyWebSocket(req, socket, head);
|
|
11
11
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { APITags, BrowserHTTPRoute, BrowserInstance, CDPLaunchOptions, ChromiumCDP, HTTPRoutes, Methods, Request, SystemQueryParameters, WaitForEventOptions, WaitForFunctionOptions, WaitForSelectorOptions, bestAttempt, contentTypes, rejectRequestPattern, rejectResourceTypes, requestInterceptors, setJavaScriptEnabled } from '@browserless.io/browserless';
|
|
2
|
+
import { APITags, BrowserHTTPRoute, BrowserInstance, CDPLaunchOptions, ChromiumCDP, HTTPRoutes, Logger, Methods, Request, SystemQueryParameters, WaitForEventOptions, WaitForFunctionOptions, WaitForSelectorOptions, bestAttempt, contentTypes, rejectRequestPattern, rejectResourceTypes, requestInterceptors, setJavaScriptEnabled } from '@browserless.io/browserless';
|
|
3
3
|
import { Page } from 'puppeteer-core';
|
|
4
4
|
import { ServerResponse } from 'http';
|
|
5
5
|
export interface BodySchema {
|
|
@@ -43,5 +43,5 @@ export default class ChromiumContentPostRoute extends BrowserHTTPRoute {
|
|
|
43
43
|
method: Methods;
|
|
44
44
|
path: HTTPRoutes[];
|
|
45
45
|
tags: APITags[];
|
|
46
|
-
handler: (req: Request, res: ServerResponse, browser: BrowserInstance) => Promise<void>;
|
|
46
|
+
handler: (req: Request, res: ServerResponse, _logger: Logger, browser: BrowserInstance) => Promise<void>;
|
|
47
47
|
}
|
|
@@ -10,7 +10,7 @@ export default class ChromiumContentPostRoute extends BrowserHTTPRoute {
|
|
|
10
10
|
method = Methods.post;
|
|
11
11
|
path = [HTTPRoutes.content, HTTPRoutes.chromiumContent];
|
|
12
12
|
tags = [APITags.browserAPI];
|
|
13
|
-
handler = async (req, res, browser) => {
|
|
13
|
+
handler = async (req, res, _logger, browser) => {
|
|
14
14
|
const contentType = !req.headers.accept || req.headers.accept?.includes('*')
|
|
15
15
|
? contentTypes.html
|
|
16
16
|
: req.headers.accept;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { APITags, BrowserHTTPRoute, BrowserInstance, CDPLaunchOptions, ChromiumCDP, HTTPRoutes, Methods, Request, SystemQueryParameters, contentTypes } from '@browserless.io/browserless';
|
|
2
|
+
import { APITags, BrowserHTTPRoute, BrowserInstance, CDPLaunchOptions, ChromiumCDP, HTTPRoutes, Logger, Methods, Request, SystemQueryParameters, contentTypes } from '@browserless.io/browserless';
|
|
3
3
|
import { ServerResponse } from 'http';
|
|
4
4
|
interface JSONSchema {
|
|
5
5
|
code: string;
|
|
@@ -25,6 +25,6 @@ export default class ChromiumDownloadPostRoute extends BrowserHTTPRoute {
|
|
|
25
25
|
method: Methods;
|
|
26
26
|
path: HTTPRoutes[];
|
|
27
27
|
tags: APITags[];
|
|
28
|
-
handler: (req: Request, res: ServerResponse, browser: BrowserInstance) => Promise<void>;
|
|
28
|
+
handler: (req: Request, res: ServerResponse, logger: Logger, browser: BrowserInstance) => Promise<void>;
|
|
29
29
|
}
|
|
30
30
|
export {};
|