import { getTime } from './common.js'
import { Level } from 'level'
import schedule from 'node-schedule'
export default class level {
constructor (path) {
this.db = new Level(path, { valueEncoding: 'json' })
this.setSchedule()
}
async cleanup () {
const today = getTime()
for await (const [key, value] of this.db.iterator()) {
try {
if (value.expiredTime && new Date(value.expiredTime) < new Date(today)) {
await this.db.del(key)
}
} catch (error) { }
}
}
setSchedule () {
this.job = schedule.scheduleJob('0 0 0 * * ?', async () => {
await this.cleanup()
})
}
async open () {
await this.db.open()
await this.cleanup()
}
* 存储一个值
* @param {string} key
* @param {any} value
* @param {number} time 几天之后过期(包含今天),为0时不会过期
* @returns
*/
async set (key, value, time = 0) {
if (!value) return
let storedValue = value
if (typeof storedValue !== 'object') {
storedValue = {
__originalValue: value
}
}
if (time > 0) {
storedValue.expiredTime = getTime(time - 1)
}
await this.db.put(key, storedValue)
delete storedValue.expiredTime
}
async get (key) {
try {
let value = await this.db.get(key)
if (!value) return null
if (value.__originalValue) {
value = value.__originalValue
}
if (value?.expiredTime) {
delete value.expiredTime
}
return value
} catch (err) {
if (err.notFound) {
return null
}
logger.error('[QQBot-Plugin] level', err)
return null
}
}
close () {
this.db.close()
}
}