UNPKG

k9crypt

Version:

A special encryption algorithm created for K9Crypt.

56 lines (47 loc) 1.67 kB
const zlib = require('zlib'); const lzma = require('lzma-native'); exports.compress = async (data, compressionLevel = 3) => { try { if (compressionLevel < 0 || compressionLevel > 9) { throw new Error('Compression level must be between 0 and 9'); } const brotliQuality = Math.min(Math.max(Math.floor(compressionLevel / 2), 1), 11); const lzmaLevel = Math.min(compressionLevel, 9); const brotliParams = { params: { [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT, [zlib.constants.BROTLI_PARAM_QUALITY]: brotliQuality, [zlib.constants.BROTLI_PARAM_SIZE_HINT]: Buffer.byteLength(data, 'utf8'), [zlib.constants.BROTLI_PARAM_LGWIN]: 24 } }; const brotliCompressed = await new Promise((resolve, reject) => { zlib.brotliCompress( Buffer.from(data, 'utf8'), brotliParams, (err, compressed) => { if (err) reject(err); if (!err) resolve(compressed); } ); }); const lzmaCompressed = await lzma.compress(brotliCompressed, lzmaLevel); return lzmaCompressed; } catch (error) { throw new Error(`Compression error: ${error.message}`); } }; exports.decompress = async (data) => { try { const lzmaDecompressed = await lzma.decompress(data); const brotliDecompressed = await new Promise((resolve, reject) => { zlib.brotliDecompress(lzmaDecompressed, (err, decompressed) => { if (err) reject(err); else resolve(decompressed); }); }); return brotliDecompressed; } catch (error) { throw new Error(`Decompression error: ${error.message}`); } };