@meframe/core 0.0.43 → 0.0.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/cache/CacheManager.d.ts +0 -1
  2. package/dist/cache/CacheManager.d.ts.map +1 -1
  3. package/dist/cache/CacheManager.js +1 -2
  4. package/dist/cache/CacheManager.js.map +1 -1
  5. package/dist/cache/storage/opfs/OPFSManager.d.ts +7 -3
  6. package/dist/cache/storage/opfs/OPFSManager.d.ts.map +1 -1
  7. package/dist/cache/storage/opfs/OPFSManager.js +32 -11
  8. package/dist/cache/storage/opfs/OPFSManager.js.map +1 -1
  9. package/dist/config/defaults.d.ts.map +1 -1
  10. package/dist/config/defaults.js +1 -6
  11. package/dist/config/defaults.js.map +1 -1
  12. package/dist/config/types.d.ts +2 -8
  13. package/dist/config/types.d.ts.map +1 -1
  14. package/dist/orchestrator/ExportScheduler.d.ts +1 -0
  15. package/dist/orchestrator/ExportScheduler.d.ts.map +1 -1
  16. package/dist/orchestrator/ExportScheduler.js +11 -9
  17. package/dist/orchestrator/ExportScheduler.js.map +1 -1
  18. package/dist/orchestrator/OnDemandVideoSession.d.ts +5 -0
  19. package/dist/orchestrator/OnDemandVideoSession.d.ts.map +1 -1
  20. package/dist/orchestrator/OnDemandVideoSession.js +78 -0
  21. package/dist/orchestrator/OnDemandVideoSession.js.map +1 -1
  22. package/dist/orchestrator/Orchestrator.d.ts.map +1 -1
  23. package/dist/orchestrator/Orchestrator.js +5 -6
  24. package/dist/orchestrator/Orchestrator.js.map +1 -1
  25. package/dist/orchestrator/VideoClipSession.d.ts +8 -9
  26. package/dist/orchestrator/VideoClipSession.d.ts.map +1 -1
  27. package/dist/orchestrator/VideoClipSession.js +87 -177
  28. package/dist/orchestrator/VideoClipSession.js.map +1 -1
  29. package/dist/stages/compose/LayerRenderer.d.ts +9 -0
  30. package/dist/stages/compose/LayerRenderer.d.ts.map +1 -1
  31. package/dist/stages/compose/LayerRenderer.js +41 -35
  32. package/dist/stages/compose/LayerRenderer.js.map +1 -1
  33. package/dist/stages/compose/font-system/font-templates.js +1 -1
  34. package/dist/stages/compose/font-system/font-templates.js.map +1 -1
  35. package/dist/stages/load/ResourceLoader.d.ts +5 -4
  36. package/dist/stages/load/ResourceLoader.d.ts.map +1 -1
  37. package/dist/stages/load/ResourceLoader.js +14 -59
  38. package/dist/stages/load/ResourceLoader.js.map +1 -1
  39. package/dist/worker/WorkerChannel.d.ts.map +1 -1
  40. package/dist/worker/WorkerChannel.js +11 -2
  41. package/dist/worker/WorkerChannel.js.map +1 -1
  42. package/dist/worker/WorkerPool.d.ts.map +1 -1
  43. package/dist/worker/WorkerPool.js +5 -2
  44. package/dist/worker/WorkerPool.js.map +1 -1
  45. package/dist/worker/transferable-helper.js +22 -0
  46. package/dist/worker/transferable-helper.js.map +1 -1
  47. package/dist/worker/types.d.ts +1 -1
  48. package/dist/worker/types.d.ts.map +1 -1
  49. package/dist/worker/types.js.map +1 -1
  50. package/dist/workers/{WorkerChannel.CE5euh3R.js → WorkerChannel.DjBEVvEA.js} +31 -2
  51. package/dist/workers/WorkerChannel.DjBEVvEA.js.map +1 -0
  52. package/dist/workers/stages/compose/{audio-compose.worker.rW63uN6z.js → audio-compose.worker.CiM_KP27.js} +2 -2
  53. package/dist/workers/stages/compose/{audio-compose.worker.rW63uN6z.js.map → audio-compose.worker.CiM_KP27.js.map} +1 -1
  54. package/dist/workers/stages/compose/{video-compose.worker.D_542rY_.js → video-compose.worker.CvELsCtH.js} +49 -38
  55. package/dist/workers/stages/compose/video-compose.worker.CvELsCtH.js.map +1 -0
  56. package/dist/workers/stages/decode/{audio-decode.worker.B__6tqsy.js → audio-decode.worker.CpjkrZtT.js} +2 -2
  57. package/dist/workers/stages/decode/{audio-decode.worker.B__6tqsy.js.map → audio-decode.worker.CpjkrZtT.js.map} +1 -1
  58. package/dist/workers/stages/decode/{video-decode.worker.tOv-QR2f.js → video-decode.worker.BQtw6eWn.js} +2 -2
  59. package/dist/workers/stages/decode/video-decode.worker.BQtw6eWn.js.map +1 -0
  60. package/dist/workers/stages/demux/{audio-demux.worker.DgvvQVXU.js → audio-demux.worker.C4V11GQi.js} +2 -2
  61. package/dist/workers/stages/demux/{audio-demux.worker.DgvvQVXU.js.map → audio-demux.worker.C4V11GQi.js.map} +1 -1
  62. package/dist/workers/stages/demux/{video-demux.worker.DhG3CRix.js → video-demux.worker.5pJr0Ij-.js} +2 -2
  63. package/dist/workers/stages/demux/video-demux.worker.5pJr0Ij-.js.map +1 -0
  64. package/dist/workers/stages/encode/{video-encode.worker.D8pfFber.js → video-encode.worker.CX2_3YhQ.js} +2 -2
  65. package/dist/workers/stages/encode/{video-encode.worker.D8pfFber.js.map → video-encode.worker.CX2_3YhQ.js.map} +1 -1
  66. package/dist/workers/worker-manifest.json +7 -7
  67. package/package.json +1 -1
  68. package/dist/workers/WorkerChannel.CE5euh3R.js.map +0 -1
  69. package/dist/workers/stages/compose/video-compose.worker.D_542rY_.js.map +0 -1
  70. package/dist/workers/stages/decode/video-decode.worker.tOv-QR2f.js.map +0 -1
  71. package/dist/workers/stages/demux/video-demux.worker.DhG3CRix.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerChannel.js","sources":["../../src/worker/WorkerChannel.ts"],"sourcesContent":["/**\n * WorkerChannel - MessageChannel wrapper for worker communication\n * Provides type-safe message passing with automatic serialization/deserialization\n */\n\nimport {\n WorkerMessage,\n WorkerResponse,\n WorkerError,\n WorkerMessageType,\n PendingRequest,\n MessageHandler,\n MessageHandlers,\n WorkerState,\n PortLike,\n} from './types';\nimport { withRetry, RetryConfig, defaultRetryConfig } from './worker-retry';\nimport { isTransferable, extractTransferables } from './transferable-helper';\n\nexport interface WorkerChannelConfig {\n name: string;\n timeout?: number; // Default timeout in milliseconds\n maxRetries?: number; // Default max retries\n}\n\nexport class WorkerChannel {\n name: string;\n port: PortLike;\n pendingRequests = new Map<string, PendingRequest>();\n messageHandlers: MessageHandlers = {};\n state: WorkerState = WorkerState.Idle;\n defaultTimeout: number;\n defaultMaxRetries: number;\n\n constructor(port: PortLike, config: WorkerChannelConfig) {\n this.name = config.name;\n this.port = port;\n this.defaultTimeout = config.timeout ?? 30000; // 30 seconds default\n this.defaultMaxRetries = config.maxRetries ?? 3;\n\n this.setupMessageHandler();\n this.state = WorkerState.Ready;\n }\n\n /**\n * Send a message and wait for response with retry support\n */\n async send<T = any, R = any>(\n type: WorkerMessageType,\n payload?: T,\n options?: {\n timeout?: number;\n maxRetries?: number;\n transfer?: Transferable[];\n retryConfig?: Partial<RetryConfig>;\n }\n ): Promise<R> {\n const maxRetries = options?.maxRetries ?? this.defaultMaxRetries;\n\n // Create retry config\n const retryConfig: RetryConfig = {\n ...defaultRetryConfig,\n maxRetries,\n ...options?.retryConfig,\n };\n\n // Wrap send logic for retry\n return withRetry(() => this.sendOnce<T, R>(type, payload, options), retryConfig);\n }\n\n /**\n * Send a message once (without retry)\n */\n private async sendOnce<T = any, R = any>(\n type: WorkerMessageType,\n payload?: T,\n options?: {\n timeout?: number;\n transfer?: Transferable[];\n }\n ): Promise<R> {\n const id = this.generateMessageId();\n const timeout = options?.timeout ?? this.defaultTimeout;\n\n const message: WorkerMessage<T> = {\n type,\n id,\n payload,\n timestamp: Date.now(),\n };\n\n return new Promise((resolve, reject) => {\n const request: PendingRequest = {\n id,\n type,\n timestamp: Date.now(),\n timeout,\n resolve,\n reject,\n };\n\n this.pendingRequests.set(id, request);\n\n // Set timeout\n const timeoutId = setTimeout(() => {\n const pending = this.pendingRequests.get(id);\n if (pending) {\n this.pendingRequests.delete(id);\n const error = new Error(`Request timeout: ${id} ${type} (${timeout}ms)`);\n (error as any).code = 'TIMEOUT';\n pending.reject(error);\n }\n }, timeout);\n\n // Store timeout ID for cleanup\n (request as any).timeoutId = timeoutId;\n // Send message\n if (options?.transfer) {\n this.port.postMessage(message, options.transfer);\n } else {\n this.port.postMessage(message);\n }\n });\n }\n\n /**\n * Send a message without waiting for response\n */\n post<T = any>(type: WorkerMessageType, payload?: T, transfer?: Transferable[]): void {\n const message: WorkerMessage<T> = {\n type,\n id: this.generateMessageId(),\n payload,\n timestamp: Date.now(),\n };\n\n if (transfer) {\n this.port.postMessage(message, transfer);\n } else {\n this.port.postMessage(message);\n }\n }\n\n /**\n * Register a message handler\n */\n on<T = any, R = any>(type: WorkerMessageType, handler: MessageHandler<T, R>): void {\n this.messageHandlers[type] = handler;\n }\n\n /**\n * Unregister a message handler\n */\n off(type: WorkerMessageType): void {\n delete this.messageHandlers[type];\n }\n\n /**\n * Dispose the channel\n */\n dispose(): void {\n this.state = WorkerState.Disposed;\n\n // Clear all pending requests\n for (const [, request] of this.pendingRequests) {\n if ((request as any).timeoutId) {\n clearTimeout((request as any).timeoutId);\n }\n request.reject(new Error('Channel disposed'));\n }\n this.pendingRequests.clear();\n\n // Remove message handler\n this.port.onmessage = null;\n }\n\n /**\n * Setup message handler for incoming messages\n */\n private setupMessageHandler(): void {\n this.port.onmessage = async (event: MessageEvent) => {\n const data = event.data;\n\n // Handle response messages\n if (this.isResponse(data)) {\n this.handleResponse(data as WorkerResponse);\n return;\n }\n\n // Handle request messages\n if (this.isRequest(data)) {\n await this.handleRequest(data as WorkerMessage);\n return;\n }\n };\n }\n\n /**\n * Handle incoming request\n */\n private async handleRequest(message: WorkerMessage): Promise<void> {\n const handler = this.messageHandlers[message.type];\n\n if (!handler) {\n // Send error response if no handler registered\n this.sendResponse(message.id, false, null, {\n code: 'NO_HANDLER',\n message: `No handler registered for message type: ${message.type}`,\n });\n return;\n }\n\n this.state = WorkerState.Processing;\n\n // Handler execution with error handling at framework level\n Promise.resolve()\n .then(() => handler(message.payload, message.transfer))\n .then((result) => {\n this.sendResponse(message.id, true, result);\n this.state = WorkerState.Ready;\n })\n .catch((error) => {\n const workerError: WorkerError = {\n code: 'HANDLER_ERROR',\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n };\n this.sendResponse(message.id, false, null, workerError);\n this.state = WorkerState.Ready;\n });\n }\n\n /**\n * Handle incoming response\n */\n private handleResponse(response: WorkerResponse): void {\n const request = this.pendingRequests.get(response.id);\n if (!request) {\n return; // Response for unknown request\n }\n\n this.pendingRequests.delete(response.id);\n\n // Clear timeout\n if ((request as any).timeoutId) {\n clearTimeout((request as any).timeoutId);\n }\n\n if (response.success) {\n request.resolve(response.result);\n } else {\n const error = new Error(response.error?.message || 'Unknown error');\n if (response.error) {\n Object.assign(error, response.error);\n }\n request.reject(error);\n }\n }\n\n /**\n * Send a response message\n */\n private sendResponse(id: string, success: boolean, result?: any, error?: WorkerError): void {\n let transfer: Transferable[] = [];\n if (isTransferable(result)) {\n // Still include reference so caller can access the transferred object\n transfer.push(result);\n }\n const response: WorkerResponse = {\n id,\n success,\n result,\n error,\n timestamp: Date.now(),\n };\n\n this.port.postMessage(response, transfer);\n }\n\n /**\n * Check if message is a response\n */\n private isResponse(data: any): boolean {\n return (\n data && typeof data === 'object' && 'id' in data && 'success' in data && !('type' in data)\n );\n }\n\n /**\n * Check if message is a request\n */\n private isRequest(data: any): boolean {\n return data && typeof data === 'object' && 'id' in data && 'type' in data;\n }\n\n /**\n * Generate unique message ID\n */\n private generateMessageId(): string {\n return `${this.name}-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n }\n\n /**\n * Send a notification message without waiting for response\n * Alias for post() method for compatibility\n */\n notify<T = any>(type: WorkerMessageType | string, payload?: T, transfer?: Transferable[]): void {\n this.post(type as WorkerMessageType, payload, transfer);\n }\n\n /**\n * Register a message handler\n * Alias for on() method for compatibility\n */\n registerHandler<T = any, R = any>(\n type: WorkerMessageType | string,\n handler: MessageHandler<T, R>\n ): void {\n this.on(type as WorkerMessageType, handler);\n }\n\n /**\n * Send a ReadableStream to another worker\n * Automatically handles transferable streams vs chunk-by-chunk fallback\n */\n async sendStream<T = Uint8Array>(\n stream: ReadableStream<T>,\n metadata?: {\n type?: string;\n url?: string;\n streamId?: string;\n [key: string]: any;\n }\n ): Promise<void> {\n const streamId = metadata?.streamId || this.generateMessageId();\n // Check if streams are transferable in this environment\n if (isTransferable(stream)) {\n // Direct stream transfer (preferred)\n this.port.postMessage(\n {\n type: 'stream_transfer',\n ...metadata,\n stream,\n streamId,\n },\n [stream] // Transfer ownership\n );\n } else {\n // Fallback: chunk-by-chunk transfer\n await this.streamChunks(stream, streamId, metadata);\n }\n }\n\n /**\n * Stream chunks from a ReadableStream (fallback when transfer is not supported)\n */\n private async streamChunks<T = Uint8Array>(\n stream: ReadableStream<T>,\n streamId: string,\n metadata?: Record<string, any>\n ): Promise<void> {\n const reader = stream.getReader();\n\n // Send stream start notification\n this.post('stream_start' as WorkerMessageType, {\n streamId,\n ...metadata,\n mode: 'chunk_transfer',\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Send stream end notification\n this.post('stream_end' as WorkerMessageType, {\n streamId,\n ...metadata,\n });\n break;\n }\n\n // Send chunk with transfer - use extractTransferables for complex objects\n const transfer: Transferable[] = [];\n if (value instanceof ArrayBuffer) {\n transfer.push(value);\n } else if (value instanceof Uint8Array) {\n transfer.push(value.buffer);\n } else if (typeof AudioData !== 'undefined' && value instanceof AudioData) {\n transfer.push(value as unknown as Transferable);\n } else if (typeof VideoFrame !== 'undefined' && value instanceof VideoFrame) {\n transfer.push(value as unknown as Transferable);\n } else if (typeof value === 'object' && value !== null) {\n // For wrapped objects (e.g., {frame: VideoFrame, metadata...}), extract transferables\n const extracted = extractTransferables(value);\n transfer.push(...extracted);\n }\n\n this.post(\n 'stream_chunk' as WorkerMessageType,\n {\n streamId,\n chunk: value,\n ...metadata,\n },\n transfer\n );\n }\n } catch (error) {\n // Send error notification\n this.post('stream_error' as WorkerMessageType, {\n streamId,\n error: error instanceof Error ? error.message : String(error),\n ...metadata,\n });\n throw error;\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Receive a stream from another worker\n * Handles both transferable streams and chunk-by-chunk reconstruction\n */\n async receiveStream<T = Uint8Array>(\n onStream: (stream: ReadableStream<T>, metadata?: Record<string, any>) => void\n ): Promise<void> {\n const chunkedStreams = new Map<\n string,\n {\n controller: ReadableStreamDefaultController<T>;\n metadata?: Record<string, any>;\n }\n >();\n\n // Intercept stream messages via onmessage to avoid extra event plumbing\n const prev = this.port.onmessage as any;\n // Use function assignment with explicit type to satisfy esbuild parser\n const handler: (event: MessageEvent) => void = (event) => {\n const raw = (event as any).data;\n const envelopeType = raw?.type;\n const hasPayload = raw && typeof raw === 'object' && 'payload' in raw;\n const payload = hasPayload ? (raw as any).payload : raw;\n\n if (envelopeType === 'stream_transfer' && (payload as any)?.stream) {\n onStream((payload as any).stream, payload);\n return;\n }\n if (envelopeType === 'stream_start' && (payload as any)?.streamId) {\n const stream = new ReadableStream<T>({\n start(controller) {\n chunkedStreams.set((payload as any).streamId, { controller, metadata: payload });\n },\n });\n onStream(stream, payload);\n return;\n }\n if (\n envelopeType === 'stream_chunk' &&\n (payload as any)?.streamId &&\n chunkedStreams.has((payload as any).streamId)\n ) {\n const s = chunkedStreams.get((payload as any).streamId);\n if (s) s.controller.enqueue((payload as any).chunk as T);\n return;\n }\n if (\n envelopeType === 'stream_end' &&\n (payload as any)?.streamId &&\n chunkedStreams.has((payload as any).streamId)\n ) {\n const s = chunkedStreams.get((payload as any).streamId);\n if (s) {\n s.controller.close();\n chunkedStreams.delete((payload as any).streamId);\n }\n return;\n }\n if (\n envelopeType === 'stream_error' &&\n (payload as any)?.streamId &&\n chunkedStreams.has((payload as any).streamId)\n ) {\n const s = chunkedStreams.get((payload as any).streamId);\n if (s) {\n s.controller.error(new Error(String((payload as any).error || 'stream error')));\n chunkedStreams.delete((payload as any).streamId);\n }\n return;\n }\n\n // Delegate non-stream messages to previous handler\n if (typeof prev === 'function') prev.call(this.port, event);\n };\n this.port.onmessage = handler as any;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WorkerChannel.js","sources":["../../src/worker/WorkerChannel.ts"],"sourcesContent":["/**\n * WorkerChannel - MessageChannel wrapper for worker communication\n * Provides type-safe message passing with automatic serialization/deserialization\n */\n\nimport {\n WorkerMessage,\n WorkerResponse,\n WorkerError,\n WorkerMessageType,\n PendingRequest,\n MessageHandler,\n MessageHandlers,\n WorkerState,\n PortLike,\n} from './types';\nimport { withRetry, RetryConfig, defaultRetryConfig } from './worker-retry';\nimport {\n isTransferable,\n extractTransferables,\n encodedVideoChunkToTransferable,\n encodedAudioChunkToTransferable,\n} from './transferable-helper';\n\nexport interface WorkerChannelConfig {\n name: string;\n timeout?: number; // Default timeout in milliseconds\n maxRetries?: number; // Default max retries\n}\n\nexport class WorkerChannel {\n name: string;\n port: PortLike;\n pendingRequests = new Map<string, PendingRequest>();\n messageHandlers: MessageHandlers = {};\n state: WorkerState = WorkerState.Idle;\n defaultTimeout: number;\n defaultMaxRetries: number;\n\n constructor(port: PortLike, config: WorkerChannelConfig) {\n this.name = config.name;\n this.port = port;\n this.defaultTimeout = config.timeout ?? 30000; // 30 seconds default\n this.defaultMaxRetries = config.maxRetries ?? 3;\n\n this.setupMessageHandler();\n this.state = WorkerState.Ready;\n }\n\n /**\n * Send a message and wait for response with retry support\n */\n async send<T = any, R = any>(\n type: WorkerMessageType,\n payload?: T,\n options?: {\n timeout?: number;\n maxRetries?: number;\n transfer?: Transferable[];\n retryConfig?: Partial<RetryConfig>;\n }\n ): Promise<R> {\n const maxRetries = options?.maxRetries ?? this.defaultMaxRetries;\n\n // Create retry config\n const retryConfig: RetryConfig = {\n ...defaultRetryConfig,\n maxRetries,\n ...options?.retryConfig,\n };\n\n // Wrap send logic for retry\n return withRetry(() => this.sendOnce<T, R>(type, payload, options), retryConfig);\n }\n\n /**\n * Send a message once (without retry)\n */\n private async sendOnce<T = any, R = any>(\n type: WorkerMessageType,\n payload?: T,\n options?: {\n timeout?: number;\n transfer?: Transferable[];\n }\n ): Promise<R> {\n const id = this.generateMessageId();\n const timeout = options?.timeout ?? this.defaultTimeout;\n\n const message: WorkerMessage<T> = {\n type,\n id,\n payload,\n timestamp: Date.now(),\n };\n\n return new Promise((resolve, reject) => {\n const request: PendingRequest = {\n id,\n type,\n timestamp: Date.now(),\n timeout,\n resolve,\n reject,\n };\n\n this.pendingRequests.set(id, request);\n\n // Set timeout\n const timeoutId = setTimeout(() => {\n const pending = this.pendingRequests.get(id);\n if (pending) {\n this.pendingRequests.delete(id);\n const error = new Error(`Request timeout: ${id} ${type} (${timeout}ms)`);\n (error as any).code = 'TIMEOUT';\n pending.reject(error);\n }\n }, timeout);\n\n // Store timeout ID for cleanup\n (request as any).timeoutId = timeoutId;\n // Send message\n if (options?.transfer) {\n this.port.postMessage(message, options.transfer);\n } else {\n this.port.postMessage(message);\n }\n });\n }\n\n /**\n * Send a message without waiting for response\n */\n post<T = any>(type: WorkerMessageType, payload?: T, transfer?: Transferable[]): void {\n const message: WorkerMessage<T> = {\n type,\n id: this.generateMessageId(),\n payload,\n timestamp: Date.now(),\n };\n\n if (transfer) {\n this.port.postMessage(message, transfer);\n } else {\n this.port.postMessage(message);\n }\n }\n\n /**\n * Register a message handler\n */\n on<T = any, R = any>(type: WorkerMessageType, handler: MessageHandler<T, R>): void {\n this.messageHandlers[type] = handler;\n }\n\n /**\n * Unregister a message handler\n */\n off(type: WorkerMessageType): void {\n delete this.messageHandlers[type];\n }\n\n /**\n * Dispose the channel\n */\n dispose(): void {\n this.state = WorkerState.Disposed;\n\n // Clear all pending requests\n for (const [, request] of this.pendingRequests) {\n if ((request as any).timeoutId) {\n clearTimeout((request as any).timeoutId);\n }\n request.reject(new Error('Channel disposed'));\n }\n this.pendingRequests.clear();\n\n // Remove message handler\n this.port.onmessage = null;\n }\n\n /**\n * Setup message handler for incoming messages\n */\n private setupMessageHandler(): void {\n this.port.onmessage = async (event: MessageEvent) => {\n const data = event.data;\n\n // Handle response messages\n if (this.isResponse(data)) {\n this.handleResponse(data as WorkerResponse);\n return;\n }\n\n // Handle request messages\n if (this.isRequest(data)) {\n await this.handleRequest(data as WorkerMessage);\n return;\n }\n };\n }\n\n /**\n * Handle incoming request\n */\n private async handleRequest(message: WorkerMessage): Promise<void> {\n const handler = this.messageHandlers[message.type];\n\n if (!handler) {\n // Send error response if no handler registered\n this.sendResponse(message.id, false, null, {\n code: 'NO_HANDLER',\n message: `No handler registered for message type: ${message.type}`,\n });\n return;\n }\n\n this.state = WorkerState.Processing;\n\n // Handler execution with error handling at framework level\n Promise.resolve()\n .then(() => handler(message.payload, message.transfer))\n .then((result) => {\n this.sendResponse(message.id, true, result);\n this.state = WorkerState.Ready;\n })\n .catch((error) => {\n const workerError: WorkerError = {\n code: 'HANDLER_ERROR',\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n };\n this.sendResponse(message.id, false, null, workerError);\n this.state = WorkerState.Ready;\n });\n }\n\n /**\n * Handle incoming response\n */\n private handleResponse(response: WorkerResponse): void {\n const request = this.pendingRequests.get(response.id);\n if (!request) {\n return; // Response for unknown request\n }\n\n this.pendingRequests.delete(response.id);\n\n // Clear timeout\n if ((request as any).timeoutId) {\n clearTimeout((request as any).timeoutId);\n }\n\n if (response.success) {\n request.resolve(response.result);\n } else {\n const error = new Error(response.error?.message || 'Unknown error');\n if (response.error) {\n Object.assign(error, response.error);\n }\n request.reject(error);\n }\n }\n\n /**\n * Send a response message\n */\n private sendResponse(id: string, success: boolean, result?: any, error?: WorkerError): void {\n let transfer: Transferable[] = [];\n if (isTransferable(result)) {\n // Still include reference so caller can access the transferred object\n transfer.push(result);\n }\n const response: WorkerResponse = {\n id,\n success,\n result,\n error,\n timestamp: Date.now(),\n };\n\n this.port.postMessage(response, transfer);\n }\n\n /**\n * Check if message is a response\n */\n private isResponse(data: any): boolean {\n return (\n data && typeof data === 'object' && 'id' in data && 'success' in data && !('type' in data)\n );\n }\n\n /**\n * Check if message is a request\n */\n private isRequest(data: any): boolean {\n return data && typeof data === 'object' && 'id' in data && 'type' in data;\n }\n\n /**\n * Generate unique message ID\n */\n private generateMessageId(): string {\n return `${this.name}-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n }\n\n /**\n * Send a notification message without waiting for response\n * Alias for post() method for compatibility\n */\n notify<T = any>(type: WorkerMessageType | string, payload?: T, transfer?: Transferable[]): void {\n this.post(type as WorkerMessageType, payload, transfer);\n }\n\n /**\n * Register a message handler\n * Alias for on() method for compatibility\n */\n registerHandler<T = any, R = any>(\n type: WorkerMessageType | string,\n handler: MessageHandler<T, R>\n ): void {\n this.on(type as WorkerMessageType, handler);\n }\n\n /**\n * Send a ReadableStream to another worker\n * Automatically handles transferable streams vs chunk-by-chunk fallback\n */\n async sendStream<T = Uint8Array>(\n stream: ReadableStream<T>,\n metadata?: {\n type?: string;\n url?: string;\n streamId?: string;\n [key: string]: any;\n }\n ): Promise<void> {\n const streamId = metadata?.streamId || this.generateMessageId();\n // Check if streams are transferable in this environment\n if (isTransferable(stream)) {\n // Direct stream transfer (preferred)\n this.port.postMessage(\n {\n type: 'stream_transfer',\n ...metadata,\n stream,\n streamId,\n },\n [stream] // Transfer ownership\n );\n } else {\n // Fallback: chunk-by-chunk transfer\n await this.streamChunks(stream, streamId, metadata);\n }\n }\n\n /**\n * Stream chunks from a ReadableStream (fallback when transfer is not supported)\n */\n private async streamChunks<T = Uint8Array>(\n stream: ReadableStream<T>,\n streamId: string,\n metadata?: Record<string, any>\n ): Promise<void> {\n const reader = stream.getReader();\n\n // Send stream start notification\n this.post('stream_start' as WorkerMessageType, {\n streamId,\n ...metadata,\n mode: 'chunk_transfer',\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Send stream end notification\n this.post('stream_end' as WorkerMessageType, {\n streamId,\n ...metadata,\n });\n break;\n }\n\n // Send chunk with transfer - use extractTransferables for complex objects\n const transfer: Transferable[] = [];\n let chunkValue: T = value;\n\n if (value instanceof ArrayBuffer) {\n transfer.push(value);\n } else if (value instanceof Uint8Array) {\n transfer.push(value.buffer);\n } else if (typeof AudioData !== 'undefined' && value instanceof AudioData) {\n transfer.push(value as unknown as Transferable);\n } else if (typeof VideoFrame !== 'undefined' && value instanceof VideoFrame) {\n transfer.push(value as unknown as Transferable);\n } else if (typeof EncodedVideoChunk !== 'undefined' && value instanceof EncodedVideoChunk) {\n // EncodedVideoChunk is not transferable by itself\n // But its constructor supports transfer parameter for the underlying ArrayBuffer\n // We serialize it to a plain object and transfer the ArrayBuffer\n const serialized = encodedVideoChunkToTransferable(value);\n transfer.push(serialized.data); // Transfer the ArrayBuffer\n chunkValue = serialized as T;\n } else if (typeof EncodedAudioChunk !== 'undefined' && value instanceof EncodedAudioChunk) {\n // EncodedAudioChunk is not transferable by itself\n // We serialize it to a plain object and transfer the ArrayBuffer\n const serialized = encodedAudioChunkToTransferable(value);\n transfer.push(serialized.data); // Transfer the ArrayBuffer\n chunkValue = serialized as T;\n } else if (typeof value === 'object' && value !== null) {\n // For wrapped objects (e.g., {frame: VideoFrame, metadata...}), extract transferables\n const extracted = extractTransferables(value);\n transfer.push(...extracted);\n }\n\n this.post(\n 'stream_chunk' as WorkerMessageType,\n {\n streamId,\n chunk: chunkValue,\n ...metadata,\n },\n transfer\n );\n }\n } catch (error) {\n // Send error notification\n this.post('stream_error' as WorkerMessageType, {\n streamId,\n error: error instanceof Error ? error.message : String(error),\n ...metadata,\n });\n throw error;\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Receive a stream from another worker\n * Handles both transferable streams and chunk-by-chunk reconstruction\n */\n async receiveStream<T = Uint8Array>(\n onStream: (stream: ReadableStream<T>, metadata?: Record<string, any>) => void\n ): Promise<void> {\n const chunkedStreams = new Map<\n string,\n {\n controller: ReadableStreamDefaultController<T>;\n metadata?: Record<string, any>;\n }\n >();\n\n // Intercept stream messages via onmessage to avoid extra event plumbing\n const prev = this.port.onmessage as any;\n // Use function assignment with explicit type to satisfy esbuild parser\n const handler: (event: MessageEvent) => void = (event) => {\n const raw = (event as any).data;\n const envelopeType = raw?.type;\n const hasPayload = raw && typeof raw === 'object' && 'payload' in raw;\n const payload = hasPayload ? (raw as any).payload : raw;\n\n if (envelopeType === 'stream_transfer' && (payload as any)?.stream) {\n onStream((payload as any).stream, payload);\n return;\n }\n if (envelopeType === 'stream_start' && (payload as any)?.streamId) {\n const stream = new ReadableStream<T>({\n start(controller) {\n chunkedStreams.set((payload as any).streamId, { controller, metadata: payload });\n },\n });\n onStream(stream, payload);\n return;\n }\n if (\n envelopeType === 'stream_chunk' &&\n (payload as any)?.streamId &&\n chunkedStreams.has((payload as any).streamId)\n ) {\n const s = chunkedStreams.get((payload as any).streamId);\n if (s) s.controller.enqueue((payload as any).chunk as T);\n return;\n }\n if (\n envelopeType === 'stream_end' &&\n (payload as any)?.streamId &&\n chunkedStreams.has((payload as any).streamId)\n ) {\n const s = chunkedStreams.get((payload as any).streamId);\n if (s) {\n s.controller.close();\n chunkedStreams.delete((payload as any).streamId);\n }\n return;\n }\n if (\n envelopeType === 'stream_error' &&\n (payload as any)?.streamId &&\n chunkedStreams.has((payload as any).streamId)\n ) {\n const s = chunkedStreams.get((payload as any).streamId);\n if (s) {\n s.controller.error(new Error(String((payload as any).error || 'stream error')));\n chunkedStreams.delete((payload as any).streamId);\n }\n return;\n }\n\n // Delegate non-stream messages to previous handler\n if (typeof prev === 'function') prev.call(this.port, event);\n };\n this.port.onmessage = handler as any;\n }\n}\n"],"names":[],"mappings":";;;AA8BO,MAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA,sCAAsB,IAAA;AAAA,EACtB,kBAAmC,CAAA;AAAA,EACnC,QAAqB,YAAY;AAAA,EACjC;AAAA,EACA;AAAA,EAEA,YAAY,MAAgB,QAA6B;AACvD,SAAK,OAAO,OAAO;AACnB,SAAK,OAAO;AACZ,SAAK,iBAAiB,OAAO,WAAW;AACxC,SAAK,oBAAoB,OAAO,cAAc;AAE9C,SAAK,oBAAA;AACL,SAAK,QAAQ,YAAY;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KACJ,MACA,SACA,SAMY;AACZ,UAAM,aAAa,SAAS,cAAc,KAAK;AAG/C,UAAM,cAA2B;AAAA,MAC/B,GAAG;AAAA,MACH;AAAA,MACA,GAAG,SAAS;AAAA,IAAA;AAId,WAAO,UAAU,MAAM,KAAK,SAAe,MAAM,SAAS,OAAO,GAAG,WAAW;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,SACZ,MACA,SACA,SAIY;AACZ,UAAM,KAAK,KAAK,kBAAA;AAChB,UAAM,UAAU,SAAS,WAAW,KAAK;AAEzC,UAAM,UAA4B;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAA;AAAA,IAAI;AAGtB,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,UAA0B;AAAA,QAC9B;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAA;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAGF,WAAK,gBAAgB,IAAI,IAAI,OAAO;AAGpC,YAAM,YAAY,WAAW,MAAM;AACjC,cAAM,UAAU,KAAK,gBAAgB,IAAI,EAAE;AAC3C,YAAI,SAAS;AACX,eAAK,gBAAgB,OAAO,EAAE;AAC9B,gBAAM,QAAQ,IAAI,MAAM,oBAAoB,EAAE,IAAI,IAAI,KAAK,OAAO,KAAK;AACtE,gBAAc,OAAO;AACtB,kBAAQ,OAAO,KAAK;AAAA,QACtB;AAAA,MACF,GAAG,OAAO;AAGT,cAAgB,YAAY;AAE7B,UAAI,SAAS,UAAU;AACrB,aAAK,KAAK,YAAY,SAAS,QAAQ,QAAQ;AAAA,MACjD,OAAO;AACL,aAAK,KAAK,YAAY,OAAO;AAAA,MAC/B;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,KAAc,MAAyB,SAAa,UAAiC;AACnF,UAAM,UAA4B;AAAA,MAChC;AAAA,MACA,IAAI,KAAK,kBAAA;AAAA,MACT;AAAA,MACA,WAAW,KAAK,IAAA;AAAA,IAAI;AAGtB,QAAI,UAAU;AACZ,WAAK,KAAK,YAAY,SAAS,QAAQ;AAAA,IACzC,OAAO;AACL,WAAK,KAAK,YAAY,OAAO;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,GAAqB,MAAyB,SAAqC;AACjF,SAAK,gBAAgB,IAAI,IAAI;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAA+B;AACjC,WAAO,KAAK,gBAAgB,IAAI;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,QAAQ,YAAY;AAGzB,eAAW,CAAA,EAAG,OAAO,KAAK,KAAK,iBAAiB;AAC9C,UAAK,QAAgB,WAAW;AAC9B,qBAAc,QAAgB,SAAS;AAAA,MACzC;AACA,cAAQ,OAAO,IAAI,MAAM,kBAAkB,CAAC;AAAA,IAC9C;AACA,SAAK,gBAAgB,MAAA;AAGrB,SAAK,KAAK,YAAY;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAA4B;AAClC,SAAK,KAAK,YAAY,OAAO,UAAwB;AACnD,YAAM,OAAO,MAAM;AAGnB,UAAI,KAAK,WAAW,IAAI,GAAG;AACzB,aAAK,eAAe,IAAsB;AAC1C;AAAA,MACF;AAGA,UAAI,KAAK,UAAU,IAAI,GAAG;AACxB,cAAM,KAAK,cAAc,IAAqB;AAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,SAAuC;AACjE,UAAM,UAAU,KAAK,gBAAgB,QAAQ,IAAI;AAEjD,QAAI,CAAC,SAAS;AAEZ,WAAK,aAAa,QAAQ,IAAI,OAAO,MAAM;AAAA,QACzC,MAAM;AAAA,QACN,SAAS,2CAA2C,QAAQ,IAAI;AAAA,MAAA,CACjE;AACD;AAAA,IACF;AAEA,SAAK,QAAQ,YAAY;AAGzB,YAAQ,QAAA,EACL,KAAK,MAAM,QAAQ,QAAQ,SAAS,QAAQ,QAAQ,CAAC,EACrD,KAAK,CAAC,WAAW;AAChB,WAAK,aAAa,QAAQ,IAAI,MAAM,MAAM;AAC1C,WAAK,QAAQ,YAAY;AAAA,IAC3B,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,YAAM,cAA2B;AAAA,QAC/B,MAAM;AAAA,QACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,OAAO,iBAAiB,QAAQ,MAAM,QAAQ;AAAA,MAAA;AAEhD,WAAK,aAAa,QAAQ,IAAI,OAAO,MAAM,WAAW;AACtD,WAAK,QAAQ,YAAY;AAAA,IAC3B,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,UAAgC;AACrD,UAAM,UAAU,KAAK,gBAAgB,IAAI,SAAS,EAAE;AACpD,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,SAAK,gBAAgB,OAAO,SAAS,EAAE;AAGvC,QAAK,QAAgB,WAAW;AAC9B,mBAAc,QAAgB,SAAS;AAAA,IACzC;AAEA,QAAI,SAAS,SAAS;AACpB,cAAQ,QAAQ,SAAS,MAAM;AAAA,IACjC,OAAO;AACL,YAAM,QAAQ,IAAI,MAAM,SAAS,OAAO,WAAW,eAAe;AAClE,UAAI,SAAS,OAAO;AAClB,eAAO,OAAO,OAAO,SAAS,KAAK;AAAA,MACrC;AACA,cAAQ,OAAO,KAAK;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,IAAY,SAAkB,QAAc,OAA2B;AAC1F,QAAI,WAA2B,CAAA;AAC/B,QAAI,eAAe,MAAM,GAAG;AAE1B,eAAS,KAAK,MAAM;AAAA,IACtB;AACA,UAAM,WAA2B;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAA;AAAA,IAAI;AAGtB,SAAK,KAAK,YAAY,UAAU,QAAQ;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,MAAoB;AACrC,WACE,QAAQ,OAAO,SAAS,YAAY,QAAQ,QAAQ,aAAa,QAAQ,EAAE,UAAU;AAAA,EAEzF;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,MAAoB;AACpC,WAAO,QAAQ,OAAO,SAAS,YAAY,QAAQ,QAAQ,UAAU;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAA4B;AAClC,WAAO,GAAG,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,CAAC;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAgB,MAAkC,SAAa,UAAiC;AAC9F,SAAK,KAAK,MAA2B,SAAS,QAAQ;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBACE,MACA,SACM;AACN,SAAK,GAAG,MAA2B,OAAO;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WACJ,QACA,UAMe;AACf,UAAM,WAAW,UAAU,YAAY,KAAK,kBAAA;AAE5C,QAAI,eAAe,MAAM,GAAG;AAE1B,WAAK,KAAK;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,GAAG;AAAA,UACH;AAAA,UACA;AAAA,QAAA;AAAA,QAEF,CAAC,MAAM;AAAA;AAAA,MAAA;AAAA,IAEX,OAAO;AAEL,YAAM,KAAK,aAAa,QAAQ,UAAU,QAAQ;AAAA,IACpD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aACZ,QACA,UACA,UACe;AACf,UAAM,SAAS,OAAO,UAAA;AAGtB,SAAK,KAAK,gBAAqC;AAAA,MAC7C;AAAA,MACA,GAAG;AAAA,MACH,MAAM;AAAA,IAAA,CACP;AAED,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAA,IAAU,MAAM,OAAO,KAAA;AAErC,YAAI,MAAM;AAER,eAAK,KAAK,cAAmC;AAAA,YAC3C;AAAA,YACA,GAAG;AAAA,UAAA,CACJ;AACD;AAAA,QACF;AAGA,cAAM,WAA2B,CAAA;AACjC,YAAI,aAAgB;AAEpB,YAAI,iBAAiB,aAAa;AAChC,mBAAS,KAAK,KAAK;AAAA,QACrB,WAAW,iBAAiB,YAAY;AACtC,mBAAS,KAAK,MAAM,MAAM;AAAA,QAC5B,WAAW,OAAO,cAAc,eAAe,iBAAiB,WAAW;AACzE,mBAAS,KAAK,KAAgC;AAAA,QAChD,WAAW,OAAO,eAAe,eAAe,iBAAiB,YAAY;AAC3E,mBAAS,KAAK,KAAgC;AAAA,QAChD,WAAW,OAAO,sBAAsB,eAAe,iBAAiB,mBAAmB;AAIzF,gBAAM,aAAa,gCAAgC,KAAK;AACxD,mBAAS,KAAK,WAAW,IAAI;AAC7B,uBAAa;AAAA,QACf,WAAW,OAAO,sBAAsB,eAAe,iBAAiB,mBAAmB;AAGzF,gBAAM,aAAa,gCAAgC,KAAK;AACxD,mBAAS,KAAK,WAAW,IAAI;AAC7B,uBAAa;AAAA,QACf,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AAEtD,gBAAM,YAAY,qBAAqB,KAAK;AAC5C,mBAAS,KAAK,GAAG,SAAS;AAAA,QAC5B;AAEA,aAAK;AAAA,UACH;AAAA,UACA;AAAA,YACE;AAAA,YACA,OAAO;AAAA,YACP,GAAG;AAAA,UAAA;AAAA,UAEL;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF,SAAS,OAAO;AAEd,WAAK,KAAK,gBAAqC;AAAA,QAC7C;AAAA,QACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC5D,GAAG;AAAA,MAAA,CACJ;AACD,YAAM;AAAA,IACR,UAAA;AACE,aAAO,YAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cACJ,UACe;AACf,UAAM,qCAAqB,IAAA;AAS3B,UAAM,OAAO,KAAK,KAAK;AAEvB,UAAM,UAAyC,CAAC,UAAU;AACxD,YAAM,MAAO,MAAc;AAC3B,YAAM,eAAe,KAAK;AAC1B,YAAM,aAAa,OAAO,OAAO,QAAQ,YAAY,aAAa;AAClE,YAAM,UAAU,aAAc,IAAY,UAAU;AAEpD,UAAI,iBAAiB,qBAAsB,SAAiB,QAAQ;AAClE,iBAAU,QAAgB,QAAQ,OAAO;AACzC;AAAA,MACF;AACA,UAAI,iBAAiB,kBAAmB,SAAiB,UAAU;AACjE,cAAM,SAAS,IAAI,eAAkB;AAAA,UACnC,MAAM,YAAY;AAChB,2BAAe,IAAK,QAAgB,UAAU,EAAE,YAAY,UAAU,SAAS;AAAA,UACjF;AAAA,QAAA,CACD;AACD,iBAAS,QAAQ,OAAO;AACxB;AAAA,MACF;AACA,UACE,iBAAiB,kBAChB,SAAiB,YAClB,eAAe,IAAK,QAAgB,QAAQ,GAC5C;AACA,cAAM,IAAI,eAAe,IAAK,QAAgB,QAAQ;AACtD,YAAI,EAAG,GAAE,WAAW,QAAS,QAAgB,KAAU;AACvD;AAAA,MACF;AACA,UACE,iBAAiB,gBAChB,SAAiB,YAClB,eAAe,IAAK,QAAgB,QAAQ,GAC5C;AACA,cAAM,IAAI,eAAe,IAAK,QAAgB,QAAQ;AACtD,YAAI,GAAG;AACL,YAAE,WAAW,MAAA;AACb,yBAAe,OAAQ,QAAgB,QAAQ;AAAA,QACjD;AACA;AAAA,MACF;AACA,UACE,iBAAiB,kBAChB,SAAiB,YAClB,eAAe,IAAK,QAAgB,QAAQ,GAC5C;AACA,cAAM,IAAI,eAAe,IAAK,QAAgB,QAAQ;AACtD,YAAI,GAAG;AACL,YAAE,WAAW,MAAM,IAAI,MAAM,OAAQ,QAAgB,SAAS,cAAc,CAAC,CAAC;AAC9E,yBAAe,OAAQ,QAAgB,QAAQ;AAAA,QACjD;AACA;AAAA,MACF;AAGA,UAAI,OAAO,SAAS,iBAAiB,KAAK,KAAK,MAAM,KAAK;AAAA,IAC5D;AACA,SAAK,KAAK,YAAY;AAAA,EACxB;AACF;"}
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerPool.d.ts","sourceRoot":"","sources":["../../src/worker/WorkerPool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAA0B,MAAM,SAAS,CAAC;AAEhF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACxC,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAeD,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAiC;IAC7C,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,eAAe,CAA+C;gBAE1D,MAAM,EAAE,gBAAgB;IAOpC;;OAEG;YACW,YAAY;IA4C1B,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAK1D;;;;;;OAMG;IACG,WAAW,CACf,IAAI,EAAE,UAAU,EAChB,EAAE,CAAC,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAC3B,OAAO,CAAC,UAAU,CAAC;IAsChB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB7D;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAU9C;;OAEG;IACH,YAAY,IAAI,IAAI;IAOpB;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAQrD;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO;CAI5C"}
1
+ {"version":3,"file":"WorkerPool.d.ts","sourceRoot":"","sources":["../../src/worker/WorkerPool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAA0B,MAAM,SAAS,CAAC;AAEhF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACxC,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAeD,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAiC;IAC7C,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,eAAe,CAA+C;gBAE1D,MAAM,EAAE,gBAAgB;IAOpC;;OAEG;YACW,YAAY;IAgD1B,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAK1D;;;;;;OAMG;IACG,WAAW,CACf,IAAI,EAAE,UAAU,EAChB,EAAE,CAAC,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAC3B,OAAO,CAAC,UAAU,CAAC;IAsChB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB7D;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAU9C;;OAEG;IACH,YAAY,IAAI,IAAI;IAOpB;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAQrD;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO;CAI5C"}
@@ -2,9 +2,9 @@ import { BaseWorker } from "./BaseWorker.js";
2
2
  import { WorkerMessageType } from "./types.js";
3
3
  import { loadWorkerManifest } from "./worker-manifest.js";
4
4
  const WORKER_FILE_NAMES = {
5
- videoDemux: "video-demux",
5
+ // videoDemux: 'video-demux', // DEPRECATED: Removed - use IndexedVideoSource
6
6
  audioDemux: "audio-demux",
7
- videoDecode: "video-decode",
7
+ // videoDecode: 'video-decode', // DEPRECATED: Removed - use OnDemandVideoSession (main thread)
8
8
  audioDecode: "audio-decode",
9
9
  videoCompose: "video-compose",
10
10
  audioCompose: "audio-compose",
@@ -28,6 +28,9 @@ class WorkerPool {
28
28
  */
29
29
  async getWorkerUrl(type) {
30
30
  const fileName = WORKER_FILE_NAMES[type];
31
+ if (!fileName) {
32
+ throw new Error(`[WorkerPool] Worker type '${type}' is deprecated or not supported`);
33
+ }
31
34
  const stageMap = {
32
35
  "video-demux": "demux",
33
36
  "audio-demux": "demux",
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerPool.js","sources":["../../src/worker/WorkerPool.ts"],"sourcesContent":["/**\n * WorkerPool: Manages worker instances with key-based access\n * Provides lazy creation and unified management of workers\n */\n\nimport { BaseWorker } from './BaseWorker';\nimport type { WorkerType, WorkerStatus, WorkerConfigurePayload } from './types';\nimport { WorkerMessageType } from './types';\nimport type { EventBus } from '../event/EventBus';\nimport type { EventPayloadMap } from '../event/events';\nimport { loadWorkerManifest, type WorkerManifest } from './worker-manifest';\n\nexport interface WorkerPoolConfig {\n eventBus: EventBus<EventPayloadMap>;\n workerConfigs?: Record<WorkerType, any>;\n /** Worker files base path (default: '/meframe-workers') */\n workerPath?: string;\n workerExtension?: string;\n}\n\n/**\n * Worker name mapping (worker type -> file name)\n */\nconst WORKER_FILE_NAMES: Record<WorkerType, string> = {\n videoDemux: 'video-demux',\n audioDemux: 'audio-demux',\n videoDecode: 'video-decode',\n audioDecode: 'audio-decode',\n videoCompose: 'video-compose',\n audioCompose: 'audio-compose',\n videoEncode: 'video-encode',\n};\n\nexport class WorkerPool {\n private pool = new Map<string, BaseWorker>();\n private eventBus: EventBus<EventPayloadMap>;\n private workerConfigs: Record<string, any>;\n private workerPath: string;\n private workerExtension: string;\n private manifestPromise: Promise<WorkerManifest | null> | null = null;\n\n constructor(config: WorkerPoolConfig) {\n this.eventBus = config.eventBus;\n this.workerConfigs = config.workerConfigs || {};\n this.workerPath = config.workerPath || '/meframe-workers';\n this.workerExtension = config.workerExtension || '.js';\n }\n\n /**\n * Get worker URL for a specific worker type\n */\n private async getWorkerUrl(type: WorkerType): Promise<string> {\n const fileName = WORKER_FILE_NAMES[type];\n\n // Map worker type to its stage directory\n const stageMap: Record<string, string> = {\n 'video-demux': 'demux',\n 'audio-demux': 'demux',\n 'video-decode': 'decode',\n 'audio-decode': 'decode',\n decode: 'decode',\n 'video-compose': 'compose',\n 'audio-compose': 'compose',\n 'video-encode': 'encode',\n encode: 'encode',\n };\n const stage = stageMap[fileName];\n\n // Dev mode: use .ts source files directly (no manifest needed)\n if (this.workerExtension === '.ts') {\n return `${this.workerPath}/stages/${stage}/${fileName}.worker.ts`;\n }\n\n // Production mode: try to load manifest for hashed filenames\n if (!this.manifestPromise) {\n this.manifestPromise = loadWorkerManifest(this.workerPath);\n }\n\n const manifest = await this.manifestPromise;\n\n if (manifest) {\n // Use hashed filename from manifest\n const manifestKey = `${fileName}.worker`;\n const hashedPath = manifest[manifestKey];\n\n if (hashedPath) {\n // Manifest contains full relative path from workers directory\n return `${this.workerPath}/${hashedPath}`;\n }\n }\n\n // Fallback: use non-hashed filename (backward compatibility)\n return `${this.workerPath}/stages/${stage}/${fileName}.worker.js`;\n }\n\n get(type: WorkerType, id?: string): BaseWorker | undefined {\n const key = id ? `${type}#${id}` : type;\n return this.pool.get(key) ?? undefined;\n }\n\n /**\n * Get or create a worker instance\n * @param type - Worker type\n * @param id - Optional ID for per-resource or per-clip workers\n * @param options - Optional configuration\n * - lazy: If true, skip initial configure (default: false)\n */\n async getOrCreate(\n type: WorkerType,\n id?: string,\n options?: { lazy?: boolean }\n ): Promise<BaseWorker> {\n const key = id ? `${type}#${id}` : type;\n\n const existing = this.pool.get(key);\n if (!existing) {\n // Generate worker URL based on worker path and type\n const url = await this.getWorkerUrl(type);\n\n const worker = new BaseWorker({\n type,\n url,\n eventBus: this.eventBus,\n clipId: id,\n });\n\n // Only initialize if not in lazy mode\n if (!options?.lazy) {\n const config = this.workerConfigs[type];\n await worker.initialize(config);\n }\n\n this.pool.set(key, worker);\n return worker;\n }\n\n if (!options?.lazy) {\n const config = this.workerConfigs[type];\n if (config) {\n await existing.send(WorkerMessageType.Configure, {\n config,\n initial: false,\n } as WorkerConfigurePayload);\n }\n }\n\n return existing;\n }\n\n async setConfig(type: WorkerType, config: any): Promise<void> {\n const existing = this.workerConfigs[type] || {};\n const mergedConfig = { ...existing, ...config };\n\n this.workerConfigs[type] = mergedConfig;\n\n for (const [key, worker] of this.pool.entries()) {\n if (key === type || key.startsWith(`${type}#`)) {\n await worker.send(WorkerMessageType.Configure, {\n config: mergedConfig,\n initial: false,\n } as WorkerConfigurePayload);\n }\n }\n }\n\n /**\n * Terminate a specific worker\n */\n terminate(type: WorkerType, id?: string): void {\n const key = id ? `${type}#${id}` : type;\n const worker = this.pool.get(key);\n\n if (worker) {\n worker.terminate();\n this.pool.delete(key);\n }\n }\n\n /**\n * Terminate all workers\n */\n terminateAll(): void {\n for (const worker of this.pool.values()) {\n worker.terminate();\n }\n this.pool.clear();\n }\n\n /**\n * Get status of all workers\n */\n get status(): Record<string, WorkerStatus[WorkerType]> {\n const result: Record<string, WorkerStatus[WorkerType]> = {};\n\n for (const [key, worker] of this.pool.entries()) {\n result[key] = worker.status;\n }\n\n return result;\n }\n\n /**\n * Get list of active worker keys\n */\n get activeWorkers(): string[] {\n return Array.from(this.pool.keys());\n }\n\n /**\n * Check if a worker exists\n */\n has(type: WorkerType, id?: string): boolean {\n const key = id ? `${type}#${id}` : type;\n return this.pool.has(key);\n }\n}\n"],"names":[],"mappings":";;;AAuBA,MAAM,oBAAgD;AAAA,EACpD,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AACf;AAEO,MAAM,WAAW;AAAA,EACd,2BAAW,IAAA;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAyD;AAAA,EAEjE,YAAY,QAA0B;AACpC,SAAK,WAAW,OAAO;AACvB,SAAK,gBAAgB,OAAO,iBAAiB,CAAA;AAC7C,SAAK,aAAa,OAAO,cAAc;AACvC,SAAK,kBAAkB,OAAO,mBAAmB;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,MAAmC;AAC5D,UAAM,WAAW,kBAAkB,IAAI;AAGvC,UAAM,WAAmC;AAAA,MACvC,eAAe;AAAA,MACf,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,QAAQ;AAAA,IAAA;AAEV,UAAM,QAAQ,SAAS,QAAQ;AAG/B,QAAI,KAAK,oBAAoB,OAAO;AAClC,aAAO,GAAG,KAAK,UAAU,WAAW,KAAK,IAAI,QAAQ;AAAA,IACvD;AAGA,QAAI,CAAC,KAAK,iBAAiB;AACzB,WAAK,kBAAkB,mBAAmB,KAAK,UAAU;AAAA,IAC3D;AAEA,UAAM,WAAW,MAAM,KAAK;AAE5B,QAAI,UAAU;AAEZ,YAAM,cAAc,GAAG,QAAQ;AAC/B,YAAM,aAAa,SAAS,WAAW;AAEvC,UAAI,YAAY;AAEd,eAAO,GAAG,KAAK,UAAU,IAAI,UAAU;AAAA,MACzC;AAAA,IACF;AAGA,WAAO,GAAG,KAAK,UAAU,WAAW,KAAK,IAAI,QAAQ;AAAA,EACvD;AAAA,EAEA,IAAI,MAAkB,IAAqC;AACzD,UAAM,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,KAAK;AACnC,WAAO,KAAK,KAAK,IAAI,GAAG,KAAK;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YACJ,MACA,IACA,SACqB;AACrB,UAAM,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,KAAK;AAEnC,UAAM,WAAW,KAAK,KAAK,IAAI,GAAG;AAClC,QAAI,CAAC,UAAU;AAEb,YAAM,MAAM,MAAM,KAAK,aAAa,IAAI;AAExC,YAAM,SAAS,IAAI,WAAW;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,UAAU,KAAK;AAAA,QACf,QAAQ;AAAA,MAAA,CACT;AAGD,UAAI,CAAC,SAAS,MAAM;AAClB,cAAM,SAAS,KAAK,cAAc,IAAI;AACtC,cAAM,OAAO,WAAW,MAAM;AAAA,MAChC;AAEA,WAAK,KAAK,IAAI,KAAK,MAAM;AACzB,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,SAAS,MAAM;AAClB,YAAM,SAAS,KAAK,cAAc,IAAI;AACtC,UAAI,QAAQ;AACV,cAAM,SAAS,KAAK,kBAAkB,WAAW;AAAA,UAC/C;AAAA,UACA,SAAS;AAAA,QAAA,CACgB;AAAA,MAC7B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,MAAkB,QAA4B;AAC5D,UAAM,WAAW,KAAK,cAAc,IAAI,KAAK,CAAA;AAC7C,UAAM,eAAe,EAAE,GAAG,UAAU,GAAG,OAAA;AAEvC,SAAK,cAAc,IAAI,IAAI;AAE3B,eAAW,CAAC,KAAK,MAAM,KAAK,KAAK,KAAK,WAAW;AAC/C,UAAI,QAAQ,QAAQ,IAAI,WAAW,GAAG,IAAI,GAAG,GAAG;AAC9C,cAAM,OAAO,KAAK,kBAAkB,WAAW;AAAA,UAC7C,QAAQ;AAAA,UACR,SAAS;AAAA,QAAA,CACgB;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAkB,IAAmB;AAC7C,UAAM,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,KAAK;AACnC,UAAM,SAAS,KAAK,KAAK,IAAI,GAAG;AAEhC,QAAI,QAAQ;AACV,aAAO,UAAA;AACP,WAAK,KAAK,OAAO,GAAG;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAqB;AACnB,eAAW,UAAU,KAAK,KAAK,OAAA,GAAU;AACvC,aAAO,UAAA;AAAA,IACT;AACA,SAAK,KAAK,MAAA;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAmD;AACrD,UAAM,SAAmD,CAAA;AAEzD,eAAW,CAAC,KAAK,MAAM,KAAK,KAAK,KAAK,WAAW;AAC/C,aAAO,GAAG,IAAI,OAAO;AAAA,IACvB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,gBAA0B;AAC5B,WAAO,MAAM,KAAK,KAAK,KAAK,MAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAkB,IAAsB;AAC1C,UAAM,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,KAAK;AACnC,WAAO,KAAK,KAAK,IAAI,GAAG;AAAA,EAC1B;AACF;"}
1
+ {"version":3,"file":"WorkerPool.js","sources":["../../src/worker/WorkerPool.ts"],"sourcesContent":["/**\n * WorkerPool: Manages worker instances with key-based access\n * Provides lazy creation and unified management of workers\n */\n\nimport { BaseWorker } from './BaseWorker';\nimport type { WorkerType, WorkerStatus, WorkerConfigurePayload } from './types';\nimport { WorkerMessageType } from './types';\nimport type { EventBus } from '../event/EventBus';\nimport type { EventPayloadMap } from '../event/events';\nimport { loadWorkerManifest, type WorkerManifest } from './worker-manifest';\n\nexport interface WorkerPoolConfig {\n eventBus: EventBus<EventPayloadMap>;\n workerConfigs?: Record<WorkerType, any>;\n /** Worker files base path (default: '/meframe-workers') */\n workerPath?: string;\n workerExtension?: string;\n}\n\n/**\n * Worker name mapping (worker type -> file name)\n */\nconst WORKER_FILE_NAMES: Partial<Record<WorkerType, string>> = {\n // videoDemux: 'video-demux', // DEPRECATED: Removed - use IndexedVideoSource\n audioDemux: 'audio-demux',\n // videoDecode: 'video-decode', // DEPRECATED: Removed - use OnDemandVideoSession (main thread)\n audioDecode: 'audio-decode',\n videoCompose: 'video-compose',\n audioCompose: 'audio-compose',\n videoEncode: 'video-encode',\n};\n\nexport class WorkerPool {\n private pool = new Map<string, BaseWorker>();\n private eventBus: EventBus<EventPayloadMap>;\n private workerConfigs: Record<string, any>;\n private workerPath: string;\n private workerExtension: string;\n private manifestPromise: Promise<WorkerManifest | null> | null = null;\n\n constructor(config: WorkerPoolConfig) {\n this.eventBus = config.eventBus;\n this.workerConfigs = config.workerConfigs || {};\n this.workerPath = config.workerPath || '/meframe-workers';\n this.workerExtension = config.workerExtension || '.js';\n }\n\n /**\n * Get worker URL for a specific worker type\n */\n private async getWorkerUrl(type: WorkerType): Promise<string> {\n const fileName = WORKER_FILE_NAMES[type];\n\n if (!fileName) {\n throw new Error(`[WorkerPool] Worker type '${type}' is deprecated or not supported`);\n }\n\n // Map worker type to its stage directory\n const stageMap: Record<string, string> = {\n 'video-demux': 'demux',\n 'audio-demux': 'demux',\n 'video-decode': 'decode',\n 'audio-decode': 'decode',\n decode: 'decode',\n 'video-compose': 'compose',\n 'audio-compose': 'compose',\n 'video-encode': 'encode',\n encode: 'encode',\n };\n const stage = stageMap[fileName];\n\n // Dev mode: use .ts source files directly (no manifest needed)\n if (this.workerExtension === '.ts') {\n return `${this.workerPath}/stages/${stage}/${fileName}.worker.ts`;\n }\n\n // Production mode: try to load manifest for hashed filenames\n if (!this.manifestPromise) {\n this.manifestPromise = loadWorkerManifest(this.workerPath);\n }\n\n const manifest = await this.manifestPromise;\n\n if (manifest) {\n // Use hashed filename from manifest\n const manifestKey = `${fileName}.worker`;\n const hashedPath = manifest[manifestKey];\n\n if (hashedPath) {\n // Manifest contains full relative path from workers directory\n return `${this.workerPath}/${hashedPath}`;\n }\n }\n\n // Fallback: use non-hashed filename (backward compatibility)\n return `${this.workerPath}/stages/${stage}/${fileName}.worker.js`;\n }\n\n get(type: WorkerType, id?: string): BaseWorker | undefined {\n const key = id ? `${type}#${id}` : type;\n return this.pool.get(key) ?? undefined;\n }\n\n /**\n * Get or create a worker instance\n * @param type - Worker type\n * @param id - Optional ID for per-resource or per-clip workers\n * @param options - Optional configuration\n * - lazy: If true, skip initial configure (default: false)\n */\n async getOrCreate(\n type: WorkerType,\n id?: string,\n options?: { lazy?: boolean }\n ): Promise<BaseWorker> {\n const key = id ? `${type}#${id}` : type;\n\n const existing = this.pool.get(key);\n if (!existing) {\n // Generate worker URL based on worker path and type\n const url = await this.getWorkerUrl(type);\n\n const worker = new BaseWorker({\n type,\n url,\n eventBus: this.eventBus,\n clipId: id,\n });\n\n // Only initialize if not in lazy mode\n if (!options?.lazy) {\n const config = this.workerConfigs[type];\n await worker.initialize(config);\n }\n\n this.pool.set(key, worker);\n return worker;\n }\n\n if (!options?.lazy) {\n const config = this.workerConfigs[type];\n if (config) {\n await existing.send(WorkerMessageType.Configure, {\n config,\n initial: false,\n } as WorkerConfigurePayload);\n }\n }\n\n return existing;\n }\n\n async setConfig(type: WorkerType, config: any): Promise<void> {\n const existing = this.workerConfigs[type] || {};\n const mergedConfig = { ...existing, ...config };\n\n this.workerConfigs[type] = mergedConfig;\n\n for (const [key, worker] of this.pool.entries()) {\n if (key === type || key.startsWith(`${type}#`)) {\n await worker.send(WorkerMessageType.Configure, {\n config: mergedConfig,\n initial: false,\n } as WorkerConfigurePayload);\n }\n }\n }\n\n /**\n * Terminate a specific worker\n */\n terminate(type: WorkerType, id?: string): void {\n const key = id ? `${type}#${id}` : type;\n const worker = this.pool.get(key);\n\n if (worker) {\n worker.terminate();\n this.pool.delete(key);\n }\n }\n\n /**\n * Terminate all workers\n */\n terminateAll(): void {\n for (const worker of this.pool.values()) {\n worker.terminate();\n }\n this.pool.clear();\n }\n\n /**\n * Get status of all workers\n */\n get status(): Record<string, WorkerStatus[WorkerType]> {\n const result: Record<string, WorkerStatus[WorkerType]> = {};\n\n for (const [key, worker] of this.pool.entries()) {\n result[key] = worker.status;\n }\n\n return result;\n }\n\n /**\n * Get list of active worker keys\n */\n get activeWorkers(): string[] {\n return Array.from(this.pool.keys());\n }\n\n /**\n * Check if a worker exists\n */\n has(type: WorkerType, id?: string): boolean {\n const key = id ? `${type}#${id}` : type;\n return this.pool.has(key);\n }\n}\n"],"names":[],"mappings":"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"}
@@ -37,7 +37,29 @@ function extractTransferables(payload) {
37
37
  findTransferables(payload, transferables);
38
38
  return transferables;
39
39
  }
40
+ function encodedVideoChunkToTransferable(chunk) {
41
+ const data = new ArrayBuffer(chunk.byteLength);
42
+ chunk.copyTo(new Uint8Array(data));
43
+ return {
44
+ data,
45
+ type: chunk.type,
46
+ timestamp: chunk.timestamp,
47
+ duration: chunk.duration
48
+ };
49
+ }
50
+ function encodedAudioChunkToTransferable(chunk) {
51
+ const data = new ArrayBuffer(chunk.byteLength);
52
+ chunk.copyTo(new Uint8Array(data));
53
+ return {
54
+ data,
55
+ type: chunk.type,
56
+ timestamp: chunk.timestamp,
57
+ duration: chunk.duration
58
+ };
59
+ }
40
60
  export {
61
+ encodedAudioChunkToTransferable,
62
+ encodedVideoChunkToTransferable,
41
63
  extractTransferables,
42
64
  isTransferable
43
65
  };
@@ -1 +1 @@
1
- {"version":3,"file":"transferable-helper.js","sources":["../../src/worker/transferable-helper.ts"],"sourcesContent":["/**\n * Utility functions for handling Transferable objects\n * Simplifies the process of transferring ownership of objects between workers\n */\n\n/**\n * Check if an object is transferable\n */\nexport function isTransferable(obj: any): obj is Transferable {\n return (\n obj instanceof ArrayBuffer ||\n obj instanceof MessagePort ||\n (typeof ImageBitmap !== 'undefined' && obj instanceof ImageBitmap) ||\n (typeof OffscreenCanvas !== 'undefined' && obj instanceof OffscreenCanvas) ||\n (typeof ReadableStream !== 'undefined' && obj instanceof ReadableStream) ||\n (typeof WritableStream !== 'undefined' && obj instanceof WritableStream) ||\n (typeof TransformStream !== 'undefined' && obj instanceof TransformStream)\n );\n}\n\n/**\n * Recursively find transferable objects in a payload\n */\nfunction findTransferables(obj: any, transferables: Transferable[]): void {\n if (!obj || typeof obj !== 'object') {\n return;\n }\n\n // Check if object itself is transferable\n if (isTransferable(obj)) {\n transferables.push(obj);\n return;\n }\n\n // Check VideoFrame\n if (obj instanceof VideoFrame) {\n transferables.push(obj);\n return;\n }\n\n // Check AudioData\n if (typeof AudioData !== 'undefined' && obj instanceof AudioData) {\n transferables.push(obj);\n return;\n }\n\n // EncodedVideoChunk and EncodedAudioChunk are not transferable\n if (\n (typeof EncodedVideoChunk !== 'undefined' && obj instanceof EncodedVideoChunk) ||\n (typeof EncodedAudioChunk !== 'undefined' && obj instanceof EncodedAudioChunk)\n ) {\n return;\n }\n\n // Recursively check object properties\n if (Array.isArray(obj)) {\n for (const item of obj) {\n findTransferables(item, transferables);\n }\n } else {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n findTransferables(obj[key], transferables);\n }\n }\n }\n}\n\n/**\n * Extract transferable objects from a payload\n */\nexport function extractTransferables(payload: any): Transferable[] {\n const transferables: Transferable[] = [];\n findTransferables(payload, transferables);\n return transferables;\n}\n\n/**\n * Wrap VideoFrame for transfer with metadata\n */\nexport function wrapVideoFrame(frame: VideoFrame) {\n return {\n frame,\n metadata: {\n timestamp: frame.timestamp,\n duration: frame.duration,\n codedWidth: frame.codedWidth,\n codedHeight: frame.codedHeight,\n displayWidth: frame.displayWidth,\n displayHeight: frame.displayHeight,\n format: frame.format,\n },\n };\n}\n\n/**\n * Wrap AudioData for transfer with metadata\n */\nexport function wrapAudioData(audio: AudioData) {\n return {\n audio,\n metadata: {\n timestamp: audio.timestamp,\n duration: audio.duration,\n numberOfFrames: audio.numberOfFrames,\n numberOfChannels: audio.numberOfChannels,\n sampleRate: audio.sampleRate,\n format: audio.format,\n },\n };\n}\n\n/**\n * Convert EncodedVideoChunk to transferable format\n */\nexport function encodedVideoChunkToTransferable(chunk: EncodedVideoChunk) {\n const data = new ArrayBuffer(chunk.byteLength);\n chunk.copyTo(new Uint8Array(data));\n\n return {\n data,\n type: chunk.type,\n timestamp: chunk.timestamp,\n duration: chunk.duration,\n };\n}\n\n/**\n * Convert EncodedAudioChunk to transferable format\n */\nexport function encodedAudioChunkToTransferable(chunk: EncodedAudioChunk) {\n const data = new ArrayBuffer(chunk.byteLength);\n chunk.copyTo(new Uint8Array(data));\n\n return {\n data,\n type: chunk.type,\n timestamp: chunk.timestamp,\n duration: chunk.duration,\n };\n}\n\n/**\n * Recreate EncodedVideoChunk from transferable format\n */\nexport function transferableToEncodedVideoChunk(transferable: {\n data: ArrayBuffer;\n type: 'key' | 'delta';\n timestamp: number;\n duration?: number;\n}): EncodedVideoChunk {\n return new EncodedVideoChunk({\n type: transferable.type,\n timestamp: transferable.timestamp,\n duration: transferable.duration,\n data: transferable.data,\n });\n}\n\n/**\n * Recreate EncodedAudioChunk from transferable format\n */\nexport function transferableToEncodedAudioChunk(transferable: {\n data: ArrayBuffer;\n type: 'key' | 'delta';\n timestamp: number;\n duration?: number;\n}): EncodedAudioChunk {\n return new EncodedAudioChunk({\n type: transferable.type,\n timestamp: transferable.timestamp,\n duration: transferable.duration,\n data: transferable.data,\n });\n}\n\n/**\n * Transfer OffscreenCanvas control to worker\n */\nexport function transferCanvas(canvas: HTMLCanvasElement): OffscreenCanvas {\n return canvas.transferControlToOffscreen();\n}\n\n/**\n * Create a transferable stream pair\n */\nexport function createStreamPair<T>(): {\n readable: ReadableStream<T>;\n writable: WritableStream<T>;\n} {\n const { readable, writable } = new TransformStream<T>();\n return { readable, writable };\n}\n"],"names":[],"mappings":"AAQO,SAAS,eAAe,KAA+B;AAC5D,SACE,eAAe,eACf,eAAe,eACd,OAAO,gBAAgB,eAAe,eAAe,eACrD,OAAO,oBAAoB,eAAe,eAAe,mBACzD,OAAO,mBAAmB,eAAe,eAAe,kBACxD,OAAO,mBAAmB,eAAe,eAAe,kBACxD,OAAO,oBAAoB,eAAe,eAAe;AAE9D;AAKA,SAAS,kBAAkB,KAAU,eAAqC;AACxE,MAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC;AAAA,EACF;AAGA,MAAI,eAAe,GAAG,GAAG;AACvB,kBAAc,KAAK,GAAG;AACtB;AAAA,EACF;AAGA,MAAI,eAAe,YAAY;AAC7B,kBAAc,KAAK,GAAG;AACtB;AAAA,EACF;AAGA,MAAI,OAAO,cAAc,eAAe,eAAe,WAAW;AAChE,kBAAc,KAAK,GAAG;AACtB;AAAA,EACF;AAGA,MACG,OAAO,sBAAsB,eAAe,eAAe,qBAC3D,OAAO,sBAAsB,eAAe,eAAe,mBAC5D;AACA;AAAA,EACF;AAGA,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,eAAW,QAAQ,KAAK;AACtB,wBAAkB,MAAM,aAAa;AAAA,IACvC;AAAA,EACF,OAAO;AACL,eAAW,OAAO,KAAK;AACrB,UAAI,OAAO,UAAU,eAAe,KAAK,KAAK,GAAG,GAAG;AAClD,0BAAkB,IAAI,GAAG,GAAG,aAAa;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,qBAAqB,SAA8B;AACjE,QAAM,gBAAgC,CAAA;AACtC,oBAAkB,SAAS,aAAa;AACxC,SAAO;AACT;"}
1
+ {"version":3,"file":"transferable-helper.js","sources":["../../src/worker/transferable-helper.ts"],"sourcesContent":["/**\n * Utility functions for handling Transferable objects\n * Simplifies the process of transferring ownership of objects between workers\n */\n\n/**\n * Check if an object is transferable\n */\nexport function isTransferable(obj: any): obj is Transferable {\n return (\n obj instanceof ArrayBuffer ||\n obj instanceof MessagePort ||\n (typeof ImageBitmap !== 'undefined' && obj instanceof ImageBitmap) ||\n (typeof OffscreenCanvas !== 'undefined' && obj instanceof OffscreenCanvas) ||\n (typeof ReadableStream !== 'undefined' && obj instanceof ReadableStream) ||\n (typeof WritableStream !== 'undefined' && obj instanceof WritableStream) ||\n (typeof TransformStream !== 'undefined' && obj instanceof TransformStream)\n );\n}\n\n/**\n * Recursively find transferable objects in a payload\n */\nfunction findTransferables(obj: any, transferables: Transferable[]): void {\n if (!obj || typeof obj !== 'object') {\n return;\n }\n\n // Check if object itself is transferable\n if (isTransferable(obj)) {\n transferables.push(obj);\n return;\n }\n\n // Check VideoFrame\n if (obj instanceof VideoFrame) {\n transferables.push(obj);\n return;\n }\n\n // Check AudioData\n if (typeof AudioData !== 'undefined' && obj instanceof AudioData) {\n transferables.push(obj);\n return;\n }\n\n // EncodedVideoChunk and EncodedAudioChunk are not transferable\n if (\n (typeof EncodedVideoChunk !== 'undefined' && obj instanceof EncodedVideoChunk) ||\n (typeof EncodedAudioChunk !== 'undefined' && obj instanceof EncodedAudioChunk)\n ) {\n return;\n }\n\n // Recursively check object properties\n if (Array.isArray(obj)) {\n for (const item of obj) {\n findTransferables(item, transferables);\n }\n } else {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n findTransferables(obj[key], transferables);\n }\n }\n }\n}\n\n/**\n * Extract transferable objects from a payload\n */\nexport function extractTransferables(payload: any): Transferable[] {\n const transferables: Transferable[] = [];\n findTransferables(payload, transferables);\n return transferables;\n}\n\n/**\n * Wrap VideoFrame for transfer with metadata\n */\nexport function wrapVideoFrame(frame: VideoFrame) {\n return {\n frame,\n metadata: {\n timestamp: frame.timestamp,\n duration: frame.duration,\n codedWidth: frame.codedWidth,\n codedHeight: frame.codedHeight,\n displayWidth: frame.displayWidth,\n displayHeight: frame.displayHeight,\n format: frame.format,\n },\n };\n}\n\n/**\n * Wrap AudioData for transfer with metadata\n */\nexport function wrapAudioData(audio: AudioData) {\n return {\n audio,\n metadata: {\n timestamp: audio.timestamp,\n duration: audio.duration,\n numberOfFrames: audio.numberOfFrames,\n numberOfChannels: audio.numberOfChannels,\n sampleRate: audio.sampleRate,\n format: audio.format,\n },\n };\n}\n\n/**\n * Convert EncodedVideoChunk to transferable format\n */\nexport function encodedVideoChunkToTransferable(chunk: EncodedVideoChunk) {\n const data = new ArrayBuffer(chunk.byteLength);\n chunk.copyTo(new Uint8Array(data));\n\n return {\n data,\n type: chunk.type,\n timestamp: chunk.timestamp,\n duration: chunk.duration,\n };\n}\n\n/**\n * Convert EncodedAudioChunk to transferable format\n */\nexport function encodedAudioChunkToTransferable(chunk: EncodedAudioChunk) {\n const data = new ArrayBuffer(chunk.byteLength);\n chunk.copyTo(new Uint8Array(data));\n\n return {\n data,\n type: chunk.type,\n timestamp: chunk.timestamp,\n duration: chunk.duration,\n };\n}\n\n/**\n * Recreate EncodedVideoChunk from transferable format\n */\nexport function transferableToEncodedVideoChunk(transferable: {\n data: ArrayBuffer;\n type: 'key' | 'delta';\n timestamp: number;\n duration?: number;\n}): EncodedVideoChunk {\n return new EncodedVideoChunk({\n type: transferable.type,\n timestamp: transferable.timestamp,\n duration: transferable.duration,\n data: transferable.data,\n });\n}\n\n/**\n * Recreate EncodedAudioChunk from transferable format\n */\nexport function transferableToEncodedAudioChunk(transferable: {\n data: ArrayBuffer;\n type: 'key' | 'delta';\n timestamp: number;\n duration?: number;\n}): EncodedAudioChunk {\n return new EncodedAudioChunk({\n type: transferable.type,\n timestamp: transferable.timestamp,\n duration: transferable.duration,\n data: transferable.data,\n });\n}\n\n/**\n * Transfer OffscreenCanvas control to worker\n */\nexport function transferCanvas(canvas: HTMLCanvasElement): OffscreenCanvas {\n return canvas.transferControlToOffscreen();\n}\n\n/**\n * Create a transferable stream pair\n */\nexport function createStreamPair<T>(): {\n readable: ReadableStream<T>;\n writable: WritableStream<T>;\n} {\n const { readable, writable } = new TransformStream<T>();\n return { readable, writable };\n}\n"],"names":[],"mappings":"AAQO,SAAS,eAAe,KAA+B;AAC5D,SACE,eAAe,eACf,eAAe,eACd,OAAO,gBAAgB,eAAe,eAAe,eACrD,OAAO,oBAAoB,eAAe,eAAe,mBACzD,OAAO,mBAAmB,eAAe,eAAe,kBACxD,OAAO,mBAAmB,eAAe,eAAe,kBACxD,OAAO,oBAAoB,eAAe,eAAe;AAE9D;AAKA,SAAS,kBAAkB,KAAU,eAAqC;AACxE,MAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC;AAAA,EACF;AAGA,MAAI,eAAe,GAAG,GAAG;AACvB,kBAAc,KAAK,GAAG;AACtB;AAAA,EACF;AAGA,MAAI,eAAe,YAAY;AAC7B,kBAAc,KAAK,GAAG;AACtB;AAAA,EACF;AAGA,MAAI,OAAO,cAAc,eAAe,eAAe,WAAW;AAChE,kBAAc,KAAK,GAAG;AACtB;AAAA,EACF;AAGA,MACG,OAAO,sBAAsB,eAAe,eAAe,qBAC3D,OAAO,sBAAsB,eAAe,eAAe,mBAC5D;AACA;AAAA,EACF;AAGA,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,eAAW,QAAQ,KAAK;AACtB,wBAAkB,MAAM,aAAa;AAAA,IACvC;AAAA,EACF,OAAO;AACL,eAAW,OAAO,KAAK;AACrB,UAAI,OAAO,UAAU,eAAe,KAAK,KAAK,GAAG,GAAG;AAClD,0BAAkB,IAAI,GAAG,GAAG,aAAa;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,qBAAqB,SAA8B;AACjE,QAAM,gBAAgC,CAAA;AACtC,oBAAkB,SAAS,aAAa;AACxC,SAAO;AACT;AAwCO,SAAS,gCAAgC,OAA0B;AACxE,QAAM,OAAO,IAAI,YAAY,MAAM,UAAU;AAC7C,QAAM,OAAO,IAAI,WAAW,IAAI,CAAC;AAEjC,SAAO;AAAA,IACL;AAAA,IACA,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM;AAAA,IACjB,UAAU,MAAM;AAAA,EAAA;AAEpB;AAKO,SAAS,gCAAgC,OAA0B;AACxE,QAAM,OAAO,IAAI,YAAY,MAAM,UAAU;AAC7C,QAAM,OAAO,IAAI,WAAW,IAAI,CAAC;AAEjC,SAAO;AAAA,IACL;AAAA,IACA,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM;AAAA,IACjB,UAAU,MAAM;AAAA,EAAA;AAEpB;"}
@@ -6,7 +6,7 @@ export type PortLike = MessagePort | DedicatedWorkerGlobalScope | Worker;
6
6
  /**
7
7
  * Worker types in the pipeline
8
8
  */
9
- export type WorkerType = 'videoDemux' | 'audioDemux' | 'videoDecode' | 'audioDecode' | 'videoCompose' | 'audioCompose' | 'videoEncode';
9
+ export type WorkerType = 'audioDemux' | 'audioDecode' | 'videoCompose' | 'audioCompose' | 'videoEncode';
10
10
  export interface WorkerConfigurePayload<T = any> {
11
11
  config: T;
12
12
  initial: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/worker/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/worker/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../src/worker/types.ts"],"sourcesContent":["/**\n * Worker Communication Protocol Types\n * Define standard message types and protocols for worker communication\n */\n\n// A port-like object that supports postMessage/onmessage used by WorkerChannel\nexport type PortLike = MessagePort | DedicatedWorkerGlobalScope | Worker;\n\n/**\n * Worker types in the pipeline\n */\nexport type WorkerType =\n | 'videoDemux'\n | 'audioDemux'\n | 'videoDecode' // Clip-local video decoder\n | 'audioDecode' // Clip-local audio decoder\n | 'videoCompose'\n | 'audioCompose'\n | 'videoEncode'; // Clip-local video encoder (L2 only)\n\nexport interface WorkerConfigurePayload<T = any> {\n config: T;\n initial: boolean;\n}\n\n/**\n * Worker state definition\n */\nexport interface WorkerStateInfo {\n state: 'idle' | 'busy' | 'error' | 'terminated';\n taskCount: number;\n lastError?: string;\n}\n\n/**\n * Worker status for all workers\n */\nexport type WorkerStatus = Record<WorkerType, WorkerStateInfo>;\n\n/**\n * Worker wrapper interface\n */\nexport interface IWorker {\n readonly type: WorkerType;\n readonly state: WorkerStateInfo;\n\n initialize(): Promise<void>;\n terminate(): Promise<void>;\n restart(): Promise<void>;\n\n postMessage(message: any, transfer?: Transferable[]): void;\n on(event: string, handler: (data: any) => void): void;\n off(event: string, handler: (data: any) => void): void;\n}\n\n// Message types for different workers\nexport enum WorkerMessageType {\n // Init = 'init', // configure, { initial: true }\n Ready = 'ready',\n Error = 'error',\n Dispose = 'dispose',\n Configure = 'configure',\n LoadResource = 'load_resource',\n ResourceLoaded = 'resource_loaded',\n ResourceProgress = 'resource_progress',\n ConfigureDemux = 'configure_demux',\n AppendBuffer = 'append_buffer',\n DemuxSamples = 'demux_samples',\n FlushDemux = 'flush_demux',\n ConfigureDecode = 'configure_decode',\n DecodeChunk = 'decode_chunk',\n DecodedFrame = 'decoded_frame',\n SeekGop = 'seek_gop',\n SetComposition = 'set_composition',\n ApplyPatch = 'apply_patch',\n RenderFrame = 'render_frame',\n ComposeFrameReady = 'compose_frame_ready',\n ConfigureEncode = 'configure_encode',\n EncodeFrame = 'encode_frame',\n EncodeAudio = 'encode_audio',\n EncodedChunk = 'encoded_chunk',\n FlushEncode = 'flush_encode',\n AddChunk = 'add_chunk',\n PerformanceStats = 'performance_stats',\n RenderWindow = 'renderWindow',\n AudioTrackAdd = 'audio_track:add',\n AudioTrackRemove = 'audio_track:remove',\n AudioTrackUpdate = 'audio_track:update',\n}\n\n// Base message structure\nexport interface WorkerMessage<T = any> {\n type: WorkerMessageType;\n id: string; // Unique message ID for request-response pairing\n payload?: T;\n transfer?: Transferable[]; // Objects to transfer ownership\n timestamp: number;\n}\n\n// Response message structure\nexport interface WorkerResponse<T = any> {\n id: string; // Matches request ID\n success: boolean;\n result?: T;\n error?: WorkerError;\n timestamp: number;\n}\n\n// Error structure\nexport interface WorkerError {\n code: string;\n message: string;\n details?: any;\n stack?: string;\n}\n\n// Worker configuration\nexport interface WorkerConfig {\n name: string;\n workerUrl?: string;\n capabilities?: string[];\n maxRetries?: number;\n timeout?: number;\n}\n\n// Message handler type\nexport type MessageHandler<T = any, R = any> = (\n payload: T,\n transfer?: Transferable[]\n) => Promise<R> | R;\n\n// Message handler registry\nexport interface MessageHandlers {\n [key: string]: MessageHandler;\n}\n\n/**\n * Unified stream connection message for the data plane\n * Used by the stream-pipeline refactor to reduce message surface\n */\nexport interface ConnectMsg {\n direction: 'upstream';\n port: MessagePort;\n streamType: 'video' | 'audio' | 'frame' | 'chunk';\n clipId?: string;\n trackId?: string;\n}\n\n// Transferable types used in workers\nexport interface TransferableFrame {\n frame: VideoFrame;\n timestamp: number;\n duration?: number;\n}\n\nexport interface TransferableChunk {\n chunk: EncodedVideoChunk | EncodedAudioChunk;\n timestamp: number;\n duration?: number;\n trackId: string;\n}\n\nexport interface TransferableBuffer {\n buffer: ArrayBuffer;\n offset?: number;\n length?: number;\n}\n\n// Worker state\nexport enum WorkerState {\n Idle = 'idle',\n Initializing = 'initializing',\n Ready = 'ready',\n Processing = 'processing',\n Error = 'error',\n Disposed = 'disposed',\n}\n\n// Performance metrics\nexport interface WorkerPerformanceStats {\n workerId: string;\n workerName: string;\n messagesProcessed: number;\n averageProcessingTime: number;\n maxProcessingTime: number;\n errorCount: number;\n queueSize: number;\n memoryUsage?: number;\n}\n\n// Request tracking\nexport interface PendingRequest {\n id: string;\n type: WorkerMessageType;\n timestamp: number;\n timeout?: number;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n retryCount?: number;\n maxRetries?: number;\n}\n\n// Stream support\nexport interface StreamConfig {\n highWaterMark?: number;\n strategy?: QueuingStrategy;\n}\n\n// Worker pool settings\nexport interface WorkerPoolSettings {\n maxWorkers?: number;\n workerIdleTimeout?: number;\n enableSharedArrayBuffer?: boolean;\n enableOffscreenCanvas?: boolean;\n}\n\n// Message priority levels\nexport enum MessagePriority {\n Low = 0,\n Normal = 1,\n High = 2,\n Critical = 3,\n}\n\n// Priority message\nexport interface PriorityMessage<T = any> extends WorkerMessage<T> {\n priority: MessagePriority;\n}\n"],"names":["WorkerMessageType","WorkerState"],"mappings":"AAwDO,IAAK,sCAAAA,uBAAL;AAELA,qBAAA,OAAA,IAAQ;AACRA,qBAAA,OAAA,IAAQ;AACRA,qBAAA,SAAA,IAAU;AACVA,qBAAA,WAAA,IAAY;AACZA,qBAAA,cAAA,IAAe;AACfA,qBAAA,gBAAA,IAAiB;AACjBA,qBAAA,kBAAA,IAAmB;AACnBA,qBAAA,gBAAA,IAAiB;AACjBA,qBAAA,cAAA,IAAe;AACfA,qBAAA,cAAA,IAAe;AACfA,qBAAA,YAAA,IAAa;AACbA,qBAAA,iBAAA,IAAkB;AAClBA,qBAAA,aAAA,IAAc;AACdA,qBAAA,cAAA,IAAe;AACfA,qBAAA,SAAA,IAAU;AACVA,qBAAA,gBAAA,IAAiB;AACjBA,qBAAA,YAAA,IAAa;AACbA,qBAAA,aAAA,IAAc;AACdA,qBAAA,mBAAA,IAAoB;AACpBA,qBAAA,iBAAA,IAAkB;AAClBA,qBAAA,aAAA,IAAc;AACdA,qBAAA,aAAA,IAAc;AACdA,qBAAA,cAAA,IAAe;AACfA,qBAAA,aAAA,IAAc;AACdA,qBAAA,UAAA,IAAW;AACXA,qBAAA,kBAAA,IAAmB;AACnBA,qBAAA,cAAA,IAAe;AACfA,qBAAA,eAAA,IAAgB;AAChBA,qBAAA,kBAAA,IAAmB;AACnBA,qBAAA,kBAAA,IAAmB;AA/BT,SAAAA;AAAA,GAAA,qBAAA,CAAA,CAAA;AAiHL,IAAK,gCAAAC,iBAAL;AACLA,eAAA,MAAA,IAAO;AACPA,eAAA,cAAA,IAAe;AACfA,eAAA,OAAA,IAAQ;AACRA,eAAA,YAAA,IAAa;AACbA,eAAA,OAAA,IAAQ;AACRA,eAAA,UAAA,IAAW;AAND,SAAAA;AAAA,GAAA,eAAA,CAAA,CAAA;"}
1
+ {"version":3,"file":"types.js","sources":["../../src/worker/types.ts"],"sourcesContent":["/**\n * Worker Communication Protocol Types\n * Define standard message types and protocols for worker communication\n */\n\n// A port-like object that supports postMessage/onmessage used by WorkerChannel\nexport type PortLike = MessagePort | DedicatedWorkerGlobalScope | Worker;\n\n/**\n * Worker types in the pipeline\n */\nexport type WorkerType =\n // | 'videoDemux' // DEPRECATED: Replaced by IndexedVideoSource (main-thread GOP-based streaming)\n | 'audioDemux'\n // | 'videoDecode' // DEPRECATED: Replaced by OnDemandVideoSession (main-thread decoding)\n | 'audioDecode' // Clip-local audio decoder\n | 'videoCompose'\n | 'audioCompose'\n | 'videoEncode'; // Clip-local video encoder (L2 only)\n\nexport interface WorkerConfigurePayload<T = any> {\n config: T;\n initial: boolean;\n}\n\n/**\n * Worker state definition\n */\nexport interface WorkerStateInfo {\n state: 'idle' | 'busy' | 'error' | 'terminated';\n taskCount: number;\n lastError?: string;\n}\n\n/**\n * Worker status for all workers\n */\nexport type WorkerStatus = Record<WorkerType, WorkerStateInfo>;\n\n/**\n * Worker wrapper interface\n */\nexport interface IWorker {\n readonly type: WorkerType;\n readonly state: WorkerStateInfo;\n\n initialize(): Promise<void>;\n terminate(): Promise<void>;\n restart(): Promise<void>;\n\n postMessage(message: any, transfer?: Transferable[]): void;\n on(event: string, handler: (data: any) => void): void;\n off(event: string, handler: (data: any) => void): void;\n}\n\n// Message types for different workers\nexport enum WorkerMessageType {\n // Init = 'init', // configure, { initial: true }\n Ready = 'ready',\n Error = 'error',\n Dispose = 'dispose',\n Configure = 'configure',\n LoadResource = 'load_resource',\n ResourceLoaded = 'resource_loaded',\n ResourceProgress = 'resource_progress',\n ConfigureDemux = 'configure_demux',\n AppendBuffer = 'append_buffer',\n DemuxSamples = 'demux_samples',\n FlushDemux = 'flush_demux',\n ConfigureDecode = 'configure_decode',\n DecodeChunk = 'decode_chunk',\n DecodedFrame = 'decoded_frame',\n SeekGop = 'seek_gop',\n SetComposition = 'set_composition',\n ApplyPatch = 'apply_patch',\n RenderFrame = 'render_frame',\n ComposeFrameReady = 'compose_frame_ready',\n ConfigureEncode = 'configure_encode',\n EncodeFrame = 'encode_frame',\n EncodeAudio = 'encode_audio',\n EncodedChunk = 'encoded_chunk',\n FlushEncode = 'flush_encode',\n AddChunk = 'add_chunk',\n PerformanceStats = 'performance_stats',\n RenderWindow = 'renderWindow',\n AudioTrackAdd = 'audio_track:add',\n AudioTrackRemove = 'audio_track:remove',\n AudioTrackUpdate = 'audio_track:update',\n}\n\n// Base message structure\nexport interface WorkerMessage<T = any> {\n type: WorkerMessageType;\n id: string; // Unique message ID for request-response pairing\n payload?: T;\n transfer?: Transferable[]; // Objects to transfer ownership\n timestamp: number;\n}\n\n// Response message structure\nexport interface WorkerResponse<T = any> {\n id: string; // Matches request ID\n success: boolean;\n result?: T;\n error?: WorkerError;\n timestamp: number;\n}\n\n// Error structure\nexport interface WorkerError {\n code: string;\n message: string;\n details?: any;\n stack?: string;\n}\n\n// Worker configuration\nexport interface WorkerConfig {\n name: string;\n workerUrl?: string;\n capabilities?: string[];\n maxRetries?: number;\n timeout?: number;\n}\n\n// Message handler type\nexport type MessageHandler<T = any, R = any> = (\n payload: T,\n transfer?: Transferable[]\n) => Promise<R> | R;\n\n// Message handler registry\nexport interface MessageHandlers {\n [key: string]: MessageHandler;\n}\n\n/**\n * Unified stream connection message for the data plane\n * Used by the stream-pipeline refactor to reduce message surface\n */\nexport interface ConnectMsg {\n direction: 'upstream';\n port: MessagePort;\n streamType: 'video' | 'audio' | 'frame' | 'chunk';\n clipId?: string;\n trackId?: string;\n}\n\n// Transferable types used in workers\nexport interface TransferableFrame {\n frame: VideoFrame;\n timestamp: number;\n duration?: number;\n}\n\nexport interface TransferableChunk {\n chunk: EncodedVideoChunk | EncodedAudioChunk;\n timestamp: number;\n duration?: number;\n trackId: string;\n}\n\nexport interface TransferableBuffer {\n buffer: ArrayBuffer;\n offset?: number;\n length?: number;\n}\n\n// Worker state\nexport enum WorkerState {\n Idle = 'idle',\n Initializing = 'initializing',\n Ready = 'ready',\n Processing = 'processing',\n Error = 'error',\n Disposed = 'disposed',\n}\n\n// Performance metrics\nexport interface WorkerPerformanceStats {\n workerId: string;\n workerName: string;\n messagesProcessed: number;\n averageProcessingTime: number;\n maxProcessingTime: number;\n errorCount: number;\n queueSize: number;\n memoryUsage?: number;\n}\n\n// Request tracking\nexport interface PendingRequest {\n id: string;\n type: WorkerMessageType;\n timestamp: number;\n timeout?: number;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n retryCount?: number;\n maxRetries?: number;\n}\n\n// Stream support\nexport interface StreamConfig {\n highWaterMark?: number;\n strategy?: QueuingStrategy;\n}\n\n// Worker pool settings\nexport interface WorkerPoolSettings {\n maxWorkers?: number;\n workerIdleTimeout?: number;\n enableSharedArrayBuffer?: boolean;\n enableOffscreenCanvas?: boolean;\n}\n\n// Message priority levels\nexport enum MessagePriority {\n Low = 0,\n Normal = 1,\n High = 2,\n Critical = 3,\n}\n\n// Priority message\nexport interface PriorityMessage<T = any> extends WorkerMessage<T> {\n priority: MessagePriority;\n}\n"],"names":["WorkerMessageType","WorkerState"],"mappings":"AAwDO,IAAK,sCAAAA,uBAAL;AAELA,qBAAA,OAAA,IAAQ;AACRA,qBAAA,OAAA,IAAQ;AACRA,qBAAA,SAAA,IAAU;AACVA,qBAAA,WAAA,IAAY;AACZA,qBAAA,cAAA,IAAe;AACfA,qBAAA,gBAAA,IAAiB;AACjBA,qBAAA,kBAAA,IAAmB;AACnBA,qBAAA,gBAAA,IAAiB;AACjBA,qBAAA,cAAA,IAAe;AACfA,qBAAA,cAAA,IAAe;AACfA,qBAAA,YAAA,IAAa;AACbA,qBAAA,iBAAA,IAAkB;AAClBA,qBAAA,aAAA,IAAc;AACdA,qBAAA,cAAA,IAAe;AACfA,qBAAA,SAAA,IAAU;AACVA,qBAAA,gBAAA,IAAiB;AACjBA,qBAAA,YAAA,IAAa;AACbA,qBAAA,aAAA,IAAc;AACdA,qBAAA,mBAAA,IAAoB;AACpBA,qBAAA,iBAAA,IAAkB;AAClBA,qBAAA,aAAA,IAAc;AACdA,qBAAA,aAAA,IAAc;AACdA,qBAAA,cAAA,IAAe;AACfA,qBAAA,aAAA,IAAc;AACdA,qBAAA,UAAA,IAAW;AACXA,qBAAA,kBAAA,IAAmB;AACnBA,qBAAA,cAAA,IAAe;AACfA,qBAAA,eAAA,IAAgB;AAChBA,qBAAA,kBAAA,IAAmB;AACnBA,qBAAA,kBAAA,IAAmB;AA/BT,SAAAA;AAAA,GAAA,qBAAA,CAAA,CAAA;AAiHL,IAAK,gCAAAC,iBAAL;AACLA,eAAA,MAAA,IAAO;AACPA,eAAA,cAAA,IAAe;AACfA,eAAA,OAAA,IAAQ;AACRA,eAAA,YAAA,IAAa;AACbA,eAAA,OAAA,IAAQ;AACRA,eAAA,UAAA,IAAW;AAND,SAAAA;AAAA,GAAA,eAAA,CAAA,CAAA;"}
@@ -127,6 +127,26 @@ function extractTransferables(payload) {
127
127
  findTransferables(payload, transferables);
128
128
  return transferables;
129
129
  }
130
+ function encodedVideoChunkToTransferable(chunk) {
131
+ const data = new ArrayBuffer(chunk.byteLength);
132
+ chunk.copyTo(new Uint8Array(data));
133
+ return {
134
+ data,
135
+ type: chunk.type,
136
+ timestamp: chunk.timestamp,
137
+ duration: chunk.duration
138
+ };
139
+ }
140
+ function encodedAudioChunkToTransferable(chunk) {
141
+ const data = new ArrayBuffer(chunk.byteLength);
142
+ chunk.copyTo(new Uint8Array(data));
143
+ return {
144
+ data,
145
+ type: chunk.type,
146
+ timestamp: chunk.timestamp,
147
+ duration: chunk.duration
148
+ };
149
+ }
130
150
  class WorkerChannel {
131
151
  name;
132
152
  port;
@@ -391,6 +411,7 @@ class WorkerChannel {
391
411
  break;
392
412
  }
393
413
  const transfer = [];
414
+ let chunkValue = value;
394
415
  if (value instanceof ArrayBuffer) {
395
416
  transfer.push(value);
396
417
  } else if (value instanceof Uint8Array) {
@@ -399,6 +420,14 @@ class WorkerChannel {
399
420
  transfer.push(value);
400
421
  } else if (typeof VideoFrame !== "undefined" && value instanceof VideoFrame) {
401
422
  transfer.push(value);
423
+ } else if (typeof EncodedVideoChunk !== "undefined" && value instanceof EncodedVideoChunk) {
424
+ const serialized = encodedVideoChunkToTransferable(value);
425
+ transfer.push(serialized.data);
426
+ chunkValue = serialized;
427
+ } else if (typeof EncodedAudioChunk !== "undefined" && value instanceof EncodedAudioChunk) {
428
+ const serialized = encodedAudioChunkToTransferable(value);
429
+ transfer.push(serialized.data);
430
+ chunkValue = serialized;
402
431
  } else if (typeof value === "object" && value !== null) {
403
432
  const extracted = extractTransferables(value);
404
433
  transfer.push(...extracted);
@@ -407,7 +436,7 @@ class WorkerChannel {
407
436
  "stream_chunk",
408
437
  {
409
438
  streamId,
410
- chunk: value,
439
+ chunk: chunkValue,
411
440
  ...metadata
412
441
  },
413
442
  transfer
@@ -480,4 +509,4 @@ export {
480
509
  WorkerMessageType as a,
481
510
  WorkerState as b
482
511
  };
483
- //# sourceMappingURL=WorkerChannel.CE5euh3R.js.map
512
+ //# sourceMappingURL=WorkerChannel.DjBEVvEA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerChannel.DjBEVvEA.js","sources":["../../src/worker/types.ts","../../src/worker/worker-retry.ts","../../src/worker/transferable-helper.ts","../../src/worker/WorkerChannel.ts"],"sourcesContent":["/**\n * Worker Communication Protocol Types\n * Define standard message types and protocols for worker communication\n */\n\n// A port-like object that supports postMessage/onmessage used by WorkerChannel\nexport type PortLike = MessagePort | DedicatedWorkerGlobalScope | Worker;\n\n/**\n * Worker types in the pipeline\n */\nexport type WorkerType =\n // | 'videoDemux' // DEPRECATED: Replaced by IndexedVideoSource (main-thread GOP-based streaming)\n | 'audioDemux'\n // | 'videoDecode' // DEPRECATED: Replaced by OnDemandVideoSession (main-thread decoding)\n | 'audioDecode' // Clip-local audio decoder\n | 'videoCompose'\n | 'audioCompose'\n | 'videoEncode'; // Clip-local video encoder (L2 only)\n\nexport interface WorkerConfigurePayload<T = any> {\n config: T;\n initial: boolean;\n}\n\n/**\n * Worker state definition\n */\nexport interface WorkerStateInfo {\n state: 'idle' | 'busy' | 'error' | 'terminated';\n taskCount: number;\n lastError?: string;\n}\n\n/**\n * Worker status for all workers\n */\nexport type WorkerStatus = Record<WorkerType, WorkerStateInfo>;\n\n/**\n * Worker wrapper interface\n */\nexport interface IWorker {\n readonly type: WorkerType;\n readonly state: WorkerStateInfo;\n\n initialize(): Promise<void>;\n terminate(): Promise<void>;\n restart(): Promise<void>;\n\n postMessage(message: any, transfer?: Transferable[]): void;\n on(event: string, handler: (data: any) => void): void;\n off(event: string, handler: (data: any) => void): void;\n}\n\n// Message types for different workers\nexport enum WorkerMessageType {\n // Init = 'init', // configure, { initial: true }\n Ready = 'ready',\n Error = 'error',\n Dispose = 'dispose',\n Configure = 'configure',\n LoadResource = 'load_resource',\n ResourceLoaded = 'resource_loaded',\n ResourceProgress = 'resource_progress',\n ConfigureDemux = 'configure_demux',\n AppendBuffer = 'append_buffer',\n DemuxSamples = 'demux_samples',\n FlushDemux = 'flush_demux',\n ConfigureDecode = 'configure_decode',\n DecodeChunk = 'decode_chunk',\n DecodedFrame = 'decoded_frame',\n SeekGop = 'seek_gop',\n SetComposition = 'set_composition',\n ApplyPatch = 'apply_patch',\n RenderFrame = 'render_frame',\n ComposeFrameReady = 'compose_frame_ready',\n ConfigureEncode = 'configure_encode',\n EncodeFrame = 'encode_frame',\n EncodeAudio = 'encode_audio',\n EncodedChunk = 'encoded_chunk',\n FlushEncode = 'flush_encode',\n AddChunk = 'add_chunk',\n PerformanceStats = 'performance_stats',\n RenderWindow = 'renderWindow',\n AudioTrackAdd = 'audio_track:add',\n AudioTrackRemove = 'audio_track:remove',\n AudioTrackUpdate = 'audio_track:update',\n}\n\n// Base message structure\nexport interface WorkerMessage<T = any> {\n type: WorkerMessageType;\n id: string; // Unique message ID for request-response pairing\n payload?: T;\n transfer?: Transferable[]; // Objects to transfer ownership\n timestamp: number;\n}\n\n// Response message structure\nexport interface WorkerResponse<T = any> {\n id: string; // Matches request ID\n success: boolean;\n result?: T;\n error?: WorkerError;\n timestamp: number;\n}\n\n// Error structure\nexport interface WorkerError {\n code: string;\n message: string;\n details?: any;\n stack?: string;\n}\n\n// Worker configuration\nexport interface WorkerConfig {\n name: string;\n workerUrl?: string;\n capabilities?: string[];\n maxRetries?: number;\n timeout?: number;\n}\n\n// Message handler type\nexport type MessageHandler<T = any, R = any> = (\n payload: T,\n transfer?: Transferable[]\n) => Promise<R> | R;\n\n// Message handler registry\nexport interface MessageHandlers {\n [key: string]: MessageHandler;\n}\n\n/**\n * Unified stream connection message for the data plane\n * Used by the stream-pipeline refactor to reduce message surface\n */\nexport interface ConnectMsg {\n direction: 'upstream';\n port: MessagePort;\n streamType: 'video' | 'audio' | 'frame' | 'chunk';\n clipId?: string;\n trackId?: string;\n}\n\n// Transferable types used in workers\nexport interface TransferableFrame {\n frame: VideoFrame;\n timestamp: number;\n duration?: number;\n}\n\nexport interface TransferableChunk {\n chunk: EncodedVideoChunk | EncodedAudioChunk;\n timestamp: number;\n duration?: number;\n trackId: string;\n}\n\nexport interface TransferableBuffer {\n buffer: ArrayBuffer;\n offset?: number;\n length?: number;\n}\n\n// Worker state\nexport enum WorkerState {\n Idle = 'idle',\n Initializing = 'initializing',\n Ready = 'ready',\n Processing = 'processing',\n Error = 'error',\n Disposed = 'disposed',\n}\n\n// Performance metrics\nexport interface WorkerPerformanceStats {\n workerId: string;\n workerName: string;\n messagesProcessed: number;\n averageProcessingTime: number;\n maxProcessingTime: number;\n errorCount: number;\n queueSize: number;\n memoryUsage?: number;\n}\n\n// Request tracking\nexport interface PendingRequest {\n id: string;\n type: WorkerMessageType;\n timestamp: number;\n timeout?: number;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n retryCount?: number;\n maxRetries?: number;\n}\n\n// Stream support\nexport interface StreamConfig {\n highWaterMark?: number;\n strategy?: QueuingStrategy;\n}\n\n// Worker pool settings\nexport interface WorkerPoolSettings {\n maxWorkers?: number;\n workerIdleTimeout?: number;\n enableSharedArrayBuffer?: boolean;\n enableOffscreenCanvas?: boolean;\n}\n\n// Message priority levels\nexport enum MessagePriority {\n Low = 0,\n Normal = 1,\n High = 2,\n Critical = 3,\n}\n\n// Priority message\nexport interface PriorityMessage<T = any> extends WorkerMessage<T> {\n priority: MessagePriority;\n}\n","/**\n * Retry utility for worker communication\n * Provides configurable retry logic with exponential backoff\n */\n\nimport { WorkerMessageType } from './types';\n\nexport interface RetryConfig {\n maxRetries: number;\n initialDelay?: number; // Initial delay in ms\n maxDelay?: number; // Max delay in ms\n backoffFactor?: number; // Exponential backoff factor\n retryableErrors?: string[]; // Error codes that can be retried\n}\n\nexport interface RetryContext {\n attempt: number;\n maxRetries: number;\n lastError?: Error;\n messageType: WorkerMessageType;\n}\n\n/**\n * Default retry configuration\n */\nexport const defaultRetryConfig: Required<RetryConfig> = {\n maxRetries: 3,\n initialDelay: 100,\n maxDelay: 5000,\n backoffFactor: 2,\n retryableErrors: ['TIMEOUT', 'NETWORK_ERROR', 'WORKER_BUSY'],\n};\n\n/**\n * Calculate delay for next retry attempt\n */\nexport function calculateRetryDelay(attempt: number, config: RetryConfig): number {\n const { initialDelay = 100, maxDelay = 5000, backoffFactor = 2 } = config;\n\n const delay = initialDelay * Math.pow(backoffFactor, attempt - 1);\n return Math.min(delay, maxDelay);\n}\n\n/**\n * Check if error is retryable\n */\nexport function isRetryableError(error: Error | any, config: RetryConfig): boolean {\n const { retryableErrors = defaultRetryConfig.retryableErrors } = config;\n\n if (!error) return false;\n\n // Check error code\n const errorCode = error.code || error.name;\n if (errorCode && retryableErrors.includes(errorCode)) {\n return true;\n }\n\n // Check error message for known patterns\n const message = error.message || '';\n if (message.includes('timeout') || message.includes('Timeout')) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Execute function with retry logic\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n config: RetryConfig\n // context?: Partial<RetryContext>\n): Promise<T> {\n const { maxRetries } = config;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n // Check if error is retryable\n if (!isRetryableError(error, config)) {\n throw error;\n }\n\n // Check if we've exhausted retries\n if (attempt === maxRetries) {\n throw error;\n }\n\n // Calculate and apply delay\n const delay = calculateRetryDelay(attempt, config);\n await sleep(delay);\n }\n }\n\n // This should never be reached, but TypeScript needs it\n throw lastError || new Error('Retry failed');\n}\n\n/**\n * Sleep for specified milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Create a retry wrapper for a specific operation\n */\nexport function createRetryWrapper<T extends (...args: any[]) => Promise<any>>(\n fn: T,\n config: RetryConfig\n): T {\n return (async (...args: Parameters<T>) => {\n return withRetry(() => fn(...args), config);\n }) as T;\n}\n","/**\n * Utility functions for handling Transferable objects\n * Simplifies the process of transferring ownership of objects between workers\n */\n\n/**\n * Check if an object is transferable\n */\nexport function isTransferable(obj: any): obj is Transferable {\n return (\n obj instanceof ArrayBuffer ||\n obj instanceof MessagePort ||\n (typeof ImageBitmap !== 'undefined' && obj instanceof ImageBitmap) ||\n (typeof OffscreenCanvas !== 'undefined' && obj instanceof OffscreenCanvas) ||\n (typeof ReadableStream !== 'undefined' && obj instanceof ReadableStream) ||\n (typeof WritableStream !== 'undefined' && obj instanceof WritableStream) ||\n (typeof TransformStream !== 'undefined' && obj instanceof TransformStream)\n );\n}\n\n/**\n * Recursively find transferable objects in a payload\n */\nfunction findTransferables(obj: any, transferables: Transferable[]): void {\n if (!obj || typeof obj !== 'object') {\n return;\n }\n\n // Check if object itself is transferable\n if (isTransferable(obj)) {\n transferables.push(obj);\n return;\n }\n\n // Check VideoFrame\n if (obj instanceof VideoFrame) {\n transferables.push(obj);\n return;\n }\n\n // Check AudioData\n if (typeof AudioData !== 'undefined' && obj instanceof AudioData) {\n transferables.push(obj);\n return;\n }\n\n // EncodedVideoChunk and EncodedAudioChunk are not transferable\n if (\n (typeof EncodedVideoChunk !== 'undefined' && obj instanceof EncodedVideoChunk) ||\n (typeof EncodedAudioChunk !== 'undefined' && obj instanceof EncodedAudioChunk)\n ) {\n return;\n }\n\n // Recursively check object properties\n if (Array.isArray(obj)) {\n for (const item of obj) {\n findTransferables(item, transferables);\n }\n } else {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n findTransferables(obj[key], transferables);\n }\n }\n }\n}\n\n/**\n * Extract transferable objects from a payload\n */\nexport function extractTransferables(payload: any): Transferable[] {\n const transferables: Transferable[] = [];\n findTransferables(payload, transferables);\n return transferables;\n}\n\n/**\n * Wrap VideoFrame for transfer with metadata\n */\nexport function wrapVideoFrame(frame: VideoFrame) {\n return {\n frame,\n metadata: {\n timestamp: frame.timestamp,\n duration: frame.duration,\n codedWidth: frame.codedWidth,\n codedHeight: frame.codedHeight,\n displayWidth: frame.displayWidth,\n displayHeight: frame.displayHeight,\n format: frame.format,\n },\n };\n}\n\n/**\n * Wrap AudioData for transfer with metadata\n */\nexport function wrapAudioData(audio: AudioData) {\n return {\n audio,\n metadata: {\n timestamp: audio.timestamp,\n duration: audio.duration,\n numberOfFrames: audio.numberOfFrames,\n numberOfChannels: audio.numberOfChannels,\n sampleRate: audio.sampleRate,\n format: audio.format,\n },\n };\n}\n\n/**\n * Convert EncodedVideoChunk to transferable format\n */\nexport function encodedVideoChunkToTransferable(chunk: EncodedVideoChunk) {\n const data = new ArrayBuffer(chunk.byteLength);\n chunk.copyTo(new Uint8Array(data));\n\n return {\n data,\n type: chunk.type,\n timestamp: chunk.timestamp,\n duration: chunk.duration,\n };\n}\n\n/**\n * Convert EncodedAudioChunk to transferable format\n */\nexport function encodedAudioChunkToTransferable(chunk: EncodedAudioChunk) {\n const data = new ArrayBuffer(chunk.byteLength);\n chunk.copyTo(new Uint8Array(data));\n\n return {\n data,\n type: chunk.type,\n timestamp: chunk.timestamp,\n duration: chunk.duration,\n };\n}\n\n/**\n * Recreate EncodedVideoChunk from transferable format\n */\nexport function transferableToEncodedVideoChunk(transferable: {\n data: ArrayBuffer;\n type: 'key' | 'delta';\n timestamp: number;\n duration?: number;\n}): EncodedVideoChunk {\n return new EncodedVideoChunk({\n type: transferable.type,\n timestamp: transferable.timestamp,\n duration: transferable.duration,\n data: transferable.data,\n });\n}\n\n/**\n * Recreate EncodedAudioChunk from transferable format\n */\nexport function transferableToEncodedAudioChunk(transferable: {\n data: ArrayBuffer;\n type: 'key' | 'delta';\n timestamp: number;\n duration?: number;\n}): EncodedAudioChunk {\n return new EncodedAudioChunk({\n type: transferable.type,\n timestamp: transferable.timestamp,\n duration: transferable.duration,\n data: transferable.data,\n });\n}\n\n/**\n * Transfer OffscreenCanvas control to worker\n */\nexport function transferCanvas(canvas: HTMLCanvasElement): OffscreenCanvas {\n return canvas.transferControlToOffscreen();\n}\n\n/**\n * Create a transferable stream pair\n */\nexport function createStreamPair<T>(): {\n readable: ReadableStream<T>;\n writable: WritableStream<T>;\n} {\n const { readable, writable } = new TransformStream<T>();\n return { readable, writable };\n}\n","/**\n * WorkerChannel - MessageChannel wrapper for worker communication\n * Provides type-safe message passing with automatic serialization/deserialization\n */\n\nimport {\n WorkerMessage,\n WorkerResponse,\n WorkerError,\n WorkerMessageType,\n PendingRequest,\n MessageHandler,\n MessageHandlers,\n WorkerState,\n PortLike,\n} from './types';\nimport { withRetry, RetryConfig, defaultRetryConfig } from './worker-retry';\nimport {\n isTransferable,\n extractTransferables,\n encodedVideoChunkToTransferable,\n encodedAudioChunkToTransferable,\n} from './transferable-helper';\n\nexport interface WorkerChannelConfig {\n name: string;\n timeout?: number; // Default timeout in milliseconds\n maxRetries?: number; // Default max retries\n}\n\nexport class WorkerChannel {\n name: string;\n port: PortLike;\n pendingRequests = new Map<string, PendingRequest>();\n messageHandlers: MessageHandlers = {};\n state: WorkerState = WorkerState.Idle;\n defaultTimeout: number;\n defaultMaxRetries: number;\n\n constructor(port: PortLike, config: WorkerChannelConfig) {\n this.name = config.name;\n this.port = port;\n this.defaultTimeout = config.timeout ?? 30000; // 30 seconds default\n this.defaultMaxRetries = config.maxRetries ?? 3;\n\n this.setupMessageHandler();\n this.state = WorkerState.Ready;\n }\n\n /**\n * Send a message and wait for response with retry support\n */\n async send<T = any, R = any>(\n type: WorkerMessageType,\n payload?: T,\n options?: {\n timeout?: number;\n maxRetries?: number;\n transfer?: Transferable[];\n retryConfig?: Partial<RetryConfig>;\n }\n ): Promise<R> {\n const maxRetries = options?.maxRetries ?? this.defaultMaxRetries;\n\n // Create retry config\n const retryConfig: RetryConfig = {\n ...defaultRetryConfig,\n maxRetries,\n ...options?.retryConfig,\n };\n\n // Wrap send logic for retry\n return withRetry(() => this.sendOnce<T, R>(type, payload, options), retryConfig);\n }\n\n /**\n * Send a message once (without retry)\n */\n private async sendOnce<T = any, R = any>(\n type: WorkerMessageType,\n payload?: T,\n options?: {\n timeout?: number;\n transfer?: Transferable[];\n }\n ): Promise<R> {\n const id = this.generateMessageId();\n const timeout = options?.timeout ?? this.defaultTimeout;\n\n const message: WorkerMessage<T> = {\n type,\n id,\n payload,\n timestamp: Date.now(),\n };\n\n return new Promise((resolve, reject) => {\n const request: PendingRequest = {\n id,\n type,\n timestamp: Date.now(),\n timeout,\n resolve,\n reject,\n };\n\n this.pendingRequests.set(id, request);\n\n // Set timeout\n const timeoutId = setTimeout(() => {\n const pending = this.pendingRequests.get(id);\n if (pending) {\n this.pendingRequests.delete(id);\n const error = new Error(`Request timeout: ${id} ${type} (${timeout}ms)`);\n (error as any).code = 'TIMEOUT';\n pending.reject(error);\n }\n }, timeout);\n\n // Store timeout ID for cleanup\n (request as any).timeoutId = timeoutId;\n // Send message\n if (options?.transfer) {\n this.port.postMessage(message, options.transfer);\n } else {\n this.port.postMessage(message);\n }\n });\n }\n\n /**\n * Send a message without waiting for response\n */\n post<T = any>(type: WorkerMessageType, payload?: T, transfer?: Transferable[]): void {\n const message: WorkerMessage<T> = {\n type,\n id: this.generateMessageId(),\n payload,\n timestamp: Date.now(),\n };\n\n if (transfer) {\n this.port.postMessage(message, transfer);\n } else {\n this.port.postMessage(message);\n }\n }\n\n /**\n * Register a message handler\n */\n on<T = any, R = any>(type: WorkerMessageType, handler: MessageHandler<T, R>): void {\n this.messageHandlers[type] = handler;\n }\n\n /**\n * Unregister a message handler\n */\n off(type: WorkerMessageType): void {\n delete this.messageHandlers[type];\n }\n\n /**\n * Dispose the channel\n */\n dispose(): void {\n this.state = WorkerState.Disposed;\n\n // Clear all pending requests\n for (const [, request] of this.pendingRequests) {\n if ((request as any).timeoutId) {\n clearTimeout((request as any).timeoutId);\n }\n request.reject(new Error('Channel disposed'));\n }\n this.pendingRequests.clear();\n\n // Remove message handler\n this.port.onmessage = null;\n }\n\n /**\n * Setup message handler for incoming messages\n */\n private setupMessageHandler(): void {\n this.port.onmessage = async (event: MessageEvent) => {\n const data = event.data;\n\n // Handle response messages\n if (this.isResponse(data)) {\n this.handleResponse(data as WorkerResponse);\n return;\n }\n\n // Handle request messages\n if (this.isRequest(data)) {\n await this.handleRequest(data as WorkerMessage);\n return;\n }\n };\n }\n\n /**\n * Handle incoming request\n */\n private async handleRequest(message: WorkerMessage): Promise<void> {\n const handler = this.messageHandlers[message.type];\n\n if (!handler) {\n // Send error response if no handler registered\n this.sendResponse(message.id, false, null, {\n code: 'NO_HANDLER',\n message: `No handler registered for message type: ${message.type}`,\n });\n return;\n }\n\n this.state = WorkerState.Processing;\n\n // Handler execution with error handling at framework level\n Promise.resolve()\n .then(() => handler(message.payload, message.transfer))\n .then((result) => {\n this.sendResponse(message.id, true, result);\n this.state = WorkerState.Ready;\n })\n .catch((error) => {\n const workerError: WorkerError = {\n code: 'HANDLER_ERROR',\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n };\n this.sendResponse(message.id, false, null, workerError);\n this.state = WorkerState.Ready;\n });\n }\n\n /**\n * Handle incoming response\n */\n private handleResponse(response: WorkerResponse): void {\n const request = this.pendingRequests.get(response.id);\n if (!request) {\n return; // Response for unknown request\n }\n\n this.pendingRequests.delete(response.id);\n\n // Clear timeout\n if ((request as any).timeoutId) {\n clearTimeout((request as any).timeoutId);\n }\n\n if (response.success) {\n request.resolve(response.result);\n } else {\n const error = new Error(response.error?.message || 'Unknown error');\n if (response.error) {\n Object.assign(error, response.error);\n }\n request.reject(error);\n }\n }\n\n /**\n * Send a response message\n */\n private sendResponse(id: string, success: boolean, result?: any, error?: WorkerError): void {\n let transfer: Transferable[] = [];\n if (isTransferable(result)) {\n // Still include reference so caller can access the transferred object\n transfer.push(result);\n }\n const response: WorkerResponse = {\n id,\n success,\n result,\n error,\n timestamp: Date.now(),\n };\n\n this.port.postMessage(response, transfer);\n }\n\n /**\n * Check if message is a response\n */\n private isResponse(data: any): boolean {\n return (\n data && typeof data === 'object' && 'id' in data && 'success' in data && !('type' in data)\n );\n }\n\n /**\n * Check if message is a request\n */\n private isRequest(data: any): boolean {\n return data && typeof data === 'object' && 'id' in data && 'type' in data;\n }\n\n /**\n * Generate unique message ID\n */\n private generateMessageId(): string {\n return `${this.name}-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n }\n\n /**\n * Send a notification message without waiting for response\n * Alias for post() method for compatibility\n */\n notify<T = any>(type: WorkerMessageType | string, payload?: T, transfer?: Transferable[]): void {\n this.post(type as WorkerMessageType, payload, transfer);\n }\n\n /**\n * Register a message handler\n * Alias for on() method for compatibility\n */\n registerHandler<T = any, R = any>(\n type: WorkerMessageType | string,\n handler: MessageHandler<T, R>\n ): void {\n this.on(type as WorkerMessageType, handler);\n }\n\n /**\n * Send a ReadableStream to another worker\n * Automatically handles transferable streams vs chunk-by-chunk fallback\n */\n async sendStream<T = Uint8Array>(\n stream: ReadableStream<T>,\n metadata?: {\n type?: string;\n url?: string;\n streamId?: string;\n [key: string]: any;\n }\n ): Promise<void> {\n const streamId = metadata?.streamId || this.generateMessageId();\n // Check if streams are transferable in this environment\n if (isTransferable(stream)) {\n // Direct stream transfer (preferred)\n this.port.postMessage(\n {\n type: 'stream_transfer',\n ...metadata,\n stream,\n streamId,\n },\n [stream] // Transfer ownership\n );\n } else {\n // Fallback: chunk-by-chunk transfer\n await this.streamChunks(stream, streamId, metadata);\n }\n }\n\n /**\n * Stream chunks from a ReadableStream (fallback when transfer is not supported)\n */\n private async streamChunks<T = Uint8Array>(\n stream: ReadableStream<T>,\n streamId: string,\n metadata?: Record<string, any>\n ): Promise<void> {\n const reader = stream.getReader();\n\n // Send stream start notification\n this.post('stream_start' as WorkerMessageType, {\n streamId,\n ...metadata,\n mode: 'chunk_transfer',\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Send stream end notification\n this.post('stream_end' as WorkerMessageType, {\n streamId,\n ...metadata,\n });\n break;\n }\n\n // Send chunk with transfer - use extractTransferables for complex objects\n const transfer: Transferable[] = [];\n let chunkValue: T = value;\n\n if (value instanceof ArrayBuffer) {\n transfer.push(value);\n } else if (value instanceof Uint8Array) {\n transfer.push(value.buffer);\n } else if (typeof AudioData !== 'undefined' && value instanceof AudioData) {\n transfer.push(value as unknown as Transferable);\n } else if (typeof VideoFrame !== 'undefined' && value instanceof VideoFrame) {\n transfer.push(value as unknown as Transferable);\n } else if (typeof EncodedVideoChunk !== 'undefined' && value instanceof EncodedVideoChunk) {\n // EncodedVideoChunk is not transferable by itself\n // But its constructor supports transfer parameter for the underlying ArrayBuffer\n // We serialize it to a plain object and transfer the ArrayBuffer\n const serialized = encodedVideoChunkToTransferable(value);\n transfer.push(serialized.data); // Transfer the ArrayBuffer\n chunkValue = serialized as T;\n } else if (typeof EncodedAudioChunk !== 'undefined' && value instanceof EncodedAudioChunk) {\n // EncodedAudioChunk is not transferable by itself\n // We serialize it to a plain object and transfer the ArrayBuffer\n const serialized = encodedAudioChunkToTransferable(value);\n transfer.push(serialized.data); // Transfer the ArrayBuffer\n chunkValue = serialized as T;\n } else if (typeof value === 'object' && value !== null) {\n // For wrapped objects (e.g., {frame: VideoFrame, metadata...}), extract transferables\n const extracted = extractTransferables(value);\n transfer.push(...extracted);\n }\n\n this.post(\n 'stream_chunk' as WorkerMessageType,\n {\n streamId,\n chunk: chunkValue,\n ...metadata,\n },\n transfer\n );\n }\n } catch (error) {\n // Send error notification\n this.post('stream_error' as WorkerMessageType, {\n streamId,\n error: error instanceof Error ? error.message : String(error),\n ...metadata,\n });\n throw error;\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Receive a stream from another worker\n * Handles both transferable streams and chunk-by-chunk reconstruction\n */\n async receiveStream<T = Uint8Array>(\n onStream: (stream: ReadableStream<T>, metadata?: Record<string, any>) => void\n ): Promise<void> {\n const chunkedStreams = new Map<\n string,\n {\n controller: ReadableStreamDefaultController<T>;\n metadata?: Record<string, any>;\n }\n >();\n\n // Intercept stream messages via onmessage to avoid extra event plumbing\n const prev = this.port.onmessage as any;\n // Use function assignment with explicit type to satisfy esbuild parser\n const handler: (event: MessageEvent) => void = (event) => {\n const raw = (event as any).data;\n const envelopeType = raw?.type;\n const hasPayload = raw && typeof raw === 'object' && 'payload' in raw;\n const payload = hasPayload ? (raw as any).payload : raw;\n\n if (envelopeType === 'stream_transfer' && (payload as any)?.stream) {\n onStream((payload as any).stream, payload);\n return;\n }\n if (envelopeType === 'stream_start' && (payload as any)?.streamId) {\n const stream = new ReadableStream<T>({\n start(controller) {\n chunkedStreams.set((payload as any).streamId, { controller, metadata: payload });\n },\n });\n onStream(stream, payload);\n return;\n }\n if (\n envelopeType === 'stream_chunk' &&\n (payload as any)?.streamId &&\n chunkedStreams.has((payload as any).streamId)\n ) {\n const s = chunkedStreams.get((payload as any).streamId);\n if (s) s.controller.enqueue((payload as any).chunk as T);\n return;\n }\n if (\n envelopeType === 'stream_end' &&\n (payload as any)?.streamId &&\n chunkedStreams.has((payload as any).streamId)\n ) {\n const s = chunkedStreams.get((payload as any).streamId);\n if (s) {\n s.controller.close();\n chunkedStreams.delete((payload as any).streamId);\n }\n return;\n }\n if (\n envelopeType === 'stream_error' &&\n (payload as any)?.streamId &&\n chunkedStreams.has((payload as any).streamId)\n ) {\n const s = chunkedStreams.get((payload as any).streamId);\n if (s) {\n s.controller.error(new Error(String((payload as any).error || 'stream error')));\n chunkedStreams.delete((payload as any).streamId);\n }\n return;\n }\n\n // Delegate non-stream messages to previous handler\n if (typeof prev === 'function') prev.call(this.port, event);\n };\n this.port.onmessage = handler as any;\n }\n}\n"],"names":["WorkerMessageType","WorkerState"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { W as WorkerChannel, a as WorkerMessageType, b as WorkerState } from "../../WorkerChannel.CE5euh3R.js";
1
+ import { W as WorkerChannel, a as WorkerMessageType, b as WorkerState } from "../../WorkerChannel.DjBEVvEA.js";
2
2
  class AudioMixer {
3
3
  config;
4
4
  tracksMap = /* @__PURE__ */ new Map();
@@ -1060,4 +1060,4 @@ export {
1060
1060
  AudioComposeWorker,
1061
1061
  audioCompose_worker as default
1062
1062
  };
1063
- //# sourceMappingURL=audio-compose.worker.rW63uN6z.js.map
1063
+ //# sourceMappingURL=audio-compose.worker.CiM_KP27.js.map