import { resolve, dirname as _dirname } from 'path' | |
import _fs, { existsSync, readFileSync } from 'fs' | |
const { promises: fs } = _fs | |
class Database { | |
/** | |
* Create new Database | |
* @param {String} filepath Path to specified json database | |
* @param {...any} args JSON.stringify arguments | |
*/ | |
constructor(filepath, ...args) { | |
this.file = resolve(filepath) | |
this.logger = console | |
this._load() | |
this._jsonargs = args | |
this._state = false | |
this._queue = [] | |
this._interval = setInterval(async () => { | |
if (!this._state && this._queue && this._queue[0]) { | |
this._state = true | |
await this[this._queue.shift()]().catch(this.logger.error) | |
this._state = false | |
} | |
}, 1000) | |
} | |
get data() { | |
return this._data | |
} | |
set data(value) { | |
this._data = value | |
this.save() | |
} | |
/** | |
* Queue Load | |
*/ | |
load() { | |
this._queue.push('_load') | |
} | |
/** | |
* Queue Save | |
*/ | |
save() { | |
this._queue.push('_save') | |
} | |
_load() { | |
try { | |
return this._data = existsSync(this.file) ? JSON.parse(readFileSync(this.file)) : {} | |
} catch (e) { | |
this.logger.error(e) | |
return this._data = {} | |
} | |
} | |
async _save() { | |
let dirname = _dirname(this.file) | |
if (!existsSync(dirname)) await fs.mkdir(dirname, { recursive: true }) | |
await fs.writeFile(this.file, JSON.stringify(this._data, ...this._jsonargs)) | |
return this.file | |
} | |
} | |
export default Database | |