@xenon-device-management/xenon 2.13.1 → 2.13.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/public/assets/{AnnotationOverlay-Cvpkk4r9.js → AnnotationOverlay-BXruClDk.js} +1 -1
- package/lib/public/assets/{ApiKeyGate-Bhn5ZtVM.js → ApiKeyGate-qTS4LPLC.js} +1 -1
- package/lib/public/assets/{BugReportButton-BA6aEjTC.js → BugReportButton-BoGhlI7F.js} +1 -1
- package/lib/public/assets/{DeviceMosaicView-ChhHnpFQ.js → DeviceMosaicView-8J0oYqMM.js} +1 -1
- package/lib/public/assets/{EmptyState-CgzbuUvO.js → EmptyState-Cr17PdDv.js} +1 -1
- package/lib/public/assets/{FieldGroup-BHc_5qNc.js → FieldGroup-Bvn08svv.js} +1 -1
- package/lib/public/assets/{FilterMenu-D7OMGuRc.js → FilterMenu-DDSO8aDf.js} +1 -1
- package/lib/public/assets/{Menu-C173JJ0l.js → Menu-B-Qn2X3T.js} +1 -1
- package/lib/public/assets/{Modal-ChvVUI3B.js → Modal-Cg9V5JYU.js} +1 -1
- package/lib/public/assets/{RecordingPage-Dhw4d_O6.js → RecordingPage-BTUs9VTW.js} +1 -1
- package/lib/public/assets/{RecordingsPage-z97ftGK-.js → RecordingsPage-DYcfxITK.js} +1 -1
- package/lib/public/assets/{SegmentedControl-DbXhBGZC.js → SegmentedControl-Zy7suhT5.js} +1 -1
- package/lib/public/assets/{SettingCard-C908GgiI.js → SettingCard-CWYmycoe.js} +1 -1
- package/lib/public/assets/{Table-B1DB_ZN-.js → Table-io9fwa98.js} +1 -1
- package/lib/public/assets/{activity-Css0xNvp.js → activity-Bdf_uIWl.js} +1 -1
- package/lib/public/assets/{ai-settings-BMQK3-yN.js → ai-settings-Bce5SJob.js} +1 -1
- package/lib/public/assets/{api-keys-CbJ42eDQ.js → api-keys-CPqtVpm3.js} +1 -1
- package/lib/public/assets/{apps-DW1pw2re.js → apps-BgZan0H9.js} +1 -1
- package/lib/public/assets/{arrow-left-Dpog9L0F.js → arrow-left-B27ckB31.js} +1 -1
- package/lib/public/assets/{arrow-right-CsBIlSIw.js → arrow-right-DOF8ITCz.js} +1 -1
- package/lib/public/assets/{arrow-up-right-z1tRQE4R.js → arrow-up-right-eFG5KTFS.js} +1 -1
- package/lib/public/assets/{auth-shell-mXiX5vNk.js → auth-shell-DlC3_27j.js} +2 -2
- package/lib/public/assets/{builds-page-BcFn23bE.js → builds-page-BuXpPfKo.js} +1 -1
- package/lib/public/assets/{button-Cq_zHETv.js → button-fIW8owMI.js} +1 -1
- package/lib/public/assets/{calendar-CKxABX9q.js → calendar-WNjmrF-a.js} +1 -1
- package/lib/public/assets/{check-C7xu-hGU.js → check-BdTh1Sq7.js} +1 -1
- package/lib/public/assets/{chevron-right-BiqfdCGA.js → chevron-right-B4BKlsqk.js} +1 -1
- package/lib/public/assets/{circle-check-CyBjjPxR.js → circle-check-zJU80_EF.js} +1 -1
- package/lib/public/assets/{circle-x-6gMRcx6z.js → circle-x-5Uwquo0h.js} +1 -1
- package/lib/public/assets/{clock-U1rDTT1h.js → clock-BtUprDsZ.js} +1 -1
- package/lib/public/assets/{copy-BIM0ZX0L.js → copy-DGSbZI3u.js} +1 -1
- package/lib/public/assets/{device-explorer-DSpAA_t9.js → device-explorer-C-KnhMHI.js} +1 -1
- package/lib/public/assets/{download-DDBRXnAZ.js → download-WG6l7BgD.js} +1 -1
- package/lib/public/assets/{forgot-password-Dpg7yxM8.js → forgot-password-DnudqFFo.js} +1 -1
- package/lib/public/assets/{index-BTYMAqNW.css → index-Bxoxt9sV.css} +1 -1
- package/lib/public/assets/{index-BGBqohfQ.js → index-DI1fGIyj.js} +2 -2
- package/lib/public/assets/{index-BQ2luT7L.js → index-HDQVe1gi.js} +1 -1
- package/lib/public/assets/{input-BvB1cjHE.js → input-BjDRKCea.js} +1 -1
- package/lib/public/assets/{line-chart-m78VggnW.js → line-chart-C0zdgd0v.js} +1 -1
- package/lib/public/assets/{list-checks-cY7o1QTL.js → list-checks-BdW5CjM8.js} +1 -1
- package/lib/public/assets/{lock-loz8txQm.js → lock-Dy3L4I8E.js} +1 -1
- package/lib/public/assets/{login-BYOvz4lx.js → login-BHbY9CLG.js} +1 -1
- package/lib/public/assets/{maintenance-settings-BxbA7SkB.js → maintenance-settings-zDVlOMVK.js} +1 -1
- package/lib/public/assets/{monitor-C4HPHb6s.js → monitor-8xjkeHHi.js} +1 -1
- package/lib/public/assets/{mouse-pointer-2-BkdKtCzi.js → mouse-pointer-2-CXdKMXQ8.js} +1 -1
- package/lib/public/assets/{network-C5e0MIWo.js → network-Cj8JOKON.js} +1 -1
- package/lib/public/assets/{overview-tlu8ijGd.js → overview-CTg7F0im.js} +1 -1
- package/lib/public/assets/{page-header-FXPlo6az.js → page-header--aTyJXq6.js} +1 -1
- package/lib/public/assets/{play-CWdk0_Sy.js → play-B-FodgHV.js} +1 -1
- package/lib/public/assets/{plus-B2xCnntV.js → plus-CsIk10Cq.js} +1 -1
- package/lib/public/assets/{profile-page-D080qzr4.js → profile-page-DkFKkMfl.js} +1 -1
- package/lib/public/assets/{recording-group-store-B75435xR.js → recording-group-store-WVM3hoXn.js} +1 -1
- package/lib/public/assets/{reset-password-D3u4Mbvn.js → reset-password-I2-zqLlI.js} +1 -1
- package/lib/public/assets/{runbook-page-hPRZMy7s.js → runbook-page-DJTVCJX7.js} +1 -1
- package/lib/public/assets/{select-12RThAXc.js → select-DvCSv25z.js} +1 -1
- package/lib/public/assets/{selector-detail-redirect-uQwvV7EQ.js → selector-detail-redirect-BLVfMJs_.js} +1 -1
- package/lib/public/assets/{selector-health-page-CThoxDFO.js → selector-health-page-oqadRokn.js} +1 -1
- package/lib/public/assets/session-detail-page-CGn55Pvl.js +4 -0
- package/lib/public/assets/{settings-C1VIluuT.js → settings-MsVU2ukE.js} +1 -1
- package/lib/public/assets/{stat-tile-B02WEte8.js → stat-tile-DV9Ix-4O.js} +1 -1
- package/lib/public/assets/{tablet-Dj30VGZl.js → tablet-6b_SEN2X.js} +1 -1
- package/lib/public/assets/{teams-uL4fjTDR.js → teams-BjZyfuHh.js} +1 -1
- package/lib/public/assets/{trash-2-B54e-TfY.js → trash-2-CTZpPSdd.js} +1 -1
- package/lib/public/assets/{upload-B3k8WCSP.js → upload-P3XzwQUb.js} +1 -1
- package/lib/public/assets/{use-builds-data-BFn90NH3.js → use-builds-data-1cOCMf-z.js} +1 -1
- package/lib/public/assets/{use-password-reset-mode-DL2TmWZ0.js → use-password-reset-mode-DgF9w088.js} +1 -1
- package/lib/public/assets/{users-DjQSucKb.js → users-CiNTKUiz.js} +1 -1
- package/lib/public/assets/{users-CqBuxMlX.js → users-DMF9Mk5H.js} +1 -1
- package/lib/public/assets/{video-off-T0rlt0GA.js → video-off-CHp1KU_T.js} +1 -1
- package/lib/public/assets/{webhook-settings-DAHgnJyZ.js → webhook-settings-DiS8geIm.js} +1 -1
- package/lib/public/assets/{zap-gBHqutZV.js → zap-DRz0tDq5.js} +1 -1
- package/lib/public/index.html +2 -2
- package/lib/schema.json +0 -25
- package/lib/src/app/routers/control.js +19 -4
- package/lib/src/app/routers/streamStartConflict.js +3 -0
- package/lib/src/data-service/device-service.js +40 -0
- package/lib/src/data-service/device-store.js +4 -1
- package/lib/src/data-service/prisma-store.js +2 -1
- package/lib/src/device-utils.js +63 -13
- package/lib/src/middleware/deviceAccessGuard.js +63 -9
- package/lib/src/services/ServerManager.js +3 -0
- package/lib/src/services/SessionLifecycleService.js +16 -4
- package/lib/src/services/device-access/SessionOwnerResolver.js +26 -0
- package/lib/src/services/device-access/deviceAccessPolicy.js +38 -6
- package/lib/src/services/device-access/leaseHold.js +26 -0
- package/lib/src/services/device-access/ticketActorAccess.js +6 -0
- package/lib/src/services/lease/activeLeases.js +37 -0
- package/lib/src/services/recording/busy-precheck.js +24 -3
- package/lib/test/unit/device-access-lease.spec.js +270 -0
- package/lib/test/unit/lease/allocate-lease-branch.spec.js +22 -0
- package/lib/test/unit/lease/session-lease-proof.spec.js +59 -0
- package/lib/test/unit/lease-held-phone.spec.js +196 -0
- package/lib/test/unit/partial-config-file.spec.js +100 -0
- package/lib/test/unit/schema-required-args.spec.js +21 -16
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/schema.json +0 -25
- package/scripts/generate-types-from-schema.js +6 -0
- package/scripts/lib/always-present-plugin-args.js +39 -0
- package/lib/public/assets/session-detail-page-Bc02YjMm.js +0 -4
|
@@ -0,0 +1,196 @@
|
|
|
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
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
require("reflect-metadata");
|
|
49
|
+
const chai_1 = __importDefault(require("chai"));
|
|
50
|
+
const sinon_1 = __importDefault(require("sinon"));
|
|
51
|
+
const sinon_chai_1 = __importDefault(require("sinon-chai"));
|
|
52
|
+
const ActiveLeases = __importStar(require("../../src/services/lease/activeLeases"));
|
|
53
|
+
const DeviceUtils = __importStar(require("../../src/device-utils"));
|
|
54
|
+
const DeviceService = __importStar(require("../../src/data-service/device-service"));
|
|
55
|
+
const db_1 = require("../../src/data-service/db");
|
|
56
|
+
const device_service_1 = require("../../src/data-service/device-service");
|
|
57
|
+
const IPluginArgs_1 = require("../../src/interfaces/IPluginArgs");
|
|
58
|
+
const test_container_1 = require("../helpers/test-container");
|
|
59
|
+
const loki_stores_1 = require("../helpers/loki-stores");
|
|
60
|
+
const scratch_database_1 = require("../helpers/scratch-database");
|
|
61
|
+
chai_1.default.use(sinon_chai_1.default);
|
|
62
|
+
const expect = chai_1.default.expect;
|
|
63
|
+
// A phone an SDK lease holds stays its lease's until the lease ends. Its only
|
|
64
|
+
// lock is `busy`, and three things used to undo that: the idle sweeper (which
|
|
65
|
+
// read the lease's creation as the phone's last command), a lease-bound
|
|
66
|
+
// session's release, and allocation, which offered only the first candidate
|
|
67
|
+
// to the lock and so stalled on a leased phone while others were free.
|
|
68
|
+
describe('a phone an SDK lease holds', () => {
|
|
69
|
+
(0, loki_stores_1.useLokiStores)();
|
|
70
|
+
const scratch = (0, scratch_database_1.useScratchDatabase)();
|
|
71
|
+
const sandbox = sinon_1.default.createSandbox();
|
|
72
|
+
const pluginArgs = Object.assign({}, IPluginArgs_1.DefaultPluginArgs, {
|
|
73
|
+
iosDeviceType: 'both',
|
|
74
|
+
androidDeviceType: 'both',
|
|
75
|
+
});
|
|
76
|
+
const phone = (udid, over = {}) => (Object.assign({ udid, name: udid, platform: 'android', sdk: '13', host: 'http://127.0.0.1:4723', busy: false, offline: false, userBlocked: false, state: 'device', deviceType: 'emulator', realDevice: false, systemPort: 57000, totalUtilizationTimeMilliSec: 0, sessionStartTime: 0 }, over));
|
|
77
|
+
const lease = (udid, over = {}) => scratch.db.lease.create({
|
|
78
|
+
data: Object.assign({ tokenHash: 'h', deviceUdid: udid, deviceHost: 'http://127.0.0.1:4723', actorId: 'key_owner', status: 'active', expiresAt: Date.now() + 600000, lastHeartbeatAt: Date.now(), allocatedPorts: '{}', capabilityBag: '{}' }, over),
|
|
79
|
+
});
|
|
80
|
+
const row = (udid) => __awaiter(void 0, void 0, void 0, function* () { return (yield db_1.XenonDatabase.DeviceModel).findOne({ udid }); });
|
|
81
|
+
const setRow = (udid, fields) => __awaiter(void 0, void 0, void 0, function* () {
|
|
82
|
+
return (yield db_1.XenonDatabase.DeviceModel)
|
|
83
|
+
.chain()
|
|
84
|
+
.find({ udid })
|
|
85
|
+
.update((d) => Object.assign(d, fields));
|
|
86
|
+
});
|
|
87
|
+
before(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
88
|
+
yield (0, test_container_1.resetTestContainer)();
|
|
89
|
+
yield (0, test_container_1.setupTestContainer)();
|
|
90
|
+
}));
|
|
91
|
+
after(() => (0, test_container_1.resetTestContainer)());
|
|
92
|
+
beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
93
|
+
(yield db_1.XenonDatabase.DeviceModel).removeDataOnly();
|
|
94
|
+
yield scratch.db.lease.deleteMany({});
|
|
95
|
+
(0, test_container_1.createTestXenonManager)(Object.assign({}, pluginArgs, { maxSessions: 10, platform: 'android' }));
|
|
96
|
+
sandbox.stub(DeviceUtils, 'setUtilizationTime').resolves();
|
|
97
|
+
}));
|
|
98
|
+
afterEach(() => sandbox.restore());
|
|
99
|
+
describe('the idle sweeper', () => {
|
|
100
|
+
const idle = { busy: true, lastCmdExecutedAt: Date.now() - 600000 };
|
|
101
|
+
it('leaves a leased phone with no session alone', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
102
|
+
yield (0, device_service_1.addNewDevice)([phone('leased-1')]);
|
|
103
|
+
yield setRow('leased-1', idle);
|
|
104
|
+
yield lease('leased-1');
|
|
105
|
+
const unblock = sandbox.spy(DeviceService, 'unblockDevice');
|
|
106
|
+
yield DeviceUtils.releaseBlockedDevices(20);
|
|
107
|
+
expect(unblock).not.to.have.been.called;
|
|
108
|
+
expect((yield row('leased-1')).busy).to.equal(true);
|
|
109
|
+
}));
|
|
110
|
+
it('frees it once the lease has lapsed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
111
|
+
yield (0, device_service_1.addNewDevice)([phone('lapsed-1')]);
|
|
112
|
+
yield setRow('lapsed-1', idle);
|
|
113
|
+
yield lease('lapsed-1', { expiresAt: Date.now() - 1000 });
|
|
114
|
+
const unblock = sandbox.spy(DeviceService, 'unblockDevice');
|
|
115
|
+
yield DeviceUtils.releaseBlockedDevices(20);
|
|
116
|
+
expect(unblock).to.have.been.calledWith('lapsed-1');
|
|
117
|
+
}));
|
|
118
|
+
it('skips its tick when it cannot tell which phones are leased', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
119
|
+
// Failing open would free every leased phone: their last command is
|
|
120
|
+
// when the lease was taken.
|
|
121
|
+
yield (0, device_service_1.addNewDevice)([phone('plain-3')]);
|
|
122
|
+
yield setRow('plain-3', idle);
|
|
123
|
+
sandbox.stub(ActiveLeases, 'activeLeasesByDevice').rejects(new Error('db down'));
|
|
124
|
+
const unblock = sandbox.spy(DeviceService, 'unblockDevice');
|
|
125
|
+
yield DeviceUtils.releaseBlockedDevices(20);
|
|
126
|
+
expect(unblock).not.to.have.been.called;
|
|
127
|
+
}));
|
|
128
|
+
it('still frees an idle phone nobody leases', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
129
|
+
yield (0, device_service_1.addNewDevice)([phone('plain-1')]);
|
|
130
|
+
yield setRow('plain-1', idle);
|
|
131
|
+
const unblock = sandbox.spy(DeviceService, 'unblockDevice');
|
|
132
|
+
yield DeviceUtils.releaseBlockedDevices(20);
|
|
133
|
+
expect(unblock).to.have.been.calledWith('plain-1');
|
|
134
|
+
}));
|
|
135
|
+
});
|
|
136
|
+
describe("a lease-bound session's release", () => {
|
|
137
|
+
it('hands the phone back to the lease, still busy', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
138
|
+
var _a;
|
|
139
|
+
yield (0, device_service_1.addNewDevice)([phone('leased-2')]);
|
|
140
|
+
yield setRow('leased-2', { busy: true, session_id: 'sess-1' });
|
|
141
|
+
yield lease('leased-2');
|
|
142
|
+
expect(yield DeviceService.releaseSessionDevice('leased-2', 'http://127.0.0.1:4723', 'sess-1')).to.be.true;
|
|
143
|
+
const after = yield row('leased-2');
|
|
144
|
+
expect((_a = after.session_id) !== null && _a !== void 0 ? _a : null).to.equal(null);
|
|
145
|
+
expect(after.busy).to.equal(true);
|
|
146
|
+
}));
|
|
147
|
+
it('undoes the hand-back when the lease ended meanwhile', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
148
|
+
yield (0, device_service_1.addNewDevice)([phone('racing-1')]);
|
|
149
|
+
yield setRow('racing-1', { busy: true, session_id: 'sess-3' });
|
|
150
|
+
// Live at the first check, gone by the second.
|
|
151
|
+
const lookup = sandbox.stub(ActiveLeases, 'activeLeaseOn');
|
|
152
|
+
lookup.onFirstCall().resolves({ id: 'l', actorId: 'k' });
|
|
153
|
+
lookup.resolves(null);
|
|
154
|
+
yield DeviceService.releaseSessionDevice('racing-1', 'http://127.0.0.1:4723', 'sess-3');
|
|
155
|
+
expect(lookup).to.have.been.calledTwice;
|
|
156
|
+
expect((yield row('racing-1')).busy).to.equal(false);
|
|
157
|
+
}));
|
|
158
|
+
it('frees a phone with no lease, as before', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
159
|
+
yield (0, device_service_1.addNewDevice)([phone('plain-2')]);
|
|
160
|
+
yield setRow('plain-2', { busy: true, session_id: 'sess-2' });
|
|
161
|
+
yield DeviceService.releaseSessionDevice('plain-2', 'http://127.0.0.1:4723', 'sess-2');
|
|
162
|
+
expect((yield row('plain-2')).busy).to.equal(false);
|
|
163
|
+
}));
|
|
164
|
+
});
|
|
165
|
+
describe('allocation for a session', () => {
|
|
166
|
+
const caps = (udid) => ({
|
|
167
|
+
alwaysMatch: Object.assign({ platformName: 'android' }, (udid ? { 'appium:udid': udid } : {})),
|
|
168
|
+
firstMatch: [{}],
|
|
169
|
+
});
|
|
170
|
+
it("never locks a reserved phone's twin on another host in its place", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
171
|
+
// Same udid on two hosts: the reserved row is listed first.
|
|
172
|
+
yield (0, device_service_1.addNewDevice)([
|
|
173
|
+
phone('twin', {
|
|
174
|
+
host: 'http://other:4723',
|
|
175
|
+
reservedUntil: Date.now() + 600000,
|
|
176
|
+
reservedBy: 'x',
|
|
177
|
+
}),
|
|
178
|
+
phone('twin'),
|
|
179
|
+
]);
|
|
180
|
+
const got = yield DeviceUtils.allocateDeviceForSession(caps(), 2000, 100, pluginArgs);
|
|
181
|
+
expect(got.host).to.equal('http://127.0.0.1:4723');
|
|
182
|
+
const reserved = (yield db_1.XenonDatabase.DeviceModel).findOne({
|
|
183
|
+
udid: 'twin',
|
|
184
|
+
host: 'http://other:4723',
|
|
185
|
+
});
|
|
186
|
+
expect(reserved.busy).to.equal(false);
|
|
187
|
+
}));
|
|
188
|
+
it('skips a leased phone whose busy flag was cleared and takes a free one', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
189
|
+
// Listed first, so the old single-candidate lock tried only it, forever.
|
|
190
|
+
yield (0, device_service_1.addNewDevice)([phone('a-leased'), phone('b-free')]);
|
|
191
|
+
yield lease('a-leased');
|
|
192
|
+
const got = yield DeviceUtils.allocateDeviceForSession(caps(), 2000, 100, pluginArgs);
|
|
193
|
+
expect(got.udid).to.equal('b-free');
|
|
194
|
+
}));
|
|
195
|
+
});
|
|
196
|
+
});
|
|
@@ -0,0 +1,100 @@
|
|
|
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
|
+
const chai_1 = require("chai");
|
|
16
|
+
const fs_1 = __importDefault(require("fs"));
|
|
17
|
+
const os_1 = __importDefault(require("os"));
|
|
18
|
+
const path_1 = __importDefault(require("path"));
|
|
19
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
20
|
+
// An Appium config file is checked against Xenon's schema.json before Appium
|
|
21
|
+
// fills in defaults (appium/build/lib/main.js: readConfigFile, then
|
|
22
|
+
// defaultsDeep(cli, file, schema defaults)). A `required` option therefore
|
|
23
|
+
// makes Appium refuse any file that leaves it out, even though it has a
|
|
24
|
+
// default. Through 2.13.1 the README's own five-option sample was refused with
|
|
25
|
+
// "REQUIRED must have required property 'enableJsonLogging'". These checks run
|
|
26
|
+
// Appium's own loader so a file that sets a few options keeps starting.
|
|
27
|
+
/* eslint-disable @typescript-eslint/no-var-requires -- Appium's internals have no type exports */
|
|
28
|
+
const appiumSchema = require('appium/build/lib/schema/schema');
|
|
29
|
+
const { readConfigFile } = require('appium/build/lib/config-file');
|
|
30
|
+
/* eslint-enable @typescript-eslint/no-var-requires */
|
|
31
|
+
const xenonSchema = JSON.parse(fs_1.default.readFileSync(path_1.default.join(__dirname, '..', '..', 'schema.json'), 'utf8'));
|
|
32
|
+
// The README's sample, verbatim.
|
|
33
|
+
const README_SAMPLE = `server:
|
|
34
|
+
use-plugins: [xenon]
|
|
35
|
+
plugin:
|
|
36
|
+
xenon:
|
|
37
|
+
platform: both
|
|
38
|
+
enableDashboard: true
|
|
39
|
+
maxSessions: 8
|
|
40
|
+
enableSelfHealing: true
|
|
41
|
+
buildCleanupDays: 30
|
|
42
|
+
`;
|
|
43
|
+
describe('An Appium config file for Xenon', function () {
|
|
44
|
+
let dir;
|
|
45
|
+
function load(yaml) {
|
|
46
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
const file = path_1.default.join(dir, `config-${Math.random().toString(36).slice(2)}.yaml`);
|
|
48
|
+
fs_1.default.writeFileSync(file, yaml);
|
|
49
|
+
return readConfigFile(file);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
before(function () {
|
|
53
|
+
appiumSchema.resetSchema();
|
|
54
|
+
appiumSchema.registerSchema('plugin', 'xenon', xenonSchema);
|
|
55
|
+
appiumSchema.finalizeSchema();
|
|
56
|
+
dir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'xenon-config-'));
|
|
57
|
+
});
|
|
58
|
+
after(function () {
|
|
59
|
+
appiumSchema.resetSchema();
|
|
60
|
+
fs_1.default.rmSync(dir, { recursive: true, force: true });
|
|
61
|
+
});
|
|
62
|
+
it('is accepted when it sets only a few options (the README sample)', function () {
|
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
var _a;
|
|
65
|
+
const result = yield load(README_SAMPLE);
|
|
66
|
+
(0, chai_1.expect)((_a = result.reason) !== null && _a !== void 0 ? _a : result.errors).to.be.empty;
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
it('is accepted when it sets no Xenon option at all', function () {
|
|
70
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
71
|
+
var _a;
|
|
72
|
+
const result = yield load('server:\n use-plugins: [xenon]\n');
|
|
73
|
+
(0, chai_1.expect)((_a = result.reason) !== null && _a !== void 0 ? _a : result.errors).to.be.empty;
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
it('is still refused when a value is invalid', function () {
|
|
77
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
const result = yield load(README_SAMPLE.replace('platform: both', 'platform: windows'));
|
|
79
|
+
(0, chai_1.expect)(result.errors).to.not.be.empty;
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
it('leaves Appium to fill every option the file leaves out with its default', function () {
|
|
83
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
+
var _a;
|
|
85
|
+
// What Appium's main does after a file passes: CLI args, then the file,
|
|
86
|
+
// then the schema's defaults.
|
|
87
|
+
const result = yield load(README_SAMPLE);
|
|
88
|
+
const defaults = appiumSchema.getDefaultsForSchema(false);
|
|
89
|
+
const server = lodash_1.default.defaultsDeep({}, (_a = result.config) === null || _a === void 0 ? void 0 : _a.server, defaults);
|
|
90
|
+
const xenon = server.plugin.xenon;
|
|
91
|
+
const setInFile = new Set(Object.keys(result.config.server.plugin.xenon));
|
|
92
|
+
(0, chai_1.expect)(xenon.maxSessions).to.equal(8); // from the file
|
|
93
|
+
for (const [key, prop] of Object.entries(xenonSchema.properties)) {
|
|
94
|
+
if ('default' in prop && !setInFile.has(key)) {
|
|
95
|
+
(0, chai_1.expect)(xenon[key], `${key} should take its default`).to.deep.equal(prop.default);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
});
|
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
|
+
var _a;
|
|
5
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
7
|
const chai_1 = require("chai");
|
|
7
8
|
const fs_1 = __importDefault(require("fs"));
|
|
8
9
|
const path_1 = __importDefault(require("path"));
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires -- a plain Node script's list
|
|
11
|
+
const { ALWAYS_PRESENT_PLUGIN_ARGS } = require('../../scripts/lib/always-present-plugin-args');
|
|
9
12
|
// Adding a plugin arg to schema.json's `required` list is a BREAKING change for
|
|
10
13
|
// every existing config file. Appium validates the config against this schema
|
|
11
14
|
// and refuses to start when a required key is absent:
|
|
@@ -18,28 +21,30 @@ const path_1 = __importDefault(require("path"));
|
|
|
18
21
|
// in 1.12.0 — an already-running server would not come back up after upgrading,
|
|
19
22
|
// with no way to tell from the message that the fix is to edit a YAML file.
|
|
20
23
|
//
|
|
21
|
-
// An arg with a default must be optional:
|
|
22
|
-
//
|
|
24
|
+
// An arg with a default must be optional: Appium fills in schema defaults after
|
|
25
|
+
// it validates the file, and the plugin merges DefaultPluginArgs as well. Until
|
|
26
|
+
// 2.13.1, 23 args were both required and defaulted, so a config file had to list
|
|
27
|
+
// all of them; even the README's five-option sample was refused. None is now.
|
|
23
28
|
const schema = JSON.parse(fs_1.default.readFileSync(path_1.default.join(__dirname, '..', '..', 'schema.json'), 'utf8'));
|
|
24
|
-
|
|
25
|
-
const KNOWN_REQUIRED_WITH_DEFAULT = 23;
|
|
29
|
+
const required = (_a = schema.required) !== null && _a !== void 0 ? _a : [];
|
|
26
30
|
describe('schema.json required args', () => {
|
|
27
|
-
it('
|
|
31
|
+
it('requires no arg that has a default', () => {
|
|
28
32
|
// A default means "you may omit this", which is the opposite of required.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
// debt, not something to fix in a hotfix — but the set must not GROW,
|
|
33
|
-
// because each addition breaks every config written before it.
|
|
34
|
-
const contradictory = schema.required.filter((key) => schema.properties[key] && 'default' in schema.properties[key]);
|
|
35
|
-
(0, chai_1.expect)(contradictory.length, `New required-with-default arg(s): ${contradictory.slice(KNOWN_REQUIRED_WITH_DEFAULT).join(', ')}. ` +
|
|
36
|
-
'An existing config that omits them fails Appium config validation and the server ' +
|
|
37
|
-
'will not start. Give the arg a default and leave it out of `required`.').to.equal(KNOWN_REQUIRED_WITH_DEFAULT);
|
|
33
|
+
const contradictory = required.filter((key) => schema.properties[key] && 'default' in schema.properties[key]);
|
|
34
|
+
(0, chai_1.expect)(contradictory, 'An existing config that omits these fails Appium config validation and the server ' +
|
|
35
|
+
'will not start. Give the arg a default and leave it out of `required`.').to.deep.equal([]);
|
|
38
36
|
});
|
|
39
37
|
it('keeps every required arg present in properties', () => {
|
|
40
|
-
const missing =
|
|
38
|
+
const missing = required.filter((key) => !schema.properties[key]);
|
|
41
39
|
(0, chai_1.expect)(missing, 'required lists an arg that does not exist').to.deep.equal([]);
|
|
42
40
|
});
|
|
41
|
+
it('types as always present only args that have a default', () => {
|
|
42
|
+
// IPluginArgs keeps these fields non-optional (scripts/generate-types-from-schema.js
|
|
43
|
+
// marks them required for type generation only). That is true only while each
|
|
44
|
+
// exists and has a default for Appium and DefaultPluginArgs to fill in.
|
|
45
|
+
const wrong = ALWAYS_PRESENT_PLUGIN_ARGS.filter((key) => !schema.properties[key] || !('default' in schema.properties[key]));
|
|
46
|
+
(0, chai_1.expect)(wrong, 'listed as always present but missing or without a default').to.deep.equal([]);
|
|
47
|
+
});
|
|
43
48
|
it('does not require the recording retention args', () => {
|
|
44
49
|
// Named explicitly: this is the regression that took a live server down.
|
|
45
50
|
for (const key of [
|
|
@@ -48,7 +53,7 @@ describe('schema.json required args', () => {
|
|
|
48
53
|
'recordingFailedCleanupDays',
|
|
49
54
|
]) {
|
|
50
55
|
(0, chai_1.expect)(schema.properties[key], `${key} should exist`).to.be.an('object');
|
|
51
|
-
(0, chai_1.expect)(
|
|
56
|
+
(0, chai_1.expect)(required, `${key} must stay optional`).to.not.include(key);
|
|
52
57
|
}
|
|
53
58
|
});
|
|
54
59
|
});
|
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/apiErrors.ts","../src/app/appiumBasePath.ts","../src/app/index.ts","../src/app/insertBeforeRoutes.ts","../src/app/registerCommandAuth.ts","../src/app/swagger.ts","../src/app/routers/androidH264Config.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/iosStreamPort.ts","../src/app/routers/nodePhoneControl.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/recordingRequests.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/selector-health.ts","../src/app/routers/sessionInsights.ts","../src/app/routers/streamLeave.ts","../src/app/routers/streamStartConflict.ts","../src/app/routers/streamType.ts","../src/app/routers/teams.ts","../src/app/routers/users.ts","../src/app/routers/webhook.ts","../src/app/ws/h264StreamWs.ts","../src/app/ws/logcatWs.ts","../src/app/ws/nodeSocketRelay.ts","../src/app/ws/upgradeRouter.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/deviceClaims.ts","../src/data-service/deviceColumns.ts","../src/data-service/deviceFieldOwners.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/clipboardErrors.ts","../src/device-managers/deviceIdentity.ts","../src/device-managers/iOSTracker.ts","../src/device-managers/index.ts","../src/device-managers/localDeviceHosts.ts","../src/device-managers/ownDeviceRow.ts","../src/device-managers/android/AndroidH264StreamService.ts","../src/device-managers/android/AndroidStreamService.ts","../src/device-managers/android/DeviceLockManager.ts","../src/device-managers/android/H264Multiplexer.ts","../src/device-managers/android/LogcatMultiplexer.ts","../src/device-managers/android/LogcatStreamService.ts","../src/device-managers/android/ScrcpyServerSession.ts","../src/device-managers/android/androidIdentity.ts","../src/device-managers/android/androidStreamReuse.ts","../src/device-managers/android/clipboardBroadcast.ts","../src/device-managers/android/displayState.ts","../src/device-managers/android/h264NalParser.ts","../src/device-managers/android/previewHold.ts","../src/device-managers/android/scrcpyVersion.ts","../src/device-managers/cloud/CapabilityManager.ts","../src/device-managers/cloud/Devices.ts","../src/device-managers/ios/IOSDiscoveryService.ts","../src/device-managers/ios/IOSLogStreamService.ts","../src/device-managers/ios/IOSStreamService.ts","../src/device-managers/ios/IOSTunnels.ts","../src/device-managers/ios/WDAClient.ts","../src/device-managers/ios/appleIdentity.ts","../src/device-managers/ios/goIosBinary.ts","../src/device-managers/ios/iosAppIds.ts","../src/device-managers/ios/iosBattery.ts","../src/device-managers/ios/iosStreamDiagnostics.ts","../src/device-managers/ios/tunnelProcess.ts","../src/device-managers/ios/usbmuxd.ts","../src/enums/Capabilities.ts","../src/enums/Cloud.ts","../src/enums/Platform.ts","../src/enums/SessionType.ts","../src/enums/SocketEvents.ts","../src/gateway/createHandoff.ts","../src/gateway/defaultGateway.ts","../src/gateway/forwardToNode.ts","../src/gateway/hubSessionToken.ts","../src/gateway/internalCall.ts","../src/gateway/nodeSessionMetrics.ts","../src/gateway/nodeSessionStatus.ts","../src/gateway/nodeWebDriverUrl.ts","../src/gateway/sessionCreate.ts","../src/gateway/sessionGateway.ts","../src/gateway/sessionLocator.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/ffmpegPath.ts","../src/helpers/index.ts","../src/helpers/networkAddresses.ts","../src/helpers/singleFlight.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/commandAuth.ts","../src/middleware/commandCaller.ts","../src/middleware/controlDevice.ts","../src/middleware/csrfMiddleware.ts","../src/middleware/deviceAccessGuard.ts","../src/middleware/deviceTeamGuard.ts","../src/middleware/leaseTokenMiddleware.ts","../src/middleware/loginRateLimiter.ts","../src/middleware/rateLimitMiddleware.ts","../src/middleware/roleGuard.ts","../src/middleware/scopeGuard.ts","../src/middleware/sessionListingFilter.ts","../src/middleware/sessionUpgradeGuard.ts","../src/middleware/verifyCredential.ts","../src/scripts/generate-database-migration.ts","../src/scripts/goIosVersion.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/DisplayStateService.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/fillMissingScreenSize.ts","../src/services/passwordResetLink.ts","../src/services/passwordResetMode.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/device-access/DeviceTeamResolver.ts","../src/services/device-access/LiveSessionOwners.ts","../src/services/device-access/SessionOwnerResolver.ts","../src/services/device-access/actor.ts","../src/services/device-access/appVisibility.ts","../src/services/device-access/callerTeamIds.ts","../src/services/device-access/deviceAccessPolicy.ts","../src/services/device-access/deviceVisibility.ts","../src/services/device-access/leaseOverride.ts","../src/services/device-access/queueVisibility.ts","../src/services/device-access/sessionVisibility.ts","../src/services/device-access/ticketActorAccess.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/inspector/verifyLocator.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/leaseSessionCaps.ts","../src/services/lease/leaseToken.ts","../src/services/logcat/PackageResolver.ts","../src/services/logcat/logSource.ts","../src/services/logcat/logcatParse.ts","../src/services/logcat/ostraceParse.ts","../src/services/metrics/AndroidMetricsSampler.ts","../src/services/metrics/IOSMetricsSampler.ts","../src/services/metrics/NodeMetricsCollector.ts","../src/services/metrics/NodeMetricsStore.ts","../src/services/metrics/SessionMetricsService.ts","../src/services/metrics/androidMetrics.ts","../src/services/metrics/iosMetrics.ts","../src/services/metrics/metricsBody.ts","../src/services/metrics/nodeMetrics.ts","../src/services/metrics/types.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/activeRecordings.ts","../src/services/recording/annotation-render.ts","../src/services/recording/annotationImage.ts","../src/services/recording/busy-precheck.ts","../src/services/recording/concurrency-gate.ts","../src/services/recording/ensureMjpegForRecording.ts","../src/services/recording/manualLock.ts","../src/services/recording/nodeRecordingSource.ts","../src/services/recording/probeDuration.ts","../src/services/recording/proof-bundle.ts","../src/services/recording/recording-store.ts","../src/services/recording/recordingCleanup.ts","../src/services/recording/recordingFiles.ts","../src/services/recording/recordingSummary.ts","../src/services/recording/recordingTiming.ts","../src/services/selector-health/access.ts","../src/services/selector-health/healingTrend.ts","../src/services/selector-health/people.ts","../src/services/selector-health/selectorDetail.ts","../src/services/selector-health/selectorKeys.ts","../src/services/selector-health/selectorList.ts","../src/services/selector-health/stateView.ts","../src/services/session/appCapability.ts","../src/services/session/nodeCreateCaps.ts","../src/services/session/sessionCredentials.ts","../src/services/session/sessionIdentity.ts","../src/services/session/xenonOptions.ts","../src/services/telemetry/attributes.ts","../src/services/token/AppDownloadTicketService.ts","../src/services/token/JwtKeyService.ts","../src/services/token/StreamTicketService.ts","../src/services/token/mcpScopes.ts","../src/services/token/singleUseLedger.ts","../src/sessions/CloudSession.ts","../src/sessions/LocalSession.ts","../src/sessions/RemoteSession.ts","../src/sessions/SessionManager.ts","../src/sessions/XenonSession.ts","../src/sessions/appiumUmbrella.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/appium-umbrella.ts","../test/helpers/artifact-store.ts","../test/helpers/container-registration.ts","../test/helpers/expressRoutes.ts","../test/helpers/fake-device-table.ts","../test/helpers/loki-stores.ts","../test/helpers/loopbackRequest.ts","../test/helpers/loopbackServer.ts","../test/helpers/own-node-id.ts","../test/helpers/scratch-database.ts","../test/helpers/scratch-port-leases.ts","../test/helpers/seedUser.ts","../test/helpers/selector-health-fixture.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/prisma-device-store-add-devices.spec.ts","../test/integration/prisma-device-store-team-filter.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-apps.spec.ts","../test/integration/team-visibility-control.spec.ts","../test/integration/team-visibility-dashboard.spec.ts","../test/integration/team-visibility-grid.spec.ts","../test/integration/team-visibility-leases.spec.ts","../test/integration/team-visibility-recordings.spec.ts","../test/integration/team-visibility-sessions.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/setup/scratch-default-database.js","../test/unit/AndroidDeviceManager.spec.ts","../test/unit/ApiKeyService.test.ts","../test/unit/AppDownloadTicketService.spec.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/access-scopes.spec.ts","../test/unit/active-recordings.spec.ts","../test/unit/aggregate-hotspots-session-scope.spec.ts","../test/unit/aggregate-hotspots-tuple-key.spec.ts","../test/unit/android-clipboard.spec.ts","../test/unit/android-h264-config.spec.ts","../test/unit/android-h264-service.spec.ts","../test/unit/android-identity.spec.ts","../test/unit/android-preview-hold.spec.ts","../test/unit/android-stream-adb-path.spec.ts","../test/unit/android-stream-encoder.spec.ts","../test/unit/android-stream-fast-start.spec.ts","../test/unit/android-stream-release.spec.ts","../test/unit/android-stream-reuse-service.spec.ts","../test/unit/android-stream-reuse.spec.ts","../test/unit/android-stream-stall-eof.spec.ts","../test/unit/annotation-image.spec.ts","../test/unit/annotation-render.spec.ts","../test/unit/api-error-handling.spec.ts","../test/unit/apple-identity.spec.ts","../test/unit/apps-download.spec.ts","../test/unit/apps-team-visibility.spec.ts","../test/unit/auth-disabled-resolution.spec.ts","../test/unit/auth-me-auth-disabled.test.ts","../test/unit/authMiddleware.appTicket.spec.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/boot-go-ios-reap.spec.ts","../test/unit/bootstrap-identity.test.ts","../test/unit/build-export.spec.ts","../test/unit/busy-precheck.spec.ts","../test/unit/cliargs-admin-only.spec.ts","../test/unit/clipboard-route.spec.ts","../test/unit/command-auth-appium-server.spec.ts","../test/unit/command-auth.spec.ts","../test/unit/command-caller.spec.ts","../test/unit/commands.spec.js","../test/unit/composite-geometry.spec.ts","../test/unit/concurrency-gate.spec.ts","../test/unit/config.spec.js","../test/unit/container-registration.spec.ts","../test/unit/control-device-lookup.spec.ts","../test/unit/control-forward-decision.spec.ts","../test/unit/control-honest-answers.spec.ts","../test/unit/control-lookup-failure.spec.ts","../test/unit/create-error-message.spec.ts","../test/unit/create-handoff.spec.ts","../test/unit/dashboard-events-metrics.spec.ts","../test/unit/dashboard-events-team-scope.spec.ts","../test/unit/device-access-guard.spec.ts","../test/unit/device-access-policy.spec.ts","../test/unit/device-allocation-routes.spec.ts","../test/unit/device-columns.spec.ts","../test/unit/device-service.spec.ts","../test/unit/device-store-clear-at-boot.spec.ts","../test/unit/device-sync-lost-update.spec.ts","../test/unit/device-team-guard.spec.ts","../test/unit/device-team-resolver.spec.ts","../test/unit/device-utils.spec.ts","../test/unit/display-state.spec.ts","../test/unit/enrich-devices-team-names.test.ts","../test/unit/event-manager-regression-hook.spec.ts","../test/unit/extract-access-key-token-pair.test.ts","../test/unit/extract-team-cap.spec.ts","../test/unit/ffmpeg-path.spec.ts","../test/unit/fill-missing-screen-size.spec.ts","../test/unit/findAndLockDevice-leasemerge.spec.ts","../test/unit/go-ios-version.spec.ts","../test/unit/grid-admin-only.spec.ts","../test/unit/h264-multiplexer.spec.ts","../test/unit/h264-nal-parser.spec.ts","../test/unit/h264-ws-frame.spec.ts","../test/unit/healing-instrumentation.spec.ts","../test/unit/healing-no-cost.spec.ts","../test/unit/healing-state-endpoints.spec.ts","../test/unit/healing-tier-gate.spec.ts","../test/unit/healing-trend.spec.ts","../test/unit/health-monitor-own-phones.spec.ts","../test/unit/health-monitor-stream-lookup.spec.ts","../test/unit/helpers.spec.ts","../test/unit/hub-boot-sweep-recovery.spec.ts","../test/unit/hub-create-once.spec.ts","../test/unit/hub-create-session-umbrella.spec.ts","../test/unit/hub-gateway-create-appium-server.spec.ts","../test/unit/hub-node-control-forward.spec.ts","../test/unit/hub-node-gateway-appium-server.spec.ts","../test/unit/hub-node-race.spec.ts","../test/unit/hub-node-same-host.spec.ts","../test/unit/hub-node-session-metrics.spec.ts","../test/unit/hub-register-removal.spec.ts","../test/unit/hub-remote-session-heartbeat.spec.ts","../test/unit/hub-routed-session-recovery.spec.ts","../test/unit/hub-session-token.spec.ts","../test/unit/insert-before-routes.spec.ts","../test/unit/inspector-hierarchy.spec.ts","../test/unit/install-repository-app-team.spec.ts","../test/unit/internal-call.spec.ts","../test/unit/ios-discovery-same-host.spec.ts","../test/unit/ios-go-ios-tunnel-env.spec.ts","../test/unit/ios-idle-hold.spec.ts","../test/unit/ios-no-network-fallback.spec.ts","../test/unit/ios-stream-appium-tunnel.spec.ts","../test/unit/ios-stream-port-leases.spec.ts","../test/unit/ios-stream-port.spec.ts","../test/unit/ios-tunnel-process.spec.ts","../test/unit/ios-tunnels.spec.ts","../test/unit/ios-usbmuxd-missing.spec.ts","../test/unit/ios-wda-status-identity.spec.ts","../test/unit/iosBattery.spec.ts","../test/unit/iosStreamDiagnostics.spec.ts","../test/unit/is-xenon-running.spec.ts","../test/unit/logcat-multiplexer.spec.ts","../test/unit/logcat-parse.spec.ts","../test/unit/logcat-stream-service.spec.ts","../test/unit/logcat-ws.spec.ts","../test/unit/loginRateLimiter.test.ts","../test/unit/loopback-request.spec.ts","../test/unit/manualLock.test.ts","../test/unit/mark-node-busy-loki.spec.ts","../test/unit/mjpeg-proxy-cache.spec.ts","../test/unit/network-addresses.test.ts","../test/unit/node-create-caps.spec.ts","../test/unit/node-gateway-create-appium-server.spec.ts","../test/unit/node-hub-session-owner.spec.ts","../test/unit/node-metrics-collector.spec.ts","../test/unit/node-metrics-store.spec.ts","../test/unit/node-phone-control.spec.ts","../test/unit/node-recording-relay.spec.ts","../test/unit/node-session-metrics-route.spec.ts","../test/unit/node-socket-relay.spec.ts","../test/unit/normalize-eol.spec.js","../test/unit/omni-vision-failures.spec.ts","../test/unit/omni-vision.spec.ts","../test/unit/openapi-coverage.spec.ts","../test/unit/ostrace-parse.spec.ts","../test/unit/package-resolver.spec.ts","../test/unit/passwordResetMode.test.ts","../test/unit/plugin.spec.ts","../test/unit/port-allocator-os-probe.spec.ts","../test/unit/port-allocator-pairs.spec.ts","../test/unit/port-exhaustion.spec.ts","../test/unit/prisma.spec.ts","../test/unit/probe-duration.spec.ts","../test/unit/profile-router.test.ts","../test/unit/profileIdentity.spec.ts","../test/unit/proof-bundle.spec.ts","../test/unit/queue-requester.spec.ts","../test/unit/queue-team-scope-routes.spec.ts","../test/unit/queue-visibility.spec.ts","../test/unit/rateLimitMiddleware.test.ts","../test/unit/recording-cleanup.spec.ts","../test/unit/recording-downloads-visibility.spec.ts","../test/unit/recording-files.spec.ts","../test/unit/recording-instrumentation.spec.ts","../test/unit/recording-orchestrator.spec.ts","../test/unit/recording-requests.spec.ts","../test/unit/recording-source-ended.spec.ts","../test/unit/recording-store.spec.ts","../test/unit/recording-summary.spec.ts","../test/unit/recording-timing.spec.ts","../test/unit/recordings-library-routes.spec.ts","../test/unit/recordings-write-visibility.spec.ts","../test/unit/remote-session-create.spec.ts","../test/unit/remux-to-standard-mp4.spec.ts","../test/unit/reservation-team-visibility.spec.ts","../test/unit/reset-link.test.ts","../test/unit/roleGuard.test.ts","../test/unit/run-migrations-fail-fast.test.ts","../test/unit/run-migrations.test.ts","../test/unit/schema-required-args.spec.ts","../test/unit/scrcpy-server-session.spec.ts","../test/unit/scrcpy-version.spec.ts","../test/unit/screenshot-route.spec.ts","../test/unit/selector-event-model.spec.ts","../test/unit/selector-health-actions.spec.ts","../test/unit/selector-health-detail.spec.ts","../test/unit/selector-health-list.spec.ts","../test/unit/selector-state-service.spec.ts","../test/unit/selector-verification-job.spec.ts","../test/unit/selector-verification-missed-regression.spec.ts","../test/unit/session-app-resolution.spec.ts","../test/unit/session-assets.spec.ts","../test/unit/session-attribution-wiring.spec.ts","../test/unit/session-create-layer.spec.ts","../test/unit/session-credential-strip.spec.ts","../test/unit/session-credentials.spec.ts","../test/unit/session-identity.spec.ts","../test/unit/session-list-insights.spec.ts","../test/unit/session-listing-auth.spec.ts","../test/unit/session-locator.spec.ts","../test/unit/session-log-indexes.spec.ts","../test/unit/session-metrics-lifecycle.spec.ts","../test/unit/session-metrics-parse.spec.ts","../test/unit/session-metrics-route.spec.ts","../test/unit/session-metrics-samplers.spec.ts","../test/unit/session-metrics-service.spec.ts","../test/unit/session-node-calls.spec.ts","../test/unit/session-owner-resolver.spec.ts","../test/unit/session-recovery-metrics.spec.ts","../test/unit/session-recovery-routing.spec.ts","../test/unit/session-upgrade-guard.spec.ts","../test/unit/session-visibility.spec.ts","../test/unit/shutdown-drain-remote.spec.ts","../test/unit/shutdown-sync-nets.spec.ts","../test/unit/single-flight.spec.ts","../test/unit/socket-team-scope.integration.spec.ts","../test/unit/socketServer.bearer.spec.ts","../test/unit/socketServer.scopedEmit.spec.ts","../test/unit/socketServer.sessionCookie.spec.ts","../test/unit/stored-session-capabilities.spec.ts","../test/unit/stream-leave-route.spec.ts","../test/unit/stream-leave.spec.ts","../test/unit/stream-own-device-row.spec.ts","../test/unit/stream-start-conflict.spec.ts","../test/unit/stream-status-type.spec.ts","../test/unit/stream-stop-ownership.spec.ts","../test/unit/stream-stop-recording.spec.ts","../test/unit/stream-ticket-identity.spec.ts","../test/unit/stream-viewer-hangup.spec.ts","../test/unit/stream-watchdog-timers.spec.ts","../test/unit/sync-dir.spec.ts","../test/unit/team-filter.test.ts","../test/unit/tracing-service-init.spec.ts","../test/unit/upgrade-router.spec.ts","../test/unit/upload-install-route.spec.ts","../test/unit/userAuthorization.test.ts","../test/unit/users-router.test.ts","../test/unit/verify-credential.spec.ts","../test/unit/verify-locator.spec.ts","../test/unit/video-pipeline-args.spec.ts","../test/unit/video-pipeline-exit.spec.ts","../test/unit/video-pipeline-outputpath.spec.ts","../test/unit/wda-cap-injection.spec.ts","../test/unit/wda-client-failures.spec.ts","../test/unit/wda-client-session.spec.ts","../test/unit/wda-clipboard-write.spec.ts","../test/unit/webdriver-info-route.spec.ts","../test/unit/webhook-delivery.spec.ts","../test/unit/ws-upgrade-routing-appium-server.spec.ts","../test/unit/xenon-options.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/allocate-lease-branch.spec.ts","../test/unit/lease/buildCapabilityBag.spec.ts","../test/unit/lease/lease-device-match.spec.ts","../test/unit/lease/lease-override.spec.ts","../test/unit/lease/lease-reap-held-phone.spec.ts","../test/unit/lease/lease-session-ownership.spec.ts","../test/unit/lease/lease-sweeper-expiry.spec.ts","../test/unit/lease/lease-team-visibility.spec.ts","../test/unit/lease/lease-token-log-filter.spec.ts","../test/unit/lease/lease-token-oracle.spec.ts","../test/unit/lease/leaseToken.spec.ts","../test/unit/lease/nodePairAuth.spec.ts","../test/unit/lease/session-lease-proof.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/apiErrors.ts","../src/app/appiumBasePath.ts","../src/app/index.ts","../src/app/insertBeforeRoutes.ts","../src/app/registerCommandAuth.ts","../src/app/swagger.ts","../src/app/routers/androidH264Config.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/iosStreamPort.ts","../src/app/routers/nodePhoneControl.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/recordingRequests.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/selector-health.ts","../src/app/routers/sessionInsights.ts","../src/app/routers/streamLeave.ts","../src/app/routers/streamStartConflict.ts","../src/app/routers/streamType.ts","../src/app/routers/teams.ts","../src/app/routers/users.ts","../src/app/routers/webhook.ts","../src/app/ws/h264StreamWs.ts","../src/app/ws/logcatWs.ts","../src/app/ws/nodeSocketRelay.ts","../src/app/ws/upgradeRouter.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/deviceClaims.ts","../src/data-service/deviceColumns.ts","../src/data-service/deviceFieldOwners.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/clipboardErrors.ts","../src/device-managers/deviceIdentity.ts","../src/device-managers/iOSTracker.ts","../src/device-managers/index.ts","../src/device-managers/localDeviceHosts.ts","../src/device-managers/ownDeviceRow.ts","../src/device-managers/android/AndroidH264StreamService.ts","../src/device-managers/android/AndroidStreamService.ts","../src/device-managers/android/DeviceLockManager.ts","../src/device-managers/android/H264Multiplexer.ts","../src/device-managers/android/LogcatMultiplexer.ts","../src/device-managers/android/LogcatStreamService.ts","../src/device-managers/android/ScrcpyServerSession.ts","../src/device-managers/android/androidIdentity.ts","../src/device-managers/android/androidStreamReuse.ts","../src/device-managers/android/clipboardBroadcast.ts","../src/device-managers/android/displayState.ts","../src/device-managers/android/h264NalParser.ts","../src/device-managers/android/previewHold.ts","../src/device-managers/android/scrcpyVersion.ts","../src/device-managers/cloud/CapabilityManager.ts","../src/device-managers/cloud/Devices.ts","../src/device-managers/ios/IOSDiscoveryService.ts","../src/device-managers/ios/IOSLogStreamService.ts","../src/device-managers/ios/IOSStreamService.ts","../src/device-managers/ios/IOSTunnels.ts","../src/device-managers/ios/WDAClient.ts","../src/device-managers/ios/appleIdentity.ts","../src/device-managers/ios/goIosBinary.ts","../src/device-managers/ios/iosAppIds.ts","../src/device-managers/ios/iosBattery.ts","../src/device-managers/ios/iosStreamDiagnostics.ts","../src/device-managers/ios/tunnelProcess.ts","../src/device-managers/ios/usbmuxd.ts","../src/enums/Capabilities.ts","../src/enums/Cloud.ts","../src/enums/Platform.ts","../src/enums/SessionType.ts","../src/enums/SocketEvents.ts","../src/gateway/createHandoff.ts","../src/gateway/defaultGateway.ts","../src/gateway/forwardToNode.ts","../src/gateway/hubSessionToken.ts","../src/gateway/internalCall.ts","../src/gateway/nodeSessionMetrics.ts","../src/gateway/nodeSessionStatus.ts","../src/gateway/nodeWebDriverUrl.ts","../src/gateway/sessionCreate.ts","../src/gateway/sessionGateway.ts","../src/gateway/sessionLocator.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/ffmpegPath.ts","../src/helpers/index.ts","../src/helpers/networkAddresses.ts","../src/helpers/singleFlight.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/commandAuth.ts","../src/middleware/commandCaller.ts","../src/middleware/controlDevice.ts","../src/middleware/csrfMiddleware.ts","../src/middleware/deviceAccessGuard.ts","../src/middleware/deviceTeamGuard.ts","../src/middleware/leaseTokenMiddleware.ts","../src/middleware/loginRateLimiter.ts","../src/middleware/rateLimitMiddleware.ts","../src/middleware/roleGuard.ts","../src/middleware/scopeGuard.ts","../src/middleware/sessionListingFilter.ts","../src/middleware/sessionUpgradeGuard.ts","../src/middleware/verifyCredential.ts","../src/scripts/generate-database-migration.ts","../src/scripts/goIosVersion.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/DisplayStateService.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/fillMissingScreenSize.ts","../src/services/passwordResetLink.ts","../src/services/passwordResetMode.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/device-access/DeviceTeamResolver.ts","../src/services/device-access/LiveSessionOwners.ts","../src/services/device-access/SessionOwnerResolver.ts","../src/services/device-access/actor.ts","../src/services/device-access/appVisibility.ts","../src/services/device-access/callerTeamIds.ts","../src/services/device-access/deviceAccessPolicy.ts","../src/services/device-access/deviceVisibility.ts","../src/services/device-access/leaseHold.ts","../src/services/device-access/leaseOverride.ts","../src/services/device-access/queueVisibility.ts","../src/services/device-access/sessionVisibility.ts","../src/services/device-access/ticketActorAccess.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/inspector/verifyLocator.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/activeLeases.ts","../src/services/lease/buildCapabilityBag.ts","../src/services/lease/leaseSessionCaps.ts","../src/services/lease/leaseToken.ts","../src/services/logcat/PackageResolver.ts","../src/services/logcat/logSource.ts","../src/services/logcat/logcatParse.ts","../src/services/logcat/ostraceParse.ts","../src/services/metrics/AndroidMetricsSampler.ts","../src/services/metrics/IOSMetricsSampler.ts","../src/services/metrics/NodeMetricsCollector.ts","../src/services/metrics/NodeMetricsStore.ts","../src/services/metrics/SessionMetricsService.ts","../src/services/metrics/androidMetrics.ts","../src/services/metrics/iosMetrics.ts","../src/services/metrics/metricsBody.ts","../src/services/metrics/nodeMetrics.ts","../src/services/metrics/types.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/activeRecordings.ts","../src/services/recording/annotation-render.ts","../src/services/recording/annotationImage.ts","../src/services/recording/busy-precheck.ts","../src/services/recording/concurrency-gate.ts","../src/services/recording/ensureMjpegForRecording.ts","../src/services/recording/manualLock.ts","../src/services/recording/nodeRecordingSource.ts","../src/services/recording/probeDuration.ts","../src/services/recording/proof-bundle.ts","../src/services/recording/recording-store.ts","../src/services/recording/recordingCleanup.ts","../src/services/recording/recordingFiles.ts","../src/services/recording/recordingSummary.ts","../src/services/recording/recordingTiming.ts","../src/services/selector-health/access.ts","../src/services/selector-health/healingTrend.ts","../src/services/selector-health/people.ts","../src/services/selector-health/selectorDetail.ts","../src/services/selector-health/selectorKeys.ts","../src/services/selector-health/selectorList.ts","../src/services/selector-health/stateView.ts","../src/services/session/appCapability.ts","../src/services/session/nodeCreateCaps.ts","../src/services/session/sessionCredentials.ts","../src/services/session/sessionIdentity.ts","../src/services/session/xenonOptions.ts","../src/services/telemetry/attributes.ts","../src/services/token/AppDownloadTicketService.ts","../src/services/token/JwtKeyService.ts","../src/services/token/StreamTicketService.ts","../src/services/token/mcpScopes.ts","../src/services/token/singleUseLedger.ts","../src/sessions/CloudSession.ts","../src/sessions/LocalSession.ts","../src/sessions/RemoteSession.ts","../src/sessions/SessionManager.ts","../src/sessions/XenonSession.ts","../src/sessions/appiumUmbrella.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/appium-umbrella.ts","../test/helpers/artifact-store.ts","../test/helpers/container-registration.ts","../test/helpers/expressRoutes.ts","../test/helpers/fake-device-table.ts","../test/helpers/loki-stores.ts","../test/helpers/loopbackRequest.ts","../test/helpers/loopbackServer.ts","../test/helpers/own-node-id.ts","../test/helpers/scratch-database.ts","../test/helpers/scratch-port-leases.ts","../test/helpers/seedUser.ts","../test/helpers/selector-health-fixture.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/prisma-device-store-add-devices.spec.ts","../test/integration/prisma-device-store-team-filter.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-apps.spec.ts","../test/integration/team-visibility-control.spec.ts","../test/integration/team-visibility-dashboard.spec.ts","../test/integration/team-visibility-grid.spec.ts","../test/integration/team-visibility-leases.spec.ts","../test/integration/team-visibility-recordings.spec.ts","../test/integration/team-visibility-sessions.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/setup/scratch-default-database.js","../test/unit/AndroidDeviceManager.spec.ts","../test/unit/ApiKeyService.test.ts","../test/unit/AppDownloadTicketService.spec.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/access-scopes.spec.ts","../test/unit/active-recordings.spec.ts","../test/unit/aggregate-hotspots-session-scope.spec.ts","../test/unit/aggregate-hotspots-tuple-key.spec.ts","../test/unit/android-clipboard.spec.ts","../test/unit/android-h264-config.spec.ts","../test/unit/android-h264-service.spec.ts","../test/unit/android-identity.spec.ts","../test/unit/android-preview-hold.spec.ts","../test/unit/android-stream-adb-path.spec.ts","../test/unit/android-stream-encoder.spec.ts","../test/unit/android-stream-fast-start.spec.ts","../test/unit/android-stream-release.spec.ts","../test/unit/android-stream-reuse-service.spec.ts","../test/unit/android-stream-reuse.spec.ts","../test/unit/android-stream-stall-eof.spec.ts","../test/unit/annotation-image.spec.ts","../test/unit/annotation-render.spec.ts","../test/unit/api-error-handling.spec.ts","../test/unit/apple-identity.spec.ts","../test/unit/apps-download.spec.ts","../test/unit/apps-team-visibility.spec.ts","../test/unit/auth-disabled-resolution.spec.ts","../test/unit/auth-me-auth-disabled.test.ts","../test/unit/authMiddleware.appTicket.spec.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/boot-go-ios-reap.spec.ts","../test/unit/bootstrap-identity.test.ts","../test/unit/build-export.spec.ts","../test/unit/busy-precheck.spec.ts","../test/unit/cliargs-admin-only.spec.ts","../test/unit/clipboard-route.spec.ts","../test/unit/command-auth-appium-server.spec.ts","../test/unit/command-auth.spec.ts","../test/unit/command-caller.spec.ts","../test/unit/commands.spec.js","../test/unit/composite-geometry.spec.ts","../test/unit/concurrency-gate.spec.ts","../test/unit/config.spec.js","../test/unit/container-registration.spec.ts","../test/unit/control-device-lookup.spec.ts","../test/unit/control-forward-decision.spec.ts","../test/unit/control-honest-answers.spec.ts","../test/unit/control-lookup-failure.spec.ts","../test/unit/create-error-message.spec.ts","../test/unit/create-handoff.spec.ts","../test/unit/dashboard-events-metrics.spec.ts","../test/unit/dashboard-events-team-scope.spec.ts","../test/unit/device-access-guard.spec.ts","../test/unit/device-access-lease.spec.ts","../test/unit/device-access-policy.spec.ts","../test/unit/device-allocation-routes.spec.ts","../test/unit/device-columns.spec.ts","../test/unit/device-service.spec.ts","../test/unit/device-store-clear-at-boot.spec.ts","../test/unit/device-sync-lost-update.spec.ts","../test/unit/device-team-guard.spec.ts","../test/unit/device-team-resolver.spec.ts","../test/unit/device-utils.spec.ts","../test/unit/display-state.spec.ts","../test/unit/enrich-devices-team-names.test.ts","../test/unit/event-manager-regression-hook.spec.ts","../test/unit/extract-access-key-token-pair.test.ts","../test/unit/extract-team-cap.spec.ts","../test/unit/ffmpeg-path.spec.ts","../test/unit/fill-missing-screen-size.spec.ts","../test/unit/findAndLockDevice-leasemerge.spec.ts","../test/unit/go-ios-version.spec.ts","../test/unit/grid-admin-only.spec.ts","../test/unit/h264-multiplexer.spec.ts","../test/unit/h264-nal-parser.spec.ts","../test/unit/h264-ws-frame.spec.ts","../test/unit/healing-instrumentation.spec.ts","../test/unit/healing-no-cost.spec.ts","../test/unit/healing-state-endpoints.spec.ts","../test/unit/healing-tier-gate.spec.ts","../test/unit/healing-trend.spec.ts","../test/unit/health-monitor-own-phones.spec.ts","../test/unit/health-monitor-stream-lookup.spec.ts","../test/unit/helpers.spec.ts","../test/unit/hub-boot-sweep-recovery.spec.ts","../test/unit/hub-create-once.spec.ts","../test/unit/hub-create-session-umbrella.spec.ts","../test/unit/hub-gateway-create-appium-server.spec.ts","../test/unit/hub-node-control-forward.spec.ts","../test/unit/hub-node-gateway-appium-server.spec.ts","../test/unit/hub-node-race.spec.ts","../test/unit/hub-node-same-host.spec.ts","../test/unit/hub-node-session-metrics.spec.ts","../test/unit/hub-register-removal.spec.ts","../test/unit/hub-remote-session-heartbeat.spec.ts","../test/unit/hub-routed-session-recovery.spec.ts","../test/unit/hub-session-token.spec.ts","../test/unit/insert-before-routes.spec.ts","../test/unit/inspector-hierarchy.spec.ts","../test/unit/install-repository-app-team.spec.ts","../test/unit/internal-call.spec.ts","../test/unit/ios-discovery-same-host.spec.ts","../test/unit/ios-go-ios-tunnel-env.spec.ts","../test/unit/ios-idle-hold.spec.ts","../test/unit/ios-no-network-fallback.spec.ts","../test/unit/ios-stream-appium-tunnel.spec.ts","../test/unit/ios-stream-port-leases.spec.ts","../test/unit/ios-stream-port.spec.ts","../test/unit/ios-tunnel-process.spec.ts","../test/unit/ios-tunnels.spec.ts","../test/unit/ios-usbmuxd-missing.spec.ts","../test/unit/ios-wda-status-identity.spec.ts","../test/unit/iosBattery.spec.ts","../test/unit/iosStreamDiagnostics.spec.ts","../test/unit/is-xenon-running.spec.ts","../test/unit/lease-held-phone.spec.ts","../test/unit/logcat-multiplexer.spec.ts","../test/unit/logcat-parse.spec.ts","../test/unit/logcat-stream-service.spec.ts","../test/unit/logcat-ws.spec.ts","../test/unit/loginRateLimiter.test.ts","../test/unit/loopback-request.spec.ts","../test/unit/manualLock.test.ts","../test/unit/mark-node-busy-loki.spec.ts","../test/unit/mjpeg-proxy-cache.spec.ts","../test/unit/network-addresses.test.ts","../test/unit/node-create-caps.spec.ts","../test/unit/node-gateway-create-appium-server.spec.ts","../test/unit/node-hub-session-owner.spec.ts","../test/unit/node-metrics-collector.spec.ts","../test/unit/node-metrics-store.spec.ts","../test/unit/node-phone-control.spec.ts","../test/unit/node-recording-relay.spec.ts","../test/unit/node-session-metrics-route.spec.ts","../test/unit/node-socket-relay.spec.ts","../test/unit/normalize-eol.spec.js","../test/unit/omni-vision-failures.spec.ts","../test/unit/omni-vision.spec.ts","../test/unit/openapi-coverage.spec.ts","../test/unit/ostrace-parse.spec.ts","../test/unit/package-resolver.spec.ts","../test/unit/partial-config-file.spec.ts","../test/unit/passwordResetMode.test.ts","../test/unit/plugin.spec.ts","../test/unit/port-allocator-os-probe.spec.ts","../test/unit/port-allocator-pairs.spec.ts","../test/unit/port-exhaustion.spec.ts","../test/unit/prisma.spec.ts","../test/unit/probe-duration.spec.ts","../test/unit/profile-router.test.ts","../test/unit/profileIdentity.spec.ts","../test/unit/proof-bundle.spec.ts","../test/unit/queue-requester.spec.ts","../test/unit/queue-team-scope-routes.spec.ts","../test/unit/queue-visibility.spec.ts","../test/unit/rateLimitMiddleware.test.ts","../test/unit/recording-cleanup.spec.ts","../test/unit/recording-downloads-visibility.spec.ts","../test/unit/recording-files.spec.ts","../test/unit/recording-instrumentation.spec.ts","../test/unit/recording-orchestrator.spec.ts","../test/unit/recording-requests.spec.ts","../test/unit/recording-source-ended.spec.ts","../test/unit/recording-store.spec.ts","../test/unit/recording-summary.spec.ts","../test/unit/recording-timing.spec.ts","../test/unit/recordings-library-routes.spec.ts","../test/unit/recordings-write-visibility.spec.ts","../test/unit/remote-session-create.spec.ts","../test/unit/remux-to-standard-mp4.spec.ts","../test/unit/reservation-team-visibility.spec.ts","../test/unit/reset-link.test.ts","../test/unit/roleGuard.test.ts","../test/unit/run-migrations-fail-fast.test.ts","../test/unit/run-migrations.test.ts","../test/unit/schema-required-args.spec.ts","../test/unit/scrcpy-server-session.spec.ts","../test/unit/scrcpy-version.spec.ts","../test/unit/screenshot-route.spec.ts","../test/unit/selector-event-model.spec.ts","../test/unit/selector-health-actions.spec.ts","../test/unit/selector-health-detail.spec.ts","../test/unit/selector-health-list.spec.ts","../test/unit/selector-state-service.spec.ts","../test/unit/selector-verification-job.spec.ts","../test/unit/selector-verification-missed-regression.spec.ts","../test/unit/session-app-resolution.spec.ts","../test/unit/session-assets.spec.ts","../test/unit/session-attribution-wiring.spec.ts","../test/unit/session-create-layer.spec.ts","../test/unit/session-credential-strip.spec.ts","../test/unit/session-credentials.spec.ts","../test/unit/session-identity.spec.ts","../test/unit/session-list-insights.spec.ts","../test/unit/session-listing-auth.spec.ts","../test/unit/session-locator.spec.ts","../test/unit/session-log-indexes.spec.ts","../test/unit/session-metrics-lifecycle.spec.ts","../test/unit/session-metrics-parse.spec.ts","../test/unit/session-metrics-route.spec.ts","../test/unit/session-metrics-samplers.spec.ts","../test/unit/session-metrics-service.spec.ts","../test/unit/session-node-calls.spec.ts","../test/unit/session-owner-resolver.spec.ts","../test/unit/session-recovery-metrics.spec.ts","../test/unit/session-recovery-routing.spec.ts","../test/unit/session-upgrade-guard.spec.ts","../test/unit/session-visibility.spec.ts","../test/unit/shutdown-drain-remote.spec.ts","../test/unit/shutdown-sync-nets.spec.ts","../test/unit/single-flight.spec.ts","../test/unit/socket-team-scope.integration.spec.ts","../test/unit/socketServer.bearer.spec.ts","../test/unit/socketServer.scopedEmit.spec.ts","../test/unit/socketServer.sessionCookie.spec.ts","../test/unit/stored-session-capabilities.spec.ts","../test/unit/stream-leave-route.spec.ts","../test/unit/stream-leave.spec.ts","../test/unit/stream-own-device-row.spec.ts","../test/unit/stream-start-conflict.spec.ts","../test/unit/stream-status-type.spec.ts","../test/unit/stream-stop-ownership.spec.ts","../test/unit/stream-stop-recording.spec.ts","../test/unit/stream-ticket-identity.spec.ts","../test/unit/stream-viewer-hangup.spec.ts","../test/unit/stream-watchdog-timers.spec.ts","../test/unit/sync-dir.spec.ts","../test/unit/team-filter.test.ts","../test/unit/tracing-service-init.spec.ts","../test/unit/upgrade-router.spec.ts","../test/unit/upload-install-route.spec.ts","../test/unit/userAuthorization.test.ts","../test/unit/users-router.test.ts","../test/unit/verify-credential.spec.ts","../test/unit/verify-locator.spec.ts","../test/unit/video-pipeline-args.spec.ts","../test/unit/video-pipeline-exit.spec.ts","../test/unit/video-pipeline-outputpath.spec.ts","../test/unit/wda-cap-injection.spec.ts","../test/unit/wda-client-failures.spec.ts","../test/unit/wda-client-session.spec.ts","../test/unit/wda-clipboard-write.spec.ts","../test/unit/webdriver-info-route.spec.ts","../test/unit/webhook-delivery.spec.ts","../test/unit/ws-upgrade-routing-appium-server.spec.ts","../test/unit/xenon-options.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/allocate-lease-branch.spec.ts","../test/unit/lease/buildCapabilityBag.spec.ts","../test/unit/lease/lease-device-match.spec.ts","../test/unit/lease/lease-override.spec.ts","../test/unit/lease/lease-reap-held-phone.spec.ts","../test/unit/lease/lease-session-ownership.spec.ts","../test/unit/lease/lease-sweeper-expiry.spec.ts","../test/unit/lease/lease-team-visibility.spec.ts","../test/unit/lease/lease-token-log-filter.spec.ts","../test/unit/lease/lease-token-oracle.spec.ts","../test/unit/lease/leaseToken.spec.ts","../test/unit/lease/nodePairAuth.spec.ts","../test/unit/lease/session-lease-proof.spec.ts","../test/unit/ports/PortAllocatorService.spec.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED