appium-ios-remotexpc 5.1.4 → 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 +6 -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/package.json +1 -1
- 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/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
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
|
+
|
|
1
7
|
## [5.1.4](https://github.com/appium/appium-ios-remotexpc/compare/v5.1.3...v5.1.4) (2026-06-20)
|
|
2
8
|
|
|
3
9
|
### 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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"}
|
package/package.json
CHANGED
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',
|