@zhanghongping/json-sage-workflow-cli
Version:
An intelligent JSON processing workflow system with improved error handling and configuration
94 lines (79 loc) • 3.01 kB
text/typescript
import { deflate, inflate } from 'pako';
interface CompressionOptions {
threshold?: number; // 触发压缩的大小阈值(字节)
level?: number; // 压缩级别 (1-9)
memoryLimit?: number; // 内存使用限制(MB)
}
export class JsonCompressor {
private options: CompressionOptions;
constructor(options: CompressionOptions = {}) {
this.options = {
threshold: 1024, // 1KB
level: 6,
memoryLimit: 100, // 100MB
...options
};
}
compress(data: any): string | Uint8Array {
const jsonString = JSON.stringify(data);
// 如果数据小于阈值,直接返回
if (jsonString.length < this.options.threshold!) {
return jsonString;
}
try {
// 压缩数据
const compressed = deflate(jsonString, {
level: this.options.level,
memLevel: this.calculateMemLevel()
});
// 如果压缩后更大,返回原始数据
return compressed.length < jsonString.length ? compressed : jsonString;
} catch (error) {
console.warn('Compression failed, returning original data:', error);
return jsonString;
}
}
decompress(data: string | Uint8Array): any {
try {
// 如果是字符串且看起来不像压缩数据,直接解析
if (typeof data === 'string') {
return JSON.parse(data);
}
// 解压数据
const decompressed = inflate(data, { to: 'string' });
return JSON.parse(decompressed);
} catch (error) {
console.error('Decompression failed:', error);
throw error;
}
}
private calculateMemLevel(): number {
const totalMemory = process.memoryUsage().heapTotal;
const memoryLimitBytes = this.options.memoryLimit! * 1024 * 1024;
// 根据可用内存动态调整压缩级别
if (totalMemory < memoryLimitBytes) {
return 9; // 最高压缩级别
} else if (totalMemory < memoryLimitBytes * 2) {
return 7;
} else {
return 4; // 节省内存
}
}
// 分析压缩效果
analyzeCompression(data: any): CompressionAnalysis {
const originalString = JSON.stringify(data);
const compressed = this.compress(data);
return {
originalSize: originalString.length,
compressedSize: compressed.length,
compressionRatio: compressed.length / originalString.length,
compressionSavings: 1 - (compressed.length / originalString.length)
};
}
}
export interface CompressionAnalysis {
originalSize: number;
compressedSize: number;
compressionRatio: number;
compressionSavings: number;
}