@api.global/typedserver
Version:
A TypeScript-based project for easy serving of static files with support for live reloading, compression, and typed requests.
108 lines • 8.68 kB
JavaScript
import * as plugins from '../plugins.js';
export class Compressor {
_cache;
MAX_CACHE_SIZE = 100 * 1024 * 1024; // 100 MB
constructor() {
this._cache = new Map();
}
_addToCache(key, value) {
this._cache.set(key, value);
this._manageCacheSize();
}
_manageCacheSize() {
let currentSize = Array.from(this._cache.values()).reduce((acc, buffer) => acc + buffer.length, 0);
while (currentSize > this.MAX_CACHE_SIZE) {
const firstKey = this._cache.keys().next().value;
const firstValue = this._cache.get(firstKey);
currentSize -= firstValue.length;
this._cache.delete(firstKey);
}
}
async compressContent(content, method) {
const cacheKey = content.toString('base64') + method;
const cachedResult = this._cache.get(cacheKey);
if (cachedResult) {
return cachedResult;
}
return new Promise((resolve, reject) => {
const callback = (err, result) => {
if (err)
reject(err);
else {
this._addToCache(cacheKey, result);
resolve(result);
}
};
switch (method) {
case 'gzip':
plugins.zlib.gzip(content, {
level: 1,
}, callback);
break;
case 'br':
plugins.zlib.brotliCompress(content, {}, callback);
break;
case 'deflate':
plugins.zlib.deflate(content, callback);
break;
default:
this._addToCache(cacheKey, content);
resolve(content);
}
});
}
determineCompression(acceptEncoding, preferredCompressionMethodsArg = []) {
// Ensure acceptEncoding is a single string
const encodingString = Array.isArray(acceptEncoding)
? acceptEncoding.join(', ')
: acceptEncoding;
let compressionMethod = 'none';
// Prioritize preferred compression methods if provided
for (const preferredMethod of preferredCompressionMethodsArg) {
if (new RegExp(`\\b${preferredMethod}\\b`).test(encodingString)) {
return preferredMethod;
}
}
// Fallback to default prioritization if no preferred method matches
if (/\bbr\b/.test(encodingString)) {
compressionMethod = 'br';
}
else if (/\bgzip\b/.test(encodingString)) {
compressionMethod = 'gzip';
}
else if (/\bdeflate\b/.test(encodingString)) {
compressionMethod = 'deflate';
}
return compressionMethod;
}
async maybeCompress(requestHeaders, content, preferredCompressionMethodsArg) {
const acceptEncoding = requestHeaders['accept-encoding'];
const compressionMethod = this.determineCompression(acceptEncoding, preferredCompressionMethodsArg);
const result = await this.compressContent(content, compressionMethod);
return {
result,
compressionMethod,
};
}
createCompressionStream(method) {
let compressionStream;
switch (method) {
case 'gzip':
compressionStream = plugins.zlib.createGzip();
return compressionStream;
case 'br':
compressionStream = plugins.zlib.createBrotliCompress({
chunkSize: 16 * 1024,
params: {},
});
return compressionStream;
case 'deflate':
compressionStream = plugins.zlib.createDeflate();
return compressionStream;
default:
compressionStream = plugins.smartstream.createPassThrough();
return compressionStream;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb21wcmVzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvc2VydmVydG9vbHMvY2xhc3Nlcy5jb21wcmVzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBUXpDLE1BQU0sT0FBTyxVQUFVO0lBQ2IsTUFBTSxDQUFzQjtJQUM1QixjQUFjLEdBQVcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxTQUFTO0lBRTdEO1FBQ0UsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUMxQyxDQUFDO0lBRU8sV0FBVyxDQUFDLEdBQVcsRUFBRSxLQUFhO1FBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRW5HLE9BQU8sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNqRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUUsQ0FBQztZQUM5QyxXQUFXLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUNqQyxJQUFJLENBQUMsTUFBTSxD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