mirror of
https://github.com/fofolee/uTools-quickcommand.git
synced 2025-06-08 14:34:13 +08:00
127 lines
3.4 KiB
JavaScript
127 lines
3.4 KiB
JavaScript
const zlib = require("zlib");
|
|
const { promisify } = require("util");
|
|
|
|
// 压缩方法
|
|
const gzip = promisify(zlib.gzip);
|
|
const deflate = promisify(zlib.deflate);
|
|
const brotliCompress = promisify(zlib.brotliCompress);
|
|
|
|
// 解压方法
|
|
const gunzip = promisify(zlib.gunzip);
|
|
const inflate = promisify(zlib.inflate);
|
|
const brotliDecompress = promisify(zlib.brotliDecompress);
|
|
|
|
// 同步方法
|
|
const gzipSync = zlib.gzipSync;
|
|
const gunzipSync = zlib.gunzipSync;
|
|
const deflateSync = zlib.deflateSync;
|
|
const inflateSync = zlib.inflateSync;
|
|
const brotliCompressSync = zlib.brotliCompressSync;
|
|
const brotliDecompressSync = zlib.brotliDecompressSync;
|
|
|
|
// 压缩选项
|
|
const defaultGzipOptions = {
|
|
level: zlib.constants.Z_DEFAULT_COMPRESSION,
|
|
memLevel: zlib.constants.Z_DEFAULT_MEMLEVEL,
|
|
strategy: zlib.constants.Z_DEFAULT_STRATEGY,
|
|
};
|
|
|
|
const defaultBrotliOptions = {
|
|
params: {
|
|
[zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_GENERIC,
|
|
[zlib.constants.BROTLI_PARAM_QUALITY]:
|
|
zlib.constants.BROTLI_DEFAULT_QUALITY,
|
|
[zlib.constants.BROTLI_PARAM_SIZE_HINT]: 0,
|
|
},
|
|
};
|
|
|
|
// 异步压缩函数
|
|
async function compressData(data, method, options = {}) {
|
|
try {
|
|
const buffer = Buffer.from(data);
|
|
switch (method) {
|
|
case "gzip":
|
|
return await gzip(buffer, { ...defaultGzipOptions, ...options });
|
|
case "deflate":
|
|
return await deflate(buffer, { ...defaultGzipOptions, ...options });
|
|
case "brotli":
|
|
return await brotliCompress(buffer, {
|
|
...defaultBrotliOptions,
|
|
...options,
|
|
});
|
|
default:
|
|
throw new Error("不支持的压缩方法");
|
|
}
|
|
} catch (error) {
|
|
throw new Error(`压缩失败: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
// 异步解压函数
|
|
async function decompressData(data, method, options = {}) {
|
|
try {
|
|
const buffer = Buffer.from(data);
|
|
switch (method) {
|
|
case "gzip":
|
|
return await gunzip(buffer, options);
|
|
case "deflate":
|
|
return await inflate(buffer, options);
|
|
case "brotli":
|
|
return await brotliDecompress(buffer, options);
|
|
default:
|
|
throw new Error("不支持的解压方法");
|
|
}
|
|
} catch (error) {
|
|
throw new Error(`解压失败: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
// 同步压缩函数
|
|
function compressDataSync(data, method, options = {}) {
|
|
try {
|
|
const buffer = Buffer.from(data);
|
|
switch (method) {
|
|
case "gzip":
|
|
return gzipSync(buffer, { ...defaultGzipOptions, ...options });
|
|
case "deflate":
|
|
return deflateSync(buffer, { ...defaultGzipOptions, ...options });
|
|
case "brotli":
|
|
return brotliCompressSync(buffer, {
|
|
...defaultBrotliOptions,
|
|
...options,
|
|
});
|
|
default:
|
|
throw new Error("不支持的压缩方法");
|
|
}
|
|
} catch (error) {
|
|
throw new Error(`压缩失败: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
// 同步解压函数
|
|
function decompressDataSync(data, method, options = {}) {
|
|
try {
|
|
const buffer = Buffer.from(data);
|
|
switch (method) {
|
|
case "gzip":
|
|
return gunzipSync(buffer, options);
|
|
case "deflate":
|
|
return inflateSync(buffer, options);
|
|
case "brotli":
|
|
return brotliDecompressSync(buffer, options);
|
|
default:
|
|
throw new Error("不支持的解压方法");
|
|
}
|
|
} catch (error) {
|
|
throw new Error(`解压失败: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
compressData,
|
|
decompressData,
|
|
compressDataSync,
|
|
decompressDataSync,
|
|
constants: zlib.constants,
|
|
};
|