UNPKG

@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
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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