|
1 | | -var stringKey = require('dat-encoding').toStr |
2 | | -// var path = require('path') |
3 | | -var xtend = Object.assign |
4 | | -var toiletdb = require('toiletdb') |
| 1 | +const stringKey = require('dat-encoding').toStr |
| 2 | +const xtend = Object.assign |
| 3 | +const toiletdb = require('toiletdb') |
5 | 4 |
|
6 | | -module.exports = function (archive, opts) { |
7 | | - if (!opts) opts = {} |
| 5 | +module.exports = (...args) => new DatJsonDb(...args) |
8 | 6 |
|
9 | | - var db = toiletdb({ name: '/dat.json', fs: archive }) |
10 | | - var fileDb = opts.file ? toiletdb(opts.file) : null |
| 7 | +class DatJsonDb { |
| 8 | + constructor (archive, opts) { |
| 9 | + if (!opts) opts = {} |
| 10 | + this.archive = archive |
| 11 | + this.db = toiletdb({ name: '/dat.json', fs: archive }) |
| 12 | + this.fileDb = opts.file ? toiletdb(opts.file) : null |
| 13 | + } |
11 | 14 |
|
12 | | - var that = { |
13 | | - read: function (cb) { |
14 | | - archive.stat('/dat.json', function (err, stat) { |
15 | | - if (err) return cb(err) |
16 | | - db.read(cb) |
| 15 | + read () { |
| 16 | + const self = this |
| 17 | + return new Promise((resolve, reject) => { |
| 18 | + this.archive.stat('/dat.json', async function (err, stat) { |
| 19 | + if (err) return reject(err) |
| 20 | + resolve(await self.db.read()) |
17 | 21 | }) |
18 | | - }, |
19 | | - write: function (key, val, cb) { |
20 | | - if (typeof val === 'function') cb = val |
21 | | - if (!archive.writable) { |
22 | | - return process.nextTick(cb, new Error('Archive not writable')) |
| 22 | + }) |
| 23 | + } |
| 24 | + |
| 25 | + write (key, val) { |
| 26 | + return new Promise(async (resolve, reject) => { |
| 27 | + if (!this.archive.writable) { |
| 28 | + return reject(new Error('Archive not writable')) |
23 | 29 | } |
24 | | - if (typeof key === 'object') return writeAll(key, cb) |
| 30 | + |
| 31 | + if (typeof key === 'object') { |
| 32 | + try { |
| 33 | + await this._writeAll(key) |
| 34 | + resolve() |
| 35 | + } catch (e) { |
| 36 | + reject(e) |
| 37 | + } |
| 38 | + return |
| 39 | + } |
| 40 | + |
25 | 41 | // TODO: validate things |
26 | | - if (!fileDb) return db.write(key, val, cb) |
| 42 | + if (!this.fileDb) { |
| 43 | + try { |
| 44 | + await this.db.write(key, val) |
| 45 | + resolve() |
| 46 | + } catch (e) { |
| 47 | + reject(e) |
| 48 | + } |
| 49 | + return |
| 50 | + } |
27 | 51 |
|
28 | 52 | // write to file then archive |
29 | 53 | // TODO: use hyperdrive indexing false option, need to talk to mafintosh about |
30 | 54 | // https://botbot.me/freenode/dat/2017-05-12/?msg=85554242&page=3 |
31 | | - fileDb.write(key, val, function (err) { |
32 | | - if (err) return cb(err) |
33 | | - db.write(key, val, cb) |
34 | | - }) |
35 | | - }, |
36 | | - delete: db.delete, |
37 | | - create: function (data, cb) { |
38 | | - if (typeof data === 'function') return that.create(null, data) |
39 | | - if (!archive.writable) { |
40 | | - return process.nextTick(cb, new Error('Archive not writable')) |
| 55 | + try { |
| 56 | + await this.fileDb.write(key, val) |
| 57 | + await this.db.write(key, val) |
| 58 | + resolve() |
| 59 | + } catch (e) { |
| 60 | + reject(e) |
41 | 61 | } |
42 | | - data = xtend(getdefaults(), data) |
43 | | - that.write(data, cb) |
44 | | - } |
| 62 | + }) |
45 | 63 | } |
46 | 64 |
|
47 | | - return that |
| 65 | + async delete (key) { |
| 66 | + await this.db.delete(key) |
| 67 | + } |
48 | 68 |
|
49 | | - function getdefaults () { |
50 | | - return { |
51 | | - title: '', |
52 | | - description: '', |
53 | | - url: 'dat://' + stringKey(archive.key) |
54 | | - } |
| 69 | + create (data) { |
| 70 | + return new Promise(async (resolve, reject) => { |
| 71 | + if (!this.archive.writable) { |
| 72 | + return reject(new Error('Archive not writable')) |
| 73 | + } |
| 74 | + |
| 75 | + data = xtend(this.getdefaults(), data) |
| 76 | + try { |
| 77 | + await this.write(data) |
| 78 | + resolve() |
| 79 | + } catch (e) { |
| 80 | + reject(e) |
| 81 | + } |
| 82 | + }) |
55 | 83 | } |
56 | 84 |
|
57 | | - function writeAll (data, cb) { |
58 | | - var keys = Object.keys(data) |
59 | | - var pending = keys.length |
60 | | - keys.map(function (key) { |
61 | | - that.write(key, data[key], function (err) { |
62 | | - if (err) return cb(err) |
63 | | - if (!--pending) return cb() |
| 85 | + _writeAll (data, cb) { |
| 86 | + const self = this |
| 87 | + return new Promise((resolve, reject) => { |
| 88 | + const keys = Object.keys(data) |
| 89 | + let pending = keys.length |
| 90 | + keys.map(async function (key) { |
| 91 | + try { |
| 92 | + await self.write(key, data[key]) |
| 93 | + } catch (e) { |
| 94 | + reject(e) |
| 95 | + } |
| 96 | + if (!--pending) return resolve() |
64 | 97 | }) |
65 | 98 | }) |
66 | 99 | } |
| 100 | + |
| 101 | + getdefaults () { |
| 102 | + return { |
| 103 | + title: '', |
| 104 | + description: '', |
| 105 | + url: 'dat://' + stringKey(this.archive.key) |
| 106 | + } |
| 107 | + } |
67 | 108 | } |
0 commit comments