@browserless.io/browserless 2.12.0-beta-4 → 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 (143) 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 +12 -12
  4. package/build/browsers/chromium.cdp.js +77 -65
  5. package/build/browsers/chromium.playwright.d.ts +11 -11
  6. package/build/browsers/chromium.playwright.js +42 -34
  7. package/build/browsers/firefox.playwright.d.ts +11 -11
  8. package/build/browsers/firefox.playwright.js +42 -34
  9. package/build/browsers/index.d.ts +14 -14
  10. package/build/browsers/index.js +27 -25
  11. package/build/browsers/webkit.playwright.d.ts +11 -11
  12. package/build/browsers/webkit.playwright.js +43 -35
  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 +4 -4
  93. package/build/webhooks.d.ts +2 -2
  94. package/build/webhooks.js +4 -4
  95. package/package.json +3 -3
  96. package/src/browserless.ts +6 -6
  97. package/src/browsers/chromium.cdp.ts +33 -23
  98. package/src/browsers/chromium.playwright.ts +28 -21
  99. package/src/browsers/firefox.playwright.ts +28 -21
  100. package/src/browsers/index.ts +32 -29
  101. package/src/browsers/webkit.playwright.ts +29 -22
  102. package/src/config.ts +166 -104
  103. package/src/file-system.ts +9 -9
  104. package/src/hooks.ts +4 -4
  105. package/src/limiter.ts +12 -12
  106. package/src/logger.ts +12 -12
  107. package/src/metrics.ts +23 -23
  108. package/src/monitoring.ts +9 -9
  109. package/src/router.ts +31 -31
  110. package/src/routes/firefox/ws/playwright.ts +3 -3
  111. package/src/routes/management/http/active.get.ts +3 -2
  112. package/src/routes/management/http/config.get.ts +2 -2
  113. package/src/routes/management/http/metrics-total.get.ts +2 -2
  114. package/src/routes/management/http/metrics.get.ts +2 -2
  115. package/src/routes/management/http/pressure.get.ts +2 -2
  116. package/src/routes/management/http/sessions.get.ts +2 -2
  117. package/src/routes/management/http/static.get.ts +3 -3
  118. package/src/routes/webkit/ws/playwright.ts +3 -3
  119. package/src/server.ts +14 -16
  120. package/src/shared/browser.ws.ts +4 -2
  121. package/src/shared/chromium.playwright.ws.ts +3 -3
  122. package/src/shared/chromium.ws.ts +4 -2
  123. package/src/shared/content.http.ts +3 -3
  124. package/src/shared/download.http.ts +4 -3
  125. package/src/shared/function.http.ts +3 -3
  126. package/src/shared/json-list.http.ts +2 -2
  127. package/src/shared/json-new.http.ts +2 -2
  128. package/src/shared/json-protocol.http.ts +2 -6
  129. package/src/shared/json-version.http.ts +2 -6
  130. package/src/shared/page.ws.ts +4 -2
  131. package/src/shared/pdf.http.ts +3 -3
  132. package/src/shared/performance.http.ts +3 -3
  133. package/src/shared/scrape.http.ts +3 -3
  134. package/src/shared/screenshot.http.ts +3 -3
  135. package/src/shared/utils/function/client.ts +3 -1
  136. package/src/shim.ts +2 -2
  137. package/src/token.ts +7 -7
  138. package/src/types.ts +7 -7
  139. package/src/webhooks.ts +4 -4
  140. package/static/docs/swagger.json +1 -1
  141. package/static/docs/swagger.min.json +1 -1
  142. package/static/function/client.js +3 -1
  143. package/static/function/index.html +3 -1
@@ -36,9 +36,9 @@ export declare class Browserless extends EventEmitter {
36
36
  token?: Browserless['token'];
37
37
  webhooks?: Browserless['webhooks'];
38
38
  });
39
- protected loadPwVersions: () => Promise<void>;
40
- protected saveMetrics: () => Promise<void>;
41
- setMetricsSaveInterval: (interval: number) => void;
39
+ protected loadPwVersions(): Promise<void>;
40
+ protected saveMetrics(): Promise<void>;
41
+ setMetricsSaveInterval(interval: number): void;
42
42
  protected routeIsDisabled(route: routeInstances): boolean;
43
43
  setStaticSDKDir(dir: string): void;
44
44
  disableRoutes(...routeNames: string[]): void;
@@ -45,11 +45,11 @@ export class Browserless extends EventEmitter {
45
45
  router ||
46
46
  new Router(this.config, this.browserManager, this.limiter, this.Logger);
47
47
  }
48
- loadPwVersions = async () => {
48
+ async loadPwVersions() {
49
49
  const { playwrightVersions } = JSON.parse((await fs.readFile('package.json')).toString());
50
50
  this.config.setPwVersions(playwrightVersions);
51
- };
52
- saveMetrics = async () => {
51
+ }
52
+ async saveMetrics() {
53
53
  const metricsPath = this.config.getMetricsJSONPath();
54
54
  const { cpu, memory } = await this.monitoring.getMachineStats();
55
55
  const metrics = await this.metrics.get();
@@ -76,15 +76,15 @@ export class Browserless extends EventEmitter {
76
76
  this.logger.info(`Saving metrics to "${metricsPath}"`);
77
77
  this.fileSystem.append(metricsPath, JSON.stringify(aggregatedStats), false);
78
78
  }
79
- };
80
- setMetricsSaveInterval = (interval) => {
79
+ }
80
+ setMetricsSaveInterval(interval) {
81
81
  if (interval <= 0) {
82
82
  return console.warn(`Interval value of "${interval}" must be greater than 1. Ignoring`);
83
83
  }
84
84
  clearInterval(this.metricsSaveInterval);
85
85
  this.metricsSaveInterval = interval;
86
86
  this.metricsSaveIntervalID = setInterval(this.saveMetrics, this.metricsSaveInterval);
87
- };
87
+ }
88
88
  routeIsDisabled(route) {
89
89
  return this.disabledRouteNames.some((name) => name === route.name);
90
90
  }
@@ -27,16 +27,16 @@ export declare class ChromiumCDP extends EventEmitter {
27
27
  });
28
28
  protected cleanListeners(): void;
29
29
  keepUntil(): number;
30
- getPageId: (page: Page) => string;
31
- protected onTargetCreated: (target: Target) => Promise<void>;
32
- isRunning: () => boolean;
33
- newPage: () => Promise<Page>;
34
- close: () => Promise<void>;
35
- pages: () => Promise<Page[]>;
36
- process: () => import("child_process").ChildProcess | null;
37
- launch: (options?: CDPLaunchOptions) => Promise<Browser>;
38
- wsEndpoint: () => string | null;
39
- publicWSEndpoint: (token: string | null) => string | null;
40
- proxyPageWebSocket: (req: Request, socket: Duplex, head: Buffer) => Promise<void>;
41
- proxyWebSocket: (req: Request, socket: Duplex, head: Buffer) => Promise<void>;
30
+ getPageId(page: Page): string;
31
+ protected onTargetCreated(target: Target): Promise<void>;
32
+ isRunning(): boolean;
33
+ newPage(): Promise<Page>;
34
+ close(): Promise<void>;
35
+ pages(): Promise<Page[]>;
36
+ process(): import("child_process").ChildProcess | null;
37
+ launch(options?: CDPLaunchOptions): Promise<Browser>;
38
+ wsEndpoint(): string | null;
39
+ publicWSEndpoint(token: string | null): string | null;
40
+ proxyPageWebSocket(req: Request, socket: Duplex, head: Buffer): Promise<void>;
41
+ proxyWebSocket(req: Request, socket: Duplex, head: Buffer): Promise<void>;
42
42
  }
@@ -35,11 +35,11 @@ export class ChromiumCDP extends EventEmitter {
35
35
  keepUntil() {
36
36
  return 0;
37
37
  }
38
- getPageId = (page) => {
38
+ getPageId(page) {
39
39
  // @ts-ignore
40
40
  return page.target()._targetId;
41
- };
42
- onTargetCreated = async (target) => {
41
+ }
42
+ async onTargetCreated(target) {
43
43
  if (target.type() === 'page') {
44
44
  const page = await target.page().catch((e) => {
45
45
  this.logger.error(`Error in ${this.constructor.name} new page ${e}`);
@@ -83,15 +83,17 @@ export class ChromiumCDP extends EventEmitter {
83
83
  this.emit('newPage', page);
84
84
  }
85
85
  }
86
- };
87
- isRunning = () => this.running;
88
- newPage = async () => {
86
+ }
87
+ isRunning() {
88
+ return this.running;
89
+ }
90
+ async newPage() {
89
91
  if (!this.browser) {
90
92
  throw new ServerError(`${this.constructor.name} hasn't been launched yet!`);
91
93
  }
92
94
  return this.browser.newPage();
93
- };
94
- close = async () => {
95
+ }
96
+ async close() {
95
97
  if (this.browser) {
96
98
  this.logger.info(`Closing ${this.constructor.name} process and all listeners`);
97
99
  this.emit('close');
@@ -102,10 +104,14 @@ export class ChromiumCDP extends EventEmitter {
102
104
  this.browser = null;
103
105
  this.browserWSEndpoint = null;
104
106
  }
105
- };
106
- pages = async () => this.browser?.pages() || [];
107
- process = () => this.browser?.process() || null;
108
- launch = async (options = {}) => {
107
+ }
108
+ async pages() {
109
+ return this.browser?.pages() || [];
110
+ }
111
+ process() {
112
+ return this.browser?.process() || null;
113
+ }
114
+ async launch(options = {}) {
109
115
  this.port = await getPort();
110
116
  this.logger.info(`${this.constructor.name} got open port ${this.port}`);
111
117
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -130,14 +136,16 @@ export class ChromiumCDP extends EventEmitter {
130
136
  : puppeteer.launch.bind(puppeteer);
131
137
  this.logger.info(finalOptions, `Launching ${this.constructor.name} Handler`);
132
138
  this.browser = (await launch(finalOptions));
133
- this.browser.on('targetcreated', this.onTargetCreated);
139
+ this.browser.on('targetcreated', this.onTargetCreated.bind(this));
134
140
  this.running = true;
135
141
  this.browserWSEndpoint = this.browser.wsEndpoint();
136
142
  this.logger.info(`${this.constructor.name} is running on ${this.browserWSEndpoint}`);
137
143
  return this.browser;
138
- };
139
- wsEndpoint = () => this.browserWSEndpoint;
140
- publicWSEndpoint = (token) => {
144
+ }
145
+ wsEndpoint() {
146
+ return this.browserWSEndpoint;
147
+ }
148
+ publicWSEndpoint(token) {
141
149
  if (!this.browserWSEndpoint) {
142
150
  return null;
143
151
  }
@@ -148,55 +156,59 @@ export class ChromiumCDP extends EventEmitter {
148
156
  externalURL.searchParams.set('token', token);
149
157
  }
150
158
  return externalURL.href;
151
- };
152
- proxyPageWebSocket = async (req, socket, head) => new Promise(async (resolve, reject) => {
153
- if (!this.browserWSEndpoint || !this.browser) {
154
- throw new ServerError(`No browserWSEndpoint found, did you launch first?`);
155
- }
156
- socket.once('close', resolve);
157
- this.logger.info(`Proxying ${req.parsed.href} to ${this.constructor.name}`);
158
- const shouldMakePage = req.parsed.pathname.includes(BLESS_PAGE_IDENTIFIER);
159
- const page = shouldMakePage ? await this.browser.newPage() : null;
160
- const pathname = page
161
- ? path.join('/devtools', '/page', this.getPageId(page))
162
- : req.parsed.pathname;
163
- const target = new URL(pathname, this.browserWSEndpoint).href;
164
- req.url = '';
165
- // Delete headers known to cause issues
166
- delete req.headers.origin;
167
- this.proxy.ws(req, socket, head, {
168
- changeOrigin: true,
169
- target,
170
- }, (error) => {
171
- this.logger.error(`Error proxying session to ${this.constructor.name}: ${error}`);
172
- this.close();
173
- return reject(error);
174
- });
175
- });
176
- proxyWebSocket = async (req, socket, head) => new Promise((resolve, reject) => {
177
- if (!this.browserWSEndpoint) {
178
- throw new ServerError(`No browserWSEndpoint found, did you launch first?`);
179
- }
180
- const close = once(() => {
181
- this.browser?.off('close', close);
182
- this.browser?.process()?.off('close', close);
183
- socket.off('close', close);
184
- return resolve();
159
+ }
160
+ async proxyPageWebSocket(req, socket, head) {
161
+ return new Promise(async (resolve, reject) => {
162
+ if (!this.browserWSEndpoint || !this.browser) {
163
+ throw new ServerError(`No browserWSEndpoint found, did you launch first?`);
164
+ }
165
+ socket.once('close', resolve);
166
+ this.logger.info(`Proxying ${req.parsed.href} to ${this.constructor.name}`);
167
+ const shouldMakePage = req.parsed.pathname.includes(BLESS_PAGE_IDENTIFIER);
168
+ const page = shouldMakePage ? await this.browser.newPage() : null;
169
+ const pathname = page
170
+ ? path.join('/devtools', '/page', this.getPageId(page))
171
+ : req.parsed.pathname;
172
+ const target = new URL(pathname, this.browserWSEndpoint).href;
173
+ req.url = '';
174
+ // Delete headers known to cause issues
175
+ delete req.headers.origin;
176
+ this.proxy.ws(req, socket, head, {
177
+ changeOrigin: true,
178
+ target,
179
+ }, (error) => {
180
+ this.logger.error(`Error proxying session to ${this.constructor.name}: ${error}`);
181
+ this.close();
182
+ return reject(error);
183
+ });
185
184
  });
186
- this.browser?.once('close', close);
187
- this.browser?.process()?.once('close', close);
188
- socket.once('close', close);
189
- this.logger.info(`Proxying ${req.parsed.href} to ${this.constructor.name} ${this.browserWSEndpoint}`);
190
- req.url = '';
191
- // Delete headers known to cause issues
192
- delete req.headers.origin;
193
- this.proxy.ws(req, socket, head, {
194
- changeOrigin: true,
195
- target: this.browserWSEndpoint,
196
- }, (error) => {
197
- this.logger.error(`Error proxying session to ${this.constructor.name}: ${error}`);
198
- this.close();
199
- return reject(error);
185
+ }
186
+ async proxyWebSocket(req, socket, head) {
187
+ return new Promise((resolve, reject) => {
188
+ if (!this.browserWSEndpoint) {
189
+ throw new ServerError(`No browserWSEndpoint found, did you launch first?`);
190
+ }
191
+ const close = once(() => {
192
+ this.browser?.off('close', close);
193
+ this.browser?.process()?.off('close', close);
194
+ socket.off('close', close);
195
+ return resolve();
196
+ });
197
+ this.browser?.once('close', close);
198
+ this.browser?.process()?.once('close', close);
199
+ socket.once('close', close);
200
+ this.logger.info(`Proxying ${req.parsed.href} to ${this.constructor.name} ${this.browserWSEndpoint}`);
201
+ req.url = '';
202
+ // Delete headers known to cause issues
203
+ delete req.headers.origin;
204
+ this.proxy.ws(req, socket, head, {
205
+ changeOrigin: true,
206
+ target: this.browserWSEndpoint,
207
+ }, (error) => {
208
+ this.logger.error(`Error proxying session to ${this.constructor.name}: ${error}`);
209
+ this.close();
210
+ return reject(error);
211
+ });
200
212
  });
201
- });
213
+ }
202
214
  }
@@ -23,15 +23,15 @@ export declare class ChromiumPlaywright extends EventEmitter {
23
23
  });
24
24
  protected cleanListeners(): void;
25
25
  keepUntil(): number;
26
- isRunning: () => boolean;
27
- close: () => Promise<void>;
28
- pages: () => Promise<[]>;
29
- getPageId: () => string;
30
- makeLiveURL: () => void;
31
- newPage: () => Promise<Page>;
32
- launch: (options?: BrowserServerOptions, version?: string) => Promise<playwright.BrowserServer>;
33
- wsEndpoint: () => string | null;
34
- publicWSEndpoint: (token: string | null) => string | null;
35
- proxyPageWebSocket: () => Promise<void>;
36
- proxyWebSocket: (req: Request, socket: Duplex, head: Buffer) => Promise<void>;
26
+ isRunning(): boolean;
27
+ close(): Promise<void>;
28
+ pages(): Promise<[]>;
29
+ getPageId(): string;
30
+ makeLiveURL(): void;
31
+ newPage(): Promise<Page>;
32
+ launch(options?: BrowserServerOptions, version?: string): Promise<playwright.BrowserServer>;
33
+ wsEndpoint(): string | null;
34
+ publicWSEndpoint(token: string | null): string | null;
35
+ proxyPageWebSocket(): Promise<void>;
36
+ proxyWebSocket(req: Request, socket: Duplex, head: Buffer): Promise<void>;
37
37
  }
@@ -25,8 +25,10 @@ export class ChromiumPlaywright extends EventEmitter {
25
25
  keepUntil() {
26
26
  return 0;
27
27
  }
28
- isRunning = () => this.running;
29
- close = async () => {
28
+ isRunning() {
29
+ return this.running;
30
+ }
31
+ async close() {
30
32
  if (this.browser) {
31
33
  this.logger.info(`Closing ${this.constructor.name} process and all listeners`);
32
34
  this.emit('close');
@@ -36,22 +38,24 @@ export class ChromiumPlaywright extends EventEmitter {
36
38
  this.browser = null;
37
39
  this.browserWSEndpoint = null;
38
40
  }
39
- };
40
- pages = async () => [];
41
- getPageId = () => {
41
+ }
42
+ async pages() {
43
+ return [];
44
+ }
45
+ getPageId() {
42
46
  throw new ServerError(`#getPageId is not yet supported with ${this.constructor.name}.`);
43
- };
44
- makeLiveURL = () => {
47
+ }
48
+ makeLiveURL() {
45
49
  throw new ServerError(`Live URLs are not yet supported with ${this.constructor.name}. In the future this will be at "${this.config.getExternalAddress()}"`);
46
- };
47
- newPage = async () => {
50
+ }
51
+ async newPage() {
48
52
  if (!this.browser || !this.browserWSEndpoint) {
49
53
  throw new ServerError(`${this.constructor.name} hasn't been launched yet!`);
50
54
  }
51
55
  const browser = await playwright.chromium.connect(this.browserWSEndpoint);
52
56
  return await browser.newPage();
53
- };
54
- launch = async (options = {}, version) => {
57
+ }
58
+ async launch(options = {}, version) {
55
59
  this.logger.info(`Launching ${this.constructor.name} Handler`);
56
60
  const opts = {
57
61
  ...options,
@@ -69,9 +73,11 @@ export class ChromiumPlaywright extends EventEmitter {
69
73
  this.running = true;
70
74
  this.browserWSEndpoint = browserWSEndpoint;
71
75
  return this.browser;
72
- };
73
- wsEndpoint = () => this.browserWSEndpoint;
74
- publicWSEndpoint = (token) => {
76
+ }
77
+ wsEndpoint() {
78
+ return this.browserWSEndpoint;
79
+ }
80
+ publicWSEndpoint(token) {
75
81
  if (!this.browserWSEndpoint) {
76
82
  return null;
77
83
  }
@@ -82,26 +88,28 @@ export class ChromiumPlaywright extends EventEmitter {
82
88
  externalURL.searchParams.set('token', token);
83
89
  }
84
90
  return externalURL.href;
85
- };
86
- proxyPageWebSocket = async () => {
91
+ }
92
+ async proxyPageWebSocket() {
87
93
  this.logger.warn(`${this.constructor.name} Not yet implemented`);
88
- };
89
- proxyWebSocket = async (req, socket, head) => new Promise((resolve, reject) => {
90
- if (!this.browserWSEndpoint) {
91
- throw new ServerError(`No browserWSEndpoint found, did you launch first?`);
92
- }
93
- socket.once('close', resolve);
94
- this.logger.info(`Proxying ${req.parsed.href} to ${this.constructor.name} ${this.browserWSEndpoint}`);
95
- // Delete headers known to cause issues
96
- delete req.headers.origin;
97
- req.url = '';
98
- this.proxy.ws(req, socket, head, {
99
- changeOrigin: true,
100
- target: this.browserWSEndpoint,
101
- }, (error) => {
102
- this.logger.error(`Error proxying session to ${this.constructor.name}: ${error}`);
103
- this.close();
104
- return reject(error);
94
+ }
95
+ async proxyWebSocket(req, socket, head) {
96
+ return new Promise((resolve, reject) => {
97
+ if (!this.browserWSEndpoint) {
98
+ throw new ServerError(`No browserWSEndpoint found, did you launch first?`);
99
+ }
100
+ socket.once('close', resolve);
101
+ this.logger.info(`Proxying ${req.parsed.href} to ${this.constructor.name} ${this.browserWSEndpoint}`);
102
+ // Delete headers known to cause issues
103
+ delete req.headers.origin;
104
+ req.url = '';
105
+ this.proxy.ws(req, socket, head, {
106
+ changeOrigin: true,
107
+ target: this.browserWSEndpoint,
108
+ }, (error) => {
109
+ this.logger.error(`Error proxying session to ${this.constructor.name}: ${error}`);
110
+ this.close();
111
+ return reject(error);
112
+ });
105
113
  });
106
- });
114
+ }
107
115
  }
@@ -22,15 +22,15 @@ export declare class FirefoxPlaywright extends EventEmitter {
22
22
  });
23
23
  protected cleanListeners(): void;
24
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>;
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 FirefoxPlaywright extends EventEmitter {
24
24
  keepUntil() {
25
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.trace(`Closing ${this.constructor.name} process and all listeners`);
31
33
  this.emit('close');
@@ -35,18 +37,20 @@ export class FirefoxPlaywright 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
55
  const opts = {
52
56
  ...options,
@@ -63,9 +67,11 @@ export class FirefoxPlaywright 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 FirefoxPlaywright extends EventEmitter {
76
82
  externalURL.searchParams.set('token', token);
77
83
  }
78
84
  return externalURL.href;
79
- };
80
- proxyPageWebSocket = async () => {
85
+ }
86
+ async proxyPageWebSocket() {
81
87
  this.logger.warn(`Not yet implemented in ${this.constructor.name}`);
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);
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
  }
@@ -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: (b: BrowserInstance) => boolean;
14
- protected removeUserDataDir: (userDataDir: string | null) => Promise<void>;
15
- protected onNewPage: (req: Request, page: Page) => Promise<void>;
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: (logger: Logger) => Promise<object>;
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: (logger: Logger) => Promise<CDPJSONPayload>;
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: () => Promise<Array<CDPJSONPayload>>;
34
- protected generateSessionJson: (browser: BrowserInstance, session: BrowserlessSession) => Promise<{
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: (val: unknown) => void;
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: (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>;
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: () => void;
60
+ stop(): void;
61
61
  }