@computekit/core 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -767,12 +767,21 @@ var ComputeKit = class extends EventEmitter {
767
767
  /**
768
768
  * Register a compute function
769
769
  *
770
- * @param name - Unique name for the function
770
+ * @param name - Unique name for the function (autocompletes if registry is extended)
771
771
  * @param fn - The function to execute (will run in a Web Worker)
772
772
  *
773
773
  * @example
774
774
  * ```ts
775
+ * // Basic usage
775
776
  * kit.register('sum', (arr: number[]) => arr.reduce((a, b) => a + b, 0));
777
+ *
778
+ * // With typed registry (extend ComputeFunctionRegistry for autocomplete)
779
+ * // declare module '@computekit/core' {
780
+ * // interface ComputeFunctionRegistry {
781
+ * // sum: { input: number[]; output: number };
782
+ * // }
783
+ * // }
784
+ * // kit.register('sum', (arr) => arr.reduce((a, b) => a + b, 0));
776
785
  * ```
777
786
  */
778
787
  register(name, fn) {
@@ -782,14 +791,17 @@ var ComputeKit = class extends EventEmitter {
782
791
  /**
783
792
  * Execute a registered compute function
784
793
  *
785
- * @param name - Name of the registered function
786
- * @param input - Input data for the function
794
+ * @param name - Name of the registered function (autocompletes if registry is extended)
795
+ * @param input - Input data for the function (type-safe if registry is extended)
787
796
  * @param options - Execution options
788
- * @returns Promise resolving to the function result
797
+ * @returns Promise resolving to the function result (type-safe if registry is extended)
789
798
  *
790
799
  * @example
791
800
  * ```ts
792
801
  * const sum = await kit.run('sum', [1, 2, 3, 4, 5]);
802
+ *
803
+ * // With typed registry, input/output types are inferred:
804
+ * // const result = await kit.run('fibonacci', 50); // result: number
793
805
  * ```
794
806
  */
795
807
  async run(name, input, options) {
@@ -798,8 +810,8 @@ var ComputeKit = class extends EventEmitter {
798
810
  /**
799
811
  * Execute a registered compute function with full result metadata
800
812
  *
801
- * @param name - Name of the registered function
802
- * @param input - Input data for the function
813
+ * @param name - Name of the registered function (autocompletes if registry is extended)
814
+ * @param input - Input data for the function (type-safe if registry is extended)
803
815
  * @param options - Execution options
804
816
  * @returns Promise resolving to ComputeResult with metadata
805
817
  *
@@ -811,7 +823,11 @@ var ComputeKit = class extends EventEmitter {
811
823
  */
812
824
  async runWithMetadata(name, input, options) {
813
825
  const startTime = performance.now();
814
- const data = await this.pool.execute(name, input, options);
826
+ const data = await this.pool.execute(
827
+ name,
828
+ input,
829
+ options
830
+ );
815
831
  const duration = performance.now() - startTime;
816
832
  return {
817
833
  data,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/pool.ts","../src/wasm.ts","../src/index.ts"],"names":["module","logger"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * ComputeKit Utilities\n * Helper functions for the WASM + Worker toolkit\n */\n\n/**\n * Generate a unique ID\n */\nexport function generateId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * Check if running in a Web Worker context\n */\nexport function isWorkerContext(): boolean {\n return (\n typeof self !== 'undefined' &&\n typeof Window === 'undefined' &&\n typeof self.postMessage === 'function'\n );\n}\n\n/**\n * Check if running in a browser context\n */\nexport function isBrowserContext(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * Check if SharedArrayBuffer is available\n */\nexport function isSharedArrayBufferAvailable(): boolean {\n try {\n return typeof SharedArrayBuffer !== 'undefined';\n } catch {\n return false;\n }\n}\n\n/**\n * Check if WASM is supported\n */\nexport function isWasmSupported(): boolean {\n try {\n if (typeof WebAssembly === 'object') {\n const module = new WebAssembly.Module(\n Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00)\n );\n return module instanceof WebAssembly.Module;\n }\n } catch {\n // WASM not supported\n }\n return false;\n}\n\n/**\n * Get the number of logical processors\n */\nexport function getHardwareConcurrency(): number {\n if (typeof navigator !== 'undefined' && navigator.hardwareConcurrency) {\n return navigator.hardwareConcurrency;\n }\n return 4; // Reasonable default\n}\n\n/**\n * Create a deferred promise\n */\nexport interface Deferred<T> {\n promise: Promise<T>;\n resolve: (value: T | PromiseLike<T>) => void;\n reject: (reason?: unknown) => void;\n}\n\nexport function createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, resolve, reject };\n}\n\n/**\n * Create a timeout promise\n */\nexport function createTimeout(ms: number, message?: string): Promise<never> {\n return new Promise((_, reject) => {\n setTimeout(() => {\n reject(new Error(message || `Operation timed out after ${ms}ms`));\n }, ms);\n });\n}\n\n/**\n * Race a promise against a timeout\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n ms: number,\n message?: string\n): Promise<T> {\n return Promise.race([promise, createTimeout(ms, message)]);\n}\n\n/**\n * Detect transferable objects in data\n */\nexport function findTransferables(data: unknown): Transferable[] {\n const transferables: Transferable[] = [];\n const seen = new WeakSet();\n\n function traverse(obj: unknown): void {\n if (obj === null || typeof obj !== 'object') return;\n if (seen.has(obj as object)) return;\n seen.add(obj as object);\n\n if (obj instanceof ArrayBuffer) {\n transferables.push(obj);\n return;\n }\n\n if (ArrayBuffer.isView(obj)) {\n transferables.push(obj.buffer);\n return;\n }\n\n if (obj instanceof MessagePort) {\n transferables.push(obj);\n return;\n }\n\n if (typeof ImageBitmap !== 'undefined' && obj instanceof ImageBitmap) {\n transferables.push(obj);\n return;\n }\n\n if (typeof OffscreenCanvas !== 'undefined' && obj instanceof OffscreenCanvas) {\n transferables.push(obj);\n return;\n }\n\n if (Array.isArray(obj)) {\n obj.forEach(traverse);\n return;\n }\n\n if (obj instanceof Map) {\n obj.forEach((value, key) => {\n traverse(key);\n traverse(value);\n });\n return;\n }\n\n if (obj instanceof Set) {\n obj.forEach(traverse);\n return;\n }\n\n Object.values(obj).forEach(traverse);\n }\n\n traverse(data);\n return transferables;\n}\n\n/**\n * Clone data, detaching transferables\n */\nexport function cloneForTransfer<T>(data: T): { data: T; transfer: Transferable[] } {\n const transfer = findTransferables(data);\n return { data, transfer };\n}\n\n/**\n * Create a typed event emitter\n */\nexport type EventHandler<T = unknown> = (data: T) => void;\n\nexport class EventEmitter<TEvents extends Record<string, unknown>> {\n private handlers = new Map<keyof TEvents, Set<EventHandler>>();\n\n on<K extends keyof TEvents>(event: K, handler: EventHandler<TEvents[K]>): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => this.off(event, handler);\n }\n\n off<K extends keyof TEvents>(event: K, handler: EventHandler<TEvents[K]>): void {\n this.handlers.get(event)?.delete(handler as EventHandler);\n }\n\n emit<K extends keyof TEvents>(event: K, data: TEvents[K]): void {\n this.handlers.get(event)?.forEach((handler) => {\n try {\n handler(data);\n } catch (err) {\n console.error(`Error in event handler for ${String(event)}:`, err);\n }\n });\n }\n\n removeAllListeners(event?: keyof TEvents): void {\n if (event) {\n this.handlers.delete(event);\n } else {\n this.handlers.clear();\n }\n }\n}\n\n/**\n * Simple LRU cache\n */\nexport class LRUCache<K, V> {\n private cache = new Map<K, V>();\n private maxSize: number;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n }\n\n get(key: K): V | undefined {\n const value = this.cache.get(key);\n if (value !== undefined) {\n // Move to end (most recently used)\n this.cache.delete(key);\n this.cache.set(key, value);\n }\n return value;\n }\n\n set(key: K, value: V): void {\n if (this.cache.has(key)) {\n this.cache.delete(key);\n } else if (this.cache.size >= this.maxSize) {\n // Delete oldest (first) entry\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n this.cache.set(key, value);\n }\n\n has(key: K): boolean {\n return this.cache.has(key);\n }\n\n delete(key: K): boolean {\n return this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n get size(): number {\n return this.cache.size;\n }\n}\n\n/**\n * Serialize function to string for worker\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport function serializeFunction(fn: Function): string {\n return fn.toString();\n}\n\n/**\n * Estimate the byte size of a value for structured cloning.\n * This is an approximation useful for debugging and performance monitoring.\n */\nexport function estimatePayloadSize(value: unknown): number {\n if (value === null || value === undefined) return 0;\n if (typeof value === 'boolean') return 4;\n if (typeof value === 'number') return 8;\n if (typeof value === 'string') return value.length * 2; // UTF-16\n\n if (value instanceof ArrayBuffer) return value.byteLength;\n if (ArrayBuffer.isView(value)) return value.byteLength;\n if (value instanceof Blob) return value.size;\n\n const seen = new WeakSet<object>();\n\n function traverse(obj: unknown): number {\n if (obj === null || typeof obj !== 'object') {\n if (typeof obj === 'boolean') return 4;\n if (typeof obj === 'number') return 8;\n if (typeof obj === 'string') return (obj as string).length * 2;\n return 0;\n }\n\n if (seen.has(obj)) return 0; // Avoid infinite loops\n seen.add(obj);\n\n if (obj instanceof ArrayBuffer) return obj.byteLength;\n if (ArrayBuffer.isView(obj)) return obj.byteLength;\n if (obj instanceof Blob) return obj.size;\n if (obj instanceof Date) return 8;\n if (obj instanceof RegExp) return obj.source.length * 2;\n\n if (Array.isArray(obj)) {\n return obj.reduce((sum, item) => sum + traverse(item), 0);\n }\n\n if (obj instanceof Map) {\n let size = 0;\n obj.forEach((val, key) => {\n size += traverse(key) + traverse(val);\n });\n return size;\n }\n\n if (obj instanceof Set) {\n let size = 0;\n obj.forEach((val) => {\n size += traverse(val);\n });\n return size;\n }\n\n // Plain object\n return Object.entries(obj).reduce(\n (sum, [key, val]) => sum + key.length * 2 + traverse(val),\n 0\n );\n }\n\n return traverse(value);\n}\n\n/**\n * Format bytes to human-readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${(bytes / Math.pow(k, i)).toFixed(i > 0 ? 1 : 0)} ${sizes[i]}`;\n}\n\n/**\n * Logger utility\n */\nexport interface Logger {\n debug(...args: unknown[]): void;\n info(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n error(...args: unknown[]): void;\n}\n\nexport function createLogger(prefix: string, enabled: boolean = false): Logger {\n const noop = () => {};\n const log = (level: string) =>\n enabled ? (...args: unknown[]) => console.log(`[${prefix}:${level}]`, ...args) : noop;\n\n return {\n debug: log('debug'),\n info: log('info'),\n warn: enabled\n ? (...args: unknown[]) => console.warn(`[${prefix}:warn]`, ...args)\n : noop,\n error: (...args: unknown[]) => console.error(`[${prefix}:error]`, ...args),\n };\n}\n","/**\n * ComputeKit Worker Pool\n * Manages a pool of Web Workers for parallel computation\n */\n\nimport type {\n ComputeKitOptions,\n ComputeOptions,\n ComputeProgress,\n WorkerInfo,\n WorkerState,\n PoolStats,\n WorkerMessage,\n ExecutePayload,\n ResultPayload,\n ErrorPayload,\n ProgressPayload,\n} from './types';\n\nimport {\n generateId,\n createDeferred,\n withTimeout,\n findTransferables,\n getHardwareConcurrency,\n createLogger,\n estimatePayloadSize,\n formatBytes,\n type Deferred,\n type Logger,\n} from './utils';\n\n/** Task in the queue */\ninterface QueuedTask<T = unknown> {\n id: string;\n functionName: string;\n input: unknown;\n options?: ComputeOptions;\n deferred: Deferred<T>;\n priority: number;\n createdAt: number;\n onProgress?: (progress: ComputeProgress) => void;\n}\n\n/** Worker wrapper */\ninterface PoolWorker {\n id: string;\n worker: Worker;\n state: WorkerState;\n currentTask?: string;\n tasksCompleted: number;\n errors: number;\n createdAt: number;\n lastActiveAt: number;\n ready: boolean;\n readyPromise: Promise<void>;\n}\n\n/** Registry entry for compute functions */\ninterface RegisteredFunction {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n fn: Function;\n serialized: string;\n}\n\n/**\n * Worker Pool - manages Web Workers for parallel computation\n */\nexport class WorkerPool {\n private workers: Map<string, PoolWorker> = new Map();\n private taskQueue: QueuedTask[] = [];\n private pendingTasks: Map<string, QueuedTask> = new Map();\n private functions: Map<string, RegisteredFunction> = new Map();\n private workerUrl: string | null = null;\n private options: Required<ComputeKitOptions>;\n private logger: Logger;\n private initialized = false;\n private stats = {\n tasksCompleted: 0,\n tasksFailed: 0,\n totalDuration: 0,\n };\n\n constructor(options: ComputeKitOptions = {}) {\n this.options = {\n maxWorkers: options.maxWorkers ?? getHardwareConcurrency(),\n timeout: options.timeout ?? 30000,\n debug: options.debug ?? false,\n workerPath: options.workerPath ?? '',\n useSharedMemory: options.useSharedMemory ?? true,\n remoteDependencies: options.remoteDependencies ?? [],\n };\n\n this.logger = createLogger('ComputeKit:Pool', this.options.debug);\n this.logger.info('WorkerPool created with options:', this.options);\n }\n\n /**\n * Initialize the worker pool\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n this.logger.info('Initializing worker pool...');\n this.logger.info('Registered functions:', Array.from(this.functions.keys()));\n this.workerUrl = this.createWorkerBlob();\n\n // Create initial workers\n const workerCount = Math.min(2, this.options.maxWorkers);\n for (let i = 0; i < workerCount; i++) {\n await this.createWorker();\n }\n\n this.initialized = true;\n this.logger.info(`Worker pool initialized with ${workerCount} workers`);\n }\n\n private pendingRecreate: Promise<void> | null = null;\n\n /**\n * Register a compute function\n */\n register<TInput, TOutput>(\n name: string,\n fn: (input: TInput) => TOutput | Promise<TOutput>\n ): void {\n this.logger.debug(`Registering function: ${name}`);\n this.functions.set(name, {\n fn,\n serialized: fn.toString(),\n });\n\n // If already initialized, we need to recreate workers with updated functions\n if (this.initialized) {\n this.pendingRecreate = this.recreateWorkers();\n } else {\n // If not initialized yet but workerUrl exists, revoke it so it gets recreated\n if (this.workerUrl) {\n URL.revokeObjectURL(this.workerUrl);\n this.workerUrl = null;\n }\n }\n }\n\n /**\n * Recreate workers with updated function registry\n */\n private async recreateWorkers(): Promise<void> {\n this.logger.debug('Recreating workers with updated functions...');\n\n // Revoke old blob URL\n if (this.workerUrl) {\n URL.revokeObjectURL(this.workerUrl);\n }\n\n // Create new worker blob with all functions\n this.workerUrl = this.createWorkerBlob();\n\n // Terminate existing idle workers and create new ones\n const idleWorkers = Array.from(this.workers.entries()).filter(\n ([_, w]) => w.state === 'idle'\n );\n\n for (const [id, poolWorker] of idleWorkers) {\n poolWorker.worker.terminate();\n this.workers.delete(id);\n }\n\n // Create new workers\n const workerCount = Math.max(\n 1,\n Math.min(2, this.options.maxWorkers) - this.workers.size\n );\n for (let i = 0; i < workerCount; i++) {\n await this.createWorker();\n }\n }\n\n /**\n * Execute a compute function\n */\n async execute<TInput, TOutput>(\n name: string,\n input: TInput,\n options?: ComputeOptions\n ): Promise<TOutput> {\n // Wait for any pending worker recreation\n if (this.pendingRecreate) {\n await this.pendingRecreate;\n this.pendingRecreate = null;\n }\n\n if (!this.initialized) {\n await this.initialize();\n }\n\n const fn = this.functions.get(name);\n if (!fn) {\n throw new Error(`Function \"${name}\" not registered`);\n }\n\n const taskId = generateId();\n const timeout = options?.timeout ?? this.options.timeout;\n\n this.logger.debug(`Executing task ${taskId} for function \"${name}\"`);\n\n // Check for abort signal\n if (options?.signal?.aborted) {\n throw new Error('Operation aborted');\n }\n\n const deferred = createDeferred<TOutput>();\n const task: QueuedTask<TOutput> = {\n id: taskId,\n functionName: name,\n input,\n options,\n deferred,\n priority: options?.priority ?? 5,\n createdAt: Date.now(),\n onProgress: options?.onProgress,\n };\n\n // Handle abort signal\n if (options?.signal) {\n options.signal.addEventListener('abort', () => {\n this.cancelTask(taskId);\n deferred.reject(new Error('Operation aborted'));\n });\n }\n\n // Add to queue\n this.enqueue(task);\n this.processQueue();\n\n return withTimeout(deferred.promise, timeout, `Task \"${name}\" timed out`);\n }\n\n /**\n * Get pool statistics\n */\n getStats(): PoolStats {\n const workers = Array.from(this.workers.values()).map(\n (w): WorkerInfo => ({\n id: w.id,\n state: w.state,\n currentTask: w.currentTask,\n tasksCompleted: w.tasksCompleted,\n errors: w.errors,\n createdAt: w.createdAt,\n lastActiveAt: w.lastActiveAt,\n })\n );\n\n return {\n workers,\n totalWorkers: this.workers.size,\n activeWorkers: workers.filter((w) => w.state === 'busy').length,\n idleWorkers: workers.filter((w) => w.state === 'idle').length,\n queueLength: this.taskQueue.length,\n tasksCompleted: this.stats.tasksCompleted,\n tasksFailed: this.stats.tasksFailed,\n averageTaskDuration:\n this.stats.tasksCompleted > 0\n ? this.stats.totalDuration / this.stats.tasksCompleted\n : 0,\n };\n }\n\n /**\n * Terminate all workers and clean up\n */\n async terminate(): Promise<void> {\n this.logger.info('Terminating worker pool...');\n\n // Reject all pending tasks\n for (const task of this.pendingTasks.values()) {\n task.deferred.reject(new Error('Worker pool terminated'));\n }\n this.pendingTasks.clear();\n this.taskQueue = [];\n\n // Terminate all workers\n for (const poolWorker of this.workers.values()) {\n poolWorker.worker.terminate();\n poolWorker.state = 'terminated';\n }\n this.workers.clear();\n\n // Revoke blob URL\n if (this.workerUrl) {\n URL.revokeObjectURL(this.workerUrl);\n this.workerUrl = null;\n }\n\n this.initialized = false;\n this.logger.info('Worker pool terminated');\n }\n\n /**\n * Create the worker blob URL\n */\n private createWorkerBlob(): string {\n // Serialize all registered functions\n const functionsCode = Array.from(this.functions.entries())\n .map(([name, { serialized }]) => `\"${name}\": ${serialized}`)\n .join(',\\n');\n\n this.logger.debug(\n 'Creating worker blob with functions:',\n Array.from(this.functions.keys())\n );\n\n // Generate importScripts for remote dependencies\n const remoteDeps = this.options.remoteDependencies;\n const importScriptsCode =\n remoteDeps.length > 0\n ? `importScripts(${remoteDeps.map((url) => `\"${url}\"`).join(', ')});`\n : '';\n\n const workerCode = `\n${importScriptsCode}\n\nconst functions = {\n${functionsCode}\n};\n\nself.onmessage = function(e) {\n const msg = e.data;\n if (msg.type === 'execute') {\n const fn = functions[msg.payload.functionName];\n if (!fn) {\n self.postMessage({ id: msg.id, type: 'error', payload: { message: 'Function not found: ' + msg.payload.functionName } });\n return;\n }\n try {\n const start = performance.now();\n Promise.resolve(fn(msg.payload.input)).then(function(result) {\n self.postMessage({ id: msg.id, type: 'result', payload: { data: result, duration: performance.now() - start } });\n }).catch(function(err) {\n self.postMessage({ id: msg.id, type: 'error', payload: { message: err.message || String(err) } });\n });\n } catch (err) {\n self.postMessage({ id: msg.id, type: 'error', payload: { message: err.message || String(err) } });\n }\n }\n};\nself.postMessage({ type: 'ready' });\n`;\n\n const blob = new Blob([workerCode], { type: 'application/javascript' });\n return URL.createObjectURL(blob);\n }\n\n /**\n * Create a new worker\n */\n private async createWorker(): Promise<PoolWorker> {\n if (!this.workerUrl) {\n this.workerUrl = this.createWorkerBlob();\n }\n\n const id = generateId();\n const worker = new Worker(this.workerUrl);\n\n // Create ready promise\n let resolveReady: () => void;\n const readyPromise = new Promise<void>((resolve) => {\n resolveReady = resolve;\n });\n\n const poolWorker: PoolWorker = {\n id,\n worker,\n state: 'idle',\n tasksCompleted: 0,\n errors: 0,\n createdAt: Date.now(),\n lastActiveAt: Date.now(),\n ready: false,\n readyPromise,\n };\n\n // Set up message handler\n worker.onmessage = (e: MessageEvent<WorkerMessage>) => {\n if (e.data.type === 'ready') {\n poolWorker.ready = true;\n resolveReady!();\n }\n this.handleWorkerMessage(poolWorker, e.data);\n };\n\n worker.onerror = (e: ErrorEvent) => {\n this.handleWorkerError(poolWorker, e);\n };\n\n this.workers.set(id, poolWorker);\n this.logger.debug(`Created worker ${id}`);\n\n // Wait for worker to be ready\n await readyPromise;\n this.logger.debug(`Worker ${id} is ready`);\n\n return poolWorker;\n }\n\n /**\n * Handle messages from workers\n */\n private handleWorkerMessage(poolWorker: PoolWorker, message: WorkerMessage): void {\n this.logger.debug('Received message from worker:', message);\n const { id, type, payload } = message;\n\n switch (type) {\n case 'ready':\n this.logger.debug(`Worker ${poolWorker.id} ready`);\n break;\n\n case 'result': {\n const task = this.pendingTasks.get(id);\n if (task) {\n const resultPayload = payload as ResultPayload;\n this.pendingTasks.delete(id);\n poolWorker.state = 'idle';\n poolWorker.currentTask = undefined;\n poolWorker.tasksCompleted++;\n poolWorker.lastActiveAt = Date.now();\n\n this.stats.tasksCompleted++;\n this.stats.totalDuration += resultPayload.duration;\n\n // Log with payload sizes in debug mode\n const inputSize = estimatePayloadSize(task.input);\n const outputSize = resultPayload.outputSize ?? 0;\n this.logger.debug(\n `Task ${id} (${task.functionName}): ` +\n `input=${formatBytes(inputSize)}, ` +\n `output=${formatBytes(outputSize)}, ` +\n `duration=${resultPayload.duration.toFixed(2)}ms`\n );\n task.deferred.resolve(resultPayload.data);\n\n // Process next task\n this.processQueue();\n }\n break;\n }\n\n case 'error': {\n const task = this.pendingTasks.get(id);\n if (task) {\n const errorPayload = payload as ErrorPayload;\n this.pendingTasks.delete(id);\n poolWorker.state = 'idle';\n poolWorker.currentTask = undefined;\n poolWorker.errors++;\n poolWorker.lastActiveAt = Date.now();\n\n this.stats.tasksFailed++;\n\n const error = new Error(errorPayload.message);\n if (errorPayload.stack) {\n error.stack = errorPayload.stack;\n }\n\n this.logger.error(`Task ${id} failed:`, errorPayload.message);\n task.deferred.reject(error);\n\n // Process next task\n this.processQueue();\n }\n break;\n }\n\n case 'progress': {\n const progressPayload = payload as ProgressPayload;\n const task = this.pendingTasks.get(progressPayload.taskId);\n if (task?.onProgress) {\n task.onProgress(progressPayload.progress);\n }\n break;\n }\n }\n }\n\n /**\n * Handle worker errors\n */\n private handleWorkerError(poolWorker: PoolWorker, error: ErrorEvent): void {\n this.logger.error(`Worker ${poolWorker.id} error:`, error.message);\n poolWorker.state = 'error';\n poolWorker.errors++;\n\n // Reject current task if any\n if (poolWorker.currentTask) {\n const task = this.pendingTasks.get(poolWorker.currentTask);\n if (task) {\n this.pendingTasks.delete(poolWorker.currentTask);\n task.deferred.reject(new Error(`Worker error: ${error.message}`));\n }\n }\n\n // Terminate and recreate the worker\n poolWorker.worker.terminate();\n this.workers.delete(poolWorker.id);\n\n // Create a new worker to replace it\n this.createWorker().then(() => this.processQueue());\n }\n\n /**\n * Add task to queue (priority-based)\n */\n private enqueue<T>(task: QueuedTask<T>): void {\n // Insert based on priority (higher priority first)\n let inserted = false;\n for (let i = 0; i < this.taskQueue.length; i++) {\n if (task.priority > this.taskQueue[i].priority) {\n this.taskQueue.splice(i, 0, task as QueuedTask);\n inserted = true;\n break;\n }\n }\n if (!inserted) {\n this.taskQueue.push(task as QueuedTask);\n }\n }\n\n /**\n * Process queued tasks\n */\n private async processQueue(): Promise<void> {\n if (this.taskQueue.length === 0) return;\n\n // Find an idle worker\n let idleWorker: PoolWorker | undefined;\n for (const worker of this.workers.values()) {\n if (worker.state === 'idle') {\n idleWorker = worker;\n break;\n }\n }\n\n // Create new worker if needed and under limit\n if (!idleWorker && this.workers.size < this.options.maxWorkers) {\n idleWorker = await this.createWorker();\n }\n\n if (!idleWorker) return;\n\n // Get next task\n const task = this.taskQueue.shift();\n if (!task) return;\n\n // Execute task\n this.executeOnWorker(idleWorker, task);\n\n // Continue processing if more tasks\n if (this.taskQueue.length > 0) {\n this.processQueue();\n }\n }\n\n /**\n * Execute task on a specific worker\n */\n private executeOnWorker(poolWorker: PoolWorker, task: QueuedTask): void {\n this.logger.debug(\n `executeOnWorker: Starting task ${task.id} (${task.functionName}) on worker ${poolWorker.id}`\n );\n poolWorker.state = 'busy';\n poolWorker.currentTask = task.id;\n poolWorker.lastActiveAt = Date.now();\n\n this.pendingTasks.set(task.id, task);\n\n const message: WorkerMessage<ExecutePayload> = {\n id: task.id,\n type: 'execute',\n payload: {\n functionName: task.functionName,\n input: task.input,\n // Don't send options - they may contain non-cloneable objects like AbortSignal\n },\n timestamp: Date.now(),\n };\n\n // Find transferables in input\n const transfer = findTransferables(task.input);\n\n this.logger.debug(`Posting message to worker:`, message);\n poolWorker.worker.postMessage(message, transfer);\n this.logger.debug(`Message posted to worker ${poolWorker.id}`);\n }\n\n /**\n * Cancel a pending task\n */\n private cancelTask(taskId: string): void {\n // Remove from queue\n const queueIndex = this.taskQueue.findIndex((t) => t.id === taskId);\n if (queueIndex !== -1) {\n this.taskQueue.splice(queueIndex, 1);\n }\n\n // Remove from pending (worker will complete but result ignored)\n this.pendingTasks.delete(taskId);\n }\n}\n","/**\n * ComputeKit WASM Loader\n * Utilities for loading and managing WebAssembly modules\n */\n\nimport type { WasmModuleConfig } from './types';\nimport { createLogger, LRUCache } from './utils';\n\nconst logger = createLogger('ComputeKit:WASM');\n\n/** Cached WASM modules */\nconst moduleCache = new LRUCache<string, WebAssembly.Module>(10);\n\n/** Cached WASM instances */\nconst instanceCache = new LRUCache<string, WebAssembly.Instance>(10);\n\n/**\n * Load a WASM module from various sources\n */\nexport async function loadWasmModule(\n source: string | ArrayBuffer | Uint8Array\n): Promise<WebAssembly.Module> {\n // Check cache for string sources\n if (typeof source === 'string') {\n const cached = moduleCache.get(source);\n if (cached) {\n logger.debug('Using cached WASM module:', source);\n return cached;\n }\n }\n\n let bytes: ArrayBuffer | Uint8Array;\n\n if (typeof source === 'string') {\n if (source.startsWith('data:')) {\n // Base64 encoded WASM\n const base64 = source.split(',')[1];\n bytes = Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));\n } else {\n // URL to WASM file\n logger.debug('Fetching WASM from:', source);\n const response = await fetch(source);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch WASM: ${response.statusText}`);\n }\n\n // Use streaming compilation if available\n if (WebAssembly.compileStreaming) {\n const module = await WebAssembly.compileStreaming(response);\n moduleCache.set(source, module);\n return module;\n }\n\n bytes = await response.arrayBuffer();\n }\n } else {\n bytes = source;\n }\n\n // Compile the module\n const module = await WebAssembly.compile(bytes as BufferSource);\n\n if (typeof source === 'string') {\n moduleCache.set(source, module);\n }\n\n return module;\n}\n\n/**\n * Instantiate a WASM module with imports\n */\nexport async function instantiateWasm(\n module: WebAssembly.Module,\n imports: WebAssembly.Imports = {}\n): Promise<WebAssembly.Instance> {\n return WebAssembly.instantiate(module, imports);\n}\n\n/**\n * Load and instantiate a WASM module in one step\n */\nexport async function loadAndInstantiate(\n config: WasmModuleConfig\n): Promise<{ module: WebAssembly.Module; instance: WebAssembly.Instance }> {\n const { source, imports = {}, memory } = config;\n\n // Create memory if specified\n const wasmImports: WebAssembly.Imports = { ...imports };\n if (memory) {\n wasmImports.env = {\n ...wasmImports.env,\n memory: new WebAssembly.Memory({\n initial: memory.initial,\n maximum: memory.maximum,\n shared: memory.shared,\n }),\n };\n }\n\n const module = await loadWasmModule(source);\n const instance = await instantiateWasm(module, wasmImports);\n\n return { module, instance };\n}\n\n/**\n * Create a WASM module from AssemblyScript-compiled bytes\n */\nexport async function loadAssemblyScript(\n source: string | ArrayBuffer,\n imports: WebAssembly.Imports = {}\n): Promise<{\n module: WebAssembly.Module;\n instance: WebAssembly.Instance;\n exports: Record<string, unknown>;\n}> {\n // Default AssemblyScript imports\n const defaultImports: WebAssembly.Imports = {\n env: {\n abort: (_message: number, fileName: number, line: number, column: number) => {\n console.error(`AssemblyScript abort at ${fileName}:${line}:${column}`);\n },\n seed: () => Date.now(),\n ...((imports.env as object) || {}),\n },\n ...imports,\n };\n\n const { module, instance } = await loadAndInstantiate({\n source,\n imports: defaultImports,\n });\n\n return {\n module,\n instance,\n exports: instance.exports as Record<string, unknown>,\n };\n}\n\n/**\n * Helper to wrap WASM exports for easier use\n */\nexport function wrapWasmExports<T extends Record<string, unknown>>(\n instance: WebAssembly.Instance\n): T {\n return instance.exports as T;\n}\n\n/**\n * Create a typed array view into WASM memory\n */\nexport function getMemoryView<T extends ArrayBufferView>(\n memory: WebAssembly.Memory,\n ArrayType: new (buffer: ArrayBuffer, byteOffset?: number, length?: number) => T,\n offset: number = 0,\n length?: number\n): T {\n return new ArrayType(memory.buffer, offset, length);\n}\n\n/**\n * Copy data to WASM memory\n */\nexport function copyToWasmMemory(\n memory: WebAssembly.Memory,\n data: ArrayBufferView,\n offset: number\n): void {\n const view = new Uint8Array(memory.buffer);\n const source = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n view.set(source, offset);\n}\n\n/**\n * Copy data from WASM memory\n */\nexport function copyFromWasmMemory(\n memory: WebAssembly.Memory,\n offset: number,\n length: number\n): Uint8Array {\n const view = new Uint8Array(memory.buffer, offset, length);\n return new Uint8Array(view); // Copy to detach from WASM memory\n}\n\n/**\n * Clear module caches\n */\nexport function clearWasmCache(): void {\n moduleCache.clear();\n instanceCache.clear();\n}\n\n/**\n * Get cache statistics\n */\nexport function getWasmCacheStats(): { modules: number; instances: number } {\n return {\n modules: moduleCache.size,\n instances: instanceCache.size,\n };\n}\n","/**\n * ComputeKit - Main Entry Point\n * WASM + Worker toolkit for React & Web apps\n */\n\nimport type {\n ComputeKitOptions,\n ComputeOptions,\n ComputeResult,\n PoolStats,\n ComputeKitEvents,\n} from './types';\n\nimport { WorkerPool } from './pool';\nimport { EventEmitter, isWasmSupported, createLogger } from './utils';\n\nconst logger = createLogger('ComputeKit');\n\n/**\n * ComputeKit - The main class for managing compute operations\n *\n * @example\n * ```ts\n * import { ComputeKit } from '@computekit/core';\n *\n * const kit = new ComputeKit();\n *\n * // Register a compute function\n * kit.register('fibonacci', (n: number) => {\n * if (n <= 1) return n;\n * let a = 0, b = 1;\n * for (let i = 2; i <= n; i++) {\n * [a, b] = [b, a + b];\n * }\n * return b;\n * });\n *\n * // Execute the function\n * const result = await kit.run('fibonacci', 50);\n * console.log(result); // 12586269025\n * ```\n */\nexport class ComputeKit extends EventEmitter<ComputeKitEvents> {\n private pool: WorkerPool;\n\n constructor(options: ComputeKitOptions = {}) {\n super();\n this.pool = new WorkerPool(options);\n logger.debug('ComputeKit initialized', options);\n }\n\n /**\n * Initialize ComputeKit\n * Called automatically on first run, but can be called manually for eager initialization\n */\n async initialize(): Promise<void> {\n await this.pool.initialize();\n }\n\n /**\n * Register a compute function\n *\n * @param name - Unique name for the function\n * @param fn - The function to execute (will run in a Web Worker)\n *\n * @example\n * ```ts\n * kit.register('sum', (arr: number[]) => arr.reduce((a, b) => a + b, 0));\n * ```\n */\n register<TInput, TOutput>(\n name: string,\n fn: (input: TInput) => TOutput | Promise<TOutput>\n ): this {\n this.pool.register(name, fn);\n return this;\n }\n\n /**\n * Execute a registered compute function\n *\n * @param name - Name of the registered function\n * @param input - Input data for the function\n * @param options - Execution options\n * @returns Promise resolving to the function result\n *\n * @example\n * ```ts\n * const sum = await kit.run('sum', [1, 2, 3, 4, 5]);\n * ```\n */\n async run<TInput, TOutput>(\n name: string,\n input: TInput,\n options?: ComputeOptions\n ): Promise<TOutput> {\n return this.pool.execute<TInput, TOutput>(name, input, options);\n }\n\n /**\n * Execute a registered compute function with full result metadata\n *\n * @param name - Name of the registered function\n * @param input - Input data for the function\n * @param options - Execution options\n * @returns Promise resolving to ComputeResult with metadata\n *\n * @example\n * ```ts\n * const result = await kit.runWithMetadata('sum', data);\n * console.log(`Took ${result.duration}ms`);\n * ```\n */\n async runWithMetadata<TInput, TOutput>(\n name: string,\n input: TInput,\n options?: ComputeOptions\n ): Promise<ComputeResult<TOutput>> {\n const startTime = performance.now();\n const data = await this.pool.execute<TInput, TOutput>(name, input, options);\n const duration = performance.now() - startTime;\n\n return {\n data,\n duration,\n cached: false,\n workerId: 'unknown', // Would need pool changes to track this\n };\n }\n\n /**\n * Get pool statistics\n */\n getStats(): PoolStats {\n return this.pool.getStats();\n }\n\n /**\n * Check if WebAssembly is supported\n */\n isWasmSupported(): boolean {\n return isWasmSupported();\n }\n\n /**\n * Terminate the worker pool and clean up resources\n */\n async terminate(): Promise<void> {\n await this.pool.terminate();\n this.removeAllListeners();\n }\n}\n\n/**\n * Create a pre-configured ComputeKit instance\n */\nexport function createComputeKit(options?: ComputeKitOptions): ComputeKit {\n return new ComputeKit(options);\n}\n\n/**\n * Default shared instance\n */\nlet defaultInstance: ComputeKit | null = null;\n\n/**\n * Get the default shared ComputeKit instance\n */\nexport function getDefaultInstance(): ComputeKit {\n if (!defaultInstance) {\n defaultInstance = new ComputeKit();\n }\n return defaultInstance;\n}\n\n/**\n * Register a function on the default instance\n */\nexport function register<TInput, TOutput>(\n name: string,\n fn: (input: TInput) => TOutput | Promise<TOutput>\n): void {\n getDefaultInstance().register(name, fn);\n}\n\n/**\n * Run a function on the default instance\n */\nexport async function run<TInput, TOutput>(\n name: string,\n input: TInput,\n options?: ComputeOptions\n): Promise<TOutput> {\n return getDefaultInstance().run<TInput, TOutput>(name, input, options);\n}\n\n// Re-export types\nexport type {\n ComputeKitOptions,\n ComputeOptions,\n ComputeProgress,\n ComputeResult,\n ComputeFunction,\n PoolStats,\n WorkerInfo,\n WasmModuleConfig,\n ComputeKitEvents,\n // Pipeline types\n StageStatus,\n StageInfo,\n StageConfig,\n PipelineMode,\n PipelineStatus,\n PipelineState,\n PipelineMetrics,\n PipelineOptions,\n PipelineEvents,\n // Parallel batch types\n ParallelBatchConfig,\n BatchItemResult,\n ParallelBatchResult,\n} from './types';\n\n// Re-export utilities\nexport {\n isWasmSupported,\n isSharedArrayBufferAvailable,\n getHardwareConcurrency,\n findTransferables,\n} from './utils';\n\n// Re-export WASM utilities\nexport {\n loadWasmModule,\n loadAndInstantiate,\n loadAssemblyScript,\n wrapWasmExports,\n getMemoryView,\n copyToWasmMemory,\n copyFromWasmMemory,\n clearWasmCache,\n getWasmCacheStats,\n} from './wasm';\n\n// Re-export pool\nexport { WorkerPool } from './pool';\n"]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/pool.ts","../src/wasm.ts","../src/index.ts"],"names":["module","logger"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * ComputeKit Utilities\n * Helper functions for the WASM + Worker toolkit\n */\n\n/**\n * Generate a unique ID\n */\nexport function generateId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * Check if running in a Web Worker context\n */\nexport function isWorkerContext(): boolean {\n return (\n typeof self !== 'undefined' &&\n typeof Window === 'undefined' &&\n typeof self.postMessage === 'function'\n );\n}\n\n/**\n * Check if running in a browser context\n */\nexport function isBrowserContext(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * Check if SharedArrayBuffer is available\n */\nexport function isSharedArrayBufferAvailable(): boolean {\n try {\n return typeof SharedArrayBuffer !== 'undefined';\n } catch {\n return false;\n }\n}\n\n/**\n * Check if WASM is supported\n */\nexport function isWasmSupported(): boolean {\n try {\n if (typeof WebAssembly === 'object') {\n const module = new WebAssembly.Module(\n Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00)\n );\n return module instanceof WebAssembly.Module;\n }\n } catch {\n // WASM not supported\n }\n return false;\n}\n\n/**\n * Get the number of logical processors\n */\nexport function getHardwareConcurrency(): number {\n if (typeof navigator !== 'undefined' && navigator.hardwareConcurrency) {\n return navigator.hardwareConcurrency;\n }\n return 4; // Reasonable default\n}\n\n/**\n * Create a deferred promise\n */\nexport interface Deferred<T> {\n promise: Promise<T>;\n resolve: (value: T | PromiseLike<T>) => void;\n reject: (reason?: unknown) => void;\n}\n\nexport function createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, resolve, reject };\n}\n\n/**\n * Create a timeout promise\n */\nexport function createTimeout(ms: number, message?: string): Promise<never> {\n return new Promise((_, reject) => {\n setTimeout(() => {\n reject(new Error(message || `Operation timed out after ${ms}ms`));\n }, ms);\n });\n}\n\n/**\n * Race a promise against a timeout\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n ms: number,\n message?: string\n): Promise<T> {\n return Promise.race([promise, createTimeout(ms, message)]);\n}\n\n/**\n * Detect transferable objects in data\n */\nexport function findTransferables(data: unknown): Transferable[] {\n const transferables: Transferable[] = [];\n const seen = new WeakSet();\n\n function traverse(obj: unknown): void {\n if (obj === null || typeof obj !== 'object') return;\n if (seen.has(obj as object)) return;\n seen.add(obj as object);\n\n if (obj instanceof ArrayBuffer) {\n transferables.push(obj);\n return;\n }\n\n if (ArrayBuffer.isView(obj)) {\n transferables.push(obj.buffer);\n return;\n }\n\n if (obj instanceof MessagePort) {\n transferables.push(obj);\n return;\n }\n\n if (typeof ImageBitmap !== 'undefined' && obj instanceof ImageBitmap) {\n transferables.push(obj);\n return;\n }\n\n if (typeof OffscreenCanvas !== 'undefined' && obj instanceof OffscreenCanvas) {\n transferables.push(obj);\n return;\n }\n\n if (Array.isArray(obj)) {\n obj.forEach(traverse);\n return;\n }\n\n if (obj instanceof Map) {\n obj.forEach((value, key) => {\n traverse(key);\n traverse(value);\n });\n return;\n }\n\n if (obj instanceof Set) {\n obj.forEach(traverse);\n return;\n }\n\n Object.values(obj).forEach(traverse);\n }\n\n traverse(data);\n return transferables;\n}\n\n/**\n * Clone data, detaching transferables\n */\nexport function cloneForTransfer<T>(data: T): { data: T; transfer: Transferable[] } {\n const transfer = findTransferables(data);\n return { data, transfer };\n}\n\n/**\n * Create a typed event emitter\n */\nexport type EventHandler<T = unknown> = (data: T) => void;\n\nexport class EventEmitter<TEvents extends Record<string, unknown>> {\n private handlers = new Map<keyof TEvents, Set<EventHandler>>();\n\n on<K extends keyof TEvents>(event: K, handler: EventHandler<TEvents[K]>): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => this.off(event, handler);\n }\n\n off<K extends keyof TEvents>(event: K, handler: EventHandler<TEvents[K]>): void {\n this.handlers.get(event)?.delete(handler as EventHandler);\n }\n\n emit<K extends keyof TEvents>(event: K, data: TEvents[K]): void {\n this.handlers.get(event)?.forEach((handler) => {\n try {\n handler(data);\n } catch (err) {\n console.error(`Error in event handler for ${String(event)}:`, err);\n }\n });\n }\n\n removeAllListeners(event?: keyof TEvents): void {\n if (event) {\n this.handlers.delete(event);\n } else {\n this.handlers.clear();\n }\n }\n}\n\n/**\n * Simple LRU cache\n */\nexport class LRUCache<K, V> {\n private cache = new Map<K, V>();\n private maxSize: number;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n }\n\n get(key: K): V | undefined {\n const value = this.cache.get(key);\n if (value !== undefined) {\n // Move to end (most recently used)\n this.cache.delete(key);\n this.cache.set(key, value);\n }\n return value;\n }\n\n set(key: K, value: V): void {\n if (this.cache.has(key)) {\n this.cache.delete(key);\n } else if (this.cache.size >= this.maxSize) {\n // Delete oldest (first) entry\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n this.cache.set(key, value);\n }\n\n has(key: K): boolean {\n return this.cache.has(key);\n }\n\n delete(key: K): boolean {\n return this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n get size(): number {\n return this.cache.size;\n }\n}\n\n/**\n * Serialize function to string for worker\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport function serializeFunction(fn: Function): string {\n return fn.toString();\n}\n\n/**\n * Estimate the byte size of a value for structured cloning.\n * This is an approximation useful for debugging and performance monitoring.\n */\nexport function estimatePayloadSize(value: unknown): number {\n if (value === null || value === undefined) return 0;\n if (typeof value === 'boolean') return 4;\n if (typeof value === 'number') return 8;\n if (typeof value === 'string') return value.length * 2; // UTF-16\n\n if (value instanceof ArrayBuffer) return value.byteLength;\n if (ArrayBuffer.isView(value)) return value.byteLength;\n if (value instanceof Blob) return value.size;\n\n const seen = new WeakSet<object>();\n\n function traverse(obj: unknown): number {\n if (obj === null || typeof obj !== 'object') {\n if (typeof obj === 'boolean') return 4;\n if (typeof obj === 'number') return 8;\n if (typeof obj === 'string') return (obj as string).length * 2;\n return 0;\n }\n\n if (seen.has(obj)) return 0; // Avoid infinite loops\n seen.add(obj);\n\n if (obj instanceof ArrayBuffer) return obj.byteLength;\n if (ArrayBuffer.isView(obj)) return obj.byteLength;\n if (obj instanceof Blob) return obj.size;\n if (obj instanceof Date) return 8;\n if (obj instanceof RegExp) return obj.source.length * 2;\n\n if (Array.isArray(obj)) {\n return obj.reduce((sum, item) => sum + traverse(item), 0);\n }\n\n if (obj instanceof Map) {\n let size = 0;\n obj.forEach((val, key) => {\n size += traverse(key) + traverse(val);\n });\n return size;\n }\n\n if (obj instanceof Set) {\n let size = 0;\n obj.forEach((val) => {\n size += traverse(val);\n });\n return size;\n }\n\n // Plain object\n return Object.entries(obj).reduce(\n (sum, [key, val]) => sum + key.length * 2 + traverse(val),\n 0\n );\n }\n\n return traverse(value);\n}\n\n/**\n * Format bytes to human-readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${(bytes / Math.pow(k, i)).toFixed(i > 0 ? 1 : 0)} ${sizes[i]}`;\n}\n\n/**\n * Logger utility\n */\nexport interface Logger {\n debug(...args: unknown[]): void;\n info(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n error(...args: unknown[]): void;\n}\n\nexport function createLogger(prefix: string, enabled: boolean = false): Logger {\n const noop = () => {};\n const log = (level: string) =>\n enabled ? (...args: unknown[]) => console.log(`[${prefix}:${level}]`, ...args) : noop;\n\n return {\n debug: log('debug'),\n info: log('info'),\n warn: enabled\n ? (...args: unknown[]) => console.warn(`[${prefix}:warn]`, ...args)\n : noop,\n error: (...args: unknown[]) => console.error(`[${prefix}:error]`, ...args),\n };\n}\n","/**\n * ComputeKit Worker Pool\n * Manages a pool of Web Workers for parallel computation\n */\n\nimport type {\n ComputeKitOptions,\n ComputeOptions,\n ComputeProgress,\n WorkerInfo,\n WorkerState,\n PoolStats,\n WorkerMessage,\n ExecutePayload,\n ResultPayload,\n ErrorPayload,\n ProgressPayload,\n} from './types';\n\nimport {\n generateId,\n createDeferred,\n withTimeout,\n findTransferables,\n getHardwareConcurrency,\n createLogger,\n estimatePayloadSize,\n formatBytes,\n type Deferred,\n type Logger,\n} from './utils';\n\n/** Task in the queue */\ninterface QueuedTask<T = unknown> {\n id: string;\n functionName: string;\n input: unknown;\n options?: ComputeOptions;\n deferred: Deferred<T>;\n priority: number;\n createdAt: number;\n onProgress?: (progress: ComputeProgress) => void;\n}\n\n/** Worker wrapper */\ninterface PoolWorker {\n id: string;\n worker: Worker;\n state: WorkerState;\n currentTask?: string;\n tasksCompleted: number;\n errors: number;\n createdAt: number;\n lastActiveAt: number;\n ready: boolean;\n readyPromise: Promise<void>;\n}\n\n/** Registry entry for compute functions */\ninterface RegisteredFunction {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n fn: Function;\n serialized: string;\n}\n\n/**\n * Worker Pool - manages Web Workers for parallel computation\n */\nexport class WorkerPool {\n private workers: Map<string, PoolWorker> = new Map();\n private taskQueue: QueuedTask[] = [];\n private pendingTasks: Map<string, QueuedTask> = new Map();\n private functions: Map<string, RegisteredFunction> = new Map();\n private workerUrl: string | null = null;\n private options: Required<ComputeKitOptions>;\n private logger: Logger;\n private initialized = false;\n private stats = {\n tasksCompleted: 0,\n tasksFailed: 0,\n totalDuration: 0,\n };\n\n constructor(options: ComputeKitOptions = {}) {\n this.options = {\n maxWorkers: options.maxWorkers ?? getHardwareConcurrency(),\n timeout: options.timeout ?? 30000,\n debug: options.debug ?? false,\n workerPath: options.workerPath ?? '',\n useSharedMemory: options.useSharedMemory ?? true,\n remoteDependencies: options.remoteDependencies ?? [],\n };\n\n this.logger = createLogger('ComputeKit:Pool', this.options.debug);\n this.logger.info('WorkerPool created with options:', this.options);\n }\n\n /**\n * Initialize the worker pool\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n this.logger.info('Initializing worker pool...');\n this.logger.info('Registered functions:', Array.from(this.functions.keys()));\n this.workerUrl = this.createWorkerBlob();\n\n // Create initial workers\n const workerCount = Math.min(2, this.options.maxWorkers);\n for (let i = 0; i < workerCount; i++) {\n await this.createWorker();\n }\n\n this.initialized = true;\n this.logger.info(`Worker pool initialized with ${workerCount} workers`);\n }\n\n private pendingRecreate: Promise<void> | null = null;\n\n /**\n * Register a compute function\n */\n register<TInput, TOutput>(\n name: string,\n fn: (input: TInput) => TOutput | Promise<TOutput>\n ): void {\n this.logger.debug(`Registering function: ${name}`);\n this.functions.set(name, {\n fn,\n serialized: fn.toString(),\n });\n\n // If already initialized, we need to recreate workers with updated functions\n if (this.initialized) {\n this.pendingRecreate = this.recreateWorkers();\n } else {\n // If not initialized yet but workerUrl exists, revoke it so it gets recreated\n if (this.workerUrl) {\n URL.revokeObjectURL(this.workerUrl);\n this.workerUrl = null;\n }\n }\n }\n\n /**\n * Recreate workers with updated function registry\n */\n private async recreateWorkers(): Promise<void> {\n this.logger.debug('Recreating workers with updated functions...');\n\n // Revoke old blob URL\n if (this.workerUrl) {\n URL.revokeObjectURL(this.workerUrl);\n }\n\n // Create new worker blob with all functions\n this.workerUrl = this.createWorkerBlob();\n\n // Terminate existing idle workers and create new ones\n const idleWorkers = Array.from(this.workers.entries()).filter(\n ([_, w]) => w.state === 'idle'\n );\n\n for (const [id, poolWorker] of idleWorkers) {\n poolWorker.worker.terminate();\n this.workers.delete(id);\n }\n\n // Create new workers\n const workerCount = Math.max(\n 1,\n Math.min(2, this.options.maxWorkers) - this.workers.size\n );\n for (let i = 0; i < workerCount; i++) {\n await this.createWorker();\n }\n }\n\n /**\n * Execute a compute function\n */\n async execute<TInput, TOutput>(\n name: string,\n input: TInput,\n options?: ComputeOptions\n ): Promise<TOutput> {\n // Wait for any pending worker recreation\n if (this.pendingRecreate) {\n await this.pendingRecreate;\n this.pendingRecreate = null;\n }\n\n if (!this.initialized) {\n await this.initialize();\n }\n\n const fn = this.functions.get(name);\n if (!fn) {\n throw new Error(`Function \"${name}\" not registered`);\n }\n\n const taskId = generateId();\n const timeout = options?.timeout ?? this.options.timeout;\n\n this.logger.debug(`Executing task ${taskId} for function \"${name}\"`);\n\n // Check for abort signal\n if (options?.signal?.aborted) {\n throw new Error('Operation aborted');\n }\n\n const deferred = createDeferred<TOutput>();\n const task: QueuedTask<TOutput> = {\n id: taskId,\n functionName: name,\n input,\n options,\n deferred,\n priority: options?.priority ?? 5,\n createdAt: Date.now(),\n onProgress: options?.onProgress,\n };\n\n // Handle abort signal\n if (options?.signal) {\n options.signal.addEventListener('abort', () => {\n this.cancelTask(taskId);\n deferred.reject(new Error('Operation aborted'));\n });\n }\n\n // Add to queue\n this.enqueue(task);\n this.processQueue();\n\n return withTimeout(deferred.promise, timeout, `Task \"${name}\" timed out`);\n }\n\n /**\n * Get pool statistics\n */\n getStats(): PoolStats {\n const workers = Array.from(this.workers.values()).map(\n (w): WorkerInfo => ({\n id: w.id,\n state: w.state,\n currentTask: w.currentTask,\n tasksCompleted: w.tasksCompleted,\n errors: w.errors,\n createdAt: w.createdAt,\n lastActiveAt: w.lastActiveAt,\n })\n );\n\n return {\n workers,\n totalWorkers: this.workers.size,\n activeWorkers: workers.filter((w) => w.state === 'busy').length,\n idleWorkers: workers.filter((w) => w.state === 'idle').length,\n queueLength: this.taskQueue.length,\n tasksCompleted: this.stats.tasksCompleted,\n tasksFailed: this.stats.tasksFailed,\n averageTaskDuration:\n this.stats.tasksCompleted > 0\n ? this.stats.totalDuration / this.stats.tasksCompleted\n : 0,\n };\n }\n\n /**\n * Terminate all workers and clean up\n */\n async terminate(): Promise<void> {\n this.logger.info('Terminating worker pool...');\n\n // Reject all pending tasks\n for (const task of this.pendingTasks.values()) {\n task.deferred.reject(new Error('Worker pool terminated'));\n }\n this.pendingTasks.clear();\n this.taskQueue = [];\n\n // Terminate all workers\n for (const poolWorker of this.workers.values()) {\n poolWorker.worker.terminate();\n poolWorker.state = 'terminated';\n }\n this.workers.clear();\n\n // Revoke blob URL\n if (this.workerUrl) {\n URL.revokeObjectURL(this.workerUrl);\n this.workerUrl = null;\n }\n\n this.initialized = false;\n this.logger.info('Worker pool terminated');\n }\n\n /**\n * Create the worker blob URL\n */\n private createWorkerBlob(): string {\n // Serialize all registered functions\n const functionsCode = Array.from(this.functions.entries())\n .map(([name, { serialized }]) => `\"${name}\": ${serialized}`)\n .join(',\\n');\n\n this.logger.debug(\n 'Creating worker blob with functions:',\n Array.from(this.functions.keys())\n );\n\n // Generate importScripts for remote dependencies\n const remoteDeps = this.options.remoteDependencies;\n const importScriptsCode =\n remoteDeps.length > 0\n ? `importScripts(${remoteDeps.map((url) => `\"${url}\"`).join(', ')});`\n : '';\n\n const workerCode = `\n${importScriptsCode}\n\nconst functions = {\n${functionsCode}\n};\n\nself.onmessage = function(e) {\n const msg = e.data;\n if (msg.type === 'execute') {\n const fn = functions[msg.payload.functionName];\n if (!fn) {\n self.postMessage({ id: msg.id, type: 'error', payload: { message: 'Function not found: ' + msg.payload.functionName } });\n return;\n }\n try {\n const start = performance.now();\n Promise.resolve(fn(msg.payload.input)).then(function(result) {\n self.postMessage({ id: msg.id, type: 'result', payload: { data: result, duration: performance.now() - start } });\n }).catch(function(err) {\n self.postMessage({ id: msg.id, type: 'error', payload: { message: err.message || String(err) } });\n });\n } catch (err) {\n self.postMessage({ id: msg.id, type: 'error', payload: { message: err.message || String(err) } });\n }\n }\n};\nself.postMessage({ type: 'ready' });\n`;\n\n const blob = new Blob([workerCode], { type: 'application/javascript' });\n return URL.createObjectURL(blob);\n }\n\n /**\n * Create a new worker\n */\n private async createWorker(): Promise<PoolWorker> {\n if (!this.workerUrl) {\n this.workerUrl = this.createWorkerBlob();\n }\n\n const id = generateId();\n const worker = new Worker(this.workerUrl);\n\n // Create ready promise\n let resolveReady: () => void;\n const readyPromise = new Promise<void>((resolve) => {\n resolveReady = resolve;\n });\n\n const poolWorker: PoolWorker = {\n id,\n worker,\n state: 'idle',\n tasksCompleted: 0,\n errors: 0,\n createdAt: Date.now(),\n lastActiveAt: Date.now(),\n ready: false,\n readyPromise,\n };\n\n // Set up message handler\n worker.onmessage = (e: MessageEvent<WorkerMessage>) => {\n if (e.data.type === 'ready') {\n poolWorker.ready = true;\n resolveReady!();\n }\n this.handleWorkerMessage(poolWorker, e.data);\n };\n\n worker.onerror = (e: ErrorEvent) => {\n this.handleWorkerError(poolWorker, e);\n };\n\n this.workers.set(id, poolWorker);\n this.logger.debug(`Created worker ${id}`);\n\n // Wait for worker to be ready\n await readyPromise;\n this.logger.debug(`Worker ${id} is ready`);\n\n return poolWorker;\n }\n\n /**\n * Handle messages from workers\n */\n private handleWorkerMessage(poolWorker: PoolWorker, message: WorkerMessage): void {\n this.logger.debug('Received message from worker:', message);\n const { id, type, payload } = message;\n\n switch (type) {\n case 'ready':\n this.logger.debug(`Worker ${poolWorker.id} ready`);\n break;\n\n case 'result': {\n const task = this.pendingTasks.get(id);\n if (task) {\n const resultPayload = payload as ResultPayload;\n this.pendingTasks.delete(id);\n poolWorker.state = 'idle';\n poolWorker.currentTask = undefined;\n poolWorker.tasksCompleted++;\n poolWorker.lastActiveAt = Date.now();\n\n this.stats.tasksCompleted++;\n this.stats.totalDuration += resultPayload.duration;\n\n // Log with payload sizes in debug mode\n const inputSize = estimatePayloadSize(task.input);\n const outputSize = resultPayload.outputSize ?? 0;\n this.logger.debug(\n `Task ${id} (${task.functionName}): ` +\n `input=${formatBytes(inputSize)}, ` +\n `output=${formatBytes(outputSize)}, ` +\n `duration=${resultPayload.duration.toFixed(2)}ms`\n );\n task.deferred.resolve(resultPayload.data);\n\n // Process next task\n this.processQueue();\n }\n break;\n }\n\n case 'error': {\n const task = this.pendingTasks.get(id);\n if (task) {\n const errorPayload = payload as ErrorPayload;\n this.pendingTasks.delete(id);\n poolWorker.state = 'idle';\n poolWorker.currentTask = undefined;\n poolWorker.errors++;\n poolWorker.lastActiveAt = Date.now();\n\n this.stats.tasksFailed++;\n\n const error = new Error(errorPayload.message);\n if (errorPayload.stack) {\n error.stack = errorPayload.stack;\n }\n\n this.logger.error(`Task ${id} failed:`, errorPayload.message);\n task.deferred.reject(error);\n\n // Process next task\n this.processQueue();\n }\n break;\n }\n\n case 'progress': {\n const progressPayload = payload as ProgressPayload;\n const task = this.pendingTasks.get(progressPayload.taskId);\n if (task?.onProgress) {\n task.onProgress(progressPayload.progress);\n }\n break;\n }\n }\n }\n\n /**\n * Handle worker errors\n */\n private handleWorkerError(poolWorker: PoolWorker, error: ErrorEvent): void {\n this.logger.error(`Worker ${poolWorker.id} error:`, error.message);\n poolWorker.state = 'error';\n poolWorker.errors++;\n\n // Reject current task if any\n if (poolWorker.currentTask) {\n const task = this.pendingTasks.get(poolWorker.currentTask);\n if (task) {\n this.pendingTasks.delete(poolWorker.currentTask);\n task.deferred.reject(new Error(`Worker error: ${error.message}`));\n }\n }\n\n // Terminate and recreate the worker\n poolWorker.worker.terminate();\n this.workers.delete(poolWorker.id);\n\n // Create a new worker to replace it\n this.createWorker().then(() => this.processQueue());\n }\n\n /**\n * Add task to queue (priority-based)\n */\n private enqueue<T>(task: QueuedTask<T>): void {\n // Insert based on priority (higher priority first)\n let inserted = false;\n for (let i = 0; i < this.taskQueue.length; i++) {\n if (task.priority > this.taskQueue[i].priority) {\n this.taskQueue.splice(i, 0, task as QueuedTask);\n inserted = true;\n break;\n }\n }\n if (!inserted) {\n this.taskQueue.push(task as QueuedTask);\n }\n }\n\n /**\n * Process queued tasks\n */\n private async processQueue(): Promise<void> {\n if (this.taskQueue.length === 0) return;\n\n // Find an idle worker\n let idleWorker: PoolWorker | undefined;\n for (const worker of this.workers.values()) {\n if (worker.state === 'idle') {\n idleWorker = worker;\n break;\n }\n }\n\n // Create new worker if needed and under limit\n if (!idleWorker && this.workers.size < this.options.maxWorkers) {\n idleWorker = await this.createWorker();\n }\n\n if (!idleWorker) return;\n\n // Get next task\n const task = this.taskQueue.shift();\n if (!task) return;\n\n // Execute task\n this.executeOnWorker(idleWorker, task);\n\n // Continue processing if more tasks\n if (this.taskQueue.length > 0) {\n this.processQueue();\n }\n }\n\n /**\n * Execute task on a specific worker\n */\n private executeOnWorker(poolWorker: PoolWorker, task: QueuedTask): void {\n this.logger.debug(\n `executeOnWorker: Starting task ${task.id} (${task.functionName}) on worker ${poolWorker.id}`\n );\n poolWorker.state = 'busy';\n poolWorker.currentTask = task.id;\n poolWorker.lastActiveAt = Date.now();\n\n this.pendingTasks.set(task.id, task);\n\n const message: WorkerMessage<ExecutePayload> = {\n id: task.id,\n type: 'execute',\n payload: {\n functionName: task.functionName,\n input: task.input,\n // Don't send options - they may contain non-cloneable objects like AbortSignal\n },\n timestamp: Date.now(),\n };\n\n // Find transferables in input\n const transfer = findTransferables(task.input);\n\n this.logger.debug(`Posting message to worker:`, message);\n poolWorker.worker.postMessage(message, transfer);\n this.logger.debug(`Message posted to worker ${poolWorker.id}`);\n }\n\n /**\n * Cancel a pending task\n */\n private cancelTask(taskId: string): void {\n // Remove from queue\n const queueIndex = this.taskQueue.findIndex((t) => t.id === taskId);\n if (queueIndex !== -1) {\n this.taskQueue.splice(queueIndex, 1);\n }\n\n // Remove from pending (worker will complete but result ignored)\n this.pendingTasks.delete(taskId);\n }\n}\n","/**\n * ComputeKit WASM Loader\n * Utilities for loading and managing WebAssembly modules\n */\n\nimport type { WasmModuleConfig } from './types';\nimport { createLogger, LRUCache } from './utils';\n\nconst logger = createLogger('ComputeKit:WASM');\n\n/** Cached WASM modules */\nconst moduleCache = new LRUCache<string, WebAssembly.Module>(10);\n\n/** Cached WASM instances */\nconst instanceCache = new LRUCache<string, WebAssembly.Instance>(10);\n\n/**\n * Load a WASM module from various sources\n */\nexport async function loadWasmModule(\n source: string | ArrayBuffer | Uint8Array\n): Promise<WebAssembly.Module> {\n // Check cache for string sources\n if (typeof source === 'string') {\n const cached = moduleCache.get(source);\n if (cached) {\n logger.debug('Using cached WASM module:', source);\n return cached;\n }\n }\n\n let bytes: ArrayBuffer | Uint8Array;\n\n if (typeof source === 'string') {\n if (source.startsWith('data:')) {\n // Base64 encoded WASM\n const base64 = source.split(',')[1];\n bytes = Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));\n } else {\n // URL to WASM file\n logger.debug('Fetching WASM from:', source);\n const response = await fetch(source);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch WASM: ${response.statusText}`);\n }\n\n // Use streaming compilation if available\n if (WebAssembly.compileStreaming) {\n const module = await WebAssembly.compileStreaming(response);\n moduleCache.set(source, module);\n return module;\n }\n\n bytes = await response.arrayBuffer();\n }\n } else {\n bytes = source;\n }\n\n // Compile the module\n const module = await WebAssembly.compile(bytes as BufferSource);\n\n if (typeof source === 'string') {\n moduleCache.set(source, module);\n }\n\n return module;\n}\n\n/**\n * Instantiate a WASM module with imports\n */\nexport async function instantiateWasm(\n module: WebAssembly.Module,\n imports: WebAssembly.Imports = {}\n): Promise<WebAssembly.Instance> {\n return WebAssembly.instantiate(module, imports);\n}\n\n/**\n * Load and instantiate a WASM module in one step\n */\nexport async function loadAndInstantiate(\n config: WasmModuleConfig\n): Promise<{ module: WebAssembly.Module; instance: WebAssembly.Instance }> {\n const { source, imports = {}, memory } = config;\n\n // Create memory if specified\n const wasmImports: WebAssembly.Imports = { ...imports };\n if (memory) {\n wasmImports.env = {\n ...wasmImports.env,\n memory: new WebAssembly.Memory({\n initial: memory.initial,\n maximum: memory.maximum,\n shared: memory.shared,\n }),\n };\n }\n\n const module = await loadWasmModule(source);\n const instance = await instantiateWasm(module, wasmImports);\n\n return { module, instance };\n}\n\n/**\n * Create a WASM module from AssemblyScript-compiled bytes\n */\nexport async function loadAssemblyScript(\n source: string | ArrayBuffer,\n imports: WebAssembly.Imports = {}\n): Promise<{\n module: WebAssembly.Module;\n instance: WebAssembly.Instance;\n exports: Record<string, unknown>;\n}> {\n // Default AssemblyScript imports\n const defaultImports: WebAssembly.Imports = {\n env: {\n abort: (_message: number, fileName: number, line: number, column: number) => {\n console.error(`AssemblyScript abort at ${fileName}:${line}:${column}`);\n },\n seed: () => Date.now(),\n ...((imports.env as object) || {}),\n },\n ...imports,\n };\n\n const { module, instance } = await loadAndInstantiate({\n source,\n imports: defaultImports,\n });\n\n return {\n module,\n instance,\n exports: instance.exports as Record<string, unknown>,\n };\n}\n\n/**\n * Helper to wrap WASM exports for easier use\n */\nexport function wrapWasmExports<T extends Record<string, unknown>>(\n instance: WebAssembly.Instance\n): T {\n return instance.exports as T;\n}\n\n/**\n * Create a typed array view into WASM memory\n */\nexport function getMemoryView<T extends ArrayBufferView>(\n memory: WebAssembly.Memory,\n ArrayType: new (buffer: ArrayBuffer, byteOffset?: number, length?: number) => T,\n offset: number = 0,\n length?: number\n): T {\n return new ArrayType(memory.buffer, offset, length);\n}\n\n/**\n * Copy data to WASM memory\n */\nexport function copyToWasmMemory(\n memory: WebAssembly.Memory,\n data: ArrayBufferView,\n offset: number\n): void {\n const view = new Uint8Array(memory.buffer);\n const source = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n view.set(source, offset);\n}\n\n/**\n * Copy data from WASM memory\n */\nexport function copyFromWasmMemory(\n memory: WebAssembly.Memory,\n offset: number,\n length: number\n): Uint8Array {\n const view = new Uint8Array(memory.buffer, offset, length);\n return new Uint8Array(view); // Copy to detach from WASM memory\n}\n\n/**\n * Clear module caches\n */\nexport function clearWasmCache(): void {\n moduleCache.clear();\n instanceCache.clear();\n}\n\n/**\n * Get cache statistics\n */\nexport function getWasmCacheStats(): { modules: number; instances: number } {\n return {\n modules: moduleCache.size,\n instances: instanceCache.size,\n };\n}\n","/**\n * ComputeKit - Main Entry Point\n * WASM + Worker toolkit for React & Web apps\n */\n\nimport type {\n ComputeKitOptions,\n ComputeOptions,\n ComputeResult,\n PoolStats,\n ComputeKitEvents,\n} from './types';\n\nimport type {\n ComputeFunctionRegistry,\n RegisteredFunctionName,\n FunctionInput,\n FunctionOutput,\n ComputeFn,\n} from './registry';\n\nimport { WorkerPool } from './pool';\nimport { EventEmitter, isWasmSupported, createLogger } from './utils';\n\nconst logger = createLogger('ComputeKit');\n\n/**\n * ComputeKit - The main class for managing compute operations\n *\n * @example\n * ```ts\n * import { ComputeKit } from '@computekit/core';\n *\n * const kit = new ComputeKit();\n *\n * // Register a compute function\n * kit.register('fibonacci', (n: number) => {\n * if (n <= 1) return n;\n * let a = 0, b = 1;\n * for (let i = 2; i <= n; i++) {\n * [a, b] = [b, a + b];\n * }\n * return b;\n * });\n *\n * // Execute the function\n * const result = await kit.run('fibonacci', 50);\n * console.log(result); // 12586269025\n * ```\n */\nexport class ComputeKit extends EventEmitter<ComputeKitEvents> {\n private pool: WorkerPool;\n\n constructor(options: ComputeKitOptions = {}) {\n super();\n this.pool = new WorkerPool(options);\n logger.debug('ComputeKit initialized', options);\n }\n\n /**\n * Initialize ComputeKit\n * Called automatically on first run, but can be called manually for eager initialization\n */\n async initialize(): Promise<void> {\n await this.pool.initialize();\n }\n\n /**\n * Register a compute function\n *\n * @param name - Unique name for the function (autocompletes if registry is extended)\n * @param fn - The function to execute (will run in a Web Worker)\n *\n * @example\n * ```ts\n * // Basic usage\n * kit.register('sum', (arr: number[]) => arr.reduce((a, b) => a + b, 0));\n *\n * // With typed registry (extend ComputeFunctionRegistry for autocomplete)\n * // declare module '@computekit/core' {\n * // interface ComputeFunctionRegistry {\n * // sum: { input: number[]; output: number };\n * // }\n * // }\n * // kit.register('sum', (arr) => arr.reduce((a, b) => a + b, 0));\n * ```\n */\n register<\n TName extends RegisteredFunctionName,\n TInput = FunctionInput<TName extends string ? TName : never>,\n TOutput = FunctionOutput<TName extends string ? TName : never>,\n >(\n name: TName,\n fn: TName extends keyof ComputeFunctionRegistry\n ? ComputeFn<\n ComputeFunctionRegistry[TName]['input'],\n ComputeFunctionRegistry[TName]['output']\n >\n : ComputeFn<TInput, TOutput>\n ): this {\n this.pool.register(name as string, fn as ComputeFn<unknown, unknown>);\n return this;\n }\n\n /**\n * Execute a registered compute function\n *\n * @param name - Name of the registered function (autocompletes if registry is extended)\n * @param input - Input data for the function (type-safe if registry is extended)\n * @param options - Execution options\n * @returns Promise resolving to the function result (type-safe if registry is extended)\n *\n * @example\n * ```ts\n * const sum = await kit.run('sum', [1, 2, 3, 4, 5]);\n *\n * // With typed registry, input/output types are inferred:\n * // const result = await kit.run('fibonacci', 50); // result: number\n * ```\n */\n async run<\n TName extends RegisteredFunctionName,\n TInput = FunctionInput<TName extends string ? TName : never>,\n TOutput = FunctionOutput<TName extends string ? TName : never>,\n >(\n name: TName,\n input: TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['input']\n : TInput,\n options?: ComputeOptions\n ): Promise<\n TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['output']\n : TOutput\n > {\n return this.pool.execute(name as string, input, options);\n }\n\n /**\n * Execute a registered compute function with full result metadata\n *\n * @param name - Name of the registered function (autocompletes if registry is extended)\n * @param input - Input data for the function (type-safe if registry is extended)\n * @param options - Execution options\n * @returns Promise resolving to ComputeResult with metadata\n *\n * @example\n * ```ts\n * const result = await kit.runWithMetadata('sum', data);\n * console.log(`Took ${result.duration}ms`);\n * ```\n */\n async runWithMetadata<\n TName extends RegisteredFunctionName,\n TInput = FunctionInput<TName extends string ? TName : never>,\n TOutput = FunctionOutput<TName extends string ? TName : never>,\n >(\n name: TName,\n input: TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['input']\n : TInput,\n options?: ComputeOptions\n ): Promise<\n ComputeResult<\n TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['output']\n : TOutput\n >\n > {\n type ActualOutput = TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['output']\n : TOutput;\n\n const startTime = performance.now();\n const data = (await this.pool.execute(\n name as string,\n input,\n options\n )) as ActualOutput;\n const duration = performance.now() - startTime;\n\n return {\n data,\n duration,\n cached: false,\n workerId: 'unknown', // Would need pool changes to track this\n };\n }\n\n /**\n * Get pool statistics\n */\n getStats(): PoolStats {\n return this.pool.getStats();\n }\n\n /**\n * Check if WebAssembly is supported\n */\n isWasmSupported(): boolean {\n return isWasmSupported();\n }\n\n /**\n * Terminate the worker pool and clean up resources\n */\n async terminate(): Promise<void> {\n await this.pool.terminate();\n this.removeAllListeners();\n }\n}\n\n/**\n * Create a pre-configured ComputeKit instance\n */\nexport function createComputeKit(options?: ComputeKitOptions): ComputeKit {\n return new ComputeKit(options);\n}\n\n/**\n * Default shared instance\n */\nlet defaultInstance: ComputeKit | null = null;\n\n/**\n * Get the default shared ComputeKit instance\n */\nexport function getDefaultInstance(): ComputeKit {\n if (!defaultInstance) {\n defaultInstance = new ComputeKit();\n }\n return defaultInstance;\n}\n\n/**\n * Register a function on the default instance\n *\n * @example\n * ```ts\n * import { register } from '@computekit/core';\n *\n * register('fibonacci', (n: number) => {\n * if (n <= 1) return n;\n * let a = 0, b = 1;\n * for (let i = 2; i <= n; i++) {\n * [a, b] = [b, a + b];\n * }\n * return b;\n * });\n * ```\n */\nexport function register<\n TName extends RegisteredFunctionName,\n TInput = FunctionInput<TName extends string ? TName : never>,\n TOutput = FunctionOutput<TName extends string ? TName : never>,\n>(\n name: TName,\n fn: TName extends keyof ComputeFunctionRegistry\n ? ComputeFn<\n ComputeFunctionRegistry[TName]['input'],\n ComputeFunctionRegistry[TName]['output']\n >\n : ComputeFn<TInput, TOutput>\n): void {\n getDefaultInstance().register(name, fn);\n}\n\n/**\n * Run a function on the default instance\n *\n * @example\n * ```ts\n * import { run } from '@computekit/core';\n *\n * const result = await run('fibonacci', 50);\n * console.log(result); // Type is inferred if registry is extended\n * ```\n */\nexport async function run<\n TName extends RegisteredFunctionName,\n TInput = FunctionInput<TName extends string ? TName : never>,\n TOutput = FunctionOutput<TName extends string ? TName : never>,\n>(\n name: TName,\n input: TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['input']\n : TInput,\n options?: ComputeOptions\n): Promise<\n TName extends keyof ComputeFunctionRegistry\n ? ComputeFunctionRegistry[TName]['output']\n : TOutput\n> {\n return getDefaultInstance().run(name, input, options);\n}\n\n// Re-export types\nexport type {\n ComputeKitOptions,\n ComputeOptions,\n ComputeProgress,\n ComputeResult,\n ComputeFunction,\n PoolStats,\n WorkerInfo,\n WasmModuleConfig,\n ComputeKitEvents,\n // Pipeline types\n StageStatus,\n StageInfo,\n StageConfig,\n PipelineMode,\n PipelineStatus,\n PipelineState,\n PipelineMetrics,\n PipelineOptions,\n PipelineEvents,\n // Parallel batch types\n ParallelBatchConfig,\n BatchItemResult,\n ParallelBatchResult,\n} from './types';\n\n// Re-export typed registry types\nexport type {\n ComputeFunctionRegistry,\n RegisteredFunctionName,\n FunctionInput,\n FunctionOutput,\n ComputeFn,\n InferComputeFn,\n DefineFunction,\n HasRegisteredFunctions,\n} from './registry';\n\n// Re-export utilities\nexport {\n isWasmSupported,\n isSharedArrayBufferAvailable,\n getHardwareConcurrency,\n findTransferables,\n} from './utils';\n\n// Re-export WASM utilities\nexport {\n loadWasmModule,\n loadAndInstantiate,\n loadAssemblyScript,\n wrapWasmExports,\n getMemoryView,\n copyToWasmMemory,\n copyFromWasmMemory,\n clearWasmCache,\n getWasmCacheStats,\n} from './wasm';\n\n// Re-export pool\nexport { WorkerPool } from './pool';\n"]}
package/dist/index.d.cts CHANGED
@@ -1,6 +1,96 @@
1
1
  import { W as WasmModuleConfig, C as ComputeKitOptions, a as ComputeOptions, P as PoolStats, b as ComputeKitEvents, c as ComputeResult } from './types-BNUPDwV-.cjs';
2
2
  export { B as BatchItemResult, e as ComputeFunction, d as ComputeProgress, o as ParallelBatchConfig, p as ParallelBatchResult, n as PipelineEvents, l as PipelineMetrics, i as PipelineMode, m as PipelineOptions, k as PipelineState, j as PipelineStatus, h as StageConfig, g as StageInfo, S as StageStatus, f as WorkerInfo } from './types-BNUPDwV-.cjs';
3
3
 
4
+ /**
5
+ * ComputeKit Typed Registry
6
+ *
7
+ * This module provides type-safe function registration and execution.
8
+ * Users can extend the ComputeFunctionRegistry interface to get autocomplete
9
+ * and type safety for their registered functions.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * // Extend the registry interface (in a .d.ts file or at the top of your file)
14
+ * declare module '@computekit/core' {
15
+ * interface ComputeFunctionRegistry {
16
+ * fibonacci: { input: number; output: number };
17
+ * sum: { input: number[]; output: number };
18
+ * processData: { input: { items: string[] }; output: { count: number } };
19
+ * }
20
+ * }
21
+ *
22
+ * // Now you get autocomplete and type safety!
23
+ * const kit = new ComputeKit();
24
+ * kit.register('fibonacci', (n) => ...); // n is inferred as number
25
+ * const result = await kit.run('fibonacci', 42); // result is number
26
+ * ```
27
+ */
28
+ /**
29
+ * Registry interface for compute functions.
30
+ * Extend this interface using module augmentation to add your own functions.
31
+ *
32
+ * Each entry should be in the format:
33
+ * ```ts
34
+ * functionName: { input: InputType; output: OutputType }
35
+ * ```
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * declare module '@computekit/core' {
40
+ * interface ComputeFunctionRegistry {
41
+ * myFunction: { input: string; output: number };
42
+ * }
43
+ * }
44
+ * ```
45
+ */
46
+ interface ComputeFunctionRegistry {
47
+ }
48
+ /**
49
+ * Helper type to get all registered function names.
50
+ * If no functions are registered, falls back to string.
51
+ */
52
+ type RegisteredFunctionName = keyof ComputeFunctionRegistry extends never ? string : keyof ComputeFunctionRegistry;
53
+ /**
54
+ * Helper type to check if the registry has any entries.
55
+ */
56
+ type HasRegisteredFunctions = keyof ComputeFunctionRegistry extends never ? false : true;
57
+ /**
58
+ * Get the input type for a registered function.
59
+ * Falls back to TFallback if the function is not registered.
60
+ */
61
+ type FunctionInput<TName extends string, TFallback = unknown> = TName extends keyof ComputeFunctionRegistry ? ComputeFunctionRegistry[TName]['input'] : TFallback;
62
+ /**
63
+ * Get the output type for a registered function.
64
+ * Falls back to TFallback if the function is not registered.
65
+ */
66
+ type FunctionOutput<TName extends string, TFallback = unknown> = TName extends keyof ComputeFunctionRegistry ? ComputeFunctionRegistry[TName]['output'] : TFallback;
67
+ /**
68
+ * Type for a compute function based on registry or explicit types.
69
+ */
70
+ type ComputeFn<TInput, TOutput> = (input: TInput) => TOutput | Promise<TOutput>;
71
+ /**
72
+ * Infer the compute function type for a registered function name.
73
+ */
74
+ type InferComputeFn<TName extends string> = TName extends keyof ComputeFunctionRegistry ? ComputeFn<ComputeFunctionRegistry[TName]['input'], ComputeFunctionRegistry[TName]['output']> : ComputeFn<unknown, unknown>;
75
+ /**
76
+ * Type helper for creating registry entries.
77
+ * Use this to define your function types more easily.
78
+ *
79
+ * @example
80
+ * ```ts
81
+ * declare module '@computekit/core' {
82
+ * interface ComputeFunctionRegistry {
83
+ * fibonacci: DefineFunction<number, number>;
84
+ * sum: DefineFunction<number[], number>;
85
+ * }
86
+ * }
87
+ * ```
88
+ */
89
+ type DefineFunction<TInput, TOutput> = {
90
+ input: TInput;
91
+ output: TOutput;
92
+ };
93
+
4
94
  /**
5
95
  * Check if SharedArrayBuffer is available
6
96
  */
@@ -199,34 +289,46 @@ declare class ComputeKit extends EventEmitter<ComputeKitEvents> {
199
289
  /**
200
290
  * Register a compute function
201
291
  *
202
- * @param name - Unique name for the function
292
+ * @param name - Unique name for the function (autocompletes if registry is extended)
203
293
  * @param fn - The function to execute (will run in a Web Worker)
204
294
  *
205
295
  * @example
206
296
  * ```ts
297
+ * // Basic usage
207
298
  * kit.register('sum', (arr: number[]) => arr.reduce((a, b) => a + b, 0));
299
+ *
300
+ * // With typed registry (extend ComputeFunctionRegistry for autocomplete)
301
+ * // declare module '@computekit/core' {
302
+ * // interface ComputeFunctionRegistry {
303
+ * // sum: { input: number[]; output: number };
304
+ * // }
305
+ * // }
306
+ * // kit.register('sum', (arr) => arr.reduce((a, b) => a + b, 0));
208
307
  * ```
209
308
  */
210
- register<TInput, TOutput>(name: string, fn: (input: TInput) => TOutput | Promise<TOutput>): this;
309
+ register<TName extends RegisteredFunctionName, TInput = FunctionInput<TName extends string ? TName : never>, TOutput = FunctionOutput<TName extends string ? TName : never>>(name: TName, fn: TName extends keyof ComputeFunctionRegistry ? ComputeFn<ComputeFunctionRegistry[TName]['input'], ComputeFunctionRegistry[TName]['output']> : ComputeFn<TInput, TOutput>): this;
211
310
  /**
212
311
  * Execute a registered compute function
213
312
  *
214
- * @param name - Name of the registered function
215
- * @param input - Input data for the function
313
+ * @param name - Name of the registered function (autocompletes if registry is extended)
314
+ * @param input - Input data for the function (type-safe if registry is extended)
216
315
  * @param options - Execution options
217
- * @returns Promise resolving to the function result
316
+ * @returns Promise resolving to the function result (type-safe if registry is extended)
218
317
  *
219
318
  * @example
220
319
  * ```ts
221
320
  * const sum = await kit.run('sum', [1, 2, 3, 4, 5]);
321
+ *
322
+ * // With typed registry, input/output types are inferred:
323
+ * // const result = await kit.run('fibonacci', 50); // result: number
222
324
  * ```
223
325
  */
224
- run<TInput, TOutput>(name: string, input: TInput, options?: ComputeOptions): Promise<TOutput>;
326
+ run<TName extends RegisteredFunctionName, TInput = FunctionInput<TName extends string ? TName : never>, TOutput = FunctionOutput<TName extends string ? TName : never>>(name: TName, input: TName extends keyof ComputeFunctionRegistry ? ComputeFunctionRegistry[TName]['input'] : TInput, options?: ComputeOptions): Promise<TName extends keyof ComputeFunctionRegistry ? ComputeFunctionRegistry[TName]['output'] : TOutput>;
225
327
  /**
226
328
  * Execute a registered compute function with full result metadata
227
329
  *
228
- * @param name - Name of the registered function
229
- * @param input - Input data for the function
330
+ * @param name - Name of the registered function (autocompletes if registry is extended)
331
+ * @param input - Input data for the function (type-safe if registry is extended)
230
332
  * @param options - Execution options
231
333
  * @returns Promise resolving to ComputeResult with metadata
232
334
  *
@@ -236,7 +338,7 @@ declare class ComputeKit extends EventEmitter<ComputeKitEvents> {
236
338
  * console.log(`Took ${result.duration}ms`);
237
339
  * ```
238
340
  */
239
- runWithMetadata<TInput, TOutput>(name: string, input: TInput, options?: ComputeOptions): Promise<ComputeResult<TOutput>>;
341
+ runWithMetadata<TName extends RegisteredFunctionName, TInput = FunctionInput<TName extends string ? TName : never>, TOutput = FunctionOutput<TName extends string ? TName : never>>(name: TName, input: TName extends keyof ComputeFunctionRegistry ? ComputeFunctionRegistry[TName]['input'] : TInput, options?: ComputeOptions): Promise<ComputeResult<TName extends keyof ComputeFunctionRegistry ? ComputeFunctionRegistry[TName]['output'] : TOutput>>;
240
342
  /**
241
343
  * Get pool statistics
242
344
  */
@@ -260,11 +362,33 @@ declare function createComputeKit(options?: ComputeKitOptions): ComputeKit;
260
362
  declare function getDefaultInstance(): ComputeKit;
261
363
  /**
262
364
  * Register a function on the default instance
365
+ *
366
+ * @example
367
+ * ```ts
368
+ * import { register } from '@computekit/core';
369
+ *
370
+ * register('fibonacci', (n: number) => {
371
+ * if (n <= 1) return n;
372
+ * let a = 0, b = 1;
373
+ * for (let i = 2; i <= n; i++) {
374
+ * [a, b] = [b, a + b];
375
+ * }
376
+ * return b;
377
+ * });
378
+ * ```
263
379
  */
264
- declare function register<TInput, TOutput>(name: string, fn: (input: TInput) => TOutput | Promise<TOutput>): void;
380
+ declare function register<TName extends RegisteredFunctionName, TInput = FunctionInput<TName extends string ? TName : never>, TOutput = FunctionOutput<TName extends string ? TName : never>>(name: TName, fn: TName extends keyof ComputeFunctionRegistry ? ComputeFn<ComputeFunctionRegistry[TName]['input'], ComputeFunctionRegistry[TName]['output']> : ComputeFn<TInput, TOutput>): void;
265
381
  /**
266
382
  * Run a function on the default instance
383
+ *
384
+ * @example
385
+ * ```ts
386
+ * import { run } from '@computekit/core';
387
+ *
388
+ * const result = await run('fibonacci', 50);
389
+ * console.log(result); // Type is inferred if registry is extended
390
+ * ```
267
391
  */
268
- declare function run<TInput, TOutput>(name: string, input: TInput, options?: ComputeOptions): Promise<TOutput>;
392
+ declare function run<TName extends RegisteredFunctionName, TInput = FunctionInput<TName extends string ? TName : never>, TOutput = FunctionOutput<TName extends string ? TName : never>>(name: TName, input: TName extends keyof ComputeFunctionRegistry ? ComputeFunctionRegistry[TName]['input'] : TInput, options?: ComputeOptions): Promise<TName extends keyof ComputeFunctionRegistry ? ComputeFunctionRegistry[TName]['output'] : TOutput>;
269
393
 
270
- export { ComputeKit, ComputeKitEvents, ComputeKitOptions, ComputeOptions, ComputeResult, PoolStats, WasmModuleConfig, WorkerPool, clearWasmCache, copyFromWasmMemory, copyToWasmMemory, createComputeKit, findTransferables, getDefaultInstance, getHardwareConcurrency, getMemoryView, getWasmCacheStats, isSharedArrayBufferAvailable, isWasmSupported, loadAndInstantiate, loadAssemblyScript, loadWasmModule, register, run, wrapWasmExports };
394
+ export { type ComputeFn, type ComputeFunctionRegistry, ComputeKit, ComputeKitEvents, ComputeKitOptions, ComputeOptions, ComputeResult, type DefineFunction, type FunctionInput, type FunctionOutput, type HasRegisteredFunctions, type InferComputeFn, PoolStats, type RegisteredFunctionName, WasmModuleConfig, WorkerPool, clearWasmCache, copyFromWasmMemory, copyToWasmMemory, createComputeKit, findTransferables, getDefaultInstance, getHardwareConcurrency, getMemoryView, getWasmCacheStats, isSharedArrayBufferAvailable, isWasmSupported, loadAndInstantiate, loadAssemblyScript, loadWasmModule, register, run, wrapWasmExports };