import { mkdir, readFile, rename, writeFile } from 'node:fs/promises' import { join } from 'node:path' import { dataDirectory } from './files.js' export async function ensureDataDirectory() { await mkdir(dataDirectory, { recursive: true }) } export async function readData(name: string, fallback: T): Promise { await ensureDataDirectory() try { const raw = await readFile(join(dataDirectory, name), 'utf8') return JSON.parse(raw) as T } catch (error) { if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw new Error(`无法读取 ${name}:${String(error)}`) await writeData(name, fallback) return fallback } } export async function writeData(name: string, data: T) { await ensureDataDirectory() const target = join(dataDirectory, name) const temp = `${target}.tmp` await writeFile(temp, `${JSON.stringify(data, null, 2)}\n`, 'utf8') await rename(temp, target) } export async function updateData(name: string, fallback: T, updater: (data: T) => T) { const current = await readData(name, fallback) const next = updater(current) await writeData(name, next) return next }