@computekit/core 0.1.0 → 0.1.2

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/README.md ADDED
@@ -0,0 +1,241 @@
1
+ # @computekit/core
2
+
3
+ The core library for ComputeKit - run heavy computations in Web Workers with WASM support.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @computekit/core
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```typescript
14
+ import { ComputeKit } from '@computekit/core';
15
+
16
+ // Create an instance
17
+ const kit = new ComputeKit();
18
+
19
+ // Register a compute function
20
+ kit.register('fibonacci', (n: number) => {
21
+ let a = 0,
22
+ b = 1;
23
+ for (let i = 0; i < n; i++) {
24
+ [a, b] = [b, a + b];
25
+ }
26
+ return a;
27
+ });
28
+
29
+ // Run it (non-blocking!)
30
+ const result = await kit.run('fibonacci', 50);
31
+ console.log(result); // 12586269025
32
+ ```
33
+
34
+ ## API Reference
35
+
36
+ ### `new ComputeKit(options?)`
37
+
38
+ Create a new ComputeKit instance.
39
+
40
+ ```typescript
41
+ const kit = new ComputeKit({
42
+ maxWorkers: 4, // Max workers (default: CPU cores)
43
+ timeout: 30000, // Default timeout in ms
44
+ debug: false, // Enable debug logging
45
+ useSharedMemory: true, // Use SharedArrayBuffer when available
46
+ remoteDependencies: [], // External scripts to load in workers
47
+ });
48
+ ```
49
+
50
+ ### Remote Dependencies
51
+
52
+ Load external scripts inside workers using `remoteDependencies`:
53
+
54
+ ```typescript
55
+ const kit = new ComputeKit({
56
+ remoteDependencies: [
57
+ 'https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js',
58
+ ],
59
+ });
60
+
61
+ // Now you can use lodash inside your compute functions
62
+ kit.register('processData', (data: number[]) => {
63
+ // @ts-ignore - lodash is loaded via importScripts
64
+ return _.chunk(data, 3);
65
+ });
66
+ ```
67
+
68
+ **Note:** Remote scripts must be served with proper CORS headers.
69
+
70
+ ### `kit.register(name, fn)`
71
+
72
+ Register a function to run in workers.
73
+
74
+ ```typescript
75
+ kit.register('sum', (numbers: number[]) => {
76
+ return numbers.reduce((a, b) => a + b, 0);
77
+ });
78
+
79
+ // Async functions work too
80
+ kit.register('fetchAndProcess', async (url: string) => {
81
+ const res = await fetch(url);
82
+ const data = await res.json();
83
+ return processData(data);
84
+ });
85
+ ```
86
+
87
+ ### `kit.run(name, input, options?)`
88
+
89
+ Execute a registered function.
90
+
91
+ ```typescript
92
+ const result = await kit.run('sum', [1, 2, 3, 4, 5]);
93
+ console.log(result); // 15
94
+ ```
95
+
96
+ **Options:**
97
+
98
+ ```typescript
99
+ await kit.run('task', data, {
100
+ timeout: 5000, // Timeout in ms
101
+ priority: 10, // Priority (0-10, higher = first)
102
+ signal: abortController.signal, // AbortSignal for cancellation
103
+ onProgress: (p) => {
104
+ // Progress callback
105
+ console.log(`${p.percent}%`);
106
+ },
107
+ });
108
+ ```
109
+
110
+ ### `kit.runWithMetadata(name, input, options?)`
111
+
112
+ Execute and get execution metadata.
113
+
114
+ ```typescript
115
+ const result = await kit.runWithMetadata('task', data);
116
+ console.log(result.data); // The result
117
+ console.log(result.duration); // Execution time in ms
118
+ console.log(result.workerId); // Which worker ran it
119
+ ```
120
+
121
+ ### `kit.getStats()`
122
+
123
+ Get worker pool statistics.
124
+
125
+ ```typescript
126
+ const stats = kit.getStats();
127
+ console.log(stats.activeWorkers); // Currently busy workers
128
+ console.log(stats.queueLength); // Tasks waiting
129
+ console.log(stats.tasksCompleted); // Total completed
130
+ ```
131
+
132
+ ### `kit.terminate()`
133
+
134
+ Terminate all workers and clean up.
135
+
136
+ ```typescript
137
+ await kit.terminate();
138
+ ```
139
+
140
+ ## WASM Support
141
+
142
+ Load and use WebAssembly modules:
143
+
144
+ ```typescript
145
+ import { loadWasmModule, loadAssemblyScript } from '@computekit/core';
146
+
147
+ // Load a WASM module
148
+ const module = await loadWasmModule('/path/to/module.wasm');
149
+
150
+ // Load AssemblyScript with default imports
151
+ const { exports } = await loadAssemblyScript('/as-module.wasm');
152
+ const result = exports.compute(data);
153
+ ```
154
+
155
+ ### WASM Utilities
156
+
157
+ ```typescript
158
+ import {
159
+ loadWasmModule,
160
+ loadAndInstantiate,
161
+ loadAssemblyScript,
162
+ getMemoryView,
163
+ copyToWasmMemory,
164
+ copyFromWasmMemory,
165
+ isWasmSupported,
166
+ } from '@computekit/core';
167
+
168
+ // Check support
169
+ if (isWasmSupported()) {
170
+ // Load and instantiate with custom imports
171
+ const { instance } = await loadAndInstantiate({
172
+ source: '/module.wasm',
173
+ imports: { env: { log: console.log } },
174
+ memory: { initial: 256, maximum: 512 },
175
+ });
176
+ }
177
+ ```
178
+
179
+ ## Events
180
+
181
+ ComputeKit emits events for monitoring:
182
+
183
+ ```typescript
184
+ kit.on('worker:created', (info) => console.log('Worker created:', info.id));
185
+ kit.on('worker:terminated', (info) => console.log('Worker terminated:', info.id));
186
+ kit.on('task:start', (taskId, name) => console.log('Task started:', name));
187
+ kit.on('task:complete', (taskId, duration) => console.log('Done in', duration, 'ms'));
188
+ kit.on('task:error', (taskId, error) => console.error('Task failed:', error));
189
+ kit.on('task:progress', (taskId, progress) => console.log(progress.percent, '%'));
190
+ ```
191
+
192
+ ## Error Handling
193
+
194
+ ```typescript
195
+ try {
196
+ await kit.run('task', data);
197
+ } catch (error) {
198
+ if (error.message.includes('not registered')) {
199
+ // Function not found
200
+ } else if (error.message.includes('timed out')) {
201
+ // Timeout exceeded
202
+ } else if (error.message.includes('aborted')) {
203
+ // Cancelled via AbortSignal
204
+ }
205
+ }
206
+ ```
207
+
208
+ ## Cancellation
209
+
210
+ ```typescript
211
+ const controller = new AbortController();
212
+
213
+ // Start a long task
214
+ const promise = kit.run('heavyTask', data, {
215
+ signal: controller.signal,
216
+ });
217
+
218
+ // Cancel it
219
+ controller.abort();
220
+
221
+ try {
222
+ await promise;
223
+ } catch (error) {
224
+ // error.message contains 'aborted'
225
+ }
226
+ ```
227
+
228
+ ## TypeScript
229
+
230
+ Full type safety:
231
+
232
+ ```typescript
233
+ // Generic types flow through
234
+ kit.register('double', (n: number) => n * 2);
235
+ const result = await kit.run<number, number>('double', 21);
236
+ // result is typed as number
237
+ ```
238
+
239
+ ## License
240
+
241
+ MIT
package/dist/index.cjs CHANGED
@@ -195,7 +195,8 @@ var WorkerPool = class {
195
195
  timeout: options.timeout ?? 3e4,
196
196
  debug: options.debug ?? false,
197
197
  workerPath: options.workerPath ?? "",
198
- useSharedMemory: options.useSharedMemory ?? true
198
+ useSharedMemory: options.useSharedMemory ?? true,
199
+ remoteDependencies: options.remoteDependencies ?? []
199
200
  };
200
201
  this.logger = createLogger("ComputeKit:Pool", this.options.debug);
201
202
  this.logger.info("WorkerPool created with options:", this.options);
@@ -357,7 +358,11 @@ var WorkerPool = class {
357
358
  "Creating worker blob with functions:",
358
359
  Array.from(this.functions.keys())
359
360
  );
361
+ const remoteDeps = this.options.remoteDependencies;
362
+ const importScriptsCode = remoteDeps.length > 0 ? `importScripts(${remoteDeps.map((url) => `"${url}"`).join(", ")});` : "";
360
363
  const workerCode = `
364
+ ${importScriptsCode}
365
+
361
366
  const functions = {
362
367
  ${functionsCode}
363
368
  };
@@ -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 * 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"]}
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 * 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 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 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"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { W as WasmModuleConfig, C as ComputeKitOptions, a as ComputeOptions, P as PoolStats, b as ComputeKitEvents, c as ComputeResult } from './types-AaH5nWxG.cjs';
2
- export { e as ComputeFunction, d as ComputeProgress, f as WorkerInfo } from './types-AaH5nWxG.cjs';
1
+ import { W as WasmModuleConfig, C as ComputeKitOptions, a as ComputeOptions, P as PoolStats, b as ComputeKitEvents, c as ComputeResult } from './types-2XRPtzH9.cjs';
2
+ export { e as ComputeFunction, d as ComputeProgress, f as WorkerInfo } from './types-2XRPtzH9.cjs';
3
3
 
4
4
  /**
5
5
  * Check if SharedArrayBuffer is available
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { W as WasmModuleConfig, C as ComputeKitOptions, a as ComputeOptions, P as PoolStats, b as ComputeKitEvents, c as ComputeResult } from './types-AaH5nWxG.js';
2
- export { e as ComputeFunction, d as ComputeProgress, f as WorkerInfo } from './types-AaH5nWxG.js';
1
+ import { W as WasmModuleConfig, C as ComputeKitOptions, a as ComputeOptions, P as PoolStats, b as ComputeKitEvents, c as ComputeResult } from './types-2XRPtzH9.js';
2
+ export { e as ComputeFunction, d as ComputeProgress, f as WorkerInfo } from './types-2XRPtzH9.js';
3
3
 
4
4
  /**
5
5
  * Check if SharedArrayBuffer is available
package/dist/index.js CHANGED
@@ -193,7 +193,8 @@ var WorkerPool = class {
193
193
  timeout: options.timeout ?? 3e4,
194
194
  debug: options.debug ?? false,
195
195
  workerPath: options.workerPath ?? "",
196
- useSharedMemory: options.useSharedMemory ?? true
196
+ useSharedMemory: options.useSharedMemory ?? true,
197
+ remoteDependencies: options.remoteDependencies ?? []
197
198
  };
198
199
  this.logger = createLogger("ComputeKit:Pool", this.options.debug);
199
200
  this.logger.info("WorkerPool created with options:", this.options);
@@ -355,7 +356,11 @@ var WorkerPool = class {
355
356
  "Creating worker blob with functions:",
356
357
  Array.from(this.functions.keys())
357
358
  );
359
+ const remoteDeps = this.options.remoteDependencies;
360
+ const importScriptsCode = remoteDeps.length > 0 ? `importScripts(${remoteDeps.map((url) => `"${url}"`).join(", ")});` : "";
358
361
  const workerCode = `
362
+ ${importScriptsCode}
363
+
359
364
  const functions = {
360
365
  ${functionsCode}
361
366
  };
package/dist/index.js.map CHANGED
@@ -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.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"]}
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 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 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"]}
@@ -14,6 +14,8 @@ interface ComputeKitOptions {
14
14
  workerPath?: string;
15
15
  /** Whether to use SharedArrayBuffer when available (default: true) */
16
16
  useSharedMemory?: boolean;
17
+ /** Remote scripts to load in workers via importScripts */
18
+ remoteDependencies?: string[];
17
19
  }
18
20
  /** Options for individual compute operations */
19
21
  interface ComputeOptions {
@@ -14,6 +14,8 @@ interface ComputeKitOptions {
14
14
  workerPath?: string;
15
15
  /** Whether to use SharedArrayBuffer when available (default: true) */
16
16
  useSharedMemory?: boolean;
17
+ /** Remote scripts to load in workers via importScripts */
18
+ remoteDependencies?: string[];
17
19
  }
18
20
  /** Options for individual compute operations */
19
21
  interface ComputeOptions {
package/dist/worker.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { d as ComputeProgress } from './types-AaH5nWxG.cjs';
1
+ import { d as ComputeProgress } from './types-2XRPtzH9.cjs';
2
2
 
3
3
  /**
4
4
  * ComputeKit Worker Runtime
package/dist/worker.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { d as ComputeProgress } from './types-AaH5nWxG.js';
1
+ import { d as ComputeProgress } from './types-2XRPtzH9.js';
2
2
 
3
3
  /**
4
4
  * ComputeKit Worker Runtime
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@computekit/core",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Core WASM + Worker toolkit for running heavy computations without blocking the UI",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -20,7 +20,8 @@
20
20
  },
21
21
  "files": [
22
22
  "dist",
23
- "src"
23
+ "src",
24
+ "README.md"
24
25
  ],
25
26
  "scripts": {
26
27
  "build": "tsup",
package/src/pool.ts CHANGED
@@ -86,6 +86,7 @@ export class WorkerPool {
86
86
  debug: options.debug ?? false,
87
87
  workerPath: options.workerPath ?? '',
88
88
  useSharedMemory: options.useSharedMemory ?? true,
89
+ remoteDependencies: options.remoteDependencies ?? [],
89
90
  };
90
91
 
91
92
  this.logger = createLogger('ComputeKit:Pool', this.options.debug);
@@ -308,7 +309,16 @@ export class WorkerPool {
308
309
  Array.from(this.functions.keys())
309
310
  );
310
311
 
312
+ // Generate importScripts for remote dependencies
313
+ const remoteDeps = this.options.remoteDependencies;
314
+ const importScriptsCode =
315
+ remoteDeps.length > 0
316
+ ? `importScripts(${remoteDeps.map((url) => `"${url}"`).join(', ')});`
317
+ : '';
318
+
311
319
  const workerCode = `
320
+ ${importScriptsCode}
321
+
312
322
  const functions = {
313
323
  ${functionsCode}
314
324
  };
package/src/types.ts CHANGED
@@ -15,6 +15,8 @@ export interface ComputeKitOptions {
15
15
  workerPath?: string;
16
16
  /** Whether to use SharedArrayBuffer when available (default: true) */
17
17
  useSharedMemory?: boolean;
18
+ /** Remote scripts to load in workers via importScripts */
19
+ remoteDependencies?: string[];
18
20
  }
19
21
 
20
22
  /** Options for individual compute operations */