{"version":3,"file":"worker.cjs","sources":["../../../../src/core/workers/worker.js"],"sourcesContent":["/**\n * Worker 线程：渲染视频段\n * 每个 Worker 负责渲染视频的一个时间段\n */\nimport { parentPort, workerData } from 'worker_threads';\nimport { Renderer } from '../Renderer.js';\nimport { VideoMaker } from '../VideoMaker.js';\nimport { ElementLayer } from '../../layers/ElementLayer.js';\nimport { BackgroundLayer } from '../../layers/BackgroundLayer.js';\nimport { registerFontFile,initDefaultFont } from '../../utils/font-manager.js';\nimport paper from '@chnak/paper';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nasync function renderSegment() {\n  const {\n    segmentIndex,\n    startFrame,\n    endFrame,\n    startTime,\n    fps,\n    width,\n    height,\n    backgroundColor,\n    compositionData,\n    transitionRanges = [], // 转场范围，Worker 需要跳过这些帧\n    fontInfo = [], // 字体信息，用于在 Worker 中注册字体\n    useRaw = true, // 是否使用 raw 格式（默认 true，如果有转场则为 false）\n  } = workerData;\n\n  console.log(`[Worker ${segmentIndex}] 开始渲染，范围: [${startFrame}, ${endFrame}), FPS: ${fps}, 尺寸: ${width}x${height}`);\n\n  try {\n    // 初始化默认字体（包括系统字体回退链）\n    initDefaultFont();\n\n    // 在 Worker 中注册字体（必须在创建 Renderer 之前）\n    if (fontInfo && fontInfo.length > 0) {\n      console.log(`[Worker ${segmentIndex}] 注册 ${fontInfo.length} 个字体...`);\n      for (const font of fontInfo) {\n        try {\n          registerFontFile(font.path, font.fontFamily, font.options || {});\n        } catch (e) {\n          console.warn(`[Worker ${segmentIndex}] 字体注册失败 ${font.fontFamily}:`, e.message);\n        }\n      }\n    }\n\n    // 创建独立的 Renderer 实例（每个 Worker 有自己的 Paper.js Project）\n    console.log(`[Worker ${segmentIndex}] 创建 Renderer...`);\n    const renderer = new Renderer({\n      width,\n      height,\n      fps,\n    });\n    await renderer.init();\n    console.log(`[Worker ${segmentIndex}] Renderer 初始化完成`);\n\n    // 重建 composition 对象（从序列化的数据）\n    const composition = new VideoMaker(compositionData.config);\n\n    // 重建函数（从字符串）\n    const deserializeFunctions = (obj) => {\n      if (obj === null || obj === undefined) {\n        return obj;\n      }\n      \n      if (typeof obj === 'object' && obj.__isFunction && obj.__functionCode) {\n        // 重建函数\n        try {\n          const funcCode = obj.__functionCode;\n          let func;\n          \n          // 如果有上下文，需要将上下文注入到函数作用域中\n          if (obj.__context) {\n            // 重建上下文对象\n            const context = deserializeFunctions(obj.__context);\n            \n            // 创建一个包装函数，将上下文注入到作用域中\n            // 使用 Function 构造函数创建函数，将 context 的键作为参数\n            const contextKeys = Object.keys(context);\n            const contextValues = contextKeys.map(key => context[key]);\n            \n            // 将上下文变量作为参数传递给函数\n            // 例如：function(element, progress, time) { ... } \n            // 变成：function(element, progress, time, ...contextKeys) { ... }\n            // 但这样会改变函数签名，不推荐\n            \n            // 更好的方法：创建一个包装函数，在函数内部注入上下文变量\n            // 使用 with 语句（不推荐，已废弃）或直接修改函数体\n            \n            // 解析函数代码，提取函数参数和函数体\n            // funcCode 可能是：function(element, progress, time) { ... } 或 (element, progress, time) => { ... }\n            let funcParams = '';\n            let funcBody = '';\n            \n            // 尝试匹配函数声明或函数表达式\n            const funcDeclMatch = funcCode.match(/^\\s*function\\s*\\(([^)]*)\\)\\s*\\{([\\s\\S]*)\\}\\s*$/);\n            const arrowMatch = funcCode.match(/^\\s*\\(([^)]*)\\)\\s*=>\\s*\\{([\\s\\S]*)\\}\\s*$/);\n            const arrowSingleMatch = funcCode.match(/^\\s*\\(([^)]*)\\)\\s*=>\\s*([^{][\\s\\S]*)$/);\n            \n            if (funcDeclMatch) {\n              funcParams = funcDeclMatch[1].trim();\n              funcBody = funcDeclMatch[2];\n            } else if (arrowMatch) {\n              funcParams = arrowMatch[1].trim();\n              funcBody = arrowMatch[2];\n            } else if (arrowSingleMatch) {\n              funcParams = arrowSingleMatch[1].trim();\n              funcBody = `return ${arrowSingleMatch[2].trim()};`;\n            } else {\n              // 如果无法解析，尝试直接执行（可能已经是完整的函数表达式）\n              funcParams = 'element, progress, time';\n              funcBody = funcCode;\n            }\n            \n            // 创建上下文变量的声明语句\n            const contextVars = contextKeys.map(key => {\n              const value = context[key];\n              // 处理不同类型的值\n              if (typeof value === 'string') {\n                return `const ${key} = ${JSON.stringify(value)};`;\n              } else if (typeof value === 'number' || typeof value === 'boolean') {\n                return `const ${key} = ${value};`;\n              } else if (value === null) {\n                return `const ${key} = null;`;\n              } else if (Array.isArray(value)) {\n                return `const ${key} = ${JSON.stringify(value)};`;\n              } else if (typeof value === 'object') {\n                return `const ${key} = ${JSON.stringify(value)};`;\n              } else {\n                return `const ${key} = undefined;`;\n              }\n            }).join('\\n    ');\n            \n            // 创建包装函数，将上下文变量注入到函数作用域\n            // 同时注入 paper 对象，以便在函数中使用 paper.Point 等\n            const wrappedCode = `\n              (function() {\n                const paper = arguments[0];\n                ${contextVars}\n                return function(${funcParams}) {\n                  ${funcBody}\n                };\n              })(paper)\n            `;\n            \n            func = eval(wrappedCode);\n            func.__context = context;\n          } else {\n            // 没有上下文，但需要注入 paper 对象\n            // 检查函数代码中是否使用了 paper\n            if (funcCode.includes('paper.') || funcCode.includes('new paper')) {\n              const wrappedCode = `\n                (function() {\n                  const paper = arguments[0];\n                  return (${funcCode});\n                })(paper)\n              `;\n              func = eval(wrappedCode);\n            } else {\n              func = eval(`(${funcCode})`);\n            }\n          }\n          \n          return func;\n        } catch (e) {\n          console.warn(`[Worker ${segmentIndex}] 无法重建函数:`, e.message);\n          return undefined;\n        }\n      }\n      \n      if (Array.isArray(obj)) {\n        return obj.map(item => deserializeFunctions(item));\n      }\n      \n      if (typeof obj === 'object') {\n        const result = {};\n        for (const key in obj) {\n          if (obj.hasOwnProperty(key)) {\n            result[key] = deserializeFunctions(obj[key]);\n          }\n        }\n        return result;\n      }\n      \n      return obj;\n    };\n    \n    // 重建图层和元素\n    if (compositionData.layers) {\n      for (let layerIdx = 0; layerIdx < compositionData.layers.length; layerIdx++) {\n        const layerData = compositionData.layers[layerIdx];\n        \n        // 根据图层类型重建图层\n        let layer;\n        if (layerData.config.type === 'background') {\n          layer = new BackgroundLayer(layerData.config);\n        } else {\n          layer = new ElementLayer(layerData.config);\n        }\n        \n        // 重建元素\n        if (layerData.elements) {\n          for (let elemIdx = 0; elemIdx < layerData.elements.length; elemIdx++) {\n            const elementData = layerData.elements[elemIdx];\n            try {\n              // 动态导入元素类\n              const elementTypeMap = {\n                'text': 'Text',\n                'image': 'Image',\n                'video': 'Video',\n                'rect': 'Rect',\n                'circle': 'Circle',\n                'path': 'Path',\n                'svg': 'SVG',\n                'json': 'JSON',\n                'sprite': 'Sprite',\n                'audio': 'Audio',\n                'oscilloscope': 'Oscilloscope',\n                'subtitle': 'Subtitle',\n                'echarts': 'ECharts',\n                'code': 'Code',\n                'html': 'HTML'\n              };\n              \n              const className = elementTypeMap[elementData.type] || \n                elementData.type.charAt(0).toUpperCase() + elementData.type.slice(1);\n              // 检测是否在 CommonJS 环境中\n              const isCommonJS = typeof require !== 'undefined' && typeof module !== 'undefined';\n              let ElementClass = null;\n              \n              if (isCommonJS) {\n                // CommonJS 环境：使用 require（需要绝对路径）\n                const elementExt = '.cjs';\n                const elementPath = path.resolve(__dirname, '..', '..', 'elements', `${className}Element${elementExt}`);\n                try {\n                  const elementModule = require(elementPath);\n                  ElementClass = elementModule[`${className}Element`] || elementModule.default;\n                } catch (requireError) {\n                  // 如果 require 失败，尝试动态 import（使用相对路径）\n                  const elementModule = await import(`../../elements/${className}Element${elementExt}`);\n                  ElementClass = elementModule[`${className}Element`] || elementModule.default;\n                }\n              } else {\n                // ESM 环境：使用动态 import\n                const elementModule = await import(`../../elements/${className}Element.js`);\n                ElementClass = elementModule[`${className}Element`] || elementModule.default;\n              }\n              \n              if (ElementClass) {\n                // 反序列化 config（重建函数）\n                const deserializedConfig = deserializeFunctions(elementData.config || {});\n                \n                const element = new ElementClass(deserializedConfig);\n                \n                // 恢复回调函数（onFrame、onRender、onLoaded）\n                if (elementData.callbacks) {\n                  if (elementData.callbacks.onFrame) {\n                    element.onFrame = deserializeFunctions(elementData.callbacks.onFrame);\n                  }\n                  if (elementData.callbacks.onRender) {\n                    element.onRender = deserializeFunctions(elementData.callbacks.onRender);\n                  }\n                  if (elementData.callbacks.onLoaded) {\n                    element.onLoaded = deserializeFunctions(elementData.callbacks.onLoaded);\n                  }\n                }\n                \n                // 恢复元素的时间属性（这些不在 config 中，但在 Track.build 时设置）\n                if (elementData.startTime !== undefined) {\n                  element.startTime = elementData.startTime;\n                }\n                if (elementData.endTime !== undefined) {\n                  element.endTime = elementData.endTime;\n                } else if (elementData.endTime === undefined && elementData.startTime !== undefined && elementData.duration !== undefined) {\n                  // 如果没有 endTime 但有 startTime 和 duration，计算 endTime\n                  element.endTime = elementData.startTime + elementData.duration;\n                }\n                if (elementData.duration !== undefined) {\n                  element.duration = elementData.duration;\n                }\n                \n                // 恢复其他重要属性\n                if (elementData.visible !== undefined) {\n                  element.visible = elementData.visible;\n                }\n                if (elementData.zIndex !== undefined) {\n                  element.zIndex = elementData.zIndex;\n                }\n                \n                // 如果是分割文本，恢复特殊属性并重新初始化分割器\n                if (element.type === 'text') {\n                  if (elementData.originalAnimations !== undefined) {\n                    element.originalAnimations = elementData.originalAnimations;\n                  }\n                  if (elementData.split !== undefined) {\n                    element.split = elementData.split;\n                  }\n                  if (elementData.splitDelay !== undefined) {\n                    element.splitDelay = elementData.splitDelay;\n                  }\n                  if (elementData.splitDuration !== undefined) {\n                    element.splitDuration = elementData.splitDuration;\n                  }\n                  \n                  // 如果启用了分割，重新初始化分割器（这会重新创建 segments 并应用动画）\n                  if (element.split && element._initializeSplitter && typeof element._initializeSplitter === 'function') {\n                    try {\n                      // 确保在重新初始化之前，startTime 和 endTime 已经恢复\n                      // 因为 _initializeSplitter 会使用这些值来计算子片段的时间\n                      element._initializeSplitter();\n                    } catch (e) {\n                      console.warn(`[Worker ${segmentIndex}] 文本元素分割器初始化失败:`, e.message);\n                    }\n                  }\n                  \n                  // 恢复子片段的时间和其他属性（在重新初始化后）\n                  if (elementData.segments && Array.isArray(elementData.segments) && element.segments && Array.isArray(element.segments)) {\n                    for (let segIdx = 0; segIdx < Math.min(elementData.segments.length, element.segments.length); segIdx++) {\n                      const segmentData = elementData.segments[segIdx];\n                      const segment = element.segments[segIdx];\n                      \n                      // 恢复时间属性\n                      if (segmentData.startTime !== undefined) {\n                        segment.startTime = segmentData.startTime;\n                      }\n                      if (segmentData.endTime !== undefined) {\n                        segment.endTime = segmentData.endTime;\n                      } else if (segmentData.endTime === undefined && segmentData.startTime !== undefined && segmentData.duration !== undefined) {\n                        // 如果没有 endTime 但有 startTime 和 duration，计算 endTime\n                        segment.endTime = segmentData.startTime + segmentData.duration;\n                      }\n                      if (segmentData.duration !== undefined) {\n                        segment.duration = segmentData.duration;\n                      }\n                      if (segmentData.visible !== undefined) {\n                        segment.visible = segmentData.visible;\n                      }\n                      \n                      // 如果子片段有自定义动画配置，恢复它们\n                      // 注意：如果重新初始化分割器时已经创建了动画，这里会保留重新创建的动画\n                      // 但如果序列化时有特定的动画配置，我们可以选择恢复它们\n                      // 由于 _initializeSplitter 会根据 originalAnimations 重新创建动画，\n                      // 所以通常不需要单独恢复子片段的动画，除非有特殊情况\n                      // 但为了完整性，我们仍然保留这个逻辑\n                      if (segmentData.animations && Array.isArray(segmentData.animations) && segmentData.animations.length > 0) {\n                        // 如果子片段没有动画，或者需要覆盖，可以在这里恢复\n                        // 但通常 _initializeSplitter 已经处理了动画创建\n                        // 所以这里主要是为了确保动画配置的一致性\n                        // 暂时不覆盖，因为 _initializeSplitter 已经根据 originalAnimations 创建了动画\n                      }\n                    }\n                  }\n                } else {\n                  // 非文本元素，只恢复子片段的时间（如果有）\n                  if (elementData.segments && Array.isArray(elementData.segments) && element.segments && Array.isArray(element.segments)) {\n                    for (let segIdx = 0; segIdx < Math.min(elementData.segments.length, element.segments.length); segIdx++) {\n                      const segmentData = elementData.segments[segIdx];\n                      const segment = element.segments[segIdx];\n                      if (segmentData.startTime !== undefined) {\n                        segment.startTime = segmentData.startTime;\n                      }\n                      if (segmentData.endTime !== undefined) {\n                        segment.endTime = segmentData.endTime;\n                      } else if (segmentData.endTime === undefined && segmentData.startTime !== undefined && segmentData.duration !== undefined) {\n                        // 如果没有 endTime 但有 startTime 和 duration，计算 endTime\n                        segment.endTime = segmentData.startTime + segmentData.duration;\n                      }\n                      if (segmentData.duration !== undefined) {\n                        segment.duration = segmentData.duration;\n                      }\n                      if (segmentData.visible !== undefined) {\n                        segment.visible = segmentData.visible;\n                      }\n                    }\n                  }\n                }\n                \n                // 设置元素的 canvas 尺寸\n                element.canvasWidth = width;\n                element.canvasHeight = height;\n                \n                // 如果是分割文本，也需要设置子元素的 canvas 尺寸\n                if (element.type === 'text' && element.segments && element.segments.length > 0) {\n                  for (const segment of element.segments) {\n                    segment.canvasWidth = width;\n                    segment.canvasHeight = height;\n                  }\n                }\n                \n                // 初始化元素（如果需要异步加载资源）\n                // if (element.initialize && typeof element.initialize === 'function') {\n                //   try {\n                //     // 添加超时机制，避免资源加载卡住\n                //     const initPromise = element.initialize();\n                //     const timeoutPromise = new Promise((_, reject) => {\n                //       setTimeout(() => reject(new Error('初始化超时（30秒）')), 30000);\n                //     });\n                //     await Promise.race([initPromise, timeoutPromise]);\n                //   } catch (initError) {\n                //     console.warn(`[Worker ${segmentIndex}] 元素 ${elementData.type} 初始化失败或超时:`, initError.message);\n                //   }\n                // }\n                \n                layer.addElement(element);\n              }\n            } catch (importError) {\n              console.warn(`[Worker ${segmentIndex}] 无法导入元素类型 ${elementData.type}:`, importError.message);\n            }\n          }\n        }\n        \n        composition.addLayer(layer);\n      }\n    }\n\n    // 注意：转场在 Worker 中不支持（GL 模块无法在 Worker 中加载）\n    // 转场帧应该在主线程预处理，然后传递给 Worker\n\n    const frames = [];\n    const totalFrames = endFrame - startFrame;\n    const progressInterval = Math.max(1, Math.floor(totalFrames / 10));\n\n    // 检查帧是否在转场范围内\n    const isFrameInTransition = (frame) => {\n      return transitionRanges.some(range =>\n        frame >= range.startFrame && frame < range.endFrame\n      );\n    };\n\n    console.log(`[Worker ${segmentIndex}] 开始渲染 ${totalFrames} 帧，范围 [${startFrame}, ${endFrame})`);\n\n    for (let frame = startFrame; frame < endFrame; frame++) {\n      try {\n        // 跳过转场帧（转场帧在主线程预处理）\n        if (isFrameInTransition(frame)) {\n          continue;\n        }\n\n        const time = startTime + (frame - startFrame) / fps;\n        const localFrameIndex = frame - startFrame;\n\n        // 正常渲染帧（支持 onFrame、onRender 回调）\n        await renderer.renderFrame(composition.timeline.getLayers(), time, backgroundColor);\n        // 根据 useRaw 参数决定返回的格式（如果有转场，使用 PNG；否则使用 raw）\n        const buffer = renderer.getCanvasBuffer(useRaw ? 'raw' : 'png');\n\n        if (!buffer) {\n          console.warn(`[Worker ${segmentIndex}] 帧 ${frame} 渲染失败：buffer 为空`);\n          continue;\n        }\n\n        frames.push({\n          frameIndex: frame,\n          buffer: buffer,\n        });\n\n        // 发送进度到主进程\n        if (localFrameIndex % progressInterval === 0 || localFrameIndex === totalFrames - 1) {\n          const progress = ((localFrameIndex + 1) / totalFrames * 100).toFixed(1);\n          parentPort.postMessage({\n            type: 'progress',\n            segmentIndex,\n            progress: parseFloat(progress),\n            currentFrame: localFrameIndex + 1,\n            totalFrames: totalFrames,\n            frameIndex: frame,\n          });\n        }\n      } catch (renderError) {\n        console.error(`[Worker ${segmentIndex}] 帧 ${frame} 渲染失败:`, renderError.message);\n        throw renderError;\n      }\n    }\n\n    console.log(`[Worker ${segmentIndex}] 渲染完成，共 ${frames.length} 帧，准备发送结果`);\n\n    // 清理\n    renderer.destroy();\n    try {\n      if (composition && typeof composition.destroy === 'function') {\n        composition.destroy();\n      }\n    } catch (destroyError) {\n      console.warn(`[Worker ${segmentIndex}] composition.destroy() 失败:`, destroyError.message);\n    }\n\n    // 发送结果（不进行零拷贝传输，避免 @napi-rs/canvas 的 Buffer 传输问题）\n    parentPort.postMessage({\n      success: true,\n      segmentIndex,\n      frames,\n    });\n\n    // 发送完成后再清理大对象引用\n    compositionData = null;\n    fontInfo = null;\n    // frames 数组已经在 postMessage 时传出了，不需要再清理\n    frames = null;\n    renderer = null;\n    composition = null;\n  } catch (error) {\n    parentPort.postMessage({\n      success: false,\n      segmentIndex,\n      error: error.message,\n      stack: error.stack,\n    });\n  }\n}\n\nrenderSegment();\n\n"],"names":["__filename","fileURLToPath","__dirname","workerData","initDefaultFont","registerFontFile","Renderer","VideoMaker","BackgroundLayer","ElementLayer","parentPort"],"mappings":"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"}