//#region src/middleware/etag/digest.ts const mergeBuffers = (buffer1, buffer2) => { if (!buffer1) return buffer2; const merged = new Uint8Array(new ArrayBuffer(buffer1.byteLength + buffer2.byteLength)); merged.set(new Uint8Array(buffer1), 0); merged.set(buffer2, buffer1.byteLength); return merged; }; const CHUNK_SIZE = 262144; const generateDigest = async (stream, generator) => { if (!stream) return null; let result = void 0; let chunk; let chunkLength = 0; const digest = async (body) => { result = await generator(mergeBuffers(result, body)); }; const reader = stream.getReader(); for (;;) { const { value, done } = await reader.read(); if (done) break; let offset = 0; while (offset < value.byteLength) { const remaining = value.byteLength - offset; if (chunkLength === 0 && remaining >= CHUNK_SIZE) { await digest(value.subarray(offset, offset + CHUNK_SIZE)); offset += CHUNK_SIZE; continue; } const requiredLength = chunkLength + remaining; if (requiredLength < CHUNK_SIZE) { if (!chunk) chunk = value.slice(offset); else { if (chunk.byteLength < requiredLength) { const nextChunk = new Uint8Array(new ArrayBuffer(Math.min(CHUNK_SIZE, Math.max(requiredLength, chunk.byteLength * 2)))); nextChunk.set(chunk.subarray(0, chunkLength)); chunk = nextChunk; } chunk.set(value.subarray(offset), chunkLength); } chunkLength = requiredLength; break; } const length = CHUNK_SIZE - chunkLength; if (chunk?.byteLength !== CHUNK_SIZE) { const nextChunk = new Uint8Array(/* @__PURE__ */ new ArrayBuffer(CHUNK_SIZE)); if (chunk) nextChunk.set(chunk.subarray(0, chunkLength)); chunk = nextChunk; } chunk.set(value.subarray(offset, offset + length), chunkLength); await digest(chunk); chunkLength = 0; offset += length; } } if (chunk && chunkLength > 0) await digest(chunk.subarray(0, chunkLength)); if (!result) return null; return Array.prototype.map.call(new Uint8Array(result), (x) => x.toString(16).padStart(2, "0")).join(""); }; //#endregion export { generateDigest };