From 516a91acc23a06330a77a3ae1da31ec29725d359 Mon Sep 17 00:00:00 2001 From: duorameng <2997944583@qq.com> Date: Thu, 9 Jul 2026 20:30:41 +0800 Subject: [PATCH] feat(web): support decoding zstd-compressed logs via fzstd in frontend --- web/package-lock.json | 7 +++++++ web/package.json | 1 + web/src/types/fzstd.d.ts | 4 ++++ web/src/utils/decompress.ts | 20 +++++++++++++++++++- 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 web/src/types/fzstd.d.ts diff --git a/web/package-lock.json b/web/package-lock.json index f40e6c9..ed69d6e 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -24,6 +24,7 @@ "clsx": "^2.1.1", "cronstrue": "^3.14.0", "date-fns": "^4.1.0", + "fzstd": "^0.1.1", "lucide-react": "^0.562.0", "lucide-vue-next": "^0.562.0", "monaco-editor": "^0.52.0", @@ -4573,6 +4574,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/fzstd": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/fzstd/-/fzstd-0.1.1.tgz", + "integrity": "sha512-dkuVSOKKwh3eas5VkJy1AW1vFpet8TA/fGmVA5krThl8YcOVE/8ZIoEA1+U1vEn5ckxxhLirSdY837azmbaNHA==", + "license": "MIT" + }, "node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", diff --git a/web/package.json b/web/package.json index 95c651a..bf90710 100644 --- a/web/package.json +++ b/web/package.json @@ -25,6 +25,7 @@ "clsx": "^2.1.1", "cronstrue": "^3.14.0", "date-fns": "^4.1.0", + "fzstd": "^0.1.1", "lucide-react": "^0.562.0", "lucide-vue-next": "^0.562.0", "monaco-editor": "^0.52.0", diff --git a/web/src/types/fzstd.d.ts b/web/src/types/fzstd.d.ts new file mode 100644 index 0000000..a61f06b --- /dev/null +++ b/web/src/types/fzstd.d.ts @@ -0,0 +1,4 @@ +declare module 'fzstd' { + export function decompress(data: Uint8Array): Uint8Array; + export function compress(data: Uint8Array, level?: number): Uint8Array; +} diff --git a/web/src/utils/decompress.ts b/web/src/utils/decompress.ts index 6f89261..d7b3758 100644 --- a/web/src/utils/decompress.ts +++ b/web/src/utils/decompress.ts @@ -1,18 +1,36 @@ import pako from 'pako' +import { decompress } from 'fzstd' export function decompressFromBase64(compressed: string): string { if (!compressed) return '' try { + let isZstd = false + let dataToDecode = compressed + + if (compressed.startsWith('zstd:')) { + isZstd = true + dataToDecode = compressed.slice(5) + } + // Decode base64 to binary - const binaryString = atob(compressed) + const binaryString = atob(dataToDecode) const bytes = new Uint8Array(binaryString.length) for (let i = 0; i < binaryString.length; i++) { bytes[i] = binaryString.charCodeAt(i) } + + if (isZstd) { + // Decompress Zstd + const decompressedBytes = decompress(bytes) + return new TextDecoder().decode(decompressedBytes) + } + // Decompress zlib const decompressed = pako.inflate(bytes, { to: 'string' }) return decompressed } catch (e) { + console.error('Failed to decompress data:', e) return compressed } } +