db.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. const level = require('level')
  2. const rootDb = level('rss-unlimited')
  3. const wrap = (db, prefix) => {
  4. const locals = {
  5. async get(key, ...args) {
  6. if (!key) throw new Error(`Key cannot be empty: ${prefix}${key}`)
  7. try {
  8. return JSON.parse(await db.get(prefix + key, ...args))
  9. } catch (err) {
  10. if (err.name === 'NotFoundError') return null
  11. throw err
  12. }
  13. },
  14. async put(key, value, ...args) {
  15. return await db.put(prefix + key, JSON.stringify(value), ...args)
  16. },
  17. async del(key, ...args) {
  18. return await db.del(prefix + key, ...args)
  19. },
  20. batch(array, ...args) {
  21. if (array) {
  22. array = array.map(item => ({
  23. ...item,
  24. key: prefix + item.key
  25. }))
  26. return db.batch(array, ...args)
  27. } else {
  28. return wrap(db.batch(), prefix)
  29. }
  30. },
  31. toString() {
  32. return `[DB ${prefix || '<root>'}]`
  33. }
  34. }
  35. return new Proxy(db, {
  36. get(db, key) {
  37. if (locals[key]) return locals[key]
  38. if (db[key]) return db[key]
  39. return wrap(db, `${prefix}${key}.`)
  40. }
  41. })
  42. }
  43. module.exports = wrap(rootDb, '')