{"version":3,"file":"index.cjs","sources":["../../src/lib/types.ts","../../src/lib/utils.ts","../../src/lib/wasm.ts","../../src/lib/OmFileReader.ts","../../src/lib/backends/FileBackendNode.ts","../../src/lib/backends/MemoryHttpBackend.ts","../../src/lib/backends/BlockCacheBackend.ts","../../src/lib/backends/OmHttpBackend.ts","../../src/lib/BrowserBlockCache.ts","../../src/lib/BlockCache.ts"],"sourcesContent":["export interface Range {\n  start: number;\n  end: number;\n}\n\nexport interface OffsetSize {\n  offset: number;\n  size: number;\n}\n\nexport interface OmFilePrefetchReadOptions {\n  ranges: Range[];\n  prefetchConcurrency?: number;\n  ioSizeMax?: bigint;\n  ioSizeMerge?: bigint;\n  signal?: AbortSignal;\n}\n\nexport interface OmFileReadBaseOptions<T extends keyof OmDataTypeToTypedArray> extends OmFilePrefetchReadOptions {\n  type: T;\n  prefetch?: boolean;\n}\n\nexport interface OmFileReadOptions<T extends keyof OmDataTypeToTypedArray> extends OmFileReadBaseOptions<T> {\n  intoSAB?: boolean;\n}\n\nexport interface OmFileReadIntoOptions<T extends keyof OmDataTypeToTypedArray> extends OmFileReadBaseOptions<T> {\n  output: OmDataTypeToTypedArray[T];\n}\n\nexport enum CompressionType {\n  /// Lossy compression using 2D delta coding and scale-factor.\n  /// Only supports float and scales to 16-bit signed integer.\n  PforDelta2dInt16 = 0,\n  /// Lossless float/double compression using 2D xor coding.\n  FpxXor2d = 1,\n  /// PFor integer compression.\n  /// f32 values are scaled to u32, f64 are scaled to u64.\n  PforDelta2d = 2,\n  /// Similar to `PforDelta2dInt16` but applies `log10(1+x)` before.\n  PforDelta2dInt16Logarithmic = 3,\n  None = 4,\n}\n\nexport enum OmDataType {\n  None = 0,\n  Int8 = 1,\n  Uint8 = 2,\n  Int16 = 3,\n  Uint16 = 4,\n  Int32 = 5,\n  Uint32 = 6,\n  Int64 = 7,\n  Uint64 = 8,\n  Float = 9,\n  Double = 10,\n  String = 11,\n  Int8Array = 12,\n  Uint8Array = 13,\n  Int16Array = 14,\n  Uint16Array = 15,\n  Int32Array = 16,\n  Uint32Array = 17,\n  Int64Array = 18,\n  Uint64Array = 19,\n  FloatArray = 20,\n  DoubleArray = 21,\n  StringArray = 22,\n}\n\nexport type TypedArray =\n  | Int8Array\n  | Uint8Array\n  | Int16Array\n  | Uint16Array\n  | Int32Array\n  | Uint32Array\n  | BigInt64Array\n  | BigUint64Array\n  | Float32Array\n  | Float64Array;\n\nexport interface OmDataTypeToTypedArray {\n  [OmDataType.Int8Array]: Int8Array;\n  [OmDataType.Uint8Array]: Uint8Array;\n  [OmDataType.Int16Array]: Int16Array;\n  [OmDataType.Uint16Array]: Uint16Array;\n  [OmDataType.Int32Array]: Int32Array;\n  [OmDataType.Uint32Array]: Uint32Array;\n  [OmDataType.Int64Array]: BigInt64Array;\n  [OmDataType.Uint64Array]: BigUint64Array;\n  [OmDataType.FloatArray]: Float32Array;\n  [OmDataType.DoubleArray]: Float64Array;\n}\n\nexport type FileSource = string | File | Blob | Uint8Array | ArrayBuffer;\n","/**\n * Throws the signal's abort reason if the signal has been aborted.\n * Uses the standard DOMException with name \"AbortError\" as fallback.\n */\nexport function throwIfAborted(signal?: AbortSignal): void {\n  if (signal?.throwIfAborted) {\n    signal.throwIfAborted();\n  } else if (signal?.aborted) {\n    throw signal.reason ?? new DOMException(\"The operation was aborted\", \"AbortError\");\n  }\n}\n\n/**\n * FNV-1a 64-bit hash implementation\n */\nexport function fnv1aHash64(str: string): bigint {\n  const FNV_OFFSET_BASIS = 0xcbf29ce484222325n;\n  const FNV_PRIME = 0x100000001b3n;\n\n  let hash = FNV_OFFSET_BASIS;\n  const bytes = new TextEncoder().encode(str);\n\n  for (const byte of bytes) {\n    hash ^= BigInt(byte);\n    hash = (hash * FNV_PRIME) & 0xffffffffffffffffn;\n  }\n\n  return hash;\n}\n\n/**\n * Fetch with exponential backoff retry on server-side errors (HTTP 5xx) and per-attempt timeout.\n */\nexport async function fetchRetry(\n  input: RequestInfo,\n  init?: RequestInit,\n  timeoutMs = 5000,\n  retries = 3,\n  signal?: AbortSignal\n): Promise<Response> {\n  let lastError: Error;\n\n  function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n    return Promise.race([\n      promise,\n      new Promise<T>((_, reject) => setTimeout(() => reject(new Error(`Timeout after ${ms}ms`)), ms)),\n    ]);\n  }\n\n  for (let attempt = 0; attempt < retries; attempt++) {\n    throwIfAborted(signal);\n    try {\n      const mergedInit: RequestInit = { ...init };\n      if (signal) {\n        mergedInit.signal = signal;\n      }\n      const response = await withTimeout(fetch(input, mergedInit), timeoutMs);\n      if (response.status >= 500 && response.status < 600) {\n        throw new Error(`Server error: ${response.status}`);\n      }\n      return response;\n    } catch (error) {\n      // If the signal was aborted, re-throw immediately without retrying\n      throwIfAborted(signal);\n      lastError = error instanceof Error ? error : new Error(String(error));\n      if (attempt < retries - 1) {\n        const delay = Math.min(500 * Math.pow(2, attempt), 5000);\n        //console.debug(`Attempt ${attempt + 1} failed, retrying in ${delay}ms: ${lastError.message}`);\n        await new Promise((resolve) => setTimeout(resolve, delay));\n      }\n    }\n  }\n  throw lastError!;\n}\n\nexport async function runLimited<T>(tasks: (() => Promise<T>)[], limit: number, signal?: AbortSignal): Promise<T[]> {\n  const results: T[] = new Array(tasks.length) as T[];\n\n  for (let i = 0; i < tasks.length; i += limit) {\n    throwIfAborted(signal);\n    const batch = tasks.slice(i, i + limit);\n    const batchResults = await Promise.all(batch.map((task) => task()));\n\n    for (let j = 0; j < batchResults.length; j++) {\n      results[i + j] = batchResults[j];\n    }\n  }\n\n  return results;\n}\n","export interface WasmModule {\n  _malloc(size: number): number;\n  _free(ptr: number): void;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  setValue(ptr: number, value: any, type: string): void;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  getValue(ptr: number, type: string): any;\n  HEAPU8: Uint8Array;\n\n  // C-API functions\n  om_header_size(): number;\n  om_header_type(ptr: number): number;\n  om_trailer_size(): number;\n  om_trailer_read(trailerPtr: number, offsetPtr: number, sizePtr: number): boolean;\n  om_variable_init(dataPtr: number): number;\n  om_variable_get_type(variable: number): number;\n  om_variable_get_compression(variable: number): number;\n  om_variable_get_scale_factor(variable: number): number;\n  om_variable_get_add_offset(variable: number): number;\n  om_variable_get_dimensions_count(variable: number): number;\n  om_variable_get_dimensions_ptr(variable: number): number;\n  om_variable_get_chunks_ptr(variable: number): number;\n  om_variable_get_name_ptr(variable: number, length: number): number;\n  om_variable_get_children_count(variable: number): number;\n  om_variable_get_children(variable: number, index: number, count: number, offsetPtr: number, sizePtr: number): boolean;\n  om_variable_get_scalar(variable: number, ptrPtr: number, sizePtr: number): number;\n  om_decoder_init(\n    decoderPtr: number,\n    variable: number,\n    nDims: bigint,\n    readOffsetPtr: number,\n    readCountPtr: number,\n    intoCubeOffsetPtr: number,\n    intoCubeDimensionPtr: number,\n    ioSizeMerge: bigint,\n    ioSizeMax: bigint\n  ): number;\n  om_decoder_init_index_read(decoder: number, indexReadPtr: number): void;\n  om_decoder_init_data_read(dataReadPtr: number, indexReadPtr: number): void;\n  om_decoder_read_buffer_size(decoderPtr: number): number;\n  om_decoder_next_index_read(decoder: number, indexRead: number): boolean;\n  om_decoder_next_data_read(\n    decoder: number,\n    dataRead: number,\n    indexData: number,\n    indexCount: bigint,\n    error: number\n  ): boolean;\n  om_decoder_decode_chunks(\n    decoder: number,\n    chunkIndex: number,\n    data: number,\n    count: bigint,\n    output: number,\n    chunkBuffer: number,\n    error: number\n  ): boolean;\n\n  // Constants\n  OM_HEADER_INVALID: number;\n  OM_HEADER_LEGACY: number;\n  OM_HEADER_READ_TRAILER: number;\n  ERROR_OK: number;\n  DATA_TYPE_INT8_ARRAY: number;\n  DATA_TYPE_UINT8_ARRAY: number;\n  DATA_TYPE_INT16_ARRAY: number;\n  DATA_TYPE_UINT16_ARRAY: number;\n  DATA_TYPE_INT32_ARRAY: number;\n  DATA_TYPE_UINT32_ARRAY: number;\n  DATA_TYPE_INT64_ARRAY: number;\n  DATA_TYPE_UINT64_ARRAY: number;\n  DATA_TYPE_FLOAT_ARRAY: number;\n  DATA_TYPE_DOUBLE_ARRAY: number;\n\n  // Additional info\n  sizeof_decoder: number;\n}\n\n// Constants mapping\nconst DATA_TYPES = {\n  DATA_TYPE_NONE: 0,\n  DATA_TYPE_INT8: 1,\n  DATA_TYPE_UINT8: 2,\n  DATA_TYPE_INT16: 3,\n  DATA_TYPE_UINT16: 4,\n  DATA_TYPE_INT32: 5,\n  DATA_TYPE_UINT32: 6,\n  DATA_TYPE_INT64: 7,\n  DATA_TYPE_UINT64: 8,\n  DATA_TYPE_FLOAT: 9,\n  DATA_TYPE_DOUBLE: 10,\n  DATA_TYPE_STRING: 11,\n  DATA_TYPE_INT8_ARRAY: 12,\n  DATA_TYPE_UINT8_ARRAY: 13,\n  DATA_TYPE_INT16_ARRAY: 14,\n  DATA_TYPE_UINT16_ARRAY: 15,\n  DATA_TYPE_INT32_ARRAY: 16,\n  DATA_TYPE_UINT32_ARRAY: 17,\n  DATA_TYPE_INT64_ARRAY: 18,\n  DATA_TYPE_UINT64_ARRAY: 19,\n  DATA_TYPE_FLOAT_ARRAY: 20,\n  DATA_TYPE_DOUBLE_ARRAY: 21,\n  DATA_TYPE_STRING_ARRAY: 22,\n};\n\nconst HEADER_TYPES = {\n  OM_HEADER_INVALID: 0,\n  OM_HEADER_LEGACY: 1,\n  OM_HEADER_READ_TRAILER: 2,\n};\n\nconst ERROR_CODES = {\n  ERROR_OK: 0,\n};\n\n// Size of the decoder structure\nconst SIZEOF_DECODER = 104;\n\nlet wasmModuleWrapped: WasmModule | null = null;\n\nexport async function initWasm(): Promise<WasmModule> {\n  if (wasmModuleWrapped) return wasmModuleWrapped;\n\n  try {\n    const OmFileFormat = await import(\"@openmeteo/file-format-wasm\");\n    const wasmModuleRaw = await OmFileFormat.default();\n\n    // Create wrapped module with the expected interface\n    wasmModuleWrapped = createWrappedModule(wasmModuleRaw);\n\n    return wasmModuleWrapped;\n  } catch (error) {\n    throw new Error(\"Failed to initialize WASM module\", {\n      cause: error,\n    });\n  }\n}\n\nfunction createWrappedModule(rawModule: EmscriptenModule): WasmModule {\n  return {\n    // Memory management functions\n    _malloc: rawModule._malloc,\n    _free: rawModule._free,\n    setValue: rawModule.setValue,\n    getValue: rawModule.getValue,\n    HEAPU8: rawModule.HEAPU8,\n\n    // Map all the C functions to their prefixed versions\n    om_header_size: rawModule._om_header_size,\n    om_header_type: rawModule._om_header_type,\n    om_trailer_size: rawModule._om_trailer_size,\n    om_trailer_read: rawModule._om_trailer_read,\n    om_variable_init: rawModule._om_variable_init,\n    om_variable_get_type: rawModule._om_variable_get_type,\n    om_variable_get_compression: rawModule._om_variable_get_compression,\n    om_variable_get_scale_factor: rawModule._om_variable_get_scale_factor,\n    om_variable_get_add_offset: rawModule._om_variable_get_add_offset,\n    om_variable_get_dimensions_count: rawModule._om_variable_get_dimensions_count,\n    om_variable_get_dimensions_ptr: rawModule._om_variable_get_dimensions,\n    om_variable_get_chunks_ptr: rawModule._om_variable_get_chunks,\n    om_variable_get_name_ptr: rawModule._om_variable_get_name,\n    om_variable_get_children_count: rawModule._om_variable_get_children_count,\n    om_variable_get_children: rawModule._om_variable_get_children,\n    om_variable_get_scalar: rawModule._om_variable_get_scalar,\n    om_decoder_init: rawModule._om_decoder_init,\n    om_decoder_init_index_read: rawModule._om_decoder_init_index_read,\n    om_decoder_init_data_read: rawModule._om_decoder_init_data_read,\n    om_decoder_read_buffer_size: rawModule._om_decoder_read_buffer_size,\n    om_decoder_next_index_read: rawModule._om_decoder_next_index_read,\n    om_decoder_next_data_read: rawModule._om_decoder_next_data_read,\n    om_decoder_decode_chunks: rawModule._om_decoder_decode_chunks,\n\n    // Constants\n    ...HEADER_TYPES,\n    ...ERROR_CODES,\n    ...DATA_TYPES,\n\n    // Additional info\n    sizeof_decoder: SIZEOF_DECODER,\n  };\n}\n\nexport function getWasmModule() {\n  if (!wasmModuleWrapped) {\n    throw new Error(\"WASM module not initialized. Call initWasm() first.\");\n  }\n  return wasmModuleWrapped;\n}\n","import { OmFileReaderBackend } from \"./backends/OmFileReaderBackend\";\nimport {\n  OffsetSize,\n  OmDataType,\n  TypedArray,\n  OmDataTypeToTypedArray,\n  OmFileReadOptions,\n  OmFileReadIntoOptions,\n  Range,\n  OmFilePrefetchReadOptions,\n} from \"./types\";\nimport { runLimited, throwIfAborted } from \"./utils\";\nimport { WasmModule, initWasm, getWasmModule } from \"./wasm\";\n\nexport class OmFileReader {\n  private backend: OmFileReaderBackend;\n  private wasm: WasmModule;\n  private variable: number | null;\n  private variableDataPtr: number | null;\n  private metadataCache: Map<string, OffsetSize | null>;\n\n  constructor(backend: OmFileReaderBackend, wasm?: WasmModule) {\n    this.backend = backend;\n    this.wasm = wasm ?? getWasmModule();\n    this.variable = null;\n    this.variableDataPtr = null;\n    this.metadataCache = new Map();\n  }\n\n  /**\n   * Static factory method to create and initialize an OmFileReader\n   */\n  static async create(backend: OmFileReaderBackend): Promise<OmFileReader> {\n    // Make sure WASM is initialized\n    const wasm = await initWasm();\n    const reader = new OmFileReader(backend, wasm);\n    await reader.initialize();\n    return reader;\n  }\n\n  async initialize(): Promise<OmFileReader> {\n    let variableData: Uint8Array | undefined;\n\n    // First, try to read the trailer\n    const trailerSize = this.wasm.om_trailer_size();\n\n    const fileSize = await this.backend.count();\n    if (fileSize < trailerSize) {\n      throw new Error(\"File too small to contain trailer\");\n    }\n\n    if (fileSize >= trailerSize) {\n      const trailerOffset = fileSize - trailerSize;\n      const trailerPtr = await this._readDataBlock(trailerOffset, trailerSize);\n\n      const offsetPtr = this.wasm._malloc(8); // 64-bit value\n      const sizePtr = this.wasm._malloc(8);\n\n      try {\n        const success = this.wasm.om_trailer_read(trailerPtr, offsetPtr, sizePtr);\n\n        if (success) {\n          const offset = Number(this.wasm.getValue(offsetPtr, \"i64\"));\n          const size = Number(this.wasm.getValue(sizePtr, \"i64\"));\n          variableData = await this.backend.getBytes(offset, size);\n        }\n      } finally {\n        this.wasm._free(trailerPtr);\n        this.wasm._free(offsetPtr);\n        this.wasm._free(sizePtr);\n      }\n    }\n\n    // Fallback to legacy header if trailer reading fails\n    if (!variableData) {\n      const headerSize = this.wasm.om_header_size();\n      const headerData = await this.backend.getBytes(0, headerSize);\n      const headerPtr = this.wasm._malloc(headerData.length);\n      this.wasm.HEAPU8.set(headerData, headerPtr);\n\n      try {\n        const headerType = this.wasm.om_header_type(headerPtr);\n        if (headerType === this.wasm.OM_HEADER_LEGACY) {\n          variableData = headerData;\n        }\n      } finally {\n        this.wasm._free(headerPtr);\n      }\n    }\n\n    if (!variableData) {\n      throw new Error(\"Not a valid OM file\");\n    }\n\n    // Initialize variable\n    const variableDataPtr = this.wasm._malloc(variableData.length);\n    this.wasm.HEAPU8.set(variableData, variableDataPtr);\n    this.variable = this.wasm.om_variable_init(variableDataPtr);\n\n    if (!this.variable) {\n      this.wasm._free(variableDataPtr);\n      throw new Error(\"Failed to initialize variable\");\n    }\n\n    this.variableDataPtr = variableDataPtr;\n\n    return this;\n  }\n\n  // Helper method to convert C strings to JS strings\n  private _getString(strPtr: number, strLen: number): string {\n    const bytes = this.wasm.HEAPU8.subarray(strPtr, strPtr + strLen);\n    return new TextDecoder(\"utf8\").decode(bytes);\n  }\n\n  dataType(): number {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n    return this.wasm.om_variable_get_type(this.variable);\n  }\n\n  compression(): number {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n    return this.wasm.om_variable_get_compression(this.variable);\n  }\n\n  scaleFactor(): number {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n    return this.wasm.om_variable_get_scale_factor(this.variable);\n  }\n\n  addOffset(): number {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n    return this.wasm.om_variable_get_add_offset(this.variable);\n  }\n\n  getDimensions(): number[] {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n\n    const count = Number(this.wasm.om_variable_get_dimensions_count(this.variable));\n    const dimensionsPtr = this.wasm.om_variable_get_dimensions_ptr(this.variable);\n\n    // Create view directly into WASM memory\n    const int64View = new BigInt64Array(this.wasm.HEAPU8.buffer, dimensionsPtr, count);\n    return Array.from(int64View, (bigIntVal) => Number(bigIntVal));\n  }\n\n  getChunkDimensions(): number[] {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n\n    const count = Number(this.wasm.om_variable_get_dimensions_count(this.variable));\n    const chunksPtr = this.wasm.om_variable_get_chunks_ptr(this.variable);\n\n    // Create view directly into WASM memory\n    const int64View = new BigInt64Array(this.wasm.HEAPU8.buffer, chunksPtr, count);\n    return Array.from(int64View, (bigIntVal) => Number(bigIntVal));\n  }\n\n  getName(): string | null {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n\n    // string length is i16\n    const lengthPtr = this.wasm._malloc(2);\n    const valuePtr = this.wasm.om_variable_get_name_ptr(this.variable, lengthPtr);\n    const size = this.wasm.getValue(lengthPtr, \"i16\") as number;\n    this.wasm._free(lengthPtr);\n    if (size === 0 || valuePtr === 0) {\n      return null;\n    }\n    return this._getString(valuePtr, size);\n  }\n\n  numberOfChildren(): number {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n    return this.wasm.om_variable_get_children_count(this.variable);\n  }\n\n  async getChild(index: number): Promise<OmFileReader | null> {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n\n    // Allocate memory for the output parameters\n    const offsetPtr = this.wasm._malloc(8);\n    const sizePtr = this.wasm._malloc(8);\n\n    const success = this.wasm.om_variable_get_children(this.variable, index, 1, offsetPtr, sizePtr);\n\n    if (!success) {\n      this.wasm._free(offsetPtr);\n      this.wasm._free(sizePtr);\n      return null;\n    }\n\n    const offset = Number(this.wasm.getValue(offsetPtr, \"i64\"));\n    const size = Number(this.wasm.getValue(sizePtr, \"i64\"));\n\n    this.wasm._free(offsetPtr);\n    this.wasm._free(sizePtr);\n\n    return this.initChildFromOffsetSize({ offset, size });\n  }\n\n  /**\n   * Searches direct children by name. Does not search recursively.\n   */\n  async getChildByName(name: string): Promise<OmFileReader | null> {\n    // Check cache first\n    const cachedMetadata = this.metadataCache.get(name);\n    if (cachedMetadata === null) {\n      return null;\n    }\n    if (cachedMetadata) {\n      return await this.initChildFromOffsetSize(cachedMetadata);\n    }\n\n    // Search through children and cache metadata\n    const numChildren = this.numberOfChildren();\n    for (let i = 0; i < numChildren; i++) {\n      const metadata = this._getChildMetadata(i);\n      if (metadata) {\n        const child = await this.initChildFromOffsetSize(metadata);\n        const childName = child.getName();\n        if (childName) {\n          this.metadataCache.set(childName, metadata);\n          if (childName === name) {\n            return child; // keep this one\n          }\n        }\n        child.dispose();\n      }\n    }\n    // also remember invalid names\n    this.metadataCache.set(name, null);\n    return null;\n  }\n\n  async initChildFromOffsetSize(offsetSize: OffsetSize): Promise<OmFileReader> {\n    const childDataPtr = await this._readDataBlock(offsetSize.offset, offsetSize.size);\n\n    const childReader = new OmFileReader(this.backend, this.wasm);\n\n    childReader.variable = this.wasm.om_variable_init(childDataPtr);\n    childReader.variableDataPtr = childDataPtr;\n\n    return childReader;\n  }\n\n  /**\n   * Get child metadata by index.\n   */\n  private _getChildMetadata(index: number): OffsetSize | null {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n\n    // Allocate memory for the output parameters\n    const offsetPtr = this.wasm._malloc(8);\n    const sizePtr = this.wasm._malloc(8);\n\n    const success = this.wasm.om_variable_get_children(this.variable, index, 1, offsetPtr, sizePtr);\n\n    if (!success) {\n      this.wasm._free(offsetPtr);\n      this.wasm._free(sizePtr);\n      return null;\n    }\n\n    const offset = Number(this.wasm.getValue(offsetPtr, \"i64\"));\n    const size = Number(this.wasm.getValue(sizePtr, \"i64\"));\n\n    this.wasm._free(offsetPtr);\n    this.wasm._free(sizePtr);\n\n    return { offset, size };\n  }\n\n  /**\n   * Find a variable by its path (e.g., \"parent/child/grandchild\")\n   */\n  async findByPath(path: string): Promise<OmFileReader | null> {\n    const parts = path.split(\"/\").filter((s) => s.length > 0);\n    return await this.navigatePath(parts);\n  }\n\n  /**\n   * Navigate through a path recursively\n   */\n  async navigatePath(parts: string[]): Promise<OmFileReader | null> {\n    if (parts.length === 0) {\n      return null;\n    }\n\n    const child = await this.getChildByName(parts[0]);\n    if (child) {\n      if (parts.length === 1) {\n        return child;\n      } else {\n        return await child.navigatePath(parts.slice(1));\n      }\n    }\n    return null;\n  }\n\n  // Method to read scalar values\n  readScalar<T>(dataType: OmDataType): T | null {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n\n    if (this.dataType() !== dataType.valueOf()) {\n      return null;\n    }\n\n    // Allocate memory for output parameters\n    const ptrPtr = this.wasm._malloc(4); // pointer to pointer\n    const sizePtr = this.wasm._malloc(8); // u64\n\n    try {\n      const error = this.wasm.om_variable_get_scalar(this.variable, ptrPtr, sizePtr);\n\n      if (error !== this.wasm.ERROR_OK) {\n        return null;\n      }\n\n      const dataPtr = this.wasm.getValue(ptrPtr, \"*\") as number;\n\n      if (dataPtr === 0) {\n        return null;\n      }\n\n      // Read data based on type\n      let result: T | null;\n\n      // TODO: Support Int64 and Uint64\n      switch (dataType) {\n        case OmDataType.Int8:\n          result = this.wasm.getValue(dataPtr, \"i8\") as T;\n          break;\n        case OmDataType.Uint8:\n          result = (this.wasm.getValue(dataPtr, \"i8\") & 0xff) as T;\n          break;\n        case OmDataType.Int16:\n          result = this.wasm.getValue(dataPtr, \"i16\") as T;\n          break;\n        case OmDataType.Uint16:\n          result = (this.wasm.getValue(dataPtr, \"i16\") & 0xffff) as T;\n          break;\n        case OmDataType.Int32:\n          result = this.wasm.getValue(dataPtr, \"i32\") as T;\n          break;\n        case OmDataType.Uint32:\n          result = (this.wasm.getValue(dataPtr, \"i32\") >>> 0) as T;\n          break;\n        case OmDataType.Int64:\n          result = this.wasm.getValue(dataPtr, \"i64\") as T;\n          break;\n        case OmDataType.Uint64:\n          // convert to unsigned BigInt\n          {\n            const val = this.wasm.getValue(dataPtr, \"i64\") as bigint;\n            result = (val & BigInt(\"0xFFFFFFFFFFFFFFFF\")) as T;\n          }\n          break;\n        case OmDataType.Float:\n          result = this.wasm.getValue(dataPtr, \"float\") as T;\n          break;\n        case OmDataType.Double:\n          result = this.wasm.getValue(dataPtr, \"double\") as T;\n          break;\n        case OmDataType.String:\n          {\n            const size = Number(this.wasm.getValue(sizePtr, \"i64\"));\n            if (size === 0) {\n              return null;\n            }\n            result = this._getString(dataPtr, size) as T;\n          }\n          break;\n        default:\n          result = null;\n      }\n      return result;\n    } finally {\n      this.wasm._free(ptrPtr);\n      this.wasm._free(sizePtr);\n    }\n  }\n\n  private newIndexRead(decoderPtr: number): number {\n    // Size of OmDecoder_indexRead_t\n    const sizeOfRange = 16; // 8 bytes for lowerBound + 8 bytes for upperBound\n    const sizeOfIndexRead = 8 + 8 + sizeOfRange * 3; // offset + count + 3 range structs\n\n    // Allocate the memory\n    const indexReadPtr = this.wasm._malloc(sizeOfIndexRead);\n    this.wasm.om_decoder_init_index_read(decoderPtr, indexReadPtr);\n    return indexReadPtr;\n  }\n\n  private newDataRead(indexReadPtr: number): number {\n    // Size of OmDecoder_dataRead_t\n    const sizeOfRange = 16; // 8 bytes for lowerBound + 8 bytes for upperBound\n    const sizeOfDataRead = 8 + 8 + sizeOfRange * 3; // offset + count + 3 range structs\n\n    // Allocate the memory\n    const dataReadPtr = this.wasm._malloc(sizeOfDataRead);\n    this.wasm.om_decoder_init_data_read(dataReadPtr, indexReadPtr);\n    return dataReadPtr;\n  }\n\n  private allocateTypedArray<T extends keyof OmDataTypeToTypedArray>(\n    dataType: T,\n    size: number,\n    useSharedBuffer = false\n  ): OmDataTypeToTypedArray[T] {\n    if (useSharedBuffer && typeof SharedArrayBuffer === \"undefined\") {\n      throw new Error(\"SharedArrayBuffer is not available in this environment\");\n    }\n\n    // Type-safe mapping of data types to their constructors and byte sizes\n    const typeInfo = {\n      [this.wasm.DATA_TYPE_INT8_ARRAY]: { constructor: Int8Array<ArrayBufferLike>, bytes: 1 },\n      [this.wasm.DATA_TYPE_UINT8_ARRAY]: { constructor: Uint8Array<ArrayBufferLike>, bytes: 1 },\n      [this.wasm.DATA_TYPE_INT16_ARRAY]: { constructor: Int16Array<ArrayBufferLike>, bytes: 2 },\n      [this.wasm.DATA_TYPE_UINT16_ARRAY]: { constructor: Uint16Array<ArrayBufferLike>, bytes: 2 },\n      [this.wasm.DATA_TYPE_INT32_ARRAY]: { constructor: Int32Array<ArrayBufferLike>, bytes: 4 },\n      [this.wasm.DATA_TYPE_UINT32_ARRAY]: { constructor: Uint32Array<ArrayBufferLike>, bytes: 4 },\n      [this.wasm.DATA_TYPE_INT64_ARRAY]: { constructor: BigInt64Array<ArrayBufferLike>, bytes: 8 },\n      [this.wasm.DATA_TYPE_UINT64_ARRAY]: { constructor: BigUint64Array<ArrayBufferLike>, bytes: 8 },\n      [this.wasm.DATA_TYPE_FLOAT_ARRAY]: { constructor: Float32Array<ArrayBufferLike>, bytes: 4 },\n      [this.wasm.DATA_TYPE_DOUBLE_ARRAY]: { constructor: Float64Array<ArrayBufferLike>, bytes: 8 },\n    } as const;\n\n    const info = typeInfo[dataType];\n    const byteLength = size * info.bytes;\n\n    if (useSharedBuffer) {\n      // In browsers, crossOriginIsolated must be true; in Node, it's undefined (so skip check)\n      if (\n        typeof SharedArrayBuffer === \"undefined\" ||\n        (typeof crossOriginIsolated !== \"undefined\" && !crossOriginIsolated)\n      ) {\n        throw new Error(\"SharedArrayBuffer is not available in this environment\");\n      }\n      const sharedBuffer = new SharedArrayBuffer(byteLength);\n      return new info.constructor(sharedBuffer) as OmDataTypeToTypedArray[T];\n    } else {\n      const normalBuffer = new ArrayBuffer(byteLength);\n      return new info.constructor(normalBuffer) as OmDataTypeToTypedArray[T];\n    }\n  }\n\n  /**\n   * Reads data from the file and returns a new TypedArray of the requested type.\n   *\n   * @param options Options for reading, including:\n   *   - type: The data type to read.\n   *   - ranges: Array of dimension ranges to read.\n   *   - prefetch: Whether to prefetch data (default: true).\n   *   - intoSAB: Use SharedArrayBuffer for output (default: false).\n   *   - ioSizeMax: Maximum I/O size (default: 65536).\n   *   - ioSizeMerge: Merge threshold for I/O operations (default: 2048).\n   */\n  async read<T extends keyof OmDataTypeToTypedArray>(\n    options: OmFileReadOptions<T>\n  ): Promise<OmDataTypeToTypedArray[T]> {\n    const {\n      type,\n      ranges,\n      prefetch = true,\n      prefetchConcurrency = 10,\n      intoSAB = false,\n      ioSizeMax = BigInt(65536),\n      ioSizeMerge = BigInt(2048),\n      signal,\n    } = options;\n\n    // Calculate output dimensions\n    const outDims = ranges.map((range) => Number(range.end - range.start));\n    const totalSize = outDims.reduce((a, b) => a * b, 1);\n\n    const output = this.allocateTypedArray(type, totalSize, intoSAB);\n\n    await this.readInto({ type, output, ranges, ioSizeMax, ioSizeMerge, prefetch, prefetchConcurrency, signal });\n    return output;\n  }\n\n  /**\n   * Reads data into an existing TypedArray with specified dimension ranges.\n   *\n   * @param options Options for reading, including:\n   *   - type: The data type to read.\n   *   - output: The TypedArray to read data into.\n   *   - ranges: Array of dimension ranges to read.\n   *   - prefetch: Whether to prefetch data (default: true).\n   *   - ioSizeMax: Maximum I/O size (default: 65536).\n   *   - ioSizeMerge: Merge threshold for I/O operations (default: 2048).\n   */\n  async readInto<T extends keyof OmDataTypeToTypedArray>(options: OmFileReadIntoOptions<T>): Promise<void> {\n    const {\n      type,\n      output,\n      ranges,\n      prefetch = true,\n      prefetchConcurrency = 10,\n      ioSizeMax = BigInt(65536),\n      ioSizeMerge = BigInt(2048),\n      signal,\n    } = options;\n\n    if (this.dataType() !== type) {\n      throw new Error(`Invalid data type: expected ${this.dataType()}, got ${type}`);\n    }\n\n    const nDims = ranges.length;\n    const fileDims = this.getDimensions();\n\n    // Validate dimension counts\n    if (fileDims.length !== nDims) {\n      throw new Error(`Mismatched dimensions: file has ${fileDims.length}, request has ${nDims}`);\n    }\n\n    // Verify output size before starting\n    const totalElements = ranges.reduce((acc, r) => acc * Number(r.end - r.start), 1);\n    if (output.length < totalElements) {\n      throw new Error(`Output array is too small: needs ${totalElements} elements, has ${output.length}`);\n    }\n\n    await this._runWithDecoder(\n      ranges,\n      ioSizeMax,\n      ioSizeMerge,\n      async (decoderPtr) => {\n        if (prefetch) {\n          await this.decodePrefetch(decoderPtr, prefetchConcurrency, signal);\n        }\n        await this.decode(decoderPtr, output, signal);\n      },\n      signal\n    );\n  }\n\n  /**\n   * Warms up the backend cache by requesting the necessary data blocks\n   * without decoding them or copying them to a TypedArray.\n   */\n  async readPrefetch(options: OmFilePrefetchReadOptions): Promise<void> {\n    const { ranges, prefetchConcurrency = 20, ioSizeMax = BigInt(65536), ioSizeMerge = BigInt(2048), signal } = options;\n\n    await this._runWithDecoder(\n      ranges,\n      ioSizeMax,\n      ioSizeMerge,\n      async (decoderPtr) => {\n        await this.decodePrefetch(decoderPtr, prefetchConcurrency, signal);\n      },\n      signal\n    );\n  }\n\n  private async decodePrefetch(decoderPtr: number, concurrency = 10, signal?: AbortSignal): Promise<void> {\n    if (!this.backend.collectPrefetchTasks) return;\n\n    const allTasks: (() => Promise<void>)[] = [];\n\n    await this._iterateDataBlocks(\n      decoderPtr,\n      async (dataReadPtr) => {\n        const dataOffset = Number(this.wasm.getValue(dataReadPtr, \"i64\"));\n        const dataCount = Number(this.wasm.getValue(dataReadPtr + 8, \"i64\"));\n\n        const tasks = await this.backend.collectPrefetchTasks!(dataOffset, dataCount, signal);\n        allTasks.push(...tasks);\n      },\n      signal\n    );\n\n    if (allTasks.length > 0) {\n      await runLimited(allTasks, concurrency, signal);\n    }\n  }\n\n  private async decode(decoderPtr: number, outputArray: TypedArray, signal?: AbortSignal): Promise<void> {\n    const outputPtr = this.wasm._malloc(outputArray.byteLength);\n    const chunkBufferSize = Number(this.wasm.om_decoder_read_buffer_size(decoderPtr));\n    const chunkBufferPtr = this.wasm._malloc(chunkBufferSize);\n    const errorPtr = this.wasm._malloc(4); // Separate error ptr for the decode step\n    this.wasm.setValue(errorPtr, this.wasm.ERROR_OK, \"i32\");\n\n    try {\n      await this._iterateDataBlocks(\n        decoderPtr,\n        async (dataReadPtr) => {\n          const dataOffset = Number(this.wasm.getValue(dataReadPtr, \"i64\"));\n          const dataCount = Number(this.wasm.getValue(dataReadPtr + 8, \"i64\"));\n          const chunkIndexPtr = dataReadPtr + 32; // offset(8), count(8), indexRange(16)\n\n          // Get the compressed data from the backend\n          const dataBlockPtr = await this._readDataBlock(dataOffset, dataCount, signal);\n\n          try {\n            const success = this.wasm.om_decoder_decode_chunks(\n              decoderPtr,\n              chunkIndexPtr,\n              dataBlockPtr,\n              BigInt(dataCount),\n              outputPtr,\n              chunkBufferPtr,\n              errorPtr\n            );\n\n            if (!success) {\n              throw new Error(`Decoder failed: error ${this.wasm.getValue(errorPtr, \"i32\")}`);\n            }\n          } finally {\n            this.wasm._free(dataBlockPtr);\n          }\n        },\n        signal\n      );\n\n      this.copyToTypedArray(outputPtr, outputArray);\n    } finally {\n      this.wasm._free(errorPtr);\n      this.wasm._free(chunkBufferPtr);\n      this.wasm._free(outputPtr);\n    }\n  }\n\n  /**\n   * Internal helper to set up the decoder and execute a task.\n   * Handles memory allocation and cleanup for ranges and the decoder.\n   */\n  private async _runWithDecoder(\n    ranges: Range[],\n    ioSizeMax: bigint,\n    ioSizeMerge: bigint,\n    task: (decoderPtr: number) => Promise<void>,\n    signal?: AbortSignal\n  ): Promise<void> {\n    throwIfAborted(signal);\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n\n    const nDims = ranges.length;\n    const fileDims = this.getDimensions();\n\n    if (fileDims.length !== nDims) {\n      throw new Error(`Mismatched dimensions: file has ${fileDims.length}, request has ${nDims}`);\n    }\n\n    const outDims = ranges.map((range) => range.end - range.start);\n\n    // Allocate memory for dimension arrays\n    const readOffsetPtr = this.wasm._malloc(nDims * 8);\n    const readCountPtr = this.wasm._malloc(nDims * 8);\n    const intoCubeOffsetPtr = this.wasm._malloc(nDims * 8);\n    const intoCubeDimensionPtr = this.wasm._malloc(nDims * 8);\n\n    try {\n      for (let i = 0; i < nDims; i++) {\n        if (ranges[i].start < 0 || ranges[i].end > fileDims[i] || ranges[i].start >= ranges[i].end) {\n          throw new Error(`Invalid range for dimension ${i}: ${JSON.stringify(ranges[i])}`);\n        }\n        this.wasm.setValue(readOffsetPtr + i * 8, BigInt(ranges[i].start), \"i64\");\n        this.wasm.setValue(readCountPtr + i * 8, BigInt(outDims[i]), \"i64\");\n        this.wasm.setValue(intoCubeOffsetPtr + i * 8, BigInt(0), \"i64\");\n        this.wasm.setValue(intoCubeDimensionPtr + i * 8, BigInt(outDims[i]), \"i64\");\n      }\n\n      const decoderPtr = this.wasm._malloc(this.wasm.sizeof_decoder);\n      try {\n        const error = this.wasm.om_decoder_init(\n          decoderPtr,\n          this.variable,\n          BigInt(nDims),\n          readOffsetPtr,\n          readCountPtr,\n          intoCubeOffsetPtr,\n          intoCubeDimensionPtr,\n          ioSizeMerge,\n          ioSizeMax\n        );\n\n        if (error !== this.wasm.ERROR_OK) {\n          throw new Error(`Decoder initialization failed: error code ${error}`);\n        }\n\n        // Run the specific work (decode or prefetch)\n        await task(decoderPtr);\n      } finally {\n        this.wasm._free(decoderPtr);\n      }\n    } finally {\n      this.wasm._free(readOffsetPtr);\n      this.wasm._free(readCountPtr);\n      this.wasm._free(intoCubeOffsetPtr);\n      this.wasm._free(intoCubeDimensionPtr);\n    }\n  }\n\n  private async _iterateDataBlocks(\n    decoderPtr: number,\n    callback: (dataReadPtr: number, indexDataPtr: number, indexCount: bigint) => Promise<void>,\n    signal?: AbortSignal\n  ): Promise<void> {\n    const errorPtr = this.wasm._malloc(4);\n    this.wasm.setValue(errorPtr, this.wasm.ERROR_OK, \"i32\");\n\n    const indexReadPtr = this.newIndexRead(decoderPtr);\n\n    try {\n      // Loop over index blocks\n      while (this.wasm.om_decoder_next_index_read(decoderPtr, indexReadPtr)) {\n        throwIfAborted(signal);\n        const indexOffset = Number(this.wasm.getValue(indexReadPtr, \"i64\"));\n        const indexCount = Number(this.wasm.getValue(indexReadPtr + 8, \"i64\"));\n\n        // Get bytes for index-read\n        const indexDataPtr = await this._readDataBlock(indexOffset, indexCount, signal);\n        const dataReadPtr = this.newDataRead(indexReadPtr);\n\n        try {\n          // Loop over data blocks described by this index block\n          while (\n            this.wasm.om_decoder_next_data_read(decoderPtr, dataReadPtr, indexDataPtr, BigInt(indexCount), errorPtr)\n          ) {\n            throwIfAborted(signal);\n            await callback(dataReadPtr, indexDataPtr, BigInt(indexCount));\n          }\n\n          // Check for errors after the data_read loop finishes for this index block\n          const error = this.wasm.getValue(errorPtr, \"i32\") as number;\n          if (error !== this.wasm.ERROR_OK) {\n            throw new Error(`Data read iteration error: ${error}`);\n          }\n        } finally {\n          this.wasm._free(dataReadPtr);\n          this.wasm._free(indexDataPtr);\n        }\n      }\n    } finally {\n      this.wasm._free(indexReadPtr);\n      this.wasm._free(errorPtr);\n    }\n  }\n\n  private async _readDataBlock(offset: number, size: number, signal?: AbortSignal): Promise<number> {\n    const data = await this.backend.getBytes(offset, size, signal);\n    const ptr = this.wasm._malloc(data.length);\n    this.wasm.HEAPU8.set(data, ptr);\n    return ptr;\n  }\n\n  /**\n   * Helper method to copy data from WASM memory to a TypedArray with the correct type\n   */\n  private copyToTypedArray(sourcePtr: number, targetArray: TypedArray): void {\n    switch (targetArray.constructor) {\n      case Float32Array:\n        (targetArray as Float32Array).set(new Float32Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case Float64Array:\n        (targetArray as Float64Array).set(new Float64Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case Int8Array:\n        (targetArray as Int8Array).set(new Int8Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case Uint8Array:\n        (targetArray as Uint8Array).set(new Uint8Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case Int16Array:\n        (targetArray as Int16Array).set(new Int16Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case Uint16Array:\n        (targetArray as Uint16Array).set(new Uint16Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case Int32Array:\n        (targetArray as Int32Array).set(new Int32Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case Uint32Array:\n        (targetArray as Uint32Array).set(new Uint32Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case BigInt64Array:\n        (targetArray as BigInt64Array).set(new BigInt64Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case BigUint64Array:\n        (targetArray as BigUint64Array).set(new BigUint64Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      default:\n        throw new Error(\"Unsupported TypedArray type in copyToTypedArray\");\n    }\n  }\n\n  // Clean up resources when done\n  dispose(): void {\n    if (this.variableDataPtr !== null) {\n      this.wasm._free(this.variableDataPtr);\n      this.variableDataPtr = null;\n    }\n    this.variable = null;\n  }\n}\n","import { FileSource } from \"../types\";\nimport { OmFileReaderBackend } from \"./OmFileReaderBackend\";\nimport fs from \"node:fs/promises\";\n\nexport class FileBackendNode implements OmFileReaderBackend {\n  private filePath: string | null = null;\n  private memory: Uint8Array | null = null;\n  private fileSize = 0;\n  private fileHandle: fs.FileHandle | null = null;\n\n  constructor(source: FileSource) {\n    if (typeof source === \"string\") {\n      this.filePath = source;\n    } else if (source instanceof ArrayBuffer) {\n      this.memory = new Uint8Array(source);\n      this.fileSize = this.memory.length;\n    } else if (source instanceof Uint8Array) {\n      this.memory = source;\n      this.fileSize = source.length;\n    } else {\n      throw new Error(\"Unsupported file source type for Node.js FileBackend\");\n    }\n  }\n\n  async count(): Promise<number> {\n    if (this.memory) {\n      return this.fileSize;\n    }\n    if (this.filePath) {\n      if (this.fileSize > 0) return this.fileSize;\n      const stats = await fs.stat(this.filePath);\n      this.fileSize = stats.size;\n      return this.fileSize;\n    }\n    throw new Error(\"Unable to determine file size\");\n  }\n\n  async getBytes(offset: number, size: number): Promise<Uint8Array> {\n    if (this.memory) {\n      return this.memory.slice(offset, offset + size);\n    }\n    if (this.filePath) {\n      this.fileHandle ??= await fs.open(this.filePath, \"r\");\n      const buffer = new Uint8Array(size);\n      const { bytesRead } = await this.fileHandle.read(buffer, 0, size, offset);\n      if (bytesRead !== size) {\n        throw new Error(`Expected to read ${size} bytes but got ${bytesRead}`);\n      }\n      return buffer;\n    }\n    throw new Error(\"No file or memory buffer available\");\n  }\n\n  // No collectPrefetchTasks - prefetching has minor effect\n\n  async close(): Promise<void> {\n    if (this.fileHandle) {\n      await this.fileHandle.close();\n      this.fileHandle = null;\n    }\n  }\n}\n","import { OmFileReaderBackend } from \"./OmFileReaderBackend\";\n\nexport class MemoryHttpBackend implements OmFileReaderBackend {\n  private url: string;\n  private fileSize: number | null = null;\n  private fileData: Uint8Array | null = null;\n  private loadPromise: Promise<void> | null = null;\n  private countPromise: Promise<number> | null = null;\n  private maxFileSize: number;\n  private onProgress?: (loaded: number, total: number) => void;\n  private debug: boolean;\n\n  /**\n   * Create a new MemoryHttpBackend\n   * @param options Configuration options\n   */\n  constructor(options: {\n    url: string;\n    maxFileSize?: number;\n    onProgress?: (loaded: number, total: number) => void;\n    debug?: boolean;\n  }) {\n    this.url = options.url;\n    this.maxFileSize = options.maxFileSize ?? 200 * 1024 * 1024; // 200 MB default\n    this.onProgress = options.onProgress;\n    this.debug = options.debug ?? false;\n\n    // Start loading the file in the background\n    this.loadFile().catch((err) => {\n      if (this.debug) console.error(\"Background file load failed:\", err);\n    });\n  }\n\n  /**\n   * Get the total size of the file\n   */\n  async count(): Promise<number> {\n    if (this.fileSize !== null) {\n      return this.fileSize;\n    }\n\n    if (!this.countPromise) {\n      if (this.debug) console.log(`Making HEAD request to ${this.url}`);\n\n      this.countPromise = (async () => {\n        try {\n          const response = await fetch(this.url, {\n            method: \"HEAD\",\n          });\n\n          if (!response.ok) {\n            throw new Error(`HTTP error: ${response.status}`);\n          }\n\n          const contentLength = response.headers.get(\"content-length\");\n          if (!contentLength) {\n            throw new Error(\"Content-Length header not available\");\n          }\n\n          this.fileSize = parseInt(contentLength, 10);\n\n          if (this.fileSize > this.maxFileSize) {\n            throw new Error(\n              `File size (${this.fileSize} bytes) exceeds maximum allowed size (${this.maxFileSize} bytes)`\n            );\n          }\n\n          if (this.debug) console.log(`File size: ${this.fileSize} bytes`);\n          return this.fileSize;\n        } catch (error) {\n          this.countPromise = null;\n          throw new Error(\"Failed to get file size\", {\n            cause: error,\n          });\n        }\n      })();\n    }\n\n    return this.countPromise;\n  }\n\n  /**\n   * Load the entire file into memory\n   */\n  async loadFile(): Promise<void> {\n    // If already loaded or loading, return that promise\n    if (this.fileData) {\n      return Promise.resolve();\n    }\n\n    if (this.loadPromise) {\n      return this.loadPromise;\n    }\n\n    this.loadPromise = (async () => {\n      try {\n        // First get the file size\n        const size = await this.count();\n\n        if (this.debug) console.log(`Fetching entire file (${size} bytes) from ${this.url}`);\n\n        // Use fetch with streaming and progress tracking\n        const response = await fetch(this.url);\n\n        if (!response.ok) {\n          throw new Error(`HTTP error: ${response.status}`);\n        }\n\n        // Check if ReadableStream is supported and if progress tracking is needed\n        if (this.onProgress && response.body && \"getReader\" in response.body) {\n          // Stream the response with progress tracking\n          const contentLength = Number(response.headers.get(\"content-length\") ?? size);\n          const reader = response.body.getReader();\n          const chunks: Uint8Array[] = [];\n\n          let receivedLength = 0;\n          let lastProgressUpdate = 0;\n\n          for (;;) {\n            const { done, value } = await reader.read();\n\n            if (done) {\n              break;\n            }\n\n            chunks.push(value);\n            receivedLength += value.length;\n\n            // Don't update progress too frequently (throttle updates)\n            const now = Date.now();\n            if (now - lastProgressUpdate > 100) {\n              // update every 100ms\n              this.onProgress(receivedLength, contentLength);\n              lastProgressUpdate = now;\n            }\n          }\n\n          // Concatenate chunks into a single Uint8Array\n          this.fileData = new Uint8Array(receivedLength);\n          let position = 0;\n          for (const chunk of chunks) {\n            this.fileData.set(chunk, position);\n            position += chunk.length;\n          }\n\n          // Final progress update\n          this.onProgress(receivedLength, contentLength);\n        } else {\n          // Simple approach without streaming\n          const buffer = await response.arrayBuffer();\n          this.fileData = new Uint8Array(buffer);\n\n          if (this.onProgress) {\n            this.onProgress(this.fileData.length, size);\n          }\n        }\n\n        if (this.debug) console.log(`File loaded successfully (${this.fileData.length} bytes)`);\n        return;\n      } catch (error) {\n        this.loadPromise = null;\n        throw new Error(\"Failed to load file\", {\n          cause: error,\n        });\n      }\n    })();\n\n    return this.loadPromise;\n  }\n\n  /**\n   * Get bytes from the file\n   * @param offset The starting position in the file\n   * @param size The number of bytes to read\n   */\n  async getBytes(offset: number, size: number): Promise<Uint8Array> {\n    try {\n      // Make sure the file is loaded\n      if (!this.fileData) {\n        if (this.debug) console.log(`getBytes(${offset}, ${size}): Waiting for file to load...`);\n        await this.loadFile();\n        if (this.debug) console.log(`getBytes(${offset}, ${size}): File loaded`);\n      }\n\n      // At this point, fileData should be available\n      if (!this.fileData) {\n        throw new Error(\"File data is not available after load\");\n      }\n\n      // Bounds check\n      if (offset < 0 || offset + size > this.fileData.length) {\n        throw new Error(`Requested range (${offset}:${offset + size}) is out of bounds (0:${this.fileData.length})`);\n      }\n\n      if (this.debug) console.log(`Serving ${size} bytes from offset ${offset} from memory`);\n\n      // Return the requested slice of data\n      return this.fileData.slice(offset, offset + size);\n    } catch (error) {\n      throw new Error(\"Error in getBytes\", {\n        cause: error,\n      });\n    }\n  }\n\n  /**\n   * Check if the file is fully loaded\n   */\n  isLoaded(): boolean {\n    return !!this.fileData;\n  }\n\n  /**\n   * Get the current loaded data or null if not loaded\n   */\n  getFileData(): Uint8Array | null {\n    return this.fileData;\n  }\n\n  /**\n   * Force a reload of the file\n   */\n  async reload(): Promise<void> {\n    this.fileData = null;\n    this.loadPromise = null;\n    return this.loadFile();\n  }\n\n  // No collectPrefetchTasks - prefetching has minor effect\n\n  /**\n   * Close the backend and release any resources\n   */\n  async close(): Promise<void> {\n    this.fileData = null;\n    this.loadPromise = null;\n    return Promise.resolve();\n  }\n}\n","import { BlockCache } from \"../BlockCache\";\nimport { throwIfAborted } from \"../utils\";\nimport { OmFileReaderBackend } from \"./OmFileReaderBackend\";\n\n/**\n * Wraps a backend for caching blocks of data.\n */\nexport class BlockCacheBackend<K> implements OmFileReaderBackend {\n  private readonly backend: OmFileReaderBackend;\n  private readonly cache: BlockCache<K>;\n  private readonly baseKey: K;\n  private readonly keyBuilder: (baseKey: K, blockIdx: number) => K;\n  private cachedCount: number | null = null;\n\n  constructor(\n    backend: OmFileReaderBackend,\n    cache: BlockCache<K>,\n    baseKey: K,\n    keyBuilder: (baseKey: K, blockIdx: number) => K\n  ) {\n    this.backend = backend;\n    this.cache = cache;\n    this.baseKey = baseKey;\n    this.keyBuilder = keyBuilder;\n  }\n\n  /**\n   * Creates a BlockCacheBackend using bigint keys.\n   */\n  static withBigIntKeys(\n    backend: OmFileReaderBackend,\n    cache: BlockCache<bigint>,\n    baseKey: bigint\n  ): BlockCacheBackend<bigint> {\n    return new BlockCacheBackend(backend, cache, baseKey, (base, blockIdx) => base + BigInt(blockIdx));\n  }\n\n  /**\n   * Creates a BlockCacheBackend using string keys.\n   */\n  static withStringKeys(\n    backend: OmFileReaderBackend,\n    cache: BlockCache<string>,\n    baseKey: string\n  ): BlockCacheBackend<string> {\n    return new BlockCacheBackend(backend, cache, baseKey, (base, blockIdx) => `${base}/block/${blockIdx}`);\n  }\n\n  /**\n   * Generates a unique key for a specific block.\n   */\n  private getBlockKey(blockIdxFromEnd: number): K {\n    return this.keyBuilder(this.baseKey, blockIdxFromEnd);\n  }\n\n  /**\n   * Get the byte range for a block indexed from the end.\n   * Block 0 = last blockSize bytes, Block 1 = previous blockSize bytes, etc.\n   */\n  private getBlockRange(blockIdxFromEnd: number, fileSize: number): { start: number; end: number } {\n    const blockSize = this.cache.blockSize();\n    const end = fileSize - blockIdxFromEnd * blockSize;\n    const start = Math.max(0, end - blockSize);\n    return { start, end };\n  }\n\n  /**\n   * Get the block index (from end) that contains a given offset.\n   */\n  private getBlockIdxFromEnd(offset: number, fileSize: number): number {\n    const blockSize = this.cache.blockSize();\n    // Distance from end of file to end of the byte at offset\n    const distanceFromEnd = fileSize - offset - 1;\n    return Math.floor(distanceFromEnd / blockSize);\n  }\n\n  async count(signal?: AbortSignal): Promise<number> {\n    if (this.cachedCount !== null) {\n      return this.cachedCount;\n    }\n\n    // check last block, which contains the trailer\n    const key = this.getBlockKey(0);\n    const cached = await this.cache.size(key);\n    if (cached !== undefined) {\n      this.cachedCount = cached;\n      return cached;\n    }\n\n    // Fallback to regular count\n    this.cachedCount = await this.backend.count(signal);\n    return this.cachedCount;\n  }\n\n  async getBytes(offset: number, size: number, signal?: AbortSignal): Promise<Uint8Array> {\n    throwIfAborted(signal);\n    const fileSize = await this.count(signal);\n\n    const startBlockFromEnd = this.getBlockIdxFromEnd(offset + size - 1, fileSize);\n    const endBlockFromEnd = this.getBlockIdxFromEnd(offset, fileSize);\n\n    // Single block fast path\n    if (startBlockFromEnd === endBlockFromEnd) {\n      const { start: blockStart, end: blockEnd } = this.getBlockRange(startBlockFromEnd, fileSize);\n      const block = await this.cache.get(\n        this.getBlockKey(startBlockFromEnd),\n        () => this.backend.getBytes(blockStart, blockEnd - blockStart, signal),\n        fileSize\n      );\n      const blockOffset = offset - blockStart;\n      return block.subarray(blockOffset, blockOffset + size);\n    }\n\n    // Multi-block path - iterate from lowest block index (closest to end) to highest\n    const output = new Uint8Array(size);\n    const promises: Promise<void>[] = [];\n\n    for (let blockIdxFromEnd = startBlockFromEnd; blockIdxFromEnd <= endBlockFromEnd; blockIdxFromEnd++) {\n      const { start: blockStart, end: blockEnd } = this.getBlockRange(blockIdxFromEnd, fileSize);\n\n      promises.push(\n        this.cache\n          .get(\n            this.getBlockKey(blockIdxFromEnd),\n            () => this.backend.getBytes(blockStart, blockEnd - blockStart, signal),\n            fileSize\n          )\n          .then((block) => {\n            const srcStart = Math.max(offset, blockStart) - blockStart;\n            const dstStart = Math.max(blockStart, offset) - offset;\n            const len = Math.min(blockEnd - blockStart - srcStart, size - dstStart);\n            output.set(block.subarray(srcStart, srcStart + len), dstStart);\n          })\n      );\n    }\n\n    await Promise.all(promises);\n    return output;\n  }\n\n  /**\n   * Collects block fetch tasks for a given range without executing them.\n   * Returns an array of functions that, when called, will fetch and cache the block.\n   */\n  async collectPrefetchTasks(offset: number, size: number, signal?: AbortSignal): Promise<(() => Promise<void>)[]> {\n    throwIfAborted(signal);\n    const fileSize = await this.count(signal);\n    const startBlockFromEnd = this.getBlockIdxFromEnd(offset + size - 1, fileSize);\n    const endBlockFromEnd = this.getBlockIdxFromEnd(offset, fileSize);\n\n    const tasks: (() => Promise<void>)[] = [];\n\n    for (let blockIdxFromEnd = startBlockFromEnd; blockIdxFromEnd <= endBlockFromEnd; blockIdxFromEnd++) {\n      const { start: blockStart, end: blockEnd } = this.getBlockRange(blockIdxFromEnd, fileSize);\n      const key = this.getBlockKey(blockIdxFromEnd);\n\n      tasks.push(async () => {\n        await this.cache.prefetch(\n          key,\n          () => this.backend.getBytes(blockStart, blockEnd - blockStart, signal),\n          fileSize\n        );\n      });\n    }\n    return tasks;\n  }\n\n  async close(): Promise<void> {\n    await this.backend.close();\n  }\n}\n","import { BlockCache } from \"../BlockCache\";\nimport { OmFileReader } from \"../OmFileReader\";\nimport { fetchRetry, fnv1aHash64 } from \"../utils\";\nimport { BlockCacheBackend } from \"./BlockCacheBackend\";\nimport { OmFileReaderBackend } from \"./OmFileReaderBackend\";\n\nexport interface OmHttpBackendOptions {\n  url: string;\n  eTagValidation?: boolean;\n  debug?: boolean;\n  timeoutMs?: number;\n  retries?: number;\n}\n\nexport class OmHttpBackendError extends Error {\n  constructor(\n    message: string,\n    public readonly statusCode?: number\n  ) {\n    super(message);\n    this.name = \"OmHttpBackendError\";\n  }\n}\n\n/**\n * Backend for reading from HTTP servers with partial read support using Range requests.\n * Checks last modified header and ETag.\n */\nexport class OmHttpBackend implements OmFileReaderBackend {\n  private readonly url: string;\n  private readonly debug: boolean;\n  private readonly timeoutMs: number;\n  private readonly retries: number;\n\n  private eTagValidation: boolean;\n  private fileSize: number | null = null;\n  private lastModified: string | null = null;\n  private eTag: string | null = null;\n  private metadataPromise: Promise<void> | null = null;\n\n  constructor(options: OmHttpBackendOptions) {\n    this.url = options.url;\n    this.debug = options.debug ?? false;\n    this.timeoutMs = options.timeoutMs ?? 30000;\n    this.retries = options.retries ?? 1;\n    this.eTagValidation = options.eTagValidation ?? true;\n  }\n\n  /**\n   * Returns a bigint cache key for use with LruBlockCache.\n   * Uniquely identifies the file based on its URL, ETag, and Last-Modified headers.\n   * The ETag is only included if validation is enabled.\n   */\n  get cacheKeyBigInt(): bigint {\n    const urlHash = fnv1aHash64(this.url);\n    const lastModifiedHash = this.lastModified ? fnv1aHash64(this.lastModified) : 0n;\n    // Only include the eTag in the cache key if we are actually validating against it.\n    const eTagHash = this.eTag && this.eTagValidation ? fnv1aHash64(this.eTag) : 0n;\n\n    return urlHash ^ eTagHash ^ lastModifiedHash;\n  }\n\n  /**\n   * Returns a string cache key for use with BrowserBlockCache based on the underlying url.\n   * If the upstream resource can change, this cache-key is not safe to use!\n   * => Only use for static files!\n   */\n  get cacheKeyString(): string {\n    return this.url;\n  }\n\n  /**\n   * Fetch metadata using HEAD request\n   */\n  private async fetchMetadata(signal?: AbortSignal): Promise<void> {\n    if (this.metadataPromise) {\n      return this.metadataPromise;\n    }\n\n    this.metadataPromise = (async () => {\n      const response = await fetchRetry(this.url, { method: \"HEAD\" }, this.timeoutMs, this.retries, signal);\n\n      if (!response.ok) {\n        throw new OmHttpBackendError(\n          response.status === 404 ? \"File not found\" : `HTTP error: ${response.status}`,\n          response.status\n        );\n      }\n\n      const contentLength = response.headers.get(\"content-length\");\n      if (!contentLength) throw new OmHttpBackendError(\"Content-Length header missing\");\n\n      this.fileSize = parseInt(contentLength, 10);\n      this.lastModified = response.headers.get(\"last-modified\");\n      this.eTag = response.headers.get(\"etag\");\n    })();\n\n    return this.metadataPromise;\n  }\n\n  /**\n   * Get the total size of the file\n   */\n  async count(signal?: AbortSignal): Promise<number> {\n    if (this.fileSize !== null) {\n      return this.fileSize;\n    }\n\n    await this.fetchMetadata(signal);\n    return this.fileSize!;\n  }\n\n  /**\n   * Get bytes from the file using Range requests\n   */\n  async getBytes(offset: number, size: number, signal?: AbortSignal): Promise<Uint8Array> {\n    if (offset < 0 || size <= 0) {\n      throw new OmHttpBackendError(\"Invalid offset or size\");\n    }\n\n    // Ensure we have metadata\n    await this.count(signal);\n\n    if (offset + size > this.fileSize!) {\n      throw new OmHttpBackendError(`Requested range (${offset}:${offset + size}) exceeds file size (${this.fileSize})`);\n    }\n\n    // Prepare request\n    const headers: Record<string, string> = {\n      Range: `bytes=${offset}-${offset + size - 1}`,\n    };\n\n    if (this.eTagValidation) {\n      // Add conditional headers for cache validation\n      if (this.lastModified) {\n        headers[\"If-Unmodified-Since\"] = this.lastModified;\n      }\n      if (this.eTag) {\n        headers[\"If-Match\"] = this.eTag;\n      }\n    }\n\n    if (this.debug) {\n      console.log(`Getting data range ${offset}-${offset + size - 1} from ${this.url}`);\n    }\n\n    const response = await fetchRetry(this.url, { headers }, this.timeoutMs, this.retries, signal);\n\n    const buffer = await response.arrayBuffer();\n    const data = new Uint8Array(buffer);\n\n    if (data.length !== size) {\n      throw new OmHttpBackendError(`Received ${data.length} bytes, expected ${size}`);\n    }\n    return data;\n  }\n\n  // No collectPrefetchTasks here - use BlockCacheBackend wrapper for prefetching\n\n  async asCachedReader(cache: BlockCache<string> | BlockCache<bigint>): Promise<OmFileReader> {\n    await this.fetchMetadata();\n    switch (cache.keyKind) {\n      case \"bigint\": {\n        const cachedBackend = BlockCacheBackend.withBigIntKeys(this, cache as BlockCache<bigint>, this.cacheKeyBigInt);\n        return OmFileReader.create(cachedBackend);\n      }\n      case \"string\": {\n        const cachedBackend = BlockCacheBackend.withStringKeys(this, cache as BlockCache<string>, this.cacheKeyString);\n        return OmFileReader.create(cachedBackend);\n      }\n      default: {\n        const _: never = cache.keyKind;\n        throw Error(`Unknown key type ${String(_)}`);\n      }\n    }\n  }\n\n  /**\n   * Close the backend and release resources\n   */\n  async close(): Promise<void> {\n    this.metadataPromise = null;\n    this.fileSize = null;\n    this.lastModified = null;\n    this.eTag = null;\n    return Promise.resolve();\n  }\n}\n","import { BlockCache } from \"./BlockCache\";\n\n/** Summary statistics for the cache */\nexport interface CacheStats {\n  /** Total entries in persistent cache */\n  persistentEntries: number;\n  /** Total bytes in persistent cache */\n  persistentBytes: number;\n  /** Entries currently in memory */\n  memoryEntries: number;\n  /** Bytes currently in memory */\n  memoryBytes: number;\n  /** Currently pending fetches */\n  inflightCount: number;\n  /** Maximum allowed bytes */\n  maxBytes: number;\n  /** Block size */\n  blockSize: number;\n}\n\n/** Information about a cached entry */\nexport interface CacheEntryInfo {\n  url: string;\n  size: number;\n  createdAt?: number;\n}\n\nexport interface BrowserBlockCacheOptions {\n  blockSize?: number;\n  cacheName?: string;\n  /** Time in ms before an unused block is evicted from in-memory cache. Default: 1000 */\n  memCacheTtlMs?: number;\n  /** Maximum total size in bytes for persistent cache. Default: 1GB */\n  maxBytes?: number;\n  /** When evicting, remove this fraction of maxBytes to avoid frequent evictions. Default: 0.1 */\n  evictionFraction?: number;\n\n  maxConcurrentFetches?: number;\n}\n\n/**\n * A BlockCache implementation that uses the browser's Cache API.\n *\n * Features:\n * - Fast in-memory layer for recently accessed blocks\n * - Size-based eviction with configurable limits\n * - Metadata stored in response headers (no separate metadata cache)\n */\nexport class BrowserBlockCache implements BlockCache<string> {\n  readonly keyKind = \"string\";\n  private readonly _blockSize: number;\n  private readonly cacheName: string;\n  private readonly inflight = new Map<string, Promise<Uint8Array>>();\n\n  /** In-memory cache for fast repeated access */\n  private readonly memCache = new Map<string, Uint8Array>();\n  /** Timers for automatic memory eviction */\n  private readonly evictionTimers = new Map<string, ReturnType<typeof setTimeout>>();\n  /** Time in ms before an unused entry is evicted from memory */\n  private readonly memCacheTtlMs: number;\n\n  /** Maximum total bytes for persistent storage */\n  private readonly maxBytes: number;\n  /** Fraction of cache to clear during eviction */\n  private readonly evictionFraction: number;\n\n  /** Lock to prevent concurrent evictions */\n  private evictionInProgress: Promise<void> | null = null;\n\n  /** Cached reference to the opened Cache object */\n  private cachePromise: Promise<Cache> | null = null;\n\n  /** Maximum concurrent fetch operations */\n  private readonly maxConcurrentFetches: number;\n  /** Currently active fetch count */\n  private activeFetches = 0;\n  /** Queue of pending fetch operations */\n  private readonly fetchQueue: (() => void)[] = [];\n\n  constructor(options: BrowserBlockCacheOptions = {}) {\n    // Guard early to make misuse in SSR or non-Cache environments immediate and clear\n    if (typeof caches === \"undefined\") {\n      throw new Error(\n        \"BrowserBlockCache is browser-only. Import it dynamically in the client (e.g. inside onMount()).\"\n      );\n    }\n    this._blockSize = options.blockSize ?? 64 * 1024;\n    this.cacheName = options.cacheName ?? \"om-file-cache\";\n    this.memCacheTtlMs = options.memCacheTtlMs ?? 1000;\n    this.maxBytes = options.maxBytes ?? 1024 * 1024 * 1024; // 1GB default\n    this.evictionFraction = options.evictionFraction ?? 0.1;\n    this.maxConcurrentFetches = options.maxConcurrentFetches ?? 10;\n  }\n\n  blockSize(): number {\n    return this._blockSize;\n  }\n\n  async size(key: string): Promise<number | undefined> {\n    const cache = await this.getCache();\n    if (cache) {\n      const url = this.resolveUrl(key);\n      const fileSize = (await cache.match(url))?.headers.get(\"X-Om-File-Size\");\n      if (fileSize) {\n        return parseInt(fileSize, 10);\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * Resolves a BlockKey into a URL string for the Cache API.\n   */\n  private resolveUrl(key: string): string {\n    const encodedKey = encodeURIComponent(key);\n    return `https://omfiles.local/cache/${encodedKey}`;\n  }\n\n  /**\n   * Acquires a fetch slot. Resolves when a slot is available.\n   */\n  private acquireFetchSlot(): Promise<void> {\n    if (this.activeFetches < this.maxConcurrentFetches) {\n      this.activeFetches++;\n      return Promise.resolve();\n    }\n\n    return new Promise<void>((resolve) => {\n      this.fetchQueue.push(resolve);\n    });\n  }\n\n  /**\n   * Releases a fetch slot and processes the next queued request.\n   */\n  private releaseFetchSlot(): void {\n    const next = this.fetchQueue.shift();\n    if (next) {\n      // Don't decrement, just hand off to the next waiter\n      next();\n    } else {\n      this.activeFetches--;\n    }\n  }\n\n  /**\n   * Executes a fetch function with concurrency limiting.\n   */\n  private async limitedFetch(fetchFn: () => Promise<Uint8Array>): Promise<Uint8Array> {\n    await this.acquireFetchSlot();\n    try {\n      return await fetchFn();\n    } finally {\n      this.releaseFetchSlot();\n    }\n  }\n\n  /** Opens the cache once and reuses the reference */\n  private async getCache(): Promise<Cache | null> {\n    if (typeof caches === \"undefined\") return null;\n\n    this.cachePromise ??= caches.open(this.cacheName);\n    return this.cachePromise;\n  }\n\n  /**\n   * Scans the Cache API to get current total size and entry list.\n   */\n  private async scanCache(): Promise<{ totalBytes: number; entries: CacheEntryInfo[] }> {\n    const cache = await this.getCache();\n    if (!cache) {\n      return { totalBytes: 0, entries: [] };\n    }\n\n    const keys = await cache.keys();\n    const entries: CacheEntryInfo[] = [];\n    let totalBytes = 0;\n\n    for (const request of keys) {\n      const response = await cache.match(request);\n      if (response) {\n        const size = parseInt(response.headers.get(\"Content-Length\") ?? \"0\", 10);\n        const createdAtStr = response.headers.get(\"X-Om-Created-At\");\n        const createdAt = createdAtStr ? parseInt(createdAtStr, 10) : undefined;\n\n        entries.push({\n          url: request.url,\n          size,\n          createdAt,\n        });\n        totalBytes += size;\n      }\n    }\n\n    return { totalBytes, entries };\n  }\n\n  /**\n   * Evicts oldest entries until we're under the size limit.\n   * Uses createdAt timestamp from headers for ordering.\n   */\n  private async evictIfNeeded(): Promise<void> {\n    const cache = await this.getCache();\n    if (!cache) return;\n\n    // Prevent concurrent evictions\n    if (this.evictionInProgress) {\n      await this.evictionInProgress;\n      return;\n    }\n\n    this.evictionInProgress = (async () => {\n      const { totalBytes, entries } = await this.scanCache();\n\n      if (totalBytes <= this.maxBytes) return;\n\n      const targetBytes = this.maxBytes * (1 - this.evictionFraction);\n      let currentBytes = totalBytes;\n\n      // Sort by createdAt (oldest first), entries without timestamp go first\n      entries.sort((a, b) => (a.createdAt ?? 0) - (b.createdAt ?? 0));\n\n      for (const entry of entries) {\n        if (currentBytes <= targetBytes) break;\n\n        await cache.delete(entry.url).catch((err) => {\n          console.error(`Could not delete from cache: ${err}`);\n        });\n        currentBytes -= entry.size;\n\n        // Also remove from memory cache\n        this.memCache.delete(entry.url);\n        const timer = this.evictionTimers.get(entry.url);\n        if (timer) {\n          clearTimeout(timer);\n          this.evictionTimers.delete(entry.url);\n        }\n      }\n    })();\n\n    try {\n      await this.evictionInProgress;\n    } finally {\n      this.evictionInProgress = null;\n    }\n  }\n\n  /**\n   * Refreshes the memory eviction timer for a URL.\n   */\n  private refreshEvictionTimer(url: string): void {\n    const existing = this.evictionTimers.get(url);\n    if (existing) {\n      clearTimeout(existing);\n    }\n\n    const timer = setTimeout(() => {\n      this.memCache.delete(url);\n      this.evictionTimers.delete(url);\n    }, this.memCacheTtlMs);\n\n    this.evictionTimers.set(url, timer);\n  }\n\n  /**\n   * Stores data in the in-memory cache with automatic eviction.\n   */\n  private setMemCache(url: string, data: Uint8Array): void {\n    this.memCache.set(url, data);\n    this.refreshEvictionTimer(url);\n  }\n\n  async get(key: string, fetchFn: () => Promise<Uint8Array>, fileSize?: number): Promise<Uint8Array> {\n    const url = this.resolveUrl(key);\n\n    // Fast path: check in-memory cache first\n    const memCached = this.memCache.get(url);\n    if (memCached) {\n      this.refreshEvictionTimer(url);\n      return memCached;\n    }\n\n    // Deduplicate concurrent requests for the same block\n    const existing = this.inflight.get(url);\n    if (existing) {\n      return existing;\n    }\n\n    const promise = (async () => {\n      // Check browser Cache API\n      const cache = await this.getCache();\n\n      // Check browser Cache API\n      if (cache) {\n        const cached = await cache.match(url);\n\n        if (cached) {\n          const buffer = await cached.arrayBuffer();\n          const data = new Uint8Array(buffer);\n          this.setMemCache(url, data);\n          return data;\n        }\n      }\n\n      // Fetch from source with concurrency limiting\n      const data = await this.limitedFetch(fetchFn);\n      this.setMemCache(url, data);\n      // Store in browser Cache API with metadata in headers\n      if (cache) {\n        const buffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n\n        const response = new Response(buffer, {\n          status: 200,\n          statusText: \"OK\",\n          headers: {\n            \"Content-Type\": \"application/octet-stream\",\n            \"Content-Length\": data.length.toString(),\n            \"X-Om-Block-Key\": key.toString(),\n            \"X-Om-Created-At\": Date.now().toString(),\n          },\n        });\n        if (fileSize !== undefined) {\n          response.headers.append(\"X-Om-File-Size\", fileSize.toString());\n        }\n        cache\n          .put(url, response)\n          .then(() => this.evictIfNeeded())\n          .catch((err) => {\n            console.error(`Could not write to cache: ${err}`);\n          });\n      }\n      return data;\n    })();\n\n    this.inflight.set(url, promise);\n\n    try {\n      return await promise;\n    } finally {\n      this.inflight.delete(url);\n    }\n  }\n\n  async prefetch(key: string, fetchFn: () => Promise<Uint8Array>, fileSize?: number): Promise<void> {\n    await this.get(key, fetchFn, fileSize).catch(() => {\n      // ignore errors during prefetch\n    });\n  }\n\n  /**\n   * Gets current cache statistics by scanning the Cache API.\n   */\n  async getStats(): Promise<CacheStats> {\n    const { totalBytes, entries } = await this.scanCache();\n\n    let memoryBytes = 0;\n    for (const data of this.memCache.values()) {\n      memoryBytes += data.length;\n    }\n\n    return {\n      persistentEntries: entries.length,\n      persistentBytes: totalBytes,\n      memoryEntries: this.memCache.size,\n      memoryBytes,\n      inflightCount: this.inflight.size,\n      maxBytes: this.maxBytes,\n      blockSize: this._blockSize,\n    };\n  }\n\n  async clear(): Promise<void> {\n    // Clear all memory eviction timers\n    for (const timer of this.evictionTimers.values()) {\n      clearTimeout(timer);\n    }\n    this.evictionTimers.clear();\n    this.memCache.clear();\n    this.inflight.clear();\n    this.cachePromise = null;\n\n    if (typeof caches !== \"undefined\") {\n      await caches.delete(this.cacheName);\n    }\n  }\n}\n","export type KeyKind = \"string\" | \"bigint\";\n\n/**\n * Interface for a block-level cache.\n * Implementations can be in-memory, persistent, or leverage browser APIs.\n */\nexport interface BlockCache<K = bigint> {\n  keyKind: KeyKind;\n\n  /** Returns the block size used by the cache. */\n  blockSize(): number;\n\n  /** Retrieves a block from the cache or fetches it using the provided function. */\n  get(key: K, fetchFn: () => Promise<Uint8Array>, fileSize?: number): Promise<Uint8Array>;\n\n  /** Retrieves the total size of the cached file corresponding to key, if cached */\n  size(key: K): Promise<number | undefined>;\n\n  /** Optionally starts fetching a block into the cache without blocking. */\n  prefetch(key: K, fetchFn: () => Promise<Uint8Array>, fileSize?: number): Promise<void>;\n\n  /** Clears the cache contents. */\n  clear(): void | Promise<void>;\n}\n\nexport class LruBlockCache implements BlockCache {\n  readonly keyKind = \"bigint\";\n  private readonly _blockSize: number;\n  private readonly maxBlocks: number;\n  private readonly cache = new Map<bigint, Uint8Array>();\n  private readonly inflight = new Map<bigint, Promise<Uint8Array>>();\n\n  constructor(blockSize: number = 64 * 1024, maxBlocks = 256) {\n    this._blockSize = blockSize;\n    this.maxBlocks = maxBlocks;\n  }\n\n  blockSize(): number {\n    return this._blockSize;\n  }\n\n  size(_key: bigint): Promise<number | undefined> {\n    return Promise.resolve(undefined);\n  }\n\n  async get(key: bigint, fetchFn: () => Promise<Uint8Array>): Promise<Uint8Array> {\n    // Check cache\n    const cached = this.cache.get(key);\n    if (cached) {\n      // Move to end (LRU refresh) - Map preserves insertion order\n      this.cache.delete(key);\n      this.cache.set(key, cached);\n      return cached;\n    }\n\n    // Deduplicate inflight requests\n    let pending = this.inflight.get(key);\n    if (!pending) {\n      pending = fetchFn();\n      this.inflight.set(key, pending);\n      void pending\n        .then((data) => {\n          // Evict if needed\n          if (this.cache.size >= this.maxBlocks) {\n            const oldest = this.cache.keys().next().value;\n            if (oldest !== undefined) this.cache.delete(oldest);\n          }\n          this.cache.set(key, data);\n        })\n        .finally(() => this.inflight.delete(key));\n    }\n    return pending;\n  }\n\n  async prefetch(key: bigint, fetchFn: () => Promise<Uint8Array>): Promise<void> {\n    if (!this.cache.has(key) && !this.inflight.has(key)) {\n      await this.get(key, fetchFn).catch(() => {\n        // ignore errors during prefetch\n      });\n    }\n  }\n\n  clear(): void {\n    this.cache.clear();\n    this.inflight.clear();\n  }\n}\n"],"names":["CompressionType","OmDataType"],"mappings":"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"}