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":"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
|
|
1
|
+
{"version":3,"file":"ScreenshotManager.d.ts","sourceRoot":"","sources":["../../src/core/ScreenshotManager.ts"],"names":[],"mappings":"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"}
|
package/dist/customer-sdk.cjs.js
CHANGED
|
@@ -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
|
-
//
|
|
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) {
|