zstd.compat.spec.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import { describe, expect, it } from 'vitest'
  2. import {
  3. compressZstdFrame, createZstdFrameDecoder, decompressZstdFrame, scanZstdFrames,
  4. } from '../src/zstd.ts'
  5. import { NodePrivateZstdFrameDecoder } from '../src/zstd-private-decoder.ts'
  6. import { PublicZstdFrameDecoder } from '../src/zstd-public-decoder.ts'
  7. describe('JSONL Zstandard compatibility', () => {
  8. it('round-trips concatenated checksummed frames through the built-in Node API', async () => {
  9. const encoded = Buffer.concat([
  10. await compressZstdFrame('{"type":"session","version":0,"id":"compat","createdAt":1}\n'),
  11. await compressZstdFrame('{"type":"turn/start","seq":0,"turn":1}\n'),
  12. ])
  13. const { frames, tornStart } = scanZstdFrames(encoded)
  14. expect(tornStart).toBeUndefined()
  15. expect(frames).toHaveLength(2)
  16. expect(frames.map(frame => encoded.subarray(frame.start, frame.start + 4).toString('hex')))
  17. .toEqual(['28b52ffd', '28b52ffd'])
  18. const decoded = await Promise.all(frames.map(frame => decompressZstdFrame(encoded.subarray(frame.start, frame.end))))
  19. expect(Buffer.concat(decoded).toString()).toContain('"type":"turn/start"')
  20. const preferred = createZstdFrameDecoder()
  21. expect(preferred).toBeInstanceOf(NodePrivateZstdFrameDecoder)
  22. for (const decoder of [preferred, new PublicZstdFrameDecoder()]) {
  23. try {
  24. const plaintext = Array.from(decoder.decode(encoded, frames), chunk => Buffer.from(chunk))
  25. expect(Buffer.concat(plaintext).toString()).toContain('"type":"turn/start"')
  26. } finally {
  27. decoder.close()
  28. }
  29. }
  30. const eventFrame = encoded.subarray(frames[1]!.start, frames[1]!.end)
  31. const missingChecksumByte = eventFrame.subarray(0, -1)
  32. expect(scanZstdFrames(missingChecksumByte)).toEqual({ frames: [], tornStart: 0 })
  33. })
  34. })