import brotliWasm from 'brotli-wasm'; import { gzipSync, gunzipSync } from 'fflate'; export enum CompressFormat { GZIP = 'gzip', BROTLI = 'brotli', } let brotliModule: Awaited | null = null; async function getBrotli() { if (brotliModule) return brotliModule; brotliModule = await brotliWasm; return brotliModule; } /** * 使用 fflate(brotli-wasm) 压缩二进制数据 * @param bytes 原始二进制数据 * @param format 压缩格式 * @returns 压缩后的二进制数据 */ export async function compressBytes( bytes: Uint8Array, format: CompressFormat ): Promise { if (format === CompressFormat.GZIP) { return gzipSync(bytes); } const brotli = await getBrotli(); return brotli.compress(bytes); } /** * 使用 fflate(brotli-wasm) 解压二进制数据 * @param bytes 压缩后的二进制数据 * @param format 压缩格式(需与压缩时一致) * @returns 解压后的二进制数据 */ export async function decompressBytes( bytes: Uint8Array, format: CompressFormat ): Promise { if (format === CompressFormat.GZIP) { return gunzipSync(bytes); } const brotli = await getBrotli(); return brotli.decompress(bytes); }