35 lines
1.1 KiB
TypeScript
35 lines
1.1 KiB
TypeScript
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<T>(name: string, fallback: T): Promise<T> {
|
||
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<T>(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<T>(name: string, fallback: T, updater: (data: T) => T) {
|
||
const current = await readData(name, fallback)
|
||
const next = updater(current)
|
||
await writeData(name, next)
|
||
return next
|
||
}
|