@ooples/token-optimizer-mcp
Version:
Intelligent context window optimization for Claude Code - store content externally via caching and compression, freeing up your context window for what matters
114 lines • 3.72 kB
JavaScript
import { brotliCompressSync, brotliDecompressSync, constants } from 'zlib';
export class CompressionEngine {
DEFAULT_QUALITY = 11;
/**
* Compress text using Brotli
*/
compress(text, options) {
const buffer = Buffer.from(text, 'utf-8');
const quality = options?.quality ?? this.DEFAULT_QUALITY;
const mode = this.getModeConstant(options?.mode);
const compressed = brotliCompressSync(buffer, {
params: {
[constants.BROTLI_PARAM_QUALITY]: quality,
[constants.BROTLI_PARAM_MODE]: mode,
},
});
const originalSize = buffer.length;
const compressedSize = compressed.length;
const ratio = originalSize > 0 ? compressedSize / originalSize : 0;
const percentSaved = originalSize > 0
? ((originalSize - compressedSize) / originalSize) * 100
: 0;
return {
compressed,
originalSize,
compressedSize,
ratio,
percentSaved,
};
}
/**
* Decompress Brotli-compressed data
*/
decompress(compressed) {
const decompressed = brotliDecompressSync(compressed);
return decompressed.toString('utf-8');
}
/**
* Compress to base64 string (for easier storage)
*/
compressToBase64(text, options) {
const result = this.compress(text, options);
return {
compressed: result.compressed.toString('base64'),
originalSize: result.originalSize,
compressedSize: result.compressedSize,
ratio: result.ratio,
percentSaved: result.percentSaved,
};
}
/**
* Decompress from base64 string
*/
decompressFromBase64(compressed) {
const buffer = Buffer.from(compressed, 'base64');
return this.decompress(buffer);
}
/**
* Check if compression would be beneficial
*/
shouldCompress(text, minSize = 1000) {
// Don't compress small texts - overhead not worth it
if (text.length < minSize) {
return false;
}
// Quick sample compression to check ratio
const sample = text.slice(0, Math.min(text.length, 5000));
const result = this.compress(sample, { quality: 4 }); // Use lower quality for quick test
// Only compress if we get at least 20% reduction
return result.percentSaved >= 20;
}
/**
* Batch compress multiple texts
*/
compressBatch(texts, options) {
return texts.map((text, index) => {
const result = this.compress(text, options);
return {
index,
compressed: result.compressed,
originalSize: result.originalSize,
compressedSize: result.compressedSize,
ratio: result.ratio,
};
});
}
/**
* Get compression statistics for text
*/
getCompressionStats(text) {
const result = this.compress(text);
return {
uncompressed: result.originalSize,
compressed: result.compressedSize,
ratio: result.ratio,
percentSaved: result.percentSaved,
recommended: this.shouldCompress(text),
};
}
/**
* Convert mode string to Brotli constant
*/
getModeConstant(mode) {
switch (mode) {
case 'text':
return constants.BROTLI_MODE_TEXT;
case 'font':
return constants.BROTLI_MODE_FONT;
default:
return constants.BROTLI_MODE_GENERIC;
}
}
}
//# sourceMappingURL=compression-engine.js.map