74 lines
2.1 KiB
JavaScript
74 lines
2.1 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.FileDescriptorQueue = void 0;
|
|
const fs_1 = __importDefault(require("fs"));
|
|
const Queue_1 = __importDefault(require("./Queue"));
|
|
/**
|
|
* Limits the number of concurrent file handlers.
|
|
* Use it as a wrapper over fs.open() and fs.close().
|
|
* Example:
|
|
* const 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.
|
|
*/
|
|
class FileDescriptorQueue {
|
|
constructor(maxFilesNo) {
|
|
this.maxFilesNo = maxFilesNo;
|
|
this.activeCount = 0;
|
|
this.pendingJobs = new Queue_1.default();
|
|
}
|
|
open(path, flags, callback) {
|
|
this.pendingJobs.enqueue({
|
|
path: path,
|
|
flags: flags,
|
|
callback: callback
|
|
});
|
|
this.process();
|
|
}
|
|
process() {
|
|
if (this.pendingJobs.getLength() > 0 && this.activeCount < this.maxFilesNo) {
|
|
const job = this.pendingJobs.dequeue();
|
|
this.activeCount++;
|
|
fs_1.default.open(job.path, job.flags, job.callback);
|
|
}
|
|
}
|
|
close(fd, callback) {
|
|
this.activeCount--;
|
|
fs_1.default.close(fd, callback);
|
|
this.process();
|
|
}
|
|
openPromise(path, flags) {
|
|
return new Promise((resolve, reject) => {
|
|
this.open(path, flags, (err, fd) => {
|
|
if (err) {
|
|
reject(err);
|
|
}
|
|
else {
|
|
resolve(fd);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
closePromise(fd) {
|
|
return new Promise((resolve, reject) => {
|
|
this.close(fd, (err) => {
|
|
if (err) {
|
|
reject(err);
|
|
}
|
|
else {
|
|
resolve();
|
|
}
|
|
});
|
|
});
|
|
}
|
|
}
|
|
exports.FileDescriptorQueue = FileDescriptorQueue;
|
|
//# sourceMappingURL=FileDescriptorQueue.js.map
|