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
JavaScript
/**
* 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