summaryrefslogtreecommitdiff
path: root/deps/npm/node_modules/graceful-fs/graceful-fs.js
blob: 08e99b24b057a53c56ad0d6e0996f1fbfaa5a6a4 (plain)
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
// 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])
  })

if (process.platform === "win32"
    && !process.binding("fs").lstat) {
  exports.lstat = exports.stat
  exports.lstatSync = exports.statSync
}

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
    }
    timeout = 0
    cb_.apply(null, arguments)
  }
  fn.apply(fs, args)
}}