{
  "version": 3,
  "sources": ["../src/index.ts", "../src/zip-format.ts", "../src/zip-serializer.ts", "../src/crc32.ts", "../src/logger.ts", "../src/compression.ts", "../src/entry-buffer.ts", "../src/parallel-reader.ts", "../src/write-queue.ts", "../src/direct-stream-entry.ts", "../src/streaming-zip-writer.ts", "../src/stream-utils.ts"],
  "sourcesContent": ["/**\n * Streaming Zipper - A TypeScript library for creating ZIP files in a streaming and parallel way\n * Supports both Web Streams and Node.js streams with ZIP64 support\n */\n\n// Export main classes and interfaces\nexport { StreamingZipWriter, type StreamingZipWriterOptions } from './streaming-zip-writer.js';\nexport { \n  type ZipEntry,\n  type FastPathStoreEntry,\n  type FastPathDeflateEntry,\n  isFastPathStoreEntry,\n  isFastPathDeflateEntry,\n  canUseFastPath,\n  UNIX_FILE_TYPES,\n  DEFAULT_PERMISSIONS,\n  createExternalAttributes\n} from './zip-format.js';\nexport { type CompressionMethod, compressStore, compressDeflate } from './compression.js';\n\n// Export utilities\nexport { CRC32Stream, crc32 } from './crc32.js';\nexport { \n  nodeStreamToWebStream, \n  uint8ArrayToStream, \n  streamToUint8Array,\n  createPassThroughStream,\n  createByteCounterStream\n} from './stream-utils.js';\n\n// Export constants\nexport { ZIP_CONSTANTS } from './zip-format.js';\n\n// Re-export StreamingZipWriter as default for convenience\nexport { StreamingZipWriter as default } from './streaming-zip-writer.js';", "/**\n * ZIP file format structures and constants\n * Based on ZIP specification: https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT\n */\n\nexport const ZIP_CONSTANTS = {\n  // Signatures\n  LOCAL_FILE_HEADER_SIGNATURE: 0x04034b50,\n  CENTRAL_DIRECTORY_SIGNATURE: 0x02014b50,\n  END_OF_CENTRAL_DIRECTORY_SIGNATURE: 0x06054b50,\n  ZIP64_END_OF_CENTRAL_DIRECTORY_SIGNATURE: 0x06064b50,\n  ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE: 0x07064b50,\n  DATA_DESCRIPTOR_SIGNATURE: 0x08074b50,\n\n  // Compression methods\n  COMPRESSION_STORE: 0,\n  COMPRESSION_DEFLATE: 8,\n\n  // General purpose bit flags\n  FLAG_ENCRYPTED: 0x0001,\n  FLAG_DATA_DESCRIPTOR: 0x0008,\n  FLAG_UTF8: 0x0800,\n\n  // ZIP64 constants\n  ZIP64_LIMIT: 0xffffffff,\n  ZIP64_LIMIT_16: 0xffff,\n  ZIP64_EXTRA_FIELD_TYPE: 0x0001,\n\n  // Version numbers\n  VERSION_MADE_BY: 0x033f, // 3.1 Unix\n  VERSION_NEEDED_EXTRACT: 20, // 2.0\n  VERSION_NEEDED_EXTRACT_ZIP64: 45, // 4.5\n} as const;\n\nexport interface ZipEntry {\n  name: string;\n  data: ReadableStream<Uint8Array> | NodeJS.ReadableStream;\n  size?: number;\n  lastModified?: Date;\n  comment?: string;\n  permissions?: number;              // Unix file permissions (e.g., 0644, 0755)\n  \n  // Optional metadata for immediate streaming optimization\n  crc32?: number;                    // Pre-calculated CRC32 for immediate streaming\n  compressedSize?: number;           // For pre-compressed data (required if preCompressed=true)\n  uncompressedSize?: number;         // For pre-compressed data (required if preCompressed=true)\n  preCompressed?: boolean;           // Indicates data is already DEFLATE-compressed\n}\n\n/**\n * Fast-path entry for STORE compression with pre-calculated CRC32\n * Enables immediate streaming without buffering\n */\nexport interface FastPathStoreEntry extends ZipEntry {\n  crc32: number;                     // Required for immediate streaming\n  size: number;                      // Required (same as uncompressedSize)\n  preCompressed?: false;             // Must be false or undefined for STORE\n}\n\n/**\n * Fast-path entry for pre-compressed DEFLATE data\n * Enables immediate streaming of already-compressed data\n */\nexport interface FastPathDeflateEntry extends ZipEntry {\n  crc32: number;                     // Required\n  compressedSize: number;            // Required\n  uncompressedSize: number;          // Required  \n  preCompressed: true;               // Must be true for pre-compressed data\n}\n\n/**\n * Type guard to check if entry is a fast-path STORE entry\n */\nexport function isFastPathStoreEntry(entry: ZipEntry): entry is FastPathStoreEntry {\n  return (\n    typeof entry.crc32 === 'number' &&\n    typeof entry.size === 'number' &&\n    (entry.preCompressed === undefined || entry.preCompressed === false)\n  );\n}\n\n/**\n * Type guard to check if entry is a fast-path DEFLATE entry\n */\nexport function isFastPathDeflateEntry(entry: ZipEntry): entry is FastPathDeflateEntry {\n  return (\n    typeof entry.crc32 === 'number' &&\n    typeof entry.compressedSize === 'number' &&\n    typeof entry.uncompressedSize === 'number' &&\n    entry.preCompressed === true\n  );\n}\n\n/**\n * Check if entry can use fast-path immediate streaming\n */\nexport function canUseFastPath(entry: ZipEntry, compressionMethod: 'store' | 'deflate'): boolean {\n  if (compressionMethod === 'store') {\n    // For STORE compression, only allow fast-path STORE entries\n    return isFastPathStoreEntry(entry);\n  } else if (compressionMethod === 'deflate') {\n    // For DEFLATE compression, only allow pre-compressed DEFLATE entries\n    // STORE entries need compression so they can't use fast-path with DEFLATE writer\n    return isFastPathDeflateEntry(entry);\n  }\n  return false;\n}\n\nexport interface LocalFileHeader {\n  signature: number;\n  versionNeeded: number;\n  flags: number;\n  compressionMethod: number;\n  lastModTime: number;\n  lastModDate: number;\n  crc32: number;\n  compressedSize: number;\n  uncompressedSize: number;\n  filenameLength: number;\n  extraFieldLength: number;\n  filename: Uint8Array;\n  extraField: Uint8Array;\n}\n\nexport interface CentralDirectoryHeader {\n  signature: number;\n  versionMadeBy: number;\n  versionNeeded: number;\n  flags: number;\n  compressionMethod: number;\n  lastModTime: number;\n  lastModDate: number;\n  crc32: number;\n  compressedSize: number;\n  uncompressedSize: number;\n  filenameLength: number;\n  extraFieldLength: number;\n  commentLength: number;\n  diskNumber: number;\n  internalAttributes: number;\n  externalAttributes: number;\n  localHeaderOffset: number;\n  filename: Uint8Array;\n  extraField: Uint8Array;\n  comment: Uint8Array;\n}\n\nexport interface EndOfCentralDirectory {\n  signature: number;\n  diskNumber: number;\n  centralDirDisk: number;\n  centralDirRecords: number;\n  totalRecords: number;\n  centralDirSize: number;\n  centralDirOffset: number;\n  commentLength: number;\n  comment: Uint8Array;\n}\n\nexport interface Zip64EndOfCentralDirectory {\n  signature: number;\n  recordSize: bigint;\n  versionMadeBy: number;\n  versionNeeded: number;\n  diskNumber: number;\n  centralDirDisk: number;\n  centralDirRecords: bigint;\n  totalRecords: bigint;\n  centralDirSize: bigint;\n  centralDirOffset: bigint;\n}\n\nexport interface Zip64EndOfCentralDirectoryLocator {\n  signature: number;\n  zip64EndDisk: number;\n  zip64EndOffset: bigint;\n  totalDisks: number;\n}\n\nexport interface DataDescriptor {\n  signature?: number;\n  crc32: number;\n  compressedSize: number;\n  uncompressedSize: number;\n}\n\nexport interface Zip64DataDescriptor {\n  signature?: number;\n  crc32: number;\n  compressedSize: bigint;\n  uncompressedSize: bigint;\n}\n\nexport interface Zip64ExtraField {\n  type: number;\n  size: number;\n  uncompressedSize?: bigint;\n  compressedSize?: bigint;\n  localHeaderOffset?: bigint;\n  diskNumber?: number;\n}\n\n/**\n * Converts a Date to DOS date/time format\n */\nexport function dateToDosDateTime(date: Date): { date: number; time: number } {\n  const year = date.getFullYear();\n  const month = date.getMonth() + 1;\n  const day = date.getDate();\n  const hours = date.getHours();\n  const minutes = date.getMinutes();\n  const seconds = Math.floor(date.getSeconds() / 2);\n\n  const dosDate = ((year - 1980) << 9) | (month << 5) | day;\n  const dosTime = (hours << 11) | (minutes << 5) | seconds;\n\n  return { date: dosDate, time: dosTime };\n}\n\n/**\n * Determines if ZIP64 format is needed based on sizes\n */\nexport function needsZip64(\n  uncompressedSize: number | bigint,\n  compressedSize: number | bigint,\n  localHeaderOffset: number | bigint,\n  centralDirSize: number | bigint,\n  entryCount: number\n): boolean {\n  return (\n    Number(uncompressedSize) >= ZIP_CONSTANTS.ZIP64_LIMIT ||\n    Number(compressedSize) >= ZIP_CONSTANTS.ZIP64_LIMIT ||\n    Number(localHeaderOffset) >= ZIP_CONSTANTS.ZIP64_LIMIT ||\n    Number(centralDirSize) >= ZIP_CONSTANTS.ZIP64_LIMIT ||\n    entryCount >= ZIP_CONSTANTS.ZIP64_LIMIT_16\n  );\n}\n\n/**\n * Creates a ZIP64 extra field\n */\nexport function createZip64ExtraField(\n  uncompressedSize?: bigint,\n  compressedSize?: bigint,\n  localHeaderOffset?: bigint,\n  diskNumber?: number\n): Uint8Array {\n  const fields: bigint[] = [];\n  \n  if (uncompressedSize !== undefined) fields.push(uncompressedSize);\n  if (compressedSize !== undefined) fields.push(compressedSize);\n  if (localHeaderOffset !== undefined) fields.push(localHeaderOffset);\n  if (diskNumber !== undefined) fields.push(BigInt(diskNumber));\n\n  const size = fields.length * 8 + (diskNumber !== undefined ? -4 : 0);\n  const buffer = new ArrayBuffer(4 + size);\n  const view = new DataView(buffer);\n  \n  view.setUint16(0, ZIP_CONSTANTS.ZIP64_EXTRA_FIELD_TYPE, true);\n  view.setUint16(2, size, true);\n  \n  let offset = 4;\n  for (const field of fields) {\n    if (field === BigInt(diskNumber!) && diskNumber !== undefined) {\n      view.setUint32(offset, Number(field), true);\n      offset += 4;\n    } else {\n      view.setBigUint64(offset, field, true);\n      offset += 8;\n    }\n  }\n  \n  return new Uint8Array(buffer);\n}\n\n/**\n * Constants for Unix file permissions and types\n */\nexport const UNIX_FILE_TYPES = {\n  REGULAR_FILE: 0o100000,    // S_IFREG\n  DIRECTORY: 0o040000,       // S_IFDIR\n  SYMBOLIC_LINK: 0o120000,   // S_IFLNK\n} as const;\n\nexport const DEFAULT_PERMISSIONS = {\n  FILE: 0o644,               // rw-r--r--\n  DIRECTORY: 0o755,          // rwxr-xr-x\n  EXECUTABLE: 0o755,         // rwxr-xr-x\n} as const;\n\n/**\n * Creates external attributes for ZIP entry with Unix permissions\n */\nexport function createExternalAttributes(permissions?: number, isDirectory?: boolean): number {\n  // Default permissions based on file type\n  let unixPermissions = permissions;\n  if (unixPermissions === undefined) {\n    unixPermissions = isDirectory ? DEFAULT_PERMISSIONS.DIRECTORY : DEFAULT_PERMISSIONS.FILE;\n  }\n  \n  // Add file type bits\n  const fileType = isDirectory ? UNIX_FILE_TYPES.DIRECTORY : UNIX_FILE_TYPES.REGULAR_FILE;\n  const unixMode = fileType | unixPermissions;\n  \n  // Store Unix mode in high 16 bits, DOS attributes in low 16 bits\n  // DOS attributes: 0x10 for directory, 0x20 for regular file (archive bit)\n  const dosAttributes = isDirectory ? 0x10 : 0x20;\n  \n  // Use unsigned right shift to ensure proper unsigned 32-bit result\n  return ((unixMode << 16) | dosAttributes) >>> 0;\n}", "/**\n * ZIP binary data serialization utilities\n */\n\nimport {\n  LocalFileHeader,\n  CentralDirectoryHeader,\n  EndOfCentralDirectory,\n  Zip64EndOfCentralDirectory,\n  Zip64EndOfCentralDirectoryLocator,\n  DataDescriptor,\n  Zip64DataDescriptor,\n} from './zip-format.js';\n\n/**\n * Serializes a Local File Header to binary data\n */\nexport function serializeLocalFileHeader(header: LocalFileHeader): Uint8Array {\n  const totalSize = 30 + header.filenameLength + header.extraFieldLength;\n  const buffer = new ArrayBuffer(totalSize);\n  const view = new DataView(buffer);\n  \n  view.setUint32(0, header.signature, true);\n  view.setUint16(4, header.versionNeeded, true);\n  view.setUint16(6, header.flags, true);\n  view.setUint16(8, header.compressionMethod, true);\n  view.setUint16(10, header.lastModTime, true);\n  view.setUint16(12, header.lastModDate, true);\n  view.setUint32(14, header.crc32, true);\n  view.setUint32(18, header.compressedSize, true);\n  view.setUint32(22, header.uncompressedSize, true);\n  view.setUint16(26, header.filenameLength, true);\n  view.setUint16(28, header.extraFieldLength, true);\n  \n  const result = new Uint8Array(buffer);\n  result.set(header.filename, 30);\n  result.set(header.extraField, 30 + header.filenameLength);\n  \n  return result;\n}\n\n/**\n * Serializes a Central Directory Header to binary data\n */\nexport function serializeCentralDirectoryHeader(header: CentralDirectoryHeader): Uint8Array {\n  const totalSize = 46 + header.filenameLength + header.extraFieldLength + header.commentLength;\n  const buffer = new ArrayBuffer(totalSize);\n  const view = new DataView(buffer);\n  \n  view.setUint32(0, header.signature, true);\n  view.setUint16(4, header.versionMadeBy, true);\n  view.setUint16(6, header.versionNeeded, true);\n  view.setUint16(8, header.flags, true);\n  view.setUint16(10, header.compressionMethod, true);\n  view.setUint16(12, header.lastModTime, true);\n  view.setUint16(14, header.lastModDate, true);\n  view.setUint32(16, header.crc32, true);\n  view.setUint32(20, header.compressedSize, true);\n  view.setUint32(24, header.uncompressedSize, true);\n  view.setUint16(28, header.filenameLength, true);\n  view.setUint16(30, header.extraFieldLength, true);\n  view.setUint16(32, header.commentLength, true);\n  view.setUint16(34, header.diskNumber, true);\n  view.setUint16(36, header.internalAttributes, true);\n  view.setUint32(38, header.externalAttributes, true);\n  view.setUint32(42, header.localHeaderOffset, true);\n  \n  const result = new Uint8Array(buffer);\n  let offset = 46;\n  result.set(header.filename, offset);\n  offset += header.filenameLength;\n  result.set(header.extraField, offset);\n  offset += header.extraFieldLength;\n  result.set(header.comment, offset);\n  \n  return result;\n}\n\n/**\n * Serializes an End of Central Directory record to binary data\n */\nexport function serializeEndOfCentralDirectory(eocd: EndOfCentralDirectory): Uint8Array {\n  const totalSize = 22 + eocd.commentLength;\n  const buffer = new ArrayBuffer(totalSize);\n  const view = new DataView(buffer);\n  \n  view.setUint32(0, eocd.signature, true);\n  view.setUint16(4, eocd.diskNumber, true);\n  view.setUint16(6, eocd.centralDirDisk, true);\n  view.setUint16(8, eocd.centralDirRecords, true);\n  view.setUint16(10, eocd.totalRecords, true);\n  view.setUint32(12, eocd.centralDirSize, true);\n  view.setUint32(16, eocd.centralDirOffset, true);\n  view.setUint16(20, eocd.commentLength, true);\n  \n  const result = new Uint8Array(buffer);\n  result.set(eocd.comment, 22);\n  \n  return result;\n}\n\n/**\n * Serializes a ZIP64 End of Central Directory record to binary data\n */\nexport function serializeZip64EndOfCentralDirectory(eocd: Zip64EndOfCentralDirectory): Uint8Array {\n  const buffer = new ArrayBuffer(56);\n  const view = new DataView(buffer);\n  \n  view.setUint32(0, eocd.signature, true);\n  view.setBigUint64(4, eocd.recordSize, true);\n  view.setUint16(12, eocd.versionMadeBy, true);\n  view.setUint16(14, eocd.versionNeeded, true);\n  view.setUint32(16, eocd.diskNumber, true);\n  view.setUint32(20, eocd.centralDirDisk, true);\n  view.setBigUint64(24, eocd.centralDirRecords, true);\n  view.setBigUint64(32, eocd.totalRecords, true);\n  view.setBigUint64(40, eocd.centralDirSize, true);\n  view.setBigUint64(48, eocd.centralDirOffset, true);\n  \n  return new Uint8Array(buffer);\n}\n\n/**\n * Serializes a ZIP64 End of Central Directory Locator to binary data\n */\nexport function serializeZip64EndOfCentralDirectoryLocator(locator: Zip64EndOfCentralDirectoryLocator): Uint8Array {\n  const buffer = new ArrayBuffer(20);\n  const view = new DataView(buffer);\n  \n  view.setUint32(0, locator.signature, true);\n  view.setUint32(4, locator.zip64EndDisk, true);\n  view.setBigUint64(8, locator.zip64EndOffset, true);\n  view.setUint32(16, locator.totalDisks, true);\n  \n  return new Uint8Array(buffer);\n}\n\n/**\n * Serializes a Data Descriptor to binary data\n */\nexport function serializeDataDescriptor(descriptor: DataDescriptor): Uint8Array {\n  const hasSignature = descriptor.signature !== undefined;\n  const size = hasSignature ? 16 : 12;\n  const buffer = new ArrayBuffer(size);\n  const view = new DataView(buffer);\n  \n  let offset = 0;\n  if (hasSignature) {\n    view.setUint32(offset, descriptor.signature!, true);\n    offset += 4;\n  }\n  \n  view.setUint32(offset, descriptor.crc32, true);\n  view.setUint32(offset + 4, descriptor.compressedSize, true);\n  view.setUint32(offset + 8, descriptor.uncompressedSize, true);\n  \n  return new Uint8Array(buffer);\n}\n\n/**\n * Serializes a ZIP64 Data Descriptor to binary data\n */\nexport function serializeZip64DataDescriptor(descriptor: Zip64DataDescriptor): Uint8Array {\n  const hasSignature = descriptor.signature !== undefined;\n  const size = hasSignature ? 24 : 20;\n  const buffer = new ArrayBuffer(size);\n  const view = new DataView(buffer);\n  \n  let offset = 0;\n  if (hasSignature) {\n    view.setUint32(offset, descriptor.signature!, true);\n    offset += 4;\n  }\n  \n  view.setUint32(offset, descriptor.crc32, true);\n  view.setBigUint64(offset + 4, descriptor.compressedSize, true);\n  view.setBigUint64(offset + 12, descriptor.uncompressedSize, true);\n  \n  return new Uint8Array(buffer);\n}", "/**\n * Fast CRC32 calculation for ZIP file integrity\n * Based on the CRC32 algorithm used in ZIP files (IEEE 802.3)\n */\n\nlet crcTable: Uint32Array | null = null;\n\n/**\n * Generates the CRC32 lookup table (lazy initialization)\n */\nfunction generateCrcTable(): Uint32Array {\n  if (crcTable) return crcTable;\n  \n  crcTable = new Uint32Array(256);\n  \n  for (let i = 0; i < 256; i++) {\n    let crc = i;\n    for (let j = 0; j < 8; j++) {\n      if (crc & 1) {\n        crc = (crc >>> 1) ^ 0xedb88320;\n      } else {\n        crc = crc >>> 1;\n      }\n    }\n    crcTable[i] = crc;\n  }\n  \n  return crcTable;\n}\n\n/**\n * Calculate CRC32 for a Uint8Array\n */\nexport function crc32(data: Uint8Array, crc = 0): number {\n  const table = generateCrcTable();\n  crc = crc ^ 0xffffffff;\n  \n  for (let i = 0; i < data.length; i++) {\n    crc = table[(crc ^ data[i]!) & 0xff]! ^ (crc >>> 8);\n  }\n  \n  return (crc ^ 0xffffffff) >>> 0;\n}\n\n/**\n * CRC32 streaming calculator for processing data in chunks\n */\nexport class CRC32Stream {\n  private crc = 0;\n  private table: Uint32Array;\n  \n  constructor() {\n    this.table = generateCrcTable();\n    this.crc = 0xffffffff;\n  }\n  \n  /**\n   * Update CRC32 with new data chunk\n   */\n  update(data: Uint8Array): void {\n    for (let i = 0; i < data.length; i++) {\n      this.crc = this.table[(this.crc ^ data[i]!) & 0xff]! ^ (this.crc >>> 8);\n    }\n  }\n  \n  /**\n   * Get the final CRC32 value\n   */\n  digest(): number {\n    return (this.crc ^ 0xffffffff) >>> 0;\n  }\n  \n  /**\n   * Reset the CRC32 calculator\n   */\n  reset(): void {\n    this.crc = 0xffffffff;\n  }\n  \n  /**\n   * Get current CRC32 value without finalization\n   */\n  getCurrentValue(): number {\n    return (this.crc ^ 0xffffffff) >>> 0;\n  }\n}", "/**\n * Logger configuration using isomorphic-logger\n * Works in both Node.js and browser environments\n */\n\nimport { createLogger } from '@lyleunderwood/isomorphic-logger';\n\n// Create logger instance\nexport const logger = createLogger({\n  level: process.env.LOG_LEVEL as any || 'info',\n});\n\n// Export logger for use throughout the library\nexport default logger;\n", "/**\n * Compression handling for ZIP entries\n * Supports both STORE (no compression) and DEFLATE compression\n */\n\nimport { CRC32Stream } from './crc32.js';\nimport { ZIP_CONSTANTS } from './zip-format.js';\nimport { logger } from './logger.js';\n\nexport interface CompressionResult {\n  compressedData: Uint8Array;\n  crc32: number;\n  compressedSize: number;\n  uncompressedSize: number;\n}\n\nexport interface CompressionStreamResult {\n  readable: ReadableStream<Uint8Array>;\n  crc32Promise: Promise<number>;\n  compressedSizePromise: Promise<number>;\n  uncompressedSizePromise: Promise<number>;\n}\n\n/**\n * Compression method enum\n */\nexport type CompressionMethod = 'store' | 'deflate';\n\n/**\n * Compress data using the STORE method (no compression)\n */\nexport async function compressStore(data: Uint8Array): Promise<CompressionResult> {\n  const crc32 = new CRC32Stream();\n  crc32.update(data);\n\n  return {\n    compressedData: data,\n    crc32: crc32.digest(),\n    compressedSize: data.length,\n    uncompressedSize: data.length,\n  };\n}\n\n/**\n * Compress data using DEFLATE\n */\nexport async function compressDeflate(data: Uint8Array): Promise<CompressionResult> {\n  const crc32Stream = new CRC32Stream();\n  crc32Stream.update(data);\n\n  // Use built-in compression if available (Node.js or browser)\n  try {\n    // Try Node.js zlib first\n    const zlib = await import('zlib').catch(() => null);\n    if (zlib) {\n      const compressed = zlib.deflateRawSync(data);\n      return {\n        compressedData: new Uint8Array(compressed),\n        crc32: crc32Stream.digest(),\n        compressedSize: compressed.length,\n        uncompressedSize: data.length,\n      };\n    }\n\n    // Try browser CompressionStream\n    if (typeof CompressionStream !== 'undefined') {\n      const stream = new CompressionStream('deflate-raw');\n      const writer = stream.writable.getWriter();\n      const reader = stream.readable.getReader();\n\n      writer.write(data);\n      writer.close();\n\n      const chunks: Uint8Array[] = [];\n      let result;\n      while (!(result = await reader.read()).done) {\n        chunks.push(result.value);\n      }\n\n      const compressed = new Uint8Array(chunks.reduce((acc, chunk) => acc + chunk.length, 0));\n      let offset = 0;\n      for (const chunk of chunks) {\n        compressed.set(chunk, offset);\n        offset += chunk.length;\n      }\n\n      return {\n        compressedData: compressed,\n        crc32: crc32Stream.digest(),\n        compressedSize: compressed.length,\n        uncompressedSize: data.length,\n      };\n    }\n  } catch (error) {\n    // Fall back to store method if compression fails\n    // @ts-ignore\n    logger.warn({ error: error.message, stack: error.stack }, 'Deflate compression failed, falling back to store method');\n  }\n\n  // Fallback to store method\n  return compressStore(data);\n}\n\n/**\n * Create a compression stream for streaming data\n */\nexport function createCompressionStream(\n  inputStream: ReadableStream<Uint8Array> | NodeJS.ReadableStream,\n  method: CompressionMethod = 'deflate'\n): CompressionStreamResult {\n  const crc32Stream = new CRC32Stream();\n  let compressedSize = 0;\n  let uncompressedSize = 0;\n  let crc32Resolver!: (value: number) => void;\n  let compressedSizeResolver!: (value: number) => void;\n  let uncompressedSizeResolver!: (value: number) => void;\n\n  const crc32Promise = new Promise<number>((resolve) => {\n    crc32Resolver = resolve;\n  });\n\n  const compressedSizePromise = new Promise<number>((resolve) => {\n    compressedSizeResolver = resolve;\n  });\n\n  const uncompressedSizePromise = new Promise<number>((resolve) => {\n    uncompressedSizeResolver = resolve;\n  });\n\n  // Convert Node.js stream to Web Stream if needed\n  const webStream = 'getReader' in inputStream\n    ? inputStream\n    : new ReadableStream<Uint8Array>({\n      start(controller) {\n        const nodeStream = inputStream as NodeJS.ReadableStream;\n        nodeStream.on('data', (chunk: Buffer) => {\n          const uint8Array = new Uint8Array(chunk);\n          controller.enqueue(uint8Array);\n        });\n        nodeStream.on('end', () => controller.close());\n        nodeStream.on('error', (err) => controller.error(err));\n      }\n    });\n\n  if (method === 'store') {\n    // Store method - no compression\n    const storeTransform = new TransformStream({\n      transform(chunk, controller) {\n        crc32Stream.update(chunk);\n        uncompressedSize += chunk.length;\n        compressedSize += chunk.length;\n        controller.enqueue(chunk);\n      },\n      flush() {\n        crc32Resolver(crc32Stream.digest());\n        compressedSizeResolver(compressedSize);\n        uncompressedSizeResolver(uncompressedSize);\n      }\n    });\n\n    const readable = webStream.pipeThrough(storeTransform);\n\n    return {\n      readable,\n      crc32Promise,\n      compressedSizePromise,\n      uncompressedSizePromise,\n    };\n  } else {\n    // DEFLATE method - actual compression\n    return createDeflateCompressionStream(\n      webStream,\n      crc32Stream,\n      crc32Resolver,\n      compressedSizeResolver,\n      uncompressedSizeResolver,\n      crc32Promise,\n      compressedSizePromise,\n      uncompressedSizePromise\n    );\n  }\n}\n\n/**\n * Create DEFLATE compression stream with proper handling\n */\nfunction createDeflateCompressionStream(\n  webStream: ReadableStream<Uint8Array>,\n  crc32Stream: CRC32Stream,\n  crc32Resolver: (value: number) => void,\n  compressedSizeResolver: (value: number) => void,\n  uncompressedSizeResolver: (value: number) => void,\n  crc32Promise: Promise<number>,\n  compressedSizePromise: Promise<number>,\n  uncompressedSizePromise: Promise<number>\n): CompressionStreamResult {\n  let compressedSize = 0;\n  let uncompressedSize = 0;\n\n  // Try Node.js zlib first\n  if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n    try {\n      // Create a transform that calculates CRC32 on uncompressed data\n      const crcTransform = new TransformStream({\n        transform(chunk, controller) {\n          crc32Stream.update(chunk);\n          uncompressedSize += chunk.length;\n          controller.enqueue(chunk);\n        }\n      });\n\n      // Create a transform that counts compressed bytes\n      const sizeCounterTransform = new TransformStream({\n        transform(chunk, controller) {\n          compressedSize += chunk.length;\n          controller.enqueue(chunk);\n        },\n        flush() {\n          crc32Resolver(crc32Stream.digest());\n          compressedSizeResolver(compressedSize);\n          uncompressedSizeResolver(uncompressedSize);\n        }\n      });\n\n      // Create Node.js deflate stream wrapped as Web Stream\n      const deflateStream = createNodeDeflateStream();\n\n      const readable = webStream\n        .pipeThrough(crcTransform)\n        .pipeThrough(deflateStream)\n        .pipeThrough(sizeCounterTransform);\n\n      return {\n        readable,\n        crc32Promise,\n        compressedSizePromise,\n        uncompressedSizePromise,\n      };\n    } catch (error) {\n      // @ts-ignore\n      logger.warn({ error: error.message, stack: error.stack }, 'Node.js deflate failed, falling back to browser compression');\n    }\n  }\n\n  // Try browser CompressionStream\n  if (typeof CompressionStream !== 'undefined') {\n    try {\n      const crcTransform = new TransformStream({\n        transform(chunk, controller) {\n          crc32Stream.update(chunk);\n          uncompressedSize += chunk.length;\n          controller.enqueue(chunk);\n        }\n      });\n\n      const sizeCounterTransform = new TransformStream({\n        transform(chunk, controller) {\n          compressedSize += chunk.length;\n          controller.enqueue(chunk);\n        },\n        flush() {\n          crc32Resolver(crc32Stream.digest());\n          compressedSizeResolver(compressedSize);\n          uncompressedSizeResolver(uncompressedSize);\n        }\n      });\n\n      const deflateStream = new CompressionStream('deflate-raw');\n\n      const readable = webStream\n        .pipeThrough(crcTransform)\n        .pipeThrough(deflateStream)\n        .pipeThrough(sizeCounterTransform);\n\n      return {\n        readable,\n        crc32Promise,\n        compressedSizePromise,\n        uncompressedSizePromise,\n      };\n    } catch (error) {\n      // @ts-ignore\n      logger.warn({ error: error.message, stack: error.stack }, 'Browser compression failed, falling back to store method');\n    }\n  }\n\n  // Fallback to store method if compression is not available\n  logger.warn('No compression available, using store method');\n  return createCompressionStream(webStream, 'store');\n}\n\n/**\n * Create Node.js deflate stream wrapped as Web Stream\n */\nfunction createNodeDeflateStream(): TransformStream<Uint8Array, Uint8Array> {\n  let deflate: any = null;\n  let streamClosed = false;\n\n  return new TransformStream({\n    async start(controller) {\n      try {\n        const zlib = await import('zlib');\n        deflate = zlib.createDeflateRaw();\n\n        deflate.on('data', (chunk: Buffer) => {\n          if (!streamClosed) {\n            controller.enqueue(new Uint8Array(chunk));\n          }\n        });\n\n        deflate.on('end', () => {\n          if (!streamClosed) {\n            streamClosed = true;\n            controller.terminate();\n          }\n        });\n\n        deflate.on('error', (err: Error) => {\n          if (!streamClosed) {\n            streamClosed = true;\n            controller.error(err);\n          }\n        });\n      } catch (error) {\n        controller.error(error);\n      }\n    },\n\n    transform(chunk, controller) {\n      if (deflate && !streamClosed) {\n        deflate.write(Buffer.from(chunk));\n      } else if (!deflate) {\n        controller.error(new Error('Deflate stream not initialized'));\n      }\n    },\n\n    flush(controller) {\n      return new Promise<void>((resolve, reject) => {\n        if (!deflate || streamClosed) {\n          resolve();\n          return;\n        }\n\n        const onEnd = () => {\n          deflate.removeListener('error', onError);\n          if (!streamClosed) {\n            streamClosed = true;\n            controller.terminate();\n          }\n          resolve();\n        };\n\n        const onError = (err: Error) => {\n          deflate.removeListener('end', onEnd);\n          if (!streamClosed) {\n            streamClosed = true;\n            controller.error(err);\n          }\n          reject(err);\n        };\n\n        deflate.once('end', onEnd);\n        deflate.once('error', onError);\n        deflate.end();\n      });\n    }\n  });\n}\n\n/**\n * Get compression method constant\n */\nexport function getCompressionMethodConstant(method: CompressionMethod): number {\n  switch (method) {\n    case 'store':\n      return ZIP_CONSTANTS.COMPRESSION_STORE;\n    case 'deflate':\n      return ZIP_CONSTANTS.COMPRESSION_DEFLATE;\n    default:\n      return ZIP_CONSTANTS.COMPRESSION_STORE;\n  }\n}\n", "/**\n * Entry buffer system for parallel reading with sequential writing\n */\n\nimport { CRC32Stream } from './crc32.js';\nimport { ZipEntry } from './zip-format.js';\nimport { createCompressionStream, CompressionMethod } from './compression.js';\nimport logger from './logger.js';\n\nexport enum EntryState {\n  PENDING = 'pending',\n  READING = 'reading',\n  READY = 'ready',\n  WRITING = 'writing',\n  COMPLETED = 'completed',\n  ERROR = 'error'\n}\n\nexport interface BufferedChunk {\n  data: Uint8Array;\n  offset: number;\n}\n\nexport interface EntryMetadata {\n  crc32: number;\n  compressedSize: number;\n  uncompressedSize: number;\n  localHeaderOffset: number;\n  compressionMethod: CompressionMethod;\n}\n\nexport class EntryBuffer {\n  private chunks: BufferedChunk[] = [];\n  private totalSize = 0;\n  private maxBufferSize: number;\n  private crc32Stream = new CRC32Stream();\n  private state: EntryState = EntryState.PENDING;\n  private readPromise: Promise<void> | null = null;\n  private readResolver: (() => void) | null = null;\n  private readError: Error | null = null;\n  private metadata: Partial<EntryMetadata> = {};\n  \n  // Backpressure coordination\n  private waitingReaders: Array<() => void> = [];\n\n  constructor(\n    public readonly entry: ZipEntry,\n    public readonly index: number,\n    public readonly compressionMethod: CompressionMethod = 'store',\n    maxBufferSize = 1024 * 1024 // 1MB default buffer limit\n  ) {\n    this.maxBufferSize = maxBufferSize;\n  }\n\n  /**\n   * Get current entry state\n   */\n  getState(): EntryState {\n    return this.state;\n  }\n\n  /**\n   * Check if entry is ready to be written\n   */\n  isReady(): boolean {\n    return this.state === EntryState.READY;\n  }\n\n  /**\n   * Check if entry has been completely read\n   */\n  isReadComplete(): boolean {\n    return this.state === EntryState.READY || this.state === EntryState.WRITING || this.state === EntryState.COMPLETED || this.state === EntryState.ERROR;\n  }\n\n  /**\n   * Get buffered size in bytes\n   */\n  getBufferedSize(): number {\n    // Calculate actual buffered size from chunks array for accuracy\n    const actualSize = this.chunks.reduce((total, chunk) => total + chunk.data.length, 0);\n    \n    // Verify totalSize is accurate and fix if needed\n    if (actualSize !== this.totalSize) {\n      logger.debug({ actualSize, totalSize: this.totalSize }, 'Buffer size mismatch detected, correcting');\n      this.totalSize = actualSize;\n    }\n    \n    return this.totalSize;\n  }\n\n  /**\n   * Check if buffer has space for more data\n   */\n  hasBufferSpace(): boolean {\n    return this.totalSize < this.maxBufferSize;\n  }\n\n  /**\n   * Start reading from the entry's data stream\n   */\n  async startReading(): Promise<void> {\n    if (this.state !== EntryState.PENDING) {\n      throw new Error(`Cannot start reading entry in state: ${this.state}`);\n    }\n\n    this.state = EntryState.READING;\n    this.readPromise = this.performRead();\n    return this.readPromise;\n  }\n\n  /**\n   * Wait for entry to be ready for writing\n   */\n  async waitForReady(): Promise<void> {\n    if (this.state === EntryState.READY) {\n      return;\n    }\n\n    if (this.state === EntryState.ERROR) {\n      throw this.readError || new Error('Entry reading failed');\n    }\n\n    if (this.readPromise) {\n      await this.readPromise;\n    }\n\n    // Check state again after waiting - use type assertion to work around TypeScript flow analysis\n    const currentState = this.state as EntryState;\n    switch (currentState) {\n      case EntryState.ERROR:\n        throw this.readError || new Error('Entry reading failed');\n      case EntryState.READY:\n        return;\n      default:\n        throw new Error(`Unexpected state after reading: ${currentState}`);\n    }\n  }\n\n  /**\n   * Read the next chunk from the buffer\n   */\n  readChunk(): BufferedChunk | null {\n    if (this.chunks.length === 0) {\n      return null;\n    }\n\n    // Remove and return the first chunk (FIFO)\n    const chunk = this.chunks.shift();\n    \n    // Update total size to reflect consumed data\n    if (chunk) {\n      this.totalSize -= chunk.data.length;\n    }\n    \n    return chunk || null;\n  }\n\n  /**\n   * Get entry metadata\n   */\n  getMetadata(): EntryMetadata {\n    if (!this.isReadComplete()) {\n      throw new Error('Metadata not available until reading is complete');\n    }\n\n    return {\n      crc32: this.metadata.crc32!,\n      compressedSize: this.metadata.compressedSize!,\n      uncompressedSize: this.metadata.uncompressedSize!,\n      localHeaderOffset: this.metadata.localHeaderOffset || 0,\n      compressionMethod: this.compressionMethod\n    };\n  }\n\n  /**\n   * Set the local header offset\n   */\n  setLocalHeaderOffset(offset: number): void {\n    this.metadata.localHeaderOffset = offset;\n  }\n\n  /**\n   * Mark entry as being written\n   */\n  startWriting(): void {\n    if (this.state !== EntryState.READY) {\n      throw new Error(`Cannot start writing entry in state: ${this.state}`);\n    }\n    this.state = EntryState.WRITING;\n  }\n\n  /**\n   * Mark entry as completed\n   */\n  markCompleted(): void {\n    if (this.state !== EntryState.WRITING) {\n      throw new Error(`Cannot mark entry completed from state: ${this.state}`);\n    }\n    this.state = EntryState.COMPLETED;\n  }\n\n  /**\n   * Get total uncompressed size\n   */\n  getUncompressedSize(): number {\n    return this.metadata.uncompressedSize || 0;\n  }\n\n  /**\n   * Get total compressed size (same as uncompressed for store method)\n   */\n  getCompressedSize(): number {\n    return this.metadata.compressedSize || 0;\n  }\n\n  /**\n   * Get CRC32 checksum\n   */\n  getCRC32(): number {\n    return this.metadata.crc32 || 0;\n  }\n\n  /**\n   * Perform the actual reading from the stream\n   */\n  private async performRead(): Promise<void> {\n    logger.debug({ entryName: this.entry.name }, 'Starting to read entry data');\n    try {\n      logger.debug({ entryName: this.entry.name }, 'Reading entry data');\n      // Convert Node.js stream to Web Stream if needed\n      const inputStream = 'getReader' in this.entry.data\n        ? this.entry.data\n        : this.createWebStreamFromNodeStream(this.entry.data);\n\n      logger.debug('Starting to read entry chunks');\n\n      // Create compression stream\n      const compressionResult = createCompressionStream(inputStream, this.compressionMethod);\n\n      const reader = compressionResult.readable.getReader();\n      logger.debug('Entry chunk reader created');\n      let chunkOffset = 0;\n\n      try {\n        while (true) {\n          logger.debug('Reading entry chunk');\n          const { done, value } = await reader.read();\n          logger.debug({ done }, 'Entry chunk read');\n          if (done) break;\n\n          // Wait for buffer space if needed\n          if (!this.hasBufferSpace()) {\n            logger.debug('Waiting for buffer space');\n            await this.waitForBufferSpace();\n            logger.debug('Buffer space available');\n          }\n\n          // Store compressed chunk\n          this.chunks.push({\n            data: value,\n            offset: chunkOffset\n          });\n\n          this.totalSize += value.length;\n          chunkOffset += value.length;\n        }\n      } finally {\n        logger.debug('Releasing entry chunk reader');\n        reader.releaseLock();\n      }\n\n      // Wait for compression metadata\n      const [crc32, compressedSize, uncompressedSize] = await Promise.all([\n        compressionResult.crc32Promise,\n        compressionResult.compressedSizePromise,\n        compressionResult.uncompressedSizePromise\n      ]);\n\n      // Set final metadata\n      this.metadata.crc32 = crc32;\n      this.metadata.compressedSize = compressedSize;\n      this.metadata.uncompressedSize = uncompressedSize;\n\n      this.state = EntryState.READY;\n\n      logger.debug({ crc32, compressedSize, uncompressedSize }, 'Entry read complete');\n\n      if (this.readResolver) {\n        logger.debug('Calling read resolver');\n        this.readResolver();\n      }\n\n    } catch (error) {\n      this.readError = error instanceof Error ? error : new Error(String(error));\n      this.state = EntryState.ERROR;\n\n      if (this.readResolver) {\n        this.readResolver();\n      }\n    }\n  }\n\n  /**\n   * Wait for buffer space to become available\n   */\n  private async waitForBufferSpace(): Promise<void> {\n    // If space is already available, return immediately\n    if (this.hasBufferSpace()) {\n      return;\n    }\n\n    // Create a promise that will be resolved when space becomes available\n    return new Promise<void>((resolve) => {\n      // Double-check space availability after adding to queue to avoid race condition\n      if (this.hasBufferSpace()) {\n        resolve();\n        return;\n      }\n      \n      this.waitingReaders.push(resolve);\n    });\n  }\n\n  /**\n   * Notify that buffer space has been freed up (called when chunks are consumed)\n   */\n  notifySpaceFreed(): void {\n    // Always check and resolve waiting readers if space is available\n    if (this.waitingReaders.length > 0) {\n      // Get current buffer state\n      const hasSpace = this.hasBufferSpace();\n      \n      if (hasSpace) {\n        // Resolve all waiting readers\n        const resolvers = this.waitingReaders.splice(0);\n        logger.debug({ \n          bufferedSize: this.getBufferedSize(), \n          maxSize: this.maxBufferSize,\n          waitingReaders: resolvers.length \n        }, 'Notifying waiting readers of available buffer space');\n        \n        resolvers.forEach(resolve => {\n          try {\n            resolve();\n          } catch (error) {\n            logger.error({ error }, 'Error resolving waiting reader');\n          }\n        });\n      }\n    }\n  }\n\n  /**\n   * Create a Web ReadableStream from a Node.js stream\n   */\n  private createWebStreamFromNodeStream(nodeStream: NodeJS.ReadableStream): ReadableStream<Uint8Array> {\n    logger.debug('Converting Node.js stream to Web Stream');\n    return new ReadableStream<Uint8Array>({\n      start(controller) {\n        nodeStream.on('data', (chunk: Buffer) => {\n          const uint8Array = new Uint8Array(chunk);\n          controller.enqueue(uint8Array);\n        });\n\n        nodeStream.on('end', () => {\n          controller.close();\n        });\n\n        nodeStream.on('error', (err) => {\n          controller.error(err);\n        });\n      },\n\n      cancel() {\n        if ('destroy' in nodeStream && typeof nodeStream.destroy === 'function') {\n          nodeStream.destroy();\n        }\n      }\n    });\n  }\n}\n", "/**\n * Parallel reader for concurrent entry stream processing\n */\n\nimport { EntryBuffer, EntryState } from './entry-buffer.js';\nimport { ZipEntry } from './zip-format.js';\nimport { CompressionMethod } from './compression.js';\nimport logger from './logger.js';\n\nexport interface ParallelReaderOptions {\n  maxBufferSize?: number;\n  maxConcurrentReads?: number;\n  compression?: CompressionMethod;\n}\n\nexport class ParallelReader {\n  private entryBuffers: EntryBuffer[] = [];\n  private readingPromises: Map<number, Promise<void>> = new Map();\n  private options: ParallelReaderOptions;\n  private activeReads = 0;\n\n  constructor(options: ParallelReaderOptions = {}) {\n    this.options = {\n      maxBufferSize: 1024 * 1024, // 1MB per entry\n      maxConcurrentReads: 10, // Max concurrent reads\n      compression: 'store', // Default compression\n      ...options\n    };\n  }\n\n  /**\n   * Add an entry to be read in parallel\n   */\n  addEntry(entry: ZipEntry): EntryBuffer {\n    const index = this.entryBuffers.length;\n    const entryBuffer = new EntryBuffer(\n      entry,\n      index,\n      this.options.compression!,\n      this.options.maxBufferSize\n    );\n\n    this.entryBuffers.push(entryBuffer);\n\n    // Start reading immediately if we have capacity\n    this.startReadingIfPossible(entryBuffer);\n\n    return entryBuffer;\n  }\n\n  /**\n   * Get all entry buffers\n   */\n  getEntryBuffers(): EntryBuffer[] {\n    return [...this.entryBuffers];\n  }\n\n  /**\n   * Get entry buffer by index\n   */\n  getEntryBuffer(index: number): EntryBuffer | undefined {\n    return this.entryBuffers[index];\n  }\n\n  /**\n   * Get the next ready entry in order\n   */\n  getNextReadyEntry(): EntryBuffer | null {\n    for (const buffer of this.entryBuffers) {\n      if (buffer.getState() === EntryState.READY) {\n        return buffer;\n      }\n      // If we hit a non-ready entry, we can't proceed (order matters)\n      if (buffer.getState() !== EntryState.COMPLETED) {\n        return null;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Check if there are any entries still being read\n   */\n  hasActiveReads(): boolean {\n    return this.activeReads > 0 || this.readingPromises.size > 0;\n  }\n\n  /**\n   * Wait for the next entry to become ready\n   */\n  async waitForNextReady(): Promise<EntryBuffer | null> {\n    // Check if next entry is already ready\n    const nextReady = this.getNextReadyEntry();\n    if (nextReady) {\n      return nextReady;\n    }\n\n    // Find the next entry that needs to be ready\n    let nextEntry: EntryBuffer | null = null;\n    for (const buffer of this.entryBuffers) {\n      if (buffer.getState() === EntryState.COMPLETED) {\n        continue;\n      }\n      nextEntry = buffer;\n      break;\n    }\n\n    if (!nextEntry) {\n      return null; // No more entries\n    }\n\n    // Wait for this entry to be ready\n    if (nextEntry.getState() === EntryState.PENDING) {\n      this.startReadingIfPossible(nextEntry);\n    }\n\n    if (nextEntry.getState() !== EntryState.READY) {\n      await nextEntry.waitForReady();\n    }\n\n    return nextEntry.isReady() ? nextEntry : null;\n  }\n\n  /**\n   * Wait for all entries to complete reading\n   */\n  async waitForAllComplete(): Promise<void> {\n    // Start reading any pending entries\n    for (const buffer of this.entryBuffers) {\n      if (buffer.getState() === EntryState.PENDING) {\n        logger.debug({ entryName: buffer.entry.name }, 'Starting to read pending entry');\n        this.startReadingIfPossible(buffer);\n      }\n    }\n\n    // Wait for all reading promises to complete\n    const promises = Array.from(this.readingPromises.values());\n    if (promises.length > 0) {\n      logger.debug({ count: promises.length }, 'Waiting for all reading promises to complete');\n      await Promise.all(promises);\n    }\n  }\n\n  /**\n   * Get statistics about reading progress\n   */\n  getStats(): {\n    total: number;\n    pending: number;\n    reading: number;\n    ready: number;\n    writing: number;\n    completed: number;\n    errors: number;\n  } {\n    const stats = {\n      total: this.entryBuffers.length,\n      pending: 0,\n      reading: 0,\n      ready: 0,\n      writing: 0,\n      completed: 0,\n      errors: 0\n    };\n\n    for (const buffer of this.entryBuffers) {\n      switch (buffer.getState()) {\n        case EntryState.PENDING:\n          stats.pending++;\n          break;\n        case EntryState.READING:\n          stats.reading++;\n          break;\n        case EntryState.READY:\n          stats.ready++;\n          break;\n        case EntryState.WRITING:\n          stats.writing++;\n          break;\n        case EntryState.COMPLETED:\n          stats.completed++;\n          break;\n        case EntryState.ERROR:\n          stats.errors++;\n          break;\n      }\n    }\n\n    return stats;\n  }\n\n  /**\n   * Start reading an entry if we have capacity\n   */\n  private startReadingIfPossible(entryBuffer: EntryBuffer): void {\n    if (entryBuffer.getState() !== EntryState.PENDING) {\n      return;\n    }\n\n    if (this.activeReads >= this.options.maxConcurrentReads!) {\n      return; // At capacity\n    }\n\n    this.activeReads++;\n    logger.debug({ entryName: entryBuffer.entry.name }, 'Starting to read entry');\n    const readPromise = entryBuffer.startReading().finally(() => {\n      logger.debug({ entryName: entryBuffer.entry.name }, 'Completed reading entry');\n      this.activeReads--;\n      this.readingPromises.delete(entryBuffer.index);\n\n      // Try to start reading the next pending entry\n      this.startNextPendingEntry();\n    });\n\n    this.readingPromises.set(entryBuffer.index, readPromise);\n  }\n\n  /**\n   * Try to start reading the next pending entry\n   */\n  private startNextPendingEntry(): void {\n    if (this.activeReads >= this.options.maxConcurrentReads!) {\n      return;\n    }\n\n    for (const buffer of this.entryBuffers) {\n      if (buffer.getState() === EntryState.PENDING) {\n        this.startReadingIfPossible(buffer);\n        break;\n      }\n    }\n  }\n}\n", "/**\n * Write queue for sequential entry writing while maintaining ZIP structure\n */\n\nimport { EntryBuffer, EntryState } from './entry-buffer.js';\nimport { DirectStreamEntry } from './direct-stream-entry.js';\nimport {\n  ZIP_CONSTANTS,\n  LocalFileHeader,\n  CentralDirectoryHeader,\n  dateToDosDateTime,\n  needsZip64,\n  createZip64ExtraField,\n  createExternalAttributes\n} from './zip-format.js';\nimport {\n  serializeLocalFileHeader,\n  serializeCentralDirectoryHeader,\n  serializeDataDescriptor,\n  serializeZip64DataDescriptor\n} from './zip-serializer.js';\nimport { logger } from './logger.js';\n\nexport interface WriteQueueOptions {\n  compression?: 'store' | 'deflate';\n}\n\nexport class WriteQueue {\n  private outputController: ReadableStreamDefaultController<Uint8Array> | null = null;\n  private currentOffset = 0;\n  private centralDirectoryEntries: CentralDirectoryHeader[] = [];\n  private options: WriteQueueOptions;\n  private writeInProgress = false;\n\n  constructor(options: WriteQueueOptions = {}) {\n    this.options = {\n      compression: 'store',\n      ...options\n    };\n\n    logger.debug({ options: this.options }, 'WriteQueue initialized');\n  }\n\n  /**\n   * Set the output controller for streaming data\n   */\n  setOutputController(controller: ReadableStreamDefaultController<Uint8Array>): void {\n    this.outputController = controller;\n  }\n\n  /**\n   * Write an entry buffer to the output stream\n   */\n  async writeEntry(entryBuffer: EntryBuffer): Promise<void> {\n    if (this.writeInProgress) {\n      throw new Error('Another write operation is already in progress');\n    }\n\n    if (!entryBuffer.isReady()) {\n      throw new Error('Entry buffer is not ready for writing');\n    }\n\n    const entryName = entryBuffer.entry.name;\n    logger.debug({ entryName, currentOffset: this.currentOffset }, 'Starting to write buffered entry');\n\n    this.writeInProgress = true;\n\n    try {\n      entryBuffer.startWriting();\n      await this.performEntryWrite(entryBuffer);\n      entryBuffer.markCompleted();\n      logger.debug({ entryName, finalOffset: this.currentOffset }, 'Completed writing buffered entry');\n    } catch (error) {\n      // @ts-ignore\n      logger.error({ entryName, error: error.message, stack: error.stack }, 'Error writing buffered entry');\n      throw error;\n    } finally {\n      this.writeInProgress = false;\n    }\n  }\n\n  /**\n   * Write a direct stream entry immediately to the output stream\n   */\n  async writeDirectStreamEntry(directEntry: DirectStreamEntry): Promise<void> {\n    if (this.writeInProgress) {\n      throw new Error('Another write operation is already in progress');\n    }\n\n    if (!directEntry.isReadyForStreaming()) {\n      throw new Error('Direct stream entry is not ready for streaming');\n    }\n\n    const entryName = directEntry.entry.name;\n    logger.debug({ entryName, currentOffset: this.currentOffset }, 'Starting to write direct stream entry');\n\n    this.writeInProgress = true;\n\n    try {\n      await this.performDirectStreamWrite(directEntry);\n      directEntry.markCompleted();\n      logger.debug({ entryName, finalOffset: this.currentOffset }, 'Completed writing direct stream entry');\n    } catch (error) {\n      const err = error instanceof Error ? error : new Error(String(error));\n      logger.error({ entryName, error: err.message, stack: err.stack }, 'Error writing direct stream entry');\n      directEntry.markError(err);\n      throw err;\n    } finally {\n      this.writeInProgress = false;\n    }\n  }\n\n  /**\n   * Write the central directory to the output stream\n   */\n  async writeCentralDirectory(): Promise<{\n    centralDirOffset: number;\n    centralDirSize: number;\n  }> {\n    const centralDirStart = this.currentOffset;\n    const entryCount = this.centralDirectoryEntries.length;\n\n    logger.debug({ entryCount, centralDirStart }, 'Writing central directory');\n\n    for (let i = 0; i < this.centralDirectoryEntries.length; i++) {\n      const entry = this.centralDirectoryEntries[i];\n      logger.debug({ entryIndex: i, entryName: entry?.filename }, 'Writing central directory entry');\n      if (!entry) {\n        throw new Error('Central directory entry is missing');\n      }\n      const serialized = serializeCentralDirectoryHeader(entry);\n      await this.writeToOutput(serialized);\n    }\n\n    const centralDirSize = this.currentOffset - centralDirStart;\n\n    logger.debug({ centralDirStart, centralDirSize }, 'Central directory written successfully');\n\n    return {\n      centralDirOffset: centralDirStart,\n      centralDirSize\n    };\n  }\n\n  /**\n   * Get the current offset in the output stream\n   */\n  getCurrentOffset(): number {\n    return this.currentOffset;\n  }\n\n  /**\n   * Get the number of entries written\n   */\n  getEntryCount(): number {\n    return this.centralDirectoryEntries.length;\n  }\n\n  /**\n   * Check if any write operations are in progress\n   */\n  isWriteInProgress(): boolean {\n    return this.writeInProgress;\n  }\n\n  /**\n   * Perform immediate direct stream write operation\n   */\n  private async performDirectStreamWrite(directEntry: DirectStreamEntry): Promise<void> {\n    // Set local header offset\n    directEntry.setLocalHeaderOffset(this.currentOffset);\n\n    // Create and write local file header immediately\n    const localHeader = this.createDirectStreamLocalFileHeader(directEntry);\n    const headerSize = serializeLocalFileHeader(localHeader).length;\n    logger.debug({ entryName: directEntry.entry.name, headerSize }, 'Writing direct stream local file header');\n    await this.writeToOutput(serializeLocalFileHeader(localHeader));\n\n    // Start streaming data directly from source\n    const dataStream = directEntry.startDirectStreaming();\n    const reader = dataStream.getReader();\n\n    let streamedDataSize = 0;\n    try {\n      // Stream data chunks directly to output\n      while (true) {\n        const { done, value } = await reader.read();\n        if (done) {\n          break;\n        }\n        streamedDataSize += value.length;\n        await this.writeToOutput(value);\n      }\n    } finally {\n      reader.releaseLock();\n    }\n\n    logger.debug({ entryName: directEntry.entry.name, streamedDataSize }, 'Direct stream data written');\n\n    // Write data descriptor (always use for streaming entries)\n    const dataDescriptor = this.createDirectStreamDataDescriptor(directEntry);\n    logger.debug({ entryName: directEntry.entry.name, descriptorSize: dataDescriptor.length }, 'Writing direct stream data descriptor');\n    await this.writeToOutput(dataDescriptor);\n\n    // Create central directory entry\n    const centralDirEntry = this.createDirectStreamCentralDirectoryHeader(directEntry);\n    this.centralDirectoryEntries.push(centralDirEntry);\n  }\n\n  /**\n   * Perform the actual entry write operation\n   */\n  private async performEntryWrite(entryBuffer: EntryBuffer): Promise<void> {\n    // Set local header offset\n    entryBuffer.setLocalHeaderOffset(this.currentOffset);\n\n    // Create and write local file header\n    const localHeader = this.createLocalFileHeader(entryBuffer);\n    logger.debug({ entryName: entryBuffer.entry.name, headerSize: serializeLocalFileHeader(localHeader).length }, 'Writing local file header');\n    await this.writeToOutput(serializeLocalFileHeader(localHeader));\n\n    // Write entry data chunks\n    let chunk;\n    let dataSize = 0;\n    while ((chunk = entryBuffer.readChunk()) !== null) {\n      dataSize += chunk.data.length;\n      await this.writeToOutput(chunk.data);\n      \n      // Notify the entry buffer that space has been freed\n      entryBuffer.notifySpaceFreed();\n    }\n\n    logger.debug({ entryName: entryBuffer.entry.name, dataSize }, 'Entry data written');\n\n    // Write data descriptor if needed\n    if (localHeader.flags & ZIP_CONSTANTS.FLAG_DATA_DESCRIPTOR) {\n      const dataDescriptor = this.createDataDescriptor(entryBuffer);\n      logger.debug({ entryName: entryBuffer.entry.name, descriptorSize: dataDescriptor.length }, 'Writing data descriptor');\n      await this.writeToOutput(dataDescriptor);\n    }\n\n    // Create central directory entry\n    const centralDirEntry = this.createCentralDirectoryHeader(entryBuffer);\n    this.centralDirectoryEntries.push(centralDirEntry);\n  }\n\n  /**\n   * Create local file header for entry\n   */\n  private createLocalFileHeader(entryBuffer: EntryBuffer): LocalFileHeader {\n    const entry = entryBuffer.entry;\n    const filename = new TextEncoder().encode(entry.name);\n    const lastModified = entry.lastModified || new Date();\n    const { date, time } = dateToDosDateTime(lastModified);\n\n    // Use data descriptor since we're streaming\n    const flags = ZIP_CONSTANTS.FLAG_DATA_DESCRIPTOR | ZIP_CONSTANTS.FLAG_UTF8;\n\n    const extraField = new Uint8Array(0); // Could add ZIP64 if needed\n\n    return {\n      signature: ZIP_CONSTANTS.LOCAL_FILE_HEADER_SIGNATURE,\n      versionNeeded: ZIP_CONSTANTS.VERSION_NEEDED_EXTRACT,\n      flags,\n      compressionMethod: entryBuffer.getMetadata().compressionMethod === 'store'\n        ? ZIP_CONSTANTS.COMPRESSION_STORE\n        : ZIP_CONSTANTS.COMPRESSION_DEFLATE,\n      lastModTime: time,\n      lastModDate: date,\n      crc32: 0, // Will be in data descriptor\n      compressedSize: 0, // Will be in data descriptor\n      uncompressedSize: 0, // Will be in data descriptor\n      filenameLength: filename.length,\n      extraFieldLength: extraField.length,\n      filename,\n      extraField\n    };\n  }\n\n  /**\n   * Create data descriptor for entry\n   */\n  private createDataDescriptor(entryBuffer: EntryBuffer): Uint8Array {\n    const metadata = entryBuffer.getMetadata();\n\n    const needsZip64Format = needsZip64(\n      metadata.uncompressedSize,\n      metadata.compressedSize,\n      0,\n      0,\n      0\n    );\n\n    if (needsZip64Format) {\n      const descriptor = {\n        signature: ZIP_CONSTANTS.DATA_DESCRIPTOR_SIGNATURE,\n        crc32: metadata.crc32,\n        compressedSize: BigInt(metadata.compressedSize),\n        uncompressedSize: BigInt(metadata.uncompressedSize)\n      };\n      return serializeZip64DataDescriptor(descriptor);\n    } else {\n      const descriptor = {\n        signature: ZIP_CONSTANTS.DATA_DESCRIPTOR_SIGNATURE,\n        crc32: metadata.crc32,\n        compressedSize: metadata.compressedSize,\n        uncompressedSize: metadata.uncompressedSize\n      };\n      return serializeDataDescriptor(descriptor);\n    }\n  }\n\n  /**\n   * Create central directory header for entry\n   */\n  private createCentralDirectoryHeader(entryBuffer: EntryBuffer): CentralDirectoryHeader {\n    const entry = entryBuffer.entry;\n    const metadata = entryBuffer.getMetadata();\n    const filename = new TextEncoder().encode(entry.name);\n    const comment = new TextEncoder().encode(entry.comment || '');\n    const lastModified = entry.lastModified || new Date();\n    const { date, time } = dateToDosDateTime(lastModified);\n\n    const needsZip64Format = needsZip64(\n      metadata.uncompressedSize,\n      metadata.compressedSize,\n      metadata.localHeaderOffset,\n      0,\n      0\n    );\n\n    let extraField = new Uint8Array(0);\n    let compressedSize = metadata.compressedSize;\n    let uncompressedSize = metadata.uncompressedSize;\n    let localHeaderOffset = metadata.localHeaderOffset;\n\n    if (needsZip64Format) {\n      extraField = createZip64ExtraField(\n        BigInt(metadata.uncompressedSize),\n        BigInt(metadata.compressedSize),\n        BigInt(metadata.localHeaderOffset)\n      );\n      compressedSize = ZIP_CONSTANTS.ZIP64_LIMIT;\n      uncompressedSize = ZIP_CONSTANTS.ZIP64_LIMIT;\n      localHeaderOffset = ZIP_CONSTANTS.ZIP64_LIMIT;\n    }\n\n    return {\n      signature: ZIP_CONSTANTS.CENTRAL_DIRECTORY_SIGNATURE,\n      versionMadeBy: ZIP_CONSTANTS.VERSION_MADE_BY,\n      versionNeeded: needsZip64Format ? ZIP_CONSTANTS.VERSION_NEEDED_EXTRACT_ZIP64 : ZIP_CONSTANTS.VERSION_NEEDED_EXTRACT,\n      flags: ZIP_CONSTANTS.FLAG_DATA_DESCRIPTOR | ZIP_CONSTANTS.FLAG_UTF8,\n      compressionMethod: metadata.compressionMethod === 'store'\n        ? ZIP_CONSTANTS.COMPRESSION_STORE\n        : ZIP_CONSTANTS.COMPRESSION_DEFLATE,\n      lastModTime: time,\n      lastModDate: date,\n      crc32: metadata.crc32,\n      compressedSize,\n      uncompressedSize,\n      filenameLength: filename.length,\n      extraFieldLength: extraField.length,\n      commentLength: comment.length,\n      diskNumber: 0,\n      internalAttributes: 0,\n      externalAttributes: createExternalAttributes(entry.permissions, entry.name.endsWith('/')),\n      localHeaderOffset,\n      filename,\n      extraField,\n      comment\n    };\n  }\n\n  /**\n   * Create local file header for direct stream entry\n   */\n  private createDirectStreamLocalFileHeader(directEntry: DirectStreamEntry): LocalFileHeader {\n    const entry = directEntry.entry;\n    const metadata = directEntry.getMetadata();\n    const filename = new TextEncoder().encode(entry.name);\n    const lastModified = entry.lastModified || new Date();\n    const { date, time } = dateToDosDateTime(lastModified);\n\n    // Use data descriptor since we're streaming\n    const flags = ZIP_CONSTANTS.FLAG_DATA_DESCRIPTOR | ZIP_CONSTANTS.FLAG_UTF8;\n\n    const extraField = new Uint8Array(0); // Could add ZIP64 if needed\n\n    return {\n      signature: ZIP_CONSTANTS.LOCAL_FILE_HEADER_SIGNATURE,\n      versionNeeded: ZIP_CONSTANTS.VERSION_NEEDED_EXTRACT,\n      flags,\n      compressionMethod: metadata.compressionMethod === 'store'\n        ? ZIP_CONSTANTS.COMPRESSION_STORE\n        : ZIP_CONSTANTS.COMPRESSION_DEFLATE,\n      lastModTime: time,\n      lastModDate: date,\n      crc32: 0, // Will be in data descriptor\n      compressedSize: 0, // Will be in data descriptor\n      uncompressedSize: 0, // Will be in data descriptor\n      filenameLength: filename.length,\n      extraFieldLength: extraField.length,\n      filename,\n      extraField\n    };\n  }\n\n  /**\n   * Create data descriptor for direct stream entry\n   */\n  private createDirectStreamDataDescriptor(directEntry: DirectStreamEntry): Uint8Array {\n    const metadata = directEntry.getMetadata();\n\n    const needsZip64Format = needsZip64(\n      metadata.uncompressedSize,\n      metadata.compressedSize,\n      0,\n      0,\n      0\n    );\n\n    if (needsZip64Format) {\n      const descriptor = {\n        signature: ZIP_CONSTANTS.DATA_DESCRIPTOR_SIGNATURE,\n        crc32: metadata.crc32,\n        compressedSize: BigInt(metadata.compressedSize),\n        uncompressedSize: BigInt(metadata.uncompressedSize)\n      };\n      return serializeZip64DataDescriptor(descriptor);\n    } else {\n      const descriptor = {\n        signature: ZIP_CONSTANTS.DATA_DESCRIPTOR_SIGNATURE,\n        crc32: metadata.crc32,\n        compressedSize: metadata.compressedSize,\n        uncompressedSize: metadata.uncompressedSize\n      };\n      return serializeDataDescriptor(descriptor);\n    }\n  }\n\n  /**\n   * Create central directory header for direct stream entry\n   */\n  private createDirectStreamCentralDirectoryHeader(directEntry: DirectStreamEntry): CentralDirectoryHeader {\n    const entry = directEntry.entry;\n    const metadata = directEntry.getMetadata();\n    const filename = new TextEncoder().encode(entry.name);\n    const comment = new TextEncoder().encode(entry.comment || '');\n    const lastModified = entry.lastModified || new Date();\n    const { date, time } = dateToDosDateTime(lastModified);\n\n    const needsZip64Format = needsZip64(\n      metadata.uncompressedSize,\n      metadata.compressedSize,\n      metadata.localHeaderOffset,\n      0,\n      0\n    );\n\n    let extraField = new Uint8Array(0);\n    let compressedSize = metadata.compressedSize;\n    let uncompressedSize = metadata.uncompressedSize;\n    let localHeaderOffset = metadata.localHeaderOffset;\n\n    if (needsZip64Format) {\n      extraField = createZip64ExtraField(\n        BigInt(metadata.uncompressedSize),\n        BigInt(metadata.compressedSize),\n        BigInt(metadata.localHeaderOffset)\n      );\n      compressedSize = ZIP_CONSTANTS.ZIP64_LIMIT;\n      uncompressedSize = ZIP_CONSTANTS.ZIP64_LIMIT;\n      localHeaderOffset = ZIP_CONSTANTS.ZIP64_LIMIT;\n    }\n\n    return {\n      signature: ZIP_CONSTANTS.CENTRAL_DIRECTORY_SIGNATURE,\n      versionMadeBy: ZIP_CONSTANTS.VERSION_MADE_BY,\n      versionNeeded: needsZip64Format ? ZIP_CONSTANTS.VERSION_NEEDED_EXTRACT_ZIP64 : ZIP_CONSTANTS.VERSION_NEEDED_EXTRACT,\n      flags: ZIP_CONSTANTS.FLAG_DATA_DESCRIPTOR | ZIP_CONSTANTS.FLAG_UTF8,\n      compressionMethod: metadata.compressionMethod === 'store'\n        ? ZIP_CONSTANTS.COMPRESSION_STORE\n        : ZIP_CONSTANTS.COMPRESSION_DEFLATE,\n      lastModTime: time,\n      lastModDate: date,\n      crc32: metadata.crc32,\n      compressedSize,\n      uncompressedSize,\n      filenameLength: filename.length,\n      extraFieldLength: extraField.length,\n      commentLength: comment.length,\n      diskNumber: 0,\n      internalAttributes: 0,\n      externalAttributes: createExternalAttributes(entry.permissions, entry.name.endsWith('/')),\n      localHeaderOffset,\n      filename,\n      extraField,\n      comment\n    };\n  }\n\n  /**\n   * Write data to the output stream\n   */\n  private async writeToOutput(data: Uint8Array): Promise<void> {\n    if (this.outputController) {\n      this.outputController.enqueue(data);\n      this.currentOffset += data.length;\n    }\n  }\n}\n", "/**\n * Direct stream entry for immediate streaming without buffering\n * Used for fast-path entries with pre-calculated metadata\n */\n\nimport { ZipEntry, FastPathStoreEntry, FastPathDeflateEntry } from './zip-format.js';\nimport { CompressionMethod } from './compression.js';\n\nexport enum DirectStreamState {\n  PENDING = 'pending',\n  STREAMING = 'streaming',\n  COMPLETED = 'completed',\n  ERROR = 'error'\n}\n\nexport interface DirectStreamMetadata {\n  crc32: number;\n  compressedSize: number;\n  uncompressedSize: number;\n  localHeaderOffset: number;\n  compressionMethod: CompressionMethod;\n}\n\n/**\n * DirectStreamEntry bypasses buffering for immediate streaming\n * when all required metadata is pre-calculated\n */\nexport class DirectStreamEntry {\n  private state: DirectStreamState = DirectStreamState.PENDING;\n  private streamReader: ReadableStreamDefaultReader<Uint8Array> | null = null;\n  private metadata: DirectStreamMetadata;\n  private error: Error | null = null;\n\n  constructor(\n    public readonly entry: FastPathStoreEntry | FastPathDeflateEntry,\n    public readonly index: number,\n    compressionMethod: CompressionMethod\n  ) {\n    // With the restricted combinations, we have simpler logic:\n    // - STORE writer + STORE entry\n    // - DEFLATE writer + DEFLATE entry\n    \n    if (entry.preCompressed) {\n      // Pre-compressed DEFLATE entry (only allowed with DEFLATE writer)\n      this.metadata = {\n        crc32: entry.crc32,\n        compressedSize: entry.compressedSize!,\n        uncompressedSize: entry.uncompressedSize!,\n        localHeaderOffset: 0,\n        compressionMethod: 'deflate'\n      };\n    } else {\n      // STORE entry (only allowed with STORE writer)\n      const size = entry.size || 0;\n      this.metadata = {\n        crc32: entry.crc32,\n        compressedSize: size,\n        uncompressedSize: size,\n        localHeaderOffset: 0,\n        compressionMethod: 'store'\n      };\n    }\n  }\n\n  /**\n   * Get current state\n   */\n  getState(): DirectStreamState {\n    return this.state;\n  }\n\n  /**\n   * Check if entry is ready for immediate streaming\n   */\n  isReadyForStreaming(): boolean {\n    return this.state === DirectStreamState.PENDING;\n  }\n\n  /**\n   * Check if streaming is complete\n   */\n  isCompleted(): boolean {\n    return this.state === DirectStreamState.COMPLETED;\n  }\n\n  /**\n   * Check if there was an error\n   */\n  hasError(): boolean {\n    return this.state === DirectStreamState.ERROR;\n  }\n\n  /**\n   * Get error if any\n   */\n  getError(): Error | null {\n    return this.error;\n  }\n\n  /**\n   * Get pre-calculated metadata\n   */\n  getMetadata(): DirectStreamMetadata {\n    return { ...this.metadata };\n  }\n\n  /**\n   * Set local header offset (called during writing)\n   */\n  setLocalHeaderOffset(offset: number): void {\n    this.metadata.localHeaderOffset = offset;\n  }\n\n  /**\n   * Start streaming data directly from the source\n   * Returns a readable stream that can be piped directly to output\n   */\n  startDirectStreaming(): ReadableStream<Uint8Array> {\n    if (this.state !== DirectStreamState.PENDING) {\n      throw new Error(`Cannot start streaming entry in state: ${this.state}`);\n    }\n\n    this.state = DirectStreamState.STREAMING;\n\n    // Convert input stream to web stream if needed\n    const inputStream = this.convertToWebStream(this.entry.data);\n    \n    return new ReadableStream({\n      start: (controller) => {\n        this.streamReader = inputStream.getReader();\n        this.pumpStream(controller);\n      },\n      cancel: () => {\n        this.cleanup();\n      }\n    });\n  }\n\n  /**\n   * Mark entry as completed\n   */\n  markCompleted(): void {\n    this.state = DirectStreamState.COMPLETED;\n    this.cleanup();\n  }\n\n  /**\n   * Mark entry as failed\n   */\n  markError(error: Error): void {\n    this.error = error;\n    this.state = DirectStreamState.ERROR;\n    this.cleanup();\n  }\n\n  /**\n   * Pump data from input stream to output controller\n   */\n  private async pumpStream(controller: ReadableStreamDefaultController<Uint8Array>): Promise<void> {\n    try {\n      if (!this.streamReader) {\n        throw new Error('Stream reader not initialized');\n      }\n\n      let bytesRead = 0;\n      const expectedSize = this.metadata.compressedSize;\n\n      while (true) {\n        const { done, value } = await this.streamReader.read();\n        \n        if (done) {\n          break;\n        }\n\n        bytesRead += value.length;\n\n        // Validate we don't exceed expected size\n        if (bytesRead > expectedSize) {\n          throw new Error(`Stream exceeded expected size: ${bytesRead} > ${expectedSize}`);\n        }\n\n        controller.enqueue(value);\n      }\n\n      // Validate we got exactly the expected amount of data\n      if (bytesRead !== expectedSize) {\n        throw new Error(`Stream size mismatch: expected ${expectedSize}, got ${bytesRead}`);\n      }\n\n      controller.close();\n      this.markCompleted();\n    } catch (error) {\n      const err = error instanceof Error ? error : new Error(String(error));\n      controller.error(err);\n      this.markError(err);\n    }\n  }\n\n  /**\n   * Convert Node.js stream or ReadableStream to Web ReadableStream\n   */\n  private convertToWebStream(stream: ReadableStream<Uint8Array> | NodeJS.ReadableStream): ReadableStream<Uint8Array> {\n    // If it's already a Web ReadableStream, return as-is\n    if ('getReader' in stream) {\n      return stream;\n    }\n\n    // Convert Node.js stream to Web ReadableStream\n    const nodeStream = stream as NodeJS.ReadableStream;\n    return new ReadableStream({\n      start(controller) {\n        nodeStream.on('data', (chunk: Buffer) => {\n          controller.enqueue(new Uint8Array(chunk));\n        });\n        \n        nodeStream.on('end', () => {\n          controller.close();\n        });\n        \n        nodeStream.on('error', (err) => {\n          controller.error(err);\n        });\n      }\n    });\n  }\n\n  /**\n   * Clean up resources\n   */\n  private cleanup(): void {\n    if (this.streamReader) {\n      this.streamReader.releaseLock();\n      this.streamReader = null;\n    }\n  }\n}", "/**\n * Core StreamingZipWriter class for creating ZIP files with parallel reading + sequential writing\n */\n\nimport {\n  ZipEntry,\n  FastPathStoreEntry,\n  FastPathDeflateEntry,\n  ZIP_CONSTANTS,\n  EndOfCentralDirectory,\n  Zip64EndOfCentralDirectory,\n  Zip64EndOfCentralDirectoryLocator,\n  needsZip64,\n  canUseFastPath,\n  isFastPathStoreEntry,\n  isFastPathDeflateEntry,\n} from './zip-format.js';\n\nimport {\n  serializeEndOfCentralDirectory,\n  serializeZip64EndOfCentralDirectory,\n  serializeZip64EndOfCentralDirectoryLocator,\n} from './zip-serializer.js';\n\nimport { ParallelReader } from './parallel-reader.js';\nimport { WriteQueue } from './write-queue.js';\nimport { EntryBuffer } from './entry-buffer.js';\nimport { DirectStreamEntry } from './direct-stream-entry.js';\nimport { logger } from './logger.js';\n\nexport interface StreamingZipWriterOptions {\n  compression?: 'store' | 'deflate';\n  level?: number;\n  comment?: string;\n  maxBufferSize?: number;\n  maxConcurrentReads?: number;\n}\n\nexport class StreamingZipWriter {\n  private options: StreamingZipWriterOptions;\n  private parallelReader: ParallelReader;\n  private writeQueue: WriteQueue;\n  private outputController: ReadableStreamDefaultController<Uint8Array> | null = null;\n  private outputStream: ReadableStream<Uint8Array> | null = null;\n  private finalized = false;\n  private writeLoopRunning = false;\n  private writeLoopPromise: Promise<void> | null = null;\n  private fastPathEntries: DirectStreamEntry[] = [];\n\n  constructor(options: StreamingZipWriterOptions = {}) {\n    this.options = {\n      compression: 'deflate', // Default to deflate compression\n      level: 6,\n      maxBufferSize: 1024 * 1024, // 1MB per entry\n      maxConcurrentReads: 10,\n      ...options\n    };\n\n    logger.debug({ options: this.options }, 'StreamingZipWriter initialized');\n\n    this.parallelReader = new ParallelReader({\n      maxBufferSize: this.options.maxBufferSize!,\n      maxConcurrentReads: this.options.maxConcurrentReads!,\n      compression: this.options.compression!\n    });\n\n    this.writeQueue = new WriteQueue({\n      compression: this.options.compression!\n    });\n  }\n\n  /**\n   * Get the output stream for the ZIP file\n   */\n  getOutputStream(): ReadableStream<Uint8Array> {\n    if (this.outputStream) {\n      return this.outputStream;\n    }\n\n    this.outputStream = new ReadableStream({\n      start: (controller) => {\n        this.outputController = controller;\n        this.writeQueue.setOutputController(controller);\n      },\n      cancel: () => {\n        // Handle cancellation\n      }\n    });\n\n    return this.outputStream;\n  }\n\n  /**\n   * Add an entry to the ZIP file with automatic fast-path detection\n   */\n  addEntry(entry: ZipEntry): void {\n    if (this.finalized) {\n      throw new Error('Cannot add entries after finalization');\n    }\n\n    logger.debug({ entryName: entry.name, entrySize: entry.size }, 'Adding entry to ZIP');\n\n    // Check if entry can use fast-path immediate streaming\n    if (canUseFastPath(entry, this.options.compression!)) {\n      logger.debug({ entryName: entry.name }, 'Using fast-path streaming for entry');\n      this.addFastPathEntry(entry as FastPathStoreEntry | FastPathDeflateEntry);\n    } else {\n      logger.debug({ entryName: entry.name }, 'Using buffered path for entry');\n      // Use standard buffered path\n      this.parallelReader.addEntry(entry);\n    }\n\n    // Start the write loop if not already running\n    this.startWriteLoopIfNeeded();\n  }\n\n  /**\n   * Add a fast-path entry for immediate streaming\n   */\n  addFastPathEntry(entry: FastPathStoreEntry | FastPathDeflateEntry): void {\n    if (this.finalized) {\n      throw new Error('Cannot add entries after finalization');\n    }\n\n    logger.debug({ entryName: entry.name, compression: this.options.compression }, 'Adding fast-path entry');\n\n    // Validate entry compatibility\n    const isStoreEntry = isFastPathStoreEntry(entry);\n    const isDeflateEntry = isFastPathDeflateEntry(entry);\n\n    if (this.options.compression === 'store') {\n      // For STORE compression, only allow STORE entries\n      if (!isStoreEntry) {\n        logger.error({ entryName: entry.name, compression: this.options.compression }, 'Invalid fast-path entry for STORE compression');\n        throw new Error('Invalid fast-path entry for STORE compression: only STORE entries are allowed');\n      }\n    } else if (this.options.compression === 'deflate') {\n      // For DEFLATE compression, only allow pre-compressed DEFLATE entries\n      if (!isDeflateEntry) {\n        logger.error({ entryName: entry.name, compression: this.options.compression }, 'Invalid fast-path entry for DEFLATE compression');\n        throw new Error('Invalid fast-path entry for DEFLATE compression: only pre-compressed DEFLATE entries are allowed');\n      }\n    }\n\n    const index = this.parallelReader.getEntryBuffers().length + this.fastPathEntries.length;\n    const directEntry = new DirectStreamEntry(entry, index, this.options.compression!);\n    this.fastPathEntries.push(directEntry);\n\n    logger.debug({ entryName: entry.name, index }, 'Fast-path entry added successfully');\n\n    // Start the write loop if not already running\n    this.startWriteLoopIfNeeded();\n  }\n\n  /**\n   * Finalize the ZIP file (no more entries can be added)\n   */\n  async finalize(): Promise<void> {\n    if (this.finalized) {\n      return;\n    }\n\n    logger.debug('Starting ZIP finalization');\n    this.finalized = true;\n\n    try {\n      logger.debug('Waiting for all parallel reads to complete');\n      // Wait for all reading to complete\n      await this.parallelReader.waitForAllComplete();\n\n      logger.debug('Waiting for write loop to finish');\n      // Wait for write loop to finish\n      if (this.writeLoopPromise) {\n        await this.writeLoopPromise;\n      }\n\n      logger.debug('Writing central directory');\n      // Write central directory\n      const { centralDirOffset, centralDirSize } = await this.writeQueue.writeCentralDirectory();\n\n      logger.debug({ centralDirOffset, centralDirSize }, 'Writing end of central directory');\n      // Write end of central directory\n      await this.writeEndOfCentralDirectory(centralDirOffset, centralDirSize);\n\n      logger.debug('Closing output stream');\n      // Close the output stream\n      if (this.outputController) {\n        this.outputController.close();\n      }\n\n      logger.info('ZIP file finalization completed successfully');\n    } catch (error) {\n      // @ts-ignore\n      logger.error({ error: error.message, stack: error.stack }, 'Error during ZIP finalization');\n      if (this.outputController) {\n        this.outputController.error(error);\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Start the write loop if not already running\n   */\n  private startWriteLoopIfNeeded(): void {\n    if (this.writeLoopRunning || !this.outputController) {\n      return;\n    }\n\n    logger.debug('Starting write loop');\n    this.writeLoopRunning = true;\n    this.writeLoopPromise = this.runWriteLoop();\n  }\n\n  /**\n   * Main write loop - writes entries as they become ready (both buffered and fast-path)\n   */\n  private async runWriteLoop(): Promise<void> {\n    try {\n      let bufferedIndex = 0;\n      let fastPathIndex = 0;\n\n      while (true) {\n        // Check for next entry to write (maintain order)\n        const totalBuffered = this.parallelReader.getEntryBuffers().length;\n        const totalFastPath = this.fastPathEntries.length;\n        const currentIndex = bufferedIndex + fastPathIndex;\n\n        // Determine if next entry should be buffered or fast-path based on original order\n        let nextEntry: EntryBuffer | null = null;\n        let nextFastPath: DirectStreamEntry | null = null;\n\n        // Check what type of entry should be next based on the indices\n        if (bufferedIndex < totalBuffered && fastPathIndex < totalFastPath) {\n          // Both types available - need to determine order\n          const bufferedEntry = this.parallelReader.getEntryBuffer(bufferedIndex);\n          const fastPathEntry = this.fastPathEntries[fastPathIndex];\n\n          if (bufferedEntry && fastPathEntry && bufferedEntry.index <= fastPathEntry.index) {\n            nextEntry = await this.parallelReader.waitForNextReady();\n            if (nextEntry) {\n              bufferedIndex++;\n            }\n          } else if (fastPathEntry) {\n            nextFastPath = fastPathEntry;\n            fastPathIndex++;\n          }\n        } else if (bufferedIndex < totalBuffered) {\n          // Only buffered entries remaining\n          nextEntry = await this.parallelReader.waitForNextReady();\n          if (nextEntry) {\n            bufferedIndex++;\n          }\n        } else if (fastPathIndex < totalFastPath) {\n          // Only fast-path entries remaining\n          const fastPathEntry = this.fastPathEntries[fastPathIndex];\n          if (fastPathEntry) {\n            nextFastPath = fastPathEntry;\n            fastPathIndex++;\n          }\n        }\n\n        // Process the next entry\n        if (nextEntry) {\n          logger.debug({ entryName: nextEntry.entry.name, index: nextEntry.index }, 'Writing buffered entry');\n          await this.writeQueue.writeEntry(nextEntry);\n        } else if (nextFastPath) {\n          logger.debug({ entryName: nextFastPath.entry.name, index: nextFastPath.index }, 'Writing fast-path entry');\n          await this.writeQueue.writeDirectStreamEntry(nextFastPath);\n        } else {\n          // Check if we're done\n          if (this.finalized &&\n            bufferedIndex >= totalBuffered &&\n            fastPathIndex >= totalFastPath &&\n            !this.parallelReader.hasActiveReads()) {\n            break;\n          }\n          // Wait a bit before checking again\n          await new Promise(resolve => setTimeout(resolve, 10));\n          continue;\n        }\n      }\n    } catch (error) {\n      // @ts-ignore\n      logger.error({ error: error.message, stack: error.stack }, 'Error in write loop');\n      if (this.outputController) {\n        this.outputController.error(error);\n      }\n      throw error;\n    } finally {\n      logger.debug('Write loop finished');\n      this.writeLoopRunning = false;\n    }\n  }\n\n  /**\n   * Write the end of central directory records\n   */\n  private async writeEndOfCentralDirectory(\n    centralDirOffset: number,\n    centralDirSize: number\n  ): Promise<void> {\n    const entryCount = this.writeQueue.getEntryCount();\n    const currentOffset = this.writeQueue.getCurrentOffset();\n\n    const needsZip64Format = needsZip64(\n      0,\n      0,\n      centralDirOffset,\n      centralDirSize,\n      entryCount\n    );\n\n    logger.debug({ needsZip64Format, entryCount, centralDirOffset, centralDirSize }, 'Determining ZIP format');\n\n    if (needsZip64Format) {\n      // Write ZIP64 End of Central Directory\n      const zip64EOCD: Zip64EndOfCentralDirectory = {\n        signature: ZIP_CONSTANTS.ZIP64_END_OF_CENTRAL_DIRECTORY_SIGNATURE,\n        recordSize: BigInt(44), // Size of remaining record\n        versionMadeBy: ZIP_CONSTANTS.VERSION_MADE_BY,\n        versionNeeded: ZIP_CONSTANTS.VERSION_NEEDED_EXTRACT_ZIP64,\n        diskNumber: 0,\n        centralDirDisk: 0,\n        centralDirRecords: BigInt(entryCount),\n        totalRecords: BigInt(entryCount),\n        centralDirSize: BigInt(centralDirSize),\n        centralDirOffset: BigInt(centralDirOffset)\n      };\n\n      const zip64EOCDOffset = currentOffset;\n      logger.debug({ zip64EOCDOffset }, 'Writing ZIP64 End of Central Directory');\n      await this.writeToOutput(serializeZip64EndOfCentralDirectory(zip64EOCD));\n\n      // Write ZIP64 End of Central Directory Locator\n      const zip64Locator: Zip64EndOfCentralDirectoryLocator = {\n        signature: ZIP_CONSTANTS.ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE,\n        zip64EndDisk: 0,\n        zip64EndOffset: BigInt(zip64EOCDOffset),\n        totalDisks: 1\n      };\n\n      logger.debug('Writing ZIP64 End of Central Directory Locator');\n      await this.writeToOutput(serializeZip64EndOfCentralDirectoryLocator(zip64Locator));\n    }\n\n    logger.debug('Writing standard End of Central Directory');\n    // Write standard End of Central Directory (always present)\n    const comment = new TextEncoder().encode(this.options.comment || '');\n    const eocd: EndOfCentralDirectory = {\n      signature: ZIP_CONSTANTS.END_OF_CENTRAL_DIRECTORY_SIGNATURE,\n      diskNumber: 0,\n      centralDirDisk: 0,\n      centralDirRecords: needsZip64Format ? ZIP_CONSTANTS.ZIP64_LIMIT_16 : entryCount,\n      totalRecords: needsZip64Format ? ZIP_CONSTANTS.ZIP64_LIMIT_16 : entryCount,\n      centralDirSize: needsZip64Format ? ZIP_CONSTANTS.ZIP64_LIMIT : centralDirSize,\n      centralDirOffset: needsZip64Format ? ZIP_CONSTANTS.ZIP64_LIMIT : centralDirOffset,\n      commentLength: comment.length,\n      comment\n    };\n\n    await this.writeToOutput(serializeEndOfCentralDirectory(eocd));\n  }\n\n  /**\n   * Write data to the output stream\n   */\n  private async writeToOutput(data: Uint8Array): Promise<void> {\n    if (this.outputController) {\n      this.outputController.enqueue(data);\n    }\n  }\n}\n", "/**\n * Stream utilities for handling Web Streams and Node.js streams\n */\n\n/**\n * Converts a Node.js readable stream to a Web ReadableStream\n */\nexport function nodeStreamToWebStream(nodeStream: NodeJS.ReadableStream): ReadableStream<Uint8Array> {\n  return new ReadableStream<Uint8Array>({\n    start(controller) {\n      nodeStream.on('data', (chunk: Buffer) => {\n        const uint8Array = new Uint8Array(chunk);\n        controller.enqueue(uint8Array);\n      });\n      \n      nodeStream.on('end', () => {\n        controller.close();\n      });\n      \n      nodeStream.on('error', (err) => {\n        controller.error(err);\n      });\n    },\n    \n    cancel() {\n      if ('destroy' in nodeStream && typeof nodeStream.destroy === 'function') {\n        nodeStream.destroy();\n      }\n    }\n  });\n}\n\n/**\n * Creates a PassThrough transform stream that forwards data\n */\nexport function createPassThroughStream(): TransformStream<Uint8Array, Uint8Array> {\n  return new TransformStream({\n    transform(chunk, controller) {\n      controller.enqueue(chunk);\n    }\n  });\n}\n\n/**\n * Creates a transform stream that counts bytes\n */\nexport function createByteCounterStream(): {\n  stream: TransformStream<Uint8Array, Uint8Array>;\n  getByteCount: () => number;\n} {\n  let byteCount = 0;\n  \n  const stream = new TransformStream({\n    transform(chunk, controller) {\n      byteCount += chunk.length;\n      controller.enqueue(chunk);\n    }\n  });\n  \n  return {\n    stream,\n    getByteCount: () => byteCount\n  };\n}\n\n/**\n * Reads all data from a stream into a Uint8Array\n */\nexport async function streamToUint8Array(stream: ReadableStream<Uint8Array>): Promise<Uint8Array> {\n  const reader = stream.getReader();\n  const chunks: Uint8Array[] = [];\n  let totalLength = 0;\n  \n  try {\n    while (true) {\n      const { done, value } = await reader.read();\n      if (done) break;\n      chunks.push(value);\n      totalLength += value.length;\n    }\n  } finally {\n    reader.releaseLock();\n  }\n  \n  const result = new Uint8Array(totalLength);\n  let offset = 0;\n  for (const chunk of chunks) {\n    result.set(chunk, offset);\n    offset += chunk.length;\n  }\n  \n  return result;\n}\n\n/**\n * Creates a readable stream from a Uint8Array\n */\nexport function uint8ArrayToStream(data: Uint8Array): ReadableStream<Uint8Array> {\n  return new ReadableStream({\n    start(controller) {\n      controller.enqueue(data);\n      controller.close();\n    }\n  });\n}\n\n/**\n * Tees a readable stream into multiple streams\n */\nexport function teeStream<T>(stream: ReadableStream<T>, count: number): ReadableStream<T>[] {\n  if (count <= 1) return [stream];\n  \n  const streams: ReadableStream<T>[] = [];\n  const reader = stream.getReader();\n  const controllers: ReadableStreamDefaultController<T>[] = [];\n  \n  for (let i = 0; i < count; i++) {\n    streams.push(new ReadableStream({\n      start(controller) {\n        controllers.push(controller);\n      }\n    }));\n  }\n  \n  // Pump data to all controllers\n  const pump = async () => {\n    try {\n      while (true) {\n        const { done, value } = await reader.read();\n        if (done) {\n          controllers.forEach(controller => controller.close());\n          break;\n        }\n        controllers.forEach(controller => controller.enqueue(value));\n      }\n    } catch (error) {\n      controllers.forEach(controller => controller.error(error));\n    }\n  };\n  \n  pump();\n  \n  return streams;\n}\n\n/**\n * Creates a writable stream that collects all written data\n */\nexport function createCollectorStream(): {\n  writable: WritableStream<Uint8Array>;\n  getData: () => Uint8Array;\n} {\n  const chunks: Uint8Array[] = [];\n  let totalLength = 0;\n  \n  const writable = new WritableStream({\n    write(chunk) {\n      chunks.push(chunk);\n      totalLength += chunk.length;\n    }\n  });\n  \n  const getData = (): Uint8Array => {\n    const result = new Uint8Array(totalLength);\n    let offset = 0;\n    for (const chunk of chunks) {\n      result.set(chunk, offset);\n      offset += chunk.length;\n    }\n    return result;\n  };\n  \n  return { writable, getData };\n}\n\n/**\n * Pipes a readable stream to a writable stream with error handling\n */\nexport async function pipeStreamWithErrorHandling<T>(\n  readable: ReadableStream<T>,\n  writable: WritableStream<T>\n): Promise<void> {\n  const reader = readable.getReader();\n  const writer = writable.getWriter();\n  \n  try {\n    while (true) {\n      const { done, value } = await reader.read();\n      if (done) break;\n      await writer.write(value);\n    }\n  } finally {\n    reader.releaseLock();\n    writer.releaseLock();\n  }\n}"],
  "mappings": "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",
  "names": ["crc32", "crc32"]
}
