@xenon-device-management/xenon 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +446 -0
- package/lib/package.json +207 -0
- package/lib/public/assets/Layouts-7IT8aFLI.js +11 -0
- package/lib/public/assets/Layouts-DPMls9vh.css +1 -0
- package/lib/public/assets/ai-settings-BbnfgdEx.js +11 -0
- package/lib/public/assets/apps-CRMrI4_p.js +16 -0
- package/lib/public/assets/apps-CcM77dgg.css +1 -0
- package/lib/public/assets/badge-B1nKs8zj.css +1 -0
- package/lib/public/assets/badge-CSvl5xIU.js +11 -0
- package/lib/public/assets/button-CJlKn4PZ.css +1 -0
- package/lib/public/assets/button-CvLaGFYj.js +26 -0
- package/lib/public/assets/calendar-6w-D6Oaw.js +6 -0
- package/lib/public/assets/clock-DcdeWBPr.js +6 -0
- package/lib/public/assets/cpu-DiSoXT9n.js +6 -0
- package/lib/public/assets/device-explorer-CajM63OJ.js +193 -0
- package/lib/public/assets/device-explorer-CxdUAoTL.css +1 -0
- package/lib/public/assets/index-ByQwMN5T.js +174 -0
- package/lib/public/assets/index-C1DBaoSh.js +1 -0
- package/lib/public/assets/index-qzCez_kk.css +1 -0
- package/lib/public/assets/lock-B23ibZmo.js +6 -0
- package/lib/public/assets/maintenance-settings-CirzA6yG.js +6 -0
- package/lib/public/assets/mouse-pointer-2-Cz76SHFb.js +6 -0
- package/lib/public/assets/plus-BBwlIevt.js +6 -0
- package/lib/public/assets/session-dashboard-C2k7FFv_.css +1 -0
- package/lib/public/assets/session-dashboard-HPDtwPOZ.js +62 -0
- package/lib/public/assets/settings-DrZsZwdc.js +1 -0
- package/lib/public/assets/trash-2-DQpvzJec.js +6 -0
- package/lib/public/assets/useSocket-Dxsqae2a.js +16 -0
- package/lib/public/assets/webhook-settings-CDPgsgkb.css +1 -0
- package/lib/public/assets/webhook-settings-Cp-B4Nrw.js +1 -0
- package/lib/public/assets/zap-DovP6iow.js +6 -0
- package/lib/public/favicon.ico +0 -0
- package/lib/public/favicon.png +0 -0
- package/lib/public/favicon.svg +9 -0
- package/lib/public/index.html +46 -0
- package/lib/public/logo.svg +17 -0
- package/lib/public/logo192.png +0 -0
- package/lib/public/logo512.png +0 -0
- package/lib/public/manifest.json +25 -0
- package/lib/public/robots.txt +3 -0
- package/lib/schema.json +348 -0
- package/lib/src/InternalHttpClient.js +212 -0
- package/lib/src/PluginContext.js +29 -0
- package/lib/src/XenonCapabilityManager.js +199 -0
- package/lib/src/app/index.js +167 -0
- package/lib/src/app/routers/apps.js +79 -0
- package/lib/src/app/routers/config.js +131 -0
- package/lib/src/app/routers/control.js +835 -0
- package/lib/src/app/routers/dashboard.js +301 -0
- package/lib/src/app/routers/grid.js +352 -0
- package/lib/src/app/routers/reservation.js +190 -0
- package/lib/src/app/routers/webhook.js +83 -0
- package/lib/src/app/swagger-docs.js +203 -0
- package/lib/src/app/swagger.js +366 -0
- package/lib/src/chromeUtils.js +148 -0
- package/lib/src/commands/handle.js +19 -0
- package/lib/src/commands/index.js +8 -0
- package/lib/src/config.js +73 -0
- package/lib/src/dashboard/asset-manager.js +84 -0
- package/lib/src/dashboard/commands.js +284 -0
- package/lib/src/dashboard/event-manager.js +699 -0
- package/lib/src/dashboard/services/app-service.js +134 -0
- package/lib/src/dashboard/services/failure-analysis-service.js +173 -0
- package/lib/src/dashboard/services/session-service.js +113 -0
- package/lib/src/data-service/CircuitBreaker.js +83 -0
- package/lib/src/data-service/config-service.js +155 -0
- package/lib/src/data-service/db.js +122 -0
- package/lib/src/data-service/device-service.js +320 -0
- package/lib/src/data-service/device-store.interface.js +2 -0
- package/lib/src/data-service/device-store.js +345 -0
- package/lib/src/data-service/pending-sessions-service.js +25 -0
- package/lib/src/data-service/pluginArgs.js +25 -0
- package/lib/src/data-service/prisma-service.js +31 -0
- package/lib/src/data-service/prisma-store.js +385 -0
- package/lib/src/data-service/queue-service.js +150 -0
- package/lib/src/data-service/web-config-service.js +130 -0
- package/lib/src/device-managers/AndroidDeviceManager.js +1155 -0
- package/lib/src/device-managers/ChromeDriverManager.js +68 -0
- package/lib/src/device-managers/HealthMonitorService.js +325 -0
- package/lib/src/device-managers/IOSDeviceManager.js +351 -0
- package/lib/src/device-managers/NodeDevices.js +82 -0
- package/lib/src/device-managers/android/AndroidStreamService.js +370 -0
- package/lib/src/device-managers/android/DeviceLockManager.js +45 -0
- package/lib/src/device-managers/cloud/CapabilityManager.js +26 -0
- package/lib/src/device-managers/cloud/Devices.js +86 -0
- package/lib/src/device-managers/iOSTracker.js +44 -0
- package/lib/src/device-managers/index.js +89 -0
- package/lib/src/device-managers/ios/IOSDiscoveryService.js +268 -0
- package/lib/src/device-managers/ios/IOSStreamService.js +893 -0
- package/lib/src/device-managers/ios/WDAClient.js +866 -0
- package/lib/src/device-utils.js +663 -0
- package/lib/src/enums/Capabilities.js +8 -0
- package/lib/src/enums/Cloud.js +11 -0
- package/lib/src/enums/Platform.js +9 -0
- package/lib/src/enums/SessionType.js +9 -0
- package/lib/src/enums/SocketEvents.js +15 -0
- package/lib/src/helpers/UniversalMjpegProxy.js +273 -0
- package/lib/src/helpers/index.js +229 -0
- package/lib/src/index.js +95 -0
- package/lib/src/interceptors/CommandInterceptor.js +524 -0
- package/lib/src/interfaces/ICloudManager.js +2 -0
- package/lib/src/interfaces/IDevice.js +2 -0
- package/lib/src/interfaces/IDeviceFilterOptions.js +2 -0
- package/lib/src/interfaces/IDeviceManager.js +2 -0
- package/lib/src/interfaces/IOptions.js +2 -0
- package/lib/src/interfaces/IPluginArgs.js +55 -0
- package/lib/src/interfaces/ISessionCapability.js +2 -0
- package/lib/src/logger.js +225 -0
- package/lib/src/plugin.js +244 -0
- package/lib/src/prisma.js +12 -0
- package/lib/src/profiling/AndroidAppProfiler.js +213 -0
- package/lib/src/proxy/wd-command-proxy.js +221 -0
- package/lib/src/scripts/generate-database-migration.js +59 -0
- package/lib/src/scripts/initialize-database.js +55 -0
- package/lib/src/scripts/install-go-ios.js +66 -0
- package/lib/src/scripts/prepare-prisma.js +89 -0
- package/lib/src/services/AICommandService.js +143 -0
- package/lib/src/services/AIService.js +466 -0
- package/lib/src/services/CleanupService.js +141 -0
- package/lib/src/services/EventBus.js +74 -0
- package/lib/src/services/InspectorService.js +395 -0
- package/lib/src/services/MetricsService.js +134 -0
- package/lib/src/services/NetworkConditioningService.js +173 -0
- package/lib/src/services/NotificationService.js +163 -0
- package/lib/src/services/RequestLogService.js +252 -0
- package/lib/src/services/ResourceIsolationService.js +122 -0
- package/lib/src/services/SecurityService.js +120 -0
- package/lib/src/services/ServerManager.js +284 -0
- package/lib/src/services/SessionHeartbeatService.js +158 -0
- package/lib/src/services/SessionLifecycleService.js +572 -0
- package/lib/src/services/SocketClient.js +71 -0
- package/lib/src/services/SocketServer.js +87 -0
- package/lib/src/services/TracingService.js +132 -0
- package/lib/src/services/VideoPipelineService.js +220 -0
- package/lib/src/services/healing/FuzzyXmlHealingProvider.js +333 -0
- package/lib/src/services/healing/HealEtalonService.js +98 -0
- package/lib/src/services/healing/HealedLocatorGenerator.js +132 -0
- package/lib/src/services/healing/HealingOrchestrator.js +165 -0
- package/lib/src/services/healing/LlmHealingProvider.js +77 -0
- package/lib/src/services/healing/OcrHealingProvider.js +119 -0
- package/lib/src/services/healing/ResilioTreeHealingProvider.js +100 -0
- package/lib/src/services/healing/VisualAiHealingProvider.js +90 -0
- package/lib/src/services/healing/types.js +12 -0
- package/lib/src/services/omni-vision/OmniVisionService.js +718 -0
- package/lib/src/services/omni-vision/VisionAssertionService.js +68 -0
- package/lib/src/sessions/CloudSession.js +42 -0
- package/lib/src/sessions/LocalSession.js +313 -0
- package/lib/src/sessions/RemoteSession.js +287 -0
- package/lib/src/sessions/SessionManager.js +238 -0
- package/lib/src/sessions/XenonSession.js +44 -0
- package/lib/src/types/CLIArgs.js +2 -0
- package/lib/src/types/CloudArgs.js +2 -0
- package/lib/src/types/CloudSchema.js +131 -0
- package/lib/src/types/DeviceType.js +2 -0
- package/lib/src/types/DeviceUpdate.js +2 -0
- package/lib/src/types/IOSDevice.js +2 -0
- package/lib/src/types/Platform.js +2 -0
- package/lib/src/types/SessionStatus.js +11 -0
- package/lib/src/validators/CapabilityValidator.js +93 -0
- package/lib/test/e2e/android/conf.spec.js +43 -0
- package/lib/test/e2e/android/conf2.spec.js +44 -0
- package/lib/test/e2e/android/conf3.spec.js +44 -0
- package/lib/test/e2e/e2ehelper.js +113 -0
- package/lib/test/e2e/hubnode/forward-request.spec.js +224 -0
- package/lib/test/e2e/hubnode/hubnode.spec.js +214 -0
- package/lib/test/e2e/ios/conf1.spec.js +39 -0
- package/lib/test/e2e/ios/conf2.spec.js +39 -0
- package/lib/test/e2e/plugin-harness.js +236 -0
- package/lib/test/e2e/plugin.spec.js +97 -0
- package/lib/test/e2e/telemetry_verification.spec.js +83 -0
- package/lib/test/e2e/video-recording-test.spec.js +63 -0
- package/lib/test/helpers/test-container.js +112 -0
- package/lib/test/integration/androidDevices.spec.js +137 -0
- package/lib/test/integration/cliArgs.js +73 -0
- package/lib/test/integration/ios/01iOSSimulator.spec.js +291 -0
- package/lib/test/integration/ios/02iOSDevices.spec.js +75 -0
- package/lib/test/integration/testHelpers.js +74 -0
- package/lib/test/unit/AndroidDeviceManager.spec.js +178 -0
- package/lib/test/unit/ChromeDriverManager.spec.js +26 -0
- package/lib/test/unit/CleanupService.spec.js +21 -0
- package/lib/test/unit/DeviceModel.spec.js +157 -0
- package/lib/test/unit/FuzzyXmlHealingProvider.test.js +294 -0
- package/lib/test/unit/GetAdbOriginal.js +42 -0
- package/lib/test/unit/HealingCascade.test.js +128 -0
- package/lib/test/unit/IOSDeviceManager.spec.js +261 -0
- package/lib/test/unit/RemoteIOs.spec.js +78 -0
- package/lib/test/unit/ResilioTreeHealingProvider.test.js +96 -0
- package/lib/test/unit/commands.spec.js +27 -0
- package/lib/test/unit/config.spec.js +27 -0
- package/lib/test/unit/device-service.spec.js +307 -0
- package/lib/test/unit/device-utils.spec.js +313 -0
- package/lib/test/unit/fixtures/device.config.js +4 -0
- package/lib/test/unit/fixtures/devices.js +89 -0
- package/lib/test/unit/helpers.spec.js +62 -0
- package/lib/test/unit/omni-vision.spec.js +100 -0
- package/lib/test/unit/plugin.spec.js +133 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +207 -0
- package/prisma/data.db +0 -0
- package/prisma/dev.db +0 -0
- package/prisma/dev.db-journal +0 -0
- package/prisma/migrations/20231011074725_initial_tables/migration.sql +47 -0
- package/prisma/migrations/20231226115334_update_session_log/migration.sql +2 -0
- package/prisma/migrations/20251204113710_add_video_recording_enabled/migration.sql +29 -0
- package/prisma/migrations/20251204132449_add_log_table/migration.sql +11 -0
- package/prisma/migrations/20251205050111_add_profiling_support/migration.sql +47 -0
- package/prisma/migrations/20251205050947_add_is_error_field/migration.sql +24 -0
- package/prisma/migrations/20260126201337_add_app_model/migration.sql +18 -0
- package/prisma/migrations/20260130115722_add_performance_trace_and_xenon_sync/migration.sql +2 -0
- package/prisma/migrations/20260130135114_add_device_models/migration.sql +57 -0
- package/prisma/migrations/20260130140655_make_systemport_optional/migration.sql +45 -0
- package/prisma/migrations/20260130140932_make_device_fields_optional/migration.sql +45 -0
- package/prisma/migrations/20260130141040_final_schema_fix/migration.sql +45 -0
- package/prisma/migrations/20260130143234_add_device_health_fields/migration.sql +4 -0
- package/prisma/migrations/20260130144921_add_failure_category/migration.sql +2 -0
- package/prisma/migrations/20260131151456_add_webhook_config/migration.sql +10 -0
- package/prisma/migrations/20260201094507_add_device_tags/migration.sql +11 -0
- package/prisma/migrations/20260201103410_add_managed_process/migration.sql +15 -0
- package/prisma/migrations/20260201140637_add_web_config/migration.sql +22 -0
- package/prisma/migrations/20260201162232_add_session_progress/migration.sql +2 -0
- package/prisma/migrations/20260201174231_add_total_healed_count/migration.sql +2 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +210 -0
- package/schema.json +348 -0
- package/scripts/build-xenon.sh +32 -0
- package/scripts/dev/debug-gemini.ts +44 -0
- package/scripts/generate-types-from-schema.js +86 -0
- package/scripts/install-compatible-driver.js +39 -0
|
@@ -0,0 +1,213 @@
|
|
|
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
|
+
exports.AndroidAppProfiler = void 0;
|
|
16
|
+
const events_1 = __importDefault(require("events"));
|
|
17
|
+
const bluebird_1 = __importDefault(require("bluebird"));
|
|
18
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
19
|
+
const teen_process_1 = require("teen_process");
|
|
20
|
+
class AndroidAppProfiler extends events_1.default {
|
|
21
|
+
constructor(opts) {
|
|
22
|
+
super();
|
|
23
|
+
this.adb = opts.adb;
|
|
24
|
+
this.logs = [];
|
|
25
|
+
this.deviceUDID = opts.deviceUDID;
|
|
26
|
+
this.appPackage = opts.appPackage;
|
|
27
|
+
this.proc = null;
|
|
28
|
+
}
|
|
29
|
+
startCapture() {
|
|
30
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
+
let started = false;
|
|
32
|
+
return yield new bluebird_1.default((resolve_B, _reject_B) => __awaiter(this, void 0, void 0, function* () {
|
|
33
|
+
var _a, _b;
|
|
34
|
+
const resolve = function (...args) {
|
|
35
|
+
started = true;
|
|
36
|
+
resolve_B(...args);
|
|
37
|
+
};
|
|
38
|
+
const _reject = function (...args) {
|
|
39
|
+
started = true;
|
|
40
|
+
_reject_B(...args);
|
|
41
|
+
};
|
|
42
|
+
this.deviceInfo = yield this.getDeviceInfo();
|
|
43
|
+
const defaultArgs = ((_a = this.adb.executable) === null || _a === void 0 ? void 0 : _a.defaultArgs) || [];
|
|
44
|
+
const cmd = [
|
|
45
|
+
...defaultArgs,
|
|
46
|
+
'-s',
|
|
47
|
+
this.deviceUDID,
|
|
48
|
+
'shell',
|
|
49
|
+
'top',
|
|
50
|
+
'-o',
|
|
51
|
+
'%CPU,RSS,ARGS',
|
|
52
|
+
'-s',
|
|
53
|
+
'1',
|
|
54
|
+
'-d',
|
|
55
|
+
'2',
|
|
56
|
+
];
|
|
57
|
+
/* -m argument is only supported after api level 28 */
|
|
58
|
+
if (lodash_1.default.isNumber(this.deviceInfo.api_level) && this.deviceInfo.api_level >= 28) {
|
|
59
|
+
cmd.push('-m', '20');
|
|
60
|
+
}
|
|
61
|
+
this.proc = new teen_process_1.SubProcess(((_b = this.adb.executable) === null || _b === void 0 ? void 0 : _b.path) || 'adb', cmd);
|
|
62
|
+
this.proc.on('exit', (_code, _signal) => {
|
|
63
|
+
this.proc = null;
|
|
64
|
+
if (!started) {
|
|
65
|
+
resolve();
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
this.proc.on('lines-stdout', (lines) => {
|
|
69
|
+
resolve();
|
|
70
|
+
if (!lines[3]) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const slicedLines = lines.slice(4);
|
|
74
|
+
const sysInfo = {
|
|
75
|
+
total_cpu_used: this.getSystemCpuUsage(lines[3]),
|
|
76
|
+
total_memory_used: this.getSystemMemoryUsage(lines[1]),
|
|
77
|
+
raw_cpu_log: lines[3],
|
|
78
|
+
raw_memory_log: lines[1],
|
|
79
|
+
};
|
|
80
|
+
/* Logs received is not in proper format so ignore the entry */
|
|
81
|
+
if (sysInfo.total_cpu_used == 0 && sysInfo.total_memory_used == 0) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
for (const line of slicedLines) {
|
|
85
|
+
if (new RegExp(/\r/g).test(line)) {
|
|
86
|
+
line
|
|
87
|
+
.split(/\r/g)
|
|
88
|
+
.filter((l) => !!l)
|
|
89
|
+
.forEach((l) => this.outputHandler(sysInfo, lodash_1.default.trim(l)));
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
this.outputHandler(sysInfo, lodash_1.default.trim(line));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
yield this.proc.start(0);
|
|
97
|
+
}));
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
outputHandler(generalCpuInfo, output) {
|
|
101
|
+
//remove all ascii characters from the log line
|
|
102
|
+
/* eslint-disable no-control-regex */
|
|
103
|
+
output = output.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '');
|
|
104
|
+
// Use a regex to split by one or more spaces and filter out any empty strings
|
|
105
|
+
const parts = output.trim().split(/\s+/);
|
|
106
|
+
if (parts.length < 3) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const [cpu, memory, pkg] = parts;
|
|
110
|
+
// Filter out invalid samples or headers that cause graph 'drops to zero'
|
|
111
|
+
if (!cpu || cpu === '0' || cpu === '%CPU' || isNaN(parseFloat(cpu))) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const outputObj = Object.assign({ timestamp: new Date().toISOString(), cpu: cpu || '0', memory: memory || '0' }, generalCpuInfo);
|
|
115
|
+
if (pkg === this.appPackage) {
|
|
116
|
+
this.logs.push(outputObj);
|
|
117
|
+
this.emit('output', outputObj);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
stopCapture() {
|
|
121
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
122
|
+
if (!this.proc || !this.proc.isRunning) {
|
|
123
|
+
this.proc = null;
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
this.proc.removeAllListeners('exit');
|
|
127
|
+
yield this.proc.stop();
|
|
128
|
+
this.proc = null;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
getLogs() {
|
|
132
|
+
return lodash_1.default.uniqBy(this.logs, 'timestamp');
|
|
133
|
+
}
|
|
134
|
+
getDeviceInfo() {
|
|
135
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
136
|
+
return {
|
|
137
|
+
total_cpu: yield this.getTotalCpus(),
|
|
138
|
+
total_memory: yield this.getTotalMemory(),
|
|
139
|
+
api_level: yield this.getAndroidApiLevel(),
|
|
140
|
+
};
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
getAndroidApiLevel() {
|
|
144
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
145
|
+
var _a, _b, _c;
|
|
146
|
+
if ((_a = this.deviceInfo) === null || _a === void 0 ? void 0 : _a.api_level)
|
|
147
|
+
return this.deviceInfo.api_level;
|
|
148
|
+
const defaultArgs = ((_b = this.adb.executable) === null || _b === void 0 ? void 0 : _b.defaultArgs) || [];
|
|
149
|
+
const args = [
|
|
150
|
+
...defaultArgs,
|
|
151
|
+
'-s',
|
|
152
|
+
this.deviceUDID,
|
|
153
|
+
'shell',
|
|
154
|
+
'getprop',
|
|
155
|
+
'ro.build.version.sdk',
|
|
156
|
+
];
|
|
157
|
+
const out = yield (0, teen_process_1.exec)(((_c = this.adb.executable) === null || _c === void 0 ? void 0 : _c.path) || 'adb', args);
|
|
158
|
+
return Number(out.stdout.trim());
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
getTotalCpus() {
|
|
162
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
163
|
+
var _a, _b, _c;
|
|
164
|
+
const defaultArgs = ((_a = this.adb.executable) === null || _a === void 0 ? void 0 : _a.defaultArgs) || [];
|
|
165
|
+
const args = [...defaultArgs, '-s', this.deviceUDID, 'shell', 'cat', '/proc/cpuinfo'];
|
|
166
|
+
const out = yield (0, teen_process_1.exec)(((_b = this.adb.executable) === null || _b === void 0 ? void 0 : _b.path) || 'adb', args);
|
|
167
|
+
return ((_c = out.stdout.match(/processor/g)) === null || _c === void 0 ? void 0 : _c.length) || 0;
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
getTotalMemory() {
|
|
171
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
172
|
+
var _a, _b;
|
|
173
|
+
const defaultArgs = ((_a = this.adb.executable) === null || _a === void 0 ? void 0 : _a.defaultArgs) || [];
|
|
174
|
+
const args = [...defaultArgs, '-s', this.deviceUDID, 'shell', 'cat', '/proc/meminfo'];
|
|
175
|
+
const out = yield (0, teen_process_1.exec)(((_b = this.adb.executable) === null || _b === void 0 ? void 0 : _b.path) || 'adb', args);
|
|
176
|
+
const match = out.stdout.match(/MemTotal:.*[0-9]/g);
|
|
177
|
+
if (match && match.length) {
|
|
178
|
+
return match[0].replace(/[^0-9]/g, '');
|
|
179
|
+
}
|
|
180
|
+
return 0;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
getSystemCpuUsage(logLine) {
|
|
184
|
+
if (!logLine) {
|
|
185
|
+
return 0;
|
|
186
|
+
}
|
|
187
|
+
const data = {};
|
|
188
|
+
['cpu', 'idle'].forEach((type) => {
|
|
189
|
+
const match = logLine.match(new RegExp(`([0-9]{0,})%${type}`));
|
|
190
|
+
data[type] = match && match.length > 1 ? Number(match[1]) : 0;
|
|
191
|
+
});
|
|
192
|
+
let out = 0;
|
|
193
|
+
['user', 'nice', 'sys', 'iow', 'irq', 'sirq', 'host'].forEach((type) => {
|
|
194
|
+
const match = logLine.match(new RegExp(`([0-9]{0,})%${type}`));
|
|
195
|
+
out += match && match.length > 1 ? Number(match[1]) : 0;
|
|
196
|
+
});
|
|
197
|
+
return out > data['cpu'] ? data['cpu'] : out;
|
|
198
|
+
}
|
|
199
|
+
getSystemMemoryUsage(logLine) {
|
|
200
|
+
if (!logLine) {
|
|
201
|
+
return 0;
|
|
202
|
+
}
|
|
203
|
+
let match = logLine.match(new RegExp(/([0-9]{0,})k used/i));
|
|
204
|
+
/* In some devices, memory will be shown in GB, so convert it back to KB */
|
|
205
|
+
if (!match) {
|
|
206
|
+
/* sample logLine "Mem: 5.5G total, 5.4G used, 71M free, 36M buffers" */
|
|
207
|
+
match = logLine.match(new RegExp(/(([1-9]\d*)(\.\d+)?)G used/i));
|
|
208
|
+
return match && match.length > 1 ? Math.ceil(parseFloat(match[1]) * 1024 * 1024) : 0;
|
|
209
|
+
}
|
|
210
|
+
return match && match.length > 1 ? Number(match[1]) : 0;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
exports.AndroidAppProfiler = AndroidAppProfiler;
|
|
@@ -0,0 +1,221 @@
|
|
|
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
|
+
exports.addProxyHandler = addProxyHandler;
|
|
49
|
+
exports.removeProxyHandler = removeProxyHandler;
|
|
50
|
+
exports.registerProxyMiddlware = registerProxyMiddlware;
|
|
51
|
+
const https_proxy_agent_1 = require("https-proxy-agent");
|
|
52
|
+
const http_proxy_agent_1 = require("http-proxy-agent");
|
|
53
|
+
const http_proxy_middleware_1 = require("http-proxy-middleware");
|
|
54
|
+
const device_service_1 = require("../data-service/device-service");
|
|
55
|
+
const axios_1 = __importDefault(require("axios"));
|
|
56
|
+
const logger_1 = __importDefault(require("../logger"));
|
|
57
|
+
const helpers_1 = require("../helpers");
|
|
58
|
+
const SessionManager_1 = require("../sessions/SessionManager");
|
|
59
|
+
const event_manager_1 = require("../dashboard/event-manager");
|
|
60
|
+
const base_driver_1 = require("@appium/base-driver");
|
|
61
|
+
const typedi_1 = require("typedi");
|
|
62
|
+
const remoteProxyMap = new Map();
|
|
63
|
+
const remoteHostMap = new Map();
|
|
64
|
+
function getProxyServer() {
|
|
65
|
+
return process.env.HTTP_PROXY || process.env.HTTPS_PROXY;
|
|
66
|
+
}
|
|
67
|
+
function addProxyHandler(sessionId, remoteHost) {
|
|
68
|
+
const proxyServer = getProxyServer();
|
|
69
|
+
const targetBasePath = new URL(remoteHost).pathname;
|
|
70
|
+
const config = {
|
|
71
|
+
target: new URL(remoteHost).origin,
|
|
72
|
+
changeOrigin: true,
|
|
73
|
+
pathRewrite: (path, _req) => {
|
|
74
|
+
const newPath = `${targetBasePath}/${path}`;
|
|
75
|
+
return newPath;
|
|
76
|
+
},
|
|
77
|
+
on: {
|
|
78
|
+
proxyReq: http_proxy_middleware_1.fixRequestBody,
|
|
79
|
+
proxyRes: (_proxyRes, _req, _res) => {
|
|
80
|
+
// log.debug(`proxyRes host: ${req.headers.host} method: ${req.method} path: ${req.url}`);
|
|
81
|
+
},
|
|
82
|
+
error: (err, _req, _res) => {
|
|
83
|
+
var _a;
|
|
84
|
+
logger_1.default.error('proxy handler error: ', err.message, ' data: ', (_a = err.response) === null || _a === void 0 ? void 0 : _a.data);
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
if (proxyServer) {
|
|
89
|
+
//log.info(`Added proxy to createProxyMiddleware: ${JSON.stringify(proxyServer)}`);
|
|
90
|
+
config.agent = new https_proxy_agent_1.HttpsProxyAgent(proxyServer);
|
|
91
|
+
}
|
|
92
|
+
logger_1.default.info(`Creating remote proxy for session ${sessionId} to ${remoteHost}`);
|
|
93
|
+
remoteProxyMap.set(sessionId, (0, http_proxy_middleware_1.createProxyMiddleware)(config));
|
|
94
|
+
remoteHostMap.set(sessionId, remoteHost);
|
|
95
|
+
}
|
|
96
|
+
function removeProxyHandler(sessionId) {
|
|
97
|
+
remoteProxyMap.delete(sessionId);
|
|
98
|
+
}
|
|
99
|
+
function getSessionIdFromUrl(url) {
|
|
100
|
+
const SESSION_ID_PATTERN = /\/session\/([^/]+)/;
|
|
101
|
+
const match = SESSION_ID_PATTERN.exec(url);
|
|
102
|
+
if (match) {
|
|
103
|
+
return match[1];
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
function handler(cliArgs) {
|
|
108
|
+
const WEBDRIVER_BASE_PATH = (cliArgs['basePath'] || '').replace(/\/$/, '') + '/session';
|
|
109
|
+
const isHub = !(0, helpers_1.hasHubArgument)(cliArgs); //if hub cliArg is provided, then current appium process serves as a NODE
|
|
110
|
+
return (req, res, next) => __awaiter(this, void 0, void 0, function* () {
|
|
111
|
+
if (new RegExp(/wd-internal\//).test(req.url)) {
|
|
112
|
+
req.url = req.originalUrl = req.url.replace('wd-internal/', '');
|
|
113
|
+
return next();
|
|
114
|
+
}
|
|
115
|
+
if (isHub && !req.path.startsWith(WEBDRIVER_BASE_PATH)) {
|
|
116
|
+
logger_1.default.debug(`Received non-webdriver request with url ${req.path}. So, not proxying it to downstream.`);
|
|
117
|
+
return next();
|
|
118
|
+
}
|
|
119
|
+
const sessionId = getSessionIdFromUrl(req.url);
|
|
120
|
+
const proxyServer = getProxyServer();
|
|
121
|
+
if (!sessionId) {
|
|
122
|
+
return next();
|
|
123
|
+
}
|
|
124
|
+
yield (0, device_service_1.updateCmdExecutedTime)(sessionId);
|
|
125
|
+
req.headers['accept-encoding'] = 'deflate';
|
|
126
|
+
const shouldInterceptRequest = isHub && !!SessionManager_1.SESSION_MANAGER.isValidSession(sessionId);
|
|
127
|
+
const commandName = (0, base_driver_1.routeToCommandName)(req.path, req.method, cliArgs['basePath']);
|
|
128
|
+
// Always intercept DELETE requests to ensure onSessionStoped is called
|
|
129
|
+
if (req.method === 'DELETE' || shouldInterceptRequest) {
|
|
130
|
+
logger_1.default.info(`Intercepting ${req.method} request for session ${sessionId}, shouldInterceptRequest: ${shouldInterceptRequest}`);
|
|
131
|
+
if (shouldInterceptRequest) {
|
|
132
|
+
const shouldProceed = yield event_manager_1.DASHBORD_EVENT_MANAGER.beforeSessionCommand(sessionId, commandName, req, res);
|
|
133
|
+
if (!shouldProceed) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
interceptResponse(sessionId, commandName, req, res);
|
|
138
|
+
}
|
|
139
|
+
// Principal Intelligence: Virtualized Network Conditioning (Latency Injection)
|
|
140
|
+
try {
|
|
141
|
+
const { NetworkConditioningService } = yield Promise.resolve().then(() => __importStar(require('../services/NetworkConditioningService')));
|
|
142
|
+
const latency = typedi_1.Container.get(NetworkConditioningService).getLatency(sessionId);
|
|
143
|
+
if (latency > 0) {
|
|
144
|
+
logger_1.default.debug(`⏳ Network Conditioning: Delaying command by ${latency}ms for session ${sessionId}`);
|
|
145
|
+
yield new Promise((resolve) => setTimeout(resolve, latency));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (e) {
|
|
149
|
+
/* ignore */
|
|
150
|
+
}
|
|
151
|
+
if (remoteProxyMap.has(sessionId)) {
|
|
152
|
+
if (proxyServer) {
|
|
153
|
+
const response = yield (0, axios_1.default)({
|
|
154
|
+
method: req.method,
|
|
155
|
+
url: new URL(req.path, new URL(remoteHostMap.get(sessionId)).origin).toString(),
|
|
156
|
+
data: req.body,
|
|
157
|
+
params: req.query,
|
|
158
|
+
validateStatus: () => true,
|
|
159
|
+
httpsAgent: new https_proxy_agent_1.HttpsProxyAgent(proxyServer),
|
|
160
|
+
httpAgent: new http_proxy_agent_1.HttpProxyAgent(proxyServer),
|
|
161
|
+
proxy: false,
|
|
162
|
+
});
|
|
163
|
+
res.status(response.status).json(response.data);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
remoteProxyMap.get(sessionId)(req, res, next);
|
|
167
|
+
}
|
|
168
|
+
if (req.method === 'DELETE') {
|
|
169
|
+
logger_1.default.info(`📱 Unblocking the device that is blocked for session ${sessionId} in remote machine`);
|
|
170
|
+
(0, device_service_1.unblockDeviceMatchingFilter)({ session_id: sessionId });
|
|
171
|
+
removeProxyHandler(sessionId);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
next();
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
function interceptResponse(sessionId, commandName, req, res) {
|
|
180
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
181
|
+
const [originalWrite, originalEnd] = [res.write, res.end];
|
|
182
|
+
const chunks = [];
|
|
183
|
+
res.write = function (...args) {
|
|
184
|
+
chunks.push(typeof args[0] === 'string' ? Buffer.from(args[0]) : args[0]);
|
|
185
|
+
originalWrite.apply(res, args);
|
|
186
|
+
};
|
|
187
|
+
res.end = function (...args) {
|
|
188
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
189
|
+
if (args[0]) {
|
|
190
|
+
chunks.push(typeof args[0] === 'string' ? Buffer.from(args[0]) : args[0]);
|
|
191
|
+
}
|
|
192
|
+
const body = Buffer.concat(chunks).toString('utf8');
|
|
193
|
+
if (req.method === 'DELETE') {
|
|
194
|
+
logger_1.default.info(`🔴 DELETE request intercepted for ${sessionId}`);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
yield event_manager_1.DASHBORD_EVENT_MANAGER.afterSessionCommand(sessionId, commandName, null, req, res, body);
|
|
198
|
+
}
|
|
199
|
+
originalEnd.apply(res, args);
|
|
200
|
+
});
|
|
201
|
+
};
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
function registerProxyMiddlware(expressApp, cliArgs) {
|
|
205
|
+
logger_1.default.info('Registering proxy middleware');
|
|
206
|
+
// Ensure the router and stack exist; plugin code may be loaded before routes are added
|
|
207
|
+
if (!expressApp || !expressApp._router || !Array.isArray(expressApp._router.stack)) {
|
|
208
|
+
logger_1.default.info('Express app router not initialized yet; attaching proxy as a normal middleware');
|
|
209
|
+
expressApp.use('/', handler(cliArgs));
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const index = expressApp._router.stack.findIndex((s) => s.route);
|
|
213
|
+
expressApp.use('/', handler(cliArgs));
|
|
214
|
+
// If index is not found, just push to the stack
|
|
215
|
+
if (index === -1) {
|
|
216
|
+
expressApp._router.stack.push(expressApp._router.stack.pop());
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
expressApp._router.stack.splice(index, 0, expressApp._router.stack.pop());
|
|
220
|
+
}
|
|
221
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
const node_child_process_1 = require("node:child_process");
|
|
46
|
+
const config_1 = require("../config");
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
function main() {
|
|
49
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
+
if (!fs.existsSync(config_1.config.cacheDir)) {
|
|
51
|
+
fs.mkdirSync(config_1.config.cacheDir, { recursive: true });
|
|
52
|
+
}
|
|
53
|
+
(0, node_child_process_1.execSync)(`prisma migrate dev ${process.argv.slice(2).join(' ')}`, {
|
|
54
|
+
env: Object.assign(Object.assign({}, process.env), { DATABASE_URL: `file:${config_1.config.databasePath}` }),
|
|
55
|
+
stdio: 'inherit',
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
(() => __awaiter(void 0, void 0, void 0, function* () { return yield main(); }))();
|
|
@@ -0,0 +1,55 @@
|
|
|
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 node_child_process_1 = require("node:child_process");
|
|
16
|
+
const config_1 = require("../config");
|
|
17
|
+
const prepare_prisma_1 = require("./prepare-prisma");
|
|
18
|
+
const logger_1 = __importDefault(require("../logger"));
|
|
19
|
+
const env = Object.assign(Object.assign({}, process.env), { DATABASE_URL: config_1.config.databaseUrl });
|
|
20
|
+
function executeCmd(cmd) {
|
|
21
|
+
var _a;
|
|
22
|
+
try {
|
|
23
|
+
(0, node_child_process_1.execSync)(cmd, {
|
|
24
|
+
env,
|
|
25
|
+
stdio: 'inherit',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
const msg = (_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : String(error);
|
|
30
|
+
logger_1.default.error(`[DBInit] Failed to execute command: ${cmd} | Error: ${msg}`, error);
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function main() {
|
|
35
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
+
logger_1.default.info(`[DBInit] Preparing database for provider: ${config_1.config.databaseProvider}`);
|
|
37
|
+
// 1. Ensure schema matches provider
|
|
38
|
+
yield (0, prepare_prisma_1.preparePrismaSchema)();
|
|
39
|
+
// 2. Handle Migrations
|
|
40
|
+
if (config_1.config.databaseProvider === 'sqlite') {
|
|
41
|
+
logger_1.default.info('[DBInit] Deploying SQLite migrations...');
|
|
42
|
+
executeCmd('npx prisma migrate deploy');
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// For PostgreSQL, we might not have migrations checked in yet.
|
|
46
|
+
// In "Cellular Architecture", we use db push to ensure the schema is synced
|
|
47
|
+
// without requiring migration history sync across cells.
|
|
48
|
+
logger_1.default.info('[DBInit] Syncing PostgreSQL schema via db push...');
|
|
49
|
+
executeCmd('npx prisma db push --accept-data-loss');
|
|
50
|
+
}
|
|
51
|
+
logger_1.default.info('[DBInit] Generating Prisma Client...');
|
|
52
|
+
executeCmd('npx prisma generate');
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
(() => __awaiter(void 0, void 0, void 0, function* () { return yield main(); }))();
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
16
|
+
// @ts-nocheck
|
|
17
|
+
const unzipper_1 = __importDefault(require("unzipper"));
|
|
18
|
+
const fs_1 = __importDefault(require("fs"));
|
|
19
|
+
const download_1 = __importDefault(require("download"));
|
|
20
|
+
const helpers_1 = require("../helpers");
|
|
21
|
+
const async_wait_until_1 = require("async-wait-until");
|
|
22
|
+
const logger_1 = __importDefault(require("../logger"));
|
|
23
|
+
const logger = logger_1.default.scope('GoIOSInstall');
|
|
24
|
+
const basePath = (0, helpers_1.cachePath)('goIOS');
|
|
25
|
+
function goIOSZipExists(platform) {
|
|
26
|
+
return fs_1.default.existsSync(`${basePath}/go-ios-${platform}.zip`);
|
|
27
|
+
}
|
|
28
|
+
function main() {
|
|
29
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
const platform = (0, helpers_1.isMac)() ? 'mac' : 'linux';
|
|
31
|
+
const source = `https://github.com/danielpaulus/go-ios/releases/download/v1.0.134/go-ios-${platform}.zip`;
|
|
32
|
+
if (!fs_1.default.existsSync(basePath) || !goIOSZipExists(platform)) {
|
|
33
|
+
logger.info('goIOS not found, downloading..');
|
|
34
|
+
if (!fs_1.default.existsSync(basePath))
|
|
35
|
+
fs_1.default.mkdirSync(basePath);
|
|
36
|
+
const path = `${basePath}`;
|
|
37
|
+
yield (0, download_1.default)(source, path);
|
|
38
|
+
yield unzipgoIOS(platform);
|
|
39
|
+
yield setExecutePermission();
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
if (fs_1.default.existsSync(`${basePath}/ios`)) {
|
|
43
|
+
logger.info('go-IOS is already downloaded');
|
|
44
|
+
}
|
|
45
|
+
else if (goIOSZipExists(platform)) {
|
|
46
|
+
unzipgoIOS();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
(() => __awaiter(void 0, void 0, void 0, function* () { return yield main(); }))();
|
|
52
|
+
function unzipgoIOS(platform) {
|
|
53
|
+
fs_1.default.createReadStream(`${basePath}/go-ios-${platform}.zip`).pipe(unzipper_1.default.Extract({ path: `${basePath}/` }));
|
|
54
|
+
}
|
|
55
|
+
function setExecutePermission() {
|
|
56
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
57
|
+
yield (0, async_wait_until_1.waitUntil)(() => fs_1.default.existsSync(`${basePath}/ios`));
|
|
58
|
+
fs_1.default.chmod(`${basePath}/ios`, 0o775, (error) => {
|
|
59
|
+
if (error) {
|
|
60
|
+
logger.error(`Error changing permissions: ${error}`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
logger.info('Permissions are changed for the file!');
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
}
|