Files

115 lines
3.6 KiB
JavaScript

import { readInstanceOptions } from './cli-process.js';
import { discoverLifecycleInstances, discoverDesktopInstance } from './cli-lifecycle.js';
import {
intro as clackIntro,
outro as clackOutro,
isJsonMode,
isQuietMode,
printJson,
logStatus,
} from '../cli-output.js';
async function statusCommand(options = {}) {
const [runningInstances, desktopInstance] = options.explicitPort
? [await discoverLifecycleInstances(options), null]
: await Promise.all([
discoverLifecycleInstances(options),
discoverDesktopInstance(),
]);
const toPasswordProtectionLabel = (value) => {
if (value === true) return 'yes';
if (value === false) return 'no';
return 'unknown';
};
const desktopOnly = desktopInstance && !runningInstances.some((entry) => entry.port === desktopInstance.port)
? {
runtime: 'desktop',
port: desktopInstance.port,
pid: Number.isFinite(desktopInstance.pid) ? desktopInstance.pid : null,
launchMode: null,
passwordProtected: null,
}
: null;
const cliInstances = runningInstances
.filter((instance) => instance.runtime !== 'desktop')
.map((instance) => {
const storedOptions = instance.instanceFilePath ? (readInstanceOptions(instance.instanceFilePath) || {}) : {};
const passwordProtected = storedOptions.hasUiPassword === true
|| (typeof storedOptions.uiPassword === 'string' && storedOptions.uiPassword.trim().length > 0);
return {
runtime: instance.source === 'probe' ? 'unmanaged' : 'cli',
port: instance.port,
pid: instance.pid,
launchMode: instance.launchMode || 'daemon',
passwordProtected: instance.source === 'probe' ? null : passwordProtected,
};
});
const explicitDesktop = options.explicitPort
? runningInstances.find((entry) => entry.runtime === 'desktop')
: null;
const instances = desktopOnly ? [...cliInstances, desktopOnly] : cliInstances;
if (explicitDesktop) {
instances.push({
runtime: 'desktop',
port: explicitDesktop.port,
pid: Number.isFinite(explicitDesktop.pid) ? explicitDesktop.pid : null,
launchMode: null,
passwordProtected: null,
});
}
const runningCount = instances.length;
if (isJsonMode(options)) {
printJson({
state: runningCount > 0 ? 'running' : 'stopped',
runningCount,
instances,
});
return;
}
if (isQuietMode(options)) {
if (runningCount === 0) {
process.stdout.write('stopped\n');
return;
}
for (const instance of instances) {
process.stdout.write(
`port ${instance.port} mode:${instance.launchMode || 'n/a'} pass:${toPasswordProtectionLabel(instance.passwordProtected)}\n`
);
}
return;
}
clackIntro('OpenChamber Status');
if (runningCount === 0) {
logStatus('warning', 'stopped');
clackOutro('no running instances');
return;
}
for (const instance of instances) {
const pidSuffix = Number.isFinite(instance.pid) ? ` (PID: ${instance.pid})` : '';
const modeDetail = instance.launchMode ? `mode: ${instance.launchMode}` : '';
const protectionDetail = `password: ${toPasswordProtectionLabel(instance.passwordProtected)}`;
const detail = modeDetail ? `${modeDetail}; ${protectionDetail}` : protectionDetail;
if (instance.runtime === 'desktop') {
logStatus('info', `desktop app on port ${instance.port}${pidSuffix}`, detail);
} else {
logStatus('success', `port ${instance.port}${pidSuffix}`, detail);
}
}
clackOutro(`${runningCount} running runtime(s)`);
}
export { statusCommand };