@universal-middleware/compress
Version:
Universal compress middleware
71 lines (68 loc) • 1.8 kB
JavaScript
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 };