univ-conv
Version:
The universal binary and text converter
272 lines • 9.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.newBufferFrom = exports.newBuffer = exports.isBuffer = exports.writeToFile = exports.fileURLToReadable = exports.fileToBuffer = exports.getFileSize = exports.closeStream = exports.handleReadable = exports.pipeNodeStream = exports.isWritable = exports.pipeWebStream = exports.isReadable = exports.isWritableStream = exports.isReadableStream = exports.handleReadableStream = exports.handleFileReader = exports.EMPTY_BUFFER = exports.hasBuffer = exports.hasWritableStream = exports.hasReadableStream = exports.EMPTY_BLOB = exports.hasReadAsBinaryStringOnBlob = exports.hasReadAsArrayBufferOnBlob = exports.hasArrayBufferOnBlob = exports.hasStreamOnBlob = exports.hasTextOnBlob = exports.hasBlob = exports.hasWritable = exports.hasReadable = exports.isNode = exports.isReactNative = exports.isBrowser = void 0;
let _Writable;
let _fileURLToPath;
let _stat;
let _createReadStream;
let _createWriteStream;
let _readFile;
exports.isBrowser = false;
exports.isReactNative = false;
exports.isNode = false;
if (typeof document !== "undefined") {
exports.isBrowser = true;
}
else if (typeof navigator !== "undefined" &&
navigator.product === "ReactNative") {
exports.isReactNative = true;
}
else {
exports.isNode = true;
}
exports.hasReadable = false;
exports.hasWritable = false;
(async () => {
Promise.resolve().then(() => require("stream")).then((stream) => {
exports.hasReadable = typeof stream.Readable === "function";
exports.hasWritable = typeof stream.Writable === "function";
});
})();
exports.hasBlob = false;
exports.hasTextOnBlob = false;
exports.hasStreamOnBlob = false;
exports.hasArrayBufferOnBlob = false;
exports.hasReadAsArrayBufferOnBlob = false;
exports.hasReadAsBinaryStringOnBlob = false;
if (typeof Blob === "function") {
exports.hasBlob = true;
exports.EMPTY_BLOB = new Blob([]);
if (Blob.prototype.text != null) {
exports.hasTextOnBlob = true;
}
if (Blob.prototype.stream != null) {
exports.hasStreamOnBlob = true;
}
if (Blob.prototype.arrayBuffer != null) {
exports.hasArrayBufferOnBlob = true;
}
if (!exports.isReactNative) {
exports.hasReadAsArrayBufferOnBlob = FileReader.prototype.readAsArrayBuffer != null;
exports.hasReadAsBinaryStringOnBlob =
FileReader.prototype.readAsBinaryString != null;
}
}
exports.hasReadableStream = false;
exports.hasWritableStream = false;
if (typeof ReadableStream === "function") {
exports.hasReadableStream = true;
exports.hasWritableStream = true;
}
exports.hasBuffer = false;
if (typeof Buffer === "function") {
exports.hasBuffer = true;
exports.EMPTY_BUFFER = Buffer.alloc(0);
}
function handleFileReader(trigger, transform) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onerror = function (ev) {
reject(reader.error || ev);
};
reader.onload = function () {
resolve(transform(reader.result));
};
trigger(reader);
});
}
exports.handleFileReader = handleFileReader;
async function handleReadableStream(source, onData) {
const reader = source.getReader();
try {
let res;
do {
res = await reader.read();
const chunk = res.value;
if (chunk) {
const result = await onData(chunk);
if (!result) {
break;
}
}
} while (!res.done);
reader.releaseLock();
closeStream(source);
}
catch (e) {
reader.releaseLock();
closeStream(source, e);
}
}
exports.handleReadableStream = handleReadableStream;
function isReadableStream(stream) {
return (exports.hasReadableStream &&
stream != null &&
typeof stream.getReader === "function" &&
typeof stream.cancel === "function");
}
exports.isReadableStream = isReadableStream;
function isWritableStream(stream) {
return (exports.hasWritableStream &&
stream != null &&
typeof stream.getWriter === "function" &&
typeof stream.close === "function");
}
exports.isWritableStream = isWritableStream;
function isReadable(stream) {
return (exports.isNode &&
stream != null &&
typeof stream.pipe === "function" &&
stream.readable);
}
exports.isReadable = isReadable;
async function pipeWebStream(readable, writable) {
if (typeof readable.pipeTo === "function") {
await readable.pipeTo(writable);
}
else {
const writer = writable.getWriter();
await handleReadableStream(readable, async (chunk) => {
await writer.write(chunk);
return true;
});
}
}
exports.pipeWebStream = pipeWebStream;
function isWritable(stream) {
return (exports.isNode &&
stream != null &&
typeof stream.pipe === "function" &&
stream.writable);
}
exports.isWritable = isWritable;
function pipeNodeStream(readable, writable) {
return new Promise((resolve, reject) => {
readable.once("error", reject);
writable.once("error", reject);
writable.once("finish", resolve);
readable.pipe(writable);
});
}
exports.pipeNodeStream = pipeNodeStream;
async function handleReadable(readable, onData) {
if (!_Writable) {
_Writable = (await Promise.resolve().then(() => require("stream"))).Writable;
}
if (readable.destroyed) {
return;
}
const writable = new _Writable({
write(chunk, _, next) {
onData(chunk)
.then((result) => {
if (result) {
next();
}
else {
writable.destroy();
}
})
.catch((e) => {
writable.destroy(e);
});
},
});
await pipeNodeStream(readable, writable);
}
exports.handleReadable = handleReadable;
function closeStream(stream, reason) {
if (!stream) {
return;
}
if (isReadable(stream) || isWritable(stream)) {
stream.destroy(reason);
}
else if (isReadableStream(stream)) {
if (reason) {
stream.cancel(reason).catch((e) => console.debug(e));
}
else {
stream.cancel().catch((e) => console.debug(e));
}
}
else if (isWritableStream(stream)) {
if (reason) {
stream.abort(reason).catch((e) => console.debug(e));
}
else {
stream.close().catch((e) => console.debug(e));
}
}
}
exports.closeStream = closeStream;
async function getFileSize(fileURL) {
if (!_fileURLToPath) {
_fileURLToPath = (await Promise.resolve().then(() => require("url"))).fileURLToPath;
}
if (!_stat) {
_stat = (await Promise.resolve().then(() => require("fs"))).stat;
}
const p = _fileURLToPath(fileURL);
return await new Promise((resolve, reject) => {
_stat(p, (err, stats) => {
if (err) {
reject(err);
return;
}
resolve(stats.size);
});
});
}
exports.getFileSize = getFileSize;
async function fileToBuffer(filePath) {
if (!_readFile) {
_readFile = (await Promise.resolve().then(() => require("fs"))).readFile;
}
return new Promise((resolve, reject) => {
_readFile(filePath, (err, data) => {
if (err) {
reject(err);
return;
}
resolve(data);
});
});
}
exports.fileToBuffer = fileToBuffer;
async function fileURLToReadable(fileURL) {
if (!_fileURLToPath) {
_fileURLToPath = (await Promise.resolve().then(() => require("url"))).fileURLToPath;
}
if (!_createReadStream) {
_createReadStream = (await Promise.resolve().then(() => require("fs"))).createReadStream;
}
const filePath = _fileURLToPath(fileURL);
return _createReadStream(filePath);
}
exports.fileURLToReadable = fileURLToReadable;
async function writeToFile(readable, fileURL) {
if (!_createWriteStream) {
_createWriteStream = (await Promise.resolve().then(() => require("fs"))).createWriteStream;
}
if (!_fileURLToPath) {
_fileURLToPath = (await Promise.resolve().then(() => require("url"))).fileURLToPath;
}
const path = _fileURLToPath(fileURL);
const writable = _createWriteStream(path);
await pipeNodeStream(readable, writable);
}
exports.writeToFile = writeToFile;
function isBuffer(input) {
return exports.hasBuffer && input instanceof Buffer;
}
exports.isBuffer = isBuffer;
function newBuffer(size) {
return exports.isNode ? Buffer.alloc(size) : new Uint8Array(size);
}
exports.newBuffer = newBuffer;
function newBufferFrom(ab) {
return exports.isNode ? Buffer.from(ab) : new Uint8Array(ab);
}
exports.newBufferFrom = newBufferFrom;
//# sourceMappingURL=Environment.js.map