UNPKG

univ-conv

Version:

The universal binary and text converter

119 lines 4.6 kB
import { AbstractConverter, _ } from "./AbstractConverter"; import { getStartEnd, hasNoStartLength, } from "./core"; import { EMPTY_BLOB, handleFileReader, handleReadableStream, hasArrayBufferOnBlob, hasBlob, hasReadAsArrayBufferOnBlob, hasStreamOnBlob, hasTextOnBlob, newBuffer, newBufferFrom, } from "./Environment"; import { dataUrlToBase64, getTextHelper } from "./StringUtil"; export class BlobConverter extends AbstractConverter { constructor() { super(...arguments); this.type = "blob"; } empty() { return EMPTY_BLOB; } is(input) { return hasBlob && input instanceof Blob; } async _from(input, options) { if (this.is(input)) { if (hasNoStartLength(options)) { return input; } const { start, end } = await this._getStartEnd(input, options); return input.slice(start, end); } const u8 = await _().convert("uint8array", input, options); return new Blob([u8]); } _getStartEnd(input, options) { return Promise.resolve(getStartEnd(options, input.size)); } _isEmpty(input) { return input.size === 0; } _merge(chunks) { return Promise.resolve(new Blob(chunks)); } _size(input) { return Promise.resolve(input.size); } async _toArrayBuffer(input, options) { const u8 = await this._toUint8Array(input, options); return u8.buffer.slice(u8.byteOffset, u8.byteOffset + u8.byteLength); } async _toBase64(input, options) { const startEnd = await this._getStartEnd(input, options); let start = startEnd.start; const end = startEnd.end; const chunks = []; const bufferSize = options.bufferSize; for (; start < end; start += bufferSize) { let e = start + bufferSize; if (end < e) e = end; const blobChunk = input.slice(start, e); const chunk = await handleFileReader((reader) => reader.readAsDataURL(blobChunk), (data) => dataUrlToBase64(data)); chunks.push(chunk); } return chunks.join(""); } async _toText(input, options) { if (options.bufferToTextCharset === "utf8") { if (hasTextOnBlob) { return await input.text(); } return await handleFileReader((reader) => reader.readAsText(input), (data) => data); } const u8 = await this._toUint8Array(input, options); const textHelper = await getTextHelper(); return await textHelper.bufferToText(u8, options); } async _toUint8Array(input, options) { if (hasArrayBufferOnBlob) { const ab = await input.arrayBuffer(); return newBufferFrom(ab); } const startEnd = await this._getStartEnd(input, options); let start = startEnd.start; const end = startEnd.end; const bufferSize = options.bufferSize; if (hasReadAsArrayBufferOnBlob) { const u8 = newBuffer(end - start); for (let index = 0; start < end; start += bufferSize) { let e = start + bufferSize; if (end < e) e = end; const blobChunk = input.slice(start, e); const chunk = await handleFileReader((reader) => reader.readAsArrayBuffer(blobChunk), (data) => data); u8.set(newBufferFrom(chunk), index); index += chunk.byteLength; } return u8; } const u8ac = _()._of("uint8array"); if (hasStreamOnBlob) { const readable = input.stream(); const chunks = []; let index = 0; await handleReadableStream(readable, (u8) => { const size = u8.byteLength; if (start < index + size) { let e = index + size; if (end < e) e = end; if (index < start && start < e) { chunks.push(u8.subarray(start, e)); } else if (start <= index) { chunks.push(u8); } } index += size; return Promise.resolve(end == null || index < end); }); return await u8ac.merge(chunks, options); } const base64 = await this._toBase64(input, options); return await u8ac.from(base64); } } //# sourceMappingURL=BlobConverter.js.map