Files
openclaw/src/secrets/shared.ts
2026-05-31 01:37:44 -04:00

74 lines
2.2 KiB
TypeScript

import fs from "node:fs";
import path from "node:path";
import { privateFileStoreSync } from "../infra/private-file-store.js";
import { replaceFileAtomicSync } from "../infra/replace-file.js";
import { resolvePositiveTimerTimeoutMs } from "../shared/number-coercion.js";
export { isRecord } from "../utils.js";
export function isNonEmptyString(value: unknown): value is string {
return typeof value === "string" && value.trim().length > 0;
}
export function parseEnvValue(raw: string): string {
const trimmed = raw.trim();
if (
(trimmed.startsWith('"') && trimmed.endsWith('"')) ||
(trimmed.startsWith("'") && trimmed.endsWith("'"))
) {
return trimmed.slice(1, -1);
}
return trimmed;
}
export function normalizePositiveInt(value: unknown, fallback: number): number {
if (typeof value === "number" && Number.isFinite(value)) {
return Math.max(1, Math.floor(value));
}
return Math.max(1, Math.floor(fallback));
}
export function normalizePositiveTimerMs(value: unknown, fallback: number): number {
return resolvePositiveTimerTimeoutMs(value, fallback);
}
export function parseDotPath(pathname: string): string[] {
return pathname
.split(".")
.map((segment) => segment.trim())
.filter((segment) => segment.length > 0);
}
export function toDotPath(segments: string[]): string {
return segments.join(".");
}
export function ensureDirForFile(filePath: string): void {
fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: 0o700 });
}
export function writeJsonFileSecure(pathname: string, value: unknown): void {
privateFileStoreSync(path.dirname(pathname)).writeJson(path.basename(pathname), value, {
trailingNewline: true,
});
}
export function readTextFileIfExists(pathname: string): string | null {
if (!fs.existsSync(pathname)) {
return null;
}
return fs.readFileSync(pathname, "utf8");
}
export function writeTextFileAtomic(pathname: string, value: string, mode = 0o600): void {
if (mode !== 0o600) {
replaceFileAtomicSync({
filePath: pathname,
content: value,
mode,
tempPrefix: ".openclaw-secrets",
});
return;
}
privateFileStoreSync(path.dirname(pathname)).writeText(path.basename(pathname), value);
}