From 51cfa187e64e01f70f373c9cea445d586c1d61b5 Mon Sep 17 00:00:00 2001 From: Ronald Burns <7757589+ronaldburns@users.noreply.github.com> Date: Tue, 14 Apr 2026 16:47:06 -0500 Subject: [PATCH 1/2] fix: add ./workerd subpath export for explicit workerd imports Wrangler's esbuild bundler resolves the "workerd" export condition for static imports but not for dynamic imports (await import()). This means consumers using dynamic imports get the Node.js entry (index.js) which imports fs/promises and fails in Workers. Adding ./workerd as an explicit subpath export lets consumers write: import { transform } from "@standardagents/sip/workerd" to get the workerd entry directly, bypassing condition resolution. --- package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/package.json b/package.json index 4c88b41..4696862 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,11 @@ "import": "./dist/index.js", "default": "./dist/index.js" }, + "./workerd": { + "types": "./dist/workerd.d.ts", + "import": "./dist/workerd.js", + "default": "./dist/workerd.js" + }, "./dist/sip.wasm": "./dist/sip.wasm" }, "files": [ From 048d44d16795eb88bc322d30b24f435eb858c540 Mon Sep 17 00:00:00 2001 From: Ronald Burns <7757589+ronaldburns@users.noreply.github.com> Date: Tue, 14 Apr 2026 16:49:40 -0500 Subject: [PATCH 2/2] fix: prevent esbuild from resolving Node.js-only imports Use variable-based dynamic imports for fs/promises and module so esbuild/wrangler cannot statically resolve them at bundle time. These imports are behind runtime Node.js detection and never execute in Workers, but esbuild fails the build because it tries to resolve the string literal import paths. Before: await import('fs/promises') -- esbuild resolves and fails After: const m = 'fs/promises'; await import(m) -- esbuild skips --- dist/index.js | 18 +++++++++++++++--- dist/index.js.map | 2 +- src/decoders/simple.ts | 9 ++++++--- src/wasm/loader.ts | 5 ++++- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/dist/index.js b/dist/index.js index 0637f33..06e4c5b 100644 --- a/dist/index.js +++ b/dist/index.js @@ -37,8 +37,16 @@ async function initCodecWithBinary(initFn, wasmSource) { await initFn(wasmModule2); } async function initCodecForNode(initFn, wasmPath) { - const { readFile } = await import('fs/promises'); - const { createRequire } = await import('module'); + const fsModule = "fs/promises"; + const moduleModule = "module"; + const { readFile } = await import( + /* @vite-ignore */ + fsModule + ); + const { createRequire } = await import( + /* @vite-ignore */ + moduleModule + ); const require2 = createRequire(import.meta.url); const resolvedPath = require2.resolve(wasmPath); const wasmBuffer = await readFile(resolvedPath); @@ -726,7 +734,11 @@ async function doLoadWasm() { } const isNode2 = !isCloudflareWorker2() && typeof process !== "undefined" && process.versions != null && process.versions.node != null; if (isNode2) { - const { readFile } = await import('fs/promises'); + const fsModule = "fs/promises"; + const { readFile } = await import( + /* @vite-ignore */ + fsModule + ); const wasmBinary = await readFile(new URL("./sip.wasm", import.meta.url)); const module2 = await createSipModule({ wasmBinary }); return module2; diff --git a/dist/index.js.map b/dist/index.js.map index 3d5432c..83043d1 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +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).__SIP_CODEC_WASM__;\n if (!globalValue || typeof globalValue !== 'object') {\n return null;\n }\n\n const formatValue = (globalValue as Record)[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,\n wasmSource: CodecWasmBinary\n): Promise {\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,\n wasmPath: string\n): Promise {\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) | 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 {\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;\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): AsyncIterable {\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,\n target = STREAM_CHUNK_TARGET\n): AsyncIterable {\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 | AsyncIterable): AsyncIterable {\n if (typeof ReadableStream !== 'undefined' && input instanceof ReadableStream) {\n return coalesceAsyncIterable(iterateReadableStream(input));\n }\n\n if (typeof (input as AsyncIterable)[Symbol.asyncIterator] === 'function') {\n return coalesceAsyncIterable(input as AsyncIterable);\n }\n\n return coalesceAsyncIterable(input as AsyncIterable);\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 {\n return this.bytes.subarray(0, Math.min(this.bytes.byteLength, target));\n }\n\n open(): AsyncIterable {\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;\n private peekedChunks: Uint8Array[] = [];\n private peekedBytes = 0;\n private opened = false;\n private exhausted = false;\n headerBytes: Uint8Array = new Uint8Array(0);\n\n constructor(input: AsyncIterable, 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 {\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 {\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 {\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), 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 {\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));\n}\n\nexport async function inspect(input: ByteInput): Promise {\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 {\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 {\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 | 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 {\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 {\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 {\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((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 {\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;\n};\n\ntype InfoResolver = {\n resolve: (value: T) => void;\n reject: (reason?: unknown) => void;\n promise: Promise;\n};\n\ntype PreparedSource = Awaited>;\n\nfunction createDeferred(): InfoResolver {\n let resolve!: (value: T) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise((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;\n}): Promise {\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,\n info: Promise<{ width: number; height: number; originalFormat: Exclude }>,\n stats: Promise = 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,\n info: Promise,\n stats: Promise\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 {\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 {\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 }>();\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,\n stats: StatsTracker\n): AsyncIterable {\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,\n stats: StatsTracker\n): AsyncIterable {\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;\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();\n const statsDeferred = createDeferred();\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 {\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 {\n const iterator = image[Symbol.asyncIterator]();\n return new ReadableStream({\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"]} \ No newline at end of file +{"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).__SIP_CODEC_WASM__;\n if (!globalValue || typeof globalValue !== 'object') {\n return null;\n }\n\n const formatValue = (globalValue as Record)[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,\n wasmSource: CodecWasmBinary\n): Promise {\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,\n wasmPath: string\n): Promise {\n // Dynamic module names prevent esbuild/wrangler from resolving these\n // at bundle time. Only Node.js reaches this function at runtime.\n const fsModule = 'fs/promises';\n const moduleModule = 'module';\n const { readFile } = await import(/* @vite-ignore */ fsModule);\n const { createRequire } = await import(/* @vite-ignore */ moduleModule);\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) | 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 {\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;\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): AsyncIterable {\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,\n target = STREAM_CHUNK_TARGET\n): AsyncIterable {\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 | AsyncIterable): AsyncIterable {\n if (typeof ReadableStream !== 'undefined' && input instanceof ReadableStream) {\n return coalesceAsyncIterable(iterateReadableStream(input));\n }\n\n if (typeof (input as AsyncIterable)[Symbol.asyncIterator] === 'function') {\n return coalesceAsyncIterable(input as AsyncIterable);\n }\n\n return coalesceAsyncIterable(input as AsyncIterable);\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 {\n return this.bytes.subarray(0, Math.min(this.bytes.byteLength, target));\n }\n\n open(): AsyncIterable {\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;\n private peekedChunks: Uint8Array[] = [];\n private peekedBytes = 0;\n private opened = false;\n private exhausted = false;\n headerBytes: Uint8Array = new Uint8Array(0);\n\n constructor(input: AsyncIterable, 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 {\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 {\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 {\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), 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 {\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));\n}\n\nexport async function inspect(input: ByteInput): Promise {\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 {\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 {\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 | 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 {\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 {\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 {\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((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 // Dynamic module name prevents esbuild/wrangler from resolving this\n // at bundle time. Only Node.js reaches this branch at runtime.\n const fsModule = 'fs/promises';\n const { readFile } = await import(/* @vite-ignore */ fsModule);\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 {\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;\n};\n\ntype InfoResolver = {\n resolve: (value: T) => void;\n reject: (reason?: unknown) => void;\n promise: Promise;\n};\n\ntype PreparedSource = Awaited>;\n\nfunction createDeferred(): InfoResolver {\n let resolve!: (value: T) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise((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;\n}): Promise {\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,\n info: Promise<{ width: number; height: number; originalFormat: Exclude }>,\n stats: Promise = 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,\n info: Promise,\n stats: Promise\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 {\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 {\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 }>();\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,\n stats: StatsTracker\n): AsyncIterable {\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,\n stats: StatsTracker\n): AsyncIterable {\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;\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();\n const statsDeferred = createDeferred();\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 {\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 {\n const iterator = image[Symbol.asyncIterator]();\n return new ReadableStream({\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"]} \ No newline at end of file diff --git a/src/decoders/simple.ts b/src/decoders/simple.ts index 34d3418..fc71f38 100644 --- a/src/decoders/simple.ts +++ b/src/decoders/simple.ts @@ -74,9 +74,12 @@ async function initCodecForNode( initFn: (module: WebAssembly.Module) => Promise, wasmPath: string ): Promise { - // Dynamic import for Node.js modules - const { readFile } = await import('fs/promises'); - const { createRequire } = await import('module'); + // Dynamic module names prevent esbuild/wrangler from resolving these + // at bundle time. Only Node.js reaches this function at runtime. + const fsModule = 'fs/promises'; + const moduleModule = 'module'; + const { readFile } = await import(/* @vite-ignore */ fsModule); + const { createRequire } = await import(/* @vite-ignore */ moduleModule); const require = createRequire(import.meta.url); // Resolve the WASM file path from the package diff --git a/src/wasm/loader.ts b/src/wasm/loader.ts index 3f83035..cd84793 100644 --- a/src/wasm/loader.ts +++ b/src/wasm/loader.ts @@ -150,7 +150,10 @@ async function doLoadWasm(): Promise { process.versions.node != null; if (isNode) { - const { readFile } = await import('fs/promises'); + // Dynamic module name prevents esbuild/wrangler from resolving this + // at bundle time. Only Node.js reaches this branch at runtime. + const fsModule = 'fs/promises'; + const { readFile } = await import(/* @vite-ignore */ fsModule); const wasmBinary = await readFile(new URL('./sip.wasm', import.meta.url)); const module = await createSipModule({ wasmBinary }); return module as SipWasmModule;