@browserless.io/browserless 2.12.0-beta-3 → 2.12.0-beta-6

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.
Files changed (199) hide show
  1. package/build/browserless.d.ts +3 -3
  2. package/build/browserless.js +6 -6
  3. package/build/browsers/chromium.cdp.d.ts +13 -13
  4. package/build/browsers/chromium.cdp.js +79 -67
  5. package/build/browsers/chromium.playwright.d.ts +12 -12
  6. package/build/browsers/chromium.playwright.js +44 -36
  7. package/build/browsers/firefox.playwright.d.ts +12 -12
  8. package/build/browsers/firefox.playwright.js +44 -36
  9. package/build/browsers/index.d.ts +17 -16
  10. package/build/browsers/index.js +63 -42
  11. package/build/browsers/webkit.playwright.d.ts +12 -12
  12. package/build/browsers/webkit.playwright.js +47 -39
  13. package/build/config.d.ts +65 -63
  14. package/build/config.js +162 -102
  15. package/build/file-system.d.ts +4 -4
  16. package/build/file-system.js +8 -8
  17. package/build/hooks.d.ts +2 -2
  18. package/build/hooks.js +4 -4
  19. package/build/limiter.d.ts +4 -4
  20. package/build/limiter.js +10 -10
  21. package/build/logger.d.ts +6 -6
  22. package/build/logger.js +12 -12
  23. package/build/metrics.d.ts +12 -12
  24. package/build/metrics.js +23 -23
  25. package/build/monitoring.d.ts +4 -4
  26. package/build/monitoring.js +8 -8
  27. package/build/router.d.ts +8 -8
  28. package/build/router.js +74 -70
  29. package/build/routes/chrome/http/pdf.post.body.json +8 -8
  30. package/build/routes/chrome/http/scrape.post.body.json +8 -8
  31. package/build/routes/chrome/http/screenshot.post.body.json +8 -8
  32. package/build/routes/chromium/http/content.post.body.json +8 -8
  33. package/build/routes/chromium/http/pdf.post.body.json +8 -8
  34. package/build/routes/chromium/http/scrape.post.body.json +8 -8
  35. package/build/routes/chromium/http/screenshot.post.body.json +8 -8
  36. package/build/routes/firefox/ws/playwright.d.ts +1 -1
  37. package/build/routes/firefox/ws/playwright.js +2 -2
  38. package/build/routes/management/http/active.get.d.ts +1 -1
  39. package/build/routes/management/http/active.get.js +3 -1
  40. package/build/routes/management/http/config.get.d.ts +1 -1
  41. package/build/routes/management/http/config.get.js +2 -2
  42. package/build/routes/management/http/metrics-total.get.d.ts +1 -1
  43. package/build/routes/management/http/metrics-total.get.js +2 -2
  44. package/build/routes/management/http/metrics.get.d.ts +1 -1
  45. package/build/routes/management/http/metrics.get.js +2 -2
  46. package/build/routes/management/http/pressure.get.d.ts +1 -1
  47. package/build/routes/management/http/pressure.get.js +2 -2
  48. package/build/routes/management/http/sessions.get.d.ts +1 -1
  49. package/build/routes/management/http/sessions.get.js +2 -2
  50. package/build/routes/management/http/static.get.d.ts +1 -1
  51. package/build/routes/management/http/static.get.js +2 -2
  52. package/build/routes/webkit/ws/playwright.d.ts +1 -1
  53. package/build/routes/webkit/ws/playwright.js +2 -2
  54. package/build/server.d.ts +5 -5
  55. package/build/server.js +11 -11
  56. package/build/shared/browser.ws.d.ts +1 -1
  57. package/build/shared/browser.ws.js +3 -1
  58. package/build/shared/chromium.playwright.ws.d.ts +1 -1
  59. package/build/shared/chromium.playwright.ws.js +2 -2
  60. package/build/shared/chromium.ws.d.ts +1 -1
  61. package/build/shared/chromium.ws.js +3 -1
  62. package/build/shared/content.http.d.ts +1 -1
  63. package/build/shared/content.http.js +2 -2
  64. package/build/shared/download.http.d.ts +1 -1
  65. package/build/shared/download.http.js +60 -58
  66. package/build/shared/function.http.d.ts +1 -1
  67. package/build/shared/function.http.js +2 -2
  68. package/build/shared/json-list.http.d.ts +1 -1
  69. package/build/shared/json-list.http.js +2 -2
  70. package/build/shared/json-new.http.d.ts +1 -1
  71. package/build/shared/json-new.http.js +2 -2
  72. package/build/shared/json-protocol.http.d.ts +1 -1
  73. package/build/shared/json-protocol.http.js +2 -2
  74. package/build/shared/json-version.http.d.ts +1 -1
  75. package/build/shared/json-version.http.js +2 -2
  76. package/build/shared/page.ws.d.ts +1 -1
  77. package/build/shared/page.ws.js +3 -1
  78. package/build/shared/pdf.http.d.ts +1 -1
  79. package/build/shared/pdf.http.js +2 -2
  80. package/build/shared/performance.http.d.ts +1 -1
  81. package/build/shared/performance.http.js +2 -2
  82. package/build/shared/scrape.http.d.ts +1 -1
  83. package/build/shared/scrape.http.js +2 -2
  84. package/build/shared/screenshot.http.d.ts +1 -1
  85. package/build/shared/screenshot.http.js +2 -2
  86. package/build/shared/utils/function/client.d.ts +1 -1
  87. package/build/shared/utils/function/client.js +3 -1
  88. package/build/shim.d.ts +1 -1
  89. package/build/shim.js +2 -2
  90. package/build/token.d.ts +3 -3
  91. package/build/token.js +6 -6
  92. package/build/types.d.ts +5 -5
  93. package/build/webhooks.d.ts +2 -2
  94. package/build/webhooks.js +4 -4
  95. package/extensions/ublock/_locales/eu/messages.json +4 -4
  96. package/extensions/ublock/_locales/hi/messages.json +5 -5
  97. package/extensions/ublock/_locales/kn/messages.json +11 -11
  98. package/extensions/ublock/_locales/nb/messages.json +2 -2
  99. package/extensions/ublock/_locales/no/messages.json +2 -2
  100. package/extensions/ublock/_locales/ro/messages.json +1 -1
  101. package/extensions/ublock/_locales/sv/messages.json +1 -1
  102. package/extensions/ublock/_locales/zh_CN/messages.json +2 -2
  103. package/extensions/ublock/assets/assets.json +3 -8
  104. package/extensions/ublock/assets/resources/scriptlets.js +128 -31
  105. package/extensions/ublock/assets/thirdparties/easylist/easylist.txt +4870 -3560
  106. package/extensions/ublock/assets/thirdparties/easylist/easyprivacy.txt +662 -173
  107. package/extensions/ublock/assets/thirdparties/pgl.yoyo.org/as/serverlist +10 -42
  108. package/extensions/ublock/assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat +241 -80
  109. package/extensions/ublock/assets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt +2093 -1224
  110. package/extensions/ublock/assets/ublock/badlists.txt +2 -0
  111. package/extensions/ublock/assets/ublock/badware.min.txt +408 -287
  112. package/extensions/ublock/assets/ublock/filters.min.txt +947 -645
  113. package/extensions/ublock/assets/ublock/privacy.min.txt +43 -8
  114. package/extensions/ublock/assets/ublock/quick-fixes.min.txt +55 -93
  115. package/extensions/ublock/assets/ublock/unbreak.min.txt +52 -19
  116. package/extensions/ublock/css/1p-filters.css +2 -0
  117. package/extensions/ublock/css/codemirror.css +2 -2
  118. package/extensions/ublock/css/dashboard.css +2 -5
  119. package/extensions/ublock/css/epicker-ui.css +3 -3
  120. package/extensions/ublock/css/fa-icons.css +3 -0
  121. package/extensions/ublock/css/logger-ui-inspector.css +1 -0
  122. package/extensions/ublock/css/logger-ui.css +44 -32
  123. package/extensions/ublock/img/fontawesome/fontawesome-defs.svg +1 -0
  124. package/extensions/ublock/js/3p-filters.js +4 -5
  125. package/extensions/ublock/js/biditrie.js +16 -11
  126. package/extensions/ublock/js/cachestorage.js +37 -37
  127. package/extensions/ublock/js/contentscript-extra.js +0 -2
  128. package/extensions/ublock/js/contentscript.js +1 -6
  129. package/extensions/ublock/js/epicker-ui.js +28 -36
  130. package/extensions/ublock/js/fa-icons.js +1 -0
  131. package/extensions/ublock/js/hntrie.js +19 -13
  132. package/extensions/ublock/js/logger-ui-inspector.js +6 -13
  133. package/extensions/ublock/js/logger-ui.js +264 -264
  134. package/extensions/ublock/js/s14e-serializer.js +267 -264
  135. package/extensions/ublock/js/scriptlet-filtering.js +12 -18
  136. package/extensions/ublock/js/scriptlets/dom-inspector.js +1 -5
  137. package/extensions/ublock/js/scriptlets/epicker.js +53 -59
  138. package/extensions/ublock/js/start.js +0 -8
  139. package/extensions/ublock/js/storage.js +2 -9
  140. package/extensions/ublock/js/vapi-background.js +19 -20
  141. package/extensions/ublock/js/vapi-common.js +2 -7
  142. package/extensions/ublock/js/vapi.js +0 -4
  143. package/extensions/ublock/js/webext.js +23 -15
  144. package/extensions/ublock/logger-ui.html +24 -15
  145. package/extensions/ublock/manifest.json +2 -3
  146. package/package.json +4 -4
  147. package/src/browserless.ts +6 -6
  148. package/src/browsers/chromium.cdp.ts +35 -25
  149. package/src/browsers/chromium.playwright.ts +30 -23
  150. package/src/browsers/firefox.playwright.ts +30 -24
  151. package/src/browsers/index.ts +81 -50
  152. package/src/browsers/webkit.playwright.ts +33 -26
  153. package/src/config.ts +166 -104
  154. package/src/file-system.ts +9 -9
  155. package/src/hooks.ts +4 -4
  156. package/src/limiter.ts +12 -12
  157. package/src/logger.ts +12 -12
  158. package/src/metrics.ts +23 -23
  159. package/src/monitoring.ts +9 -9
  160. package/src/router.ts +31 -31
  161. package/src/routes/chrome/tests/websocket.spec.ts +2 -2
  162. package/src/routes/chromium/tests/websocket.spec.ts +2 -2
  163. package/src/routes/firefox/tests/websocket.spec.ts +2 -4
  164. package/src/routes/firefox/ws/playwright.ts +3 -3
  165. package/src/routes/management/http/active.get.ts +3 -2
  166. package/src/routes/management/http/config.get.ts +2 -2
  167. package/src/routes/management/http/metrics-total.get.ts +2 -2
  168. package/src/routes/management/http/metrics.get.ts +2 -2
  169. package/src/routes/management/http/pressure.get.ts +2 -2
  170. package/src/routes/management/http/sessions.get.ts +2 -2
  171. package/src/routes/management/http/static.get.ts +3 -3
  172. package/src/routes/webkit/tests/websocket.spec.ts +2 -3
  173. package/src/routes/webkit/ws/playwright.ts +3 -3
  174. package/src/server.ts +14 -16
  175. package/src/shared/browser.ws.ts +4 -2
  176. package/src/shared/chromium.playwright.ws.ts +3 -3
  177. package/src/shared/chromium.ws.ts +4 -2
  178. package/src/shared/content.http.ts +3 -3
  179. package/src/shared/download.http.ts +4 -3
  180. package/src/shared/function.http.ts +3 -3
  181. package/src/shared/json-list.http.ts +2 -2
  182. package/src/shared/json-new.http.ts +2 -2
  183. package/src/shared/json-protocol.http.ts +2 -6
  184. package/src/shared/json-version.http.ts +2 -6
  185. package/src/shared/page.ws.ts +4 -2
  186. package/src/shared/pdf.http.ts +3 -3
  187. package/src/shared/performance.http.ts +3 -3
  188. package/src/shared/scrape.http.ts +3 -3
  189. package/src/shared/screenshot.http.ts +3 -3
  190. package/src/shared/utils/function/client.ts +3 -1
  191. package/src/shim.ts +2 -2
  192. package/src/token.ts +7 -7
  193. package/src/types.ts +8 -8
  194. package/src/utils.ts +1 -1
  195. package/src/webhooks.ts +4 -4
  196. package/static/docs/swagger.json +1 -1
  197. package/static/docs/swagger.min.json +1 -1
  198. package/static/function/client.js +3 -1
  199. package/static/function/index.html +3 -1
@@ -18,24 +18,26 @@ export class BrowserManager {
18
18
  this.config = config;
19
19
  this.hooks = hooks;
20
20
  }
21
- browserIsChrome = (b) => this.chromeBrowsers.some((chromeBrowser) => b instanceof chromeBrowser);
22
- removeUserDataDir = async (userDataDir) => {
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
- onNewPage = async (req, page) => {
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
- getProtocolJSON = async (logger) => {
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
- getVersionJSON = async (logger) => {
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
- getJSONList = async () => {
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,14 +140,14 @@ export class BrowserManager {
138
140
  return cdpResponse
139
141
  .flat()
140
142
  .filter((_) => _ !== null);
141
- };
142
- generateSessionJson = async (browser, session) => {
143
+ }
144
+ async generateSessionJson(browser, session) {
143
145
  const serverAddress = this.config.getExternalAddress();
144
146
  const sessions = [
145
147
  {
146
148
  ...session,
147
149
  browser: browser.constructor.name,
148
- browserId: browser.wsEndpoint()?.split('/').pop(),
150
+ browserId: session.id,
149
151
  initialConnectURL: new URL(session.initialConnectURL, serverAddress)
150
152
  .href,
151
153
  killURL: session.id
@@ -176,24 +178,43 @@ export class BrowserManager {
176
178
  }
177
179
  }
178
180
  return sessions;
179
- };
180
- close = async (browser, session) => {
181
+ }
182
+ async close(browser, session) {
183
+ const now = Date.now();
184
+ const keepUntil = browser.keepUntil();
185
+ const connected = session.numbConnected;
186
+ const hasKeepUntil = keepUntil > now;
187
+ const keepOpen = connected > 0 || hasKeepUntil;
181
188
  const cleanupACtions = [];
182
- this.log.info(`${session.numbConnected} Client(s) are currently connected`);
183
- // Don't close if there's clients still connected
184
- if (session.numbConnected > 0 || browser.keepAlive()) {
185
- return;
189
+ const priorTimer = this.timers.get(session.id);
190
+ if (priorTimer) {
191
+ this.log.info(`Deleting prior keep-until timer for "${session.id}"`);
192
+ global.clearTimeout(priorTimer);
193
+ }
194
+ this.log.info(`${session.numbConnected} Client(s) are currently connected, Keep-until: ${keepUntil}`);
195
+ if (hasKeepUntil) {
196
+ const timeout = keepUntil - now;
197
+ this.log.trace(`Setting timer ${timeout.toLocaleString()} for "${session.id}"`);
198
+ this.timers.set(session.id, global.setTimeout(() => {
199
+ const session = this.browsers.get(browser);
200
+ if (session) {
201
+ this.log.trace(`Timer hit for "${session.id}"`),
202
+ this.close(browser, session);
203
+ }
204
+ }, timeout));
186
205
  }
187
- this.log.info(`Closing browser session`);
188
- cleanupACtions.push(() => browser.close());
189
- if (session.isTempDataDir) {
190
- this.log.info(`Deleting "${session.userDataDir}" user-data-dir and session from memory`);
191
- this.browsers.delete(browser);
192
- cleanupACtions.push(() => this.removeUserDataDir(session.userDataDir));
206
+ if (!keepOpen) {
207
+ this.log.info(`Closing browser session`);
208
+ cleanupACtions.push(() => browser.close());
209
+ if (session.isTempDataDir) {
210
+ this.log.info(`Deleting "${session.userDataDir}" user-data-dir and session from memory`);
211
+ this.browsers.delete(browser);
212
+ cleanupACtions.push(() => this.removeUserDataDir(session.userDataDir));
213
+ }
214
+ await Promise.all(cleanupACtions.map((a) => a()));
193
215
  }
194
- await Promise.all(cleanupACtions.map((a) => a()));
195
- };
196
- getAllSessions = async () => {
216
+ }
217
+ async getAllSessions() {
197
218
  const sessions = Array.from(this.browsers);
198
219
  const formattedSessions = [];
199
220
  for (const [browser, session] of sessions) {
@@ -201,8 +222,8 @@ export class BrowserManager {
201
222
  formattedSessions.push(...formattedSession);
202
223
  }
203
224
  return formattedSessions;
204
- };
205
- complete = async (browser) => {
225
+ }
226
+ async complete(browser) {
206
227
  const session = this.browsers.get(browser);
207
228
  if (!session) {
208
229
  this.log.info(`Couldn't locate session for browser, proceeding with close`);
@@ -214,8 +235,8 @@ export class BrowserManager {
214
235
  }
215
236
  --session.numbConnected;
216
237
  this.close(browser, session);
217
- };
218
- getBrowserForRequest = async (req, router, logger) => {
238
+ }
239
+ async getBrowserForRequest(req, router, logger) {
219
240
  const { browser: Browser } = router;
220
241
  const blockAds = parseBooleanParam(req.parsed.searchParams, 'blockAds', false);
221
242
  const decodedLaunchOptions = convertIfBase64(req.parsed.searchParams.get('launch') || '{}');
@@ -307,8 +328,12 @@ export class BrowserManager {
307
328
  logger,
308
329
  userDataDir,
309
330
  });
331
+ const match = (req.headers['user-agent'] || '').match(pwVersionRegex);
332
+ const pwVersion = match ? match[1] : 'default';
333
+ await browser.launch(launchOptions, pwVersion);
334
+ await this.hooks.browser({ browser, meta: req.parsed });
310
335
  const session = {
311
- id: null,
336
+ id: browser.wsEndpoint()?.split('/').pop(),
312
337
  initialConnectURL: path.join(req.parsed.pathname, req.parsed.search) || '',
313
338
  isTempDataDir: !manualUserDataDir,
314
339
  launchOptions,
@@ -320,17 +345,13 @@ export class BrowserManager {
320
345
  userDataDir,
321
346
  };
322
347
  this.browsers.set(browser, session);
323
- const match = (req.headers['user-agent'] || '').match(pwVersionRegex);
324
- const pwVersion = match ? match[1] : 'default';
325
- await browser.launch(launchOptions, pwVersion);
326
- await this.hooks.browser({ browser, meta: req.parsed });
327
348
  browser.on('newPage', async (page) => {
328
349
  await this.onNewPage(req, page);
329
350
  (router.onNewPage || noop)(req.parsed || '', page);
330
351
  });
331
352
  return browser;
332
- };
333
- shutdown = async () => {
353
+ }
354
+ async shutdown() {
334
355
  this.log.info(`Closing down browser instances`);
335
356
  const sessions = Array.from(this.browsers);
336
357
  await Promise.all(sessions.map(([b]) => b.close()));
@@ -341,9 +362,9 @@ export class BrowserManager {
341
362
  this.timers = new Map();
342
363
  await this.stop();
343
364
  this.log.info(`Shutdown complete`);
344
- };
365
+ }
345
366
  /**
346
367
  * Left blank for downstream SDK modules to optionally implement.
347
368
  */
348
- stop = () => { };
369
+ stop() { }
349
370
  }
@@ -21,16 +21,16 @@ export declare class WebkitPlaywright extends EventEmitter {
21
21
  userDataDir: WebkitPlaywright['userDataDir'];
22
22
  });
23
23
  protected cleanListeners(): void;
24
- keepAlive(): boolean;
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>;
24
+ keepUntil(): number;
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
  }
@@ -21,11 +21,13 @@ export class WebkitPlaywright extends EventEmitter {
21
21
  cleanListeners() {
22
22
  this.removeAllListeners();
23
23
  }
24
- keepAlive() {
25
- return false;
24
+ keepUntil() {
25
+ return 0;
26
26
  }
27
- isRunning = () => this.running;
28
- close = async () => {
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,27 +37,29 @@ export class WebkitPlaywright extends EventEmitter {
35
37
  this.browser = null;
36
38
  this.browserWSEndpoint = null;
37
39
  }
38
- };
39
- pages = async () => [];
40
- getPageId = () => {
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
- newPage = async () => {
49
+ }
50
+ async newPage() {
47
51
  throw new ServerError(`Can't create new page with ${this.constructor.name}`);
48
- };
49
- launch = async (options = {}, version) => {
52
+ }
53
+ async launch(options = {}, version) {
50
54
  this.logger.info(`Launching ${this.constructor.name} Handler`);
51
- const opts = ({
55
+ const opts = {
52
56
  ...options,
53
57
  args: [
54
58
  ...(options.args || []),
55
59
  this.userDataDir ? `-profile=${this.userDataDir}` : '',
56
60
  ],
57
61
  executablePath: playwright.webkit.executablePath(),
58
- });
62
+ };
59
63
  const versionedPw = await this.config.loadPwVersion(version);
60
64
  this.browser = await versionedPw.webkit.launchServer(opts);
61
65
  const browserWSEndpoint = this.browser.wsEndpoint();
@@ -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 = () => this.browserWSEndpoint;
68
- publicWSEndpoint = (token) => {
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
- proxyPageWebSocket = async () => {
81
- this.logger.warn(`Not yet implemented`);
82
- };
83
- proxyWebSocket = async (req, socket, head) => new Promise((resolve, reject) => {
84
- if (!this.browserWSEndpoint) {
85
- throw new ServerError(`No browserWSEndpoint found, did you launch first?`);
86
- }
87
- socket.once('close', resolve);
88
- this.logger.info(`Proxying ${req.parsed.href} to ${this.constructor.name} ${this.browserWSEndpoint}`);
89
- // Delete headers known to cause issues
90
- delete req.headers.origin;
91
- req.url = '';
92
- this.proxy.ws(req, socket, head, {
93
- changeOrigin: true,
94
- target: this.browserWSEndpoint,
95
- }, (error) => {
96
- this.logger.error(`Error proxying session to ${this.constructor.name}: ${error}`);
97
- this.close();
98
- return reject(error);
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: () => string;
42
- getHost: () => string;
43
- getPort: () => number;
44
- getIsWin: () => boolean;
45
- getToken: () => string | null;
46
- getDebug: () => string;
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: () => number;
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: () => 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>;
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: () => boolean;
80
+ getAllowGetCalls(): boolean;
81
81
  /**
82
82
  * Determines if CORS is allowed
83
83
  */
84
- getAllowCORS: () => boolean;
85
- getDataDir: () => Promise<string>;
86
- getDownloadsDir: () => Promise<string>;
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: () => Buffer;
93
- getMetricsJSONPath: () => string;
94
- setPwVersions: (versions: {
92
+ getAESKey(): Buffer;
93
+ getMetricsJSONPath(): string;
94
+ setPwVersions(versions: {
95
95
  [key: string]: string;
96
- }) => void;
97
- loadPwVersion: (version: string) => Promise<typeof playwright>;
98
- setDataDir: (newDataDir: string) => Promise<string>;
99
- setRoutes: (newRoutePath: string) => string;
100
- setConcurrent: (newConcurrent: number) => number;
101
- setQueued: (newQueued: number) => number;
102
- setToken: (newToken: string | null) => string | null;
103
- setTimeout: (newTimeout: number) => number;
104
- setStatic: (newStatic: string) => string;
105
- setRetries: (newRetries: number) => number;
106
- setCPULimit: (limit: number) => number;
107
- setMemoryLimit: (limit: number) => number;
108
- enableHealthChecks: (enable: boolean) => boolean;
109
- enableGETRequests: (enable: boolean) => boolean;
110
- enableCORS: (enable: boolean) => boolean;
111
- setCORSMethods: (methods: string) => string;
112
- setCORSOrigin: (origin: string) => string;
113
- setCORSMaxAge: (maxAge: number) => number;
114
- setFailedHealthURL: (url: string | null) => string | null;
115
- setQueueAlertURL: (url: string | null) => string | null;
116
- setRejectAlertURL: (url: string | null) => string | null;
117
- setTimeoutAlertURL: (url: string | null) => string | null;
118
- setErrorAlertURL: (url: string | null) => string | null;
119
- setMetricsJSONPath: (path: string) => string;
120
- setPort: (port: number) => number;
121
- setAllowFileProtocol: (allow: boolean) => boolean;
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: () => string;
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: () => string;
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: (address: string) => string;
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: () => string;
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: () => Promise<void>;
175
+ shutdown(): Promise<void>;
174
176
  /**
175
177
  * Left blank for downstream SDK modules to optionally implement.
176
178
  */
177
- stop: () => void;
179
+ stop(): void;
178
180
  }