zstd-public-decoder.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. /**
  2. * Public-API synchronous Zstandard frame decoder fallback.
  3. * @module dsh-session-persistence-jsonl/zstd-public-decoder
  4. */
  5. import { zstdDecompressSync } from 'node:zlib'
  6. import type { ZstdFrameDecoder, ZstdFrameRange } from './zstd.ts'
  7. /** Multi-frame adapter built exclusively from Node's supported one-shot API. */
  8. export class PublicZstdFrameDecoder implements ZstdFrameDecoder {
  9. private started = false
  10. private closed = false
  11. /** @inheritdoc */
  12. public *decode(source: Buffer, frames: readonly ZstdFrameRange[]): Generator<Buffer, void, void> {
  13. if (this.started) throw new Error('Zstandard frame decoder was already started')
  14. if (this.closed) throw new Error('cannot start a closed Zstandard frame decoder')
  15. this.started = true
  16. try {
  17. for (const { start, end } of frames) {
  18. let decoded: Buffer
  19. try {
  20. decoded = zstdDecompressSync(source.subarray(start, end))
  21. } catch (error) {
  22. throw new Error(`corrupt Zstandard session log: frame at byte ${start} failed validation`, {
  23. cause: error,
  24. })
  25. }
  26. yield decoded
  27. }
  28. } finally {
  29. this.close()
  30. }
  31. }
  32. /** @inheritdoc */
  33. close(): void {
  34. this.closed = true
  35. }
  36. }