58 lines
1.3 KiB
JavaScript
58 lines
1.3 KiB
JavaScript
const {statSync, createReadStream} = require('fs');
|
|
const Blob = require('./index.js');
|
|
const DOMException = require('domexception');
|
|
|
|
/**
|
|
* @param {string} path filepath on the disk
|
|
* @returns {Blob}
|
|
*/
|
|
function blobFrom(path) {
|
|
const {size, mtime} = statSync(path);
|
|
const blob = new BlobDataItem({path, size, mtime});
|
|
|
|
return new Blob([blob]);
|
|
}
|
|
|
|
/**
|
|
* This is a blob backed up by a file on the disk
|
|
* with minium requirement
|
|
*
|
|
* @private
|
|
*/
|
|
class BlobDataItem {
|
|
constructor(options) {
|
|
this.size = options.size;
|
|
this.path = options.path;
|
|
this.start = options.start;
|
|
this.mtime = options.mtime;
|
|
}
|
|
|
|
// Slicing arguments is first validated and formated
|
|
// to not be out of range by Blob.prototype.slice
|
|
slice(start, end) {
|
|
return new BlobDataItem({
|
|
path: this.path,
|
|
start,
|
|
mtime: this.mtime,
|
|
size: end - start
|
|
});
|
|
}
|
|
|
|
stream() {
|
|
if (statSync(this.path).mtime > this.mtime) {
|
|
throw new DOMException('The requested file could not be read, typically due to permission problems that have occurred after a reference to a file was acquired.', 'NotReadableError');
|
|
}
|
|
|
|
return createReadStream(this.path, {
|
|
start: this.start,
|
|
end: this.start + this.size - 1
|
|
});
|
|
}
|
|
|
|
get [Symbol.toStringTag]() {
|
|
return 'Blob';
|
|
}
|
|
}
|
|
|
|
module.exports = blobFrom;
|