@browserless.io/browserless 2.12.0-beta-4 → 2.12.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/bin/scaffold/README.md +6 -5
- package/bin/scaffold/src/hello-world.http.ts +3 -3
- package/build/browserless.d.ts +3 -3
- package/build/browserless.js +6 -6
- package/build/browsers/chromium.cdp.d.ts +12 -12
- package/build/browsers/chromium.cdp.js +77 -65
- package/build/browsers/chromium.playwright.d.ts +11 -11
- package/build/browsers/chromium.playwright.js +42 -34
- package/build/browsers/firefox.playwright.d.ts +11 -11
- package/build/browsers/firefox.playwright.js +42 -34
- package/build/browsers/index.d.ts +14 -14
- package/build/browsers/index.js +27 -25
- package/build/browsers/webkit.playwright.d.ts +11 -11
- package/build/browsers/webkit.playwright.js +43 -35
- package/build/config.d.ts +65 -63
- package/build/config.js +162 -102
- package/build/file-system.d.ts +4 -4
- package/build/file-system.js +8 -8
- package/build/hooks.d.ts +2 -2
- package/build/hooks.js +4 -4
- package/build/limiter.d.ts +4 -4
- package/build/limiter.js +10 -10
- package/build/logger.d.ts +6 -6
- package/build/logger.js +12 -12
- package/build/metrics.d.ts +12 -12
- package/build/metrics.js +23 -23
- package/build/monitoring.d.ts +4 -4
- package/build/monitoring.js +8 -8
- package/build/router.d.ts +8 -8
- package/build/router.js +74 -70
- 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/firefox/ws/playwright.d.ts +1 -1
- package/build/routes/firefox/ws/playwright.js +2 -2
- package/build/routes/management/http/active.get.d.ts +1 -1
- package/build/routes/management/http/active.get.js +3 -1
- package/build/routes/management/http/config.get.d.ts +1 -1
- package/build/routes/management/http/config.get.js +2 -2
- package/build/routes/management/http/metrics-total.get.d.ts +1 -1
- package/build/routes/management/http/metrics-total.get.js +2 -2
- package/build/routes/management/http/metrics.get.d.ts +1 -1
- package/build/routes/management/http/metrics.get.js +2 -2
- package/build/routes/management/http/pressure.get.d.ts +1 -1
- package/build/routes/management/http/pressure.get.js +2 -2
- package/build/routes/management/http/sessions.get.d.ts +1 -1
- package/build/routes/management/http/sessions.get.js +2 -2
- package/build/routes/management/http/static.get.d.ts +1 -1
- package/build/routes/management/http/static.get.js +2 -2
- package/build/routes/webkit/ws/playwright.d.ts +1 -1
- package/build/routes/webkit/ws/playwright.js +2 -2
- package/build/server.d.ts +5 -5
- package/build/server.js +11 -11
- package/build/shared/browser.ws.d.ts +1 -1
- package/build/shared/browser.ws.js +3 -1
- package/build/shared/chromium.playwright.ws.d.ts +1 -1
- package/build/shared/chromium.playwright.ws.js +2 -2
- package/build/shared/chromium.ws.d.ts +1 -1
- package/build/shared/chromium.ws.js +3 -1
- package/build/shared/content.http.d.ts +1 -1
- package/build/shared/content.http.js +2 -2
- package/build/shared/download.http.d.ts +1 -1
- package/build/shared/download.http.js +60 -58
- package/build/shared/function.http.d.ts +1 -1
- package/build/shared/function.http.js +2 -2
- package/build/shared/json-list.http.d.ts +1 -1
- package/build/shared/json-list.http.js +2 -2
- package/build/shared/json-new.http.d.ts +1 -1
- package/build/shared/json-new.http.js +2 -2
- package/build/shared/json-protocol.http.d.ts +1 -1
- package/build/shared/json-protocol.http.js +2 -2
- package/build/shared/json-version.http.d.ts +1 -1
- package/build/shared/json-version.http.js +2 -2
- package/build/shared/page.ws.d.ts +1 -1
- package/build/shared/page.ws.js +3 -1
- package/build/shared/pdf.http.d.ts +1 -1
- package/build/shared/pdf.http.js +2 -2
- package/build/shared/performance.http.d.ts +1 -1
- package/build/shared/performance.http.js +2 -2
- package/build/shared/scrape.http.d.ts +1 -1
- package/build/shared/scrape.http.js +2 -2
- package/build/shared/screenshot.http.d.ts +1 -1
- package/build/shared/screenshot.http.js +2 -2
- package/build/shared/utils/function/client.d.ts +1 -1
- package/build/shared/utils/function/client.js +3 -1
- package/build/shim.d.ts +1 -1
- package/build/shim.js +2 -2
- package/build/token.d.ts +3 -3
- package/build/token.js +6 -6
- package/build/types.d.ts +4 -4
- package/build/webhooks.d.ts +2 -2
- package/build/webhooks.js +4 -4
- package/package.json +3 -3
- package/src/browserless.ts +6 -6
- package/src/browsers/chromium.cdp.ts +33 -23
- package/src/browsers/chromium.playwright.ts +28 -21
- package/src/browsers/firefox.playwright.ts +28 -21
- package/src/browsers/index.ts +32 -29
- package/src/browsers/webkit.playwright.ts +29 -22
- package/src/config.ts +166 -104
- package/src/file-system.ts +9 -9
- package/src/hooks.ts +4 -4
- package/src/limiter.ts +12 -12
- package/src/logger.ts +12 -12
- package/src/metrics.ts +23 -23
- package/src/monitoring.ts +9 -9
- package/src/router.ts +31 -31
- package/src/routes/firefox/ws/playwright.ts +3 -3
- package/src/routes/management/http/active.get.ts +3 -2
- package/src/routes/management/http/config.get.ts +2 -2
- package/src/routes/management/http/metrics-total.get.ts +2 -2
- package/src/routes/management/http/metrics.get.ts +2 -2
- package/src/routes/management/http/pressure.get.ts +2 -2
- package/src/routes/management/http/sessions.get.ts +2 -2
- package/src/routes/management/http/static.get.ts +3 -3
- package/src/routes/webkit/ws/playwright.ts +3 -3
- package/src/server.ts +14 -16
- package/src/shared/browser.ws.ts +4 -2
- package/src/shared/chromium.playwright.ws.ts +3 -3
- package/src/shared/chromium.ws.ts +4 -2
- package/src/shared/content.http.ts +3 -3
- package/src/shared/download.http.ts +4 -3
- package/src/shared/function.http.ts +3 -3
- package/src/shared/json-list.http.ts +2 -2
- package/src/shared/json-new.http.ts +2 -2
- package/src/shared/json-protocol.http.ts +2 -6
- package/src/shared/json-version.http.ts +2 -6
- package/src/shared/page.ws.ts +4 -2
- package/src/shared/pdf.http.ts +3 -3
- package/src/shared/performance.http.ts +3 -3
- package/src/shared/scrape.http.ts +3 -3
- package/src/shared/screenshot.http.ts +3 -3
- package/src/shared/utils/function/client.ts +3 -1
- package/src/shim.ts +2 -2
- package/src/token.ts +7 -7
- package/src/types.ts +7 -7
- package/src/webhooks.ts +4 -4
- package/static/docs/swagger.json +2 -2
- package/static/docs/swagger.min.json +1 -1
- package/static/function/client.js +3 -1
- package/static/function/index.html +3 -1
|
@@ -10,28 +10,28 @@ export declare class BrowserManager {
|
|
|
10
10
|
protected chromeBrowsers: (typeof ChromiumCDP)[];
|
|
11
11
|
protected playwrightBrowserNames: string[];
|
|
12
12
|
constructor(config: Config, hooks: Hooks);
|
|
13
|
-
protected browserIsChrome
|
|
14
|
-
protected removeUserDataDir
|
|
15
|
-
protected onNewPage
|
|
13
|
+
protected browserIsChrome(b: BrowserInstance): boolean;
|
|
14
|
+
protected removeUserDataDir(userDataDir: string | null): Promise<void>;
|
|
15
|
+
protected onNewPage(req: Request, page: Page): Promise<unknown>;
|
|
16
16
|
/**
|
|
17
17
|
* Returns the /json/protocol API contents from Chromium or Chrome, whichever is installed,
|
|
18
18
|
* and modifies URLs to set them to the appropriate addresses configured.
|
|
19
19
|
* When both Chrome and Chromium are installed, defaults to Chromium.
|
|
20
20
|
*/
|
|
21
|
-
getProtocolJSON
|
|
21
|
+
getProtocolJSON(logger: Logger): Promise<object>;
|
|
22
22
|
/**
|
|
23
23
|
* Returns the /json/version API from Chromium or Chrome, whichever is installed,
|
|
24
24
|
* and modifies URLs to set them to the appropriate addresses configured.
|
|
25
25
|
* When both Chrome and Chromium are installed, defaults to Chromium.
|
|
26
26
|
*/
|
|
27
|
-
getVersionJSON
|
|
27
|
+
getVersionJSON(logger: Logger): Promise<CDPJSONPayload>;
|
|
28
28
|
/**
|
|
29
29
|
* Returns a list of all Chrome-like browsers (both Chromium and Chrome) with
|
|
30
30
|
* their respective /json/list contents. URLs are modified so that subsequent
|
|
31
31
|
* calls can be forwarded to the appropriate destination
|
|
32
32
|
*/
|
|
33
|
-
getJSONList
|
|
34
|
-
protected generateSessionJson
|
|
33
|
+
getJSONList(): Promise<Array<CDPJSONPayload>>;
|
|
34
|
+
protected generateSessionJson(browser: BrowserInstance, session: BrowserlessSession): Promise<{
|
|
35
35
|
browser: string;
|
|
36
36
|
browserId: string;
|
|
37
37
|
initialConnectURL: string;
|
|
@@ -43,19 +43,19 @@ export declare class BrowserManager {
|
|
|
43
43
|
isTempDataDir: boolean;
|
|
44
44
|
launchOptions: CDPLaunchOptions | BrowserServerOptions;
|
|
45
45
|
numbConnected: number;
|
|
46
|
-
resolver
|
|
46
|
+
resolver(val: unknown): void;
|
|
47
47
|
routePath: string | string[];
|
|
48
48
|
startedOn: number;
|
|
49
49
|
ttl: number;
|
|
50
50
|
userDataDir: string | null;
|
|
51
51
|
}[]>;
|
|
52
|
-
close
|
|
53
|
-
getAllSessions
|
|
54
|
-
complete
|
|
55
|
-
getBrowserForRequest
|
|
56
|
-
shutdown
|
|
52
|
+
close(browser: BrowserInstance, session: BrowserlessSession): Promise<void>;
|
|
53
|
+
getAllSessions(): Promise<BrowserlessSessionJSON[]>;
|
|
54
|
+
complete(browser: BrowserInstance): Promise<void>;
|
|
55
|
+
getBrowserForRequest(req: Request, router: BrowserHTTPRoute | BrowserWebsocketRoute, logger: Logger): Promise<BrowserInstance>;
|
|
56
|
+
shutdown(): Promise<void>;
|
|
57
57
|
/**
|
|
58
58
|
* Left blank for downstream SDK modules to optionally implement.
|
|
59
59
|
*/
|
|
60
|
-
stop
|
|
60
|
+
stop(): void;
|
|
61
61
|
}
|
package/build/browsers/index.js
CHANGED
|
@@ -18,24 +18,26 @@ export class BrowserManager {
|
|
|
18
18
|
this.config = config;
|
|
19
19
|
this.hooks = hooks;
|
|
20
20
|
}
|
|
21
|
-
browserIsChrome
|
|
22
|
-
|
|
21
|
+
browserIsChrome(b) {
|
|
22
|
+
return this.chromeBrowsers.some((chromeBrowser) => b instanceof chromeBrowser);
|
|
23
|
+
}
|
|
24
|
+
async removeUserDataDir(userDataDir) {
|
|
23
25
|
if (userDataDir && (await exists(userDataDir))) {
|
|
24
26
|
this.log.info(`Deleting data directory "${userDataDir}"`);
|
|
25
27
|
await deleteAsync(userDataDir, { force: true }).catch((err) => {
|
|
26
28
|
this.log.error(`Error cleaning up user-data-dir "${err}" at ${userDataDir}`);
|
|
27
29
|
});
|
|
28
30
|
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
await this.hooks.page({ meta: req.parsed, page });
|
|
32
|
-
}
|
|
31
|
+
}
|
|
32
|
+
async onNewPage(req, page) {
|
|
33
|
+
return await this.hooks.page({ meta: req.parsed, page });
|
|
34
|
+
}
|
|
33
35
|
/**
|
|
34
36
|
* Returns the /json/protocol API contents from Chromium or Chrome, whichever is installed,
|
|
35
37
|
* and modifies URLs to set them to the appropriate addresses configured.
|
|
36
38
|
* When both Chrome and Chromium are installed, defaults to Chromium.
|
|
37
39
|
*/
|
|
38
|
-
|
|
40
|
+
async getProtocolJSON(logger) {
|
|
39
41
|
const Browser = (await availableBrowsers).find((InstalledBrowser) => this.chromeBrowsers.some((ChromeBrowser) => InstalledBrowser === ChromeBrowser));
|
|
40
42
|
if (!Browser) {
|
|
41
43
|
throw new Error(`No Chrome or Chromium browsers are installed!`);
|
|
@@ -56,13 +58,13 @@ export class BrowserManager {
|
|
|
56
58
|
const protocolJSON = await res.json();
|
|
57
59
|
browser.close();
|
|
58
60
|
return protocolJSON;
|
|
59
|
-
}
|
|
61
|
+
}
|
|
60
62
|
/**
|
|
61
63
|
* Returns the /json/version API from Chromium or Chrome, whichever is installed,
|
|
62
64
|
* and modifies URLs to set them to the appropriate addresses configured.
|
|
63
65
|
* When both Chrome and Chromium are installed, defaults to Chromium.
|
|
64
66
|
*/
|
|
65
|
-
|
|
67
|
+
async getVersionJSON(logger) {
|
|
66
68
|
this.log.info(`Launching Chromium to generate /json/version results`);
|
|
67
69
|
const Browser = (await availableBrowsers).find((InstalledBrowser) => this.chromeBrowsers.some((ChromeBrowser) => InstalledBrowser === ChromeBrowser));
|
|
68
70
|
if (!Browser) {
|
|
@@ -90,13 +92,13 @@ export class BrowserManager {
|
|
|
90
92
|
'Debugger-Version': debuggerVersion,
|
|
91
93
|
webSocketDebuggerUrl: this.config.getExternalWebSocketAddress(),
|
|
92
94
|
};
|
|
93
|
-
}
|
|
95
|
+
}
|
|
94
96
|
/**
|
|
95
97
|
* Returns a list of all Chrome-like browsers (both Chromium and Chrome) with
|
|
96
98
|
* their respective /json/list contents. URLs are modified so that subsequent
|
|
97
99
|
* calls can be forwarded to the appropriate destination
|
|
98
100
|
*/
|
|
99
|
-
|
|
101
|
+
async getJSONList() {
|
|
100
102
|
const externalAddress = this.config.getExternalWebSocketAddress();
|
|
101
103
|
const externalURL = new URL(externalAddress);
|
|
102
104
|
const sessions = Array.from(this.browsers);
|
|
@@ -138,8 +140,8 @@ export class BrowserManager {
|
|
|
138
140
|
return cdpResponse
|
|
139
141
|
.flat()
|
|
140
142
|
.filter((_) => _ !== null);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
+
}
|
|
144
|
+
async generateSessionJson(browser, session) {
|
|
143
145
|
const serverAddress = this.config.getExternalAddress();
|
|
144
146
|
const sessions = [
|
|
145
147
|
{
|
|
@@ -176,8 +178,8 @@ export class BrowserManager {
|
|
|
176
178
|
}
|
|
177
179
|
}
|
|
178
180
|
return sessions;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
+
}
|
|
182
|
+
async close(browser, session) {
|
|
181
183
|
const now = Date.now();
|
|
182
184
|
const keepUntil = browser.keepUntil();
|
|
183
185
|
const connected = session.numbConnected;
|
|
@@ -211,8 +213,8 @@ export class BrowserManager {
|
|
|
211
213
|
}
|
|
212
214
|
await Promise.all(cleanupACtions.map((a) => a()));
|
|
213
215
|
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
+
}
|
|
217
|
+
async getAllSessions() {
|
|
216
218
|
const sessions = Array.from(this.browsers);
|
|
217
219
|
const formattedSessions = [];
|
|
218
220
|
for (const [browser, session] of sessions) {
|
|
@@ -220,8 +222,8 @@ export class BrowserManager {
|
|
|
220
222
|
formattedSessions.push(...formattedSession);
|
|
221
223
|
}
|
|
222
224
|
return formattedSessions;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
+
}
|
|
226
|
+
async complete(browser) {
|
|
225
227
|
const session = this.browsers.get(browser);
|
|
226
228
|
if (!session) {
|
|
227
229
|
this.log.info(`Couldn't locate session for browser, proceeding with close`);
|
|
@@ -233,8 +235,8 @@ export class BrowserManager {
|
|
|
233
235
|
}
|
|
234
236
|
--session.numbConnected;
|
|
235
237
|
this.close(browser, session);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
+
}
|
|
239
|
+
async getBrowserForRequest(req, router, logger) {
|
|
238
240
|
const { browser: Browser } = router;
|
|
239
241
|
const blockAds = parseBooleanParam(req.parsed.searchParams, 'blockAds', false);
|
|
240
242
|
const decodedLaunchOptions = convertIfBase64(req.parsed.searchParams.get('launch') || '{}');
|
|
@@ -348,8 +350,8 @@ export class BrowserManager {
|
|
|
348
350
|
(router.onNewPage || noop)(req.parsed || '', page);
|
|
349
351
|
});
|
|
350
352
|
return browser;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
+
}
|
|
354
|
+
async shutdown() {
|
|
353
355
|
this.log.info(`Closing down browser instances`);
|
|
354
356
|
const sessions = Array.from(this.browsers);
|
|
355
357
|
await Promise.all(sessions.map(([b]) => b.close()));
|
|
@@ -360,9 +362,9 @@ export class BrowserManager {
|
|
|
360
362
|
this.timers = new Map();
|
|
361
363
|
await this.stop();
|
|
362
364
|
this.log.info(`Shutdown complete`);
|
|
363
|
-
}
|
|
365
|
+
}
|
|
364
366
|
/**
|
|
365
367
|
* Left blank for downstream SDK modules to optionally implement.
|
|
366
368
|
*/
|
|
367
|
-
stop
|
|
369
|
+
stop() { }
|
|
368
370
|
}
|
|
@@ -22,15 +22,15 @@ export declare class WebkitPlaywright extends EventEmitter {
|
|
|
22
22
|
});
|
|
23
23
|
protected cleanListeners(): void;
|
|
24
24
|
keepUntil(): number;
|
|
25
|
-
isRunning
|
|
26
|
-
close
|
|
27
|
-
pages
|
|
28
|
-
getPageId
|
|
29
|
-
makeLiveURL
|
|
30
|
-
newPage
|
|
31
|
-
launch
|
|
32
|
-
wsEndpoint
|
|
33
|
-
publicWSEndpoint
|
|
34
|
-
proxyPageWebSocket
|
|
35
|
-
proxyWebSocket
|
|
25
|
+
isRunning(): boolean;
|
|
26
|
+
close(): Promise<void>;
|
|
27
|
+
pages(): Promise<[]>;
|
|
28
|
+
getPageId(): string;
|
|
29
|
+
makeLiveURL(): void;
|
|
30
|
+
newPage(): Promise<Page>;
|
|
31
|
+
launch(options?: BrowserServerOptions, version?: string): Promise<playwright.BrowserServer>;
|
|
32
|
+
wsEndpoint(): string | null;
|
|
33
|
+
publicWSEndpoint(token: string | null): string | null;
|
|
34
|
+
proxyPageWebSocket(): Promise<void>;
|
|
35
|
+
proxyWebSocket(req: Request, socket: Duplex, head: Buffer): Promise<void>;
|
|
36
36
|
}
|
|
@@ -24,8 +24,10 @@ export class WebkitPlaywright extends EventEmitter {
|
|
|
24
24
|
keepUntil() {
|
|
25
25
|
return 0;
|
|
26
26
|
}
|
|
27
|
-
isRunning
|
|
28
|
-
|
|
27
|
+
isRunning() {
|
|
28
|
+
return this.running;
|
|
29
|
+
}
|
|
30
|
+
async close() {
|
|
29
31
|
if (this.browser) {
|
|
30
32
|
this.logger.info(`Closing ${this.constructor.name} process and all listeners`);
|
|
31
33
|
this.emit('close');
|
|
@@ -35,18 +37,20 @@ export class WebkitPlaywright extends EventEmitter {
|
|
|
35
37
|
this.browser = null;
|
|
36
38
|
this.browserWSEndpoint = null;
|
|
37
39
|
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
}
|
|
41
|
+
async pages() {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
getPageId() {
|
|
41
45
|
throw new ServerError(`#getPageId is not yet supported with ${this.constructor.name}.`);
|
|
42
|
-
}
|
|
43
|
-
makeLiveURL
|
|
46
|
+
}
|
|
47
|
+
makeLiveURL() {
|
|
44
48
|
throw new ServerError(`Live URLs are not yet supported with ${this.constructor.name}.`);
|
|
45
|
-
}
|
|
46
|
-
|
|
49
|
+
}
|
|
50
|
+
async newPage() {
|
|
47
51
|
throw new ServerError(`Can't create new page with ${this.constructor.name}`);
|
|
48
|
-
}
|
|
49
|
-
|
|
52
|
+
}
|
|
53
|
+
async launch(options = {}, version) {
|
|
50
54
|
this.logger.info(`Launching ${this.constructor.name} Handler`);
|
|
51
55
|
const opts = {
|
|
52
56
|
...options,
|
|
@@ -63,9 +67,11 @@ export class WebkitPlaywright extends EventEmitter {
|
|
|
63
67
|
this.browserWSEndpoint = browserWSEndpoint;
|
|
64
68
|
this.running = true;
|
|
65
69
|
return this.browser;
|
|
66
|
-
}
|
|
67
|
-
wsEndpoint
|
|
68
|
-
|
|
70
|
+
}
|
|
71
|
+
wsEndpoint() {
|
|
72
|
+
return this.browserWSEndpoint;
|
|
73
|
+
}
|
|
74
|
+
publicWSEndpoint(token) {
|
|
69
75
|
if (!this.browserWSEndpoint) {
|
|
70
76
|
return null;
|
|
71
77
|
}
|
|
@@ -76,26 +82,28 @@ export class WebkitPlaywright extends EventEmitter {
|
|
|
76
82
|
externalURL.searchParams.set('token', token);
|
|
77
83
|
}
|
|
78
84
|
return externalURL.href;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
this.logger.warn(`Not yet implemented`);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
85
|
+
}
|
|
86
|
+
async proxyPageWebSocket() {
|
|
87
|
+
return this.logger.warn(`Not yet implemented`);
|
|
88
|
+
}
|
|
89
|
+
async proxyWebSocket(req, socket, head) {
|
|
90
|
+
return new Promise((resolve, reject) => {
|
|
91
|
+
if (!this.browserWSEndpoint) {
|
|
92
|
+
throw new ServerError(`No browserWSEndpoint found, did you launch first?`);
|
|
93
|
+
}
|
|
94
|
+
socket.once('close', resolve);
|
|
95
|
+
this.logger.info(`Proxying ${req.parsed.href} to ${this.constructor.name} ${this.browserWSEndpoint}`);
|
|
96
|
+
// Delete headers known to cause issues
|
|
97
|
+
delete req.headers.origin;
|
|
98
|
+
req.url = '';
|
|
99
|
+
this.proxy.ws(req, socket, head, {
|
|
100
|
+
changeOrigin: true,
|
|
101
|
+
target: this.browserWSEndpoint,
|
|
102
|
+
}, (error) => {
|
|
103
|
+
this.logger.error(`Error proxying session to ${this.constructor.name}: ${error}`);
|
|
104
|
+
this.close();
|
|
105
|
+
return reject(error);
|
|
106
|
+
});
|
|
99
107
|
});
|
|
100
|
-
}
|
|
108
|
+
}
|
|
101
109
|
}
|
package/build/config.d.ts
CHANGED
|
@@ -38,13 +38,13 @@ export declare class Config extends EventEmitter {
|
|
|
38
38
|
protected pwVersions: {
|
|
39
39
|
[key: string]: string;
|
|
40
40
|
};
|
|
41
|
-
getRoutes
|
|
42
|
-
getHost
|
|
43
|
-
getPort
|
|
44
|
-
getIsWin
|
|
45
|
-
getToken
|
|
46
|
-
getDebug
|
|
47
|
-
getPwVersions
|
|
41
|
+
getRoutes(): string;
|
|
42
|
+
getHost(): string;
|
|
43
|
+
getPort(): number;
|
|
44
|
+
getIsWin(): boolean;
|
|
45
|
+
getToken(): string | null;
|
|
46
|
+
getDebug(): string;
|
|
47
|
+
getPwVersions(): {
|
|
48
48
|
[key: string]: string;
|
|
49
49
|
};
|
|
50
50
|
/**
|
|
@@ -52,73 +52,75 @@ export declare class Config extends EventEmitter {
|
|
|
52
52
|
* to "-1" or "Infinity" for no limit.
|
|
53
53
|
* @returns number
|
|
54
54
|
*/
|
|
55
|
-
getConcurrent
|
|
55
|
+
getConcurrent(): number;
|
|
56
56
|
/**
|
|
57
57
|
* The maximum number of queued sessions allowed. Set to
|
|
58
58
|
* "-1" or "Infinity" for no limit.
|
|
59
59
|
* @returns number
|
|
60
60
|
*/
|
|
61
|
-
getQueued
|
|
62
|
-
getTimeout
|
|
63
|
-
getStatic
|
|
64
|
-
getDebuggerDir
|
|
65
|
-
getRetries
|
|
66
|
-
getAllowFileProtocol
|
|
67
|
-
getCPULimit
|
|
68
|
-
getMemoryLimit
|
|
69
|
-
getHealthChecksEnabled
|
|
70
|
-
getFailedHealthURL
|
|
71
|
-
getQueueAlertURL
|
|
72
|
-
getRejectAlertURL
|
|
73
|
-
getTimeoutAlertURL
|
|
74
|
-
getErrorAlertURL
|
|
75
|
-
hasDebugger
|
|
61
|
+
getQueued(): number;
|
|
62
|
+
getTimeout(): number;
|
|
63
|
+
getStatic(): string;
|
|
64
|
+
getDebuggerDir(): string;
|
|
65
|
+
getRetries(): number;
|
|
66
|
+
getAllowFileProtocol(): boolean;
|
|
67
|
+
getCPULimit(): number;
|
|
68
|
+
getMemoryLimit(): number;
|
|
69
|
+
getHealthChecksEnabled(): boolean;
|
|
70
|
+
getFailedHealthURL(): string | null;
|
|
71
|
+
getQueueAlertURL(): string | null;
|
|
72
|
+
getRejectAlertURL(): string | null;
|
|
73
|
+
getTimeoutAlertURL(): string | null;
|
|
74
|
+
getErrorAlertURL(): string | null;
|
|
75
|
+
hasDebugger(): Promise<boolean>;
|
|
76
76
|
/**
|
|
77
77
|
* If true, allows GET style calls on our browser-based APIs, using
|
|
78
78
|
* ?body=JSON format.
|
|
79
79
|
*/
|
|
80
|
-
getAllowGetCalls
|
|
80
|
+
getAllowGetCalls(): boolean;
|
|
81
81
|
/**
|
|
82
82
|
* Determines if CORS is allowed
|
|
83
83
|
*/
|
|
84
|
-
getAllowCORS
|
|
85
|
-
getDataDir
|
|
86
|
-
getDownloadsDir
|
|
84
|
+
getAllowCORS(): boolean;
|
|
85
|
+
getDataDir(): Promise<string>;
|
|
86
|
+
getDownloadsDir(): Promise<string>;
|
|
87
87
|
/**
|
|
88
88
|
* Repeats the TOKEN parameter up to 24 characters so we can
|
|
89
89
|
* do AES encoding for saving things to disk and generating
|
|
90
90
|
* secure links.
|
|
91
91
|
*/
|
|
92
|
-
getAESKey
|
|
93
|
-
getMetricsJSONPath
|
|
94
|
-
setPwVersions
|
|
92
|
+
getAESKey(): Buffer;
|
|
93
|
+
getMetricsJSONPath(): string;
|
|
94
|
+
setPwVersions(versions: {
|
|
95
95
|
[key: string]: string;
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
96
|
+
}): {
|
|
97
|
+
[key: string]: string;
|
|
98
|
+
};
|
|
99
|
+
loadPwVersion(version: string): Promise<typeof playwright>;
|
|
100
|
+
setDataDir(newDataDir: string): Promise<string>;
|
|
101
|
+
setRoutes(newRoutePath: string): string;
|
|
102
|
+
setConcurrent(newConcurrent: number): number;
|
|
103
|
+
setQueued(newQueued: number): number;
|
|
104
|
+
setToken(newToken: string | null): string | null;
|
|
105
|
+
setTimeout(newTimeout: number): number;
|
|
106
|
+
setStatic(newStatic: string): string;
|
|
107
|
+
setRetries(newRetries: number): number;
|
|
108
|
+
setCPULimit(limit: number): number;
|
|
109
|
+
setMemoryLimit(limit: number): number;
|
|
110
|
+
enableHealthChecks(enable: boolean): boolean;
|
|
111
|
+
enableGETRequests(enable: boolean): boolean;
|
|
112
|
+
enableCORS(enable: boolean): boolean;
|
|
113
|
+
setCORSMethods(methods: string): string;
|
|
114
|
+
setCORSOrigin(origin: string): string;
|
|
115
|
+
setCORSMaxAge(maxAge: number): number;
|
|
116
|
+
setFailedHealthURL(url: string | null): string | null;
|
|
117
|
+
setQueueAlertURL(url: string | null): string | null;
|
|
118
|
+
setRejectAlertURL(url: string | null): string | null;
|
|
119
|
+
setTimeoutAlertURL(url: string | null): string | null;
|
|
120
|
+
setErrorAlertURL(url: string | null): string | null;
|
|
121
|
+
setMetricsJSONPath(path: string): string;
|
|
122
|
+
setPort(port: number): number;
|
|
123
|
+
setAllowFileProtocol(allow: boolean): boolean;
|
|
122
124
|
/**
|
|
123
125
|
* Returns the fully-qualified server address, which
|
|
124
126
|
* includes host, protocol, and port for which the
|
|
@@ -128,7 +130,7 @@ export declare class Config extends EventEmitter {
|
|
|
128
130
|
*
|
|
129
131
|
* @returns Fully-qualified server address
|
|
130
132
|
*/
|
|
131
|
-
getServerAddress
|
|
133
|
+
getServerAddress(): string;
|
|
132
134
|
/**
|
|
133
135
|
* Returns the fully-qualified URL for the
|
|
134
136
|
* external address that browserless might be
|
|
@@ -137,7 +139,7 @@ export declare class Config extends EventEmitter {
|
|
|
137
139
|
*
|
|
138
140
|
* @returns {string} The URL to reach the server
|
|
139
141
|
*/
|
|
140
|
-
getExternalAddress
|
|
142
|
+
getExternalAddress(): string;
|
|
141
143
|
/**
|
|
142
144
|
* Set the external URL, which Browserless uses for encoding
|
|
143
145
|
* URLs over the HOST:PORT that it's bound to.
|
|
@@ -145,7 +147,7 @@ export declare class Config extends EventEmitter {
|
|
|
145
147
|
* @param address The fully-qualified URL, eg https://www.example.com/
|
|
146
148
|
* @returns {string} The address
|
|
147
149
|
*/
|
|
148
|
-
setExternalAddress
|
|
150
|
+
setExternalAddress(address: string): string;
|
|
149
151
|
/**
|
|
150
152
|
* Returns the fully-qualified WebSocket URL for the
|
|
151
153
|
* external address that browserless might be
|
|
@@ -154,14 +156,14 @@ export declare class Config extends EventEmitter {
|
|
|
154
156
|
*
|
|
155
157
|
* @returns {string} The URL to reach the server
|
|
156
158
|
*/
|
|
157
|
-
getExternalWebSocketAddress
|
|
159
|
+
getExternalWebSocketAddress(): string;
|
|
158
160
|
/**
|
|
159
161
|
* When CORS is enabled, returns relevant CORS headers
|
|
160
162
|
* to requests and for the OPTIONS call. Values can be
|
|
161
163
|
* overridden by specifying `CORS_ALLOW_METHODS`, `CORS_ALLOW_ORIGIN`,
|
|
162
164
|
* and `CORS_MAX_AGE`
|
|
163
165
|
*/
|
|
164
|
-
getCORSHeaders
|
|
166
|
+
getCORSHeaders(): {
|
|
165
167
|
'Access-Control-Allow-Methods': string;
|
|
166
168
|
'Access-Control-Allow-Origin': string;
|
|
167
169
|
'Access-Control-Max-Age': number;
|
|
@@ -170,9 +172,9 @@ export declare class Config extends EventEmitter {
|
|
|
170
172
|
* Implement any browserless-core-specific shutdown logic here.
|
|
171
173
|
* Calls the empty-SDK stop method for downstream implementations.
|
|
172
174
|
*/
|
|
173
|
-
shutdown
|
|
175
|
+
shutdown(): Promise<void>;
|
|
174
176
|
/**
|
|
175
177
|
* Left blank for downstream SDK modules to optionally implement.
|
|
176
178
|
*/
|
|
177
|
-
stop
|
|
179
|
+
stop(): void;
|
|
178
180
|
}
|