@workglow/util 0.2.17 → 0.2.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.js +33 -2
- package/dist/browser.js.map +5 -4
- package/dist/bun.js +33 -2
- package/dist/bun.js.map +5 -4
- package/dist/di/Container.d.ts +0 -3
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/PortCodecRegistry.d.ts +14 -0
- package/dist/di/PortCodecRegistry.d.ts.map +1 -0
- package/dist/di/index.d.ts +1 -0
- package/dist/di/index.d.ts.map +1 -1
- package/dist/media/color.d.ts +3 -3
- package/dist/media/color.d.ts.map +1 -1
- package/dist/media/cpuImage.d.ts +29 -0
- package/dist/media/cpuImage.d.ts.map +1 -0
- package/dist/media/encode.d.ts +11 -0
- package/dist/media/encode.d.ts.map +1 -0
- package/dist/media/filterRegistry.d.ts +13 -0
- package/dist/media/filterRegistry.d.ts.map +1 -0
- package/dist/media/gpuDevice.browser.d.ts +8 -0
- package/dist/media/gpuDevice.browser.d.ts.map +1 -0
- package/dist/media/gpuImage.d.ts +50 -0
- package/dist/media/gpuImage.d.ts.map +1 -0
- package/dist/media/gpuImageSchema.d.ts +8 -0
- package/dist/media/gpuImageSchema.d.ts.map +1 -0
- package/dist/media/imageCacheCodec.d.ts +9 -0
- package/dist/media/imageCacheCodec.d.ts.map +1 -0
- package/dist/media/imageHydrationResolver.d.ts +2 -0
- package/dist/media/imageHydrationResolver.d.ts.map +1 -0
- package/dist/media/imageRasterCodecRegistry.d.ts.map +1 -1
- package/dist/media/previewBudget.d.ts +23 -0
- package/dist/media/previewBudget.d.ts.map +1 -0
- package/dist/media/shaderRegistry.browser.d.ts +13 -0
- package/dist/media/shaderRegistry.browser.d.ts.map +1 -0
- package/dist/media/sharpImage.bun.d.ts +7 -0
- package/dist/media/sharpImage.bun.d.ts.map +1 -0
- package/dist/media/sharpImage.node.d.ts +93 -0
- package/dist/media/sharpImage.node.d.ts.map +1 -0
- package/dist/media/texturePool.browser.d.ts +17 -0
- package/dist/media/texturePool.browser.d.ts.map +1 -0
- package/dist/media/webGpuImage.browser.d.ts +40 -0
- package/dist/media/webGpuImage.browser.d.ts.map +1 -0
- package/dist/media-browser.d.ts +18 -3
- package/dist/media-browser.d.ts.map +1 -1
- package/dist/media-browser.js +850 -404
- package/dist/media-browser.js.map +21 -7
- package/dist/media-node.d.ts +21 -2
- package/dist/media-node.d.ts.map +1 -1
- package/dist/media-node.js +695 -312
- package/dist/media-node.js.map +20 -6
- package/dist/node.js +33 -2
- package/dist/node.js.map +5 -4
- package/dist/worker-browser.js +33 -2
- package/dist/worker-browser.js.map +5 -4
- package/dist/worker-bun.js +33 -2
- package/dist/worker-bun.js.map +5 -4
- package/dist/worker-node.js +33 -2
- package/dist/worker-node.js.map +5 -4
- package/package.json +4 -1
- package/dist/media/Image.browser.d.ts +0 -24
- package/dist/media/Image.browser.d.ts.map +0 -1
- package/dist/media/Image.d.ts +0 -100
- package/dist/media/Image.d.ts.map +0 -1
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/media/
|
|
3
|
+
"sources": ["../src/media/imageCacheCodec.ts", "../src/media/gpuImage.ts", "../src/media/imageRasterCodecRegistry.ts", "../src/media/cpuImage.ts", "../src/di/Container.ts", "../src/di/ServiceRegistry.ts", "../src/di/InputResolverRegistry.ts", "../src/media/imageHydrationResolver.ts", "../src/media/color.ts", "../src/media/encode.ts", "../src/media/filterRegistry.ts", "../src/media/gpuDevice.browser.ts", "../src/media/gpuImageSchema.ts", "../src/media/imageTypes.ts", "../src/media/MediaRawImage.ts", "../src/media/previewBudget.ts", "../src/media/shaderRegistry.browser.ts", "../src/media/texturePool.browser.ts", "../src/media/webGpuImage.browser.ts", "../src/media-browser.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport { registerPortCodec } from \"@workglow/util\";\nimport { CpuImage } from \"./cpuImage\";\nimport type { GpuImage } from \"./gpuImage\";\nimport type { ImageBinary, ImageChannels } from \"./imageTypes\";\n\nexport interface CachedImage {\n kind: \"image-binary\";\n width: number;\n height: number;\n channels: ImageChannels;\n data: Uint8ClampedArray;\n}\n\nregisterPortCodec<GpuImage, CachedImage>(\"image\", {\n async serialize(value) {\n if (typeof (value as unknown as { materialize?: unknown }).materialize !== \"function\") {\n return value as unknown as CachedImage;\n }\n const bin: ImageBinary = await value.materialize();\n return {\n kind: \"image-binary\",\n width: bin.width,\n height: bin.height,\n channels: bin.channels,\n data: bin.data,\n };\n },\n async deserialize(cached) {\n if ((cached as unknown as { kind?: string }).kind !== \"image-binary\") {\n return cached as unknown as GpuImage;\n }\n return CpuImage.fromImageBinary({\n data: cached.data,\n width: cached.width,\n height: cached.height,\n channels: cached.channels,\n }) as unknown as GpuImage;\n },\n});\n",
|
|
6
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { ImageBinary, ImageChannels } from \"./imageTypes\";\n\nexport type GpuImageBackend = \"webgpu\" | \"sharp\" | \"cpu\";\nexport type GpuImageEncodeFormat = \"png\" | \"jpeg\" | \"webp\";\n\nexport interface GpuImage {\n readonly width: number;\n readonly height: number;\n readonly channels: ImageChannels;\n readonly backend: GpuImageBackend;\n /** Ratio of current dims to user's intended (pre-preview-downscale) dims.\n * 1.0 in run mode and any image not derived from a previewSource downscale.\n * < 1.0 after previewSource has fired. Pixel-space task params are\n * multiplied by this before dispatch in preview mode (no-op at 1.0). */\n readonly previewScale: number;\n materialize(): Promise<ImageBinary>;\n toCanvas(canvas: HTMLCanvasElement | OffscreenCanvas): Promise<void>;\n encode(format: GpuImageEncodeFormat, quality?: number): Promise<Uint8Array>;\n /**\n * Increment the refcount by `n` (default 1). Returns `this` for chaining.\n * No-op for backends without external resource lifetime (CpuImage, SharpImage).\n * Throws if the resource has already been reclaimed (count was already 0).\n */\n retain(n?: number): this;\n /**\n * Decrement the refcount by 1. When it hits 0, reclaim the underlying resource\n * (e.g., return the GPU texture to the pool). Throws on release-after-reclaim.\n * No-op for backends without external resource lifetime.\n */\n release(): void;\n}\n\nexport interface GpuImageStatic {\n fromImageBinary(bin: ImageBinary): GpuImage;\n fromImageBinaryAsync?(bin: ImageBinary): Promise<GpuImage>;\n fromDataUri(dataUri: string): Promise<GpuImage>;\n fromBlob(blob: Blob): Promise<GpuImage>;\n fromImageBitmap?(bitmap: ImageBitmap): Promise<GpuImage>;\n}\n\n// Cross-bundle singleton — Vite/Rolldown can produce multiple bundle copies\n// of this file. Without sharing through globalThis, registrations from\n// media-browser.ts could land in one copy while the codec / hydrator query\n// another and throw \"GpuImage.fromDataUri is not registered\".\nconst GLOBAL_FACTORY_KEY = Symbol.for(\"@workglow/util/media/gpuImageFactory\");\nconst _g = globalThis as Record<symbol, unknown>;\nif (!_g[GLOBAL_FACTORY_KEY]) {\n _g[GLOBAL_FACTORY_KEY] = {} as Record<string, unknown>;\n}\nconst factory = _g[GLOBAL_FACTORY_KEY] as Record<string, unknown>;\n\nexport function registerGpuImageFactory<K extends keyof GpuImageStatic>(\n key: K,\n fn: GpuImageStatic[K],\n): void {\n factory[key] = fn;\n}\n\n/**\n * Returns the registered factory function for `key`, or `undefined` if it\n * has not been registered. Prefer this over accessing `GpuImage[key]` directly\n * when the factory is optional — the Proxy throws on missing registrations.\n */\nexport function getGpuImageFactory<K extends keyof GpuImageStatic>(\n key: K,\n): GpuImageStatic[K] | undefined {\n const fn = factory[key];\n return typeof fn === \"function\" ? (fn as GpuImageStatic[K]) : undefined;\n}\n\nexport const GpuImage: GpuImageStatic = new Proxy({} as GpuImageStatic, {\n get(_t, prop) {\n if (typeof prop !== \"string\" || prop === \"then\") return undefined;\n const fn = factory[prop];\n if (typeof fn !== \"function\") {\n throw new Error(`GpuImage.${prop} is not registered. Import the platform entry point.`);\n }\n return fn;\n },\n});\n",
|
|
7
|
+
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ImageBinary } from \"./imageTypes\";\n\nexport interface ImageRasterCodec {\n decodeDataUri(dataUri: string): Promise<ImageBinary>;\n encodeDataUri(image: ImageBinary, mimeType: string): Promise<string>;\n}\n\n// Cross-bundle singleton — Vite/Rolldown can produce multiple bundle copies\n// of this file (e.g. one inlined into the app entry, one inlined into a\n// worker entry). Without sharing through globalThis, tasks would register\n// the codec into one copy while the runner queries another and throws.\nconst GLOBAL_CODEC_KEY = Symbol.for(\"@workglow/util/media/imageRasterCodec\");\nconst _g = globalThis as Record<symbol, unknown>;\n\ninterface CodecSlot { value: ImageRasterCodec | null; }\nif (!_g[GLOBAL_CODEC_KEY]) {\n _g[GLOBAL_CODEC_KEY] = { value: null } satisfies CodecSlot;\n}\nconst slot = _g[GLOBAL_CODEC_KEY] as CodecSlot;\n\nexport function registerImageRasterCodec(next: ImageRasterCodec): void {\n slot.value = next;\n}\n\nexport function getImageRasterCodec(): ImageRasterCodec {\n if (!slot.value) {\n throw new Error(\n \"Image raster codec is not registered. Ensure you import @workglow/tasks from the browser or Node entry (dist/browser.js or dist/node.js), or call registerImageRasterCodec() during startup.\"\n );\n }\n return slot.value;\n}\n",
|
|
8
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { ImageBinary } from \"./imageTypes\";\nimport {\n registerGpuImageFactory,\n type GpuImage as IGpuImage,\n type GpuImageEncodeFormat,\n} from \"./gpuImage\";\nimport { getImageRasterCodec } from \"./imageRasterCodecRegistry\";\n\nconst FORMAT_TO_MIME: Record<GpuImageEncodeFormat, string> = {\n png: \"image/png\",\n jpeg: \"image/jpeg\",\n webp: \"image/webp\",\n};\n\nfunction dataUriToBytes(dataUri: string): Uint8Array {\n const comma = dataUri.indexOf(\",\");\n const b64 = dataUri.slice(comma + 1);\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return bytes;\n}\n\nfunction expandToRgba(bin: ImageBinary): Uint8ClampedArray {\n if (bin.channels === 4) return bin.data;\n const px = bin.width * bin.height;\n const out = new Uint8ClampedArray(px * 4);\n if (bin.channels === 3) {\n for (let i = 0; i < px; i++) {\n out[i * 4 + 0] = bin.data[i * 3 + 0] ?? 0;\n out[i * 4 + 1] = bin.data[i * 3 + 1] ?? 0;\n out[i * 4 + 2] = bin.data[i * 3 + 2] ?? 0;\n out[i * 4 + 3] = 255;\n }\n } else if (bin.channels === 1) {\n for (let i = 0; i < px; i++) {\n const g = bin.data[i] ?? 0;\n out[i * 4 + 0] = g;\n out[i * 4 + 1] = g;\n out[i * 4 + 2] = g;\n out[i * 4 + 3] = 255;\n }\n }\n return out;\n}\n\nexport class CpuImage implements IGpuImage {\n readonly backend = \"cpu\" as const;\n\n private _previewScale: number;\n\n private constructor(private readonly bin: ImageBinary, previewScale: number = 1.0) {\n this._previewScale = previewScale;\n }\n\n get width(): number {\n return this.bin.width;\n }\n get height(): number {\n return this.bin.height;\n }\n get channels(): ImageBinary[\"channels\"] {\n return this.bin.channels;\n }\n\n get previewScale(): number {\n return this._previewScale;\n }\n\n /** @internal — only previewSource and ImageTextTask.executePreview (without-\n * background source case) may call this. */\n _setPreviewScale(scale: number): this {\n this._previewScale = scale;\n return this;\n }\n\n async materialize(): Promise<ImageBinary> {\n return this.bin;\n }\n\n /** @internal — synchronous accessor used by per-filter cpu ops to avoid awaiting materialize(). */\n getBinary(): ImageBinary {\n return this.bin;\n }\n\n async toCanvas(canvas: HTMLCanvasElement | OffscreenCanvas): Promise<void> {\n if (typeof ImageData === \"undefined\") {\n throw new Error(\"CpuImage.toCanvas requires a browser environment with ImageData\");\n }\n const rgba = expandToRgba(this.bin);\n const id = new ImageData(new Uint8ClampedArray(rgba.buffer as ArrayBuffer, rgba.byteOffset, rgba.byteLength), this.bin.width, this.bin.height);\n if (canvas.width !== this.bin.width) canvas.width = this.bin.width;\n if (canvas.height !== this.bin.height) canvas.height = this.bin.height;\n const ctx = canvas.getContext(\"2d\") as\n | CanvasRenderingContext2D\n | OffscreenCanvasRenderingContext2D\n | null;\n if (!ctx) throw new Error(\"CpuImage.toCanvas could not acquire a 2D context\");\n ctx.putImageData(id, 0, 0);\n }\n\n async encode(format: GpuImageEncodeFormat, _quality?: number): Promise<Uint8Array> {\n const codec = getImageRasterCodec();\n const dataUri = await codec.encodeDataUri(this.bin, FORMAT_TO_MIME[format]);\n return dataUriToBytes(dataUri);\n }\n\n retain(_n: number = 1): this {\n // No-op: CpuImage owns no GPU/native resources.\n return this;\n }\n\n release(): void {\n // No-op: CpuImage owns no GPU/native resources.\n }\n\n static fromImageBinary(bin: ImageBinary, previewScale: number = 1.0): CpuImage {\n return new CpuImage(bin, previewScale);\n }\n}\n\n// Universal fallback: register CpuImage as the synchronous-factory implementation.\n// Subsequent backends (WebGpuImage, SharpImage) intentionally do NOT override this\n// because their fromImageBinary is async; the input resolver awaits them directly.\nregisterGpuImageFactory(\"fromImageBinary\", CpuImage.fromImageBinary);\n",
|
|
9
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Simple dependency injection container for managing service instances and dependencies\n */\nexport class Container {\n private services: Map<string, any> = new Map();\n private factories: Map<string, () => any> = new Map();\n private singletons: Set<string> = new Set();\n private resolving: string[] = [];\n\n /**\n * Register a service factory\n * @param token The identifier token for the service\n * @param factory A factory function that creates the service\n * @param singleton Whether the service should be a singleton (created once)\n */\n register<T>(token: string, factory: () => T, singleton = true): void {\n this.factories.set(token, factory);\n if (singleton) {\n this.singletons.add(token);\n }\n }\n\n /**\n * Register a service factory only if the token is not already registered.\n * This is an atomic check-and-register to avoid TOCTOU races.\n * @param token The identifier token for the service\n * @param factory A factory function that creates the service\n * @param singleton Whether the service should be a singleton (created once)\n */\n registerIfAbsent<T>(token: string, factory: () => T, singleton = true): void {\n if (this.factories.has(token) || this.services.has(token)) {\n return;\n }\n this.register(token, factory, singleton);\n }\n\n /**\n * Register an instance as a service\n * @param token The identifier token for the service\n * @param instance The instance to register\n */\n registerInstance<T>(token: string, instance: T): void {\n this.services.set(token, instance);\n this.singletons.add(token);\n }\n\n /**\n * Get a service by its token\n * @param token The identifier token for the service\n * @returns The service instance\n */\n get<T>(token: string): T {\n if (this.services.has(token)) {\n return this.services.get(token) as T;\n }\n\n const factory = this.factories.get(token);\n if (!factory) {\n throw new Error(`Service not registered: ${String(token)}`);\n }\n\n if (this.resolving.includes(token)) {\n const cycle = [...this.resolving.slice(this.resolving.indexOf(token)), token];\n throw new Error(`Circular dependency detected: ${cycle.join(\" -> \")}`);\n }\n\n this.resolving.push(token);\n try {\n const instance = factory();\n\n if (this.singletons.has(token)) {\n this.services.set(token, instance);\n }\n\n return instance as T;\n } finally {\n this.resolving.pop();\n }\n }\n\n /**\n * Check if a service is registered\n * @param token The identifier token for the service\n * @returns True if the service is registered\n */\n has(token: string): boolean {\n return this.services.has(token) || this.factories.has(token);\n }\n\n /**\n * Remove a service registration\n * @param token The identifier token for the service\n */\n remove(token: string): void {\n this.services.delete(token);\n this.factories.delete(token);\n this.singletons.delete(token);\n }\n\n /**\n * Dispose all instantiated singleton services and clear registrations.\n * Services implementing dispose(), Symbol.asyncDispose, or Symbol.dispose will be cleaned up.\n */\n async dispose(): Promise<void> {\n const errors: unknown[] = [];\n try {\n for (const service of this.services.values()) {\n if (service == null) continue;\n try {\n if (typeof service[Symbol.asyncDispose] === \"function\") {\n await service[Symbol.asyncDispose]();\n } else if (typeof service[Symbol.dispose] === \"function\") {\n service[Symbol.dispose]();\n } else if (typeof service.dispose === \"function\") {\n await service.dispose();\n }\n } catch (err) {\n errors.push(err);\n }\n }\n } finally {\n this.services.clear();\n this.factories.clear();\n this.singletons.clear();\n }\n if (errors.length > 0) {\n throw new AggregateError(errors, \"One or more services failed to dispose\");\n }\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.dispose();\n }\n\n /**\n * Create a child container that inherits registrations from the parent\n * @returns A new child container\n */\n createChildContainer(): Container {\n const child = new Container();\n\n // Copy all registrations to the child\n this.factories.forEach((factory, token) => {\n child.factories.set(token, factory);\n if (this.singletons.has(token)) {\n child.singletons.add(token);\n }\n });\n\n // Copy all singleton instances to the child\n this.services.forEach((service, token) => {\n if (this.singletons.has(token)) {\n child.services.set(token, service);\n child.singletons.add(token);\n }\n });\n\n return child;\n }\n}\n\n/**\n * Global container instance — shared across all bundle copies of this module\n * via a Symbol.for key so that split entry points (e.g. @workglow/util/media)\n * resolve to the same DI registry as @workglow/util.\n */\nconst GLOBAL_CONTAINER_KEY = Symbol.for(\"@workglow/util/di/globalContainer\");\nconst _g = globalThis as Record<symbol, unknown>;\nif (!_g[GLOBAL_CONTAINER_KEY]) {\n _g[GLOBAL_CONTAINER_KEY] = new Container();\n}\nexport const globalContainer = _g[GLOBAL_CONTAINER_KEY] as Container;\n",
|
|
10
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Container, globalContainer } from \"./Container\";\n\n/**\n * Service token type for type-safe dependency injection\n */\nexport interface ServiceToken<T> {\n readonly _type: T;\n readonly id: string;\n}\n\n/**\n * Create a typed service token\n * @param id Unique identifier for the service\n * @returns A typed service token\n */\nexport function createServiceToken<T>(id: string): ServiceToken<T> {\n return { id, _type: null as any };\n}\n\n/**\n * Service registry for managing and accessing services\n */\nexport class ServiceRegistry {\n public container: Container;\n\n /**\n * Create a new service registry\n * @param container Optional container to use (defaults to global container)\n */\n constructor(container: Container = globalContainer) {\n this.container = container;\n }\n\n /**\n * Register a service factory\n * @param token Service token\n * @param factory Factory function to create the service\n * @param singleton Whether the service should be a singleton\n */\n register<T>(token: ServiceToken<T>, factory: () => T, singleton = true): void {\n this.container.register(token.id, factory, singleton);\n }\n\n /**\n * Register a service factory only if the token is not already registered.\n * @param token Service token\n * @param factory Factory function to create the service\n * @param singleton Whether the service should be a singleton\n */\n registerIfAbsent<T>(token: ServiceToken<T>, factory: () => T, singleton = true): void {\n this.container.registerIfAbsent(token.id, factory, singleton);\n }\n\n /**\n * Register a service instance\n * @param token Service token\n * @param instance Service instance to register\n */\n registerInstance<T>(token: ServiceToken<T>, instance: T): void {\n this.container.registerInstance(token.id, instance);\n }\n\n /**\n * Get a service by its token\n * @param token Service token\n * @returns The service instance\n */\n get<T>(token: ServiceToken<T>): T {\n return this.container.get<T>(token.id);\n }\n\n /**\n * Check if a service is registered\n * @param token Service token\n * @returns True if the service is registered\n */\n has<T>(token: ServiceToken<T>): boolean {\n return this.container.has(token.id);\n }\n\n /**\n * Dispose all instantiated services and clear registrations.\n */\n async dispose(): Promise<void> {\n await this.container.dispose();\n }\n}\n\n/**\n * Global service registry instance\n */\nexport const globalServiceRegistry = new ServiceRegistry(globalContainer);\n",
|
|
11
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ServiceRegistry } from \"./ServiceRegistry\";\nimport { createServiceToken, globalServiceRegistry } from \"./ServiceRegistry\";\n\n/**\n * A resolver function that converts a string ID to an instance.\n * Returns undefined if the resolver cannot handle this format.\n * Throws an error if the ID is not found.\n *\n * @param id The string ID to resolve\n * @param format The full format string (e.g., \"model:TextEmbedding\", \"storage:tabular\")\n * @param registry The service registry to use for lookups\n */\nexport type InputResolverFn = (\n id: string,\n format: string,\n registry: ServiceRegistry\n) => unknown | Promise<unknown>;\n\n/**\n * Service token for the input resolver registry.\n * Maps format prefixes to resolver functions.\n */\nexport const INPUT_RESOLVERS =\n createServiceToken<Map<string, InputResolverFn>>(\"task.input.resolvers\");\n\n// Register default factory if not already registered\nglobalServiceRegistry.registerIfAbsent(\n INPUT_RESOLVERS,\n (): Map<string, InputResolverFn> => new Map(),\n true\n);\n\n/**\n * Gets the global input resolver registry\n * @returns Map of format prefix to resolver function\n */\nexport function getInputResolvers(): Map<string, InputResolverFn> {\n return globalServiceRegistry.get(INPUT_RESOLVERS);\n}\n\n/**\n * Registers an input resolver for a format prefix.\n * The resolver will be called for any format that starts with this prefix.\n *\n * @param formatPrefix The format prefix to match (e.g., \"model\", \"dataset\")\n * @param resolver The resolver function\n *\n * @example\n * ```typescript\n * // Register model resolver\n * registerInputResolver(\"model\", async (id, format, registry) => {\n * const modelRepo = registry.get(MODEL_REPOSITORY);\n * const model = await modelRepo.findByName(id);\n * if (!model) throw new Error(`Model \"${id}\" not found`);\n * return model;\n * });\n *\n * // Register dataset resolver\n * registerInputResolver(\"dataset\", (id, format, registry) => {\n * const datasetType = format.split(\":\")[1]; // \"tabular\", \"vector\", etc.\n * if (datasetType === \"tabular\") {\n * const datasets = registry.get(TABULAR_DATASETS);\n * const dataset = datasets.get(id);\n * if (!dataset) throw new Error(`Dataset \"${id}\" not found`);\n * return dataset;\n * }\n * throw new Error(`Unknown dataset type: ${datasetType}`);\n * });\n * ```\n */\nexport function registerInputResolver(formatPrefix: string, resolver: InputResolverFn): void {\n const resolvers = getInputResolvers();\n resolvers.set(formatPrefix, resolver);\n}\n",
|
|
12
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport { registerInputResolver } from \"../di/InputResolverRegistry\";\nimport { GpuImage as GpuImageFactory } from \"./gpuImage\";\nimport type { ServiceRegistry } from \"../di/ServiceRegistry\";\n\n// String-only resolver: invoked when a property's schema has format:\"image\"\n// (or format:\"image:...\"), and the dataflow value is a string. Non-string\n// shapes (Blob, ImageBitmap, ImageBinary) are passed through unchanged by\n// the InputResolver — consumers convert them at the call site if needed\n// (e.g. useGpuImage in the builder app).\nasync function resolveImageString(\n id: string,\n _format: string,\n _registry: ServiceRegistry,\n): Promise<unknown> {\n if (typeof id !== \"string\") return id;\n if (id.startsWith(\"data:\")) {\n return GpuImageFactory.fromDataUri(id);\n }\n // Fail loudly for unrecognized string schemes — silently passing the raw\n // string through would crash the consuming task with a confusing TypeError\n // when it called .materialize() on a string. Other URL schemes (http, file,\n // s3, etc.) need their own resolver under a sub-prefix:\n // registerInputResolver(\"image:http\", httpFetcher)\n const preview = id.length > 32 ? `${id.slice(0, 32)}...` : id;\n throw new Error(\n `format:\"image\" resolver received an unsupported string \"${preview}\". ` +\n `Only data: URIs are handled. For other schemes register a sub-resolver, ` +\n `e.g. registerInputResolver(\"image:http\", fn).`,\n );\n}\n\nregisterInputResolver(\"image\", resolveImageString);\n",
|
|
13
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport interface ColorObject {\n readonly r: number;\n readonly g: number;\n readonly b: number;\n readonly a: number;\n}\n\nconst HEX_PATTERN = /^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\nconst CSS_RGB_CHANNEL = \"(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)\";\nconst CSS_RGB_ALPHA = \"(?:0(?:\\\\.\\\\d+)?|1(?:\\\\.0+)?)\";\nconst CSS_RGB_PATTERN = new RegExp(\n `^rgba?\\\\(\\\\s*(${CSS_RGB_CHANNEL})\\\\s*,\\\\s*(${CSS_RGB_CHANNEL})\\\\s*,\\\\s*(${CSS_RGB_CHANNEL})\\\\s*(?:,\\\\s*(${CSS_RGB_ALPHA}))?\\\\s*\\\\)$`\n);\n\n/**\n * Parse a `#RGB` / `#RGBA` / `#RRGGBB` / `#RRGGBBAA` hex color into a {@link ColorObject}.\n * Case-insensitive on input. No whitespace tolerance. Shorthand nibbles are doubled.\n * Throws on any malformed input.\n */\nexport function parseHexColor(hex: string): ColorObject {\n if (typeof hex !== \"string\" || !HEX_PATTERN.test(hex)) {\n throw new Error(`Invalid hex color: ${String(hex)}`);\n }\n const body = hex.slice(1);\n const double = (nibble: string): number => parseInt(nibble + nibble, 16);\n if (body.length === 3) {\n return { r: double(body[0]!), g: double(body[1]!), b: double(body[2]!), a: 255 };\n }\n if (body.length === 4) {\n return {\n r: double(body[0]!),\n g: double(body[1]!),\n b: double(body[2]!),\n a: double(body[3]!),\n };\n }\n if (body.length === 6) {\n return {\n r: parseInt(body.slice(0, 2), 16),\n g: parseInt(body.slice(2, 4), 16),\n b: parseInt(body.slice(4, 6), 16),\n a: 255,\n };\n }\n return {\n r: parseInt(body.slice(0, 2), 16),\n g: parseInt(body.slice(2, 4), 16),\n b: parseInt(body.slice(4, 6), 16),\n a: parseInt(body.slice(6, 8), 16),\n };\n}\n\nconst CHANNEL_MIN = 0;\nconst CHANNEL_MAX = 255;\n\nfunction assertChannel(name: string, value: number): void {\n if (!Number.isInteger(value) || value < CHANNEL_MIN || value > CHANNEL_MAX) {\n throw new Error(`Color channel ${name} out of range (0-255 integer): ${value}`);\n }\n}\n\nfunction byteToHex(value: number): string {\n return value.toString(16).padStart(2, \"0\");\n}\n\n/**\n * Emit a {@link ColorObject} as `#RRGGBB` when `a === 255`, otherwise `#RRGGBBAA`.\n * Always lowercase, never shorthand. Throws on non-integer or out-of-range channels.\n */\nexport function toHexColor(c: ColorObject): string {\n assertChannel(\"r\", c.r);\n assertChannel(\"g\", c.g);\n assertChannel(\"b\", c.b);\n assertChannel(\"a\", c.a);\n const head = `#${byteToHex(c.r)}${byteToHex(c.g)}${byteToHex(c.b)}`;\n return c.a === 255 ? head : `${head}${byteToHex(c.a)}`;\n}\n\nfunction isInRangeByte(value: unknown): value is number {\n return typeof value === \"number\" && Number.isInteger(value) && value >= 0 && value <= 255;\n}\n\n/**\n * Type guard for a {@link ColorObject}-shaped value (alpha optional).\n * Does not reject extra properties — JSON Schema validation handles that separately.\n */\nexport function isColorObject(value: unknown): value is ColorObject {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const candidate = value as Record<string, unknown>;\n if (!isInRangeByte(candidate.r)) return false;\n if (!isInRangeByte(candidate.g)) return false;\n if (!isInRangeByte(candidate.b)) return false;\n if (candidate.a !== undefined && !isInRangeByte(candidate.a)) return false;\n return true;\n}\n\n/** Type guard for a hex color string (same regex as `parseHexColor`). */\nexport function isHexColor(value: unknown): value is string {\n return typeof value === \"string\" && HEX_PATTERN.test(value);\n}\n\nfunction parseCssRgbColor(value: string): ColorObject {\n const match = CSS_RGB_PATTERN.exec(value);\n if (!match) {\n throw new Error(`Invalid CSS rgb color: ${String(value)}`);\n }\n\n const r = Number.parseInt(match[1] ?? \"\", 10);\n const g = Number.parseInt(match[2] ?? \"\", 10);\n const b = Number.parseInt(match[3] ?? \"\", 10);\n const alpha = match[4] === undefined ? 1 : Number.parseFloat(match[4]);\n assertChannel(\"r\", r);\n assertChannel(\"g\", g);\n assertChannel(\"b\", b);\n if (!Number.isFinite(alpha) || alpha < 0 || alpha > 1) {\n throw new Error(`Color alpha out of range (0-1 number): ${match[4]}`);\n }\n return { r, g, b, a: Math.round(alpha * 255) };\n}\n\n/**\n * Normalize any accepted wire form to a full {@link ColorObject}. Object inputs\n * default `a` to 255; CSS `rgb(...)` / `rgba(...)` strings use 0-1 alpha.\n * Throws on anything that's not an accepted color value.\n */\nexport function resolveColor(\n value: string | { r: number; g: number; b: number; a?: number }\n): ColorObject {\n if (typeof value === \"string\") {\n if (isHexColor(value)) return parseHexColor(value);\n return parseCssRgbColor(value);\n }\n if (!isColorObject(value)) {\n throw new Error(`Invalid color value: ${JSON.stringify(value)}`);\n }\n return {\n r: value.r,\n g: value.g,\n b: value.b,\n a: value.a ?? 255,\n };\n}\n",
|
|
14
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { ImageBinary } from \"./imageTypes\";\nimport { getImageRasterCodec } from \"./imageRasterCodecRegistry\";\n\nasync function encodeImageBinaryBytes(bin: ImageBinary, mimeType: string): Promise<Uint8Array> {\n const dataUri = await getImageRasterCodec().encodeDataUri(bin, mimeType);\n const b64 = dataUri.slice(dataUri.indexOf(\",\") + 1);\n const decoded = atob(b64);\n const bytes = new Uint8Array(decoded.length);\n for (let i = 0; i < decoded.length; i++) bytes[i] = decoded.charCodeAt(i);\n return bytes;\n}\n\nexport async function encodeImageBinaryToPng(bin: ImageBinary): Promise<Uint8Array> {\n return encodeImageBinaryBytes(bin, \"image/png\");\n}\n\nexport async function imageBinaryToBase64Png(bin: ImageBinary): Promise<string> {\n const dataUri = await getImageRasterCodec().encodeDataUri(bin, \"image/png\");\n return dataUri.slice(dataUri.indexOf(\",\") + 1);\n}\n\nexport async function imageBinaryToDataUri(bin: ImageBinary, mimeType = \"image/png\"): Promise<string> {\n return getImageRasterCodec().encodeDataUri(bin, mimeType);\n}\n\nexport async function imageBinaryToBlob(bin: ImageBinary, mimeType = \"image/png\"): Promise<Blob> {\n const bytes = await encodeImageBinaryBytes(bin, mimeType);\n return new Blob([bytes.buffer as ArrayBuffer], { type: mimeType });\n}\n",
|
|
15
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type { GpuImage, GpuImageBackend } from \"./gpuImage\";\n\nexport type FilterOpFn<P = unknown> = (image: GpuImage, params: P) => GpuImage;\n\n// Cross-bundle singleton — same pattern as previewBudget.ts. The registry\n// must be process-wide because filter arms and applyFilter consumers can be\n// loaded through different bundle entries that resolve @workglow/util/media\n// to independent module instances. Storing the Map in a globalThis slot\n// keyed by Symbol.for(...) gives them all a single shared registry.\nconst GLOBAL_REGISTRY_KEY = Symbol.for(\"@workglow/util/media/filterRegistry\");\nconst _g = globalThis as Record<symbol, unknown>;\n\nfunction getRegistry(): Map<string, FilterOpFn<unknown>> {\n let reg = _g[GLOBAL_REGISTRY_KEY] as Map<string, FilterOpFn<unknown>> | undefined;\n if (!reg) {\n reg = new Map();\n _g[GLOBAL_REGISTRY_KEY] = reg;\n }\n return reg;\n}\n\nconst key = (backend: GpuImageBackend, filter: string): string => `${backend}:${filter}`;\n\nexport function registerFilterOp<P>(\n backend: GpuImageBackend,\n filter: string,\n fn: FilterOpFn<P>\n): void {\n getRegistry().set(key(backend, filter), fn as FilterOpFn<unknown>);\n}\n\nexport function applyFilter<P>(image: GpuImage, filter: string, params: P): GpuImage {\n const fn = getRegistry().get(key(image.backend, filter));\n if (!fn) {\n throw new Error(\n `applyFilter(\"${filter}\") on backend \"${image.backend}\": no implementation registered. ` +\n `Task-layer fallback should have routed this to \"cpu\" first; this means even the cpu arm is missing. ` +\n `Ensure @workglow/tasks has been imported so its filter-arm side effects run.`\n );\n }\n return fn(image, params);\n}\n\nexport function hasFilterOp(backend: GpuImageBackend, filter: string): boolean {\n return getRegistry().has(key(backend, filter));\n}\n\n/** @internal — test affordance only. */\nexport function _resetFilterRegistryForTests(): void {\n getRegistry().clear();\n}\n",
|
|
16
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\n\nlet cached: Promise<GPUDevice | null> | null = null;\n\nexport async function getGpuDevice(): Promise<GPUDevice | null> {\n if (cached) return cached;\n cached = (async () => {\n if (typeof navigator === \"undefined\" || !(\"gpu\" in navigator)) return null;\n const adapter = await navigator.gpu.requestAdapter();\n if (!adapter) return null;\n const device = await adapter.requestDevice();\n device.lost.then(() => {\n cached = null;\n });\n return device;\n })();\n return cached;\n}\n\nexport function resetGpuDeviceForTests(): void {\n cached = null;\n}\n",
|
|
17
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { DataPortSchema } from \"../json-schema/DataPortSchema\";\n\nexport function GpuImageSchema(annotations: Record<string, unknown> = {}): DataPortSchema {\n // Runtime shape is the multi-type form `[\"string\", \"object\"]` so the\n // schema validator accepts every wire form image values take:\n // - string (data: URI; the input resolver hydrates it to a GpuImage)\n // - object (raw ImageBinary, Blob, ImageBitmap, or an already-hydrated\n // GpuImage instance — the receiving task hydrates as needed)\n // Validators previously saw a bare `type: \"object\"` and rejected the\n // string form (which is what the property editor produces from file uploads\n // and URL inputs). format: \"image\" remains the signal for the resolver.\n //\n // The cast through `unknown` is needed because DataPortSchemaObject pins\n // `type` to the literal `\"object\"`. Without the cast the inferred return\n // type would widen to DataPortSchemaNonBoolean, which leaks the broader\n // JsonSchema structural type into consumers (FromSchema<typeof X> then\n // emits TS2883 \"name is not portable\" errors). Keeping the public return\n // type as DataPortSchema preserves the consumer experience that worked\n // before this change.\n return {\n type: [\"string\", \"object\"],\n properties: {},\n title: \"Image\",\n description: \"Image (hydrated to GpuImage by the runner)\",\n ...annotations,\n format: \"image\",\n } as unknown as DataPortSchema;\n}\n",
|
|
5
18
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport type ImageChannels = 1 | 3 | 4; // grayscale, rgb, rgba\n\nexport type ImageDataSupport =\n | \"Blob\"\n | \"ImageBinary\"\n | \"ImageBitmap\"\n | \"OffscreenCanvas\"\n | \"VideoFrame\"\n | \"RawImage\"\n | \"DataUri\"\n | \"Sharp\";\n\nexport interface ImageBinary {\n data: Uint8ClampedArray;\n width: number;\n height: number;\n channels: ImageChannels;\n rawChannels?: number | undefined;\n}\n\n/** RGBA pixel buffer (`channels` is always 4). */\nexport type RgbaImageBinary = Readonly<\n Omit<ImageBinary, \"channels\" | \"rawChannels\"> & { readonly channels: 4 }\n>;\n\nexport function parseDataUri(dataUri: string): {\n mimeType: string;\n base64: string;\n} {\n const match = dataUri.match(/^data:([^;]+);base64,(.+)$/);\n if (!match) {\n throw new Error(\"Invalid base64 data URI\");\n }\n\n return {\n mimeType: match[1], // e.g. \"image/png\"\n base64: match[2],\n };\n}\n",
|
|
6
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport interface ColorObject {\n readonly r: number;\n readonly g: number;\n readonly b: number;\n readonly a: number;\n}\n\nconst HEX_PATTERN = /^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\n\n/**\n * Parse a `#RGB` / `#RGBA` / `#RRGGBB` / `#RRGGBBAA` hex color into a {@link ColorObject}.\n * Case-insensitive on input. No whitespace tolerance. Shorthand nibbles are doubled.\n * Throws on any malformed input.\n */\nexport function parseHexColor(hex: string): ColorObject {\n if (typeof hex !== \"string\" || !HEX_PATTERN.test(hex)) {\n throw new Error(`Invalid hex color: ${String(hex)}`);\n }\n const body = hex.slice(1);\n const double = (nibble: string): number => parseInt(nibble + nibble, 16);\n if (body.length === 3) {\n return { r: double(body[0]!), g: double(body[1]!), b: double(body[2]!), a: 255 };\n }\n if (body.length === 4) {\n return {\n r: double(body[0]!),\n g: double(body[1]!),\n b: double(body[2]!),\n a: double(body[3]!),\n };\n }\n if (body.length === 6) {\n return {\n r: parseInt(body.slice(0, 2), 16),\n g: parseInt(body.slice(2, 4), 16),\n b: parseInt(body.slice(4, 6), 16),\n a: 255,\n };\n }\n return {\n r: parseInt(body.slice(0, 2), 16),\n g: parseInt(body.slice(2, 4), 16),\n b: parseInt(body.slice(4, 6), 16),\n a: parseInt(body.slice(6, 8), 16),\n };\n}\n\nconst CHANNEL_MIN = 0;\nconst CHANNEL_MAX = 255;\n\nfunction assertChannel(name: string, value: number): void {\n if (!Number.isInteger(value) || value < CHANNEL_MIN || value > CHANNEL_MAX) {\n throw new Error(`Color channel ${name} out of range (0-255 integer): ${value}`);\n }\n}\n\nfunction byteToHex(value: number): string {\n return value.toString(16).padStart(2, \"0\");\n}\n\n/**\n * Emit a {@link ColorObject} as `#RRGGBB` when `a === 255`, otherwise `#RRGGBBAA`.\n * Always lowercase, never shorthand. Throws on non-integer or out-of-range channels.\n */\nexport function toHexColor(c: ColorObject): string {\n assertChannel(\"r\", c.r);\n assertChannel(\"g\", c.g);\n assertChannel(\"b\", c.b);\n assertChannel(\"a\", c.a);\n const head = `#${byteToHex(c.r)}${byteToHex(c.g)}${byteToHex(c.b)}`;\n return c.a === 255 ? head : `${head}${byteToHex(c.a)}`;\n}\n\nfunction isInRangeByte(value: unknown): value is number {\n return typeof value === \"number\" && Number.isInteger(value) && value >= 0 && value <= 255;\n}\n\n/**\n * Type guard for a {@link ColorObject}-shaped value (alpha optional).\n * Does not reject extra properties — JSON Schema validation handles that separately.\n */\nexport function isColorObject(value: unknown): value is ColorObject {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const candidate = value as Record<string, unknown>;\n if (!isInRangeByte(candidate.r)) return false;\n if (!isInRangeByte(candidate.g)) return false;\n if (!isInRangeByte(candidate.b)) return false;\n if (candidate.a !== undefined && !isInRangeByte(candidate.a)) return false;\n return true;\n}\n\n/** Type guard for a hex color string (same regex as `parseHexColor`). */\nexport function isHexColor(value: unknown): value is string {\n return typeof value === \"string\" && HEX_PATTERN.test(value);\n}\n\n/**\n * Normalize either wire form to a full {@link ColorObject}. Object inputs default\n * `a` to 255. Throws on anything that's neither a valid hex string nor a valid\n * color object.\n */\nexport function resolveColor(\n value: string | { r: number; g: number; b: number; a?: number }\n): ColorObject {\n if (typeof value === \"string\") return parseHexColor(value);\n if (!isColorObject(value)) {\n throw new Error(`Invalid color value: ${JSON.stringify(value)}`);\n }\n return {\n r: value.r,\n g: value.g,\n b: value.b,\n a: value.a ?? 255,\n };\n}\n",
|
|
7
|
-
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ImageBinary } from \"./imageTypes\";\n\nexport interface ImageRasterCodec {\n decodeDataUri(dataUri: string): Promise<ImageBinary>;\n encodeDataUri(image: ImageBinary, mimeType: string): Promise<string>;\n}\n\nlet codec: ImageRasterCodec | null = null;\n\nexport function registerImageRasterCodec(next: ImageRasterCodec): void {\n codec = next;\n}\n\nexport function getImageRasterCodec(): ImageRasterCodec {\n if (!codec) {\n throw new Error(\n \"Image raster codec is not registered. Ensure you import @workglow/tasks from the browser or Node entry (dist/browser.js or dist/node.js), or call registerImageRasterCodec() during startup.\"\n );\n }\n return codec;\n}\n",
|
|
8
19
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Structural match for `RawImage` from `@huggingface/transformers`. The HF\n * class carries helpers (`save`, `toCanvas`, `rgb`, ...) that the provider\n * runtime does not invoke on inputs, so a minimal shim over the four data\n * fields is sufficient. If a consumer later needs HF-specific methods we can\n * widen this shim lazily — no need to pull the transformers dep into\n * `@workglow/util/media` today.\n */\nexport class MediaRawImage {\n readonly data: Uint8ClampedArray;\n readonly width: number;\n readonly height: number;\n readonly channels: number;\n\n constructor(data: Uint8ClampedArray, width: number, height: number, channels: number) {\n this.data = data;\n this.width = width;\n this.height = height;\n this.channels = channels;\n }\n}\n\nexport function isMediaRawImageShape(\n value: unknown\n): value is { data: Uint8ClampedArray; width: number; height: number; channels: number } {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n return (\n v.data instanceof Uint8ClampedArray &&\n typeof v.width === \"number\" &&\n typeof v.height === \"number\" &&\n typeof v.channels === \"number\"\n );\n}\n",
|
|
9
|
-
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ImageBinary, ImageChannels, ImageDataSupport } from \"./imageTypes\";\nimport { parseDataUri } from \"./imageTypes\";\nimport { getImageRasterCodec } from \"./imageRasterCodecRegistry\";\nimport { MediaRawImage, isMediaRawImageShape } from \"./MediaRawImage\";\n\n/**\n * Legacy wire format: either a raw `data:image/...;base64,...` URI or a\n * serialized {@link ImageBinary} with `data` as a plain number array\n * (`Array.from(Uint8ClampedArray)`) to avoid the indexed-object pitfall\n * when stringified through `JSON.stringify`.\n */\nexport type ImageJson =\n | string\n | {\n readonly data: readonly number[];\n readonly width: number;\n readonly height: number;\n readonly channels: ImageChannels;\n }\n | {\n // Sentinel for transient browser handles (bitmap / videoFrame /\n // offscreenCanvas) whose pixels haven't been materialized. Lets\n // JSON.stringify of a workflow holding such an image succeed instead\n // of throwing; callers must await getPixels() or getDataUri() before\n // serialization if they need a real round-trip.\n readonly unsynced: true;\n readonly kind: ImageSourceKind;\n };\n\nexport type ImageSourceKind =\n | \"dataUri\"\n | \"pixels\"\n | \"blob\"\n | \"bitmap\"\n | \"videoFrame\"\n | \"offscreenCanvas\";\n\ntype ImageSource =\n | { readonly kind: \"dataUri\"; readonly dataUri: string; readonly mimeType: string }\n | { readonly kind: \"pixels\"; readonly pixels: ImageBinary }\n | { readonly kind: \"blob\"; readonly blob: Blob }\n | { readonly kind: \"bitmap\"; readonly bitmap: ImageBitmap }\n | { readonly kind: \"videoFrame\"; readonly frame: VideoFrame }\n | { readonly kind: \"offscreenCanvas\"; readonly canvas: OffscreenCanvas };\n\nconst IMAGE_BRAND = Symbol.for(\"@workglow/util/media/Image\");\n\nfunction parseDataUriMimeType(dataUri: string): string {\n const match = dataUri.match(/^data:([^;,]+)/);\n const raw = match?.[1]?.trim();\n return raw ? raw.toLowerCase() : \"image/png\";\n}\n\nexport function dataUriToBlob(dataUri: string): Blob {\n const { mimeType, base64 } = parseDataUri(dataUri);\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return new Blob([bytes], { type: mimeType });\n}\n\nfunction toImageBinary(value: {\n data: unknown;\n width: number;\n height: number;\n channels: number;\n rawChannels?: number | undefined;\n}): ImageBinary {\n const ch = value.channels;\n if (ch !== 1 && ch !== 3 && ch !== 4) {\n throw new Error(`Image: unsupported channel count ${ch}`);\n }\n const data = coerceToUint8ClampedArray(value.data);\n return {\n data,\n width: value.width,\n height: value.height,\n channels: ch,\n rawChannels: value.rawChannels,\n };\n}\n\nfunction coerceToUint8ClampedArray(data: unknown): Uint8ClampedArray {\n if (data instanceof Uint8ClampedArray) {\n return data;\n }\n if (ArrayBuffer.isView(data)) {\n return new Uint8ClampedArray(\n (data as ArrayBufferView).buffer,\n (data as ArrayBufferView).byteOffset,\n (data as ArrayBufferView).byteLength\n );\n }\n if (Array.isArray(data)) {\n return Uint8ClampedArray.from(data as ArrayLike<number>);\n }\n if (data && typeof data === \"object\") {\n // Indexed-object form produced by JSON.stringify(Uint8ClampedArray).\n const obj = data as Record<string, unknown>;\n const keys = Object.keys(obj);\n if (keys.length > 0 && keys.every((k) => /^\\d+$/.test(k))) {\n const arr = new Uint8ClampedArray(keys.length);\n for (let i = 0; i < keys.length; i++) {\n arr[i] = Number(obj[String(i)]);\n }\n return arr;\n }\n }\n throw new Error(\"Image: pixel data is not array-like\");\n}\n\n/**\n * Unified image representation: holds a single source (dataUri, pixels, blob,\n * bitmap, video frame, or offscreen canvas) and converts on demand.\n *\n * - `toJSON()` normalizes to `{ kind, ... }`; no `Uint8ClampedArray` indexed-\n * object serialization pitfall.\n * - `fromJSON()` accepts the new discriminated shape **and** legacy shapes\n * (raw data URI, raw `ImageBinary`, indexed-object `data`) for migration.\n * - `toFirstSupported(supports[])` replaces `convertImageDataToUseableForm`.\n */\nexport class Image {\n /** @internal brand so `Image.is` works across realms. */\n readonly [IMAGE_BRAND]: true = true;\n\n private source: ImageSource;\n private pixelsCache: ImageBinary | undefined;\n private dataUriCache: Map<string, string> = new Map();\n private blobCache: Map<string, Blob> = new Map();\n\n private constructor(source: ImageSource) {\n this.source = source;\n }\n\n static fromDataUri(dataUri: string): Image {\n if (!dataUri.startsWith(\"data:\")) {\n throw new Error(\"Image.fromDataUri: input must start with 'data:'\");\n }\n return new Image({ kind: \"dataUri\", dataUri, mimeType: parseDataUriMimeType(dataUri) });\n }\n\n static fromPixels(pixels: ImageBinary): Image {\n return new Image({ kind: \"pixels\", pixels });\n }\n\n static fromBlob(blob: Blob): Image {\n return new Image({ kind: \"blob\", blob });\n }\n\n /** Accepts anything `convertImageDataToUseableForm` accepted today, plus `Image`. */\n static from(value: unknown): Image {\n if (Image.is(value)) {\n return value;\n }\n if (typeof value === \"string\" && value.startsWith(\"data:\")) {\n return Image.fromDataUri(value);\n }\n if (typeof Blob !== \"undefined\" && value instanceof Blob) {\n return Image.fromBlob(value);\n }\n if (typeof ImageBitmap !== \"undefined\" && value instanceof ImageBitmap) {\n return new Image({ kind: \"bitmap\", bitmap: value });\n }\n if (typeof VideoFrame !== \"undefined\" && value instanceof VideoFrame) {\n return new Image({ kind: \"videoFrame\", frame: value });\n }\n if (typeof OffscreenCanvas !== \"undefined\" && value instanceof OffscreenCanvas) {\n return new Image({ kind: \"offscreenCanvas\", canvas: value });\n }\n if (\n value &&\n typeof value === \"object\" &&\n \"data\" in value &&\n \"width\" in value &&\n \"height\" in value &&\n \"channels\" in value\n ) {\n return Image.fromPixels(toImageBinary(value as never));\n }\n throw new Error(`Image.from: unsupported image value of type ${typeof value}`);\n }\n\n static is(value: unknown): value is Image {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as Record<symbol, unknown>)[IMAGE_BRAND] === true\n );\n }\n\n /**\n * Reconstruct an {@link Image} from its serialized form. Accepts a raw\n * `data:` URI string, a pixel-backed object `{data,width,height,channels}`\n * (with `data` as typed array, plain array, or the indexed-object pitfall\n * produced by `JSON.stringify(Uint8ClampedArray)`), or an `Image` instance.\n */\n static fromJSON(value: unknown): Image {\n if (Image.is(value)) {\n return value;\n }\n if (typeof value === \"string\" && value.startsWith(\"data:\")) {\n return Image.fromDataUri(value);\n }\n if (value && typeof value === \"object\" && (value as { unsynced?: unknown }).unsynced === true) {\n const kind = (value as { kind?: unknown }).kind;\n throw new Error(\n `Image.fromJSON: cannot reconstruct image from \"unsynced\" sentinel (kind=${String(kind)}); pixels were not materialized before serialization. Call await image.getPixels() before JSON.stringify.`\n );\n }\n if (\n value &&\n typeof value === \"object\" &&\n \"data\" in value &&\n typeof (value as { width?: unknown }).width === \"number\" &&\n typeof (value as { height?: unknown }).height === \"number\" &&\n typeof (value as { channels?: unknown }).channels === \"number\"\n ) {\n const v = value as {\n data: unknown;\n width: number;\n height: number;\n channels: number;\n };\n return Image.fromPixels(\n toImageBinary({\n data: v.data,\n width: v.width,\n height: v.height,\n channels: v.channels,\n })\n );\n }\n throw new Error(\"Image.fromJSON: value does not match any known Image shape\");\n }\n\n get kind(): ImageSourceKind {\n return this.source.kind;\n }\n\n get mimeType(): string | undefined {\n if (this.source.kind === \"dataUri\") return this.source.mimeType;\n if (this.source.kind === \"blob\") return this.source.blob.type || undefined;\n return undefined;\n }\n\n get width(): number | undefined {\n if (this.source.kind === \"pixels\") return this.source.pixels.width;\n if (this.source.kind === \"bitmap\") return this.source.bitmap.width;\n if (this.source.kind === \"offscreenCanvas\") return this.source.canvas.width;\n if (this.source.kind === \"videoFrame\") return this.source.frame.displayWidth;\n return this.pixelsCache?.width;\n }\n\n get height(): number | undefined {\n if (this.source.kind === \"pixels\") return this.source.pixels.height;\n if (this.source.kind === \"bitmap\") return this.source.bitmap.height;\n if (this.source.kind === \"offscreenCanvas\") return this.source.canvas.height;\n if (this.source.kind === \"videoFrame\") return this.source.frame.displayHeight;\n return this.pixelsCache?.height;\n }\n\n get channels(): ImageChannels | undefined {\n if (this.source.kind === \"pixels\") return this.source.pixels.channels;\n return this.pixelsCache?.channels;\n }\n\n async getPixels(): Promise<ImageBinary> {\n if (this.pixelsCache) return this.pixelsCache;\n if (this.source.kind === \"pixels\") {\n this.pixelsCache = this.source.pixels;\n return this.pixelsCache;\n }\n if (this.source.kind === \"dataUri\") {\n this.pixelsCache = await getImageRasterCodec().decodeDataUri(this.source.dataUri);\n return this.pixelsCache;\n }\n if (this.source.kind === \"blob\") {\n const dataUri = await blobToDataUri(this.source.blob);\n this.pixelsCache = await getImageRasterCodec().decodeDataUri(dataUri);\n return this.pixelsCache;\n }\n throw new Error(\n `Image.getPixels: browser-only source '${this.source.kind}' requires Image.browser augmentation`\n );\n }\n\n async getDataUri(mimeType: string = \"image/png\"): Promise<string> {\n if (this.source.kind === \"dataUri\") {\n if (mimeType === this.source.mimeType) {\n return this.source.dataUri;\n }\n }\n const cached = this.dataUriCache.get(mimeType);\n if (cached) return cached;\n const pixels = await this.getPixels();\n const dataUri = await getImageRasterCodec().encodeDataUri(pixels, mimeType);\n this.dataUriCache.set(mimeType, dataUri);\n return dataUri;\n }\n\n async getBlob(mimeType: string = \"image/png\"): Promise<Blob> {\n if (this.source.kind === \"blob\" && (!mimeType || this.source.blob.type === mimeType)) {\n return this.source.blob;\n }\n const cached = this.blobCache.get(mimeType);\n if (cached) return cached;\n if (this.source.kind === \"dataUri\" && this.source.mimeType === mimeType) {\n const blob = dataUriToBlob(this.source.dataUri);\n this.blobCache.set(mimeType, blob);\n return blob;\n }\n const dataUri = await this.getDataUri(mimeType);\n const blob = dataUriToBlob(dataUri);\n this.blobCache.set(mimeType, blob);\n return blob;\n }\n\n /**\n * Return the first representation in `supports` that can be produced on\n * this platform. Mirrors the list-order semantics of the former\n * `convertImageDataToUseableForm`: earlier entries win.\n */\n async toFirstSupported(supports: readonly ImageDataSupport[]): Promise<unknown> {\n const canonical = this.canonicalSupport();\n if (canonical && supports.includes(canonical)) {\n return this.currentSourceValue();\n }\n for (const want of supports) {\n switch (want) {\n case \"ImageBinary\":\n return this.getPixels();\n case \"Blob\":\n return this.getBlob();\n case \"DataUri\":\n return this.getDataUri();\n case \"RawImage\": {\n const p = await this.getPixels();\n return new MediaRawImage(p.data, p.width, p.height, p.channels);\n }\n case \"ImageBitmap\":\n case \"VideoFrame\":\n case \"OffscreenCanvas\": {\n const asBrowser = this as unknown as {\n toFirstSupportedBrowser?: (want: ImageDataSupport) => Promise<unknown> | undefined;\n };\n if (asBrowser.toFirstSupportedBrowser) {\n const produced = await asBrowser.toFirstSupportedBrowser(want);\n if (produced !== undefined) return produced;\n }\n continue;\n }\n case \"Sharp\":\n continue;\n }\n }\n throw new Error(\n `Image.toFirstSupported: none of [${supports.join(\", \")}] can be produced on this platform`\n );\n }\n\n toJSON(): ImageJson {\n if (this.source.kind === \"dataUri\") {\n return this.source.dataUri;\n }\n const pixels = this.source.kind === \"pixels\" ? this.source.pixels : this.pixelsCache;\n if (pixels) {\n return {\n data: Array.from(pixels.data),\n width: pixels.width,\n height: pixels.height,\n channels: pixels.channels,\n };\n }\n return { unsynced: true, kind: this.source.kind };\n }\n\n private canonicalSupport(): ImageDataSupport | undefined {\n switch (this.source.kind) {\n case \"dataUri\":\n return \"DataUri\";\n case \"pixels\":\n return \"ImageBinary\";\n case \"blob\":\n return \"Blob\";\n case \"bitmap\":\n return \"ImageBitmap\";\n case \"videoFrame\":\n return \"VideoFrame\";\n case \"offscreenCanvas\":\n return \"OffscreenCanvas\";\n }\n }\n\n /** @internal */\n getSource(): ImageSource {\n return this.source;\n }\n\n /** @internal */\n setPixelsCache(pixels: ImageBinary): void {\n this.pixelsCache = pixels;\n }\n\n private currentSourceValue(): unknown {\n switch (this.source.kind) {\n case \"dataUri\":\n return this.source.dataUri;\n case \"pixels\":\n return this.source.pixels;\n case \"blob\":\n return this.source.blob;\n case \"bitmap\":\n return this.source.bitmap;\n case \"videoFrame\":\n return this.source.frame;\n case \"offscreenCanvas\":\n return this.source.canvas;\n }\n }\n}\n\nasync function blobToDataUri(blob: Blob): Promise<string> {\n const buffer = await blob.arrayBuffer();\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n const CHUNK = 8192;\n for (let i = 0; i < bytes.byteLength; i += CHUNK) {\n binary += String.fromCharCode(...bytes.subarray(i, i + CHUNK));\n }\n const mime = blob.type || \"image/png\";\n return `data:${mime};base64,${btoa(binary)}`;\n}\n\nexport { MediaRawImage, isMediaRawImageShape };\n",
|
|
10
|
-
"/**\n * @
|
|
20
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { GpuImage } from \"./gpuImage\";\n\n/**\n * Cross-bundle singleton — the previewSource helper needs a backend-specific\n * resize op. Rather than importing from @workglow/tasks (a downstream\n * package, which would invert the dependency graph), the preview helper\n * accepts a resize-fn callback registered at startup by the consumer.\n *\n * The budget value is also held in a globalThis slot so multiple bundle\n * copies of this module (Vite/Rolldown can produce them) share a single\n * source of truth — without it, setPreviewBudget would silently no-op in\n * any bundle that didn't perform the call.\n */\nconst GLOBAL_RESIZE_KEY = Symbol.for(\"@workglow/util/media/previewResizeFn\");\nconst GLOBAL_BUDGET_KEY = Symbol.for(\"@workglow/util/media/previewBudget\");\nconst _g = globalThis as Record<symbol, unknown>;\n\nexport type PreviewResizeFn = (image: GpuImage, w: number, h: number) => GpuImage;\n\nconst DEFAULT_BUDGET = 512;\n\nif (typeof _g[GLOBAL_BUDGET_KEY] !== \"number\") {\n _g[GLOBAL_BUDGET_KEY] = DEFAULT_BUDGET;\n}\n\nexport function registerPreviewResizeFn(fn: PreviewResizeFn): void {\n _g[GLOBAL_RESIZE_KEY] = fn;\n}\n\nfunction getPreviewResizeFn(): PreviewResizeFn | undefined {\n return _g[GLOBAL_RESIZE_KEY] as PreviewResizeFn | undefined;\n}\n\nexport function getPreviewBudget(): number {\n return _g[GLOBAL_BUDGET_KEY] as number;\n}\n\nexport function setPreviewBudget(px: number): void {\n if (!Number.isFinite(px) || px <= 0) {\n throw new Error(`setPreviewBudget: invalid value ${px}; expected a positive finite number`);\n }\n _g[GLOBAL_BUDGET_KEY] = Math.floor(px);\n}\n\n/**\n * Scale-then-effect entry for `executePreview`. Returns a downscaled image\n * when the input's longer edge exceeds the budget AND the backend benefits\n * (webgpu only). Otherwise returns the input unchanged — referential\n * equality is the signal to callers that no transient was created.\n *\n * Calling code that wants downscale must call `registerPreviewResizeFn` at\n * startup with a callback that performs the resize (typically routed through\n * @workglow/tasks's applyFilter). Without registration, previewSource is\n * a no-op even on webgpu inputs.\n */\nexport function previewSource(image: GpuImage): GpuImage {\n if (image.backend !== \"webgpu\") return image;\n const budget = getPreviewBudget();\n const long = Math.max(image.width, image.height);\n if (long <= budget) return image;\n const ratio = budget / long;\n const resize = getPreviewResizeFn();\n if (!resize) return image;\n const result = resize(image, Math.round(image.width * ratio), Math.round(image.height * ratio));\n // Compose: newScale = inputScale × downscaleRatio. The resize op produces an\n // image whose previewScale equals input's (apply() propagation rule). We\n // override it here — previewSource is the only place that *changes* previewScale.\n const composed = image.previewScale * ratio;\n return (result as unknown as { _setPreviewScale(s: number): GpuImage })._setPreviewScale(composed);\n}\n",
|
|
21
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\n\nexport const VERTEX_PRELUDE = `\n@group(0) @binding(0) var src: texture_2d<f32>;\n@group(0) @binding(1) var src_sampler: sampler;\n\nstruct VsOut {\n @builtin(position) pos: vec4f,\n @location(0) uv: vec2f,\n};\n\n@vertex\nfn vs(@builtin(vertex_index) vid: u32) -> VsOut {\n let xy = vec2f(f32((vid << 1u) & 2u), f32(vid & 2u));\n var out: VsOut;\n out.pos = vec4f(xy * 2.0 - 1.0, 0.0, 1.0);\n out.uv = vec2f(xy.x, 1.0 - xy.y);\n return out;\n}`;\n\n// Used by WebGpuImage.toCanvas to blit a texture to the swap-chain image.\nexport const PASSTHROUGH_SHADER_SRC = `${VERTEX_PRELUDE}\n@fragment\nfn fs(in: VsOut) -> @location(0) vec4f {\n return textureSample(src, src_sampler, in.uv);\n}\n`;\n\nexport interface ShaderCache {\n get(source: string): GPUShaderModule;\n}\n\nexport function createShaderCache(device: GPUDevice): ShaderCache {\n const map = new Map<string, GPUShaderModule>();\n return {\n get(source) {\n let mod = map.get(source);\n if (!mod) {\n mod = device.createShaderModule({ code: source });\n map.set(source, mod);\n }\n return mod;\n },\n };\n}\n\nlet singleton: { device: GPUDevice; cache: ShaderCache } | null = null;\n\nexport function getShaderCache(device: GPUDevice): ShaderCache {\n if (!singleton || singleton.device !== device) {\n singleton = { device, cache: createShaderCache(device) };\n }\n return singleton.cache;\n}\n",
|
|
22
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\n\nexport interface TexturePoolOptions {\n capacityPerSize?: number;\n}\n\nexport interface TexturePool {\n acquire(width: number, height: number, format: GPUTextureFormat): GPUTexture;\n release(texture: GPUTexture): void;\n drain(): void;\n}\n\ninterface PooledTexture {\n texture: GPUTexture;\n width: number;\n height: number;\n format: GPUTextureFormat;\n inPool: boolean;\n}\n\nconst DEFAULT_CAPACITY_PER_SIZE = 8;\nconst TEXTURE_USAGE = 0x04 | 0x10 | 0x01 | 0x02; // TEXTURE_BINDING | RENDER_ATTACHMENT | COPY_SRC | COPY_DST\n\nexport function createTexturePool(device: GPUDevice, opts: TexturePoolOptions = {}): TexturePool {\n const capacity = opts.capacityPerSize ?? DEFAULT_CAPACITY_PER_SIZE;\n const buckets = new Map<string, PooledTexture[]>();\n const owners = new WeakMap<GPUTexture, PooledTexture>();\n\n const sizeClassKey = (w: number, h: number, f: GPUTextureFormat) => `${w}x${h}:${f}`;\n\n return {\n acquire(width, height, format) {\n const k = sizeClassKey(width, height, format);\n const bucket = buckets.get(k);\n if (bucket && bucket.length > 0) {\n const reused = bucket.pop()!;\n reused.inPool = false;\n return reused.texture;\n }\n const texture = device.createTexture({\n size: [width, height, 1],\n format,\n usage: TEXTURE_USAGE,\n });\n const entry: PooledTexture = { texture, width, height, format, inPool: false };\n owners.set(texture, entry);\n return texture;\n },\n\n release(texture) {\n const entry = owners.get(texture);\n if (!entry) return;\n if (entry.inPool) return;\n const k = sizeClassKey(entry.width, entry.height, entry.format);\n let bucket = buckets.get(k);\n if (!bucket) {\n bucket = [];\n buckets.set(k, bucket);\n }\n if (bucket.length >= capacity) {\n owners.delete(texture);\n texture.destroy();\n return;\n }\n entry.inPool = true;\n bucket.push(entry);\n },\n\n drain() {\n for (const bucket of buckets.values()) {\n for (const entry of bucket) {\n owners.delete(entry.texture);\n entry.texture.destroy();\n }\n }\n buckets.clear();\n },\n };\n}\n\nlet singleton: { device: GPUDevice; pool: TexturePool } | null = null;\n\nexport function getTexturePool(device: GPUDevice): TexturePool {\n if (!singleton || singleton.device !== device) {\n singleton?.pool.drain();\n singleton = { device, pool: createTexturePool(device) };\n }\n return singleton.pool;\n}\n\nexport function resetTexturePoolForTests(): void {\n singleton?.pool.drain();\n singleton = null;\n}\n",
|
|
23
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { ImageBinary, ImageChannels } from \"./imageTypes\";\nimport type { GpuImage as IGpuImage, GpuImageEncodeFormat } from \"./gpuImage\";\nimport { getGpuDevice } from \"./gpuDevice.browser\";\nimport { getTexturePool } from \"./texturePool.browser\";\nimport { getShaderCache, PASSTHROUGH_SHADER_SRC } from \"./shaderRegistry.browser\";\n\nconst TEX_FORMAT: GPUTextureFormat = \"rgba8unorm\";\n\nconst finalizers = typeof FinalizationRegistry !== \"undefined\"\n ? new FinalizationRegistry<() => void>((fn) => {\n try { fn(); } catch { /* device lost or pool drained */ }\n })\n : undefined;\n\nexport interface ApplyParams {\n shader: string;\n uniforms: ArrayBuffer | undefined;\n outSize?: { width: number; height: number };\n}\n\nfunction expandToRgba(bin: ImageBinary): Uint8ClampedArray {\n if (bin.channels === 4) return bin.data;\n const px = bin.width * bin.height;\n const out = new Uint8ClampedArray(px * 4);\n if (bin.channels === 3) {\n for (let i = 0; i < px; i++) {\n out[i * 4 + 0] = bin.data[i * 3 + 0] ?? 0;\n out[i * 4 + 1] = bin.data[i * 3 + 1] ?? 0;\n out[i * 4 + 2] = bin.data[i * 3 + 2] ?? 0;\n out[i * 4 + 3] = 255;\n }\n } else if (bin.channels === 1) {\n for (let i = 0; i < px; i++) {\n const g = bin.data[i] ?? 0;\n out[i * 4 + 0] = g;\n out[i * 4 + 1] = g;\n out[i * 4 + 2] = g;\n out[i * 4 + 3] = 255;\n }\n }\n return out;\n}\n\nfunction align(n: number, m: number): number {\n return Math.ceil(n / m) * m;\n}\n\nexport class WebGpuImage implements IGpuImage {\n readonly backend = \"webgpu\" as const;\n readonly channels: ImageChannels = 4;\n\n /** Internal refcount. Initialized to 1 in fromImageBinary/apply. Reclaim at 0. */\n private refcount = 1;\n\n private _previewScale: number;\n\n private constructor(\n private device: GPUDevice,\n private texture: GPUTexture | null,\n readonly width: number,\n readonly height: number,\n previewScale: number = 1.0,\n ) {\n this._previewScale = previewScale;\n if (finalizers && texture) {\n const dev = device;\n const tex = texture;\n finalizers.register(this, () => {\n try { getTexturePool(dev).release(tex); } catch { /* device lost */ }\n }, this);\n }\n }\n\n get previewScale(): number {\n return this._previewScale;\n }\n\n /** @internal — only previewSource and ImageTextTask.executePreview (without-\n * background source case) may call this. Mutates previewScale on this\n * instance and returns this for chaining. */\n _setPreviewScale(scale: number): this {\n this._previewScale = scale;\n return this;\n }\n\n static async fromImageBinary(bin: ImageBinary): Promise<WebGpuImage> {\n const dev = await getGpuDevice();\n if (!dev) throw new Error(\"WebGPU device unavailable; use CpuImage.fromImageBinary instead\");\n const tex = getTexturePool(dev).acquire(bin.width, bin.height, TEX_FORMAT);\n const rgba = bin.channels === 4 ? bin.data : expandToRgba(bin);\n dev.queue.writeTexture(\n { texture: tex },\n rgba,\n { bytesPerRow: bin.width * 4, rowsPerImage: bin.height },\n [bin.width, bin.height, 1],\n );\n return new WebGpuImage(dev, tex, bin.width, bin.height);\n }\n\n apply(params: ApplyParams): WebGpuImage {\n if (!this.texture) throw new Error(\"WebGpuImage.apply called on a released image\");\n const outW = params.outSize?.width ?? this.width;\n const outH = params.outSize?.height ?? this.height;\n const out = getTexturePool(this.device).acquire(outW, outH, TEX_FORMAT);\n const shaderModule = getShaderCache(this.device).get(params.shader);\n const pipeline = this.device.createRenderPipeline({\n layout: \"auto\",\n vertex: { module: shaderModule, entryPoint: \"vs\" },\n fragment: { module: shaderModule, entryPoint: \"fs\", targets: [{ format: TEX_FORMAT }] },\n primitive: { topology: \"triangle-list\" },\n });\n\n const sampler = this.device.createSampler({ magFilter: \"linear\", minFilter: \"linear\" });\n const bindEntries: GPUBindGroupEntry[] = [\n { binding: 0, resource: this.texture.createView() },\n { binding: 1, resource: sampler },\n ];\n if (params.uniforms) {\n const ubo = this.device.createBuffer({\n size: params.uniforms.byteLength,\n usage: 0x40 | 0x08, // UNIFORM | COPY_DST\n });\n this.device.queue.writeBuffer(ubo, 0, params.uniforms);\n bindEntries.push({ binding: 2, resource: { buffer: ubo } });\n }\n const bindGroup = this.device.createBindGroup({\n layout: pipeline.getBindGroupLayout(0),\n entries: bindEntries,\n });\n\n const enc = this.device.createCommandEncoder();\n const pass = enc.beginRenderPass({\n colorAttachments: [{\n view: out.createView(),\n loadOp: \"clear\",\n storeOp: \"store\",\n clearValue: [0, 0, 0, 0],\n }],\n });\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.draw(3);\n pass.end();\n this.device.queue.submit([enc.finish()]);\n\n // Source texture stays alive; the caller owns its refcount and is\n // responsible for `input.release()` when done. The new image returned\n // here starts at refcount 1 and is owned by the caller.\n return new WebGpuImage(this.device, out, outW, outH, this._previewScale);\n }\n\n async materialize(): Promise<ImageBinary> {\n if (!this.texture) throw new Error(\"WebGpuImage.materialize called on a released image\");\n const bytesPerRow = align(this.width * 4, 256);\n const buffer = this.device.createBuffer({\n size: bytesPerRow * this.height,\n usage: 0x01 | 0x08, // MAP_READ | COPY_DST\n });\n const enc = this.device.createCommandEncoder();\n enc.copyTextureToBuffer(\n { texture: this.texture },\n { buffer, bytesPerRow, rowsPerImage: this.height },\n [this.width, this.height, 1],\n );\n this.device.queue.submit([enc.finish()]);\n await buffer.mapAsync(0x01); // MAP_READ\n const mapped = new Uint8Array(buffer.getMappedRange());\n const tightStride = this.width * 4;\n const tight = new Uint8ClampedArray(this.width * this.height * 4);\n if (bytesPerRow === tightStride) {\n tight.set(mapped);\n } else {\n for (let y = 0; y < this.height; y++) {\n tight.set(mapped.subarray(y * bytesPerRow, y * bytesPerRow + tightStride), y * tightStride);\n }\n }\n buffer.unmap();\n buffer.destroy();\n return { data: tight, width: this.width, height: this.height, channels: 4 };\n }\n\n async toCanvas(canvas: HTMLCanvasElement | OffscreenCanvas): Promise<void> {\n if (!this.texture) throw new Error(\"WebGpuImage.toCanvas called on a released image\");\n if (canvas.width !== this.width) canvas.width = this.width;\n if (canvas.height !== this.height) canvas.height = this.height;\n const ctx = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!ctx) throw new Error(\"WebGpuImage.toCanvas requires a webgpu context\");\n const presentationFormat = (navigator.gpu as unknown as { getPreferredCanvasFormat(): GPUTextureFormat }).getPreferredCanvasFormat();\n ctx.configure({ device: this.device, format: presentationFormat, alphaMode: \"premultiplied\" });\n const view = ctx.getCurrentTexture().createView();\n\n const shaderModule = getShaderCache(this.device).get(PASSTHROUGH_SHADER_SRC);\n const pipeline = this.device.createRenderPipeline({\n layout: \"auto\",\n vertex: { module: shaderModule, entryPoint: \"vs\" },\n fragment: { module: shaderModule, entryPoint: \"fs\", targets: [{ format: presentationFormat }] },\n primitive: { topology: \"triangle-list\" },\n });\n const sampler = this.device.createSampler({ magFilter: \"linear\", minFilter: \"linear\" });\n const bindGroup = this.device.createBindGroup({\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: this.texture.createView() },\n { binding: 1, resource: sampler },\n ],\n });\n const enc = this.device.createCommandEncoder();\n const pass = enc.beginRenderPass({\n colorAttachments: [{ view, loadOp: \"clear\", storeOp: \"store\", clearValue: [0, 0, 0, 0] }],\n });\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.draw(3);\n pass.end();\n this.device.queue.submit([enc.finish()]);\n }\n\n async encode(format: GpuImageEncodeFormat, quality?: number): Promise<Uint8Array> {\n const bin = await this.materialize();\n if (typeof OffscreenCanvas === \"undefined\") {\n throw new Error(\"WebGpuImage.encode requires an OffscreenCanvas environment\");\n }\n const off = new OffscreenCanvas(this.width, this.height);\n const ctx = off.getContext(\"2d\");\n if (!ctx) throw new Error(\"WebGpuImage.encode could not acquire a 2D context\");\n ctx.putImageData(new ImageData(bin.data as unknown as Uint8ClampedArray<ArrayBuffer>, this.width, this.height), 0, 0);\n const blob = await off.convertToBlob({ type: `image/${format}`, quality });\n return new Uint8Array(await blob.arrayBuffer());\n }\n\n retain(n: number = 1): this {\n if (this.refcount <= 0) {\n throw new Error(\"WebGpuImage.retain called on a released image\");\n }\n this.refcount += n;\n return this;\n }\n\n release(): void {\n if (this.refcount <= 0) {\n throw new Error(\"WebGpuImage.release called on a released image\");\n }\n this.refcount -= 1;\n if (this.refcount > 0) return;\n if (this.texture) {\n const tex = this.texture;\n this.texture = null;\n if (finalizers) finalizers.unregister(this);\n getTexturePool(this.device).release(tex);\n }\n }\n}\n",
|
|
24
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport \"./media/imageCacheCodec\";\nimport \"./media/imageHydrationResolver\";\n\nexport * from \"./media/color\";\nexport { CpuImage } from \"./media/cpuImage\";\nexport {\n encodeImageBinaryToPng,\n imageBinaryToBase64Png,\n imageBinaryToBlob,\n imageBinaryToDataUri,\n} from \"./media/encode\";\nexport {\n _resetFilterRegistryForTests,\n applyFilter,\n hasFilterOp,\n registerFilterOp,\n} from \"./media/filterRegistry\";\nexport type { FilterOpFn } from \"./media/filterRegistry\";\nexport { getGpuDevice, resetGpuDeviceForTests } from \"./media/gpuDevice.browser\";\nexport {\n getGpuImageFactory,\n GpuImage as GpuImageFactory,\n registerGpuImageFactory,\n} from \"./media/gpuImage\";\nexport type {\n GpuImage,\n GpuImageBackend,\n GpuImageEncodeFormat,\n GpuImageStatic,\n} from \"./media/gpuImage\";\nexport { GpuImageSchema } from \"./media/gpuImageSchema\";\nexport * from \"./media/imageRasterCodecRegistry\";\nexport * from \"./media/imageTypes\";\nexport * from \"./media/MediaRawImage\";\nexport {\n getPreviewBudget,\n previewSource,\n registerPreviewResizeFn,\n setPreviewBudget,\n} from \"./media/previewBudget\";\nexport {\n createShaderCache,\n getShaderCache,\n PASSTHROUGH_SHADER_SRC,\n VERTEX_PRELUDE,\n} from \"./media/shaderRegistry.browser\";\nexport type { ShaderCache } from \"./media/shaderRegistry.browser\";\nexport {\n createTexturePool,\n getTexturePool,\n resetTexturePoolForTests,\n} from \"./media/texturePool.browser\";\nexport type { TexturePool, TexturePoolOptions } from \"./media/texturePool.browser\";\nexport { WebGpuImage } from \"./media/webGpuImage.browser\";\nexport type { ApplyParams } from \"./media/webGpuImage.browser\";\n\nimport { CpuImage as _CpuImage } from \"./media/cpuImage\";\nimport { getGpuDevice as _getGpuDevice } from \"./media/gpuDevice.browser\";\nimport { registerGpuImageFactory as _registerGpuImageFactory } from \"./media/gpuImage\";\nimport { getImageRasterCodec as _getImageRasterCodec } from \"./media/imageRasterCodecRegistry\";\nimport type { ImageBinary as _ImageBinary } from \"./media/imageTypes\";\nimport { WebGpuImage as _WebGpuImage } from \"./media/webGpuImage.browser\";\n\nasync function _preferGpu(bin: _ImageBinary) {\n const dev = await _getGpuDevice();\n return dev ? _WebGpuImage.fromImageBinary(bin) : _CpuImage.fromImageBinary(bin);\n}\n\n_registerGpuImageFactory(\"fromImageBinaryAsync\", _preferGpu);\n\n_registerGpuImageFactory(\"fromDataUri\", async (dataUri: string) => {\n const bin = await _getImageRasterCodec().decodeDataUri(dataUri);\n return _preferGpu(bin);\n});\n\n_registerGpuImageFactory(\"fromBlob\", async (blob: Blob) => {\n const bitmap = await createImageBitmap(blob);\n const off = new OffscreenCanvas(bitmap.width, bitmap.height);\n const ctx = off.getContext(\"2d\");\n if (!ctx) throw new Error(\"fromBlob: could not acquire 2D context\");\n ctx.drawImage(bitmap, 0, 0);\n const id = ctx.getImageData(0, 0, bitmap.width, bitmap.height);\n return _preferGpu({ data: id.data, width: bitmap.width, height: bitmap.height, channels: 4 });\n});\n\n_registerGpuImageFactory(\"fromImageBitmap\", async (bitmap: ImageBitmap) => {\n const off = new OffscreenCanvas(bitmap.width, bitmap.height);\n const ctx = off.getContext(\"2d\");\n if (!ctx) throw new Error(\"fromImageBitmap: could not acquire 2D context\");\n ctx.drawImage(bitmap, 0, 0);\n const id = ctx.getImageData(0, 0, bitmap.width, bitmap.height);\n return _preferGpu({ data: id.data, width: bitmap.width, height: bitmap.height, channels: 4 });\n});\n"
|
|
11
25
|
],
|
|
12
|
-
"mappings": "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",
|
|
13
|
-
"debugId": "
|
|
26
|
+
"mappings": "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",
|
|
27
|
+
"debugId": "006D8DBD8329F1E964756E2164756E21",
|
|
14
28
|
"names": []
|
|
15
29
|
}
|
package/dist/media-node.d.ts
CHANGED
|
@@ -3,9 +3,28 @@
|
|
|
3
3
|
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
import "./media/imageCacheCodec";
|
|
7
|
+
import "./media/imageHydrationResolver";
|
|
7
8
|
export * from "./media/color";
|
|
9
|
+
export { CpuImage } from "./media/cpuImage";
|
|
10
|
+
export { encodeImageBinaryToPng, imageBinaryToBase64Png, imageBinaryToBlob, imageBinaryToDataUri, } from "./media/encode";
|
|
11
|
+
export { _resetFilterRegistryForTests, applyFilter, hasFilterOp, registerFilterOp, } from "./media/filterRegistry";
|
|
12
|
+
export type { FilterOpFn } from "./media/filterRegistry";
|
|
13
|
+
export { getGpuImageFactory, GpuImage as GpuImageFactory, registerGpuImageFactory, } from "./media/gpuImage";
|
|
14
|
+
export type { GpuImage, GpuImageBackend, GpuImageEncodeFormat, GpuImageStatic, } from "./media/gpuImage";
|
|
15
|
+
export { GpuImageSchema } from "./media/gpuImageSchema";
|
|
8
16
|
export * from "./media/imageRasterCodecRegistry";
|
|
17
|
+
export * from "./media/imageTypes";
|
|
9
18
|
export * from "./media/MediaRawImage";
|
|
10
|
-
export
|
|
19
|
+
export { getPreviewBudget, previewSource, registerPreviewResizeFn, setPreviewBudget, } from "./media/previewBudget";
|
|
20
|
+
export declare function getGpuDevice(): Promise<null>;
|
|
21
|
+
export declare function resetGpuDeviceForTests(): void;
|
|
22
|
+
export { createShaderCache, getShaderCache, PASSTHROUGH_SHADER_SRC, VERTEX_PRELUDE, } from "./media/shaderRegistry.browser";
|
|
23
|
+
export type { ShaderCache } from "./media/shaderRegistry.browser";
|
|
24
|
+
export { createTexturePool, getTexturePool, resetTexturePoolForTests, } from "./media/texturePool.browser";
|
|
25
|
+
export type { TexturePool, TexturePoolOptions } from "./media/texturePool.browser";
|
|
26
|
+
export { SharpImage } from "./media/sharpImage.node";
|
|
27
|
+
export type { ApplyParams, WebGpuImage } from "./media/webGpuImage.browser";
|
|
28
|
+
import "./media/imageCacheCodec";
|
|
29
|
+
import "./media/imageHydrationResolver";
|
|
11
30
|
//# sourceMappingURL=media-node.d.ts.map
|
package/dist/media-node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-node.d.ts","sourceRoot":"","sources":["../src/media-node.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,
|
|
1
|
+
{"version":3,"file":"media-node.d.ts","sourceRoot":"","sources":["../src/media-node.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,yBAAyB,CAAC;AACjC,OAAO,gCAAgC,CAAC;AAExC,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,4BAA4B,EAC5B,WAAW,EACX,WAAW,EACX,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,kBAAkB,EAClB,QAAQ,IAAI,eAAe,EAC3B,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,QAAQ,EACR,eAAe,EACf,oBAAoB,EACpB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,cAAc,kCAAkC,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD;AACD,wBAAgB,sBAAsB,IAAI,IAAI,CAAG;AACjD,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAGnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG5E,OAAO,yBAAyB,CAAC;AACjC,OAAO,gCAAgC,CAAC"}
|