obsidian-integration-testing 6.0.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -685,6 +685,8 @@ Besides the required `appiumUrl` and `avdName`, the transport accepts these opti
685
685
  | Option | Purpose | Default |
686
686
  | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | ---------------------- |
687
687
  | `appId` | App package (Android) or bundle ID (iOS). | `'md.obsidian'` |
688
+ | `appiumStartTimeoutInMilliseconds` | Max wait for the auto-started Appium server to become ready; only when the harness auto-starts it. | `180000` |
689
+ | `deviceIdleTimeoutInMilliseconds` | Max wait after boot for a started emulator to go idle before the session; avoids inflated cold setup. 0 skips. | `60000` |
688
690
  | `isAppiumConsoleVisible` | Show the auto-started Appium server console window. Hidden (`windowsHide`) by default so it never steals focus. | `false` |
689
691
  | `isEmulatorVisible` | Show the auto-started emulator window. Hidden (`-no-window`, headless) by default so it never steals focus. | `false` |
690
692
  | `layoutReadyTimeoutInMilliseconds` | Max wait for `app.workspace.layoutReady` after the vault (re)opens; raise on slow emulators. | `90000` |
@@ -18,17 +18,25 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var appium_session_config_exports = {};
20
20
  __export(appium_session_config_exports, {
21
+ DEFAULT_APPIUM_START_TIMEOUT_IN_MILLISECONDS: () => DEFAULT_APPIUM_START_TIMEOUT_IN_MILLISECONDS,
21
22
  DEFAULT_SESSION_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS: () => DEFAULT_SESSION_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS,
23
+ resolveAppiumStartTimeoutInMilliseconds: () => resolveAppiumStartTimeoutInMilliseconds,
22
24
  resolveSessionConnectionRetryTimeoutInMilliseconds: () => resolveSessionConnectionRetryTimeoutInMilliseconds
23
25
  });
24
26
  module.exports = __toCommonJS(appium_session_config_exports);
27
+ const DEFAULT_APPIUM_START_TIMEOUT_IN_MILLISECONDS = 18e4;
25
28
  const DEFAULT_SESSION_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS = 18e4;
29
+ function resolveAppiumStartTimeoutInMilliseconds(options) {
30
+ return options.appiumStartTimeoutInMilliseconds ?? DEFAULT_APPIUM_START_TIMEOUT_IN_MILLISECONDS;
31
+ }
26
32
  function resolveSessionConnectionRetryTimeoutInMilliseconds(options) {
27
33
  return options.sessionConnectionRetryTimeoutInMilliseconds ?? DEFAULT_SESSION_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS;
28
34
  }
29
35
  // Annotate the CommonJS export names for ESM import in node:
30
36
  0 && (module.exports = {
37
+ DEFAULT_APPIUM_START_TIMEOUT_IN_MILLISECONDS,
31
38
  DEFAULT_SESSION_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS,
39
+ resolveAppiumStartTimeoutInMilliseconds,
32
40
  resolveSessionConnectionRetryTimeoutInMilliseconds
33
41
  });
34
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwcGl1bS1zZXNzaW9uLWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlc29sdmVzIHR1bmFibGUgQXBwaXVtIHNlc3Npb24tZXN0YWJsaXNobWVudCB0aW1lb3V0cyBmcm9tIHRoZSB0cmFuc3BvcnRcbiAqIG9wdGlvbnMsIGFwcGx5aW5nIGRlZmF1bHRzLiBLZXB0IHNlcGFyYXRlIGZyb20gdGhlIGludGVncmF0aW9uLW9ubHlcbiAqIGB0cmFuc3BvcnQtZmFjdG9yeWAgc28gdGhlIGRlZmF1bHQgcmVzb2x1dGlvbiBzdGF5cyB1bml0LXRlc3RhYmxlICh0aGVcbiAqIGZhY3RvcnkgaXRzZWxmIG5lZWRzIGEgcmVhbCBBcHBpdW0gc2VydmVyIGFuZCBpcyBleGNsdWRlZCBmcm9tIHVuaXQgdGVzdHMpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMuY2pzJztcblxuLyoqXG4gKiBEZWZhdWx0IGZvciB7QGxpbmsgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucy5zZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzfS5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VTU0lPTl9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTgwMDAwO1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBBcHBpdW0gc2Vzc2lvbiBjb25uZWN0aW9uIHJldHJ5IHRpbWVvdXQsIGFwcGx5aW5nIHRoZSBkZWZhdWx0XG4gKiB3aGVuIHRoZSBvcHRpb24gaXMgb21pdHRlZC5cbiAqXG4gKiBUaGlzIGdvdmVybnMgaG93IGxvbmcgV2ViRHJpdmVySU8ncyBgcmVtb3RlKClgIHdhaXRzIGZvciB0aGUgc2Vzc2lvbiB0byBiZVxuICogZXN0YWJsaXNoZWQgKFVpQXV0b21hdG9yMiBzZXJ2ZXIgaW5zdGFsbCArIGFwcCBsYXVuY2gpIFx1MjAxNCBlbXBpcmljYWxseSB0aGVcbiAqIGxhcmdlc3QgYW5kIG1vc3QgbG9hZC1zZW5zaXRpdmUgc3RlcCBvZiB0aGUgQW5kcm9pZCBzZXR1cCwgc28gaXQgaXMgdGhlIGtub2JcbiAqIHRvIHJhaXNlIHdoZW4gc2Vzc2lvbiBlc3RhYmxpc2htZW50IHRpbWVzIG91dCBvbiBhIGNvbGQgb3IgY29udGVuZGVkIGVtdWxhdG9yLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIEFuZHJvaWQgQXBwaXVtIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNlc3Npb25Db25uZWN0aW9uUmV0cnlUaW1lb3V0SW5NaWxsaXNlY29uZHMoXG4gIG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnNcbik6IG51bWJlciB7XG4gIHJldHVybiBvcHRpb25zLnNlc3Npb25Db25uZWN0aW9uUmV0cnlUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9TRVNTSU9OX0NPTk5FQ1RJT05fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFjTyxNQUFNLDJEQUEyRDtBQWNqRSxTQUFTLG1EQUNkLFNBQ1E7QUFDUixTQUFPLFFBQVEsK0NBQStDO0FBQ2hFOyIsCiAgIm5hbWVzIjogW10KfQo=
42
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwcGl1bS1zZXNzaW9uLWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlc29sdmVzIHR1bmFibGUgQXBwaXVtIHNlcnZlci1zdGFydCBhbmQgc2Vzc2lvbi1lc3RhYmxpc2htZW50IHRpbWVvdXRzIGZyb21cbiAqIHRoZSB0cmFuc3BvcnQgb3B0aW9ucywgYXBwbHlpbmcgZGVmYXVsdHMuIEtlcHQgc2VwYXJhdGUgZnJvbSB0aGVcbiAqIGludGVncmF0aW9uLW9ubHkgYHRyYW5zcG9ydC1mYWN0b3J5YCBzbyB0aGUgZGVmYXVsdCByZXNvbHV0aW9uIHN0YXlzXG4gKiB1bml0LXRlc3RhYmxlICh0aGUgZmFjdG9yeSBpdHNlbGYgbmVlZHMgYSByZWFsIEFwcGl1bSBzZXJ2ZXIgYW5kIGlzIGV4Y2x1ZGVkXG4gKiBmcm9tIHVuaXQgdGVzdHMpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMuY2pzJztcblxuLyoqXG4gKiBEZWZhdWx0IGZvciB7QGxpbmsgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucy5hcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kc30uXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDE4MDAwMDtcblxuLyoqXG4gKiBEZWZhdWx0IGZvciB7QGxpbmsgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucy5zZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzfS5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VTU0lPTl9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTgwMDAwO1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciByZWFkaW5lc3MgdGltZW91dCwgYXBwbHlpbmcgdGhlXG4gKiBkZWZhdWx0IHdoZW4gdGhlIG9wdGlvbiBpcyBvbWl0dGVkLlxuICpcbiAqIFRoaXMgZ292ZXJucyBob3cgbG9uZyB0aGUgZmFjdG9yeSBwb2xscyB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXInc1xuICogYC9zdGF0dXNgIGVuZHBvaW50IGJlZm9yZSBnaXZpbmcgdXAuIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgaGFybmVzc1xuICogYXV0by1zdGFydHMgdGhlIHNlcnZlcjsgd2hlbiBhdHRhY2hpbmcgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIHNlcnZlciB0aGUgd2FpdFxuICogaXMgc2tpcHBlZCBlbnRpcmVseS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBBbmRyb2lkIEFwcGl1bSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyhcbiAgb3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuKTogbnVtYmVyIHtcbiAgcmV0dXJuIG9wdGlvbnMuYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9BUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIEFwcGl1bSBzZXNzaW9uIGNvbm5lY3Rpb24gcmV0cnkgdGltZW91dCwgYXBwbHlpbmcgdGhlIGRlZmF1bHRcbiAqIHdoZW4gdGhlIG9wdGlvbiBpcyBvbWl0dGVkLlxuICpcbiAqIFRoaXMgZ292ZXJucyBob3cgbG9uZyBXZWJEcml2ZXJJTydzIGByZW1vdGUoKWAgd2FpdHMgZm9yIHRoZSBzZXNzaW9uIHRvIGJlXG4gKiBlc3RhYmxpc2hlZCAoVWlBdXRvbWF0b3IyIHNlcnZlciBpbnN0YWxsICsgYXBwIGxhdW5jaCkgXHUyMDE0IGVtcGlyaWNhbGx5IHRoZVxuICogbGFyZ2VzdCBhbmQgbW9zdCBsb2FkLXNlbnNpdGl2ZSBzdGVwIG9mIHRoZSBBbmRyb2lkIHNldHVwLCBzbyBpdCBpcyB0aGUga25vYlxuICogdG8gcmFpc2Ugd2hlbiBzZXNzaW9uIGVzdGFibGlzaG1lbnQgdGltZXMgb3V0IG9uIGEgY29sZCBvciBjb250ZW5kZWQgZW11bGF0b3IuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyhcbiAgb3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuKTogbnVtYmVyIHtcbiAgcmV0dXJuIG9wdGlvbnMuc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1NFU1NJT05fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFlTyxNQUFNLCtDQUErQztBQUtyRCxNQUFNLDJEQUEyRDtBQWNqRSxTQUFTLHdDQUNkLFNBQ1E7QUFDUixTQUFPLFFBQVEsb0NBQW9DO0FBQ3JEO0FBY08sU0FBUyxtREFDZCxTQUNRO0FBQ1IsU0FBTyxRQUFRLCtDQUErQztBQUNoRTsiLAogICJuYW1lcyI6IFtdCn0K
@@ -1,16 +1,34 @@
1
1
  /**
2
2
  * @file
3
3
  *
4
- * Resolves tunable Appium session-establishment timeouts from the transport
5
- * options, applying defaults. Kept separate from the integration-only
6
- * `transport-factory` so the default resolution stays unit-testable (the
7
- * factory itself needs a real Appium server and is excluded from unit tests).
4
+ * Resolves tunable Appium server-start and session-establishment timeouts from
5
+ * the transport options, applying defaults. Kept separate from the
6
+ * integration-only `transport-factory` so the default resolution stays
7
+ * unit-testable (the factory itself needs a real Appium server and is excluded
8
+ * from unit tests).
8
9
  */
9
10
  import type { ObsidianAndroidAppiumTransportOptions } from './transport-options.cjs';
11
+ /**
12
+ * Default for {@link ObsidianAndroidAppiumTransportOptions.appiumStartTimeoutInMilliseconds}.
13
+ */
14
+ export declare const DEFAULT_APPIUM_START_TIMEOUT_IN_MILLISECONDS = 180000;
10
15
  /**
11
16
  * Default for {@link ObsidianAndroidAppiumTransportOptions.sessionConnectionRetryTimeoutInMilliseconds}.
12
17
  */
13
18
  export declare const DEFAULT_SESSION_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS = 180000;
19
+ /**
20
+ * Resolves the auto-started Appium server readiness timeout, applying the
21
+ * default when the option is omitted.
22
+ *
23
+ * This governs how long the factory polls the auto-started Appium server's
24
+ * `/status` endpoint before giving up. Only relevant when the harness
25
+ * auto-starts the server; when attaching to an already-running server the wait
26
+ * is skipped entirely.
27
+ *
28
+ * @param options - The Android Appium transport options.
29
+ * @returns The timeout in milliseconds.
30
+ */
31
+ export declare function resolveAppiumStartTimeoutInMilliseconds(options: ObsidianAndroidAppiumTransportOptions): number;
14
32
  /**
15
33
  * Resolves the Appium session connection retry timeout, applying the default
16
34
  * when the option is omitted.
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var device_readiness_exports = {};
20
+ __export(device_readiness_exports, {
21
+ DEFAULT_DEVICE_IDLE_TIMEOUT_IN_MILLISECONDS: () => DEFAULT_DEVICE_IDLE_TIMEOUT_IN_MILLISECONDS,
22
+ checkDeviceIdle: () => checkDeviceIdle,
23
+ resolveDeviceIdleTimeoutInMilliseconds: () => resolveDeviceIdleTimeoutInMilliseconds
24
+ });
25
+ module.exports = __toCommonJS(device_readiness_exports);
26
+ const BOOT_ANIMATION_STOPPED_STATE = "stopped";
27
+ const PACKAGE_LINE_PREFIX = "package:";
28
+ const DEFAULT_DEVICE_IDLE_TIMEOUT_IN_MILLISECONDS = 6e4;
29
+ function checkDeviceIdle(params) {
30
+ const isBootAnimationStopped = params.bootAnimationProp.trim() === BOOT_ANIMATION_STOPPED_STATE;
31
+ const isPackageManagerReady = params.packageListOutput.split("\n").some((line) => line.trim().startsWith(PACKAGE_LINE_PREFIX));
32
+ return isBootAnimationStopped && isPackageManagerReady;
33
+ }
34
+ function resolveDeviceIdleTimeoutInMilliseconds(options) {
35
+ return options.deviceIdleTimeoutInMilliseconds ?? DEFAULT_DEVICE_IDLE_TIMEOUT_IN_MILLISECONDS;
36
+ }
37
+ // Annotate the CommonJS export names for ESM import in node:
38
+ 0 && (module.exports = {
39
+ DEFAULT_DEVICE_IDLE_TIMEOUT_IN_MILLISECONDS,
40
+ checkDeviceIdle,
41
+ resolveDeviceIdleTimeoutInMilliseconds
42
+ });
43
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1yZWFkaW5lc3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGhlbHBlcnMgZm9yIGRlY2lkaW5nIHdoZW4gYSBmcmVzaGx5LWJvb3RlZCBBbmRyb2lkIGVtdWxhdG9yIGlzIGlkbGVcbiAqIGVub3VnaCB0byBlc3RhYmxpc2ggYW4gQXBwaXVtIHNlc3Npb24sIHBsdXMgcmVzb2x2aW5nIHRoZSBpZGxlLXdhaXQgdGltZW91dFxuICogZnJvbSB0aGUgdHJhbnNwb3J0IG9wdGlvbnMuIEtlcHQgc2VwYXJhdGUgZnJvbSB0aGUgaW50ZWdyYXRpb24tb25seVxuICogYHRyYW5zcG9ydC1mYWN0b3J5YCBzbyB0aGUgcGFyc2luZyBhbmQgZGVmYXVsdCByZXNvbHV0aW9uIHN0YXkgdW5pdC10ZXN0YWJsZVxuICogKHRoZSBmYWN0b3J5IGl0c2VsZiBuZWVkcyBhIHJlYWwgZW11bGF0b3IgYW5kIGlzIGV4Y2x1ZGVkIGZyb20gdW5pdCB0ZXN0cykuXG4gKlxuICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgKmJlZm9yZSogdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGU6IHBhY2thZ2VcbiAqIG9wdGltaXphdGlvbiAoYGRleDJvYXRgKSBhbmQgc3lzdGVtIHNlcnZpY2VzIGtlZXAgY2h1cm5pbmcgYWZ0ZXIgaXQsIHNvIGFcbiAqIHNlc3Npb24gZXN0YWJsaXNoZWQgdGhlIGluc3RhbnQgaXQgZmlyZXMgbWFrZXMgZXZlcnkgb25lIG9mIFVpQXV0b21hdG9yMidzXG4gKiBzZXJpYWxpemVkIGBhZGJgIHJvdW5kLXRyaXBzIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGUgfjN4LiBHYXRpbmdcbiAqIHRoZSBzZXNzaW9uIG9uIGEgbGF0ZXIsIHF1aWV0ZXIgc2lnbmFsICh0aGUgYm9vdCBhbmltYXRpb24gaGFzIHN0b3BwZWQgYW5kXG4gKiB0aGUgcGFja2FnZSBtYW5hZ2VyIGlzIHNlcnZpbmcpIGxldHMgaXQgcnVuIGFnYWluc3QgYW4gaWRsZSBndWVzdCBpbnN0ZWFkLlxuICovXG5cbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMuY2pzJztcblxuY29uc3QgQk9PVF9BTklNQVRJT05fU1RPUFBFRF9TVEFURSA9ICdzdG9wcGVkJztcbmNvbnN0IFBBQ0tBR0VfTElORV9QUkVGSVggPSAncGFja2FnZTonO1xuXG4vKipcbiAqIERlZmF1bHQgZm9yIHtAbGluayBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLmRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHN9LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9ERVZJQ0VfSURMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMDAwO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja0RldmljZUlkbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrRGV2aWNlSWRsZVBhcmFtcyB7XG4gIC8qKiBSYXcgc3Rkb3V0IG9mIGBhZGIgc2hlbGwgZ2V0cHJvcCBpbml0LnN2Yy5ib290YW5pbWAuICovXG4gIHJlYWRvbmx5IGJvb3RBbmltYXRpb25Qcm9wOiBzdHJpbmc7XG5cbiAgLyoqIFJhdyBzdGRvdXQgb2YgYGFkYiBzaGVsbCBjbWQgcGFja2FnZSBsaXN0IHBhY2thZ2VzYC4gKi9cbiAgcmVhZG9ubHkgcGFja2FnZUxpc3RPdXRwdXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHdoZXRoZXIgYSBib290ZWQgZW11bGF0b3IgaXMgaWRsZSBlbm91Z2ggdG8gc3RhcnQgYW4gQXBwaXVtIHNlc3Npb24sXG4gKiBmcm9tIHRoZSByYXcgb3V0cHV0IG9mIHRoZSB0d28gcHJvYmUgY29tbWFuZHMuXG4gKlxuICogVGhlIGd1ZXN0IGlzIGNvbnNpZGVyZWQgaWRsZSBvbmNlIHRoZSBib290IGFuaW1hdGlvbiBoYXMgc3RvcHBlZCAqKmFuZCoqIHRoZVxuICogcGFja2FnZSBtYW5hZ2VyIGlzIHNlcnZpbmcgKGl0IGxpc3RzIGF0IGxlYXN0IG9uZSBwYWNrYWdlKS4gQm90aCBhcmUgYmluYXJ5LFxuICogbGF0ZXItdGhhbi1gc3lzLmJvb3RfY29tcGxldGVkYCBzaWduYWxzLCBzbyB0aGlzIHJldHVybnMgYHRydWVgIHdlbGwgYWZ0ZXIgdGhlXG4gKiBwcmVtYXR1cmUgYm9vdC1jb21wbGV0ZWQgZmxhZyBidXQgd2l0aG91dCBhbnkgbGF0ZW5jeSB0aHJlc2hvbGRzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc2FtcGxlZCBwcm9iZSBvdXRwdXRzLlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGd1ZXN0IGlzIGlkbGUgZW5vdWdoIHRvIHByb2NlZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0RldmljZUlkbGUocGFyYW1zOiBDaGVja0RldmljZUlkbGVQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3QgaXNCb290QW5pbWF0aW9uU3RvcHBlZCA9IHBhcmFtcy5ib290QW5pbWF0aW9uUHJvcC50cmltKCkgPT09IEJPT1RfQU5JTUFUSU9OX1NUT1BQRURfU1RBVEU7XG4gIGNvbnN0IGlzUGFja2FnZU1hbmFnZXJSZWFkeSA9IHBhcmFtcy5wYWNrYWdlTGlzdE91dHB1dFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuc29tZSgobGluZSkgPT4gbGluZS50cmltKCkuc3RhcnRzV2l0aChQQUNLQUdFX0xJTkVfUFJFRklYKSk7XG4gIHJldHVybiBpc0Jvb3RBbmltYXRpb25TdG9wcGVkICYmIGlzUGFja2FnZU1hbmFnZXJSZWFkeTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcG9zdC1ib290IGRldmljZS1pZGxlIHdhaXQgdGltZW91dCwgYXBwbHlpbmcgdGhlIGRlZmF1bHQgd2hlblxuICogdGhlIG9wdGlvbiBpcyBvbWl0dGVkLlxuICpcbiAqIFRoaXMgYm91bmRzIGhvdyBsb25nIHRoZSBmYWN0b3J5IHdhaXRzIGZvciBhIGZyZXNobHktc3RhcnRlZCBlbXVsYXRvciB0b1xuICogYmVjb21lIGlkbGUgKHNlZSB7QGxpbmsgY2hlY2tEZXZpY2VJZGxlfSkgYmVmb3JlIGVzdGFibGlzaGluZyB0aGUgc2Vzc2lvbi4gQVxuICogdmFsdWUgb2YgYDBgIHNraXBzIHRoZSB3YWl0IGVudGlyZWx5LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIEFuZHJvaWQgQXBwaXVtIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMoXG4gIG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnNcbik6IG51bWJlciB7XG4gIHJldHVybiBvcHRpb25zLmRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9ERVZJQ0VfSURMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBbUJBLE1BQU0sK0JBQStCO0FBQ3JDLE1BQU0sc0JBQXNCO0FBS3JCLE1BQU0sOENBQThDO0FBeUJwRCxTQUFTLGdCQUFnQixRQUF3QztBQUN0RSxRQUFNLHlCQUF5QixPQUFPLGtCQUFrQixLQUFLLE1BQU07QUFDbkUsUUFBTSx3QkFBd0IsT0FBTyxrQkFDbEMsTUFBTSxJQUFJLEVBQ1YsS0FBSyxDQUFDLFNBQVMsS0FBSyxLQUFLLEVBQUUsV0FBVyxtQkFBbUIsQ0FBQztBQUM3RCxTQUFPLDBCQUEwQjtBQUNuQztBQWFPLFNBQVMsdUNBQ2QsU0FDUTtBQUNSLFNBQU8sUUFBUSxtQ0FBbUM7QUFDcEQ7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Pure helpers for deciding when a freshly-booted Android emulator is idle
5
+ * enough to establish an Appium session, plus resolving the idle-wait timeout
6
+ * from the transport options. Kept separate from the integration-only
7
+ * `transport-factory` so the parsing and default resolution stay unit-testable
8
+ * (the factory itself needs a real emulator and is excluded from unit tests).
9
+ *
10
+ * `sys.boot_completed` fires *before* the guest is actually idle: package
11
+ * optimization (`dex2oat`) and system services keep churning after it, so a
12
+ * session established the instant it fires makes every one of UiAutomator2's
13
+ * serialized `adb` round-trips contend with that work and inflate ~3x. Gating
14
+ * the session on a later, quieter signal (the boot animation has stopped and
15
+ * the package manager is serving) lets it run against an idle guest instead.
16
+ */
17
+ import type { ObsidianAndroidAppiumTransportOptions } from './transport-options.cjs';
18
+ /**
19
+ * Default for {@link ObsidianAndroidAppiumTransportOptions.deviceIdleTimeoutInMilliseconds}.
20
+ */
21
+ export declare const DEFAULT_DEVICE_IDLE_TIMEOUT_IN_MILLISECONDS = 60000;
22
+ /**
23
+ * Parameters for {@link checkDeviceIdle}.
24
+ */
25
+ export interface CheckDeviceIdleParams {
26
+ /** Raw stdout of `adb shell getprop init.svc.bootanim`. */
27
+ readonly bootAnimationProp: string;
28
+ /** Raw stdout of `adb shell cmd package list packages`. */
29
+ readonly packageListOutput: string;
30
+ }
31
+ /**
32
+ * Decides whether a booted emulator is idle enough to start an Appium session,
33
+ * from the raw output of the two probe commands.
34
+ *
35
+ * The guest is considered idle once the boot animation has stopped **and** the
36
+ * package manager is serving (it lists at least one package). Both are binary,
37
+ * later-than-`sys.boot_completed` signals, so this returns `true` well after the
38
+ * premature boot-completed flag but without any latency thresholds.
39
+ *
40
+ * @param params - The sampled probe outputs.
41
+ * @returns `true` when the guest is idle enough to proceed.
42
+ */
43
+ export declare function checkDeviceIdle(params: CheckDeviceIdleParams): boolean;
44
+ /**
45
+ * Resolves the post-boot device-idle wait timeout, applying the default when
46
+ * the option is omitted.
47
+ *
48
+ * This bounds how long the factory waits for a freshly-started emulator to
49
+ * become idle (see {@link checkDeviceIdle}) before establishing the session. A
50
+ * value of `0` skips the wait entirely.
51
+ *
52
+ * @param options - The Android Appium transport options.
53
+ * @returns The timeout in milliseconds.
54
+ */
55
+ export declare function resolveDeviceIdleTimeoutInMilliseconds(options: ObsidianAndroidAppiumTransportOptions): number;
@@ -21,7 +21,7 @@ __export(library_exports, {
21
21
  LIBRARY_VERSION: () => LIBRARY_VERSION
22
22
  });
23
23
  module.exports = __toCommonJS(library_exports);
24
- const LIBRARY_VERSION = false ? "dev" : "5.6.0";
24
+ const LIBRARY_VERSION = false ? "dev" : "6.1.0";
25
25
  // Annotate the CommonJS export names for ESM import in node:
26
26
  0 && (module.exports = {
27
27
  LIBRARY_VERSION