@xenon-device-management/xenon 1.7.5 → 1.7.7
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/app/routers/profile.js +35 -7
- package/lib/src/app/routers/profileIdentity.js +27 -0
- package/lib/src/device-managers/android/AndroidStreamService.js +11 -0
- package/lib/test/unit/android-stream-release.spec.js +86 -0
- package/lib/test/unit/profileIdentity.spec.js +25 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/lib/package.json
CHANGED
|
@@ -16,6 +16,7 @@ const typedi_1 = require("typedi");
|
|
|
16
16
|
const ApiKeyService_1 = require("../../services/ApiKeyService");
|
|
17
17
|
const UserService_1 = require("../../services/UserService");
|
|
18
18
|
const prisma_1 = require("../../prisma");
|
|
19
|
+
const profileIdentity_1 = require("./profileIdentity");
|
|
19
20
|
const ROLE_SCOPES = {
|
|
20
21
|
SUPER_ADMIN: ['admin'],
|
|
21
22
|
ADMIN: ['devices', 'sessions', 'read'],
|
|
@@ -43,11 +44,28 @@ function profileRouter() {
|
|
|
43
44
|
}
|
|
44
45
|
return auth;
|
|
45
46
|
}
|
|
47
|
+
// Map req.auth.userId to a real User id. Auth-disabled mode uses a synthetic
|
|
48
|
+
// userId with no User row; resolve it to the seeded bootstrap SUPER_ADMIN so
|
|
49
|
+
// access-key/token management works as that admin. Real users pass through.
|
|
50
|
+
function effectiveUserId(rawUserId) {
|
|
51
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
+
var _a, _b;
|
|
53
|
+
const firstAdminId = rawUserId === profileIdentity_1.AUTH_DISABLED_USER_ID
|
|
54
|
+
? (_b = (_a = (yield prisma_1.prisma.user.findFirst({
|
|
55
|
+
where: { role: 'SUPER_ADMIN' },
|
|
56
|
+
orderBy: { createdAt: 'asc' },
|
|
57
|
+
select: { id: true },
|
|
58
|
+
}))) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : null
|
|
59
|
+
: null;
|
|
60
|
+
return (0, profileIdentity_1.resolveEffectiveUserId)(rawUserId, firstAdminId);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
46
63
|
r.get('/access-key', (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
47
64
|
const auth = requireAuth(req, res);
|
|
48
65
|
if (!auth)
|
|
49
66
|
return;
|
|
50
|
-
const
|
|
67
|
+
const userId = yield effectiveUserId(auth.userId);
|
|
68
|
+
const user = userId ? yield userSvc.findById(userId) : null;
|
|
51
69
|
if (!user)
|
|
52
70
|
return res.status(404).json({ error: 'user not found' });
|
|
53
71
|
return res.json({ accessKey: user.accessKey });
|
|
@@ -56,15 +74,21 @@ function profileRouter() {
|
|
|
56
74
|
const auth = requireAuth(req, res);
|
|
57
75
|
if (!auth)
|
|
58
76
|
return;
|
|
59
|
-
const
|
|
77
|
+
const userId = yield effectiveUserId(auth.userId);
|
|
78
|
+
if (!userId)
|
|
79
|
+
return res.status(404).json({ error: 'user not found' });
|
|
80
|
+
const updated = yield userSvc.rotateAccessKey(userId);
|
|
60
81
|
return res.json({ accessKey: updated.accessKey });
|
|
61
82
|
}));
|
|
62
83
|
r.get('/tokens', (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
63
84
|
const auth = requireAuth(req, res);
|
|
64
85
|
if (!auth)
|
|
65
86
|
return;
|
|
87
|
+
const userId = yield effectiveUserId(auth.userId);
|
|
88
|
+
if (!userId)
|
|
89
|
+
return res.json([]);
|
|
66
90
|
const rows = yield prisma_1.prisma.apiKey.findMany({
|
|
67
|
-
where: { userId
|
|
91
|
+
where: { userId, revokedAt: null },
|
|
68
92
|
select: { id: true, name: true, scopes: true, createdAt: true, lastUsedAt: true, expiresAt: true },
|
|
69
93
|
orderBy: { createdAt: 'desc' },
|
|
70
94
|
});
|
|
@@ -82,6 +106,9 @@ function profileRouter() {
|
|
|
82
106
|
const auth = requireAuth(req, res);
|
|
83
107
|
if (!auth)
|
|
84
108
|
return;
|
|
109
|
+
const userId = yield effectiveUserId(auth.userId);
|
|
110
|
+
if (!userId)
|
|
111
|
+
return res.status(404).json({ error: 'user not found' });
|
|
85
112
|
const { name, scopes, expiresAt } = req.body;
|
|
86
113
|
if (!name)
|
|
87
114
|
return res.status(400).json({ error: 'name required' });
|
|
@@ -104,7 +131,7 @@ function profileRouter() {
|
|
|
104
131
|
const { id, raw } = yield apiKeySvc.create({
|
|
105
132
|
name,
|
|
106
133
|
scopes: requested,
|
|
107
|
-
userId
|
|
134
|
+
userId,
|
|
108
135
|
expiresAt: expiresAtDate,
|
|
109
136
|
});
|
|
110
137
|
return res.status(201).json({
|
|
@@ -117,9 +144,10 @@ function profileRouter() {
|
|
|
117
144
|
const auth = requireAuth(req, res);
|
|
118
145
|
if (!auth)
|
|
119
146
|
return;
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
147
|
+
const userId = yield effectiveUserId(auth.userId);
|
|
148
|
+
const row = userId
|
|
149
|
+
? yield prisma_1.prisma.apiKey.findFirst({ where: { id: req.params.id, userId } })
|
|
150
|
+
: null;
|
|
123
151
|
if (!row)
|
|
124
152
|
return res.status(404).json({ error: 'token not found' });
|
|
125
153
|
yield apiKeySvc.revoke(req.params.id);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AUTH_DISABLED_USER_ID = void 0;
|
|
4
|
+
exports.resolveEffectiveUserId = resolveEffectiveUserId;
|
|
5
|
+
/**
|
|
6
|
+
* Synthetic userId that authMiddleware assigns when authentication is disabled
|
|
7
|
+
* (see src/middleware/authMiddleware.ts). No User row has this id.
|
|
8
|
+
*/
|
|
9
|
+
exports.AUTH_DISABLED_USER_ID = 'auth-disabled';
|
|
10
|
+
/**
|
|
11
|
+
* Resolve the effective User id for profile / access-key / token operations.
|
|
12
|
+
*
|
|
13
|
+
* Auth-disabled mode issues the synthetic `auth-disabled` userId, which has no
|
|
14
|
+
* backing User row — so looking it up 404s. In that mode the caller is treated
|
|
15
|
+
* as the seeded bootstrap SUPER_ADMIN, so token/access-key management acts as
|
|
16
|
+
* that admin ("auth disabled = act as the admin"). A real authenticated user's
|
|
17
|
+
* id passes through unchanged.
|
|
18
|
+
*
|
|
19
|
+
* @param rawUserId req.auth.userId as set by authMiddleware.
|
|
20
|
+
* @param firstAdminId id of the first/seeded SUPER_ADMIN, or null if none exists.
|
|
21
|
+
* @returns the User id to operate on, or null if nothing can be resolved.
|
|
22
|
+
*/
|
|
23
|
+
function resolveEffectiveUserId(rawUserId, firstAdminId) {
|
|
24
|
+
if (rawUserId && rawUserId !== exports.AUTH_DISABLED_USER_ID)
|
|
25
|
+
return rawUserId;
|
|
26
|
+
return firstAdminId;
|
|
27
|
+
}
|
|
@@ -300,6 +300,17 @@ let AndroidStreamService = class AndroidStreamService {
|
|
|
300
300
|
catch (e) {
|
|
301
301
|
/* Ignore unblocking failure on stop */
|
|
302
302
|
}
|
|
303
|
+
// Release the mjpeg port lease this stream acquired in startStream, so the
|
|
304
|
+
// allocator can reuse the port immediately instead of waiting out the lease
|
|
305
|
+
// TTL. Symmetric with IOSStreamService.stopStream. Only the stream-owned
|
|
306
|
+
// 'mjpeg' lease is released here — the device-level 'system' port (leased
|
|
307
|
+
// by AndroidDeviceManager) belongs to the device lifecycle, not the stream.
|
|
308
|
+
try {
|
|
309
|
+
yield typedi_1.Container.get(PortAllocator_1.PortAllocator).release(session.mjpegPort);
|
|
310
|
+
}
|
|
311
|
+
catch (e) {
|
|
312
|
+
logger_1.default.warn(`[${udid}] Failed to release mjpeg port lease on stop: ${e}`);
|
|
313
|
+
}
|
|
303
314
|
this.sessions.delete(udid);
|
|
304
315
|
logger_1.default.info(`[${udid}] Stream terminated.`);
|
|
305
316
|
}
|
|
@@ -0,0 +1,86 @@
|
|
|
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 PortAllocator_1 = require("../../src/services/PortAllocator");
|
|
21
|
+
const device_store_1 = require("../../src/data-service/device-store");
|
|
22
|
+
// Build an instance WITHOUT running the constructor (which starts a 1h watchdog
|
|
23
|
+
// interval), then drive stopStream directly with a fake running session.
|
|
24
|
+
function makeService(session) {
|
|
25
|
+
const svc = Object.create(AndroidStreamService_1.default.prototype);
|
|
26
|
+
svc.sessions = new Map();
|
|
27
|
+
if (session)
|
|
28
|
+
svc.sessions.set(session.udid, session);
|
|
29
|
+
return svc;
|
|
30
|
+
}
|
|
31
|
+
function runningSession(udid, mjpegPort) {
|
|
32
|
+
return {
|
|
33
|
+
udid,
|
|
34
|
+
mjpegPort,
|
|
35
|
+
server: null, // no http.Server so stopStream skips server.close()
|
|
36
|
+
status: 'running',
|
|
37
|
+
lastViewerAt: Date.now(),
|
|
38
|
+
viewerCount: 0,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
describe('AndroidStreamService.stopStream port-lease release', () => {
|
|
42
|
+
let releaseSpy;
|
|
43
|
+
let containerStub;
|
|
44
|
+
let storeStub;
|
|
45
|
+
beforeEach(() => {
|
|
46
|
+
releaseSpy = sinon_1.default.spy((_port) => __awaiter(void 0, void 0, void 0, function* () { return undefined; }));
|
|
47
|
+
containerStub = sinon_1.default.stub(typedi_1.Container, 'get').callsFake((token) => {
|
|
48
|
+
if (token === PortAllocator_1.PortAllocator)
|
|
49
|
+
return { release: releaseSpy };
|
|
50
|
+
return containerStub.wrappedMethod.call(typedi_1.Container, token);
|
|
51
|
+
});
|
|
52
|
+
// Device with no manual/automation lock → stopStream skips the unblock path,
|
|
53
|
+
// isolating the port-release behaviour under test.
|
|
54
|
+
storeStub = sinon_1.default.stub(device_store_1.DeviceStoreFactory, 'getStore').returns({
|
|
55
|
+
findDevice: () => __awaiter(void 0, void 0, void 0, function* () { return ({ udid: 'android-1', host: 'h', session_id: undefined, busy: false }); }),
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
afterEach(() => sinon_1.default.restore());
|
|
59
|
+
it('releases the stream-owned mjpeg lease and deletes the session', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
60
|
+
const svc = makeService(runningSession('android-1', 9100));
|
|
61
|
+
yield svc.stopStream('android-1');
|
|
62
|
+
(0, chai_1.expect)(releaseSpy.calledOnce, 'PortAllocator.release should be called once').to.be.true;
|
|
63
|
+
(0, chai_1.expect)(releaseSpy.firstCall.args[0]).to.equal(9100);
|
|
64
|
+
(0, chai_1.expect)(svc.sessions.has('android-1'), 'session should be removed').to.be.false;
|
|
65
|
+
(0, chai_1.expect)(storeStub.called).to.be.true;
|
|
66
|
+
}));
|
|
67
|
+
it('does not release when there is no active session (idempotent)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
68
|
+
const svc = makeService(null);
|
|
69
|
+
yield svc.stopStream('android-1');
|
|
70
|
+
(0, chai_1.expect)(releaseSpy.called).to.be.false;
|
|
71
|
+
}));
|
|
72
|
+
it('still tears down the session if releasing the lease throws (best-effort)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
73
|
+
releaseSpy = sinon_1.default.spy(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
74
|
+
throw new Error('lease gone');
|
|
75
|
+
}));
|
|
76
|
+
containerStub.restore();
|
|
77
|
+
containerStub = sinon_1.default.stub(typedi_1.Container, 'get').callsFake((token) => {
|
|
78
|
+
if (token === PortAllocator_1.PortAllocator)
|
|
79
|
+
return { release: releaseSpy };
|
|
80
|
+
return containerStub.wrappedMethod.call(typedi_1.Container, token);
|
|
81
|
+
});
|
|
82
|
+
const svc = makeService(runningSession('android-1', 9100));
|
|
83
|
+
yield svc.stopStream('android-1'); // must not reject
|
|
84
|
+
(0, chai_1.expect)(svc.sessions.has('android-1'), 'session removed despite release failure').to.be.false;
|
|
85
|
+
}));
|
|
86
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const chai_1 = require("chai");
|
|
4
|
+
const profileIdentity_1 = require("../../src/app/routers/profileIdentity");
|
|
5
|
+
describe('resolveEffectiveUserId', () => {
|
|
6
|
+
it('passes a real authenticated user id through unchanged', () => {
|
|
7
|
+
(0, chai_1.expect)((0, profileIdentity_1.resolveEffectiveUserId)('user-123', 'admin-1')).to.equal('user-123');
|
|
8
|
+
// A real user id wins even when no admin was looked up.
|
|
9
|
+
(0, chai_1.expect)((0, profileIdentity_1.resolveEffectiveUserId)('user-123', null)).to.equal('user-123');
|
|
10
|
+
});
|
|
11
|
+
it('resolves the auth-disabled synthetic id to the seeded admin', () => {
|
|
12
|
+
(0, chai_1.expect)((0, profileIdentity_1.resolveEffectiveUserId)(profileIdentity_1.AUTH_DISABLED_USER_ID, 'admin-1')).to.equal('admin-1');
|
|
13
|
+
});
|
|
14
|
+
it('returns null when auth is disabled and there is no admin to fall back to', () => {
|
|
15
|
+
(0, chai_1.expect)((0, profileIdentity_1.resolveEffectiveUserId)(profileIdentity_1.AUTH_DISABLED_USER_ID, null)).to.equal(null);
|
|
16
|
+
});
|
|
17
|
+
it('treats empty/undefined userId like the disabled case (falls back to admin)', () => {
|
|
18
|
+
(0, chai_1.expect)((0, profileIdentity_1.resolveEffectiveUserId)('', 'admin-1')).to.equal('admin-1');
|
|
19
|
+
(0, chai_1.expect)((0, profileIdentity_1.resolveEffectiveUserId)(undefined, 'admin-1')).to.equal('admin-1');
|
|
20
|
+
(0, chai_1.expect)((0, profileIdentity_1.resolveEffectiveUserId)(null, null)).to.equal(null);
|
|
21
|
+
});
|
|
22
|
+
it('keeps the sentinel constant stable (authMiddleware contract)', () => {
|
|
23
|
+
(0, chai_1.expect)(profileIdentity_1.AUTH_DISABLED_USER_ID).to.equal('auth-disabled');
|
|
24
|
+
});
|
|
25
|
+
});
|
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/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/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/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/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/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/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-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/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/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/auth-me-auth-disabled.test.ts","../test/unit/authMiddleware.bearer.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/helpers.spec.ts","../test/unit/iosBattery.spec.ts","../test/unit/iosStreamDiagnostics.spec.ts","../test/unit/loginRateLimiter.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/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/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/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/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/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/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/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/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-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/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/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.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/helpers.spec.ts","../test/unit/iosBattery.spec.ts","../test/unit/iosStreamDiagnostics.spec.ts","../test/unit/loginRateLimiter.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/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/ports/PortAllocatorService.spec.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED