@standardagents/sip 0.13.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/probe.ts","../src/decoders/simple.ts","../src/wasm/loader.ts","../src/wasm/decoder.ts","../src/wasm/encoder.ts","../src/wasm/png-decoder.ts","../src/encoder.ts","../src/resize.ts","../src/streaming.ts","../src/pipeline.ts","../src/index.ts"],"names":["require","wasmModule","module","DEFAULT_OPTIONS","process"],"mappings":"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","file":"index.js","sourcesContent":["import type { ImageFormat, ProbeResult } from './types';\n\n/**\n * Magic bytes for format detection\n */\nconst MAGIC = {\n // JPEG: FFD8FF\n JPEG: [0xff, 0xd8, 0xff],\n // PNG: 89504E47 0D0A1A0A\n PNG: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a],\n // WebP: RIFF....WEBP\n RIFF: [0x52, 0x49, 0x46, 0x46], // \"RIFF\"\n WEBP: [0x57, 0x45, 0x42, 0x50], // \"WEBP\"\n // AVIF: ....ftypavif or ....ftypavis\n FTYP: [0x66, 0x74, 0x79, 0x70], // \"ftyp\"\n};\n\n/**\n * Detect image format from magic bytes\n */\nfunction detectFormat(data: Uint8Array): ImageFormat {\n if (data.length < 12) return 'unknown';\n\n // Check JPEG\n if (\n data[0] === MAGIC.JPEG[0] &&\n data[1] === MAGIC.JPEG[1] &&\n data[2] === MAGIC.JPEG[2]\n ) {\n return 'jpeg';\n }\n\n // Check PNG\n if (\n data[0] === MAGIC.PNG[0] &&\n data[1] === MAGIC.PNG[1] &&\n data[2] === MAGIC.PNG[2] &&\n data[3] === MAGIC.PNG[3] &&\n data[4] === MAGIC.PNG[4] &&\n data[5] === MAGIC.PNG[5] &&\n data[6] === MAGIC.PNG[6] &&\n data[7] === MAGIC.PNG[7]\n ) {\n return 'png';\n }\n\n // Check WebP (RIFF....WEBP)\n if (\n data[0] === MAGIC.RIFF[0] &&\n data[1] === MAGIC.RIFF[1] &&\n data[2] === MAGIC.RIFF[2] &&\n data[3] === MAGIC.RIFF[3] &&\n data[8] === MAGIC.WEBP[0] &&\n data[9] === MAGIC.WEBP[1] &&\n data[10] === MAGIC.WEBP[2] &&\n data[11] === MAGIC.WEBP[3]\n ) {\n return 'webp';\n }\n\n // Check AVIF (....ftypavif, ....ftypmif1, ....ftypavis, etc.)\n if (\n data[4] === MAGIC.FTYP[0] &&\n data[5] === MAGIC.FTYP[1] &&\n data[6] === MAGIC.FTYP[2] &&\n data[7] === MAGIC.FTYP[3]\n ) {\n // Check for AVIF-related brands\n const brand = String.fromCharCode(data[8], data[9], data[10], data[11]);\n if (brand === 'avif' || brand === 'avis' || brand === 'mif1' || brand === 'msf1') {\n return 'avif';\n }\n }\n\n return 'unknown';\n}\n\n/**\n * Read JPEG dimensions from SOF marker\n * JPEG structure: FFD8 (SOI) followed by segments\n * We need to find SOF0 (FFC0), SOF1 (FFC1), or SOF2 (FFC2)\n */\nfunction probeJpeg(data: Uint8Array): { width: number; height: number } | null {\n let offset = 2; // Skip FFD8\n\n while (offset < data.length - 1) {\n // Each marker starts with FF\n if (data[offset] !== 0xff) {\n offset++;\n continue;\n }\n\n // Skip padding FF bytes\n while (offset < data.length && data[offset] === 0xff) {\n offset++;\n }\n\n if (offset >= data.length) break;\n\n const marker = data[offset++];\n\n // SOF markers (Start of Frame) - various types\n // FFC0-FFC3, FFC5-FFC7, FFC9-FFCB, FFCD-FFCF\n const isSOF =\n (marker >= 0xc0 && marker <= 0xc3) ||\n (marker >= 0xc5 && marker <= 0xc7) ||\n (marker >= 0xc9 && marker <= 0xcb) ||\n (marker >= 0xcd && marker <= 0xcf);\n\n if (isSOF) {\n if (offset + 7 > data.length) return null;\n // SOF structure: length(2) + precision(1) + height(2) + width(2)\n const height = (data[offset + 3] << 8) | data[offset + 4];\n const width = (data[offset + 5] << 8) | data[offset + 6];\n return { width, height };\n }\n\n // Skip to next segment\n // Most markers have a length field (except RST, SOI, EOI)\n if (marker === 0xd8 || marker === 0xd9 || (marker >= 0xd0 && marker <= 0xd7)) {\n // SOI, EOI, RST markers have no length\n continue;\n }\n\n if (offset + 1 >= data.length) break;\n const segmentLength = (data[offset] << 8) | data[offset + 1];\n offset += segmentLength;\n }\n\n return null;\n}\n\n/**\n * Read PNG dimensions from IHDR chunk\n * PNG structure: 8-byte signature, then chunks (length + type + data + CRC)\n * IHDR is always the first chunk: width(4) + height(4) + ...\n */\nfunction probePng(data: Uint8Array): { width: number; height: number; hasAlpha: boolean } | null {\n if (data.length < 24) return null;\n\n // Skip 8-byte signature, read first chunk (IHDR)\n // Chunk structure: length(4) + type(4) + data + crc(4)\n const chunkType = String.fromCharCode(data[12], data[13], data[14], data[15]);\n if (chunkType !== 'IHDR') return null;\n\n // IHDR data starts at offset 16\n const width =\n (data[16] << 24) | (data[17] << 16) | (data[18] << 8) | data[19];\n const height =\n (data[20] << 24) | (data[21] << 16) | (data[22] << 8) | data[23];\n\n // Color type is at offset 24 (after width + height)\n // 4 = grayscale + alpha, 6 = RGBA\n const colorType = data[25];\n const hasAlpha = colorType === 4 || colorType === 6;\n\n return { width, height, hasAlpha };\n}\n\n/**\n * Read WebP dimensions\n * WebP has multiple formats: VP8 (lossy), VP8L (lossless), VP8X (extended)\n */\nfunction probeWebp(data: Uint8Array): { width: number; height: number; hasAlpha: boolean } | null {\n if (data.length < 30) return null;\n\n // After RIFF header (12 bytes), check chunk type\n const chunkType = String.fromCharCode(data[12], data[13], data[14], data[15]);\n\n if (chunkType === 'VP8 ') {\n // Lossy WebP\n // VP8 bitstream starts at offset 20 (after chunk size)\n // Frame tag at offset 23: 3 bytes\n if (data.length < 30) return null;\n // Check for VP8 frame tag (0x9D 0x01 0x2A for keyframe)\n if (data[23] !== 0x9d || data[24] !== 0x01 || data[25] !== 0x2a) return null;\n // Width and height are 14-bit values\n const width = (data[26] | (data[27] << 8)) & 0x3fff;\n const height = (data[28] | (data[29] << 8)) & 0x3fff;\n return { width, height, hasAlpha: false };\n }\n\n if (chunkType === 'VP8L') {\n // Lossless WebP\n // Signature byte at offset 20 should be 0x2f\n if (data[20] !== 0x2f) return null;\n // Width and height encoded in next 4 bytes\n const bits = data[21] | (data[22] << 8) | (data[23] << 16) | (data[24] << 24);\n const width = (bits & 0x3fff) + 1;\n const height = ((bits >> 14) & 0x3fff) + 1;\n const hasAlpha = ((bits >> 28) & 1) === 1;\n return { width, height, hasAlpha };\n }\n\n if (chunkType === 'VP8X') {\n // Extended WebP format\n // Flags at offset 20\n const flags = data[20];\n const hasAlpha = (flags & 0x10) !== 0;\n // Width at offset 24 (24-bit, little-endian, +1)\n const width = (data[24] | (data[25] << 8) | (data[26] << 16)) + 1;\n // Height at offset 27 (24-bit, little-endian, +1)\n const height = (data[27] | (data[28] << 8) | (data[29] << 16)) + 1;\n return { width, height, hasAlpha };\n }\n\n return null;\n}\n\n/**\n * Read AVIF dimensions from HEIF/ISOBMFF structure\n * This is complex - AVIF uses HEIF container (ISO Base Media File Format)\n */\nfunction probeAvif(data: Uint8Array): { width: number; height: number } | null {\n // AVIF parsing is complex (ISOBMFF boxes)\n // For now, we'll look for the ispe (image spatial extents) box\n // which contains width and height\n\n let offset = 0;\n while (offset + 8 <= data.length) {\n // Box structure: size(4) + type(4) + data\n const size =\n (data[offset] << 24) |\n (data[offset + 1] << 16) |\n (data[offset + 2] << 8) |\n data[offset + 3];\n const type = String.fromCharCode(\n data[offset + 4],\n data[offset + 5],\n data[offset + 6],\n data[offset + 7]\n );\n\n if (size === 0) break; // Box extends to end of file\n if (size < 8) break; // Invalid box\n\n // Look for ispe box (can be nested in meta > iprp > ipco)\n if (type === 'ispe' && offset + 20 <= data.length) {\n // ispe: version(1) + flags(3) + width(4) + height(4)\n const width =\n (data[offset + 12] << 24) |\n (data[offset + 13] << 16) |\n (data[offset + 14] << 8) |\n data[offset + 15];\n const height =\n (data[offset + 16] << 24) |\n (data[offset + 17] << 16) |\n (data[offset + 18] << 8) |\n data[offset + 19];\n if (width > 0 && height > 0) {\n return { width, height };\n }\n }\n\n // Container boxes that we should descend into\n if (type === 'meta' || type === 'iprp' || type === 'ipco') {\n // For meta, skip 4 bytes (version + flags)\n const headerSize = type === 'meta' ? 12 : 8;\n offset += headerSize;\n continue;\n }\n\n offset += size;\n }\n\n return null;\n}\n\n/**\n * Probe an image to get format and dimensions\n * Only reads the header bytes - very memory efficient\n *\n * @param input - Image data as ArrayBuffer or Uint8Array\n * @returns ProbeResult with format, dimensions, and alpha info\n */\nexport function probe(input: ArrayBuffer | Uint8Array): ProbeResult {\n const data = input instanceof ArrayBuffer ? new Uint8Array(input) : input;\n\n const format = detectFormat(data);\n\n let result: { width: number; height: number; hasAlpha?: boolean } | null = null;\n\n switch (format) {\n case 'jpeg':\n result = probeJpeg(data);\n break;\n case 'png':\n result = probePng(data);\n break;\n case 'webp':\n result = probeWebp(data);\n break;\n case 'avif':\n result = probeAvif(data);\n break;\n }\n\n if (!result) {\n return {\n format: 'unknown',\n width: 0,\n height: 0,\n hasAlpha: false,\n };\n }\n\n return {\n format,\n width: result.width,\n height: result.height,\n hasAlpha: result.hasAlpha ?? false,\n };\n}\n\n/**\n * Detect just the format (faster if you don't need dimensions)\n */\nexport function detectImageFormat(input: ArrayBuffer | Uint8Array): ImageFormat {\n const data = input instanceof ArrayBuffer ? new Uint8Array(input) : input;\n return detectFormat(data);\n}\n","import type { ImageFormat, Scanline } from '../types';\nimport type { Decoder } from './types';\n\n/**\n * Check if running in Node.js environment\n */\nfunction isNode(): boolean {\n return typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n}\n\n/**\n * Initialize a @jsquash codec for Node.js by loading its WASM module\n */\nasync function initCodecForNode(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n initFn: (module: WebAssembly.Module) => Promise<any>,\n wasmPath: string\n): Promise<void> {\n // Dynamic import for Node.js modules\n const { readFile } = await import('fs/promises');\n const { createRequire } = await import('module');\n const require = createRequire(import.meta.url);\n\n // Resolve the WASM file path from the package\n const resolvedPath = require.resolve(wasmPath);\n const wasmBuffer = await readFile(resolvedPath);\n const wasmModule = await WebAssembly.compile(wasmBuffer);\n await initFn(wasmModule);\n}\n\n/**\n * Simple decoder for WebP and AVIF formats\n *\n * This decoder handles formats that don't have native WASM support yet.\n * For JPEG and PNG, use the native WASM decoders which are more memory efficient.\n *\n * Works with:\n * - WebP via external @jsquash/webp\n * - AVIF via external @jsquash/avif\n *\n * Supports both Node.js and browser/Workers environments.\n */\nexport class SimpleDecoder implements Decoder {\n readonly format: ImageFormat;\n readonly supportsScanline = false;\n readonly supportsScaledDecode = false;\n\n private data: ArrayBuffer;\n private width = 0;\n private height = 0;\n private hasAlpha = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private decodeFn: ((data: ArrayBuffer) => Promise<any>) | null = null;\n\n constructor(format: ImageFormat, data: ArrayBuffer) {\n this.format = format;\n this.data = data;\n }\n\n async init(data: ArrayBuffer): Promise<{ width: number; height: number; hasAlpha: boolean }> {\n this.data = data;\n\n // Get decoder function based on format\n // In Node.js, we need to manually initialize the WASM modules\n // The init function is on the submodule (e.g. @jsquash/webp/decode.js)\n // Note: JPEG and PNG use native WASM decoders, not this fallback\n switch (this.format) {\n case 'avif': {\n const { default: decode, init } = await import('@jsquash/avif/decode.js');\n if (isNode()) {\n await initCodecForNode(init, '@jsquash/avif/codec/dec/avif_dec.wasm');\n }\n this.decodeFn = decode;\n this.hasAlpha = true; // AVIF may have alpha\n break;\n }\n case 'webp': {\n const { default: decode, init } = await import('@jsquash/webp/decode.js');\n if (isNode()) {\n await initCodecForNode(init, '@jsquash/webp/codec/dec/webp_dec.wasm');\n }\n this.decodeFn = decode;\n this.hasAlpha = true; // WebP may have alpha\n break;\n }\n case 'jpeg':\n case 'png':\n throw new Error(\n `${this.format.toUpperCase()} requires native WASM decoder. ` +\n 'Build the WASM module with `pnpm build:wasm` in packages/sip.'\n );\n default:\n throw new Error(`Unsupported format for SimpleDecoder: ${this.format}`);\n }\n\n // Decode to get dimensions (unfortunately this decodes the whole thing)\n // For a more efficient probe, use the probe() function first\n const imageData = await this.decodeFn(this.data);\n if (!imageData) {\n throw new Error(`Failed to decode ${this.format} image`);\n }\n this.width = imageData.width;\n this.height = imageData.height;\n\n return {\n width: this.width,\n height: this.height,\n hasAlpha: this.hasAlpha,\n };\n }\n\n async decode(_scaleFactor?: number): Promise<{\n pixels: Uint8Array;\n width: number;\n height: number;\n }> {\n if (!this.decodeFn) {\n throw new Error('Decoder not initialized. Call init() first.');\n }\n\n // Decode the image\n const imageData = await this.decodeFn(this.data);\n this.width = imageData.width;\n this.height = imageData.height;\n\n // Convert RGBA to RGB\n const rgba = new Uint8Array(imageData.data.buffer);\n const rgb = new Uint8Array(this.width * this.height * 3);\n\n let srcIdx = 0;\n let dstIdx = 0;\n const pixelCount = this.width * this.height;\n\n for (let i = 0; i < pixelCount; i++) {\n rgb[dstIdx++] = rgba[srcIdx++]; // R\n rgb[dstIdx++] = rgba[srcIdx++]; // G\n rgb[dstIdx++] = rgba[srcIdx++]; // B\n srcIdx++; // Skip A\n }\n\n return {\n pixels: rgb,\n width: this.width,\n height: this.height,\n };\n }\n\n dispose(): void {\n // Clean up references\n this.decodeFn = null;\n }\n}\n\n/**\n * Create a decoder for the given format\n */\nexport async function createDecoder(\n format: ImageFormat,\n data: ArrayBuffer\n): Promise<Decoder> {\n const decoder = new SimpleDecoder(format, data);\n await decoder.init(data);\n return decoder;\n}\n","/**\n * WASM Module Loader\n *\n * Loads the SIP WASM module with proper initialization.\n * Works in both browser and Cloudflare Workers environments.\n *\n * For Cloudflare Workers, use initWithWasmModule() in the Durable Object\n * constructor, passing the statically imported WASM module.\n */\n\nimport type { SipWasmModule } from './types';\n\nlet wasmModule: SipWasmModule | null = null;\nlet wasmPromise: Promise<SipWasmModule> | null = null;\nlet precompiledWasmModule: WebAssembly.Module | null = null;\n\n/**\n * Check if WASM module is available\n */\nexport function isWasmAvailable(): boolean {\n return wasmModule !== null;\n}\n\n/**\n * Initialize with a pre-compiled WebAssembly.Module\n *\n * For Cloudflare Workers, import the WASM file statically and pass it here.\n * This allows workerd to pre-compile the WASM at bundle time.\n *\n * @example\n * ```typescript\n * import sipWasm from '@standardagents/sip/dist/sip.wasm';\n * import { initWithWasmModule } from '@standardagents/sip';\n *\n * // At module top level or in DO constructor\n * await initWithWasmModule(sipWasm);\n * ```\n */\nexport async function initWithWasmModule(compiledModule?: WebAssembly.Module): Promise<void> {\n if (wasmModule) {\n return; // Already initialized\n }\n\n // Store the pre-compiled module for use in instantiateWasm callback\n if (compiledModule) {\n precompiledWasmModule = compiledModule;\n }\n\n await loadWasm();\n}\n\n/**\n * Get the WASM module, throwing if not loaded\n */\nexport function getWasmModule(): SipWasmModule {\n if (!wasmModule) {\n throw new Error('WASM module not loaded. Call loadWasm() first.');\n }\n return wasmModule;\n}\n\n/**\n * Load the WASM module\n *\n * This function is idempotent - calling it multiple times returns the same module.\n */\nexport async function loadWasm(): Promise<SipWasmModule> {\n // Return cached module if already loaded\n if (wasmModule) {\n return wasmModule;\n }\n\n // Return existing promise if loading in progress\n if (wasmPromise) {\n return wasmPromise;\n }\n\n wasmPromise = doLoadWasm();\n\n try {\n wasmModule = await wasmPromise;\n return wasmModule;\n } catch (err) {\n wasmPromise = null;\n throw err;\n }\n}\n\n/**\n * Internal function to load the WASM module\n */\nasync function doLoadWasm(): Promise<SipWasmModule> {\n // Check for externally provided loader first\n if (typeof globalThis !== 'undefined' && (globalThis as any).__SIP_WASM_LOADER__) {\n const loader = (globalThis as any).__SIP_WASM_LOADER__;\n return await loader();\n }\n\n // Try to dynamically import the Emscripten glue code\n try {\n // @ts-ignore - Dynamic import of built WASM module\n const createSipModule = (await import('./sip.js')).default;\n\n // If we have a pre-compiled module, use instantiateWasm callback\n if (precompiledWasmModule) {\n const module = await new Promise<SipWasmModule>((resolve, reject) => {\n let resolvedModule: SipWasmModule | null = null;\n\n createSipModule({\n instantiateWasm: (\n imports: WebAssembly.Imports,\n receiveInstance: (instance: WebAssembly.Instance) => void\n ) => {\n // Use WebAssembly.instantiate with the pre-compiled module\n WebAssembly.instantiate(precompiledWasmModule!, imports)\n .then((instance) => {\n receiveInstance(instance);\n })\n .catch((err) => {\n reject(err);\n });\n\n // Return empty exports - Emscripten will get them from receiveInstance\n return {};\n },\n onRuntimeInitialized: () => {\n // Runtime is now fully initialized, HEAPU8 should be available\n if (resolvedModule && resolvedModule.HEAPU8) {\n resolve(resolvedModule);\n }\n },\n }).then((mod: SipWasmModule) => {\n resolvedModule = mod;\n // If HEAPU8 is already available, resolve immediately\n if (mod.HEAPU8) {\n resolve(mod);\n }\n // Otherwise, wait for onRuntimeInitialized\n }).catch(reject);\n });\n\n return module;\n }\n\n // Standard loading (browser environment)\n const module = await createSipModule();\n return module as SipWasmModule;\n } catch (err) {\n throw new Error(\n 'SIP WASM module not available. ' +\n 'To use streaming processing, build the WASM module with `pnpm build:wasm` in packages/sip. ' +\n 'Error: ' + (err instanceof Error ? err.message : String(err))\n );\n }\n}\n\n/**\n * Copy data to WASM memory\n */\nexport function copyToWasm(module: SipWasmModule, data: Uint8Array): number {\n const ptr = module._malloc(data.length);\n if (!ptr) {\n throw new Error('Failed to allocate WASM memory');\n }\n module.HEAPU8.set(data, ptr);\n return ptr;\n}\n\n/**\n * Copy data from WASM memory\n */\nexport function copyFromWasm(module: SipWasmModule, ptr: number, size: number): Uint8Array {\n return new Uint8Array(module.HEAPU8.buffer, ptr, size).slice();\n}\n","/**\n * WASM JPEG Decoder with Scaled DCT Support\n *\n * Memory-efficient JPEG decoding using libjpeg-turbo's scaled DCT feature.\n * Decodes at 1/2, 1/4, or 1/8 scale directly during decompression.\n */\n\nimport type { Scanline } from '../types';\nimport type { SipWasmModule, DctScaleDenom } from './types';\nimport { getWasmModule, copyToWasm } from './loader';\n\n/**\n * WASM-based JPEG decoder with scaled DCT support\n */\nexport class WasmJpegDecoder {\n private module: SipWasmModule;\n private decoder: number = 0;\n private dataPtr: number = 0;\n private width: number = 0;\n private height: number = 0;\n private outputWidth: number = 0;\n private outputHeight: number = 0;\n private scaleDenom: DctScaleDenom = 1;\n private rowBufferPtr: number = 0;\n private started: boolean = false;\n private finished: boolean = false;\n\n constructor() {\n this.module = getWasmModule();\n }\n\n /**\n * Initialize decoder with JPEG data\n */\n init(data: ArrayBuffer | Uint8Array): {\n width: number;\n height: number;\n } {\n const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\n\n // Create decoder\n this.decoder = this.module._sip_decoder_create();\n if (!this.decoder) {\n throw new Error('Failed to create JPEG decoder');\n }\n\n // Copy data to WASM memory\n this.dataPtr = copyToWasm(this.module, bytes);\n\n // Set source\n if (this.module._sip_decoder_set_source(this.decoder, this.dataPtr, bytes.length) !== 0) {\n this.dispose();\n throw new Error('Failed to set decoder source');\n }\n\n // Read header\n if (this.module._sip_decoder_read_header(this.decoder) !== 0) {\n this.dispose();\n throw new Error('Failed to read JPEG header');\n }\n\n this.width = this.module._sip_decoder_get_width(this.decoder);\n this.height = this.module._sip_decoder_get_height(this.decoder);\n this.outputWidth = this.width;\n this.outputHeight = this.height;\n\n return { width: this.width, height: this.height };\n }\n\n /**\n * Get original image dimensions\n */\n getDimensions(): { width: number; height: number } {\n return { width: this.width, height: this.height };\n }\n\n /**\n * Set DCT scale factor for decoding\n *\n * Must be called after init() and before start()\n *\n * @param scaleDenom - Scale denominator: 1, 2, 4, or 8\n * 1 = full size (default)\n * 2 = 1/2 size\n * 4 = 1/4 size\n * 8 = 1/8 size\n */\n setScale(scaleDenom: DctScaleDenom): { width: number; height: number } {\n if (!this.decoder) {\n throw new Error('Decoder not initialized');\n }\n if (this.started) {\n throw new Error('Cannot change scale after decoding started');\n }\n\n if (this.module._sip_decoder_set_scale(this.decoder, scaleDenom) !== 0) {\n throw new Error(`Invalid scale denominator: ${scaleDenom}`);\n }\n\n this.scaleDenom = scaleDenom;\n this.outputWidth = this.module._sip_decoder_get_output_width(this.decoder);\n this.outputHeight = this.module._sip_decoder_get_output_height(this.decoder);\n\n return { width: this.outputWidth, height: this.outputHeight };\n }\n\n /**\n * Get output dimensions (after any scaling)\n */\n getOutputDimensions(): { width: number; height: number } {\n return { width: this.outputWidth, height: this.outputHeight };\n }\n\n /**\n * Start decoding\n */\n start(): void {\n if (!this.decoder) {\n throw new Error('Decoder not initialized');\n }\n if (this.started) {\n throw new Error('Decoding already started');\n }\n\n if (this.module._sip_decoder_start(this.decoder) !== 0) {\n throw new Error('Failed to start decompression');\n }\n\n this.rowBufferPtr = this.module._sip_decoder_get_row_buffer(this.decoder);\n if (!this.rowBufferPtr) {\n throw new Error('Failed to get row buffer');\n }\n\n this.started = true;\n }\n\n /**\n * Read next scanline\n *\n * @returns Scanline object or null if no more scanlines\n */\n readScanline(): Scanline | null {\n if (!this.started || this.finished) {\n return null;\n }\n\n const result = this.module._sip_decoder_read_scanline(this.decoder);\n\n if (result === 0) {\n // Done\n this.finished = true;\n return null;\n }\n\n if (result < 0) {\n throw new Error('Failed to read scanline');\n }\n\n // Get scanline number (1-indexed in libjpeg, but we want 0-indexed)\n const y = this.module._sip_decoder_get_scanline(this.decoder) - 1;\n\n // Copy scanline data\n const rowSize = this.outputWidth * 3;\n const data = new Uint8Array(\n this.module.HEAPU8.buffer,\n this.rowBufferPtr,\n rowSize\n ).slice();\n\n return {\n data,\n width: this.outputWidth,\n y,\n };\n }\n\n /**\n * Read all remaining scanlines\n *\n * @yields Scanline objects\n */\n *readAllScanlines(): Generator<Scanline> {\n let scanline: Scanline | null;\n while ((scanline = this.readScanline()) !== null) {\n yield scanline;\n }\n }\n\n /**\n * Decode entire image to RGB buffer\n *\n * @returns Full RGB pixel buffer\n */\n decodeAll(): { pixels: Uint8Array; width: number; height: number } {\n if (!this.started) {\n this.start();\n }\n\n const pixels = new Uint8Array(this.outputWidth * this.outputHeight * 3);\n const rowSize = this.outputWidth * 3;\n\n for (const scanline of this.readAllScanlines()) {\n pixels.set(scanline.data, scanline.y * rowSize);\n }\n\n return {\n pixels,\n width: this.outputWidth,\n height: this.outputHeight,\n };\n }\n\n /**\n * Clean up resources\n */\n dispose(): void {\n if (this.decoder) {\n this.module._sip_decoder_destroy(this.decoder);\n this.decoder = 0;\n }\n\n if (this.dataPtr) {\n this.module._free(this.dataPtr);\n this.dataPtr = 0;\n }\n\n this.started = false;\n this.finished = false;\n this.rowBufferPtr = 0;\n }\n}\n\n/**\n * Calculate optimal DCT scale factor for a target size\n *\n * Returns the largest scale factor that keeps the output >= target size.\n *\n * @param srcWidth - Original image width\n * @param srcHeight - Original image height\n * @param targetWidth - Desired output width\n * @param targetHeight - Desired output height\n */\nexport function calculateOptimalScale(\n srcWidth: number,\n srcHeight: number,\n targetWidth: number,\n targetHeight: number\n): DctScaleDenom {\n const scales: DctScaleDenom[] = [8, 4, 2, 1];\n\n for (const scale of scales) {\n // JPEG DCT scaling rounds up: ceil(dimension / scale)\n const scaledWidth = Math.ceil(srcWidth / scale);\n const scaledHeight = Math.ceil(srcHeight / scale);\n\n if (scaledWidth >= targetWidth && scaledHeight >= targetHeight) {\n return scale;\n }\n }\n\n return 1;\n}\n","/**\n * WASM JPEG Encoder with Scanline Streaming\n *\n * Memory-efficient JPEG encoding that processes one scanline at a time.\n */\n\nimport type { Scanline } from '../types';\nimport type { SipWasmModule } from './types';\nimport { getWasmModule, copyFromWasm } from './loader';\n\n/**\n * WASM-based JPEG encoder with scanline streaming\n */\nexport class WasmJpegEncoder {\n private module: SipWasmModule;\n private encoder: number = 0;\n private width: number = 0;\n private height: number = 0;\n private quality: number = 85;\n private rowBufferPtr: number = 0;\n private started: boolean = false;\n private finished: boolean = false;\n private currentLine: number = 0;\n\n constructor() {\n this.module = getWasmModule();\n }\n\n /**\n * Initialize encoder with output dimensions and quality\n *\n * @param width - Output image width\n * @param height - Output image height\n * @param quality - JPEG quality (1-100, default 85)\n */\n init(width: number, height: number, quality: number = 85): void {\n this.width = width;\n this.height = height;\n this.quality = Math.max(1, Math.min(100, quality));\n\n // Create encoder\n this.encoder = this.module._sip_encoder_create();\n if (!this.encoder) {\n throw new Error('Failed to create JPEG encoder');\n }\n\n // Initialize with dimensions and quality\n if (this.module._sip_encoder_init(this.encoder, width, height, this.quality) !== 0) {\n this.dispose();\n throw new Error('Failed to initialize encoder');\n }\n }\n\n /**\n * Start encoding\n */\n start(): void {\n if (!this.encoder) {\n throw new Error('Encoder not initialized');\n }\n if (this.started) {\n throw new Error('Encoding already started');\n }\n\n if (this.module._sip_encoder_start(this.encoder) !== 0) {\n throw new Error('Failed to start compression');\n }\n\n this.rowBufferPtr = this.module._sip_encoder_get_row_buffer(this.encoder);\n if (!this.rowBufferPtr) {\n throw new Error('Failed to get row buffer');\n }\n\n this.started = true;\n this.currentLine = 0;\n }\n\n /**\n * Write a scanline to the encoder\n *\n * @param scanline - Scanline with RGB data\n */\n writeScanline(scanline: Scanline): void {\n this.writeScanlineData(scanline.data);\n }\n\n /**\n * Write raw RGB data as a scanline\n *\n * @param data - RGB data (width * 3 bytes)\n */\n writeScanlineData(data: Uint8Array): void {\n if (!this.started || this.finished) {\n throw new Error('Encoder not ready for writing');\n }\n\n if (this.currentLine >= this.height) {\n throw new Error('All scanlines already written');\n }\n\n const expectedSize = this.width * 3;\n if (data.length !== expectedSize) {\n throw new Error(`Invalid scanline size: expected ${expectedSize}, got ${data.length}`);\n }\n\n // Copy data to WASM row buffer\n this.module.HEAPU8.set(data, this.rowBufferPtr);\n\n // Write the scanline\n if (this.module._sip_encoder_write_scanline(this.encoder) !== 1) {\n throw new Error('Failed to write scanline');\n }\n\n this.currentLine++;\n }\n\n /**\n * Get current scanline number\n */\n getCurrentLine(): number {\n return this.currentLine;\n }\n\n /**\n * Finish encoding and get output\n *\n * @returns JPEG data as ArrayBuffer\n */\n finish(): ArrayBuffer {\n if (!this.started) {\n throw new Error('Encoding not started');\n }\n\n if (this.currentLine !== this.height) {\n throw new Error(`Incomplete image: wrote ${this.currentLine}/${this.height} scanlines`);\n }\n\n if (this.module._sip_encoder_finish(this.encoder) !== 0) {\n throw new Error('Failed to finish encoding');\n }\n\n this.finished = true;\n\n // Get output data\n const outputPtr = this.module._sip_encoder_get_output(this.encoder);\n const outputSize = this.module._sip_encoder_get_output_size(this.encoder);\n\n if (!outputPtr || !outputSize) {\n throw new Error('No output data');\n }\n\n // Copy output to new buffer\n const output = copyFromWasm(this.module, outputPtr, outputSize);\n return output.buffer as ArrayBuffer;\n }\n\n /**\n * Encode a full RGB buffer to JPEG\n *\n * @param pixels - RGB pixel data (width * height * 3 bytes)\n * @returns JPEG data as ArrayBuffer\n */\n encodeAll(pixels: Uint8Array): ArrayBuffer {\n if (pixels.length !== this.width * this.height * 3) {\n throw new Error(`Invalid pixel data size: expected ${this.width * this.height * 3}, got ${pixels.length}`);\n }\n\n this.start();\n\n const rowSize = this.width * 3;\n for (let y = 0; y < this.height; y++) {\n const rowData = pixels.subarray(y * rowSize, (y + 1) * rowSize);\n this.writeScanlineData(rowData);\n }\n\n return this.finish();\n }\n\n /**\n * Clean up resources\n */\n dispose(): void {\n if (this.encoder) {\n this.module._sip_encoder_destroy(this.encoder);\n this.encoder = 0;\n }\n\n this.started = false;\n this.finished = false;\n this.rowBufferPtr = 0;\n this.currentLine = 0;\n }\n}\n","/**\n * WASM PNG Decoder with Row-by-Row Processing\n *\n * Memory-efficient PNG decoding using libspng's progressive API.\n * Decodes one row at a time to minimize memory usage.\n */\n\nimport type { Scanline } from '../types';\nimport type { SipWasmModule } from './types';\nimport { getWasmModule, copyToWasm } from './loader';\n\n/**\n * WASM-based PNG decoder with row-by-row decoding\n */\nexport class WasmPngDecoder {\n private module: SipWasmModule;\n private decoder: number = 0;\n private dataPtr: number = 0;\n private width: number = 0;\n private height: number = 0;\n private hasAlpha: boolean = false;\n private rowBufferPtr: number = 0;\n private started: boolean = false;\n private finished: boolean = false;\n private currentRow: number = 0;\n\n constructor() {\n this.module = getWasmModule();\n }\n\n /**\n * Initialize decoder with PNG data\n */\n init(data: ArrayBuffer | Uint8Array): {\n width: number;\n height: number;\n hasAlpha: boolean;\n } {\n const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\n\n // Create decoder\n this.decoder = this.module._sip_png_decoder_create();\n if (!this.decoder) {\n throw new Error('Failed to create PNG decoder');\n }\n\n // Copy data to WASM memory\n this.dataPtr = copyToWasm(this.module, bytes);\n\n // Set source\n if (this.module._sip_png_decoder_set_source(this.decoder, this.dataPtr, bytes.length) !== 0) {\n this.dispose();\n throw new Error('Failed to set PNG decoder source');\n }\n\n // Read header\n if (this.module._sip_png_decoder_read_header(this.decoder) !== 0) {\n this.dispose();\n throw new Error('Failed to read PNG header');\n }\n\n this.width = this.module._sip_png_decoder_get_width(this.decoder);\n this.height = this.module._sip_png_decoder_get_height(this.decoder);\n this.hasAlpha = this.module._sip_png_decoder_has_alpha(this.decoder) !== 0;\n\n return { width: this.width, height: this.height, hasAlpha: this.hasAlpha };\n }\n\n /**\n * Get image dimensions\n */\n getDimensions(): { width: number; height: number } {\n return { width: this.width, height: this.height };\n }\n\n /**\n * Check if image has alpha channel\n */\n getHasAlpha(): boolean {\n return this.hasAlpha;\n }\n\n /**\n * Start decoding\n */\n start(): void {\n if (!this.decoder) {\n throw new Error('Decoder not initialized');\n }\n if (this.started) {\n throw new Error('Decoding already started');\n }\n\n if (this.module._sip_png_decoder_start(this.decoder) !== 0) {\n throw new Error('Failed to start PNG decompression');\n }\n\n this.rowBufferPtr = this.module._sip_png_decoder_get_row_buffer(this.decoder);\n if (!this.rowBufferPtr) {\n throw new Error('Failed to get row buffer');\n }\n\n this.started = true;\n this.currentRow = 0;\n }\n\n /**\n * Read next scanline\n *\n * @returns Scanline object or null if no more scanlines\n */\n readScanline(): Scanline | null {\n if (!this.started || this.finished) {\n return null;\n }\n\n if (this.currentRow >= this.height) {\n this.finished = true;\n return null;\n }\n\n const result = this.module._sip_png_decoder_read_row(this.decoder);\n\n if (result < 0) {\n throw new Error('Failed to read PNG row');\n }\n\n // Copy scanline data (RGB = 3 bytes per pixel)\n const rowSize = this.width * 3;\n const data = new Uint8Array(\n this.module.HEAPU8.buffer,\n this.rowBufferPtr,\n rowSize\n ).slice();\n\n const y = this.currentRow;\n this.currentRow++;\n\n // Check if done after reading this row\n if (result === 0 || this.currentRow >= this.height) {\n this.finished = true;\n }\n\n return {\n data,\n width: this.width,\n y,\n };\n }\n\n /**\n * Read all remaining scanlines\n *\n * @yields Scanline objects\n */\n *readAllScanlines(): Generator<Scanline> {\n let scanline: Scanline | null;\n while ((scanline = this.readScanline()) !== null) {\n yield scanline;\n }\n }\n\n /**\n * Decode entire image to RGB buffer\n *\n * @returns Full RGB pixel buffer\n */\n decodeAll(): { pixels: Uint8Array; width: number; height: number } {\n if (!this.started) {\n this.start();\n }\n\n const pixels = new Uint8Array(this.width * this.height * 3);\n const rowSize = this.width * 3;\n\n for (const scanline of this.readAllScanlines()) {\n pixels.set(scanline.data, scanline.y * rowSize);\n }\n\n return {\n pixels,\n width: this.width,\n height: this.height,\n };\n }\n\n /**\n * Clean up resources\n */\n dispose(): void {\n if (this.decoder) {\n this.module._sip_png_decoder_destroy(this.decoder);\n this.decoder = 0;\n }\n\n if (this.dataPtr) {\n this.module._free(this.dataPtr);\n this.dataPtr = 0;\n }\n\n this.started = false;\n this.finished = false;\n this.rowBufferPtr = 0;\n this.currentRow = 0;\n }\n}\n","import type { Encoder } from './decoders/types';\nimport { loadWasm, WasmJpegEncoder } from './wasm';\n\n/**\n * JPEG encoder using native WASM (libjpeg-turbo)\n *\n * This encoder uses the native WASM module for efficient JPEG encoding.\n * It supports both full-buffer and scanline-by-scanline encoding.\n */\nexport class NativeEncoder implements Encoder {\n readonly supportsScanline = true;\n\n private width = 0;\n private height = 0;\n private quality = 85;\n private wasmEncoder: WasmJpegEncoder | null = null;\n\n async init(width: number, height: number, quality: number): Promise<void> {\n this.width = width;\n this.height = height;\n this.quality = quality;\n\n // Ensure WASM is loaded\n await loadWasm();\n\n // Create encoder\n this.wasmEncoder = new WasmJpegEncoder();\n this.wasmEncoder.init(width, height, quality);\n }\n\n async encode(pixels: Uint8Array): Promise<ArrayBuffer> {\n if (!this.wasmEncoder) {\n throw new Error('Encoder not initialized. Call init() first.');\n }\n\n return this.wasmEncoder.encodeAll(pixels);\n }\n\n dispose(): void {\n if (this.wasmEncoder) {\n this.wasmEncoder.dispose();\n this.wasmEncoder = null;\n }\n }\n}\n\n/**\n * Create a JPEG encoder\n *\n * Uses native WASM (libjpeg-turbo) for efficient encoding.\n * The WASM module must be built before use.\n */\nexport async function createEncoder(\n width: number,\n height: number,\n quality: number\n): Promise<Encoder> {\n const encoder = new NativeEncoder();\n await encoder.init(width, height, quality);\n return encoder;\n}\n","import type { ResizeState, Scanline } from './types';\n\n/**\n * Create a resize state for scanline-based bilinear interpolation\n *\n * This implements memory-efficient resizing that only needs 2 source rows\n * in memory at any time, regardless of image size.\n */\nexport function createResizeState(\n srcWidth: number,\n srcHeight: number,\n dstWidth: number,\n dstHeight: number\n): ResizeState {\n return {\n srcWidth,\n srcHeight,\n dstWidth,\n dstHeight,\n bufferA: null,\n bufferB: null,\n bufferAY: -1,\n bufferBY: -1,\n currentOutputY: 0,\n };\n}\n\n/**\n * Horizontally resize a single scanline using bilinear interpolation\n *\n * @param src - Source scanline (RGB, 3 bytes per pixel)\n * @param srcWidth - Source width\n * @param dstWidth - Destination width\n * @returns Resized scanline\n */\nfunction resizeRowHorizontal(\n src: Uint8Array,\n srcWidth: number,\n dstWidth: number\n): Uint8Array {\n const dst = new Uint8Array(dstWidth * 3);\n const xScale = srcWidth / dstWidth;\n\n for (let dstX = 0; dstX < dstWidth; dstX++) {\n // Map destination X to source X\n const srcXFloat = dstX * xScale;\n const srcX0 = Math.floor(srcXFloat);\n const srcX1 = Math.min(srcX0 + 1, srcWidth - 1);\n const t = srcXFloat - srcX0;\n const invT = 1 - t;\n\n // Source pixel offsets\n const src0 = srcX0 * 3;\n const src1 = srcX1 * 3;\n const dstOffset = dstX * 3;\n\n // Bilinear interpolation for RGB\n dst[dstOffset] = Math.round(src[src0] * invT + src[src1] * t);\n dst[dstOffset + 1] = Math.round(src[src0 + 1] * invT + src[src1 + 1] * t);\n dst[dstOffset + 2] = Math.round(src[src0 + 2] * invT + src[src1 + 2] * t);\n }\n\n return dst;\n}\n\n/**\n * Blend two horizontally-resized rows vertically\n *\n * @param rowA - First row (already horizontally resized)\n * @param rowB - Second row (already horizontally resized)\n * @param t - Blend factor (0 = all rowA, 1 = all rowB)\n * @param width - Width in pixels\n * @returns Blended row\n */\nfunction blendRows(\n rowA: Uint8Array,\n rowB: Uint8Array,\n t: number,\n width: number\n): Uint8Array {\n const result = new Uint8Array(width * 3);\n const invT = 1 - t;\n\n for (let i = 0; i < width * 3; i++) {\n result[i] = Math.round(rowA[i] * invT + rowB[i] * t);\n }\n\n return result;\n}\n\n/**\n * Process a source scanline and potentially output resized scanlines\n *\n * This is the core of the streaming resize algorithm. Call this for each\n * source scanline in order (y = 0, 1, 2, ...). It will return output\n * scanlines as they become available.\n *\n * Memory usage: Only keeps 2 horizontally-resized rows in memory at a time\n *\n * @param state - Resize state (mutated)\n * @param srcScanline - Source scanline (RGB, 3 bytes per pixel)\n * @param srcY - Source Y position (must be called in order)\n * @returns Array of output scanlines (may be 0, 1, or more)\n */\nexport function processScanline(\n state: ResizeState,\n srcScanline: Uint8Array,\n srcY: number\n): Scanline[] {\n const { srcWidth, srcHeight, dstWidth, dstHeight } = state;\n const yScale = srcHeight / dstHeight;\n const output: Scanline[] = [];\n\n // Horizontally resize this source row\n const resizedRow = resizeRowHorizontal(srcScanline, srcWidth, dstWidth);\n\n // Update buffers - rotate A ← B, B ← new\n state.bufferA = state.bufferB;\n state.bufferAY = state.bufferBY;\n state.bufferB = resizedRow;\n state.bufferBY = srcY;\n\n // Generate output rows that fall within [bufferAY, bufferBY]\n while (state.currentOutputY < dstHeight) {\n const srcYFloat = state.currentOutputY * yScale;\n const srcYFloor = Math.floor(srcYFloat);\n const srcYCeil = Math.min(srcYFloor + 1, srcHeight - 1);\n\n // Can we generate this output row with current buffers?\n if (srcYCeil > srcY) {\n // Need more source rows\n break;\n }\n\n // Handle edge cases at the beginning\n if (state.bufferA === null) {\n // First row - just use bufferB\n output.push({\n data: state.bufferB,\n width: dstWidth,\n y: state.currentOutputY,\n });\n state.currentOutputY++;\n continue;\n }\n\n // Both buffers available - do bilinear blend\n const t = srcYFloat - srcYFloor;\n\n // Determine which buffers to use\n let rowA = state.bufferA;\n let rowB = state.bufferB;\n\n // If srcYFloor matches bufferBY, we need to use bufferB for both\n if (srcYFloor === state.bufferBY) {\n rowA = state.bufferB;\n rowB = state.bufferB;\n } else if (srcYCeil === state.bufferAY) {\n // Edge case: use bufferA for both\n rowA = state.bufferA;\n rowB = state.bufferA;\n }\n\n const blended = blendRows(rowA, rowB, t, dstWidth);\n output.push({\n data: blended,\n width: dstWidth,\n y: state.currentOutputY,\n });\n\n state.currentOutputY++;\n }\n\n return output;\n}\n\n/**\n * Flush any remaining output rows after all source rows have been processed\n *\n * @param state - Resize state\n * @returns Remaining output scanlines\n */\nexport function flushResize(state: ResizeState): Scanline[] {\n const output: Scanline[] = [];\n\n // Generate any remaining rows using the last available buffer\n while (state.currentOutputY < state.dstHeight) {\n if (state.bufferB === null) break;\n\n output.push({\n data: state.bufferB,\n width: state.dstWidth,\n y: state.currentOutputY,\n });\n state.currentOutputY++;\n }\n\n return output;\n}\n\n/**\n * Calculate target dimensions while preserving aspect ratio\n *\n * @param srcWidth - Source width\n * @param srcHeight - Source height\n * @param maxWidth - Maximum target width\n * @param maxHeight - Maximum target height\n * @returns Target dimensions\n */\nexport function calculateTargetDimensions(\n srcWidth: number,\n srcHeight: number,\n maxWidth: number,\n maxHeight: number\n): { width: number; height: number; scale: number } {\n const scaleX = maxWidth / srcWidth;\n const scaleY = maxHeight / srcHeight;\n const scale = Math.min(scaleX, scaleY, 1); // Never upscale\n\n return {\n width: Math.round(srcWidth * scale),\n height: Math.round(srcHeight * scale),\n scale,\n };\n}\n\n/**\n * Calculate optimal JPEG DCT scale factor\n *\n * JPEG can decode at 1/1, 1/2, 1/4, or 1/8 scale using DCT scaling.\n * This dramatically reduces memory usage during decode.\n *\n * @param srcWidth - Source image width\n * @param srcHeight - Source image height\n * @param targetWidth - Desired output width\n * @param targetHeight - Desired output height\n * @returns Scale denominator (1, 2, 4, or 8)\n */\nexport function calculateDctScaleFactor(\n srcWidth: number,\n srcHeight: number,\n targetWidth: number,\n targetHeight: number\n): 1 | 2 | 4 | 8 {\n // We want the smallest DCT scale that still gives us enough pixels\n // to resize down to target dimensions without upscaling\n\n const scales: (1 | 2 | 4 | 8)[] = [8, 4, 2, 1];\n\n for (const scale of scales) {\n const scaledWidth = Math.ceil(srcWidth / scale);\n const scaledHeight = Math.ceil(srcHeight / scale);\n\n // If scaled dimensions are >= target, this scale works\n if (scaledWidth >= targetWidth && scaledHeight >= targetHeight) {\n return scale;\n }\n }\n\n // Fallback to no scaling\n return 1;\n}\n","/**\n * Streaming Image Processing Pipeline\n *\n * Ultra memory-efficient processing that:\n * 1. Decodes JPEG at reduced scale using DCT scaling\n * 2. Resizes using scanline-based bilinear interpolation (2 rows in memory)\n * 3. Encodes to JPEG scanline-by-scanline\n *\n * Peak memory usage is ~50KB regardless of input image size.\n */\n\nimport type { ProcessOptions, ProcessResult, Scanline } from './types';\nimport { probe } from './probe';\nimport {\n loadWasm,\n isWasmAvailable,\n WasmJpegDecoder,\n WasmJpegEncoder,\n WasmPngDecoder,\n calculateOptimalScale,\n} from './wasm';\nimport {\n createResizeState,\n processScanline,\n flushResize,\n calculateTargetDimensions,\n} from './resize';\n\n/**\n * Default options for streaming processing\n */\nconst DEFAULT_OPTIONS: Required<ProcessOptions> = {\n maxWidth: 4096,\n maxHeight: 4096,\n maxBytes: 1.5 * 1024 * 1024,\n quality: 85,\n};\n\n/**\n * Process a JPEG image using streaming pipeline\n *\n * This is the ultra-memory-efficient path that:\n * - Uses DCT scaling to decode at reduced resolution\n * - Processes one scanline at a time\n * - Never holds the full image in memory\n *\n * @param input - JPEG image data\n * @param options - Processing options\n * @returns Processed JPEG result\n */\nexport async function processJpegStreaming(\n input: ArrayBuffer,\n options: ProcessOptions = {}\n): Promise<ProcessResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Ensure WASM is loaded\n await loadWasm();\n\n // Create decoder and read header\n const decoder = new WasmJpegDecoder();\n\n try {\n const { width: srcWidth, height: srcHeight } = decoder.init(input);\n\n // Calculate target dimensions\n const target = calculateTargetDimensions(\n srcWidth,\n srcHeight,\n opts.maxWidth,\n opts.maxHeight\n );\n\n // Calculate optimal DCT scale\n const dctScale = calculateOptimalScale(\n srcWidth,\n srcHeight,\n target.width,\n target.height\n );\n\n // Set scale and get actual decode dimensions\n const { width: decodeWidth, height: decodeHeight } = decoder.setScale(dctScale);\n\n // Create resize state\n const resizeState = createResizeState(\n decodeWidth,\n decodeHeight,\n target.width,\n target.height\n );\n\n // Create encoder\n const encoder = new WasmJpegEncoder();\n encoder.init(target.width, target.height, opts.quality);\n encoder.start();\n\n // Start decoding\n decoder.start();\n\n // Process scanlines\n let decodedLine = 0;\n for (const scanline of decoder.readAllScanlines()) {\n // Process through resize\n const outputScanlines = processScanline(resizeState, scanline.data, decodedLine);\n decodedLine++;\n\n // Write output scanlines to encoder\n for (const outScanline of outputScanlines) {\n encoder.writeScanline(outScanline);\n }\n }\n\n // Flush remaining resize output\n const remaining = flushResize(resizeState);\n for (const outScanline of remaining) {\n encoder.writeScanline(outScanline);\n }\n\n // Finish encoding\n const jpegData = encoder.finish();\n\n // Check size and retry with lower quality if needed\n if (jpegData.byteLength > opts.maxBytes && opts.quality > 45) {\n encoder.dispose();\n decoder.dispose();\n\n // Retry with lower quality\n return processJpegStreaming(input, {\n ...opts,\n quality: opts.quality - 10,\n });\n }\n\n encoder.dispose();\n\n return {\n data: jpegData,\n width: target.width,\n height: target.height,\n mimeType: 'image/jpeg',\n originalFormat: 'jpeg',\n };\n } finally {\n decoder.dispose();\n }\n}\n\n/**\n * Process a PNG image using streaming pipeline\n *\n * Uses libspng for row-by-row decoding:\n * - Decodes one row at a time\n * - Processes through resize\n * - Encodes to JPEG scanline by scanline\n *\n * Note: PNG doesn't support DCT scaling like JPEG, so we decode at full\n * resolution but process row by row to minimize memory usage.\n *\n * @param input - PNG image data\n * @param options - Processing options\n * @returns Processed JPEG result\n */\nexport async function processPngStreaming(\n input: ArrayBuffer,\n options: ProcessOptions = {}\n): Promise<ProcessResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Ensure WASM is loaded\n await loadWasm();\n\n // Create PNG decoder and read header\n const decoder = new WasmPngDecoder();\n\n try {\n const { width: srcWidth, height: srcHeight } = decoder.init(input);\n\n // Calculate target dimensions\n const target = calculateTargetDimensions(\n srcWidth,\n srcHeight,\n opts.maxWidth,\n opts.maxHeight\n );\n\n // Create resize state (from full resolution to target)\n const resizeState = createResizeState(\n srcWidth,\n srcHeight,\n target.width,\n target.height\n );\n\n // Create JPEG encoder\n const encoder = new WasmJpegEncoder();\n encoder.init(target.width, target.height, opts.quality);\n encoder.start();\n\n // Start decoding\n decoder.start();\n\n // Process scanlines\n let decodedLine = 0;\n for (const scanline of decoder.readAllScanlines()) {\n // Process through resize\n const outputScanlines = processScanline(resizeState, scanline.data, decodedLine);\n decodedLine++;\n\n // Write output scanlines to encoder\n for (const outScanline of outputScanlines) {\n encoder.writeScanline(outScanline);\n }\n }\n\n // Flush remaining resize output\n const remaining = flushResize(resizeState);\n for (const outScanline of remaining) {\n encoder.writeScanline(outScanline);\n }\n\n // Finish encoding\n const jpegData = encoder.finish();\n\n // Check size and retry with lower quality if needed\n if (jpegData.byteLength > opts.maxBytes && opts.quality > 45) {\n encoder.dispose();\n decoder.dispose();\n\n // Retry with lower quality\n return processPngStreaming(input, {\n ...opts,\n quality: opts.quality - 10,\n });\n }\n\n encoder.dispose();\n\n return {\n data: jpegData,\n width: target.width,\n height: target.height,\n mimeType: 'image/jpeg',\n originalFormat: 'png',\n };\n } finally {\n decoder.dispose();\n }\n}\n\n/**\n * Check if streaming processing is available\n *\n * Returns false if WASM module is not built/loaded.\n */\nexport function isStreamingAvailable(): boolean {\n return isWasmAvailable();\n}\n\n/**\n * Try to load WASM for streaming processing\n *\n * Call this early to warm up the WASM module.\n */\nexport async function initStreaming(): Promise<boolean> {\n try {\n await loadWasm();\n return true;\n } catch {\n return false;\n }\n}\n","import type { ProcessOptions, ProcessResult, ImageFormat } from './types';\nimport { probe, detectImageFormat } from './probe';\nimport { createDecoder } from './decoders/simple';\nimport { createEncoder } from './encoder';\nimport {\n createResizeState,\n processScanline,\n flushResize,\n calculateTargetDimensions,\n} from './resize';\nimport { processJpegStreaming, processPngStreaming, isStreamingAvailable, initStreaming } from './streaming';\nimport { loadWasm } from './wasm';\n\n/**\n * Default processing options\n */\nconst DEFAULT_OPTIONS: Required<ProcessOptions> = {\n maxWidth: 4096,\n maxHeight: 4096,\n maxBytes: 1.5 * 1024 * 1024, // 1.5MB\n quality: 85,\n};\n\n/**\n * Process an image: decode, resize, and encode to JPEG\n *\n * For JPEG images, uses ultra-memory-efficient streaming pipeline when WASM\n * is available (DCT scaling + scanline processing). Falls back to full-memory\n * decode for other formats or when WASM is not built.\n *\n * @param input - Image data as ArrayBuffer\n * @param options - Processing options\n * @returns Processed image result\n */\nexport async function process(\n input: ArrayBuffer,\n options: ProcessOptions = {}\n): Promise<ProcessResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Probe for format and dimensions\n const probeResult = probe(input);\n if (probeResult.format === 'unknown') {\n throw new Error('Unknown image format');\n }\n\n const { format, width: srcWidth, height: srcHeight } = probeResult;\n\n // JPEG: Use WASM streaming pipeline\n if (format === 'jpeg') {\n return await processJpegStreaming(input, opts);\n }\n\n // PNG: Use WASM streaming pipeline\n if (format === 'png') {\n return await processPngStreaming(input, opts);\n }\n\n // WebP and AVIF use @jsquash decoder + WASM encoder\n // These formats don't have native WASM decoders yet\n // Ensure WASM is loaded for the encoder\n await loadWasm();\n\n // Calculate target dimensions\n const target = calculateTargetDimensions(\n srcWidth,\n srcHeight,\n opts.maxWidth,\n opts.maxHeight\n );\n\n // Decode with @jsquash (full memory decode for WebP/AVIF)\n const decoder = await createDecoder(format, input);\n const { pixels: srcPixels, width: decodedWidth, height: decodedHeight } = await decoder.decode();\n decoder.dispose();\n\n // Resize using scanline method (still more memory efficient than alternatives)\n const resizedPixels = resizePixelBuffer(\n srcPixels,\n decodedWidth,\n decodedHeight,\n target.width,\n target.height\n );\n\n // Encode to JPEG\n let quality = opts.quality;\n let jpegData = await encodeToJpeg(resizedPixels, target.width, target.height, quality);\n\n // If too large, reduce quality and retry\n while (jpegData.byteLength > opts.maxBytes && quality > 45) {\n quality -= 10;\n jpegData = await encodeToJpeg(resizedPixels, target.width, target.height, quality);\n }\n\n // If still too large, resize further\n if (jpegData.byteLength > opts.maxBytes) {\n const scaleFactor = Math.sqrt(opts.maxBytes / jpegData.byteLength) * 0.9; // 10% margin\n const newWidth = Math.round(target.width * scaleFactor);\n const newHeight = Math.round(target.height * scaleFactor);\n\n const smallerPixels = resizePixelBuffer(\n resizedPixels,\n target.width,\n target.height,\n newWidth,\n newHeight\n );\n\n jpegData = await encodeToJpeg(smallerPixels, newWidth, newHeight, quality);\n\n return {\n data: jpegData,\n width: newWidth,\n height: newHeight,\n mimeType: 'image/jpeg',\n originalFormat: format,\n };\n }\n\n return {\n data: jpegData,\n width: target.width,\n height: target.height,\n mimeType: 'image/jpeg',\n originalFormat: format,\n };\n}\n\n/**\n * Resize a full pixel buffer using the scanline method\n *\n * This is more memory efficient than matrix-based resize because it only\n * keeps 2 rows in memory at a time during the resize operation.\n */\nfunction resizePixelBuffer(\n srcPixels: Uint8Array,\n srcWidth: number,\n srcHeight: number,\n dstWidth: number,\n dstHeight: number\n): Uint8Array {\n if (srcWidth === dstWidth && srcHeight === dstHeight) {\n return srcPixels;\n }\n\n const state = createResizeState(srcWidth, srcHeight, dstWidth, dstHeight);\n const outputRows: Uint8Array[] = new Array(dstHeight);\n\n // Process each source row\n const srcRowSize = srcWidth * 3;\n for (let y = 0; y < srcHeight; y++) {\n const srcRow = srcPixels.subarray(y * srcRowSize, (y + 1) * srcRowSize);\n const outputScanlines = processScanline(state, srcRow, y);\n\n for (const scanline of outputScanlines) {\n outputRows[scanline.y] = scanline.data;\n }\n }\n\n // Flush remaining rows\n const remaining = flushResize(state);\n for (const scanline of remaining) {\n outputRows[scanline.y] = scanline.data;\n }\n\n // Combine into single buffer\n const dstRowSize = dstWidth * 3;\n const result = new Uint8Array(dstWidth * dstHeight * 3);\n for (let y = 0; y < dstHeight; y++) {\n if (outputRows[y]) {\n result.set(outputRows[y], y * dstRowSize);\n }\n }\n\n return result;\n}\n\n/**\n * Encode RGB pixels to JPEG\n */\nasync function encodeToJpeg(\n pixels: Uint8Array,\n width: number,\n height: number,\n quality: number\n): Promise<ArrayBuffer> {\n const encoder = await createEncoder(width, height, quality);\n const result = await encoder.encode(pixels);\n encoder.dispose();\n return result;\n}\n\n/**\n * Get information about an image without decoding it\n */\nexport { probe, detectImageFormat };\n","/**\n * @standardagents/sip - Small Image Processor\n *\n * Ultra memory-efficient image processing for Cloudflare Workers.\n *\n * Features:\n * - Format detection without full decode (probe)\n * - Scanline-based bilinear resize (constant memory)\n * - JPEG output with quality control\n * - Support for JPEG, PNG, WebP, AVIF input formats\n *\n * @example\n * ```typescript\n * import { sip } from '@standardagents/sip';\n *\n * // Process an image\n * const result = await sip.process(imageBuffer, {\n * maxWidth: 2048,\n * maxHeight: 2048,\n * maxBytes: 1.5 * 1024 * 1024,\n * quality: 85,\n * });\n *\n * // result.data: ArrayBuffer (JPEG)\n * // result.width, result.height: output dimensions\n * // result.mimeType: 'image/jpeg'\n *\n * // Just probe for info\n * const info = sip.probe(imageBuffer);\n * // info.format: 'jpeg' | 'png' | 'webp' | 'avif'\n * // info.width, info.height: original dimensions\n * ```\n */\n\nexport * from './types';\nexport { probe, detectImageFormat } from './probe';\nexport { process } from './pipeline';\nexport {\n createResizeState,\n processScanline,\n flushResize,\n calculateTargetDimensions,\n calculateDctScaleFactor,\n} from './resize';\nexport {\n processJpegStreaming,\n isStreamingAvailable,\n initStreaming,\n} from './streaming';\n\n// WASM module exports (for advanced usage)\nexport * from './wasm';\n\n// Convenience namespace\nimport { process } from './pipeline';\nimport { probe, detectImageFormat } from './probe';\nimport { initStreaming, isStreamingAvailable } from './streaming';\n\nexport const sip = {\n process,\n probe,\n detectImageFormat,\n initStreaming,\n isStreamingAvailable,\n};\n"]}
1
+ {"version":3,"sources":["../src/decoders/simple.ts","../src/probe.ts","../src/input.ts","../src/resize.ts","../src/wasm/loader.ts","../src/wasm/decoder.ts","../src/wasm/encoder.ts","../src/wasm/png-decoder.ts","../src/api.ts"],"names":["wasmModule","require","decode","copy","merged","isCloudflareWorker","module","isNode","decoder","bytes"],"mappings":"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","file":"index.js","sourcesContent":["import type { ImageFormat, Scanline } from '../types';\nimport type { Decoder } from './types';\n\ntype CodecWasmBinary = ArrayBuffer | Uint8Array | WebAssembly.Module;\n\n/**\n * Detect Cloudflare Workers/workerd runtime even when node compat is enabled.\n */\nfunction isCloudflareWorker(): boolean {\n const cacheStorage = (globalThis as { caches?: CacheStorage & { default?: Cache } }).caches;\n return typeof cacheStorage !== 'undefined' && typeof cacheStorage.default !== 'undefined';\n}\n\nfunction getPreloadedCodecBinary(format: 'avif' | 'webp'): CodecWasmBinary | null {\n const globalValue = (globalThis as Record<string, unknown>).__SIP_CODEC_WASM__;\n if (!globalValue || typeof globalValue !== 'object') {\n return null;\n }\n\n const formatValue = (globalValue as Record<string, unknown>)[format];\n if (\n formatValue instanceof ArrayBuffer ||\n formatValue instanceof Uint8Array ||\n formatValue instanceof WebAssembly.Module\n ) {\n return formatValue;\n }\n\n return null;\n}\n\n/**\n * Check if running in Node.js environment\n */\nfunction isNode(): boolean {\n if (isCloudflareWorker()) {\n return false;\n }\n\n return typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n}\n\nasync function initCodecWithBinary(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n initFn: (module: WebAssembly.Module) => Promise<any>,\n wasmSource: CodecWasmBinary\n): Promise<void> {\n if (wasmSource instanceof WebAssembly.Module) {\n await initFn(wasmSource);\n return;\n }\n\n let buffer: ArrayBuffer;\n\n if (wasmSource instanceof Uint8Array) {\n const copy = new Uint8Array(wasmSource.byteLength);\n copy.set(wasmSource);\n buffer = copy.buffer;\n } else {\n buffer = wasmSource;\n }\n\n const wasmModule = await WebAssembly.compile(buffer);\n await initFn(wasmModule);\n}\n\n/**\n * Initialize a @jsquash codec for Node.js by loading its WASM module\n */\nasync function initCodecForNode(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n initFn: (module: WebAssembly.Module) => Promise<any>,\n wasmPath: string\n): Promise<void> {\n // Dynamic import for Node.js modules\n const { readFile } = await import('fs/promises');\n const { createRequire } = await import('module');\n const require = createRequire(import.meta.url);\n\n // Resolve the WASM file path from the package\n const resolvedPath = require.resolve(wasmPath);\n const wasmBuffer = await readFile(resolvedPath);\n const wasmModule = await WebAssembly.compile(wasmBuffer);\n await initFn(wasmModule);\n}\n\n/**\n * Simple decoder for WebP and AVIF formats\n *\n * This decoder handles formats that don't have native WASM support yet.\n * For JPEG and PNG, use the native WASM decoders which are more memory efficient.\n *\n * Works with:\n * - WebP via external @jsquash/webp\n * - AVIF via external @jsquash/avif\n *\n * Supports both Node.js and browser/Workers environments.\n */\nexport class SimpleDecoder implements Decoder {\n readonly format: ImageFormat;\n readonly supportsScanline = false;\n readonly supportsScaledDecode = false;\n\n private data: ArrayBuffer;\n private width = 0;\n private height = 0;\n private hasAlpha = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private decodeFn: ((data: ArrayBuffer) => Promise<any>) | null = null;\n\n constructor(format: ImageFormat, data: ArrayBuffer) {\n this.format = format;\n this.data = data;\n }\n\n async init(data: ArrayBuffer): Promise<{ width: number; height: number; hasAlpha: boolean }> {\n this.data = data;\n\n // Get decoder function based on format\n // In Node.js, we need to manually initialize the WASM modules\n // The init function is on the submodule (e.g. @jsquash/webp/decode.js)\n // Note: JPEG and PNG use native WASM decoders, not this fallback\n switch (this.format) {\n case 'avif': {\n const { default: decode, init } = await import('@jsquash/avif/decode.js');\n const preloaded = getPreloadedCodecBinary('avif');\n if (preloaded) {\n await initCodecWithBinary(init, preloaded);\n } else if (isNode()) {\n await initCodecForNode(init, '@jsquash/avif/codec/dec/avif_dec.wasm');\n }\n this.decodeFn = decode;\n this.hasAlpha = true; // AVIF may have alpha\n break;\n }\n case 'webp': {\n const { default: decode, init } = await import('@jsquash/webp/decode.js');\n const preloaded = getPreloadedCodecBinary('webp');\n if (preloaded) {\n await initCodecWithBinary(init, preloaded);\n } else if (isNode()) {\n await initCodecForNode(init, '@jsquash/webp/codec/dec/webp_dec.wasm');\n }\n this.decodeFn = decode;\n this.hasAlpha = true; // WebP may have alpha\n break;\n }\n case 'jpeg':\n case 'png':\n throw new Error(\n `${this.format.toUpperCase()} requires native WASM decoder. ` +\n 'Build the WASM module with `pnpm build:wasm` in the @standardagents/sip repo root.'\n );\n default:\n throw new Error(`Unsupported format for SimpleDecoder: ${this.format}`);\n }\n\n // Decode to get dimensions (unfortunately this decodes the whole thing)\n // For a more efficient probe, use the probe() function first\n const imageData = await this.decodeFn(this.data);\n if (!imageData) {\n throw new Error(`Failed to decode ${this.format} image`);\n }\n this.width = imageData.width;\n this.height = imageData.height;\n\n return {\n width: this.width,\n height: this.height,\n hasAlpha: this.hasAlpha,\n };\n }\n\n async decode(_scaleFactor?: number): Promise<{\n pixels: Uint8Array;\n width: number;\n height: number;\n }> {\n if (!this.decodeFn) {\n throw new Error('Decoder not initialized. Call init() first.');\n }\n\n // Decode the image\n const imageData = await this.decodeFn(this.data);\n this.width = imageData.width;\n this.height = imageData.height;\n\n // Convert RGBA to RGB\n const rgba = new Uint8Array(imageData.data.buffer);\n const rgb = new Uint8Array(this.width * this.height * 3);\n\n let srcIdx = 0;\n let dstIdx = 0;\n const pixelCount = this.width * this.height;\n\n for (let i = 0; i < pixelCount; i++) {\n rgb[dstIdx++] = rgba[srcIdx++]; // R\n rgb[dstIdx++] = rgba[srcIdx++]; // G\n rgb[dstIdx++] = rgba[srcIdx++]; // B\n srcIdx++; // Skip A\n }\n\n return {\n pixels: rgb,\n width: this.width,\n height: this.height,\n };\n }\n\n dispose(): void {\n // Clean up references\n this.decodeFn = null;\n }\n}\n\n/**\n * Create a decoder for the given format\n */\nexport async function createDecoder(\n format: ImageFormat,\n data: ArrayBuffer\n): Promise<Decoder> {\n const decoder = new SimpleDecoder(format, data);\n await decoder.init(data);\n return decoder;\n}\n","import type { ImageFormat, ProbeResult } from './types';\n\n/**\n * Magic bytes for format detection\n */\nconst MAGIC = {\n // JPEG: FFD8FF\n JPEG: [0xff, 0xd8, 0xff],\n // PNG: 89504E47 0D0A1A0A\n PNG: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a],\n // WebP: RIFF....WEBP\n RIFF: [0x52, 0x49, 0x46, 0x46], // \"RIFF\"\n WEBP: [0x57, 0x45, 0x42, 0x50], // \"WEBP\"\n // AVIF: ....ftypavif or ....ftypavis\n FTYP: [0x66, 0x74, 0x79, 0x70], // \"ftyp\"\n};\n\n/**\n * Detect image format from magic bytes\n */\nfunction detectFormat(data: Uint8Array): ImageFormat {\n if (data.length < 12) return 'unknown';\n\n // Check JPEG\n if (\n data[0] === MAGIC.JPEG[0] &&\n data[1] === MAGIC.JPEG[1] &&\n data[2] === MAGIC.JPEG[2]\n ) {\n return 'jpeg';\n }\n\n // Check PNG\n if (\n data[0] === MAGIC.PNG[0] &&\n data[1] === MAGIC.PNG[1] &&\n data[2] === MAGIC.PNG[2] &&\n data[3] === MAGIC.PNG[3] &&\n data[4] === MAGIC.PNG[4] &&\n data[5] === MAGIC.PNG[5] &&\n data[6] === MAGIC.PNG[6] &&\n data[7] === MAGIC.PNG[7]\n ) {\n return 'png';\n }\n\n // Check WebP (RIFF....WEBP)\n if (\n data[0] === MAGIC.RIFF[0] &&\n data[1] === MAGIC.RIFF[1] &&\n data[2] === MAGIC.RIFF[2] &&\n data[3] === MAGIC.RIFF[3] &&\n data[8] === MAGIC.WEBP[0] &&\n data[9] === MAGIC.WEBP[1] &&\n data[10] === MAGIC.WEBP[2] &&\n data[11] === MAGIC.WEBP[3]\n ) {\n return 'webp';\n }\n\n // Check AVIF (....ftypavif, ....ftypmif1, ....ftypavis, etc.)\n if (\n data[4] === MAGIC.FTYP[0] &&\n data[5] === MAGIC.FTYP[1] &&\n data[6] === MAGIC.FTYP[2] &&\n data[7] === MAGIC.FTYP[3]\n ) {\n // Check for AVIF-related brands\n const brand = String.fromCharCode(data[8], data[9], data[10], data[11]);\n if (brand === 'avif' || brand === 'avis' || brand === 'mif1' || brand === 'msf1') {\n return 'avif';\n }\n }\n\n return 'unknown';\n}\n\n/**\n * Read JPEG dimensions from SOF marker\n * JPEG structure: FFD8 (SOI) followed by segments\n * We need to find SOF0 (FFC0), SOF1 (FFC1), or SOF2 (FFC2)\n */\nfunction probeJpeg(data: Uint8Array): { width: number; height: number } | null {\n let offset = 2; // Skip FFD8\n\n while (offset < data.length - 1) {\n // Each marker starts with FF\n if (data[offset] !== 0xff) {\n offset++;\n continue;\n }\n\n // Skip padding FF bytes\n while (offset < data.length && data[offset] === 0xff) {\n offset++;\n }\n\n if (offset >= data.length) break;\n\n const marker = data[offset++];\n\n // SOF markers (Start of Frame) - various types\n // FFC0-FFC3, FFC5-FFC7, FFC9-FFCB, FFCD-FFCF\n const isSOF =\n (marker >= 0xc0 && marker <= 0xc3) ||\n (marker >= 0xc5 && marker <= 0xc7) ||\n (marker >= 0xc9 && marker <= 0xcb) ||\n (marker >= 0xcd && marker <= 0xcf);\n\n if (isSOF) {\n if (offset + 7 > data.length) return null;\n // SOF structure: length(2) + precision(1) + height(2) + width(2)\n const height = (data[offset + 3] << 8) | data[offset + 4];\n const width = (data[offset + 5] << 8) | data[offset + 6];\n return { width, height };\n }\n\n // Skip to next segment\n // Most markers have a length field (except RST, SOI, EOI)\n if (marker === 0xd8 || marker === 0xd9 || (marker >= 0xd0 && marker <= 0xd7)) {\n // SOI, EOI, RST markers have no length\n continue;\n }\n\n if (offset + 1 >= data.length) break;\n const segmentLength = (data[offset] << 8) | data[offset + 1];\n offset += segmentLength;\n }\n\n return null;\n}\n\n/**\n * Read PNG dimensions from IHDR chunk\n * PNG structure: 8-byte signature, then chunks (length + type + data + CRC)\n * IHDR is always the first chunk: width(4) + height(4) + ...\n */\nfunction probePng(data: Uint8Array): { width: number; height: number; hasAlpha: boolean } | null {\n if (data.length < 24) return null;\n\n // Skip 8-byte signature, read first chunk (IHDR)\n // Chunk structure: length(4) + type(4) + data + crc(4)\n const chunkType = String.fromCharCode(data[12], data[13], data[14], data[15]);\n if (chunkType !== 'IHDR') return null;\n\n // IHDR data starts at offset 16\n const width =\n (data[16] << 24) | (data[17] << 16) | (data[18] << 8) | data[19];\n const height =\n (data[20] << 24) | (data[21] << 16) | (data[22] << 8) | data[23];\n\n // Color type is at offset 24 (after width + height)\n // 4 = grayscale + alpha, 6 = RGBA\n const colorType = data[25];\n const hasAlpha = colorType === 4 || colorType === 6;\n\n return { width, height, hasAlpha };\n}\n\n/**\n * Read WebP dimensions\n * WebP has multiple formats: VP8 (lossy), VP8L (lossless), VP8X (extended)\n */\nfunction probeWebp(data: Uint8Array): { width: number; height: number; hasAlpha: boolean } | null {\n if (data.length < 30) return null;\n\n // After RIFF header (12 bytes), check chunk type\n const chunkType = String.fromCharCode(data[12], data[13], data[14], data[15]);\n\n if (chunkType === 'VP8 ') {\n // Lossy WebP\n // VP8 bitstream starts at offset 20 (after chunk size)\n // Frame tag at offset 23: 3 bytes\n if (data.length < 30) return null;\n // Check for VP8 frame tag (0x9D 0x01 0x2A for keyframe)\n if (data[23] !== 0x9d || data[24] !== 0x01 || data[25] !== 0x2a) return null;\n // Width and height are 14-bit values\n const width = (data[26] | (data[27] << 8)) & 0x3fff;\n const height = (data[28] | (data[29] << 8)) & 0x3fff;\n return { width, height, hasAlpha: false };\n }\n\n if (chunkType === 'VP8L') {\n // Lossless WebP\n // Signature byte at offset 20 should be 0x2f\n if (data[20] !== 0x2f) return null;\n // Width and height encoded in next 4 bytes\n const bits = data[21] | (data[22] << 8) | (data[23] << 16) | (data[24] << 24);\n const width = (bits & 0x3fff) + 1;\n const height = ((bits >> 14) & 0x3fff) + 1;\n const hasAlpha = ((bits >> 28) & 1) === 1;\n return { width, height, hasAlpha };\n }\n\n if (chunkType === 'VP8X') {\n // Extended WebP format\n // Flags at offset 20\n const flags = data[20];\n const hasAlpha = (flags & 0x10) !== 0;\n // Width at offset 24 (24-bit, little-endian, +1)\n const width = (data[24] | (data[25] << 8) | (data[26] << 16)) + 1;\n // Height at offset 27 (24-bit, little-endian, +1)\n const height = (data[27] | (data[28] << 8) | (data[29] << 16)) + 1;\n return { width, height, hasAlpha };\n }\n\n return null;\n}\n\n/**\n * Read AVIF dimensions from HEIF/ISOBMFF structure\n * This is complex - AVIF uses HEIF container (ISO Base Media File Format)\n */\nfunction probeAvif(data: Uint8Array): { width: number; height: number } | null {\n // AVIF parsing is complex (ISOBMFF boxes)\n // For now, we'll look for the ispe (image spatial extents) box\n // which contains width and height\n\n let offset = 0;\n while (offset + 8 <= data.length) {\n // Box structure: size(4) + type(4) + data\n const size =\n (data[offset] << 24) |\n (data[offset + 1] << 16) |\n (data[offset + 2] << 8) |\n data[offset + 3];\n const type = String.fromCharCode(\n data[offset + 4],\n data[offset + 5],\n data[offset + 6],\n data[offset + 7]\n );\n\n if (size === 0) break; // Box extends to end of file\n if (size < 8) break; // Invalid box\n\n // Look for ispe box (can be nested in meta > iprp > ipco)\n if (type === 'ispe' && offset + 20 <= data.length) {\n // ispe: version(1) + flags(3) + width(4) + height(4)\n const width =\n (data[offset + 12] << 24) |\n (data[offset + 13] << 16) |\n (data[offset + 14] << 8) |\n data[offset + 15];\n const height =\n (data[offset + 16] << 24) |\n (data[offset + 17] << 16) |\n (data[offset + 18] << 8) |\n data[offset + 19];\n if (width > 0 && height > 0) {\n return { width, height };\n }\n }\n\n // Container boxes that we should descend into\n if (type === 'meta' || type === 'iprp' || type === 'ipco') {\n // For meta, skip 4 bytes (version + flags)\n const headerSize = type === 'meta' ? 12 : 8;\n offset += headerSize;\n continue;\n }\n\n offset += size;\n }\n\n return null;\n}\n\n/**\n * Probe an image to get format and dimensions\n * Only reads the header bytes - very memory efficient\n *\n * @param input - Image data as ArrayBuffer or Uint8Array\n * @returns ProbeResult with format, dimensions, and alpha info\n */\nexport function probe(input: ArrayBuffer | Uint8Array): ProbeResult {\n const data = input instanceof ArrayBuffer ? new Uint8Array(input) : input;\n\n const format = detectFormat(data);\n\n let result: { width: number; height: number; hasAlpha?: boolean } | null = null;\n\n switch (format) {\n case 'jpeg':\n result = probeJpeg(data);\n break;\n case 'png':\n result = probePng(data);\n break;\n case 'webp':\n result = probeWebp(data);\n break;\n case 'avif':\n result = probeAvif(data);\n break;\n }\n\n if (!result) {\n return {\n format: 'unknown',\n width: 0,\n height: 0,\n hasAlpha: false,\n };\n }\n\n return {\n format,\n width: result.width,\n height: result.height,\n hasAlpha: result.hasAlpha ?? false,\n };\n}\n\n/**\n * Detect just the format (faster if you don't need dimensions)\n */\nexport function detectImageFormat(input: ArrayBuffer | Uint8Array): ImageFormat {\n const data = input instanceof ArrayBuffer ? new Uint8Array(input) : input;\n return detectFormat(data);\n}\n","import { probe } from './probe';\nimport type { ByteInput, ImageInfo, ImageFormat, InputSource, InspectResult } from './types';\n\nconst INSPECT_TARGETS = [64, 512, 4_096, 16_384, 65_536, 262_144];\nconst STREAM_CHUNK_TARGET = 64 * 1024;\n\ntype PreparedInputSource = InputSource & {\n ensureHeaderBytes(target: number): Promise<Uint8Array>;\n readonly done: boolean;\n};\n\nfunction sliceArrayBuffer(view: Uint8Array): ArrayBuffer {\n const copy = new Uint8Array(view.byteLength);\n copy.set(view);\n return copy.buffer;\n}\n\nfunction concatChunks(chunks: Uint8Array[], total: number): Uint8Array {\n const merged = new Uint8Array(total);\n let offset = 0;\n\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return merged;\n}\n\nfunction normalizeChunk(chunk: Uint8Array): Uint8Array {\n if (chunk.byteOffset === 0 && chunk.byteLength === chunk.buffer.byteLength) {\n const copy = new Uint8Array(chunk.byteLength);\n copy.set(chunk);\n return copy;\n }\n\n const copy = new Uint8Array(chunk.byteLength);\n copy.set(chunk);\n return copy;\n}\n\nasync function* iterateReadableStream(stream: ReadableStream<Uint8Array>): AsyncIterable<Uint8Array> {\n const reader = stream.getReader();\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n\n if (value && value.byteLength > 0) {\n yield normalizeChunk(value);\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nasync function* coalesceAsyncIterable(\n input: AsyncIterable<Uint8Array>,\n target = STREAM_CHUNK_TARGET\n): AsyncIterable<Uint8Array> {\n let pending: Uint8Array[] = [];\n let total = 0;\n\n const flush = () => {\n if (total === 0) {\n return null;\n }\n\n const merged = concatChunks(pending, total);\n pending = [];\n total = 0;\n return merged;\n };\n\n for await (const rawChunk of input) {\n const chunk = normalizeChunk(rawChunk);\n if (chunk.byteLength >= target && total === 0) {\n yield chunk;\n continue;\n }\n\n pending.push(chunk);\n total += chunk.byteLength;\n\n if (total >= target) {\n const merged = flush();\n if (merged) {\n yield merged;\n }\n }\n }\n\n const merged = flush();\n if (merged) {\n yield merged;\n }\n}\n\nfunction getAsyncIterable(input: ReadableStream<Uint8Array> | AsyncIterable<Uint8Array>): AsyncIterable<Uint8Array> {\n if (typeof ReadableStream !== 'undefined' && input instanceof ReadableStream) {\n return coalesceAsyncIterable(iterateReadableStream(input));\n }\n\n if (typeof (input as AsyncIterable<Uint8Array>)[Symbol.asyncIterator] === 'function') {\n return coalesceAsyncIterable(input as AsyncIterable<Uint8Array>);\n }\n\n return coalesceAsyncIterable(input as AsyncIterable<Uint8Array>);\n}\n\nclass BytesInputSource implements PreparedInputSource {\n readonly kind = 'bytes' as const;\n readonly replayable = true;\n readonly byteLength: number;\n readonly formatHint?: ImageFormat;\n readonly headerBytes: Uint8Array;\n readonly done = true;\n\n constructor(private readonly bytes: Uint8Array, formatHint?: ImageFormat) {\n this.byteLength = bytes.byteLength;\n this.headerBytes = bytes.subarray(0, Math.min(bytes.byteLength, INSPECT_TARGETS.at(-1)!));\n this.formatHint = formatHint;\n }\n\n async ensureHeaderBytes(target: number): Promise<Uint8Array> {\n return this.bytes.subarray(0, Math.min(this.bytes.byteLength, target));\n }\n\n open(): AsyncIterable<Uint8Array> {\n const bytes = this.bytes;\n return (async function* openBytes() {\n yield bytes;\n })();\n }\n}\n\nclass StreamInputSource implements PreparedInputSource {\n readonly kind = 'stream' as const;\n readonly replayable = false;\n readonly byteLength?: number;\n readonly formatHint?: ImageFormat;\n\n private readonly iterator: AsyncIterator<Uint8Array>;\n private peekedChunks: Uint8Array[] = [];\n private peekedBytes = 0;\n private opened = false;\n private exhausted = false;\n headerBytes: Uint8Array<ArrayBufferLike> = new Uint8Array(0);\n\n constructor(input: AsyncIterable<Uint8Array>, formatHint?: ImageFormat, byteLength?: number) {\n this.iterator = input[Symbol.asyncIterator]();\n this.formatHint = formatHint;\n this.byteLength = byteLength;\n }\n\n get done(): boolean {\n return this.exhausted;\n }\n\n async ensureHeaderBytes(target: number): Promise<Uint8Array> {\n while (!this.exhausted && this.peekedBytes < target) {\n const { value, done } = await this.iterator.next();\n if (done) {\n this.exhausted = true;\n break;\n }\n\n if (value && value.byteLength > 0) {\n const chunk = normalizeChunk(value);\n this.peekedChunks.push(chunk);\n this.peekedBytes += chunk.byteLength;\n }\n }\n\n this.headerBytes = concatChunks(this.peekedChunks, this.peekedBytes) as Uint8Array;\n return this.headerBytes;\n }\n\n open(): AsyncIterable<Uint8Array> {\n if (this.opened) {\n throw new Error('Input source can only be opened once');\n }\n\n this.opened = true;\n const replay = this.peekedChunks.slice();\n const iterator = this.iterator;\n\n return (async function* openStream() {\n for (const chunk of replay) {\n yield chunk;\n }\n\n while (true) {\n const { value, done } = await iterator.next();\n if (done) {\n return;\n }\n\n if (value && value.byteLength > 0) {\n yield normalizeChunk(value);\n }\n }\n })();\n }\n}\n\nfunction isInputSource(value: ByteInput | InputSource): value is PreparedInputSource {\n return typeof value === 'object' && value !== null && 'open' in value && 'headerBytes' in value;\n}\n\nfunction toUint8Array(input: ArrayBuffer | Uint8Array): Uint8Array {\n return input instanceof Uint8Array ? normalizeChunk(input) : new Uint8Array(input);\n}\n\nasync function sourceFromRequestLike(input: Request | Response): Promise<PreparedInputSource> {\n const contentType = input.headers.get('content-type') ?? '';\n const hint = contentType.startsWith('image/') ? (contentType.slice('image/'.length) as ImageFormat) : undefined;\n const lengthHeader = input.headers.get('content-length');\n const byteLength = lengthHeader ? Number(lengthHeader) : undefined;\n\n if (input.body) {\n return new StreamInputSource(getAsyncIterable(input.body as ReadableStream<Uint8Array>), hint, Number.isFinite(byteLength) ? byteLength : undefined);\n }\n\n const bytes = new Uint8Array(await input.arrayBuffer());\n return new BytesInputSource(bytes, hint);\n}\n\nexport async function prepareInputSource(input: ByteInput | InputSource): Promise<PreparedInputSource> {\n if (isInputSource(input)) {\n return input;\n }\n\n if (input instanceof ArrayBuffer || input instanceof Uint8Array) {\n return new BytesInputSource(toUint8Array(input));\n }\n\n if (typeof Blob !== 'undefined' && input instanceof Blob) {\n return new BytesInputSource(new Uint8Array(await input.arrayBuffer()));\n }\n\n if (typeof Request !== 'undefined' && input instanceof Request) {\n return sourceFromRequestLike(input);\n }\n\n if (typeof Response !== 'undefined' && input instanceof Response) {\n return sourceFromRequestLike(input);\n }\n\n if (typeof ReadableStream !== 'undefined' && input instanceof ReadableStream) {\n return new StreamInputSource(getAsyncIterable(input));\n }\n\n return new StreamInputSource(getAsyncIterable(input as AsyncIterable<Uint8Array>));\n}\n\nexport async function inspect(input: ByteInput): Promise<InspectResult> {\n const source = await prepareInputSource(input);\n const info = await inspectSource(source);\n\n if (info.format === 'unknown') {\n throw new Error('Unsupported image format');\n }\n\n return { info, source };\n}\n\nexport async function inspectSource(source: PreparedInputSource): Promise<ImageInfo> {\n let best = probe(source.headerBytes);\n if (best.format !== 'unknown') {\n return best;\n }\n\n for (const target of INSPECT_TARGETS) {\n const bytes = await source.ensureHeaderBytes(target);\n best = probe(bytes);\n if (best.format !== 'unknown') {\n return best;\n }\n }\n\n if (source.headerBytes.byteLength === 0) {\n return { format: 'unknown', width: 0, height: 0, hasAlpha: false };\n }\n\n return probe(source.headerBytes);\n}\n\nexport async function collectSourceBytes(source: InputSource): Promise<Uint8Array> {\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n for await (const chunk of source.open()) {\n chunks.push(chunk);\n total += chunk.byteLength;\n }\n\n return concatChunks(chunks, total);\n}\n\nexport function asArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n return sliceArrayBuffer(bytes);\n}\n","import type { ResizeState, Scanline } from './types';\n\n/**\n * Create a resize state for scanline-based bilinear interpolation\n *\n * This implements memory-efficient resizing that only needs 2 source rows\n * in memory at any time, regardless of image size.\n */\nexport function createResizeState(\n srcWidth: number,\n srcHeight: number,\n dstWidth: number,\n dstHeight: number\n): ResizeState {\n return {\n srcWidth,\n srcHeight,\n dstWidth,\n dstHeight,\n bufferA: null,\n bufferB: null,\n bufferAY: -1,\n bufferBY: -1,\n currentOutputY: 0,\n };\n}\n\n/**\n * Horizontally resize a single scanline using bilinear interpolation\n *\n * @param src - Source scanline (RGB, 3 bytes per pixel)\n * @param srcWidth - Source width\n * @param dstWidth - Destination width\n * @returns Resized scanline\n */\nfunction resizeRowHorizontal(\n src: Uint8Array,\n srcWidth: number,\n dstWidth: number\n): Uint8Array {\n const dst = new Uint8Array(dstWidth * 3);\n const xScale = srcWidth / dstWidth;\n\n for (let dstX = 0; dstX < dstWidth; dstX++) {\n // Map destination X to source X\n const srcXFloat = dstX * xScale;\n const srcX0 = Math.floor(srcXFloat);\n const srcX1 = Math.min(srcX0 + 1, srcWidth - 1);\n const t = srcXFloat - srcX0;\n const invT = 1 - t;\n\n // Source pixel offsets\n const src0 = srcX0 * 3;\n const src1 = srcX1 * 3;\n const dstOffset = dstX * 3;\n\n // Bilinear interpolation for RGB\n dst[dstOffset] = Math.round(src[src0] * invT + src[src1] * t);\n dst[dstOffset + 1] = Math.round(src[src0 + 1] * invT + src[src1 + 1] * t);\n dst[dstOffset + 2] = Math.round(src[src0 + 2] * invT + src[src1 + 2] * t);\n }\n\n return dst;\n}\n\n/**\n * Blend two horizontally-resized rows vertically\n *\n * @param rowA - First row (already horizontally resized)\n * @param rowB - Second row (already horizontally resized)\n * @param t - Blend factor (0 = all rowA, 1 = all rowB)\n * @param width - Width in pixels\n * @returns Blended row\n */\nfunction blendRows(\n rowA: Uint8Array,\n rowB: Uint8Array,\n t: number,\n width: number\n): Uint8Array {\n const result = new Uint8Array(width * 3);\n const invT = 1 - t;\n\n for (let i = 0; i < width * 3; i++) {\n result[i] = Math.round(rowA[i] * invT + rowB[i] * t);\n }\n\n return result;\n}\n\n/**\n * Process a source scanline and potentially output resized scanlines\n *\n * This is the core of the streaming resize algorithm. Call this for each\n * source scanline in order (y = 0, 1, 2, ...). It will return output\n * scanlines as they become available.\n *\n * Memory usage: Only keeps 2 horizontally-resized rows in memory at a time\n *\n * @param state - Resize state (mutated)\n * @param srcScanline - Source scanline (RGB, 3 bytes per pixel)\n * @param srcY - Source Y position (must be called in order)\n * @returns Array of output scanlines (may be 0, 1, or more)\n */\nexport function processScanline(\n state: ResizeState,\n srcScanline: Uint8Array,\n srcY: number\n): Scanline[] {\n const { srcWidth, srcHeight, dstWidth, dstHeight } = state;\n const yScale = srcHeight / dstHeight;\n const output: Scanline[] = [];\n\n // Horizontally resize this source row\n const resizedRow = resizeRowHorizontal(srcScanline, srcWidth, dstWidth);\n\n // Update buffers - rotate A ← B, B ← new\n state.bufferA = state.bufferB;\n state.bufferAY = state.bufferBY;\n state.bufferB = resizedRow;\n state.bufferBY = srcY;\n\n // Generate output rows that fall within [bufferAY, bufferBY]\n while (state.currentOutputY < dstHeight) {\n const srcYFloat = state.currentOutputY * yScale;\n const srcYFloor = Math.floor(srcYFloat);\n const srcYCeil = Math.min(srcYFloor + 1, srcHeight - 1);\n\n // Can we generate this output row with current buffers?\n if (srcYCeil > srcY) {\n // Need more source rows\n break;\n }\n\n // Handle edge cases at the beginning\n if (state.bufferA === null) {\n // First row - just use bufferB\n output.push({\n data: state.bufferB,\n width: dstWidth,\n y: state.currentOutputY,\n });\n state.currentOutputY++;\n continue;\n }\n\n // Both buffers available - do bilinear blend\n const t = srcYFloat - srcYFloor;\n\n // Determine which buffers to use\n let rowA = state.bufferA;\n let rowB = state.bufferB;\n\n // If srcYFloor matches bufferBY, we need to use bufferB for both\n if (srcYFloor === state.bufferBY) {\n rowA = state.bufferB;\n rowB = state.bufferB;\n } else if (srcYCeil === state.bufferAY) {\n // Edge case: use bufferA for both\n rowA = state.bufferA;\n rowB = state.bufferA;\n }\n\n const blended = blendRows(rowA, rowB, t, dstWidth);\n output.push({\n data: blended,\n width: dstWidth,\n y: state.currentOutputY,\n });\n\n state.currentOutputY++;\n }\n\n return output;\n}\n\n/**\n * Flush any remaining output rows after all source rows have been processed\n *\n * @param state - Resize state\n * @returns Remaining output scanlines\n */\nexport function flushResize(state: ResizeState): Scanline[] {\n const output: Scanline[] = [];\n\n // Generate any remaining rows using the last available buffer\n while (state.currentOutputY < state.dstHeight) {\n if (state.bufferB === null) break;\n\n output.push({\n data: state.bufferB,\n width: state.dstWidth,\n y: state.currentOutputY,\n });\n state.currentOutputY++;\n }\n\n return output;\n}\n\n/**\n * Calculate target dimensions while preserving aspect ratio\n *\n * @param srcWidth - Source width\n * @param srcHeight - Source height\n * @param maxWidth - Maximum target width\n * @param maxHeight - Maximum target height\n * @returns Target dimensions\n */\nexport function calculateTargetDimensions(\n srcWidth: number,\n srcHeight: number,\n maxWidth: number,\n maxHeight: number\n): { width: number; height: number; scale: number } {\n const scaleX = maxWidth / srcWidth;\n const scaleY = maxHeight / srcHeight;\n const scale = Math.min(scaleX, scaleY, 1); // Never upscale\n\n return {\n width: Math.round(srcWidth * scale),\n height: Math.round(srcHeight * scale),\n scale,\n };\n}\n\n/**\n * Calculate optimal JPEG DCT scale factor\n *\n * JPEG can decode at 1/1, 1/2, 1/4, or 1/8 scale using DCT scaling.\n * This dramatically reduces memory usage during decode.\n *\n * @param srcWidth - Source image width\n * @param srcHeight - Source image height\n * @param targetWidth - Desired output width\n * @param targetHeight - Desired output height\n * @returns Scale denominator (1, 2, 4, or 8)\n */\nexport function calculateDctScaleFactor(\n srcWidth: number,\n srcHeight: number,\n targetWidth: number,\n targetHeight: number\n): 1 | 2 | 4 | 8 {\n // We want the smallest DCT scale that still gives us enough pixels\n // to resize down to target dimensions without upscaling\n\n const scales: (1 | 2 | 4 | 8)[] = [8, 4, 2, 1];\n\n for (const scale of scales) {\n const scaledWidth = Math.ceil(srcWidth / scale);\n const scaledHeight = Math.ceil(srcHeight / scale);\n\n // If scaled dimensions are >= target, this scale works\n if (scaledWidth >= targetWidth && scaledHeight >= targetHeight) {\n return scale;\n }\n }\n\n // Fallback to no scaling\n return 1;\n}\n","/**\n * WASM Module Loader\n *\n * Loads the SIP WASM module with proper initialization.\n * Works in both browser and Cloudflare Workers environments.\n *\n * For Cloudflare Workers, use initWithWasmModule() in the Durable Object\n * constructor, passing the statically imported WASM module.\n */\n\nimport type { SipWasmModule } from './types';\n\nlet wasmModule: SipWasmModule | null = null;\nlet wasmPromise: Promise<SipWasmModule> | null = null;\nlet precompiledWasmModule: WebAssembly.Module | null = null;\n\nfunction isCloudflareWorker(): boolean {\n const cacheStorage = (globalThis as { caches?: CacheStorage & { default?: Cache } }).caches;\n return typeof cacheStorage !== 'undefined' && typeof cacheStorage.default !== 'undefined';\n}\n\n/**\n * Check if WASM module is available\n */\nexport function isWasmAvailable(): boolean {\n return wasmModule !== null;\n}\n\n/**\n * Initialize with a pre-compiled WebAssembly.Module\n *\n * For Cloudflare Workers, import the WASM file statically and pass it here.\n * This allows workerd to pre-compile the WASM at bundle time.\n *\n * @example\n * ```typescript\n * import sipWasm from '@standardagents/sip/dist/sip.wasm';\n * import { initWithWasmModule } from '@standardagents/sip';\n *\n * // At module top level or in DO constructor\n * await initWithWasmModule(sipWasm);\n * ```\n */\nexport async function initWithWasmModule(compiledModule?: WebAssembly.Module): Promise<void> {\n if (wasmModule) {\n return; // Already initialized\n }\n\n // Store the pre-compiled module for use in instantiateWasm callback\n if (compiledModule) {\n precompiledWasmModule = compiledModule;\n }\n\n await loadWasm();\n}\n\n/**\n * Get the WASM module, throwing if not loaded\n */\nexport function getWasmModule(): SipWasmModule {\n if (!wasmModule) {\n throw new Error('WASM module not loaded. Call loadWasm() first.');\n }\n return wasmModule;\n}\n\n/**\n * Load the WASM module\n *\n * This function is idempotent - calling it multiple times returns the same module.\n */\nexport async function loadWasm(): Promise<SipWasmModule> {\n // Return cached module if already loaded\n if (wasmModule) {\n return wasmModule;\n }\n\n // Return existing promise if loading in progress\n if (wasmPromise) {\n return wasmPromise;\n }\n\n wasmPromise = doLoadWasm();\n\n try {\n wasmModule = await wasmPromise;\n return wasmModule;\n } catch (err) {\n wasmPromise = null;\n throw err;\n }\n}\n\n/**\n * Internal function to load the WASM module\n */\nasync function doLoadWasm(): Promise<SipWasmModule> {\n // Check for externally provided loader first\n if (typeof globalThis !== 'undefined' && (globalThis as any).__SIP_WASM_LOADER__) {\n const loader = (globalThis as any).__SIP_WASM_LOADER__;\n return await loader();\n }\n\n // Try to dynamically import the Emscripten glue code\n try {\n // @ts-ignore - Dynamic import of built WASM module\n const createSipModule = (await import('./sip.js')).default;\n\n // Prefer an explicitly provided precompiled module in Workers/bundlers\n // before probing any environment-specific filesystem paths.\n if (precompiledWasmModule) {\n const module = await new Promise<SipWasmModule>((resolve, reject) => {\n let resolvedModule: SipWasmModule | null = null;\n\n createSipModule({\n instantiateWasm: (\n imports: WebAssembly.Imports,\n receiveInstance: (instance: WebAssembly.Instance) => void\n ) => {\n WebAssembly.instantiate(precompiledWasmModule!, imports)\n .then((instance) => {\n receiveInstance(instance);\n })\n .catch((err) => {\n reject(err);\n });\n\n return {};\n },\n onRuntimeInitialized: () => {\n if (resolvedModule && resolvedModule.HEAPU8) {\n resolve(resolvedModule);\n }\n },\n }).then((mod: SipWasmModule) => {\n resolvedModule = mod;\n if (mod.HEAPU8) {\n resolve(mod);\n }\n }).catch(reject);\n });\n\n return module;\n }\n\n const isNode =\n !isCloudflareWorker() &&\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n\n if (isNode) {\n const { readFile } = await import('fs/promises');\n const wasmBinary = await readFile(new URL('./sip.wasm', import.meta.url));\n const module = await createSipModule({ wasmBinary });\n return module as SipWasmModule;\n }\n\n // Standard loading (browser environment)\n const module = await createSipModule();\n return module as SipWasmModule;\n } catch (err) {\n throw new Error(\n 'SIP WASM module not available. ' +\n 'To use streaming processing, build the WASM module with `pnpm build:wasm` in the @standardagents/sip repo root. ' +\n 'Error: ' + (err instanceof Error ? err.message : String(err))\n );\n }\n}\n\n/**\n * Copy data to WASM memory\n */\nexport function copyToWasm(module: SipWasmModule, data: Uint8Array): number {\n const ptr = module._malloc(data.length);\n if (!ptr) {\n throw new Error('Failed to allocate WASM memory');\n }\n module.HEAPU8.set(data, ptr);\n return ptr;\n}\n\n/**\n * Copy data from WASM memory\n */\nexport function copyFromWasm(module: SipWasmModule, ptr: number, size: number): Uint8Array {\n return new Uint8Array(module.HEAPU8.buffer, ptr, size).slice();\n}\n","/**\n * WASM JPEG Decoder with incremental input support.\n *\n * The low-memory Worker path feeds compressed bytes into libjpeg-turbo as the\n * request body arrives, then reads scaled scanlines as soon as the decoder can\n * produce them.\n */\n\nimport type { Scanline } from '../types';\nimport type { SipWasmModule, DctScaleDenom } from './types';\nimport { copyToWasm, getWasmModule } from './loader';\n\ntype StepResult = 'ready' | 'needMore';\ntype ScanlineStep = Scanline | null | 'needMore';\n\nexport class WasmJpegDecoder {\n private readonly module: SipWasmModule;\n private decoder = 0;\n private width = 0;\n private height = 0;\n private outputWidth = 0;\n private outputHeight = 0;\n private rowBufferPtr = 0;\n private started = false;\n private finished = false;\n\n constructor() {\n this.module = getWasmModule();\n this.decoder = this.module._sip_decoder_create();\n if (!this.decoder) {\n throw new Error('Failed to create JPEG decoder');\n }\n }\n\n pushInput(data: Uint8Array, isFinal = false): void {\n if (data.byteLength === 0 && !isFinal) {\n return;\n }\n\n let ptr = 0;\n try {\n ptr = data.byteLength > 0 ? copyToWasm(this.module, data) : 0;\n if (this.module._sip_decoder_push_input(this.decoder, ptr, data.byteLength, isFinal ? 1 : 0) !== 0) {\n throw new Error('Failed to feed JPEG bytes into decoder');\n }\n } finally {\n if (ptr) {\n this.module._free(ptr);\n }\n }\n }\n\n /**\n * Compatibility helper for full-buffer callers.\n */\n init(data: ArrayBuffer | Uint8Array): { width: number; height: number } {\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);\n let ptr = 0;\n try {\n ptr = copyToWasm(this.module, bytes);\n if (this.module._sip_decoder_set_source(this.decoder, ptr, bytes.byteLength) !== 0) {\n throw new Error('Failed to set buffered JPEG source');\n }\n } finally {\n if (ptr) {\n this.module._free(ptr);\n }\n }\n\n const header = this.readHeaderStep();\n if (header !== 'ready') {\n throw new Error('Incomplete JPEG header');\n }\n\n return { width: this.width, height: this.height };\n }\n\n readHeaderStep(): StepResult {\n const result = this.module._sip_decoder_read_header(this.decoder);\n if (result === 1) {\n return 'needMore';\n }\n if (result !== 0) {\n throw new Error('Failed to read JPEG header');\n }\n\n this.width = this.module._sip_decoder_get_width(this.decoder);\n this.height = this.module._sip_decoder_get_height(this.decoder);\n this.outputWidth = this.width;\n this.outputHeight = this.height;\n return 'ready';\n }\n\n getDimensions(): { width: number; height: number } {\n return { width: this.width, height: this.height };\n }\n\n setScale(scaleDenom: DctScaleDenom): { width: number; height: number } {\n if (this.module._sip_decoder_set_scale(this.decoder, scaleDenom) !== 0) {\n throw new Error(`Invalid scale denominator: ${scaleDenom}`);\n }\n\n this.outputWidth = this.module._sip_decoder_get_output_width(this.decoder);\n this.outputHeight = this.module._sip_decoder_get_output_height(this.decoder);\n return { width: this.outputWidth, height: this.outputHeight };\n }\n\n getOutputDimensions(): { width: number; height: number } {\n return { width: this.outputWidth, height: this.outputHeight };\n }\n\n start(): void {\n const step = this.startStep();\n if (step !== 'ready') {\n throw new Error('JPEG decoder needs more input before starting');\n }\n }\n\n startStep(): StepResult {\n if (this.started) {\n return 'ready';\n }\n\n const result = this.module._sip_decoder_start(this.decoder);\n if (result === 1) {\n return 'needMore';\n }\n if (result !== 0) {\n throw new Error('Failed to start JPEG decompression');\n }\n\n this.rowBufferPtr = this.module._sip_decoder_get_row_buffer(this.decoder);\n if (!this.rowBufferPtr) {\n throw new Error('Failed to get JPEG decoder row buffer');\n }\n\n this.started = true;\n return 'ready';\n }\n\n readScanline(): Scanline | null {\n const result = this.readScanlineStep();\n if (result === 'needMore') {\n throw new Error('JPEG decoder needs more input');\n }\n return result;\n }\n\n readScanlineStep(): ScanlineStep {\n if (!this.started || this.finished) {\n return null;\n }\n\n const result = this.module._sip_decoder_read_scanline(this.decoder);\n if (result === 2) {\n return 'needMore';\n }\n if (result === 0) {\n this.finished = true;\n return null;\n }\n if (result !== 1) {\n throw new Error('Failed to read JPEG scanline');\n }\n\n const rowSize = this.outputWidth * 3;\n const data = new Uint8Array(this.module.HEAPU8.buffer, this.rowBufferPtr, rowSize).slice();\n const y = this.module._sip_decoder_get_scanline(this.decoder) - 1;\n\n return { data, width: this.outputWidth, y };\n }\n\n finishStep(): StepResult {\n const result = this.module._sip_decoder_finish(this.decoder);\n if (result === 1) {\n return 'needMore';\n }\n if (result !== 0) {\n throw new Error('Failed to finish JPEG decompression');\n }\n\n return 'ready';\n }\n\n getBufferedInputSize(): number {\n return this.module._sip_decoder_get_buffered_input_size(this.decoder);\n }\n\n getRowBufferSize(): number {\n return this.module._sip_decoder_get_working_size(this.decoder);\n }\n\n dispose(): void {\n if (this.decoder) {\n this.module._sip_decoder_destroy(this.decoder);\n this.decoder = 0;\n }\n\n this.rowBufferPtr = 0;\n this.started = false;\n this.finished = false;\n }\n}\n\n/**\n * Calculate optimal DCT scale factor for a target size.\n */\nexport function calculateOptimalScale(\n srcWidth: number,\n srcHeight: number,\n targetWidth: number,\n targetHeight: number\n): DctScaleDenom {\n const scales: DctScaleDenom[] = [8, 4, 2, 1];\n\n for (const scale of scales) {\n const scaledWidth = Math.ceil(srcWidth / scale);\n const scaledHeight = Math.ceil(srcHeight / scale);\n\n if (scaledWidth >= targetWidth && scaledHeight >= targetHeight) {\n return scale;\n }\n }\n\n return 1;\n}\n","/**\n * WASM JPEG Encoder with chunked output draining.\n */\n\nimport type { Scanline } from '../types';\nimport type { SipWasmModule } from './types';\nimport { copyFromWasm, getWasmModule } from './loader';\n\nexport class WasmJpegEncoder {\n private readonly module: SipWasmModule;\n private encoder = 0;\n private width = 0;\n private height = 0;\n private rowBufferPtr = 0;\n private started = false;\n private finished = false;\n private currentLine = 0;\n\n constructor() {\n this.module = getWasmModule();\n this.encoder = this.module._sip_encoder_create();\n if (!this.encoder) {\n throw new Error('Failed to create JPEG encoder');\n }\n }\n\n init(width: number, height: number, quality = 85): void {\n this.width = width;\n this.height = height;\n\n if (this.module._sip_encoder_init(this.encoder, width, height, quality) !== 0) {\n throw new Error('Failed to initialize JPEG encoder');\n }\n }\n\n start(): void {\n if (this.started) {\n return;\n }\n\n if (this.module._sip_encoder_start(this.encoder) !== 0) {\n throw new Error('Failed to start JPEG compression');\n }\n\n this.rowBufferPtr = this.module._sip_encoder_get_row_buffer(this.encoder);\n if (!this.rowBufferPtr) {\n throw new Error('Failed to get JPEG encoder row buffer');\n }\n\n this.started = true;\n this.currentLine = 0;\n }\n\n writeScanline(scanline: Scanline): void {\n this.writeScanlineData(scanline.data);\n }\n\n writeScanlineData(data: Uint8Array): void {\n if (!this.started || this.finished) {\n throw new Error('Encoder is not ready for scanlines');\n }\n\n const expectedSize = this.width * 3;\n if (data.byteLength !== expectedSize) {\n throw new Error(`Invalid scanline size: expected ${expectedSize}, got ${data.byteLength}`);\n }\n\n this.module.HEAPU8.set(data, this.rowBufferPtr);\n if (this.module._sip_encoder_write_scanline(this.encoder) !== 1) {\n throw new Error('Failed to write JPEG scanline');\n }\n\n this.currentLine++;\n }\n\n drainChunks(): Uint8Array[] {\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const ptr = this.module._sip_encoder_peek_chunk_data(this.encoder);\n const size = this.module._sip_encoder_peek_chunk_size(this.encoder);\n if (!ptr || !size) {\n break;\n }\n\n chunks.push(copyFromWasm(this.module, ptr, size));\n this.module._sip_encoder_pop_chunk(this.encoder);\n }\n\n return chunks;\n }\n\n finish(): Uint8Array[] {\n if (!this.started) {\n throw new Error('Encoding not started');\n }\n if (this.finished) {\n return [];\n }\n if (this.currentLine !== this.height) {\n throw new Error(`Incomplete image: wrote ${this.currentLine}/${this.height} scanlines`);\n }\n\n if (this.module._sip_encoder_finish(this.encoder) !== 0) {\n throw new Error('Failed to finish JPEG compression');\n }\n\n this.finished = true;\n return this.drainChunks();\n }\n\n encodeAll(pixels: Uint8Array): ArrayBuffer {\n this.start();\n\n const rowSize = this.width * 3;\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n for (let y = 0; y < this.height; y++) {\n this.writeScanlineData(pixels.subarray(y * rowSize, (y + 1) * rowSize));\n for (const chunk of this.drainChunks()) {\n chunks.push(chunk);\n total += chunk.byteLength;\n }\n }\n\n for (const chunk of this.finish()) {\n chunks.push(chunk);\n total += chunk.byteLength;\n }\n\n const merged = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return merged.buffer.slice(merged.byteOffset, merged.byteOffset + merged.byteLength);\n }\n\n getBufferedOutputSize(): number {\n return this.module._sip_encoder_get_buffered_output_size(this.encoder);\n }\n\n getRowBufferSize(): number {\n return this.width * 3;\n }\n\n getCurrentLine(): number {\n return this.currentLine;\n }\n\n dispose(): void {\n if (this.encoder) {\n this.module._sip_encoder_destroy(this.encoder);\n this.encoder = 0;\n }\n\n this.rowBufferPtr = 0;\n this.started = false;\n this.finished = false;\n this.currentLine = 0;\n }\n}\n\n","/**\n * WASM PNG Decoder with Row-by-Row Processing\n *\n * Memory-efficient PNG decoding using libspng's progressive API.\n * Decodes one row at a time to minimize memory usage.\n */\n\nimport type { Scanline } from '../types';\nimport type { SipWasmModule } from './types';\nimport { getWasmModule, copyToWasm } from './loader';\n\n/**\n * WASM-based PNG decoder with row-by-row decoding\n */\nexport class WasmPngDecoder {\n private module: SipWasmModule;\n private decoder: number = 0;\n private dataPtr: number = 0;\n private width: number = 0;\n private height: number = 0;\n private hasAlpha: boolean = false;\n private rowBufferPtr: number = 0;\n private started: boolean = false;\n private finished: boolean = false;\n private currentRow: number = 0;\n\n constructor() {\n this.module = getWasmModule();\n }\n\n /**\n * Initialize decoder with PNG data\n */\n init(data: ArrayBuffer | Uint8Array): {\n width: number;\n height: number;\n hasAlpha: boolean;\n } {\n const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\n\n // Create decoder\n this.decoder = this.module._sip_png_decoder_create();\n if (!this.decoder) {\n throw new Error('Failed to create PNG decoder');\n }\n\n // Copy data to WASM memory\n this.dataPtr = copyToWasm(this.module, bytes);\n\n // Set source\n if (this.module._sip_png_decoder_set_source(this.decoder, this.dataPtr, bytes.length) !== 0) {\n this.dispose();\n throw new Error('Failed to set PNG decoder source');\n }\n\n // Read header\n if (this.module._sip_png_decoder_read_header(this.decoder) !== 0) {\n this.dispose();\n throw new Error('Failed to read PNG header');\n }\n\n this.width = this.module._sip_png_decoder_get_width(this.decoder);\n this.height = this.module._sip_png_decoder_get_height(this.decoder);\n this.hasAlpha = this.module._sip_png_decoder_has_alpha(this.decoder) !== 0;\n\n return { width: this.width, height: this.height, hasAlpha: this.hasAlpha };\n }\n\n /**\n * Get image dimensions\n */\n getDimensions(): { width: number; height: number } {\n return { width: this.width, height: this.height };\n }\n\n /**\n * Check if image has alpha channel\n */\n getHasAlpha(): boolean {\n return this.hasAlpha;\n }\n\n /**\n * Start decoding\n */\n start(): void {\n if (!this.decoder) {\n throw new Error('Decoder not initialized');\n }\n if (this.started) {\n throw new Error('Decoding already started');\n }\n\n if (this.module._sip_png_decoder_start(this.decoder) !== 0) {\n throw new Error('Failed to start PNG decompression');\n }\n\n this.rowBufferPtr = this.module._sip_png_decoder_get_row_buffer(this.decoder);\n if (!this.rowBufferPtr) {\n throw new Error('Failed to get row buffer');\n }\n\n this.started = true;\n this.currentRow = 0;\n }\n\n /**\n * Read next scanline\n *\n * @returns Scanline object or null if no more scanlines\n */\n readScanline(): Scanline | null {\n if (!this.started || this.finished) {\n return null;\n }\n\n if (this.currentRow >= this.height) {\n this.finished = true;\n return null;\n }\n\n const result = this.module._sip_png_decoder_read_row(this.decoder);\n\n if (result < 0) {\n throw new Error('Failed to read PNG row');\n }\n\n // Copy scanline data (RGB = 3 bytes per pixel)\n const rowSize = this.width * 3;\n const data = new Uint8Array(\n this.module.HEAPU8.buffer,\n this.rowBufferPtr,\n rowSize\n ).slice();\n\n const y = this.currentRow;\n this.currentRow++;\n\n // Check if done after reading this row\n if (result === 0 || this.currentRow >= this.height) {\n this.finished = true;\n }\n\n return {\n data,\n width: this.width,\n y,\n };\n }\n\n /**\n * Read all remaining scanlines\n *\n * @yields Scanline objects\n */\n *readAllScanlines(): Generator<Scanline> {\n let scanline: Scanline | null;\n while ((scanline = this.readScanline()) !== null) {\n yield scanline;\n }\n }\n\n /**\n * Decode entire image to RGB buffer\n *\n * @returns Full RGB pixel buffer\n */\n decodeAll(): { pixels: Uint8Array; width: number; height: number } {\n if (!this.started) {\n this.start();\n }\n\n const pixels = new Uint8Array(this.width * this.height * 3);\n const rowSize = this.width * 3;\n\n for (const scanline of this.readAllScanlines()) {\n pixels.set(scanline.data, scanline.y * rowSize);\n }\n\n return {\n pixels,\n width: this.width,\n height: this.height,\n };\n }\n\n /**\n * Clean up resources\n */\n dispose(): void {\n if (this.decoder) {\n this.module._sip_png_decoder_destroy(this.decoder);\n this.decoder = 0;\n }\n\n if (this.dataPtr) {\n this.module._free(this.dataPtr);\n this.dataPtr = 0;\n }\n\n this.started = false;\n this.finished = false;\n this.rowBufferPtr = 0;\n this.currentRow = 0;\n }\n}\n","import { createDecoder } from './decoders/simple';\nimport { asArrayBuffer, collectSourceBytes, inspect, inspectSource, prepareInputSource } from './input';\nimport { probe } from './probe';\nimport {\n calculateTargetDimensions,\n createResizeState,\n flushResize,\n processScanline,\n} from './resize';\nimport type {\n ByteInput,\n EncodedImage,\n EncodedImageInfo,\n ImageInfo,\n InputSource,\n PixelStream,\n Scanline,\n TransformOptions,\n TransformStats,\n} from './types';\nimport {\n WasmJpegDecoder,\n WasmJpegEncoder,\n WasmPngDecoder,\n calculateOptimalScale,\n initWithWasmModule,\n loadWasm,\n} from './wasm';\n\nconst DEFAULT_QUALITY = 85;\n\ntype StatsResolver = {\n resolve: (value: TransformStats) => void;\n reject: (reason?: unknown) => void;\n promise: Promise<TransformStats>;\n};\n\ntype InfoResolver<T> = {\n resolve: (value: T) => void;\n reject: (reason?: unknown) => void;\n promise: Promise<T>;\n};\n\ntype PreparedSource = Awaited<ReturnType<typeof prepareInputSource>>;\n\nfunction createDeferred<T>(): InfoResolver<T> {\n let resolve!: (value: T) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { resolve, reject, promise };\n}\n\nfunction makeEmptyStats(): TransformStats {\n return {\n peakPipelineBytes: 0,\n peakCodecBytes: 0,\n peakBufferedInputBytes: 0,\n peakBufferedOutputBytes: 0,\n bytesIn: 0,\n bytesOut: 0,\n notes: [],\n };\n}\n\nfunction concatUint8Arrays(chunks: Uint8Array[]): Uint8Array {\n let total = 0;\n for (const chunk of chunks) {\n total += chunk.byteLength;\n }\n\n const merged = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return merged;\n}\n\nfunction readJpegOrientation(bytes: Uint8Array): number | null {\n if (bytes.byteLength < 4 || bytes[0] !== 0xff || bytes[1] !== 0xd8) {\n return null;\n }\n\n let offset = 2;\n while (offset + 4 <= bytes.byteLength) {\n if (bytes[offset] !== 0xff) {\n offset++;\n continue;\n }\n\n while (offset < bytes.byteLength && bytes[offset] === 0xff) {\n offset++;\n }\n\n if (offset >= bytes.byteLength) {\n break;\n }\n\n const marker = bytes[offset++];\n if (marker === 0xd8 || marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7)) {\n continue;\n }\n if (marker === 0xd9 || marker === 0xda) {\n break;\n }\n if (offset + 2 > bytes.byteLength) {\n break;\n }\n\n const segmentLength = (bytes[offset] << 8) | bytes[offset + 1];\n if (segmentLength < 2 || offset + segmentLength > bytes.byteLength) {\n break;\n }\n\n const segmentStart = offset + 2;\n const payloadLength = segmentLength - 2;\n if (\n marker === 0xe1 &&\n payloadLength >= 14 &&\n bytes[segmentStart] === 0x45 &&\n bytes[segmentStart + 1] === 0x78 &&\n bytes[segmentStart + 2] === 0x69 &&\n bytes[segmentStart + 3] === 0x66 &&\n bytes[segmentStart + 4] === 0x00 &&\n bytes[segmentStart + 5] === 0x00\n ) {\n const tiff = segmentStart + 6;\n if (tiff + 8 > bytes.byteLength) {\n return null;\n }\n\n const littleEndian = bytes[tiff] === 0x49 && bytes[tiff + 1] === 0x49;\n const bigEndian = bytes[tiff] === 0x4d && bytes[tiff + 1] === 0x4d;\n if (!littleEndian && !bigEndian) {\n return null;\n }\n\n const read16 = (index: number) => (\n littleEndian\n ? bytes[index] | (bytes[index + 1] << 8)\n : (bytes[index] << 8) | bytes[index + 1]\n );\n const read32 = (index: number) => (\n littleEndian\n ? (bytes[index] |\n (bytes[index + 1] << 8) |\n (bytes[index + 2] << 16) |\n (bytes[index + 3] << 24)) >>> 0\n : ((bytes[index] << 24) |\n (bytes[index + 1] << 16) |\n (bytes[index + 2] << 8) |\n bytes[index + 3]) >>> 0\n );\n\n const ifdOffset = read32(tiff + 4);\n const ifdStart = tiff + ifdOffset;\n if (ifdStart + 2 > bytes.byteLength) {\n return null;\n }\n\n const entryCount = read16(ifdStart);\n for (let i = 0; i < entryCount; i++) {\n const entry = ifdStart + 2 + (i * 12);\n if (entry + 12 > bytes.byteLength) {\n return null;\n }\n\n const tag = read16(entry);\n if (tag !== 0x0112) {\n continue;\n }\n\n const type = read16(entry + 2);\n const count = read32(entry + 4);\n if (type !== 3 || count !== 1) {\n return null;\n }\n\n const valueOffset = entry + 8;\n return littleEndian\n ? bytes[valueOffset] | (bytes[valueOffset + 1] << 8)\n : (bytes[valueOffset] << 8) | bytes[valueOffset + 1];\n }\n }\n\n offset += segmentLength;\n }\n\n return null;\n}\n\nfunction buildExifOrientationSegment(orientation: number): Uint8Array | null {\n if (!Number.isInteger(orientation) || orientation < 2 || orientation > 8) {\n return null;\n }\n\n const payload = new Uint8Array([\n 0x45, 0x78, 0x69, 0x66, 0x00, 0x00,\n 0x49, 0x49, 0x2a, 0x00, 0x08, 0x00, 0x00, 0x00,\n 0x01, 0x00,\n 0x12, 0x01,\n 0x03, 0x00,\n 0x01, 0x00, 0x00, 0x00,\n orientation & 0xff, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n ]);\n const length = payload.byteLength + 2;\n const segment = new Uint8Array(payload.byteLength + 4);\n segment[0] = 0xff;\n segment[1] = 0xe1;\n segment[2] = (length >> 8) & 0xff;\n segment[3] = length & 0xff;\n segment.set(payload, 4);\n return segment;\n}\n\nfunction injectJpegApp1Segment(chunk: Uint8Array, segment: Uint8Array): Uint8Array {\n if (chunk.byteLength < 2 || chunk[0] !== 0xff || chunk[1] !== 0xd8) {\n return concatUint8Arrays([chunk, segment]);\n }\n\n const merged = new Uint8Array(chunk.byteLength + segment.byteLength);\n merged[0] = 0xff;\n merged[1] = 0xd8;\n merged.set(segment, 2);\n merged.set(chunk.subarray(2), 2 + segment.byteLength);\n return merged;\n}\n\nasync function readJpegOrientationFromSource(source: {\n headerBytes: Uint8Array;\n ensureHeaderBytes(target: number): Promise<Uint8Array>;\n}): Promise<number | null> {\n const direct = readJpegOrientation(source.headerBytes);\n if (direct !== null) {\n return direct;\n }\n\n const extended = await source.ensureHeaderBytes(262_144);\n return readJpegOrientation(extended);\n}\n\nclass StatsTracker {\n readonly stats = makeEmptyStats();\n\n constructor(note?: string) {\n if (note) {\n this.note(note);\n }\n }\n\n note(message: string): void {\n if (!this.stats.notes.includes(message)) {\n this.stats.notes.push(message);\n }\n }\n\n addBytesIn(bytes: number): void {\n this.stats.bytesIn += bytes;\n }\n\n addBytesOut(bytes: number): void {\n this.stats.bytesOut += bytes;\n }\n\n update(bufferedInput: number, bufferedOutput: number, codecBytes: number, pipelineBytes: number): void {\n this.stats.peakBufferedInputBytes = Math.max(this.stats.peakBufferedInputBytes, bufferedInput);\n this.stats.peakBufferedOutputBytes = Math.max(this.stats.peakBufferedOutputBytes, bufferedOutput);\n this.stats.peakCodecBytes = Math.max(this.stats.peakCodecBytes, codecBytes);\n this.stats.peakPipelineBytes = Math.max(this.stats.peakPipelineBytes, pipelineBytes);\n }\n\n snapshot(): TransformStats {\n return { ...this.stats, notes: [...this.stats.notes] };\n }\n}\n\nfunction normalizeBox(options: TransformOptions, width: number, height: number) {\n return calculateTargetDimensions(\n width,\n height,\n options.width ?? width,\n options.height ?? height\n );\n}\n\nfunction createPixelStream(\n iteratorFactory: () => AsyncIterable<Scanline>,\n info: Promise<{ width: number; height: number; originalFormat: Exclude<ImageInfo['format'], 'unknown'> }>,\n stats: Promise<TransformStats> = Promise.resolve(makeEmptyStats())\n): PixelStream {\n return {\n info,\n stats,\n [Symbol.asyncIterator]() {\n return iteratorFactory()[Symbol.asyncIterator]();\n },\n };\n}\n\nfunction createEncodedImage(\n iteratorFactory: () => AsyncIterable<Uint8Array>,\n info: Promise<EncodedImageInfo>,\n stats: Promise<TransformStats>\n): EncodedImage {\n return {\n info,\n stats,\n [Symbol.asyncIterator]() {\n return iteratorFactory()[Symbol.asyncIterator]();\n },\n };\n}\n\nasync function* iterateUint8ArrayRows(\n pixels: Uint8Array,\n width: number,\n height: number\n): AsyncIterable<Scanline> {\n const rowSize = width * 3;\n for (let y = 0; y < height; y++) {\n yield {\n data: pixels.subarray(y * rowSize, (y + 1) * rowSize),\n width,\n y,\n };\n }\n}\n\nasync function* iterateInputChunks(source: InputSource): AsyncIterable<{\n chunk: Uint8Array;\n isFinal: boolean;\n}> {\n const iterator = source.open()[Symbol.asyncIterator]();\n let current = await iterator.next();\n\n if (current.done) {\n return;\n }\n\n while (true) {\n const next = await iterator.next();\n yield {\n chunk: current.value,\n isFinal: next.done === true,\n };\n\n if (next.done === true) {\n return;\n }\n\n current = next;\n }\n}\n\nasync function* decodeSourceInternal(\n input: ByteInput | InputSource\n): AsyncIterable<Scanline> {\n const prepared = await prepareInputSource(input);\n const info = await inspectSource(prepared);\n if (info.format === 'unknown') {\n throw new Error('Unsupported image format');\n }\n\n await loadWasm();\n\n if (info.format === 'jpeg') {\n const decoder = new WasmJpegDecoder();\n try {\n if (prepared.kind === 'bytes') {\n const bytes = await collectSourceBytes(prepared);\n decoder.init(asArrayBuffer(bytes));\n decoder.start();\n\n while (true) {\n const scanline = decoder.readScanline();\n if (!scanline) {\n break;\n }\n yield scanline;\n }\n\n if (decoder.finishStep() !== 'ready') {\n throw new Error('Unexpected end of JPEG input while finishing');\n }\n return;\n }\n\n let headerReady = false;\n let started = false;\n\n for await (const { chunk, isFinal } of iterateInputChunks(prepared)) {\n decoder.pushInput(chunk, isFinal);\n\n if (!headerReady) {\n const headerStep = decoder.readHeaderStep();\n if (headerStep === 'ready') {\n headerReady = true;\n } else {\n continue;\n }\n }\n\n if (!started) {\n const startStep = decoder.startStep();\n if (startStep === 'ready') {\n started = true;\n } else {\n continue;\n }\n }\n\n while (true) {\n const scanline = decoder.readScanlineStep();\n if (scanline === 'needMore') {\n break;\n }\n if (scanline === null) {\n if (decoder.finishStep() !== 'ready') {\n throw new Error('Unexpected end of JPEG input while finishing');\n }\n return;\n }\n yield scanline;\n }\n }\n\n if (!headerReady) {\n if (decoder.readHeaderStep() !== 'ready') {\n throw new Error('Incomplete JPEG image');\n }\n headerReady = true;\n }\n\n if (!started) {\n if (decoder.startStep() !== 'ready') {\n throw new Error('Incomplete JPEG image');\n }\n started = true;\n }\n\n while (true) {\n const scanline = decoder.readScanlineStep();\n if (scanline === 'needMore') {\n throw new Error('Unexpected end of JPEG input');\n }\n if (scanline === null) {\n break;\n }\n yield scanline;\n }\n\n if (decoder.finishStep() !== 'ready') {\n throw new Error('Unexpected end of JPEG input while finishing');\n }\n return;\n } finally {\n decoder.dispose();\n }\n }\n\n const bytes = await collectSourceBytes(prepared);\n const buffer = asArrayBuffer(bytes);\n\n if (info.format === 'png') {\n const decoder = new WasmPngDecoder();\n try {\n decoder.init(buffer);\n decoder.start();\n for (const scanline of decoder.readAllScanlines()) {\n yield scanline;\n }\n } finally {\n decoder.dispose();\n }\n return;\n }\n\n const decoder = await createDecoder(info.format, buffer);\n try {\n const decoded = await decoder.decode();\n yield* iterateUint8ArrayRows(decoded.pixels, decoded.width, decoded.height);\n } finally {\n decoder.dispose();\n }\n}\n\nexport function decode(input: ByteInput | InputSource): PixelStream {\n const infoDeferred = createDeferred<{ width: number; height: number; originalFormat: Exclude<ImageInfo['format'], 'unknown'> }>();\n\n const iteratorFactory = () => (async function* decodeIterator() {\n const prepared = await prepareInputSource(input);\n const info = await inspectSource(prepared);\n if (info.format === 'unknown') {\n throw new Error('Unsupported image format');\n }\n\n infoDeferred.resolve({\n width: info.width,\n height: info.height,\n originalFormat: info.format,\n });\n\n yield* decodeSourceInternal(prepared);\n })();\n\n return createPixelStream(iteratorFactory, infoDeferred.promise);\n}\n\nexport function resize(stream: PixelStream, options: TransformOptions): PixelStream {\n const infoPromise = stream.info.then((info) => {\n const target = normalizeBox(options, info.width, info.height);\n return {\n width: target.width,\n height: target.height,\n originalFormat: info.originalFormat,\n };\n });\n\n const iteratorFactory = () => (async function* resizeIterator() {\n const sourceInfo = await stream.info;\n const target = normalizeBox(options, sourceInfo.width, sourceInfo.height);\n const state = createResizeState(\n sourceInfo.width,\n sourceInfo.height,\n target.width,\n target.height\n );\n\n for await (const scanline of stream) {\n const output = processScanline(state, scanline.data, scanline.y);\n for (const next of output) {\n yield next;\n }\n }\n\n for (const next of flushResize(state)) {\n yield next;\n }\n })();\n\n return createPixelStream(iteratorFactory, infoPromise, stream.stats ?? Promise.resolve(makeEmptyStats()));\n}\n\nexport function encodeJpeg(stream: PixelStream, options: TransformOptions = {}): EncodedImage {\n const quality = options.quality ?? DEFAULT_QUALITY;\n const infoPromise = stream.info.then((info) => ({\n width: info.width,\n height: info.height,\n mimeType: 'image/jpeg' as const,\n originalFormat: info.originalFormat,\n }));\n\n const statsPromise = stream.stats ?? Promise.resolve(makeEmptyStats());\n\n const iteratorFactory = () => (async function* encodeIterator() {\n await loadWasm();\n const info = await stream.info;\n const encoder = new WasmJpegEncoder();\n\n try {\n encoder.init(info.width, info.height, quality);\n encoder.start();\n\n for await (const scanline of stream) {\n encoder.writeScanline(scanline);\n for (const chunk of encoder.drainChunks()) {\n yield chunk;\n }\n }\n\n for (const chunk of encoder.finish()) {\n yield chunk;\n }\n } finally {\n encoder.dispose();\n }\n })();\n\n return createEncodedImage(iteratorFactory, infoPromise, statsPromise);\n}\n\nasync function* runJpegTransform(\n source: PreparedSource,\n info: ImageInfo,\n options: TransformOptions,\n infoDeferred: InfoResolver<EncodedImageInfo>,\n stats: StatsTracker\n): AsyncIterable<Uint8Array> {\n await loadWasm();\n\n const orientation = await readJpegOrientationFromSource(source);\n const orientationSegment = orientation ? buildExifOrientationSegment(orientation) : null;\n const target = normalizeBox(options, info.width, info.height);\n const decoder = new WasmJpegDecoder();\n const encoder = new WasmJpegEncoder();\n let resizeState = createResizeState(1, 1, target.width, target.height);\n let decodeWidth = info.width;\n let decodeHeight = info.height;\n const scale = calculateOptimalScale(info.width, info.height, target.width, target.height);\n let headerReady = false;\n let started = false;\n let emittedFirstChunk = false;\n\n const refresh = () => {\n const resizeBytes =\n (resizeState.bufferA?.byteLength ?? 0) +\n (resizeState.bufferB?.byteLength ?? 0);\n const codecBytes =\n decoder.getBufferedInputSize() +\n decoder.getRowBufferSize() +\n encoder.getBufferedOutputSize() +\n encoder.getRowBufferSize();\n const pipelineBytes = codecBytes + resizeBytes;\n stats.update(decoder.getBufferedInputSize(), encoder.getBufferedOutputSize(), codecBytes, pipelineBytes);\n };\n\n try {\n if (source.kind === 'bytes') {\n const bytes = await collectSourceBytes(source);\n stats.addBytesIn(bytes.byteLength);\n refresh();\n\n if (orientationSegment) {\n stats.note(`jpeg-orientation=${orientation}`);\n }\n\n decoder.init(asArrayBuffer(bytes));\n const output = decoder.setScale(scale);\n decodeWidth = output.width;\n decodeHeight = output.height;\n resizeState = createResizeState(output.width, output.height, target.width, target.height);\n encoder.init(target.width, target.height, options.quality ?? DEFAULT_QUALITY);\n encoder.start();\n decoder.start();\n headerReady = true;\n started = true;\n infoDeferred.resolve({\n width: target.width,\n height: target.height,\n mimeType: 'image/jpeg',\n originalFormat: 'jpeg',\n });\n stats.note(`jpeg-dct-scale=1/${scale}`);\n stats.note(`jpeg-decoded=${decodeWidth}x${decodeHeight}`);\n refresh();\n\n while (true) {\n const scanline = decoder.readScanline();\n if (!scanline) {\n break;\n }\n\n const outputScanlines = processScanline(resizeState, scanline.data, scanline.y);\n refresh();\n\n for (const outScanline of outputScanlines) {\n encoder.writeScanline(outScanline);\n refresh();\n for (const jpegChunk of encoder.drainChunks()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n }\n }\n\n if (decoder.finishStep() !== 'ready') {\n throw new Error('Unexpected end of JPEG input while finishing');\n }\n\n for (const outScanline of flushResize(resizeState)) {\n encoder.writeScanline(outScanline);\n refresh();\n for (const jpegChunk of encoder.drainChunks()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n }\n\n for (const jpegChunk of encoder.finish()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n\n return;\n }\n\n if (orientationSegment) {\n stats.note(`jpeg-orientation=${orientation}`);\n }\n\n for await (const { chunk, isFinal } of iterateInputChunks(source)) {\n stats.addBytesIn(chunk.byteLength);\n decoder.pushInput(chunk, isFinal);\n refresh();\n\n if (!headerReady) {\n const headerStep = decoder.readHeaderStep();\n if (headerStep === 'needMore') {\n continue;\n }\n\n headerReady = true;\n const output = decoder.setScale(scale);\n decodeWidth = output.width;\n decodeHeight = output.height;\n resizeState = createResizeState(output.width, output.height, target.width, target.height);\n encoder.init(target.width, target.height, options.quality ?? DEFAULT_QUALITY);\n encoder.start();\n infoDeferred.resolve({\n width: target.width,\n height: target.height,\n mimeType: 'image/jpeg',\n originalFormat: 'jpeg',\n });\n stats.note(`jpeg-dct-scale=1/${scale}`);\n stats.note(`jpeg-decoded=${decodeWidth}x${decodeHeight}`);\n refresh();\n }\n\n if (!started) {\n const startStep = decoder.startStep();\n if (startStep === 'needMore') {\n continue;\n }\n\n started = true;\n refresh();\n }\n\n while (true) {\n const scanline = decoder.readScanlineStep();\n if (scanline === 'needMore') {\n break;\n }\n if (scanline === null) {\n break;\n }\n\n const outputScanlines = processScanline(resizeState, scanline.data, scanline.y);\n refresh();\n\n for (const outScanline of outputScanlines) {\n encoder.writeScanline(outScanline);\n refresh();\n for (const jpegChunk of encoder.drainChunks()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n }\n }\n }\n\n if (decoder.finishStep() !== 'ready') {\n throw new Error('Unexpected end of JPEG input while finishing');\n }\n\n for (const outScanline of flushResize(resizeState)) {\n encoder.writeScanline(outScanline);\n refresh();\n for (const jpegChunk of encoder.drainChunks()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n }\n\n for (const jpegChunk of encoder.finish()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n } finally {\n decoder.dispose();\n encoder.dispose();\n }\n}\n\nasync function* runBufferedTransform(\n source: PreparedSource,\n info: ImageInfo,\n options: TransformOptions,\n infoDeferred: InfoResolver<EncodedImageInfo>,\n stats: StatsTracker\n): AsyncIterable<Uint8Array> {\n const bytes = await collectSourceBytes(source);\n stats.addBytesIn(bytes.byteLength);\n stats.update(bytes.byteLength, 0, bytes.byteLength, bytes.byteLength);\n stats.note(`${info.format}-input-buffered`);\n await loadWasm();\n\n const target = normalizeBox(options, info.width, info.height);\n const encoder = new WasmJpegEncoder();\n let scanlines: AsyncIterable<Scanline>;\n\n if (info.format === 'png') {\n const decoder = new WasmPngDecoder();\n decoder.init(asArrayBuffer(bytes));\n decoder.start();\n\n const state = createResizeState(info.width, info.height, target.width, target.height);\n scanlines = (async function* pngRows() {\n try {\n for (const scanline of decoder.readAllScanlines()) {\n for (const outScanline of processScanline(state, scanline.data, scanline.y)) {\n yield outScanline;\n }\n }\n\n for (const outScanline of flushResize(state)) {\n yield outScanline;\n }\n } finally {\n decoder.dispose();\n }\n })();\n } else {\n const decoder = await createDecoder(info.format, asArrayBuffer(bytes));\n const decoded = await decoder.decode();\n decoder.dispose();\n\n const state = createResizeState(decoded.width, decoded.height, target.width, target.height);\n scanlines = (async function* bufferedRows() {\n for await (const row of iterateUint8ArrayRows(decoded.pixels, decoded.width, decoded.height)) {\n for (const outScanline of processScanline(state, row.data, row.y)) {\n yield outScanline;\n }\n }\n\n for (const outScanline of flushResize(state)) {\n yield outScanline;\n }\n })();\n }\n\n infoDeferred.resolve({\n width: target.width,\n height: target.height,\n mimeType: 'image/jpeg',\n originalFormat: info.format as EncodedImageInfo['originalFormat'],\n });\n\n try {\n encoder.init(target.width, target.height, options.quality ?? DEFAULT_QUALITY);\n encoder.start();\n\n for await (const scanline of scanlines) {\n encoder.writeScanline(scanline);\n const codecBytes = bytes.byteLength + encoder.getBufferedOutputSize() + encoder.getRowBufferSize();\n stats.update(bytes.byteLength, encoder.getBufferedOutputSize(), codecBytes, codecBytes);\n for (const chunk of encoder.drainChunks()) {\n stats.addBytesOut(chunk.byteLength);\n stats.update(bytes.byteLength, encoder.getBufferedOutputSize(), codecBytes, codecBytes);\n yield chunk;\n }\n }\n\n for (const chunk of encoder.finish()) {\n stats.addBytesOut(chunk.byteLength);\n const codecBytes = bytes.byteLength + encoder.getBufferedOutputSize() + encoder.getRowBufferSize();\n stats.update(bytes.byteLength, encoder.getBufferedOutputSize(), codecBytes, codecBytes);\n yield chunk;\n }\n } finally {\n encoder.dispose();\n }\n}\n\nexport function transform(input: ByteInput | InputSource, options: TransformOptions = {}): EncodedImage {\n const infoDeferred = createDeferred<EncodedImageInfo>();\n const statsDeferred = createDeferred<TransformStats>();\n\n const iteratorFactory = () => (async function* transformIterator() {\n const prepared = await prepareInputSource(input);\n const info = await inspectSource(prepared);\n if (info.format === 'unknown') {\n throw new Error('Unsupported image format');\n }\n\n const stats = new StatsTracker(\n prepared.kind === 'stream' ? 'streaming-input' : 'byte-input'\n );\n\n try {\n if (info.format === 'jpeg') {\n yield* runJpegTransform(prepared, info, options, infoDeferred, stats);\n } else {\n yield* runBufferedTransform(prepared, info, options, infoDeferred, stats);\n }\n\n statsDeferred.resolve(stats.snapshot());\n } catch (error) {\n infoDeferred.reject(error);\n statsDeferred.reject(error);\n throw error;\n }\n })();\n\n return createEncodedImage(iteratorFactory, infoDeferred.promise, statsDeferred.promise);\n}\n\nexport async function ready(options: { wasm?: WebAssembly.Module | ArrayBuffer } = {}): Promise<void> {\n if (options.wasm instanceof WebAssembly.Module) {\n await initWithWasmModule(options.wasm);\n return;\n }\n\n if (options.wasm instanceof ArrayBuffer) {\n const compiled = await WebAssembly.compile(options.wasm);\n await initWithWasmModule(compiled);\n return;\n }\n\n await loadWasm();\n}\n\nexport async function collect(image: EncodedImage): Promise<{\n data: ArrayBuffer;\n info: EncodedImageInfo;\n stats: TransformStats;\n}> {\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n for await (const chunk of image) {\n chunks.push(chunk);\n total += chunk.byteLength;\n }\n\n const merged = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return {\n data: merged.buffer.slice(merged.byteOffset, merged.byteOffset + merged.byteLength),\n info: await image.info,\n stats: await image.stats,\n };\n}\n\nexport function toReadableStream(image: EncodedImage): ReadableStream<Uint8Array> {\n const iterator = image[Symbol.asyncIterator]();\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n return;\n }\n\n controller.enqueue(value);\n },\n async cancel(reason) {\n if (typeof iterator.return === 'function') {\n await iterator.return(reason);\n }\n },\n });\n}\n\nexport function toResponse(image: EncodedImage, init: ResponseInit = {}): Response {\n const headers = new Headers(init.headers);\n headers.set('Content-Type', 'image/jpeg');\n\n return new Response(toReadableStream(image), {\n ...init,\n headers,\n });\n}\n\nexport { inspect };\n"]}