appium-xcuitest-driver 9.7.0 ā 9.8.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/CHANGELOG.md +6 -0
- package/build/lib/ios-fs-helpers.d.ts.map +1 -1
- package/build/lib/ios-fs-helpers.js +17 -7
- package/build/lib/ios-fs-helpers.js.map +1 -1
- package/lib/ios-fs-helpers.js +27 -15
- package/npm-shrinkwrap.json +15 -14
- package/package.json +6 -4
- package/scripts/tunnel-creation.mjs +359 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## [9.8.0](https://github.com/appium/appium-xcuitest-driver/compare/v9.7.0...v9.8.0) (2025-06-24)
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
* Save tunnel registry using strong box ([#2585](https://github.com/appium/appium-xcuitest-driver/issues/2585)) ([8868b1a](https://github.com/appium/appium-xcuitest-driver/commit/8868b1aba093d996d41cc47b17e4ae077457f2b7))
|
|
6
|
+
|
|
1
7
|
## [9.7.0](https://github.com/appium/appium-xcuitest-driver/compare/v9.6.1...v9.7.0) (2025-06-15)
|
|
2
8
|
|
|
3
9
|
### Features
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ios-fs-helpers.d.ts","sourceRoot":"","sources":["../../lib/ios-fs-helpers.js"],"names":[],"mappings":"AAWA;;;;;;;GAOG;AACH,qCALW,GAAG,cAEH,MAAM,GACJ,OAAO,CAAC,MAAM,CAAC,CAY3B;AAgBD;;;;;;;GAOG;AACH,uCALW,GAAG,kBAEH,MAAM,GACJ,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"ios-fs-helpers.d.ts","sourceRoot":"","sources":["../../lib/ios-fs-helpers.js"],"names":[],"mappings":"AAWA;;;;;;;GAOG;AACH,qCALW,GAAG,cAEH,MAAM,GACJ,OAAO,CAAC,MAAM,CAAC,CAY3B;AAgBD;;;;;;;GAOG;AACH,uCALW,GAAG,kBAEH,MAAM,GACJ,OAAO,CAAC,MAAM,CAAC,CA0E3B;AA0BD;;;;GAIG;AAEH;;;;;;;;;;GAUG;AACH,qCARW,GAAG,sBAEH,MAAM,GAAC,MAAM,cAEb,MAAM,SAEN,eAAe,iBAgDzB;AAED;;;;;;;GAOG;AAEH;;;;;;;;;GASG;AACH,uCAPW,GAAG,eAEH,MAAM,eACN,MAAM,SAEN,iBAAiB,iBAyH3B;AA5VD,mCAA2C"}
|
|
@@ -132,8 +132,12 @@ async function pullFolder(afcService, remoteRootPath) {
|
|
|
132
132
|
readStream.pipe(writeStream);
|
|
133
133
|
if (pullPromises.length >= MAX_IO_CHUNK_SIZE) {
|
|
134
134
|
await bluebird_1.default.any(pullPromises);
|
|
135
|
+
for (let i = pullPromises.length - 1; i >= 0; i--) {
|
|
136
|
+
if (pullPromises[i].isFulfilled()) {
|
|
137
|
+
pullPromises.splice(i, 1);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
135
140
|
}
|
|
136
|
-
lodash_1.default.remove(pullPromises, (p) => p.isFulfilled());
|
|
137
141
|
});
|
|
138
142
|
// Wait for the rest of files to be pulled
|
|
139
143
|
if (!lodash_1.default.isEmpty(pullPromises)) {
|
|
@@ -191,7 +195,7 @@ async function remoteMkdirp(afcService, remoteRoot) {
|
|
|
191
195
|
* @param {PushFileOptions} [opts={}]
|
|
192
196
|
*/
|
|
193
197
|
async function pushFile(afcService, localPathOrPayload, remotePath, opts = {}) {
|
|
194
|
-
const { timeoutMs = exports.IO_TIMEOUT_MS
|
|
198
|
+
const { timeoutMs = exports.IO_TIMEOUT_MS } = opts;
|
|
195
199
|
const timer = new support_1.timing.Timer().start();
|
|
196
200
|
await remoteMkdirp(afcService, path_1.default.dirname(remotePath));
|
|
197
201
|
const source = Buffer.isBuffer(localPathOrPayload)
|
|
@@ -237,7 +241,6 @@ async function pushFile(afcService, localPathOrPayload, remotePath, opts = {}) {
|
|
|
237
241
|
logger_1.default.debug(`Successfully pushed the file payload (${support_1.util.toReadableSizeString(fileSize)}) ` +
|
|
238
242
|
`to the remote location '${remotePath}' in ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
|
|
239
243
|
}
|
|
240
|
-
;
|
|
241
244
|
/**
|
|
242
245
|
* @typedef {Object} PushFolderOptions
|
|
243
246
|
*
|
|
@@ -259,7 +262,8 @@ async function pushFile(afcService, localPathOrPayload, remotePath, opts = {}) {
|
|
|
259
262
|
async function pushFolder(afcService, srcRootPath, dstRootPath, opts = {}) {
|
|
260
263
|
const { timeoutMs = exports.IO_TIMEOUT_MS, enableParallelPush = false } = opts;
|
|
261
264
|
const timer = new support_1.timing.Timer().start();
|
|
262
|
-
const allItems = /** @type {import('path-scurry').Path[]} */ (
|
|
265
|
+
const allItems = /** @type {import('path-scurry').Path[]} */ (
|
|
266
|
+
/** @type {unknown} */ (await support_1.fs.glob('**', {
|
|
263
267
|
cwd: srcRootPath,
|
|
264
268
|
withFileTypes: true,
|
|
265
269
|
})));
|
|
@@ -336,11 +340,17 @@ async function pushFolder(afcService, srcRootPath, dstRootPath, opts = {}) {
|
|
|
336
340
|
throw new bluebird_1.TimeoutError(`Timed out after ${elapsedMs} ms`);
|
|
337
341
|
}
|
|
338
342
|
}
|
|
339
|
-
|
|
343
|
+
for (let i = pushPromises.length - 1; i >= 0; i--) {
|
|
344
|
+
if (pushPromises[i].isFulfilled()) {
|
|
345
|
+
pushPromises.splice(i, 1);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
340
348
|
}
|
|
341
349
|
if (!lodash_1.default.isEmpty(pushPromises)) {
|
|
342
|
-
|
|
343
|
-
|
|
350
|
+
const remainingPromises = pushPromises.filter((p) => !p.isFulfilled());
|
|
351
|
+
if (remainingPromises.length > 0) {
|
|
352
|
+
await bluebird_1.default.all(remainingPromises).timeout(Math.max(timeoutMs - timer.getDuration().asMilliSeconds, 60000));
|
|
353
|
+
}
|
|
344
354
|
}
|
|
345
355
|
}
|
|
346
356
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ios-fs-helpers.js","sourceRoot":"","sources":["../../lib/ios-fs-helpers.js"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ios-fs-helpers.js","sourceRoot":"","sources":["../../lib/ios-fs-helpers.js"],"names":[],"mappings":"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"}
|
package/lib/ios-fs-helpers.js
CHANGED
|
@@ -97,8 +97,12 @@ export async function pullFolder(afcService, remoteRootPath) {
|
|
|
97
97
|
readStream.pipe(writeStream);
|
|
98
98
|
if (pullPromises.length >= MAX_IO_CHUNK_SIZE) {
|
|
99
99
|
await B.any(pullPromises);
|
|
100
|
+
for (let i = pullPromises.length - 1; i >= 0; i--) {
|
|
101
|
+
if (pullPromises[i].isFulfilled()) {
|
|
102
|
+
pullPromises.splice(i, 1);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
100
105
|
}
|
|
101
|
-
_.remove(pullPromises, (p) => p.isFulfilled());
|
|
102
106
|
});
|
|
103
107
|
// Wait for the rest of files to be pulled
|
|
104
108
|
if (!_.isEmpty(pullPromises)) {
|
|
@@ -162,10 +166,8 @@ async function remoteMkdirp(afcService, remoteRoot) {
|
|
|
162
166
|
* folder structure is created automatically if necessary.
|
|
163
167
|
* @param {PushFileOptions} [opts={}]
|
|
164
168
|
*/
|
|
165
|
-
export async function pushFile
|
|
166
|
-
const {
|
|
167
|
-
timeoutMs = IO_TIMEOUT_MS,
|
|
168
|
-
} = opts;
|
|
169
|
+
export async function pushFile(afcService, localPathOrPayload, remotePath, opts = {}) {
|
|
170
|
+
const {timeoutMs = IO_TIMEOUT_MS} = opts;
|
|
169
171
|
const timer = new timing.Timer().start();
|
|
170
172
|
await remoteMkdirp(afcService, path.dirname(remotePath));
|
|
171
173
|
const source = Buffer.isBuffer(localPathOrPayload)
|
|
@@ -208,9 +210,9 @@ export async function pushFile (afcService, localPathOrPayload, remotePath, opts
|
|
|
208
210
|
: (await fs.stat(localPathOrPayload)).size;
|
|
209
211
|
log.debug(
|
|
210
212
|
`Successfully pushed the file payload (${util.toReadableSizeString(fileSize)}) ` +
|
|
211
|
-
|
|
213
|
+
`to the remote location '${remotePath}' in ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`,
|
|
212
214
|
);
|
|
213
|
-
}
|
|
215
|
+
}
|
|
214
216
|
|
|
215
217
|
/**
|
|
216
218
|
* @typedef {Object} PushFolderOptions
|
|
@@ -235,11 +237,13 @@ export async function pushFolder(afcService, srcRootPath, dstRootPath, opts = {}
|
|
|
235
237
|
const {timeoutMs = IO_TIMEOUT_MS, enableParallelPush = false} = opts;
|
|
236
238
|
|
|
237
239
|
const timer = new timing.Timer().start();
|
|
238
|
-
const allItems = /** @type {import('path-scurry').Path[]} */ (
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
240
|
+
const allItems = /** @type {import('path-scurry').Path[]} */ (
|
|
241
|
+
/** @type {unknown} */ (
|
|
242
|
+
await fs.glob('**', {
|
|
243
|
+
cwd: srcRootPath,
|
|
244
|
+
withFileTypes: true,
|
|
245
|
+
})
|
|
246
|
+
)
|
|
243
247
|
);
|
|
244
248
|
log.debug(`Successfully scanned the tree structure of '${srcRootPath}'`);
|
|
245
249
|
// top-level folders go first
|
|
@@ -318,11 +322,19 @@ export async function pushFolder(afcService, srcRootPath, dstRootPath, opts = {}
|
|
|
318
322
|
throw new TimeoutError(`Timed out after ${elapsedMs} ms`);
|
|
319
323
|
}
|
|
320
324
|
}
|
|
321
|
-
|
|
325
|
+
for (let i = pushPromises.length - 1; i >= 0; i--) {
|
|
326
|
+
if (pushPromises[i].isFulfilled()) {
|
|
327
|
+
pushPromises.splice(i, 1);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
322
330
|
}
|
|
323
331
|
if (!_.isEmpty(pushPromises)) {
|
|
324
|
-
|
|
325
|
-
|
|
332
|
+
const remainingPromises = pushPromises.filter((p) => !p.isFulfilled());
|
|
333
|
+
if (remainingPromises.length > 0) {
|
|
334
|
+
await B.all(remainingPromises).timeout(
|
|
335
|
+
Math.max(timeoutMs - timer.getDuration().asMilliSeconds, 60000),
|
|
336
|
+
);
|
|
337
|
+
}
|
|
326
338
|
}
|
|
327
339
|
} else {
|
|
328
340
|
log.debug(`Proceeding to serial files push`);
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-xcuitest-driver",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.8.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "appium-xcuitest-driver",
|
|
9
|
-
"version": "9.
|
|
9
|
+
"version": "9.8.0",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"dependencies": {
|
|
12
|
+
"@appium/strongbox": "^0.x",
|
|
12
13
|
"@colors/colors": "^1.6.0",
|
|
13
14
|
"appium-idb": "^1.6.13",
|
|
14
15
|
"appium-ios-device": "^2.8.0",
|
|
@@ -479,15 +480,15 @@
|
|
|
479
480
|
"license": "MIT"
|
|
480
481
|
},
|
|
481
482
|
"node_modules/@types/lodash": {
|
|
482
|
-
"version": "4.17.
|
|
483
|
-
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.
|
|
484
|
-
"integrity": "sha512-
|
|
483
|
+
"version": "4.17.18",
|
|
484
|
+
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.18.tgz",
|
|
485
|
+
"integrity": "sha512-KJ65INaxqxmU6EoCiJmRPZC9H9RVWCRd349tXM2M3O5NA7cY6YL7c0bHAHQ93NOfTObEQ004kd2QVHs/r0+m4g==",
|
|
485
486
|
"license": "MIT"
|
|
486
487
|
},
|
|
487
488
|
"node_modules/@types/node": {
|
|
488
|
-
"version": "24.0.
|
|
489
|
-
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.
|
|
490
|
-
"integrity": "sha512-
|
|
489
|
+
"version": "24.0.3",
|
|
490
|
+
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz",
|
|
491
|
+
"integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==",
|
|
491
492
|
"license": "MIT",
|
|
492
493
|
"dependencies": {
|
|
493
494
|
"undici-types": "~7.8.0"
|
|
@@ -660,9 +661,9 @@
|
|
|
660
661
|
}
|
|
661
662
|
},
|
|
662
663
|
"node_modules/appium-webdriveragent": {
|
|
663
|
-
"version": "9.14.
|
|
664
|
-
"resolved": "https://registry.npmjs.org/appium-webdriveragent/-/appium-webdriveragent-9.14.
|
|
665
|
-
"integrity": "sha512-
|
|
664
|
+
"version": "9.14.6",
|
|
665
|
+
"resolved": "https://registry.npmjs.org/appium-webdriveragent/-/appium-webdriveragent-9.14.6.tgz",
|
|
666
|
+
"integrity": "sha512-OYJOMAIL0jHnOkTfK84nKFSuQPPwSw4gC72CsbqEYgZh3iE+yiELX6WpIH2e4DvShbzyCTJPhD60OwY/Ke3BmQ==",
|
|
666
667
|
"license": "Apache-2.0",
|
|
667
668
|
"dependencies": {
|
|
668
669
|
"@appium/base-driver": "^9.0.0",
|
|
@@ -1322,9 +1323,9 @@
|
|
|
1322
1323
|
}
|
|
1323
1324
|
},
|
|
1324
1325
|
"node_modules/css-selector-parser": {
|
|
1325
|
-
"version": "3.1.
|
|
1326
|
-
"resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.1.
|
|
1327
|
-
"integrity": "sha512-
|
|
1326
|
+
"version": "3.1.3",
|
|
1327
|
+
"resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.1.3.tgz",
|
|
1328
|
+
"integrity": "sha512-gJMigczVZqYAk0hPVzx/M4Hm1D9QOtqkdQk9005TNzDIUGzo5cnHEDiKUT7jGPximL/oYb+LIitcHFQ4aKupxg==",
|
|
1328
1329
|
"funding": [
|
|
1329
1330
|
{
|
|
1330
1331
|
"type": "github",
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"xcuitest",
|
|
9
9
|
"xctest"
|
|
10
10
|
],
|
|
11
|
-
"version": "9.
|
|
11
|
+
"version": "9.8.0",
|
|
12
12
|
"author": "Appium Contributors",
|
|
13
13
|
"license": "Apache-2.0",
|
|
14
14
|
"repository": {
|
|
@@ -32,7 +32,8 @@
|
|
|
32
32
|
"mainClass": "XCUITestDriver",
|
|
33
33
|
"scripts": {
|
|
34
34
|
"build-wda": "./scripts/build-wda.js",
|
|
35
|
-
"open-wda": "./scripts/open-wda.js"
|
|
35
|
+
"open-wda": "./scripts/open-wda.js",
|
|
36
|
+
"tunnel-creation": "./scripts/tunnel-creation.mjs"
|
|
36
37
|
},
|
|
37
38
|
"schema": {
|
|
38
39
|
"$schema": "http://json-schema.org/draft-07/schema",
|
|
@@ -76,6 +77,7 @@
|
|
|
76
77
|
],
|
|
77
78
|
"types": "./build/index.d.ts",
|
|
78
79
|
"dependencies": {
|
|
80
|
+
"@appium/strongbox": "^0.x",
|
|
79
81
|
"@colors/colors": "^1.6.0",
|
|
80
82
|
"appium-idb": "^1.6.13",
|
|
81
83
|
"appium-ios-device": "^2.8.0",
|
|
@@ -97,8 +99,8 @@
|
|
|
97
99
|
"semver": "^7.5.4",
|
|
98
100
|
"source-map-support": "^0.x",
|
|
99
101
|
"teen_process": "^2.2.0",
|
|
100
|
-
"
|
|
101
|
-
"
|
|
102
|
+
"winston": "3.17.0",
|
|
103
|
+
"ws": "^8.13.0"
|
|
102
104
|
},
|
|
103
105
|
"scripts": {
|
|
104
106
|
"build": "tsc -b",
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Test script for creating lockdown service, starting CoreDeviceProxy, and creating tunnel
|
|
4
|
+
* This script demonstrates the tunnel creation workflow for all connected devices
|
|
5
|
+
*/
|
|
6
|
+
import {logger, node} from '@appium/support';
|
|
7
|
+
import _ from 'lodash';
|
|
8
|
+
/* eslint-disable import/no-unresolved */
|
|
9
|
+
import {
|
|
10
|
+
PacketStreamServer,
|
|
11
|
+
TunnelManager,
|
|
12
|
+
createLockdownServiceByUDID,
|
|
13
|
+
createUsbmux,
|
|
14
|
+
startCoreDeviceProxy,
|
|
15
|
+
startTunnelRegistryServer,
|
|
16
|
+
} from 'appium-ios-remotexpc';
|
|
17
|
+
|
|
18
|
+
import {strongbox} from '@appium/strongbox';
|
|
19
|
+
import path from 'path';
|
|
20
|
+
import fs from 'fs';
|
|
21
|
+
|
|
22
|
+
const log = logger.getLogger('TunnelCreation');
|
|
23
|
+
const TUNNEL_REGISTRY_PORT = 'tunnelRegistryPort';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* TunnelCreator class for managing tunnel creation and related operations
|
|
27
|
+
*/
|
|
28
|
+
class TunnelCreator {
|
|
29
|
+
constructor() {
|
|
30
|
+
this._packetStreamServers = new Map();
|
|
31
|
+
// Default port value, will be updated in main() if --packet-stream-base-port is provided
|
|
32
|
+
this._packetStreamBasePort = 50000;
|
|
33
|
+
// Default port value, will be updated in main() if --tunnel-registry-port is provided
|
|
34
|
+
this._tunnelRegistryPort = 42314;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
get packetStreamBasePort() {
|
|
38
|
+
return this._packetStreamBasePort;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
set packetStreamBasePort(port) {
|
|
42
|
+
this._packetStreamBasePort = port;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
get tunnelRegistryPort() {
|
|
46
|
+
return this._tunnelRegistryPort;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
set tunnelRegistryPort(port) {
|
|
50
|
+
this._tunnelRegistryPort = port;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Update tunnel registry with new tunnel information
|
|
55
|
+
* @type {import('appium-ios-remotexpc').TunnelResult[]} results - Array of tunnel results
|
|
56
|
+
* @returns {Promise<import('appium-ios-remotexpc').TunnelRegistry>} Updated tunnel registry
|
|
57
|
+
*/
|
|
58
|
+
async updateTunnelRegistry(results) {
|
|
59
|
+
const now = Date.now();
|
|
60
|
+
const nowISOString = new Date().toISOString();
|
|
61
|
+
|
|
62
|
+
// Initialize registry if it doesn't exist
|
|
63
|
+
const registry = {
|
|
64
|
+
tunnels: {},
|
|
65
|
+
metadata: {
|
|
66
|
+
lastUpdated: nowISOString,
|
|
67
|
+
totalTunnels: 0,
|
|
68
|
+
activeTunnels: 0,
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
// Update tunnels
|
|
73
|
+
for (const result of results) {
|
|
74
|
+
if (result.success) {
|
|
75
|
+
const udid = result.device.Properties.SerialNumber;
|
|
76
|
+
registry.tunnels[udid] = {
|
|
77
|
+
udid,
|
|
78
|
+
deviceId: result.device.DeviceID,
|
|
79
|
+
address: result.tunnel.Address,
|
|
80
|
+
rsdPort: result.tunnel.RsdPort ?? 0,
|
|
81
|
+
packetStreamPort: result.packetStreamPort,
|
|
82
|
+
connectionType: result.device.Properties.ConnectionType,
|
|
83
|
+
productId: result.device.Properties.ProductID,
|
|
84
|
+
createdAt: registry.tunnels[udid]?.createdAt ?? now,
|
|
85
|
+
lastUpdated: now,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Update metadata
|
|
91
|
+
registry.metadata = {
|
|
92
|
+
lastUpdated: nowISOString,
|
|
93
|
+
totalTunnels: Object.keys(registry.tunnels).length,
|
|
94
|
+
activeTunnels: Object.keys(registry.tunnels).length, // Assuming all are active for now
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
return registry;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Setup cleanup handlers for graceful shutdown
|
|
102
|
+
*/
|
|
103
|
+
setupCleanupHandlers() {
|
|
104
|
+
const cleanup = async (signal) => {
|
|
105
|
+
log.warn(`\nReceived ${signal}. Cleaning up...`);
|
|
106
|
+
|
|
107
|
+
// Close all packet stream servers
|
|
108
|
+
if (this._packetStreamServers.size > 0) {
|
|
109
|
+
log.info(`Closing ${this._packetStreamServers.size} packet stream server(s)...`);
|
|
110
|
+
for (const [udid, server] of this._packetStreamServers) {
|
|
111
|
+
try {
|
|
112
|
+
await server.stop();
|
|
113
|
+
log.info(`Closed packet stream server for device ${udid}`);
|
|
114
|
+
} catch (err) {
|
|
115
|
+
log.warn(`Failed to close packet stream server for device ${udid}: ${err}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
this._packetStreamServers.clear();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
log.info('Cleanup completed. Exiting...');
|
|
122
|
+
process.exit(0);
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
// Handle various termination signals
|
|
126
|
+
process.on('SIGINT', () => cleanup('SIGINT (Ctrl+C)'));
|
|
127
|
+
process.on('SIGTERM', () => cleanup('SIGTERM'));
|
|
128
|
+
process.on('SIGHUP', () => cleanup('SIGHUP'));
|
|
129
|
+
|
|
130
|
+
// Handle uncaught exceptions and unhandled rejections
|
|
131
|
+
process.on('uncaughtException', async (error) => {
|
|
132
|
+
log.error('Uncaught Exception:', error);
|
|
133
|
+
await cleanup('Uncaught Exception');
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
process.on('unhandledRejection', async (reason, promise) => {
|
|
137
|
+
log.error('Unhandled Rejection at:', promise, 'reason:', reason);
|
|
138
|
+
await cleanup('Unhandled Rejection');
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Create tunnel for a single device
|
|
144
|
+
* @param {Device} device - Device object
|
|
145
|
+
* @param {import('tls').ConnectionOptions} tlsOptions - TLS options
|
|
146
|
+
* @returns {Promise<import('appium-ios-remotexpc').TunnelResult & { socket?: any; socketInfo?: import('appium-ios-remotexpc').SocketInfo }>} Tunnel result
|
|
147
|
+
*/
|
|
148
|
+
async createTunnelForDevice(device, tlsOptions) {
|
|
149
|
+
const udid = device.Properties.SerialNumber;
|
|
150
|
+
|
|
151
|
+
log.info(`\n--- Processing device: ${udid} ---`);
|
|
152
|
+
log.info(`Device ID: ${device.DeviceID}`);
|
|
153
|
+
log.info(`Connection Type: ${device.Properties.ConnectionType}`);
|
|
154
|
+
log.info(`Product ID: ${device.Properties.ProductID}`);
|
|
155
|
+
|
|
156
|
+
log.info('Creating lockdown service...');
|
|
157
|
+
const {lockdownService, device: lockdownDevice} = await createLockdownServiceByUDID(udid);
|
|
158
|
+
log.info(`Lockdown service created for device: ${lockdownDevice.Properties.SerialNumber}`);
|
|
159
|
+
|
|
160
|
+
log.info('Starting CoreDeviceProxy...');
|
|
161
|
+
const {socket} = await startCoreDeviceProxy(
|
|
162
|
+
lockdownService,
|
|
163
|
+
lockdownDevice.DeviceID,
|
|
164
|
+
lockdownDevice.Properties.SerialNumber,
|
|
165
|
+
tlsOptions,
|
|
166
|
+
);
|
|
167
|
+
log.info('CoreDeviceProxy started successfully');
|
|
168
|
+
|
|
169
|
+
log.info('Creating tunnel...');
|
|
170
|
+
const tunnel = await TunnelManager.getTunnel(socket);
|
|
171
|
+
log.info(`Tunnel created for address: ${tunnel.Address} with RsdPort: ${tunnel.RsdPort}`);
|
|
172
|
+
|
|
173
|
+
let packetStreamPort;
|
|
174
|
+
packetStreamPort = this._packetStreamBasePort++;
|
|
175
|
+
const packetStreamServer = new PacketStreamServer(packetStreamPort);
|
|
176
|
+
await packetStreamServer.start();
|
|
177
|
+
|
|
178
|
+
const consumer = packetStreamServer.getPacketConsumer();
|
|
179
|
+
if (consumer) {
|
|
180
|
+
tunnel.addPacketConsumer(consumer);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
this._packetStreamServers.set(udid, packetStreamServer);
|
|
184
|
+
|
|
185
|
+
log.info(`Packet stream server started on port ${packetStreamPort}`);
|
|
186
|
+
|
|
187
|
+
log.info(`ā
Tunnel creation completed successfully for device: ${udid}`);
|
|
188
|
+
log.info(` Tunnel Address: ${tunnel.Address}`);
|
|
189
|
+
log.info(` Tunnel RsdPort: ${tunnel.RsdPort}`);
|
|
190
|
+
if (packetStreamPort) {
|
|
191
|
+
log.info(` Packet Stream Port: ${packetStreamPort}`);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (_.isFunction(socket?.setNoDelay)) {
|
|
195
|
+
socket.setNoDelay(true);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return {
|
|
199
|
+
device,
|
|
200
|
+
tunnel: {
|
|
201
|
+
Address: tunnel.Address,
|
|
202
|
+
RsdPort: tunnel.RsdPort,
|
|
203
|
+
},
|
|
204
|
+
packetStreamPort,
|
|
205
|
+
success: true,
|
|
206
|
+
socket,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Sets up tunnels for all connected devices.
|
|
212
|
+
* @param {import('appium-ios-remotexpc').Usbmux} usbmux - The usbmux object.
|
|
213
|
+
* @param {string|undefined} specificUdid - A specific UDID to process, or undefined for all devices.
|
|
214
|
+
* @param {import('tls').ConnectionOptions} tlsOptions - TLS options.
|
|
215
|
+
*/
|
|
216
|
+
async setupTunnels(usbmux, specificUdid, tlsOptions) {
|
|
217
|
+
log.info('Listing all connected devices...');
|
|
218
|
+
const devices = await usbmux.listDevices();
|
|
219
|
+
|
|
220
|
+
if (devices.length === 0) {
|
|
221
|
+
log.warn('No devices found. Make sure iOS devices are connected and trusted.');
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
log.info(`Found ${devices.length} connected device(s):`);
|
|
226
|
+
devices.forEach((device, index) => {
|
|
227
|
+
log.info(` ${index + 1}. UDID: ${device.Properties.SerialNumber}`);
|
|
228
|
+
log.info(` Device ID: ${device.DeviceID}`);
|
|
229
|
+
log.info(` Connection: ${device.Properties.ConnectionType}`);
|
|
230
|
+
log.info(` Product ID: ${device.Properties.ProductID}`);
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
let devicesToProcess = devices;
|
|
234
|
+
if (specificUdid) {
|
|
235
|
+
devicesToProcess = devices.filter(
|
|
236
|
+
(device) => device.Properties.SerialNumber === specificUdid,
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
if (devicesToProcess.length === 0) {
|
|
240
|
+
log.error(`Device with UDID ${specificUdid} not found in connected devices.`);
|
|
241
|
+
log.error('Available devices:');
|
|
242
|
+
devices.forEach((device) => {
|
|
243
|
+
log.error(` - ${device.Properties.SerialNumber}`);
|
|
244
|
+
});
|
|
245
|
+
process.exit(1);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
log.info(`\nProcessing ${devicesToProcess.length} device(s)...`);
|
|
250
|
+
|
|
251
|
+
/** @type {import('appium-ios-remotexpc').TunnelResult[]} */
|
|
252
|
+
const results = [];
|
|
253
|
+
|
|
254
|
+
for (const device of devicesToProcess) {
|
|
255
|
+
const result = await this.createTunnelForDevice(device, tlsOptions);
|
|
256
|
+
results.push(result);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
log.info('\n=== TUNNEL CREATION SUMMARY ===');
|
|
260
|
+
const successful = results.filter((r) => r.success);
|
|
261
|
+
const failed = results.filter((r) => !r.success);
|
|
262
|
+
|
|
263
|
+
log.info(`Total devices processed: ${results.length}`);
|
|
264
|
+
log.info(`Successful tunnels: ${successful.length}`);
|
|
265
|
+
log.info(`Failed tunnels: ${failed.length}`);
|
|
266
|
+
|
|
267
|
+
if (successful.length > 0) {
|
|
268
|
+
log.info('\nā
Successful tunnels:');
|
|
269
|
+
const registry = await this.updateTunnelRegistry(results);
|
|
270
|
+
await startTunnelRegistryServer(registry, this._tunnelRegistryPort);
|
|
271
|
+
|
|
272
|
+
log.info('\nš Tunnel registry API:');
|
|
273
|
+
log.info(' The tunnel registry is now available through the API at:');
|
|
274
|
+
log.info(` http://localhost:${this._tunnelRegistryPort}/remotexpc/tunnels`);
|
|
275
|
+
log.info('\n Available endpoints:');
|
|
276
|
+
log.info(' - GET /remotexpc/tunnels - List all tunnels');
|
|
277
|
+
log.info(' - GET /remotexpc/tunnels/:udid - Get tunnel by UDID');
|
|
278
|
+
log.info(' - GET /remotexpc/tunnels/metadata - Get registry metadata');
|
|
279
|
+
if (successful.length > 0) {
|
|
280
|
+
const firstUdid = successful[0].device.Properties.SerialNumber;
|
|
281
|
+
log.info(` curl http://localhost:4723/remotexpc/tunnels/${firstUdid}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Helper function to parse string arguments
|
|
289
|
+
* @param {string[]} args - Array of command line arguments
|
|
290
|
+
* @param {string} flagName - Name of the flag to parse (e.g. '--udid')
|
|
291
|
+
* @returns {string|undefined} The value of the flag if found, undefined otherwise
|
|
292
|
+
*/
|
|
293
|
+
function parseArg(args, flagName) {
|
|
294
|
+
const equalsArg = args.find((arg) => arg.startsWith(`${flagName}=`));
|
|
295
|
+
if (equalsArg) {
|
|
296
|
+
const value = equalsArg.split('=')[1];
|
|
297
|
+
log.info(`Using ${flagName.slice(2)}: ${value}`);
|
|
298
|
+
return value;
|
|
299
|
+
} else {
|
|
300
|
+
const flagIndex = args.indexOf(flagName);
|
|
301
|
+
if (flagIndex !== -1 && flagIndex + 1 < args.length) {
|
|
302
|
+
const value = args[flagIndex + 1];
|
|
303
|
+
log.info(`Using ${flagName.slice(2)}: ${value}`);
|
|
304
|
+
return value;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return undefined;
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
const BOOTSTRAP_PATH = node.getModuleRootSync('appium-xcuitest-driver', import.meta.url);
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
*/
|
|
314
|
+
async function main() {
|
|
315
|
+
// Create an instance of TunnelCreator
|
|
316
|
+
const tunnelCreator = new TunnelCreator();
|
|
317
|
+
tunnelCreator.setupCleanupHandlers();
|
|
318
|
+
|
|
319
|
+
const args = process.argv.slice(2);
|
|
320
|
+
|
|
321
|
+
const specificUdid = parseArg(args, '--udid');
|
|
322
|
+
|
|
323
|
+
const packetStreamBasePort = parseArg(args, '--packet-stream-base-port');
|
|
324
|
+
if (packetStreamBasePort !== undefined) {
|
|
325
|
+
tunnelCreator.packetStreamBasePort = parseInt(packetStreamBasePort, 10);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
const tunnelRegistryPort = parseArg(args, '--tunnel-registry-port');
|
|
329
|
+
if (tunnelRegistryPort !== undefined) {
|
|
330
|
+
tunnelCreator.tunnelRegistryPort = parseInt(tunnelRegistryPort, 10);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
const packageInfo = JSON.parse(
|
|
334
|
+
fs.readFileSync(path.join(BOOTSTRAP_PATH, 'package.json'), 'utf8'),
|
|
335
|
+
);
|
|
336
|
+
const box = strongbox(packageInfo.name);
|
|
337
|
+
try {
|
|
338
|
+
await box.createItemWithValue(TUNNEL_REGISTRY_PORT, String(tunnelCreator.tunnelRegistryPort));
|
|
339
|
+
} catch (error) {
|
|
340
|
+
throw new Error(`Tunnel registry port cannot be persisted: ${error.message}`);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/** @type {import('tls').ConnectionOptions} */
|
|
344
|
+
const tlsOptions = {
|
|
345
|
+
rejectUnauthorized: false,
|
|
346
|
+
minVersion: 'TLSv1.2',
|
|
347
|
+
};
|
|
348
|
+
|
|
349
|
+
log.info('Connecting to usbmuxd...');
|
|
350
|
+
const usbmux = await createUsbmux();
|
|
351
|
+
|
|
352
|
+
try {
|
|
353
|
+
await tunnelCreator.setupTunnels(usbmux, specificUdid, tlsOptions);
|
|
354
|
+
} finally {
|
|
355
|
+
await usbmux.close();
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
(async () => await main())();
|