appium-ios-remotexpc 5.1.3 → 5.1.5
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/CHANGELOG.md +12 -0
- package/build/src/index.d.ts +2 -1
- package/build/src/index.d.ts.map +1 -1
- package/build/src/index.js.map +1 -1
- package/build/src/lib/apple-tv/pairing/index.d.ts +1 -0
- package/build/src/lib/apple-tv/pairing/index.d.ts.map +1 -1
- package/build/src/lib/apple-tv/pairing/pairing-service.d.ts +9 -2
- package/build/src/lib/apple-tv/pairing/pairing-service.d.ts.map +1 -1
- package/build/src/lib/apple-tv/pairing/pairing-service.js +8 -8
- package/build/src/lib/apple-tv/pairing/pairing-service.js.map +1 -1
- package/build/src/lib/apple-tv/storage/pairing-storage.d.ts +1 -1
- package/build/src/lib/apple-tv/storage/pairing-storage.d.ts.map +1 -1
- package/build/src/lib/apple-tv/storage/pairing-storage.js +20 -14
- package/build/src/lib/apple-tv/storage/pairing-storage.js.map +1 -1
- package/package.json +2 -2
- package/scripts/pair-appletv.mjs +109 -2
- package/src/index.ts +8 -1
- package/src/lib/apple-tv/pairing/index.ts +4 -0
- package/src/lib/apple-tv/pairing/pairing-service.ts +20 -11
- package/src/lib/apple-tv/storage/pairing-storage.ts +21 -15
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## [5.1.5](https://github.com/appium/appium-ios-remotexpc/compare/v5.1.4...v5.1.5) (2026-06-20)
|
|
2
|
+
|
|
3
|
+
### Miscellaneous Chores
|
|
4
|
+
|
|
5
|
+
* Improve progress logging for AppleTV pairing scenarios ([#245](https://github.com/appium/appium-ios-remotexpc/issues/245)) ([cc3eabe](https://github.com/appium/appium-ios-remotexpc/commit/cc3eabeaee49d53ad6cf1d546ab1c38ac5d2adac))
|
|
6
|
+
|
|
7
|
+
## [5.1.4](https://github.com/appium/appium-ios-remotexpc/compare/v5.1.3...v5.1.4) (2026-06-20)
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* Loading pair records from strongbox ([#243](https://github.com/appium/appium-ios-remotexpc/issues/243)) ([5ae772f](https://github.com/appium/appium-ios-remotexpc/commit/5ae772f81becc419b74eb7e90422f1d11889726a))
|
|
12
|
+
|
|
1
13
|
## [5.1.3](https://github.com/appium/appium-ios-remotexpc/compare/v5.1.2...v5.1.3) (2026-06-20)
|
|
2
14
|
|
|
3
15
|
### Bug Fixes
|
package/build/src/index.d.ts
CHANGED
|
@@ -30,8 +30,9 @@ export type { XCUITestOptions, XCUITestServiceEvents, XCTestRunnerEvents, XCTest
|
|
|
30
30
|
export { createBinaryPlist } from './lib/plist/index.js';
|
|
31
31
|
export { AppleTVPairingService, UserInputService, } from './lib/apple-tv/pairing/index.js';
|
|
32
32
|
export { AppleTVTunnelService } from './lib/apple-tv/tunnel/index.js';
|
|
33
|
+
export type { AppleTVPairingDiscoveryOptions, AppleTVPairingOptions, } from './lib/apple-tv/pairing/index.js';
|
|
33
34
|
export type { AppleTVDiscoveryOptions, AppleTVTunnelOptions, } from './lib/apple-tv/tunnel/index.js';
|
|
34
|
-
export type { AppleTVPairingResult } from './lib/apple-tv/types.js';
|
|
35
|
+
export type { AppleTVDevice, AppleTVPairingResult, } from './lib/apple-tv/types.js';
|
|
35
36
|
export type { LockdownService } from './lib/lockdown/index.js';
|
|
36
37
|
export { connectViaTunnel, connectViaUsbmux, } from './lib/port-forwarding/index.js';
|
|
37
38
|
export { STRONGBOX_CONTAINER_NAME, TUNNEL_CONTAINER_NAME, createUsbmux, Services, Usbmux, DevicePortForwarder, TunnelManager, discoverServices, servicesToCatalog, TunnelReadinessCoordinator, createLockdownServiceForTunnel, createLockdownServiceByUDID, startCoreDeviceProxyTcp, TunnelRegistryServer, startTunnelRegistryServer, watchTunnelRegistrySockets, watchTunnelRegistryOnDead, };
|
package/build/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/build/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,2BAA2B,EAC3B,8BAA8B,GAC/B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EACL,aAAa,EACb,0BAA0B,EAC1B,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAUjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAuDlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EACL,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,0BAA0B,EAAE,MAAM,oDAAoD,CAAC;AAEhG,OAAO,EAAE,cAAc,EAAE,MAAM,mDAAmD,CAAC;AACnF,OAAO,EACL,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,SAAS,GACV,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AACpF,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,yBAAyB,EACzB,aAAa,GACd,MAAM,8CAA8C,CAAC;AAWtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EACL,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,2BAA2B,EAC3B,8BAA8B,GAC/B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EACL,aAAa,EACb,0BAA0B,EAC1B,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAUjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAuDlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EACL,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,0BAA0B,EAAE,MAAM,oDAAoD,CAAC;AAEhG,OAAO,EAAE,cAAc,EAAE,MAAM,mDAAmD,CAAC;AACnF,OAAO,EACL,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,SAAS,GACV,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AACpF,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,yBAAyB,EACzB,aAAa,GACd,MAAM,8CAA8C,CAAC;AAWtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EACL,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAetE,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,EAC1B,8BAA8B,EAC9B,2BAA2B,EAC3B,uBAAuB,EACvB,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,EAC1B,yBAAyB,GAC1B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/apple-tv/pairing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/apple-tv/pairing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,YAAY,EACV,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,sBAAsB,CAAC"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import type { UserInputInterface } from '../pairing-protocol/types.js';
|
|
2
2
|
import type { AppleTVDevice, AppleTVPairingResult, PairingConfig } from '../types.js';
|
|
3
|
+
export interface AppleTVPairingDiscoveryOptions {
|
|
4
|
+
timeoutMs?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface AppleTVPairingOptions {
|
|
7
|
+
discoveryTimeoutMs?: number;
|
|
8
|
+
devices?: AppleTVDevice[];
|
|
9
|
+
}
|
|
3
10
|
/** Main service orchestrating Apple TV device discovery and pairing */
|
|
4
11
|
export declare class AppleTVPairingService {
|
|
5
12
|
private readonly networkClient;
|
|
@@ -7,9 +14,9 @@ export declare class AppleTVPairingService {
|
|
|
7
14
|
private readonly userInput;
|
|
8
15
|
private readonly pairingProtocol;
|
|
9
16
|
constructor(userInput: UserInputInterface, config?: PairingConfig);
|
|
10
|
-
discoverAndPair(deviceSelector?: string): Promise<AppleTVPairingResult>;
|
|
17
|
+
discoverAndPair(deviceSelector?: string, options?: AppleTVPairingOptions): Promise<AppleTVPairingResult>;
|
|
11
18
|
pairWithDevice(device: AppleTVDevice): Promise<string>;
|
|
12
|
-
|
|
19
|
+
discoverDevices(options?: AppleTVPairingDiscoveryOptions): Promise<AppleTVDevice[]>;
|
|
13
20
|
private selectDevice;
|
|
14
21
|
}
|
|
15
22
|
//# sourceMappingURL=pairing-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairing-service.d.ts","sourceRoot":"","sources":["../../../../../src/lib/apple-tv/pairing/pairing-service.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,aAAa,EACd,MAAM,aAAa,CAAC;AAIrB,uEAAuE;AACvE,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;gBAGhD,SAAS,EAAE,kBAAkB,EAC7B,MAAM,GAAE,aAAsC;IAW1C,eAAe,CACnB,cAAc,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"pairing-service.d.ts","sourceRoot":"","sources":["../../../../../src/lib/apple-tv/pairing/pairing-service.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,aAAa,EACd,MAAM,aAAa,CAAC;AAIrB,MAAM,WAAW,8BAA8B;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,uEAAuE;AACvE,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;gBAGhD,SAAS,EAAE,kBAAkB,EAC7B,MAAM,GAAE,aAAsC;IAW1C,eAAe,CACnB,cAAc,CAAC,EAAE,MAAM,EACvB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC;IA+B1B,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAyBtD,eAAe,CACnB,OAAO,GAAE,8BAAmC,GAC3C,OAAO,CAAC,aAAa,EAAE,CAAC;YAoBb,YAAY;CAwF3B"}
|
|
@@ -19,12 +19,14 @@ export class AppleTVPairingService {
|
|
|
19
19
|
this.userInput = userInput;
|
|
20
20
|
this.pairingProtocol = new PairingProtocol(this.networkClient, this.userInput);
|
|
21
21
|
}
|
|
22
|
-
async discoverAndPair(deviceSelector) {
|
|
22
|
+
async discoverAndPair(deviceSelector, options = {}) {
|
|
23
23
|
try {
|
|
24
|
-
const devices =
|
|
24
|
+
const devices = options.devices ??
|
|
25
|
+
(await this.discoverDevices({
|
|
26
|
+
timeoutMs: options.discoveryTimeoutMs,
|
|
27
|
+
}));
|
|
25
28
|
if (devices.length === 0) {
|
|
26
29
|
const errorMessage = 'No Apple TV pairing devices found. Please ensure your Apple TV is on the same network and in pairing mode.';
|
|
27
|
-
log.error(errorMessage);
|
|
28
30
|
throw new PairingError(errorMessage, 'NO_DEVICES');
|
|
29
31
|
}
|
|
30
32
|
const device = await this.selectDevice(devices, deviceSelector);
|
|
@@ -36,7 +38,6 @@ export class AppleTVPairingService {
|
|
|
36
38
|
};
|
|
37
39
|
}
|
|
38
40
|
catch (error) {
|
|
39
|
-
log.error('Pairing failed:', error);
|
|
40
41
|
return {
|
|
41
42
|
success: false,
|
|
42
43
|
deviceId: 'unknown',
|
|
@@ -63,19 +64,18 @@ export class AppleTVPairingService {
|
|
|
63
64
|
this.networkClient.disconnect();
|
|
64
65
|
}
|
|
65
66
|
}
|
|
66
|
-
async discoverDevices() {
|
|
67
|
+
async discoverDevices(options = {}) {
|
|
67
68
|
try {
|
|
69
|
+
const timeoutMs = options.timeoutMs ?? this.config.discoveryTimeout;
|
|
68
70
|
const backend = createDiscoveryBackend(process.platform, {
|
|
69
71
|
serviceType: REMOTE_PAIRING_MANUAL_DISCOVERY_SERVICE_TYPE,
|
|
70
72
|
domain: REMOTE_PAIRING_DISCOVERY_DOMAIN,
|
|
71
73
|
});
|
|
72
|
-
|
|
73
|
-
const discoveredDevices = await backend.discoverDevices(this.config.discoveryTimeout);
|
|
74
|
+
const discoveredDevices = await backend.discoverDevices(timeoutMs);
|
|
74
75
|
const enrichedDevices = await enrichDiscoveredDevicesWithDevicectl(discoveredDevices);
|
|
75
76
|
return toAppleTVDevices(enrichedDevices);
|
|
76
77
|
}
|
|
77
78
|
catch (error) {
|
|
78
|
-
log.error('Device discovery failed:', error);
|
|
79
79
|
throw new PairingError('Device discovery failed', 'DISCOVERY_ERROR', error);
|
|
80
80
|
}
|
|
81
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairing-service.js","sourceRoot":"","sources":["../../../../../src/lib/apple-tv/pairing/pairing-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,sBAAsB,EACtB,+BAA+B,EAC/B,4CAA4C,GAC7C,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,oCAAoC,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAQ/D,MAAM,GAAG,GAAG,SAAS,CAAC,uBAAuB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"pairing-service.js","sourceRoot":"","sources":["../../../../../src/lib/apple-tv/pairing/pairing-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,11 +4,11 @@ import type { PairRecord, PairingStorageInterface } from './types.js';
|
|
|
4
4
|
export declare class PairingStorage implements PairingStorageInterface {
|
|
5
5
|
private readonly config;
|
|
6
6
|
private readonly box;
|
|
7
|
-
private strongboxDir?;
|
|
8
7
|
constructor(config: PairingConfig);
|
|
9
8
|
save(deviceId: string, ltpk: Buffer, ltsk: Buffer, remoteUnlockHostKey?: string): Promise<string>;
|
|
10
9
|
load(deviceId: string): Promise<PairRecord | null>;
|
|
11
10
|
getAvailableDeviceIds(): Promise<string[]>;
|
|
12
11
|
private createPlistContent;
|
|
12
|
+
private getStrongboxSlugPrefix;
|
|
13
13
|
}
|
|
14
14
|
//# sourceMappingURL=pairing-storage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairing-storage.d.ts","sourceRoot":"","sources":["../../../../../src/lib/apple-tv/storage/pairing-storage.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAItE,uEAAuE;AACvE,qBAAa,cAAe,YAAW,uBAAuB;
|
|
1
|
+
{"version":3,"file":"pairing-storage.d.ts","sourceRoot":"","sources":["../../../../../src/lib/apple-tv/storage/pairing-storage.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAItE,uEAAuE;AACvE,qBAAa,cAAe,YAAW,uBAAuB;IAGhD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAEQ,MAAM,EAAE,aAAa;IAI5C,IAAI,CACR,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,mBAAmB,SAAK,GACvB,OAAO,CAAC,MAAM,CAAC;IAyBZ,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAqClD,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAyBhD,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,sBAAsB;CAK/B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BaseItem, strongbox } from '@appium/strongbox';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { util } from '@appium/support';
|
|
3
|
+
import { basename } from 'node:path';
|
|
4
4
|
import { APPLETV_PAIRING_PREFIX, STRONGBOX_CONTAINER_NAME, } from '../../../constants.js';
|
|
5
5
|
import { getLogger } from '../../logger.js';
|
|
6
6
|
import { createXmlPlist, parseXmlPlist } from '../../plist/index.js';
|
|
@@ -10,7 +10,6 @@ const log = getLogger('PairingStorage');
|
|
|
10
10
|
export class PairingStorage {
|
|
11
11
|
config;
|
|
12
12
|
box;
|
|
13
|
-
strongboxDir;
|
|
14
13
|
constructor(config) {
|
|
15
14
|
this.config = config;
|
|
16
15
|
this.box = strongbox(STRONGBOX_CONTAINER_NAME);
|
|
@@ -62,18 +61,20 @@ export class PairingStorage {
|
|
|
62
61
|
}
|
|
63
62
|
async getAvailableDeviceIds() {
|
|
64
63
|
try {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
64
|
+
const deviceIds = new Set();
|
|
65
|
+
const slugPrefix = this.getStrongboxSlugPrefix();
|
|
66
|
+
for (const item of await this.box.listItems()) {
|
|
67
|
+
for (const itemName of [item.name, basename(item.id)]) {
|
|
68
|
+
if (itemName.startsWith(APPLETV_PAIRING_PREFIX)) {
|
|
69
|
+
deviceIds.add(itemName.slice(APPLETV_PAIRING_PREFIX.length));
|
|
70
|
+
}
|
|
71
|
+
else if (itemName.startsWith(slugPrefix)) {
|
|
72
|
+
deviceIds.add(itemName.slice(slugPrefix.length));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
70
75
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
.filter((file) => file.startsWith(APPLETV_PAIRING_PREFIX))
|
|
74
|
-
.map((file) => file.replace(APPLETV_PAIRING_PREFIX, ''));
|
|
75
|
-
log.debug(`Found ${deviceIds.length} pair record(s): ${deviceIds.join(', ')}`);
|
|
76
|
-
return deviceIds;
|
|
76
|
+
log.debug(`Found ${util.pluralize('pair record', deviceIds.size, true)}: ${[...deviceIds].join(', ')}`);
|
|
77
|
+
return [...deviceIds];
|
|
77
78
|
}
|
|
78
79
|
catch (error) {
|
|
79
80
|
log.debug('Error getting available device IDs:', error);
|
|
@@ -87,5 +88,10 @@ export class PairingStorage {
|
|
|
87
88
|
remote_unlock_host_key: remoteUnlockHostKey,
|
|
88
89
|
});
|
|
89
90
|
}
|
|
91
|
+
getStrongboxSlugPrefix() {
|
|
92
|
+
const sentinel = 'x';
|
|
93
|
+
const item = new BaseItem(`${APPLETV_PAIRING_PREFIX}${sentinel}`, this.box);
|
|
94
|
+
return basename(item.id).slice(0, -sentinel.length);
|
|
95
|
+
}
|
|
90
96
|
}
|
|
91
97
|
//# sourceMappingURL=pairing-storage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairing-storage.js","sourceRoot":"","sources":["../../../../../src/lib/apple-tv/storage/pairing-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"pairing-storage.js","sourceRoot":"","sources":["../../../../../src/lib/apple-tv/storage/pairing-storage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-ios-remotexpc",
|
|
3
|
-
"version": "5.1.
|
|
3
|
+
"version": "5.1.5",
|
|
4
4
|
"main": "build/src/index.js",
|
|
5
5
|
"types": "build/src/index.d.ts",
|
|
6
6
|
"type": "module",
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"typescript": "^6.0.2"
|
|
103
103
|
},
|
|
104
104
|
"dependencies": {
|
|
105
|
-
"@appium/strongbox": "^1.
|
|
105
|
+
"@appium/strongbox": "^1.1.2",
|
|
106
106
|
"@appium/support": "^7.2.2",
|
|
107
107
|
"@xmldom/xmldom": "^0.x",
|
|
108
108
|
"appium-ios-tuntap": "^1.0.0",
|
package/scripts/pair-appletv.mjs
CHANGED
|
@@ -8,9 +8,98 @@
|
|
|
8
8
|
|
|
9
9
|
import { logger } from '@appium/support';
|
|
10
10
|
import { Command } from 'commander';
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
AppleTVPairingService,
|
|
13
|
+
UserInputService,
|
|
14
|
+
} from 'appium-ios-remotexpc';
|
|
15
|
+
import { DEFAULT_PAIRING_CONFIG } from '../build/src/lib/apple-tv/constants.js';
|
|
12
16
|
|
|
13
17
|
const log = logger.getLogger('AppleTVPairing');
|
|
18
|
+
const APPLETV_PAIRING_DISCOVERY_PROGRESS_INTERVAL_MS = 1000;
|
|
19
|
+
const APPLETV_PAIRING_DISCOVERY_PROGRESS_BAR_WIDTH = 24;
|
|
20
|
+
|
|
21
|
+
function parsePositiveInteger(value) {
|
|
22
|
+
const count = Number.parseInt(value, 10);
|
|
23
|
+
if (!Number.isFinite(count) || count <= 0) {
|
|
24
|
+
throw new Error(
|
|
25
|
+
`Invalid timeout: ${value}. Expected a positive integer in milliseconds.`,
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
return count;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function startTimeoutProgressLogger({
|
|
32
|
+
label,
|
|
33
|
+
startedAt,
|
|
34
|
+
timeoutMs,
|
|
35
|
+
barWidth,
|
|
36
|
+
intervalMs,
|
|
37
|
+
}) {
|
|
38
|
+
let timer = null;
|
|
39
|
+
let isStopped = false;
|
|
40
|
+
|
|
41
|
+
const logProgress = (status, isComplete = false) => {
|
|
42
|
+
const elapsedMs = performance.now() - startedAt;
|
|
43
|
+
const boundedElapsedMs = Math.min(elapsedMs, timeoutMs);
|
|
44
|
+
const progress = isComplete ? 1 : boundedElapsedMs / timeoutMs;
|
|
45
|
+
const filledWidth = Math.round(progress * barWidth);
|
|
46
|
+
const emptyWidth = barWidth - filledWidth;
|
|
47
|
+
const bar = `${'#'.repeat(filledWidth)}${'-'.repeat(emptyWidth)}`;
|
|
48
|
+
log.info(
|
|
49
|
+
`${label}: [${bar}]${status && status !== 'waiting' ? ` - ${status}` : ''}`,
|
|
50
|
+
);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const stop = (status, isComplete = false) => {
|
|
54
|
+
if (isStopped) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
isStopped = true;
|
|
58
|
+
if (timer) {
|
|
59
|
+
clearInterval(timer);
|
|
60
|
+
timer = null;
|
|
61
|
+
}
|
|
62
|
+
logProgress(status, isComplete);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
logProgress('waiting');
|
|
66
|
+
timer = setInterval(() => {
|
|
67
|
+
logProgress('waiting');
|
|
68
|
+
}, intervalMs);
|
|
69
|
+
timer.unref?.();
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
succeed: (message = 'done') => stop(message, true),
|
|
73
|
+
fail: (message = 'failed') => stop(message),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function discoverAppleTVPairingDevices(pairingService, timeoutMs) {
|
|
78
|
+
const startedAt = performance.now();
|
|
79
|
+
const promise = pairingService.discoverDevices({ timeoutMs });
|
|
80
|
+
return { startedAt, promise };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function waitForAppleTVPairingDiscovery(discovery, timeoutMs) {
|
|
84
|
+
const progress = startTimeoutProgressLogger({
|
|
85
|
+
label: 'Waiting for Apple TV pairing discovery',
|
|
86
|
+
startedAt: discovery.startedAt,
|
|
87
|
+
timeoutMs,
|
|
88
|
+
barWidth: APPLETV_PAIRING_DISCOVERY_PROGRESS_BAR_WIDTH,
|
|
89
|
+
intervalMs: APPLETV_PAIRING_DISCOVERY_PROGRESS_INTERVAL_MS,
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
const devices = await discovery.promise;
|
|
94
|
+
progress.succeed(
|
|
95
|
+
`Apple TV pairing discovery completed: ${devices.length} device(s) found`,
|
|
96
|
+
);
|
|
97
|
+
return devices;
|
|
98
|
+
} catch (err) {
|
|
99
|
+
progress.fail('Apple TV pairing discovery failed');
|
|
100
|
+
throw err;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
14
103
|
|
|
15
104
|
async function main() {
|
|
16
105
|
const program = new Command();
|
|
@@ -20,14 +109,32 @@ async function main() {
|
|
|
20
109
|
.option(
|
|
21
110
|
'-d, --device <selector>',
|
|
22
111
|
'Device selector: name, identifier (e.g. AA:BB:CC:DD:EE:FF), or index (0, 1, …)',
|
|
112
|
+
)
|
|
113
|
+
.option(
|
|
114
|
+
'--discovery-timeout <ms>',
|
|
115
|
+
'Apple TV pairing discovery timeout in milliseconds',
|
|
116
|
+
parsePositiveInteger,
|
|
23
117
|
);
|
|
24
118
|
|
|
25
119
|
program.parse(process.argv);
|
|
26
120
|
const options = program.opts();
|
|
121
|
+
const discoveryTimeoutMs =
|
|
122
|
+
options.discoveryTimeout ?? DEFAULT_PAIRING_CONFIG.discoveryTimeout;
|
|
27
123
|
|
|
28
124
|
const userInput = new UserInputService();
|
|
29
125
|
const pairingService = new AppleTVPairingService(userInput);
|
|
30
|
-
const
|
|
126
|
+
const discovery = discoverAppleTVPairingDevices(
|
|
127
|
+
pairingService,
|
|
128
|
+
discoveryTimeoutMs,
|
|
129
|
+
);
|
|
130
|
+
const devices = await waitForAppleTVPairingDiscovery(
|
|
131
|
+
discovery,
|
|
132
|
+
discoveryTimeoutMs,
|
|
133
|
+
);
|
|
134
|
+
const result = await pairingService.discoverAndPair(options.device, {
|
|
135
|
+
devices,
|
|
136
|
+
discoveryTimeoutMs,
|
|
137
|
+
});
|
|
31
138
|
|
|
32
139
|
if (result.success) {
|
|
33
140
|
log.info(`Pairing successful! Record saved to: ${result.pairingFile}`);
|
package/src/index.ts
CHANGED
|
@@ -131,11 +131,18 @@ export {
|
|
|
131
131
|
UserInputService,
|
|
132
132
|
} from './lib/apple-tv/pairing/index.js';
|
|
133
133
|
export { AppleTVTunnelService } from './lib/apple-tv/tunnel/index.js';
|
|
134
|
+
export type {
|
|
135
|
+
AppleTVPairingDiscoveryOptions,
|
|
136
|
+
AppleTVPairingOptions,
|
|
137
|
+
} from './lib/apple-tv/pairing/index.js';
|
|
134
138
|
export type {
|
|
135
139
|
AppleTVDiscoveryOptions,
|
|
136
140
|
AppleTVTunnelOptions,
|
|
137
141
|
} from './lib/apple-tv/tunnel/index.js';
|
|
138
|
-
export type {
|
|
142
|
+
export type {
|
|
143
|
+
AppleTVDevice,
|
|
144
|
+
AppleTVPairingResult,
|
|
145
|
+
} from './lib/apple-tv/types.js';
|
|
139
146
|
export type { LockdownService } from './lib/lockdown/index.js';
|
|
140
147
|
|
|
141
148
|
export {
|
|
@@ -19,6 +19,15 @@ import type {
|
|
|
19
19
|
|
|
20
20
|
const log = getLogger('AppleTVPairingService');
|
|
21
21
|
|
|
22
|
+
export interface AppleTVPairingDiscoveryOptions {
|
|
23
|
+
timeoutMs?: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface AppleTVPairingOptions {
|
|
27
|
+
discoveryTimeoutMs?: number;
|
|
28
|
+
devices?: AppleTVDevice[];
|
|
29
|
+
}
|
|
30
|
+
|
|
22
31
|
/** Main service orchestrating Apple TV device discovery and pairing */
|
|
23
32
|
export class AppleTVPairingService {
|
|
24
33
|
private readonly networkClient: NetworkClient;
|
|
@@ -41,14 +50,18 @@ export class AppleTVPairingService {
|
|
|
41
50
|
|
|
42
51
|
async discoverAndPair(
|
|
43
52
|
deviceSelector?: string,
|
|
53
|
+
options: AppleTVPairingOptions = {},
|
|
44
54
|
): Promise<AppleTVPairingResult> {
|
|
45
55
|
try {
|
|
46
|
-
const devices =
|
|
56
|
+
const devices =
|
|
57
|
+
options.devices ??
|
|
58
|
+
(await this.discoverDevices({
|
|
59
|
+
timeoutMs: options.discoveryTimeoutMs,
|
|
60
|
+
}));
|
|
47
61
|
|
|
48
62
|
if (devices.length === 0) {
|
|
49
63
|
const errorMessage =
|
|
50
64
|
'No Apple TV pairing devices found. Please ensure your Apple TV is on the same network and in pairing mode.';
|
|
51
|
-
log.error(errorMessage);
|
|
52
65
|
throw new PairingError(errorMessage, 'NO_DEVICES');
|
|
53
66
|
}
|
|
54
67
|
|
|
@@ -61,7 +74,6 @@ export class AppleTVPairingService {
|
|
|
61
74
|
pairingFile,
|
|
62
75
|
};
|
|
63
76
|
} catch (error) {
|
|
64
|
-
log.error('Pairing failed:', error);
|
|
65
77
|
return {
|
|
66
78
|
success: false,
|
|
67
79
|
deviceId: 'unknown',
|
|
@@ -95,23 +107,20 @@ export class AppleTVPairingService {
|
|
|
95
107
|
}
|
|
96
108
|
}
|
|
97
109
|
|
|
98
|
-
|
|
110
|
+
async discoverDevices(
|
|
111
|
+
options: AppleTVPairingDiscoveryOptions = {},
|
|
112
|
+
): Promise<AppleTVDevice[]> {
|
|
99
113
|
try {
|
|
114
|
+
const timeoutMs = options.timeoutMs ?? this.config.discoveryTimeout;
|
|
100
115
|
const backend = createDiscoveryBackend(process.platform, {
|
|
101
116
|
serviceType: REMOTE_PAIRING_MANUAL_DISCOVERY_SERVICE_TYPE,
|
|
102
117
|
domain: REMOTE_PAIRING_DISCOVERY_DOMAIN,
|
|
103
118
|
});
|
|
104
|
-
|
|
105
|
-
`Discovering Apple TV devices (waiting ${this.config.discoveryTimeout / 1000} seconds)...`,
|
|
106
|
-
);
|
|
107
|
-
const discoveredDevices = await backend.discoverDevices(
|
|
108
|
-
this.config.discoveryTimeout,
|
|
109
|
-
);
|
|
119
|
+
const discoveredDevices = await backend.discoverDevices(timeoutMs);
|
|
110
120
|
const enrichedDevices =
|
|
111
121
|
await enrichDiscoveredDevicesWithDevicectl(discoveredDevices);
|
|
112
122
|
return toAppleTVDevices(enrichedDevices);
|
|
113
123
|
} catch (error) {
|
|
114
|
-
log.error('Device discovery failed:', error);
|
|
115
124
|
throw new PairingError(
|
|
116
125
|
'Device discovery failed',
|
|
117
126
|
'DISCOVERY_ERROR',
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BaseItem, strongbox } from '@appium/strongbox';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { util } from '@appium/support';
|
|
3
|
+
import { basename } from 'node:path';
|
|
4
4
|
|
|
5
5
|
import {
|
|
6
6
|
APPLETV_PAIRING_PREFIX,
|
|
@@ -17,7 +17,6 @@ const log = getLogger('PairingStorage');
|
|
|
17
17
|
/** Manages persistent storage of pairing credentials as plist files */
|
|
18
18
|
export class PairingStorage implements PairingStorageInterface {
|
|
19
19
|
private readonly box;
|
|
20
|
-
private strongboxDir?: string;
|
|
21
20
|
|
|
22
21
|
constructor(private readonly config: PairingConfig) {
|
|
23
22
|
this.box = strongbox(STRONGBOX_CONTAINER_NAME);
|
|
@@ -92,22 +91,23 @@ export class PairingStorage implements PairingStorageInterface {
|
|
|
92
91
|
|
|
93
92
|
async getAvailableDeviceIds(): Promise<string[]> {
|
|
94
93
|
try {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
94
|
+
const deviceIds = new Set<string>();
|
|
95
|
+
const slugPrefix = this.getStrongboxSlugPrefix();
|
|
96
|
+
|
|
97
|
+
for (const item of await this.box.listItems()) {
|
|
98
|
+
for (const itemName of [item.name, basename(item.id)]) {
|
|
99
|
+
if (itemName.startsWith(APPLETV_PAIRING_PREFIX)) {
|
|
100
|
+
deviceIds.add(itemName.slice(APPLETV_PAIRING_PREFIX.length));
|
|
101
|
+
} else if (itemName.startsWith(slugPrefix)) {
|
|
102
|
+
deviceIds.add(itemName.slice(slugPrefix.length));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
100
105
|
}
|
|
101
106
|
|
|
102
|
-
const files = await readdir(this.strongboxDir);
|
|
103
|
-
const deviceIds = files
|
|
104
|
-
.filter((file: string) => file.startsWith(APPLETV_PAIRING_PREFIX))
|
|
105
|
-
.map((file: string) => file.replace(APPLETV_PAIRING_PREFIX, ''));
|
|
106
|
-
|
|
107
107
|
log.debug(
|
|
108
|
-
`Found ${
|
|
108
|
+
`Found ${util.pluralize('pair record', deviceIds.size, true)}: ${[...deviceIds].join(', ')}`,
|
|
109
109
|
);
|
|
110
|
-
return deviceIds;
|
|
110
|
+
return [...deviceIds];
|
|
111
111
|
} catch (error) {
|
|
112
112
|
log.debug('Error getting available device IDs:', error);
|
|
113
113
|
return [];
|
|
@@ -125,4 +125,10 @@ export class PairingStorage implements PairingStorageInterface {
|
|
|
125
125
|
remote_unlock_host_key: remoteUnlockHostKey,
|
|
126
126
|
});
|
|
127
127
|
}
|
|
128
|
+
|
|
129
|
+
private getStrongboxSlugPrefix(): string {
|
|
130
|
+
const sentinel = 'x';
|
|
131
|
+
const item = new BaseItem(`${APPLETV_PAIRING_PREFIX}${sentinel}`, this.box);
|
|
132
|
+
return basename(item.id).slice(0, -sentinel.length);
|
|
133
|
+
}
|
|
128
134
|
}
|