compress.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import brotliWasm from 'brotli-wasm';
  2. import { gzipSync, gunzipSync } from 'fflate';
  3. export enum CompressFormat {
  4. GZIP = 'gzip',
  5. BROTLI = 'brotli',
  6. }
  7. let brotliModule: Awaited<typeof brotliWasm> | null = null;
  8. async function getBrotli() {
  9. if (brotliModule) return brotliModule;
  10. brotliModule = await brotliWasm;
  11. return brotliModule;
  12. }
  13. /**
  14. * 使用 fflate(brotli-wasm) 压缩二进制数据
  15. * @param bytes 原始二进制数据
  16. * @param format 压缩格式
  17. * @returns 压缩后的二进制数据
  18. */
  19. export async function compressBytes(
  20. bytes: Uint8Array,
  21. format: CompressFormat
  22. ): Promise<Uint8Array> {
  23. if (format === CompressFormat.GZIP) {
  24. return gzipSync(bytes);
  25. }
  26. const brotli = await getBrotli();
  27. return brotli.compress(bytes);
  28. }
  29. /**
  30. * 使用 fflate(brotli-wasm) 解压二进制数据
  31. * @param bytes 压缩后的二进制数据
  32. * @param format 压缩格式(需与压缩时一致)
  33. * @returns 解压后的二进制数据
  34. */
  35. export async function decompressBytes(
  36. bytes: Uint8Array,
  37. format: CompressFormat
  38. ): Promise<Uint8Array> {
  39. if (format === CompressFormat.GZIP) {
  40. return gunzipSync(bytes);
  41. }
  42. const brotli = await getBrotli();
  43. return brotli.decompress(bytes);
  44. }