9router / src /lib /db /backup.js
2api
feat: configurable stream stall timeout + per-provider UI
88c4c60
Raw
History Blame Contribute Delete
1.19 kB
import fs from "node:fs";
import path from "node:path";
import { BACKUPS_DIR, ensureDirs } from "./paths.js";
import { timestampSlug, getAppVersion } from "./version.js";
const KEEP_BACKUPS = 5;
export function makeBackupDir(label) {
ensureDirs();
const ver = getAppVersion();
const slug = `${label}-${ver}-${timestampSlug()}`;
const dir = path.join(BACKUPS_DIR, slug);
fs.mkdirSync(dir, { recursive: true });
return dir;
}
export function backupFile(srcPath, destDir, destName = null) {
if (!fs.existsSync(srcPath)) return null;
const name = destName || path.basename(srcPath);
const dest = path.join(destDir, name);
fs.copyFileSync(srcPath, dest);
return dest;
}
export function pruneOldBackups() {
if (!fs.existsSync(BACKUPS_DIR)) return;
const entries = fs.readdirSync(BACKUPS_DIR, { withFileTypes: true })
.filter((e) => e.isDirectory())
.map((e) => ({ name: e.name, full: path.join(BACKUPS_DIR, e.name), mtime: fs.statSync(path.join(BACKUPS_DIR, e.name)).mtimeMs }))
.sort((a, b) => b.mtime - a.mtime);
for (const old of entries.slice(KEEP_BACKUPS)) {
try { fs.rmSync(old.full, { recursive: true, force: true }); } catch {}
}
}