UNPKG

image-stitch

Version:

Stitch images together efficiently with multi-format support (PNG, JPEG, HEIC), streaming, for node.js and web

65 lines 2.29 kB
/** * Streaming Inflate Decompression with native DecompressionStream fallback * * Uses the modern DecompressionStream API in supported environments. * Falls back to pako in environments lacking native decompression streams (like older Node.js or some JSDOM setups). */ let pakoPromise = null; async function loadPako() { if (!pakoPromise) { pakoPromise = import('pako'); } return pakoPromise; } /** * Create a decompression stream (native or polyfilled via pako) */ export function createDecompressionStream(format = 'deflate') { if (typeof DecompressionStream !== 'undefined') { return new DecompressionStream(format); } let inflator = null; return new TransformStream({ async transform(chunk, controller) { if (!inflator) { const pako = await loadPako(); const options = {}; if (format === 'deflate-raw') { options.raw = true; } // pako.Inflate autodetects zlib/gzip by default, which covers 'deflate' and 'gzip' inflator = new pako.Inflate(options); inflator.onData = (data) => { if (data && data.length > 0) { controller.enqueue(data); } }; } if (inflator) { let inputData; if (chunk instanceof Uint8Array) { inputData = chunk; } else if (chunk instanceof ArrayBuffer) { inputData = new Uint8Array(chunk); } else { inputData = new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength); } inflator.push(inputData, false); if (inflator.err) { throw new Error(`Inflate error: ${inflator.msg}`); } } }, async flush() { if (inflator) { inflator.push(new Uint8Array(0), true); if (inflator.err) { throw new Error(`Inflate error: ${inflator.msg}`); } } } }); } //# sourceMappingURL=streaming-inflate.js.map