hypercore-storage 0.0.26 → 0.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/memory-overlay.js +98 -3
- package/package.json +1 -1
package/lib/memory-overlay.js
CHANGED
|
@@ -1,7 +1,98 @@
|
|
|
1
1
|
const { ASSERTION } = require('hypercore-errors')
|
|
2
|
+
const { Readable, isEnded, getStreamError } = require('streamx')
|
|
2
3
|
|
|
3
4
|
const TipList = require('./tip-list')
|
|
4
5
|
|
|
6
|
+
class OverlayStream extends Readable {
|
|
7
|
+
constructor (tip, storage, createStream, opts = {}) {
|
|
8
|
+
super()
|
|
9
|
+
|
|
10
|
+
this.tip = tip
|
|
11
|
+
this.storage = storage
|
|
12
|
+
this.opts = opts
|
|
13
|
+
|
|
14
|
+
this._reverse = !!opts.reverse
|
|
15
|
+
this._active = null
|
|
16
|
+
this._position = this._reverse ? tip.length() - 1 : tip.offset
|
|
17
|
+
|
|
18
|
+
this._createStream = createStream
|
|
19
|
+
this._pendingDestroy = null
|
|
20
|
+
|
|
21
|
+
if (!opts.reverse) {
|
|
22
|
+
this._active = createStream(storage, opts)
|
|
23
|
+
this._active.on('close', this._onclose.bind(this))
|
|
24
|
+
this._active.on('data', this._ondata.bind(this))
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
_predestroy () {
|
|
29
|
+
if (this._active) this._active.destroy()
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
_read (cb) {
|
|
33
|
+
if (this._active === null) {
|
|
34
|
+
if (this._yield()) return cb(null)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (this._active) {
|
|
38
|
+
this._active.resume()
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
cb(null)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
_yield () {
|
|
45
|
+
while (this._memoryRemaining()) {
|
|
46
|
+
const { valid, value } = this.tip.get(this._position)
|
|
47
|
+
const index = this._nextIndex()
|
|
48
|
+
|
|
49
|
+
if (!valid) continue
|
|
50
|
+
if (!this.push({ index, page: value })) break
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return this._onmemorydrain()
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
_nextIndex () {
|
|
57
|
+
if (this._reverse) return this._position--
|
|
58
|
+
return this._position++
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
_memoryRemaining () {
|
|
62
|
+
if (this._reverse) return this._position >= this.tip.offset
|
|
63
|
+
return this._position < this.tip.length()
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
_onmemorydrain () {
|
|
67
|
+
if (!this._reverse) {
|
|
68
|
+
this.push(null)
|
|
69
|
+
return true
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
this._active = this._createStream(this.storage, this.opts)
|
|
73
|
+
this._active.on('close', this._onclose.bind(this))
|
|
74
|
+
this._active.on('data', this._ondata.bind(this))
|
|
75
|
+
|
|
76
|
+
return false
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
_ondata (data) {
|
|
80
|
+
if (!this.push(data)) this._active.pause()
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
_onclose () {
|
|
84
|
+
if (!isEnded(this._active)) {
|
|
85
|
+
const error = getStreamError(this._active)
|
|
86
|
+
this.destroy(error)
|
|
87
|
+
return
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (this._reverse) return this.push(null)
|
|
91
|
+
|
|
92
|
+
this._yield()
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
5
96
|
class MemoryOverlay {
|
|
6
97
|
constructor (storage) {
|
|
7
98
|
this.storage = storage
|
|
@@ -24,7 +115,7 @@ class MemoryOverlay {
|
|
|
24
115
|
}
|
|
25
116
|
|
|
26
117
|
snapshot () {
|
|
27
|
-
|
|
118
|
+
return new MemoryOverlay(this.storage.snapshot())
|
|
28
119
|
}
|
|
29
120
|
|
|
30
121
|
get dependencies () {
|
|
@@ -56,8 +147,8 @@ class MemoryOverlay {
|
|
|
56
147
|
todo()
|
|
57
148
|
}
|
|
58
149
|
|
|
59
|
-
createBitfieldPageStream () {
|
|
60
|
-
|
|
150
|
+
createBitfieldPageStream (opts) {
|
|
151
|
+
return new OverlayStream(this.bitfields, this.storage, createBitfieldPageStream, opts)
|
|
61
152
|
}
|
|
62
153
|
|
|
63
154
|
async peekLastTreeNode () {
|
|
@@ -266,6 +357,10 @@ class MemoryOverlayWriteBatch {
|
|
|
266
357
|
}
|
|
267
358
|
}
|
|
268
359
|
|
|
360
|
+
function createBitfieldPageStream (storage, opts) {
|
|
361
|
+
return storage.createBitfieldPageStream(opts)
|
|
362
|
+
}
|
|
363
|
+
|
|
269
364
|
function mergeMap (a, b) {
|
|
270
365
|
if (a === null) return b
|
|
271
366
|
for (const [key, value] of b) a.set(key, value)
|