@workglow/util 0.2.16 → 0.2.18

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.
Files changed (66) hide show
  1. package/dist/browser.js +54 -23
  2. package/dist/browser.js.map +7 -6
  3. package/dist/bun.js +54 -23
  4. package/dist/bun.js.map +7 -6
  5. package/dist/di/Container.d.ts +0 -3
  6. package/dist/di/Container.d.ts.map +1 -1
  7. package/dist/di/PortCodecRegistry.d.ts +14 -0
  8. package/dist/di/PortCodecRegistry.d.ts.map +1 -0
  9. package/dist/di/index.d.ts +1 -0
  10. package/dist/di/index.d.ts.map +1 -1
  11. package/dist/media/color.d.ts +3 -3
  12. package/dist/media/color.d.ts.map +1 -1
  13. package/dist/media/cpuImage.d.ts +29 -0
  14. package/dist/media/cpuImage.d.ts.map +1 -0
  15. package/dist/media/encode.d.ts +11 -0
  16. package/dist/media/encode.d.ts.map +1 -0
  17. package/dist/media/filterRegistry.d.ts +13 -0
  18. package/dist/media/filterRegistry.d.ts.map +1 -0
  19. package/dist/media/gpuDevice.browser.d.ts +8 -0
  20. package/dist/media/gpuDevice.browser.d.ts.map +1 -0
  21. package/dist/media/gpuImage.d.ts +50 -0
  22. package/dist/media/gpuImage.d.ts.map +1 -0
  23. package/dist/media/gpuImageSchema.d.ts +8 -0
  24. package/dist/media/gpuImageSchema.d.ts.map +1 -0
  25. package/dist/media/imageCacheCodec.d.ts +9 -0
  26. package/dist/media/imageCacheCodec.d.ts.map +1 -0
  27. package/dist/media/imageHydrationResolver.d.ts +2 -0
  28. package/dist/media/imageHydrationResolver.d.ts.map +1 -0
  29. package/dist/media/imageRasterCodecRegistry.d.ts.map +1 -1
  30. package/dist/media/previewBudget.d.ts +23 -0
  31. package/dist/media/previewBudget.d.ts.map +1 -0
  32. package/dist/media/shaderRegistry.browser.d.ts +13 -0
  33. package/dist/media/shaderRegistry.browser.d.ts.map +1 -0
  34. package/dist/media/sharpImage.bun.d.ts +7 -0
  35. package/dist/media/sharpImage.bun.d.ts.map +1 -0
  36. package/dist/media/sharpImage.node.d.ts +93 -0
  37. package/dist/media/sharpImage.node.d.ts.map +1 -0
  38. package/dist/media/texturePool.browser.d.ts +17 -0
  39. package/dist/media/texturePool.browser.d.ts.map +1 -0
  40. package/dist/media/webGpuImage.browser.d.ts +40 -0
  41. package/dist/media/webGpuImage.browser.d.ts.map +1 -0
  42. package/dist/media-browser.d.ts +18 -3
  43. package/dist/media-browser.d.ts.map +1 -1
  44. package/dist/media-browser.js +850 -404
  45. package/dist/media-browser.js.map +21 -7
  46. package/dist/media-node.d.ts +21 -2
  47. package/dist/media-node.d.ts.map +1 -1
  48. package/dist/media-node.js +695 -312
  49. package/dist/media-node.js.map +20 -6
  50. package/dist/node.js +54 -23
  51. package/dist/node.js.map +7 -6
  52. package/dist/worker/WorkerManager.d.ts +6 -6
  53. package/dist/worker/WorkerManager.d.ts.map +1 -1
  54. package/dist/worker/WorkerServerBase.d.ts +8 -8
  55. package/dist/worker/WorkerServerBase.d.ts.map +1 -1
  56. package/dist/worker-browser.js +54 -23
  57. package/dist/worker-browser.js.map +7 -6
  58. package/dist/worker-bun.js +54 -23
  59. package/dist/worker-bun.js.map +7 -6
  60. package/dist/worker-node.js +54 -23
  61. package/dist/worker-node.js.map +7 -6
  62. package/package.json +4 -1
  63. package/dist/media/Image.browser.d.ts +0 -24
  64. package/dist/media/Image.browser.d.ts.map +0 -1
  65. package/dist/media/Image.d.ts +0 -100
  66. package/dist/media/Image.d.ts.map +0 -1
@@ -1,21 +1,22 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/di/Container.ts", "../src/di/ServiceRegistry.ts", "../src/di/InputCompactorRegistry.ts", "../src/di/InputResolverRegistry.ts", "../src/logging/ConsoleLogger.ts", "../src/logging/NullLogger.ts", "../src/utilities/runtimeEnv.ts", "../src/logging/LoggerRegistry.ts", "../src/worker/WorkerServerBase.ts", "../src/worker/WorkerManager.ts", "../src/json-schema/parsePartialJson.ts", "../src/worker/Worker.bun.ts"],
3
+ "sources": ["../src/di/Container.ts", "../src/di/ServiceRegistry.ts", "../src/di/InputCompactorRegistry.ts", "../src/di/InputResolverRegistry.ts", "../src/di/PortCodecRegistry.ts", "../src/logging/ConsoleLogger.ts", "../src/logging/NullLogger.ts", "../src/utilities/runtimeEnv.ts", "../src/logging/LoggerRegistry.ts", "../src/worker/WorkerServerBase.ts", "../src/worker/WorkerManager.ts", "../src/json-schema/parsePartialJson.ts", "../src/worker/Worker.bun.ts"],
4
4
  "sourcesContent": [
5
- "/**\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\n */\nexport const globalContainer = new Container();\n",
5
+ "/**\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",
6
6
  "/**\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",
7
7
  "/**\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 compactor function that converts a resolved instance back to its string ID.\n * Returns undefined if the value cannot be compacted (e.g., missing ID field).\n *\n * @param value The resolved instance to compact\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 InputCompactorFn = (\n value: unknown,\n format: string,\n registry: ServiceRegistry\n) => string | undefined | Promise<string | undefined>;\n\n/**\n * Service token for the input compactor registry.\n * Maps format prefixes to compactor functions.\n */\nexport const INPUT_COMPACTORS =\n createServiceToken<Map<string, InputCompactorFn>>(\"task.input.compactors\");\n\n// Register default factory if not already registered\nglobalServiceRegistry.registerIfAbsent(\n INPUT_COMPACTORS,\n (): Map<string, InputCompactorFn> => new Map(),\n true\n);\n\n/**\n * Gets the global input compactor registry\n * @returns Map of format prefix to compactor function\n */\nexport function getInputCompactors(): Map<string, InputCompactorFn> {\n return globalServiceRegistry.get(INPUT_COMPACTORS);\n}\n\n/**\n * Registers an input compactor for a format prefix.\n * The compactor will be called to convert resolved instances back to string IDs.\n *\n * @param formatPrefix The format prefix to match (e.g., \"model\", \"knowledge-base\")\n * @param compactor The compactor function\n *\n * @example\n * ```typescript\n * // Register model compactor — extracts model_id from a ModelConfig\n * registerInputCompactor(\"model\", (value) => {\n * if (typeof value === \"object\" && value !== null && \"model_id\" in value) {\n * const id = (value as Record<string, unknown>).model_id;\n * return typeof id === \"string\" ? id : undefined;\n * }\n * return undefined;\n * });\n * ```\n */\nexport function registerInputCompactor(formatPrefix: string, compactor: InputCompactorFn): void {\n const compactors = getInputCompactors();\n compactors.set(formatPrefix, compactor);\n}\n",
8
8
  "/**\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",
9
+ "/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\n\nexport interface PortCodec<Live = unknown, Wire = unknown> {\n serialize(value: Live): Promise<Wire>;\n deserialize(value: Wire): Promise<Live>;\n}\n\n/**\n * Codec registry shared across bundle copies via a Symbol.for key — same pattern\n * as globalContainer. Without this, split entry points (e.g. @workglow/util,\n * @workglow/util/media, @workglow/task-graph) could each see their own Map and\n * fail to find codecs registered by sibling entries.\n */\nconst GLOBAL_CODECS_KEY = Symbol.for(\"@workglow/util/di/portCodecs\");\nconst _g = globalThis as Record<symbol, unknown>;\nif (!_g[GLOBAL_CODECS_KEY]) {\n _g[GLOBAL_CODECS_KEY] = new Map<string, PortCodec>();\n}\nconst codecs = _g[GLOBAL_CODECS_KEY] as Map<string, PortCodec>;\n\nexport function registerPortCodec<Live = unknown, Wire = unknown>(\n formatPrefix: string,\n codec: PortCodec<Live, Wire>,\n): void {\n codecs.set(formatPrefix, codec as PortCodec);\n}\n\nexport function getPortCodec(format: string): PortCodec | undefined {\n if (codecs.has(format)) return codecs.get(format);\n const colon = format.indexOf(\":\");\n if (colon > 0) {\n const prefix = format.slice(0, colon);\n return codecs.get(prefix);\n }\n return undefined;\n}\n\n/** @internal — test affordance only. */\nexport function _resetPortCodecsForTests(): void {\n codecs.clear();\n}\n",
9
10
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ILogger } from \"./ILogger\";\n\n/**\n * Log-level names in ascending severity order.\n */\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n\nconst LOG_LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 4,\n};\n\nexport interface ConsoleLoggerOptions {\n readonly bindings?: Record<string, unknown>;\n readonly level?: LogLevel;\n readonly timings?: boolean;\n}\n\n/**\n * Logger that delegates to the global `console` object.\n * When created via {@link child}, accumulated bindings are passed\n * as a second argument to every console call.\n *\n * Supports optional level filtering (messages below the configured\n * level are silently discarded) and an opt-in `timings` flag that\n * controls whether {@link time}/{@link timeEnd} produce output.\n */\nexport class ConsoleLogger implements ILogger {\n private readonly bindings: Record<string, unknown>;\n private readonly level: LogLevel;\n private readonly timings: boolean;\n\n constructor(options: ConsoleLoggerOptions = {}) {\n this.bindings = options.bindings ?? {};\n this.level = options.level ?? \"debug\";\n this.timings = options.timings ?? false;\n }\n\n private enabled(level: LogLevel): boolean {\n return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[this.level];\n }\n\n info(message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"info\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.info(message, merged);\n } else {\n console.info(message);\n }\n }\n\n warn(message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"warn\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.warn(message, merged);\n } else {\n console.warn(message);\n }\n }\n\n error(message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"error\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.error(message, merged);\n } else {\n console.error(message);\n }\n }\n\n debug(message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"debug\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.debug(message, merged);\n } else {\n console.debug(message);\n }\n }\n\n fatal(err: Error, message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"fatal\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.error(message, { ...merged, error: err });\n } else {\n console.error(message, { error: err });\n }\n }\n\n time(label: string, meta?: Record<string, unknown>): void {\n if (!this.timings) return;\n const merged = this.merge(meta);\n if (merged) {\n console.info(`[time] ${label}`, merged);\n }\n console.time(label);\n }\n\n timeEnd(label: string, meta?: Record<string, unknown>): void {\n if (!this.timings) return;\n console.timeEnd(label);\n const merged = this.merge(meta);\n if (merged) {\n console.info(`[timeEnd] ${label}`, merged);\n }\n }\n\n group(label: string, meta?: Record<string, unknown>): void {\n const merged = this.merge(meta);\n if (merged) {\n console.group(label, merged);\n } else {\n console.group(label);\n }\n }\n\n groupEnd(): void {\n console.groupEnd();\n }\n\n child(bindings: Record<string, unknown>): ILogger {\n return new ConsoleLogger({\n bindings: { ...this.bindings, ...bindings },\n level: this.level,\n timings: this.timings,\n });\n }\n\n private merge(meta: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n const hasBindings = Object.keys(this.bindings).length > 0;\n if (!hasBindings && !meta) return undefined;\n if (!hasBindings) return meta;\n if (!meta) return this.bindings;\n return { ...this.bindings, ...meta };\n }\n}\n",
10
11
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ILogger } from \"./ILogger\";\n\n/**\n * Silent logger that discards all output.\n * Useful for suppressing log noise in tests.\n */\nexport class NullLogger implements ILogger {\n info(_message: string, _meta?: Record<string, unknown>): void {}\n error(_message: string, _meta?: Record<string, unknown>): void {}\n warn(_message: string, _meta?: Record<string, unknown>): void {}\n debug(_message: string, _meta?: Record<string, unknown>): void {}\n fatal(_err: Error, _message: string, _meta?: Record<string, unknown>): void {}\n time(_label: string, _meta?: Record<string, unknown>): void {}\n timeEnd(_label: string, _meta?: Record<string, unknown>): void {}\n group(_label: string, _meta?: Record<string, unknown>): void {}\n groupEnd(): void {}\n child(_bindings: Record<string, unknown>): ILogger {\n return this;\n }\n}\n",
11
12
  "/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Read an environment value from Node `process.env` when defined, otherwise from\n * Vite/browser `import.meta.env`.\n *\n * In Vite dev, `process` is often polyfilled without `DEV`, so reading only\n * `process.env` misses `import.meta.env.DEV` and disables dev-only features\n * (e.g. console telemetry).\n *\n * Boolean `import.meta.env` flags become `\"true\"` or are treated as unset when false\n * so callers using simple truthiness behave as expected.\n */\nexport function readRuntimeEnv(name: string): string | undefined {\n if (typeof process !== \"undefined\" && process.env) {\n const fromProcess = process.env[name];\n if (fromProcess !== undefined) {\n return fromProcess;\n }\n }\n\n const meta = (import.meta as ImportMeta & { env?: Record<string, string | boolean | undefined> })\n .env;\n if (!meta) {\n return undefined;\n }\n\n const value = meta[name];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value === \"boolean\") {\n return value ? \"true\" : undefined;\n }\n return String(value);\n}\n",
12
13
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { createServiceToken, globalServiceRegistry } from \"../di/ServiceRegistry\";\nimport { readRuntimeEnv } from \"../utilities/runtimeEnv\";\nimport type { LogLevel } from \"./ConsoleLogger\";\nimport { ConsoleLogger } from \"./ConsoleLogger\";\nimport type { ILogger } from \"./ILogger\";\nimport { NullLogger } from \"./NullLogger\";\n\n/**\n * Service token for the global logger instance.\n */\nexport const LOGGER = createServiceToken<ILogger>(\"logger\");\n\nconst VALID_LOG_LEVELS: ReadonlySet<string> = new Set<string>([\n \"debug\",\n \"info\",\n \"warn\",\n \"error\",\n \"fatal\",\n]);\n\nfunction isTruthy(value: string | undefined): boolean {\n return value !== undefined && value !== \"\" && value !== \"0\" && value !== \"false\";\n}\n\nfunction createDefaultLogger(): ILogger {\n const levelEnv = readRuntimeEnv(\"LOGGER_LEVEL\")?.toLowerCase();\n if (levelEnv && VALID_LOG_LEVELS.has(levelEnv)) {\n return new ConsoleLogger({\n level: levelEnv as LogLevel,\n timings: isTruthy(readRuntimeEnv(\"LOGGER_TIMINGS\")),\n });\n }\n if (isTruthy(readRuntimeEnv(\"DEV\"))) {\n return new ConsoleLogger({\n level: \"debug\" as LogLevel,\n timings: true,\n });\n }\n return new NullLogger();\n}\n\n// Register default logger: NullLogger unless LOGGER_LEVEL env var is set.\nglobalServiceRegistry.registerIfAbsent(LOGGER, createDefaultLogger, true);\n\n/**\n * Returns the current global logger.\n */\nexport function getLogger(): ILogger {\n return globalServiceRegistry.get(LOGGER);\n}\n\n/**\n * Replaces the global logger instance.\n */\nexport function setLogger(logger: ILogger): void {\n globalServiceRegistry.registerInstance(LOGGER, logger);\n}\n",
13
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { createServiceToken } from \"../di\";\n\n/** Service token for the platform-specific WorkerServer instance. */\nexport const WORKER_SERVER = createServiceToken<WorkerServerBase>(\"worker.server\");\n\n/**\n * Extracts transferables from an object.\n * @param obj - The object to extract transferables from.\n * @returns An array of transferables.\n */\nfunction extractTransferables(obj: any) {\n const transferables: Transferable[] = [];\n const seen = new WeakSet();\n\n function findTransferables(value: any) {\n // Avoid infinite recursion\n if (value && typeof value === \"object\" && seen.has(value)) {\n return;\n }\n if (value && typeof value === \"object\") {\n seen.add(value);\n }\n\n // Handle TypedArrays\n if (value instanceof Float32Array || value instanceof Int16Array) {\n transferables.push(value.buffer);\n }\n // Handle other TypedArrays\n else if (\n value instanceof Uint8Array ||\n value instanceof Uint8ClampedArray ||\n value instanceof Int8Array ||\n value instanceof Uint16Array ||\n value instanceof Int32Array ||\n value instanceof Uint32Array ||\n value instanceof Float64Array ||\n value instanceof BigInt64Array ||\n value instanceof BigUint64Array\n ) {\n transferables.push(value.buffer);\n }\n // Handle OffscreenCanvas\n else if (typeof OffscreenCanvas !== \"undefined\" && value instanceof OffscreenCanvas) {\n transferables.push(value);\n }\n // Handle ImageBitmap\n else if (typeof ImageBitmap !== \"undefined\" && value instanceof ImageBitmap) {\n transferables.push(value);\n }\n // Handle VideoFrame\n else if (typeof VideoFrame !== \"undefined\" && value instanceof VideoFrame) {\n transferables.push(value);\n }\n // Handle MessagePort\n else if (typeof MessagePort !== \"undefined\" && value instanceof MessagePort) {\n transferables.push(value);\n }\n // Handle ArrayBuffer\n else if (value instanceof ArrayBuffer) {\n transferables.push(value);\n }\n // Recursively search arrays and objects\n else if (Array.isArray(value)) {\n value.forEach(findTransferables);\n } else if (value && typeof value === \"object\") {\n Object.values(value).forEach(findTransferables);\n }\n }\n\n findTransferables(obj);\n return transferables;\n}\n\n/**\n * WorkerServerBase is a class that handles messages from the main thread to the worker.\n * It is used to register functions that can be called from the main thread.\n * It also handles the transfer of transferables to the main thread.\n */\nexport class WorkerServerBase {\n constructor() {} // overridden in subclasses\n\n private functions: Record<string, (...args: any[]) => Promise<any>> = {};\n private streamFunctions: Record<string, (...args: any[]) => AsyncIterable<any>> = {};\n private reactiveFunctions: Record<string, (input: any, output: any, model: any) => Promise<any>> =\n {};\n\n // Keep track of each request's AbortController\n private requestControllers = new Map<string, AbortController>();\n // Keep track of requests that have already been responded to\n private completedRequests = new Set<string>();\n\n private postResult = (id: string, result: any) => {\n if (this.completedRequests.has(id)) {\n return; // Already responded to this request\n }\n this.completedRequests.add(id);\n const transferables = extractTransferables(result);\n const uniqueTransferables = [...new Set(transferables)];\n // @ts-ignore - Ignore type mismatch between standard Transferable and Bun.Transferable\n postMessage({ id, type: \"complete\", data: result }, uniqueTransferables);\n };\n\n private postError = (id: string, error: unknown) => {\n if (this.completedRequests.has(id)) {\n return; // Already responded to this request\n }\n this.completedRequests.add(id);\n let data: { message: string; name: string };\n if (typeof error === \"string\") {\n data = { message: error, name: \"Error\" };\n } else if (error instanceof Error) {\n data = { message: error.message, name: error.name };\n } else {\n data = { message: String(error), name: \"Error\" };\n }\n postMessage({ id, type: \"error\", data });\n };\n\n private postStreamChunk = (id: string, event: any) => {\n if (this.completedRequests.has(id)) {\n return;\n }\n postMessage({ id, type: \"stream_chunk\", data: event });\n };\n\n /**\n * Send the ready message to the main thread, advertising which functions are\n * registered in each category. Call this after all functions have been registered\n * so WorkerManager can skip unnecessary roundtrips for unregistered calls.\n */\n sendReady() {\n // @ts-ignore\n postMessage({\n type: \"ready\",\n functions: Object.keys(this.functions),\n streamFunctions: Object.keys(this.streamFunctions),\n reactiveFunctions: Object.keys(this.reactiveFunctions),\n });\n }\n\n registerFunction(name: string, fn: (...args: any[]) => Promise<any>) {\n this.functions[name] = fn;\n }\n\n /**\n * Register a reactive function for lightweight preview execution.\n * Reactive functions receive (input, output, model) and return a fast preview\n * without progress tracking or abort signals.\n *\n * @param name - The function name (e.g., task type identifier)\n * @param fn - Async function: (input, output, model) => Promise<output | undefined>\n */\n registerReactiveFunction(\n name: string,\n fn: (input: any, output: any, model: any) => Promise<any>\n ) {\n this.reactiveFunctions[name] = fn;\n }\n\n /**\n * Register an async generator function for streaming execution.\n * When called via the worker protocol with `stream: true`, the server\n * iterates the generator and sends each yielded value as a `stream_chunk`\n * message, followed by a `complete` message when the generator finishes.\n *\n * @param name - The function name (e.g., task type identifier)\n * @param fn - Async generator function: (input, model, signal) => AsyncIterable\n */\n registerStreamFunction(name: string, fn: (...args: any[]) => AsyncIterable<any>) {\n this.streamFunctions[name] = fn;\n }\n\n // Handle messages from the main thread\n async handleMessage(event: { type: string; data: any }) {\n const { id, type, functionName, args, stream, reactive } = event.data;\n if (type === \"abort\") {\n return await this.handleAbort(id);\n }\n if (type === \"call\") {\n if (stream) {\n return await this.handleStreamCall(id, functionName, args);\n }\n if (reactive) {\n return await this.handleReactiveCall(id, functionName, args);\n }\n return await this.handleCall(id, functionName, args);\n }\n }\n\n async handleAbort(id: string) {\n if (this.requestControllers.has(id)) {\n const controller = this.requestControllers.get(id);\n controller?.abort();\n this.requestControllers.delete(id);\n // Send error response back to main thread so the promise rejects\n this.postError(id, \"Operation aborted\");\n this.scheduleCompletedRequestCleanup(id);\n }\n }\n\n /**\n * Handle a reactive call. Returns undefined (non-error) if the reactive\n * function is not registered, since not all task types expose a reactive fn.\n */\n async handleReactiveCall(\n id: string,\n functionName: string,\n [input, output, model]: [any, any, any]\n ) {\n if (!(functionName in this.reactiveFunctions)) {\n this.postResult(id, undefined);\n return;\n }\n try {\n const fn = this.reactiveFunctions[functionName];\n const result = await fn(input, output, model);\n this.postResult(id, result);\n } catch (error) {\n this.postError(id, error);\n }\n }\n\n async handleCall(id: string, functionName: string, [input, model]: [any, any]) {\n if (!(functionName in this.functions)) {\n this.postError(id, `Function ${functionName} not found`);\n return;\n }\n\n try {\n const abortController = new AbortController();\n this.requestControllers.set(id, abortController);\n\n const fn = this.functions[functionName];\n const postProgress = (progress: number, message?: string, details?: any) => {\n // Don't send progress updates after the request is completed/aborted\n if (!this.completedRequests.has(id)) {\n postMessage({ id, type: \"progress\", data: { progress, message, details } });\n }\n };\n const result = await fn(input, model, postProgress, abortController.signal);\n this.postResult(id, result);\n } catch (error) {\n this.postError(id, error);\n } finally {\n this.requestControllers.delete(id);\n this.scheduleCompletedRequestCleanup(id);\n }\n }\n\n /**\n * Handle a streaming call. If a stream function is registered for the given name,\n * iterate it and send each yielded event as a `stream_chunk` message. If only a\n * regular function is registered, run it and wrap the result as a single `finish`\n * stream event (graceful fallback for providers that don't implement streaming).\n */\n async handleStreamCall(id: string, functionName: string, [input, model]: [any, any]) {\n if (functionName in this.streamFunctions) {\n try {\n const abortController = new AbortController();\n this.requestControllers.set(id, abortController);\n\n const fn = this.streamFunctions[functionName];\n const iterable = fn(input, model, abortController.signal);\n\n for await (const event of iterable) {\n if (this.completedRequests.has(id)) break;\n this.postStreamChunk(id, event);\n }\n\n this.postResult(id, undefined);\n } catch (error) {\n this.postError(id, error);\n } finally {\n this.requestControllers.delete(id);\n this.scheduleCompletedRequestCleanup(id);\n }\n } else if (functionName in this.functions) {\n // Fallback: run regular function and wrap result as a finish stream event\n try {\n const abortController = new AbortController();\n this.requestControllers.set(id, abortController);\n\n const fn = this.functions[functionName];\n const noopProgress = () => {};\n const result = await fn(input, model, noopProgress, abortController.signal);\n\n this.postStreamChunk(id, { type: \"finish\", data: result });\n this.postResult(id, undefined);\n } catch (error) {\n this.postError(id, error);\n } finally {\n this.requestControllers.delete(id);\n this.scheduleCompletedRequestCleanup(id);\n }\n } else {\n this.postError(id, `Function ${functionName} not found`);\n }\n }\n\n /**\n * Schedule cleanup of a completed request ID. Uses a 5-second delay to\n * handle late-arriving abort messages, and caps the completed set size\n * to prevent unbounded growth.\n */\n private scheduleCompletedRequestCleanup(id: string): void {\n setTimeout(() => {\n this.completedRequests.delete(id);\n }, 5000);\n\n // Safety cap: if the set grows too large, clear the oldest entries\n if (this.completedRequests.size > 1000) {\n const iter = this.completedRequests.values();\n for (let i = 0; i < 500; i++) {\n const entry = iter.next();\n if (entry.done) break;\n this.completedRequests.delete(entry.value);\n }\n }\n }\n}\n",
14
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { createServiceToken, globalServiceRegistry } from \"../di\";\nimport { getLogger } from \"../logging\";\n\nexport class WorkerManager {\n private workers: Map<string, Worker> = new Map();\n private readyWorkers: Map<string, Promise<void>> = new Map();\n /** Function names registered on each worker, populated from the ready message. */\n private workerFunctions: Map<string, Set<string>> = new Map();\n private workerStreamFunctions: Map<string, Set<string>> = new Map();\n private workerReactiveFunctions: Map<string, Set<string>> = new Map();\n /** Persistent factories for workers that can be recreated after termination. */\n private workerFactories: Map<string, () => Worker> = new Map();\n /** Idle timeout configuration per registered worker. */\n private idleTimeouts: Map<string, number> = new Map();\n /** Single-flight init promise per name (lazy path). */\n private lazyInitPromises: Map<string, Promise<void>> = new Map();\n /** In-flight call count per worker name. */\n private activeCallCounts: Map<string, number> = new Map();\n /** Scheduled idle termination timer per worker name. */\n private idleTimers: Map<string, ReturnType<typeof setTimeout>> = new Map();\n /** In-flight termination promise per worker name. */\n private terminationPromises: Map<string, Promise<void>> = new Map();\n\n registerWorker(\n name: string,\n workerOrFactory: Worker | (() => Worker),\n options?: { idleTimeoutMs?: number }\n ): void {\n if (this.workers.has(name)) {\n throw new Error(`Worker ${name} is already registered.`);\n }\n if (this.workerFactories.has(name)) {\n throw new Error(`Worker ${name} is already registered.`);\n }\n this.idleTimeouts.set(name, options?.idleTimeoutMs ?? 0);\n if (typeof workerOrFactory === \"function\") {\n this.workerFactories.set(name, workerOrFactory);\n } else {\n this.attachWorkerInstance(name, workerOrFactory);\n }\n }\n\n private attachWorkerInstance(name: string, worker: Worker): void {\n this.clearIdleTimer(name);\n this.workers.set(name, worker);\n worker.addEventListener(\"error\", (event) => {\n console.error(\"Worker Error:\", event.message, \"at\", event.filename, \"line:\", event.lineno);\n });\n worker.addEventListener(\"messageerror\", (event) => {\n console.error(\"Worker message error:\", event);\n });\n\n const readyPromise = new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n worker.removeEventListener(\"message\", handleReady);\n worker.removeEventListener(\"error\", handleError);\n reject(new Error(`Worker \"${name}\" did not become ready within 10s`));\n }, 10_000);\n\n const handleError = (event: ErrorEvent) => {\n clearTimeout(timeout);\n worker.removeEventListener(\"message\", handleReady);\n worker.removeEventListener(\"error\", handleError);\n reject(\n new Error(`Worker \"${name}\" initialization error: ${event.message ?? \"unknown error\"}`)\n );\n };\n\n const handleReady = (event: MessageEvent) => {\n if (event.data?.type === \"ready\") {\n clearTimeout(timeout);\n worker.removeEventListener(\"message\", handleReady);\n worker.removeEventListener(\"error\", handleError);\n this.workerFunctions.set(name, new Set(event.data.functions ?? []));\n this.workerStreamFunctions.set(name, new Set(event.data.streamFunctions ?? []));\n this.workerReactiveFunctions.set(name, new Set(event.data.reactiveFunctions ?? []));\n resolve();\n }\n };\n\n worker.addEventListener(\"message\", handleReady);\n worker.addEventListener(\"error\", handleError);\n });\n\n this.readyWorkers.set(name, readyPromise);\n }\n\n /**\n * Ensures a lazy worker is constructed and ready. No-op if already\n * registered eagerly.\n */\n private async ensureWorkerReady(name: string): Promise<void> {\n await this.terminationPromises.get(name);\n\n if (this.workers.has(name)) {\n await this.readyWorkers.get(name)!;\n return;\n }\n const factory = this.workerFactories.get(name);\n if (!factory) {\n throw new Error(`Worker ${name} not found.`);\n }\n let init = this.lazyInitPromises.get(name);\n if (!init) {\n init = (async () => {\n let worker: Worker | undefined;\n try {\n const f = this.workerFactories.get(name)!;\n worker = f();\n this.attachWorkerInstance(name, worker);\n await this.readyWorkers.get(name)!;\n } catch (error) {\n await this.cleanupFailedInitialization(name, worker);\n throw error;\n } finally {\n this.lazyInitPromises.delete(name);\n }\n })();\n this.lazyInitPromises.set(name, init);\n }\n await init;\n }\n\n getWorker(name: string): Worker {\n const worker = this.workers.get(name);\n if (!worker) throw new Error(`Worker ${name} not found.`);\n return worker;\n }\n\n private beginWorkerActivity(name: string): void {\n this.clearIdleTimer(name);\n this.activeCallCounts.set(name, (this.activeCallCounts.get(name) ?? 0) + 1);\n }\n\n private endWorkerActivity(name: string): void {\n const nextCount = (this.activeCallCounts.get(name) ?? 0) - 1;\n if (nextCount > 0) {\n this.activeCallCounts.set(name, nextCount);\n return;\n }\n this.activeCallCounts.delete(name);\n this.scheduleIdleTermination(name);\n }\n\n private clearIdleTimer(name: string): void {\n const timer = this.idleTimers.get(name);\n if (timer !== undefined) {\n clearTimeout(timer);\n this.idleTimers.delete(name);\n }\n }\n\n private scheduleIdleTermination(name: string): void {\n this.clearIdleTimer(name);\n\n const idleTimeoutMs = this.idleTimeouts.get(name) ?? 0;\n if (idleTimeoutMs <= 0 || !this.workerFactories.has(name) || !this.workers.has(name)) {\n return;\n }\n\n const timer = setTimeout(() => {\n this.idleTimers.delete(name);\n if ((this.activeCallCounts.get(name) ?? 0) > 0 || !this.workers.has(name)) {\n return;\n }\n void this.terminateWorkerInstance(name).catch((error) => {\n getLogger().warn(`Worker ${name} idle termination failed.`, { error });\n });\n }, idleTimeoutMs);\n\n this.idleTimers.set(name, timer);\n }\n\n private async cleanupFailedInitialization(\n name: string,\n worker: Worker | undefined\n ): Promise<void> {\n this.clearIdleTimer(name);\n if (worker !== undefined && this.workers.get(name) === worker) {\n this.workers.delete(name);\n }\n this.readyWorkers.delete(name);\n this.workerFunctions.delete(name);\n this.workerStreamFunctions.delete(name);\n this.workerReactiveFunctions.delete(name);\n this.activeCallCounts.delete(name);\n if (worker && \"terminate\" in worker && typeof worker.terminate === \"function\") {\n try {\n await worker.terminate();\n } catch {\n // Best-effort cleanup after failed startup.\n }\n }\n }\n\n private async terminateWorkerInstance(name: string): Promise<void> {\n const existing = this.terminationPromises.get(name);\n if (existing) {\n await existing;\n return;\n }\n\n const termination = (async () => {\n this.clearIdleTimer(name);\n const worker = this.workers.get(name);\n this.workers.delete(name);\n this.readyWorkers.delete(name);\n this.workerFunctions.delete(name);\n this.workerStreamFunctions.delete(name);\n this.workerReactiveFunctions.delete(name);\n this.activeCallCounts.delete(name);\n try {\n if (worker && \"terminate\" in worker && typeof worker.terminate === \"function\") {\n await worker.terminate();\n }\n } catch {\n // Best-effort termination; runtime state is already cleaned up above.\n }\n })();\n\n this.terminationPromises.set(name, termination);\n try {\n await termination;\n } finally {\n this.terminationPromises.delete(name);\n }\n }\n\n async callWorkerFunction<T>(\n workerName: string,\n functionName: string,\n args: any[],\n options?: {\n signal?: AbortSignal;\n onProgress?: (progress: number, message?: string, details?: any) => void;\n }\n ): Promise<T> {\n await this.ensureWorkerReady(workerName);\n const worker = this.workers.get(workerName);\n if (!worker) throw new Error(`Worker ${workerName} not found.`);\n this.beginWorkerActivity(workerName);\n\n try {\n const knownFunctions = this.workerFunctions.get(workerName);\n if (knownFunctions && !knownFunctions.has(functionName)) {\n throw new Error(`Function \"${functionName}\" is not registered on worker \"${workerName}\".`);\n }\n\n return await new Promise<T>((resolve, reject) => {\n const requestId = crypto.randomUUID();\n\n const handleMessage = (event: MessageEvent) => {\n const { id, type, data } = event.data;\n if (id !== requestId) return;\n if (type === \"progress\" && options?.onProgress) {\n options.onProgress(data.progress, data.message, data.details);\n getLogger().debug(\n `Worker ${workerName} function ${functionName} progress: ${data.progress}, `,\n { data }\n );\n } else if (type === \"complete\") {\n cleanup();\n getLogger().debug(`Worker ${workerName} function ${functionName} complete.`, { data });\n resolve(data);\n } else if (type === \"error\") {\n cleanup();\n getLogger().debug(`Worker ${workerName} function ${functionName} error.`, { data });\n const err =\n typeof data === \"object\" && data !== null\n ? Object.assign(new Error(data.message ?? String(data)), {\n name: data.name ?? \"Error\",\n })\n : new Error(String(data));\n reject(err);\n }\n };\n\n const handleAbort = () => {\n worker.postMessage({ id: requestId, type: \"abort\" });\n getLogger().info(`Worker ${workerName} function ${functionName} aborted.`);\n };\n\n const cleanup = () => {\n worker.removeEventListener(\"message\", handleMessage);\n options?.signal?.removeEventListener(\"abort\", handleAbort);\n };\n\n worker.addEventListener(\"message\", handleMessage);\n\n if (options?.signal) {\n options.signal.addEventListener(\"abort\", handleAbort, { once: true });\n }\n\n // Note: We intentionally do NOT transfer TypedArrays from the main thread to the worker.\n // Transferring detaches the buffers on the main thread, which breaks downstream tasks\n // that still need those TypedArrays (e.g., the embedding vectors flowing through the\n // task graph). Workers send results back with transferables (zero-copy), but the\n // main thread always clones data going to workers to preserve its own references.\n const message = { id: requestId, type: \"call\", functionName, args };\n worker.postMessage(message);\n getLogger().info(`Worker ${workerName} function ${functionName} called.`);\n });\n } finally {\n this.endWorkerActivity(workerName);\n }\n }\n\n /**\n * Call a reactive function on a worker. Returns undefined (rather than throwing)\n * if the worker has no reactive function registered for the given name, so callers\n * can treat the result as an optional preview.\n *\n * @param workerName - Registered worker name\n * @param functionName - Name of the reactive function registered on the worker\n * @param args - Arguments to pass: [input, output, model]\n * @returns The reactive result, or undefined if not registered / on error\n */\n async callWorkerReactiveFunction<T>(\n workerName: string,\n functionName: string,\n args: any[]\n ): Promise<T | undefined> {\n await this.ensureWorkerReady(workerName);\n const worker = this.workers.get(workerName);\n if (!worker) return undefined;\n this.beginWorkerActivity(workerName);\n\n try {\n // Skip the roundtrip if the worker didn't register a reactive function for this name.\n const knownReactive = this.workerReactiveFunctions.get(workerName);\n if (knownReactive && !knownReactive.has(functionName)) return undefined;\n\n return await new Promise((resolve) => {\n const requestId = crypto.randomUUID();\n\n const handleMessage = (event: MessageEvent) => {\n const { id, type, data } = event.data;\n if (id !== requestId) return;\n if (type === \"complete\") {\n cleanup();\n resolve(data as T | undefined);\n } else if (type === \"error\") {\n cleanup();\n getLogger().warn(`Worker ${workerName} reactive function ${functionName} error:`, {\n error: data,\n });\n resolve(undefined);\n }\n };\n\n const cleanup = () => {\n worker.removeEventListener(\"message\", handleMessage);\n };\n\n worker.addEventListener(\"message\", handleMessage);\n\n const message = { id: requestId, type: \"call\", functionName, args, reactive: true };\n // Note: No transferables — same reasoning as callWorkerFunction above.\n worker.postMessage(message);\n getLogger().info(`Worker ${workerName} reactive function ${functionName} called.`);\n });\n } finally {\n this.endWorkerActivity(workerName);\n }\n }\n\n /**\n * Terminate a single worker and clean up all associated state.\n */\n async terminateWorker(name: string): Promise<void> {\n await this.terminateWorkerInstance(name);\n this.workerFactories.delete(name);\n this.idleTimeouts.delete(name);\n this.lazyInitPromises.delete(name);\n }\n\n /**\n * Terminate all workers and release resources.\n */\n async dispose(): Promise<void> {\n const names = [...new Set([...this.workers.keys(), ...this.workerFactories.keys()])];\n for (const name of names) {\n await this.terminateWorker(name);\n }\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.dispose();\n }\n\n /**\n * Call a streaming function on a worker and return an AsyncGenerator that\n * yields each stream chunk sent by the worker. The worker sends `stream_chunk`\n * messages for each yielded event and a `complete` message when the generator\n * finishes. An `error` message from the worker causes the iterator to throw.\n *\n * @param workerName - Registered worker name\n * @param functionName - Name of the stream function registered on the worker\n * @param args - Arguments to pass to the stream function\n * @param options - Optional abort signal\n * @returns AsyncGenerator yielding stream events from the worker\n */\n async *callWorkerStreamFunction<T>(\n workerName: string,\n functionName: string,\n args: any[],\n options?: { signal?: AbortSignal }\n ): AsyncGenerator<T> {\n await this.ensureWorkerReady(workerName);\n const worker = this.workers.get(workerName);\n if (!worker) throw new Error(`Worker ${workerName} not found.`);\n this.beginWorkerActivity(workerName);\n\n try {\n // The worker falls back to regular functions for stream calls, so either counts.\n const knownStream = this.workerStreamFunctions.get(workerName);\n const knownFns = this.workerFunctions.get(workerName);\n if (\n knownStream &&\n knownFns &&\n !knownStream.has(functionName) &&\n !knownFns.has(functionName)\n ) {\n throw new Error(`Function \"${functionName}\" is not registered on worker \"${workerName}\".`);\n }\n\n const requestId = crypto.randomUUID();\n\n // Push-queue pattern: messages push items, async generator pulls them\n type QueueItem =\n | { kind: \"event\"; data: T }\n | { kind: \"done\" }\n | { kind: \"error\"; error: Error };\n\n const queue: QueueItem[] = [];\n let waiting: ((value: void) => void) | null = null;\n\n const notify = () => {\n if (waiting) {\n const resolve = waiting;\n waiting = null;\n resolve();\n }\n };\n\n const handleMessage = (event: MessageEvent) => {\n const { id, type, data } = event.data;\n if (id !== requestId) return;\n\n if (type === \"stream_chunk\") {\n queue.push({ kind: \"event\", data });\n notify();\n } else if (type === \"complete\") {\n queue.push({ kind: \"done\" });\n notify();\n } else if (type === \"error\") {\n queue.push({ kind: \"error\", error: new Error(data) });\n notify();\n }\n };\n\n const handleAbort = () => {\n worker.postMessage({ id: requestId, type: \"abort\" });\n getLogger().info(`Worker ${workerName} stream function ${functionName} aborted.`);\n };\n\n const cleanup = () => {\n worker.removeEventListener(\"message\", handleMessage);\n options?.signal?.removeEventListener(\"abort\", handleAbort);\n };\n\n worker.addEventListener(\"message\", handleMessage);\n\n if (options?.signal) {\n if (options.signal.aborted) {\n cleanup();\n throw new Error(\"Operation aborted\");\n }\n options.signal.addEventListener(\"abort\", handleAbort, { once: true });\n }\n\n // Send call message with stream flag\n // Note: No transferables — same reasoning as callWorkerFunction above.\n const message = { id: requestId, type: \"call\", functionName, args, stream: true };\n worker.postMessage(message);\n getLogger().info(`Worker ${workerName} stream function ${functionName} called.`);\n\n let completedNormally = false;\n try {\n while (true) {\n while (queue.length > 0) {\n const item = queue.shift()!;\n if (item.kind === \"event\") {\n yield item.data;\n } else if (item.kind === \"done\") {\n completedNormally = true;\n return;\n } else if (item.kind === \"error\") {\n completedNormally = true;\n throw item.error;\n }\n }\n\n // Wait for the next message to arrive\n await new Promise<void>((resolve) => {\n waiting = resolve;\n });\n }\n } finally {\n // If the consumer stopped iterating early (break/return), notify\n // the worker to abort so it doesn't continue generating tokens.\n if (!completedNormally) {\n worker.postMessage({ id: requestId, type: \"abort\" });\n getLogger().info(`Worker ${workerName} stream function ${functionName} aborted.`);\n }\n cleanup();\n }\n } finally {\n this.endWorkerActivity(workerName);\n }\n }\n}\n\nexport const WORKER_MANAGER = createServiceToken<WorkerManager>(\"worker.manager\");\n\nglobalServiceRegistry.register(WORKER_MANAGER, () => new WorkerManager(), true);\n",
14
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { createServiceToken } from \"../di\";\n\n/** Service token for the platform-specific WorkerServer instance. */\nexport const WORKER_SERVER = createServiceToken<WorkerServerBase>(\"worker.server\");\n\n/**\n * Extracts transferables from an object.\n * @param obj - The object to extract transferables from.\n * @returns An array of transferables.\n */\nfunction extractTransferables(obj: any) {\n const transferables: Transferable[] = [];\n const seen = new WeakSet();\n\n function findTransferables(value: any) {\n // Avoid infinite recursion\n if (value && typeof value === \"object\" && seen.has(value)) {\n return;\n }\n if (value && typeof value === \"object\") {\n seen.add(value);\n }\n\n // Handle TypedArrays\n if (value instanceof Float32Array || value instanceof Int16Array) {\n transferables.push(value.buffer);\n }\n // Handle other TypedArrays\n else if (\n value instanceof Uint8Array ||\n value instanceof Uint8ClampedArray ||\n value instanceof Int8Array ||\n value instanceof Uint16Array ||\n value instanceof Int32Array ||\n value instanceof Uint32Array ||\n value instanceof Float64Array ||\n value instanceof BigInt64Array ||\n value instanceof BigUint64Array\n ) {\n transferables.push(value.buffer);\n }\n // Handle OffscreenCanvas\n else if (typeof OffscreenCanvas !== \"undefined\" && value instanceof OffscreenCanvas) {\n transferables.push(value);\n }\n // Handle ImageBitmap\n else if (typeof ImageBitmap !== \"undefined\" && value instanceof ImageBitmap) {\n transferables.push(value);\n }\n // Handle VideoFrame\n else if (typeof VideoFrame !== \"undefined\" && value instanceof VideoFrame) {\n transferables.push(value);\n }\n // Handle MessagePort\n else if (typeof MessagePort !== \"undefined\" && value instanceof MessagePort) {\n transferables.push(value);\n }\n // Handle ArrayBuffer\n else if (value instanceof ArrayBuffer) {\n transferables.push(value);\n }\n // Recursively search arrays and objects\n else if (Array.isArray(value)) {\n value.forEach(findTransferables);\n } else if (value && typeof value === \"object\") {\n Object.values(value).forEach(findTransferables);\n }\n }\n\n findTransferables(obj);\n return transferables;\n}\n\n/**\n * WorkerServerBase is a class that handles messages from the main thread to the worker.\n * It is used to register functions that can be called from the main thread.\n * It also handles the transfer of transferables to the main thread.\n */\nexport class WorkerServerBase {\n constructor() {} // overridden in subclasses\n\n private functions: Record<string, (...args: any[]) => Promise<any>> = {};\n private streamFunctions: Record<string, (...args: any[]) => AsyncIterable<any>> = {};\n private previewFunctions: Record<string, (input: any, model: any) => Promise<any>> = {};\n\n // Keep track of each request's AbortController\n private requestControllers = new Map<string, AbortController>();\n // Keep track of requests that have already been responded to\n private completedRequests = new Set<string>();\n\n private postResult = (id: string, result: any) => {\n if (this.completedRequests.has(id)) {\n return; // Already responded to this request\n }\n this.completedRequests.add(id);\n const transferables = extractTransferables(result);\n const uniqueTransferables = [...new Set(transferables)];\n // @ts-ignore - Ignore type mismatch between standard Transferable and Bun.Transferable\n postMessage({ id, type: \"complete\", data: result }, uniqueTransferables);\n };\n\n private postError = (id: string, error: unknown) => {\n if (this.completedRequests.has(id)) {\n return; // Already responded to this request\n }\n this.completedRequests.add(id);\n let data: { message: string; name: string };\n if (typeof error === \"string\") {\n data = { message: error, name: \"Error\" };\n } else if (error instanceof Error) {\n data = { message: error.message, name: error.name };\n } else {\n data = { message: String(error), name: \"Error\" };\n }\n postMessage({ id, type: \"error\", data });\n };\n\n private postStreamChunk = (id: string, event: any) => {\n if (this.completedRequests.has(id)) {\n return;\n }\n postMessage({ id, type: \"stream_chunk\", data: event });\n };\n\n /**\n * Send the ready message to the main thread, advertising which functions are\n * registered in each category. Call this after all functions have been registered\n * so WorkerManager can skip unnecessary roundtrips for unregistered calls.\n */\n sendReady() {\n // @ts-ignore\n postMessage({\n type: \"ready\",\n functions: Object.keys(this.functions),\n streamFunctions: Object.keys(this.streamFunctions),\n previewFunctions: Object.keys(this.previewFunctions),\n });\n }\n\n registerFunction(name: string, fn: (...args: any[]) => Promise<any>) {\n this.functions[name] = fn;\n }\n\n /**\n * Register a preview function for lightweight preview execution.\n * Preview functions receive (input, model) and return a fast preview\n * without progress tracking or abort signals.\n *\n * @param name - The function name (e.g., task type identifier)\n * @param fn - Async function: (input, model) => Promise<output | undefined>\n */\n registerPreviewFunction(name: string, fn: (input: any, model: any) => Promise<any>) {\n this.previewFunctions[name] = fn;\n }\n\n /**\n * Register an async generator function for streaming execution.\n * When called via the worker protocol with `stream: true`, the server\n * iterates the generator and sends each yielded value as a `stream_chunk`\n * message, followed by a `complete` message when the generator finishes.\n *\n * @param name - The function name (e.g., task type identifier)\n * @param fn - Async generator function: (input, model, signal) => AsyncIterable\n */\n registerStreamFunction(name: string, fn: (...args: any[]) => AsyncIterable<any>) {\n this.streamFunctions[name] = fn;\n }\n\n // Handle messages from the main thread\n async handleMessage(event: { type: string; data: any }) {\n const { id, type, functionName, args, stream, preview } = event.data;\n if (type === \"abort\") {\n return await this.handleAbort(id);\n }\n if (type === \"call\") {\n if (stream) {\n return await this.handleStreamCall(id, functionName, args);\n }\n if (preview) {\n return await this.handlePreviewCall(id, functionName, args);\n }\n return await this.handleCall(id, functionName, args);\n }\n }\n\n async handleAbort(id: string) {\n if (this.requestControllers.has(id)) {\n const controller = this.requestControllers.get(id);\n controller?.abort();\n this.requestControllers.delete(id);\n // Send error response back to main thread so the promise rejects\n this.postError(id, \"Operation aborted\");\n this.scheduleCompletedRequestCleanup(id);\n }\n }\n\n /**\n * Handle a preview call. Returns undefined (non-error) if the preview\n * function is not registered, since not all task types expose a preview fn.\n */\n async handlePreviewCall(id: string, functionName: string, [input, model]: [any, any]) {\n if (!(functionName in this.previewFunctions)) {\n this.postResult(id, undefined);\n return;\n }\n try {\n const fn = this.previewFunctions[functionName];\n const result = await fn(input, model);\n this.postResult(id, result);\n } catch (error) {\n this.postError(id, error);\n }\n }\n\n async handleCall(id: string, functionName: string, [input, model]: [any, any]) {\n if (!(functionName in this.functions)) {\n this.postError(id, `Function ${functionName} not found`);\n return;\n }\n\n try {\n const abortController = new AbortController();\n this.requestControllers.set(id, abortController);\n\n const fn = this.functions[functionName];\n const postProgress = (progress: number, message?: string, details?: any) => {\n // Don't send progress updates after the request is completed/aborted\n if (!this.completedRequests.has(id)) {\n postMessage({ id, type: \"progress\", data: { progress, message, details } });\n }\n };\n const result = await fn(input, model, postProgress, abortController.signal);\n this.postResult(id, result);\n } catch (error) {\n this.postError(id, error);\n } finally {\n this.requestControllers.delete(id);\n this.scheduleCompletedRequestCleanup(id);\n }\n }\n\n /**\n * Handle a streaming call. If a stream function is registered for the given name,\n * iterate it and send each yielded event as a `stream_chunk` message. If only a\n * regular function is registered, run it and wrap the result as a single `finish`\n * stream event (graceful fallback for providers that don't implement streaming).\n */\n async handleStreamCall(id: string, functionName: string, [input, model]: [any, any]) {\n if (functionName in this.streamFunctions) {\n try {\n const abortController = new AbortController();\n this.requestControllers.set(id, abortController);\n\n const fn = this.streamFunctions[functionName];\n const iterable = fn(input, model, abortController.signal);\n\n for await (const event of iterable) {\n if (this.completedRequests.has(id)) break;\n this.postStreamChunk(id, event);\n }\n\n this.postResult(id, undefined);\n } catch (error) {\n this.postError(id, error);\n } finally {\n this.requestControllers.delete(id);\n this.scheduleCompletedRequestCleanup(id);\n }\n } else if (functionName in this.functions) {\n // Fallback: run regular function and wrap result as a finish stream event\n try {\n const abortController = new AbortController();\n this.requestControllers.set(id, abortController);\n\n const fn = this.functions[functionName];\n const noopProgress = () => {};\n const result = await fn(input, model, noopProgress, abortController.signal);\n\n this.postStreamChunk(id, { type: \"finish\", data: result });\n this.postResult(id, undefined);\n } catch (error) {\n this.postError(id, error);\n } finally {\n this.requestControllers.delete(id);\n this.scheduleCompletedRequestCleanup(id);\n }\n } else {\n this.postError(id, `Function ${functionName} not found`);\n }\n }\n\n /**\n * Schedule cleanup of a completed request ID. Uses a 5-second delay to\n * handle late-arriving abort messages, and caps the completed set size\n * to prevent unbounded growth.\n */\n private scheduleCompletedRequestCleanup(id: string): void {\n setTimeout(() => {\n this.completedRequests.delete(id);\n }, 5000);\n\n // Safety cap: if the set grows too large, clear the oldest entries\n if (this.completedRequests.size > 1000) {\n const iter = this.completedRequests.values();\n for (let i = 0; i < 500; i++) {\n const entry = iter.next();\n if (entry.done) break;\n this.completedRequests.delete(entry.value);\n }\n }\n }\n}\n",
15
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { createServiceToken, globalServiceRegistry } from \"../di\";\nimport { getLogger } from \"../logging\";\n\nexport class WorkerManager {\n private workers: Map<string, Worker> = new Map();\n private readyWorkers: Map<string, Promise<void>> = new Map();\n /** Function names registered on each worker, populated from the ready message. */\n private workerFunctions: Map<string, Set<string>> = new Map();\n private workerStreamFunctions: Map<string, Set<string>> = new Map();\n private workerPreviewFunctions: Map<string, Set<string>> = new Map();\n /** Persistent factories for workers that can be recreated after termination. */\n private workerFactories: Map<string, () => Worker> = new Map();\n /** Idle timeout configuration per registered worker. */\n private idleTimeouts: Map<string, number> = new Map();\n /** Single-flight init promise per name (lazy path). */\n private lazyInitPromises: Map<string, Promise<void>> = new Map();\n /** In-flight call count per worker name. */\n private activeCallCounts: Map<string, number> = new Map();\n /** Scheduled idle termination timer per worker name. */\n private idleTimers: Map<string, ReturnType<typeof setTimeout>> = new Map();\n /** In-flight termination promise per worker name. */\n private terminationPromises: Map<string, Promise<void>> = new Map();\n\n registerWorker(\n name: string,\n workerOrFactory: Worker | (() => Worker),\n options?: { idleTimeoutMs?: number }\n ): void {\n if (this.workers.has(name)) {\n throw new Error(`Worker ${name} is already registered.`);\n }\n if (this.workerFactories.has(name)) {\n throw new Error(`Worker ${name} is already registered.`);\n }\n this.idleTimeouts.set(name, options?.idleTimeoutMs ?? 0);\n if (typeof workerOrFactory === \"function\") {\n this.workerFactories.set(name, workerOrFactory);\n } else {\n this.attachWorkerInstance(name, workerOrFactory);\n }\n }\n\n private attachWorkerInstance(name: string, worker: Worker): void {\n this.clearIdleTimer(name);\n this.workers.set(name, worker);\n worker.addEventListener(\"error\", (event) => {\n console.error(\"Worker Error:\", event.message, \"at\", event.filename, \"line:\", event.lineno);\n });\n worker.addEventListener(\"messageerror\", (event) => {\n console.error(\"Worker message error:\", event);\n });\n\n const readyPromise = new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n worker.removeEventListener(\"message\", handleReady);\n worker.removeEventListener(\"error\", handleError);\n reject(new Error(`Worker \"${name}\" did not become ready within 10s`));\n }, 10_000);\n\n const handleError = (event: ErrorEvent) => {\n clearTimeout(timeout);\n worker.removeEventListener(\"message\", handleReady);\n worker.removeEventListener(\"error\", handleError);\n reject(\n new Error(`Worker \"${name}\" initialization error: ${event.message ?? \"unknown error\"}`)\n );\n };\n\n const handleReady = (event: MessageEvent) => {\n if (event.data?.type === \"ready\") {\n clearTimeout(timeout);\n worker.removeEventListener(\"message\", handleReady);\n worker.removeEventListener(\"error\", handleError);\n this.workerFunctions.set(name, new Set(event.data.functions ?? []));\n this.workerStreamFunctions.set(name, new Set(event.data.streamFunctions ?? []));\n this.workerPreviewFunctions.set(name, new Set(event.data.previewFunctions ?? []));\n resolve();\n }\n };\n\n worker.addEventListener(\"message\", handleReady);\n worker.addEventListener(\"error\", handleError);\n });\n\n this.readyWorkers.set(name, readyPromise);\n }\n\n /**\n * Ensures a lazy worker is constructed and ready. No-op if already\n * registered eagerly.\n */\n private async ensureWorkerReady(name: string): Promise<void> {\n await this.terminationPromises.get(name);\n\n if (this.workers.has(name)) {\n await this.readyWorkers.get(name)!;\n return;\n }\n const factory = this.workerFactories.get(name);\n if (!factory) {\n throw new Error(`Worker ${name} not found.`);\n }\n let init = this.lazyInitPromises.get(name);\n if (!init) {\n init = (async () => {\n let worker: Worker | undefined;\n try {\n const f = this.workerFactories.get(name)!;\n worker = f();\n this.attachWorkerInstance(name, worker);\n await this.readyWorkers.get(name)!;\n } catch (error) {\n await this.cleanupFailedInitialization(name, worker);\n throw error;\n } finally {\n this.lazyInitPromises.delete(name);\n }\n })();\n this.lazyInitPromises.set(name, init);\n }\n await init;\n }\n\n getWorker(name: string): Worker {\n const worker = this.workers.get(name);\n if (!worker) throw new Error(`Worker ${name} not found.`);\n return worker;\n }\n\n private beginWorkerActivity(name: string): void {\n this.clearIdleTimer(name);\n this.activeCallCounts.set(name, (this.activeCallCounts.get(name) ?? 0) + 1);\n }\n\n private endWorkerActivity(name: string): void {\n const nextCount = (this.activeCallCounts.get(name) ?? 0) - 1;\n if (nextCount > 0) {\n this.activeCallCounts.set(name, nextCount);\n return;\n }\n this.activeCallCounts.delete(name);\n this.scheduleIdleTermination(name);\n }\n\n private clearIdleTimer(name: string): void {\n const timer = this.idleTimers.get(name);\n if (timer !== undefined) {\n clearTimeout(timer);\n this.idleTimers.delete(name);\n }\n }\n\n private scheduleIdleTermination(name: string): void {\n this.clearIdleTimer(name);\n\n const idleTimeoutMs = this.idleTimeouts.get(name) ?? 0;\n if (idleTimeoutMs <= 0 || !this.workerFactories.has(name) || !this.workers.has(name)) {\n return;\n }\n\n const timer = setTimeout(() => {\n this.idleTimers.delete(name);\n if ((this.activeCallCounts.get(name) ?? 0) > 0 || !this.workers.has(name)) {\n return;\n }\n void this.terminateWorkerInstance(name).catch((error) => {\n getLogger().warn(`Worker ${name} idle termination failed.`, { error });\n });\n }, idleTimeoutMs);\n\n this.idleTimers.set(name, timer);\n }\n\n private async cleanupFailedInitialization(\n name: string,\n worker: Worker | undefined\n ): Promise<void> {\n this.clearIdleTimer(name);\n if (worker !== undefined && this.workers.get(name) === worker) {\n this.workers.delete(name);\n }\n this.readyWorkers.delete(name);\n this.workerFunctions.delete(name);\n this.workerStreamFunctions.delete(name);\n this.workerPreviewFunctions.delete(name);\n this.activeCallCounts.delete(name);\n if (worker && \"terminate\" in worker && typeof worker.terminate === \"function\") {\n try {\n await worker.terminate();\n } catch {\n // Best-effort cleanup after failed startup.\n }\n }\n }\n\n private async terminateWorkerInstance(name: string): Promise<void> {\n const existing = this.terminationPromises.get(name);\n if (existing) {\n await existing;\n return;\n }\n\n const termination = (async () => {\n this.clearIdleTimer(name);\n const worker = this.workers.get(name);\n this.workers.delete(name);\n this.readyWorkers.delete(name);\n this.workerFunctions.delete(name);\n this.workerStreamFunctions.delete(name);\n this.workerPreviewFunctions.delete(name);\n this.activeCallCounts.delete(name);\n try {\n if (worker && \"terminate\" in worker && typeof worker.terminate === \"function\") {\n await worker.terminate();\n }\n } catch {\n // Best-effort termination; runtime state is already cleaned up above.\n }\n })();\n\n this.terminationPromises.set(name, termination);\n try {\n await termination;\n } finally {\n this.terminationPromises.delete(name);\n }\n }\n\n async callWorkerFunction<T>(\n workerName: string,\n functionName: string,\n args: any[],\n options?: {\n signal?: AbortSignal;\n onProgress?: (progress: number, message?: string, details?: any) => void;\n }\n ): Promise<T> {\n await this.ensureWorkerReady(workerName);\n const worker = this.workers.get(workerName);\n if (!worker) throw new Error(`Worker ${workerName} not found.`);\n this.beginWorkerActivity(workerName);\n\n try {\n const knownFunctions = this.workerFunctions.get(workerName);\n if (knownFunctions && !knownFunctions.has(functionName)) {\n throw new Error(`Function \"${functionName}\" is not registered on worker \"${workerName}\".`);\n }\n\n return await new Promise<T>((resolve, reject) => {\n const requestId = crypto.randomUUID();\n\n const handleMessage = (event: MessageEvent) => {\n const { id, type, data } = event.data;\n if (id !== requestId) return;\n if (type === \"progress\" && options?.onProgress) {\n options.onProgress(data.progress, data.message, data.details);\n getLogger().debug(\n `Worker ${workerName} function ${functionName} progress: ${data.progress}, `,\n { data }\n );\n } else if (type === \"complete\") {\n cleanup();\n getLogger().debug(`Worker ${workerName} function ${functionName} complete.`, { data });\n resolve(data);\n } else if (type === \"error\") {\n cleanup();\n getLogger().debug(`Worker ${workerName} function ${functionName} error.`, { data });\n const err =\n typeof data === \"object\" && data !== null\n ? Object.assign(new Error(data.message ?? String(data)), {\n name: data.name ?? \"Error\",\n })\n : new Error(String(data));\n reject(err);\n }\n };\n\n const handleAbort = () => {\n worker.postMessage({ id: requestId, type: \"abort\" });\n getLogger().info(`Worker ${workerName} function ${functionName} aborted.`);\n };\n\n const cleanup = () => {\n worker.removeEventListener(\"message\", handleMessage);\n options?.signal?.removeEventListener(\"abort\", handleAbort);\n };\n\n worker.addEventListener(\"message\", handleMessage);\n\n if (options?.signal) {\n options.signal.addEventListener(\"abort\", handleAbort, { once: true });\n }\n\n // Note: We intentionally do NOT transfer TypedArrays from the main thread to the worker.\n // Transferring detaches the buffers on the main thread, which breaks downstream tasks\n // that still need those TypedArrays (e.g., the embedding vectors flowing through the\n // task graph). Workers send results back with transferables (zero-copy), but the\n // main thread always clones data going to workers to preserve its own references.\n const message = { id: requestId, type: \"call\", functionName, args };\n worker.postMessage(message);\n getLogger().info(`Worker ${workerName} function ${functionName} called.`);\n });\n } finally {\n this.endWorkerActivity(workerName);\n }\n }\n\n /**\n * Call a preview function on a worker. Returns undefined (rather than throwing)\n * if the worker has no preview function registered for the given name, so callers\n * can treat the result as an optional preview.\n *\n * @param workerName - Registered worker name\n * @param functionName - Name of the preview function registered on the worker\n * @param args - Arguments to pass: [input, output, model]\n * @returns The preview result, or undefined if not registered / on error\n */\n async callWorkerPreviewFunction<T>(\n workerName: string,\n functionName: string,\n args: any[]\n ): Promise<T | undefined> {\n await this.ensureWorkerReady(workerName);\n const worker = this.workers.get(workerName);\n if (!worker) return undefined;\n this.beginWorkerActivity(workerName);\n\n try {\n // Skip the roundtrip if the worker didn't register a preview function for this name.\n const knownPreview = this.workerPreviewFunctions.get(workerName);\n if (knownPreview && !knownPreview.has(functionName)) return undefined;\n\n return await new Promise((resolve) => {\n const requestId = crypto.randomUUID();\n\n const handleMessage = (event: MessageEvent) => {\n const { id, type, data } = event.data;\n if (id !== requestId) return;\n if (type === \"complete\") {\n cleanup();\n resolve(data as T | undefined);\n } else if (type === \"error\") {\n cleanup();\n getLogger().warn(`Worker ${workerName} preview function ${functionName} error:`, {\n error: data,\n });\n resolve(undefined);\n }\n };\n\n const cleanup = () => {\n worker.removeEventListener(\"message\", handleMessage);\n };\n\n worker.addEventListener(\"message\", handleMessage);\n\n const message = { id: requestId, type: \"call\", functionName, args, preview: true };\n // Note: No transferables — same reasoning as callWorkerFunction above.\n worker.postMessage(message);\n getLogger().info(`Worker ${workerName} preview function ${functionName} called.`);\n });\n } finally {\n this.endWorkerActivity(workerName);\n }\n }\n\n /**\n * Terminate a single worker and clean up all associated state.\n */\n async terminateWorker(name: string): Promise<void> {\n await this.terminateWorkerInstance(name);\n this.workerFactories.delete(name);\n this.idleTimeouts.delete(name);\n this.lazyInitPromises.delete(name);\n }\n\n /**\n * Terminate all workers and release resources.\n */\n async dispose(): Promise<void> {\n const names = [...new Set([...this.workers.keys(), ...this.workerFactories.keys()])];\n for (const name of names) {\n await this.terminateWorker(name);\n }\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.dispose();\n }\n\n /**\n * Call a streaming function on a worker and return an AsyncGenerator that\n * yields each stream chunk sent by the worker. The worker sends `stream_chunk`\n * messages for each yielded event and a `complete` message when the generator\n * finishes. An `error` message from the worker causes the iterator to throw.\n *\n * @param workerName - Registered worker name\n * @param functionName - Name of the stream function registered on the worker\n * @param args - Arguments to pass to the stream function\n * @param options - Optional abort signal\n * @returns AsyncGenerator yielding stream events from the worker\n */\n async *callWorkerStreamFunction<T>(\n workerName: string,\n functionName: string,\n args: any[],\n options?: { signal?: AbortSignal }\n ): AsyncGenerator<T> {\n await this.ensureWorkerReady(workerName);\n const worker = this.workers.get(workerName);\n if (!worker) throw new Error(`Worker ${workerName} not found.`);\n this.beginWorkerActivity(workerName);\n\n try {\n // The worker falls back to regular functions for stream calls, so either counts.\n const knownStream = this.workerStreamFunctions.get(workerName);\n const knownFns = this.workerFunctions.get(workerName);\n if (\n knownStream &&\n knownFns &&\n !knownStream.has(functionName) &&\n !knownFns.has(functionName)\n ) {\n throw new Error(`Function \"${functionName}\" is not registered on worker \"${workerName}\".`);\n }\n\n const requestId = crypto.randomUUID();\n\n // Push-queue pattern: messages push items, async generator pulls them\n type QueueItem =\n | { kind: \"event\"; data: T }\n | { kind: \"done\" }\n | { kind: \"error\"; error: Error };\n\n const queue: QueueItem[] = [];\n let waiting: ((value: void) => void) | null = null;\n\n const notify = () => {\n if (waiting) {\n const resolve = waiting;\n waiting = null;\n resolve();\n }\n };\n\n const handleMessage = (event: MessageEvent) => {\n const { id, type, data } = event.data;\n if (id !== requestId) return;\n\n if (type === \"stream_chunk\") {\n queue.push({ kind: \"event\", data });\n notify();\n } else if (type === \"complete\") {\n queue.push({ kind: \"done\" });\n notify();\n } else if (type === \"error\") {\n queue.push({ kind: \"error\", error: new Error(data) });\n notify();\n }\n };\n\n const handleAbort = () => {\n worker.postMessage({ id: requestId, type: \"abort\" });\n getLogger().info(`Worker ${workerName} stream function ${functionName} aborted.`);\n };\n\n const cleanup = () => {\n worker.removeEventListener(\"message\", handleMessage);\n options?.signal?.removeEventListener(\"abort\", handleAbort);\n };\n\n worker.addEventListener(\"message\", handleMessage);\n\n if (options?.signal) {\n if (options.signal.aborted) {\n cleanup();\n throw new Error(\"Operation aborted\");\n }\n options.signal.addEventListener(\"abort\", handleAbort, { once: true });\n }\n\n // Send call message with stream flag\n // Note: No transferables — same reasoning as callWorkerFunction above.\n const message = { id: requestId, type: \"call\", functionName, args, stream: true };\n worker.postMessage(message);\n getLogger().info(`Worker ${workerName} stream function ${functionName} called.`);\n\n let completedNormally = false;\n try {\n while (true) {\n while (queue.length > 0) {\n const item = queue.shift()!;\n if (item.kind === \"event\") {\n yield item.data;\n } else if (item.kind === \"done\") {\n completedNormally = true;\n return;\n } else if (item.kind === \"error\") {\n completedNormally = true;\n throw item.error;\n }\n }\n\n // Wait for the next message to arrive\n await new Promise<void>((resolve) => {\n waiting = resolve;\n });\n }\n } finally {\n // If the consumer stopped iterating early (break/return), notify\n // the worker to abort so it doesn't continue generating tokens.\n if (!completedNormally) {\n worker.postMessage({ id: requestId, type: \"abort\" });\n getLogger().info(`Worker ${workerName} stream function ${functionName} aborted.`);\n }\n cleanup();\n }\n } finally {\n this.endWorkerActivity(workerName);\n }\n }\n}\n\nexport const WORKER_MANAGER = createServiceToken<WorkerManager>(\"worker.manager\");\n\nglobalServiceRegistry.register(WORKER_MANAGER, () => new WorkerManager(), true);\n",
15
16
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Attempts to parse a potentially incomplete JSON string into a partial object.\n *\n * Useful for progressive rendering of streamed JSON output from AI providers.\n * Each call returns the most complete object that can be parsed from the\n * accumulated text so far.\n *\n * Strategy:\n * 1. Try JSON.parse directly (handles complete JSON)\n * 2. If that fails, scan the object while tracking brackets/strings, then\n * strip trailing incomplete tokens and close any still-open delimiters\n *\n * @param text - The (possibly incomplete) JSON string\n * @returns The parsed partial object, or undefined if text is too incomplete\n */\nexport function parsePartialJson(text: string): Record<string, unknown> | undefined {\n const trimmed = text.trim();\n if (!trimmed) return undefined;\n\n // Fast path: try parsing as-is\n try {\n const result = JSON.parse(trimmed);\n if (typeof result === \"object\" && result !== null && !Array.isArray(result)) {\n return result as Record<string, unknown>;\n }\n return undefined;\n } catch {\n // Fall through to repair logic\n }\n\n // Must start with '{' for an object\n if (trimmed[0] !== \"{\") return undefined;\n\n const repaired = repairJson(trimmed);\n if (repaired === undefined) return undefined;\n\n try {\n const result = JSON.parse(repaired);\n if (typeof result === \"object\" && result !== null && !Array.isArray(result)) {\n return result as Record<string, unknown>;\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Attempts to repair incomplete JSON by closing open structures.\n * Returns the repaired string, or undefined if the text is too malformed.\n */\nfunction repairJson(text: string): string | undefined {\n let result = \"\";\n let i = 0;\n const len = text.length;\n\n // Track open delimiters for closing\n const stack: string[] = [];\n let inString = false;\n let escaped = false;\n\n while (i < len) {\n const ch = text[i];\n\n if (escaped) {\n escaped = false;\n result += ch;\n i++;\n continue;\n }\n\n if (ch === \"\\\\\") {\n escaped = true;\n result += ch;\n i++;\n continue;\n }\n\n if (inString) {\n if (ch === '\"') {\n inString = false;\n result += ch;\n i++;\n continue;\n }\n result += ch;\n i++;\n continue;\n }\n\n // Not in a string\n switch (ch) {\n case '\"':\n inString = true;\n result += ch;\n i++;\n break;\n case \"{\":\n stack.push(\"}\");\n result += ch;\n i++;\n break;\n case \"[\":\n stack.push(\"]\");\n result += ch;\n i++;\n break;\n case \"}\":\n if (stack.length > 0 && stack[stack.length - 1] === \"}\") {\n stack.pop();\n result += ch;\n i++;\n } else {\n // Mismatched brace, truncate here\n return closeStack(result, stack);\n }\n break;\n case \"]\":\n if (stack.length > 0 && stack[stack.length - 1] === \"]\") {\n stack.pop();\n result += ch;\n i++;\n } else {\n return closeStack(result, stack);\n }\n break;\n default:\n result += ch;\n i++;\n break;\n }\n }\n\n // Reached the end with unclosed structures\n if (inString) {\n // Close the unclosed string, then close the stack\n result += '\"';\n }\n\n if (stack.length === 0) {\n // Already valid\n return result;\n }\n\n return closeStack(cleanTrailing(result), stack);\n}\n\n/**\n * Removes trailing incomplete tokens that would prevent JSON parsing.\n * Strips trailing commas, colons, and incomplete key/value fragments.\n */\nfunction cleanTrailing(text: string): string {\n // Remove trailing whitespace\n let s = text.trimEnd();\n\n // Repeatedly strip trailing problematic characters\n let changed = true;\n while (changed) {\n changed = false;\n const trimmed = s.trimEnd();\n\n // Trailing comma\n if (trimmed.endsWith(\",\")) {\n s = trimmed.slice(0, -1);\n changed = true;\n continue;\n }\n\n // Trailing colon (incomplete key-value pair)\n if (trimmed.endsWith(\":\")) {\n // Remove the colon and the preceding key\n const withoutColon = trimmed.slice(0, -1).trimEnd();\n // Remove the key (should be a string ending with \")\n if (withoutColon.endsWith('\"')) {\n const keyStart = withoutColon.lastIndexOf('\"', withoutColon.length - 2);\n if (keyStart >= 0) {\n // Also remove any preceding comma\n let before = withoutColon.slice(0, keyStart).trimEnd();\n if (before.endsWith(\",\")) {\n before = before.slice(0, -1);\n }\n s = before;\n changed = true;\n continue;\n }\n }\n // Can't find the key, just remove the colon\n s = withoutColon;\n changed = true;\n continue;\n }\n\n // Trailing incomplete value after a colon (e.g., `\"key\": tru` or `\"key\": 12`)\n // Check if there's an incomplete bare token at the end\n const bareTokenMatch = trimmed.match(\n /,\\s*\"[^\"]*\"\\s*:\\s*(?:tru|fal|nul|true|false|null|[\\d.eE+-]+)$/\n );\n if (bareTokenMatch) {\n // Check if the bare value is complete\n const valueStr = trimmed.slice(trimmed.lastIndexOf(\":\") + 1).trim();\n try {\n JSON.parse(valueStr);\n // Value is complete, keep it\n } catch {\n // Value is incomplete, remove the whole key-value pair\n s = trimmed.slice(0, bareTokenMatch.index!).trimEnd();\n if (s.endsWith(\",\")) s = s.slice(0, -1);\n changed = true;\n continue;\n }\n }\n }\n\n return s;\n}\n\n/**\n * Closes all open delimiters in the stack.\n */\nfunction closeStack(text: string, stack: string[]): string {\n return text + [...stack].reverse().join(\"\");\n}\n",
16
17
  "const Worker = globalThis.Worker;\nconst parentPort = self;\nexport { Worker, parentPort };\n\nimport { WorkerServerBase, WORKER_SERVER } from \"./WorkerServerBase\";\nimport { globalServiceRegistry } from \"../di\";\nexport { WORKER_SERVER };\nexport class WorkerServer extends WorkerServerBase {\n constructor() {\n parentPort?.addEventListener(\"message\", async (event) => {\n const msg = {\n type: event.type,\n // @ts-ignore - Ignore type mismatch between standard MessageEvent and our message type\n data: event.data,\n };\n await this.handleMessage(msg);\n });\n super();\n }\n}\n\nglobalServiceRegistry.register(WORKER_SERVER, () => new WorkerServer(), true);\n"
17
18
  ],
18
- "mappings": "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",
19
- "debugId": "8656CB8594AA6E1964756E2164756E21",
19
+ "mappings": "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",
20
+ "debugId": "492A9A82BCB04EA064756E2164756E21",
20
21
  "names": []
21
22
  }
@@ -98,7 +98,12 @@ class Container {
98
98
  return child;
99
99
  }
100
100
  }
101
- var globalContainer = new Container;
101
+ var GLOBAL_CONTAINER_KEY = Symbol.for("@workglow/util/di/globalContainer");
102
+ var _g = globalThis;
103
+ if (!_g[GLOBAL_CONTAINER_KEY]) {
104
+ _g[GLOBAL_CONTAINER_KEY] = new Container;
105
+ }
106
+ var globalContainer = _g[GLOBAL_CONTAINER_KEY];
102
107
  // src/di/ServiceRegistry.ts
103
108
  function createServiceToken(id) {
104
109
  return { id, _type: null };
@@ -150,6 +155,29 @@ function registerInputResolver(formatPrefix, resolver) {
150
155
  const resolvers = getInputResolvers();
151
156
  resolvers.set(formatPrefix, resolver);
152
157
  }
158
+ // src/di/PortCodecRegistry.ts
159
+ var GLOBAL_CODECS_KEY = Symbol.for("@workglow/util/di/portCodecs");
160
+ var _g2 = globalThis;
161
+ if (!_g2[GLOBAL_CODECS_KEY]) {
162
+ _g2[GLOBAL_CODECS_KEY] = new Map;
163
+ }
164
+ var codecs = _g2[GLOBAL_CODECS_KEY];
165
+ function registerPortCodec(formatPrefix, codec) {
166
+ codecs.set(formatPrefix, codec);
167
+ }
168
+ function getPortCodec(format) {
169
+ if (codecs.has(format))
170
+ return codecs.get(format);
171
+ const colon = format.indexOf(":");
172
+ if (colon > 0) {
173
+ const prefix = format.slice(0, colon);
174
+ return codecs.get(prefix);
175
+ }
176
+ return;
177
+ }
178
+ function _resetPortCodecsForTests() {
179
+ codecs.clear();
180
+ }
153
181
  // src/logging/ConsoleLogger.ts
154
182
  var LOG_LEVEL_ORDER = {
155
183
  debug: 0,
@@ -380,7 +408,7 @@ class WorkerServerBase {
380
408
  constructor() {}
381
409
  functions = {};
382
410
  streamFunctions = {};
383
- reactiveFunctions = {};
411
+ previewFunctions = {};
384
412
  requestControllers = new Map;
385
413
  completedRequests = new Set;
386
414
  postResult = (id, result) => {
@@ -418,20 +446,20 @@ class WorkerServerBase {
418
446
  type: "ready",
419
447
  functions: Object.keys(this.functions),
420
448
  streamFunctions: Object.keys(this.streamFunctions),
421
- reactiveFunctions: Object.keys(this.reactiveFunctions)
449
+ previewFunctions: Object.keys(this.previewFunctions)
422
450
  });
423
451
  }
424
452
  registerFunction(name, fn) {
425
453
  this.functions[name] = fn;
426
454
  }
427
- registerReactiveFunction(name, fn) {
428
- this.reactiveFunctions[name] = fn;
455
+ registerPreviewFunction(name, fn) {
456
+ this.previewFunctions[name] = fn;
429
457
  }
430
458
  registerStreamFunction(name, fn) {
431
459
  this.streamFunctions[name] = fn;
432
460
  }
433
461
  async handleMessage(event) {
434
- const { id, type, functionName, args, stream, reactive } = event.data;
462
+ const { id, type, functionName, args, stream, preview } = event.data;
435
463
  if (type === "abort") {
436
464
  return await this.handleAbort(id);
437
465
  }
@@ -439,8 +467,8 @@ class WorkerServerBase {
439
467
  if (stream) {
440
468
  return await this.handleStreamCall(id, functionName, args);
441
469
  }
442
- if (reactive) {
443
- return await this.handleReactiveCall(id, functionName, args);
470
+ if (preview) {
471
+ return await this.handlePreviewCall(id, functionName, args);
444
472
  }
445
473
  return await this.handleCall(id, functionName, args);
446
474
  }
@@ -454,14 +482,14 @@ class WorkerServerBase {
454
482
  this.scheduleCompletedRequestCleanup(id);
455
483
  }
456
484
  }
457
- async handleReactiveCall(id, functionName, [input, output, model]) {
458
- if (!(functionName in this.reactiveFunctions)) {
485
+ async handlePreviewCall(id, functionName, [input, model]) {
486
+ if (!(functionName in this.previewFunctions)) {
459
487
  this.postResult(id, undefined);
460
488
  return;
461
489
  }
462
490
  try {
463
- const fn = this.reactiveFunctions[functionName];
464
- const result = await fn(input, output, model);
491
+ const fn = this.previewFunctions[functionName];
492
+ const result = await fn(input, model);
465
493
  this.postResult(id, result);
466
494
  } catch (error) {
467
495
  this.postError(id, error);
@@ -549,7 +577,7 @@ class WorkerManager {
549
577
  readyWorkers = new Map;
550
578
  workerFunctions = new Map;
551
579
  workerStreamFunctions = new Map;
552
- workerReactiveFunctions = new Map;
580
+ workerPreviewFunctions = new Map;
553
581
  workerFactories = new Map;
554
582
  idleTimeouts = new Map;
555
583
  lazyInitPromises = new Map;
@@ -598,7 +626,7 @@ class WorkerManager {
598
626
  worker.removeEventListener("error", handleError);
599
627
  this.workerFunctions.set(name, new Set(event.data.functions ?? []));
600
628
  this.workerStreamFunctions.set(name, new Set(event.data.streamFunctions ?? []));
601
- this.workerReactiveFunctions.set(name, new Set(event.data.reactiveFunctions ?? []));
629
+ this.workerPreviewFunctions.set(name, new Set(event.data.previewFunctions ?? []));
602
630
  resolve();
603
631
  }
604
632
  };
@@ -688,7 +716,7 @@ class WorkerManager {
688
716
  this.readyWorkers.delete(name);
689
717
  this.workerFunctions.delete(name);
690
718
  this.workerStreamFunctions.delete(name);
691
- this.workerReactiveFunctions.delete(name);
719
+ this.workerPreviewFunctions.delete(name);
692
720
  this.activeCallCounts.delete(name);
693
721
  if (worker && "terminate" in worker && typeof worker.terminate === "function") {
694
722
  try {
@@ -709,7 +737,7 @@ class WorkerManager {
709
737
  this.readyWorkers.delete(name);
710
738
  this.workerFunctions.delete(name);
711
739
  this.workerStreamFunctions.delete(name);
712
- this.workerReactiveFunctions.delete(name);
740
+ this.workerPreviewFunctions.delete(name);
713
741
  this.activeCallCounts.delete(name);
714
742
  try {
715
743
  if (worker && "terminate" in worker && typeof worker.terminate === "function") {
@@ -777,15 +805,15 @@ class WorkerManager {
777
805
  this.endWorkerActivity(workerName);
778
806
  }
779
807
  }
780
- async callWorkerReactiveFunction(workerName, functionName, args) {
808
+ async callWorkerPreviewFunction(workerName, functionName, args) {
781
809
  await this.ensureWorkerReady(workerName);
782
810
  const worker = this.workers.get(workerName);
783
811
  if (!worker)
784
812
  return;
785
813
  this.beginWorkerActivity(workerName);
786
814
  try {
787
- const knownReactive = this.workerReactiveFunctions.get(workerName);
788
- if (knownReactive && !knownReactive.has(functionName))
815
+ const knownPreview = this.workerPreviewFunctions.get(workerName);
816
+ if (knownPreview && !knownPreview.has(functionName))
789
817
  return;
790
818
  return await new Promise((resolve) => {
791
819
  const requestId = crypto.randomUUID();
@@ -798,7 +826,7 @@ class WorkerManager {
798
826
  resolve(data);
799
827
  } else if (type === "error") {
800
828
  cleanup();
801
- getLogger().warn(`Worker ${workerName} reactive function ${functionName} error:`, {
829
+ getLogger().warn(`Worker ${workerName} preview function ${functionName} error:`, {
802
830
  error: data
803
831
  });
804
832
  resolve(undefined);
@@ -808,9 +836,9 @@ class WorkerManager {
808
836
  worker.removeEventListener("message", handleMessage);
809
837
  };
810
838
  worker.addEventListener("message", handleMessage);
811
- const message = { id: requestId, type: "call", functionName, args, reactive: true };
839
+ const message = { id: requestId, type: "call", functionName, args, preview: true };
812
840
  worker.postMessage(message);
813
- getLogger().info(`Worker ${workerName} reactive function ${functionName} called.`);
841
+ getLogger().info(`Worker ${workerName} preview function ${functionName} called.`);
814
842
  });
815
843
  } finally {
816
844
  this.endWorkerActivity(workerName);
@@ -1113,16 +1141,19 @@ class WorkerServer extends WorkerServerBase {
1113
1141
  globalServiceRegistry.register(WORKER_SERVER, () => new WorkerServer, true);
1114
1142
  export {
1115
1143
  setLogger,
1144
+ registerPortCodec,
1116
1145
  registerInputResolver,
1117
1146
  registerInputCompactor,
1118
1147
  parsePartialJson,
1119
1148
  parentPort,
1120
1149
  globalServiceRegistry,
1121
1150
  globalContainer,
1151
+ getPortCodec,
1122
1152
  getLogger,
1123
1153
  getInputResolvers,
1124
1154
  getInputCompactors,
1125
1155
  createServiceToken,
1156
+ _resetPortCodecsForTests,
1126
1157
  WorkerServerBase,
1127
1158
  WorkerServer,
1128
1159
  WorkerManager,
@@ -1138,4 +1169,4 @@ export {
1138
1169
  ConsoleLogger
1139
1170
  };
1140
1171
 
1141
- //# debugId=ADAB7D46DF1AEF8B64756E2164756E21
1172
+ //# debugId=4535666D467A125964756E2164756E21