system-testing 1.0.79 → 1.0.83

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/README.md CHANGED
@@ -163,6 +163,8 @@ Useful browser methods:
163
163
 
164
164
  If you want app-level navigation instead of direct URL loads, keep `Browser` for the driver/session side and use one of the `useSystemTest*` hooks in the app so the communicator has something to talk to.
165
165
 
166
+ `react` and `expo-router` are optional peer dependencies. Install them only in apps that import the React/Expo hook helpers; CLI/browser-daemon consumers should not need React just to use `system-testing`.
167
+
166
168
  ### Browser daemon CLI
167
169
 
168
170
  If you want an external agent to drive a reusable browser process, start the browser daemon:
@@ -188,11 +190,20 @@ npx system-testing browser-list
188
190
 
189
191
  This prints one line per browser with the name and port. Use `--json` if you want machine-readable output.
190
192
 
193
+ Stop a running browser daemon:
194
+
195
+ ```bash
196
+ npx system-testing browser-stop --name my-browser
197
+ ```
198
+
199
+ If only one browser daemon is running, `browser-stop` can omit `--name`.
200
+
191
201
  Send commands from the CLI:
192
202
 
193
203
  ```bash
194
204
  npx system-testing browser-command --name my-browser --visit=https://example.com/path
195
205
  npx system-testing browser-command --name my-browser --find-by-test-id saveButton
206
+ npx system-testing browser-command --name my-browser --find-by-test-id saveButton --timeout 15
196
207
  npx system-testing browser-command --name my-browser --click='[data-testid="saveButton"]'
197
208
  npx system-testing browser-command --name my-browser --get-html
198
209
  npx system-testing browser-command --name my-browser --get-browser-logs
@@ -201,6 +212,8 @@ npx system-testing browser-command --name my-browser --take-screenshot
201
212
 
202
213
  If only one browser daemon is running, `browser-command` can omit `--name`. Results are printed as JSON so automation tools can parse them easily.
203
214
 
215
+ CLI `--timeout` values are supported on navigation and selector-based commands. Bare numbers are interpreted as seconds, and explicit `ms` / `s` suffixes are also accepted.
216
+
204
217
  Generic commands are also supported:
205
218
 
206
219
  ```bash
@@ -209,9 +222,12 @@ npx system-testing browser-command \
209
222
  --command=interact \
210
223
  --selector='[data-testid="emailInput"]' \
211
224
  --method=sendKeys \
212
- --arg='user@example.com'
225
+ --arg='user@example.com' \
226
+ --with-fallback=true
213
227
  ```
214
228
 
229
+ `sendKeys` uses the driver's normal typing path by default. If you specifically need the DOM value-setter fallback for React Native Web inputs that do not update from ordinary typing in your environment, opt into it with `withFallback: true` in JS or `--with-fallback=true` in the CLI/browser-command transport.
230
+
215
231
  The browser daemon is intended for agent-style development workflows where an AI or script needs to open the app, inspect HTML, locate elements, click controls, and read logs while validating layout or behavior changes.
216
232
 
217
233
  ### Browser daemon WebSocket protocol
@@ -10,9 +10,16 @@ export default class BrowserCommandRunner {
10
10
  browser: import("./browser.js").default;
11
11
  /**
12
12
  * @param {Record<string, any>} commandArgs
13
- * @returns {Record<string, any>}
13
+ * @returns {{timeout?: number}}
14
14
  */
15
- normalizeFindArgs(commandArgs: Record<string, any>): Record<string, any>;
15
+ normalizeTimeoutArgs(commandArgs: Record<string, any>): {
16
+ timeout?: number;
17
+ };
18
+ /**
19
+ * @param {Record<string, any>} commandArgs
20
+ * @returns {import("./system-test.js").FindArgs}
21
+ */
22
+ normalizeFindArgs(commandArgs: Record<string, any>): import("./system-test.js").FindArgs;
16
23
  /**
17
24
  * @param {import("selenium-webdriver").WebElement} element
18
25
  * @returns {Promise<Record<string, any>>}
@@ -9,13 +9,24 @@ export default class BrowserCommandRunner {
9
9
  }
10
10
  /**
11
11
  * @param {Record<string, any>} commandArgs
12
- * @returns {Record<string, any>}
12
+ * @returns {{timeout?: number}}
13
13
  */
14
- normalizeFindArgs(commandArgs) {
15
- const findArgs = {};
14
+ normalizeTimeoutArgs(commandArgs) {
15
+ const normalizedArgs = {};
16
16
  if ("timeout" in commandArgs && commandArgs.timeout !== undefined) {
17
- findArgs.timeout = Number(commandArgs.timeout);
17
+ normalizedArgs.timeout = Number(commandArgs.timeout);
18
+ if (Number.isNaN(normalizedArgs.timeout)) {
19
+ throw new Error(`Invalid timeout: ${commandArgs.timeout}`);
20
+ }
18
21
  }
22
+ return normalizedArgs;
23
+ }
24
+ /**
25
+ * @param {Record<string, any>} commandArgs
26
+ * @returns {import("./system-test.js").FindArgs}
27
+ */
28
+ normalizeFindArgs(commandArgs) {
29
+ const findArgs = /** @type {import("./system-test.js").FindArgs} */ (this.normalizeTimeoutArgs(commandArgs));
19
30
  if ("visible" in commandArgs && commandArgs.visible !== undefined) {
20
31
  if (commandArgs.visible === null || commandArgs.visible === "null") {
21
32
  findArgs.visible = null;
@@ -58,7 +69,7 @@ export default class BrowserCommandRunner {
58
69
  if (!path) {
59
70
  throw new Error("visit requires path or url");
60
71
  }
61
- await this.browser.visit(path);
72
+ await this.browser.visit(path, this.normalizeTimeoutArgs(commandArgs));
62
73
  return { ok: true };
63
74
  }
64
75
  if (command === "dismissTo") {
@@ -66,7 +77,7 @@ export default class BrowserCommandRunner {
66
77
  if (!path) {
67
78
  throw new Error("dismissTo requires path or url");
68
79
  }
69
- await this.browser.dismissTo(path);
80
+ await this.browser.dismissTo(path, this.normalizeTimeoutArgs(commandArgs));
70
81
  return { ok: true };
71
82
  }
72
83
  if (command === "setBaseSelector") {
@@ -129,16 +140,25 @@ export default class BrowserCommandRunner {
129
140
  const selector = commandArgs.selector;
130
141
  const methodName = commandArgs.methodName ?? commandArgs.method;
131
142
  const methodArgs = Array.isArray(commandArgs.args) ? commandArgs.args : [];
143
+ const interactArgs = /** @type {{selector: string} & import("./system-test.js").InteractArgs} */ ({ selector, ...this.normalizeFindArgs(commandArgs) });
132
144
  if (!selector) {
133
145
  throw new Error("interact requires selector");
134
146
  }
135
147
  if (!methodName) {
136
148
  throw new Error("interact requires methodName");
137
149
  }
138
- const result = await this.browser.interact({ selector, ...this.normalizeFindArgs(commandArgs) }, methodName, ...methodArgs);
150
+ if ("withFallback" in commandArgs && commandArgs.withFallback !== undefined) {
151
+ if (typeof commandArgs.withFallback === "boolean") {
152
+ interactArgs.withFallback = commandArgs.withFallback;
153
+ }
154
+ else {
155
+ interactArgs.withFallback = commandArgs.withFallback === "true";
156
+ }
157
+ }
158
+ const result = await this.browser.interact(interactArgs, methodName, ...methodArgs);
139
159
  return { result };
140
160
  }
141
161
  throw new Error(`Unknown browser command: ${command}`);
142
162
  }
143
163
  }
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1jb21tYW5kLXJ1bm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9icm93c2VyLWNvbW1hbmQtcnVubmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsT0FBTyxPQUFPLG9CQUFvQjtJQUN2Qzs7O09BR0c7SUFDSCxZQUFZLEVBQUMsT0FBTyxFQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO0lBQ3hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxpQkFBaUIsQ0FBQyxXQUFXO1FBQzNCLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQTtRQUVuQixJQUFJLFNBQVMsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsRSxRQUFRLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDaEQsQ0FBQztRQUVELElBQUksU0FBUyxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2xFLElBQUksV0FBVyxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksV0FBVyxDQUFDLE9BQU8sS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDbkUsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUE7WUFDekIsQ0FBQztpQkFBTSxJQUFJLE9BQU8sV0FBVyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDcEQsUUFBUSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFBO1lBQ3hDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixRQUFRLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLEtBQUssTUFBTSxDQUFBO1lBQ25ELENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxpQkFBaUIsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLGVBQWUs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TyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1lBRTFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUE7WUFDL0MsQ0FBQztZQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO1lBQ2pELENBQUM7WUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxFQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUE7WUFFekgsT0FBTyxFQUFDLE1BQU0sRUFBQyxDQUFBO1FBQ2pCLENBQUM7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQ3hELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBSdW5zIGJyb3dzZXIgY29tbWFuZHMgYWNyb3NzIENMSSBhbmQgV2ViU29ja2V0IHRyYW5zcG9ydHMuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCcm93c2VyQ29tbWFuZFJ1bm5lciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vYnJvd3Nlci5qc1wiKS5kZWZhdWx0fSBhcmdzLmJyb3dzZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKHticm93c2VyfSkge1xuICAgIHRoaXMuYnJvd3NlciA9IGJyb3dzZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbW1hbmRBcmdzXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fVxuICAgKi9cbiAgbm9ybWFsaXplRmluZEFyZ3MoY29tbWFuZEFyZ3MpIHtcbiAgICBjb25zdCBmaW5kQXJncyA9IHt9XG5cbiAgICBpZiAoXCJ0aW1lb3V0XCIgaW4gY29tbWFuZEFyZ3MgJiYgY29tbWFuZEFyZ3MudGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaW5kQXJncy50aW1lb3V0ID0gTnVtYmVyKGNvbW1hbmRBcmdzLnRpbWVvdXQpXG4gICAgfVxuXG4gICAgaWYgKFwidmlzaWJsZVwiIGluIGNvbW1hbmRBcmdzICYmIGNvbW1hbmRBcmdzLnZpc2libGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvbW1hbmRBcmdzLnZpc2libGUgPT09IG51bGwgfHwgY29tbWFuZEFyZ3MudmlzaWJsZSA9PT0gXCJudWxsXCIpIHtcbiAgICAgICAgZmluZEFyZ3MudmlzaWJsZSA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbW1hbmRBcmdzLnZpc2libGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGZpbmRBcmdzLnZpc2libGUgPSBjb21tYW5kQXJncy52aXNpYmxlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaW5kQXJncy52aXNpYmxlID0gY29tbWFuZEFyZ3MudmlzaWJsZSA9PT0gXCJ0cnVlXCJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXCJ1c2VCYXNlU2VsZWN0b3JcIiBpbiBjb21tYW5kQXJncyAmJiBjb21tYW5kQXJncy51c2VCYXNlU2VsZWN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21tYW5kQXJncy51c2VCYXNlU2VsZWN0b3IgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGZpbmRBcmdzLnVzZUJhc2VTZWxlY3RvciA9IGNvbW1hbmRBcmdzLnVzZUJhc2VTZWxlY3RvclxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluZEFyZ3MudXNlQmFzZVNlbGVjdG9yID0gY29tbWFuZEFyZ3MudXNlQmFzZVNlbGVjdG9yID09PSBcInRydWVcIlxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaW5kQXJnc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59XG4gICAqL1xuICBhc3luYyBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgZWxlbWVudC5nZXRUZXh0KClcbiAgICBjb25zdCB0YWdOYW1lID0gYXdhaXQgZWxlbWVudC5nZXRUYWdOYW1lKClcbiAgICBjb25zdCBkaXNwbGF5ZWQgPSBhd2FpdCBlbGVtZW50LmlzRGlzcGxheWVkKClcblxuICAgIHJldHVybiB7ZGlzcGxheWVkLCB0YWdOYW1lLCB0ZXh0fVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29tbWFuZEFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIHJ1bihjb21tYW5kLCBjb21tYW5kQXJncyA9IHt9KSB7XG4gICAgaWYgKGNvbW1hbmQgPT09IFwidmlzaXRcIikge1xuICAgICAgY29uc3QgcGF0aCA9IGNvbW1hbmRBcmdzLnBhdGggPz8gY29tbWFuZEFyZ3MudXJsXG5cbiAgICAgIGlmICghcGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ2aXNpdCByZXF1aXJlcyBwYXRoIG9yIHVybFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmJyb3dzZXIudmlzaXQocGF0aClcbiAgICAgIHJldHVybiB7b2s6IHRydWV9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwiZGlzbWlzc1RvXCIpIHtcbiAgICAgIGNvbnN0IHBhdGggPSBjb21tYW5kQXJncy5wYXRoID8/IGNvbW1hbmRBcmdzLnVybFxuXG4gICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZGlzbWlzc1RvIHJlcXVpcmVzIHBhdGggb3IgdXJsXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5kaXNtaXNzVG8ocGF0aClcbiAgICAgIHJldHVybiB7b2s6IHRydWV9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwic2V0QmFzZVNlbGVjdG9yXCIpIHtcbiAgICAgIGlmICghY29tbWFuZEFyZ3Muc2VsZWN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2V0QmFzZVNlbGVjdG9yIHJlcXVpcmVzIHNlbGVjdG9yXCIpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuYnJvd3Nlci5zZXRCYXNlU2VsZWN0b3IoY29tbWFuZEFyZ3Muc2VsZWN0b3IpXG4gICAgICByZXR1cm4ge29rOiB0cnVlfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcImdldEN1cnJlbnRVcmxcIikge1xuICAgICAgcmV0dXJuIHtjdXJyZW50VXJsOiBhd2FpdCB0aGlzLmJyb3dzZXIuZ2V0Q3VycmVudFVybCgpfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcImdldEhUTUxcIikge1xuICAgICAgcmV0dXJuIHtodG1sOiBhd2FpdCB0aGlzLmJyb3dzZXIuZ2V0SFRNTCgpfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcImdldEJyb3dzZXJMb2dzXCIpIHtcbiAgICAgIHJldHVybiB7bG9nczogYXdhaXQgdGhpcy5icm93c2VyLmdldEJyb3dzZXJMb2dzKCl9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwidGFrZVNjcmVlbnNob3RcIikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYnJvd3Nlci50YWtlU2NyZWVuc2hvdCgpXG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwiZmluZFwiKSB7XG4gICAgICBpZiAoIWNvbW1hbmRBcmdzLnNlbGVjdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImZpbmQgcmVxdWlyZXMgc2VsZWN0b3JcIilcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuYnJvd3Nlci5maW5kKGNvbW1hbmRBcmdzLnNlbGVjdG9yLCB0aGlzLm5vcm1hbGl6ZUZpbmRBcmdzKGNvbW1hbmRBcmdzKSlcblxuICAgICAgcmV0dXJuIHtlbGVtZW50OiBhd2FpdCB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCl9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwiZmluZEJ5VGVzdElEXCIpIHtcbiAgICAgIGNvbnN0IHRlc3RJRCA9IGNvbW1hbmRBcmdzLnRlc3RJRCA/PyBjb21tYW5kQXJncy50ZXN0SWRcblxuICAgICAgaWYgKCF0ZXN0SUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmluZEJ5VGVzdElEIHJlcXVpcmVzIHRlc3RJRFwiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgdGhpcy5icm93c2VyLmZpbmRCeVRlc3RJRCh0ZXN0SUQsIHRoaXMubm9ybWFsaXplRmluZEFyZ3MoY29tbWFuZEFyZ3MpKVxuXG4gICAgICByZXR1cm4ge2VsZW1lbnQ6IGF3YWl0IHRoaXMuc2VyaWFsaXplRWxlbWVudChlbGVtZW50KX1cbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZCA9PT0gXCJjbGlja1wiKSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IGNvbW1hbmRBcmdzLnNlbGVjdG9yXG5cbiAgICAgIGlmICghc2VsZWN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2xpY2sgcmVxdWlyZXMgc2VsZWN0b3JcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLmNsaWNrKHNlbGVjdG9yLCB0aGlzLm5vcm1hbGl6ZUZpbmRBcmdzKGNvbW1hbmRBcmdzKSlcbiAgICAgIHJldHVybiB7b2s6IHRydWV9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwid2FpdEZvck5vU2VsZWN0b3JcIikge1xuICAgICAgaWYgKCFjb21tYW5kQXJncy5zZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ3YWl0Rm9yTm9TZWxlY3RvciByZXF1aXJlcyBzZWxlY3RvclwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmJyb3dzZXIud2FpdEZvck5vU2VsZWN0b3IoY29tbWFuZEFyZ3Muc2VsZWN0b3IsIHRoaXMubm9ybWFsaXplRmluZEFyZ3MoY29tbWFuZEFyZ3MpKVxuICAgICAgcmV0dXJuIHtvazogdHJ1ZX1cbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZCA9PT0gXCJleHBlY3ROb0VsZW1lbnRcIikge1xuICAgICAgaWYgKCFjb21tYW5kQXJncy5zZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHBlY3ROb0VsZW1lbnQgcmVxdWlyZXMgc2VsZWN0b3JcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLmV4cGVjdE5vRWxlbWVudChjb21tYW5kQXJncy5zZWxlY3RvciwgdGhpcy5ub3JtYWxpemVGaW5kQXJncyhjb21tYW5kQXJncykpXG4gICAgICByZXR1cm4ge29rOiB0cnVlfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcImludGVyYWN0XCIpIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29tbWFuZEFyZ3Muc2VsZWN0b3JcbiAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBjb21tYW5kQXJncy5tZXRob2ROYW1lID8/IGNvbW1hbmRBcmdzLm1ldGhvZFxuICAgICAgY29uc3QgbWV0aG9kQXJncyA9IEFycmF5LmlzQXJyYXkoY29tbWFuZEFyZ3MuYXJncykgPyBjb21tYW5kQXJncy5hcmdzIDogW11cblxuICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnRlcmFjdCByZXF1aXJlcyBzZWxlY3RvclwiKVxuICAgICAgfVxuXG4gICAgICBpZiAoIW1ldGhvZE5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW50ZXJhY3QgcmVxdWlyZXMgbWV0aG9kTmFtZVwiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJyb3dzZXIuaW50ZXJhY3Qoe3NlbGVjdG9yLCAuLi50aGlzLm5vcm1hbGl6ZUZpbmRBcmdzKGNvbW1hbmRBcmdzKX0sIG1ldGhvZE5hbWUsIC4uLm1ldGhvZEFyZ3MpXG5cbiAgICAgIHJldHVybiB7cmVzdWx0fVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBicm93c2VyIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKVxuICB9XG59XG4iXX0=
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1jb21tYW5kLXJ1bm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9icm93c2VyLWNvbW1hbmQtcnVubmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsT0FBTyxPQUFPLG9CQUFvQjtJQUN2Qzs7O09BR0c7SUFDSCxZQUFZLEVBQUMsT0FBTyxFQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO0lBQ3hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxvQkFBb0IsQ0FBQyxXQUFXO1FBQzlCLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQTtRQUV6QixJQUFJLFNBQVMsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsRSxjQUFjLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUE7WUFFcEQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUM1RCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sY0FBYyxDQUFBO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxpQkFBaUIsQ0FBQyxXQUFXO1FBQzNCLE1BQU0sUUFBUSxHQUFHLGtEQUFrRCxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFFNUcsSUFBSSxTQUFTLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEUsSUFBSSxXQUFXLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxXQUFXLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUNuRSxRQUFR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QkFDTixZQUFZLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxZQUFZLEtBQUssTUFBTSxDQUFBO2dCQUNqRSxDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFBO1lBRW5GLE9BQU8sRUFBQyxNQUFNLEVBQUMsQ0FBQTtRQUNqQixDQUFDO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUN4RCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogUnVucyBicm93c2VyIGNvbW1hbmRzIGFjcm9zcyBDTEkgYW5kIFdlYlNvY2tldCB0cmFuc3BvcnRzLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnJvd3NlckNvbW1hbmRSdW5uZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jyb3dzZXIuanNcIikuZGVmYXVsdH0gYXJncy5icm93c2VyXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7YnJvd3Nlcn0pIHtcbiAgICB0aGlzLmJyb3dzZXIgPSBicm93c2VyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb21tYW5kQXJnc1xuICAgKiBAcmV0dXJucyB7e3RpbWVvdXQ/OiBudW1iZXJ9fVxuICAgKi9cbiAgbm9ybWFsaXplVGltZW91dEFyZ3MoY29tbWFuZEFyZ3MpIHtcbiAgICBjb25zdCBub3JtYWxpemVkQXJncyA9IHt9XG5cbiAgICBpZiAoXCJ0aW1lb3V0XCIgaW4gY29tbWFuZEFyZ3MgJiYgY29tbWFuZEFyZ3MudGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBub3JtYWxpemVkQXJncy50aW1lb3V0ID0gTnVtYmVyKGNvbW1hbmRBcmdzLnRpbWVvdXQpXG5cbiAgICAgIGlmIChOdW1iZXIuaXNOYU4obm9ybWFsaXplZEFyZ3MudGltZW91dCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRpbWVvdXQ6ICR7Y29tbWFuZEFyZ3MudGltZW91dH1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkQXJnc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29tbWFuZEFyZ3NcbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9XG4gICAqL1xuICBub3JtYWxpemVGaW5kQXJncyhjb21tYW5kQXJncykge1xuICAgIGNvbnN0IGZpbmRBcmdzID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSAqLyAodGhpcy5ub3JtYWxpemVUaW1lb3V0QXJncyhjb21tYW5kQXJncykpXG5cbiAgICBpZiAoXCJ2aXNpYmxlXCIgaW4gY29tbWFuZEFyZ3MgJiYgY29tbWFuZEFyZ3MudmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29tbWFuZEFyZ3MudmlzaWJsZSA9PT0gbnVsbCB8fCBjb21tYW5kQXJncy52aXNpYmxlID09PSBcIm51bGxcIikge1xuICAgICAgICBmaW5kQXJncy52aXNpYmxlID0gbnVsbFxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29tbWFuZEFyZ3MudmlzaWJsZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgZmluZEFyZ3MudmlzaWJsZSA9IGNvbW1hbmRBcmdzLnZpc2libGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbmRBcmdzLnZpc2libGUgPSBjb21tYW5kQXJncy52aXNpYmxlID09PSBcInRydWVcIlxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcInVzZUJhc2VTZWxlY3RvclwiIGluIGNvbW1hbmRBcmdzICYmIGNvbW1hbmRBcmdzLnVzZUJhc2VTZWxlY3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbW1hbmRBcmdzLnVzZUJhc2VTZWxlY3RvciA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgZmluZEFyZ3MudXNlQmFzZVNlbGVjdG9yID0gY29tbWFuZEFyZ3MudXNlQmFzZVNlbGVjdG9yXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaW5kQXJncy51c2VCYXNlU2VsZWN0b3IgPSBjb21tYW5kQXJncy51c2VCYXNlU2VsZWN0b3IgPT09IFwidHJ1ZVwiXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbmRBcmdzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn1cbiAgICovXG4gIGFzeW5jIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCkge1xuICAgIGNvbnN0IHRleHQgPSBhd2FpdCBlbGVtZW50LmdldFRleHQoKVxuICAgIGNvbnN0IHRhZ05hbWUgPSBhd2FpdCBlbGVtZW50LmdldFRhZ05hbWUoKVxuICAgIGNvbnN0IGRpc3BsYXllZCA9IGF3YWl0IGVsZW1lbnQuaXNEaXNwbGF5ZWQoKVxuXG4gICAgcmV0dXJuIHtkaXNwbGF5ZWQsIHRhZ05hbWUsIHRleHR9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmRcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb21tYW5kQXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgcnVuKGNvbW1hbmQsIGNvbW1hbmRBcmdzID0ge30pIHtcbiAgICBpZiAoY29tbWFuZCA9PT0gXCJ2aXNpdFwiKSB7XG4gICAgICBjb25zdCBwYXRoID0gY29tbWFuZEFyZ3MucGF0aCA/PyBjb21tYW5kQXJncy51cmxcblxuICAgICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInZpc2l0IHJlcXVpcmVzIHBhdGggb3IgdXJsXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci52aXNpdChwYXRoLCB0aGlzLm5vcm1hbGl6ZVRpbWVvdXRBcmdzKGNvbW1hbmRBcmdzKSlcbiAgICAgIHJldHVybiB7b2s6IHRydWV9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwiZGlzbWlzc1RvXCIpIHtcbiAgICAgIGNvbnN0IHBhdGggPSBjb21tYW5kQXJncy5wYXRoID8/IGNvbW1hbmRBcmdzLnVybFxuXG4gICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZGlzbWlzc1RvIHJlcXVpcmVzIHBhdGggb3IgdXJsXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5kaXNtaXNzVG8ocGF0aCwgdGhpcy5ub3JtYWxpemVUaW1lb3V0QXJncyhjb21tYW5kQXJncykpXG4gICAgICByZXR1cm4ge29rOiB0cnVlfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcInNldEJhc2VTZWxlY3RvclwiKSB7XG4gICAgICBpZiAoIWNvbW1hbmRBcmdzLnNlbGVjdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldEJhc2VTZWxlY3RvciByZXF1aXJlcyBzZWxlY3RvclwiKVxuICAgICAgfVxuXG4gICAgICB0aGlzLmJyb3dzZXIuc2V0QmFzZVNlbGVjdG9yKGNvbW1hbmRBcmdzLnNlbGVjdG9yKVxuICAgICAgcmV0dXJuIHtvazogdHJ1ZX1cbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZCA9PT0gXCJnZXRDdXJyZW50VXJsXCIpIHtcbiAgICAgIHJldHVybiB7Y3VycmVudFVybDogYXdhaXQgdGhpcy5icm93c2VyLmdldEN1cnJlbnRVcmwoKX1cbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZCA9PT0gXCJnZXRIVE1MXCIpIHtcbiAgICAgIHJldHVybiB7aHRtbDogYXdhaXQgdGhpcy5icm93c2VyLmdldEhUTUwoKX1cbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZCA9PT0gXCJnZXRCcm93c2VyTG9nc1wiKSB7XG4gICAgICByZXR1cm4ge2xvZ3M6IGF3YWl0IHRoaXMuYnJvd3Nlci5nZXRCcm93c2VyTG9ncygpfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcInRha2VTY3JlZW5zaG90XCIpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJyb3dzZXIudGFrZVNjcmVlbnNob3QoKVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcImZpbmRcIikge1xuICAgICAgaWYgKCFjb21tYW5kQXJncy5zZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaW5kIHJlcXVpcmVzIHNlbGVjdG9yXCIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLmJyb3dzZXIuZmluZChjb21tYW5kQXJncy5zZWxlY3RvciwgdGhpcy5ub3JtYWxpemVGaW5kQXJncyhjb21tYW5kQXJncykpXG5cbiAgICAgIHJldHVybiB7ZWxlbWVudDogYXdhaXQgdGhpcy5zZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcImZpbmRCeVRlc3RJRFwiKSB7XG4gICAgICBjb25zdCB0ZXN0SUQgPSBjb21tYW5kQXJncy50ZXN0SUQgPz8gY29tbWFuZEFyZ3MudGVzdElkXG5cbiAgICAgIGlmICghdGVzdElEKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImZpbmRCeVRlc3RJRCByZXF1aXJlcyB0ZXN0SURcIilcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuYnJvd3Nlci5maW5kQnlUZXN0SUQodGVzdElELCB0aGlzLm5vcm1hbGl6ZUZpbmRBcmdzKGNvbW1hbmRBcmdzKSlcblxuICAgICAgcmV0dXJuIHtlbGVtZW50OiBhd2FpdCB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCl9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwiY2xpY2tcIikge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb21tYW5kQXJncy5zZWxlY3RvclxuXG4gICAgICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImNsaWNrIHJlcXVpcmVzIHNlbGVjdG9yXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5jbGljayhzZWxlY3RvciwgdGhpcy5ub3JtYWxpemVGaW5kQXJncyhjb21tYW5kQXJncykpXG4gICAgICByZXR1cm4ge29rOiB0cnVlfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcIndhaXRGb3JOb1NlbGVjdG9yXCIpIHtcbiAgICAgIGlmICghY29tbWFuZEFyZ3Muc2VsZWN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwid2FpdEZvck5vU2VsZWN0b3IgcmVxdWlyZXMgc2VsZWN0b3JcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLndhaXRGb3JOb1NlbGVjdG9yKGNvbW1hbmRBcmdzLnNlbGVjdG9yLCB0aGlzLm5vcm1hbGl6ZUZpbmRBcmdzKGNvbW1hbmRBcmdzKSlcbiAgICAgIHJldHVybiB7b2s6IHRydWV9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwiZXhwZWN0Tm9FbGVtZW50XCIpIHtcbiAgICAgIGlmICghY29tbWFuZEFyZ3Muc2VsZWN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXhwZWN0Tm9FbGVtZW50IHJlcXVpcmVzIHNlbGVjdG9yXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5leHBlY3ROb0VsZW1lbnQoY29tbWFuZEFyZ3Muc2VsZWN0b3IsIHRoaXMubm9ybWFsaXplRmluZEFyZ3MoY29tbWFuZEFyZ3MpKVxuICAgICAgcmV0dXJuIHtvazogdHJ1ZX1cbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZCA9PT0gXCJpbnRlcmFjdFwiKSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IGNvbW1hbmRBcmdzLnNlbGVjdG9yXG4gICAgICBjb25zdCBtZXRob2ROYW1lID0gY29tbWFuZEFyZ3MubWV0aG9kTmFtZSA/PyBjb21tYW5kQXJncy5tZXRob2RcbiAgICAgIGNvbnN0IG1ldGhvZEFyZ3MgPSBBcnJheS5pc0FycmF5KGNvbW1hbmRBcmdzLmFyZ3MpID8gY29tbWFuZEFyZ3MuYXJncyA6IFtdXG4gICAgICBjb25zdCBpbnRlcmFjdEFyZ3MgPSAvKiogQHR5cGUge3tzZWxlY3Rvcjogc3RyaW5nfSAmIGltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuSW50ZXJhY3RBcmdzfSAqLyAoe3NlbGVjdG9yLCAuLi50aGlzLm5vcm1hbGl6ZUZpbmRBcmdzKGNvbW1hbmRBcmdzKX0pXG5cbiAgICAgIGlmICghc2VsZWN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW50ZXJhY3QgcmVxdWlyZXMgc2VsZWN0b3JcIilcbiAgICAgIH1cblxuICAgICAgaWYgKCFtZXRob2ROYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImludGVyYWN0IHJlcXVpcmVzIG1ldGhvZE5hbWVcIilcbiAgICAgIH1cblxuICAgICAgaWYgKFwid2l0aEZhbGxiYWNrXCIgaW4gY29tbWFuZEFyZ3MgJiYgY29tbWFuZEFyZ3Mud2l0aEZhbGxiYWNrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21tYW5kQXJncy53aXRoRmFsbGJhY2sgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaW50ZXJhY3RBcmdzLndpdGhGYWxsYmFjayA9IGNvbW1hbmRBcmdzLndpdGhGYWxsYmFja1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGludGVyYWN0QXJncy53aXRoRmFsbGJhY2sgPSBjb21tYW5kQXJncy53aXRoRmFsbGJhY2sgPT09IFwidHJ1ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5icm93c2VyLmludGVyYWN0KGludGVyYWN0QXJncywgbWV0aG9kTmFtZSwgLi4ubWV0aG9kQXJncylcblxuICAgICAgcmV0dXJuIHtyZXN1bHR9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGJyb3dzZXIgY29tbWFuZDogJHtjb21tYW5kfWApXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export const browserDaemonStopTimeoutMs: 10000;
2
+ export const browserDaemonVerifyTimeoutMs: 1000;
@@ -0,0 +1,3 @@
1
+ export const browserDaemonStopTimeoutMs = 10000;
2
+ export const browserDaemonVerifyTimeoutMs = 1000;
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1kYWVtb24tY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jyb3dzZXItZGFlbW9uLWNvbnN0YW50cy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxLQUFLLENBQUE7QUFDL0MsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGJyb3dzZXJEYWVtb25TdG9wVGltZW91dE1zID0gMTAwMDBcbmV4cG9ydCBjb25zdCBicm93c2VyRGFlbW9uVmVyaWZ5VGltZW91dE1zID0gMTAwMFxuIl19
@@ -1,5 +1,6 @@
1
1
  import Browser from "./browser.js";
2
2
  import BrowserCommandRunner from "./browser-command-runner.js";
3
+ import { browserDaemonStopTimeoutMs } from "./browser-daemon-constants.js";
3
4
  import BrowserRegistry from "./browser-registry.js";
4
5
  import { WebSocketServer } from "ws";
5
6
  /** Long-running browser daemon exposing browser commands over WebSocket. */
@@ -53,7 +54,7 @@ export default class BrowserProcess {
53
54
  this.browser.getDriverAdapter().setBaseUrl(this.baseUrl);
54
55
  }
55
56
  await this.browser.getDriverAdapter().start();
56
- await this.browser.setTimeouts(10000);
57
+ await this.browser.setTimeouts(browserDaemonStopTimeoutMs);
57
58
  this.wss = new WebSocketServer({ port: this.port });
58
59
  await new Promise((resolve) => {
59
60
  this.wss.once("listening", resolve);
@@ -104,6 +105,12 @@ export default class BrowserProcess {
104
105
  * @returns {Promise<any>}
105
106
  */
106
107
  async handlePayload(payload) {
108
+ if (payload.type === "browser-daemon") {
109
+ if (payload.command !== "describe") {
110
+ throw new Error(`Unknown browser daemon command: ${payload.command}`);
111
+ }
112
+ return { name: this.name, pid: process.pid, port: this.port };
113
+ }
107
114
  if (payload.type !== "browser-command") {
108
115
  throw new Error(`Unknown payload type: ${payload.type}`);
109
116
  }
@@ -124,4 +131,4 @@ export default class BrowserProcess {
124
131
  return await this.requestRunner.run(command, commandArgs);
125
132
  }
126
133
  }
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1wcm9jZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jyb3dzZXItcHJvY2Vzcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUE7QUFDbEMsT0FBTyxvQkFBb0IsTUFBTSw2QkFBNkIsQ0FBQTtBQUM5RCxPQUFPLGVBQWUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sSUFBSSxDQUFBO0FBRWxDLDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsT0FBTyxPQUFPLGNBQWM7SUFDakM7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxXQUFXLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEdBQUcsS0FBSyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUM7UUE4RS9FOzs7V0FHRztRQUNILGlCQUFZLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNwQixFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7Z0JBQ2pDLE1BQU0sU0FBUyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFBO2dCQUV4RCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtvQkFDOUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUVoRCxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFDLENBQUMsQ0FBQyxDQUFBO2dC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QUE7UUFDMUQsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUE7UUFDL0IsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRXpELElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNwQyxXQUFXLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUE7UUFDL0IsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QyxXQUFXLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUE7UUFDakMsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5QyxXQUFXLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUE7UUFDekMsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQyxXQUFXLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUE7UUFDckMsQ0FBQztRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDM0QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3Nlci5qc1wiXG5pbXBvcnQgQnJvd3NlckNvbW1hbmRSdW5uZXIgZnJvbSBcIi4vYnJvd3Nlci1jb21tYW5kLXJ1bm5lci5qc1wiXG5pbXBvcnQgQnJvd3NlclJlZ2lzdHJ5IGZyb20gXCIuL2Jyb3dzZXItcmVnaXN0cnkuanNcIlxuaW1wb3J0IHtXZWJTb2NrZXRTZXJ2ZXJ9IGZyb20gXCJ3c1wiXG5cbi8qKiBMb25nLXJ1bm5pbmcgYnJvd3NlciBkYWVtb24gZXhwb3NpbmcgYnJvd3NlciBjb21tYW5kcyBvdmVyIFdlYlNvY2tldC4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJyb3dzZXJQcm9jZXNzIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm5hbWVcbiAgICogQHBhcmFtIHtCcm93c2VyfSBbYXJncy5icm93c2VyXVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFthcmdzLmJyb3dzZXJBcmdzXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuYmFzZVVybF1cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kZWJ1Z11cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnBvcnRdXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7bmFtZSwgYnJvd3NlciwgYnJvd3NlckFyZ3MgPSB7fSwgYmFzZVVybCwgZGVidWcgPSBmYWxzZSwgcG9ydCA9IDB9KSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHRoaXMuYnJvd3NlciA9IGJyb3dzZXIgPz8gbmV3IEJyb3dzZXIoe2RlYnVnLCAuLi5icm93c2VyQXJnc30pXG4gICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybFxuICAgIHRoaXMuZGVidWcgPSBkZWJ1Z1xuICAgIHRoaXMucmVxdWVzdFJ1bm5lciA9IG5ldyBCcm93c2VyQ29tbWFuZFJ1bm5lcih7YnJvd3NlcjogdGhpcy5icm93c2VyfSlcbiAgICB0aGlzLnJlcXVlc3RDb3VudCA9IDBcbiAgICB0aGlzLnBvcnQgPSBwb3J0XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGlmICghdGhpcy5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCcm93c2VyIHByb2Nlc3MgcmVxdWlyZXMgYSBuYW1lXCIpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmFzZVVybCkge1xuICAgICAgdGhpcy5icm93c2VyLmdldERyaXZlckFkYXB0ZXIoKS5zZXRCYXNlVXJsKHRoaXMuYmFzZVVybClcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmJyb3dzZXIuZ2V0RHJpdmVyQWRhcHRlcigpLnN0YXJ0KClcbiAgICBhd2FpdCB0aGlzLmJyb3dzZXIuc2V0VGltZW91dHMoMTAwMDApXG5cbiAgICB0aGlzLndzcyA9IG5ldyBXZWJTb2NrZXRTZXJ2ZXIoe3BvcnQ6IHRoaXMucG9ydH0pXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMud3NzLm9uY2UoXCJsaXN0ZW5pbmdcIiwgcmVzb2x2ZSlcbiAgICB9KVxuXG4gICAgY29uc3QgYWRkcmVzcyA9IHRoaXMud3NzLmFkZHJlc3MoKVxuXG4gICAgaWYgKCFhZGRyZXNzIHx8IHR5cGVvZiBhZGRyZXNzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgcmVzb2x2ZSBicm93c2VyIHByb2Nlc3MgcG9ydFwiKVxuICAgIH1cblxuICAgIHRoaXMucG9ydCA9IGFkZHJlc3MucG9ydFxuICAgIHRoaXMud3NzLm9uKFwiY29ubmVjdGlvblwiLCB0aGlzLm9uQ29ubmVjdGlvbilcblxuICAgIGF3YWl0IEJyb3dzZXJSZWdpc3RyeS5yZWdpc3Rlcih7XG4gICAgICBiYXNlVXJsOiB0aGlzLmJhc2VVcmwsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBwaWQ6IHByb2Nlc3MucGlkLFxuICAgICAgcG9ydDogdGhpcy5wb3J0LFxuICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICB9KVxuXG4gICAgY29uc3Qgc3RvcCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcCgpXG4gICAgICBwcm9jZXNzLmV4aXQoMClcbiAgICB9XG5cbiAgICBwcm9jZXNzLm9uY2UoXCJTSUdJTlRcIiwgc3RvcClcbiAgICBwcm9jZXNzLm9uY2UoXCJTSUdURVJNXCIsIHN0b3ApXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgaWYgKHRoaXMuc3RvcHBlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5zdG9wcGVkID0gdHJ1ZVxuICAgIGF3YWl0IEJyb3dzZXJSZWdpc3RyeS51bnJlZ2lzdGVyKHRoaXMubmFtZSlcblxuICAgIGlmICh0aGlzLndzcykge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLndzcy5jbG9zZSgoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmJyb3dzZXIuc3RvcERyaXZlcigpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXR9IHdzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25Db25uZWN0aW9uID0gKHdzKSA9PiB7XG4gICAgd3Mub24oXCJtZXNzYWdlXCIsIGFzeW5jIChyYXdEYXRhKSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0SWQgPSBgJHtEYXRlLm5vdygpfS0ke3RoaXMucmVxdWVzdENvdW50Kyt9YFxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZShyYXdEYXRhLnRvU3RyaW5nKCkpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaGFuZGxlUGF5bG9hZChwYXlsb2FkKVxuXG4gICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe29rOiB0cnVlLCByZXF1ZXN0SWQsIHJlc3VsdCwgdHlwZTogXCJicm93c2VyLWNvbW1hbmQtcmVzdWx0XCJ9KSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICB0eXBlOiBcImJyb3dzZXItY29tbWFuZC1yZXN1bHRcIlxuICAgICAgICB9KSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcGF5bG9hZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgaGFuZGxlUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgaWYgKHBheWxvYWQudHlwZSAhPT0gXCJicm93c2VyLWNvbW1hbmRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHBheWxvYWQgdHlwZTogJHtwYXlsb2FkLnR5cGV9YClcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kID0gcGF5bG9hZC5jb21tYW5kXG4gICAgY29uc3QgY29tbWFuZEFyZ3MgPSBwYXlsb2FkLmFyZ3MgPyB7Li4ucGF5bG9hZC5hcmdzfSA6IHt9XG5cbiAgICBpZiAocGF5bG9hZC51cmwgJiYgIWNvbW1hbmRBcmdzLnVybCkge1xuICAgICAgY29tbWFuZEFyZ3MudXJsID0gcGF5bG9hZC51cmxcbiAgICB9XG5cbiAgICBpZiAocGF5bG9hZC5wYXRoICYmICFjb21tYW5kQXJncy5wYXRoKSB7XG4gICAgICBjb21tYW5kQXJncy5wYXRoID0gcGF5bG9hZC5wYXRoXG4gICAgfVxuXG4gICAgaWYgKHBheWxvYWQuc2VsZWN0b3IgJiYgIWNvbW1hbmRBcmdzLnNlbGVjdG9yKSB7XG4gICAgICBjb21tYW5kQXJncy5zZWxlY3RvciA9IHBheWxvYWQuc2VsZWN0b3JcbiAgICB9XG5cbiAgICBpZiAocGF5bG9hZC50ZXN0SUQgJiYgIWNvbW1hbmRBcmdzLnRlc3RJRCkge1xuICAgICAgY29tbWFuZEFyZ3MudGVzdElEID0gcGF5bG9hZC50ZXN0SURcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0UnVubmVyLnJ1bihjb21tYW5kLCBjb21tYW5kQXJncylcbiAgfVxufVxuIl19
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1wcm9jZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jyb3dzZXItcHJvY2Vzcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUE7QUFDbEMsT0FBTyxvQkFBb0IsTUFBTSw2QkFBNkIsQ0FBQTtBQUM5RCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQTtBQUN4RSxPQUFPLGVBQWUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sSUFBSSxDQUFBO0FBRWxDLDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsT0FBTyxPQUFPLGNBQWM7SUFDakM7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxXQUFXLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEdBQUcsS0FBSyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUM7UUE4RS9FOzs7V0FHRztRQUNILGlCQUFZLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNwQixFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7Z0JBQ2pDLE1BQU0sU0FBUyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFBO2dCQUV4RCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtvQkFDOUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUVoRCxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFN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QUUsQ0FBQztZQUMxQyxXQUFXLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUE7UUFDckMsQ0FBQztRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDM0QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3Nlci5qc1wiXG5pbXBvcnQgQnJvd3NlckNvbW1hbmRSdW5uZXIgZnJvbSBcIi4vYnJvd3Nlci1jb21tYW5kLXJ1bm5lci5qc1wiXG5pbXBvcnQge2Jyb3dzZXJEYWVtb25TdG9wVGltZW91dE1zfSBmcm9tIFwiLi9icm93c2VyLWRhZW1vbi1jb25zdGFudHMuanNcIlxuaW1wb3J0IEJyb3dzZXJSZWdpc3RyeSBmcm9tIFwiLi9icm93c2VyLXJlZ2lzdHJ5LmpzXCJcbmltcG9ydCB7V2ViU29ja2V0U2VydmVyfSBmcm9tIFwid3NcIlxuXG4vKiogTG9uZy1ydW5uaW5nIGJyb3dzZXIgZGFlbW9uIGV4cG9zaW5nIGJyb3dzZXIgY29tbWFuZHMgb3ZlciBXZWJTb2NrZXQuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCcm93c2VyUHJvY2VzcyB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5uYW1lXG4gICAqIEBwYXJhbSB7QnJvd3Nlcn0gW2FyZ3MuYnJvd3Nlcl1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXJncy5icm93c2VyQXJnc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmJhc2VVcmxdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZGVidWddXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5wb3J0XVxuICAgKi9cbiAgY29uc3RydWN0b3Ioe25hbWUsIGJyb3dzZXIsIGJyb3dzZXJBcmdzID0ge30sIGJhc2VVcmwsIGRlYnVnID0gZmFsc2UsIHBvcnQgPSAwfSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWVcbiAgICB0aGlzLmJyb3dzZXIgPSBicm93c2VyID8/IG5ldyBCcm93c2VyKHtkZWJ1ZywgLi4uYnJvd3NlckFyZ3N9KVxuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmxcbiAgICB0aGlzLmRlYnVnID0gZGVidWdcbiAgICB0aGlzLnJlcXVlc3RSdW5uZXIgPSBuZXcgQnJvd3NlckNvbW1hbmRSdW5uZXIoe2Jyb3dzZXI6IHRoaXMuYnJvd3Nlcn0pXG4gICAgdGhpcy5yZXF1ZXN0Q291bnQgPSAwXG4gICAgdGhpcy5wb3J0ID0gcG9ydFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICBpZiAoIXRoaXMubmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnJvd3NlciBwcm9jZXNzIHJlcXVpcmVzIGEgbmFtZVwiKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmJhc2VVcmwpIHtcbiAgICAgIHRoaXMuYnJvd3Nlci5nZXREcml2ZXJBZGFwdGVyKCkuc2V0QmFzZVVybCh0aGlzLmJhc2VVcmwpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5icm93c2VyLmdldERyaXZlckFkYXB0ZXIoKS5zdGFydCgpXG4gICAgYXdhaXQgdGhpcy5icm93c2VyLnNldFRpbWVvdXRzKGJyb3dzZXJEYWVtb25TdG9wVGltZW91dE1zKVxuXG4gICAgdGhpcy53c3MgPSBuZXcgV2ViU29ja2V0U2VydmVyKHtwb3J0OiB0aGlzLnBvcnR9KVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLndzcy5vbmNlKFwibGlzdGVuaW5nXCIsIHJlc29sdmUpXG4gICAgfSlcblxuICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLndzcy5hZGRyZXNzKClcblxuICAgIGlmICghYWRkcmVzcyB8fCB0eXBlb2YgYWRkcmVzcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IHJlc29sdmUgYnJvd3NlciBwcm9jZXNzIHBvcnRcIilcbiAgICB9XG5cbiAgICB0aGlzLnBvcnQgPSBhZGRyZXNzLnBvcnRcbiAgICB0aGlzLndzcy5vbihcImNvbm5lY3Rpb25cIiwgdGhpcy5vbkNvbm5lY3Rpb24pXG5cbiAgICBhd2FpdCBCcm93c2VyUmVnaXN0cnkucmVnaXN0ZXIoe1xuICAgICAgYmFzZVVybDogdGhpcy5iYXNlVXJsLFxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgcGlkOiBwcm9jZXNzLnBpZCxcbiAgICAgIHBvcnQ6IHRoaXMucG9ydCxcbiAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgfSlcblxuICAgIGNvbnN0IHN0b3AgPSBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnN0b3AoKVxuICAgICAgcHJvY2Vzcy5leGl0KDApXG4gICAgfVxuXG4gICAgcHJvY2Vzcy5vbmNlKFwiU0lHSU5UXCIsIHN0b3ApXG4gICAgcHJvY2Vzcy5vbmNlKFwiU0lHVEVSTVwiLCBzdG9wKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIGlmICh0aGlzLnN0b3BwZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc3RvcHBlZCA9IHRydWVcbiAgICBhd2FpdCBCcm93c2VyUmVnaXN0cnkudW5yZWdpc3Rlcih0aGlzLm5hbWUpXG5cbiAgICBpZiAodGhpcy53c3MpIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy53c3MuY2xvc2UoKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5icm93c2VyLnN0b3BEcml2ZXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwid3NcIikuV2ViU29ja2V0fSB3c1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uQ29ubmVjdGlvbiA9ICh3cykgPT4ge1xuICAgIHdzLm9uKFwibWVzc2FnZVwiLCBhc3luYyAocmF3RGF0YSkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdElkID0gYCR7RGF0ZS5ub3coKX0tJHt0aGlzLnJlcXVlc3RDb3VudCsrfWBcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UocmF3RGF0YS50b1N0cmluZygpKVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmhhbmRsZVBheWxvYWQocGF5bG9hZClcblxuICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtvazogdHJ1ZSwgcmVxdWVzdElkLCByZXN1bHQsIHR5cGU6IFwiYnJvd3Nlci1jb21tYW5kLXJlc3VsdFwifSkpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgdHlwZTogXCJicm93c2VyLWNvbW1hbmQtcmVzdWx0XCJcbiAgICAgICAgfSkpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHBheWxvYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIGhhbmRsZVBheWxvYWQocGF5bG9hZCkge1xuICAgIGlmIChwYXlsb2FkLnR5cGUgPT09IFwiYnJvd3Nlci1kYWVtb25cIikge1xuICAgICAgaWYgKHBheWxvYWQuY29tbWFuZCAhPT0gXCJkZXNjcmliZVwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBicm93c2VyIGRhZW1vbiBjb21tYW5kOiAke3BheWxvYWQuY29tbWFuZH1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge25hbWU6IHRoaXMubmFtZSwgcGlkOiBwcm9jZXNzLnBpZCwgcG9ydDogdGhpcy5wb3J0fVxuICAgIH1cblxuICAgIGlmIChwYXlsb2FkLnR5cGUgIT09IFwiYnJvd3Nlci1jb21tYW5kXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXlsb2FkIHR5cGU6ICR7cGF5bG9hZC50eXBlfWApXG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZCA9IHBheWxvYWQuY29tbWFuZFxuICAgIGNvbnN0IGNvbW1hbmRBcmdzID0gcGF5bG9hZC5hcmdzID8gey4uLnBheWxvYWQuYXJnc30gOiB7fVxuXG4gICAgaWYgKHBheWxvYWQudXJsICYmICFjb21tYW5kQXJncy51cmwpIHtcbiAgICAgIGNvbW1hbmRBcmdzLnVybCA9IHBheWxvYWQudXJsXG4gICAgfVxuXG4gICAgaWYgKHBheWxvYWQucGF0aCAmJiAhY29tbWFuZEFyZ3MucGF0aCkge1xuICAgICAgY29tbWFuZEFyZ3MucGF0aCA9IHBheWxvYWQucGF0aFxuICAgIH1cblxuICAgIGlmIChwYXlsb2FkLnNlbGVjdG9yICYmICFjb21tYW5kQXJncy5zZWxlY3Rvcikge1xuICAgICAgY29tbWFuZEFyZ3Muc2VsZWN0b3IgPSBwYXlsb2FkLnNlbGVjdG9yXG4gICAgfVxuXG4gICAgaWYgKHBheWxvYWQudGVzdElEICYmICFjb21tYW5kQXJncy50ZXN0SUQpIHtcbiAgICAgIGNvbW1hbmRBcmdzLnRlc3RJRCA9IHBheWxvYWQudGVzdElEXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdFJ1bm5lci5ydW4oY29tbWFuZCwgY29tbWFuZEFyZ3MpXG4gIH1cbn1cbiJdfQ==
@@ -19,6 +19,16 @@ export default class BrowserRegistry {
19
19
  * @returns {Promise<Record<string, any>>}
20
20
  */
21
21
  static resolve(name?: string): Promise<Record<string, any>>;
22
+ /**
23
+ * @param {string} [name]
24
+ * @returns {Promise<Record<string, any>>}
25
+ */
26
+ static stop(name?: string): Promise<Record<string, any>>;
27
+ /**
28
+ * @param {Record<string, any>} entry
29
+ * @returns {Promise<boolean>}
30
+ */
31
+ static verifyEntry(entry: Record<string, any>): Promise<boolean>;
22
32
  /**
23
33
  * @param {number} pid
24
34
  * @returns {boolean}
@@ -1,6 +1,9 @@
1
1
  import fs from "node:fs/promises";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
+ import wait from "awaitery/build/wait.js";
5
+ import { WebSocket } from "ws";
6
+ import { browserDaemonStopTimeoutMs, browserDaemonVerifyTimeoutMs } from "./browser-daemon-constants.js";
4
7
  const registryPath = path.join(os.tmpdir(), "system-testing-browser-registry.json");
5
8
  /** Browser process registry. */
6
9
  export default class BrowserRegistry {
@@ -66,6 +69,84 @@ export default class BrowserRegistry {
66
69
  }
67
70
  throw new Error(`Multiple browser processes are running (${entries.length}); pass --name`);
68
71
  }
72
+ /**
73
+ * @param {string} [name]
74
+ * @returns {Promise<Record<string, any>>}
75
+ */
76
+ static async stop(name) {
77
+ const entry = await this.resolve(name);
78
+ if (!(await this.verifyEntry(entry))) {
79
+ await this.unregister(entry.name);
80
+ throw new Error(`Browser registry entry ${entry.name} no longer matches a running browser daemon`);
81
+ }
82
+ try {
83
+ process.kill(entry.pid, "SIGTERM");
84
+ }
85
+ catch (error) {
86
+ if (error instanceof Error && "code" in error && error.code === "ESRCH") {
87
+ await this.unregister(entry.name);
88
+ return entry;
89
+ }
90
+ throw error;
91
+ }
92
+ for (let attemptNumber = 1; attemptNumber <= browserDaemonStopTimeoutMs / 50; attemptNumber += 1) {
93
+ if (!this.isProcessAlive(entry.pid)) {
94
+ await this.unregister(entry.name);
95
+ return entry;
96
+ }
97
+ await wait(50);
98
+ }
99
+ throw new Error(`Timed out waiting for browser process ${entry.name} (${entry.pid}) to stop`);
100
+ }
101
+ /**
102
+ * @param {Record<string, any>} entry
103
+ * @returns {Promise<boolean>}
104
+ */
105
+ static async verifyEntry(entry) {
106
+ if (typeof entry.port !== "number" || entry.port <= 0) {
107
+ return false;
108
+ }
109
+ const ws = new WebSocket(`ws://127.0.0.1:${entry.port}`);
110
+ return await new Promise((resolve) => {
111
+ let settled = false;
112
+ const finish = (result) => {
113
+ if (settled) {
114
+ return;
115
+ }
116
+ settled = true;
117
+ clearTimeout(timeoutId);
118
+ try {
119
+ ws.close();
120
+ }
121
+ catch {
122
+ // Ignore close errors while validating a registry entry.
123
+ }
124
+ resolve(result);
125
+ };
126
+ const timeoutId = setTimeout(() => {
127
+ finish(false);
128
+ }, browserDaemonVerifyTimeoutMs);
129
+ ws.on("open", () => {
130
+ ws.send(JSON.stringify({ command: "describe", type: "browser-daemon" }));
131
+ });
132
+ ws.on("message", (rawData) => {
133
+ try {
134
+ const response = JSON.parse(rawData.toString());
135
+ const result = response?.result;
136
+ finish(response?.ok === true
137
+ && result?.name === entry.name
138
+ && result?.pid === entry.pid
139
+ && result?.port === entry.port);
140
+ }
141
+ catch {
142
+ finish(false);
143
+ }
144
+ });
145
+ ws.on("error", () => {
146
+ finish(false);
147
+ });
148
+ });
149
+ }
69
150
  /**
70
151
  * @param {number} pid
71
152
  * @returns {boolean}
@@ -107,4 +188,4 @@ export default class BrowserRegistry {
107
188
  await fs.writeFile(this.getRegistryPath(), JSON.stringify(entries, null, 2));
108
189
  }
109
190
  }
110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1yZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9icm93c2VyLXJlZ2lzdHJ5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ2pDLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN4QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFFNUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsc0NBQXNDLENBQUMsQ0FBQTtBQUVuRixnQ0FBZ0M7QUFDaEMsTUFBTSxDQUFDLE9BQU8sT0FBTyxlQUFlO0lBQ2xDLHdCQUF3QjtJQUN4QixNQUFNLENBQUMsZUFBZTtRQUNwQixPQUFPLFlBQVksQ0FBQTtJQUNyQixDQUFDO0lBRUQscURBQXFEO0lBQ3JELE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSTtRQUNmLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQzFDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQTtRQUN2QixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUE7UUFFakIsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM1QixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDMUIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssR0FBRyxJQUFJLENBQUE7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDekMsQ0FBQztRQUVELE9BQU8sWUFBWSxDQUFBO0lBQ3JCLENBQUM7SUFFRDs7O09BR0c7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QUFDO1lBQ2YsSUFBSSxLQUFLLFlBQVksS0FBSyxJQUFJLE1BQU0sSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDekUsT0FBTyxFQUFFLENBQUE7WUFDWCxDQUFDO1lBRUQsTUFBTSxLQUFLLENBQUE7UUFDYixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU87UUFDakMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM5RSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuXG5jb25zdCByZWdpc3RyeVBhdGggPSBwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwic3lzdGVtLXRlc3RpbmctYnJvd3Nlci1yZWdpc3RyeS5qc29uXCIpXG5cbi8qKiBCcm93c2VyIHByb2Nlc3MgcmVnaXN0cnkuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCcm93c2VyUmVnaXN0cnkge1xuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgc3RhdGljIGdldFJlZ2lzdHJ5UGF0aCgpIHtcbiAgICByZXR1cm4gcmVnaXN0cnlQYXRoXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSAqL1xuICBzdGF0aWMgYXN5bmMgbGlzdCgpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5fcmVhZFJlZ2lzdHJ5KClcbiAgICBjb25zdCBhbGl2ZUVudHJpZXMgPSBbXVxuICAgIGxldCBkaXJ0eSA9IGZhbHNlXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICh0aGlzLmlzUHJvY2Vzc0FsaXZlKGVudHJ5LnBpZCkpIHtcbiAgICAgICAgYWxpdmVFbnRyaWVzLnB1c2goZW50cnkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXJ0eSA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlydHkpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3dyaXRlUmVnaXN0cnkoYWxpdmVFbnRyaWVzKVxuICAgIH1cblxuICAgIHJldHVybiBhbGl2ZUVudHJpZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGVudHJ5XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlZ2lzdGVyKGVudHJ5KSB7XG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMubGlzdCgpXG4gICAgY29uc3QgZmlsdGVyZWRFbnRyaWVzID0gZW50cmllcy5maWx0ZXIoKGV4aXN0aW5nRW50cnkpID0+IGV4aXN0aW5nRW50cnkubmFtZSAhPT0gZW50cnkubmFtZSlcblxuICAgIGZpbHRlcmVkRW50cmllcy5wdXNoKGVudHJ5KVxuICAgIGF3YWl0IHRoaXMuX3dyaXRlUmVnaXN0cnkoZmlsdGVyZWRFbnRyaWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHVucmVnaXN0ZXIobmFtZSkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmxpc3QoKVxuICAgIGNvbnN0IGZpbHRlcmVkRW50cmllcyA9IGVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkubmFtZSAhPT0gbmFtZSlcblxuICAgIGF3YWl0IHRoaXMuX3dyaXRlUmVnaXN0cnkoZmlsdGVyZWRFbnRyaWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV1cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVzb2x2ZShuYW1lKSB7XG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMubGlzdCgpXG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IG5hbWUpXG5cbiAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBydW5uaW5nIGJyb3dzZXIgcHJvY2VzcyBmb3VuZCB3aXRoIG5hbWU6ICR7bmFtZX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZW50cnlcbiAgICB9XG5cbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBlbnRyaWVzWzBdXG4gICAgfVxuXG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBydW5uaW5nIGJyb3dzZXIgcHJvY2Vzc2VzIGZvdW5kXCIpXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBNdWx0aXBsZSBicm93c2VyIHByb2Nlc3NlcyBhcmUgcnVubmluZyAoJHtlbnRyaWVzLmxlbmd0aH0pOyBwYXNzIC0tbmFtZWApXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBpZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc1Byb2Nlc3NBbGl2ZShwaWQpIHtcbiAgICBpZiAoIXBpZCB8fCB0eXBlb2YgcGlkICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgMClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSAqL1xuICBzdGF0aWMgYXN5bmMgX3JlYWRSZWdpc3RyeSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZSh0aGlzLmdldFJlZ2lzdHJ5UGF0aCgpLCBcInV0ZjhcIilcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZmlsZUNvbnRlbnQpXG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJzZWQpKSB7XG4gICAgICAgIHJldHVybiBbXVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VkXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCIpIHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj59IGVudHJpZXNcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgX3dyaXRlUmVnaXN0cnkoZW50cmllcykge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0aGlzLmdldFJlZ2lzdHJ5UGF0aCgpLCBKU09OLnN0cmluZ2lmeShlbnRyaWVzLCBudWxsLCAyKSlcbiAgfVxufVxuIl19
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1yZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9icm93c2VyLXJlZ2lzdHJ5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ2pDLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN4QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxJQUFJLE1BQU0sd0JBQXdCLENBQUE7QUFDekMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLElBQUksQ0FBQTtBQUU1QixPQUFPLEVBQUMsMEJBQTBCLEVBQUUsNEJBQTRCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQTtBQUV0RyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxzQ0FBc0MsQ0FBQyxDQUFBO0FBRW5GLGdDQUFnQztBQUNoQyxNQUFNLENBQUMsT0FBTyxPQUFPLGVBQWU7SUFDbEMsd0JBQXdCO0lBQ3hCLE1BQU0sQ0FBQyxlQUFlO1FBQ3BCLE9BQU8sWUFBWSxDQUFBO0lBQ3JCLENBQUM7SUFFRCxxREFBcUQ7SUFDckQsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJO1FBQ2YsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDMUMsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFBO1FBQ3ZCLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUVqQixLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzVCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUMxQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxHQUFHLElBQUksQ0FBQTtZQUNkLENBQUM7UUFD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QUFFLENBQUM7Z0JBQ3pFLE9BQU8sRUFBRSxDQUFBO1lBQ1gsQ0FBQztZQUVELE1BQU0sS0FBSyxDQUFBO1FBQ2IsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPO1FBQ2pDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDOUUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBvcyBmcm9tIFwibm9kZTpvc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB3YWl0IGZyb20gXCJhd2FpdGVyeS9idWlsZC93YWl0LmpzXCJcbmltcG9ydCB7V2ViU29ja2V0fSBmcm9tIFwid3NcIlxuXG5pbXBvcnQge2Jyb3dzZXJEYWVtb25TdG9wVGltZW91dE1zLCBicm93c2VyRGFlbW9uVmVyaWZ5VGltZW91dE1zfSBmcm9tIFwiLi9icm93c2VyLWRhZW1vbi1jb25zdGFudHMuanNcIlxuXG5jb25zdCByZWdpc3RyeVBhdGggPSBwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwic3lzdGVtLXRlc3RpbmctYnJvd3Nlci1yZWdpc3RyeS5qc29uXCIpXG5cbi8qKiBCcm93c2VyIHByb2Nlc3MgcmVnaXN0cnkuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCcm93c2VyUmVnaXN0cnkge1xuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgc3RhdGljIGdldFJlZ2lzdHJ5UGF0aCgpIHtcbiAgICByZXR1cm4gcmVnaXN0cnlQYXRoXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSAqL1xuICBzdGF0aWMgYXN5bmMgbGlzdCgpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5fcmVhZFJlZ2lzdHJ5KClcbiAgICBjb25zdCBhbGl2ZUVudHJpZXMgPSBbXVxuICAgIGxldCBkaXJ0eSA9IGZhbHNlXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICh0aGlzLmlzUHJvY2Vzc0FsaXZlKGVudHJ5LnBpZCkpIHtcbiAgICAgICAgYWxpdmVFbnRyaWVzLnB1c2goZW50cnkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXJ0eSA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlydHkpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3dyaXRlUmVnaXN0cnkoYWxpdmVFbnRyaWVzKVxuICAgIH1cblxuICAgIHJldHVybiBhbGl2ZUVudHJpZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGVudHJ5XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlZ2lzdGVyKGVudHJ5KSB7XG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMubGlzdCgpXG4gICAgY29uc3QgZmlsdGVyZWRFbnRyaWVzID0gZW50cmllcy5maWx0ZXIoKGV4aXN0aW5nRW50cnkpID0+IGV4aXN0aW5nRW50cnkubmFtZSAhPT0gZW50cnkubmFtZSlcblxuICAgIGZpbHRlcmVkRW50cmllcy5wdXNoKGVudHJ5KVxuICAgIGF3YWl0IHRoaXMuX3dyaXRlUmVnaXN0cnkoZmlsdGVyZWRFbnRyaWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHVucmVnaXN0ZXIobmFtZSkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmxpc3QoKVxuICAgIGNvbnN0IGZpbHRlcmVkRW50cmllcyA9IGVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkubmFtZSAhPT0gbmFtZSlcblxuICAgIGF3YWl0IHRoaXMuX3dyaXRlUmVnaXN0cnkoZmlsdGVyZWRFbnRyaWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV1cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVzb2x2ZShuYW1lKSB7XG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMubGlzdCgpXG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IG5hbWUpXG5cbiAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBydW5uaW5nIGJyb3dzZXIgcHJvY2VzcyBmb3VuZCB3aXRoIG5hbWU6ICR7bmFtZX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZW50cnlcbiAgICB9XG5cbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBlbnRyaWVzWzBdXG4gICAgfVxuXG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBydW5uaW5nIGJyb3dzZXIgcHJvY2Vzc2VzIGZvdW5kXCIpXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBNdWx0aXBsZSBicm93c2VyIHByb2Nlc3NlcyBhcmUgcnVubmluZyAoJHtlbnRyaWVzLmxlbmd0aH0pOyBwYXNzIC0tbmFtZWApXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyBzdG9wKG5hbWUpIHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMucmVzb2x2ZShuYW1lKVxuXG4gICAgaWYgKCEoYXdhaXQgdGhpcy52ZXJpZnlFbnRyeShlbnRyeSkpKSB7XG4gICAgICBhd2FpdCB0aGlzLnVucmVnaXN0ZXIoZW50cnkubmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQnJvd3NlciByZWdpc3RyeSBlbnRyeSAke2VudHJ5Lm5hbWV9IG5vIGxvbmdlciBtYXRjaGVzIGEgcnVubmluZyBicm93c2VyIGRhZW1vbmApXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Mua2lsbChlbnRyeS5waWQsIFwiU0lHVEVSTVwiKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBcImNvZGVcIiBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSBcIkVTUkNIXCIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy51bnJlZ2lzdGVyKGVudHJ5Lm5hbWUpXG4gICAgICAgIHJldHVybiBlbnRyeVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGZvciAobGV0IGF0dGVtcHROdW1iZXIgPSAxOyBhdHRlbXB0TnVtYmVyIDw9IGJyb3dzZXJEYWVtb25TdG9wVGltZW91dE1zIC8gNTA7IGF0dGVtcHROdW1iZXIgKz0gMSkge1xuICAgICAgaWYgKCF0aGlzLmlzUHJvY2Vzc0FsaXZlKGVudHJ5LnBpZCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy51bnJlZ2lzdGVyKGVudHJ5Lm5hbWUpXG4gICAgICAgIHJldHVybiBlbnRyeVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB3YWl0KDUwKVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVGltZWQgb3V0IHdhaXRpbmcgZm9yIGJyb3dzZXIgcHJvY2VzcyAke2VudHJ5Lm5hbWV9ICgke2VudHJ5LnBpZH0pIHRvIHN0b3BgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gZW50cnlcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgdmVyaWZ5RW50cnkoZW50cnkpIHtcbiAgICBpZiAodHlwZW9mIGVudHJ5LnBvcnQgIT09IFwibnVtYmVyXCIgfHwgZW50cnkucG9ydCA8PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQoYHdzOi8vMTI3LjAuMC4xOiR7ZW50cnkucG9ydH1gKVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlXG5cbiAgICAgIGNvbnN0IGZpbmlzaCA9IChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3cy5jbG9zZSgpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yZSBjbG9zZSBlcnJvcnMgd2hpbGUgdmFsaWRhdGluZyBhIHJlZ2lzdHJ5IGVudHJ5LlxuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmaW5pc2goZmFsc2UpXG4gICAgICB9LCBicm93c2VyRGFlbW9uVmVyaWZ5VGltZW91dE1zKVxuXG4gICAgICB3cy5vbihcIm9wZW5cIiwgKCkgPT4ge1xuICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtjb21tYW5kOiBcImRlc2NyaWJlXCIsIHR5cGU6IFwiYnJvd3Nlci1kYWVtb25cIn0pKVxuICAgICAgfSlcblxuICAgICAgd3Mub24oXCJtZXNzYWdlXCIsIChyYXdEYXRhKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJhd0RhdGEudG9TdHJpbmcoKSlcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZT8ucmVzdWx0XG5cbiAgICAgICAgICBmaW5pc2goXG4gICAgICAgICAgICByZXNwb25zZT8ub2sgPT09IHRydWVcbiAgICAgICAgICAgICYmIHJlc3VsdD8ubmFtZSA9PT0gZW50cnkubmFtZVxuICAgICAgICAgICAgJiYgcmVzdWx0Py5waWQgPT09IGVudHJ5LnBpZFxuICAgICAgICAgICAgJiYgcmVzdWx0Py5wb3J0ID09PSBlbnRyeS5wb3J0XG4gICAgICAgICAgKVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBmaW5pc2goZmFsc2UpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIHdzLm9uKFwiZXJyb3JcIiwgKCkgPT4ge1xuICAgICAgICBmaW5pc2goZmFsc2UpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBpZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc1Byb2Nlc3NBbGl2ZShwaWQpIHtcbiAgICBpZiAoIXBpZCB8fCB0eXBlb2YgcGlkICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgMClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSAqL1xuICBzdGF0aWMgYXN5bmMgX3JlYWRSZWdpc3RyeSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZSh0aGlzLmdldFJlZ2lzdHJ5UGF0aCgpLCBcInV0ZjhcIilcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZmlsZUNvbnRlbnQpXG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJzZWQpKSB7XG4gICAgICAgIHJldHVybiBbXVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VkXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCIpIHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj59IGVudHJpZXNcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgX3dyaXRlUmVnaXN0cnkoZW50cmllcykge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0aGlzLmdldFJlZ2lzdHJ5UGF0aCgpLCBKU09OLnN0cmluZ2lmeShlbnRyaWVzLCBudWxsLCAyKSlcbiAgfVxufVxuIl19
@@ -10,6 +10,10 @@
10
10
  * @property {"selenium"|"appium"} [type] Driver implementation to use.
11
11
  * @property {Record<string, any>} [options] Driver-specific options.
12
12
  */
13
+ /**
14
+ * @typedef {object} BrowserNavigationArgs
15
+ * @property {number} [timeout] Override the timeout for this navigation command.
16
+ */
13
17
  /** Generic browser session wrapper around the configured driver. */
14
18
  export default class Browser {
15
19
  /** @param {BrowserArgs} [args] */
@@ -120,14 +124,14 @@ export default class Browser {
120
124
  */
121
125
  click(elementOrIdentifier: string | import("selenium-webdriver").WebElement, args?: import("./system-test.js").FindArgs): Promise<void>;
122
126
  /**
123
- * @param {import("selenium-webdriver").WebElement|string|{selector: string} & import("./system-test.js").FindArgs} elementOrIdentifier
127
+ * @param {import("selenium-webdriver").WebElement|string|{selector: string} & import("./system-test.js").InteractArgs} elementOrIdentifier
124
128
  * @param {string} methodName
125
129
  * @param {...any} args
126
130
  * @returns {Promise<any>}
127
131
  */
128
132
  interact(elementOrIdentifier: import("selenium-webdriver").WebElement | string | ({
129
133
  selector: string;
130
- } & import("./system-test.js").FindArgs), methodName: string, ...args: any[]): Promise<any>;
134
+ } & import("./system-test.js").InteractArgs), methodName: string, ...args: any[]): Promise<any>;
131
135
  /**
132
136
  * @param {string} selector
133
137
  * @param {import("./system-test.js").WaitForNoSelectorArgs} [args]
@@ -142,6 +146,11 @@ export default class Browser {
142
146
  expectNoElement(selector: string, args?: import("./system-test.js").FindArgs): Promise<void>;
143
147
  /** @returns {Promise<string>} */
144
148
  getHTML(): Promise<string>;
149
+ /**
150
+ * @param {number | undefined} timeoutOverride
151
+ * @returns {number}
152
+ */
153
+ getCommandTimeout(timeoutOverride: number | undefined): number;
145
154
  /**
146
155
  * @param {string} path
147
156
  * @returns {Promise<void>}
@@ -150,21 +159,24 @@ export default class Browser {
150
159
  /**
151
160
  * @param {string} type
152
161
  * @param {string} path
162
+ * @param {BrowserNavigationArgs} [args]
153
163
  * @returns {Promise<void>}
154
164
  */
155
- sendBrowserCommand(type: string, path: string): Promise<void>;
165
+ sendBrowserCommand(type: string, path: string, args?: BrowserNavigationArgs): Promise<void>;
156
166
  /**
157
167
  * Visits a path using the injected browser helper when available, otherwise navigates directly with the driver.
158
168
  * @param {string} path
169
+ * @param {BrowserNavigationArgs} [args]
159
170
  * @returns {Promise<void>}
160
171
  */
161
- visit(path: string): Promise<void>;
172
+ visit(path: string, args?: BrowserNavigationArgs): Promise<void>;
162
173
  /**
163
174
  * Dismisses to a path via the injected browser helper when available, otherwise navigates directly with the driver.
164
175
  * @param {string} path
176
+ * @param {BrowserNavigationArgs} [args]
165
177
  * @returns {Promise<void>}
166
178
  */
167
- dismissTo(path: string): Promise<void>;
179
+ dismissTo(path: string, args?: BrowserNavigationArgs): Promise<void>;
168
180
  /**
169
181
  * Formats browser logs for console output and truncates overly long output.
170
182
  * @param {string[]} logs
@@ -220,3 +232,9 @@ export type BrowserDriverConfig = {
220
232
  */
221
233
  options?: Record<string, any>;
222
234
  };
235
+ export type BrowserNavigationArgs = {
236
+ /**
237
+ * Override the timeout for this navigation command.
238
+ */
239
+ timeout?: number;
240
+ };