-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfs.js
More file actions
64 lines (57 loc) · 1.58 KB
/
fs.js
File metadata and controls
64 lines (57 loc) · 1.58 KB
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
var strm = require('./')
var fs = require('fs')
var createReadStrm = exports.createReadStrm = function (file, opts) {
opts = opts || {}
return function (dest) {
if('function' !== typeof dest)
throw new Error('read-only')
fs.open(file, opts.flags || 'r+', function (err, fd) {
var size = 8192, buffer = new Buffer(size), i = 0
;(function next (err) {
if(err) throw err
fs.read(fd, buffer, 0, size, i, function (err, bytes) {
i += bytes
strm.async(dest
, bytes != size ? buffer.slice(0, bytes) : buffer
, err || bytes == 0 || null, next)
})
})(err)
})
return dest
}
}
var createWriteStrm = exports.createWriteStrm = function (file, opts) {
opts = opts || {}
var fd, i = 0
return strm.reader(function (data, end, cb) {
if(end && !data) return false
if(fd) write()
else fs.open(file, opts.flags || 'w', function (err, _fd) {
if(err) return cb(err)
fd = _fd
write()
})
function write() {
console.log('>>>', data.toString(), '<<<')
fs.write(fd, data, 0, data.length, i, function (err, bytes) {
if(err) return cb(err)
i += bytes
cb()
})
}
})
}
var _waiting = [], _ended
function write (data, end) {
if(end) return _ended = end
var r = process.stdout.write(data)
if(r === false)
process.stdout.once('drain', function () {
_waiting.length && _waiting.shift()(_ended)
})
return _waiting
}
if(!module.parent) {
createReadStrm(process.argv[2])
(write)
}