-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathgraceful-fs.js
35 lines (32 loc) · 1.05 KB
/
graceful-fs.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
// from: https://github.com/isaacs/npm/raw/master/lib/utils/graceful-fs.js
// wrapper around the non-sync fs functions to gracefully handle
// having too many file descriptors open. Note that this is
// *only* possible because async patterns let one interject timeouts
// and other cleverness anywhere in the process without disrupting
// anything else.
var fs = require("fs")
, timeout = 0
Object.keys(fs)
.forEach(function (i) {
exports[i] = (typeof fs[i] !== "function") ? fs[i]
: (i.match(/^[A-Z]|^create|Sync$/)) ? function () {
return fs[i].apply(fs, arguments)
}
: graceful(fs[i])
})
function graceful (fn) { return function GRACEFUL () {
var args = Array.prototype.slice.call(arguments)
, cb_ = args.pop()
args.push(cb)
function cb (er) {
if (er && er.message.match(/^EMFILE, Too many open files/)) {
setTimeout(function () {
GRACEFUL.apply(fs, args)
}, timeout ++)
return
}
timer = 0
cb_.apply(null, arguments)
}
fn.apply(fs, args)
}}