UNPKG

kura

Version:

The FileSystem API abstraction library.

294 lines 9.34 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.toBase64 = exports.toBlob = exports.toArrayBuffer = exports.toBuffer = exports.isBuffer = exports.isUint8Array = exports.isBlob = void 0; const ba = __importStar(require("base64-arraybuffer")); const FileSystemConstants_1 = require("./FileSystemConstants"); const FileSystemUtil_1 = require("./FileSystemUtil"); const CHUNK_SIZE = 96 * 1024; function decode(str) { return ba.decode(str); } function encode(buffer) { return ba.encode(buffer); } function isBlob(value) { return value instanceof Blob || toString.call(value) === "[object Blob]"; } exports.isBlob = isBlob; function isUint8Array(value) { return (value instanceof Uint8Array || toString.call(value) === "[object Uint8Array]"); } exports.isUint8Array = isUint8Array; function isBuffer(value) { return (typeof value?.constructor?.isBuffer === "function" && value.constructor.isBuffer(value)); } exports.isBuffer = isBuffer; function concatArrayBuffers(chunks, byteLength) { const u8 = new Uint8Array(byteLength); let pos = 0; for (const chunk of chunks) { u8.set(new Uint8Array(chunk), pos); pos += chunk.byteLength; } return u8.buffer; } async function blobToArrayBufferUsingReadAsArrayBuffer(blob) { if (blob.size === 0) { return new ArrayBuffer(0); } let byteLength = 0; const chunks = []; for (let start = 0, end = blob.size; start < end; start += CHUNK_SIZE) { const blobChunk = blob.slice(start, start + CHUNK_SIZE); const chunk = await new Promise((resolve, reject) => { const reader = new FileReader(); reader.onerror = (ev) => { reject(reader.error || ev); }; reader.onload = () => { const chunk = reader.result; byteLength += chunk.byteLength; resolve(chunk); }; reader.readAsArrayBuffer(blobChunk); }); chunks.push(chunk); } return concatArrayBuffers(chunks, byteLength); } async function blobToArrayBufferUsingReadAsDataUrl(blob) { const base64 = await blobToBase64(blob); if (!base64) { return new ArrayBuffer(0); } return base64ToArrayBuffer(base64); } async function blobToBuffer(blob) { const arrayBuffer = await blobToArrayBuffer(blob); return Buffer.from(arrayBuffer); } async function blobToArrayBuffer(blob) { if (blob.size === 0) { return new ArrayBuffer(0); } let buffer; if (navigator && navigator.product === "ReactNative") { buffer = await blobToArrayBufferUsingReadAsDataUrl(blob); } else { buffer = await blobToArrayBufferUsingReadAsArrayBuffer(blob); } return buffer; } function base64ToBuf(base64) { return Buffer.from(base64, "base64"); } function base64ToBuffer(base64) { const chunks = []; let byteLength = 0; for (let start = 0, end = base64.length; start < end; start += CHUNK_SIZE) { const base64chunk = base64.substr(start, CHUNK_SIZE); const chunk = base64ToBuf(base64chunk); byteLength += chunk.byteLength; chunks.push(chunk); } const buffer = Buffer.alloc(byteLength); let pos = 0; for (const chunk of chunks) { buffer.set(chunk, pos); pos += chunk.byteLength; } return buffer; } function base64ToArrayBuffer(base64) { let byteLength = 0; const chunks = []; for (let start = 0, end = base64.length; start < end; start += CHUNK_SIZE) { const base64chunk = base64.substr(start, CHUNK_SIZE); const chunk = decode(base64chunk); byteLength += chunk.byteLength; chunks.push(chunk); } return concatArrayBuffers(chunks, byteLength); } function uint8ArrayToArrayBuffer(view) { const viewLength = view.length; const buffer = view.buffer; if (viewLength === buffer.byteLength) { return buffer; } const newBuffer = new ArrayBuffer(viewLength); const newView = new Uint8Array(newBuffer); for (let i = 0; i < viewLength; i++) { newView[i] = view[i]; } return newBuffer; } async function toBuffer(content) { if (!content) { return Buffer.from([]); } let buffer; if (typeof content === "string") { buffer = base64ToBuffer(content); } else if (isBlob(content)) { buffer = await blobToBuffer(content); } else if (isBuffer(content)) { buffer = content; } else if (ArrayBuffer.isView(content)) { buffer = Buffer.from(content.buffer, content.byteOffset, content.byteLength); } else { buffer = Buffer.from(content); } return buffer; } exports.toBuffer = toBuffer; async function toArrayBuffer(content) { if (!content) { return new ArrayBuffer(0); } let buffer; if (typeof content === "string") { buffer = base64ToArrayBuffer(content); } else if (isBlob(content)) { buffer = await blobToArrayBuffer(content); } else if (isBuffer(content)) { buffer = content.buffer.slice(content.byteOffset, content.byteOffset + content.byteLength); } else if (ArrayBuffer.isView(content)) { buffer = uint8ArrayToArrayBuffer(content); } else { buffer = content; } return buffer; } exports.toArrayBuffer = toArrayBuffer; function base64ToBlob(base64, type = FileSystemConstants_1.DEFAULT_CONTENT_TYPE) { try { const buffer = base64ToArrayBuffer(base64); return new Blob([buffer], { type }); } catch (e) { console.warn(e, base64); return new Blob([], FileSystemConstants_1.DEFAULT_BLOB_PROPS); } } function toBlob(content) { if (!content) { return new Blob([], FileSystemConstants_1.DEFAULT_BLOB_PROPS); } let blob; if (typeof content === "string") { blob = base64ToBlob(content); } else if (isBlob(content)) { blob = content; } else { blob = new Blob([content]); } return blob; } exports.toBlob = toBlob; async function blobToBase64(blob) { if (blob.size === 0) { return ""; } const chunks = []; for (let start = 0, end = blob.size; start < end; start += CHUNK_SIZE) { const blobChunk = blob.slice(start, start + CHUNK_SIZE); const chunk = await new Promise((resolve, reject) => { const reader = new FileReader(); reader.onerror = function (ev) { reject(reader.error || ev); }; reader.onload = function () { const base64 = (0, FileSystemUtil_1.dataUrlToBase64)(reader.result); resolve(base64); }; reader.readAsDataURL(blobChunk); }); chunks.push(chunk); } return chunks.join(""); } function arrayBufferToBase64(ab) { return encode(ab); } function uint8ArrayToBase64(u8) { const chunks = []; for (let start = 0, end = u8.byteLength; start < end; start += CHUNK_SIZE) { const u8Chunk = u8.slice(start, start + CHUNK_SIZE); const abChunk = uint8ArrayToArrayBuffer(u8Chunk); const chunk = arrayBufferToBase64(abChunk); chunks.push(chunk); } const base64 = chunks.join(""); return base64; } function bufferToBase64(buffer) { const chunks = []; for (let start = 0, end = buffer.byteLength; start < end; start += CHUNK_SIZE) { const bufferChunk = buffer.slice(start, start + CHUNK_SIZE); const chunk = bufferChunk.toString("base64"); chunks.push(chunk); } const base64 = chunks.join(""); return base64; } async function toBase64(content) { if (!content) { return ""; } let base64; if (typeof content === "string") { base64 = content; } else if (isBlob(content)) { base64 = await blobToBase64(content); } else if (isBuffer(content)) { base64 = bufferToBase64(content); } else if (ArrayBuffer.isView(content)) { base64 = uint8ArrayToBase64(content); } else { base64 = uint8ArrayToBase64(new Uint8Array(content)); } return base64; } exports.toBase64 = toBase64; //# sourceMappingURL=BinaryConverter.js.map