forked from mafintosh/tar-stream
-
Notifications
You must be signed in to change notification settings - Fork 2
/
lte-reader.js
50 lines (49 loc) 路 1.56 KB
/
lte-reader.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
const BufferList = require('bl/BufferList')
const Reader = require('it-reader')
module.exports = function LteReader (source) {
const reader = Reader(source)
let overflow
const lteReader = {
[Symbol.asyncIterator]: () => lteReader,
async next (bytes) {
if (overflow) {
let value
if (bytes == null || overflow.length === bytes) {
value = overflow
overflow = null
} else if (overflow.length > bytes) {
value = overflow.shallowSlice(0, bytes)
overflow = overflow.shallowSlice(bytes)
} else if (overflow.length < bytes) {
const { value: nextValue, done } = await reader.next(bytes - overflow.length)
if (done) {
throw Object.assign(
new Error(`stream ended before ${bytes - overflow.length} bytes became available`),
{ code: 'ERR_UNDER_READ' }
)
}
value = new BufferList([overflow, nextValue])
overflow = null
}
return { value }
}
return reader.next(bytes)
},
async nextLte (bytes) {
let { done, value } = await lteReader.next()
if (done) return { done }
if (value.length <= bytes) return { value }
value = BufferList.isBufferList(value) ? value : new BufferList(value)
if (overflow) {
overflow.append(value.shallowSlice(bytes))
} else {
overflow = value.shallowSlice(bytes)
}
return { value: value.shallowSlice(0, bytes) }
},
return () {
return reader.return()
}
}
return lteReader
}