79 lines
2.7 KiB
JavaScript
79 lines
2.7 KiB
JavaScript
'use strict';
|
|
|
|
const node_util = require('node:util');
|
|
const zlib = require('node:zlib');
|
|
const node_buffer = require('node:buffer');
|
|
const h3 = require('h3');
|
|
|
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
|
|
|
|
const zlib__default = /*#__PURE__*/_interopDefaultCompat(zlib);
|
|
|
|
function getAnyCompression(event) {
|
|
const encoding = h3.getRequestHeader(event, "accept-encoding");
|
|
if (encoding?.includes("br"))
|
|
return "br";
|
|
if (encoding?.includes("gzip"))
|
|
return "gzip";
|
|
if (encoding?.includes("deflate"))
|
|
return "deflate";
|
|
return void 0;
|
|
}
|
|
async function compress(event, response, method) {
|
|
const compression = node_util.promisify(zlib__default[method === "br" ? "brotliCompress" : method]);
|
|
const acceptsEncoding = h3.getRequestHeader(event, "accept-encoding")?.includes(
|
|
method
|
|
);
|
|
if (acceptsEncoding && typeof response.body === "string") {
|
|
h3.setResponseHeader(event, "Content-Encoding", method);
|
|
h3.send(event, await compression(node_buffer.Buffer.from(response.body)));
|
|
}
|
|
}
|
|
async function compressStream(event, response, method) {
|
|
const stream = new Response(response.body).body;
|
|
const acceptsEncoding = h3.getRequestHeader(event, "accept-encoding")?.includes(
|
|
method
|
|
);
|
|
if (acceptsEncoding) {
|
|
h3.setResponseHeader(event, "Content-Encoding", method);
|
|
response.body = stream.pipeThrough(new CompressionStream(method));
|
|
} else {
|
|
response.body = stream;
|
|
}
|
|
}
|
|
|
|
async function useGZipCompression(event, response) {
|
|
await compress(event, response, "gzip");
|
|
}
|
|
async function useDeflateCompression(event, response) {
|
|
await compress(event, response, "deflate");
|
|
}
|
|
async function useBrotliCompression(event, response) {
|
|
await compress(event, response, "br");
|
|
}
|
|
async function useCompression(event, response) {
|
|
const compression = getAnyCompression(event);
|
|
if (compression)
|
|
await compress(event, response, compression);
|
|
}
|
|
|
|
async function useGZipCompressionStream(event, response) {
|
|
await compressStream(event, response, "gzip");
|
|
}
|
|
async function useDeflateCompressionStream(event, response) {
|
|
await compressStream(event, response, "deflate");
|
|
}
|
|
async function useCompressionStream(event, response) {
|
|
const compression = getAnyCompression(event);
|
|
if (compression && compression !== "br")
|
|
await compressStream(event, response, compression);
|
|
}
|
|
|
|
exports.useBrotliCompression = useBrotliCompression;
|
|
exports.useCompression = useCompression;
|
|
exports.useCompressionStream = useCompressionStream;
|
|
exports.useDeflateCompression = useDeflateCompression;
|
|
exports.useDeflateCompressionStream = useDeflateCompressionStream;
|
|
exports.useGZipCompression = useGZipCompression;
|
|
exports.useGZipCompressionStream = useGZipCompressionStream;
|