UNPKG

@universal-middleware/compress

Version:
71 lines (68 loc) 1.8 kB
import { constants, createDeflateRaw, createDeflate, createGzip, createBrotliCompress } from 'node:zlib'; // src/zlib/stream.ts var algorithms = { br: createBrotliCompress, gzip: createGzip, deflate: createDeflate, "deflate-raw": createDeflateRaw }; var defaultOptions = { br: { flush: constants.BROTLI_OPERATION_FLUSH, params: { [constants.BROTLI_PARAM_QUALITY]: 4 } }, gzip: { flush: constants.Z_SYNC_FLUSH }, deflate: { flush: constants.Z_SYNC_FLUSH }, "deflate-raw": { flush: constants.Z_SYNC_FLUSH } }; function compressStream(input, algorithm, options) { if (input === null) { return input; } const compressionStream = algorithms[algorithm]({ ...defaultOptions[algorithm], ...options }); let reader = null; let cancelled = false; return new ReadableStream({ async start(controller) { reader = input.getReader(); compressionStream.on("data", (chunk) => { if (!cancelled) { controller.enqueue(new Uint8Array(chunk)); } }); compressionStream.on("end", () => { if (!cancelled) { controller.close(); } }); compressionStream.on("error", (err) => { if (!cancelled) { controller.error(err); } }); try { while (!cancelled) { const { done, value } = await reader.read(); if (done) { compressionStream.end(); break; } compressionStream.write(value); } } catch (err) { if (!cancelled) { controller.error(err); } } }, cancel() { cancelled = true; if (reader) { reader.releaseLock(); reader = null; } compressionStream.destroy(); } }); } export { compressStream };