kura
Version:
The FileSystem API abstraction library.
294 lines • 9.34 kB
JavaScript
;
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