inferis-ml 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +664 -0
- package/dist/adapters/onnx.cjs +2 -0
- package/dist/adapters/onnx.cjs.map +1 -0
- package/dist/adapters/onnx.d.cts +28 -0
- package/dist/adapters/onnx.d.ts +28 -0
- package/dist/adapters/onnx.js +2 -0
- package/dist/adapters/onnx.js.map +1 -0
- package/dist/adapters/transformers.cjs +2 -0
- package/dist/adapters/transformers.cjs.map +1 -0
- package/dist/adapters/transformers.d.cts +29 -0
- package/dist/adapters/transformers.d.ts +29 -0
- package/dist/adapters/transformers.js +2 -0
- package/dist/adapters/transformers.js.map +1 -0
- package/dist/adapters/web-llm.cjs +2 -0
- package/dist/adapters/web-llm.cjs.map +1 -0
- package/dist/adapters/web-llm.d.cts +31 -0
- package/dist/adapters/web-llm.d.ts +31 -0
- package/dist/adapters/web-llm.js +2 -0
- package/dist/adapters/web-llm.js.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +543 -0
- package/dist/index.d.ts +543 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/types-Y6Ytjh7U.d.cts +271 -0
- package/dist/types-Y6Ytjh7U.d.ts +271 -0
- package/dist/worker/dedicated.worker.cjs +2 -0
- package/dist/worker/dedicated.worker.cjs.map +1 -0
- package/dist/worker/dedicated.worker.d.cts +17 -0
- package/dist/worker/dedicated.worker.d.ts +17 -0
- package/dist/worker/dedicated.worker.js +502 -0
- package/dist/worker/dedicated.worker.js.map +1 -0
- package/dist/worker/shared.worker.js +460 -0
- package/package.json +103 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/coordination/leader-election.ts","../src/coordination/shared-bridge.ts","../src/coordination/tab-channel.ts","../src/core/budget.ts","../src/core/capabilities.ts","../src/core/errors.ts","../src/core/lifecycle.ts","../src/core/registry.ts","../src/core/scheduler.ts","../src/core/pool.ts","../src/streaming/progress-emitter.ts","../src/streaming/token-stream.ts"],"names":["LOCK_NAME","LeaderElection","_LeaderElection","resolved","resolve","timeout","err","state","held","l","pending","callback","role","listener","SharedWorkerBridge","workerUrl","sw","event","msg","transfer","CHANNEL_NAME","KNOWN_MESSAGE_TYPES","isValidMessage","data","TabChannel","MemoryBudget","maxMB","requiredMB","toEvict","freed","id","size","modelId","memoryMB","idx","WASM_SIMD_PROBE","WASM_THREADS_PROBE","detectWasm","detectWebGpu","gpu","adapter","info","isFallback","detectSharedWorker","detectBroadcastChannel","detectWebLocks","cachedReport","detectCapabilities","webgpu","wasm","clearCapabilitiesCache","InferisError","_InferisError","message","code","instance","result","ModelLoadError","ModelNotReadyError","ModelDisposedError","InferenceError","BudgetExceededError","requestedMB","budgetMB","TaskTimeoutError","reqId","timeoutMs","WorkerError","workerId","DeviceLostError","reason","InvalidStateTransitionError","from","to","TRANSITIONS","transition","canTransition","isAcceptingInference","isTerminal","ModelRegistry","task","modelName","config","entry","device","e","PRIORITY_WEIGHT","Scheduler","_models","load","priority","queue","taskIdx","concurrencyPerWorker","affinityWorker","leastLoadedWorker","leastLoad","models","t","total","q","p","DEFAULT_MAX_WORKERS","DEFAULT_MAX_MEMORY_MB","DEFAULT_TASK_TIMEOUT_MS","PRIORITY_ORDER","WorkerPool","_WorkerPool","caps","full","pool","i","worker","req","existing","s","estimatedMB","tempAdapter","evictId","reject","workerEntry","_estMem","_onProgress","workerConfig","registry","dispose","runInference","streamInference","input","options","signal","onLoadAbort","unsub","deferred","a","b","onAbort","val","w","_p","_s","workerOptions","c","controller","ms","crashedModelIds","defaultDevice","createPool","ProgressEmitter","readableToAsyncIter","stream","reader","done","value","collectStream","results","chunk","collectStreamText"],"mappings":"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","file":"index.cjs","sourcesContent":["const LOCK_NAME = 'inferis:leader';\n\ntype RoleChangeCallback = (role: 'leader' | 'follower') => void;\n\n/**\n * Leader election via Web Locks API.\n *\n * @remarks\n * One tab holds the lock and acts as the \"leader\" — it owns the worker pool.\n * All other tabs are \"followers\" and proxy their requests through BroadcastChannel.\n *\n * When the leader tab closes, the lock is released automatically by the browser,\n * and the next tab in the lock queue is promoted to leader.\n *\n * Web Locks + BroadcastChannel combined coverage: ~96% of modern browsers.\n *\n * iOS Safari and older Android Chrome do not support SharedWorker but DO support\n * Web Locks, making this tier 2 a reliable cross-mobile fallback.\n */\nexport class LeaderElection {\n private role: 'leader' | 'follower' | 'unknown' = 'unknown';\n private readonly listeners = new Set<RoleChangeCallback>();\n private abortController: AbortController | null = null;\n\n /**\n * Start leader election. Resolves once the role is determined.\n * The lock is held for the lifetime of the tab.\n */\n async start(): Promise<'leader' | 'follower'> {\n if (!this.isSupported()) {\n this.setRole('leader');\n return 'leader';\n }\n\n this.abortController = new AbortController();\n let resolved = false;\n\n return new Promise<'leader' | 'follower'>((resolve) => {\n const timeout = setTimeout(() => {\n if (!resolved) {\n resolved = true;\n this.setRole('leader');\n resolve('leader');\n }\n }, 5000);\n\n navigator.locks.request(\n LOCK_NAME,\n { signal: this.abortController!.signal },\n async () => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timeout);\n this.setRole('leader');\n resolve('leader');\n }\n await this.holdLock();\n },\n ).catch((err: Error) => {\n if (err.name !== 'AbortError') {\n void err;\n }\n });\n\n navigator.locks.query().then((state) => {\n if (resolved)\n return;\n const held = state.held?.some(l => l.name === LOCK_NAME) ?? false;\n const pending = state.pending?.some(l => l.name === LOCK_NAME) ?? false;\n if (held || pending) {\n resolved = true;\n clearTimeout(timeout);\n this.setRole('follower');\n resolve('follower');\n }\n }).catch(() => {\n // locks.query() may not be available\n });\n });\n }\n\n private holdLock(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (this.abortController) {\n this.abortController.signal.addEventListener('abort', () => resolve(), { once: true });\n }\n });\n }\n\n /**\n * Release the lock and stop the election. Used for cleanup.\n */\n stop(): void {\n this.abortController?.abort();\n this.abortController = null;\n }\n\n /**\n * Subscribe to role changes.\n * @returns unsubscribe function\n */\n onRoleChange(callback: RoleChangeCallback): () => void {\n this.listeners.add(callback);\n return () => this.listeners.delete(callback);\n }\n\n get currentRole(): 'leader' | 'follower' | 'unknown' {\n return this.role;\n }\n\n get isLeader(): boolean {\n return this.role === 'leader';\n }\n\n private setRole(role: 'leader' | 'follower'): void {\n this.role = role;\n for (const listener of this.listeners) {\n try {\n listener(role);\n }\n catch { /* noop */ }\n }\n }\n\n /**\n * Check if the Web Locks API is available.\n */\n static isSupported(): boolean {\n return typeof navigator !== 'undefined' && 'locks' in navigator;\n }\n\n isSupported(): boolean {\n return LeaderElection.isSupported();\n }\n}\n","import type { MainToWorkerMessage, WorkerToMainMessage } from '../core/types.js';\n\ntype MessageListener = (msg: WorkerToMainMessage) => void;\n\n/**\n * Bridge to a SharedWorker.\n *\n * @remarks\n * SharedWorker allows all tabs from the same origin to share one worker process.\n * One worker holds all model instances, eliminating per-tab model duplication.\n *\n * Tier 1 coordination (~58% browser coverage):\n * - Chrome 4+, Edge 79+, Firefox 29+, Safari 16+\n * - NOT supported on iOS Safari < 16 or Android Chrome\n *\n * If SharedWorker is unavailable, fall back to LeaderElection (tier 2)\n * or per-tab dedicated workers (tier 3).\n */\nexport class SharedWorkerBridge {\n private readonly port: MessagePort;\n private readonly listeners = new Set<MessageListener>();\n\n constructor(workerUrl: URL | string) {\n const sw = new SharedWorker(workerUrl, { type: 'module' });\n this.port = sw.port;\n\n sw.onerror = (event: ErrorEvent) => {\n console.error('[SharedWorkerBridge] worker error:', event.message);\n };\n\n this.port.onmessage = (event: MessageEvent<WorkerToMainMessage>) => {\n for (const listener of this.listeners) {\n try {\n listener(event.data);\n }\n catch {\n // listeners must not throw\n }\n }\n };\n\n this.port.onmessageerror = (event: MessageEvent) => {\n console.error('[SharedWorkerBridge] port deserialization error:', event);\n };\n\n this.port.start();\n }\n\n /**\n * Send a message to the shared worker.\n */\n postMessage(msg: MainToWorkerMessage, transfer?: Transferable[]): void {\n if (transfer?.length) {\n this.port.postMessage(msg, transfer);\n }\n else {\n this.port.postMessage(msg);\n }\n }\n\n /**\n * Subscribe to incoming messages from the shared worker.\n * @returns unsubscribe function\n */\n on(listener: MessageListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Disconnect from the shared worker. The worker itself stays alive\n * as long as other tabs are connected.\n */\n disconnect(): void {\n this.listeners.clear();\n this.port.close();\n }\n\n /**\n * Check if SharedWorker is available in the current environment.\n */\n static isSupported(): boolean {\n return typeof SharedWorker !== 'undefined';\n }\n}\n","const CHANNEL_NAME = 'inferis:bus';\n\nconst KNOWN_MESSAGE_TYPES = new Set([\n 'leader-elected',\n 'leader-gone',\n 'request',\n 'response',\n 'stream-chunk',\n 'stream-end',\n 'stream-error',\n]);\n\nexport type TabChannelMessage\n = | { type: 'leader-elected'; tabId: string }\n | { type: 'leader-gone'; tabId: string }\n | { type: 'request'; tabId: string; reqId: string; payload: unknown }\n | { type: 'response'; reqId: string; payload: unknown; error?: { message: string; name: string } }\n | { type: 'stream-chunk'; reqId: string; chunk: unknown }\n | { type: 'stream-end'; reqId: string }\n | { type: 'stream-error'; reqId: string; error: { message: string; name: string } };\n\ntype TabChannelListener = (msg: TabChannelMessage) => void;\n\nfunction isValidMessage(data: unknown): data is TabChannelMessage {\n return (\n typeof data === 'object'\n && data !== null\n && 'type' in data\n && typeof (data as Record<string, unknown>).type === 'string'\n && KNOWN_MESSAGE_TYPES.has((data as Record<string, unknown>).type as string)\n );\n}\n\n/**\n * Thin wrapper over BroadcastChannel for cross-tab coordination.\n *\n * @remarks\n * BroadcastChannel has ~96% browser coverage and works on both desktop\n * and mobile. Messages are NOT delivered to the sender tab.\n */\nexport class TabChannel {\n private readonly channel: BroadcastChannel;\n private readonly listeners = new Set<TabChannelListener>();\n\n constructor() {\n this.channel = new BroadcastChannel(CHANNEL_NAME);\n this.channel.onmessage = (event: MessageEvent) => {\n if (!isValidMessage(event.data))\n return;\n for (const listener of this.listeners) {\n try {\n listener(event.data);\n }\n catch {\n // listeners must not throw\n }\n }\n };\n }\n\n /**\n * Broadcast a message to all other tabs.\n */\n send(msg: TabChannelMessage): void {\n this.channel.postMessage(msg);\n }\n\n /**\n * Subscribe to incoming messages.\n * @returns unsubscribe function\n */\n on(listener: TabChannelListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Close the channel and remove all listeners.\n */\n close(): void {\n this.listeners.clear();\n this.channel.close();\n }\n\n /**\n * Check if BroadcastChannel is available in the current environment.\n */\n static isSupported(): boolean {\n return typeof BroadcastChannel !== 'undefined';\n }\n}\n","/**\n * LRU-based memory budget tracker.\n *\n * Tracks approximate memory usage across loaded models.\n * When a new model load would exceed the configured budget,\n * evicts least-recently-used models to make room.\n */\nexport class MemoryBudget {\n private readonly maxMB: number;\n private usedMB: number = 0;\n private readonly lruOrder: string[] = [];\n private readonly modelSizes: Map<string, number> = new Map();\n\n constructor(maxMB: number) {\n if (maxMB <= 0)\n throw new RangeError('maxMB must be > 0');\n this.maxMB = maxMB;\n }\n\n /** Total memory budget in MB. */\n get totalMB(): number {\n return this.maxMB;\n }\n\n /** Currently allocated memory in MB. */\n get allocatedMB(): number {\n return this.usedMB;\n }\n\n /** Remaining available memory in MB. */\n get availableMB(): number {\n return this.maxMB - this.usedMB;\n }\n\n /**\n * Determine which model IDs must be evicted to fit `requiredMB`.\n * Does NOT perform the eviction itself — caller is responsible for\n * actually unloading the returned models before calling `allocate()`.\n *\n * @returns Array of model IDs to evict (LRU order), or null if\n * `requiredMB` exceeds the total budget (impossible to fit).\n */\n planEviction(requiredMB: number): string[] | null {\n if (requiredMB > this.maxMB)\n return null;\n if (requiredMB <= this.availableMB)\n return [];\n\n const toEvict: string[] = [];\n let freed = 0;\n\n for (const id of this.lruOrder) {\n if (freed >= requiredMB - this.availableMB)\n break;\n const size = this.modelSizes.get(id);\n if (size !== undefined) {\n toEvict.push(id);\n freed += size;\n }\n }\n\n return freed >= requiredMB - this.availableMB ? toEvict : null;\n }\n\n /**\n * Allocate memory for a model. Call after the model is loaded.\n * Updates LRU order.\n */\n allocate(modelId: string, memoryMB: number): void {\n if (this.modelSizes.has(modelId)) {\n this.release(modelId);\n }\n this.modelSizes.set(modelId, memoryMB);\n this.usedMB += memoryMB;\n this.touch(modelId);\n }\n\n /**\n * Release memory for a model. Call when model is unloaded.\n */\n release(modelId: string): void {\n const size = this.modelSizes.get(modelId);\n if (size === undefined)\n return;\n\n this.modelSizes.delete(modelId);\n this.usedMB = Math.max(0, this.usedMB - size);\n\n const idx = this.lruOrder.indexOf(modelId);\n if (idx !== -1)\n this.lruOrder.splice(idx, 1);\n }\n\n /**\n * Mark a model as recently used, moving it to the back of the LRU queue.\n */\n touch(modelId: string): void {\n const idx = this.lruOrder.indexOf(modelId);\n if (idx !== -1)\n this.lruOrder.splice(idx, 1);\n this.lruOrder.push(modelId);\n }\n\n /**\n * Check whether allocating `requiredMB` would stay within budget\n * (i.e., requires no evictions).\n */\n fits(requiredMB: number): boolean {\n return requiredMB <= this.availableMB;\n }\n\n /** Return LRU-ordered list of tracked model IDs (oldest first). */\n get lruList(): readonly string[] {\n return this.lruOrder;\n }\n}\n","import type { CapabilityReport, WasmCapability, WebGpuCapability } from './types.js';\n\nconst WASM_SIMD_PROBE = new Uint8Array([\n 0x00,\n 0x61,\n 0x73,\n 0x6D,\n 0x01,\n 0x00,\n 0x00,\n 0x00,\n 0x01,\n 0x05,\n 0x01,\n 0x60,\n 0x00,\n 0x01,\n 0x7B,\n 0x03,\n 0x02,\n 0x01,\n 0x00,\n 0x0A,\n 0x0A,\n 0x01,\n 0x08,\n 0x00,\n 0x41,\n 0x00,\n 0xFD,\n 0x0F,\n 0x00,\n 0x00,\n 0x0B,\n]);\n\nconst WASM_THREADS_PROBE = new Uint8Array([\n 0x00,\n 0x61,\n 0x73,\n 0x6D,\n 0x01,\n 0x00,\n 0x00,\n 0x00,\n 0x01,\n 0x04,\n 0x01,\n 0x60,\n 0x00,\n 0x00,\n 0x03,\n 0x02,\n 0x01,\n 0x00,\n 0x05,\n 0x04,\n 0x01,\n 0x03,\n 0x01,\n 0x01,\n 0x0A,\n 0x0B,\n 0x01,\n 0x09,\n 0x00,\n 0xFE,\n 0x01,\n 0x02,\n 0x00,\n 0x41,\n 0x00,\n 0x0B,\n]);\n\nfunction detectWasm(): WasmCapability {\n if (typeof WebAssembly === 'undefined') {\n return { simd: false, supported: false, threads: false };\n }\n return {\n simd: WebAssembly.validate(WASM_SIMD_PROBE),\n supported: true,\n threads: WebAssembly.validate(WASM_THREADS_PROBE),\n };\n}\n\nasync function detectWebGpu(): Promise<WebGpuCapability> {\n if (typeof navigator === 'undefined' || !('gpu' in navigator)) {\n return { adapter: null, isFallback: false, limits: null, supported: false };\n }\n\n // eslint-disable-next-line ts/no-explicit-any\n const gpu = (navigator as any).gpu;\n if (gpu == null) {\n return { adapter: null, isFallback: false, limits: null, supported: false };\n }\n\n try {\n const adapter = await gpu.requestAdapter();\n if (!adapter) {\n return { adapter: null, isFallback: false, limits: null, supported: false };\n }\n\n // eslint-disable-next-line ts/no-explicit-any\n const info = await adapter.requestAdapterInfo?.() as any ?? {};\n const isFallback: boolean = adapter.isFallbackAdapter ?? false;\n\n return {\n adapter: {\n architecture: (info.architecture as string) ?? '',\n description: (info.description as string) ?? '',\n device: (info.device as string) ?? '',\n vendor: (info.vendor as string) ?? '',\n },\n isFallback,\n limits: {\n maxBufferSize: adapter.limits?.maxBufferSize ?? 0,\n maxStorageBufferBindingSize: adapter.limits?.maxStorageBufferBindingSize ?? 0,\n },\n supported: true,\n };\n }\n catch {\n return { adapter: null, isFallback: false, limits: null, supported: false };\n }\n}\n\nfunction detectSharedWorker(): boolean {\n return typeof SharedWorker !== 'undefined';\n}\n\nfunction detectBroadcastChannel(): boolean {\n return typeof BroadcastChannel !== 'undefined';\n}\n\nfunction detectWebLocks(): boolean {\n return typeof navigator !== 'undefined' && 'locks' in navigator;\n}\n\nlet cachedReport: CapabilityReport | null = null;\n\n/**\n * Detect browser capabilities for AI inference.\n * Result is cached after first call.\n *\n * @example\n * const caps = await detectCapabilities();\n * if (caps.webgpu.supported) {\n * console.log('GPU vendor:', caps.webgpu.adapter?.vendor);\n * }\n */\nexport async function detectCapabilities(): Promise<CapabilityReport> {\n if (cachedReport)\n return cachedReport;\n\n const [webgpu, wasm] = await Promise.all([detectWebGpu(), Promise.resolve(detectWasm())]);\n\n cachedReport = Object.freeze({\n broadcastChannel: detectBroadcastChannel(),\n hardwareConcurrency: typeof navigator !== 'undefined' ? (navigator.hardwareConcurrency ?? 1) : 1,\n sharedWorker: detectSharedWorker(),\n wasm,\n webgpu,\n webLocks: detectWebLocks(),\n });\n\n return cachedReport;\n}\n\n/** Clear the cached capability report. Useful for testing. */\nexport function clearCapabilitiesCache(): void {\n cachedReport = null;\n}\n","import type { SerializedError } from './types.js';\n\nexport class InferisError extends Error {\n readonly code: string;\n\n constructor(message: string, code: string) {\n super(message);\n this.name = 'InferisError';\n this.code = code;\n }\n\n static fromSerialized(err: SerializedError): InferisError {\n const instance = new InferisError(err.message, err.code ?? 'UNKNOWN');\n instance.name = err.name;\n if (err.stack)\n instance.stack = err.stack;\n return instance;\n }\n\n serialize(): SerializedError {\n const result: SerializedError = {\n code: this.code,\n message: this.message,\n name: this.name,\n };\n if (this.stack !== undefined) {\n return { ...result, stack: this.stack };\n }\n return result;\n }\n}\n\nexport class ModelLoadError extends InferisError {\n readonly modelId: string;\n\n constructor(modelId: string, message: string) {\n super(message, 'MODEL_LOAD_ERROR');\n this.name = 'ModelLoadError';\n this.modelId = modelId;\n }\n}\n\nexport class ModelNotReadyError extends InferisError {\n readonly modelId: string;\n\n constructor(modelId: string, state: string) {\n super(`Model \"${modelId}\" is not ready (state: ${state})`, 'MODEL_NOT_READY');\n this.name = 'ModelNotReadyError';\n this.modelId = modelId;\n }\n}\n\nexport class ModelDisposedError extends InferisError {\n readonly modelId: string;\n\n constructor(modelId: string) {\n super(`Model \"${modelId}\" has been disposed`, 'MODEL_DISPOSED');\n this.name = 'ModelDisposedError';\n this.modelId = modelId;\n }\n}\n\nexport class InferenceError extends InferisError {\n readonly modelId: string;\n\n constructor(modelId: string, message: string) {\n super(message, 'INFERENCE_ERROR');\n this.name = 'InferenceError';\n this.modelId = modelId;\n }\n}\n\nexport class BudgetExceededError extends InferisError {\n readonly requestedMB: number;\n readonly budgetMB: number;\n\n constructor(requestedMB: number, budgetMB: number) {\n super(\n `Cannot load model: requested ${requestedMB}MB exceeds memory budget ${budgetMB}MB`,\n 'BUDGET_EXCEEDED',\n );\n this.name = 'BudgetExceededError';\n this.budgetMB = budgetMB;\n this.requestedMB = requestedMB;\n }\n}\n\nexport class TaskTimeoutError extends InferisError {\n readonly reqId: string;\n\n constructor(reqId: string, timeoutMs: number) {\n super(`Task \"${reqId}\" timed out after ${timeoutMs}ms`, 'TASK_TIMEOUT');\n this.name = 'TaskTimeoutError';\n this.reqId = reqId;\n }\n}\n\nexport class WorkerError extends InferisError {\n readonly workerId: number;\n\n constructor(workerId: number, message: string) {\n super(message, 'WORKER_ERROR');\n this.name = 'WorkerError';\n this.workerId = workerId;\n }\n}\n\nexport class DeviceLostError extends InferisError {\n readonly modelId: string;\n readonly reason: string;\n\n constructor(modelId: string, reason: string) {\n super(`GPU device lost for model \"${modelId}\": ${reason}`, 'DEVICE_LOST');\n this.name = 'DeviceLostError';\n this.modelId = modelId;\n this.reason = reason;\n }\n}\n\nexport class InvalidStateTransitionError extends InferisError {\n constructor(from: string, to: string) {\n super(`Invalid state transition: ${from} -> ${to}`, 'INVALID_STATE_TRANSITION');\n this.name = 'InvalidStateTransitionError';\n }\n}\n\n/** Serialize any error for postMessage transmission. */\nexport function serializeError(err: unknown): SerializedError {\n if (err instanceof InferisError)\n return err.serialize();\n if (err instanceof Error) {\n const base: SerializedError = { code: 'UNKNOWN', message: err.message, name: err.name };\n return err.stack !== undefined ? { ...base, stack: err.stack } : base;\n }\n return { code: 'UNKNOWN', message: String(err), name: 'Error' };\n}\n","import type { ModelState } from './types.js';\nimport { InvalidStateTransitionError } from './errors.js';\n\n/** Valid transitions: from -> Set<to> */\nconst TRANSITIONS: Readonly<Record<ModelState, ReadonlySet<ModelState>>> = {\n disposed: new Set<ModelState>(),\n error: new Set<ModelState>(['loading', 'disposed']),\n idle: new Set<ModelState>(['loading', 'disposed']),\n inferring: new Set<ModelState>(['inferring', 'ready', 'error', 'unloading']),\n loading: new Set<ModelState>(['ready', 'error', 'disposed']),\n ready: new Set<ModelState>(['inferring', 'unloading', 'error']),\n unloading: new Set<ModelState>(['disposed']),\n};\n\n/**\n * Validate and apply a lifecycle state transition.\n *\n * @throws {InvalidStateTransitionError} if the transition is not allowed.\n */\nexport function transition(from: ModelState, to: ModelState): ModelState {\n if (!TRANSITIONS[from].has(to)) {\n throw new InvalidStateTransitionError(from, to);\n }\n return to;\n}\n\n/**\n * Check if a state transition is valid without throwing.\n */\nexport function canTransition(from: ModelState, to: ModelState): boolean {\n return TRANSITIONS[from].has(to);\n}\n\n/**\n * Check if a model in the given state can accept inference tasks.\n */\nexport function isAcceptingInference(state: ModelState): boolean {\n return state === 'ready';\n}\n\n/**\n * Check if a model in the given state is considered terminal (no further transitions possible).\n */\nexport function isTerminal(state: ModelState): boolean {\n return state === 'disposed';\n}\n","import type { Device, ModelEntry, ModelState } from './types.js';\n\n/**\n * ModelRegistry tracks all model entries across workers.\n *\n * A model ID is composed of `task:modelName` to allow the same underlying\n * model to be used for different tasks without collision.\n */\nexport class ModelRegistry {\n private readonly models: Map<string, ModelEntry> = new Map();\n\n /**\n * Compose a canonical model ID from task and config.\n */\n static makeId(task: string, modelName: string): string {\n return `${task}:${modelName}`;\n }\n\n /**\n * Register a new model entry with IDLE state.\n */\n register(id: string, task: string, config: Record<string, unknown>): ModelEntry {\n if (this.models.has(id)) {\n return this.models.get(id)!;\n }\n\n const entry: ModelEntry = {\n config,\n device: 'wasm',\n id,\n memoryMB: 0,\n state: 'idle',\n stateListeners: new Set(),\n task,\n workerId: null,\n };\n this.models.set(id, entry);\n return entry;\n }\n\n /**\n * Get a model entry by ID.\n */\n get(id: string): ModelEntry | undefined {\n return this.models.get(id);\n }\n\n /**\n * Check if a model entry exists.\n */\n has(id: string): boolean {\n return this.models.has(id);\n }\n\n /**\n * Update the state of a model entry, notifying all subscribers.\n */\n setState(id: string, state: ModelState): void {\n const entry = this.models.get(id);\n if (!entry)\n return;\n\n entry.state = state;\n for (const listener of entry.stateListeners) {\n try {\n listener(state);\n }\n catch {\n // listeners must not throw\n }\n }\n }\n\n /**\n * Update the device, memory, and worker assignment after a successful load.\n */\n setLoaded(id: string, device: Device, memoryMB: number, workerId: number): void {\n const entry = this.models.get(id);\n if (!entry)\n return;\n\n entry.device = device;\n entry.memoryMB = memoryMB;\n entry.workerId = workerId;\n }\n\n /**\n * Clear the worker assignment on unload.\n */\n setUnloaded(id: string): void {\n const entry = this.models.get(id);\n if (!entry)\n return;\n\n entry.workerId = null;\n entry.memoryMB = 0;\n }\n\n /**\n * Add a state change listener to a model entry.\n * @returns unsubscribe function\n */\n subscribe(id: string, listener: (state: ModelState) => void): () => void {\n const entry = this.models.get(id);\n if (!entry)\n return () => {};\n\n entry.stateListeners.add(listener);\n return () => entry.stateListeners.delete(listener);\n }\n\n /**\n * Remove a model entry completely.\n */\n delete(id: string): void {\n const entry = this.models.get(id);\n if (entry) {\n entry.stateListeners.clear();\n this.models.delete(id);\n }\n }\n\n /**\n * Return all model entries in a given state.\n */\n byState(state: ModelState): ModelEntry[] {\n return [...this.models.values()].filter(e => e.state === state);\n }\n\n /**\n * Return all model entries assigned to a specific worker.\n */\n byWorker(workerId: number): ModelEntry[] {\n return [...this.models.values()].filter(e => e.workerId === workerId);\n }\n\n /** Number of registered model entries. */\n get size(): number {\n return this.models.size;\n }\n\n /** All model entries (read-only view for scheduling). */\n get entries(): ReadonlyMap<string, ModelEntry> {\n return this.models;\n }\n}\n","import type { ModelEntry, ScheduledTask, TaskPriority } from './types.js';\n\nconst PRIORITY_WEIGHT: Record<TaskPriority, number> = {\n high: 2,\n low: 0,\n normal: 1,\n};\n\n/**\n * Task scheduler with priority queue and model affinity.\n *\n * Model affinity: when dispatching a task, the scheduler prefers workers\n * that already have the required model loaded, avoiding redundant re-loads.\n */\nexport class Scheduler {\n private readonly queues: Map<TaskPriority, ScheduledTask[]> = new Map([\n ['high', []],\n ['low', []],\n ['normal', []],\n ]);\n\n private readonly workerLoad: Map<number, number> = new Map();\n private readonly workerModels: Map<number, Set<string>> = new Map();\n\n /**\n * Register a worker with the scheduler.\n */\n addWorker(workerId: number): void {\n this.workerLoad.set(workerId, 0);\n this.workerModels.set(workerId, new Set());\n }\n\n /**\n * Remove a worker from the scheduler.\n * Rejects any queued tasks targeting only this worker (affinity-pinned).\n */\n removeWorker(workerId: number): void {\n this.workerLoad.delete(workerId);\n this.workerModels.delete(workerId);\n }\n\n /**\n * Notify scheduler that a worker has loaded a model.\n * Used for affinity tracking.\n */\n notifyModelLoaded(workerId: number, modelId: string): void {\n this.workerModels.get(workerId)?.add(modelId);\n }\n\n /**\n * Notify scheduler that a worker has unloaded a model.\n */\n notifyModelUnloaded(workerId: number, modelId: string): void {\n this.workerModels.get(workerId)?.delete(modelId);\n }\n\n /**\n * Enqueue a task. It will be dispatched to the best available worker.\n * If all workers are busy, the task waits in the priority queue.\n */\n enqueue(task: ScheduledTask, _models?: ReadonlyMap<string, ModelEntry>): void {\n const workerId = this.pickWorker(task.modelId);\n if (workerId !== null) {\n this.dispatch(task, workerId);\n }\n else {\n this.queues.get(task.priority)!.push(task);\n }\n }\n\n /**\n * Notify scheduler that a worker has completed a task.\n * Dispatches the next queued task to the now-free worker, if any.\n */\n notifyTaskComplete(workerId: number, _models?: ReadonlyMap<string, ModelEntry>): void {\n const load = this.workerLoad.get(workerId);\n if (load !== undefined) {\n this.workerLoad.set(workerId, Math.max(0, load - 1));\n }\n this.drainNext(workerId);\n }\n\n /**\n * Attempt to dispatch the highest-priority queued task to a specific worker.\n */\n private drainNext(workerId: number): void {\n for (const priority of ['high', 'normal', 'low'] as TaskPriority[]) {\n const queue = this.queues.get(priority)!;\n if (queue.length === 0)\n continue;\n\n const idx = this.findAffinityTask(workerId, queue);\n const taskIdx = idx !== -1 ? idx : 0;\n const [task] = queue.splice(taskIdx, 1);\n this.dispatch(task, workerId);\n return;\n }\n }\n\n /**\n * Pick the best available worker for a given model.\n * Prefers workers with the model already loaded (affinity).\n * Falls back to the least-loaded worker.\n * Returns null if all workers are saturated (load >= concurrencyLimit).\n */\n pickWorker(\n modelId: string,\n concurrencyPerWorker = 4,\n ): number | null {\n let affinityWorker: number | null = null;\n let leastLoadedWorker: number | null = null;\n let leastLoad = Infinity;\n\n for (const [id, load] of this.workerLoad) {\n if (load >= concurrencyPerWorker)\n continue;\n\n if (this.workerModels.get(id)?.has(modelId)) {\n if (affinityWorker === null || load < (this.workerLoad.get(affinityWorker) ?? Infinity)) {\n affinityWorker = id;\n }\n }\n\n if (load < leastLoad) {\n leastLoad = load;\n leastLoadedWorker = id;\n }\n }\n\n return affinityWorker ?? leastLoadedWorker;\n }\n\n private dispatch(task: ScheduledTask, workerId: number): void {\n const load = this.workerLoad.get(workerId) ?? 0;\n this.workerLoad.set(workerId, load + 1);\n task.execute(workerId);\n }\n\n private findAffinityTask(workerId: number, queue: ScheduledTask[]): number {\n const models = this.workerModels.get(workerId);\n if (!models)\n return -1;\n return queue.findIndex(t => models.has(t.modelId));\n }\n\n /** Return current queue depth across all priorities. */\n get queueDepth(): number {\n let total = 0;\n for (const q of this.queues.values()) total += q.length;\n return total;\n }\n\n /** Return current load for a worker. */\n workerLoadFor(workerId: number): number {\n return this.workerLoad.get(workerId) ?? 0;\n }\n\n /** Return all registered worker IDs. */\n get workerIds(): number[] {\n return [...this.workerLoad.keys()];\n }\n\n /** Clear all worker state (called on pool termination). */\n reset(): void {\n this.workerLoad.clear();\n this.workerModels.clear();\n }\n\n /** Return the effective priority weight for sorting. */\n static priorityWeight(p: TaskPriority): number {\n return PRIORITY_WEIGHT[p];\n }\n}\n","import type {\n CapabilityReport,\n Device,\n LoadProgressEvent,\n ModelHandle,\n ModelLoadConfig,\n ModelState,\n PendingRequest,\n PoolConfig,\n TaskPriority,\n WorkerToMainMessage,\n} from './types.js';\nimport { MemoryBudget } from './budget.js';\nimport { detectCapabilities } from './capabilities.js';\nimport {\n BudgetExceededError,\n InferisError,\n ModelNotReadyError,\n TaskTimeoutError,\n} from './errors.js';\nimport { canTransition, isAcceptingInference, transition } from './lifecycle.js';\nimport { ModelRegistry } from './registry.js';\nimport { Scheduler } from './scheduler.js';\n\nconst DEFAULT_MAX_WORKERS = typeof navigator !== 'undefined'\n ? Math.max(1, (navigator.hardwareConcurrency ?? 2) - 1)\n : 1;\nconst DEFAULT_MAX_MEMORY_MB = 2048;\nconst DEFAULT_TASK_TIMEOUT_MS = 120_000;\n\nconst PRIORITY_ORDER: Record<TaskPriority, number> = { high: 0, low: 2, normal: 1 };\n\ninterface InferenceDeferred {\n enqueuedAt: number;\n onAbort: (() => void) | undefined;\n priority: TaskPriority;\n reject: (e: Error) => void;\n resolve: () => void;\n signal: AbortSignal | undefined;\n unsub: (() => void) | undefined;\n}\n\ninterface WorkerEntry {\n worker: Worker;\n id: number;\n}\n\n/**\n * WorkerPool — main orchestrator.\n *\n * Manages a pool of dedicated Web Workers, routes inference tasks,\n * tracks model lifecycle, and enforces memory budgets.\n *\n * @example\n * ```ts\n * const pool = await createPool({ adapter: transformersAdapter() });\n * const model = await pool.load('feature-extraction', { model: 'Xenova/...' });\n * const result = await model.run(['Hello world']);\n * await model.dispose();\n * await pool.terminate();\n * ```\n */\nexport class WorkerPool {\n private readonly workers: Map<number, WorkerEntry> = new Map();\n private readonly registry: ModelRegistry = new ModelRegistry();\n private readonly scheduler: Scheduler = new Scheduler();\n private readonly budget: MemoryBudget;\n private readonly inferenceWaiters: Map<string, InferenceDeferred[]> = new Map();\n private readonly pending: Map<string, PendingRequest> = new Map();\n private readonly config: Required<PoolConfig>;\n private readonly caps: CapabilityReport;\n private readonly resolvedDevice: Device;\n private nextWorkerId = 0;\n private nextReqId = 0;\n private terminated = false;\n\n private constructor(config: Required<PoolConfig>, caps: CapabilityReport) {\n this.config = config;\n this.caps = caps;\n this.budget = new MemoryBudget(config.maxMemoryMB);\n this.resolvedDevice = this.resolveDevice(config.defaultDevice, caps);\n }\n\n /**\n * Create and initialize a WorkerPool.\n * Spawns `maxWorkers` dedicated workers and detects browser capabilities.\n */\n static async create(config: PoolConfig): Promise<WorkerPool> {\n const caps = await detectCapabilities();\n const full: Required<PoolConfig> = {\n adapter: config.adapter,\n crossTab: config.crossTab ?? false,\n defaultDevice: config.defaultDevice ?? 'auto',\n maxMemoryMB: config.maxMemoryMB ?? DEFAULT_MAX_MEMORY_MB,\n maxWorkers: config.maxWorkers ?? DEFAULT_MAX_WORKERS,\n taskTimeout: config.taskTimeout ?? DEFAULT_TASK_TIMEOUT_MS,\n workerUrl: config.workerUrl ?? new URL('./worker/dedicated.worker.js', import.meta.url),\n };\n\n const pool = new WorkerPool(full, caps);\n await pool.spawnWorkers();\n return pool;\n }\n\n private async spawnWorkers(): Promise<void> {\n for (let i = 0; i < this.config.maxWorkers; i++) {\n await this.spawnWorker();\n }\n }\n\n private async spawnWorker(): Promise<WorkerEntry> {\n const id = this.nextWorkerId++;\n const worker = new Worker(this.config.workerUrl, { type: 'module' });\n\n worker.onmessage = (event: MessageEvent<WorkerToMainMessage>) => {\n this.handleWorkerMessage(id, event.data);\n };\n\n worker.onerror = (event) => {\n console.error(`[inferis] Worker ${id} error:`, event.message);\n this.handleWorkerCrash(id);\n };\n\n const entry: WorkerEntry = { id, worker };\n this.workers.set(id, entry);\n this.scheduler.addWorker(id);\n\n worker.postMessage({ device: this.resolvedDevice, type: '__init__' });\n\n return entry;\n }\n\n private handleWorkerMessage(workerId: number, msg: WorkerToMainMessage): void {\n switch (msg.type) {\n case 'load-progress': {\n const modelId = this.reqIdToModelId.get(msg.reqId);\n if (modelId) {\n const entry = this.registry.get(modelId);\n if (entry?.config.onProgress) {\n (entry.config.onProgress as (e: LoadProgressEvent) => void)(msg.progress);\n }\n }\n break;\n }\n case 'load-complete': {\n const modelId = this.reqIdToModelId.get(msg.reqId);\n if (modelId) {\n const entry = this.registry.get(modelId);\n if (entry) {\n this.registry.setLoaded(modelId, this.resolvedDevice, msg.memoryMB, workerId);\n this.budget.allocate(modelId, msg.memoryMB);\n this.scheduler.notifyModelLoaded(workerId, modelId);\n this.registry.setState(modelId, transition(entry.state, 'ready'));\n }\n this.reqIdToModelId.delete(msg.reqId);\n }\n const req = this.pending.get(msg.reqId);\n if (req) {\n this.clearPendingTimeout(msg.reqId);\n this.pending.delete(msg.reqId);\n req.resolve(undefined);\n }\n this.scheduler.notifyTaskComplete(workerId);\n break;\n }\n case 'load-error': {\n if (msg.reqId === '__init__') {\n console.error('[inferis] Worker init failed:', msg.error);\n break;\n }\n const modelId = this.reqIdToModelId.get(msg.reqId);\n if (modelId) {\n const entry = this.registry.get(modelId);\n if (entry)\n this.registry.setState(modelId, transition(entry.state, 'error'));\n this.reqIdToModelId.delete(msg.reqId);\n }\n const req = this.pending.get(msg.reqId);\n if (req) {\n this.clearPendingTimeout(msg.reqId);\n this.pending.delete(msg.reqId);\n req.reject(InferisError.fromSerialized(msg.error));\n }\n this.scheduler.notifyTaskComplete(workerId);\n break;\n }\n case 'unload-complete': {\n const modelId = this.reqIdToModelId.get(msg.reqId);\n if (modelId) {\n this.budget.release(modelId);\n this.scheduler.notifyModelUnloaded(workerId, modelId);\n this.registry.setUnloaded(modelId);\n this.registry.setState(modelId, 'disposed');\n this.registry.delete(modelId);\n this.reqIdToModelId.delete(msg.reqId);\n }\n const req = this.pending.get(msg.reqId);\n if (req) {\n this.clearPendingTimeout(msg.reqId);\n this.pending.delete(msg.reqId);\n req.resolve(undefined);\n }\n break;\n }\n case 'unload-error': {\n const modelId = this.reqIdToModelId.get(msg.reqId);\n if (modelId) {\n this.budget.release(modelId);\n this.scheduler.notifyModelUnloaded(workerId, modelId);\n this.registry.setUnloaded(modelId);\n this.registry.setState(modelId, 'error');\n this.registry.delete(modelId);\n this.reqIdToModelId.delete(msg.reqId);\n }\n const req = this.pending.get(msg.reqId);\n if (req) {\n this.clearPendingTimeout(msg.reqId);\n this.pending.delete(msg.reqId);\n req.reject(InferisError.fromSerialized(msg.error));\n }\n break;\n }\n case 'run-result': {\n const req = this.pending.get(msg.reqId);\n if (req) {\n this.clearPendingTimeout(msg.reqId);\n this.pending.delete(msg.reqId);\n req.resolve(msg.output);\n }\n const modelId = this.reqIdToModelId.get(msg.reqId);\n if (modelId) {\n const entry = this.registry.get(modelId);\n if (entry && entry.state === 'inferring') {\n this.registry.setState(modelId, transition(entry.state, 'ready'));\n }\n this.reqIdToModelId.delete(msg.reqId);\n }\n this.scheduler.notifyTaskComplete(workerId);\n if (modelId)\n this.drainInferenceWaiter(modelId);\n break;\n }\n case 'run-error': {\n const req = this.pending.get(msg.reqId);\n if (req) {\n this.clearPendingTimeout(msg.reqId);\n this.pending.delete(msg.reqId);\n req.reject(InferisError.fromSerialized(msg.error));\n }\n const modelId = this.reqIdToModelId.get(msg.reqId);\n if (modelId) {\n const entry = this.registry.get(modelId);\n if (entry && entry.state === 'inferring') {\n this.registry.setState(modelId, transition(entry.state, 'ready'));\n }\n this.reqIdToModelId.delete(msg.reqId);\n }\n this.scheduler.notifyTaskComplete(workerId);\n if (modelId)\n this.drainInferenceWaiter(modelId);\n break;\n }\n case 'stream-chunk': {\n const req = this.pending.get(msg.reqId);\n req?.streamController?.enqueue(msg.chunk);\n break;\n }\n case 'stream-end': {\n const req = this.pending.get(msg.reqId);\n if (req) {\n this.clearPendingTimeout(msg.reqId);\n this.pending.delete(msg.reqId);\n req.streamController?.close();\n }\n const modelId = this.reqIdToModelId.get(msg.reqId);\n if (modelId) {\n const entry = this.registry.get(modelId);\n if (entry && entry.state === 'inferring') {\n this.registry.setState(modelId, transition(entry.state, 'ready'));\n }\n this.reqIdToModelId.delete(msg.reqId);\n }\n this.scheduler.notifyTaskComplete(workerId);\n if (modelId)\n this.drainInferenceWaiter(modelId);\n break;\n }\n case 'stream-error': {\n const req = this.pending.get(msg.reqId);\n if (req) {\n this.clearPendingTimeout(msg.reqId);\n this.pending.delete(msg.reqId);\n req.streamController?.error(InferisError.fromSerialized(msg.error));\n }\n const modelId = this.reqIdToModelId.get(msg.reqId);\n if (modelId) {\n const entry = this.registry.get(modelId);\n if (entry && entry.state === 'inferring') {\n this.registry.setState(modelId, transition(entry.state, 'ready'));\n }\n this.reqIdToModelId.delete(msg.reqId);\n }\n this.scheduler.notifyTaskComplete(workerId);\n if (modelId)\n this.drainInferenceWaiter(modelId);\n break;\n }\n case 'device-lost': {\n const entry = this.registry.get(msg.modelId);\n if (entry && canTransition(entry.state, 'error')) {\n this.registry.setState(msg.modelId, 'error');\n }\n break;\n }\n }\n }\n\n private readonly reqIdToModelId = new Map<string, string>();\n\n /**\n * Load a model. If already loaded with the same config, returns existing handle.\n * Performs memory budget check and eviction before loading.\n */\n async load<TOutput = unknown>(\n task: string,\n config: ModelLoadConfig,\n ): Promise<ModelHandle<TOutput>> {\n if (this.terminated)\n throw new InferisError('Pool has been terminated', 'POOL_TERMINATED');\n\n const modelId = ModelRegistry.makeId(task, config.model);\n\n // Return existing handle if model is already usable\n const existing = this.registry.get(modelId);\n if (existing) {\n const s = existing.state;\n if (s === 'ready' || s === 'loading' || s === 'inferring') {\n return this.makeHandle<TOutput>(modelId);\n }\n }\n\n // Estimate memory and check budget\n const adapter = this.config.adapter;\n let estimatedMB = config.estimatedMemoryMB ?? 100;\n if (!config.estimatedMemoryMB) {\n const tempAdapter = await adapter.create().catch(() => null);\n try {\n estimatedMB = tempAdapter?.estimateMemoryMB(task, config as Record<string, unknown>) ?? 100;\n }\n finally {\n await tempAdapter?.unload({ instance: null, memoryMB: 0 }).catch(() => {});\n }\n }\n\n const toEvict = this.budget.planEviction(estimatedMB);\n if (toEvict === null) {\n throw new BudgetExceededError(estimatedMB, this.config.maxMemoryMB);\n }\n\n // Evict LRU models to make room\n for (const evictId of toEvict) {\n await this.disposeModel(evictId);\n }\n\n // Register model entry\n this.registry.register(modelId, task, config as Record<string, unknown>);\n this.registry.setState(modelId, transition('idle', 'loading'));\n\n // Enqueue load task\n await new Promise<void>((resolve, reject) => {\n const reqId = `${this.nextReqId++}`;\n this.reqIdToModelId.set(reqId, modelId);\n\n this.pending.set(reqId, { reject, resolve: resolve as (v: unknown) => void });\n this.setRequestTimeout(reqId, this.config.taskTimeout);\n\n this.scheduler.enqueue(\n {\n enqueuedAt: Date.now(),\n execute: (workerId: number): void => {\n const workerEntry = this.workers.get(workerId);\n if (!workerEntry) {\n reject(new InferisError('Worker not found', 'WORKER_NOT_FOUND'));\n return;\n }\n try {\n const { estimatedMemoryMB: _estMem, onProgress: _onProgress, ...workerConfig } = config;\n workerEntry.worker.postMessage({\n config: workerConfig as Record<string, unknown>,\n device: this.resolvedDevice,\n modelId,\n reqId,\n task,\n type: 'load-model',\n });\n }\n catch {\n this.clearPendingTimeout(reqId);\n this.pending.delete(reqId);\n this.reqIdToModelId.delete(reqId);\n reject(new InferisError('Input cannot be serialized for worker transfer', 'SERIALIZATION_ERROR'));\n }\n },\n modelId,\n priority: 'high',\n reject,\n reqId,\n },\n this.registry.entries,\n );\n });\n\n return this.makeHandle<TOutput>(modelId);\n }\n\n private async disposeModel(modelId: string): Promise<void> {\n const entry = this.registry.get(modelId);\n if (!entry || entry.state === 'disposed')\n return;\n\n if (!canTransition(entry.state, 'unloading'))\n return;\n\n this.registry.setState(modelId, 'unloading');\n\n if (entry.workerId === null) {\n this.budget.release(modelId);\n this.registry.delete(modelId);\n return;\n }\n\n const workerEntry = this.workers.get(entry.workerId);\n if (!workerEntry) {\n this.budget.release(modelId);\n this.registry.delete(modelId);\n return;\n }\n\n const reqId = `${this.nextReqId++}`;\n this.reqIdToModelId.set(reqId, modelId);\n\n await new Promise<void>((resolve, reject) => {\n this.pending.set(reqId, { reject, resolve: resolve as (v: unknown) => void });\n this.setRequestTimeout(reqId, 10_000);\n try {\n workerEntry.worker.postMessage({ modelId, reqId, type: 'unload-model' });\n }\n catch {\n this.clearPendingTimeout(reqId);\n this.pending.delete(reqId);\n this.reqIdToModelId.delete(reqId);\n reject(new InferisError('Input cannot be serialized for worker transfer', 'SERIALIZATION_ERROR'));\n }\n });\n }\n\n private makeHandle<TOutput>(modelId: string): ModelHandle<TOutput> {\n const registry = this.registry;\n const dispose = this.disposeModel.bind(this);\n const runInference = this.runInference.bind(this);\n const streamInference = this.streamInference.bind(this);\n\n return {\n get device() {\n return registry.get(modelId)?.device ?? 'wasm';\n },\n get id() {\n return modelId;\n },\n get memoryMB() {\n return registry.get(modelId)?.memoryMB ?? 0;\n },\n get state() {\n return registry.get(modelId)?.state ?? 'disposed';\n },\n\n dispose: () => dispose(modelId),\n\n onStateChange(callback: (state: ModelState) => void): () => void {\n return registry.subscribe(modelId, callback);\n },\n\n run(input: unknown, options?) {\n return runInference<TOutput>(modelId, input, options);\n },\n\n stream(input: unknown, options?) {\n return streamInference<TOutput>(modelId, input, options);\n },\n };\n }\n\n /**\n * Waits until the model transitions to `ready`, or rejects if it reaches a\n * terminal/non-recoverable state (error, disposed, unloading).\n * Respects the provided AbortSignal.\n *\n * When the model is `inferring`, uses a priority queue so that higher-priority\n * callers are unblocked before lower-priority ones.\n * When the model is `loading`, falls back to a plain state subscription.\n */\n private waitForReady(modelId: string, priority: TaskPriority, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(Object.assign(new Error('AbortError'), { name: 'AbortError' }));\n return;\n }\n\n const currentState = this.registry.get(modelId)?.state;\n\n if (currentState === 'loading') {\n const onLoadAbort = (): void => {\n // eslint-disable-next-line ts/no-use-before-define\n unsub();\n reject(Object.assign(new Error('AbortError'), { name: 'AbortError' }));\n };\n const unsub = this.registry.subscribe(modelId, (state) => {\n if (state === 'ready') {\n unsub();\n signal?.removeEventListener('abort', onLoadAbort);\n resolve();\n }\n else if (state !== 'inferring' && state !== 'loading') {\n unsub();\n signal?.removeEventListener('abort', onLoadAbort);\n reject(new ModelNotReadyError(modelId, state));\n }\n });\n signal?.addEventListener('abort', onLoadAbort, { once: true });\n return;\n }\n\n const deferred: InferenceDeferred = {\n enqueuedAt: Date.now(),\n onAbort: undefined,\n priority,\n reject,\n resolve,\n signal,\n unsub: undefined,\n };\n\n const queue = this.inferenceWaiters.get(modelId) ?? [];\n queue.push(deferred);\n queue.sort(\n (a, b) => PRIORITY_ORDER[a.priority] - PRIORITY_ORDER[b.priority] || a.enqueuedAt - b.enqueuedAt,\n );\n this.inferenceWaiters.set(modelId, queue);\n\n const unsub = this.registry.subscribe(modelId, (state) => {\n if (state !== 'inferring' && state !== 'loading' && state !== 'ready') {\n deferred.unsub = undefined;\n const q = this.inferenceWaiters.get(modelId);\n if (q) {\n const idx = q.indexOf(deferred);\n if (idx >= 0)\n q.splice(idx, 1);\n }\n unsub();\n if (deferred.signal && deferred.onAbort) {\n deferred.signal.removeEventListener('abort', deferred.onAbort);\n }\n reject(new ModelNotReadyError(modelId, state));\n }\n });\n deferred.unsub = unsub;\n\n if (signal) {\n const onAbort = (): void => {\n const q = this.inferenceWaiters.get(modelId);\n if (q) {\n const idx = q.indexOf(deferred);\n if (idx >= 0)\n q.splice(idx, 1);\n }\n deferred.unsub?.();\n deferred.unsub = undefined;\n reject(Object.assign(new Error('AbortError'), { name: 'AbortError' }));\n };\n deferred.onAbort = onAbort;\n signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n }\n\n /**\n * Unblocks the highest-priority waiter queued for the given model.\n * Called after a model transitions back to `ready`.\n */\n private drainInferenceWaiter(modelId: string): void {\n const queue = this.inferenceWaiters.get(modelId);\n if (!queue || queue.length === 0)\n return;\n\n const [deferred] = queue.splice(0, 1);\n deferred.unsub?.();\n if (deferred.signal && deferred.onAbort) {\n deferred.signal.removeEventListener('abort', deferred.onAbort);\n }\n deferred.resolve();\n }\n\n private async runInference<TOutput>(\n modelId: string,\n input: unknown,\n options?: { signal?: AbortSignal; priority?: 'high' | 'normal' | 'low' },\n ): Promise<TOutput> {\n if (!this.registry.get(modelId))\n throw new InferisError(`Model \"${modelId}\" not found`, 'MODEL_NOT_FOUND');\n\n while (!isAcceptingInference(this.registry.get(modelId)!.state)) {\n const state = this.registry.get(modelId)!.state;\n if (state === 'inferring' || state === 'loading') {\n await this.waitForReady(modelId, options?.priority ?? 'normal', options?.signal);\n }\n else {\n throw new ModelNotReadyError(modelId, state);\n }\n }\n\n if (options?.signal?.aborted) {\n throw Object.assign(new Error('AbortError'), { name: 'AbortError' });\n }\n\n const entry = this.registry.get(modelId)!;\n this.registry.setState(modelId, transition(entry.state, 'inferring'));\n this.budget.touch(modelId);\n\n return new Promise<TOutput>((resolve, reject) => {\n const reqId = `${this.nextReqId++}`;\n this.reqIdToModelId.set(reqId, modelId);\n\n const onAbort = (): void => {\n const workerEntry = entry.workerId !== null ? this.workers.get(entry.workerId) : undefined;\n workerEntry?.worker.postMessage({ reqId, type: 'abort' });\n };\n\n options?.signal?.addEventListener('abort', onAbort, { once: true });\n\n this.pending.set(reqId, {\n onAbort,\n reject: (err) => {\n options?.signal?.removeEventListener('abort', onAbort);\n reject(err);\n },\n resolve: (val) => {\n options?.signal?.removeEventListener('abort', onAbort);\n resolve(val as TOutput);\n },\n signal: options?.signal,\n });\n\n this.setRequestTimeout(reqId, this.config.taskTimeout);\n\n this.scheduler.enqueue(\n {\n enqueuedAt: Date.now(),\n execute: (workerId: number): void => {\n const w = this.workers.get(workerId);\n if (!w)\n return;\n try {\n const { priority: _p, signal: _s, ...workerOptions } = options ?? {};\n w.worker.postMessage({ input, modelId, options: workerOptions, reqId, type: 'run' });\n }\n catch {\n this.clearPendingTimeout(reqId);\n this.pending.delete(reqId);\n this.reqIdToModelId.delete(reqId);\n options?.signal?.removeEventListener('abort', onAbort);\n reject(new InferisError('Input cannot be serialized for worker transfer', 'SERIALIZATION_ERROR'));\n }\n },\n modelId,\n priority: options?.priority ?? 'normal',\n reject: (err: Error): void => {\n options?.signal?.removeEventListener('abort', onAbort);\n reject(err);\n },\n reqId,\n },\n this.registry.entries,\n );\n });\n }\n\n private streamInference<TOutput>(\n modelId: string,\n input: unknown,\n options?: { signal?: AbortSignal; priority?: 'high' | 'normal' | 'low' },\n ): ReadableStream<TOutput> {\n if (!this.registry.get(modelId)) {\n return new ReadableStream({\n start(c) { c.error(new InferisError(`Model \"${modelId}\" not found`, 'MODEL_NOT_FOUND')); },\n });\n }\n\n let reqId = '';\n\n return new ReadableStream<TOutput>({\n start: async (controller) => {\n while (!isAcceptingInference(this.registry.get(modelId)!.state)) {\n const state = this.registry.get(modelId)!.state;\n if (state === 'inferring' || state === 'loading') {\n try {\n await this.waitForReady(modelId, options?.priority ?? 'normal', options?.signal);\n }\n catch (err) {\n controller.error(err);\n return;\n }\n }\n else {\n controller.error(new ModelNotReadyError(modelId, state));\n return;\n }\n }\n\n const entry = this.registry.get(modelId)!;\n this.registry.setState(modelId, transition(entry.state, 'inferring'));\n this.budget.touch(modelId);\n\n reqId = `${this.nextReqId++}`;\n this.reqIdToModelId.set(reqId, modelId);\n\n const onAbort = (): void => {\n const e = this.registry.get(modelId);\n const workerEntry = e?.workerId != null ? this.workers.get(e.workerId) : undefined;\n workerEntry?.worker.postMessage({ reqId, type: 'abort' });\n };\n\n options?.signal?.addEventListener('abort', onAbort, { once: true });\n\n this.pending.set(reqId, {\n onAbort,\n reject: (err) => {\n options?.signal?.removeEventListener('abort', onAbort);\n controller.error(err);\n },\n resolve: () => {},\n signal: options?.signal,\n streamController: controller as ReadableStreamDefaultController<unknown>,\n });\n\n this.setRequestTimeout(reqId, this.config.taskTimeout);\n\n this.scheduler.enqueue(\n {\n enqueuedAt: Date.now(),\n execute: (workerId: number): void => {\n const w = this.workers.get(workerId);\n if (!w)\n return;\n try {\n const { priority: _p, signal: _s, ...workerOptions } = options ?? {};\n w.worker.postMessage({ input, modelId, options: workerOptions, reqId, type: 'run-stream' });\n }\n catch {\n this.clearPendingTimeout(reqId);\n this.pending.delete(reqId);\n this.reqIdToModelId.delete(reqId);\n options?.signal?.removeEventListener('abort', onAbort);\n controller.error(new InferisError('Input cannot be serialized for worker transfer', 'SERIALIZATION_ERROR'));\n }\n },\n modelId,\n priority: options?.priority ?? 'normal',\n reject: (err: Error): void => {\n options?.signal?.removeEventListener('abort', onAbort);\n controller.error(err);\n },\n reqId,\n },\n this.registry.entries,\n );\n },\n cancel: () => {\n if (!reqId)\n return;\n const e = this.registry.get(modelId);\n const workerEntry = e?.workerId != null ? this.workers.get(e.workerId) : undefined;\n workerEntry?.worker.postMessage({ reqId, type: 'abort' });\n\n const req = this.pending.get(reqId);\n if (req) {\n if (req.signal && req.onAbort) {\n req.signal.removeEventListener('abort', req.onAbort);\n }\n try {\n req.streamController?.close();\n }\n catch { /* already closed */ }\n this.clearPendingTimeout(reqId);\n this.pending.delete(reqId);\n this.reqIdToModelId.delete(reqId);\n }\n },\n });\n }\n\n private setRequestTimeout(reqId: string, ms: number): void {\n const id = setTimeout(() => {\n const req = this.pending.get(reqId);\n if (req) {\n if (req.signal && req.onAbort) {\n req.signal.removeEventListener('abort', req.onAbort);\n }\n this.pending.delete(reqId);\n this.reqIdToModelId.delete(reqId);\n req.reject(new TaskTimeoutError(reqId, ms));\n }\n }, ms);\n\n const req = this.pending.get(reqId);\n if (req)\n req.timeoutId = id;\n }\n\n private clearPendingTimeout(reqId: string): void {\n const req = this.pending.get(reqId);\n if (req?.timeoutId !== undefined) {\n clearTimeout(req.timeoutId);\n }\n }\n\n private handleWorkerCrash(workerId: number): void {\n this.scheduler.removeWorker(workerId);\n this.workers.delete(workerId);\n\n const crashedModelIds = new Set<string>();\n\n for (const entry of this.registry.byWorker(workerId)) {\n if (canTransition(entry.state, 'error')) {\n this.registry.setState(entry.id, 'error');\n }\n crashedModelIds.add(entry.id);\n }\n\n for (const [reqId, req] of this.pending) {\n const modelId = this.reqIdToModelId.get(reqId);\n if (modelId && crashedModelIds.has(modelId)) {\n this.clearPendingTimeout(reqId);\n if (req.signal && req.onAbort) {\n req.signal.removeEventListener('abort', req.onAbort);\n }\n this.pending.delete(reqId);\n this.reqIdToModelId.delete(reqId);\n req.reject(new InferisError('Worker crashed', 'WORKER_CRASHED'));\n }\n }\n }\n\n /**\n * Gracefully terminate all workers and dispose all models.\n */\n async terminate(): Promise<void> {\n this.terminated = true;\n\n // Reject all pending requests\n for (const [reqId, req] of this.pending) {\n clearTimeout(req.timeoutId);\n req.reject(new InferisError('Pool terminated', 'POOL_TERMINATED'));\n this.pending.delete(reqId);\n this.reqIdToModelId.delete(reqId);\n }\n\n for (const entry of this.workers.values()) {\n entry.worker.terminate();\n }\n\n this.workers.clear();\n this.scheduler.reset();\n }\n\n /**\n * Return snapshot of detected browser capabilities.\n */\n capabilities(): CapabilityReport {\n return this.caps;\n }\n\n private resolveDevice(defaultDevice: Device | 'auto', caps: CapabilityReport): Device {\n if (defaultDevice === 'auto') {\n return caps.webgpu.supported && !caps.webgpu.isFallback ? 'webgpu' : 'wasm';\n }\n return defaultDevice;\n }\n\n /** @internal */\n get _registry(): ModelRegistry { return this.registry; }\n /** @internal */\n get _budget(): MemoryBudget { return this.budget; }\n /** @internal */\n get _scheduler(): Scheduler { return this.scheduler; }\n}\n\n/**\n * Create and initialize a WorkerPool.\n *\n * @example\n * ```ts\n * import { createPool } from 'inferis-ml';\n * import { transformersAdapter } from 'inferis-ml/adapters/transformers';\n *\n * const pool = await createPool({ adapter: transformersAdapter() });\n * ```\n */\nexport async function createPool(config: PoolConfig): Promise<WorkerPool> {\n return WorkerPool.create(config);\n}\n","import type { LoadProgressEvent } from '../core/types.js';\n\ntype ProgressListener = (event: LoadProgressEvent) => void;\n\n/**\n * Simple progress event emitter for model load operations.\n * Wraps the raw progress callback into a subscribable interface.\n */\nexport class ProgressEmitter {\n private readonly listeners = new Set<ProgressListener>();\n\n /**\n * Subscribe to progress events.\n * @returns unsubscribe function\n */\n on(listener: ProgressListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Emit a progress event to all subscribers.\n */\n emit(event: LoadProgressEvent): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n }\n catch {\n // listeners must not throw\n }\n }\n }\n\n /** Remove all listeners. */\n clear(): void {\n this.listeners.clear();\n }\n\n /** Number of active listeners. */\n get listenerCount(): number {\n return this.listeners.size;\n }\n}\n","/**\n * Async iterator adapter for ReadableStream.\n *\n * Allows `for await (const token of stream)` syntax when the runtime\n * does not natively support ReadableStream async iteration.\n *\n * @example\n * ```ts\n * const stream = model.stream({ messages: [...] });\n * for await (const token of readableToAsyncIter(stream)) {\n * process.stdout.write(token);\n * }\n * ```\n */\nexport function readableToAsyncIter<T>(stream: ReadableStream<T>): AsyncIterable<T> {\n if (Symbol.asyncIterator in stream) {\n return stream as unknown as AsyncIterable<T>;\n }\n\n return {\n [Symbol.asyncIterator](): AsyncIterator<T> {\n const reader = stream.getReader();\n return {\n async next() {\n const { done, value } = await reader.read();\n if (done)\n return { done: true, value: undefined as unknown as T };\n return { done: false, value };\n },\n async return() {\n await reader.cancel();\n return { done: true, value: undefined as unknown as T };\n },\n async throw(err) {\n await reader.cancel(err);\n throw err;\n },\n };\n },\n };\n}\n\n/**\n * Collect all chunks from a ReadableStream into an array.\n * Useful for non-streaming consumers.\n */\nexport async function collectStream<T>(stream: ReadableStream<T>): Promise<T[]> {\n const results: T[] = [];\n for await (const chunk of readableToAsyncIter(stream)) {\n results.push(chunk);\n }\n return results;\n}\n\n/**\n * Collect all chunks from a ReadableStream and join them as a string.\n */\nexport async function collectStreamText(stream: ReadableStream<string>): Promise<string> {\n const chunks = await collectStream(stream);\n return chunks.join('');\n}\n"]}
|