@phystack/cli 4.4.29
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/LICENSE.md +19 -0
- package/README.md +24 -0
- package/bin/index.js +2 -0
- package/dist/commands/app/build-apps.js +66 -0
- package/dist/commands/app/build-apps.js.map +1 -0
- package/dist/commands/app/build-container-remote.js +171 -0
- package/dist/commands/app/build-container-remote.js.map +1 -0
- package/dist/commands/app/build-container.js +322 -0
- package/dist/commands/app/build-container.js.map +1 -0
- package/dist/commands/app/build.js +375 -0
- package/dist/commands/app/build.js.map +1 -0
- package/dist/commands/app/create.js +409 -0
- package/dist/commands/app/create.js.map +1 -0
- package/dist/commands/app/deploy.js +176 -0
- package/dist/commands/app/deploy.js.map +1 -0
- package/dist/commands/app/device-picker.js +150 -0
- package/dist/commands/app/device-picker.js.map +1 -0
- package/dist/commands/app/import.js +303 -0
- package/dist/commands/app/import.js.map +1 -0
- package/dist/commands/app/list.js +26 -0
- package/dist/commands/app/list.js.map +1 -0
- package/dist/commands/app/publish.js +327 -0
- package/dist/commands/app/publish.js.map +1 -0
- package/dist/commands/app/settings.js +129 -0
- package/dist/commands/app/settings.js.map +1 -0
- package/dist/commands/app/types.js +13 -0
- package/dist/commands/app/types.js.map +1 -0
- package/dist/commands/app/upload-description.js +139 -0
- package/dist/commands/app/upload-description.js.map +1 -0
- package/dist/commands/app/upload-settings.js +29 -0
- package/dist/commands/app/upload-settings.js.map +1 -0
- package/dist/commands/app/utils.js +86 -0
- package/dist/commands/app/utils.js.map +1 -0
- package/dist/commands/auth/login.js +111 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.js +19 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/descriptor/create.js +143 -0
- package/dist/commands/descriptor/create.js.map +1 -0
- package/dist/commands/descriptor/index.js +36 -0
- package/dist/commands/descriptor/index.js.map +1 -0
- package/dist/commands/descriptor/publish.js +163 -0
- package/dist/commands/descriptor/publish.js.map +1 -0
- package/dist/commands/descriptor/show.js +68 -0
- package/dist/commands/descriptor/show.js.map +1 -0
- package/dist/commands/dev/develop.js +175 -0
- package/dist/commands/dev/develop.js.map +1 -0
- package/dist/commands/dev/forward.js +118 -0
- package/dist/commands/dev/forward.js.map +1 -0
- package/dist/commands/dev/index.js +66 -0
- package/dist/commands/dev/index.js.map +1 -0
- package/dist/commands/dev/list.js +96 -0
- package/dist/commands/dev/list.js.map +1 -0
- package/dist/commands/dev/screen-devtools.js +156 -0
- package/dist/commands/dev/screen-devtools.js.map +1 -0
- package/dist/commands/dev/select.js +118 -0
- package/dist/commands/dev/select.js.map +1 -0
- package/dist/commands/dev/shell.js +171 -0
- package/dist/commands/dev/shell.js.map +1 -0
- package/dist/commands/dev/vnc.js +75 -0
- package/dist/commands/dev/vnc.js.map +1 -0
- package/dist/commands/device/select.js +118 -0
- package/dist/commands/device/select.js.map +1 -0
- package/dist/commands/flash.js +1120 -0
- package/dist/commands/flash.js.map +1 -0
- package/dist/commands/inst/create.js +55 -0
- package/dist/commands/inst/create.js.map +1 -0
- package/dist/commands/inst/index.js +15 -0
- package/dist/commands/inst/index.js.map +1 -0
- package/dist/commands/inst/list.js +26 -0
- package/dist/commands/inst/list.js.map +1 -0
- package/dist/commands/legacydev/debug.js +11 -0
- package/dist/commands/legacydev/debug.js.map +1 -0
- package/dist/commands/legacydev/deploy.js +15 -0
- package/dist/commands/legacydev/deploy.js.map +1 -0
- package/dist/commands/legacydev/dumpTwin.js +27 -0
- package/dist/commands/legacydev/dumpTwin.js.map +1 -0
- package/dist/commands/legacydev/forward.js +104 -0
- package/dist/commands/legacydev/forward.js.map +1 -0
- package/dist/commands/legacydev/index.js +188 -0
- package/dist/commands/legacydev/index.js.map +1 -0
- package/dist/commands/legacydev/invoke.js +29 -0
- package/dist/commands/legacydev/invoke.js.map +1 -0
- package/dist/commands/legacydev/js.js +69 -0
- package/dist/commands/legacydev/js.js.map +1 -0
- package/dist/commands/legacydev/list.js +196 -0
- package/dist/commands/legacydev/list.js.map +1 -0
- package/dist/commands/legacydev/logs.js +60 -0
- package/dist/commands/legacydev/logs.js.map +1 -0
- package/dist/commands/legacydev/modules.js +50 -0
- package/dist/commands/legacydev/modules.js.map +1 -0
- package/dist/commands/legacydev/move.js +23 -0
- package/dist/commands/legacydev/move.js.map +1 -0
- package/dist/commands/legacydev/ota.js +88 -0
- package/dist/commands/legacydev/ota.js.map +1 -0
- package/dist/commands/legacydev/patchTwin.js +21 -0
- package/dist/commands/legacydev/patchTwin.js.map +1 -0
- package/dist/commands/legacydev/pin.js +23 -0
- package/dist/commands/legacydev/pin.js.map +1 -0
- package/dist/commands/legacydev/pub.js +25 -0
- package/dist/commands/legacydev/pub.js.map +1 -0
- package/dist/commands/legacydev/rdp.js +64 -0
- package/dist/commands/legacydev/rdp.js.map +1 -0
- package/dist/commands/legacydev/screen-devtools.js +142 -0
- package/dist/commands/legacydev/screen-devtools.js.map +1 -0
- package/dist/commands/legacydev/settingsShow.js +89 -0
- package/dist/commands/legacydev/settingsShow.js.map +1 -0
- package/dist/commands/legacydev/settingsUpdate.js +114 -0
- package/dist/commands/legacydev/settingsUpdate.js.map +1 -0
- package/dist/commands/legacydev/shell.js +167 -0
- package/dist/commands/legacydev/shell.js.map +1 -0
- package/dist/commands/legacydev/showTwin.js +9 -0
- package/dist/commands/legacydev/showTwin.js.map +1 -0
- package/dist/commands/legacydev/statusLog.js +56 -0
- package/dist/commands/legacydev/statusLog.js.map +1 -0
- package/dist/commands/legacydev/sub.js +39 -0
- package/dist/commands/legacydev/sub.js.map +1 -0
- package/dist/commands/legacydev/vnc.js +61 -0
- package/dist/commands/legacydev/vnc.js.map +1 -0
- package/dist/commands/tenant/index.js +21 -0
- package/dist/commands/tenant/index.js.map +1 -0
- package/dist/commands/tenant/list.js +14 -0
- package/dist/commands/tenant/list.js.map +1 -0
- package/dist/commands/tenant/select.js +87 -0
- package/dist/commands/tenant/select.js.map +1 -0
- package/dist/commands/vm/create.js +718 -0
- package/dist/commands/vm/create.js.map +1 -0
- package/dist/commands/vm/index.js +130 -0
- package/dist/commands/vm/index.js.map +1 -0
- package/dist/commands/vm/list.js +124 -0
- package/dist/commands/vm/list.js.map +1 -0
- package/dist/commands/vm/logs.js +66 -0
- package/dist/commands/vm/logs.js.map +1 -0
- package/dist/commands/vm/remove.js +180 -0
- package/dist/commands/vm/remove.js.map +1 -0
- package/dist/commands/vm/shell.js +400 -0
- package/dist/commands/vm/shell.js.map +1 -0
- package/dist/commands/vm/start.js +861 -0
- package/dist/commands/vm/start.js.map +1 -0
- package/dist/commands/vm/stop.js +232 -0
- package/dist/commands/vm/stop.js.map +1 -0
- package/dist/index.js +158 -0
- package/dist/index.js.map +1 -0
- package/dist/services/admin-api/admin-api.types.js +3 -0
- package/dist/services/admin-api/admin-api.types.js.map +1 -0
- package/dist/services/admin-api/device-modules.admin-api.service.js +58 -0
- package/dist/services/admin-api/device-modules.admin-api.service.js.map +1 -0
- package/dist/services/admin-api/devices-admin-api.service.js +213 -0
- package/dist/services/admin-api/devices-admin-api.service.js.map +1 -0
- package/dist/services/admin-api/gridapps-admin-api.service.js +59 -0
- package/dist/services/admin-api/gridapps-admin-api.service.js.map +1 -0
- package/dist/services/admin-api/index.js +157 -0
- package/dist/services/admin-api/index.js.map +1 -0
- package/dist/services/admin-api/installations-admin-api.service.js +29 -0
- package/dist/services/admin-api/installations-admin-api.service.js.map +1 -0
- package/dist/services/admin-api/organizations-admin-api.service.js +53 -0
- package/dist/services/admin-api/organizations-admin-api.service.js.map +1 -0
- package/dist/services/auth/device-grant-auth.service.js +224 -0
- package/dist/services/auth/device-grant-auth.service.js.map +1 -0
- package/dist/services/phyhub/index.js +200 -0
- package/dist/services/phyhub/index.js.map +1 -0
- package/dist/services/phyhub/phyhub.types.js +3 -0
- package/dist/services/phyhub/phyhub.types.js.map +1 -0
- package/dist/utils/device-fetcher.js +92 -0
- package/dist/utils/device-fetcher.js.map +1 -0
- package/dist/utils/devices.js +41 -0
- package/dist/utils/devices.js.map +1 -0
- package/dist/utils/docker-credentials.js +546 -0
- package/dist/utils/docker-credentials.js.map +1 -0
- package/dist/utils/emulated-device.js +91 -0
- package/dist/utils/emulated-device.js.map +1 -0
- package/dist/utils/index.js +180 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/modules.js +36 -0
- package/dist/utils/modules.js.map +1 -0
- package/dist/utils/org-selector.js +108 -0
- package/dist/utils/org-selector.js.map +1 -0
- package/dist/utils/proxy.js +31 -0
- package/dist/utils/proxy.js.map +1 -0
- package/dist/utils/registry-credentials.js +113 -0
- package/dist/utils/registry-credentials.js.map +1 -0
- package/dist/utils/statuses.js +124 -0
- package/dist/utils/statuses.js.map +1 -0
- package/dist/utils/templates.js +189 -0
- package/dist/utils/templates.js.map +1 -0
- package/dist/utils/tenant-storage.js +88 -0
- package/dist/utils/tenant-storage.js.map +1 -0
- package/dist/utils/vm.js +434 -0
- package/dist/utils/vm.js.map +1 -0
- package/dist/utils/with-spinner.js +20 -0
- package/dist/utils/with-spinner.js.map +1 -0
- package/package.json +103 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
7
|
+
const ws_1 = __importDefault(require("ws"));
|
|
8
|
+
const shell_1 = require("./shell");
|
|
9
|
+
async function getWebSocketDebuggerUrl(port) {
|
|
10
|
+
const response = await fetch(`http://localhost:${port}/json`);
|
|
11
|
+
const targets = await response.json();
|
|
12
|
+
const pageTarget = targets.find((target) => {
|
|
13
|
+
const url = new URL(target.url);
|
|
14
|
+
return (target.type === 'page' &&
|
|
15
|
+
(url.protocol === 'http:' || url.protocol === 'https:' || url.protocol === 'file:'));
|
|
16
|
+
});
|
|
17
|
+
if (!pageTarget) {
|
|
18
|
+
throw new Error('No suitable page target found');
|
|
19
|
+
}
|
|
20
|
+
return pageTarget.webSocketDebuggerUrl;
|
|
21
|
+
}
|
|
22
|
+
async function screenDevTools(deviceName, options) {
|
|
23
|
+
try {
|
|
24
|
+
const { url, port } = options;
|
|
25
|
+
let originalUrl = null;
|
|
26
|
+
let debuggerWs = null;
|
|
27
|
+
// Use provided port or generate random port for DevTools forwarding
|
|
28
|
+
const remotePort = port || Math.floor(10000 + ((Math.random() * 100000) % 10000));
|
|
29
|
+
console.log(chalk_1.default.dim(`Starting Chrome DevTools session on port ${remotePort}...`));
|
|
30
|
+
// Start shell with port forwarding
|
|
31
|
+
try {
|
|
32
|
+
const { shellPromise, process: shellProcess } = await (0, shell_1.shellImpl)(deviceName, {
|
|
33
|
+
L: `${remotePort}:localhost:3000`,
|
|
34
|
+
silent: true,
|
|
35
|
+
detached: true,
|
|
36
|
+
});
|
|
37
|
+
// Unref the child process to prevent it from keeping the event loop running
|
|
38
|
+
shellProcess?.unref();
|
|
39
|
+
// Handle cleanup on process exit
|
|
40
|
+
async function cleanup() {
|
|
41
|
+
if (originalUrl && debuggerWs) {
|
|
42
|
+
console.log(chalk_1.default.dim('Restoring original URL...'));
|
|
43
|
+
try {
|
|
44
|
+
const navigateCommand = {
|
|
45
|
+
id: 1,
|
|
46
|
+
method: 'Page.navigate',
|
|
47
|
+
params: { url: originalUrl },
|
|
48
|
+
};
|
|
49
|
+
debuggerWs.send(JSON.stringify(navigateCommand));
|
|
50
|
+
// Poll the /json endpoint until URL changes back
|
|
51
|
+
const maxAttempts = 20; // 10 seconds total (20 * 500ms)
|
|
52
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
53
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
54
|
+
try {
|
|
55
|
+
const response = await fetch(`http://localhost:${remotePort}/json`);
|
|
56
|
+
const targets = await response.json();
|
|
57
|
+
const pageTarget = targets.find((target) => target.type === 'page');
|
|
58
|
+
if (pageTarget && pageTarget.url === originalUrl) {
|
|
59
|
+
debuggerWs.close();
|
|
60
|
+
console.log(chalk_1.default.green('Successfully restored original URL'));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
console.log(chalk_1.default.yellow(`Failed to check navigation status: ${error.message}`));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
throw new Error('Navigation timeout');
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
console.log(chalk_1.default.yellow(`Failed to restore original URL: ${error.message}`));
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
process.on('SIGINT', async () => {
|
|
77
|
+
await cleanup();
|
|
78
|
+
shellProcess?.kill();
|
|
79
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
80
|
+
process.exit();
|
|
81
|
+
});
|
|
82
|
+
// Wait for the connection and port forwarding to establish
|
|
83
|
+
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
84
|
+
// Launch Chrome/Chromium with inspect page
|
|
85
|
+
console.log(chalk_1.default.dim('Opening Chrome DevTools inspector...'));
|
|
86
|
+
console.log(chalk_1.default.yellow('\nTo debug the remote target:'));
|
|
87
|
+
console.log(chalk_1.default.yellow('1. Click "Configure..." next to "Discover network targets" in Chrome DevTools'));
|
|
88
|
+
console.log(chalk_1.default.yellow(`2. Add "localhost:${remotePort}" to the target discovery settings`));
|
|
89
|
+
console.log(chalk_1.default.yellow('3. Wait for the target to appear under "Remote Target"\n'));
|
|
90
|
+
if (url) {
|
|
91
|
+
console.log(chalk_1.default.dim(`Waiting for debugger to be available...`));
|
|
92
|
+
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
93
|
+
try {
|
|
94
|
+
const debuggerUrl = await getWebSocketDebuggerUrl(remotePort);
|
|
95
|
+
debuggerWs = new ws_1.default(debuggerUrl);
|
|
96
|
+
// Save current URL and establish WebSocket connection
|
|
97
|
+
await new Promise((resolve, reject) => {
|
|
98
|
+
debuggerWs?.on('open', () => {
|
|
99
|
+
console.log(chalk_1.default.dim('WebSocket connection opened'));
|
|
100
|
+
const getUrlCommand = {
|
|
101
|
+
id: 1,
|
|
102
|
+
method: 'Page.getNavigationHistory',
|
|
103
|
+
};
|
|
104
|
+
debuggerWs?.send(JSON.stringify(getUrlCommand));
|
|
105
|
+
});
|
|
106
|
+
const onMessage = (data) => {
|
|
107
|
+
const response = JSON.parse(data.toString());
|
|
108
|
+
if (response.id === 1 && response.result?.entries?.length > 0) {
|
|
109
|
+
const currentEntry = response.result.entries[response.result.currentIndex];
|
|
110
|
+
originalUrl = currentEntry.url;
|
|
111
|
+
console.log(chalk_1.default.dim(`Saved original URL: ${originalUrl}`));
|
|
112
|
+
// Now navigate to the new URL
|
|
113
|
+
const navigateCommand = {
|
|
114
|
+
id: 2,
|
|
115
|
+
method: 'Page.navigate',
|
|
116
|
+
params: { url },
|
|
117
|
+
};
|
|
118
|
+
debuggerWs?.send(JSON.stringify(navigateCommand));
|
|
119
|
+
}
|
|
120
|
+
else if (response.id === 2) {
|
|
121
|
+
debuggerWs?.removeListener('message', onMessage);
|
|
122
|
+
console.log(chalk_1.default.green(`Successfully navigated to ${url}`));
|
|
123
|
+
resolve();
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
debuggerWs?.on('message', onMessage);
|
|
127
|
+
debuggerWs?.on('error', (error) => {
|
|
128
|
+
console.log(chalk_1.default.red(`WebSocket error: ${error.message}`));
|
|
129
|
+
reject(error);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
console.log(chalk_1.default.yellow(`Failed to navigate to URL: ${error.message}`));
|
|
135
|
+
console.log(chalk_1.default.yellow('You may need to navigate manually.'));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
console.log(chalk_1.default.dim('\nPress Ctrl+C when done.'));
|
|
139
|
+
// Await the shell promise
|
|
140
|
+
await shellPromise;
|
|
141
|
+
return shellPromise;
|
|
142
|
+
}
|
|
143
|
+
catch (shellError) {
|
|
144
|
+
if (shellError.message && shellError.message.includes('Unauthorized')) {
|
|
145
|
+
throw new Error(`Unauthorized. Please run "phy login" to use this command.`);
|
|
146
|
+
}
|
|
147
|
+
throw shellError;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
console.error(chalk_1.default.red(error.toString()));
|
|
152
|
+
process.exit(1);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
exports.default = screenDevTools;
|
|
156
|
+
//# sourceMappingURL=screen-devtools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen-devtools.js","sourceRoot":"","sources":["../../../src/commands/dev/screen-devtools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
40
|
+
const device_picker_1 = require("../app/device-picker");
|
|
41
|
+
const org_selector_1 = require("../../utils/org-selector");
|
|
42
|
+
const tenant_storage_1 = require("../../utils/tenant-storage");
|
|
43
|
+
const emulated_device_1 = require("../../utils/emulated-device");
|
|
44
|
+
/**
|
|
45
|
+
* Command to select a device for emulation
|
|
46
|
+
*/
|
|
47
|
+
exports.default = async (options = {}) => {
|
|
48
|
+
try {
|
|
49
|
+
// Check if we need to clear the saved device
|
|
50
|
+
if (options.clear) {
|
|
51
|
+
await (0, emulated_device_1.clearEmulatedDevice)();
|
|
52
|
+
console.log(chalk_1.default.green('Cleared saved device.'));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Check if we already have a saved device
|
|
56
|
+
const hasDevice = await (0, emulated_device_1.hasEmulatedDevice)();
|
|
57
|
+
if (hasDevice) {
|
|
58
|
+
const device = await (0, emulated_device_1.getEmulatedDevice)();
|
|
59
|
+
const deviceInfo = device.displayName || device.deviceSerial
|
|
60
|
+
? `${device.name} (ID: ${device.id}${device.deviceSerial ? `, Serial: ${device.deviceSerial}` : ''})`
|
|
61
|
+
: `${device.name} (${device.id})`;
|
|
62
|
+
console.log(chalk_1.default.green(`Current device: ${chalk_1.default.blue(deviceInfo)}`));
|
|
63
|
+
// Ask if the user wants to change it
|
|
64
|
+
const inquirer = (await Promise.resolve().then(() => __importStar(require('inquirer')))).default;
|
|
65
|
+
const { changeDevice } = await inquirer.prompt([
|
|
66
|
+
{
|
|
67
|
+
type: 'confirm',
|
|
68
|
+
name: 'changeDevice',
|
|
69
|
+
message: 'Would you like to select a different device?',
|
|
70
|
+
default: false,
|
|
71
|
+
},
|
|
72
|
+
]);
|
|
73
|
+
if (!changeDevice) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// First check if we have a saved tenant
|
|
78
|
+
let organization;
|
|
79
|
+
if (await (0, tenant_storage_1.hasTenant)()) {
|
|
80
|
+
organization = await (0, tenant_storage_1.getTenant)();
|
|
81
|
+
console.log(chalk_1.default.dim(`Using saved tenant: ${organization.displayName}`));
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// Select a tenant if not already saved
|
|
85
|
+
organization = await (0, org_selector_1.selectOrganization)('Select an organization to find devices:');
|
|
86
|
+
}
|
|
87
|
+
if (!organization) {
|
|
88
|
+
console.log(chalk_1.default.yellow('No organization selected. Exiting.'));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// Select a device from the chosen organization
|
|
92
|
+
console.log(chalk_1.default.dim('Please select a device for emulation:'));
|
|
93
|
+
const device = await (0, device_picker_1.selectDevice)(organization.slug);
|
|
94
|
+
if (!device) {
|
|
95
|
+
console.log(chalk_1.default.yellow('No device selected. Operation cancelled.'));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// Save the selected device with all information for legibility
|
|
99
|
+
await (0, emulated_device_1.saveEmulatedDevice)({
|
|
100
|
+
id: device.id,
|
|
101
|
+
name: device.name,
|
|
102
|
+
accessKey: device.accessKey,
|
|
103
|
+
displayName: device.displayName,
|
|
104
|
+
deviceSerial: device.deviceSerial,
|
|
105
|
+
});
|
|
106
|
+
// Show more detailed device info in the success message
|
|
107
|
+
const deviceInfo = device.displayName || device.deviceSerial
|
|
108
|
+
? `${device.name} (ID: ${device.id}${device.deviceSerial ? `, Serial: ${device.deviceSerial}` : ''})`
|
|
109
|
+
: `${device.name} (${device.id})`;
|
|
110
|
+
console.log(chalk_1.default.green(`Successfully selected device: ${chalk_1.default.blue(deviceInfo)}`));
|
|
111
|
+
console.log(chalk_1.default.dim('This device will be used for emulation in all screen applications.'));
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
console.error(chalk_1.default.red(`Error selecting device: ${error.message}`));
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../../src/commands/dev/select.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.shellImpl = shellImpl;
|
|
7
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
8
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
9
|
+
const child_process_1 = __importDefault(require("child_process"));
|
|
10
|
+
const net_1 = __importDefault(require("net"));
|
|
11
|
+
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
const os_1 = __importDefault(require("os"));
|
|
15
|
+
const utils_1 = require("../../utils");
|
|
16
|
+
const admin_api_1 = require("../../services/admin-api");
|
|
17
|
+
async function shellImpl(deviceName, options) {
|
|
18
|
+
let forward = options.L;
|
|
19
|
+
const { silent, detached } = options;
|
|
20
|
+
if (!silent)
|
|
21
|
+
console.log(chalk_1.default.dim('> creating keypair'));
|
|
22
|
+
const keyfile = path_1.default.join(os_1.default.tmpdir(), `gridapp${Math.floor(Math.random() * 1000)}.key`);
|
|
23
|
+
if (fs_1.default.existsSync(keyfile)) {
|
|
24
|
+
fs_1.default.unlinkSync(keyfile);
|
|
25
|
+
}
|
|
26
|
+
if (fs_1.default.existsSync(`${keyfile}.pub`)) {
|
|
27
|
+
fs_1.default.unlinkSync(`${keyfile}.pub`);
|
|
28
|
+
}
|
|
29
|
+
child_process_1.default.execSync(`ssh-keygen -t ed25519 -f ${keyfile} -N ""`);
|
|
30
|
+
const key = fs_1.default.readFileSync(`${keyfile}.pub`).toString();
|
|
31
|
+
let stream;
|
|
32
|
+
let isPhyos = true;
|
|
33
|
+
try {
|
|
34
|
+
if (!silent)
|
|
35
|
+
console.log(chalk_1.default.dim(`Connecting to PhyHub for device: ${deviceName}`));
|
|
36
|
+
const { stream: curStream, isPhyos: isPhyosDevice } = (0, utils_1.openStream)(await (0, admin_api_1.adminApi)().devices.startPhyHubDeviceShellSession(deviceName, { key }));
|
|
37
|
+
stream = curStream;
|
|
38
|
+
isPhyos = isPhyosDevice;
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
if (err.message && err.message.includes('Unauthorized')) {
|
|
42
|
+
throw new Error(`Unauthorized. Please run "phy login" to use this command.`);
|
|
43
|
+
}
|
|
44
|
+
throw new Error(`Unable to establish connection to the device. Please try again. ${err}`);
|
|
45
|
+
}
|
|
46
|
+
let socketDataCounter = 0;
|
|
47
|
+
const keepAliveDurationSeconds = 25;
|
|
48
|
+
const timeoutDuration = 1000 * (keepAliveDurationSeconds + 5);
|
|
49
|
+
// Each interval lasts 30 seconds (timeoutDuration)
|
|
50
|
+
// 15 minutes = 15 × 60 = 900 seconds -> 900 seconds ÷ 30 seconds/interval = 30 intervals
|
|
51
|
+
const maxInactivityCount = 30; // 15 mins
|
|
52
|
+
let inactivityFlagCounter = 0;
|
|
53
|
+
let activityCheckInterval;
|
|
54
|
+
function startActivityCheckInterval() {
|
|
55
|
+
// Don't start activity check if detached mode is enabled
|
|
56
|
+
if (detached) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
clearInterval(activityCheckInterval);
|
|
60
|
+
activityCheckInterval = setInterval(() => {
|
|
61
|
+
if (socketDataCounter > 3) {
|
|
62
|
+
inactivityFlagCounter = 0;
|
|
63
|
+
socketDataCounter = 0;
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
inactivityFlagCounter += 1;
|
|
67
|
+
if (inactivityFlagCounter >= maxInactivityCount) {
|
|
68
|
+
console.log(chalk_1.default.dim('> No activity for ~15 min, terminating connection.'));
|
|
69
|
+
stream.destroy();
|
|
70
|
+
clearInterval(activityCheckInterval);
|
|
71
|
+
}
|
|
72
|
+
socketDataCounter = 0;
|
|
73
|
+
}, timeoutDuration);
|
|
74
|
+
}
|
|
75
|
+
stream.on('data', () => {
|
|
76
|
+
socketDataCounter += 1;
|
|
77
|
+
});
|
|
78
|
+
stream.on('connect', () => {
|
|
79
|
+
startActivityCheckInterval();
|
|
80
|
+
});
|
|
81
|
+
const port = Math.floor(10000 + ((Math.random() * 100000) % 10000));
|
|
82
|
+
let fwdPort = Math.floor(10000 + ((Math.random() * 100000) % 10000));
|
|
83
|
+
// support for -L fwdPort:host:dstPort option
|
|
84
|
+
if (forward) {
|
|
85
|
+
const split = forward.split(':');
|
|
86
|
+
if (split.length === 3) {
|
|
87
|
+
fwdPort = split.shift();
|
|
88
|
+
forward = split.join(':');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (!silent)
|
|
92
|
+
console.log(chalk_1.default.dim('> waiting for client'));
|
|
93
|
+
// wait for a single connection
|
|
94
|
+
const connPromise = new Promise((resolve) => {
|
|
95
|
+
const server = net_1.default.createServer((c) => {
|
|
96
|
+
server.close();
|
|
97
|
+
resolve(c);
|
|
98
|
+
});
|
|
99
|
+
server.listen(port, () => {
|
|
100
|
+
if (!silent)
|
|
101
|
+
console.log(chalk_1.default.dim(`> ssh listening on port ${chalk_1.default.blue(port)}`));
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
const fwdOptions = forward ? ['-L', `0.0.0.0:${fwdPort}:${forward}`] : [];
|
|
105
|
+
const sshProcess = child_process_1.default.spawn('ssh', [
|
|
106
|
+
'-qtt',
|
|
107
|
+
`${isPhyos ? 'phygrid' : 'ombori'}@localhost`,
|
|
108
|
+
...fwdOptions,
|
|
109
|
+
'-p',
|
|
110
|
+
`${port}`,
|
|
111
|
+
'-o',
|
|
112
|
+
'UserKnownHostsFile=/dev/null',
|
|
113
|
+
'-o',
|
|
114
|
+
'StrictHostKeyChecking=no',
|
|
115
|
+
'-o',
|
|
116
|
+
`ServerAliveInterval=${keepAliveDurationSeconds}`,
|
|
117
|
+
'-i',
|
|
118
|
+
keyfile,
|
|
119
|
+
], {
|
|
120
|
+
stdio: silent ? 'ignore' : 'inherit',
|
|
121
|
+
detached,
|
|
122
|
+
});
|
|
123
|
+
// Prevent the child from receiving SIGINT
|
|
124
|
+
process.removeAllListeners('SIGINT');
|
|
125
|
+
const conn = await connPromise;
|
|
126
|
+
if (forward && !silent) {
|
|
127
|
+
const prefix = /:443$/.test(forward) ? 'https://' : 'http://';
|
|
128
|
+
console.log(chalk_1.default.dim(`> port ${chalk_1.default.blue(`${prefix}${forward}`)} fowarded to ${chalk_1.default.bold(chalk_1.default.green(`${prefix}localhost:${fwdPort}`))}`));
|
|
129
|
+
}
|
|
130
|
+
if (!silent)
|
|
131
|
+
console.log(chalk_1.default.dim('> client connected'));
|
|
132
|
+
conn.on('end', () => {
|
|
133
|
+
if (!silent)
|
|
134
|
+
console.log(chalk_1.default.dim('> client disconnected'));
|
|
135
|
+
});
|
|
136
|
+
// removing key file
|
|
137
|
+
setTimeout(() => {
|
|
138
|
+
fs_1.default.unlinkSync(keyfile);
|
|
139
|
+
}, 10000);
|
|
140
|
+
return {
|
|
141
|
+
shellPromise: new Promise((resolve, reject) => {
|
|
142
|
+
conn.pipe(stream);
|
|
143
|
+
stream.pipe(conn);
|
|
144
|
+
stream.on('error', () => {
|
|
145
|
+
if (!silent)
|
|
146
|
+
console.log(chalk_1.default.red('> socket error'));
|
|
147
|
+
clearInterval(activityCheckInterval);
|
|
148
|
+
reject();
|
|
149
|
+
});
|
|
150
|
+
stream.on('close', (e) => {
|
|
151
|
+
if (!silent)
|
|
152
|
+
console.log(chalk_1.default.dim('> socket closed'));
|
|
153
|
+
clearInterval(activityCheckInterval);
|
|
154
|
+
resolve();
|
|
155
|
+
});
|
|
156
|
+
}),
|
|
157
|
+
process: sshProcess,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
async function shell(deviceName, options) {
|
|
161
|
+
try {
|
|
162
|
+
const { shellPromise, process } = await shellImpl(deviceName, options);
|
|
163
|
+
await shellPromise;
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
console.error(chalk_1.default.red(error.toString()));
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.default = shell;
|
|
171
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/commands/dev/shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
7
|
+
const child_process_1 = __importDefault(require("child_process"));
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const shell_1 = require("./shell");
|
|
10
|
+
const VNC_PATH = {
|
|
11
|
+
darwin: '/Applications/VNC Viewer.app',
|
|
12
|
+
win32: 'c:\\Program Files\\RealVNC\\VNC Viewer\\vncviewer.exe',
|
|
13
|
+
linux: '/usr/bin/vncviewer',
|
|
14
|
+
};
|
|
15
|
+
async function vnc(deviceName, options) {
|
|
16
|
+
try {
|
|
17
|
+
const exeName = VNC_PATH[process.platform];
|
|
18
|
+
// Verify VNC viewer is installed
|
|
19
|
+
if (!exeName) {
|
|
20
|
+
throw new Error(`VNC command is not supported on platform ${process.platform}`);
|
|
21
|
+
}
|
|
22
|
+
if (!fs_1.default.existsSync(exeName)) {
|
|
23
|
+
throw new Error(`VNC Viewer not found, please install from ${chalk_1.default.blueBright('https://www.realvnc.com/en/connect/download/viewer/')}`);
|
|
24
|
+
}
|
|
25
|
+
// Generate random port for VNC forwarding
|
|
26
|
+
const fwdPort = Math.floor(10000 + ((Math.random() * 100000) % 10000));
|
|
27
|
+
console.log(chalk_1.default.dim('Starting VNC session...'));
|
|
28
|
+
// Start shell with port forwarding and detached mode
|
|
29
|
+
const { shellPromise, process: shellProcess } = await (0, shell_1.shellImpl)(deviceName, {
|
|
30
|
+
L: `${fwdPort}:localhost:5900`,
|
|
31
|
+
silent: true,
|
|
32
|
+
detached: true,
|
|
33
|
+
});
|
|
34
|
+
// Unref the child process to prevent it from keeping the event loop running
|
|
35
|
+
shellProcess?.unref();
|
|
36
|
+
// Wait longer for the connection and port forwarding to establish
|
|
37
|
+
await new Promise((resolve) => setTimeout(resolve, 8000));
|
|
38
|
+
// Launch VNC viewer
|
|
39
|
+
const vncTarget = `127.0.0.1:${fwdPort}`;
|
|
40
|
+
console.log(chalk_1.default.dim(`Starting local VNC client pointing to ${vncTarget}...`));
|
|
41
|
+
if (process.platform === 'darwin') {
|
|
42
|
+
child_process_1.default.spawn('open', [
|
|
43
|
+
'-n',
|
|
44
|
+
exeName,
|
|
45
|
+
'--args',
|
|
46
|
+
'WarnUnencrypted=0',
|
|
47
|
+
'SecurityNotificationTimeout=0',
|
|
48
|
+
vncTarget,
|
|
49
|
+
]);
|
|
50
|
+
}
|
|
51
|
+
else if (process.platform === 'linux') {
|
|
52
|
+
child_process_1.default.exec(`${exeName} WarnUnencrypted=0 SecurityNotificationTimeout=0 ${vncTarget}`);
|
|
53
|
+
}
|
|
54
|
+
else if (process.platform === 'win32') {
|
|
55
|
+
child_process_1.default.spawn(exeName, [
|
|
56
|
+
'WarnUnencrypted=0',
|
|
57
|
+
'SecurityNotificationTimeout=0',
|
|
58
|
+
vncTarget,
|
|
59
|
+
]);
|
|
60
|
+
}
|
|
61
|
+
console.log(chalk_1.default.dim(`VNC connection established at ${vncTarget}. Press Ctrl+C when done.`));
|
|
62
|
+
return shellPromise;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (error.message && error.message.includes('Unauthorized')) {
|
|
66
|
+
console.error(chalk_1.default.red(`Unauthorized. Please run "phy login" to use this command.`));
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.error(chalk_1.default.red(error.toString()));
|
|
70
|
+
}
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.default = vnc;
|
|
75
|
+
//# sourceMappingURL=vnc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vnc.js","sourceRoot":"","sources":["../../../src/commands/dev/vnc.ts"],"names":[],"mappings":"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"}
|