customer-chat-sdk 1.0.66 → 1.0.68

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.
@@ -85,6 +85,8 @@ export declare class ScreenshotManager {
85
85
  private messageHandler;
86
86
  private dynamicInterval;
87
87
  private expirationTimer;
88
+ private isCurrentTaskCompleted;
89
+ private scheduleNextFn;
88
90
  private imageProxyCache;
89
91
  private indexedDBCache;
90
92
  private indexedDBReady;
@@ -1 +1 @@
1
- {"version":3,"file":"ScreenshotManager.d.ts","sourceRoot":"","sources":["../../src/core/ScreenshotManager.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAA;IACtC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,mBAAmB,GAAG,SAAS,GAAG,aAAa,CAAA;IACxD,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,cAAc,GAAG,QAAQ,GAAG,YAAY,CAAA;IAC3F,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,aAAa,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;IACvC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;CACjB;AA4BD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAyH;IACxI,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,kBAAkB,CAAI;IAC9B,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,SAAS,CAAQ;IAGzB,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,mBAAmB,CAA4B;IACvD,OAAO,CAAC,oBAAoB,CAAqC;IAGjE,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,eAAe,CAA8B;IAGrD,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,qBAAqB,CAAY;IACzC,OAAO,CAAC,aAAa,CAAe;IAGpC,OAAO,CAAC,sBAAsB,CAAQ;IAGtC,OAAO,CAAC,eAAe,CAAqE;IAC5F,OAAO,CAAC,iBAAiB,CAAQ;IAGjC,OAAO,CAAC,cAAc,CAA8D;IAGpF,OAAO,CAAC,eAAe,CAAsB;IAG7C,OAAO,CAAC,eAAe,CAA8B;IAGrD,OAAO,CAAC,eAAe,CAA4D;IAGnF,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,cAAc,CAAQ;IAG9B,OAAO,CAAC,oBAAoB,CAAoC;IAChE,OAAO,CAAC,oBAAoB,CAAyB;IAGrD,OAAO,CAAC,YAAY,CAAQ;IAG5B,OAAO,CAAC,kBAAkB,CAAqC;IAC/D,OAAO,CAAC,eAAe,CAAoB;IAC3C,OAAO,CAAC,2BAA2B,CAAI;IAGvC,OAAO,CAAC,kBAAkB,CAA6C;IACvE,OAAO,CAAC,sBAAsB,CAAwD;gBAE1E,aAAa,EAAE,WAAW,GAAG,IAAI,EAAE,OAAO,GAAE,iBAAsB,EAAE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI;IAqElH;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAsBnD;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAgE5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACH,OAAO,CAAC,6BAA6B;IAcrC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA6F3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8BzB;;OAEG;IACH,eAAe,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI;IA0G9C;;OAEG;IACH,cAAc,IAAI,IAAI;IAiBtB;;OAEG;IACG,WAAW,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAS3D;;OAEG;YACW,cAAc;IA2N5B;;;;;;OAMG;YACW,yBAAyB;IA+KvC;;;;;;;;;;;;;;;;OAgBG;YACW,6BAA6B;IA4W3C;;;;;;;;;;;;;;;;;OAiBG;YACW,kCAAkC;IA0oBhD;;OAEG;YACW,sBAAsB;IA0BpC;;OAEG;IACH,OAAO,CAAC,eAAe;IAsBvB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAuBhC;;OAEG;YACW,aAAa;IA4B3B;;OAEG;YACW,iBAAiB;IAsC/B;;OAEG;YACW,iBAAiB;IAwB/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;YACW,qBAAqB;IA0BnC;;OAEG;YACW,mBAAmB;IAiEjC;;OAEG;YACW,yBAAyB;IAuDvC;;OAEG;YACW,oBAAoB;IAclC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA+CxB;;OAEG;YACW,uBAAuB;IA2ErC;;OAEG;YACW,UAAU;IAmDxB;;OAEG;YACW,yBAAyB;IAsFvC;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB;;OAEG;YACW,mBAAmB;IA8BjC;;;OAGG;YACW,qBAAqB;IAqCnC;;OAEG;YACW,YAAY;IAa1B;;;OAGG;YACW,sBAAsB;IAoEpC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAe/B;;OAEG;IACH,OAAO,CAAC,YAAY;IAoUpB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAkChC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAYjC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAa5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,iBAAiB;IAiDzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAazB;;OAEG;YACW,2BAA2B;IAoHzC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;OAEG;IACH,OAAO,CAAC,gCAAgC;IAwDxC;;;;;OAKG;IACH,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI;IACzD,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IACpD,uBAAuB,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,GAAG,IAAI;IAClE,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IACvE,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAwD1E;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAO9B;;;OAGG;IACH,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI;IA+D3D;;OAEG;IACH,OAAO,IAAI,IAAI;IAoEf;;OAEG;IACH,OAAO,CAAC,cAAc;IAkBtB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAqCtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAsBzB;;OAEG;IACH,QAAQ;;;;;;;;;CAWT"}
1
+ {"version":3,"file":"ScreenshotManager.d.ts","sourceRoot":"","sources":["../../src/core/ScreenshotManager.ts"],"names":[],"mappings":"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"}
@@ -14338,6 +14338,10 @@ class ScreenshotManager {
14338
14338
  this.dynamicInterval = null;
14339
14339
  // 过期定时器
14340
14340
  this.expirationTimer = null;
14341
+ // 当前任务完成标志(用于串行定时任务)
14342
+ this.isCurrentTaskCompleted = true;
14343
+ // 保存 scheduleNext 函数引用(用于在压缩完成后触发下一次任务)
14344
+ this.scheduleNextFn = null;
14341
14345
  // 图片代理缓存(带过期时间)
14342
14346
  this.imageProxyCache = new Map();
14343
14347
  // IndexedDB 缓存(持久化)
@@ -14680,15 +14684,40 @@ class ScreenshotManager {
14680
14684
  this.worker = this.createWorker();
14681
14685
  }
14682
14686
  // 设置定时器(使用递归 setTimeout,确保等待前一个完成)
14683
- // 这样可以避免 setInterval 不等待异步完成的问题
14687
+ // 串行执行:必须等待上次任务完成后才进行下次任务
14684
14688
  const scheduleNext = async () => {
14689
+ // 如果上次任务还没完成,等待完成
14690
+ if (!this.isCurrentTaskCompleted) {
14691
+ if (!this.options.silentMode) {
14692
+ console.log('📸 [定时] 等待上次任务完成...');
14693
+ }
14694
+ // 每100ms检查一次任务是否完成
14695
+ const checkInterval = setInterval(() => {
14696
+ if (this.isCurrentTaskCompleted && this.isRunning) {
14697
+ clearInterval(checkInterval);
14698
+ scheduleNext();
14699
+ }
14700
+ else if (!this.isRunning) {
14701
+ clearInterval(checkInterval);
14702
+ }
14703
+ }, 100);
14704
+ return;
14705
+ }
14685
14706
  if (this.isRunning && this.isEnabled && !document.hidden) {
14707
+ // 标记任务开始
14708
+ this.isCurrentTaskCompleted = false;
14709
+ // 记录定时开始时间
14710
+ const scheduleStartTime = performance.now();
14711
+ if (!this.options.silentMode) {
14712
+ console.log(`📸 [定时开始] 开始新一轮截图任务`);
14713
+ }
14686
14714
  try {
14687
- await this.takeScreenshot();
14715
+ await this.takeScreenshot(scheduleStartTime);
14688
14716
  // 如果配置了二进制模式,发送二进制数据
14689
14717
  // 注意:如果启用了压缩,会在 Worker 压缩完成后自动发送(在 onmessage 中处理)
14690
14718
  // 如果没有启用压缩,立即发送
14691
14719
  if (this.currentBinaryConfig && !this.options.compress) {
14720
+ const sendStartTime = performance.now();
14692
14721
  const latestScreenshot = this.getLatestScreenshot();
14693
14722
  if (latestScreenshot) {
14694
14723
  try {
@@ -14696,14 +14725,20 @@ class ScreenshotManager {
14696
14725
  const base64Data = latestScreenshot.split(',')[1] || '';
14697
14726
  const base64Size = base64Data.length;
14698
14727
  // 将截图转换为 ArrayBuffer
14728
+ const convertStartTime = performance.now();
14699
14729
  const imageBuffer = this.dataUrlToArrayBuffer(latestScreenshot);
14700
14730
  const imageBufferSize = imageBuffer.byteLength;
14731
+ const convertTime = performance.now() - convertStartTime;
14701
14732
  // 构建配置的二进制结构
14733
+ const buildConfigStartTime = performance.now();
14702
14734
  const configBuffer = this.buildBinaryConfig(this.currentBinaryConfig);
14703
14735
  const configBufferSize = configBuffer.byteLength;
14736
+ const buildConfigTime = performance.now() - buildConfigStartTime;
14704
14737
  // 合并配置字节和图片字节(配置在前)
14738
+ const combineStartTime = performance.now();
14705
14739
  const combinedBuffer = this.combineBinaryData(configBuffer, imageBuffer);
14706
14740
  const combinedBufferSize = combinedBuffer.byteLength;
14741
+ const combineTime = performance.now() - combineStartTime;
14707
14742
  // 打印大小信息
14708
14743
  if (!this.options.silentMode) {
14709
14744
  console.log('📸 [轮询-大小统计]');
@@ -14711,16 +14746,26 @@ class ScreenshotManager {
14711
14746
  console.log(` 图片字节大小: ${(imageBufferSize / 1024).toFixed(2)} KB (${imageBufferSize} 字节)`);
14712
14747
  console.log(` 配置字节大小: ${configBufferSize} 字节`);
14713
14748
  console.log(` 拼接后总大小: ${(combinedBufferSize / 1024).toFixed(2)} KB (${combinedBufferSize} 字节)`);
14749
+ console.log(` ⏱️ 数据转换耗时: ${convertTime.toFixed(2)}ms`);
14750
+ console.log(` ⏱️ 构建配置耗时: ${buildConfigTime.toFixed(2)}ms`);
14751
+ console.log(` ⏱️ 合并数据耗时: ${combineTime.toFixed(2)}ms`);
14714
14752
  }
14715
14753
  // 发送二进制数据到 iframe
14716
14754
  if (this.sendToIframeCallback) {
14755
+ const sendCallbackStartTime = performance.now();
14717
14756
  const message = {
14718
14757
  type: 'screenshotBinary',
14719
14758
  data: combinedBuffer
14720
14759
  };
14721
14760
  this.sendToIframeCallback(message);
14761
+ const sendCallbackTime = performance.now() - sendCallbackStartTime;
14762
+ const totalSendTime = performance.now() - sendStartTime;
14763
+ const totalTime = performance.now() - scheduleStartTime;
14722
14764
  if (!this.options.silentMode) {
14723
14765
  console.log('📸 [轮询] ✅ 二进制数据已发送到 iframe');
14766
+ console.log(` ⏱️ 发送回调耗时: ${sendCallbackTime.toFixed(2)}ms`);
14767
+ console.log(` ⏱️ 发送阶段总耗时: ${totalSendTime.toFixed(2)}ms`);
14768
+ console.log(` ⏱️ 从定时开始到发送完成总耗时: ${totalTime.toFixed(2)}ms`);
14724
14769
  }
14725
14770
  }
14726
14771
  }
@@ -14728,25 +14773,36 @@ class ScreenshotManager {
14728
14773
  console.error('📸 [轮询] ❌ 处理二进制数据失败:', error);
14729
14774
  }
14730
14775
  }
14776
+ // 任务完成(无压缩模式)
14777
+ this.isCurrentTaskCompleted = true;
14731
14778
  }
14732
14779
  else if (this.currentBinaryConfig && this.options.compress) {
14733
14780
  // 启用了压缩,等待 Worker 压缩完成后在 onmessage 中发送
14781
+ // 任务完成标志会在压缩完成的回调中设置
14734
14782
  if (!this.options.silentMode) {
14735
14783
  console.log('📸 [轮询] 等待 Worker 压缩完成后发送到 iframe...');
14736
14784
  }
14737
14785
  }
14786
+ else {
14787
+ // 没有二进制配置,任务完成
14788
+ this.isCurrentTaskCompleted = true;
14789
+ }
14738
14790
  }
14739
14791
  catch (error) {
14740
14792
  if (!this.options.silentMode) {
14741
14793
  console.error('📸 [轮询] 截图失败:', error);
14742
14794
  }
14795
+ // 任务失败,标记为完成
14796
+ this.isCurrentTaskCompleted = true;
14743
14797
  }
14744
14798
  }
14745
- // 如果还在运行,安排下一次截图
14746
- if (this.isRunning) {
14799
+ // 如果还在运行且任务已完成,安排下一次截图
14800
+ if (this.isRunning && this.isCurrentTaskCompleted) {
14747
14801
  this.screenshotTimer = setTimeout(scheduleNext, currentInterval);
14748
14802
  }
14749
14803
  };
14804
+ // 保存 scheduleNext 函数引用,以便在压缩完成的回调中使用
14805
+ this.scheduleNextFn = scheduleNext;
14750
14806
  // 立即开始第一次
14751
14807
  scheduleNext();
14752
14808
  // 注意:不再立即执行一次,因为已经在 takeScreenshotAndUpload 中执行了
@@ -14766,6 +14822,9 @@ class ScreenshotManager {
14766
14822
  clearInterval(this.screenshotTimer);
14767
14823
  this.screenshotTimer = null;
14768
14824
  }
14825
+ // 清理任务状态
14826
+ this.isCurrentTaskCompleted = true;
14827
+ this.scheduleNextFn = null;
14769
14828
  }
14770
14829
  /**
14771
14830
  * 手动截图一次(允许在未启用时也执行,用于测试)
@@ -14780,25 +14839,41 @@ class ScreenshotManager {
14780
14839
  /**
14781
14840
  * 执行截图
14782
14841
  */
14783
- async takeScreenshot() {
14842
+ async takeScreenshot(scheduleStartTime) {
14784
14843
  if (!this.targetElement) {
14785
14844
  console.warn('📸 目标元素不存在');
14786
14845
  return false;
14787
14846
  }
14847
+ // 记录截图开始时间
14848
+ const screenshotStartTime = performance.now();
14788
14849
  this.setupGlobalErrorHandlers();
14789
14850
  try {
14790
14851
  if (!this.options.silentMode) {
14791
14852
  console.log(`📸 开始截图 #${this.screenshotCount + 1}...`);
14853
+ if (scheduleStartTime) {
14854
+ const waitTime = screenshotStartTime - scheduleStartTime;
14855
+ console.log(` ⏱️ 定时到截图开始耗时: ${waitTime.toFixed(2)}ms`);
14856
+ }
14792
14857
  }
14793
14858
  // 等待 CSS 和字体加载完成
14859
+ const waitStylesStartTime = performance.now();
14794
14860
  await Promise.all([
14795
14861
  this.waitForStylesAndFonts(),
14796
14862
  this.waitForFonts()
14797
14863
  ]);
14864
+ const waitStylesTime = performance.now() - waitStylesStartTime;
14865
+ if (!this.options.silentMode) {
14866
+ console.log(` ⏱️ 等待样式和字体加载耗时: ${waitStylesTime.toFixed(2)}ms`);
14867
+ }
14798
14868
  // 等待元素完全渲染(特别是对于 modern-screenshot)
14869
+ const waitRenderStartTime = performance.now();
14799
14870
  await new Promise(resolve => requestAnimationFrame(() => {
14800
14871
  requestAnimationFrame(() => resolve());
14801
14872
  }));
14873
+ const waitRenderTime = performance.now() - waitRenderStartTime;
14874
+ if (!this.options.silentMode) {
14875
+ console.log(` ⏱️ 等待渲染完成耗时: ${waitRenderTime.toFixed(2)}ms`);
14876
+ }
14802
14877
  // 选择截图引擎
14803
14878
  const selectedEngine = this.options.engine || 'modern-screenshot';
14804
14879
  if (!this.options.silentMode) {
@@ -14825,6 +14900,7 @@ class ScreenshotManager {
14825
14900
  }
14826
14901
  let dataUrl;
14827
14902
  // 根据选择的引擎进行截图
14903
+ const engineStartTime = performance.now();
14828
14904
  if (selectedEngine === 'html2canvas') {
14829
14905
  // html2canvas 需要更长的等待时间确保样式加载
14830
14906
  // 额外等待样式和字体加载完成
@@ -14847,6 +14923,10 @@ class ScreenshotManager {
14847
14923
  await new Promise(resolve => setTimeout(resolve, 50));
14848
14924
  dataUrl = await this.takeScreenshotWithModernScreenshot(this.targetElement);
14849
14925
  }
14926
+ const engineTime = performance.now() - engineStartTime;
14927
+ if (!this.options.silentMode) {
14928
+ console.log(` ⏱️ 截图引擎执行耗时: ${engineTime.toFixed(2)}ms`);
14929
+ }
14850
14930
  const timestamp = Date.now();
14851
14931
  // 更新状态
14852
14932
  this.screenshotCount++;
@@ -14880,6 +14960,8 @@ class ScreenshotManager {
14880
14960
  break;
14881
14961
  }
14882
14962
  }
14963
+ // 计算截图总耗时
14964
+ const screenshotTotalTime = performance.now() - screenshotStartTime;
14883
14965
  // 打印基本信息
14884
14966
  const base64Data = dataUrl.split(',')[1] || '';
14885
14967
  if (!this.options.silentMode) {
@@ -14888,6 +14970,7 @@ class ScreenshotManager {
14888
14970
  console.log(`📸 时间: ${new Date(timestamp).toLocaleTimeString()}`);
14889
14971
  console.log(`📸 原始大小: ${Math.round(base64Data.length * 0.75 / 1024)} KB`);
14890
14972
  console.log(`📸 Base64 长度: ${base64Data.length} 字符`);
14973
+ console.log(` ⏱️ 截图总耗时: ${screenshotTotalTime.toFixed(2)}ms`);
14891
14974
  // 完整打印压缩前的 base64
14892
14975
  console.log(`📸 [压缩前] 完整 Base64:`);
14893
14976
  console.log(base64Data);
@@ -14910,12 +14993,16 @@ class ScreenshotManager {
14910
14993
  }
14911
14994
  }
14912
14995
  if (this.worker) {
14996
+ // 记录压缩开始时间
14997
+ const compressStartTime = performance.now();
14913
14998
  if (!this.options.silentMode) {
14914
14999
  console.log('📸 发送到 WebWorker 进行压缩...');
14915
15000
  }
14916
15001
  // 保存原始 dataUrl 用于后续对比(在 Worker 压缩完成后)
14917
15002
  // 注意:此时 screenshotHistory 中已经保存了原始的 dataUrl
14918
15003
  const originalDataUrlForCompression = dataUrl;
15004
+ this.worker.__compressStartTime = compressStartTime;
15005
+ this.worker.__scheduleStartTime = scheduleStartTime;
14919
15006
  this.worker.postMessage({
14920
15007
  type: 'COMPRESS_IMAGE',
14921
15008
  data: {
@@ -17052,6 +17139,11 @@ class ScreenshotManager {
17052
17139
  const { type, data } = e.data;
17053
17140
  if (type === 'SCREENSHOT_RESULT' && data?.compressed) {
17054
17141
  const compressed = data.compressed;
17142
+ const compressEndTime = performance.now();
17143
+ // 获取压缩开始时间
17144
+ const compressStartTime = newWorker.__compressStartTime || compressEndTime;
17145
+ const scheduleStartTime = newWorker.__scheduleStartTime;
17146
+ const compressTime = compressEndTime - compressStartTime;
17055
17147
  // 获取压缩前的原始数据
17056
17148
  // 从 screenshotHistory 中获取(在发送到 Worker 之前已经保存了原始数据)
17057
17149
  const originalDataUrl = this.screenshotHistory.length > 0
@@ -17070,6 +17162,7 @@ class ScreenshotManager {
17070
17162
  // 压缩失败,使用原始数据
17071
17163
  console.warn('📸 [Worker 压缩] ⚠️ 压缩失败,使用原始截图');
17072
17164
  console.warn(` ⚠️ 错误: ${compressed.error}`);
17165
+ console.log(` ⏱️ Worker 压缩耗时: ${compressTime.toFixed(2)}ms`);
17073
17166
  console.log(`📸 [压缩前] Base64 长度: ${originalBase64.length} 字符`);
17074
17167
  console.log(`📸 [压缩前] 完整 Base64:`);
17075
17168
  console.log(originalBase64);
@@ -17085,6 +17178,7 @@ class ScreenshotManager {
17085
17178
  console.log(` 原始大小: ${originalKB} KB`);
17086
17179
  console.log(` 压缩后: ${compressedKB} KB`);
17087
17180
  console.log(` 压缩率: ${ratio}%`);
17181
+ console.log(` ⏱️ Worker 压缩耗时: ${compressTime.toFixed(2)}ms`);
17088
17182
  // 完整打印压缩前后的 base64 对比
17089
17183
  console.log(`📸 [压缩前] Base64 长度: ${originalBase64.length} 字符`);
17090
17184
  console.log(`📸 [压缩前] 完整 Base64:`);
@@ -17100,9 +17194,19 @@ class ScreenshotManager {
17100
17194
  }
17101
17195
  // 压缩完成后(无论成功或失败),如果配置了二进制模式,发送数据到 iframe
17102
17196
  if (this.currentBinaryConfig && compressed.dataUrl) {
17103
- this.sendCompressedScreenshotToIframe(compressed.dataUrl);
17197
+ this.sendCompressedScreenshotToIframe(compressed.dataUrl, scheduleStartTime, compressEndTime);
17104
17198
  }
17105
17199
  }
17200
+ // 任务完成(压缩模式)- 无论是否成功,都要标记为完成
17201
+ this.isCurrentTaskCompleted = true;
17202
+ // 如果还在运行,触发下一次任务
17203
+ if (this.isRunning && this.scheduleNextFn) {
17204
+ const currentInterval = this.dynamicInterval || this.options.interval;
17205
+ this.screenshotTimer = setTimeout(() => {
17206
+ this.screenshotTimer = null;
17207
+ this.scheduleNextFn?.();
17208
+ }, currentInterval);
17209
+ }
17106
17210
  }
17107
17211
  };
17108
17212
  newWorker.onerror = (e) => {
@@ -17132,6 +17236,16 @@ class ScreenshotManager {
17132
17236
  }
17133
17237
  }
17134
17238
  }
17239
+ // Worker 错误时,任务也完成
17240
+ this.isCurrentTaskCompleted = true;
17241
+ // 如果还在运行,触发下一次任务
17242
+ if (this.isRunning && this.scheduleNextFn) {
17243
+ const currentInterval = this.dynamicInterval || this.options.interval;
17244
+ this.screenshotTimer = setTimeout(() => {
17245
+ this.screenshotTimer = null;
17246
+ this.scheduleNextFn?.();
17247
+ }, currentInterval);
17248
+ }
17135
17249
  };
17136
17250
  // 注意:不要立即 revokeObjectURL,因为 Worker 需要这个 URL 保持有效
17137
17251
  // 在 destroy() 方法中清理 Worker 时再 revoke
@@ -17390,10 +17504,11 @@ class ScreenshotManager {
17390
17504
  /**
17391
17505
  * 发送压缩后的截图到 iframe
17392
17506
  */
17393
- sendCompressedScreenshotToIframe(dataUrl) {
17507
+ sendCompressedScreenshotToIframe(dataUrl, scheduleStartTime, compressEndTime) {
17394
17508
  if (!this.currentBinaryConfig || !this.sendToIframeCallback) {
17395
17509
  return;
17396
17510
  }
17511
+ const sendStartTime = performance.now();
17397
17512
  try {
17398
17513
  // 计算 base64 大小
17399
17514
  const base64Data = dataUrl.split(',')[1] || '';
@@ -17408,14 +17523,20 @@ class ScreenshotManager {
17408
17523
  console.log(dataUrl);
17409
17524
  }
17410
17525
  // 将截图转换为 ArrayBuffer
17526
+ const convertStartTime = performance.now();
17411
17527
  const imageBuffer = this.dataUrlToArrayBuffer(dataUrl);
17412
17528
  const imageBufferSize = imageBuffer.byteLength;
17529
+ const convertTime = performance.now() - convertStartTime;
17413
17530
  // 构建配置的二进制结构
17531
+ const buildConfigStartTime = performance.now();
17414
17532
  const configBuffer = this.buildBinaryConfig(this.currentBinaryConfig);
17415
17533
  const configBufferSize = configBuffer.byteLength;
17534
+ const buildConfigTime = performance.now() - buildConfigStartTime;
17416
17535
  // 合并配置字节和图片字节(配置在前)
17536
+ const combineStartTime = performance.now();
17417
17537
  const combinedBuffer = this.combineBinaryData(configBuffer, imageBuffer);
17418
17538
  const combinedBufferSize = combinedBuffer.byteLength;
17539
+ const combineTime = performance.now() - combineStartTime;
17419
17540
  // 打印大小信息
17420
17541
  if (!this.options.silentMode) {
17421
17542
  console.log('📸 [压缩后-大小统计]');
@@ -17423,15 +17544,34 @@ class ScreenshotManager {
17423
17544
  console.log(` 图片字节大小: ${(imageBufferSize / 1024).toFixed(2)} KB (${imageBufferSize} 字节)`);
17424
17545
  console.log(` 配置字节大小: ${configBufferSize} 字节`);
17425
17546
  console.log(` 拼接后总大小: ${(combinedBufferSize / 1024).toFixed(2)} KB (${combinedBufferSize} 字节)`);
17547
+ console.log(` ⏱️ 数据转换耗时: ${convertTime.toFixed(2)}ms`);
17548
+ console.log(` ⏱️ 构建配置耗时: ${buildConfigTime.toFixed(2)}ms`);
17549
+ console.log(` ⏱️ 合并数据耗时: ${combineTime.toFixed(2)}ms`);
17426
17550
  }
17427
17551
  // 发送二进制数据到 iframe
17552
+ const sendCallbackStartTime = performance.now();
17428
17553
  const message = {
17429
17554
  type: 'screenshotBinary',
17430
17555
  data: combinedBuffer
17431
17556
  };
17432
17557
  this.sendToIframeCallback(message);
17558
+ const sendCallbackTime = performance.now() - sendCallbackStartTime;
17559
+ const totalSendTime = performance.now() - sendStartTime;
17560
+ let totalTime = 0;
17561
+ if (scheduleStartTime) {
17562
+ totalTime = performance.now() - scheduleStartTime;
17563
+ }
17433
17564
  if (!this.options.silentMode) {
17434
17565
  console.log('📸 [压缩后] ✅ 二进制数据已发送到 iframe');
17566
+ console.log(` ⏱️ 发送回调耗时: ${sendCallbackTime.toFixed(2)}ms`);
17567
+ console.log(` ⏱️ 发送阶段总耗时: ${totalSendTime.toFixed(2)}ms`);
17568
+ if (scheduleStartTime) {
17569
+ console.log(` ⏱️ 从定时开始到发送完成总耗时: ${totalTime.toFixed(2)}ms`);
17570
+ if (compressEndTime) {
17571
+ const compressToSendTime = sendStartTime - compressEndTime;
17572
+ console.log(` ⏱️ 压缩完成到发送开始耗时: ${compressToSendTime.toFixed(2)}ms`);
17573
+ }
17574
+ }
17435
17575
  }
17436
17576
  }
17437
17577
  catch (error) {