@browserless.io/browserless 2.17.1 → 2.19.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 +15 -1
- package/build/browsers/index.js +6 -2
- package/build/http.d.ts +41 -41
- package/build/http.js +41 -41
- package/build/limiter.spec.js +1 -0
- 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/chrome/tests/content.spec.js +1 -0
- package/build/routes/chrome/ws/page.d.ts +1 -0
- package/build/routes/chrome/ws/page.js +1 -0
- 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/server.js +3 -1
- package/build/shared/json-version.http.js +1 -0
- package/build/shared/utils/function/handler.js +3 -2
- package/build/shared/utils/performance/main.js +2 -1
- package/package.json +16 -26
- package/scripts/build-open-api.js +4 -3
- package/src/browsers/index.ts +6 -2
- package/src/http.ts +41 -41
- package/src/limiter.spec.ts +1 -0
- package/src/routes/chrome/tests/content.spec.ts +1 -0
- package/src/routes/chrome/ws/page.ts +1 -0
- package/src/server.ts +4 -1
- package/src/shared/json-version.http.ts +1 -0
- package/src/shared/utils/function/handler.ts +3 -3
- package/src/shared/utils/performance/main.ts +1 -1
- package/static/docs/swagger.json +12 -12
- package/static/docs/swagger.min.json +11 -11
- package/static/function/client.js +1 -1
- package/static/function/index.html +1 -1
|
@@ -485,14 +485,14 @@
|
|
|
485
485
|
"length": {
|
|
486
486
|
"type": "number"
|
|
487
487
|
},
|
|
488
|
-
"__@toStringTag@
|
|
488
|
+
"__@toStringTag@294540": {
|
|
489
489
|
"type": "string",
|
|
490
490
|
"const": "Uint8Array"
|
|
491
491
|
}
|
|
492
492
|
},
|
|
493
493
|
"required": [
|
|
494
494
|
"BYTES_PER_ELEMENT",
|
|
495
|
-
"__@toStringTag@
|
|
495
|
+
"__@toStringTag@294540",
|
|
496
496
|
"buffer",
|
|
497
497
|
"byteLength",
|
|
498
498
|
"byteOffset",
|
|
@@ -527,13 +527,13 @@
|
|
|
527
527
|
"byteLength": {
|
|
528
528
|
"type": "number"
|
|
529
529
|
},
|
|
530
|
-
"__@toStringTag@
|
|
530
|
+
"__@toStringTag@294540": {
|
|
531
531
|
"type": "string"
|
|
532
532
|
}
|
|
533
533
|
},
|
|
534
534
|
"additionalProperties": false,
|
|
535
535
|
"required": [
|
|
536
|
-
"__@toStringTag@
|
|
536
|
+
"__@toStringTag@294540",
|
|
537
537
|
"byteLength"
|
|
538
538
|
]
|
|
539
539
|
},
|
|
@@ -543,18 +543,18 @@
|
|
|
543
543
|
"byteLength": {
|
|
544
544
|
"type": "number"
|
|
545
545
|
},
|
|
546
|
-
"__@species@
|
|
546
|
+
"__@species@294578": {
|
|
547
547
|
"$ref": "#/definitions/SharedArrayBuffer"
|
|
548
548
|
},
|
|
549
|
-
"__@toStringTag@
|
|
549
|
+
"__@toStringTag@294540": {
|
|
550
550
|
"type": "string",
|
|
551
551
|
"const": "SharedArrayBuffer"
|
|
552
552
|
}
|
|
553
553
|
},
|
|
554
554
|
"additionalProperties": false,
|
|
555
555
|
"required": [
|
|
556
|
-
"__@species@
|
|
557
|
-
"__@toStringTag@
|
|
556
|
+
"__@species@294578",
|
|
557
|
+
"__@toStringTag@294540",
|
|
558
558
|
"byteLength"
|
|
559
559
|
]
|
|
560
560
|
},
|
|
@@ -528,14 +528,14 @@
|
|
|
528
528
|
"length": {
|
|
529
529
|
"type": "number"
|
|
530
530
|
},
|
|
531
|
-
"__@toStringTag@
|
|
531
|
+
"__@toStringTag@308788": {
|
|
532
532
|
"type": "string",
|
|
533
533
|
"const": "Uint8Array"
|
|
534
534
|
}
|
|
535
535
|
},
|
|
536
536
|
"required": [
|
|
537
537
|
"BYTES_PER_ELEMENT",
|
|
538
|
-
"__@toStringTag@
|
|
538
|
+
"__@toStringTag@308788",
|
|
539
539
|
"buffer",
|
|
540
540
|
"byteLength",
|
|
541
541
|
"byteOffset",
|
|
@@ -570,13 +570,13 @@
|
|
|
570
570
|
"byteLength": {
|
|
571
571
|
"type": "number"
|
|
572
572
|
},
|
|
573
|
-
"__@toStringTag@
|
|
573
|
+
"__@toStringTag@308788": {
|
|
574
574
|
"type": "string"
|
|
575
575
|
}
|
|
576
576
|
},
|
|
577
577
|
"additionalProperties": false,
|
|
578
578
|
"required": [
|
|
579
|
-
"__@toStringTag@
|
|
579
|
+
"__@toStringTag@308788",
|
|
580
580
|
"byteLength"
|
|
581
581
|
]
|
|
582
582
|
},
|
|
@@ -586,18 +586,18 @@
|
|
|
586
586
|
"byteLength": {
|
|
587
587
|
"type": "number"
|
|
588
588
|
},
|
|
589
|
-
"__@species@
|
|
589
|
+
"__@species@308826": {
|
|
590
590
|
"$ref": "#/definitions/SharedArrayBuffer"
|
|
591
591
|
},
|
|
592
|
-
"__@toStringTag@
|
|
592
|
+
"__@toStringTag@308788": {
|
|
593
593
|
"type": "string",
|
|
594
594
|
"const": "SharedArrayBuffer"
|
|
595
595
|
}
|
|
596
596
|
},
|
|
597
597
|
"additionalProperties": false,
|
|
598
598
|
"required": [
|
|
599
|
-
"__@species@
|
|
600
|
-
"__@toStringTag@
|
|
599
|
+
"__@species@308826",
|
|
600
|
+
"__@toStringTag@308788",
|
|
601
601
|
"byteLength"
|
|
602
602
|
]
|
|
603
603
|
},
|
package/build/server.js
CHANGED
|
@@ -241,7 +241,9 @@ export class HTTPServer extends EventEmitter {
|
|
|
241
241
|
async shutdown() {
|
|
242
242
|
this.logger.info(`HTTP Server is shutting down`);
|
|
243
243
|
await new Promise((r) => this.server.close(r));
|
|
244
|
-
|
|
244
|
+
if (this.server) {
|
|
245
|
+
this.server.removeAllListeners();
|
|
246
|
+
}
|
|
245
247
|
// @ts-ignore garbage collect this reference
|
|
246
248
|
this.server = null;
|
|
247
249
|
this.logger.info(`HTTP Server shutdown complete`);
|
|
@@ -25,6 +25,7 @@ export default class ChromiumJSONVersionGetRoute extends HTTPRoute {
|
|
|
25
25
|
return jsonResponse(res, 200, this.cachedJSON);
|
|
26
26
|
}
|
|
27
27
|
catch (err) {
|
|
28
|
+
logger.warn(`Error handling request`, err);
|
|
28
29
|
return writeResponse(res, 500, 'There was an error handling your request', contentTypes.text);
|
|
29
30
|
}
|
|
30
31
|
}
|
|
@@ -3,9 +3,10 @@ import fs from 'fs';
|
|
|
3
3
|
import path from 'path';
|
|
4
4
|
export default (config, logger, options = {}) => async (req, browser) => {
|
|
5
5
|
const isJson = req.headers['content-type']?.includes('json');
|
|
6
|
+
const functionPath = HTTPRoutes.function.replace('?(/)', '');
|
|
6
7
|
const functionAssetLocation = path.join(config.getStatic(), 'function');
|
|
7
|
-
const functionRequestPath = makeExternalURL(config.getExternalAddress(),
|
|
8
|
-
const functionIndexHTML = makeExternalURL(config.getExternalAddress(),
|
|
8
|
+
const functionRequestPath = makeExternalURL(config.getExternalAddress(), functionPath);
|
|
9
|
+
const functionIndexHTML = makeExternalURL(config.getExternalAddress(), functionPath, '/index.html');
|
|
9
10
|
const { code: rawCode, context: rawContext } = isJson
|
|
10
11
|
? req.body
|
|
11
12
|
: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@browserless.io/browserless",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.19.0",
|
|
4
4
|
"license": "SSPL",
|
|
5
5
|
"description": "The browserless platform",
|
|
6
6
|
"author": "browserless.io",
|
|
@@ -56,48 +56,47 @@
|
|
|
56
56
|
"gradient-string": "^2.0.0",
|
|
57
57
|
"http-proxy": "^1.18.1",
|
|
58
58
|
"lighthouse": "^12.2.0",
|
|
59
|
-
"micromatch": "^4.0.
|
|
59
|
+
"micromatch": "^4.0.8",
|
|
60
60
|
"playwright-1.41": "npm:playwright-core@1.41.2",
|
|
61
61
|
"playwright-1.42": "npm:playwright-core@1.42.1",
|
|
62
62
|
"playwright-1.43": "npm:playwright-core@1.43.1",
|
|
63
63
|
"playwright-1.44": "npm:playwright-core@1.44.1",
|
|
64
|
-
"playwright-core": "^1.46.
|
|
65
|
-
"puppeteer-core": "^23.1
|
|
64
|
+
"playwright-core": "^1.46.1",
|
|
65
|
+
"puppeteer-core": "^23.2.1",
|
|
66
66
|
"puppeteer-extra": "^3.3.6",
|
|
67
67
|
"puppeteer-extra-plugin-stealth": "^2.11.2",
|
|
68
68
|
"queue": "^7.0.0",
|
|
69
|
-
"systeminformation": "^5.23.
|
|
69
|
+
"systeminformation": "^5.23.5",
|
|
70
70
|
"tar-fs": "^3.0.6"
|
|
71
71
|
},
|
|
72
72
|
"optionalDependencies": {
|
|
73
|
-
"@types/chai": "^4.3.
|
|
73
|
+
"@types/chai": "^4.3.18",
|
|
74
74
|
"@types/debug": "^4.1.12",
|
|
75
75
|
"@types/gradient-string": "^1.1.6",
|
|
76
76
|
"@types/http-proxy": "^1.17.15",
|
|
77
77
|
"@types/micromatch": "^4.0.9",
|
|
78
78
|
"@types/mocha": "^10.0.7",
|
|
79
|
-
"@types/node": "^22.
|
|
79
|
+
"@types/node": "^22.5.2",
|
|
80
80
|
"@types/sinon": "^17.0.3",
|
|
81
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
82
|
-
"@typescript-eslint/parser": "^
|
|
81
|
+
"@typescript-eslint/eslint-plugin": "^8.4.0",
|
|
82
|
+
"@typescript-eslint/parser": "^8.4.0",
|
|
83
83
|
"assert": "^2.0.0",
|
|
84
84
|
"chai": "^5.1.1",
|
|
85
85
|
"cross-env": "^7.0.3",
|
|
86
86
|
"env-cmd": "^10.1.0",
|
|
87
|
-
"esbuild": "^0.23.
|
|
87
|
+
"esbuild": "^0.23.1",
|
|
88
88
|
"esbuild-plugin-polyfill-node": "^0.3.0",
|
|
89
89
|
"eslint": "^8.57.0",
|
|
90
|
-
"eslint-plugin-typescript-sort-keys": "^3.2.0",
|
|
91
90
|
"extract-zip": "^2.0.1",
|
|
92
91
|
"gunzip-maybe": "^1.4.2",
|
|
93
|
-
"marked": "^14.
|
|
92
|
+
"marked": "^14.1.0",
|
|
94
93
|
"mocha": "^10.7.3",
|
|
95
94
|
"move-file": "^3.1.0",
|
|
96
95
|
"prettier": "^3.3.3",
|
|
97
96
|
"sinon": "^18.0.0",
|
|
98
97
|
"ts-node": "^10.9.2",
|
|
99
98
|
"typescript": "^5.5.4",
|
|
100
|
-
"typescript-json-schema": "^0.
|
|
99
|
+
"typescript-json-schema": "^0.65.1"
|
|
101
100
|
},
|
|
102
101
|
"playwrightVersions": {
|
|
103
102
|
"default": "playwright-core",
|
|
@@ -111,32 +110,23 @@
|
|
|
111
110
|
"root": true,
|
|
112
111
|
"parser": "@typescript-eslint/parser",
|
|
113
112
|
"plugins": [
|
|
114
|
-
"@typescript-eslint"
|
|
115
|
-
"typescript-sort-keys"
|
|
113
|
+
"@typescript-eslint"
|
|
116
114
|
],
|
|
117
115
|
"extends": [
|
|
118
116
|
"eslint:recommended",
|
|
119
117
|
"plugin:@typescript-eslint/eslint-recommended",
|
|
120
|
-
"plugin:@typescript-eslint/recommended"
|
|
121
|
-
"plugin:typescript-sort-keys/recommended"
|
|
118
|
+
"plugin:@typescript-eslint/recommended"
|
|
122
119
|
],
|
|
123
120
|
"ignorePatterns": [
|
|
124
121
|
"node_modules/*",
|
|
122
|
+
"static/*",
|
|
123
|
+
"**.spec.ts",
|
|
125
124
|
"build/*",
|
|
126
125
|
".DS_Store",
|
|
127
126
|
".no-git/*",
|
|
128
127
|
"*.log"
|
|
129
128
|
],
|
|
130
129
|
"rules": {
|
|
131
|
-
"sort-keys": [
|
|
132
|
-
"error",
|
|
133
|
-
"asc",
|
|
134
|
-
{
|
|
135
|
-
"caseSensitive": true,
|
|
136
|
-
"natural": false,
|
|
137
|
-
"minKeys": 2
|
|
138
|
-
}
|
|
139
|
-
],
|
|
140
130
|
"semi": [
|
|
141
131
|
2,
|
|
142
132
|
"always"
|
|
@@ -109,9 +109,10 @@ const buildOpenAPI = async (
|
|
|
109
109
|
const query = routeModule.replace('.js', '.query.json');
|
|
110
110
|
const response = routeModule.replace('.js', '.response.json');
|
|
111
111
|
const isWebSocket = routeModule.includes('/ws/') || name.endsWith('ws');
|
|
112
|
-
const path =
|
|
113
|
-
? route.path.join(' ')
|
|
114
|
-
|
|
112
|
+
const path = (
|
|
113
|
+
Array.isArray(route.path) ? route.path.join(' ') : route.path
|
|
114
|
+
).replace(/\?\(\/\)/g, '');
|
|
115
|
+
|
|
115
116
|
const {
|
|
116
117
|
tags,
|
|
117
118
|
description,
|
package/src/browsers/index.ts
CHANGED
|
@@ -255,12 +255,16 @@ export class BrowserManager {
|
|
|
255
255
|
},
|
|
256
256
|
});
|
|
257
257
|
if (response.ok) {
|
|
258
|
+
const externalUrl = new URL(serverAddress);
|
|
259
|
+
const protocol = externalUrl.protocol === 'https:' ? 'wss' : 'ws';
|
|
258
260
|
const body = await response.json();
|
|
259
261
|
for (const page of body) {
|
|
262
|
+
const devtoolsFrontendUrl = `/devtools/inspector.html?${protocol}=${externalUrl.host}${externalUrl.pathname}/devtools/page/${page.id}`;
|
|
260
263
|
sessions.push({
|
|
261
264
|
...sessions[0],
|
|
262
265
|
...page,
|
|
263
266
|
browserWSEndpoint: wsEndpoint,
|
|
267
|
+
devtoolsFrontendUrl,
|
|
264
268
|
});
|
|
265
269
|
}
|
|
266
270
|
}
|
|
@@ -299,8 +303,8 @@ export class BrowserManager {
|
|
|
299
303
|
global.setTimeout(() => {
|
|
300
304
|
const session = this.browsers.get(browser);
|
|
301
305
|
if (session) {
|
|
302
|
-
this.log.trace(`Timer hit for "${session.id}"`)
|
|
303
|
-
|
|
306
|
+
this.log.trace(`Timer hit for "${session.id}"`);
|
|
307
|
+
this.close(browser, session);
|
|
304
308
|
}
|
|
305
309
|
}, timeout),
|
|
306
310
|
);
|
package/src/http.ts
CHANGED
|
@@ -82,54 +82,54 @@ export enum Methods {
|
|
|
82
82
|
export enum WebsocketRoutes {
|
|
83
83
|
'/' = '?(/)',
|
|
84
84
|
browser = '/devtools/browser/*',
|
|
85
|
-
chrome = '/chrome',
|
|
86
|
-
chromePlaywright = '/chrome/playwright',
|
|
87
|
-
chromium = '/chromium',
|
|
88
|
-
chromiumPlaywright = '/chromium/playwright',
|
|
89
|
-
firefoxPlaywright = '/firefox/playwright',
|
|
85
|
+
chrome = '/chrome?(/)',
|
|
86
|
+
chromePlaywright = '/chrome/playwright?(/)',
|
|
87
|
+
chromium = '/chromium?(/)',
|
|
88
|
+
chromiumPlaywright = '/chromium/playwright?(/)',
|
|
89
|
+
firefoxPlaywright = '/firefox/playwright?(/)',
|
|
90
90
|
page = '/devtools/page/*',
|
|
91
|
-
playwrightChrome = '/playwright/chrome',
|
|
92
|
-
playwrightChromium = '/playwright/chromium',
|
|
93
|
-
playwrightFirefox = '/playwright/firefox',
|
|
94
|
-
playwrightWebkit = '/playwright/webkit',
|
|
95
|
-
webkitPlaywright = '/webkit/playwright',
|
|
91
|
+
playwrightChrome = '/playwright/chrome?(/)',
|
|
92
|
+
playwrightChromium = '/playwright/chromium?(/)',
|
|
93
|
+
playwrightFirefox = '/playwright/firefox?(/)',
|
|
94
|
+
playwrightWebkit = '/playwright/webkit?(/)',
|
|
95
|
+
webkitPlaywright = '/webkit/playwright?(/)',
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
export enum HTTPRoutes {
|
|
99
|
-
chromeContent = '/chrome/content',
|
|
100
|
-
chromeDownload = '/chrome/download',
|
|
101
|
-
chromeFunction = '/chrome/function',
|
|
102
|
-
chromePdf = '/chrome/pdf',
|
|
103
|
-
chromePerformance = '/chrome/performance',
|
|
104
|
-
chromeScrape = '/chrome/scrape',
|
|
105
|
-
chromeScreenshot = '/chrome/screenshot',
|
|
106
|
-
chromiumContent = '/chromium/content',
|
|
107
|
-
chromiumDownload = '/chromium/download',
|
|
108
|
-
chromiumFunction = '/chromium/function',
|
|
109
|
-
chromiumPdf = '/chromium/pdf',
|
|
110
|
-
chromiumPerformance = '/chromium/performance',
|
|
111
|
-
chromiumScrape = '/chromium/scrape',
|
|
112
|
-
chromiumScreenshot = '/chromium/screenshot',
|
|
113
|
-
content = '/content',
|
|
114
|
-
download = '/download',
|
|
115
|
-
function = '/function',
|
|
116
|
-
jsonList = '/json/list',
|
|
117
|
-
jsonNew = '/json/new',
|
|
118
|
-
jsonProtocol = '/json/protocol',
|
|
119
|
-
jsonVersion = '/json/version',
|
|
120
|
-
pdf = '/pdf',
|
|
121
|
-
performance = '/performance',
|
|
122
|
-
scrape = '/scrape',
|
|
123
|
-
screenshot = '/screenshot',
|
|
99
|
+
chromeContent = '/chrome/content?(/)',
|
|
100
|
+
chromeDownload = '/chrome/download?(/)',
|
|
101
|
+
chromeFunction = '/chrome/function?(/)',
|
|
102
|
+
chromePdf = '/chrome/pdf?(/)',
|
|
103
|
+
chromePerformance = '/chrome/performance?(/)',
|
|
104
|
+
chromeScrape = '/chrome/scrape?(/)',
|
|
105
|
+
chromeScreenshot = '/chrome/screenshot?(/)',
|
|
106
|
+
chromiumContent = '/chromium/content?(/)',
|
|
107
|
+
chromiumDownload = '/chromium/download?(/)',
|
|
108
|
+
chromiumFunction = '/chromium/function?(/)',
|
|
109
|
+
chromiumPdf = '/chromium/pdf?(/)',
|
|
110
|
+
chromiumPerformance = '/chromium/performance?(/)',
|
|
111
|
+
chromiumScrape = '/chromium/scrape?(/)',
|
|
112
|
+
chromiumScreenshot = '/chromium/screenshot?(/)',
|
|
113
|
+
content = '/content?(/)',
|
|
114
|
+
download = '/download?(/)',
|
|
115
|
+
function = '/function?(/)',
|
|
116
|
+
jsonList = '/json/list?(/)',
|
|
117
|
+
jsonNew = '/json/new?(/)',
|
|
118
|
+
jsonProtocol = '/json/protocol?(/)',
|
|
119
|
+
jsonVersion = '/json/version?(/)',
|
|
120
|
+
pdf = '/pdf?(/)',
|
|
121
|
+
performance = '/performance?(/)',
|
|
122
|
+
scrape = '/scrape?(/)',
|
|
123
|
+
screenshot = '/screenshot?(/)',
|
|
124
124
|
}
|
|
125
125
|
|
|
126
126
|
export enum HTTPManagementRoutes {
|
|
127
|
-
active = '/active',
|
|
128
|
-
config = '/config',
|
|
129
|
-
metrics = '/metrics',
|
|
130
|
-
metricsTotal = '/metrics/total',
|
|
131
|
-
pressure = '/pressure',
|
|
132
|
-
sessions = '/sessions',
|
|
127
|
+
active = '/active?(/)',
|
|
128
|
+
config = '/config?(/)',
|
|
129
|
+
metrics = '/metrics?(/)',
|
|
130
|
+
metricsTotal = '/metrics/total?(/)',
|
|
131
|
+
pressure = '/pressure?(/)',
|
|
132
|
+
sessions = '/sessions?(/)',
|
|
133
133
|
static = '/',
|
|
134
134
|
}
|
|
135
135
|
|
package/src/limiter.spec.ts
CHANGED
package/src/server.ts
CHANGED
|
@@ -415,7 +415,10 @@ export class HTTPServer extends EventEmitter {
|
|
|
415
415
|
public async shutdown(): Promise<void> {
|
|
416
416
|
this.logger.info(`HTTP Server is shutting down`);
|
|
417
417
|
await new Promise((r) => this.server.close(r));
|
|
418
|
-
|
|
418
|
+
|
|
419
|
+
if (this.server) {
|
|
420
|
+
this.server.removeAllListeners();
|
|
421
|
+
}
|
|
419
422
|
|
|
420
423
|
// @ts-ignore garbage collect this reference
|
|
421
424
|
this.server = null;
|
|
@@ -41,15 +41,15 @@ export default (config: Config, logger: Logger, options: HandlerOptions = {}) =>
|
|
|
41
41
|
browser: BrowserInstance,
|
|
42
42
|
): Promise<{ contentType: string; page: Page; payload: unknown }> => {
|
|
43
43
|
const isJson = req.headers['content-type']?.includes('json');
|
|
44
|
-
|
|
44
|
+
const functionPath = HTTPRoutes.function.replace('?(/)', '');
|
|
45
45
|
const functionAssetLocation = path.join(config.getStatic(), 'function');
|
|
46
46
|
const functionRequestPath = makeExternalURL(
|
|
47
47
|
config.getExternalAddress(),
|
|
48
|
-
|
|
48
|
+
functionPath,
|
|
49
49
|
);
|
|
50
50
|
const functionIndexHTML = makeExternalURL(
|
|
51
51
|
config.getExternalAddress(),
|
|
52
|
-
|
|
52
|
+
functionPath,
|
|
53
53
|
'/index.html',
|
|
54
54
|
);
|
|
55
55
|
|