@applitools/eyes-browser 1.5.15 → 1.5.16

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/dist/index.js CHANGED
@@ -13585,7 +13585,7 @@ var init_agent_browser = __esm({
13585
13585
  });
13586
13586
 
13587
13587
  // ../req/dist/req-errors.js
13588
- var AbortCode, RequestTimeoutError, ConnectionTimeoutError;
13588
+ var AbortCode, RequestTimeoutError, ConnectionTimeoutError, RetryTimeoutError;
13589
13589
  var init_req_errors = __esm({
13590
13590
  "../req/dist/req-errors.js"() {
13591
13591
  "use strict";
@@ -13596,6 +13596,7 @@ var init_req_errors = __esm({
13596
13596
  (function(AbortCode2) {
13597
13597
  AbortCode2["requestTimeout"] = "STUCK_REQUEST";
13598
13598
  AbortCode2["connectionTimeout"] = "MAX_TIMEOUT_REACHED";
13599
+ AbortCode2["retryTimeout"] = "RETRY_DURATION_EXCEEDED";
13599
13600
  })(AbortCode || (AbortCode = {}));
13600
13601
  RequestTimeoutError = class extends Error {
13601
13602
  constructor() {
@@ -13611,6 +13612,13 @@ var init_req_errors = __esm({
13611
13612
  this.name = "ConnectionTimeoutError";
13612
13613
  }
13613
13614
  };
13615
+ RetryTimeoutError = class extends Error {
13616
+ constructor(timeout) {
13617
+ super(`Retry duration of ${timeout} ms was exceeded.`);
13618
+ this.code = AbortCode.retryTimeout;
13619
+ this.name = "RetryTimeoutError";
13620
+ }
13621
+ };
13614
13622
  }
13615
13623
  });
13616
13624
 
@@ -13621,6 +13629,7 @@ function makeReq(baseOptions) {
13621
13629
  async function req(input, ...requestOptions) {
13622
13630
  const options = mergeOptions({}, ...requestOptions);
13623
13631
  let abortCode;
13632
+ let retryStartTime = null;
13624
13633
  if (options.baseUrl && !options.baseUrl.endsWith("/"))
13625
13634
  options.baseUrl += "/";
13626
13635
  if (options.headers)
@@ -13649,121 +13658,189 @@ async function req(input, ...requestOptions) {
13649
13658
  if (connectionTimer)
13650
13659
  clearTimeout(connectionTimer);
13651
13660
  }
13652
- async function singleReq(input2, options2) {
13653
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
13654
- const url = new URL(String((_a = input2.url) !== null && _a !== void 0 ? _a : input2), options2.baseUrl);
13655
- const fetch2 = (_b = options2.fetch) !== null && _b !== void 0 ? _b : fetch_browser_default;
13656
- let optionsFallbacks = [];
13657
- if (options2.fallbacks)
13658
- optionsFallbacks = utils28.types.isArray(options2.fallbacks) ? options2.fallbacks : [options2.fallbacks];
13659
- const fb = optionsFallbacks.find((fallback) => {
13660
- var _a2;
13661
- return (_a2 = fallback.cache) === null || _a2 === void 0 ? void 0 : _a2.get(url.origin);
13662
- });
13663
- if (fb === null || fb === void 0 ? void 0 : fb.updateOptions)
13664
- options2 = await fb.updateOptions({ options: options2 });
13661
+ function setupRequestController(opts) {
13665
13662
  const requestController = new AbortController2();
13666
- const timeout = calculateTimeout(options2.requestTimeout, options2.body, options2);
13663
+ const timeout = calculateTimeout(opts.requestTimeout, opts.body, opts);
13667
13664
  const requestTimer = timeout ? setTimeout(() => {
13668
13665
  abortCode !== null && abortCode !== void 0 ? abortCode : abortCode = AbortCode.requestTimeout;
13669
13666
  requestController.abort();
13670
13667
  }, timeout) : null;
13668
+ const abortHandler = () => requestController.abort();
13671
13669
  if (connectionController.signal.aborted)
13672
13670
  requestController.abort();
13673
- connectionController.signal.onabort = () => requestController.abort();
13674
- if (options2.signal) {
13675
- if (options2.signal.aborted)
13671
+ connectionController.signal.addEventListener("abort", abortHandler);
13672
+ if (opts.signal) {
13673
+ if (opts.signal.aborted)
13676
13674
  requestController.abort();
13677
- options2.signal.onabort = () => requestController.abort();
13675
+ opts.signal.addEventListener("abort", abortHandler);
13678
13676
  }
13679
- if (options2.query) {
13680
- Object.entries(options2.query).forEach(([key, value]) => {
13677
+ return { requestController, requestTimer, abortHandler };
13678
+ }
13679
+ async function buildRequest(input2, opts, requestController) {
13680
+ var _a, _b, _c, _d, _e;
13681
+ const url = new URL(String((_a = input2.url) !== null && _a !== void 0 ? _a : input2), opts.baseUrl);
13682
+ if (opts.query) {
13683
+ Object.entries(opts.query).forEach(([key, value]) => {
13681
13684
  if (!utils28.types.isNull(value))
13682
13685
  url.searchParams.set(key, String(value));
13683
13686
  });
13684
13687
  }
13685
13688
  const extraHeaders = {};
13686
- if (utils28.types.isPlainObject(options2.body) || utils28.types.isArray(options2.body) || options2.body === null) {
13687
- options2.body = JSON.stringify(options2.body);
13689
+ if (utils28.types.isPlainObject(opts.body) || utils28.types.isArray(opts.body) || opts.body === null) {
13690
+ opts.body = JSON.stringify(opts.body);
13688
13691
  extraHeaders["content-type"] = "application/json";
13689
13692
  }
13690
13693
  let request = new Request(url, {
13691
- method: (_c = options2.method) !== null && _c !== void 0 ? _c : input2.method,
13694
+ method: (_b = opts.method) !== null && _b !== void 0 ? _b : input2.method,
13692
13695
  headers: {
13693
13696
  ...extraHeaders,
13694
- ...Object.fromEntries((_e = (_d = input2.headers) === null || _d === void 0 ? void 0 : _d.entries()) !== null && _e !== void 0 ? _e : []),
13695
- ...Object.fromEntries(new Headers(options2.headers).entries())
13697
+ ...Object.fromEntries((_d = (_c = input2.headers) === null || _c === void 0 ? void 0 : _c.entries()) !== null && _d !== void 0 ? _d : []),
13698
+ ...Object.fromEntries(new Headers(opts.headers).entries())
13696
13699
  },
13697
- body: (_f = options2.body) !== null && _f !== void 0 ? _f : input2.body,
13700
+ body: (_e = opts.body) !== null && _e !== void 0 ? _e : input2.body,
13698
13701
  highWaterMark: 1024 * 1024 * 100 + 1,
13699
13702
  agent: makeAgent({
13700
- proxy: options2.proxy,
13701
- useDnsCache: options2.useDnsCache,
13702
- keepAliveOptions: options2.keepAliveOptions
13703
+ proxy: opts.proxy,
13704
+ useDnsCache: opts.useDnsCache,
13705
+ keepAliveOptions: opts.keepAliveOptions
13703
13706
  }),
13704
13707
  signal: requestController.signal
13705
13708
  });
13706
- request = await beforeRequest({ request, options: options2 });
13707
- try {
13708
- let response = await fetch2(request);
13709
- if (!response.ok && optionsFallbacks.length > 0) {
13710
- const fallbackStrategy = optionsFallbacks[0];
13711
- const shouldFallback = await fallbackStrategy.shouldFallbackCondition({ request, response });
13712
- const fallbackOptions = shouldFallback && await ((_g = fallbackStrategy === null || fallbackStrategy === void 0 ? void 0 : fallbackStrategy.updateOptions) === null || _g === void 0 ? void 0 : _g.call(fallbackStrategy, {
13713
- options: { ...options2, fallbacks: optionsFallbacks.slice(1) }
13714
- }));
13715
- if (fallbackOptions) {
13716
- const fallbackStrategyResponse = await singleReq(request, fallbackOptions);
13717
- (_h = fallbackStrategy.cache) !== null && _h !== void 0 ? _h : fallbackStrategy.cache = /* @__PURE__ */ new Map();
13718
- fallbackStrategy.cache.set(new URL(request.url).origin, fallbackStrategyResponse.ok);
13719
- return fallbackStrategyResponse;
13720
- }
13721
- }
13722
- const retry = await ((_j = options2.retry) === null || _j === void 0 ? void 0 : _j.reduce(async (prev, retry2) => {
13723
- var _a2, _b2;
13709
+ request = await beforeRequest({ request, options: opts });
13710
+ return request;
13711
+ }
13712
+ async function tryFallback(request, response, opts, optionsFallbacks) {
13713
+ var _a, _b;
13714
+ if (response.ok || optionsFallbacks.length === 0)
13715
+ return null;
13716
+ const fallbackStrategy = optionsFallbacks[0];
13717
+ const shouldFallback = await fallbackStrategy.shouldFallbackCondition({ request, response });
13718
+ const fallbackOptions = shouldFallback && await ((_a = fallbackStrategy === null || fallbackStrategy === void 0 ? void 0 : fallbackStrategy.updateOptions) === null || _a === void 0 ? void 0 : _a.call(fallbackStrategy, {
13719
+ options: { ...opts, fallbacks: optionsFallbacks.slice(1) }
13720
+ }));
13721
+ if (fallbackOptions) {
13722
+ const fallbackStrategyResponse = await singleReq(request, fallbackOptions);
13723
+ (_b = fallbackStrategy.cache) !== null && _b !== void 0 ? _b : fallbackStrategy.cache = /* @__PURE__ */ new Map();
13724
+ fallbackStrategy.cache.set(new URL(request.url).origin, fallbackStrategyResponse.ok);
13725
+ return fallbackStrategyResponse;
13726
+ }
13727
+ return null;
13728
+ }
13729
+ async function findApplicableRetry(opts, context) {
13730
+ const retries = opts.retry;
13731
+ if (!retries)
13732
+ return null;
13733
+ if (context.response) {
13734
+ return await retries.reduce(async (prev, retry) => {
13735
+ var _a, _b;
13724
13736
  const result = await prev;
13725
- return result !== null && result !== void 0 ? result : (((_a2 = retry2.statuses) === null || _a2 === void 0 ? void 0 : _a2.includes(response.status)) || await ((_b2 = retry2.validate) === null || _b2 === void 0 ? void 0 : _b2.call(retry2, { response }))) && (!retry2.limit || !retry2.attempt || retry2.attempt < retry2.limit) ? retry2 : null;
13726
- }, Promise.resolve(null)));
13727
- if (retry) {
13728
- (_k = retry.attempt) !== null && _k !== void 0 ? _k : retry.attempt = 0;
13729
- const delay = response.headers.has("Retry-After") ? Number(response.headers.get("Retry-After")) * 1e3 : utils28.types.isArray(retry.timeout) ? retry.timeout[Math.min(retry.attempt, retry.timeout.length - 1)] : (_l = retry.timeout) !== null && _l !== void 0 ? _l : 0;
13730
- await utils28.general.sleep(delay);
13731
- retry.attempt += 1;
13732
- const retryRequest = await beforeRetry({ request, response, attempt: retry.attempt, stop, options: options2 });
13733
- if (retryRequest !== stop) {
13734
- return singleReq(retryRequest, options2);
13735
- }
13736
- }
13737
- response = await afterResponse({ request, response, options: options2 });
13738
- return response;
13739
- } catch (error) {
13740
- if (abortCode === AbortCode.requestTimeout)
13741
- error = new RequestTimeoutError();
13742
- else if (abortCode === AbortCode.connectionTimeout)
13743
- error = new ConnectionTimeoutError();
13744
- const retry = await ((_m = options2.retry) === null || _m === void 0 ? void 0 : _m.reduce((prev, retry2) => {
13737
+ return result !== null && result !== void 0 ? result : (((_a = retry.statuses) === null || _a === void 0 ? void 0 : _a.includes(context.response.status)) || await ((_b = retry.validate) === null || _b === void 0 ? void 0 : _b.call(retry, { response: context.response }))) && (!retry.limit || !retry.attempt || retry.attempt < retry.limit) ? retry : null;
13738
+ }, Promise.resolve(null));
13739
+ }
13740
+ if (context.error) {
13741
+ return await retries.reduce((prev, retry) => {
13745
13742
  return prev.then(async (result) => {
13746
- var _a2, _b2;
13747
- return (result !== null && result !== void 0 ? result : (((_a2 = retry2.codes) === null || _a2 === void 0 ? void 0 : _a2.includes(error.code)) || await ((_b2 = retry2.validate) === null || _b2 === void 0 ? void 0 : _b2.call(retry2, { error }))) && (!retry2.limit || !retry2.attempt || retry2.attempt < retry2.limit)) ? retry2 : null;
13743
+ var _a, _b;
13744
+ return (result !== null && result !== void 0 ? result : (((_a = retry.codes) === null || _a === void 0 ? void 0 : _a.includes(context.error.code)) || await ((_b = retry.validate) === null || _b === void 0 ? void 0 : _b.call(retry, { error: context.error }))) && (!retry.limit || !retry.attempt || retry.attempt < retry.limit)) ? retry : null;
13748
13745
  });
13749
- }, Promise.resolve(null)));
13750
- if (retry) {
13751
- (_o = retry.attempt) !== null && _o !== void 0 ? _o : retry.attempt = 0;
13752
- const delay = utils28.types.isArray(retry.timeout) ? retry.timeout[Math.min(retry.attempt, retry.timeout.length)] : (_p = retry.timeout) !== null && _p !== void 0 ? _p : 0;
13753
- await utils28.general.sleep(delay);
13754
- retry.attempt = retry.attempt + 1;
13755
- const retryRequest = await beforeRetry({ request, error, attempt: retry.attempt, stop, options: options2 });
13756
- if (retryRequest !== stop) {
13757
- return singleReq(retryRequest, options2);
13758
- }
13759
- }
13760
- error = await afterError({ request, error, options: options2 });
13761
- throw error;
13762
- } finally {
13763
- if (options2.signal)
13764
- options2.signal.onabort = null;
13765
- if (requestTimer)
13766
- clearTimeout(requestTimer);
13746
+ }, Promise.resolve(null));
13747
+ }
13748
+ return null;
13749
+ }
13750
+ function calculateRetryDelay(retry, response) {
13751
+ var _a, _b;
13752
+ if (response === null || response === void 0 ? void 0 : response.headers.has("Retry-After")) {
13753
+ return Number(response.headers.get("Retry-After")) * 1e3;
13754
+ }
13755
+ if (utils28.types.isArray(retry.timeout)) {
13756
+ return retry.timeout[Math.min((_a = retry.attempt) !== null && _a !== void 0 ? _a : 0, retry.timeout.length - 1)];
13757
+ }
13758
+ return (_b = retry.timeout) !== null && _b !== void 0 ? _b : 0;
13759
+ }
13760
+ function checkRetryTimeout() {
13761
+ if (options.retryTimeout && retryStartTime && Date.now() - retryStartTime >= options.retryTimeout) {
13762
+ throw new RetryTimeoutError(options.retryTimeout);
13763
+ }
13764
+ }
13765
+ async function handleRetry(request, retry, context, opts) {
13766
+ var _a;
13767
+ (_a = retry.attempt) !== null && _a !== void 0 ? _a : retry.attempt = 0;
13768
+ retryStartTime !== null && retryStartTime !== void 0 ? retryStartTime : retryStartTime = Date.now();
13769
+ checkRetryTimeout();
13770
+ const delay = calculateRetryDelay(retry, context.response);
13771
+ await utils28.general.sleep(delay);
13772
+ retry.attempt += 1;
13773
+ return await beforeRetry({
13774
+ request,
13775
+ ...context,
13776
+ attempt: retry.attempt,
13777
+ stop,
13778
+ options: opts
13779
+ });
13780
+ }
13781
+ function normalizeAbortError(error) {
13782
+ if (abortCode === AbortCode.requestTimeout)
13783
+ return new RequestTimeoutError();
13784
+ if (abortCode === AbortCode.connectionTimeout)
13785
+ return new ConnectionTimeoutError();
13786
+ return error;
13787
+ }
13788
+ function cleanupRequest(opts, requestTimer, abortHandler) {
13789
+ if (requestTimer)
13790
+ clearTimeout(requestTimer);
13791
+ connectionController.signal.removeEventListener("abort", abortHandler);
13792
+ if (opts.signal) {
13793
+ opts.signal.removeEventListener("abort", abortHandler);
13794
+ }
13795
+ }
13796
+ async function singleReq(input2, options2) {
13797
+ var _a, _b;
13798
+ const fetch2 = (_a = options2.fetch) !== null && _a !== void 0 ? _a : fetch_browser_default;
13799
+ let optionsFallbacks = [];
13800
+ if (options2.fallbacks)
13801
+ optionsFallbacks = utils28.types.isArray(options2.fallbacks) ? options2.fallbacks : [options2.fallbacks];
13802
+ const url = new URL(String((_b = input2.url) !== null && _b !== void 0 ? _b : input2), options2.baseUrl);
13803
+ const fb = optionsFallbacks.find((fallback) => {
13804
+ var _a2;
13805
+ return (_a2 = fallback.cache) === null || _a2 === void 0 ? void 0 : _a2.get(url.origin);
13806
+ });
13807
+ if (fb === null || fb === void 0 ? void 0 : fb.updateOptions)
13808
+ options2 = await fb.updateOptions({ options: options2 });
13809
+ while (true) {
13810
+ const { requestController, requestTimer, abortHandler } = setupRequestController(options2);
13811
+ const request = await buildRequest(input2, options2, requestController);
13812
+ try {
13813
+ let response = await fetch2(request);
13814
+ const fallbackResponse = await tryFallback(request, response, options2, optionsFallbacks);
13815
+ if (fallbackResponse)
13816
+ return fallbackResponse;
13817
+ const retry = await findApplicableRetry(options2, { response });
13818
+ if (retry) {
13819
+ const retryRequest = await handleRetry(request, retry, { response }, options2);
13820
+ if (retryRequest !== stop) {
13821
+ cleanupRequest(options2, requestTimer, abortHandler);
13822
+ input2 = retryRequest;
13823
+ continue;
13824
+ }
13825
+ }
13826
+ response = await afterResponse({ request, response, options: options2 });
13827
+ return response;
13828
+ } catch (error) {
13829
+ error = normalizeAbortError(error);
13830
+ const retry = await findApplicableRetry(options2, { error });
13831
+ if (retry) {
13832
+ const retryRequest = await handleRetry(request, retry, { error }, options2);
13833
+ if (retryRequest !== stop) {
13834
+ cleanupRequest(options2, requestTimer, abortHandler);
13835
+ input2 = retryRequest;
13836
+ continue;
13837
+ }
13838
+ }
13839
+ error = await afterError({ request, error, options: options2 });
13840
+ throw error;
13841
+ } finally {
13842
+ cleanupRequest(options2, requestTimer, abortHandler);
13843
+ }
13767
13844
  }
13768
13845
  }
13769
13846
  }
@@ -13868,7 +13945,7 @@ function calculateTimeout(requestTimeout, body, options) {
13868
13945
  return base + perByte * body.byteLength;
13869
13946
  if (global.Blob && utils28.types.instanceOf(body, Blob))
13870
13947
  return base + perByte * body.size;
13871
- if (global.Buffer && utils28.types.instanceOf(body, import_buffer64.Buffer))
13948
+ if (global.Buffer && utils28.types.instanceOf(body, import_buffer68.Buffer))
13872
13949
  return base + perByte * body.byteLength;
13873
13950
  const allHooks = (_a = options === null || options === void 0 ? void 0 : options.hooks) !== null && _a !== void 0 ? _a : [];
13874
13951
  allHooks.forEach((hooks) => {
@@ -13879,7 +13956,7 @@ function calculateTimeout(requestTimeout, body, options) {
13879
13956
  }
13880
13957
  return requestTimeout;
13881
13958
  }
13882
- var utils28, import_buffer64, disableHttpAgentReuse;
13959
+ var utils28, import_buffer68, disableHttpAgentReuse;
13883
13960
  var init_req = __esm({
13884
13961
  "../req/dist/req.js"() {
13885
13962
  "use strict";
@@ -13893,7 +13970,7 @@ var init_req = __esm({
13893
13970
  init_req_errors();
13894
13971
  init_fetch_browser();
13895
13972
  utils28 = __toESM(require_browser3(), 1);
13896
- import_buffer64 = __toESM(require_buffer(), 1);
13973
+ import_buffer68 = __toESM(require_buffer(), 1);
13897
13974
  disableHttpAgentReuse = process.env.APPLITOOLS_DISABLE_AGENT_CACHIFY;
13898
13975
  }
13899
13976
  });
@@ -13901,9 +13978,12 @@ var init_req = __esm({
13901
13978
  // ../req/dist/index.js
13902
13979
  var dist_exports = {};
13903
13980
  __export(dist_exports, {
13981
+ ConnectionTimeoutError: () => ConnectionTimeoutError,
13904
13982
  Headers: () => Headers,
13905
13983
  Request: () => Request,
13984
+ RequestTimeoutError: () => RequestTimeoutError,
13906
13985
  Response: () => Response,
13986
+ RetryTimeoutError: () => RetryTimeoutError,
13907
13987
  default: () => req,
13908
13988
  makeReq: () => makeReq,
13909
13989
  req: () => req,
@@ -13919,6 +13999,7 @@ var init_dist = __esm({
13919
13999
  init_fetch_browser();
13920
14000
  init_req();
13921
14001
  init_req();
14002
+ init_req_errors();
13922
14003
  }
13923
14004
  });
13924
14005
 
@@ -14461,6 +14542,24 @@ var require_mask = __commonJS({
14461
14542
  }
14462
14543
  });
14463
14544
 
14545
+ // ../core-base/dist/utils/addRetryTimeout.js
14546
+ var require_addRetryTimeout = __commonJS({
14547
+ "../core-base/dist/utils/addRetryTimeout.js"(exports) {
14548
+ "use strict";
14549
+ init_process();
14550
+ init_setImmediate();
14551
+ init_buffer();
14552
+ init_setInterval();
14553
+ Object.defineProperty(exports, "__esModule", { value: true });
14554
+ exports.addRetryTimeout = void 0;
14555
+ var DEFAULT_RETRY_TIMEOUT_MINUTES = 60;
14556
+ function addRetryTimeout(retryTimeout) {
14557
+ return retryTimeout !== void 0 ? { retryTimeout } : { retryTimeout: DEFAULT_RETRY_TIMEOUT_MINUTES * 60 * 1e3 };
14558
+ }
14559
+ exports.addRetryTimeout = addRetryTimeout;
14560
+ }
14561
+ });
14562
+
14464
14563
  // ../core-base/dist/server/req-eyes.js
14465
14564
  var require_req_eyes = __commonJS({
14466
14565
  "../core-base/dist/server/req-eyes.js"(exports) {
@@ -14509,10 +14608,41 @@ var require_req_eyes = __commonJS({
14509
14608
  var missingApiKeyError_1 = require_missingApiKeyError();
14510
14609
  var invalidApiKeyError_1 = require_invalidApiKeyError();
14511
14610
  var mask_1 = require_mask();
14611
+ var addRetryTimeout_1 = require_addRetryTimeout();
14612
+ var backoffDelays = [
14613
+ 1e3,
14614
+ 1150,
14615
+ 1300,
14616
+ 1500,
14617
+ 1700,
14618
+ 2e3,
14619
+ 2300,
14620
+ 2700,
14621
+ 3100,
14622
+ 3500,
14623
+ 4e3,
14624
+ 4700,
14625
+ 5400,
14626
+ 6200,
14627
+ 7100,
14628
+ 8100,
14629
+ 9400,
14630
+ 10800,
14631
+ 12400,
14632
+ 14200,
14633
+ 16400,
14634
+ 18800,
14635
+ 18800,
14636
+ 21600,
14637
+ 24900,
14638
+ 28600,
14639
+ 3e4
14640
+ ];
14512
14641
  function makeReqEyes({ settings, fetch: fetch2, logger }) {
14513
- var _a, _b, _c;
14642
+ var _a, _b, _c, _d;
14514
14643
  const retryLimit = process.env.EYES_NETWORK_RETRY_LIMIT ? Number(process.env.EYES_NETWORK_RETRY_LIMIT) : 5;
14515
14644
  const retryTimeout = process.env.EYES_NETWORK_RETRY_TIMEOUT ? Number(process.env.EYES_NETWORK_RETRY_TIMEOUT) : 200;
14645
+ const retryDuration = process.env.EYES_NETWORK_RETRY_DURATION ? Number(process.env.EYES_NETWORK_RETRY_DURATION) : void 0;
14516
14646
  return (0, req_1.makeReq)({
14517
14647
  baseUrl: settings.eyesServerUrl,
14518
14648
  query: { removeSession: settings.removeSession },
@@ -14527,7 +14657,8 @@ var require_req_eyes = __commonJS({
14527
14657
  useDnsCache: settings.useDnsCache,
14528
14658
  connectionTimeout: (_a = settings.connectionTimeout) !== null && _a !== void 0 ? _a : 3e5,
14529
14659
  requestTimeout: (_b = settings.requestTimeout) !== null && _b !== void 0 ? _b : 3e4,
14530
- retry: (_c = settings.retry) !== null && _c !== void 0 ? _c : [
14660
+ retryTimeout: (_c = settings.retryTimeout) !== null && _c !== void 0 ? _c : retryDuration,
14661
+ retry: (_d = settings.retry) !== null && _d !== void 0 ? _d : [
14531
14662
  // retry on network issues
14532
14663
  {
14533
14664
  limit: retryLimit,
@@ -14543,8 +14674,8 @@ var require_req_eyes = __commonJS({
14543
14674
  "ENOMEM"
14544
14675
  ],
14545
14676
  validate(options) {
14546
- var _a2, _b2, _c2, _d;
14547
- return [404, 502, 503, 504, 500].includes((_b2 = (_a2 = options === null || options === void 0 ? void 0 : options.response) === null || _a2 === void 0 ? void 0 : _a2.status) !== null && _b2 !== void 0 ? _b2 : 0) && !((_d = (_c2 = options === null || options === void 0 ? void 0 : options.response) === null || _c2 === void 0 ? void 0 : _c2.headers) === null || _d === void 0 ? void 0 : _d.get("x-applitools-dont-retry"));
14677
+ var _a2, _b2, _c2, _d2;
14678
+ return [404, 502, 503, 504, 500].includes((_b2 = (_a2 = options === null || options === void 0 ? void 0 : options.response) === null || _a2 === void 0 ? void 0 : _a2.status) !== null && _b2 !== void 0 ? _b2 : 0) && !((_d2 = (_c2 = options === null || options === void 0 ? void 0 : options.response) === null || _c2 === void 0 ? void 0 : _c2.headers) === null || _d2 === void 0 ? void 0 : _d2.get("x-applitools-dont-retry"));
14548
14679
  }
14549
14680
  }
14550
14681
  ],
@@ -14622,6 +14753,7 @@ var require_req_eyes = __commonJS({
14622
14753
  request.headers.set("Eyes-Date", (/* @__PURE__ */ new Date()).toUTCString());
14623
14754
  },
14624
14755
  async afterResponse({ response, options }) {
14756
+ var _a;
14625
14757
  const logger = options.logger;
14626
14758
  logger === null || logger === void 0 ? void 0 : logger.log(`Location header: ${response.headers.has("Location") ? response.headers.get("Location") : "not found"}`);
14627
14759
  if (response.status === 202 && response.headers.has("Location")) {
@@ -14629,16 +14761,18 @@ var require_req_eyes = __commonJS({
14629
14761
  await utils34.general.sleep(Number(response.headers.get("Retry-After")) * 1e3);
14630
14762
  }
14631
14763
  const resultUrl = updateOriginAndPath(response.headers.get("Location"), settings.eyesServerUrl);
14632
- logger === null || logger === void 0 ? void 0 : logger.log(`Polling started for location: ${resultUrl}`);
14764
+ const currentRetryTimeout = (_a = options === null || options === void 0 ? void 0 : options.retryTimeout) !== null && _a !== void 0 ? _a : settings.retryTimeout;
14765
+ logger === null || logger === void 0 ? void 0 : logger.log(`Polling started for location: ${resultUrl}, with retryTimeout: ${currentRetryTimeout}`);
14633
14766
  const pollResponse = await req2(resultUrl, options !== null && options !== void 0 ? options : {}, {
14634
14767
  method: "GET",
14635
14768
  body: void 0,
14769
+ ...(0, addRetryTimeout_1.addRetryTimeout)(currentRetryTimeout),
14636
14770
  expected: [200, 201, 202, 203, 204, 205, 206, 207, 208, 502, 503, 504],
14637
14771
  retry: {
14638
- timeout: [...Array(5).fill(1e3), ...Array(5).fill(2e3), 5e3],
14772
+ timeout: backoffDelays,
14639
14773
  validate: async ({ response: response2 }) => {
14640
- var _a;
14641
- return !(response2 === null || response2 === void 0 ? void 0 : response2.headers.get("x-applitools-dont-retry")) && ![400, 401, 403, 500].includes((_a = response2 === null || response2 === void 0 ? void 0 : response2.status) !== null && _a !== void 0 ? _a : 400);
14774
+ var _a2;
14775
+ return !(response2 === null || response2 === void 0 ? void 0 : response2.headers.get("x-applitools-dont-retry")) && ![400, 401, 403, 500].includes((_a2 = response2 === null || response2 === void 0 ? void 0 : response2.status) !== null && _a2 !== void 0 ? _a2 : 400);
14642
14776
  }
14643
14777
  },
14644
14778
  connectionTimeout: 0,
@@ -21807,7 +21941,7 @@ var require_server_region_converter = __commonJS({
21807
21941
  function toAccessibilityRegions(regions) {
21808
21942
  return regions === null || regions === void 0 ? void 0 : regions.map((region) => {
21809
21943
  const serverRegion = toServerRegion(region);
21810
- if (utils34.types.has(region, "type")) {
21944
+ if (utils34.types.has(region, "type") && region.type !== void 0) {
21811
21945
  serverRegion.type = region.type;
21812
21946
  }
21813
21947
  return serverRegion;
@@ -21816,7 +21950,7 @@ var require_server_region_converter = __commonJS({
21816
21950
  function toDynamicRegions(regions) {
21817
21951
  return regions === null || regions === void 0 ? void 0 : regions.map((region) => {
21818
21952
  const serverRegion = toServerRegion(region);
21819
- if (utils34.types.has(region, "type")) {
21953
+ if (utils34.types.has(region, "type") && region.type !== void 0) {
21820
21954
  serverRegion.dynamicSettings = {
21821
21955
  ignorePatterns: utils34.types.isArray(region.type) ? region.type : [region.type]
21822
21956
  };
@@ -21828,7 +21962,9 @@ var require_server_region_converter = __commonJS({
21828
21962
  var _a;
21829
21963
  const options = {};
21830
21964
  if (utils34.types.has(region, "region")) {
21831
- options.regionId = region.regionId;
21965
+ if (region.regionId !== void 0) {
21966
+ options.regionId = region.regionId;
21967
+ }
21832
21968
  if (utils34.types.has(region, "offset")) {
21833
21969
  const offset = region.offset;
21834
21970
  options.maxUpOffset = offset.top;
@@ -21970,6 +22106,7 @@ var require_requests = __commonJS({
21970
22106
  var mask_1 = require_mask();
21971
22107
  var chalk_1 = __importDefault(require_source());
21972
22108
  var server_concurrency_converter_1 = require_server_concurrency_converter();
22109
+ var addRetryTimeout_1 = require_addRetryTimeout();
21973
22110
  exports.makeCoreRequestsWithCache = utils34.general.cachify(makeCoreRequests, () => "default");
21974
22111
  function makeCoreRequests({ fetch: fetch2, logger: defaultLogger } = {}) {
21975
22112
  const mainLogger = (0, logger_1.makeLogger)({ logger: defaultLogger, format: { label: "core-requests" } });
@@ -22005,7 +22142,7 @@ var require_requests = __commonJS({
22005
22142
  logger.log('Request "openEyes" called with settings', settings);
22006
22143
  const account = await getAccountInfoWithCache({ settings });
22007
22144
  if (account.processKeepaliveIntervalSec) {
22008
- heartbeat.startPeriodicHeartbeatMessaging({
22145
+ heartbeat.acquire({
22009
22146
  eyesServerUrl: settings.eyesServerUrl,
22010
22147
  apiKey: settings.apiKey,
22011
22148
  proxy: settings.proxy,
@@ -22062,7 +22199,7 @@ var require_requests = __commonJS({
22062
22199
  return makeEyesRequests({ core, test, req: req2, logger });
22063
22200
  }
22064
22201
  async function openFunctionalSession({ settings, logger = mainLogger }) {
22065
- var _a, _b, _c, _d, _e;
22202
+ var _a, _b, _c, _d, _f;
22066
22203
  logger = logger.extend(mainLogger, { tags: [`core-request-${utils34.general.shortid()}`] });
22067
22204
  const req2 = (0, req_eyes_1.makeReqEyes)({ settings, fetch: fetch2, logger });
22068
22205
  logger.log('Request "openFunctionalSession" called with settings', settings);
@@ -22090,7 +22227,7 @@ var require_requests = __commonJS({
22090
22227
  properties: settings.batch.properties,
22091
22228
  buildId: settings.batch.buildId
22092
22229
  },
22093
- egSessionId: (_e = (_d = settings.environment) === null || _d === void 0 ? void 0 : _d.ecSessionId) !== null && _e !== void 0 ? _e : null,
22230
+ egSessionId: (_f = (_d = settings.environment) === null || _d === void 0 ? void 0 : _d.ecSessionId) !== null && _f !== void 0 ? _f : null,
22094
22231
  environment: settings.environment && (settings.environment.rawEnvironment ? {
22095
22232
  ...settings.environment.rawEnvironment,
22096
22233
  os: settings.environment.os,
@@ -22135,7 +22272,7 @@ var require_requests = __commonJS({
22135
22272
  return makeFunctionalSessionRequests({ core, test, req: req2, logger });
22136
22273
  }
22137
22274
  async function openCheckAndClose({ target, settings, logger = mainLogger }) {
22138
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
22275
+ var _a, _b, _c, _d, _f, _g, _h, _j, _k;
22139
22276
  const req2 = (0, req_eyes_1.makeReqEyes)({ settings, fetch: fetch2, logger });
22140
22277
  logger.log('Request "openCheckAndClose" called with settings', settings);
22141
22278
  const account = await getAccountInfoWithCache({ settings, logger });
@@ -22171,13 +22308,13 @@ var require_requests = __commonJS({
22171
22308
  properties: settings.batch.properties,
22172
22309
  buildId: settings.batch.buildId
22173
22310
  },
22174
- egSessionId: (_e = (_d = settings.environment) === null || _d === void 0 ? void 0 : _d.ecSessionId) !== null && _e !== void 0 ? _e : null,
22311
+ egSessionId: (_f = (_d = settings.environment) === null || _d === void 0 ? void 0 : _d.ecSessionId) !== null && _f !== void 0 ? _f : null,
22175
22312
  environment: settings.environment && (settings.environment.rawEnvironment ? {
22176
22313
  ...settings.environment.rawEnvironment,
22177
- os: (_f = settings.environment.os) !== null && _f !== void 0 ? _f : settings.environment.rawEnvironment.os,
22178
- osInfo: (_g = settings.environment.displayOs) !== null && _g !== void 0 ? _g : settings.environment.rawEnvironment.osInfo,
22179
- hostingApp: (_h = settings.environment.hostingApp) !== null && _h !== void 0 ? _h : settings.environment.rawEnvironment.hostingApp,
22180
- hostingAppInfo: (_j = settings.environment.displayHostingApp) !== null && _j !== void 0 ? _j : settings.environment.rawEnvironment.hostingAppInfo
22314
+ os: (_g = settings.environment.os) !== null && _g !== void 0 ? _g : settings.environment.rawEnvironment.os,
22315
+ osInfo: (_h = settings.environment.displayOs) !== null && _h !== void 0 ? _h : settings.environment.rawEnvironment.osInfo,
22316
+ hostingApp: (_j = settings.environment.hostingApp) !== null && _j !== void 0 ? _j : settings.environment.rawEnvironment.hostingApp,
22317
+ hostingAppInfo: (_k = settings.environment.displayHostingApp) !== null && _k !== void 0 ? _k : settings.environment.rawEnvironment.hostingAppInfo
22181
22318
  } : {
22182
22319
  deviceInfo: settings.environment.deviceName,
22183
22320
  os: settings.environment.os,
@@ -22213,6 +22350,7 @@ var require_requests = __commonJS({
22213
22350
  updateBaselineIfDifferent: settings.updateBaselineIfDifferent
22214
22351
  },
22215
22352
  expected: [200, 201],
22353
+ ...(0, addRetryTimeout_1.addRetryTimeout)(settings.retryTimeout),
22216
22354
  logger
22217
22355
  });
22218
22356
  return openCheckAndCloseResponse.then(() => {
@@ -22473,6 +22611,7 @@ var require_requests = __commonJS({
22473
22611
  accessToken: settings.secretToken
22474
22612
  },
22475
22613
  expected: 200,
22614
+ ...(0, addRetryTimeout_1.addRetryTimeout)(settings.retryTimeout),
22476
22615
  logger
22477
22616
  });
22478
22617
  logger.log('Request "deleteTest" finished successfully');
@@ -22545,7 +22684,7 @@ var require_requests = __commonJS({
22545
22684
  logger.log('Request "openCheckAndClose" called for target', target, "with settings", settings);
22546
22685
  const account = await getAccountInfoWithCache({ settings });
22547
22686
  if (account.processKeepaliveIntervalSec) {
22548
- heartbeat.startPeriodicHeartbeatMessaging({
22687
+ heartbeat.acquire({
22549
22688
  eyesServerUrl: settings.eyesServerUrl,
22550
22689
  apiKey: settings.apiKey,
22551
22690
  proxy: settings.proxy,
@@ -22588,6 +22727,7 @@ var require_requests = __commonJS({
22588
22727
  }
22589
22728
  },
22590
22729
  expected: [200, 404],
22730
+ ...(0, addRetryTimeout_1.addRetryTimeout)(settings.retryTimeout),
22591
22731
  logger
22592
22732
  }).then(async (response) => {
22593
22733
  if (response.status === 404) {
@@ -22639,7 +22779,7 @@ var require_requests = __commonJS({
22639
22779
  let resultResponsePromise;
22640
22780
  let supportsCheckAndClose = true;
22641
22781
  let abortReason;
22642
- const req2 = defaultReq !== null && defaultReq !== void 0 ? defaultReq : (0, req_eyes_1.makeReqEyes)({ settings: test.eyesServer, fetch: fetch2, logger: mainLogger });
22782
+ const req2 = defaultReq !== null && defaultReq !== void 0 ? defaultReq : (0, req_eyes_1.makeReqEyes)({ settings: { ...test.eyesServer }, fetch: fetch2, logger: mainLogger });
22643
22783
  const upload = (0, upload_1.makeUpload)({
22644
22784
  settings: { uploadUrl: test.account.uploadUrl, proxy: test.eyesServer.proxy },
22645
22785
  logger: mainLogger
@@ -22668,6 +22808,7 @@ var require_requests = __commonJS({
22668
22808
  ]);
22669
22809
  const response = await req2(`./api/sessions/running/${encodeURIComponent(test.testId)}`, {
22670
22810
  name: "check",
22811
+ ...(0, addRetryTimeout_1.addRetryTimeout)(settings.retryTimeout),
22671
22812
  method: "POST",
22672
22813
  body: toServerMatchOptions({ target, settings }),
22673
22814
  expected: 200,
@@ -22697,6 +22838,7 @@ var require_requests = __commonJS({
22697
22838
  resultResponsePromise = req2(`./api/sessions/running/${encodeURIComponent(test.testId)}/matchandend`, {
22698
22839
  name: "checkAndClose",
22699
22840
  method: "POST",
22841
+ ...(0, addRetryTimeout_1.addRetryTimeout)(settings.retryTimeout),
22700
22842
  body: {
22701
22843
  ...matchOptions,
22702
22844
  options: {
@@ -22735,6 +22877,7 @@ var require_requests = __commonJS({
22735
22877
  resultResponsePromise = report({ settings, logger }).then(() => req2(`./api/sessions/running/${encodeURIComponent(test.testId)}`, {
22736
22878
  name: "close",
22737
22879
  method: "DELETE",
22880
+ ...(0, addRetryTimeout_1.addRetryTimeout)(settings === null || settings === void 0 ? void 0 : settings.retryTimeout),
22738
22881
  query: {
22739
22882
  aborted: false,
22740
22883
  updateBaseline: test.isNew ? settings === null || settings === void 0 ? void 0 : settings.updateBaselineIfNew : settings === null || settings === void 0 ? void 0 : settings.updateBaselineIfDifferent
@@ -22744,7 +22887,7 @@ var require_requests = __commonJS({
22744
22887
  }));
22745
22888
  return resultResponsePromise.then(() => {
22746
22889
  logger.log('Request "close" finished successfully');
22747
- }).catch(() => void 0);
22890
+ }).catch((_e) => void 0);
22748
22891
  }
22749
22892
  async function abort({ settings, logger = mainLogger } = {}) {
22750
22893
  logger = logger.extend(mainLogger, { tags: [`core-request-${utils34.general.shortid()}`] });
@@ -22760,6 +22903,7 @@ var require_requests = __commonJS({
22760
22903
  query: {
22761
22904
  aborted: true
22762
22905
  },
22906
+ ...(0, addRetryTimeout_1.addRetryTimeout)(settings === null || settings === void 0 ? void 0 : settings.retryTimeout),
22763
22907
  expected: 200,
22764
22908
  logger
22765
22909
  }));
@@ -22845,6 +22989,7 @@ var require_requests = __commonJS({
22845
22989
  return req2(`./api/sessions/running/${encodeURIComponent(test.testId)}`, {
22846
22990
  name: "close",
22847
22991
  method: "DELETE",
22992
+ ...(0, addRetryTimeout_1.addRetryTimeout)(settings === null || settings === void 0 ? void 0 : settings.retryTimeout),
22848
22993
  query: { aborted: false, nonVisualStatus: (_a = settings === null || settings === void 0 ? void 0 : settings.status) !== null && _a !== void 0 ? _a : "Completed" },
22849
22994
  expected: 200,
22850
22995
  logger
@@ -22864,6 +23009,7 @@ var require_requests = __commonJS({
22864
23009
  resultResponsePromise = report({ settings, logger }).then(() => req2(`./api/sessions/running/${encodeURIComponent(test.testId)}`, {
22865
23010
  name: "abort",
22866
23011
  method: "DELETE",
23012
+ ...(0, addRetryTimeout_1.addRetryTimeout)(settings === null || settings === void 0 ? void 0 : settings.retryTimeout),
22867
23013
  query: {
22868
23014
  aborted: true
22869
23015
  },
@@ -22918,7 +23064,7 @@ var require_requests = __commonJS({
22918
23064
  }
22919
23065
  exports.makeFunctionalSessionRequests = makeFunctionalSessionRequests;
22920
23066
  function toStartInfo({ settings }) {
22921
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
23067
+ var _a, _b, _c, _d, _f, _g, _h, _j, _k;
22922
23068
  return {
22923
23069
  agentId: settings.agentId,
22924
23070
  agentSessionId: settings.userTestId,
@@ -22937,13 +23083,13 @@ var require_requests = __commonJS({
22937
23083
  properties: settings.batch.properties,
22938
23084
  buildId: settings.batch.buildId
22939
23085
  },
22940
- egSessionId: (_e = (_d = settings.environment) === null || _d === void 0 ? void 0 : _d.ecSessionId) !== null && _e !== void 0 ? _e : null,
23086
+ egSessionId: (_f = (_d = settings.environment) === null || _d === void 0 ? void 0 : _d.ecSessionId) !== null && _f !== void 0 ? _f : null,
22941
23087
  environment: settings.environment && (settings.environment.rawEnvironment ? {
22942
23088
  ...settings.environment.rawEnvironment,
22943
- os: (_f = settings.environment.os) !== null && _f !== void 0 ? _f : settings.environment.rawEnvironment.os,
22944
- osInfo: (_g = settings.environment.displayOs) !== null && _g !== void 0 ? _g : settings.environment.rawEnvironment.osInfo,
22945
- hostingApp: (_h = settings.environment.hostingApp) !== null && _h !== void 0 ? _h : settings.environment.rawEnvironment.hostingApp,
22946
- hostingAppInfo: (_j = settings.environment.displayHostingApp) !== null && _j !== void 0 ? _j : settings.environment.rawEnvironment.hostingAppInfo
23089
+ os: (_g = settings.environment.os) !== null && _g !== void 0 ? _g : settings.environment.rawEnvironment.os,
23090
+ osInfo: (_h = settings.environment.displayOs) !== null && _h !== void 0 ? _h : settings.environment.rawEnvironment.osInfo,
23091
+ hostingApp: (_j = settings.environment.hostingApp) !== null && _j !== void 0 ? _j : settings.environment.rawEnvironment.hostingApp,
23092
+ hostingAppInfo: (_k = settings.environment.displayHostingApp) !== null && _k !== void 0 ? _k : settings.environment.rawEnvironment.hostingAppInfo
22947
23093
  } : {
22948
23094
  deviceInfo: settings.environment.deviceName,
22949
23095
  os: settings.environment.os,
@@ -66217,7 +66363,7 @@ var require_check_and_close = __commonJS({
66217
66363
  var transform_target_1 = require_transform_target();
66218
66364
  var transform_dom_mapping_1 = require_transform_dom_mapping();
66219
66365
  var utils34 = __importStar(require_browser3());
66220
- function makeCheckAndClose({ requests, done, signal, logger: mainLogger }) {
66366
+ function makeCheckAndClose({ requests, done, signal, heartbeat, logger: mainLogger }) {
66221
66367
  return async function checkAndClose({ target, settings, logger = mainLogger }) {
66222
66368
  var _a, _b, _c, _d, _e;
66223
66369
  logger = logger.extend(mainLogger, { tags: [`check-and-close-base-${utils34.general.shortid()}`] });
@@ -66233,7 +66379,7 @@ var require_check_and_close = __commonJS({
66233
66379
  if (signal.aborted) {
66234
66380
  throw new Error('Command "checkAndClose" was aborted');
66235
66381
  }
66236
- return requests.checkAndClose({ target, settings, logger }).finally(done);
66382
+ return requests.checkAndClose({ target, settings, logger }).finally(done).finally(() => heartbeat === null || heartbeat === void 0 ? void 0 : heartbeat.release());
66237
66383
  };
66238
66384
  }
66239
66385
  exports.makeCheckAndClose = makeCheckAndClose;
@@ -66283,11 +66429,11 @@ var require_close = __commonJS({
66283
66429
  Object.defineProperty(exports, "__esModule", { value: true });
66284
66430
  exports.makeClose = void 0;
66285
66431
  var utils34 = __importStar(require_browser3());
66286
- function makeClose({ requests, done, logger: mainLogger }) {
66432
+ function makeClose({ requests, done, heartbeat, logger: mainLogger }) {
66287
66433
  return async function close({ settings, logger = mainLogger } = {}) {
66288
66434
  logger = logger.extend(mainLogger, { tags: [`close-base-${utils34.general.shortid()}`] });
66289
66435
  logger.log('Command "close" is called with settings', settings);
66290
- void requests.close({ settings, logger }).finally(done);
66436
+ void requests.close({ settings, logger }).finally(done).finally(() => heartbeat === null || heartbeat === void 0 ? void 0 : heartbeat.release());
66291
66437
  };
66292
66438
  }
66293
66439
  exports.makeClose = makeClose;
@@ -66337,12 +66483,12 @@ var require_abort = __commonJS({
66337
66483
  Object.defineProperty(exports, "__esModule", { value: true });
66338
66484
  exports.makeAbort = void 0;
66339
66485
  var utils34 = __importStar(require_browser3());
66340
- function makeAbort({ requests, done, controller, logger: mainLogger }) {
66486
+ function makeAbort({ requests, done, controller, heartbeat, logger: mainLogger }) {
66341
66487
  return async function abort({ settings, logger = mainLogger } = {}) {
66342
66488
  logger = logger.extend(mainLogger, { tags: [`abort-base-${utils34.general.shortid()}`] });
66343
66489
  logger.log('Command "abort" is called with settings', settings);
66344
66490
  controller.abort();
66345
- void requests.abort({ settings, logger }).finally(done);
66491
+ void requests.abort({ settings, logger }).finally(done).finally(() => heartbeat === null || heartbeat === void 0 ? void 0 : heartbeat.release());
66346
66492
  };
66347
66493
  }
66348
66494
  exports.makeAbort = makeAbort;
@@ -66646,9 +66792,10 @@ var require_open_eyes = __commonJS({
66646
66792
  };
66647
66793
  resolve(utils34.general.extend(eyesRequests, {
66648
66794
  check: (0, check_1.makeCheck)({ requests: eyesRequests, signal: controller.signal, logger }),
66649
- checkAndClose: (0, check_and_close_1.makeCheckAndClose)({ requests: eyesRequests, done, signal: controller.signal, logger }),
66650
- close: (0, close_1.makeClose)({ requests: eyesRequests, done, logger }),
66651
- abort: (0, abort_1.makeAbort)({ requests: eyesRequests, done, controller, logger }),
66795
+ // eslint-disable-next-line prettier/prettier
66796
+ checkAndClose: (0, check_and_close_1.makeCheckAndClose)({ requests: eyesRequests, done, signal: controller.signal, heartbeat, logger }),
66797
+ close: (0, close_1.makeClose)({ requests: eyesRequests, done, heartbeat, logger }),
66798
+ abort: (0, abort_1.makeAbort)({ requests: eyesRequests, done, controller, heartbeat, logger }),
66652
66799
  getResults: (0, get_results_1.makeGetResults)({ requests: eyesRequests, logger })
66653
66800
  }));
66654
66801
  } catch (error) {
@@ -67172,33 +67319,61 @@ var require_heartbeat = __commonJS({
67172
67319
  exports.makeHeartbeat = void 0;
67173
67320
  var utils34 = __importStar(require_browser3());
67174
67321
  var processId = utils34.general.guid();
67175
- var isStarted = false;
67322
+ var isRunning = false;
67176
67323
  var intervalId;
67324
+ var refCount = 0;
67177
67325
  function makeHeartbeat({ requests, logger: mainLogger }) {
67178
67326
  const logger = mainLogger.extend(mainLogger, { tags: [`heartbeat-base-${utils34.general.shortid()}`] });
67179
- async function startPeriodicHeartbeatMessaging(settings) {
67180
- if (!isStarted) {
67181
- isStarted = true;
67182
- await requests.sendHeartbeat({ settings: { ...settings, processId }, logger });
67327
+ function stopHeartbeats() {
67328
+ logger.log("Stopping heartbeats");
67329
+ isRunning = false;
67330
+ if (intervalId) {
67331
+ clearInterval(intervalId);
67332
+ intervalId = void 0;
67333
+ }
67334
+ }
67335
+ async function startHeartbeats(settings) {
67336
+ if (!isRunning) {
67337
+ processId = utils34.general.guid();
67338
+ isRunning = true;
67339
+ logger.log("Starting heartbeats with new processId:", processId);
67340
+ await requests.sendHeartbeat({ settings: { ...settings, processId }, logger }).catch((error) => {
67341
+ logger.error("Failed to send heartbeat:", error);
67342
+ });
67183
67343
  intervalId = setIntervalBrowser(async () => {
67184
67344
  try {
67185
67345
  await requests.sendHeartbeat({ settings: { ...settings, processId }, logger });
67186
67346
  } catch (error) {
67187
67347
  if (error.message === "This process is expired. All its sessions were abandoned") {
67188
- isStarted = false;
67189
- processId = utils34.general.guid();
67190
- clearInterval(intervalId);
67348
+ stopHeartbeats();
67191
67349
  }
67192
67350
  }
67193
67351
  }, settings.interval);
67194
67352
  intervalId.unref();
67195
67353
  }
67196
67354
  }
67355
+ function acquire(settings) {
67356
+ refCount++;
67357
+ logger.log("Heartbeat acquired, refCount:", refCount);
67358
+ void startHeartbeats(settings).catch((error) => {
67359
+ logger.error("Failed to start heartbeats:", error);
67360
+ });
67361
+ }
67362
+ function release() {
67363
+ if (refCount > 0) {
67364
+ refCount--;
67365
+ logger.log("Heartbeat released, refCount:", refCount);
67366
+ if (refCount === 0) {
67367
+ stopHeartbeats();
67368
+ }
67369
+ }
67370
+ }
67197
67371
  return {
67198
67372
  get processId() {
67199
67373
  return processId;
67200
67374
  },
67201
- startPeriodicHeartbeatMessaging
67375
+ acquire,
67376
+ release
67202
67377
  };
67203
67378
  }
67204
67379
  exports.makeHeartbeat = makeHeartbeat;
@@ -73931,7 +74106,7 @@ ${l2}`}`, { bundledCss: i2, unfetchedResources: u2 };
73931
74106
  return d4 && (N3.shadowRoot = d4), N3;
73932
74107
  }
73933
74108
  }(t4);
73934
- d2(i2.doCaptureDoc), l2(i2.waitForImages), await Promise.all(f2), d2(i2.waitForImages), N2.version = "1.3.0", N2.scriptVersion = "11.6.6";
74109
+ d2(i2.doCaptureDoc), l2(i2.waitForImages), await Promise.all(f2), d2(i2.waitForImages), N2.version = "1.3.0", N2.scriptVersion = "11.6.7";
73935
74110
  const S2 = h2.length ? `${h2.join("\n")}
73936
74111
  ` : "", A2 = m2.size ? `${Array.from(m2).join("\n")}
73937
74112
  ` : "", _2 = JSON.stringify({ separator: y2, cssStartToken: g2, cssEndToken: g2, iframeStartToken: `"${p2}`, iframeEndToken: `${p2}"` });
@@ -80812,7 +80987,7 @@ var require_captureDomPollForIE = __commonJS({
80812
80987
  case 23:
80813
80988
  return I2 = e5.sent, A2(w2.prefetchCss), L2 = N0({ parseCss: U0, CSSImportRule, getCssFromCache: I2, absolutizeUrl: L0, unfetchedToken: R2 }), j2 = B0({ getCssFromCache: I2, absolutizeUrl: L0 }), k2 = z0({ extractCssFromNode: j2, getBundledCssFromCssText: L2, unfetchedToken: R2 }), E2(w2.doCaptureDoc), C2 = V2(i3), A2(w2.doCaptureDoc), E2(w2.waitForImages), e5.next = 34, Promise.all(S2);
80814
80989
  case 34:
80815
- return A2(w2.waitForImages), C2.version = "1.3.0", C2.scriptVersion = "11.6.6", M2 = x2.length ? x2.join("\n") + "\n" : "", N2 = O2.size ? Array.from(O2).join("\n") + "\n" : "", U2 = JSON.stringify({ separator: _2, cssStartToken: R2, cssEndToken: R2, iframeStartToken: '"' + T2, iframeEndToken: T2 + '"' }), A2(w2.total), F2 = U2 + "\n" + N2 + _2 + "\n" + M2 + _2 + "\n" + JSON.stringify(C2) + D2(), console.log("[captureFrame]", JSON.stringify(w2)), e5.abrupt("return", F2);
80990
+ return A2(w2.waitForImages), C2.version = "1.3.0", C2.scriptVersion = "11.6.7", M2 = x2.length ? x2.join("\n") + "\n" : "", N2 = O2.size ? Array.from(O2).join("\n") + "\n" : "", U2 = JSON.stringify({ separator: _2, cssStartToken: R2, cssEndToken: R2, iframeStartToken: '"' + T2, iframeEndToken: T2 + '"' }), A2(w2.total), F2 = U2 + "\n" + N2 + _2 + "\n" + M2 + _2 + "\n" + JSON.stringify(C2) + D2(), console.log("[captureFrame]", JSON.stringify(w2)), e5.abrupt("return", F2);
80816
80991
  case 44:
80817
80992
  case "end":
80818
80993
  return e5.stop();
@@ -87433,7 +87608,7 @@ var require_requests2 = __commonJS({
87433
87608
  brokerUrl = result.nextPath;
87434
87609
  }
87435
87610
  async function takeScreenshots({ settings: settings2, logger = mainLogger }) {
87436
- var _a;
87611
+ var _a, _b;
87437
87612
  logger = logger.extend(mainLogger, { tags: [`nml-request-${utils34.general.shortid()}`] });
87438
87613
  logger.log('Request "takeScreenshots" called with settings', settings2);
87439
87614
  const { localEnvironment, renderEnvironments, environmentSettings } = await (0, get_environments_info_1.getNMLEnvironmentsInfo)({
@@ -87466,24 +87641,32 @@ var require_requests2 = __commonJS({
87466
87641
  let screenshots;
87467
87642
  if (Number(result.protocolVersion) >= 2) {
87468
87643
  logger.log(`Request "takeScreenshots" was performed on applitools lib v${result.nmlVersion} through protocol v${result.protocolVersion} on device`, result.payload.debugInfo);
87469
- screenshots = localEnvironment ? [
87470
- {
87471
- image: result.payload.result[0].result.screenshotUrl,
87472
- environment: localEnvironment,
87473
- calculateRegions: result.payload.result[0].result.selectorRegions,
87474
- dom: result.payload.result[0].result.dom
87475
- }
87476
- ] : renderEnvironments.map((environment, index) => {
87477
- if (result.payload.result[index].error) {
87478
- throw new Error(`There was a problem in taking screenshot for environment ${JSON.stringify(environment)}. The provided error message was "${result.payload.result[index].error.message}" and had a stack trace of "${result.payload.result[index].error.stack}"`);
87644
+ if ((_b = result.payload.result) === null || _b === void 0 ? void 0 : _b.some((res) => res.error)) {
87645
+ const errors = result.payload.result.filter((res) => res.error);
87646
+ let errMessage = "There were problems in taking screenshots for";
87647
+ if (localEnvironment) {
87648
+ errMessage += ` local environment ${JSON.stringify(localEnvironment)}:
87649
+ `;
87650
+ errMessage += ` ${JSON.stringify(errors)}`;
87651
+ } else {
87652
+ errMessage += " environments:";
87653
+ errMessage += `
87654
+ ${errors.map((err, index) => `Environment ${JSON.stringify(renderEnvironments[index])}: ${JSON.stringify(err)}`).join("\n ")}`;
87479
87655
  }
87656
+ throw new Error(errMessage);
87657
+ }
87658
+ screenshots = renderEnvironments.map((environment, index) => {
87480
87659
  return {
87481
87660
  image: result.payload.result[index].result.screenshotUrl,
87482
87661
  calculateRegions: result.payload.result[index].result.selectorRegions,
87483
87662
  dom: result.payload.result[index].result.dom,
87484
- environment
87663
+ environment: localEnvironment || environment
87485
87664
  };
87486
87665
  });
87666
+ if (localEnvironment && renderEnvironments.length > 1) {
87667
+ logger.warn(`Local environment detected with ${renderEnvironments.length} rendered environment(s). Using local environment ${JSON.stringify(localEnvironment)} and ignoring rendered environments: ${JSON.stringify(renderEnvironments)}. Note - this warning shouldn't appear in normal usage.`);
87668
+ screenshots = [screenshots[0]];
87669
+ }
87487
87670
  } else {
87488
87671
  screenshots = localEnvironment ? [
87489
87672
  {
@@ -88342,13 +88525,13 @@ var require_check2 = __commonJS({
88342
88525
  let driver = void 0;
88343
88526
  if ((0, driver_1.isDriver)(target, spec)) {
88344
88527
  driver = await (0, driver_1.makeDriver)({ spec, driver: target, reset: target === defaultTarget, logger });
88345
- if (settings.retryTimeout) {
88346
- logger.log(`Retry timeout is set to ${settings.retryTimeout}ms - will retry checking until it passes or timeout is reached`);
88528
+ if (settings.matchTimeout) {
88529
+ logger.log(`Match timeout is set to ${settings.matchTimeout}ms - will retry checking until it passes or timeout is reached`);
88347
88530
  const start = Date.now();
88348
88531
  const environmentLogger = logger.extend({ tags: [`environment-${utils34.general.shortid()}`] });
88349
88532
  const baseEyes = await Promise.all(uniqueEnvironments.map((environment) => getBaseEyes({ environment, driver, logger: environmentLogger })));
88350
88533
  if (baseEyes.map((baseEye) => baseEye.test.isNew).some((isNew) => isNew)) {
88351
- await new Promise((resolve) => setTimeout(resolve, settings.retryTimeout));
88534
+ await new Promise((resolve) => setTimeout(resolve, settings.matchTimeout));
88352
88535
  }
88353
88536
  let asExpected = false, retries = 0;
88354
88537
  do {
@@ -88375,7 +88558,7 @@ var require_check2 = __commonJS({
88375
88558
  putInStorage(exactEnvironment, eyes, Promise.resolve());
88376
88559
  });
88377
88560
  }
88378
- } while (!asExpected && Date.now() - start < settings.retryTimeout);
88561
+ } while (!asExpected && Date.now() - start < settings.matchTimeout);
88379
88562
  } else {
88380
88563
  const baseScreenshotsAndSettings = await generateBaseScreenshotsAndSettings(settings, uniqueEnvironments, eyes, logger, driver);
88381
88564
  baseScreenshotsAndSettings.forEach(({ exactEnvironment: environment, baseSetting, baseTarget }) => {
@@ -95358,7 +95541,7 @@ creating temp style for access.`), r3 = $h(e3);
95358
95541
  function B2(e3) {
95359
95542
  return n4.defaultView && n4.defaultView.frameElement && n4.defaultView.frameElement.getAttribute(e3);
95360
95543
  }
95361
- }(t3).then((e3) => (h2.log("processPage end"), e3.scriptVersion = "4.15.0", e3));
95544
+ }(t3).then((e3) => (h2.log("processPage end"), e3.scriptVersion = "4.15.1", e3));
95362
95545
  }, window[x], "domSnapshotResult");
95363
95546
  return function(e3) {
95364
95547
  try {
@@ -119051,7 +119234,7 @@ var require_check4 = __commonJS({
119051
119234
  (_g = settings.sendDom) !== null && _g !== void 0 ? _g : settings.sendDom = eyes.test.account.rcaEnabled || settings.matchLevel === "Layout" || settings.matchLevel === "Dynamic" || settings.enablePatterns || settings.useDom || !utils34.types.isEmpty(settings.dynamicRegions) || !utils34.types.isEmpty(settings.layoutRegions) || !utils34.types.isEmpty(settings.accessibilitySettings);
119052
119235
  (_h = settings.autProxy) !== null && _h !== void 0 ? _h : settings.autProxy = eyes.test.eyesServer.proxy;
119053
119236
  (_j = settings.useDom) !== null && _j !== void 0 ? _j : settings.useDom = false;
119054
- (_k = (_r = settings).retryTimeout) !== null && _k !== void 0 ? _k : _r.retryTimeout = 0;
119237
+ (_k = (_r = settings).matchTimeout) !== null && _k !== void 0 ? _k : _r.matchTimeout = 0;
119055
119238
  settings.lazyLoad = settings.lazyLoad === true ? {} : settings.lazyLoad;
119056
119239
  if (settings.lazyLoad) {
119057
119240
  (_l = (_s = settings.lazyLoad).scrollLength) !== null && _l !== void 0 ? _l : _s.scrollLength = defaults_1.DEFAULT_LAZY_LOAD.scrollLength;
@@ -120279,7 +120462,7 @@ var require_package3 = __commonJS({
120279
120462
  "../core/package.json"(exports, module) {
120280
120463
  module.exports = {
120281
120464
  name: "@applitools/core",
120282
- version: "4.52.0",
120465
+ version: "4.53.0",
120283
120466
  homepage: "https://applitools.com",
120284
120467
  bugs: {
120285
120468
  url: "https://github.com/applitools/eyes.sdk.javascript1/issues"
@@ -127189,7 +127372,7 @@ var require_package4 = __commonJS({
127189
127372
  "../eyes/package.json"(exports, module) {
127190
127373
  module.exports = {
127191
127374
  name: "@applitools/eyes",
127192
- version: "1.36.15",
127375
+ version: "1.36.16",
127193
127376
  keywords: [
127194
127377
  "applitools",
127195
127378
  "eyes",
@@ -127426,10 +127609,15 @@ var IosDeviceNameEnum = /* @__PURE__ */ ((IosDeviceNameEnum2) => {
127426
127609
  IosDeviceNameEnum2["iPad_10"] = "iPad (10th generation)";
127427
127610
  IosDeviceNameEnum2["iPad_mini_6"] = "iPad mini (6th generation)";
127428
127611
  IosDeviceNameEnum2["iPad_Air_4"] = "iPad Air (4th generation)";
127612
+ IosDeviceNameEnum2["iPad_Air_11_inch_M3"] = "iPad Air 11-inch (M3)";
127613
+ IosDeviceNameEnum2["iPad_Air_13_inch_M3"] = "iPad Air 13-inch (M3)";
127614
+ IosDeviceNameEnum2["iPad_A16"] = "iPad (A16)";
127429
127615
  IosDeviceNameEnum2["iPad_Pro_3"] = "iPad Pro (12.9-inch) (3rd generation)";
127430
- IosDeviceNameEnum2["iPad_Pro_12_9_inch_3"] = "iPad Pro (12.9-inch) (3rd generation)";
127431
127616
  IosDeviceNameEnum2["iPad_Pro_4"] = "iPad Pro (11-inch) (4th generation)";
127432
127617
  IosDeviceNameEnum2["iPad_Pro_11_inch_4"] = "iPad Pro (11-inch) (4th generation)";
127618
+ IosDeviceNameEnum2["iPad_Pro_11_inch_M5"] = "iPad Pro 11-inch (M5)";
127619
+ IosDeviceNameEnum2["iPad_Pro_13_inch_M5"] = "iPad Pro 13-inch (M5)";
127620
+ IosDeviceNameEnum2["iPad_Pro_12_9_inch_3"] = "iPad Pro (12.9-inch) (3rd generation)";
127433
127621
  IosDeviceNameEnum2["iPhone_SE_2"] = "iPhone SE (2nd generation)";
127434
127622
  IosDeviceNameEnum2["iPhone_SE_3"] = "iPhone SE (3rd generation)";
127435
127623
  IosDeviceNameEnum2["iPhone_XR"] = "iPhone XR";
@@ -127458,9 +127646,259 @@ var IosDeviceNameEnum = /* @__PURE__ */ ((IosDeviceNameEnum2) => {
127458
127646
  IosDeviceNameEnum2["iPhone_16_Pro_Max"] = "iPhone 16 Pro Max";
127459
127647
  IosDeviceNameEnum2["iPhone_16_Pro"] = "iPhone 16 Pro";
127460
127648
  IosDeviceNameEnum2["iPhone_16_Plus"] = "iPhone 16 Plus";
127649
+ IosDeviceNameEnum2["iPhone_17"] = "iPhone 17";
127650
+ IosDeviceNameEnum2["iPhone_17_Pro"] = "iPhone 17 Pro";
127651
+ IosDeviceNameEnum2["iPhone_17_Pro_Max"] = "iPhone 17 Pro Max";
127652
+ IosDeviceNameEnum2["iPhone_Air"] = "iPhone Air";
127461
127653
  return IosDeviceNameEnum2;
127462
127654
  })(IosDeviceNameEnum || {});
127463
127655
 
127656
+ // ../eyes/src/enums/IosMultiDeviceTarget.ts
127657
+ init_process();
127658
+ init_setImmediate();
127659
+ init_buffer();
127660
+ init_setInterval();
127661
+
127662
+ // ../eyes/src/input/IosDeviceTarget.ts
127663
+ init_process();
127664
+ init_setImmediate();
127665
+ init_buffer();
127666
+ init_setInterval();
127667
+
127668
+ // ../eyes/src/enums/ScreenOrientation.ts
127669
+ init_process();
127670
+ init_setImmediate();
127671
+ init_buffer();
127672
+ init_setInterval();
127673
+ var ScreenOrientationEnum = /* @__PURE__ */ ((ScreenOrientationEnum2) => {
127674
+ ScreenOrientationEnum2["PORTRAIT"] = "portrait";
127675
+ ScreenOrientationEnum2["LANDSCAPE"] = "landscape";
127676
+ return ScreenOrientationEnum2;
127677
+ })(ScreenOrientationEnum || {});
127678
+
127679
+ // ../eyes/src/input/IosDeviceTarget.ts
127680
+ var IosDeviceTarget = class {
127681
+ constructor(deviceName) {
127682
+ this.deviceName = deviceName;
127683
+ }
127684
+ /**
127685
+ * Sets the device orientation to landscape.
127686
+ * @returns this instance for method chaining
127687
+ */
127688
+ landscape() {
127689
+ this.screenOrientation = "landscape" /* LANDSCAPE */;
127690
+ return this;
127691
+ }
127692
+ /**
127693
+ * Sets the device orientation to portrait.
127694
+ * @returns this instance for method chaining
127695
+ */
127696
+ portrait() {
127697
+ this.screenOrientation = "portrait" /* PORTRAIT */;
127698
+ return this;
127699
+ }
127700
+ /**
127701
+ * Gets the configured orientation for this device target.
127702
+ * @returns the screen orientation, or undefined if not set
127703
+ */
127704
+ getOrientation() {
127705
+ return this.screenOrientation;
127706
+ }
127707
+ /**
127708
+ * Gets the device name.
127709
+ * @returns the device name string
127710
+ */
127711
+ getDeviceName() {
127712
+ return this.deviceName;
127713
+ }
127714
+ /**
127715
+ * String representation of this device target.
127716
+ * @returns the device name
127717
+ */
127718
+ toString() {
127719
+ return this.deviceName;
127720
+ }
127721
+ };
127722
+
127723
+ // ../eyes/src/enums/IosMultiDeviceTarget.ts
127724
+ var IosMultiDeviceTarget = {
127725
+ get iPhone_SE_1() {
127726
+ return new IosDeviceTarget("iPhone SE (1st generation)");
127727
+ },
127728
+ get iPhone_SE_2() {
127729
+ return new IosDeviceTarget("iPhone SE (2nd generation)");
127730
+ },
127731
+ get iPhone_SE_3() {
127732
+ return new IosDeviceTarget("iPhone SE (3rd generation)");
127733
+ },
127734
+ get iPhone_6() {
127735
+ return new IosDeviceTarget("iPhone 6");
127736
+ },
127737
+ get iPhone_6_Plus() {
127738
+ return new IosDeviceTarget("iPhone 6 Plus");
127739
+ },
127740
+ get iPhone_7() {
127741
+ return new IosDeviceTarget("iPhone 7");
127742
+ },
127743
+ get iPhone_7_Plus() {
127744
+ return new IosDeviceTarget("iPhone 7 Plus");
127745
+ },
127746
+ get iPhone_8() {
127747
+ return new IosDeviceTarget("iPhone 8");
127748
+ },
127749
+ get iPhone_8_Plus() {
127750
+ return new IosDeviceTarget("iPhone 8 Plus");
127751
+ },
127752
+ get iPhone_X() {
127753
+ return new IosDeviceTarget("iPhone X");
127754
+ },
127755
+ get iPhone_XR() {
127756
+ return new IosDeviceTarget("iPhone XR");
127757
+ },
127758
+ get iPhone_Xs() {
127759
+ return new IosDeviceTarget("iPhone Xs");
127760
+ },
127761
+ get iPhone_Xs_Max() {
127762
+ return new IosDeviceTarget("iPhone Xs Max");
127763
+ },
127764
+ get iPhone_11() {
127765
+ return new IosDeviceTarget("iPhone 11");
127766
+ },
127767
+ get iPhone_11_Pro() {
127768
+ return new IosDeviceTarget("iPhone 11 Pro");
127769
+ },
127770
+ get iPhone_11_Pro_Max() {
127771
+ return new IosDeviceTarget("iPhone 11 Pro Max");
127772
+ },
127773
+ get iPhone_12() {
127774
+ return new IosDeviceTarget("iPhone 12");
127775
+ },
127776
+ get iPhone_12_mini() {
127777
+ return new IosDeviceTarget("iPhone 12 mini");
127778
+ },
127779
+ get iPhone_12_Pro() {
127780
+ return new IosDeviceTarget("iPhone 12 Pro");
127781
+ },
127782
+ get iPhone_12_Pro_Max() {
127783
+ return new IosDeviceTarget("iPhone 12 Pro Max");
127784
+ },
127785
+ get iPhone_13() {
127786
+ return new IosDeviceTarget("iPhone 13");
127787
+ },
127788
+ get iPhone_13_mini() {
127789
+ return new IosDeviceTarget("iPhone 13 mini");
127790
+ },
127791
+ get iPhone_13_Pro() {
127792
+ return new IosDeviceTarget("iPhone 13 Pro");
127793
+ },
127794
+ get iPhone_13_Pro_Max() {
127795
+ return new IosDeviceTarget("iPhone 13 Pro Max");
127796
+ },
127797
+ get iPhone_14() {
127798
+ return new IosDeviceTarget("iPhone 14");
127799
+ },
127800
+ get iPhone_14_Pro() {
127801
+ return new IosDeviceTarget("iPhone 14 Pro");
127802
+ },
127803
+ get iPhone_14_Plus() {
127804
+ return new IosDeviceTarget("iPhone 14 Plus");
127805
+ },
127806
+ get iPhone_14_Pro_Max() {
127807
+ return new IosDeviceTarget("iPhone 14 Pro Max");
127808
+ },
127809
+ get iPhone_15() {
127810
+ return new IosDeviceTarget("iPhone 15");
127811
+ },
127812
+ get iPhone_15_Pro() {
127813
+ return new IosDeviceTarget("iPhone 15 Pro");
127814
+ },
127815
+ get iPhone_15_Plus() {
127816
+ return new IosDeviceTarget("iPhone 15 Plus");
127817
+ },
127818
+ get iPhone_15_Pro_Max() {
127819
+ return new IosDeviceTarget("iPhone 15 Pro Max");
127820
+ },
127821
+ get iPhone_16() {
127822
+ return new IosDeviceTarget("iPhone 16");
127823
+ },
127824
+ get iPhone_16_Pro() {
127825
+ return new IosDeviceTarget("iPhone 16 Pro");
127826
+ },
127827
+ get iPhone_16_Plus() {
127828
+ return new IosDeviceTarget("iPhone 16 Plus");
127829
+ },
127830
+ get iPhone_16_Pro_Max() {
127831
+ return new IosDeviceTarget("iPhone 16 Pro Max");
127832
+ }
127833
+ };
127834
+
127835
+ // ../eyes/src/enums/AndroidMultiDeviceTarget.ts
127836
+ init_process();
127837
+ init_setImmediate();
127838
+ init_buffer();
127839
+ init_setInterval();
127840
+
127841
+ // ../eyes/src/input/AndroidDeviceTarget.ts
127842
+ init_process();
127843
+ init_setImmediate();
127844
+ init_buffer();
127845
+ init_setInterval();
127846
+ var AndroidDeviceTarget = class {
127847
+ constructor(deviceName) {
127848
+ this.deviceName = deviceName;
127849
+ }
127850
+ /**
127851
+ * Sets the device orientation to landscape.
127852
+ * @returns this instance for method chaining
127853
+ */
127854
+ landscape() {
127855
+ this.screenOrientation = "landscape" /* LANDSCAPE */;
127856
+ return this;
127857
+ }
127858
+ /**
127859
+ * Sets the device orientation to portrait.
127860
+ * @returns this instance for method chaining
127861
+ */
127862
+ portrait() {
127863
+ this.screenOrientation = "portrait" /* PORTRAIT */;
127864
+ return this;
127865
+ }
127866
+ /**
127867
+ * Gets the configured orientation for this device target.
127868
+ * @returns the screen orientation, or undefined if not set
127869
+ */
127870
+ getOrientation() {
127871
+ return this.screenOrientation;
127872
+ }
127873
+ /**
127874
+ * Gets the device name.
127875
+ * @returns the device name string
127876
+ */
127877
+ getDeviceName() {
127878
+ return this.deviceName;
127879
+ }
127880
+ /**
127881
+ * String representation of this device target.
127882
+ * @returns the device name
127883
+ */
127884
+ toString() {
127885
+ return this.deviceName;
127886
+ }
127887
+ };
127888
+
127889
+ // ../eyes/src/enums/AndroidMultiDeviceTarget.ts
127890
+ var AndroidMultiDeviceTarget = {
127891
+ get Galaxy_S25() {
127892
+ return new AndroidDeviceTarget("Galaxy S25");
127893
+ },
127894
+ get Galaxy_S25_Ultra() {
127895
+ return new AndroidDeviceTarget("Galaxy S25 Ultra");
127896
+ },
127897
+ get Pixel_9() {
127898
+ return new AndroidDeviceTarget("Pixel 9");
127899
+ }
127900
+ };
127901
+
127464
127902
  // ../eyes/src/enums/IosVersion.ts
127465
127903
  init_process();
127466
127904
  init_setImmediate();
@@ -127491,17 +127929,6 @@ var MatchLevelEnum = /* @__PURE__ */ ((MatchLevelEnum2) => {
127491
127929
  return MatchLevelEnum2;
127492
127930
  })(MatchLevelEnum || {});
127493
127931
 
127494
- // ../eyes/src/enums/ScreenOrientation.ts
127495
- init_process();
127496
- init_setImmediate();
127497
- init_buffer();
127498
- init_setInterval();
127499
- var ScreenOrientationEnum = /* @__PURE__ */ ((ScreenOrientationEnum2) => {
127500
- ScreenOrientationEnum2["PORTRAIT"] = "portrait";
127501
- ScreenOrientationEnum2["LANDSCAPE"] = "landscape";
127502
- return ScreenOrientationEnum2;
127503
- })(ScreenOrientationEnum || {});
127504
-
127505
127932
  // ../eyes/src/enums/SessionType.ts
127506
127933
  init_process();
127507
127934
  init_setImmediate();
@@ -129306,7 +129733,7 @@ var CheckSettingsAutomationFluent = class extends CheckSettingsBaseFluent {
129306
129733
  pageId: this._settings.pageId,
129307
129734
  lazyLoad: this._settings.lazyLoad,
129308
129735
  waitBeforeCapture: this._settings.waitBeforeCapture,
129309
- retryTimeout: this._settings.timeout,
129736
+ matchTimeout: this._settings.timeout,
129310
129737
  userCommandId: this._settings.variationGroupId,
129311
129738
  densityMetrics: this._settings.densityMetrics,
129312
129739
  assumesMutability: this.assumesMutability(),
@@ -130100,12 +130527,79 @@ var ConfigurationData = class {
130100
130527
  this.browsersInfo.push({ chromeEmulationInfo: { deviceName, screenOrientation } });
130101
130528
  return this;
130102
130529
  }
130103
- addMultiDeviceTarget(deviceName) {
130530
+ /**
130531
+ * Add iOS and/or Android devices for multi-device testing.
130532
+ *
130533
+ * @param devices - Device targets. Supports three formats:
130534
+ * - Plain strings: `'iPhone 13'`, `'Galaxy S25'`
130535
+ * - Enum values: `IosMultiDeviceTarget.iPhone_13`, `AndroidMultiDeviceTarget.Galaxy_S25`
130536
+ * - Fluent API: `IosMultiDeviceTarget.iPhone_13.landscape()`, `AndroidMultiDeviceTarget.Galaxy_S25.portrait()`
130537
+ *
130538
+ * @example
130539
+ * ```typescript
130540
+ * // Plain strings (backward compatible)
130541
+ * config.addMultiDeviceTarget('iPhone 13', 'Galaxy S25')
130542
+ *
130543
+ * // Enum values
130544
+ * config.addMultiDeviceTarget(IosMultiDeviceTarget.iPhone_13, AndroidMultiDeviceTargetEnum.Galaxy_S25)
130545
+ *
130546
+ * // Fluent API with orientation
130547
+ * config.addMultiDeviceTarget(
130548
+ * IosMultiDeviceTarget.iPhone_13.landscape(),
130549
+ * AndroidMultiDeviceTarget.Galaxy_S25.portrait()
130550
+ * )
130551
+ *
130552
+ * // Mix all three styles
130553
+ * config.addMultiDeviceTarget(
130554
+ * 'iPhone 14',
130555
+ * IosMultiDeviceTarget.iPhone_15,
130556
+ * IosMultiDeviceTarget.iPhone_16.landscape()
130557
+ * )
130558
+ * ```
130559
+ */
130560
+ addMultiDeviceTarget(...devices) {
130104
130561
  if (!this.browsersInfo)
130105
130562
  this.browsersInfo = [];
130106
- this.browsersInfo.push({ iosDeviceInfo: { deviceName } });
130563
+ for (const device of devices) {
130564
+ if (device instanceof IosDeviceTarget || device instanceof AndroidDeviceTarget) {
130565
+ const deviceName = device.getDeviceName();
130566
+ const screenOrientation = device.getOrientation();
130567
+ if (device instanceof IosDeviceTarget || this._isIosDevice(deviceName)) {
130568
+ this.browsersInfo.push({
130569
+ iosDeviceInfo: {
130570
+ deviceName,
130571
+ ...screenOrientation && { screenOrientation }
130572
+ }
130573
+ });
130574
+ } else {
130575
+ this.browsersInfo.push({
130576
+ androidDeviceInfo: {
130577
+ deviceName,
130578
+ ...screenOrientation && { screenOrientation }
130579
+ }
130580
+ });
130581
+ }
130582
+ } else {
130583
+ const deviceName = device;
130584
+ if (this._isIosDevice(deviceName)) {
130585
+ this.browsersInfo.push({ iosDeviceInfo: { deviceName } });
130586
+ } else if (this._isAndroidDevice(deviceName)) {
130587
+ this.browsersInfo.push({ androidDeviceInfo: { deviceName } });
130588
+ } else {
130589
+ throw new Error(
130590
+ `Invalid device name: "${deviceName}". Supported iOS devices: ${Object.values(IosMultiDeviceTarget).map((d) => d.getDeviceName()).join(", ")}. Supported Android devices: ${Object.values(AndroidMultiDeviceTarget).map((d) => d.getDeviceName()).join(", ")}.`
130591
+ );
130592
+ }
130593
+ }
130594
+ }
130107
130595
  return this;
130108
130596
  }
130597
+ _isIosDevice(deviceName) {
130598
+ return Object.values(IosMultiDeviceTarget).map((target) => target.getDeviceName()).includes(deviceName);
130599
+ }
130600
+ _isAndroidDevice(deviceName) {
130601
+ return Object.values(AndroidMultiDeviceTarget).map((target) => target.getDeviceName()).includes(deviceName);
130602
+ }
130109
130603
  get captureStatusBar() {
130110
130604
  return this._config.captureStatusBar;
130111
130605
  }
@@ -131007,7 +131501,7 @@ var ConfigurationData = class {
131007
131501
  disableBrowserFetching: this.disableBrowserFetching,
131008
131502
  autProxy: this.autProxy,
131009
131503
  sendDom: this.sendDom,
131010
- retryTimeout: this.matchTimeout,
131504
+ matchTimeout: this.matchTimeout,
131011
131505
  matchLevel: (_e = this.defaultMatchSettings) == null ? void 0 : _e.matchLevel,
131012
131506
  ignoreCaret: (_f = this.defaultMatchSettings) == null ? void 0 : _f.ignoreCaret,
131013
131507
  ignoreDisplacements: (_g = this.defaultMatchSettings) == null ? void 0 : _g.ignoreDisplacements,
@@ -132681,6 +133175,8 @@ export {
132681
133175
  AccessibilityMatchSettingsData as AccessibilityMatchSettings,
132682
133176
  AccessibilityRegionTypeEnum as AccessibilityRegionType,
132683
133177
  AccessibilityStatusEnum as AccessibilityStatus,
133178
+ AndroidDeviceTarget,
133179
+ AndroidMultiDeviceTarget,
132684
133180
  ApiUrlsData as ApiUrls,
132685
133181
  AppUrlsData as AppUrls,
132686
133182
  BatchClose,
@@ -132707,6 +133203,8 @@ export {
132707
133203
  ImageMatchSettingsData as ImageMatchSettings,
132708
133204
  ImageRotationData as ImageRotation,
132709
133205
  IosDeviceNameEnum as IosDeviceName,
133206
+ IosDeviceTarget,
133207
+ IosMultiDeviceTarget,
132710
133208
  IosVersionEnum as IosVersion,
132711
133209
  LocationData as Location,
132712
133210
  LogHandlerData as LogHandler,