UNPKG

1.7 kBJavaScriptView Raw
1const TAGS_PREFIX = 'hyperdrive-tags/'
2const varint = require('varint')
3
4module.exports = class TagManager {
5 constructor (drive) {
6 this.drive = drive
7 }
8
9 _toTag (name) {
10 return TAGS_PREFIX + name
11 }
12
13 _fromTag (tag) {
14 return tag.slice(TAGS_PREFIX.length)
15 }
16
17 create (name, version, cb) {
18 if (typeof version === 'function') {
19 cb = version
20 version = null
21 }
22 if (typeof name !== 'string') return cb(new Error('Tag name must be a string.'))
23 this.drive.ready(err => {
24 if (err) return cb(err)
25 if (version === null) version = this.drive.version
26 const buf = Buffer.alloc(varint.encodingLength(version))
27 varint.encode(version, buf)
28 return this.drive.db.put(this._toTag(name), buf, { hidden: true }, cb)
29 })
30 }
31
32 get (name, cb) {
33 this.drive.ready(err => {
34 if (err) return cb(err)
35 this.drive.db.get(this._toTag(name), { hidden : true }, (err, node) => {
36 if (err) return cb(err)
37 if (!node) return cb(null, null)
38 return cb(null, varint.decode(node.value))
39 })
40 })
41 }
42
43 getAll (cb) {
44 this.drive.ready(err => {
45 if (err) return cb(err)
46 this.drive.db.list(TAGS_PREFIX, { hidden: true }, (err, nodes) => {
47 if (err) return cb(err)
48 if (!nodes || !nodes.length) return cb(null, [])
49 const tagMap = new Map()
50 for (const node of nodes) {
51 tagMap.set(this._fromTag(node.key), varint.decode(node.value))
52 }
53 return cb(null, tagMap)
54 })
55 })
56 }
57
58 delete (name, cb) {
59 this.drive.ready(err => {
60 if (err) return cb(err)
61 return this.drive.db.del(this._toTag(name), { hidden: true }, cb)
62 })
63 }
64}