@computekit/core 0.1.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 +820 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +270 -0
- package/dist/index.d.ts +270 -0
- package/dist/index.js +800 -0
- package/dist/index.js.map +1 -0
- package/dist/types-AaH5nWxG.d.cts +143 -0
- package/dist/types-AaH5nWxG.d.ts +143 -0
- package/dist/worker.cjs +148 -0
- package/dist/worker.cjs.map +1 -0
- package/dist/worker.d.cts +23 -0
- package/dist/worker.d.ts +23 -0
- package/dist/worker.js +143 -0
- package/dist/worker.js.map +1 -0
- package/package.json +61 -0
- package/src/cli.ts +246 -0
- package/src/index.test.ts +93 -0
- package/src/index.ts +232 -0
- package/src/pool.ts +591 -0
- package/src/types.ts +229 -0
- package/src/utils.ts +305 -0
- package/src/wasm.ts +205 -0
- package/src/worker/index.ts +11 -0
- package/src/worker/runtime.ts +149 -0
|
@@ -0,0 +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.js","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 * 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 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 };\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 const workerCode = `\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 this.logger.debug(\n `Task ${id} completed in ${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} 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"]}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ComputeKit Core Types
|
|
3
|
+
* Type definitions for the WASM + Worker toolkit
|
|
4
|
+
*/
|
|
5
|
+
/** Configuration options for ComputeKit */
|
|
6
|
+
interface ComputeKitOptions {
|
|
7
|
+
/** Maximum number of workers in the pool (default: navigator.hardwareConcurrency || 4) */
|
|
8
|
+
maxWorkers?: number;
|
|
9
|
+
/** Timeout for compute operations in milliseconds (default: 30000) */
|
|
10
|
+
timeout?: number;
|
|
11
|
+
/** Enable debug logging (default: false) */
|
|
12
|
+
debug?: boolean;
|
|
13
|
+
/** Custom path to worker script */
|
|
14
|
+
workerPath?: string;
|
|
15
|
+
/** Whether to use SharedArrayBuffer when available (default: true) */
|
|
16
|
+
useSharedMemory?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** Options for individual compute operations */
|
|
19
|
+
interface ComputeOptions {
|
|
20
|
+
/** Timeout for this specific operation (overrides global) */
|
|
21
|
+
timeout?: number;
|
|
22
|
+
/** Transfer these ArrayBuffers to the worker (improves performance) */
|
|
23
|
+
transfer?: ArrayBuffer[];
|
|
24
|
+
/** Priority level for scheduling (0-10, higher = more priority) */
|
|
25
|
+
priority?: number;
|
|
26
|
+
/** Abort signal to cancel the operation */
|
|
27
|
+
signal?: AbortSignal;
|
|
28
|
+
/** Progress callback for long-running operations */
|
|
29
|
+
onProgress?: (progress: ComputeProgress) => void;
|
|
30
|
+
}
|
|
31
|
+
/** Progress information for compute operations */
|
|
32
|
+
interface ComputeProgress {
|
|
33
|
+
/** Progress percentage (0-100) */
|
|
34
|
+
percent: number;
|
|
35
|
+
/** Current step/phase name */
|
|
36
|
+
phase?: string;
|
|
37
|
+
/** Estimated time remaining in milliseconds */
|
|
38
|
+
estimatedTimeRemaining?: number;
|
|
39
|
+
/** Any additional data from the compute function */
|
|
40
|
+
data?: unknown;
|
|
41
|
+
}
|
|
42
|
+
/** Result wrapper with metadata */
|
|
43
|
+
interface ComputeResult<T> {
|
|
44
|
+
/** The computed result */
|
|
45
|
+
data: T;
|
|
46
|
+
/** Time taken in milliseconds */
|
|
47
|
+
duration: number;
|
|
48
|
+
/** Whether the result came from cache */
|
|
49
|
+
cached: boolean;
|
|
50
|
+
/** Worker ID that processed this */
|
|
51
|
+
workerId: string;
|
|
52
|
+
}
|
|
53
|
+
/** Function definition for registration */
|
|
54
|
+
interface ComputeFunction<TInput = unknown, TOutput = unknown> {
|
|
55
|
+
/** The compute function implementation */
|
|
56
|
+
fn: (input: TInput) => TOutput | Promise<TOutput>;
|
|
57
|
+
/** Optional WASM module to load */
|
|
58
|
+
wasmModule?: WebAssembly.Module | ArrayBuffer | string;
|
|
59
|
+
/** Whether this function supports progress reporting */
|
|
60
|
+
supportsProgress?: boolean;
|
|
61
|
+
}
|
|
62
|
+
/** WASM module configuration */
|
|
63
|
+
interface WasmModuleConfig {
|
|
64
|
+
/** Path to the WASM file or base64 encoded WASM */
|
|
65
|
+
source: string | ArrayBuffer;
|
|
66
|
+
/** Imports to provide to the WASM module */
|
|
67
|
+
imports?: WebAssembly.Imports;
|
|
68
|
+
/** Memory configuration */
|
|
69
|
+
memory?: {
|
|
70
|
+
initial: number;
|
|
71
|
+
maximum?: number;
|
|
72
|
+
shared?: boolean;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** Worker state */
|
|
76
|
+
type WorkerState = 'idle' | 'busy' | 'error' | 'terminated';
|
|
77
|
+
/** Worker info */
|
|
78
|
+
interface WorkerInfo {
|
|
79
|
+
id: string;
|
|
80
|
+
state: WorkerState;
|
|
81
|
+
currentTask?: string;
|
|
82
|
+
tasksCompleted: number;
|
|
83
|
+
errors: number;
|
|
84
|
+
createdAt: number;
|
|
85
|
+
lastActiveAt: number;
|
|
86
|
+
}
|
|
87
|
+
/** Pool statistics */
|
|
88
|
+
interface PoolStats {
|
|
89
|
+
workers: WorkerInfo[];
|
|
90
|
+
totalWorkers: number;
|
|
91
|
+
activeWorkers: number;
|
|
92
|
+
idleWorkers: number;
|
|
93
|
+
queueLength: number;
|
|
94
|
+
tasksCompleted: number;
|
|
95
|
+
tasksFailed: number;
|
|
96
|
+
averageTaskDuration: number;
|
|
97
|
+
}
|
|
98
|
+
/** Event data for worker:created */
|
|
99
|
+
interface WorkerCreatedEvent {
|
|
100
|
+
info: WorkerInfo;
|
|
101
|
+
}
|
|
102
|
+
/** Event data for worker:terminated */
|
|
103
|
+
interface WorkerTerminatedEvent {
|
|
104
|
+
info: WorkerInfo;
|
|
105
|
+
}
|
|
106
|
+
/** Event data for worker:error */
|
|
107
|
+
interface WorkerErrorEvent {
|
|
108
|
+
error: Error;
|
|
109
|
+
info: WorkerInfo;
|
|
110
|
+
}
|
|
111
|
+
/** Event data for task:start */
|
|
112
|
+
interface TaskStartEvent {
|
|
113
|
+
taskId: string;
|
|
114
|
+
functionName: string;
|
|
115
|
+
}
|
|
116
|
+
/** Event data for task:complete */
|
|
117
|
+
interface TaskCompleteEvent {
|
|
118
|
+
taskId: string;
|
|
119
|
+
duration: number;
|
|
120
|
+
}
|
|
121
|
+
/** Event data for task:error */
|
|
122
|
+
interface TaskErrorEvent {
|
|
123
|
+
taskId: string;
|
|
124
|
+
error: Error;
|
|
125
|
+
}
|
|
126
|
+
/** Event data for task:progress */
|
|
127
|
+
interface TaskProgressEvent {
|
|
128
|
+
taskId: string;
|
|
129
|
+
progress: ComputeProgress;
|
|
130
|
+
}
|
|
131
|
+
/** Events emitted by ComputeKit */
|
|
132
|
+
type ComputeKitEvents = {
|
|
133
|
+
'worker:created': WorkerCreatedEvent;
|
|
134
|
+
'worker:terminated': WorkerTerminatedEvent;
|
|
135
|
+
'worker:error': WorkerErrorEvent;
|
|
136
|
+
'task:start': TaskStartEvent;
|
|
137
|
+
'task:complete': TaskCompleteEvent;
|
|
138
|
+
'task:error': TaskErrorEvent;
|
|
139
|
+
'task:progress': TaskProgressEvent;
|
|
140
|
+
[key: string]: unknown;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
export type { ComputeKitOptions as C, PoolStats as P, WasmModuleConfig as W, ComputeOptions as a, ComputeKitEvents as b, ComputeResult as c, ComputeProgress as d, ComputeFunction as e, WorkerInfo as f };
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ComputeKit Core Types
|
|
3
|
+
* Type definitions for the WASM + Worker toolkit
|
|
4
|
+
*/
|
|
5
|
+
/** Configuration options for ComputeKit */
|
|
6
|
+
interface ComputeKitOptions {
|
|
7
|
+
/** Maximum number of workers in the pool (default: navigator.hardwareConcurrency || 4) */
|
|
8
|
+
maxWorkers?: number;
|
|
9
|
+
/** Timeout for compute operations in milliseconds (default: 30000) */
|
|
10
|
+
timeout?: number;
|
|
11
|
+
/** Enable debug logging (default: false) */
|
|
12
|
+
debug?: boolean;
|
|
13
|
+
/** Custom path to worker script */
|
|
14
|
+
workerPath?: string;
|
|
15
|
+
/** Whether to use SharedArrayBuffer when available (default: true) */
|
|
16
|
+
useSharedMemory?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** Options for individual compute operations */
|
|
19
|
+
interface ComputeOptions {
|
|
20
|
+
/** Timeout for this specific operation (overrides global) */
|
|
21
|
+
timeout?: number;
|
|
22
|
+
/** Transfer these ArrayBuffers to the worker (improves performance) */
|
|
23
|
+
transfer?: ArrayBuffer[];
|
|
24
|
+
/** Priority level for scheduling (0-10, higher = more priority) */
|
|
25
|
+
priority?: number;
|
|
26
|
+
/** Abort signal to cancel the operation */
|
|
27
|
+
signal?: AbortSignal;
|
|
28
|
+
/** Progress callback for long-running operations */
|
|
29
|
+
onProgress?: (progress: ComputeProgress) => void;
|
|
30
|
+
}
|
|
31
|
+
/** Progress information for compute operations */
|
|
32
|
+
interface ComputeProgress {
|
|
33
|
+
/** Progress percentage (0-100) */
|
|
34
|
+
percent: number;
|
|
35
|
+
/** Current step/phase name */
|
|
36
|
+
phase?: string;
|
|
37
|
+
/** Estimated time remaining in milliseconds */
|
|
38
|
+
estimatedTimeRemaining?: number;
|
|
39
|
+
/** Any additional data from the compute function */
|
|
40
|
+
data?: unknown;
|
|
41
|
+
}
|
|
42
|
+
/** Result wrapper with metadata */
|
|
43
|
+
interface ComputeResult<T> {
|
|
44
|
+
/** The computed result */
|
|
45
|
+
data: T;
|
|
46
|
+
/** Time taken in milliseconds */
|
|
47
|
+
duration: number;
|
|
48
|
+
/** Whether the result came from cache */
|
|
49
|
+
cached: boolean;
|
|
50
|
+
/** Worker ID that processed this */
|
|
51
|
+
workerId: string;
|
|
52
|
+
}
|
|
53
|
+
/** Function definition for registration */
|
|
54
|
+
interface ComputeFunction<TInput = unknown, TOutput = unknown> {
|
|
55
|
+
/** The compute function implementation */
|
|
56
|
+
fn: (input: TInput) => TOutput | Promise<TOutput>;
|
|
57
|
+
/** Optional WASM module to load */
|
|
58
|
+
wasmModule?: WebAssembly.Module | ArrayBuffer | string;
|
|
59
|
+
/** Whether this function supports progress reporting */
|
|
60
|
+
supportsProgress?: boolean;
|
|
61
|
+
}
|
|
62
|
+
/** WASM module configuration */
|
|
63
|
+
interface WasmModuleConfig {
|
|
64
|
+
/** Path to the WASM file or base64 encoded WASM */
|
|
65
|
+
source: string | ArrayBuffer;
|
|
66
|
+
/** Imports to provide to the WASM module */
|
|
67
|
+
imports?: WebAssembly.Imports;
|
|
68
|
+
/** Memory configuration */
|
|
69
|
+
memory?: {
|
|
70
|
+
initial: number;
|
|
71
|
+
maximum?: number;
|
|
72
|
+
shared?: boolean;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** Worker state */
|
|
76
|
+
type WorkerState = 'idle' | 'busy' | 'error' | 'terminated';
|
|
77
|
+
/** Worker info */
|
|
78
|
+
interface WorkerInfo {
|
|
79
|
+
id: string;
|
|
80
|
+
state: WorkerState;
|
|
81
|
+
currentTask?: string;
|
|
82
|
+
tasksCompleted: number;
|
|
83
|
+
errors: number;
|
|
84
|
+
createdAt: number;
|
|
85
|
+
lastActiveAt: number;
|
|
86
|
+
}
|
|
87
|
+
/** Pool statistics */
|
|
88
|
+
interface PoolStats {
|
|
89
|
+
workers: WorkerInfo[];
|
|
90
|
+
totalWorkers: number;
|
|
91
|
+
activeWorkers: number;
|
|
92
|
+
idleWorkers: number;
|
|
93
|
+
queueLength: number;
|
|
94
|
+
tasksCompleted: number;
|
|
95
|
+
tasksFailed: number;
|
|
96
|
+
averageTaskDuration: number;
|
|
97
|
+
}
|
|
98
|
+
/** Event data for worker:created */
|
|
99
|
+
interface WorkerCreatedEvent {
|
|
100
|
+
info: WorkerInfo;
|
|
101
|
+
}
|
|
102
|
+
/** Event data for worker:terminated */
|
|
103
|
+
interface WorkerTerminatedEvent {
|
|
104
|
+
info: WorkerInfo;
|
|
105
|
+
}
|
|
106
|
+
/** Event data for worker:error */
|
|
107
|
+
interface WorkerErrorEvent {
|
|
108
|
+
error: Error;
|
|
109
|
+
info: WorkerInfo;
|
|
110
|
+
}
|
|
111
|
+
/** Event data for task:start */
|
|
112
|
+
interface TaskStartEvent {
|
|
113
|
+
taskId: string;
|
|
114
|
+
functionName: string;
|
|
115
|
+
}
|
|
116
|
+
/** Event data for task:complete */
|
|
117
|
+
interface TaskCompleteEvent {
|
|
118
|
+
taskId: string;
|
|
119
|
+
duration: number;
|
|
120
|
+
}
|
|
121
|
+
/** Event data for task:error */
|
|
122
|
+
interface TaskErrorEvent {
|
|
123
|
+
taskId: string;
|
|
124
|
+
error: Error;
|
|
125
|
+
}
|
|
126
|
+
/** Event data for task:progress */
|
|
127
|
+
interface TaskProgressEvent {
|
|
128
|
+
taskId: string;
|
|
129
|
+
progress: ComputeProgress;
|
|
130
|
+
}
|
|
131
|
+
/** Events emitted by ComputeKit */
|
|
132
|
+
type ComputeKitEvents = {
|
|
133
|
+
'worker:created': WorkerCreatedEvent;
|
|
134
|
+
'worker:terminated': WorkerTerminatedEvent;
|
|
135
|
+
'worker:error': WorkerErrorEvent;
|
|
136
|
+
'task:start': TaskStartEvent;
|
|
137
|
+
'task:complete': TaskCompleteEvent;
|
|
138
|
+
'task:error': TaskErrorEvent;
|
|
139
|
+
'task:progress': TaskProgressEvent;
|
|
140
|
+
[key: string]: unknown;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
export type { ComputeKitOptions as C, PoolStats as P, WasmModuleConfig as W, ComputeOptions as a, ComputeKitEvents as b, ComputeResult as c, ComputeProgress as d, ComputeFunction as e, WorkerInfo as f };
|
package/dist/worker.cjs
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/utils.ts
|
|
4
|
+
function generateId() {
|
|
5
|
+
return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;
|
|
6
|
+
}
|
|
7
|
+
function findTransferables(data) {
|
|
8
|
+
const transferables = [];
|
|
9
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
10
|
+
function traverse(obj) {
|
|
11
|
+
if (obj === null || typeof obj !== "object") return;
|
|
12
|
+
if (seen.has(obj)) return;
|
|
13
|
+
seen.add(obj);
|
|
14
|
+
if (obj instanceof ArrayBuffer) {
|
|
15
|
+
transferables.push(obj);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (ArrayBuffer.isView(obj)) {
|
|
19
|
+
transferables.push(obj.buffer);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (obj instanceof MessagePort) {
|
|
23
|
+
transferables.push(obj);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (typeof ImageBitmap !== "undefined" && obj instanceof ImageBitmap) {
|
|
27
|
+
transferables.push(obj);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (typeof OffscreenCanvas !== "undefined" && obj instanceof OffscreenCanvas) {
|
|
31
|
+
transferables.push(obj);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (Array.isArray(obj)) {
|
|
35
|
+
obj.forEach(traverse);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (obj instanceof Map) {
|
|
39
|
+
obj.forEach((value, key) => {
|
|
40
|
+
traverse(key);
|
|
41
|
+
traverse(value);
|
|
42
|
+
});
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (obj instanceof Set) {
|
|
46
|
+
obj.forEach(traverse);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
Object.values(obj).forEach(traverse);
|
|
50
|
+
}
|
|
51
|
+
traverse(data);
|
|
52
|
+
return transferables;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// src/worker/runtime.ts
|
|
56
|
+
var functionRegistry = /* @__PURE__ */ new Map();
|
|
57
|
+
var currentTaskId = null;
|
|
58
|
+
function reportProgress(progress) {
|
|
59
|
+
if (!currentTaskId) {
|
|
60
|
+
console.warn("reportProgress called outside of compute function");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const message = {
|
|
64
|
+
id: generateId(),
|
|
65
|
+
type: "progress",
|
|
66
|
+
payload: {
|
|
67
|
+
taskId: currentTaskId,
|
|
68
|
+
progress: {
|
|
69
|
+
percent: progress.percent ?? 0,
|
|
70
|
+
phase: progress.phase,
|
|
71
|
+
estimatedTimeRemaining: progress.estimatedTimeRemaining,
|
|
72
|
+
data: progress.data
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
timestamp: Date.now()
|
|
76
|
+
};
|
|
77
|
+
self.postMessage(message);
|
|
78
|
+
}
|
|
79
|
+
function registerFunction(name, fn) {
|
|
80
|
+
functionRegistry.set(name, fn);
|
|
81
|
+
}
|
|
82
|
+
async function executeFunction(functionName, input) {
|
|
83
|
+
const fn = functionRegistry.get(functionName);
|
|
84
|
+
if (!fn) {
|
|
85
|
+
throw new Error(`Function "${functionName}" not found in worker`);
|
|
86
|
+
}
|
|
87
|
+
return fn(input);
|
|
88
|
+
}
|
|
89
|
+
async function handleMessage(event) {
|
|
90
|
+
const { id, type, payload } = event.data;
|
|
91
|
+
if (type === "execute") {
|
|
92
|
+
const { functionName, input } = payload;
|
|
93
|
+
const startTime = performance.now();
|
|
94
|
+
currentTaskId = id;
|
|
95
|
+
try {
|
|
96
|
+
const result = await executeFunction(functionName, input);
|
|
97
|
+
const duration = performance.now() - startTime;
|
|
98
|
+
const transfer = findTransferables(result);
|
|
99
|
+
const response = {
|
|
100
|
+
id,
|
|
101
|
+
type: "result",
|
|
102
|
+
payload: {
|
|
103
|
+
data: result,
|
|
104
|
+
duration
|
|
105
|
+
},
|
|
106
|
+
timestamp: Date.now()
|
|
107
|
+
};
|
|
108
|
+
self.postMessage(response, transfer);
|
|
109
|
+
} catch (err) {
|
|
110
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
111
|
+
const response = {
|
|
112
|
+
id,
|
|
113
|
+
type: "error",
|
|
114
|
+
payload: {
|
|
115
|
+
message: error.message,
|
|
116
|
+
stack: error.stack
|
|
117
|
+
},
|
|
118
|
+
timestamp: Date.now()
|
|
119
|
+
};
|
|
120
|
+
self.postMessage(response);
|
|
121
|
+
} finally {
|
|
122
|
+
currentTaskId = null;
|
|
123
|
+
}
|
|
124
|
+
} else if (type === "init") {
|
|
125
|
+
const response = {
|
|
126
|
+
id,
|
|
127
|
+
type: "ready",
|
|
128
|
+
timestamp: Date.now()
|
|
129
|
+
};
|
|
130
|
+
self.postMessage(response);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function initWorkerRuntime() {
|
|
134
|
+
self.onmessage = handleMessage;
|
|
135
|
+
const readyMessage = {
|
|
136
|
+
id: generateId(),
|
|
137
|
+
type: "ready",
|
|
138
|
+
timestamp: Date.now()
|
|
139
|
+
};
|
|
140
|
+
self.postMessage(readyMessage);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
exports.functionRegistry = functionRegistry;
|
|
144
|
+
exports.initWorkerRuntime = initWorkerRuntime;
|
|
145
|
+
exports.registerFunction = registerFunction;
|
|
146
|
+
exports.reportProgress = reportProgress;
|
|
147
|
+
//# sourceMappingURL=worker.cjs.map
|
|
148
|
+
//# sourceMappingURL=worker.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/worker/runtime.ts"],"names":[],"mappings":"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","file":"worker.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 * 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 Runtime\n * Code that runs inside Web Workers\n */\n\nimport type {\n WorkerMessage,\n ExecutePayload,\n ResultPayload,\n ErrorPayload,\n ComputeProgress,\n} from '../types';\n\nimport { generateId, findTransferables } from '../utils';\n\n/** Registry of compute functions available in the worker */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nconst functionRegistry = new Map<string, Function>();\n\n/** Current task context for progress reporting */\nlet currentTaskId: string | null = null;\n\n/**\n * Report progress from within a compute function\n */\nexport function reportProgress(progress: Partial<ComputeProgress>): void {\n if (!currentTaskId) {\n console.warn('reportProgress called outside of compute function');\n return;\n }\n\n const message: WorkerMessage = {\n id: generateId(),\n type: 'progress',\n payload: {\n taskId: currentTaskId,\n progress: {\n percent: progress.percent ?? 0,\n phase: progress.phase,\n estimatedTimeRemaining: progress.estimatedTimeRemaining,\n data: progress.data,\n },\n },\n timestamp: Date.now(),\n };\n\n self.postMessage(message);\n}\n\n/**\n * Register a compute function in the worker\n */\nexport function registerFunction(\n name: string,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n fn: Function\n): void {\n functionRegistry.set(name, fn);\n}\n\n/**\n * Execute a registered function\n */\nasync function executeFunction(functionName: string, input: unknown): Promise<unknown> {\n const fn = functionRegistry.get(functionName);\n\n if (!fn) {\n throw new Error(`Function \"${functionName}\" not found in worker`);\n }\n\n return fn(input);\n}\n\n/**\n * Handle incoming messages from the main thread\n */\nasync function handleMessage(event: MessageEvent<WorkerMessage>): Promise<void> {\n const { id, type, payload } = event.data;\n\n if (type === 'execute') {\n const { functionName, input } = payload as ExecutePayload;\n const startTime = performance.now();\n\n // Set current task for progress reporting\n currentTaskId = id;\n\n try {\n const result = await executeFunction(functionName, input);\n const duration = performance.now() - startTime;\n\n // Find transferable objects in result\n const transfer = findTransferables(result);\n\n const response: WorkerMessage<ResultPayload> = {\n id,\n type: 'result',\n payload: {\n data: result,\n duration,\n },\n timestamp: Date.now(),\n };\n\n self.postMessage(response, transfer as Transferable[]);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n\n const response: WorkerMessage<ErrorPayload> = {\n id,\n type: 'error',\n payload: {\n message: error.message,\n stack: error.stack,\n },\n timestamp: Date.now(),\n };\n\n self.postMessage(response);\n } finally {\n currentTaskId = null;\n }\n } else if (type === 'init') {\n // Handle initialization if needed\n const response: WorkerMessage = {\n id,\n type: 'ready',\n timestamp: Date.now(),\n };\n self.postMessage(response);\n }\n}\n\n/**\n * Initialize the worker runtime\n */\nexport function initWorkerRuntime(): void {\n self.onmessage = handleMessage;\n\n // Signal that worker is ready\n const readyMessage: WorkerMessage = {\n id: generateId(),\n type: 'ready',\n timestamp: Date.now(),\n };\n self.postMessage(readyMessage);\n}\n\n// Export for use in worker entry point\nexport { functionRegistry };\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { d as ComputeProgress } from './types-AaH5nWxG.cjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ComputeKit Worker Runtime
|
|
5
|
+
* Code that runs inside Web Workers
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/** Registry of compute functions available in the worker */
|
|
9
|
+
declare const functionRegistry: Map<string, Function>;
|
|
10
|
+
/**
|
|
11
|
+
* Report progress from within a compute function
|
|
12
|
+
*/
|
|
13
|
+
declare function reportProgress(progress: Partial<ComputeProgress>): void;
|
|
14
|
+
/**
|
|
15
|
+
* Register a compute function in the worker
|
|
16
|
+
*/
|
|
17
|
+
declare function registerFunction(name: string, fn: Function): void;
|
|
18
|
+
/**
|
|
19
|
+
* Initialize the worker runtime
|
|
20
|
+
*/
|
|
21
|
+
declare function initWorkerRuntime(): void;
|
|
22
|
+
|
|
23
|
+
export { functionRegistry, initWorkerRuntime, registerFunction, reportProgress };
|
package/dist/worker.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { d as ComputeProgress } from './types-AaH5nWxG.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ComputeKit Worker Runtime
|
|
5
|
+
* Code that runs inside Web Workers
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/** Registry of compute functions available in the worker */
|
|
9
|
+
declare const functionRegistry: Map<string, Function>;
|
|
10
|
+
/**
|
|
11
|
+
* Report progress from within a compute function
|
|
12
|
+
*/
|
|
13
|
+
declare function reportProgress(progress: Partial<ComputeProgress>): void;
|
|
14
|
+
/**
|
|
15
|
+
* Register a compute function in the worker
|
|
16
|
+
*/
|
|
17
|
+
declare function registerFunction(name: string, fn: Function): void;
|
|
18
|
+
/**
|
|
19
|
+
* Initialize the worker runtime
|
|
20
|
+
*/
|
|
21
|
+
declare function initWorkerRuntime(): void;
|
|
22
|
+
|
|
23
|
+
export { functionRegistry, initWorkerRuntime, registerFunction, reportProgress };
|