55 lines
1.5 KiB
JavaScript
55 lines
1.5 KiB
JavaScript
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, rmSync } from "node:fs";
|
|
import { join } from "node:path";
|
|
import { resolveDataDir } from "../data-dir.mjs";
|
|
|
|
function sessionsDir() {
|
|
const dir = join(resolveDataDir(), "repl-sessions");
|
|
if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
|
|
return dir;
|
|
}
|
|
|
|
export function saveSession(name, session) {
|
|
const path = join(sessionsDir(), `${name}.json`);
|
|
writeFileSync(
|
|
path,
|
|
JSON.stringify({ ...session, name, updatedAt: new Date().toISOString() }, null, 2)
|
|
);
|
|
}
|
|
|
|
export function loadSession(name) {
|
|
const path = join(sessionsDir(), `${name}.json`);
|
|
if (!existsSync(path)) throw new Error(`session '${name}' not found`);
|
|
return JSON.parse(readFileSync(path, "utf8"));
|
|
}
|
|
|
|
export function listSessions() {
|
|
const dir = sessionsDir();
|
|
return readdirSync(dir)
|
|
.filter((f) => f.endsWith(".json"))
|
|
.map((f) => {
|
|
try {
|
|
const data = JSON.parse(readFileSync(join(dir, f), "utf8"));
|
|
return {
|
|
name: data.name || f.replace(".json", ""),
|
|
updatedAt: data.updatedAt,
|
|
model: data.model,
|
|
};
|
|
} catch {
|
|
return { name: f.replace(".json", ""), updatedAt: null, model: null };
|
|
}
|
|
});
|
|
}
|
|
|
|
export function autosave(session) {
|
|
try {
|
|
saveSession("autosave", session);
|
|
} catch {
|
|
// autosave failure is not fatal
|
|
}
|
|
}
|
|
|
|
export function deleteSession(name) {
|
|
const path = join(sessionsDir(), `${name}.json`);
|
|
if (existsSync(path)) rmSync(path);
|
|
}
|