'use strict'; var fs = require('fs'); /** * Limits the number of concurrent file handlers. * Use it as a wrapper over fs.open() and fs.close(). * Example: * var fdQueue = new FileDescriptorQueue(8); * fdQueue.open(path, flags, (err, fd) =>{ * ... * fdQueue.close(fd, (err) =>{ * ... * }); * }); * As of node v7, calling fd.close without a callback is deprecated. */ var FileDescriptorQueue = function(maxFilesNo) { var pendingJobs = []; var activeCount = 0; var open = function(path, flags, callback) { pendingJobs.push({ path : path, flags : flags, callback : callback }); process(); } var process = function() { if (pendingJobs.length > 0 && activeCount < maxFilesNo) { var job = pendingJobs.shift(); activeCount++; fs.open(job.path, job.flags, function(err, fd) { job.callback(err, fd); }); } } var close = function(fd, callback) { activeCount--; fs.close(fd, callback); process(); } return { open : open, close : close }; } module.exports = FileDescriptorQueue;