/*! Based on fetch-blob. MIT License. Jimmy Wärting & David Frank */ import { isFunction } from "./isFunction.js"; const CHUNK_SIZE = 65536; async function* clonePart(part) { const end = part.byteOffset + part.byteLength; let position = part.byteOffset; while (position !== end) { const size = Math.min(end - position, CHUNK_SIZE); const chunk = part.buffer.slice(position, position + size); position += chunk.byteLength; yield new Uint8Array(chunk); } } async function* consumeNodeBlob(blob) { let position = 0; while (position !== blob.size) { const chunk = blob.slice(position, Math.min(blob.size, position + CHUNK_SIZE)); const buffer = await chunk.arrayBuffer(); position += buffer.byteLength; yield new Uint8Array(buffer); } } export async function* consumeBlobParts(parts, clone = false) { for (const part of parts) { if (ArrayBuffer.isView(part)) { if (clone) { yield* clonePart(part); } else { yield part; } } else if (isFunction(part.stream)) { yield* part.stream(); } else { yield* consumeNodeBlob(part); } } } export function* sliceBlob(blobParts, blobSize, start = 0, end) { end !== null && end !== void 0 ? end : (end = blobSize); let relativeStart = start < 0 ? Math.max(blobSize + start, 0) : Math.min(start, blobSize); let relativeEnd = end < 0 ? Math.max(blobSize + end, 0) : Math.min(end, blobSize); const span = Math.max(relativeEnd - relativeStart, 0); let added = 0; for (const part of blobParts) { if (added >= span) { break; } const partSize = ArrayBuffer.isView(part) ? part.byteLength : part.size; if (relativeStart && partSize <= relativeStart) { relativeStart -= partSize; relativeEnd -= partSize; } else { let chunk; if (ArrayBuffer.isView(part)) { chunk = part.subarray(relativeStart, Math.min(partSize, relativeEnd)); added += chunk.byteLength; } else { chunk = part.slice(relativeStart, Math.min(partSize, relativeEnd)); added += chunk.size; } relativeEnd -= partSize; relativeStart = 0; yield chunk; } } }