node-ejs-renderer/node_modules/memfs/lib/fsa-to-node/FsaNodeReadStream.js

90 lines
2.9 KiB
JavaScript
Raw Normal View History

2024-06-09 13:55:01 -04:00
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FsaNodeReadStream = void 0;
const stream_1 = require("stream");
const Defer_1 = require("../thingies/Defer");
const concurrency_1 = require("../thingies/concurrency");
class FsaNodeReadStream extends stream_1.Readable {
constructor(fs, handle, path, options) {
super();
this.fs = fs;
this.handle = handle;
this.path = path;
this.options = options;
this.__pending__ = true;
this.__closed__ = false;
this.__bytes__ = 0;
this.__mutex__ = (0, concurrency_1.concurrency)(1);
this.__file__ = new Defer_1.Defer();
handle
.then(file => {
if (this.__closed__)
return;
this.__file__.resolve(file);
if (this.options.fd !== undefined)
this.emit('open', file.fd);
this.emit('ready');
})
.catch(error => {
this.__file__.reject(error);
})
.finally(() => {
this.__pending__ = false;
});
}
async __read__() {
return await this.__mutex__(async () => {
if (this.__closed__)
return;
const { file } = await this.__file__.promise;
const blob = await file.getFile();
const buffer = await blob.arrayBuffer();
const start = this.options.start || 0;
let end = typeof this.options.end === 'number' ? this.options.end + 1 : buffer.byteLength;
if (end > buffer.byteLength)
end = buffer.byteLength;
const uint8 = new Uint8Array(buffer, start, end - start);
return uint8;
});
}
__close__() {
if (this.__closed__)
return;
this.__closed__ = true;
if (this.options.autoClose) {
this.__file__.promise
.then(file => {
this.fs.close(file.fd, () => {
this.emit('close');
});
return file.close();
})
.catch(error => { });
}
}
// -------------------------------------------------------------- IReadStream
get bytesRead() {
return this.__bytes__;
}
get pending() {
return this.__pending__;
}
// ----------------------------------------------------------------- Readable
_read() {
this.__read__().then((uint8) => {
if (this.__closed__)
return;
if (!uint8)
return this.push(null);
this.__bytes__ += uint8.length;
this.__close__();
this.push(uint8);
this.push(null);
}, error => {
this.__close__();
this.destroy(error);
});
}
}
exports.FsaNodeReadStream = FsaNodeReadStream;
//# sourceMappingURL=FsaNodeReadStream.js.map