Skip to main content

priv/ts/compression.ts

function toUint8Array(data: unknown): Uint8Array {
  if (data instanceof Uint8Array) return data
  if (data instanceof ArrayBuffer) return new Uint8Array(data)
  if (typeof data === 'string') return new TextEncoder().encode(data)
  return new Uint8Array(0)
}

const FORMATS: CompressionFormat[] = ['gzip', 'deflate', 'deflate-raw']

const compressionImpl: CompressionAPI = {
  compress(format: CompressionFormat, data: Uint8Array): Uint8Array {
    if (!FORMATS.includes(format)) {
      throw new TypeError(`Unsupported format: ${format}`)
    }
    return Beam.callSync('__compress', format, toUint8Array(data)) as Uint8Array
  },

  decompress(format: CompressionFormat, data: Uint8Array): Uint8Array {
    if (!FORMATS.includes(format)) {
      throw new TypeError(`Unsupported format: ${format}`)
    }
    return Beam.callSync('__decompress', format, toUint8Array(data)) as Uint8Array
  }
}

Object.defineProperty(globalThis, 'compression', {
  value: compressionImpl,
  writable: false
})