webdriver 9.10.1 → 9.12.1

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.
@@ -16,15 +16,15 @@ export declare class BidiCore {
16
16
  * to the Bidi instance afterwards.
17
17
  */
18
18
  attachClient(client: Client): void;
19
- connect(): Promise<boolean | undefined>;
19
+ connect(): Promise<boolean>;
20
20
  close(): void;
21
- reconnect(webSocketUrl: string, opts?: ClientOptions): Promise<boolean | undefined>;
21
+ reconnect(webSocketUrl: string, opts?: ClientOptions): Promise<boolean>;
22
22
  /**
23
23
  * Helper function that allows to wait until Bidi connection establishes
24
24
  * @returns a promise that resolves once the connection to WebDriver Bidi protocol was established
25
25
  */
26
26
  waitForConnected(): Promise<boolean>;
27
- get socket(): WebSocket;
27
+ get socket(): WebSocket | undefined;
28
28
  get isConnected(): boolean;
29
29
  /**
30
30
  * for testing purposes only
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/bidi/core.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAI3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,iBAAiB,CAAA;AAErE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAQzC,qBAAa,QAAQ;;IAOjB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B;;OAEG;IACH,OAAO,CAAC,YAAY,CAAQ;gBAEf,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa;IAOvD;;;;OAIG;IACI,YAAY,CAAE,MAAM,EAAE,MAAM;IAItB,OAAO;IAyBb,KAAK;IAYL,SAAS,CAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa;IAS5D;;;OAGG;IACH,gBAAgB;IAIhB,IAAI,MAAM,cAET;IAED,IAAI,WAAW,YAEd;IAED;;;OAGG;IACH,IAAI,gBAAgB,WAIG,OAAO,UAF7B;IAyBY,IAAI,CAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IA+BtE,SAAS,CAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC;CAWpD;AAED,wBAAgB,gBAAgB,CAAE,MAAM,EAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAwCjE"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/bidi/core.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAI3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,iBAAiB,CAAA;AAErE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AASzC,qBAAa,QAAQ;;IASjB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B;;OAEG;IACH,OAAO,CAAC,YAAY,CAAQ;gBAEf,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa;IASvD;;;;OAIG;IACI,YAAY,CAAE,MAAM,EAAE,MAAM;IAItB,OAAO;IAiBb,KAAK;IAeL,SAAS,CAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa;IAQ5D;;;OAGG;IACH,gBAAgB;IAIhB,IAAI,MAAM,0BAET;IAED,IAAI,WAAW,YAEd;IAED;;;OAGG;IACH,IAAI,gBAAgB,WAIG,OAAO,UAF7B;IAqCY,IAAI,CAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IA+BtE,SAAS,CAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC;CAWpD;AAED,wBAAgB,gBAAgB,CAAE,MAAM,EAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAwCjE"}
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,YAAY,CAAA;AAIlC,eAAe,SAAS,CAAA;AACxB,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAGA,OAAO,SAAS,MAAM,YAAY,CAAA;AAIlC,eAAe,SAAS,CAAA;AACxB,cAAc,YAAY,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAI7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAgB,aAAa,EAAE,MAAM,YAAY,CAAA;AAKzE,MAAM,CAAC,OAAO,WACV,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,eAAe,EAC5B,qBAAqB,UAAQ,UAIgB,UAAU,WAAW,OAAO,EAAE,KAAG,OAAO,CAAC,iBAAiB,GAAG,aAAa,GAAG,IAAI,CAAC,CAiLlI"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAI7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAgB,aAAa,EAAwB,MAAM,YAAY,CAAA;AAM/F,MAAM,CAAC,OAAO,WACV,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,eAAe,EAC5B,qBAAqB,UAAQ,UAIgB,UAAU,WAAW,OAAO,EAAE,KAAG,OAAO,CAAC,iBAAiB,GAAG,aAAa,GAAG,IAAI,CAAC,CAkMlI"}
@@ -1,3 +1,4 @@
1
+ import type WebSocket from 'ws';
1
2
  import type { BrowserSocket } from './bidi/socket.js';
2
3
  import type { FetchRequest } from './request/web.js';
3
4
  /**
@@ -11,6 +12,7 @@ export interface EnvironmentVariables {
11
12
  export interface EnvironmentDependencies {
12
13
  Request: typeof FetchRequest;
13
14
  Socket: typeof BrowserSocket;
15
+ createBidiConnection: (wsUrl?: string, options?: unknown) => Promise<WebSocket | undefined>;
14
16
  variables: EnvironmentVariables;
15
17
  }
16
18
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,MAAM,SAAwD,CAAA;AAE3E,MAAM,WAAW,oBAAoB;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,uBAAuB;IACpC,OAAO,EAAE,OAAO,YAAY,CAAC;IAC7B,MAAM,EAAE,OAAO,aAAa,CAAC;IAC7B,SAAS,EAAE,oBAAoB,CAAA;CAClC;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE;IACtB,KAAK,EAAE,uBAAuB,CAAC;CAalC,CAAA"}
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,IAAI,CAAA;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,MAAM,SAAwD,CAAA;AAE3E,MAAM,WAAW,oBAAoB;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,uBAAuB;IACpC,OAAO,EAAE,OAAO,YAAY,CAAC;IAC7B,MAAM,EAAE,OAAO,aAAa,CAAC;IAC7B,oBAAoB,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAC5F,SAAS,EAAE,oBAAoB,CAAA;CAClC;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE;IACtB,KAAK,EAAE,uBAAuB,CAAC;CAgBlC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,aAAa,CAAA;AAExD,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAyB,YAAY,EAAE,kBAAkB,EAAsB,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACxI,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAA;AAIrE,MAAM,CAAC,OAAO,OAAO,SAAS;WACb,UAAU,CACnB,OAAO,EAAE,YAAY,CAAC,YAAY,EAClC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAClC,aAAa,KAAK,EAClB,oBAAoB,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAC/C,OAAO,CAAC,MAAM,CAAC;IA2ElB;;OAEG;IACH,MAAM,CAAC,eAAe,CAClB,OAAO,CAAC,EAAE,aAAa,EACvB,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAClC,aAAa,KAAK,EAClB,cAAc,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GACzC,MAAM;IAiDT;;;;;;OAMG;WACU,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,YAAY,CAAC,EAAE,WAAW,CAAA;KAAE,EAAE,eAAe,CAAC,EAAE,WAAW,CAAC,YAAY;IA2DxH,MAAM,KAAK,SAAS,qBAEnB;CACJ;AAED;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAA;AACzG,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,aAAa,CAAA;AAExD,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAyB,YAAY,EAAE,kBAAkB,EAAsB,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACxI,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAA;AAIrE,MAAM,CAAC,OAAO,OAAO,SAAS;WACb,UAAU,CACnB,OAAO,EAAE,YAAY,CAAC,YAAY,EAClC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAClC,aAAa,KAAK,EAClB,oBAAoB,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAC/C,OAAO,CAAC,MAAM,CAAC;IA4ElB;;OAEG;IACH,MAAM,CAAC,eAAe,CAClB,OAAO,CAAC,EAAE,aAAa,EACvB,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAClC,aAAa,KAAK,EAClB,cAAc,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GACzC,MAAM;IAmDT;;;;;;OAMG;WACU,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,YAAY,CAAC,EAAE,WAAW,CAAA;KAAE,EAAE,eAAe,CAAC,EAAE,WAAW,CAAC,YAAY;IA2DxH,MAAM,KAAK,SAAS,qBAEnB;CACJ;AAED;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAA;AACzG,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAA"}
package/build/index.js CHANGED
@@ -18,6 +18,9 @@ var __privateWrapper = (obj, member, setter, getter) => ({
18
18
  }
19
19
  });
20
20
 
21
+ // src/browser.ts
22
+ import logger6 from "@wdio/logger";
23
+
21
24
  // src/index.ts
22
25
  import logger4 from "@wdio/logger";
23
26
  import { webdriverMonad, sessionEnvironmentDetector, startWebDriver, isBidi } from "@wdio/utils";
@@ -38,6 +41,9 @@ var environment = {
38
41
  get Socket() {
39
42
  throw new Error("Socket is not available in this environment");
40
43
  },
44
+ get createBidiConnection() {
45
+ throw new Error("createBidiConnection is not available in this environment");
46
+ },
41
47
  get variables() {
42
48
  return {};
43
49
  }
@@ -47,6 +53,7 @@ var environment = {
47
53
  // src/command.ts
48
54
  var log = logger("webdriver");
49
55
  var BIDI_COMMANDS = Object.values(WebDriverBidiProtocol).map((def) => def.socket.command);
56
+ var sessionAbortListeners = /* @__PURE__ */ new Map();
50
57
  function command_default(method, endpointUri, commandInfo, doubleEncodeVariables = false) {
51
58
  const { command, deprecated, ref, parameters, variables = [], isHubCommand = false } = commandInfo;
52
59
  return async function protocolCommand(...args) {
@@ -103,7 +110,12 @@ function command_default(method, endpointUri, commandInfo, doubleEncodeVariables
103
110
  }
104
111
  body[commandParams[i].name] = arg;
105
112
  }
106
- const request = new environment.value.Request(method, endpoint, body, isHubCommand, {
113
+ const { isAborted, abortSignal, cleanup } = manageSessionAbortions.call(this);
114
+ const requiresSession = endpointUri.includes("/:sessionId/");
115
+ if (isAborted && command !== "deleteSession" && requiresSession) {
116
+ throw new Error('Trying to run command "'.concat(commandCallStructure(command, args), '" after session has been deleted, aborting request without executing it'));
117
+ }
118
+ const request = new environment.value.Request(method, endpoint, body, abortSignal, isHubCommand, {
107
119
  onPerformance: (data) => this.emit("request.performance", data),
108
120
  onRequest: (data) => this.emit("request.start", data),
109
121
  onResponse: (data) => this.emit("request.end", data),
@@ -153,9 +165,46 @@ function command_default(method, endpointUri, commandInfo, doubleEncodeVariables
153
165
  }).catch((error) => {
154
166
  this.emit("result", { command, method, endpoint, body, result: { error } });
155
167
  throw error;
168
+ }).finally(() => {
169
+ cleanup();
156
170
  });
157
171
  };
158
172
  }
173
+ function manageSessionAbortions() {
174
+ const abort = new AbortController();
175
+ const abortOnSessionEnd = (result) => {
176
+ if (result.command !== "deleteSession") {
177
+ return;
178
+ }
179
+ const abortListeners = sessionAbortListeners.get(this.sessionId);
180
+ if (abortListeners) {
181
+ for (const abortListener of abortListeners) {
182
+ abortListener.abort();
183
+ }
184
+ abortListeners.clear();
185
+ sessionAbortListeners.set(this.sessionId, null);
186
+ }
187
+ };
188
+ let abortListenerForCurrentSession = sessionAbortListeners.get(this.sessionId);
189
+ if (typeof abortListenerForCurrentSession === "undefined") {
190
+ abortListenerForCurrentSession = /* @__PURE__ */ new Set();
191
+ sessionAbortListeners.set(this.sessionId, abortListenerForCurrentSession);
192
+ this.on("result", abortOnSessionEnd);
193
+ }
194
+ if (abortListenerForCurrentSession === null) {
195
+ return { isAborted: true, abortSignal: void 0, cleanup: () => {
196
+ } };
197
+ }
198
+ abortListenerForCurrentSession.add(abort);
199
+ return {
200
+ isAborted: false,
201
+ abortSignal: abort.signal,
202
+ cleanup: () => {
203
+ this.off("result", abortOnSessionEnd);
204
+ abortListenerForCurrentSession == null ? void 0 : abortListenerForCurrentSession.delete(abort);
205
+ }
206
+ };
207
+ }
159
208
 
160
209
  // src/constants.ts
161
210
  var DEFAULTS = {
@@ -319,16 +368,19 @@ import { CAPABILITY_KEYS } from "@wdio/protocols";
319
368
  import logger2 from "@wdio/logger";
320
369
  var SCRIPT_PREFIX = "/* __wdio script__ */";
321
370
  var SCRIPT_SUFFIX = "/* __wdio script end__ */";
371
+ var base64Regex = /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$/;
322
372
  var log2 = logger2("webdriver");
323
373
  var RESPONSE_TIMEOUT = 1e3 * 60;
324
- var _id, _ws, _waitForConnected, _webSocketUrl, _pendingCommands, _BidiCore_instances, handleResponse_fn;
374
+ var _id, _ws, _waitForConnected, _resolveWaitForConnected, _webSocketUrl, _clientOptions, _pendingCommands, _BidiCore_instances, handleResponse_fn;
325
375
  var BidiCore = class {
326
376
  constructor(webSocketUrl, opts) {
327
377
  __privateAdd(this, _BidiCore_instances);
328
378
  __privateAdd(this, _id, 0);
329
379
  __privateAdd(this, _ws);
330
- __privateAdd(this, _waitForConnected, Promise.resolve(false));
380
+ __privateAdd(this, _waitForConnected);
381
+ __privateAdd(this, _resolveWaitForConnected);
331
382
  __privateAdd(this, _webSocketUrl);
383
+ __privateAdd(this, _clientOptions);
332
384
  __privateAdd(this, _pendingCommands, /* @__PURE__ */ new Map());
333
385
  __publicField(this, "client");
334
386
  /**
@@ -336,9 +388,12 @@ var BidiCore = class {
336
388
  */
337
389
  __publicField(this, "_isConnected", false);
338
390
  __privateSet(this, _webSocketUrl, webSocketUrl);
339
- log2.info("Connect to webSocketUrl ".concat(__privateGet(this, _webSocketUrl)));
340
- __privateSet(this, _ws, new environment.value.Socket(__privateGet(this, _webSocketUrl), opts));
341
- __privateGet(this, _ws).on("message", __privateMethod(this, _BidiCore_instances, handleResponse_fn).bind(this));
391
+ __privateSet(this, _clientOptions, opts);
392
+ __privateSet(this, _resolveWaitForConnected, () => {
393
+ });
394
+ __privateSet(this, _waitForConnected, new Promise((resolve) => {
395
+ __privateSet(this, _resolveWaitForConnected, resolve);
396
+ }));
342
397
  }
343
398
  /**
344
399
  * We initiate the Bidi instance before a WebdriverIO instance is created.
@@ -349,23 +404,14 @@ var BidiCore = class {
349
404
  this.client = client;
350
405
  }
351
406
  async connect() {
352
- if (process.env.WDIO_UNIT_TESTS) {
353
- this._isConnected = true;
354
- return;
407
+ log2.info("Connecting to webSocketUrl ".concat(__privateGet(this, _webSocketUrl)));
408
+ __privateSet(this, _ws, await environment.value.createBidiConnection(__privateGet(this, _webSocketUrl), __privateGet(this, _clientOptions)));
409
+ this._isConnected = Boolean(__privateGet(this, _ws));
410
+ __privateGet(this, _resolveWaitForConnected).call(this, this._isConnected);
411
+ if (__privateGet(this, _ws)) {
412
+ __privateGet(this, _ws).on("message", __privateMethod(this, _BidiCore_instances, handleResponse_fn).bind(this));
355
413
  }
356
- __privateSet(this, _waitForConnected, new Promise((resolve) => {
357
- __privateGet(this, _ws).on("open", () => {
358
- log2.info("Connected session to Bidi protocol");
359
- this._isConnected = true;
360
- resolve(this._isConnected);
361
- });
362
- __privateGet(this, _ws).on("error", (err) => {
363
- log2.warn("Couldn't connect to Bidi protocol: ".concat(err.message));
364
- this._isConnected = false;
365
- resolve(this._isConnected);
366
- });
367
- }));
368
- return __privateGet(this, _waitForConnected);
414
+ return this._isConnected;
369
415
  }
370
416
  close() {
371
417
  if (!this._isConnected) {
@@ -373,16 +419,18 @@ var BidiCore = class {
373
419
  }
374
420
  log2.info("Close Bidi connection to ".concat(__privateGet(this, _webSocketUrl)));
375
421
  this._isConnected = false;
376
- __privateGet(this, _ws).off("message", __privateMethod(this, _BidiCore_instances, handleResponse_fn).bind(this));
377
- __privateGet(this, _ws).close();
378
- __privateGet(this, _ws).terminate();
422
+ if (__privateGet(this, _ws)) {
423
+ __privateGet(this, _ws).off("message", __privateMethod(this, _BidiCore_instances, handleResponse_fn).bind(this));
424
+ __privateGet(this, _ws).close();
425
+ __privateGet(this, _ws).terminate();
426
+ __privateSet(this, _ws, void 0);
427
+ }
379
428
  }
380
429
  reconnect(webSocketUrl, opts) {
381
430
  log2.info("Reconnect to new Bidi session at ".concat(webSocketUrl));
382
431
  this.close();
383
432
  __privateSet(this, _webSocketUrl, webSocketUrl);
384
- __privateSet(this, _ws, new environment.value.Socket(__privateGet(this, _webSocketUrl), opts));
385
- __privateGet(this, _ws).on("message", __privateMethod(this, _BidiCore_instances, handleResponse_fn).bind(this));
433
+ __privateSet(this, _clientOptions, opts);
386
434
  return this.connect();
387
435
  }
388
436
  /**
@@ -430,7 +478,7 @@ var BidiCore = class {
430
478
  }
431
479
  sendAsync(params) {
432
480
  var _a;
433
- if (!this._isConnected) {
481
+ if (!__privateGet(this, _ws) || !this._isConnected) {
434
482
  throw new Error("No connection to WebDriver Bidi was established");
435
483
  }
436
484
  log2.info("BIDI COMMAND", ...parseBidiCommand(params));
@@ -443,7 +491,9 @@ var BidiCore = class {
443
491
  _id = new WeakMap();
444
492
  _ws = new WeakMap();
445
493
  _waitForConnected = new WeakMap();
494
+ _resolveWaitForConnected = new WeakMap();
446
495
  _webSocketUrl = new WeakMap();
496
+ _clientOptions = new WeakMap();
447
497
  _pendingCommands = new WeakMap();
448
498
  _BidiCore_instances = new WeakSet();
449
499
  handleResponse_fn = function(data) {
@@ -453,7 +503,14 @@ handleResponse_fn = function(data) {
453
503
  if (!payload.id) {
454
504
  return;
455
505
  }
456
- log2.info("BIDI RESULT", data.toString());
506
+ let resultLog = data.toString();
507
+ if (typeof payload.result === "object" && payload.result && "data" in payload.result && typeof payload.result.data === "string" && base64Regex.test(payload.result.data)) {
508
+ resultLog = JSON.stringify({
509
+ ...payload.result,
510
+ data: "Base64 string [".concat(payload.result.data.length, " chars]")
511
+ });
512
+ }
513
+ log2.info("BIDI RESULT", resultLog);
457
514
  (_a = this.client) == null ? void 0 : _a.emit("bidiResult", payload);
458
515
  const resolve = __privateGet(this, _pendingCommands).get(payload.id);
459
516
  if (!resolve) {
@@ -1158,7 +1215,7 @@ function getPrototype({ isW3C, isChromium, isFirefox, isMobile, isSauce, isSelen
1158
1215
  }
1159
1216
  return prototype;
1160
1217
  }
1161
- function getEnvironmentVars({ isW3C, isMobile, isIOS, isAndroid, isFirefox, isSauce, isSeleniumStandalone, isChromium }) {
1218
+ function getEnvironmentVars({ isW3C, isMobile, isIOS, isAndroid, isFirefox, isSauce, isSeleniumStandalone, isChromium, isWindowsApp, isMacApp }) {
1162
1219
  return {
1163
1220
  isW3C: { value: isW3C },
1164
1221
  isMobile: { value: isMobile },
@@ -1178,7 +1235,9 @@ function getEnvironmentVars({ isW3C, isMobile, isIOS, isAndroid, isFirefox, isSa
1178
1235
  return Boolean((_a = this._bidiHandler) == null ? void 0 : _a.isConnected);
1179
1236
  }
1180
1237
  },
1181
- isChromium: { value: isChromium }
1238
+ isChromium: { value: isChromium },
1239
+ isWindowsApp: { value: isWindowsApp },
1240
+ isMacApp: { value: isMacApp }
1182
1241
  };
1183
1242
  }
1184
1243
  function setupDirectConnect(client) {
@@ -1287,6 +1346,7 @@ var remoteTypes_exports = {};
1287
1346
  var log4 = logger4("webdriver");
1288
1347
  var WebDriver = class _WebDriver {
1289
1348
  static async newSession(options, modifier, userPrototype = {}, customCommandWrapper) {
1349
+ var _a;
1290
1350
  const envLogLevel = process.env.WDIO_LOG_LEVEL;
1291
1351
  options.logLevel = envLogLevel != null ? envLogLevel : options.logLevel;
1292
1352
  const params = validateConfig(DEFAULTS, options);
@@ -1324,8 +1384,9 @@ var WebDriver = class _WebDriver {
1324
1384
  );
1325
1385
  const client = monad(sessionId, customCommandWrapper);
1326
1386
  if (isBidi(capabilities)) {
1327
- await client._bidiHandler.waitForConnected();
1328
- client._bidiHandler.socket.on("message", parseBidiMessage.bind(client));
1387
+ if (await client._bidiHandler.waitForConnected()) {
1388
+ (_a = client._bidiHandler.socket) == null ? void 0 : _a.on("message", parseBidiMessage.bind(client));
1389
+ }
1329
1390
  }
1330
1391
  if (params.enableDirectConnect) {
1331
1392
  setupDirectConnect(client);
@@ -1367,7 +1428,10 @@ var WebDriver = class _WebDriver {
1367
1428
  const monad = webdriverMonad(options, modifier, prototype);
1368
1429
  const client = monad(options.sessionId, commandWrapper);
1369
1430
  if (isBidi(options.capabilities || {})) {
1370
- (_b = client._bidiHandler) == null ? void 0 : _b.socket.on("message", parseBidiMessage.bind(client));
1431
+ (_b = client._bidiHandler) == null ? void 0 : _b.waitForConnected().then(() => {
1432
+ var _a2;
1433
+ (_a2 = client._bidiHandler) == null ? void 0 : _a2.socket.on("message", parseBidiMessage.bind(client));
1434
+ });
1371
1435
  }
1372
1436
  return client;
1373
1437
  }
@@ -1379,7 +1443,7 @@ var WebDriver = class _WebDriver {
1379
1443
  * @returns {string} the new session id of the browser
1380
1444
  */
1381
1445
  static async reloadSession(instance, newCapabilities) {
1382
- var _a, _b;
1446
+ var _a, _b, _c;
1383
1447
  const capabilities = newCapabilities ? newCapabilities : Object.assign({}, instance.requestedCapabilities);
1384
1448
  let params = { ...instance.options, capabilities };
1385
1449
  for (const prop of ["protocol", "hostname", "port", "path", "queryParams", "user", "key"]) {
@@ -1414,7 +1478,7 @@ var WebDriver = class _WebDriver {
1414
1478
  if (isBidi(instance.capabilities || {})) {
1415
1479
  const bidiReqOpts = instance.options.strictSSL ? {} : { rejectUnauthorized: false };
1416
1480
  await ((_a = instance._bidiHandler) == null ? void 0 : _a.reconnect(newSessionCapabilities.webSocketUrl, bidiReqOpts));
1417
- (_b = instance._bidiHandler) == null ? void 0 : _b.socket.on("message", parseBidiMessage.bind(instance));
1481
+ (_c = (_b = instance._bidiHandler) == null ? void 0 : _b.socket) == null ? void 0 : _c.on("message", parseBidiMessage.bind(instance));
1418
1482
  }
1419
1483
  return sessionId;
1420
1484
  }
@@ -1579,7 +1643,7 @@ var WebDriverResponseError = class _WebDriverResponseError extends WebDriverErro
1579
1643
  // package.json
1580
1644
  var package_default = {
1581
1645
  name: "webdriver",
1582
- version: "9.9.1",
1646
+ version: "9.11.0",
1583
1647
  description: "A Node.js bindings implementation for the W3C WebDriver and Mobile JSONWire Protocol",
1584
1648
  author: "Christian Bromann <mail@bromann.dev>",
1585
1649
  homepage: "https://github.com/webdriverio/webdriverio/tree/main/packages/webdriver",
@@ -1628,6 +1692,39 @@ var package_default = {
1628
1692
  }
1629
1693
  };
1630
1694
 
1695
+ // src/request/polyfill.ts
1696
+ if (!AbortSignal.any) {
1697
+ AbortSignal.any = function(signals) {
1698
+ if (!signals || !Array.isArray(signals)) {
1699
+ throw new TypeError("AbortSignal.any requires an array of AbortSignal objects");
1700
+ }
1701
+ const controller = new AbortController();
1702
+ if (signals.some((signal) => signal.aborted)) {
1703
+ controller.abort();
1704
+ return controller.signal;
1705
+ }
1706
+ const listeners = signals.map((signal) => {
1707
+ const listener = () => {
1708
+ if ("reason" in signal && signal.reason !== void 0) {
1709
+ controller.abort(signal.reason);
1710
+ } else {
1711
+ controller.abort();
1712
+ }
1713
+ cleanup();
1714
+ };
1715
+ signal.addEventListener("abort", listener);
1716
+ return { signal, listener };
1717
+ });
1718
+ const cleanup = () => {
1719
+ listeners.forEach(({ signal, listener }) => {
1720
+ signal.removeEventListener("abort", listener);
1721
+ });
1722
+ };
1723
+ controller.signal.addEventListener("abort", cleanup);
1724
+ return controller.signal;
1725
+ };
1726
+ }
1727
+
1631
1728
  // src/request/request.ts
1632
1729
  var ERRORS_TO_EXCLUDE_FROM_RETRY = [
1633
1730
  "detached shadow root",
@@ -1641,19 +1738,21 @@ var DEFAULT_HEADERS = {
1641
1738
  };
1642
1739
  var log5 = logger5("webdriver");
1643
1740
  var WebDriverRequest = class {
1644
- constructor(method, endpoint, body, isHubCommand = false, eventHandler = {}) {
1741
+ constructor(method, endpoint, body, abortSignal, isHubCommand = false, eventHandler = {}) {
1645
1742
  __publicField(this, "body");
1646
1743
  __publicField(this, "method");
1647
1744
  __publicField(this, "endpoint");
1648
1745
  __publicField(this, "isHubCommand");
1649
1746
  __publicField(this, "requiresSessionId");
1650
1747
  __publicField(this, "eventHandler");
1748
+ __publicField(this, "abortSignal");
1651
1749
  this.body = body;
1652
1750
  this.method = method;
1653
1751
  this.endpoint = endpoint;
1654
1752
  this.isHubCommand = isHubCommand;
1655
1753
  this.requiresSessionId = Boolean(this.endpoint.match(/:sessionId/));
1656
1754
  this.eventHandler = eventHandler;
1755
+ this.abortSignal = abortSignal;
1657
1756
  }
1658
1757
  async makeRequest(options, sessionId) {
1659
1758
  var _a, _b;
@@ -1666,7 +1765,10 @@ var WebDriverRequest = class {
1666
1765
  const requestOptions = {
1667
1766
  method: this.method,
1668
1767
  redirect: "follow",
1669
- signal: AbortSignal.timeout(timeout)
1768
+ signal: AbortSignal.any([
1769
+ AbortSignal.timeout(timeout),
1770
+ ...this.abortSignal ? [this.abortSignal] : []
1771
+ ])
1670
1772
  };
1671
1773
  const requestHeaders = new Headers({
1672
1774
  ...DEFAULT_HEADERS,
@@ -1754,7 +1856,7 @@ var WebDriverRequest = class {
1754
1856
  };
1755
1857
  if (response instanceof Error) {
1756
1858
  const resError = response;
1757
- if (resError.code && RETRYABLE_ERROR_CODES.includes(resError.code) || resError.statusCode && RETRYABLE_STATUS_CODES.includes(resError.statusCode)) {
1859
+ if (!(this.abortSignal && this.abortSignal.aborted) && (resError.code && RETRYABLE_ERROR_CODES.includes(resError.code) || resError.statusCode && RETRYABLE_STATUS_CODES.includes(resError.statusCode))) {
1758
1860
  return retry(resError);
1759
1861
  }
1760
1862
  (_b = (_a = this.eventHandler).onPerformance) == null ? void 0 : _b.call(_a, { request: fullRequestOptions, durationMillisecond, success: false, error: response, retryCount });
@@ -1798,9 +1900,25 @@ var FetchRequest = class extends WebDriverRequest {
1798
1900
 
1799
1901
  // src/browser.ts
1800
1902
  var browser_default = WebDriver;
1903
+ var log6 = logger6("webdriver");
1801
1904
  environment.value = {
1802
1905
  Request: FetchRequest,
1803
1906
  Socket: BrowserSocket,
1907
+ createBidiConnection: (webSocketUrl, options) => {
1908
+ log6.info("Connecting to webSocketUrl ".concat(webSocketUrl));
1909
+ const ws = new BrowserSocket(webSocketUrl, options);
1910
+ return new Promise((resolve) => {
1911
+ ws.on("open", () => {
1912
+ log6.info("Connected session to Bidi protocol");
1913
+ resolve(ws);
1914
+ });
1915
+ ws.on("error", (err) => {
1916
+ const error = err instanceof Error ? err : new Error(String(err));
1917
+ log6.warn("Couldn't connect to Bidi protocol: ".concat(error.message));
1918
+ resolve(void 0);
1919
+ });
1920
+ });
1921
+ },
1804
1922
  variables: {}
1805
1923
  };
1806
1924
  export {
@@ -0,0 +1,15 @@
1
+ import WebSocket from 'ws';
2
+ export declare function createBidiConnection(webSocketUrl: string, options?: unknown): Promise<WebSocket | undefined>;
3
+ /**
4
+ * Resolve hostnames to IPv4 and IPv6 addresses
5
+ * @returns list of websocket urls to try
6
+ * @see https://github.com/webdriverio/webdriverio/issues/14039
7
+ */
8
+ export declare function listWebsocketCandidateUrls(webSocketUrl: string): Promise<string[]>;
9
+ /**
10
+ * Connect to a websocket
11
+ * @param candidateUrls - list of websocket urls to try
12
+ * @returns true if the connection was successful
13
+ */
14
+ export declare function connectWebsocket(candidateUrls: string[], _?: unknown): Promise<WebSocket | undefined>;
15
+ //# sourceMappingURL=bidi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bidi.d.ts","sourceRoot":"","sources":["../../src/node/bidi.ts"],"names":[],"mappings":"AAMA,OAAO,SAAS,MAAM,IAAI,CAAA;AAK1B,wBAAsB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAGlH;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBxF;AAcD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAkD3G"}
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAGA,OAAO,SAAS,MAAM,YAAY,CAAA;AAKlC,eAAe,SAAS,CAAA;AACxB,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAGA,OAAO,SAAS,MAAM,YAAY,CAAA;AAMlC,eAAe,SAAS,CAAA;AACxB,cAAc,YAAY,CAAA"}
package/build/node.js CHANGED
@@ -22,6 +22,9 @@ var environment = {
22
22
  get Socket() {
23
23
  throw new Error("Socket is not available in this environment");
24
24
  },
25
+ get createBidiConnection() {
26
+ throw new Error("createBidiConnection is not available in this environment");
27
+ },
25
28
  get variables() {
26
29
  return {};
27
30
  }
@@ -31,6 +34,7 @@ var environment = {
31
34
  // src/command.ts
32
35
  var log = logger("webdriver");
33
36
  var BIDI_COMMANDS = Object.values(WebDriverBidiProtocol).map((def) => def.socket.command);
37
+ var sessionAbortListeners = /* @__PURE__ */ new Map();
34
38
  function command_default(method, endpointUri, commandInfo, doubleEncodeVariables = false) {
35
39
  const { command, deprecated, ref, parameters, variables = [], isHubCommand = false } = commandInfo;
36
40
  return async function protocolCommand(...args) {
@@ -96,7 +100,12 @@ Actual: ${actual}` + moreInfo
96
100
  }
97
101
  body[commandParams[i].name] = arg;
98
102
  }
99
- const request = new environment.value.Request(method, endpoint, body, isHubCommand, {
103
+ const { isAborted, abortSignal, cleanup } = manageSessionAbortions.call(this);
104
+ const requiresSession = endpointUri.includes("/:sessionId/");
105
+ if (isAborted && command !== "deleteSession" && requiresSession) {
106
+ throw new Error(`Trying to run command "${commandCallStructure(command, args)}" after session has been deleted, aborting request without executing it`);
107
+ }
108
+ const request = new environment.value.Request(method, endpoint, body, abortSignal, isHubCommand, {
100
109
  onPerformance: (data) => this.emit("request.performance", data),
101
110
  onRequest: (data) => this.emit("request.start", data),
102
111
  onResponse: (data) => this.emit("request.end", data),
@@ -145,9 +154,46 @@ Actual: ${actual}` + moreInfo
145
154
  }).catch((error) => {
146
155
  this.emit("result", { command, method, endpoint, body, result: { error } });
147
156
  throw error;
157
+ }).finally(() => {
158
+ cleanup();
148
159
  });
149
160
  };
150
161
  }
162
+ function manageSessionAbortions() {
163
+ const abort = new AbortController();
164
+ const abortOnSessionEnd = (result) => {
165
+ if (result.command !== "deleteSession") {
166
+ return;
167
+ }
168
+ const abortListeners = sessionAbortListeners.get(this.sessionId);
169
+ if (abortListeners) {
170
+ for (const abortListener of abortListeners) {
171
+ abortListener.abort();
172
+ }
173
+ abortListeners.clear();
174
+ sessionAbortListeners.set(this.sessionId, null);
175
+ }
176
+ };
177
+ let abortListenerForCurrentSession = sessionAbortListeners.get(this.sessionId);
178
+ if (typeof abortListenerForCurrentSession === "undefined") {
179
+ abortListenerForCurrentSession = /* @__PURE__ */ new Set();
180
+ sessionAbortListeners.set(this.sessionId, abortListenerForCurrentSession);
181
+ this.on("result", abortOnSessionEnd);
182
+ }
183
+ if (abortListenerForCurrentSession === null) {
184
+ return { isAborted: true, abortSignal: void 0, cleanup: () => {
185
+ } };
186
+ }
187
+ abortListenerForCurrentSession.add(abort);
188
+ return {
189
+ isAborted: false,
190
+ abortSignal: abort.signal,
191
+ cleanup: () => {
192
+ this.off("result", abortOnSessionEnd);
193
+ abortListenerForCurrentSession?.delete(abort);
194
+ }
195
+ };
196
+ }
151
197
 
152
198
  // src/constants.ts
153
199
  var DEFAULTS = {
@@ -311,13 +357,16 @@ import { CAPABILITY_KEYS } from "@wdio/protocols";
311
357
  import logger2 from "@wdio/logger";
312
358
  var SCRIPT_PREFIX = "/* __wdio script__ */";
313
359
  var SCRIPT_SUFFIX = "/* __wdio script end__ */";
360
+ var base64Regex = /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$/;
314
361
  var log2 = logger2("webdriver");
315
362
  var RESPONSE_TIMEOUT = 1e3 * 60;
316
363
  var BidiCore = class {
317
364
  #id = 0;
318
365
  #ws;
319
- #waitForConnected = Promise.resolve(false);
366
+ #waitForConnected;
367
+ #resolveWaitForConnected;
320
368
  #webSocketUrl;
369
+ #clientOptions;
321
370
  #pendingCommands = /* @__PURE__ */ new Map();
322
371
  client;
323
372
  /**
@@ -326,9 +375,12 @@ var BidiCore = class {
326
375
  _isConnected = false;
327
376
  constructor(webSocketUrl, opts) {
328
377
  this.#webSocketUrl = webSocketUrl;
329
- log2.info(`Connect to webSocketUrl ${this.#webSocketUrl}`);
330
- this.#ws = new environment.value.Socket(this.#webSocketUrl, opts);
331
- this.#ws.on("message", this.#handleResponse.bind(this));
378
+ this.#clientOptions = opts;
379
+ this.#resolveWaitForConnected = () => {
380
+ };
381
+ this.#waitForConnected = new Promise((resolve) => {
382
+ this.#resolveWaitForConnected = resolve;
383
+ });
332
384
  }
333
385
  /**
334
386
  * We initiate the Bidi instance before a WebdriverIO instance is created.
@@ -339,23 +391,14 @@ var BidiCore = class {
339
391
  this.client = client;
340
392
  }
341
393
  async connect() {
342
- if (process.env.WDIO_UNIT_TESTS) {
343
- this._isConnected = true;
344
- return;
394
+ log2.info(`Connecting to webSocketUrl ${this.#webSocketUrl}`);
395
+ this.#ws = await environment.value.createBidiConnection(this.#webSocketUrl, this.#clientOptions);
396
+ this._isConnected = Boolean(this.#ws);
397
+ this.#resolveWaitForConnected(this._isConnected);
398
+ if (this.#ws) {
399
+ this.#ws.on("message", this.#handleResponse.bind(this));
345
400
  }
346
- this.#waitForConnected = new Promise((resolve) => {
347
- this.#ws.on("open", () => {
348
- log2.info("Connected session to Bidi protocol");
349
- this._isConnected = true;
350
- resolve(this._isConnected);
351
- });
352
- this.#ws.on("error", (err) => {
353
- log2.warn(`Couldn't connect to Bidi protocol: ${err.message}`);
354
- this._isConnected = false;
355
- resolve(this._isConnected);
356
- });
357
- });
358
- return this.#waitForConnected;
401
+ return this._isConnected;
359
402
  }
360
403
  close() {
361
404
  if (!this._isConnected) {
@@ -363,16 +406,18 @@ var BidiCore = class {
363
406
  }
364
407
  log2.info(`Close Bidi connection to ${this.#webSocketUrl}`);
365
408
  this._isConnected = false;
366
- this.#ws.off("message", this.#handleResponse.bind(this));
367
- this.#ws.close();
368
- this.#ws.terminate();
409
+ if (this.#ws) {
410
+ this.#ws.off("message", this.#handleResponse.bind(this));
411
+ this.#ws.close();
412
+ this.#ws.terminate();
413
+ this.#ws = void 0;
414
+ }
369
415
  }
370
416
  reconnect(webSocketUrl, opts) {
371
417
  log2.info(`Reconnect to new Bidi session at ${webSocketUrl}`);
372
418
  this.close();
373
419
  this.#webSocketUrl = webSocketUrl;
374
- this.#ws = new environment.value.Socket(this.#webSocketUrl, opts);
375
- this.#ws.on("message", this.#handleResponse.bind(this));
420
+ this.#clientOptions = opts;
376
421
  return this.connect();
377
422
  }
378
423
  /**
@@ -401,7 +446,14 @@ var BidiCore = class {
401
446
  if (!payload.id) {
402
447
  return;
403
448
  }
404
- log2.info("BIDI RESULT", data.toString());
449
+ let resultLog = data.toString();
450
+ if (typeof payload.result === "object" && payload.result && "data" in payload.result && typeof payload.result.data === "string" && base64Regex.test(payload.result.data)) {
451
+ resultLog = JSON.stringify({
452
+ ...payload.result,
453
+ data: `Base64 string [${payload.result.data.length} chars]`
454
+ });
455
+ }
456
+ log2.info("BIDI RESULT", resultLog);
405
457
  this.client?.emit("bidiResult", payload);
406
458
  const resolve = this.#pendingCommands.get(payload.id);
407
459
  if (!resolve) {
@@ -442,7 +494,7 @@ ${driverStack}`;
442
494
  return payload;
443
495
  }
444
496
  sendAsync(params) {
445
- if (!this._isConnected) {
497
+ if (!this.#ws || !this._isConnected) {
446
498
  throw new Error("No connection to WebDriver Bidi was established");
447
499
  }
448
500
  log2.info("BIDI COMMAND", ...parseBidiCommand(params));
@@ -1142,7 +1194,7 @@ function getPrototype({ isW3C, isChromium, isFirefox, isMobile, isSauce, isSelen
1142
1194
  }
1143
1195
  return prototype;
1144
1196
  }
1145
- function getEnvironmentVars({ isW3C, isMobile, isIOS, isAndroid, isFirefox, isSauce, isSeleniumStandalone, isChromium }) {
1197
+ function getEnvironmentVars({ isW3C, isMobile, isIOS, isAndroid, isFirefox, isSauce, isSeleniumStandalone, isChromium, isWindowsApp, isMacApp }) {
1146
1198
  return {
1147
1199
  isW3C: { value: isW3C },
1148
1200
  isMobile: { value: isMobile },
@@ -1161,7 +1213,9 @@ function getEnvironmentVars({ isW3C, isMobile, isIOS, isAndroid, isFirefox, isSa
1161
1213
  return Boolean(this._bidiHandler?.isConnected);
1162
1214
  }
1163
1215
  },
1164
- isChromium: { value: isChromium }
1216
+ isChromium: { value: isChromium },
1217
+ isWindowsApp: { value: isWindowsApp },
1218
+ isMacApp: { value: isMacApp }
1165
1219
  };
1166
1220
  }
1167
1221
  function setupDirectConnect(client) {
@@ -1307,8 +1361,9 @@ var WebDriver = class _WebDriver {
1307
1361
  );
1308
1362
  const client = monad(sessionId, customCommandWrapper);
1309
1363
  if (isBidi(capabilities)) {
1310
- await client._bidiHandler.waitForConnected();
1311
- client._bidiHandler.socket.on("message", parseBidiMessage.bind(client));
1364
+ if (await client._bidiHandler.waitForConnected()) {
1365
+ client._bidiHandler.socket?.on("message", parseBidiMessage.bind(client));
1366
+ }
1312
1367
  }
1313
1368
  if (params.enableDirectConnect) {
1314
1369
  setupDirectConnect(client);
@@ -1349,7 +1404,9 @@ var WebDriver = class _WebDriver {
1349
1404
  const monad = webdriverMonad(options, modifier, prototype);
1350
1405
  const client = monad(options.sessionId, commandWrapper);
1351
1406
  if (isBidi(options.capabilities || {})) {
1352
- client._bidiHandler?.socket.on("message", parseBidiMessage.bind(client));
1407
+ client._bidiHandler?.waitForConnected().then(() => {
1408
+ client._bidiHandler?.socket.on("message", parseBidiMessage.bind(client));
1409
+ });
1353
1410
  }
1354
1411
  return client;
1355
1412
  }
@@ -1395,7 +1452,7 @@ var WebDriver = class _WebDriver {
1395
1452
  if (isBidi(instance.capabilities || {})) {
1396
1453
  const bidiReqOpts = instance.options.strictSSL ? {} : { rejectUnauthorized: false };
1397
1454
  await instance._bidiHandler?.reconnect(newSessionCapabilities.webSocketUrl, bidiReqOpts);
1398
- instance._bidiHandler?.socket.on("message", parseBidiMessage.bind(instance));
1455
+ instance._bidiHandler?.socket?.on("message", parseBidiMessage.bind(instance));
1399
1456
  }
1400
1457
  return sessionId;
1401
1458
  }
@@ -1518,7 +1575,7 @@ var WebDriverResponseError = class _WebDriverResponseError extends WebDriverErro
1518
1575
  // package.json
1519
1576
  var package_default = {
1520
1577
  name: "webdriver",
1521
- version: "9.9.1",
1578
+ version: "9.11.0",
1522
1579
  description: "A Node.js bindings implementation for the W3C WebDriver and Mobile JSONWire Protocol",
1523
1580
  author: "Christian Bromann <mail@bromann.dev>",
1524
1581
  homepage: "https://github.com/webdriverio/webdriverio/tree/main/packages/webdriver",
@@ -1567,6 +1624,39 @@ var package_default = {
1567
1624
  }
1568
1625
  };
1569
1626
 
1627
+ // src/request/polyfill.ts
1628
+ if (!AbortSignal.any) {
1629
+ AbortSignal.any = function(signals) {
1630
+ if (!signals || !Array.isArray(signals)) {
1631
+ throw new TypeError("AbortSignal.any requires an array of AbortSignal objects");
1632
+ }
1633
+ const controller = new AbortController();
1634
+ if (signals.some((signal) => signal.aborted)) {
1635
+ controller.abort();
1636
+ return controller.signal;
1637
+ }
1638
+ const listeners = signals.map((signal) => {
1639
+ const listener = () => {
1640
+ if ("reason" in signal && signal.reason !== void 0) {
1641
+ controller.abort(signal.reason);
1642
+ } else {
1643
+ controller.abort();
1644
+ }
1645
+ cleanup();
1646
+ };
1647
+ signal.addEventListener("abort", listener);
1648
+ return { signal, listener };
1649
+ });
1650
+ const cleanup = () => {
1651
+ listeners.forEach(({ signal, listener }) => {
1652
+ signal.removeEventListener("abort", listener);
1653
+ });
1654
+ };
1655
+ controller.signal.addEventListener("abort", cleanup);
1656
+ return controller.signal;
1657
+ };
1658
+ }
1659
+
1570
1660
  // src/request/request.ts
1571
1661
  var ERRORS_TO_EXCLUDE_FROM_RETRY = [
1572
1662
  "detached shadow root",
@@ -1586,13 +1676,15 @@ var WebDriverRequest = class {
1586
1676
  isHubCommand;
1587
1677
  requiresSessionId;
1588
1678
  eventHandler;
1589
- constructor(method, endpoint, body, isHubCommand = false, eventHandler = {}) {
1679
+ abortSignal;
1680
+ constructor(method, endpoint, body, abortSignal, isHubCommand = false, eventHandler = {}) {
1590
1681
  this.body = body;
1591
1682
  this.method = method;
1592
1683
  this.endpoint = endpoint;
1593
1684
  this.isHubCommand = isHubCommand;
1594
1685
  this.requiresSessionId = Boolean(this.endpoint.match(/:sessionId/));
1595
1686
  this.eventHandler = eventHandler;
1687
+ this.abortSignal = abortSignal;
1596
1688
  }
1597
1689
  async makeRequest(options, sessionId) {
1598
1690
  const { url, requestOptions } = await this.createOptions(options, sessionId);
@@ -1604,7 +1696,10 @@ var WebDriverRequest = class {
1604
1696
  const requestOptions = {
1605
1697
  method: this.method,
1606
1698
  redirect: "follow",
1607
- signal: AbortSignal.timeout(timeout)
1699
+ signal: AbortSignal.any([
1700
+ AbortSignal.timeout(timeout),
1701
+ ...this.abortSignal ? [this.abortSignal] : []
1702
+ ])
1608
1703
  };
1609
1704
  const requestHeaders = new Headers({
1610
1705
  ...DEFAULT_HEADERS,
@@ -1689,7 +1784,7 @@ var WebDriverRequest = class {
1689
1784
  };
1690
1785
  if (response instanceof Error) {
1691
1786
  const resError = response;
1692
- if (resError.code && RETRYABLE_ERROR_CODES.includes(resError.code) || resError.statusCode && RETRYABLE_STATUS_CODES.includes(resError.statusCode)) {
1787
+ if (!(this.abortSignal && this.abortSignal.aborted) && (resError.code && RETRYABLE_ERROR_CODES.includes(resError.code) || resError.statusCode && RETRYABLE_STATUS_CODES.includes(resError.statusCode))) {
1693
1788
  return retry(resError);
1694
1789
  }
1695
1790
  this.eventHandler.onPerformance?.({ request: fullRequestOptions, durationMillisecond, success: false, error: response, retryCount });
@@ -1749,6 +1844,93 @@ var FetchRequest2 = class extends WebDriverRequest {
1749
1844
  }
1750
1845
  };
1751
1846
 
1847
+ // src/node/bidi.ts
1848
+ import { isIP } from "node:net";
1849
+ import dns2 from "node:dns/promises";
1850
+ import logger6 from "@wdio/logger";
1851
+ import WebSocket from "ws";
1852
+ var log6 = logger6("webdriver");
1853
+ var CONNECTION_TIMEOUT = 1e4;
1854
+ async function createBidiConnection(webSocketUrl, options) {
1855
+ const candidateUrls = await listWebsocketCandidateUrls(webSocketUrl);
1856
+ return connectWebsocket(candidateUrls, options);
1857
+ }
1858
+ async function listWebsocketCandidateUrls(webSocketUrl) {
1859
+ const parsedUrl = new URL(webSocketUrl);
1860
+ const candidateUrls = [webSocketUrl];
1861
+ if (isIP(parsedUrl.hostname)) {
1862
+ return candidateUrls;
1863
+ }
1864
+ const candidateIps = await dns2.lookup(parsedUrl.hostname, { family: 0, all: true });
1865
+ if (candidateIps.length > 1) {
1866
+ const hostnameMapper = (result) => webSocketUrl.replace(parsedUrl.hostname, result.address);
1867
+ candidateUrls.push(...candidateIps.map(hostnameMapper));
1868
+ }
1869
+ return candidateUrls;
1870
+ }
1871
+ async function connectWebsocket(candidateUrls, _) {
1872
+ const websockets = candidateUrls.map((candidateUrl) => {
1873
+ log6.debug(`Attempt to connect to webSocketUrl ${candidateUrl}`);
1874
+ try {
1875
+ const ws2 = new WebSocket(candidateUrl);
1876
+ return ws2;
1877
+ } catch {
1878
+ return void 0;
1879
+ }
1880
+ }).filter(Boolean);
1881
+ const wsConnectPromises = websockets.map((ws2, index) => {
1882
+ const promise = new Promise((resolve) => {
1883
+ ws2.once("open", () => resolve({ ws: ws2, isConnected: true, index }));
1884
+ ws2.once("error", (err) => {
1885
+ log6.debug(`Could not connect to Bidi protocol at ${candidateUrls[index]}: ${err.message}`);
1886
+ resolve({ ws: ws2, isConnected: false, errorMessage: err.message, index });
1887
+ });
1888
+ });
1889
+ return { promise, index };
1890
+ });
1891
+ const connectionTimeoutPromise = new Promise((resolve) => {
1892
+ setTimeout(() => {
1893
+ log6.error(`Could not connect to Bidi protocol of any candidate url in time: "${candidateUrls.join('", "')}"`);
1894
+ return resolve(void 0);
1895
+ }, CONNECTION_TIMEOUT);
1896
+ });
1897
+ const wsInfo = await Promise.race([
1898
+ firstResolved(wsConnectPromises),
1899
+ connectionTimeoutPromise
1900
+ ]);
1901
+ const socketsToCleanup = wsInfo ? websockets.filter((_2, index) => wsInfo.index !== index) : websockets;
1902
+ for (const socket of socketsToCleanup) {
1903
+ socket.removeAllListeners();
1904
+ if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CLOSING) {
1905
+ socket.terminate();
1906
+ } else {
1907
+ socket.once("open", () => socket.terminate());
1908
+ }
1909
+ }
1910
+ if (wsInfo?.isConnected) {
1911
+ log6.info(`Connected to Bidi protocol at ${candidateUrls[wsInfo.index]}`);
1912
+ return wsInfo.ws;
1913
+ }
1914
+ return void 0;
1915
+ }
1916
+ function firstResolved(promises, errorMessages = []) {
1917
+ if (promises.length === 0) {
1918
+ const sep = "\n - ";
1919
+ const errorMessage = errorMessages.length > 0 ? sep + errorMessages.join(sep) : "";
1920
+ log6.error("Could not connect to Bidi protocol" + errorMessage);
1921
+ return Promise.resolve(void 0);
1922
+ }
1923
+ return Promise.race(promises.map(({ promise }) => promise)).then((result) => {
1924
+ if (result.isConnected) {
1925
+ return result;
1926
+ }
1927
+ return firstResolved(
1928
+ promises.filter(({ index }) => index !== result.index),
1929
+ [...errorMessages, result.errorMessage || "unknown error"]
1930
+ );
1931
+ });
1932
+ }
1933
+
1752
1934
  // src/node.ts
1753
1935
  var node_default = WebDriver;
1754
1936
  environment.value = {
@@ -1766,6 +1948,7 @@ environment.value = {
1766
1948
  process.env.WDIO_UNIT_TESTS ? FetchRequest2 : FetchRequest
1767
1949
  ),
1768
1950
  Socket: ws,
1951
+ createBidiConnection,
1769
1952
  variables: {
1770
1953
  WEBDRIVER_CACHE_DIR: process.env.WEBDRIVER_CACHE_DIR || os.tmpdir(),
1771
1954
  PROXY_URL: process.env.HTTP_PROXY || process.env.HTTPS_PROXY
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=polyfill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polyfill.d.ts","sourceRoot":"","sources":["../../src/request/polyfill.ts"],"names":[],"mappings":""}
@@ -1,5 +1,6 @@
1
1
  import type { Options } from '@wdio/types';
2
2
  import type { WebDriverResponse, RequestLibResponse, RequestOptions, RequestEventHandler } from './types.js';
3
+ import './polyfill.js';
3
4
  export declare abstract class WebDriverRequest {
4
5
  protected abstract fetch(url: URL, opts: RequestInit): Promise<Response>;
5
6
  body?: Record<string, unknown>;
@@ -8,7 +9,8 @@ export declare abstract class WebDriverRequest {
8
9
  isHubCommand: boolean;
9
10
  requiresSessionId: boolean;
10
11
  eventHandler: RequestEventHandler;
11
- constructor(method: string, endpoint: string, body?: Record<string, unknown>, isHubCommand?: boolean, eventHandler?: RequestEventHandler);
12
+ abortSignal?: AbortSignal;
13
+ constructor(method: string, endpoint: string, body?: Record<string, unknown>, abortSignal?: AbortSignal, isHubCommand?: boolean, eventHandler?: RequestEventHandler);
12
14
  makeRequest(options: RequestOptions, sessionId?: string): Promise<WebDriverResponse<unknown>>;
13
15
  createOptions(options: RequestOptions, sessionId?: string, isBrowser?: boolean): Promise<{
14
16
  url: URL;
@@ -1 +1 @@
1
- {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/request/request.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAI1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAoB5G,8BAAsB,gBAAgB;IAClC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAExE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,OAAO,CAAA;IACrB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,YAAY,EAAE,mBAAmB,CAAA;gBAEpB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAE,OAAe,EAAE,YAAY,GAAE,mBAAwB;IAS9I,WAAW,CAAE,OAAO,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,MAAM;IAMxD,aAAa,CAAE,OAAO,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC;QAAC,GAAG,EAAE,GAAG,CAAC;QAAC,cAAc,EAAE,WAAW,CAAC;KAAC,CAAC;cA4DhI,WAAW,CAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;cA8B9E,QAAQ,CACpB,GAAG,EAAE,GAAG,EACR,kBAAkB,EAAE,WAAW,EAC/B,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,WAAW,KAAK,kBAAkB,EACrG,eAAe,SAAI,EACnB,UAAU,SAAI,GACf,OAAO,CAAC,iBAAiB,CAAC;CA0HhC"}
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/request/request.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAI1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAM5G,OAAO,eAAe,CAAA;AAgBtB,8BAAsB,gBAAgB;IAClC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAExE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,OAAO,CAAA;IACrB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,YAAY,EAAE,mBAAmB,CAAA;IACjC,WAAW,CAAC,EAAE,WAAW,CAAA;gBAErB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,WAAW,CAAC,EAAE,WAAW,EACzB,YAAY,GAAE,OAAe,EAC7B,YAAY,GAAE,mBAAwB;IAWpC,WAAW,CAAE,OAAO,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,MAAM;IAMxD,aAAa,CAAE,OAAO,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC;QAAC,GAAG,EAAE,GAAG,CAAC;QAAC,cAAc,EAAE,WAAW,CAAC;KAAC,CAAC;cA+DhI,WAAW,CAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;cA8B9E,QAAQ,CACpB,GAAG,EAAE,GAAG,EACR,kBAAkB,EAAE,WAAW,EAC/B,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,WAAW,KAAK,kBAAkB,EACrG,eAAe,SAAI,EACnB,UAAU,SAAI,GACf,OAAO,CAAC,iBAAiB,CAAC;CA+HhC"}
package/build/types.d.ts CHANGED
@@ -23,6 +23,8 @@ export interface SessionFlags {
23
23
  isSauce: boolean;
24
24
  isSeleniumStandalone: boolean;
25
25
  isBidi: boolean;
26
+ isWindowsApp: boolean;
27
+ isMacApp: boolean;
26
28
  }
27
29
  type Fn = (...args: unknown[]) => unknown;
28
30
  type ValueOf<T> = T[keyof T];
@@ -34,20 +36,22 @@ export type BidiCommands = WebDriverBidiCommands[keyof WebDriverBidiCommands]['s
34
36
  export type BidiResponses = ValueOf<ObtainMethods<Pick<BidiHandler, BidiCommands>>>;
35
37
  export type RemoteConfig = Options.WebDriver & Capabilities.WithRequestedCapabilities;
36
38
  type BidiInterface = ObtainMethods<Pick<BidiHandler, BidiCommands>>;
39
+ export interface WebDriverCommandEvent {
40
+ command: string;
41
+ method: string;
42
+ endpoint: string;
43
+ body: unknown;
44
+ }
45
+ export interface WebDriverResultEvent {
46
+ command: string;
47
+ method: string;
48
+ endpoint: string;
49
+ body: unknown;
50
+ result: unknown;
51
+ }
37
52
  type WebDriverClassicEvents = {
38
- command: {
39
- command: string;
40
- method: string;
41
- endpoint: string;
42
- body: unknown;
43
- };
44
- result: {
45
- command: string;
46
- method: string;
47
- endpoint: string;
48
- body: unknown;
49
- result: unknown;
50
- };
53
+ command: WebDriverCommandEvent;
54
+ result: WebDriverResultEvent;
51
55
  bidiCommand: Omit<CommandData, 'id'>;
52
56
  bidiResult: CommandResponse;
53
57
  'request.performance': RequestPerformanceEvent;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/build/utils.d.ts CHANGED
@@ -32,7 +32,7 @@ export declare function getPrototype({ isW3C, isChromium, isFirefox, isMobile, i
32
32
  * @param {Object} options driver instance or option object containing these flags
33
33
  * @return {Object} prototype object
34
34
  */
35
- export declare function getEnvironmentVars({ isW3C, isMobile, isIOS, isAndroid, isFirefox, isSauce, isSeleniumStandalone, isChromium }: Partial<SessionFlags>): PropertyDescriptorMap;
35
+ export declare function getEnvironmentVars({ isW3C, isMobile, isIOS, isAndroid, isFirefox, isSauce, isSeleniumStandalone, isChromium, isWindowsApp, isMacApp }: Partial<SessionFlags>): PropertyDescriptorMap;
36
36
  /**
37
37
  * Decorate the client's options object with host updates based on the presence of
38
38
  * directConnect capabilities in the new session response. Note that this
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAU/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAM1C,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAoBxF;;GAEG;AACH,wBAAsB,qBAAqB,CAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,WAAW,CAAC,YAAY,CAAA;CAAE,CAAC,CAgEzI;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAE,YAAY,EAAE,WAAW,CAAC,YAAY,QAiC3E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAE,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,WAkExE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,sCAiD7H;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,qBAAqB,CAqB5K;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,QAgBhD;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAS,kBAAkB,WAAU,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,WAmD1F,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CACxB,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,OAAc,EACzB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,qBAAqB,CA6CvB;AAED,wBAAgB,gBAAgB,CAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,QAWjE"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAU/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAM1C,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAoBxF;;GAEG;AACH,wBAAsB,qBAAqB,CAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,WAAW,CAAC,YAAY,CAAA;CAAE,CAAC,CAgEzI;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAE,YAAY,EAAE,WAAW,CAAC,YAAY,QAiC3E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAE,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,WAkExE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,sCAiD7H;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,qBAAqB,CAuBpM;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,QAgBhD;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAS,kBAAkB,WAAU,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,WAmD1F,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CACxB,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,OAAc,EACzB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,qBAAqB,CA6CvB;AAED,wBAAgB,gBAAgB,CAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,QAWjE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webdriver",
3
- "version": "9.10.1",
3
+ "version": "9.12.1",
4
4
  "description": "A Node.js bindings implementation for the W3C WebDriver and Mobile JSONWire Protocol",
5
5
  "author": "Christian Bromann <mail@bromann.dev>",
6
6
  "homepage": "https://github.com/webdriverio/webdriverio/tree/main/packages/webdriver",
@@ -38,14 +38,14 @@
38
38
  "dependencies": {
39
39
  "@types/node": "^20.1.0",
40
40
  "@types/ws": "^8.5.3",
41
- "@wdio/config": "9.10.1",
41
+ "@wdio/config": "9.12.1",
42
42
  "@wdio/logger": "9.4.4",
43
43
  "@wdio/protocols": "9.7.0",
44
44
  "@wdio/types": "9.10.1",
45
- "@wdio/utils": "9.10.1",
45
+ "@wdio/utils": "9.12.1",
46
46
  "deepmerge-ts": "^7.0.3",
47
47
  "undici": "^6.20.1",
48
48
  "ws": "^8.8.0"
49
49
  },
50
- "gitHead": "dc41a90e711d7b7a10e8129fb74650ad7a5956d0"
50
+ "gitHead": "2887e7ba43c346edc5457309b874350a4cf628db"
51
51
  }