@meframe/core 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/README.md +17 -4
  2. package/dist/Meframe.d.ts.map +1 -1
  3. package/dist/Meframe.js +0 -3
  4. package/dist/Meframe.js.map +1 -1
  5. package/dist/assets/audio-compose.worker-nGVvHD5Q.js +1537 -0
  6. package/dist/assets/audio-compose.worker-nGVvHD5Q.js.map +1 -0
  7. package/dist/assets/audio-demux.worker-xwWBtbAe.js +8299 -0
  8. package/dist/assets/audio-demux.worker-xwWBtbAe.js.map +1 -0
  9. package/dist/assets/decode.worker-DpWHsc7R.js +1291 -0
  10. package/dist/assets/decode.worker-DpWHsc7R.js.map +1 -0
  11. package/dist/assets/encode.worker-nfOb3kw6.js +1026 -0
  12. package/dist/assets/encode.worker-nfOb3kw6.js.map +1 -0
  13. package/dist/assets/mux.worker-uEMQY066.js +8019 -0
  14. package/dist/assets/mux.worker-uEMQY066.js.map +1 -0
  15. package/dist/assets/video-compose.worker-DPzsC21d.js +1683 -0
  16. package/dist/assets/video-compose.worker-DPzsC21d.js.map +1 -0
  17. package/dist/assets/video-demux.worker-D019I7GQ.js +7957 -0
  18. package/dist/assets/video-demux.worker-D019I7GQ.js.map +1 -0
  19. package/dist/cache/CacheManager.d.ts.map +1 -1
  20. package/dist/cache/CacheManager.js +8 -1
  21. package/dist/cache/CacheManager.js.map +1 -1
  22. package/dist/config/defaults.d.ts.map +1 -1
  23. package/dist/config/defaults.js +0 -8
  24. package/dist/config/defaults.js.map +1 -1
  25. package/dist/config/types.d.ts +0 -4
  26. package/dist/config/types.d.ts.map +1 -1
  27. package/dist/controllers/PlaybackController.d.ts +4 -2
  28. package/dist/controllers/PlaybackController.d.ts.map +1 -1
  29. package/dist/controllers/PlaybackController.js +7 -13
  30. package/dist/controllers/PlaybackController.js.map +1 -1
  31. package/dist/controllers/PreRenderService.d.ts +3 -2
  32. package/dist/controllers/PreRenderService.d.ts.map +1 -1
  33. package/dist/controllers/PreRenderService.js.map +1 -1
  34. package/dist/controllers/PreviewHandle.d.ts +2 -0
  35. package/dist/controllers/PreviewHandle.d.ts.map +1 -1
  36. package/dist/controllers/PreviewHandle.js +6 -0
  37. package/dist/controllers/PreviewHandle.js.map +1 -1
  38. package/dist/controllers/index.d.ts +1 -1
  39. package/dist/controllers/index.d.ts.map +1 -1
  40. package/dist/controllers/types.d.ts +2 -12
  41. package/dist/controllers/types.d.ts.map +1 -1
  42. package/dist/event/events.d.ts +5 -59
  43. package/dist/event/events.d.ts.map +1 -1
  44. package/dist/event/events.js +1 -6
  45. package/dist/event/events.js.map +1 -1
  46. package/dist/model/CompositionModel.js +1 -2
  47. package/dist/model/CompositionModel.js.map +1 -1
  48. package/dist/orchestrator/CompositionPlanner.d.ts.map +1 -1
  49. package/dist/orchestrator/CompositionPlanner.js +1 -0
  50. package/dist/orchestrator/CompositionPlanner.js.map +1 -1
  51. package/dist/orchestrator/Orchestrator.d.ts.map +1 -1
  52. package/dist/orchestrator/Orchestrator.js +1 -12
  53. package/dist/orchestrator/Orchestrator.js.map +1 -1
  54. package/dist/orchestrator/VideoClipSession.d.ts.map +1 -1
  55. package/dist/orchestrator/VideoClipSession.js +4 -5
  56. package/dist/orchestrator/VideoClipSession.js.map +1 -1
  57. package/dist/orchestrator/types.d.ts +0 -1
  58. package/dist/orchestrator/types.d.ts.map +1 -1
  59. package/dist/stages/compose/GlobalAudioSession.d.ts.map +1 -1
  60. package/dist/stages/compose/GlobalAudioSession.js +3 -2
  61. package/dist/stages/compose/GlobalAudioSession.js.map +1 -1
  62. package/dist/stages/compose/VideoComposer.d.ts.map +1 -1
  63. package/dist/stages/compose/VideoComposer.js +2 -2
  64. package/dist/stages/compose/VideoComposer.js.map +1 -1
  65. package/dist/stages/compose/audio-compose.worker.d.ts.map +1 -1
  66. package/dist/stages/compose/audio-compose.worker.js +0 -1
  67. package/dist/stages/compose/audio-compose.worker.js.map +1 -1
  68. package/dist/stages/compose/audio-compose.worker2.js +5 -0
  69. package/dist/stages/compose/audio-compose.worker2.js.map +1 -0
  70. package/dist/stages/compose/types.d.ts +1 -0
  71. package/dist/stages/compose/types.d.ts.map +1 -1
  72. package/dist/stages/compose/video-compose.worker.d.ts.map +1 -1
  73. package/dist/stages/compose/video-compose.worker.js +18 -8
  74. package/dist/stages/compose/video-compose.worker.js.map +1 -1
  75. package/dist/stages/compose/video-compose.worker2.js +5 -0
  76. package/dist/stages/compose/video-compose.worker2.js.map +1 -0
  77. package/dist/stages/decode/AudioChunkDecoder.d.ts.map +1 -1
  78. package/dist/stages/decode/AudioChunkDecoder.js +0 -1
  79. package/dist/stages/decode/AudioChunkDecoder.js.map +1 -1
  80. package/dist/stages/decode/VideoChunkDecoder.d.ts +0 -1
  81. package/dist/stages/decode/VideoChunkDecoder.d.ts.map +1 -1
  82. package/dist/stages/decode/VideoChunkDecoder.js +1 -11
  83. package/dist/stages/decode/VideoChunkDecoder.js.map +1 -1
  84. package/dist/stages/decode/decode.worker.d.ts.map +1 -1
  85. package/dist/stages/decode/decode.worker.js +3 -16
  86. package/dist/stages/decode/decode.worker.js.map +1 -1
  87. package/dist/stages/decode/decode.worker2.js +5 -0
  88. package/dist/stages/decode/decode.worker2.js.map +1 -0
  89. package/dist/stages/demux/MP4Demuxer.d.ts +2 -0
  90. package/dist/stages/demux/MP4Demuxer.d.ts.map +1 -1
  91. package/dist/stages/demux/MP4Demuxer.js +13 -2
  92. package/dist/stages/demux/MP4Demuxer.js.map +1 -1
  93. package/dist/stages/demux/audio-demux.worker2.js +5 -0
  94. package/dist/stages/demux/audio-demux.worker2.js.map +1 -0
  95. package/dist/stages/demux/video-demux.worker.d.ts +6 -3
  96. package/dist/stages/demux/video-demux.worker.d.ts.map +1 -1
  97. package/dist/stages/demux/video-demux.worker.js +5 -27
  98. package/dist/stages/demux/video-demux.worker.js.map +1 -1
  99. package/dist/stages/demux/video-demux.worker2.js +5 -0
  100. package/dist/stages/demux/video-demux.worker2.js.map +1 -0
  101. package/dist/stages/encode/encode.worker.d.ts.map +1 -1
  102. package/dist/stages/encode/encode.worker.js +0 -1
  103. package/dist/stages/encode/encode.worker.js.map +1 -1
  104. package/dist/stages/encode/encode.worker2.js +5 -0
  105. package/dist/stages/encode/encode.worker2.js.map +1 -0
  106. package/dist/stages/load/EventHandlers.d.ts +2 -11
  107. package/dist/stages/load/EventHandlers.d.ts.map +1 -1
  108. package/dist/stages/load/EventHandlers.js +1 -24
  109. package/dist/stages/load/EventHandlers.js.map +1 -1
  110. package/dist/stages/load/ResourceLoader.d.ts.map +1 -1
  111. package/dist/stages/load/ResourceLoader.js +11 -13
  112. package/dist/stages/load/ResourceLoader.js.map +1 -1
  113. package/dist/stages/load/TaskManager.d.ts +1 -1
  114. package/dist/stages/load/TaskManager.d.ts.map +1 -1
  115. package/dist/stages/load/TaskManager.js +3 -2
  116. package/dist/stages/load/TaskManager.js.map +1 -1
  117. package/dist/stages/load/types.d.ts +2 -0
  118. package/dist/stages/load/types.d.ts.map +1 -1
  119. package/dist/stages/mux/mux.worker2.js +5 -0
  120. package/dist/stages/mux/mux.worker2.js.map +1 -0
  121. package/dist/vite-plugin.d.ts +17 -0
  122. package/dist/vite-plugin.d.ts.map +1 -0
  123. package/dist/vite-plugin.js +88 -0
  124. package/dist/vite-plugin.js.map +1 -0
  125. package/dist/worker/WorkerPool.d.ts +0 -4
  126. package/dist/worker/WorkerPool.d.ts.map +1 -1
  127. package/dist/worker/WorkerPool.js +4 -17
  128. package/dist/worker/WorkerPool.js.map +1 -1
  129. package/dist/worker/worker-registry.d.ts +12 -0
  130. package/dist/worker/worker-registry.d.ts.map +1 -0
  131. package/dist/worker/worker-registry.js +20 -0
  132. package/dist/worker/worker-registry.js.map +1 -0
  133. package/package.json +7 -1
@@ -1 +1 @@
1
- {"version":3,"file":"encode.worker.js","sources":["../../../src/stages/encode/encode.worker.ts"],"sourcesContent":["import { WorkerChannel } from '../../worker/WorkerChannel';\nimport { WorkerMessageType, WorkerState } from '../../worker/types';\nimport { VideoChunkEncoder } from './VideoChunkEncoder';\nimport { AudioChunkEncoder } from './AudioChunkEncoder';\nimport { VideoEncoderConfig, AudioEncoderConfig } from './types';\n\n/**\n * EncodeWorker - Seventh stage in the pipeline\n * Receives composed frames from ComposeWorkers and outputs encoded chunks to CacheManager/MuxWorker\n *\n * Pipeline: VideoComposeWorker/AudioComposeWorker → EncodeWorker → CacheManager/MuxWorker\n *\n * Features:\n * - Hardware-accelerated encoding via WebCodecs\n * - Configurable bitrate and quality settings\n * - Batch flush for efficient I/O (0.5s batches)\n * - Direct streaming to cache/mux workers\n */\nclass EncodeWorker {\n private channel: WorkerChannel;\n private videoEncoder: VideoChunkEncoder | null = null;\n private audioEncoder: AudioChunkEncoder | null = null;\n\n // Connections to other workers\n private cachePort: MessagePort | null = null;\n private muxPort: MessagePort | null = null;\n private composePorts = new Map<string, MessagePort>(); // Connections from compose workers\n\n constructor() {\n // Initialize WorkerChannel with MessagePort\n this.channel = new WorkerChannel(self as any, {\n name: 'EncodeWorker',\n timeout: 30000,\n });\n\n this.setupHandlers();\n }\n\n private setupHandlers(): void {\n // Register message handlers\n this.channel.registerHandler('configure', this.handleConfigure.bind(this));\n this.channel.registerHandler('connect', this.handleConnect.bind(this));\n this.channel.registerHandler('configure_video', this.handleConfigureVideo.bind(this));\n this.channel.registerHandler('configure_audio', this.handleConfigureAudio.bind(this));\n this.channel.registerHandler('flush', this.handleFlush.bind(this));\n this.channel.registerHandler('reset', this.handleReset.bind(this));\n this.channel.registerHandler('get_stats', this.handleGetStats.bind(this));\n this.channel.registerHandler(WorkerMessageType.Dispose, this.handleDispose.bind(this));\n }\n\n /**\n * Connect handler used by stream pipeline\n */\n private async handleConnect(payload: {\n direction: 'upstream';\n port: MessagePort;\n streamType: 'video' | 'audio' | 'frame' | 'chunk';\n }): Promise<{ success: boolean }> {\n const { port, streamType } = payload;\n if (streamType === 'video') return this.handleConnectComposer({ composeType: 'video', port });\n if (streamType === 'audio') return this.handleConnectComposer({ composeType: 'audio', port });\n if (streamType === 'chunk') return this.handleConnectMux({ port });\n return { success: true };\n }\n\n /**\n * Handle configuration message from orchestrator\n * @param payload.initial - If true, initialize worker and recreate encoder instances; otherwise just update config\n */\n private async handleConfigure(payload: {\n config: {\n video?: Partial<VideoEncoderConfig> & { stream?: ReadableStream<VideoFrame> };\n audio?: Partial<AudioEncoderConfig> & { stream?: ReadableStream<AudioData> };\n };\n initial?: boolean;\n }): Promise<{ success: boolean }> {\n const { config, initial = false } = payload;\n\n // Set worker state to ready on initial configuration\n if (initial) {\n this.channel.state = WorkerState.Ready;\n }\n\n // Handle video encoder configuration\n if (config.video) {\n if (initial || !this.videoEncoder) {\n if (this.videoEncoder) {\n await this.videoEncoder.close();\n }\n this.videoEncoder = new VideoChunkEncoder(config.video as VideoEncoderConfig);\n await this.videoEncoder.initialize();\n\n const videoStream = config.video.stream?.pipeThrough(this.videoEncoder.createStream());\n if (videoStream && this.cachePort) {\n const cacheChannel = new WorkerChannel(this.cachePort, {\n name: 'Encode-Cache-Video',\n timeout: 30000,\n });\n await cacheChannel.sendStream(videoStream, {\n type: 'video',\n width: config.video.width,\n height: config.video.height,\n framerate: config.video.framerate,\n });\n }\n } else {\n await this.videoEncoder.reconfigure(config.video);\n }\n }\n\n if (config.audio) {\n if (initial || !this.audioEncoder) {\n if (this.audioEncoder) {\n await this.audioEncoder.close();\n }\n this.audioEncoder = new AudioChunkEncoder(config.audio as AudioEncoderConfig);\n await this.audioEncoder.initialize();\n\n const audioStream = config.audio.stream?.pipeThrough(this.audioEncoder.createStream());\n if (audioStream && this.cachePort) {\n const cacheChannel = new WorkerChannel(this.cachePort, {\n name: 'Encode-Cache-Audio',\n timeout: 30000,\n });\n await cacheChannel.sendStream(audioStream, {\n type: 'audio',\n sampleRate: config.audio.sampleRate,\n numberOfChannels: config.audio.numberOfChannels,\n });\n }\n } else {\n await this.audioEncoder.reconfigure(config.audio);\n }\n }\n\n return { success: true };\n }\n\n /**\n * Connect to a compose worker to receive frames/audio data\n */\n private async handleConnectComposer(payload: {\n composeType: 'video' | 'audio';\n port: MessagePort;\n }): Promise<{ success: boolean }> {\n const { composeType, port } = payload;\n\n // Store the port\n this.composePorts.set(composeType, port);\n\n // Setup channel for receiving streams\n const composeChannel = new WorkerChannel(port, {\n name: `Encode-${composeType}Compose`,\n timeout: 30000,\n });\n\n // Receive stream from composer\n composeChannel.receiveStream(async (stream, metadata) => {\n console.log('[EncodeWorker] receiveStream', metadata);\n if (metadata?.streamType === 'video' && this.videoEncoder) {\n // Process video frames\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n // value might be wrapped object {frame, metadata} or plain VideoFrame\n const wrappedValue = value as any;\n const videoFrame = wrappedValue.frame || wrappedValue;\n\n try {\n const frame = (videoFrame as VideoFrame).clone();\n this.videoEncoder.encode(frame);\n } finally {\n // Close the original frame after cloning and encoding\n (videoFrame as VideoFrame).close();\n }\n }\n } finally {\n reader.releaseLock();\n }\n } else if (metadata?.streamType === 'audio' && this.audioEncoder) {\n const composedConfig = {\n sampleRate: metadata.sampleRate,\n numberOfChannels: metadata.numberOfChannels,\n };\n\n const currentConfig = this.audioEncoder.getConfig();\n\n if (\n typeof composedConfig.sampleRate === 'number' &&\n composedConfig.sampleRate > 0 &&\n composedConfig.sampleRate !== currentConfig.sampleRate\n ) {\n await this.audioEncoder.reconfigure({ sampleRate: composedConfig.sampleRate });\n }\n\n if (\n typeof composedConfig.numberOfChannels === 'number' &&\n composedConfig.numberOfChannels > 0 &&\n composedConfig.numberOfChannels !== currentConfig.numberOfChannels\n ) {\n await this.audioEncoder.reconfigure({\n numberOfChannels: composedConfig.numberOfChannels,\n });\n }\n\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n this.audioEncoder.encode(value as unknown as AudioData);\n }\n } finally {\n reader.releaseLock();\n }\n }\n });\n\n return { success: true };\n }\n\n /**\n * Connect to cache manager for output streaming\n */\n // private async handleConnectCache(payload: { port: MessagePort }): Promise<{ success: boolean }> {\n // this.cachePort = payload.port;\n // return { success: true };\n // }\n\n /**\n * Connect to mux worker for output streaming\n */\n private async handleConnectMux(payload: { port: MessagePort }): Promise<{ success: boolean }> {\n this.muxPort = payload.port;\n return { success: true };\n }\n\n /**\n * Configure video encoder with specific settings\n */\n private async handleConfigureVideo(config: VideoEncoderConfig): Promise<{ success: boolean }> {\n try {\n // Create encoder if not exists (shouldn't happen if configure was called)\n if (!this.videoEncoder) {\n this.videoEncoder = new VideoChunkEncoder(config);\n await this.videoEncoder.initialize();\n } else {\n await this.videoEncoder.reconfigure(config);\n }\n\n // Notify configuration complete\n this.channel.notify('video_configured', {\n codec: config.codec,\n width: config.width,\n height: config.height,\n bitrate: config.bitrate,\n });\n\n return { success: true };\n } catch (error: any) {\n throw {\n code: 'VIDEO_CONFIG_ERROR',\n message: error.message,\n };\n }\n }\n\n /**\n * Configure audio encoder with specific settings\n */\n private async handleConfigureAudio(config: AudioEncoderConfig): Promise<{ success: boolean }> {\n try {\n // Create encoder if not exists (shouldn't happen if configure was called)\n if (!this.audioEncoder) {\n this.audioEncoder = new AudioChunkEncoder(config);\n await this.audioEncoder.initialize();\n } else {\n await this.audioEncoder.reconfigure(config);\n }\n\n // Notify configuration complete\n this.channel.notify('audio_configured', {\n codec: config.codec,\n sampleRate: config.sampleRate,\n numberOfChannels: config.numberOfChannels,\n bitrate: config.bitrate,\n });\n\n return { success: true };\n } catch (error: any) {\n throw {\n code: 'AUDIO_CONFIG_ERROR',\n message: error.message,\n };\n }\n }\n\n /**\n * Flush encoders and get buffered chunks\n */\n private async handleFlush(payload?: { type?: 'video' | 'audio' }): Promise<{\n videoChunks?: any[];\n audioChunks?: any[];\n }> {\n try {\n const result: any = {};\n\n if (!payload?.type || payload.type === 'video') {\n const chunks = await this.videoEncoder?.flush();\n if (chunks) {\n result.videoChunks = chunks;\n }\n }\n\n if (!payload?.type || payload.type === 'audio') {\n const chunks = await this.audioEncoder?.flush();\n if (chunks) {\n result.audioChunks = chunks;\n }\n }\n\n return result;\n } catch (error: any) {\n throw {\n code: 'FLUSH_ERROR',\n message: error.message,\n };\n }\n }\n\n /**\n * Reset encoders\n */\n private async handleReset(payload?: { type?: 'video' | 'audio' }): Promise<{ success: boolean }> {\n try {\n if (!payload?.type || payload.type === 'video') {\n await this.videoEncoder?.reset();\n }\n if (!payload?.type || payload.type === 'audio') {\n await this.audioEncoder?.reset();\n }\n\n // Notify reset complete\n this.channel.notify('reset_complete', {\n type: payload?.type || 'all',\n });\n\n return { success: true };\n } catch (error: any) {\n throw {\n code: 'RESET_ERROR',\n message: error.message,\n };\n }\n }\n\n /**\n * Get encoder statistics\n */\n private async handleGetStats(): Promise<{\n video?: any;\n audio?: any;\n }> {\n const stats: any = {};\n\n if (this.videoEncoder) {\n stats.video = {\n configured: this.videoEncoder.isReady,\n queueSize: this.videoEncoder.queueSize,\n };\n }\n\n if (this.audioEncoder) {\n stats.audio = {\n configured: this.audioEncoder.isReady,\n queueSize: this.audioEncoder.queueSize,\n };\n }\n\n return stats;\n }\n\n // Output and error handling is done via streams in the encoder itself\n // These placeholder methods can be implemented when needed for direct callback handling\n\n /**\n * Dispose worker and cleanup resources\n */\n private async handleDispose(): Promise<{ success: boolean }> {\n // Close encoders\n await this.videoEncoder?.close();\n await this.audioEncoder?.close();\n\n this.videoEncoder = null;\n this.audioEncoder = null;\n\n // Close connections\n this.cachePort?.close();\n this.cachePort = null;\n\n this.muxPort?.close();\n this.muxPort = null;\n\n for (const port of this.composePorts.values()) {\n port.close();\n }\n this.composePorts.clear();\n\n this.channel.state = WorkerState.Disposed;\n\n return { success: true };\n }\n}\n\n// Initialize worker\nconst worker = new EncodeWorker();\n\n// Handle worker termination\nself.addEventListener('beforeunload', () => {\n worker['handleDispose']();\n});\n\nexport default null; // Required for TypeScript worker compilation\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"encode.worker.js","sources":["../../../src/stages/encode/encode.worker.ts"],"sourcesContent":["import { WorkerChannel } from '../../worker/WorkerChannel';\nimport { WorkerMessageType, WorkerState } from '../../worker/types';\nimport { VideoChunkEncoder } from './VideoChunkEncoder';\nimport { AudioChunkEncoder } from './AudioChunkEncoder';\nimport { VideoEncoderConfig, AudioEncoderConfig } from './types';\n\n/**\n * EncodeWorker - Seventh stage in the pipeline\n * Receives composed frames from ComposeWorkers and outputs encoded chunks to CacheManager/MuxWorker\n *\n * Pipeline: VideoComposeWorker/AudioComposeWorker → EncodeWorker → CacheManager/MuxWorker\n *\n * Features:\n * - Hardware-accelerated encoding via WebCodecs\n * - Configurable bitrate and quality settings\n * - Batch flush for efficient I/O (0.5s batches)\n * - Direct streaming to cache/mux workers\n */\nclass EncodeWorker {\n private channel: WorkerChannel;\n private videoEncoder: VideoChunkEncoder | null = null;\n private audioEncoder: AudioChunkEncoder | null = null;\n\n // Connections to other workers\n private cachePort: MessagePort | null = null;\n private muxPort: MessagePort | null = null;\n private composePorts = new Map<string, MessagePort>(); // Connections from compose workers\n\n constructor() {\n // Initialize WorkerChannel with MessagePort\n this.channel = new WorkerChannel(self as any, {\n name: 'EncodeWorker',\n timeout: 30000,\n });\n\n this.setupHandlers();\n }\n\n private setupHandlers(): void {\n // Register message handlers\n this.channel.registerHandler('configure', this.handleConfigure.bind(this));\n this.channel.registerHandler('connect', this.handleConnect.bind(this));\n this.channel.registerHandler('configure_video', this.handleConfigureVideo.bind(this));\n this.channel.registerHandler('configure_audio', this.handleConfigureAudio.bind(this));\n this.channel.registerHandler('flush', this.handleFlush.bind(this));\n this.channel.registerHandler('reset', this.handleReset.bind(this));\n this.channel.registerHandler('get_stats', this.handleGetStats.bind(this));\n this.channel.registerHandler(WorkerMessageType.Dispose, this.handleDispose.bind(this));\n }\n\n /**\n * Connect handler used by stream pipeline\n */\n private async handleConnect(payload: {\n direction: 'upstream';\n port: MessagePort;\n streamType: 'video' | 'audio' | 'frame' | 'chunk';\n }): Promise<{ success: boolean }> {\n const { port, streamType } = payload;\n if (streamType === 'video') return this.handleConnectComposer({ composeType: 'video', port });\n if (streamType === 'audio') return this.handleConnectComposer({ composeType: 'audio', port });\n if (streamType === 'chunk') return this.handleConnectMux({ port });\n return { success: true };\n }\n\n /**\n * Handle configuration message from orchestrator\n * @param payload.initial - If true, initialize worker and recreate encoder instances; otherwise just update config\n */\n private async handleConfigure(payload: {\n config: {\n video?: Partial<VideoEncoderConfig> & { stream?: ReadableStream<VideoFrame> };\n audio?: Partial<AudioEncoderConfig> & { stream?: ReadableStream<AudioData> };\n };\n initial?: boolean;\n }): Promise<{ success: boolean }> {\n const { config, initial = false } = payload;\n\n // Set worker state to ready on initial configuration\n if (initial) {\n this.channel.state = WorkerState.Ready;\n }\n\n // Handle video encoder configuration\n if (config.video) {\n if (initial || !this.videoEncoder) {\n if (this.videoEncoder) {\n await this.videoEncoder.close();\n }\n this.videoEncoder = new VideoChunkEncoder(config.video as VideoEncoderConfig);\n await this.videoEncoder.initialize();\n\n const videoStream = config.video.stream?.pipeThrough(this.videoEncoder.createStream());\n if (videoStream && this.cachePort) {\n const cacheChannel = new WorkerChannel(this.cachePort, {\n name: 'Encode-Cache-Video',\n timeout: 30000,\n });\n await cacheChannel.sendStream(videoStream, {\n type: 'video',\n width: config.video.width,\n height: config.video.height,\n framerate: config.video.framerate,\n });\n }\n } else {\n await this.videoEncoder.reconfigure(config.video);\n }\n }\n\n if (config.audio) {\n if (initial || !this.audioEncoder) {\n if (this.audioEncoder) {\n await this.audioEncoder.close();\n }\n this.audioEncoder = new AudioChunkEncoder(config.audio as AudioEncoderConfig);\n await this.audioEncoder.initialize();\n\n const audioStream = config.audio.stream?.pipeThrough(this.audioEncoder.createStream());\n if (audioStream && this.cachePort) {\n const cacheChannel = new WorkerChannel(this.cachePort, {\n name: 'Encode-Cache-Audio',\n timeout: 30000,\n });\n await cacheChannel.sendStream(audioStream, {\n type: 'audio',\n sampleRate: config.audio.sampleRate,\n numberOfChannels: config.audio.numberOfChannels,\n });\n }\n } else {\n await this.audioEncoder.reconfigure(config.audio);\n }\n }\n\n return { success: true };\n }\n\n /**\n * Connect to a compose worker to receive frames/audio data\n */\n private async handleConnectComposer(payload: {\n composeType: 'video' | 'audio';\n port: MessagePort;\n }): Promise<{ success: boolean }> {\n const { composeType, port } = payload;\n\n // Store the port\n this.composePorts.set(composeType, port);\n\n // Setup channel for receiving streams\n const composeChannel = new WorkerChannel(port, {\n name: `Encode-${composeType}Compose`,\n timeout: 30000,\n });\n\n // Receive stream from composer\n composeChannel.receiveStream(async (stream, metadata) => {\n if (metadata?.streamType === 'video' && this.videoEncoder) {\n // Process video frames\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n // value might be wrapped object {frame, metadata} or plain VideoFrame\n const wrappedValue = value as any;\n const videoFrame = wrappedValue.frame || wrappedValue;\n\n try {\n const frame = (videoFrame as VideoFrame).clone();\n this.videoEncoder.encode(frame);\n } finally {\n // Close the original frame after cloning and encoding\n (videoFrame as VideoFrame).close();\n }\n }\n } finally {\n reader.releaseLock();\n }\n } else if (metadata?.streamType === 'audio' && this.audioEncoder) {\n const composedConfig = {\n sampleRate: metadata.sampleRate,\n numberOfChannels: metadata.numberOfChannels,\n };\n\n const currentConfig = this.audioEncoder.getConfig();\n\n if (\n typeof composedConfig.sampleRate === 'number' &&\n composedConfig.sampleRate > 0 &&\n composedConfig.sampleRate !== currentConfig.sampleRate\n ) {\n await this.audioEncoder.reconfigure({ sampleRate: composedConfig.sampleRate });\n }\n\n if (\n typeof composedConfig.numberOfChannels === 'number' &&\n composedConfig.numberOfChannels > 0 &&\n composedConfig.numberOfChannels !== currentConfig.numberOfChannels\n ) {\n await this.audioEncoder.reconfigure({\n numberOfChannels: composedConfig.numberOfChannels,\n });\n }\n\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n this.audioEncoder.encode(value as unknown as AudioData);\n }\n } finally {\n reader.releaseLock();\n }\n }\n });\n\n return { success: true };\n }\n\n /**\n * Connect to cache manager for output streaming\n */\n // private async handleConnectCache(payload: { port: MessagePort }): Promise<{ success: boolean }> {\n // this.cachePort = payload.port;\n // return { success: true };\n // }\n\n /**\n * Connect to mux worker for output streaming\n */\n private async handleConnectMux(payload: { port: MessagePort }): Promise<{ success: boolean }> {\n this.muxPort = payload.port;\n return { success: true };\n }\n\n /**\n * Configure video encoder with specific settings\n */\n private async handleConfigureVideo(config: VideoEncoderConfig): Promise<{ success: boolean }> {\n try {\n // Create encoder if not exists (shouldn't happen if configure was called)\n if (!this.videoEncoder) {\n this.videoEncoder = new VideoChunkEncoder(config);\n await this.videoEncoder.initialize();\n } else {\n await this.videoEncoder.reconfigure(config);\n }\n\n // Notify configuration complete\n this.channel.notify('video_configured', {\n codec: config.codec,\n width: config.width,\n height: config.height,\n bitrate: config.bitrate,\n });\n\n return { success: true };\n } catch (error: any) {\n throw {\n code: 'VIDEO_CONFIG_ERROR',\n message: error.message,\n };\n }\n }\n\n /**\n * Configure audio encoder with specific settings\n */\n private async handleConfigureAudio(config: AudioEncoderConfig): Promise<{ success: boolean }> {\n try {\n // Create encoder if not exists (shouldn't happen if configure was called)\n if (!this.audioEncoder) {\n this.audioEncoder = new AudioChunkEncoder(config);\n await this.audioEncoder.initialize();\n } else {\n await this.audioEncoder.reconfigure(config);\n }\n\n // Notify configuration complete\n this.channel.notify('audio_configured', {\n codec: config.codec,\n sampleRate: config.sampleRate,\n numberOfChannels: config.numberOfChannels,\n bitrate: config.bitrate,\n });\n\n return { success: true };\n } catch (error: any) {\n throw {\n code: 'AUDIO_CONFIG_ERROR',\n message: error.message,\n };\n }\n }\n\n /**\n * Flush encoders and get buffered chunks\n */\n private async handleFlush(payload?: { type?: 'video' | 'audio' }): Promise<{\n videoChunks?: any[];\n audioChunks?: any[];\n }> {\n try {\n const result: any = {};\n\n if (!payload?.type || payload.type === 'video') {\n const chunks = await this.videoEncoder?.flush();\n if (chunks) {\n result.videoChunks = chunks;\n }\n }\n\n if (!payload?.type || payload.type === 'audio') {\n const chunks = await this.audioEncoder?.flush();\n if (chunks) {\n result.audioChunks = chunks;\n }\n }\n\n return result;\n } catch (error: any) {\n throw {\n code: 'FLUSH_ERROR',\n message: error.message,\n };\n }\n }\n\n /**\n * Reset encoders\n */\n private async handleReset(payload?: { type?: 'video' | 'audio' }): Promise<{ success: boolean }> {\n try {\n if (!payload?.type || payload.type === 'video') {\n await this.videoEncoder?.reset();\n }\n if (!payload?.type || payload.type === 'audio') {\n await this.audioEncoder?.reset();\n }\n\n // Notify reset complete\n this.channel.notify('reset_complete', {\n type: payload?.type || 'all',\n });\n\n return { success: true };\n } catch (error: any) {\n throw {\n code: 'RESET_ERROR',\n message: error.message,\n };\n }\n }\n\n /**\n * Get encoder statistics\n */\n private async handleGetStats(): Promise<{\n video?: any;\n audio?: any;\n }> {\n const stats: any = {};\n\n if (this.videoEncoder) {\n stats.video = {\n configured: this.videoEncoder.isReady,\n queueSize: this.videoEncoder.queueSize,\n };\n }\n\n if (this.audioEncoder) {\n stats.audio = {\n configured: this.audioEncoder.isReady,\n queueSize: this.audioEncoder.queueSize,\n };\n }\n\n return stats;\n }\n\n // Output and error handling is done via streams in the encoder itself\n // These placeholder methods can be implemented when needed for direct callback handling\n\n /**\n * Dispose worker and cleanup resources\n */\n private async handleDispose(): Promise<{ success: boolean }> {\n // Close encoders\n await this.videoEncoder?.close();\n await this.audioEncoder?.close();\n\n this.videoEncoder = null;\n this.audioEncoder = null;\n\n // Close connections\n this.cachePort?.close();\n this.cachePort = null;\n\n this.muxPort?.close();\n this.muxPort = null;\n\n for (const port of this.composePorts.values()) {\n port.close();\n }\n this.composePorts.clear();\n\n this.channel.state = WorkerState.Disposed;\n\n return { success: true };\n }\n}\n\n// Initialize worker\nconst worker = new EncodeWorker();\n\n// Handle worker termination\nself.addEventListener('beforeunload', () => {\n worker['handleDispose']();\n});\n\nexport default null; // Required for TypeScript worker compilation\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ const encodeWorkerUrl = "" + new URL("../../assets/encode.worker-nfOb3kw6.js", import.meta.url).href;
2
+ export {
3
+ encodeWorkerUrl as default
4
+ };
5
+ //# sourceMappingURL=encode.worker2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encode.worker2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,4 +1,4 @@
1
- import { Resource, CompositionModel } from '../../model';
1
+ import { CompositionModel } from '../../model';
2
2
  import { Orchestrator } from './types';
3
3
 
4
4
  /**
@@ -6,23 +6,14 @@ import { Orchestrator } from './types';
6
6
  */
7
7
  export declare class EventHandlers {
8
8
  private orchestrator;
9
- private onResourceLoad;
10
9
  private onResourceCancel;
11
10
  private onModelSet;
12
11
  private eventHandlers;
13
- constructor(orchestrator: Orchestrator, onResourceLoad: (resource: Resource, priority?: 'high' | 'normal' | 'low') => void, onResourceCancel: (resourceId: string) => void, onModelSet: (model: CompositionModel) => void);
12
+ constructor(orchestrator: Orchestrator, onResourceCancel: (resourceId: string) => void, onModelSet: (model: CompositionModel) => void);
14
13
  /**
15
14
  * Setup event handlers
16
15
  */
17
16
  private setupHandlers;
18
- /**
19
- * Handle resource add event
20
- */
21
- private handleResourceAdd;
22
- /**
23
- * Handle resource update event
24
- */
25
- private handleResourceUpdate;
26
17
  /**
27
18
  * Handle resource remove event
28
19
  */
@@ -1 +1 @@
1
- {"version":3,"file":"EventHandlers.d.ts","sourceRoot":"","sources":["../../../src/stages/load/EventHandlers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;GAEG;AACH,qBAAa,aAAa;IAItB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,UAAU;IANpB,OAAO,CAAC,aAAa,CAA0C;gBAGrD,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,KAAK,IAAI,EAClF,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,EAC9C,UAAU,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI;IAKvD;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;IACH,OAAO,IAAI,IAAI;CAMhB"}
1
+ {"version":3,"file":"EventHandlers.d.ts","sourceRoot":"","sources":["../../../src/stages/load/EventHandlers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;GAEG;AACH,qBAAa,aAAa;IAItB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,UAAU;IALpB,OAAO,CAAC,aAAa,CAA0C;gBAGrD,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,EAC9C,UAAU,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI;IAKvD;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;IACH,OAAO,IAAI,IAAI;CAMhB"}
@@ -1,8 +1,7 @@
1
1
  import { MeframeEvent } from "../../event/events.js";
2
2
  class EventHandlers {
3
- constructor(orchestrator, onResourceLoad, onResourceCancel, onModelSet) {
3
+ constructor(orchestrator, onResourceCancel, onModelSet) {
4
4
  this.orchestrator = orchestrator;
5
- this.onResourceLoad = onResourceLoad;
6
5
  this.onResourceCancel = onResourceCancel;
7
6
  this.onModelSet = onModelSet;
8
7
  this.setupHandlers();
@@ -13,8 +12,6 @@ class EventHandlers {
13
12
  */
14
13
  setupHandlers() {
15
14
  const handlers = {
16
- [MeframeEvent.ResourceAdd]: (event) => this.handleResourceAdd(event),
17
- [MeframeEvent.ResourceUpdate]: (event) => this.handleResourceUpdate(event),
18
15
  [MeframeEvent.ResourceRemove]: (event) => this.handleResourceRemove(event),
19
16
  [MeframeEvent.ModelSet]: (model) => this.onModelSet(model)
20
17
  };
@@ -23,26 +20,6 @@ class EventHandlers {
23
20
  this.eventHandlers.set(event, handler);
24
21
  }
25
22
  }
26
- /**
27
- * Handle resource add event
28
- */
29
- handleResourceAdd(event) {
30
- if (!event.resource) return;
31
- const resource = event.resource;
32
- if (resource.state === "pending" || resource.state === void 0) {
33
- this.onResourceLoad(resource);
34
- }
35
- }
36
- /**
37
- * Handle resource update event
38
- */
39
- handleResourceUpdate(event) {
40
- if (!event.resource) return;
41
- const resource = event.resource;
42
- if (event.oldState === "error" && resource.state === "pending") {
43
- this.onResourceLoad(resource, "high");
44
- }
45
- }
46
23
  /**
47
24
  * Handle resource remove event
48
25
  */
@@ -1 +1 @@
1
- {"version":3,"file":"EventHandlers.js","sources":["../../../src/stages/load/EventHandlers.ts"],"sourcesContent":["import { MeframeEvent, ResourceEvent } from '../../event/events';\nimport type { Resource, CompositionModel } from '../../model';\nimport type { Orchestrator } from './types';\n\n/**\n * Handles resource events from Orchestrator\n */\nexport class EventHandlers {\n private eventHandlers = new Map<string, (data: any) => void>();\n\n constructor(\n private orchestrator: Orchestrator,\n private onResourceLoad: (resource: Resource, priority?: 'high' | 'normal' | 'low') => void,\n private onResourceCancel: (resourceId: string) => void,\n private onModelSet: (model: CompositionModel) => void\n ) {\n this.setupHandlers();\n }\n\n /**\n * Setup event handlers\n */\n private setupHandlers(): void {\n const handlers = {\n [MeframeEvent.ResourceAdd]: (event: ResourceEvent) => this.handleResourceAdd(event),\n [MeframeEvent.ResourceUpdate]: (event: ResourceEvent) => this.handleResourceUpdate(event),\n [MeframeEvent.ResourceRemove]: (event: ResourceEvent) => this.handleResourceRemove(event),\n [MeframeEvent.ModelSet]: (model: CompositionModel) => this.onModelSet(model),\n };\n\n for (const [event, handler] of Object.entries(handlers)) {\n this.orchestrator.on(event, handler);\n this.eventHandlers.set(event, handler);\n }\n }\n\n /**\n * Handle resource add event\n */\n private handleResourceAdd(event: ResourceEvent): void {\n if (!event.resource) return;\n\n const resource = event.resource;\n if (resource.state === 'pending' || resource.state === undefined) {\n this.onResourceLoad(resource);\n }\n }\n\n /**\n * Handle resource update event\n */\n private handleResourceUpdate(event: ResourceEvent): void {\n if (!event.resource) return;\n\n const resource = event.resource;\n\n // Retry if error state changed to pending\n if (event.oldState === 'error' && resource.state === 'pending') {\n this.onResourceLoad(resource, 'high');\n }\n }\n\n /**\n * Handle resource remove event\n */\n private handleResourceRemove(event: ResourceEvent): void {\n this.onResourceCancel(event.resourceId);\n }\n\n /**\n * Clean up event handlers\n */\n dispose(): void {\n for (const [event, handler] of this.eventHandlers) {\n this.orchestrator.off(event, handler);\n }\n this.eventHandlers.clear();\n }\n}\n"],"names":[],"mappings":";AAOO,MAAM,cAAc;AAAA,EAGzB,YACU,cACA,gBACA,kBACA,YACR;AAJQ,SAAA,eAAA;AACA,SAAA,iBAAA;AACA,SAAA,mBAAA;AACA,SAAA,aAAA;AAER,SAAK,cAAA;AAAA,EACP;AAAA,EATQ,oCAAoB,IAAA;AAAA;AAAA;AAAA;AAAA,EAcpB,gBAAsB;AAC5B,UAAM,WAAW;AAAA,MACf,CAAC,aAAa,WAAW,GAAG,CAAC,UAAyB,KAAK,kBAAkB,KAAK;AAAA,MAClF,CAAC,aAAa,cAAc,GAAG,CAAC,UAAyB,KAAK,qBAAqB,KAAK;AAAA,MACxF,CAAC,aAAa,cAAc,GAAG,CAAC,UAAyB,KAAK,qBAAqB,KAAK;AAAA,MACxF,CAAC,aAAa,QAAQ,GAAG,CAAC,UAA4B,KAAK,WAAW,KAAK;AAAA,IAAA;AAG7E,eAAW,CAAC,OAAO,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACvD,WAAK,aAAa,GAAG,OAAO,OAAO;AACnC,WAAK,cAAc,IAAI,OAAO,OAAO;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,OAA4B;AACpD,QAAI,CAAC,MAAM,SAAU;AAErB,UAAM,WAAW,MAAM;AACvB,QAAI,SAAS,UAAU,aAAa,SAAS,UAAU,QAAW;AAChE,WAAK,eAAe,QAAQ;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,OAA4B;AACvD,QAAI,CAAC,MAAM,SAAU;AAErB,UAAM,WAAW,MAAM;AAGvB,QAAI,MAAM,aAAa,WAAW,SAAS,UAAU,WAAW;AAC9D,WAAK,eAAe,UAAU,MAAM;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,OAA4B;AACvD,SAAK,iBAAiB,MAAM,UAAU;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,eAAW,CAAC,OAAO,OAAO,KAAK,KAAK,eAAe;AACjD,WAAK,aAAa,IAAI,OAAO,OAAO;AAAA,IACtC;AACA,SAAK,cAAc,MAAA;AAAA,EACrB;AACF;"}
1
+ {"version":3,"file":"EventHandlers.js","sources":["../../../src/stages/load/EventHandlers.ts"],"sourcesContent":["import { MeframeEvent, ResourceEvent } from '../../event/events';\nimport type { CompositionModel } from '../../model';\nimport type { Orchestrator } from './types';\n\n/**\n * Handles resource events from Orchestrator\n */\nexport class EventHandlers {\n private eventHandlers = new Map<string, (data: any) => void>();\n\n constructor(\n private orchestrator: Orchestrator,\n private onResourceCancel: (resourceId: string) => void,\n private onModelSet: (model: CompositionModel) => void\n ) {\n this.setupHandlers();\n }\n\n /**\n * Setup event handlers\n */\n private setupHandlers(): void {\n const handlers = {\n [MeframeEvent.ResourceRemove]: (event: ResourceEvent) => this.handleResourceRemove(event),\n [MeframeEvent.ModelSet]: (model: CompositionModel) => this.onModelSet(model),\n };\n\n for (const [event, handler] of Object.entries(handlers)) {\n this.orchestrator.on(event, handler);\n this.eventHandlers.set(event, handler);\n }\n }\n\n /**\n * Handle resource remove event\n */\n private handleResourceRemove(event: ResourceEvent): void {\n this.onResourceCancel(event.resourceId);\n }\n\n /**\n * Clean up event handlers\n */\n dispose(): void {\n for (const [event, handler] of this.eventHandlers) {\n this.orchestrator.off(event, handler);\n }\n this.eventHandlers.clear();\n }\n}\n"],"names":[],"mappings":";AAOO,MAAM,cAAc;AAAA,EAGzB,YACU,cACA,kBACA,YACR;AAHQ,SAAA,eAAA;AACA,SAAA,mBAAA;AACA,SAAA,aAAA;AAER,SAAK,cAAA;AAAA,EACP;AAAA,EARQ,oCAAoB,IAAA;AAAA;AAAA;AAAA;AAAA,EAapB,gBAAsB;AAC5B,UAAM,WAAW;AAAA,MACf,CAAC,aAAa,cAAc,GAAG,CAAC,UAAyB,KAAK,qBAAqB,KAAK;AAAA,MACxF,CAAC,aAAa,QAAQ,GAAG,CAAC,UAA4B,KAAK,WAAW,KAAK;AAAA,IAAA;AAG7E,eAAW,CAAC,OAAO,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACvD,WAAK,aAAa,GAAG,OAAO,OAAO;AACnC,WAAK,cAAc,IAAI,OAAO,OAAO;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,OAA4B;AACvD,SAAK,iBAAiB,MAAM,UAAU;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,eAAW,CAAC,OAAO,OAAO,KAAK,KAAK,eAAe;AACjD,WAAK,aAAa,IAAI,OAAO,OAAO;AAAA,IACtC;AACA,SAAK,cAAc,MAAA;AAAA,EACrB;AACF;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ResourceLoader.d.ts","sourceRoot":"","sources":["../../../src/stages/load/ResourceLoader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAQlG,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,KAAK,CAAC,CAAmB;IACjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,CAA4B;IAC7C,OAAO,CAAC,aAAa,CAAC,CAAyD;IAC/E,OAAO,CAAC,iBAAiB,CAA0B;gBAEvC,OAAO,CAAC,EAAE,qBAAqB;IAa3C;;OAEG;IACH,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAYtC;;OAEG;IACH,MAAM,IAAI,IAAI;IAMd,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,YAAY;YAQN,SAAS;YA2CT,wBAAwB;YAaxB,qBAAqB;IAoBnC,OAAO,CAAC,mBAAmB;IAkBrB,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9E,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAKhC,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAOzB,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAe9E,IAAI,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAEvC;IAED,IAAI,SAAS,IAAI,QAAQ,EAAE,CAE1B;IAED,OAAO,IAAI,IAAI;CAKhB"}
1
+ {"version":3,"file":"ResourceLoader.d.ts","sourceRoot":"","sources":["../../../src/stages/load/ResourceLoader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAQlG,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,KAAK,CAAC,CAAmB;IACjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,CAA4B;IAC7C,OAAO,CAAC,aAAa,CAAC,CAAyD;IAC/E,OAAO,CAAC,iBAAiB,CAA0B;gBAEvC,OAAO,CAAC,EAAE,qBAAqB;IAa3C;;OAEG;IACH,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAWtC;;OAEG;IACH,MAAM,IAAI,IAAI;IAMd,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,YAAY;YAQN,SAAS;YA2CT,wBAAwB;YAaxB,qBAAqB;IAsBnC,OAAO,CAAC,mBAAmB;IAkBrB,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9E,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAKhC,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAOzB,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAe9E,IAAI,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAEvC;IAED,IAAI,SAAS,IAAI,QAAQ,EAAE,CAE1B;IAED,OAAO,IAAI,IAAI;CAKhB"}
@@ -31,7 +31,6 @@ class ResourceLoader {
31
31
  this.orchestrator = orchestrator;
32
32
  this.eventHandlers = new EventHandlers(
33
33
  orchestrator,
34
- (resource, priority) => this.enqueueLoad(resource, priority),
35
34
  (resourceId) => this.cancel(resourceId),
36
35
  (model) => this.handleModelSet(model)
37
36
  );
@@ -47,7 +46,7 @@ class ResourceLoader {
47
46
  handleModelSet(model) {
48
47
  this.model = model;
49
48
  }
50
- enqueueLoad(resource, priority = "normal", range) {
49
+ enqueueLoad(resource, priority = "normal", clipId) {
51
50
  if (this.taskManager.hasActiveTask(resource.id)) {
52
51
  return;
53
52
  }
@@ -55,10 +54,7 @@ class ResourceLoader {
55
54
  this.loadNonStreamingResource(resource);
56
55
  return;
57
56
  }
58
- const task = this.taskManager.enqueue(resource, priority);
59
- if (task && range) {
60
- task.range = range;
61
- }
57
+ this.taskManager.enqueue(resource, priority, clipId);
62
58
  this.processQueue();
63
59
  }
64
60
  processQueue() {
@@ -104,15 +100,17 @@ class ResourceLoader {
104
100
  }
105
101
  async transferToDemuxWorker(task) {
106
102
  if (!task.stream || !this.orchestrator) return;
103
+ if (!task.clipId) {
104
+ throw new Error(
105
+ `[ResourceLoader] clipId required for resource ${task.resourceId}. In Clip-based architecture, use fetch(resourceId, { clipId })`
106
+ );
107
+ }
107
108
  const workerType = task.resource.type === "video" ? "videoDemux" : "audioDemux";
108
- const demuxWorker = await this.orchestrator.workers.get(workerType, task.resourceId, {
109
+ const demuxWorker = await this.orchestrator.workers.get(workerType, task.clipId, {
109
110
  lazy: true
110
111
  });
111
- const clipIds = this.model?.getClipIdsByResourceId?.(task.resourceId) || [];
112
- const clipId = clipIds[0];
113
112
  await demuxWorker.sendStream(task.stream, {
114
- resourceId: task.resourceId,
115
- clipId,
113
+ clipId: task.clipId,
116
114
  ...task.metadata,
117
115
  ...task.range && { range: task.range }
118
116
  });
@@ -142,7 +140,7 @@ class ResourceLoader {
142
140
  console.warn(`Resource ${resourceId} not found in model`);
143
141
  return;
144
142
  }
145
- this.enqueueLoad(resource, options?.priority || "normal", options?.range);
143
+ this.enqueueLoad(resource, options?.priority || "normal", options?.clipId);
146
144
  }
147
145
  cancel(resourceId) {
148
146
  this.taskManager.cancelTask(resourceId);
@@ -161,7 +159,7 @@ class ResourceLoader {
161
159
  }
162
160
  const pausedTask = this.taskManager.getActiveTask(resourceId);
163
161
  if (pausedTask?.pausedAt !== void 0) {
164
- this.enqueueLoad(resource, options?.priority || "normal");
162
+ this.enqueueLoad(resource, options?.priority || "normal", options?.clipId);
165
163
  } else {
166
164
  await this.fetch(resourceId, options);
167
165
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ResourceLoader.js","sources":["../../../src/stages/load/ResourceLoader.ts"],"sourcesContent":["import type { Resource, CompositionModel } from '../../model';\nimport type { Orchestrator, ResourceLoadOptions, LoadTask, ResourceLoaderOptions } from './types';\nimport { TaskManager } from './TaskManager';\nimport { StreamFactory } from './StreamFactory';\nimport { EventHandlers } from './EventHandlers';\nimport { EventPayloadMap, MeframeEvent } from '../../event/events';\nimport { EventBus } from '../../event/EventBus';\nimport { WindowByteRangeResolver } from './WindowByteRangeResolver';\n\nexport class ResourceLoader {\n private orchestrator?: Orchestrator;\n private model?: CompositionModel;\n private taskManager: TaskManager;\n private streamFactory: StreamFactory;\n private eventHandlers?: EventHandlers;\n private eventBus?: EventBus<EventPayloadMap>;\n private onStateChange?: (resourceId: string, state: Resource['state']) => void;\n private byteRangeResolver: WindowByteRangeResolver;\n\n constructor(options?: ResourceLoaderOptions) {\n const maxConcurrent = options?.config?.maxConcurrent ?? 4;\n this.taskManager = new TaskManager(maxConcurrent);\n this.streamFactory = new StreamFactory(options?.onProgress, options?.config);\n this.eventBus = options?.eventBus;\n this.onStateChange = options?.onStateChange;\n this.byteRangeResolver = new WindowByteRangeResolver();\n\n if (options?.orchestrator) {\n this.bind(options.orchestrator);\n }\n }\n\n /**\n * Bind to Orchestrator event system\n */\n bind(orchestrator: Orchestrator): void {\n this.unbind();\n this.orchestrator = orchestrator;\n\n this.eventHandlers = new EventHandlers(\n orchestrator,\n (resource, priority) => this.enqueueLoad(resource, priority),\n (resourceId) => this.cancel(resourceId),\n (model) => this.handleModelSet(model)\n );\n }\n\n /**\n * Unbind from Orchestrator\n */\n unbind(): void {\n this.eventHandlers?.dispose();\n this.eventHandlers = undefined;\n this.orchestrator = undefined;\n }\n\n private handleModelSet(model: CompositionModel): void {\n this.model = model;\n }\n\n private enqueueLoad(\n resource: Resource,\n priority: 'high' | 'normal' | 'low' = 'normal',\n range?: { start: number; end: number }\n ): void {\n if (this.taskManager.hasActiveTask(resource.id)) {\n return;\n }\n\n if (resource.type === 'json' || resource.type === 'text') {\n this.loadNonStreamingResource(resource);\n return;\n }\n\n const task = this.taskManager.enqueue(resource, priority);\n if (task && range) {\n task.range = range;\n }\n this.processQueue();\n }\n\n private processQueue(): void {\n while (this.taskManager.canProcess) {\n const task = this.taskManager.getNextTask();\n if (!task) break;\n this.startLoad(task);\n }\n }\n\n private async startLoad(task: LoadTask): Promise<void> {\n this.taskManager.activateTask(task);\n\n try {\n this.updateResourceState(task.resourceId, 'loading');\n task.controller = new AbortController();\n\n // const metadata = await this.streamFactory.fetchMetadata(\n // task.resource.uri,\n // task.controller.signal\n // );\n\n // if (metadata) {\n // task.metadata = metadata;\n // task.totalBytes = metadata.contentLength;\n // }\n\n // let stream =\n // metadata?.acceptRanges && task.pausedAt !== undefined\n // ? this.streamFactory.createResumableStream(task)\n // : await this.streamFactory.createRegularStream(task);\n\n const stream = await this.streamFactory.createRegularStream(task);\n\n if (!stream) {\n throw new Error(`Failed to create stream for ${task.resourceId}`);\n }\n\n task.stream = stream;\n\n if (task.resource.type === 'video' || task.resource.type === 'audio') {\n await this.transferToDemuxWorker(task);\n }\n this.updateResourceState(task.resourceId, 'ready');\n } catch (error) {\n task.error = error as Error;\n this.updateResourceState(task.resourceId, 'error');\n } finally {\n this.taskManager.completeTask(task.resourceId);\n this.processQueue();\n }\n }\n\n private async loadNonStreamingResource(resource: Resource): Promise<void> {\n try {\n this.updateResourceState(resource.id, 'loading');\n const response = await fetch(resource.uri);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n this.updateResourceState(resource.id, 'ready');\n } catch {\n this.updateResourceState(resource.id, 'error');\n }\n }\n\n private async transferToDemuxWorker(task: LoadTask): Promise<void> {\n if (!task.stream || !this.orchestrator) return;\n\n const workerType = task.resource.type === 'video' ? 'videoDemux' : 'audioDemux';\n // use lazy mode to avoid initializing worker when not needed\n const demuxWorker = await this.orchestrator.workers.get(workerType, task.resourceId, {\n lazy: true,\n });\n\n const clipIds = this.model?.getClipIdsByResourceId?.(task.resourceId) || [];\n const clipId = clipIds[0];\n\n await demuxWorker.sendStream(task.stream, {\n resourceId: task.resourceId,\n clipId,\n ...task.metadata,\n ...(task.range && { range: task.range }),\n });\n }\n\n private updateResourceState(resourceId: string, state: Resource['state']): void {\n const resource = this.model?.resources.get(resourceId);\n if (resource) {\n const oldState = resource.state;\n resource.state = state;\n if (this.orchestrator) {\n this.eventBus?.emit(MeframeEvent.ResourceStageChange, {\n type: MeframeEvent.ResourceStageChange,\n resourceId,\n oldState,\n newState: state,\n });\n }\n }\n\n this.onStateChange?.(resourceId, state);\n }\n\n async fetch(resourceId?: string, options?: ResourceLoadOptions): Promise<void> {\n if (!resourceId) {\n return;\n }\n\n const resource = this.model?.resources.get(resourceId);\n if (!resource) {\n console.warn(`Resource ${resourceId} not found in model`);\n return;\n }\n\n this.enqueueLoad(resource, options?.priority || 'normal', options?.range);\n }\n\n cancel(resourceId: string): void {\n this.taskManager.cancelTask(resourceId);\n this.processQueue();\n }\n\n pause(resourceId: string): void {\n const task = this.taskManager.getActiveTask(resourceId);\n if (task) {\n task.controller?.abort();\n }\n }\n\n async resume(resourceId: string, options?: ResourceLoadOptions): Promise<void> {\n const resource = this.model?.getResource(resourceId);\n if (!resource) {\n throw new Error(`Resource ${resourceId} not found`);\n }\n\n const pausedTask = this.taskManager.getActiveTask(resourceId);\n\n if (pausedTask?.pausedAt !== undefined) {\n this.enqueueLoad(resource, options?.priority || 'normal');\n } else {\n await this.fetch(resourceId, options);\n }\n }\n\n get activeTasks(): Map<string, LoadTask> {\n return this.taskManager.activeTasks;\n }\n\n get taskQueue(): LoadTask[] {\n return this.taskManager.taskQueue;\n }\n\n dispose(): void {\n this.taskManager.clear();\n this.byteRangeResolver.dispose();\n this.unbind();\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ResourceLoader.js","sources":["../../../src/stages/load/ResourceLoader.ts"],"sourcesContent":["import type { Resource, CompositionModel } from '../../model';\nimport type { Orchestrator, ResourceLoadOptions, LoadTask, ResourceLoaderOptions } from './types';\nimport { TaskManager } from './TaskManager';\nimport { StreamFactory } from './StreamFactory';\nimport { EventHandlers } from './EventHandlers';\nimport { EventPayloadMap, MeframeEvent } from '../../event/events';\nimport { EventBus } from '../../event/EventBus';\nimport { WindowByteRangeResolver } from './WindowByteRangeResolver';\n\nexport class ResourceLoader {\n private orchestrator?: Orchestrator;\n private model?: CompositionModel;\n private taskManager: TaskManager;\n private streamFactory: StreamFactory;\n private eventHandlers?: EventHandlers;\n private eventBus?: EventBus<EventPayloadMap>;\n private onStateChange?: (resourceId: string, state: Resource['state']) => void;\n private byteRangeResolver: WindowByteRangeResolver;\n\n constructor(options?: ResourceLoaderOptions) {\n const maxConcurrent = options?.config?.maxConcurrent ?? 4;\n this.taskManager = new TaskManager(maxConcurrent);\n this.streamFactory = new StreamFactory(options?.onProgress, options?.config);\n this.eventBus = options?.eventBus;\n this.onStateChange = options?.onStateChange;\n this.byteRangeResolver = new WindowByteRangeResolver();\n\n if (options?.orchestrator) {\n this.bind(options.orchestrator);\n }\n }\n\n /**\n * Bind to Orchestrator event system\n */\n bind(orchestrator: Orchestrator): void {\n this.unbind();\n this.orchestrator = orchestrator;\n\n this.eventHandlers = new EventHandlers(\n orchestrator,\n (resourceId) => this.cancel(resourceId),\n (model) => this.handleModelSet(model)\n );\n }\n\n /**\n * Unbind from Orchestrator\n */\n unbind(): void {\n this.eventHandlers?.dispose();\n this.eventHandlers = undefined;\n this.orchestrator = undefined;\n }\n\n private handleModelSet(model: CompositionModel): void {\n this.model = model;\n }\n\n private enqueueLoad(\n resource: Resource,\n priority: 'high' | 'normal' | 'low' = 'normal',\n clipId?: string\n ): void {\n if (this.taskManager.hasActiveTask(resource.id)) {\n return;\n }\n\n if (resource.type === 'json' || resource.type === 'text') {\n this.loadNonStreamingResource(resource);\n return;\n }\n\n this.taskManager.enqueue(resource, priority, clipId);\n this.processQueue();\n }\n\n private processQueue(): void {\n while (this.taskManager.canProcess) {\n const task = this.taskManager.getNextTask();\n if (!task) break;\n this.startLoad(task);\n }\n }\n\n private async startLoad(task: LoadTask): Promise<void> {\n this.taskManager.activateTask(task);\n\n try {\n this.updateResourceState(task.resourceId, 'loading');\n task.controller = new AbortController();\n\n // const metadata = await this.streamFactory.fetchMetadata(\n // task.resource.uri,\n // task.controller.signal\n // );\n\n // if (metadata) {\n // task.metadata = metadata;\n // task.totalBytes = metadata.contentLength;\n // }\n\n // let stream =\n // metadata?.acceptRanges && task.pausedAt !== undefined\n // ? this.streamFactory.createResumableStream(task)\n // : await this.streamFactory.createRegularStream(task);\n\n const stream = await this.streamFactory.createRegularStream(task);\n\n if (!stream) {\n throw new Error(`Failed to create stream for ${task.resourceId}`);\n }\n\n task.stream = stream;\n\n if (task.resource.type === 'video' || task.resource.type === 'audio') {\n await this.transferToDemuxWorker(task);\n }\n this.updateResourceState(task.resourceId, 'ready');\n } catch (error) {\n task.error = error as Error;\n this.updateResourceState(task.resourceId, 'error');\n } finally {\n this.taskManager.completeTask(task.resourceId);\n this.processQueue();\n }\n }\n\n private async loadNonStreamingResource(resource: Resource): Promise<void> {\n try {\n this.updateResourceState(resource.id, 'loading');\n const response = await fetch(resource.uri);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n this.updateResourceState(resource.id, 'ready');\n } catch {\n this.updateResourceState(resource.id, 'error');\n }\n }\n\n private async transferToDemuxWorker(task: LoadTask): Promise<void> {\n if (!task.stream || !this.orchestrator) return;\n\n if (!task.clipId) {\n throw new Error(\n `[ResourceLoader] clipId required for resource ${task.resourceId}. ` +\n `In Clip-based architecture, use fetch(resourceId, { clipId })`\n );\n }\n\n const workerType = task.resource.type === 'video' ? 'videoDemux' : 'audioDemux';\n const demuxWorker = await this.orchestrator.workers.get(workerType, task.clipId, {\n lazy: true,\n });\n\n await demuxWorker.sendStream(task.stream, {\n clipId: task.clipId,\n ...task.metadata,\n ...(task.range && { range: task.range }),\n });\n }\n\n private updateResourceState(resourceId: string, state: Resource['state']): void {\n const resource = this.model?.resources.get(resourceId);\n if (resource) {\n const oldState = resource.state;\n resource.state = state;\n if (this.orchestrator) {\n this.eventBus?.emit(MeframeEvent.ResourceStageChange, {\n type: MeframeEvent.ResourceStageChange,\n resourceId,\n oldState,\n newState: state,\n });\n }\n }\n\n this.onStateChange?.(resourceId, state);\n }\n\n async fetch(resourceId?: string, options?: ResourceLoadOptions): Promise<void> {\n if (!resourceId) {\n return;\n }\n\n const resource = this.model?.resources.get(resourceId);\n if (!resource) {\n console.warn(`Resource ${resourceId} not found in model`);\n return;\n }\n\n this.enqueueLoad(resource, options?.priority || 'normal', options?.clipId);\n }\n\n cancel(resourceId: string): void {\n this.taskManager.cancelTask(resourceId);\n this.processQueue();\n }\n\n pause(resourceId: string): void {\n const task = this.taskManager.getActiveTask(resourceId);\n if (task) {\n task.controller?.abort();\n }\n }\n\n async resume(resourceId: string, options?: ResourceLoadOptions): Promise<void> {\n const resource = this.model?.getResource(resourceId);\n if (!resource) {\n throw new Error(`Resource ${resourceId} not found`);\n }\n\n const pausedTask = this.taskManager.getActiveTask(resourceId);\n\n if (pausedTask?.pausedAt !== undefined) {\n this.enqueueLoad(resource, options?.priority || 'normal', options?.clipId);\n } else {\n await this.fetch(resourceId, options);\n }\n }\n\n get activeTasks(): Map<string, LoadTask> {\n return this.taskManager.activeTasks;\n }\n\n get taskQueue(): LoadTask[] {\n return this.taskManager.taskQueue;\n }\n\n dispose(): void {\n this.taskManager.clear();\n this.byteRangeResolver.dispose();\n this.unbind();\n }\n}\n"],"names":[],"mappings":"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"}
@@ -17,7 +17,7 @@ export declare class TaskManager {
17
17
  /**
18
18
  * Create and enqueue a new task
19
19
  */
20
- enqueue(resource: Resource, priority?: 'high' | 'normal' | 'low'): LoadTask;
20
+ enqueue(resource: Resource, priority?: 'high' | 'normal' | 'low', clipId?: string): LoadTask;
21
21
  /**
22
22
  * Get next task from queue if under concurrent limit
23
23
  */
@@ -1 +1 @@
1
- {"version":3,"file":"TaskManager.d.ts","sourceRoot":"","sources":["../../../src/stages/load/TaskManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;GAEG;AACH,qBAAa,WAAW;IACtB,WAAW,wBAA+B;IAC1C,SAAS,EAAE,QAAQ,EAAE,CAAM;IAC3B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,aAAa,CAAS;gBAElB,aAAa,GAAE,MAAU;IAIrC;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI1C;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAE,MAAM,GAAG,QAAQ,GAAG,KAAgB,GAAG,QAAQ;IAoBrF;;OAEG;IACH,WAAW,IAAI,QAAQ,GAAG,IAAI;IAQ9B;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAKlC;;OAEG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAOtC;;OAEG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAkBvC;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIvD;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;CAUd"}
1
+ {"version":3,"file":"TaskManager.d.ts","sourceRoot":"","sources":["../../../src/stages/load/TaskManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;GAEG;AACH,qBAAa,WAAW;IACtB,WAAW,wBAA+B;IAC1C,SAAS,EAAE,QAAQ,EAAE,CAAM;IAC3B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,aAAa,CAAS;gBAElB,aAAa,GAAE,MAAU;IAIrC;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI1C;;OAEG;IACH,OAAO,CACL,QAAQ,EAAE,QAAQ,EAClB,QAAQ,GAAE,MAAM,GAAG,QAAQ,GAAG,KAAgB,EAC9C,MAAM,CAAC,EAAE,MAAM,GACd,QAAQ;IAqBX;;OAEG;IACH,WAAW,IAAI,QAAQ,GAAG,IAAI;IAQ9B;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAKlC;;OAEG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAOtC;;OAEG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAkBvC;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIvD;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;CAUd"}
@@ -15,14 +15,15 @@ class TaskManager {
15
15
  /**
16
16
  * Create and enqueue a new task
17
17
  */
18
- enqueue(resource, priority = "normal") {
18
+ enqueue(resource, priority = "normal", clipId) {
19
19
  const task = {
20
20
  resourceId: resource.id,
21
21
  resource,
22
22
  bytesLoaded: 0,
23
23
  totalBytes: 0,
24
24
  startTime: Date.now(),
25
- priority
25
+ priority,
26
+ clipId
26
27
  };
27
28
  if (priority === "high") {
28
29
  this.taskQueue.unshift(task);
@@ -1 +1 @@
1
- {"version":3,"file":"TaskManager.js","sources":["../../../src/stages/load/TaskManager.ts"],"sourcesContent":["import type { LoadTask } from './types';\nimport type { Resource } from '../../model';\n\n/**\n * Manages resource loading tasks and queue\n */\nexport class TaskManager {\n activeTasks = new Map<string, LoadTask>();\n taskQueue: LoadTask[] = [];\n private concurrentCount = 0;\n private maxConcurrent: number;\n\n constructor(maxConcurrent: number = 4) {\n this.maxConcurrent = maxConcurrent;\n }\n\n /**\n * Check if a resource is already being loaded\n */\n hasActiveTask(resourceId: string): boolean {\n return this.activeTasks.has(resourceId);\n }\n\n /**\n * Create and enqueue a new task\n */\n enqueue(resource: Resource, priority: 'high' | 'normal' | 'low' = 'normal'): LoadTask {\n const task: LoadTask = {\n resourceId: resource.id,\n resource,\n bytesLoaded: 0,\n totalBytes: 0,\n startTime: Date.now(),\n priority,\n };\n\n // Add to queue based on priority\n if (priority === 'high') {\n this.taskQueue.unshift(task);\n } else {\n this.taskQueue.push(task);\n }\n\n return task;\n }\n\n /**\n * Get next task from queue if under concurrent limit\n */\n getNextTask(): LoadTask | null {\n if (this.taskQueue.length === 0 || this.concurrentCount >= this.maxConcurrent) {\n return null;\n }\n\n return this.taskQueue.shift() || null;\n }\n\n /**\n * Mark task as active\n */\n activateTask(task: LoadTask): void {\n this.activeTasks.set(task.resourceId, task);\n this.concurrentCount++;\n }\n\n /**\n * Mark task as completed\n */\n completeTask(resourceId: string): void {\n if (this.activeTasks.has(resourceId)) {\n this.activeTasks.delete(resourceId);\n this.concurrentCount--;\n }\n }\n\n /**\n * Cancel a task\n */\n cancelTask(resourceId: string): boolean {\n const task = this.activeTasks.get(resourceId);\n if (task) {\n task.controller?.abort();\n this.completeTask(resourceId);\n return true;\n }\n\n // Also remove from queue\n const index = this.taskQueue.findIndex((t) => t.resourceId === resourceId);\n if (index >= 0) {\n this.taskQueue.splice(index, 1);\n return true;\n }\n\n return false;\n }\n\n /**\n * Find an active task\n */\n getActiveTask(resourceId: string): LoadTask | undefined {\n return this.activeTasks.get(resourceId);\n }\n\n /**\n * Check if can process more tasks\n */\n get canProcess(): boolean {\n return this.concurrentCount < this.maxConcurrent;\n }\n\n /**\n * Clear all tasks\n */\n clear(): void {\n // Cancel all active tasks\n for (const task of this.activeTasks.values()) {\n task.controller?.abort();\n }\n\n this.activeTasks.clear();\n this.taskQueue = [];\n this.concurrentCount = 0;\n }\n}\n"],"names":[],"mappings":"AAMO,MAAM,YAAY;AAAA,EACvB,kCAAkB,IAAA;AAAA,EAClB,YAAwB,CAAA;AAAA,EAChB,kBAAkB;AAAA,EAClB;AAAA,EAER,YAAY,gBAAwB,GAAG;AACrC,SAAK,gBAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,YAA6B;AACzC,WAAO,KAAK,YAAY,IAAI,UAAU;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,UAAoB,WAAsC,UAAoB;AACpF,UAAM,OAAiB;AAAA,MACrB,YAAY,SAAS;AAAA,MACrB;AAAA,MACA,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,WAAW,KAAK,IAAA;AAAA,MAChB;AAAA,IAAA;AAIF,QAAI,aAAa,QAAQ;AACvB,WAAK,UAAU,QAAQ,IAAI;AAAA,IAC7B,OAAO;AACL,WAAK,UAAU,KAAK,IAAI;AAAA,IAC1B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAA+B;AAC7B,QAAI,KAAK,UAAU,WAAW,KAAK,KAAK,mBAAmB,KAAK,eAAe;AAC7E,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,UAAU,MAAA,KAAW;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAsB;AACjC,SAAK,YAAY,IAAI,KAAK,YAAY,IAAI;AAC1C,SAAK;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,YAA0B;AACrC,QAAI,KAAK,YAAY,IAAI,UAAU,GAAG;AACpC,WAAK,YAAY,OAAO,UAAU;AAClC,WAAK;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,YAA6B;AACtC,UAAM,OAAO,KAAK,YAAY,IAAI,UAAU;AAC5C,QAAI,MAAM;AACR,WAAK,YAAY,MAAA;AACjB,WAAK,aAAa,UAAU;AAC5B,aAAO;AAAA,IACT;AAGA,UAAM,QAAQ,KAAK,UAAU,UAAU,CAAC,MAAM,EAAE,eAAe,UAAU;AACzE,QAAI,SAAS,GAAG;AACd,WAAK,UAAU,OAAO,OAAO,CAAC;AAC9B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,YAA0C;AACtD,WAAO,KAAK,YAAY,IAAI,UAAU;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAsB;AACxB,WAAO,KAAK,kBAAkB,KAAK;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AAEZ,eAAW,QAAQ,KAAK,YAAY,OAAA,GAAU;AAC5C,WAAK,YAAY,MAAA;AAAA,IACnB;AAEA,SAAK,YAAY,MAAA;AACjB,SAAK,YAAY,CAAA;AACjB,SAAK,kBAAkB;AAAA,EACzB;AACF;"}
1
+ {"version":3,"file":"TaskManager.js","sources":["../../../src/stages/load/TaskManager.ts"],"sourcesContent":["import type { LoadTask } from './types';\nimport type { Resource } from '../../model';\n\n/**\n * Manages resource loading tasks and queue\n */\nexport class TaskManager {\n activeTasks = new Map<string, LoadTask>();\n taskQueue: LoadTask[] = [];\n private concurrentCount = 0;\n private maxConcurrent: number;\n\n constructor(maxConcurrent: number = 4) {\n this.maxConcurrent = maxConcurrent;\n }\n\n /**\n * Check if a resource is already being loaded\n */\n hasActiveTask(resourceId: string): boolean {\n return this.activeTasks.has(resourceId);\n }\n\n /**\n * Create and enqueue a new task\n */\n enqueue(\n resource: Resource,\n priority: 'high' | 'normal' | 'low' = 'normal',\n clipId?: string\n ): LoadTask {\n const task: LoadTask = {\n resourceId: resource.id,\n resource,\n bytesLoaded: 0,\n totalBytes: 0,\n startTime: Date.now(),\n priority,\n clipId,\n };\n\n // Add to queue based on priority\n if (priority === 'high') {\n this.taskQueue.unshift(task);\n } else {\n this.taskQueue.push(task);\n }\n\n return task;\n }\n\n /**\n * Get next task from queue if under concurrent limit\n */\n getNextTask(): LoadTask | null {\n if (this.taskQueue.length === 0 || this.concurrentCount >= this.maxConcurrent) {\n return null;\n }\n\n return this.taskQueue.shift() || null;\n }\n\n /**\n * Mark task as active\n */\n activateTask(task: LoadTask): void {\n this.activeTasks.set(task.resourceId, task);\n this.concurrentCount++;\n }\n\n /**\n * Mark task as completed\n */\n completeTask(resourceId: string): void {\n if (this.activeTasks.has(resourceId)) {\n this.activeTasks.delete(resourceId);\n this.concurrentCount--;\n }\n }\n\n /**\n * Cancel a task\n */\n cancelTask(resourceId: string): boolean {\n const task = this.activeTasks.get(resourceId);\n if (task) {\n task.controller?.abort();\n this.completeTask(resourceId);\n return true;\n }\n\n // Also remove from queue\n const index = this.taskQueue.findIndex((t) => t.resourceId === resourceId);\n if (index >= 0) {\n this.taskQueue.splice(index, 1);\n return true;\n }\n\n return false;\n }\n\n /**\n * Find an active task\n */\n getActiveTask(resourceId: string): LoadTask | undefined {\n return this.activeTasks.get(resourceId);\n }\n\n /**\n * Check if can process more tasks\n */\n get canProcess(): boolean {\n return this.concurrentCount < this.maxConcurrent;\n }\n\n /**\n * Clear all tasks\n */\n clear(): void {\n // Cancel all active tasks\n for (const task of this.activeTasks.values()) {\n task.controller?.abort();\n }\n\n this.activeTasks.clear();\n this.taskQueue = [];\n this.concurrentCount = 0;\n }\n}\n"],"names":[],"mappings":"AAMO,MAAM,YAAY;AAAA,EACvB,kCAAkB,IAAA;AAAA,EAClB,YAAwB,CAAA;AAAA,EAChB,kBAAkB;AAAA,EAClB;AAAA,EAER,YAAY,gBAAwB,GAAG;AACrC,SAAK,gBAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,YAA6B;AACzC,WAAO,KAAK,YAAY,IAAI,UAAU;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,QACE,UACA,WAAsC,UACtC,QACU;AACV,UAAM,OAAiB;AAAA,MACrB,YAAY,SAAS;AAAA,MACrB;AAAA,MACA,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,WAAW,KAAK,IAAA;AAAA,MAChB;AAAA,MACA;AAAA,IAAA;AAIF,QAAI,aAAa,QAAQ;AACvB,WAAK,UAAU,QAAQ,IAAI;AAAA,IAC7B,OAAO;AACL,WAAK,UAAU,KAAK,IAAI;AAAA,IAC1B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAA+B;AAC7B,QAAI,KAAK,UAAU,WAAW,KAAK,KAAK,mBAAmB,KAAK,eAAe;AAC7E,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,UAAU,MAAA,KAAW;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAsB;AACjC,SAAK,YAAY,IAAI,KAAK,YAAY,IAAI;AAC1C,SAAK;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,YAA0B;AACrC,QAAI,KAAK,YAAY,IAAI,UAAU,GAAG;AACpC,WAAK,YAAY,OAAO,UAAU;AAClC,WAAK;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,YAA6B;AACtC,UAAM,OAAO,KAAK,YAAY,IAAI,UAAU;AAC5C,QAAI,MAAM;AACR,WAAK,YAAY,MAAA;AACjB,WAAK,aAAa,UAAU;AAC5B,aAAO;AAAA,IACT;AAGA,UAAM,QAAQ,KAAK,UAAU,UAAU,CAAC,MAAM,EAAE,eAAe,UAAU;AACzE,QAAI,SAAS,GAAG;AACd,WAAK,UAAU,OAAO,OAAO,CAAC;AAC9B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,YAA0C;AACtD,WAAO,KAAK,YAAY,IAAI,UAAU;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAsB;AACxB,WAAO,KAAK,kBAAkB,KAAK;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AAEZ,eAAW,QAAQ,KAAK,YAAY,OAAA,GAAU;AAC5C,WAAK,YAAY,MAAA;AAAA,IACnB;AAEA,SAAK,YAAY,MAAA;AACjB,SAAK,YAAY,CAAA;AACjB,SAAK,kBAAkB;AAAA,EACzB;AACF;"}
@@ -26,6 +26,7 @@ export interface ResourceLoadOptions {
26
26
  start: number;
27
27
  end: number;
28
28
  };
29
+ clipId?: string;
29
30
  }
30
31
  export interface ClipLoadOptions {
31
32
  clipId: string;
@@ -66,6 +67,7 @@ export interface LoadTask {
66
67
  start: number;
67
68
  end: number;
68
69
  };
70
+ clipId?: string;
69
71
  }
70
72
  export interface ResourceLoaderOptions {
71
73
  orchestrator?: Orchestrator;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/stages/load/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/stages/load/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IACtD,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IACvD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC;IACrC,OAAO,EAAE;QACP,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;KAC7E,CAAC;CACH;AAGD,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACtC;AAGD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAGD,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAGD,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC9C,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;CACxE;AAGD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,CAAC,EAAE,mBAAmB,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;CAC3B;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,YAAY,CAAC;AAEpF,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,MAAM,GAAG,WAAW,GAAG,YAAY,CAAC;AAElF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,iBAAiB,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,gBAAgB,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,KAAK,EAAE,iBAAiB,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,gBAAgB,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;CAC3D;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE9F,MAAM,WAAW,kBAAkB;IACjC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,2BAA4B,SAAQ,mBAAmB;IACtE,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,2BAA2B,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,5 @@
1
+ const muxWorkerUrl = "" + new URL("../../assets/mux.worker-uEMQY066.js", import.meta.url).href;
2
+ export {
3
+ muxWorkerUrl as default
4
+ };
5
+ //# sourceMappingURL=mux.worker2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mux.worker2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,17 @@
1
+ import { Plugin } from 'vite';
2
+
3
+ export interface MeframePluginOptions {
4
+ /**
5
+ * Output directory for worker files (relative to build outDir)
6
+ * @default 'assets'
7
+ */
8
+ workerDir?: string;
9
+ /**
10
+ * Enable verbose logging
11
+ * @default false
12
+ */
13
+ verbose?: boolean;
14
+ }
15
+ export declare function meframePlugin(options?: MeframePluginOptions): Plugin;
16
+ export default meframePlugin;
17
+ //# sourceMappingURL=vite-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,MAAM,CAAC;AAInD,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,MAAM,CAwGxE;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,88 @@
1
+ import { existsSync, readdirSync, mkdirSync, copyFileSync } from "fs";
2
+ import { dirname, join, resolve } from "path";
3
+ function meframePlugin(options = {}) {
4
+ const { workerDir = "assets", verbose = false } = options;
5
+ let config;
6
+ return {
7
+ name: "vite-plugin-meframe",
8
+ configResolved(resolvedConfig) {
9
+ config = resolvedConfig;
10
+ },
11
+ closeBundle() {
12
+ if (config.command !== "build") {
13
+ return;
14
+ }
15
+ try {
16
+ let coreAssetsDir;
17
+ try {
18
+ const corePackagePath = require.resolve("@meframe/core/package.json");
19
+ const coreDir = dirname(corePackagePath);
20
+ coreAssetsDir = join(coreDir, "dist", "assets");
21
+ } catch {
22
+ const monorepoPath = resolve(process.cwd(), "../core/dist/assets");
23
+ if (existsSync(monorepoPath)) {
24
+ coreAssetsDir = monorepoPath;
25
+ } else {
26
+ console.warn("[meframe] Cannot find @meframe/core worker assets");
27
+ return;
28
+ }
29
+ }
30
+ if (!existsSync(coreAssetsDir)) {
31
+ console.warn("[meframe] Worker assets directory not found:", coreAssetsDir);
32
+ console.warn(
33
+ "[meframe] Please ensure @meframe/core is built: cd node_modules/@meframe/core && pnpm build"
34
+ );
35
+ return;
36
+ }
37
+ const workerFiles = readdirSync(coreAssetsDir).filter(
38
+ (file) => file.includes(".worker-") && (file.endsWith(".js") || file.endsWith(".js.map"))
39
+ );
40
+ if (workerFiles.length === 0) {
41
+ console.warn("[meframe] No worker files found in:", coreAssetsDir);
42
+ return;
43
+ }
44
+ const outDir = config.build.outDir || "dist";
45
+ const outputDir = join(process.cwd(), outDir, workerDir);
46
+ mkdirSync(outputDir, { recursive: true });
47
+ let copiedCount = 0;
48
+ const copiedFiles = [];
49
+ for (const file of workerFiles) {
50
+ const src = join(coreAssetsDir, file);
51
+ const dest = join(outputDir, file);
52
+ try {
53
+ copyFileSync(src, dest);
54
+ copiedCount++;
55
+ copiedFiles.push(file);
56
+ } catch (error) {
57
+ console.error(`[meframe] Failed to copy ${file}:`, error);
58
+ }
59
+ }
60
+ console.log(`
61
+ [meframe] ✓ Copied ${copiedCount} worker files to ${outDir}/${workerDir}/`);
62
+ if (verbose && copiedFiles.length > 0) {
63
+ console.log("[meframe] Files copied:");
64
+ copiedFiles.forEach((file) => console.log(` - ${file}`));
65
+ }
66
+ if (workerDir !== "assets") {
67
+ console.log(`[meframe] ⚠️ Worker files are in ${outDir}/${workerDir}/`);
68
+ console.log(`[meframe] Make sure your server can serve these files.`);
69
+ }
70
+ } catch (error) {
71
+ console.error("[meframe] Error in meframePlugin:", error);
72
+ }
73
+ },
74
+ config() {
75
+ return {
76
+ worker: {
77
+ // Ensure worker format is ESM
78
+ format: "es"
79
+ }
80
+ };
81
+ }
82
+ };
83
+ }
84
+ export {
85
+ meframePlugin as default,
86
+ meframePlugin
87
+ };
88
+ //# sourceMappingURL=vite-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin.js","sources":["../src/vite-plugin.ts"],"sourcesContent":["/**\n * Vite Plugin for @meframe/core\n *\n * Automatically copies worker files to the output directory during build.\n * This ensures worker files are accessible in production.\n *\n * Usage:\n * ```typescript\n * // vite.config.ts\n * import { meframePlugin } from '@meframe/core/vite-plugin';\n *\n * export default defineConfig({\n * plugins: [meframePlugin()]\n * });\n * ```\n */\n\nimport type { Plugin, ResolvedConfig } from 'vite';\nimport { copyFileSync, mkdirSync, existsSync, readdirSync } from 'fs';\nimport { join, dirname, resolve } from 'path';\n\nexport interface MeframePluginOptions {\n /**\n * Output directory for worker files (relative to build outDir)\n * @default 'assets'\n */\n workerDir?: string;\n\n /**\n * Enable verbose logging\n * @default false\n */\n verbose?: boolean;\n}\n\nexport function meframePlugin(options: MeframePluginOptions = {}): Plugin {\n const { workerDir = 'assets', verbose = false } = options;\n let config: ResolvedConfig;\n\n return {\n name: 'vite-plugin-meframe',\n\n configResolved(resolvedConfig) {\n config = resolvedConfig;\n },\n\n closeBundle() {\n // Only run in build mode\n if (config.command !== 'build') {\n return;\n }\n\n try {\n // Find @meframe/core in node_modules\n let coreAssetsDir: string;\n\n try {\n // Try to resolve from node_modules\n const corePackagePath = require.resolve('@meframe/core/package.json');\n const coreDir = dirname(corePackagePath);\n coreAssetsDir = join(coreDir, 'dist', 'assets');\n } catch {\n // Fallback for monorepo development\n const monorepoPath = resolve(process.cwd(), '../core/dist/assets');\n if (existsSync(monorepoPath)) {\n coreAssetsDir = monorepoPath;\n } else {\n console.warn('[meframe] Cannot find @meframe/core worker assets');\n return;\n }\n }\n\n if (!existsSync(coreAssetsDir)) {\n console.warn('[meframe] Worker assets directory not found:', coreAssetsDir);\n console.warn(\n '[meframe] Please ensure @meframe/core is built: cd node_modules/@meframe/core && pnpm build'\n );\n return;\n }\n\n // Get all worker files (*.js and *.js.map)\n const workerFiles = readdirSync(coreAssetsDir).filter(\n (file) => file.includes('.worker-') && (file.endsWith('.js') || file.endsWith('.js.map'))\n );\n\n if (workerFiles.length === 0) {\n console.warn('[meframe] No worker files found in:', coreAssetsDir);\n return;\n }\n\n // Determine output directory\n const outDir = config.build.outDir || 'dist';\n const outputDir = join(process.cwd(), outDir, workerDir);\n mkdirSync(outputDir, { recursive: true });\n\n // Copy worker files\n let copiedCount = 0;\n const copiedFiles: string[] = [];\n\n for (const file of workerFiles) {\n const src = join(coreAssetsDir, file);\n const dest = join(outputDir, file);\n\n try {\n copyFileSync(src, dest);\n copiedCount++;\n copiedFiles.push(file);\n } catch (error) {\n console.error(`[meframe] Failed to copy ${file}:`, error);\n }\n }\n\n // Log results\n console.log(`\\n[meframe] ✓ Copied ${copiedCount} worker files to ${outDir}/${workerDir}/`);\n\n if (verbose && copiedFiles.length > 0) {\n console.log('[meframe] Files copied:');\n copiedFiles.forEach((file) => console.log(` - ${file}`));\n }\n\n // Important note for users\n if (workerDir !== 'assets') {\n console.log(`[meframe] ⚠️ Worker files are in ${outDir}/${workerDir}/`);\n console.log(`[meframe] Make sure your server can serve these files.`);\n }\n } catch (error) {\n console.error('[meframe] Error in meframePlugin:', error);\n }\n },\n\n config() {\n return {\n worker: {\n // Ensure worker format is ESM\n format: 'es',\n },\n };\n },\n };\n}\n\nexport default meframePlugin;\n"],"names":[],"mappings":";;AAmCO,SAAS,cAAc,UAAgC,IAAY;AACxE,QAAM,EAAE,YAAY,UAAU,UAAU,UAAU;AAClD,MAAI;AAEJ,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,eAAe,gBAAgB;AAC7B,eAAS;AAAA,IACX;AAAA,IAEA,cAAc;AAEZ,UAAI,OAAO,YAAY,SAAS;AAC9B;AAAA,MACF;AAEA,UAAI;AAEF,YAAI;AAEJ,YAAI;AAEF,gBAAM,kBAAkB,gBAAgB,4BAA4B;AACpE,gBAAM,UAAU,QAAQ,eAAe;AACvC,0BAAgB,KAAK,SAAS,QAAQ,QAAQ;AAAA,QAChD,QAAQ;AAEN,gBAAM,eAAe,QAAQ,QAAQ,IAAA,GAAO,qBAAqB;AACjE,cAAI,WAAW,YAAY,GAAG;AAC5B,4BAAgB;AAAA,UAClB,OAAO;AACL,oBAAQ,KAAK,mDAAmD;AAChE;AAAA,UACF;AAAA,QACF;AAEA,YAAI,CAAC,WAAW,aAAa,GAAG;AAC9B,kBAAQ,KAAK,gDAAgD,aAAa;AAC1E,kBAAQ;AAAA,YACN;AAAA,UAAA;AAEF;AAAA,QACF;AAGA,cAAM,cAAc,YAAY,aAAa,EAAE;AAAA,UAC7C,CAAC,SAAS,KAAK,SAAS,UAAU,MAAM,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,SAAS;AAAA,QAAA;AAGzF,YAAI,YAAY,WAAW,GAAG;AAC5B,kBAAQ,KAAK,uCAAuC,aAAa;AACjE;AAAA,QACF;AAGA,cAAM,SAAS,OAAO,MAAM,UAAU;AACtC,cAAM,YAAY,KAAK,QAAQ,IAAA,GAAO,QAAQ,SAAS;AACvD,kBAAU,WAAW,EAAE,WAAW,KAAA,CAAM;AAGxC,YAAI,cAAc;AAClB,cAAM,cAAwB,CAAA;AAE9B,mBAAW,QAAQ,aAAa;AAC9B,gBAAM,MAAM,KAAK,eAAe,IAAI;AACpC,gBAAM,OAAO,KAAK,WAAW,IAAI;AAEjC,cAAI;AACF,yBAAa,KAAK,IAAI;AACtB;AACA,wBAAY,KAAK,IAAI;AAAA,UACvB,SAAS,OAAO;AACd,oBAAQ,MAAM,4BAA4B,IAAI,KAAK,KAAK;AAAA,UAC1D;AAAA,QACF;AAGA,gBAAQ,IAAI;AAAA,qBAAwB,WAAW,oBAAoB,MAAM,IAAI,SAAS,GAAG;AAEzF,YAAI,WAAW,YAAY,SAAS,GAAG;AACrC,kBAAQ,IAAI,yBAAyB;AACrC,sBAAY,QAAQ,CAAC,SAAS,QAAQ,IAAI,OAAO,IAAI,EAAE,CAAC;AAAA,QAC1D;AAGA,YAAI,cAAc,UAAU;AAC1B,kBAAQ,IAAI,qCAAqC,MAAM,IAAI,SAAS,GAAG;AACvE,kBAAQ,IAAI,2DAA2D;AAAA,QACzE;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,qCAAqC,KAAK;AAAA,MAC1D;AAAA,IACF;AAAA,IAEA,SAAS;AACP,aAAO;AAAA,QACL,QAAQ;AAAA;AAAA,UAEN,QAAQ;AAAA,QAAA;AAAA,MACV;AAAA,IAEJ;AAAA,EAAA;AAEJ;"}
@@ -4,17 +4,13 @@ import { EventBus } from '../event/EventBus';
4
4
  import { EventPayloadMap } from '../event/events';
5
5
 
6
6
  export interface WorkerPoolConfig {
7
- baseUrl: string;
8
7
  eventBus: EventBus<EventPayloadMap>;
9
8
  workerConfigs?: Record<WorkerType, any>;
10
- workerExtension?: string;
11
9
  }
12
10
  export declare class WorkerPool {
13
11
  private pool;
14
- private baseUrl;
15
12
  private eventBus;
16
13
  private workerConfigs;
17
- private extension;
18
14
  constructor(config: WorkerPoolConfig);
19
15
  /**
20
16
  * Get or create a worker instance
@@ -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;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAiC;IAC7C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,gBAAgB;IAOpC;;;;;;OAMG;IACG,GAAG,CACP,IAAI,EAAE,UAAU,EAChB,EAAE,CAAC,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GACrD,OAAO,CAAC,UAAU,CAAC;IAsDhB,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;CACzC;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAiC;IAC7C,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,aAAa,CAAsB;gBAE/B,MAAM,EAAE,gBAAgB;IAKpC;;;;;;OAMG;IACG,GAAG,CACP,IAAI,EAAE,UAAU,EAChB,EAAE,CAAC,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GACrD,OAAO,CAAC,UAAU,CAAC;IAyChB,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"}