/
read-file.js
49 lines (45 loc) · 993 Bytes
/
read-file.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
var defer = require('result/defer')
var Result = require('result')
var finalize = require('weak')
var Stream = require('./')
var fs = require('fs')
module.exports = function(file, size){
var result = new Result
fs.open(file, 'r', function(e, fd){
finalize(result.ref = {
fd: fd,
cursor: 0,
size: size || 100
}, cleanup)
next.call(result)
})
return result
}
function next(){
var chunk = this
var ref = this.ref
var n = ref.size
this.ref = undefined
fs.read(ref.fd, new Buffer(n), 0, n, ref.cursor, function(e, bytes, buf){
if (e) {
cleanup(ref, function(){
chunk.error(e)
})
} else if (bytes < n) {
cleanup(ref, function(e){
if (e) chunk.error(e)
else chunk.write(new Stream(buf.slice(0, bytes)))
})
} else {
var tail = defer(next)
ref.cursor += bytes
tail.ref = ref
chunk.write(new Stream(buf, tail))
}
})
}
function cleanup(file, fn){
if (file.closed) return fn && fn(null)
file.closed = true
fs.close(file.fd, fn)
}