appium-ios-remotexpc 2.1.1 → 2.1.2
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/services/ios/diagnostic-service/index.d.ts +12 -1
- package/build/src/services/ios/diagnostic-service/index.d.ts.map +1 -1
- package/build/src/services/ios/diagnostic-service/index.js +39 -21
- package/build/src/services/ios/diagnostic-service/index.js.map +1 -1
- package/package.json +1 -1
- package/src/services/ios/diagnostic-service/index.ts +49 -37
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## [2.1.2](https://github.com/appium/appium-ios-remotexpc/compare/v2.1.1...v2.1.2) (2026-05-23)
|
|
2
|
+
|
|
3
|
+
### Code Refactoring
|
|
4
|
+
|
|
5
|
+
* improve IORegistry query handling in DiagnosticService ([#222](https://github.com/appium/appium-ios-remotexpc/issues/222)) ([79a8b2c](https://github.com/appium/appium-ios-remotexpc/commit/79a8b2c265338cf897ab8e563c6697f2a0b2b324))
|
|
6
|
+
|
|
1
7
|
## [2.1.1](https://github.com/appium/appium-ios-remotexpc/compare/v2.1.0...v2.1.1) (2026-05-23)
|
|
2
8
|
|
|
3
9
|
### Bug Fixes
|
|
@@ -40,7 +40,18 @@ declare class DiagnosticsService extends BaseService implements DiagnosticsServi
|
|
|
40
40
|
private connectToDiagnosticService;
|
|
41
41
|
private sendRequest;
|
|
42
42
|
private processIORegistryResponse;
|
|
43
|
-
|
|
43
|
+
/**
|
|
44
|
+
* Sends an IORegistry request and returns the diagnostics response.
|
|
45
|
+
* The shim's StartService greeting is drained in connectToDiagnosticService,
|
|
46
|
+
* so this is a plain single send/recv — matches pymobiledevice3.
|
|
47
|
+
*/
|
|
48
|
+
private queryIORegistry;
|
|
49
|
+
/**
|
|
50
|
+
* Extracts the IORegistry payload from a diagnostics response.
|
|
51
|
+
* @returns the IORegistry object, or null when the query matched no entry
|
|
52
|
+
* (the device replies { Status: 'Success' } with no Diagnostics)
|
|
53
|
+
*/
|
|
54
|
+
private extractIORegistry;
|
|
44
55
|
}
|
|
45
56
|
export default DiagnosticsService;
|
|
46
57
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/services/ios/diagnostic-service/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/services/ios/diagnostic-service/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,kBAAkB,IAAI,2BAA2B,EACjD,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD;;;;;GAKG;AACH,cAAM,kBACJ,SAAQ,WACR,YAAW,2BAA2B;IAEtC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,oDACmB;gBAEvC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IAIrC;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;IAazC;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,eAAe,CAAC;IAa1C;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,eAAe,CAAC;IAavC;;;;OAIG;IACG,UAAU,CAAC,OAAO,CAAC,EAAE;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,eAAe,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAsCpD,OAAO,CAAC,gBAAgB;YAOV,0BAA0B;YAW1B,WAAW;IAoBzB,OAAO,CAAC,yBAAyB;IA0CjC;;;;OAIG;YACW,eAAe;IAkB7B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CAU1B;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { util } from '@appium/support';
|
|
1
2
|
import { getLogger } from '../../../lib/logger.js';
|
|
2
3
|
import { PlistServiceDecoder } from '../../../lib/plist/plist-decoder.js';
|
|
3
4
|
import { BaseService } from '../base-service.js';
|
|
@@ -84,10 +85,11 @@ class DiagnosticsService extends BaseService {
|
|
|
84
85
|
const timeout = options?.timeout || 3000;
|
|
85
86
|
log.debug('Sending IORegistry request...');
|
|
86
87
|
const conn = await this.connectToDiagnosticService();
|
|
87
|
-
const response = await
|
|
88
|
-
log.debug(`IORegistry response size: ${JSON.stringify(response).length} bytes`);
|
|
88
|
+
const response = await this.queryIORegistry(conn, request, timeout);
|
|
89
89
|
if (options?.returnRawJson) {
|
|
90
|
-
|
|
90
|
+
// The query matched no entry when the device replies with a bare
|
|
91
|
+
// { Status: 'Success' } and no Diagnostics — surface an empty object.
|
|
92
|
+
return this.extractIORegistry(response) ?? {};
|
|
91
93
|
}
|
|
92
94
|
return this.processIORegistryResponse(response);
|
|
93
95
|
}
|
|
@@ -103,8 +105,12 @@ class DiagnosticsService extends BaseService {
|
|
|
103
105
|
};
|
|
104
106
|
}
|
|
105
107
|
async connectToDiagnosticService() {
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
+
const connection = await this.startLockdownService(this.getServiceConfig());
|
|
109
|
+
const startServiceResponse = await connection.receive();
|
|
110
|
+
if (startServiceResponse?.Request !== 'StartService') {
|
|
111
|
+
throw new Error(`Expected StartService response, got: ${JSON.stringify(startServiceResponse)}`);
|
|
112
|
+
}
|
|
113
|
+
return connection;
|
|
108
114
|
}
|
|
109
115
|
async sendRequest(request, timeout) {
|
|
110
116
|
const conn = await this.connectToDiagnosticService();
|
|
@@ -147,22 +153,34 @@ class DiagnosticsService extends BaseService {
|
|
|
147
153
|
}
|
|
148
154
|
return [{ value: response }];
|
|
149
155
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
156
|
+
/**
|
|
157
|
+
* Sends an IORegistry request and returns the diagnostics response.
|
|
158
|
+
* The shim's StartService greeting is drained in connectToDiagnosticService,
|
|
159
|
+
* so this is a plain single send/recv — matches pymobiledevice3.
|
|
160
|
+
*/
|
|
161
|
+
async queryIORegistry(conn, request, timeout) {
|
|
162
|
+
const response = await conn.sendPlistRequest(request, timeout);
|
|
163
|
+
if (util.isPlainObject(response) &&
|
|
164
|
+
'Status' in response &&
|
|
165
|
+
response.Status !== 'Success') {
|
|
166
|
+
throw new Error(`IORegistry query failed: ${JSON.stringify(response)}`);
|
|
167
|
+
}
|
|
168
|
+
return response;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Extracts the IORegistry payload from a diagnostics response.
|
|
172
|
+
* @returns the IORegistry object, or null when the query matched no entry
|
|
173
|
+
* (the device replies { Status: 'Success' } with no Diagnostics)
|
|
174
|
+
*/
|
|
175
|
+
extractIORegistry(response) {
|
|
176
|
+
const diagnostics = response?.Diagnostics;
|
|
177
|
+
if (util.isPlainObject(diagnostics)) {
|
|
178
|
+
const ioRegistry = diagnostics.IORegistry;
|
|
179
|
+
if (util.isPlainObject(ioRegistry)) {
|
|
180
|
+
return ioRegistry;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return null;
|
|
166
184
|
}
|
|
167
185
|
}
|
|
168
186
|
export default DiagnosticsService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/services/ios/diagnostic-service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/services/ios/diagnostic-service/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { util } from '@appium/support';
|
|
2
|
+
|
|
1
3
|
import { getLogger } from '../../../lib/logger.js';
|
|
2
4
|
import { PlistServiceDecoder } from '../../../lib/plist/plist-decoder.js';
|
|
3
5
|
import type {
|
|
4
6
|
DiagnosticsService as DiagnosticsServiceInterface,
|
|
5
7
|
PlistDictionary,
|
|
6
8
|
} from '../../../lib/types.js';
|
|
9
|
+
import type { ServiceConnection } from '../../../service-connection.js';
|
|
7
10
|
import { BaseService } from '../base-service.js';
|
|
8
11
|
|
|
9
12
|
const log = getLogger('DiagnosticService');
|
|
@@ -110,18 +113,12 @@ class DiagnosticsService
|
|
|
110
113
|
log.debug('Sending IORegistry request...');
|
|
111
114
|
|
|
112
115
|
const conn = await this.connectToDiagnosticService();
|
|
113
|
-
const response = await
|
|
114
|
-
|
|
115
|
-
log.debug(
|
|
116
|
-
`IORegistry response size: ${JSON.stringify(response).length} bytes`,
|
|
117
|
-
);
|
|
116
|
+
const response = await this.queryIORegistry(conn, request, timeout);
|
|
118
117
|
|
|
119
118
|
if (options?.returnRawJson) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
timeout,
|
|
124
|
-
);
|
|
119
|
+
// The query matched no entry when the device replies with a bare
|
|
120
|
+
// { Status: 'Success' } and no Diagnostics — surface an empty object.
|
|
121
|
+
return this.extractIORegistry(response) ?? {};
|
|
125
122
|
}
|
|
126
123
|
|
|
127
124
|
return this.processIORegistryResponse(response);
|
|
@@ -138,9 +135,15 @@ class DiagnosticsService
|
|
|
138
135
|
};
|
|
139
136
|
}
|
|
140
137
|
|
|
141
|
-
private async connectToDiagnosticService() {
|
|
142
|
-
const
|
|
143
|
-
|
|
138
|
+
private async connectToDiagnosticService(): Promise<ServiceConnection> {
|
|
139
|
+
const connection = await this.startLockdownService(this.getServiceConfig());
|
|
140
|
+
const startServiceResponse = await connection.receive();
|
|
141
|
+
if (startServiceResponse?.Request !== 'StartService') {
|
|
142
|
+
throw new Error(
|
|
143
|
+
`Expected StartService response, got: ${JSON.stringify(startServiceResponse)}`,
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
return connection;
|
|
144
147
|
}
|
|
145
148
|
|
|
146
149
|
private async sendRequest(
|
|
@@ -205,34 +208,43 @@ class DiagnosticsService
|
|
|
205
208
|
return [{ value: response } as PlistDictionary];
|
|
206
209
|
}
|
|
207
210
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
+
/**
|
|
212
|
+
* Sends an IORegistry request and returns the diagnostics response.
|
|
213
|
+
* The shim's StartService greeting is drained in connectToDiagnosticService,
|
|
214
|
+
* so this is a plain single send/recv — matches pymobiledevice3.
|
|
215
|
+
*/
|
|
216
|
+
private async queryIORegistry(
|
|
217
|
+
conn: ServiceConnection,
|
|
218
|
+
request: PlistDictionary,
|
|
211
219
|
timeout: number,
|
|
212
|
-
): Promise<
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
const emptyRequest: PlistDictionary = {
|
|
216
|
-
Request: 'Status',
|
|
217
|
-
};
|
|
220
|
+
): Promise<PlistDictionary> {
|
|
221
|
+
const response = await conn.sendPlistRequest(request, timeout);
|
|
218
222
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
const hasDiagnostics =
|
|
226
|
-
'Diagnostics' in additionalResponse &&
|
|
227
|
-
typeof additionalResponse.Diagnostics === 'object' &&
|
|
228
|
-
additionalResponse.Diagnostics !== null &&
|
|
229
|
-
'IORegistry' in additionalResponse.Diagnostics;
|
|
230
|
-
if (additionalResponse.Status !== 'Success' && hasDiagnostics) {
|
|
231
|
-
throw new Error(`Error getting diagnostic data: ${additionalResponse}`);
|
|
223
|
+
if (
|
|
224
|
+
util.isPlainObject(response) &&
|
|
225
|
+
'Status' in response &&
|
|
226
|
+
response.Status !== 'Success'
|
|
227
|
+
) {
|
|
228
|
+
throw new Error(`IORegistry query failed: ${JSON.stringify(response)}`);
|
|
232
229
|
}
|
|
233
230
|
|
|
234
|
-
|
|
235
|
-
|
|
231
|
+
return response as PlistDictionary;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Extracts the IORegistry payload from a diagnostics response.
|
|
236
|
+
* @returns the IORegistry object, or null when the query matched no entry
|
|
237
|
+
* (the device replies { Status: 'Success' } with no Diagnostics)
|
|
238
|
+
*/
|
|
239
|
+
private extractIORegistry(response: any): Record<string, any> | null {
|
|
240
|
+
const diagnostics = response?.Diagnostics;
|
|
241
|
+
if (util.isPlainObject(diagnostics)) {
|
|
242
|
+
const ioRegistry = diagnostics.IORegistry;
|
|
243
|
+
if (util.isPlainObject(ioRegistry)) {
|
|
244
|
+
return ioRegistry as Record<string, any>;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return null;
|
|
236
248
|
}
|
|
237
249
|
}
|
|
238
250
|
|