diff --git a/package-lock.json b/package-lock.json index 8f5a42f3a..904dd1fd3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "monaco-editor": "0.50.0", "react": "^19.0.0", "react-dom": "^19.0.0", + "zstddec": "^0.2.0-alpha.3", "zustand": "^5.0.4" }, "devDependencies": { @@ -13332,6 +13333,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zstddec": { + "version": "0.2.0-alpha.3", + "resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.2.0-alpha.3.tgz", + "integrity": "sha512-uHyE3TN8jRFOaMVwdhERfrcaabyoUUawIRDKXE6x0nCU7mzyIZO0LndJ3AtVUiKLF0lC+8F5bMSySWEF586PSA==", + "license": "MIT AND BSD-3-Clause" + }, "node_modules/zustand": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.5.tgz", diff --git a/package.json b/package.json index b526fd5ee..28d3b9e9b 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "monaco-editor": "0.50.0", "react": "^19.0.0", "react-dom": "^19.0.0", + "zstddec": "^0.2.0-alpha.3", "zustand": "^5.0.4" }, "devDependencies": { diff --git a/src/services/decoders/ZstdDecoder/index.ts b/src/services/decoders/ZstdDecoder/index.ts new file mode 100644 index 000000000..b740ef8d0 --- /dev/null +++ b/src/services/decoders/ZstdDecoder/index.ts @@ -0,0 +1,15 @@ +import {ZSTDDecoder} from "zstddec/stream"; + +import PlainTextDecoder from "../PlainTextDecoder"; + + +class ZstdDecoder extends PlainTextDecoder { + static override async create (dataArray: Uint8Array) { + const decompressor = new ZSTDDecoder(); + await decompressor.init(); + const decompressedDataArray = decompressor.decode(dataArray); + return new PlainTextDecoder(decompressedDataArray); + } +} + +export default ZstdDecoder; diff --git a/src/typings/file.ts b/src/typings/file.ts index 21ddba138..d48efef4d 100644 --- a/src/typings/file.ts +++ b/src/typings/file.ts @@ -2,6 +2,7 @@ import ClpIrDecoder from "../services/decoders/ClpIrDecoder"; import {CLP_IR_STREAM_TYPE} from "../services/decoders/ClpIrDecoder/utils"; import JsonlDecoder from "../services/decoders/JsonlDecoder"; import PlainTextDecoder from "../services/decoders/PlainTextDecoder"; +import ZstdDecoder from "../services/decoders/ZstdDecoder"; import {Decoder} from "./decoders"; @@ -21,7 +22,8 @@ interface FileTypeInfo { * Represents a file type with its identifying properties and decoder. */ interface FileTypeDef { - DecoderFactory: typeof ClpIrDecoder | typeof JsonlDecoder | typeof PlainTextDecoder; + DecoderFactory: typeof ClpIrDecoder | typeof JsonlDecoder | + typeof ZstdDecoder | typeof PlainTextDecoder; checkIsStructured: (decoder: Decoder) => FileTypeInfo["isStructured"]; extensions: FileTypeInfo["extension"][]; @@ -46,6 +48,13 @@ const FILE_TYPE_DEFINITIONS: FileTypeDef[] = [ name: "JSON Lines", signature: ["{".charCodeAt(0)], }, + { + DecoderFactory: ZstdDecoder, + checkIsStructured: () => false, + extensions: [".zst", ".zstd"], + name: "Zstandard", + signature: [0x28, 0xb5, 0x2f, 0xfd], + }, { DecoderFactory: PlainTextDecoder, checkIsStructured: () => false,