Files
stream-control/packages/agent/src/config.ts
jeanotx32 6f6e829ad5
Some checks failed
release / build (push) Successful in 24s
release / verify-windows (push) Failing after 1m3s
Fix : windows verify crash 1
2026-08-11 17:25:28 +02:00

83 lines
2.9 KiB
TypeScript

import fs from 'node:fs';
import os from 'node:os';
import path from 'node:path';
import type { ObsSettings } from '@stream-control/shared';
import { DEFAULT_OBS_SETTINGS } from '@stream-control/shared';
export interface AgentConfig {
/** URL WebSocket du serveur de contrôle, ex. wss://control.exemple.com/ws/agent */
serverUrl: string;
/** Jeton d'enrôlement au premier démarrage, puis jeton propre à l'agent. */
token: string;
/** Attribué par le serveur lors de l'enrôlement. */
agentId?: string;
/** Nom affiché dans le dashboard. */
name: string;
/** Repli local si le serveur n'a pas encore poussé de configuration OBS. */
obs: ObsSettings;
/** Ignorer les erreurs de certificat TLS (utile en auto-signé). */
insecureTls?: boolean;
}
const CONFIG_PATH = path.resolve(
process.env.AGENT_CONFIG ?? path.join(process.cwd(), 'agent.config.json'),
);
function readFile(): Partial<AgentConfig> {
if (!fs.existsSync(CONFIG_PATH)) return {};
try {
// Les éditeurs Windows (et Set-Content -Encoding UTF8) préfixent un BOM que
// JSON.parse rejette.
const raw = fs.readFileSync(CONFIG_PATH, 'utf8').replace(/^\uFEFF/, '');
return JSON.parse(raw) as Partial<AgentConfig>;
} catch (err) {
console.error(`Configuration illisible (${CONFIG_PATH}) :`, err);
return {};
}
}
/** Le fichier fournit les valeurs par défaut, l'environnement a priorité. */
export function loadConfig(): AgentConfig {
const file = readFile();
const config: AgentConfig = {
serverUrl: process.env.SERVER_URL ?? file.serverUrl ?? 'ws://127.0.0.1:8080/ws/agent',
token: process.env.AGENT_TOKEN ?? file.token ?? '',
agentId: process.env.AGENT_ID ?? file.agentId,
name: process.env.AGENT_NAME ?? file.name ?? os.hostname(),
obs: {
host: process.env.OBS_HOST ?? file.obs?.host ?? DEFAULT_OBS_SETTINGS.host,
port: Number(process.env.OBS_PORT ?? file.obs?.port ?? DEFAULT_OBS_SETTINGS.port),
password: process.env.OBS_PASSWORD ?? file.obs?.password ?? DEFAULT_OBS_SETTINGS.password,
},
insecureTls: process.env.INSECURE_TLS === '1' || file.insecureTls === true,
};
if (!config.token) {
throw new Error(
`Aucun jeton. Renseigne "token" dans ${CONFIG_PATH} (jeton d'enrôlement ou jeton d'agent) ou la variable AGENT_TOKEN.`,
);
}
return config;
}
/**
* Persiste l'identité reçue du serveur pour que les redémarrages suivants
* réutilisent le jeton permanent au lieu du jeton d'enrôlement.
*/
export function persistIdentity(agentId: string, token: string): void {
const current = readFile();
const next = { ...current, agentId, token };
try {
fs.writeFileSync(CONFIG_PATH, `${JSON.stringify(next, null, 2)}\n`, { mode: 0o600 });
console.log(`Identité d'agent enregistrée dans ${CONFIG_PATH}`);
} catch (err) {
console.error(
`Impossible d'écrire ${CONFIG_PATH} — l'agent devra se ré-enrôler au prochain démarrage :`,
err,
);
}
}
export { CONFIG_PATH };