import fs from 'fs-extra'; import path from 'path'; export const enum StoreKeys { 'COOKIES' = 'cookies', } type Store = { [key in StoreKeys]?: any; }; interface IStoreOptions { path: string; } let store: Store = {}; let synced = false; const options: IStoreOptions = { path: path.resolve('store', 'store.json'), }; const folder = path.dirname(options.path); function initDir(): Promise { if (!fs.existsSync(folder)) { return fs.promises.mkdir(folder, { recursive: true }).then(() => writeUnsave()); } if (!fs.existsSync(options.path)) { return writeUnsave(); } return Promise.resolve(); } function writeUnsave(): Promise { return fs.writeFile(options.path, JSON.stringify(store)); } function read(): Promise { return initDir().then(() => fs.readFile(options.path).then((buf: Buffer) => { store = JSON.parse(buf.toString()); synced = true; }) ); } function write(): Promise { return initDir().then(() => writeUnsave().then(() => { synced = false; }) ); } export function load(key: StoreKeys): Promise { if (synced) { return Promise.resolve(store[key]); } return read().then(() => Promise.resolve(store[key])); } export function save(key: StoreKeys, data: any): Promise { store[key] = data; return write(); }