mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-04 15:50:20 +00:00
feat: add exec host routing + node daemon
This commit is contained in:
74
src/node-host/config.ts
Normal file
74
src/node-host/config.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
import crypto from "node:crypto";
|
||||
import fs from "node:fs/promises";
|
||||
import path from "node:path";
|
||||
|
||||
import { resolveStateDir } from "../config/paths.js";
|
||||
|
||||
export type NodeHostGatewayConfig = {
|
||||
host?: string;
|
||||
port?: number;
|
||||
tls?: boolean;
|
||||
tlsFingerprint?: string;
|
||||
};
|
||||
|
||||
export type NodeHostConfig = {
|
||||
version: 1;
|
||||
nodeId: string;
|
||||
token?: string;
|
||||
displayName?: string;
|
||||
gateway?: NodeHostGatewayConfig;
|
||||
};
|
||||
|
||||
const NODE_HOST_FILE = "node.json";
|
||||
|
||||
export function resolveNodeHostConfigPath(): string {
|
||||
return path.join(resolveStateDir(), NODE_HOST_FILE);
|
||||
}
|
||||
|
||||
function normalizeConfig(config: Partial<NodeHostConfig> | null): NodeHostConfig {
|
||||
const base: NodeHostConfig = {
|
||||
version: 1,
|
||||
nodeId: "",
|
||||
token: config?.token,
|
||||
displayName: config?.displayName,
|
||||
gateway: config?.gateway,
|
||||
};
|
||||
if (config?.version === 1 && typeof config.nodeId === "string") {
|
||||
base.nodeId = config.nodeId.trim();
|
||||
}
|
||||
if (!base.nodeId) {
|
||||
base.nodeId = crypto.randomUUID();
|
||||
}
|
||||
return base;
|
||||
}
|
||||
|
||||
export async function loadNodeHostConfig(): Promise<NodeHostConfig | null> {
|
||||
const filePath = resolveNodeHostConfigPath();
|
||||
try {
|
||||
const raw = await fs.readFile(filePath, "utf8");
|
||||
const parsed = JSON.parse(raw) as Partial<NodeHostConfig>;
|
||||
return normalizeConfig(parsed);
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
export async function saveNodeHostConfig(config: NodeHostConfig): Promise<void> {
|
||||
const filePath = resolveNodeHostConfigPath();
|
||||
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
||||
const payload = JSON.stringify(config, null, 2);
|
||||
await fs.writeFile(filePath, `${payload}\n`, { mode: 0o600 });
|
||||
try {
|
||||
await fs.chmod(filePath, 0o600);
|
||||
} catch {
|
||||
// best-effort on platforms without chmod
|
||||
}
|
||||
}
|
||||
|
||||
export async function ensureNodeHostConfig(): Promise<NodeHostConfig> {
|
||||
const existing = await loadNodeHostConfig();
|
||||
const normalized = normalizeConfig(existing);
|
||||
await saveNodeHostConfig(normalized);
|
||||
return normalized;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user