90 lines
2.9 KiB
JavaScript
90 lines
2.9 KiB
JavaScript
"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
|