Fixed lazy CLI helper imports for tunnel flows Restored update command version detection Made web test and dead-code commands run reliably
114 lines
2.9 KiB
JavaScript
114 lines
2.9 KiB
JavaScript
import fs from 'fs';
|
|
import os from 'os';
|
|
import path from 'path';
|
|
|
|
const TUNNEL_PROFILES_FILE_NAME = 'tunnel-profiles.json';
|
|
const LEGACY_CLOUDFLARE_MANAGED_REMOTE_FILE_NAME = 'cloudflare-managed-remote-tunnels.json';
|
|
const TUNNEL_CLI_STATE_FILE_NAME = 'tunnel-cli-state.json';
|
|
|
|
function getDataDir() {
|
|
if (typeof process.env.OPENCHAMBER_DATA_DIR === 'string' && process.env.OPENCHAMBER_DATA_DIR.trim().length > 0) {
|
|
return path.resolve(process.env.OPENCHAMBER_DATA_DIR.trim());
|
|
}
|
|
return path.join(os.homedir(), '.config', 'openchamber');
|
|
}
|
|
|
|
function getLogsDir() {
|
|
return path.join(getDataDir(), 'logs');
|
|
}
|
|
|
|
function getSettingsFilePath() {
|
|
return path.join(getDataDir(), 'settings.json');
|
|
}
|
|
|
|
function readDesktopLocalPortFromSettings() {
|
|
try {
|
|
const raw = fs.readFileSync(getSettingsFilePath(), 'utf8');
|
|
const parsed = JSON.parse(raw);
|
|
const value = parsed?.desktopLocalPort;
|
|
if (Number.isFinite(value) && value > 0 && value <= 65535) {
|
|
return value;
|
|
}
|
|
return null;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function ensureLogsDir() {
|
|
fs.mkdirSync(getLogsDir(), { recursive: true });
|
|
}
|
|
|
|
function getLogFilePath(port) {
|
|
return path.join(getLogsDir(), `openchamber-${port}.log`);
|
|
}
|
|
|
|
function getTunnelProfilesFilePath() {
|
|
return path.join(getDataDir(), TUNNEL_PROFILES_FILE_NAME);
|
|
}
|
|
|
|
function getLegacyCloudflareManagedRemoteFilePath() {
|
|
return path.join(getDataDir(), LEGACY_CLOUDFLARE_MANAGED_REMOTE_FILE_NAME);
|
|
}
|
|
|
|
function getTunnelCliStateFilePath() {
|
|
return path.join(getDataDir(), TUNNEL_CLI_STATE_FILE_NAME);
|
|
}
|
|
|
|
function readTunnelCliState() {
|
|
const filePath = getTunnelCliStateFilePath();
|
|
try {
|
|
const raw = fs.readFileSync(filePath, 'utf8');
|
|
const parsed = JSON.parse(raw);
|
|
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
return {};
|
|
}
|
|
return parsed;
|
|
} catch {
|
|
return {};
|
|
}
|
|
}
|
|
|
|
function readLastManagedLocalConfigPath() {
|
|
const state = readTunnelCliState();
|
|
if (typeof state.lastManagedLocalConfigPath !== 'string') {
|
|
return '';
|
|
}
|
|
return state.lastManagedLocalConfigPath.trim();
|
|
}
|
|
|
|
function writeLastManagedLocalConfigPath(configPath) {
|
|
if (typeof configPath !== 'string' || configPath.trim().length === 0) {
|
|
return;
|
|
}
|
|
const filePath = getTunnelCliStateFilePath();
|
|
const current = readTunnelCliState();
|
|
const next = {
|
|
...current,
|
|
lastManagedLocalConfigPath: configPath.trim(),
|
|
updatedAt: Date.now(),
|
|
};
|
|
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
fs.writeFileSync(filePath, JSON.stringify(next, null, 2), 'utf8');
|
|
}
|
|
|
|
|
|
function getRunDir() {
|
|
const dir = path.join(getDataDir(), 'run');
|
|
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
return dir;
|
|
}
|
|
|
|
|
|
export {
|
|
getDataDir,
|
|
readDesktopLocalPortFromSettings,
|
|
ensureLogsDir,
|
|
getLogFilePath,
|
|
getTunnelProfilesFilePath,
|
|
getLegacyCloudflareManagedRemoteFilePath,
|
|
readLastManagedLocalConfigPath,
|
|
writeLastManagedLocalConfigPath,
|
|
getRunDir,
|
|
};
|