-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathblock-iterator.js
68 lines (57 loc) · 1.54 KB
/
block-iterator.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
var fs = require('fs')
var pull = require('pull-stream')
var Iterator =
pull.Source(function (next, close) {
var i = 0
close = close || function (cb) { cb() }
return function (end, cb) {
if(end)
close ? close(function (err) {
cb(err || true)
}) : cb && cb(end)
else
next(i++, function (err, data) {
if(err || data == null) {
close(function (err) {
cb(err || true)
})
} else
cb(null, data) //means end in an iterator.
})
}
})
function calcBlock(stat, opts, i) {
opts = opts || {}
if(opts.offset)
i = i + opts.offset
var blocks = Math.floor(stat.size / stat.blksize)
var j = opts.reverse ? blocks - i : i
var start = j * stat.blksize
var limit = opts.limit ? opts.limit - 1 : blocks
if(i > Math.min(blocks, limit)) return false
return {
length: (
(j + 1) * stat.blksize > stat.size
? stat.size - j * stat.blksize
: stat.blksize
),
position: start,
size : stat.size,
i : j,
end : i > blocks
}
}
var blockIterator = module.exports = function (stat, opts) {
opts = opts || {}
var blocks = Math.floor(stat.size / stat.blksize)
return Iterator(function (i, cb) {
var range = calcBlock(stat, opts, i)
if(!range) return cb(null, null)
//this is not good memory management!
var block = new Buffer(range.length)
fs.read(stat.fd, block, 0, range.length, range.position, function (err) {
cb(err, block.toString())
})
})
}
module.exports.calcBlock = calcBlock