const path = require('path')
const _fs = require('fs')
const { promises: fs } = _fs
class Database {
constructor(filepath, ...args) {
this.file = path.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()
}
load() {
this._queue.push('_load')
}
save() {
this._queue.push('_save')
}
_load() {
try {
return this._data = _fs.existsSync(this.file) ? JSON.parse(_fs.readFileSync(this.file)) : {}
} catch (e) {
this.logger.error(e)
return this._data = {}
}
}
async _save() {
let dirname = path.dirname(this.file)
if (!_fs.existsSync(dirname)) await fs.mkdir(dirname, { recursive: true })
await fs.writeFile(this.file, JSON.stringify(this._data, ...this._jsonargs))
return this.file
}
}
module.exports = Database