diff --git a/src/main/services/store.ts b/src/main/services/store.ts new file mode 100644 index 0000000..a4b4e62 --- /dev/null +++ b/src/main/services/store.ts @@ -0,0 +1,72 @@ +import fs, { promises as fsp } from 'fs'; +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 fsp.mkdir(folder).then(() => writeUnsave()); + } + if (!fs.existsSync(options.path)) { + return writeUnsave(); + } + return Promise.resolve(); +} + +function writeUnsave(): Promise { + return fsp.writeFile(options.path, JSON.stringify(store)); +} + +function read(): Promise { + return initDir().then(() => { + return fsp.readFile(options.path).then((buf: Buffer) => { + store = JSON.parse(buf.toString()); + synced = true; + }); + }); +} + +function write(): Promise { + return initDir().then(() => { + return writeUnsave().then(() => { + synced = false; + }); + }); +} + +function get(key: StoreKeys): any { + return store[key]; +} + +export function load(key: StoreKeys): Promise { + if (synced) { + return Promise.resolve(get(key)); + } else { + return read().then(() => { + return Promise.resolve(get(key)); + }); + } +} + +export function save(key: StoreKeys, data: any): Promise { + store[key] = data; + return write(); +}