@xenon-device-management/xenon 1.8.0 → 1.8.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/lib/package.json +1 -1
- package/lib/src/device-managers/android/AndroidStreamService.js +64 -1
- package/lib/src/services/SessionLifecycleService.js +62 -27
- package/lib/test/unit/SessionLifecycleCaps.spec.js +58 -0
- package/lib/test/unit/android-stream-adb-path.spec.js +77 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/lib/package.json
CHANGED
|
@@ -1,10 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
2
18
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
19
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
20
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
21
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
22
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
23
|
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
8
41
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
42
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
43
|
};
|
|
@@ -59,6 +92,31 @@ let AndroidStreamService = class AndroidStreamService {
|
|
|
59
92
|
}
|
|
60
93
|
}), 3600000);
|
|
61
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Resolve the actual adb binary path (and remote-host args) via the same
|
|
97
|
+
* appium-adb instance every other ADB call uses. This avoids spawning a bare
|
|
98
|
+
* 'adb', which relies on the process PATH — absent when Xenon is launched from
|
|
99
|
+
* a GUI (e.g. the Xenon Control app), producing `spawn adb ENOENT` while
|
|
100
|
+
* device discovery still works (appium-adb resolves via ANDROID_HOME).
|
|
101
|
+
*/
|
|
102
|
+
resolveAdbInvocation(udid) {
|
|
103
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
104
|
+
var _a;
|
|
105
|
+
try {
|
|
106
|
+
const { default: AndroidDeviceManager } = yield Promise.resolve().then(() => __importStar(require('../AndroidDeviceManager')));
|
|
107
|
+
const adb = yield typedi_1.Container.get(AndroidDeviceManager).getAdbForDevice(udid);
|
|
108
|
+
const adbPath = ((_a = adb === null || adb === void 0 ? void 0 : adb.executable) === null || _a === void 0 ? void 0 : _a.path) || 'adb';
|
|
109
|
+
const adbHostArgs = (adb === null || adb === void 0 ? void 0 : adb.adbHost) && (adb === null || adb === void 0 ? void 0 : adb.adbPort) ? ['-H', adb.adbHost, '-P', String(adb.adbPort)] : [];
|
|
110
|
+
return { adbPath, adbHostArgs };
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
logger_1.default.warn(`[${udid}] Could not resolve adb binary path (${e.message}); falling back to a PATH ` +
|
|
114
|
+
"lookup. If streaming fails with 'spawn adb ENOENT', ensure ANDROID_HOME " +
|
|
115
|
+
'(or ANDROID_SDK_ROOT) is set so adb can be located.');
|
|
116
|
+
return { adbPath: 'adb', adbHostArgs: [] };
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
62
120
|
captureLoop(udid, session) {
|
|
63
121
|
return __awaiter(this, void 0, void 0, function* () {
|
|
64
122
|
logger_1.default.info(`[${udid}] Background capture loop started.`);
|
|
@@ -78,7 +136,7 @@ let AndroidStreamService = class AndroidStreamService {
|
|
|
78
136
|
const screenshot = yield DeviceLockManager_1.deviceLock.acquire(udid, () => __awaiter(this, void 0, void 0, function* () {
|
|
79
137
|
return yield new Promise((resolve, reject) => {
|
|
80
138
|
const isolationService = typedi_1.Container.get(ResourceIsolationService_1.ResourceIsolationService);
|
|
81
|
-
const { command, args } = isolationService.wrapSpawn(
|
|
139
|
+
const { command, args } = isolationService.wrapSpawn(session.adbPath, [...session.adbHostArgs, '-s', udid, 'exec-out', 'screencap'], 'Performance');
|
|
82
140
|
const proc = (0, child_process_1.spawn)(command, args);
|
|
83
141
|
const chunks = [];
|
|
84
142
|
proc.stdout.on('data', (c) => chunks.push(c));
|
|
@@ -156,6 +214,9 @@ let AndroidStreamService = class AndroidStreamService {
|
|
|
156
214
|
const device = yield device_store_1.DeviceStoreFactory.getStore().findDevice({ udid });
|
|
157
215
|
if (!device)
|
|
158
216
|
throw new Error(`Device ${udid} not found in DB`);
|
|
217
|
+
// Resolve the real adb binary once, up front, so the capture loop never
|
|
218
|
+
// depends on the process PATH (see resolveAdbInvocation).
|
|
219
|
+
const { adbPath, adbHostArgs } = yield this.resolveAdbInvocation(udid);
|
|
159
220
|
const mjpegPort = yield typedi_1.Container.get(PortAllocator_1.PortAllocator).acquire('mjpeg', udid);
|
|
160
221
|
// Aggressive cleanup: Kill any process already using this port
|
|
161
222
|
try {
|
|
@@ -181,6 +242,8 @@ let AndroidStreamService = class AndroidStreamService {
|
|
|
181
242
|
status: 'starting',
|
|
182
243
|
lastViewerAt: Date.now(),
|
|
183
244
|
viewerCount: 0,
|
|
245
|
+
adbPath,
|
|
246
|
+
adbHostArgs,
|
|
184
247
|
};
|
|
185
248
|
this.sessions.set(udid, session);
|
|
186
249
|
session.server = http_1.default.createServer((req, res) => {
|
|
@@ -93,6 +93,7 @@ let SessionLifecycleService = class SessionLifecycleService {
|
|
|
93
93
|
}
|
|
94
94
|
createSession(next, driver, caps) {
|
|
95
95
|
return __awaiter(this, void 0, void 0, function* () {
|
|
96
|
+
var _a, _b;
|
|
96
97
|
// Fail fast during graceful shutdown so clients get a clear error instead
|
|
97
98
|
// of their request hanging until the process dies. Lazy import to avoid
|
|
98
99
|
// a cycle (ShutdownCoordinator -> SessionLifecycleService -> this file).
|
|
@@ -159,16 +160,40 @@ let SessionLifecycleService = class SessionLifecycleService {
|
|
|
159
160
|
let session;
|
|
160
161
|
const isRemoteOrCloudSession = !device.nodeId || device.nodeId !== context.nodeId;
|
|
161
162
|
this.logger.debug(`device.host: ${device.host} and pluginArgs.bindHostOrIp: ${pluginArgs.bindHostOrIp}`);
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
163
|
+
try {
|
|
164
|
+
if (isRemoteOrCloudSession) {
|
|
165
|
+
this.logger.debug(`📱 Forwarding session request to ${device.host}`);
|
|
166
|
+
yield (0, device_service_1.updateDeviceProgress)(device.udid, device.host, 'Forwarding to remote node...');
|
|
167
|
+
session = yield this.forwardSessionRequest(device, caps);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
this.logger.debug('📱 Creating session on the same node');
|
|
171
|
+
yield this.handleLocalWDAProvisioning(device, caps);
|
|
172
|
+
yield (0, device_service_1.updateDeviceProgress)(device.udid, device.host, 'Finalizing session bootstrap...');
|
|
173
|
+
session = yield next();
|
|
174
|
+
}
|
|
166
175
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
176
|
+
catch (err) {
|
|
177
|
+
// A THROWN error from the driver's createSession (next()) or the remote
|
|
178
|
+
// forward leaves the device locked: allocateDeviceForSession already set
|
|
179
|
+
// busy=true, and on the throw path neither finalizeSession nor
|
|
180
|
+
// handleSessionFailure runs — so without this the device gets stuck busy
|
|
181
|
+
// with no session. Release it, then rethrow the original error.
|
|
182
|
+
// (handleSessionFailure below covers the separate case where next()
|
|
183
|
+
// RETURNS a W3C error object rather than throwing.)
|
|
184
|
+
this.logger.error(`❌ Session creation failed for device ${device.udid}: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}. Unblocking device.`);
|
|
185
|
+
try {
|
|
186
|
+
yield (0, pending_sessions_service_1.removePendingSession)(pendingSessionId);
|
|
187
|
+
yield (0, device_service_1.unblockDevice)(device.udid, device.host);
|
|
188
|
+
yield (0, device_service_1.updateDeviceProgress)(device.udid, device.host, '');
|
|
189
|
+
if (isRemoteOrCloudSession) {
|
|
190
|
+
typedi_1.Container.get(CircuitBreaker_1.CircuitBreaker).recordFailure(device.host);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch (cleanupErr) {
|
|
194
|
+
this.logger.warn(`Cleanup after failed session creation had issues: ${(_b = cleanupErr === null || cleanupErr === void 0 ? void 0 : cleanupErr.message) !== null && _b !== void 0 ? _b : cleanupErr}`);
|
|
195
|
+
}
|
|
196
|
+
throw err;
|
|
172
197
|
}
|
|
173
198
|
this.logger.debug('📱 Session response: ', JSON.stringify(session));
|
|
174
199
|
this.logger.debug(`📱 Removing pending session with capability_id: ${pendingSessionId}`);
|
|
@@ -301,25 +326,35 @@ let SessionLifecycleService = class SessionLifecycleService {
|
|
|
301
326
|
});
|
|
302
327
|
}
|
|
303
328
|
injectWDAUrl(caps, wdaUrl, bundleId) {
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
329
|
+
var _a, _b, _c;
|
|
330
|
+
// W3C capability rules forbid a property from appearing in BOTH alwaysMatch
|
|
331
|
+
// and a firstMatch entry; appium rejects the session with "property
|
|
332
|
+
// 'webDriverAgentUrl' should not exist on both primary and secondary object".
|
|
333
|
+
// Write the injected WDA caps to exactly ONE bucket — prefer alwaysMatch,
|
|
334
|
+
// which applies to every firstMatch entry — and scrub the keys from the
|
|
335
|
+
// other so they can never collide.
|
|
336
|
+
const target = (_a = caps.alwaysMatch) !== null && _a !== void 0 ? _a : (_b = caps.firstMatch) === null || _b === void 0 ? void 0 : _b[0];
|
|
337
|
+
if (!target)
|
|
338
|
+
return;
|
|
339
|
+
const other = target === caps.alwaysMatch ? (_c = caps.firstMatch) === null || _c === void 0 ? void 0 : _c[0] : caps.alwaysMatch;
|
|
340
|
+
target['appium:webDriverAgentUrl'] = wdaUrl;
|
|
341
|
+
target['appium:usePreinstalledWDA'] = true;
|
|
342
|
+
if (bundleId)
|
|
343
|
+
target['appium:updatedWDABundleId'] = bundleId;
|
|
344
|
+
// These conflict with a pre-installed WDA URL — strip from both buckets.
|
|
345
|
+
for (const bucket of [target, other]) {
|
|
346
|
+
if (!bucket)
|
|
347
|
+
continue;
|
|
348
|
+
delete bucket['appium:derivedDataPath'];
|
|
349
|
+
delete bucket['appium:usePrebuiltWDA'];
|
|
350
|
+
delete bucket['appium:wdaLocalPort'];
|
|
351
|
+
delete bucket['appium:mjpegServerPort'];
|
|
313
352
|
}
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
delete caps.firstMatch[0]['appium:derivedDataPath'];
|
|
320
|
-
delete caps.firstMatch[0]['appium:usePrebuiltWDA'];
|
|
321
|
-
delete caps.firstMatch[0]['appium:wdaLocalPort'];
|
|
322
|
-
delete caps.firstMatch[0]['appium:mjpegServerPort'];
|
|
353
|
+
// The injected WDA keys must live in `target` only.
|
|
354
|
+
if (other) {
|
|
355
|
+
delete other['appium:webDriverAgentUrl'];
|
|
356
|
+
delete other['appium:usePreinstalledWDA'];
|
|
357
|
+
delete other['appium:updatedWDABundleId'];
|
|
323
358
|
}
|
|
324
359
|
}
|
|
325
360
|
finalizeSession(session_1, device_1, caps_1, driver_1, isRemote_1) {
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
require("reflect-metadata");
|
|
7
|
+
const chai_1 = __importDefault(require("chai"));
|
|
8
|
+
const SessionLifecycleService_1 = require("../../src/services/SessionLifecycleService");
|
|
9
|
+
chai_1.default.should();
|
|
10
|
+
const expect = chai_1.default.expect;
|
|
11
|
+
// injectWDAUrl is a private method that mutates only its `caps` argument (no
|
|
12
|
+
// `this` usage), so we can exercise it directly off the prototype without
|
|
13
|
+
// constructing the DI-heavy service.
|
|
14
|
+
const injectWDAUrl = SessionLifecycleService_1.SessionLifecycleService.prototype.injectWDAUrl;
|
|
15
|
+
const URL = 'http://127.0.0.1:8100';
|
|
16
|
+
describe('SessionLifecycleService.injectWDAUrl — W3C capability composition', () => {
|
|
17
|
+
it('writes the WDA caps to alwaysMatch only, never to both buckets', () => {
|
|
18
|
+
const caps = {
|
|
19
|
+
alwaysMatch: { 'appium:automationName': 'XCUITest' },
|
|
20
|
+
firstMatch: [{ 'appium:udid': 'abc' }],
|
|
21
|
+
};
|
|
22
|
+
injectWDAUrl(caps, URL, 'com.qasecret.WebDriverAgentRunner');
|
|
23
|
+
// Present in alwaysMatch...
|
|
24
|
+
expect(caps.alwaysMatch['appium:webDriverAgentUrl']).to.equal(URL);
|
|
25
|
+
expect(caps.alwaysMatch['appium:usePreinstalledWDA']).to.equal(true);
|
|
26
|
+
expect(caps.alwaysMatch['appium:updatedWDABundleId']).to.equal('com.qasecret.WebDriverAgentRunner');
|
|
27
|
+
// ...and NOT in firstMatch — the bug was duplicating into both, which appium
|
|
28
|
+
// rejects with "property 'webDriverAgentUrl' should not exist on both
|
|
29
|
+
// primary and secondary object".
|
|
30
|
+
expect(caps.firstMatch[0]).to.not.have.property('appium:webDriverAgentUrl');
|
|
31
|
+
expect(caps.firstMatch[0]).to.not.have.property('appium:usePreinstalledWDA');
|
|
32
|
+
expect(caps.firstMatch[0]).to.not.have.property('appium:updatedWDABundleId');
|
|
33
|
+
});
|
|
34
|
+
it('falls back to firstMatch[0] when there is no alwaysMatch', () => {
|
|
35
|
+
const caps = { firstMatch: [{ 'appium:udid': 'abc' }] };
|
|
36
|
+
injectWDAUrl(caps, URL);
|
|
37
|
+
expect(caps.firstMatch[0]['appium:webDriverAgentUrl']).to.equal(URL);
|
|
38
|
+
expect(caps.firstMatch[0]['appium:usePreinstalledWDA']).to.equal(true);
|
|
39
|
+
});
|
|
40
|
+
it('scrubs conflicting WDA caps from both buckets', () => {
|
|
41
|
+
const caps = {
|
|
42
|
+
alwaysMatch: { 'appium:usePrebuiltWDA': true, 'appium:wdaLocalPort': 8100 },
|
|
43
|
+
firstMatch: [{ 'appium:derivedDataPath': '/x', 'appium:mjpegServerPort': 9100 }],
|
|
44
|
+
};
|
|
45
|
+
injectWDAUrl(caps, URL);
|
|
46
|
+
for (const bucket of [caps.alwaysMatch, caps.firstMatch[0]]) {
|
|
47
|
+
expect(bucket).to.not.have.property('appium:usePrebuiltWDA');
|
|
48
|
+
expect(bucket).to.not.have.property('appium:derivedDataPath');
|
|
49
|
+
expect(bucket).to.not.have.property('appium:wdaLocalPort');
|
|
50
|
+
expect(bucket).to.not.have.property('appium:mjpegServerPort');
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
it('omits updatedWDABundleId when no bundleId is supplied', () => {
|
|
54
|
+
const caps = { alwaysMatch: {}, firstMatch: [{}] };
|
|
55
|
+
injectWDAUrl(caps, URL);
|
|
56
|
+
expect(caps.alwaysMatch).to.not.have.property('appium:updatedWDABundleId');
|
|
57
|
+
});
|
|
58
|
+
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
require("reflect-metadata");
|
|
16
|
+
const chai_1 = require("chai");
|
|
17
|
+
const sinon_1 = __importDefault(require("sinon"));
|
|
18
|
+
const typedi_1 = require("typedi");
|
|
19
|
+
const AndroidStreamService_1 = __importDefault(require("../../src/device-managers/android/AndroidStreamService"));
|
|
20
|
+
const AndroidDeviceManager_1 = __importDefault(require("../../src/device-managers/AndroidDeviceManager"));
|
|
21
|
+
// Regression: the capture loop used to spawn bare 'adb', relying on the process
|
|
22
|
+
// PATH. When Xenon is launched from a GUI (e.g. the Xenon Control app) that PATH
|
|
23
|
+
// lacks the Android SDK platform-tools dir, so streaming died with
|
|
24
|
+
// `Capture failure: spawn adb ENOENT` even though appium-adb (which resolves via
|
|
25
|
+
// ANDROID_HOME) could still list devices. The stream must resolve the real adb
|
|
26
|
+
// binary path the same way every other ADB call does.
|
|
27
|
+
// Build an instance WITHOUT running the constructor (which starts a watchdog
|
|
28
|
+
// interval), then drive the private resolver directly.
|
|
29
|
+
function makeService() {
|
|
30
|
+
const svc = Object.create(AndroidStreamService_1.default.prototype);
|
|
31
|
+
svc.sessions = new Map();
|
|
32
|
+
return svc;
|
|
33
|
+
}
|
|
34
|
+
describe('AndroidStreamService adb-path resolution', () => {
|
|
35
|
+
let containerStub;
|
|
36
|
+
function stubManager(fakeAdb, throws = false) {
|
|
37
|
+
const fakeManager = {
|
|
38
|
+
getAdbForDevice: () => __awaiter(this, void 0, void 0, function* () {
|
|
39
|
+
if (throws)
|
|
40
|
+
throw new Error('ADB is not available');
|
|
41
|
+
return fakeAdb;
|
|
42
|
+
}),
|
|
43
|
+
};
|
|
44
|
+
containerStub = sinon_1.default.stub(typedi_1.Container, 'get').callsFake((token) => {
|
|
45
|
+
if (token === AndroidDeviceManager_1.default)
|
|
46
|
+
return fakeManager;
|
|
47
|
+
return containerStub.wrappedMethod.call(typedi_1.Container, token);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
afterEach(() => sinon_1.default.restore());
|
|
51
|
+
it('resolves the adb binary path from appium-adb instead of bare "adb"', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
52
|
+
stubManager({ executable: { path: '/opt/android/platform-tools/adb' } });
|
|
53
|
+
const svc = makeService();
|
|
54
|
+
const { adbPath, adbHostArgs } = yield svc.resolveAdbInvocation('android-1');
|
|
55
|
+
(0, chai_1.expect)(adbPath).to.equal('/opt/android/platform-tools/adb');
|
|
56
|
+
(0, chai_1.expect)(adbPath).to.not.equal('adb'); // the whole point: not the PATH-relative name
|
|
57
|
+
(0, chai_1.expect)(adbHostArgs).to.deep.equal([]);
|
|
58
|
+
}));
|
|
59
|
+
it('prepends -H/-P host args for a remote adb instance', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
60
|
+
stubManager({
|
|
61
|
+
executable: { path: '/opt/android/platform-tools/adb' },
|
|
62
|
+
adbHost: '10.0.0.5',
|
|
63
|
+
adbPort: 5037,
|
|
64
|
+
});
|
|
65
|
+
const svc = makeService();
|
|
66
|
+
const { adbPath, adbHostArgs } = yield svc.resolveAdbInvocation('android-1');
|
|
67
|
+
(0, chai_1.expect)(adbPath).to.equal('/opt/android/platform-tools/adb');
|
|
68
|
+
(0, chai_1.expect)(adbHostArgs).to.deep.equal(['-H', '10.0.0.5', '-P', '5037']);
|
|
69
|
+
}));
|
|
70
|
+
it('falls back to bare "adb" (best-effort) when resolution throws', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
71
|
+
stubManager(null, true);
|
|
72
|
+
const svc = makeService();
|
|
73
|
+
const { adbPath, adbHostArgs } = yield svc.resolveAdbInvocation('android-1');
|
|
74
|
+
(0, chai_1.expect)(adbPath).to.equal('adb');
|
|
75
|
+
(0, chai_1.expect)(adbHostArgs).to.deep.equal([]);
|
|
76
|
+
}));
|
|
77
|
+
});
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/InternalHttpClient.ts","../src/PluginContext.ts","../src/XenonCapabilityManager.ts","../src/chromeUtils.ts","../src/config.ts","../src/device-utils.ts","../src/index.ts","../src/logger.ts","../src/plugin.ts","../src/prisma.ts","../src/app/index.ts","../src/app/swagger-docs.ts","../src/app/swagger.ts","../src/app/routers/apikeys.ts","../src/app/routers/apps.ts","../src/app/routers/audit.ts","../src/app/routers/auth.ts","../src/app/routers/bug-report.ts","../src/app/routers/build-export.ts","../src/app/routers/capabilities.ts","../src/app/routers/config.ts","../src/app/routers/control.ts","../src/app/routers/dashboard.ts","../src/app/routers/grid.ts","../src/app/routers/interceptor.ts","../src/app/routers/ports.ts","../src/app/routers/processes.ts","../src/app/routers/profile.ts","../src/app/routers/profileIdentity.ts","../src/app/routers/projects.ts","../src/app/routers/recordings.ts","../src/app/routers/reservation.ts","../src/app/routers/sdk-leases.ts","../src/app/routers/sdk-version.ts","../src/app/routers/teams.ts","../src/app/routers/users.ts","../src/app/routers/webhook.ts","../src/commands/handle.ts","../src/commands/index.ts","../src/dashboard/asset-manager.ts","../src/dashboard/commands.ts","../src/dashboard/event-manager.ts","../src/dashboard/services/app-service.ts","../src/dashboard/services/failure-analysis-service.ts","../src/dashboard/services/session-service.ts","../src/data-service/CircuitBreaker.ts","../src/data-service/config-service.ts","../src/data-service/db.ts","../src/data-service/device-service.ts","../src/data-service/device-store.interface.ts","../src/data-service/device-store.ts","../src/data-service/pending-sessions-service.ts","../src/data-service/pluginArgs.ts","../src/data-service/prisma-service.ts","../src/data-service/prisma-store.ts","../src/data-service/queue-service.ts","../src/data-service/web-config-service.ts","../src/device-managers/AndroidDeviceManager.ts","../src/device-managers/ChromeDriverManager.ts","../src/device-managers/HealthMonitorService.ts","../src/device-managers/IOSDeviceManager.ts","../src/device-managers/NodeDevices.ts","../src/device-managers/iOSTracker.ts","../src/device-managers/index.ts","../src/device-managers/android/AndroidStreamService.ts","../src/device-managers/android/DeviceLockManager.ts","../src/device-managers/cloud/CapabilityManager.ts","../src/device-managers/cloud/Devices.ts","../src/device-managers/ios/IOSDiscoveryService.ts","../src/device-managers/ios/IOSStreamService.ts","../src/device-managers/ios/WDAClient.ts","../src/device-managers/ios/iosBattery.ts","../src/device-managers/ios/iosStreamDiagnostics.ts","../src/enums/Capabilities.ts","../src/enums/Cloud.ts","../src/enums/Platform.ts","../src/enums/SessionType.ts","../src/enums/SocketEvents.ts","../src/generated/client/default.d.ts","../src/generated/client/default.js","../src/generated/client/edge.d.ts","../src/generated/client/edge.js","../src/generated/client/index-browser.js","../src/generated/client/index.d.ts","../src/generated/client/index.js","../src/generated/client/wasm.d.ts","../src/generated/client/wasm.js","../src/generated/client/runtime/edge-esm.js","../src/generated/client/runtime/edge.js","../src/generated/client/runtime/index-browser.d.ts","../src/generated/client/runtime/index-browser.js","../src/generated/client/runtime/library.d.ts","../src/generated/client/runtime/library.js","../src/generated/client/runtime/react-native.js","../src/generated/client/runtime/wasm.js","../src/helpers/UniversalMjpegProxy.ts","../src/helpers/index.ts","../src/interceptors/CommandInterceptor.ts","../src/interfaces/ICloudManager.ts","../src/interfaces/IDevice.ts","../src/interfaces/IDeviceFilterOptions.ts","../src/interfaces/IDeviceManager.ts","../src/interfaces/IOptions.ts","../src/interfaces/IPluginArgs.ts","../src/interfaces/ISessionCapability.ts","../src/logging/sessionContext.ts","../src/middleware/authMiddleware.ts","../src/middleware/csrfMiddleware.ts","../src/middleware/leaseTokenMiddleware.ts","../src/middleware/loginRateLimiter.ts","../src/middleware/rateLimitMiddleware.ts","../src/middleware/roleGuard.ts","../src/middleware/scopeGuard.ts","../src/profiling/AndroidAppProfiler.ts","../src/proxy/wd-command-proxy.ts","../src/scripts/generate-database-migration.ts","../src/scripts/initialize-database.ts","../src/scripts/install-go-ios.ts","../src/scripts/prepare-prisma.ts","../src/scripts/run-migrations.ts","../src/services/AICommandService.ts","../src/services/AIService.ts","../src/services/ApiKeyService.ts","../src/services/CircuitBreaker.ts","../src/services/CleanupService.ts","../src/services/DeviceReconciler.ts","../src/services/EmailService.ts","../src/services/EventBus.ts","../src/services/EventLogService.ts","../src/services/InspectorService.ts","../src/services/InterceptorService.ts","../src/services/MetricsService.ts","../src/services/NetworkConditioningService.ts","../src/services/NotificationService.ts","../src/services/OrphanSweeper.ts","../src/services/PasswordResetService.ts","../src/services/PortAllocator.ts","../src/services/ProcessMetricsService.ts","../src/services/ProcessRegistry.ts","../src/services/RequestLogService.ts","../src/services/ResourceIsolationService.ts","../src/services/SecurityService.ts","../src/services/SelectorStateService.ts","../src/services/SelectorVerificationJob.ts","../src/services/ServerManager.ts","../src/services/SessionHeartbeatService.ts","../src/services/SessionLifecycleService.ts","../src/services/ShutdownCoordinator.ts","../src/services/SocketClient.ts","../src/services/SocketServer.ts","../src/services/TeamService.ts","../src/services/TracingService.ts","../src/services/UserService.ts","../src/services/UserSessionService.ts","../src/services/VideoPipelineService.ts","../src/services/sessionTokenGate.ts","../src/services/artifacts/ArtifactStore.ts","../src/services/autowait/AutowaitService.ts","../src/services/autowait/waitFor.ts","../src/services/bug-report/BugReportService.ts","../src/services/bug-report/archive.ts","../src/services/bug-report/har-collector.ts","../src/services/bug-report/manifest.ts","../src/services/bug-report/readme.ts","../src/services/bug-report/types.ts","../src/services/bug-report/video-slice.ts","../src/services/bug-report/window.ts","../src/services/healing/FuzzyXmlHealingProvider.ts","../src/services/healing/HealEtalonService.ts","../src/services/healing/HealedLocatorGenerator.ts","../src/services/healing/HealingMetrics.ts","../src/services/healing/HealingOrchestrator.ts","../src/services/healing/LlmHealingProvider.ts","../src/services/healing/OcrHealingProvider.ts","../src/services/healing/ResilioTreeHealingProvider.ts","../src/services/healing/VisualAiHealingProvider.ts","../src/services/healing/types.ts","../src/services/identity/bootstrap.ts","../src/services/identity/sessionCleanupCron.ts","../src/services/identity/userAuthorization.ts","../src/services/interceptor/AndroidProxyAdapter.ts","../src/services/interceptor/CertManager.ts","../src/services/interceptor/HarBuilder.ts","../src/services/interceptor/HostFilter.ts","../src/services/interceptor/MitmProxyHost.ts","../src/services/interceptor/MockEngine.ts","../src/services/interceptor/RequestBuffer.ts","../src/services/interceptor/SessionArchive.ts","../src/services/interceptor/types.ts","../src/services/lease/LeaseOrphanSweeper.ts","../src/services/lease/LeaseService.ts","../src/services/lease/buildCapabilityBag.ts","../src/services/lease/leaseToken.ts","../src/services/omni-vision/OmniVisionService.ts","../src/services/omni-vision/VisionAssertionService.ts","../src/services/ports/PortAllocatorClient.ts","../src/services/ports/PortAllocatorService.ts","../src/services/recording/RecordingOrchestrator.ts","../src/services/recording/annotation-render.ts","../src/services/recording/busy-precheck.ts","../src/services/recording/concurrency-gate.ts","../src/services/recording/manualLock.ts","../src/services/recording/proof-bundle.ts","../src/services/recording/recording-store.ts","../src/services/telemetry/attributes.ts","../src/services/token/JwtKeyService.ts","../src/services/token/StreamTicketService.ts","../src/services/token/mcpScopes.ts","../src/sessions/CloudSession.ts","../src/sessions/LocalSession.ts","../src/sessions/RemoteSession.ts","../src/sessions/SessionManager.ts","../src/sessions/XenonSession.ts","../src/types/CLIArgs.ts","../src/types/CloudArgs.ts","../src/types/CloudSchema.ts","../src/types/DeviceType.ts","../src/types/DeviceUpdate.ts","../src/types/IOSDevice.ts","../src/types/Platform.ts","../src/types/SessionStatus.ts","../src/types/express.d.ts","../src/types/healing.d.ts","../src/types/identity.ts","../src/validators/CapabilityValidator.ts","../test/e2e/e2ehelper.ts","../test/e2e/plugin-harness.ts","../test/e2e/plugin.spec.ts","../test/e2e/startup-verification.spec.ts","../test/e2e/telemetry_verification.spec.ts","../test/e2e/video-recording-test.spec.js","../test/e2e/android/conf.spec.js","../test/e2e/android/conf2.spec.js","../test/e2e/android/conf3.spec.js","../test/e2e/hubnode/forward-request.spec.ts","../test/e2e/hubnode/hubnode.spec.ts","../test/e2e/ios/conf1.spec.js","../test/e2e/ios/conf2.spec.js","../test/helpers/seedUser.ts","../test/helpers/test-container.ts","../test/integration/androidDevices.spec.ts","../test/integration/audit-ingest.spec.ts","../test/integration/auth-flow.spec.ts","../test/integration/auth-rate-limit.spec.ts","../test/integration/bug-report-route.spec.ts","../test/integration/cliArgs.js","../test/integration/cross-workflow.spec.ts","../test/integration/forgot-password-rate-limit.spec.ts","../test/integration/forgot-password.spec.ts","../test/integration/healing-events-sessionfilter.spec.ts","../test/integration/legacy-deprecation-headers.spec.ts","../test/integration/migration.spec.ts","../test/integration/node-pair-auth-rest.spec.ts","../test/integration/ports-router.spec.ts","../test/integration/profile-tokens.spec.ts","../test/integration/recordings-router.spec.ts","../test/integration/reset-revokes-sessions.spec.ts","../test/integration/role-matrix.spec.ts","../test/integration/sdk-leases-router.spec.ts","../test/integration/sdk-version.spec.ts","../test/integration/selector-health-endpoint.spec.ts","../test/integration/selector-state-flow.spec.ts","../test/integration/team-membership-migration.spec.ts","../test/integration/team-visibility-dashboard.spec.ts","../test/integration/team-visibility-grid.spec.ts","../test/integration/team-visibility-recordings.spec.ts","../test/integration/users-flow.spec.ts","../test/integration/users-lockout.spec.ts","../test/integration/ios/01iOSSimulator.spec.ts","../test/integration/ios/02iOSDevices.spec.ts","../test/unit/AndroidDeviceManager.spec.ts","../test/unit/ApiKeyService.test.ts","../test/unit/ArtifactStore.spec.ts","../test/unit/AutowaitService.spec.ts","../test/unit/CapabilitiesRouter.spec.ts","../test/unit/ChromeDriverManager.spec.js","../test/unit/CleanupService.spec.ts","../test/unit/CommandInterceptor.autowait.spec.ts","../test/unit/DeviceModel.spec.ts","../test/unit/EmailService.test.ts","../test/unit/EventLogService.spec.ts","../test/unit/FuzzyXmlHealingProvider.test.ts","../test/unit/GetAdbOriginal.js","../test/unit/HealingCascade.test.ts","../test/unit/IOSDeviceManager.spec.js","../test/unit/JwtKeyService.spec.ts","../test/unit/McpScopes.spec.ts","../test/unit/OrphanSweeper.test.ts","../test/unit/PasswordResetService.test.ts","../test/unit/PortAllocator.test.ts","../test/unit/ProcessRegistry.test.ts","../test/unit/ProjectsRouter.spec.ts","../test/unit/RemoteIOs.spec.js","../test/unit/ResilioTreeHealingProvider.test.ts","../test/unit/SessionHeartbeatWrite.test.ts","../test/unit/SessionTokenGate.spec.ts","../test/unit/StreamTicketService.spec.ts","../test/unit/TeamService.test.ts","../test/unit/TokenEndpoint.spec.ts","../test/unit/UserService.test.ts","../test/unit/UserSessionService.test.ts","../test/unit/XenonCapabilityManager.spec.ts","../test/unit/aggregate-hotspots-tuple-key.spec.ts","../test/unit/android-stream-release.spec.ts","../test/unit/auth-me-auth-disabled.test.ts","../test/unit/authMiddleware.bearer.spec.ts","../test/unit/authMiddleware.mcpAudience.spec.ts","../test/unit/authMiddleware.streamTicket.spec.ts","../test/unit/authMiddleware.test.ts","../test/unit/bootstrap-identity.test.ts","../test/unit/build-export.spec.ts","../test/unit/busy-precheck.spec.ts","../test/unit/commands.spec.js","../test/unit/concurrency-gate.spec.ts","../test/unit/config.spec.js","../test/unit/device-service.spec.ts","../test/unit/device-utils.spec.ts","../test/unit/event-manager-regression-hook.spec.ts","../test/unit/extract-access-key-token-pair.test.ts","../test/unit/findAndLockDevice-leasemerge.spec.ts","../test/unit/healing-instrumentation.spec.ts","../test/unit/healing-state-endpoints.spec.ts","../test/unit/healing-tier-gate.spec.ts","../test/unit/helpers.spec.ts","../test/unit/iosBattery.spec.ts","../test/unit/iosStreamDiagnostics.spec.ts","../test/unit/loginRateLimiter.test.ts","../test/unit/manualLock.test.ts","../test/unit/omni-vision.spec.ts","../test/unit/plugin.spec.ts","../test/unit/prisma.spec.ts","../test/unit/profile-router.test.ts","../test/unit/profileIdentity.spec.ts","../test/unit/proof-bundle.spec.ts","../test/unit/rateLimitMiddleware.test.ts","../test/unit/recording-instrumentation.spec.ts","../test/unit/recording-orchestrator.spec.ts","../test/unit/recording-store.spec.ts","../test/unit/roleGuard.test.ts","../test/unit/run-migrations-fail-fast.test.ts","../test/unit/run-migrations.test.ts","../test/unit/selector-state-service.spec.ts","../test/unit/selector-verification-job.spec.ts","../test/unit/socketServer.bearer.spec.ts","../test/unit/team-filter.test.ts","../test/unit/tracing-service-init.spec.ts","../test/unit/userAuthorization.test.ts","../test/unit/users-router.test.ts","../test/unit/video-pipeline-args.spec.ts","../test/unit/video-pipeline-outputpath.spec.ts","../test/unit/bug-report/archive.spec.ts","../test/unit/bug-report/har-collector.spec.ts","../test/unit/bug-report/manifest.spec.ts","../test/unit/bug-report/readme.spec.ts","../test/unit/bug-report/route.spec.ts","../test/unit/bug-report/service.spec.ts","../test/unit/bug-report/video-slice.spec.ts","../test/unit/bug-report/window.spec.ts","../test/unit/fixtures/device.config.js","../test/unit/fixtures/devices.js","../test/unit/interceptor/AndroidProxyAdapter.spec.ts","../test/unit/interceptor/CertManager.spec.ts","../test/unit/interceptor/HarBuilder.spec.ts","../test/unit/interceptor/HostFilter.spec.ts","../test/unit/interceptor/MitmProxyHost.spec.ts","../test/unit/interceptor/MockEngine.spec.ts","../test/unit/interceptor/RequestBuffer.spec.ts","../test/unit/interceptor/SessionArchive.spec.ts","../test/unit/lease/LeaseOrphanSweeper.spec.ts","../test/unit/lease/LeaseService.spec.ts","../test/unit/lease/buildCapabilityBag.spec.ts","../test/unit/lease/leaseToken.spec.ts","../test/unit/lease/nodePairAuth.spec.ts","../test/unit/ports/PortAllocatorService.spec.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["../src/InternalHttpClient.ts","../src/PluginContext.ts","../src/XenonCapabilityManager.ts","../src/chromeUtils.ts","../src/config.ts","../src/device-utils.ts","../src/index.ts","../src/logger.ts","../src/plugin.ts","../src/prisma.ts","../src/app/index.ts","../src/app/swagger-docs.ts","../src/app/swagger.ts","../src/app/routers/apikeys.ts","../src/app/routers/apps.ts","../src/app/routers/audit.ts","../src/app/routers/auth.ts","../src/app/routers/bug-report.ts","../src/app/routers/build-export.ts","../src/app/routers/capabilities.ts","../src/app/routers/config.ts","../src/app/routers/control.ts","../src/app/routers/dashboard.ts","../src/app/routers/grid.ts","../src/app/routers/interceptor.ts","../src/app/routers/ports.ts","../src/app/routers/processes.ts","../src/app/routers/profile.ts","../src/app/routers/profileIdentity.ts","../src/app/routers/projects.ts","../src/app/routers/recordings.ts","../src/app/routers/reservation.ts","../src/app/routers/sdk-leases.ts","../src/app/routers/sdk-version.ts","../src/app/routers/teams.ts","../src/app/routers/users.ts","../src/app/routers/webhook.ts","../src/commands/handle.ts","../src/commands/index.ts","../src/dashboard/asset-manager.ts","../src/dashboard/commands.ts","../src/dashboard/event-manager.ts","../src/dashboard/services/app-service.ts","../src/dashboard/services/failure-analysis-service.ts","../src/dashboard/services/session-service.ts","../src/data-service/CircuitBreaker.ts","../src/data-service/config-service.ts","../src/data-service/db.ts","../src/data-service/device-service.ts","../src/data-service/device-store.interface.ts","../src/data-service/device-store.ts","../src/data-service/pending-sessions-service.ts","../src/data-service/pluginArgs.ts","../src/data-service/prisma-service.ts","../src/data-service/prisma-store.ts","../src/data-service/queue-service.ts","../src/data-service/web-config-service.ts","../src/device-managers/AndroidDeviceManager.ts","../src/device-managers/ChromeDriverManager.ts","../src/device-managers/HealthMonitorService.ts","../src/device-managers/IOSDeviceManager.ts","../src/device-managers/NodeDevices.ts","../src/device-managers/iOSTracker.ts","../src/device-managers/index.ts","../src/device-managers/android/AndroidStreamService.ts","../src/device-managers/android/DeviceLockManager.ts","../src/device-managers/cloud/CapabilityManager.ts","../src/device-managers/cloud/Devices.ts","../src/device-managers/ios/IOSDiscoveryService.ts","../src/device-managers/ios/IOSStreamService.ts","../src/device-managers/ios/WDAClient.ts","../src/device-managers/ios/iosBattery.ts","../src/device-managers/ios/iosStreamDiagnostics.ts","../src/enums/Capabilities.ts","../src/enums/Cloud.ts","../src/enums/Platform.ts","../src/enums/SessionType.ts","../src/enums/SocketEvents.ts","../src/generated/client/default.d.ts","../src/generated/client/default.js","../src/generated/client/edge.d.ts","../src/generated/client/edge.js","../src/generated/client/index-browser.js","../src/generated/client/index.d.ts","../src/generated/client/index.js","../src/generated/client/wasm.d.ts","../src/generated/client/wasm.js","../src/generated/client/runtime/edge-esm.js","../src/generated/client/runtime/edge.js","../src/generated/client/runtime/index-browser.d.ts","../src/generated/client/runtime/index-browser.js","../src/generated/client/runtime/library.d.ts","../src/generated/client/runtime/library.js","../src/generated/client/runtime/react-native.js","../src/generated/client/runtime/wasm.js","../src/helpers/UniversalMjpegProxy.ts","../src/helpers/index.ts","../src/interceptors/CommandInterceptor.ts","../src/interfaces/ICloudManager.ts","../src/interfaces/IDevice.ts","../src/interfaces/IDeviceFilterOptions.ts","../src/interfaces/IDeviceManager.ts","../src/interfaces/IOptions.ts","../src/interfaces/IPluginArgs.ts","../src/interfaces/ISessionCapability.ts","../src/logging/sessionContext.ts","../src/middleware/authMiddleware.ts","../src/middleware/csrfMiddleware.ts","../src/middleware/leaseTokenMiddleware.ts","../src/middleware/loginRateLimiter.ts","../src/middleware/rateLimitMiddleware.ts","../src/middleware/roleGuard.ts","../src/middleware/scopeGuard.ts","../src/profiling/AndroidAppProfiler.ts","../src/proxy/wd-command-proxy.ts","../src/scripts/generate-database-migration.ts","../src/scripts/initialize-database.ts","../src/scripts/install-go-ios.ts","../src/scripts/prepare-prisma.ts","../src/scripts/run-migrations.ts","../src/services/AICommandService.ts","../src/services/AIService.ts","../src/services/ApiKeyService.ts","../src/services/CircuitBreaker.ts","../src/services/CleanupService.ts","../src/services/DeviceReconciler.ts","../src/services/EmailService.ts","../src/services/EventBus.ts","../src/services/EventLogService.ts","../src/services/InspectorService.ts","../src/services/InterceptorService.ts","../src/services/MetricsService.ts","../src/services/NetworkConditioningService.ts","../src/services/NotificationService.ts","../src/services/OrphanSweeper.ts","../src/services/PasswordResetService.ts","../src/services/PortAllocator.ts","../src/services/ProcessMetricsService.ts","../src/services/ProcessRegistry.ts","../src/services/RequestLogService.ts","../src/services/ResourceIsolationService.ts","../src/services/SecurityService.ts","../src/services/SelectorStateService.ts","../src/services/SelectorVerificationJob.ts","../src/services/ServerManager.ts","../src/services/SessionHeartbeatService.ts","../src/services/SessionLifecycleService.ts","../src/services/ShutdownCoordinator.ts","../src/services/SocketClient.ts","../src/services/SocketServer.ts","../src/services/TeamService.ts","../src/services/TracingService.ts","../src/services/UserService.ts","../src/services/UserSessionService.ts","../src/services/VideoPipelineService.ts","../src/services/sessionTokenGate.ts","../src/services/artifacts/ArtifactStore.ts","../src/services/autowait/AutowaitService.ts","../src/services/autowait/waitFor.ts","../src/services/bug-report/BugReportService.ts","../src/services/bug-report/archive.ts","../src/services/bug-report/har-collector.ts","../src/services/bug-report/manifest.ts","../src/services/bug-report/readme.ts","../src/services/bug-report/types.ts","../src/services/bug-report/video-slice.ts","../src/services/bug-report/window.ts","../src/services/healing/FuzzyXmlHealingProvider.ts","../src/services/healing/HealEtalonService.ts","../src/services/healing/HealedLocatorGenerator.ts","../src/services/healing/HealingMetrics.ts","../src/services/healing/HealingOrchestrator.ts","../src/services/healing/LlmHealingProvider.ts","../src/services/healing/OcrHealingProvider.ts","../src/services/healing/ResilioTreeHealingProvider.ts","../src/services/healing/VisualAiHealingProvider.ts","../src/services/healing/types.ts","../src/services/identity/bootstrap.ts","../src/services/identity/sessionCleanupCron.ts","../src/services/identity/userAuthorization.ts","../src/services/interceptor/AndroidProxyAdapter.ts","../src/services/interceptor/CertManager.ts","../src/services/interceptor/HarBuilder.ts","../src/services/interceptor/HostFilter.ts","../src/services/interceptor/MitmProxyHost.ts","../src/services/interceptor/MockEngine.ts","../src/services/interceptor/RequestBuffer.ts","../src/services/interceptor/SessionArchive.ts","../src/services/interceptor/types.ts","../src/services/lease/LeaseOrphanSweeper.ts","../src/services/lease/LeaseService.ts","../src/services/lease/buildCapabilityBag.ts","../src/services/lease/leaseToken.ts","../src/services/omni-vision/OmniVisionService.ts","../src/services/omni-vision/VisionAssertionService.ts","../src/services/ports/PortAllocatorClient.ts","../src/services/ports/PortAllocatorService.ts","../src/services/recording/RecordingOrchestrator.ts","../src/services/recording/annotation-render.ts","../src/services/recording/busy-precheck.ts","../src/services/recording/concurrency-gate.ts","../src/services/recording/manualLock.ts","../src/services/recording/proof-bundle.ts","../src/services/recording/recording-store.ts","../src/services/telemetry/attributes.ts","../src/services/token/JwtKeyService.ts","../src/services/token/StreamTicketService.ts","../src/services/token/mcpScopes.ts","../src/sessions/CloudSession.ts","../src/sessions/LocalSession.ts","../src/sessions/RemoteSession.ts","../src/sessions/SessionManager.ts","../src/sessions/XenonSession.ts","../src/types/CLIArgs.ts","../src/types/CloudArgs.ts","../src/types/CloudSchema.ts","../src/types/DeviceType.ts","../src/types/DeviceUpdate.ts","../src/types/IOSDevice.ts","../src/types/Platform.ts","../src/types/SessionStatus.ts","../src/types/express.d.ts","../src/types/healing.d.ts","../src/types/identity.ts","../src/validators/CapabilityValidator.ts","../test/e2e/e2ehelper.ts","../test/e2e/plugin-harness.ts","../test/e2e/plugin.spec.ts","../test/e2e/startup-verification.spec.ts","../test/e2e/telemetry_verification.spec.ts","../test/e2e/video-recording-test.spec.js","../test/e2e/android/conf.spec.js","../test/e2e/android/conf2.spec.js","../test/e2e/android/conf3.spec.js","../test/e2e/hubnode/forward-request.spec.ts","../test/e2e/hubnode/hubnode.spec.ts","../test/e2e/ios/conf1.spec.js","../test/e2e/ios/conf2.spec.js","../test/helpers/seedUser.ts","../test/helpers/test-container.ts","../test/integration/androidDevices.spec.ts","../test/integration/audit-ingest.spec.ts","../test/integration/auth-flow.spec.ts","../test/integration/auth-rate-limit.spec.ts","../test/integration/bug-report-route.spec.ts","../test/integration/cliArgs.js","../test/integration/cross-workflow.spec.ts","../test/integration/forgot-password-rate-limit.spec.ts","../test/integration/forgot-password.spec.ts","../test/integration/healing-events-sessionfilter.spec.ts","../test/integration/legacy-deprecation-headers.spec.ts","../test/integration/migration.spec.ts","../test/integration/node-pair-auth-rest.spec.ts","../test/integration/ports-router.spec.ts","../test/integration/profile-tokens.spec.ts","../test/integration/recordings-router.spec.ts","../test/integration/reset-revokes-sessions.spec.ts","../test/integration/role-matrix.spec.ts","../test/integration/sdk-leases-router.spec.ts","../test/integration/sdk-version.spec.ts","../test/integration/selector-health-endpoint.spec.ts","../test/integration/selector-state-flow.spec.ts","../test/integration/team-membership-migration.spec.ts","../test/integration/team-visibility-dashboard.spec.ts","../test/integration/team-visibility-grid.spec.ts","../test/integration/team-visibility-recordings.spec.ts","../test/integration/users-flow.spec.ts","../test/integration/users-lockout.spec.ts","../test/integration/ios/01iOSSimulator.spec.ts","../test/integration/ios/02iOSDevices.spec.ts","../test/unit/AndroidDeviceManager.spec.ts","../test/unit/ApiKeyService.test.ts","../test/unit/ArtifactStore.spec.ts","../test/unit/AutowaitService.spec.ts","../test/unit/CapabilitiesRouter.spec.ts","../test/unit/ChromeDriverManager.spec.js","../test/unit/CleanupService.spec.ts","../test/unit/CommandInterceptor.autowait.spec.ts","../test/unit/DeviceModel.spec.ts","../test/unit/EmailService.test.ts","../test/unit/EventLogService.spec.ts","../test/unit/FuzzyXmlHealingProvider.test.ts","../test/unit/GetAdbOriginal.js","../test/unit/HealingCascade.test.ts","../test/unit/IOSDeviceManager.spec.js","../test/unit/JwtKeyService.spec.ts","../test/unit/McpScopes.spec.ts","../test/unit/OrphanSweeper.test.ts","../test/unit/PasswordResetService.test.ts","../test/unit/PortAllocator.test.ts","../test/unit/ProcessRegistry.test.ts","../test/unit/ProjectsRouter.spec.ts","../test/unit/RemoteIOs.spec.js","../test/unit/ResilioTreeHealingProvider.test.ts","../test/unit/SessionHeartbeatWrite.test.ts","../test/unit/SessionLifecycleCaps.spec.ts","../test/unit/SessionTokenGate.spec.ts","../test/unit/StreamTicketService.spec.ts","../test/unit/TeamService.test.ts","../test/unit/TokenEndpoint.spec.ts","../test/unit/UserService.test.ts","../test/unit/UserSessionService.test.ts","../test/unit/XenonCapabilityManager.spec.ts","../test/unit/aggregate-hotspots-tuple-key.spec.ts","../test/unit/android-stream-adb-path.spec.ts","../test/unit/android-stream-release.spec.ts","../test/unit/auth-me-auth-disabled.test.ts","../test/unit/authMiddleware.bearer.spec.ts","../test/unit/authMiddleware.mcpAudience.spec.ts","../test/unit/authMiddleware.streamTicket.spec.ts","../test/unit/authMiddleware.test.ts","../test/unit/bootstrap-identity.test.ts","../test/unit/build-export.spec.ts","../test/unit/busy-precheck.spec.ts","../test/unit/commands.spec.js","../test/unit/concurrency-gate.spec.ts","../test/unit/config.spec.js","../test/unit/device-service.spec.ts","../test/unit/device-utils.spec.ts","../test/unit/event-manager-regression-hook.spec.ts","../test/unit/extract-access-key-token-pair.test.ts","../test/unit/findAndLockDevice-leasemerge.spec.ts","../test/unit/healing-instrumentation.spec.ts","../test/unit/healing-state-endpoints.spec.ts","../test/unit/healing-tier-gate.spec.ts","../test/unit/helpers.spec.ts","../test/unit/iosBattery.spec.ts","../test/unit/iosStreamDiagnostics.spec.ts","../test/unit/loginRateLimiter.test.ts","../test/unit/manualLock.test.ts","../test/unit/omni-vision.spec.ts","../test/unit/plugin.spec.ts","../test/unit/prisma.spec.ts","../test/unit/profile-router.test.ts","../test/unit/profileIdentity.spec.ts","../test/unit/proof-bundle.spec.ts","../test/unit/rateLimitMiddleware.test.ts","../test/unit/recording-instrumentation.spec.ts","../test/unit/recording-orchestrator.spec.ts","../test/unit/recording-store.spec.ts","../test/unit/roleGuard.test.ts","../test/unit/run-migrations-fail-fast.test.ts","../test/unit/run-migrations.test.ts","../test/unit/selector-state-service.spec.ts","../test/unit/selector-verification-job.spec.ts","../test/unit/socketServer.bearer.spec.ts","../test/unit/team-filter.test.ts","../test/unit/tracing-service-init.spec.ts","../test/unit/userAuthorization.test.ts","../test/unit/users-router.test.ts","../test/unit/video-pipeline-args.spec.ts","../test/unit/video-pipeline-outputpath.spec.ts","../test/unit/bug-report/archive.spec.ts","../test/unit/bug-report/har-collector.spec.ts","../test/unit/bug-report/manifest.spec.ts","../test/unit/bug-report/readme.spec.ts","../test/unit/bug-report/route.spec.ts","../test/unit/bug-report/service.spec.ts","../test/unit/bug-report/video-slice.spec.ts","../test/unit/bug-report/window.spec.ts","../test/unit/fixtures/device.config.js","../test/unit/fixtures/devices.js","../test/unit/interceptor/AndroidProxyAdapter.spec.ts","../test/unit/interceptor/CertManager.spec.ts","../test/unit/interceptor/HarBuilder.spec.ts","../test/unit/interceptor/HostFilter.spec.ts","../test/unit/interceptor/MitmProxyHost.spec.ts","../test/unit/interceptor/MockEngine.spec.ts","../test/unit/interceptor/RequestBuffer.spec.ts","../test/unit/interceptor/SessionArchive.spec.ts","../test/unit/lease/LeaseOrphanSweeper.spec.ts","../test/unit/lease/LeaseService.spec.ts","../test/unit/lease/buildCapabilityBag.spec.ts","../test/unit/lease/leaseToken.spec.ts","../test/unit/lease/nodePairAuth.spec.ts","../test/unit/ports/PortAllocatorService.spec.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED