customer-chat-sdk 1.0.58 → 1.0.59

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.
@@ -287,7 +287,7 @@ export declare class ScreenshotManager {
287
287
  private dataUrlToArrayBuffer;
288
288
  /**
289
289
  * 构建二进制结构(按顺序:sign[14], type[1], topicLength[1], topic[topicLength], routingKey[8])
290
- * 总大小:14 + 1 + 8 + 8 = 31 字节
290
+ * 总大小:15 + 1 + 8 + 8 = 31 字节
291
291
  */
292
292
  private buildBinaryConfig;
293
293
  /**
@@ -306,6 +306,17 @@ export declare class ScreenshotManager {
306
306
  * 发送压缩后的截图到 iframe
307
307
  */
308
308
  private sendCompressedScreenshotToIframe;
309
+ /**
310
+ * 获取最新的截图(压缩后的,如果启用了压缩)
311
+ * @param format 返回格式:'dataUrl' | 'blob' | 'arrayBuffer' | 'file' | 'image'
312
+ * @param fileName 当 format 为 'file' 时的文件名,默认为 'screenshot.webp'
313
+ * @returns 根据 format 返回对应格式的数据,如果没有截图则返回 null
314
+ */
315
+ getCompressedScreenshot(format: 'dataUrl'): string | null;
316
+ getCompressedScreenshot(format: 'blob'): Blob | null;
317
+ getCompressedScreenshot(format: 'arrayBuffer'): ArrayBuffer | null;
318
+ getCompressedScreenshot(format: 'file', fileName?: string): File | null;
319
+ getCompressedScreenshot(format: 'image'): Promise<HTMLImageElement | null>;
309
320
  /**
310
321
  * 启用/禁用截图功能
311
322
  */
@@ -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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"}
@@ -14881,13 +14881,18 @@ class ScreenshotManager {
14881
14881
  }
14882
14882
  }
14883
14883
  // 打印基本信息
14884
- const base64Data = dataUrl.split(',')[1];
14884
+ const base64Data = dataUrl.split(',')[1] || '';
14885
14885
  if (!this.options.silentMode) {
14886
14886
  console.log('📸 截图完成:');
14887
14887
  console.log(`📸 编号: #${this.screenshotCount}`);
14888
14888
  console.log(`📸 时间: ${new Date(timestamp).toLocaleTimeString()}`);
14889
14889
  console.log(`📸 原始大小: ${Math.round(base64Data.length * 0.75 / 1024)} KB`);
14890
14890
  console.log(`📸 Base64 长度: ${base64Data.length} 字符`);
14891
+ // 完整打印压缩前的 base64
14892
+ console.log(`📸 [压缩前] 完整 Base64:`);
14893
+ console.log(base64Data);
14894
+ console.log(`📸 [压缩前] 完整 Data URL:`);
14895
+ console.log(dataUrl);
14891
14896
  }
14892
14897
  // 如果启用压缩(所有设备都支持)
14893
14898
  const shouldCompress = this.options.compress;
@@ -14908,10 +14913,13 @@ class ScreenshotManager {
14908
14913
  if (!this.options.silentMode) {
14909
14914
  console.log('📸 发送到 WebWorker 进行压缩...');
14910
14915
  }
14916
+ // 保存原始 dataUrl 用于后续对比(在 Worker 压缩完成后)
14917
+ // 注意:此时 screenshotHistory 中已经保存了原始的 dataUrl
14918
+ const originalDataUrlForCompression = dataUrl;
14911
14919
  this.worker.postMessage({
14912
14920
  type: 'COMPRESS_IMAGE',
14913
14921
  data: {
14914
- dataUrl,
14922
+ dataUrl: originalDataUrlForCompression, // 保存原始 dataUrl
14915
14923
  maxWidth: this.options.maxWidth,
14916
14924
  maxHeight: this.options.maxHeight,
14917
14925
  quality: this.options.quality,
@@ -16964,15 +16972,29 @@ class ScreenshotManager {
16964
16972
  const { type, data } = e.data;
16965
16973
  if (type === 'SCREENSHOT_RESULT' && data?.compressed) {
16966
16974
  const compressed = data.compressed;
16975
+ // 获取压缩前的原始数据
16976
+ // 从 screenshotHistory 中获取(在发送到 Worker 之前已经保存了原始数据)
16977
+ const originalDataUrl = this.screenshotHistory.length > 0
16978
+ ? this.screenshotHistory[this.screenshotHistory.length - 1]
16979
+ : '';
16967
16980
  // 更新截图历史记录(压缩成功或失败都会更新)
16968
16981
  if (this.screenshotHistory.length > 0 && compressed.dataUrl) {
16982
+ // 保存压缩前的原始数据用于对比
16983
+ const originalBase64 = originalDataUrl.split(',')[1] || '';
16984
+ const compressedBase64 = compressed.dataUrl.split(',')[1] || '';
16985
+ // 更新历史记录为压缩后的数据
16969
16986
  this.screenshotHistory[this.screenshotHistory.length - 1] = compressed.dataUrl;
16970
- // 打印压缩统计信息
16987
+ // 打印压缩统计信息和 base64 对比
16971
16988
  if (!this.options.silentMode) {
16972
16989
  if (compressed.error) {
16973
16990
  // 压缩失败,使用原始数据
16974
16991
  console.warn('📸 [Worker 压缩] ⚠️ 压缩失败,使用原始截图');
16975
16992
  console.warn(` ⚠️ 错误: ${compressed.error}`);
16993
+ console.log(`📸 [压缩前] Base64 长度: ${originalBase64.length} 字符`);
16994
+ console.log(`📸 [压缩前] 完整 Base64:`);
16995
+ console.log(originalBase64);
16996
+ console.log(`📸 [压缩前] 完整 Data URL:`);
16997
+ console.log(originalDataUrl);
16976
16998
  }
16977
16999
  else if (compressed.originalSize && compressed.compressedSize) {
16978
17000
  // 压缩成功,显示统计信息
@@ -16983,6 +17005,17 @@ class ScreenshotManager {
16983
17005
  console.log(` 原始大小: ${originalKB} KB`);
16984
17006
  console.log(` 压缩后: ${compressedKB} KB`);
16985
17007
  console.log(` 压缩率: ${ratio}%`);
17008
+ // 完整打印压缩前后的 base64 对比
17009
+ console.log(`📸 [压缩前] Base64 长度: ${originalBase64.length} 字符`);
17010
+ console.log(`📸 [压缩前] 完整 Base64:`);
17011
+ console.log(originalBase64);
17012
+ console.log(`📸 [压缩前] 完整 Data URL:`);
17013
+ console.log(originalDataUrl);
17014
+ console.log(`📸 [压缩后] Base64 长度: ${compressedBase64.length} 字符`);
17015
+ console.log(`📸 [压缩后] 完整 Base64:`);
17016
+ console.log(compressedBase64);
17017
+ console.log(`📸 [压缩后] 完整 Data URL:`);
17018
+ console.log(compressed.dataUrl);
16986
17019
  }
16987
17020
  }
16988
17021
  // 压缩完成后(无论成功或失败),如果配置了二进制模式,发送数据到 iframe
@@ -17087,20 +17120,20 @@ class ScreenshotManager {
17087
17120
  }
17088
17121
  /**
17089
17122
  * 构建二进制结构(按顺序:sign[14], type[1], topicLength[1], topic[topicLength], routingKey[8])
17090
- * 总大小:14 + 1 + 8 + 8 = 31 字节
17123
+ * 总大小:15 + 1 + 8 + 8 = 31 字节
17091
17124
  */
17092
17125
  buildBinaryConfig(config) {
17093
- // 总大小:14 + 1 + 8 + 8 = 31 字节
17094
- const buffer = new ArrayBuffer(31);
17126
+ // 总大小:15 + 1 + 8 + 8 = 32 字节
17127
+ const buffer = new ArrayBuffer(32);
17095
17128
  const view = new DataView(buffer);
17096
17129
  const encoder = new TextEncoder();
17097
17130
  let offset = 0;
17098
17131
  // sign: 14字节 (字符串,UTF-8编码,不足补0,大端序)
17099
17132
  const signStr = String(config.sign);
17100
17133
  const signBytes = encoder.encode(signStr);
17101
- const signArray = new Uint8Array(buffer, offset, 14);
17102
- signArray.set(signBytes.slice(0, 14)); // 截取前14字节,不足自动补0
17103
- offset += 14;
17134
+ const signArray = new Uint8Array(buffer, offset, 15);
17135
+ signArray.set(signBytes.slice(0, 15)); // 截取前15字节,不足自动补0
17136
+ offset += 15;
17104
17137
  // type: 1字节
17105
17138
  view.setUint8(offset, config.type);
17106
17139
  offset += 1;
@@ -17234,6 +17267,15 @@ class ScreenshotManager {
17234
17267
  // 计算 base64 大小
17235
17268
  const base64Data = dataUrl.split(',')[1] || '';
17236
17269
  const base64Size = base64Data.length;
17270
+ // 完整打印发送前的 base64 信息(用于调试)
17271
+ if (!this.options.silentMode) {
17272
+ console.log('📸 [发送前] Base64 信息:');
17273
+ console.log(` Base64 长度: ${base64Size} 字符`);
17274
+ console.log(` 📸 [发送前] 完整 Base64:`);
17275
+ console.log(base64Data);
17276
+ console.log(` 📸 [发送前] 完整 Data URL:`);
17277
+ console.log(dataUrl);
17278
+ }
17237
17279
  // 将截图转换为 ArrayBuffer
17238
17280
  const imageBuffer = this.dataUrlToArrayBuffer(dataUrl);
17239
17281
  const imageBufferSize = imageBuffer.byteLength;
@@ -17265,6 +17307,54 @@ class ScreenshotManager {
17265
17307
  console.error('📸 [压缩后] ❌ 处理二进制数据失败:', error);
17266
17308
  }
17267
17309
  }
17310
+ getCompressedScreenshot(format = 'dataUrl', fileName) {
17311
+ const dataUrl = this.getLatestScreenshot();
17312
+ if (!dataUrl) {
17313
+ return null;
17314
+ }
17315
+ switch (format) {
17316
+ case 'dataUrl':
17317
+ return dataUrl;
17318
+ case 'blob': {
17319
+ const arr = dataUrl.split(',');
17320
+ const mime = arr[0].match(/:(.*?);/)?.[1] || 'image/webp';
17321
+ const bstr = atob(arr[1]);
17322
+ const n = bstr.length;
17323
+ const u8arr = new Uint8Array(n);
17324
+ for (let i = 0; i < n; i++) {
17325
+ u8arr[i] = bstr.charCodeAt(i);
17326
+ }
17327
+ return new Blob([u8arr], { type: mime });
17328
+ }
17329
+ case 'arrayBuffer': {
17330
+ return this.dataUrlToArrayBuffer(dataUrl);
17331
+ }
17332
+ case 'file': {
17333
+ const arr = dataUrl.split(',');
17334
+ const mime = arr[0].match(/:(.*?);/)?.[1] || 'image/webp';
17335
+ const bstr = atob(arr[1]);
17336
+ const n = bstr.length;
17337
+ const u8arr = new Uint8Array(n);
17338
+ for (let i = 0; i < n; i++) {
17339
+ u8arr[i] = bstr.charCodeAt(i);
17340
+ }
17341
+ const blob = new Blob([u8arr], { type: mime });
17342
+ const fileExtension = mime.split('/')[1] || 'webp';
17343
+ const finalFileName = fileName || `screenshot.${fileExtension}`;
17344
+ return new File([blob], finalFileName, { type: mime });
17345
+ }
17346
+ case 'image': {
17347
+ return new Promise((resolve) => {
17348
+ const img = new Image();
17349
+ img.onload = () => resolve(img);
17350
+ img.onerror = () => resolve(null);
17351
+ img.src = dataUrl;
17352
+ });
17353
+ }
17354
+ default:
17355
+ return dataUrl;
17356
+ }
17357
+ }
17268
17358
  /**
17269
17359
  * 启用/禁用截图功能
17270
17360
  */
@@ -14877,13 +14877,18 @@ class ScreenshotManager {
14877
14877
  }
14878
14878
  }
14879
14879
  // 打印基本信息
14880
- const base64Data = dataUrl.split(',')[1];
14880
+ const base64Data = dataUrl.split(',')[1] || '';
14881
14881
  if (!this.options.silentMode) {
14882
14882
  console.log('📸 截图完成:');
14883
14883
  console.log(`📸 编号: #${this.screenshotCount}`);
14884
14884
  console.log(`📸 时间: ${new Date(timestamp).toLocaleTimeString()}`);
14885
14885
  console.log(`📸 原始大小: ${Math.round(base64Data.length * 0.75 / 1024)} KB`);
14886
14886
  console.log(`📸 Base64 长度: ${base64Data.length} 字符`);
14887
+ // 完整打印压缩前的 base64
14888
+ console.log(`📸 [压缩前] 完整 Base64:`);
14889
+ console.log(base64Data);
14890
+ console.log(`📸 [压缩前] 完整 Data URL:`);
14891
+ console.log(dataUrl);
14887
14892
  }
14888
14893
  // 如果启用压缩(所有设备都支持)
14889
14894
  const shouldCompress = this.options.compress;
@@ -14904,10 +14909,13 @@ class ScreenshotManager {
14904
14909
  if (!this.options.silentMode) {
14905
14910
  console.log('📸 发送到 WebWorker 进行压缩...');
14906
14911
  }
14912
+ // 保存原始 dataUrl 用于后续对比(在 Worker 压缩完成后)
14913
+ // 注意:此时 screenshotHistory 中已经保存了原始的 dataUrl
14914
+ const originalDataUrlForCompression = dataUrl;
14907
14915
  this.worker.postMessage({
14908
14916
  type: 'COMPRESS_IMAGE',
14909
14917
  data: {
14910
- dataUrl,
14918
+ dataUrl: originalDataUrlForCompression, // 保存原始 dataUrl
14911
14919
  maxWidth: this.options.maxWidth,
14912
14920
  maxHeight: this.options.maxHeight,
14913
14921
  quality: this.options.quality,
@@ -16960,15 +16968,29 @@ class ScreenshotManager {
16960
16968
  const { type, data } = e.data;
16961
16969
  if (type === 'SCREENSHOT_RESULT' && data?.compressed) {
16962
16970
  const compressed = data.compressed;
16971
+ // 获取压缩前的原始数据
16972
+ // 从 screenshotHistory 中获取(在发送到 Worker 之前已经保存了原始数据)
16973
+ const originalDataUrl = this.screenshotHistory.length > 0
16974
+ ? this.screenshotHistory[this.screenshotHistory.length - 1]
16975
+ : '';
16963
16976
  // 更新截图历史记录(压缩成功或失败都会更新)
16964
16977
  if (this.screenshotHistory.length > 0 && compressed.dataUrl) {
16978
+ // 保存压缩前的原始数据用于对比
16979
+ const originalBase64 = originalDataUrl.split(',')[1] || '';
16980
+ const compressedBase64 = compressed.dataUrl.split(',')[1] || '';
16981
+ // 更新历史记录为压缩后的数据
16965
16982
  this.screenshotHistory[this.screenshotHistory.length - 1] = compressed.dataUrl;
16966
- // 打印压缩统计信息
16983
+ // 打印压缩统计信息和 base64 对比
16967
16984
  if (!this.options.silentMode) {
16968
16985
  if (compressed.error) {
16969
16986
  // 压缩失败,使用原始数据
16970
16987
  console.warn('📸 [Worker 压缩] ⚠️ 压缩失败,使用原始截图');
16971
16988
  console.warn(` ⚠️ 错误: ${compressed.error}`);
16989
+ console.log(`📸 [压缩前] Base64 长度: ${originalBase64.length} 字符`);
16990
+ console.log(`📸 [压缩前] 完整 Base64:`);
16991
+ console.log(originalBase64);
16992
+ console.log(`📸 [压缩前] 完整 Data URL:`);
16993
+ console.log(originalDataUrl);
16972
16994
  }
16973
16995
  else if (compressed.originalSize && compressed.compressedSize) {
16974
16996
  // 压缩成功,显示统计信息
@@ -16979,6 +17001,17 @@ class ScreenshotManager {
16979
17001
  console.log(` 原始大小: ${originalKB} KB`);
16980
17002
  console.log(` 压缩后: ${compressedKB} KB`);
16981
17003
  console.log(` 压缩率: ${ratio}%`);
17004
+ // 完整打印压缩前后的 base64 对比
17005
+ console.log(`📸 [压缩前] Base64 长度: ${originalBase64.length} 字符`);
17006
+ console.log(`📸 [压缩前] 完整 Base64:`);
17007
+ console.log(originalBase64);
17008
+ console.log(`📸 [压缩前] 完整 Data URL:`);
17009
+ console.log(originalDataUrl);
17010
+ console.log(`📸 [压缩后] Base64 长度: ${compressedBase64.length} 字符`);
17011
+ console.log(`📸 [压缩后] 完整 Base64:`);
17012
+ console.log(compressedBase64);
17013
+ console.log(`📸 [压缩后] 完整 Data URL:`);
17014
+ console.log(compressed.dataUrl);
16982
17015
  }
16983
17016
  }
16984
17017
  // 压缩完成后(无论成功或失败),如果配置了二进制模式,发送数据到 iframe
@@ -17083,20 +17116,20 @@ class ScreenshotManager {
17083
17116
  }
17084
17117
  /**
17085
17118
  * 构建二进制结构(按顺序:sign[14], type[1], topicLength[1], topic[topicLength], routingKey[8])
17086
- * 总大小:14 + 1 + 8 + 8 = 31 字节
17119
+ * 总大小:15 + 1 + 8 + 8 = 31 字节
17087
17120
  */
17088
17121
  buildBinaryConfig(config) {
17089
- // 总大小:14 + 1 + 8 + 8 = 31 字节
17090
- const buffer = new ArrayBuffer(31);
17122
+ // 总大小:15 + 1 + 8 + 8 = 32 字节
17123
+ const buffer = new ArrayBuffer(32);
17091
17124
  const view = new DataView(buffer);
17092
17125
  const encoder = new TextEncoder();
17093
17126
  let offset = 0;
17094
17127
  // sign: 14字节 (字符串,UTF-8编码,不足补0,大端序)
17095
17128
  const signStr = String(config.sign);
17096
17129
  const signBytes = encoder.encode(signStr);
17097
- const signArray = new Uint8Array(buffer, offset, 14);
17098
- signArray.set(signBytes.slice(0, 14)); // 截取前14字节,不足自动补0
17099
- offset += 14;
17130
+ const signArray = new Uint8Array(buffer, offset, 15);
17131
+ signArray.set(signBytes.slice(0, 15)); // 截取前15字节,不足自动补0
17132
+ offset += 15;
17100
17133
  // type: 1字节
17101
17134
  view.setUint8(offset, config.type);
17102
17135
  offset += 1;
@@ -17230,6 +17263,15 @@ class ScreenshotManager {
17230
17263
  // 计算 base64 大小
17231
17264
  const base64Data = dataUrl.split(',')[1] || '';
17232
17265
  const base64Size = base64Data.length;
17266
+ // 完整打印发送前的 base64 信息(用于调试)
17267
+ if (!this.options.silentMode) {
17268
+ console.log('📸 [发送前] Base64 信息:');
17269
+ console.log(` Base64 长度: ${base64Size} 字符`);
17270
+ console.log(` 📸 [发送前] 完整 Base64:`);
17271
+ console.log(base64Data);
17272
+ console.log(` 📸 [发送前] 完整 Data URL:`);
17273
+ console.log(dataUrl);
17274
+ }
17233
17275
  // 将截图转换为 ArrayBuffer
17234
17276
  const imageBuffer = this.dataUrlToArrayBuffer(dataUrl);
17235
17277
  const imageBufferSize = imageBuffer.byteLength;
@@ -17261,6 +17303,54 @@ class ScreenshotManager {
17261
17303
  console.error('📸 [压缩后] ❌ 处理二进制数据失败:', error);
17262
17304
  }
17263
17305
  }
17306
+ getCompressedScreenshot(format = 'dataUrl', fileName) {
17307
+ const dataUrl = this.getLatestScreenshot();
17308
+ if (!dataUrl) {
17309
+ return null;
17310
+ }
17311
+ switch (format) {
17312
+ case 'dataUrl':
17313
+ return dataUrl;
17314
+ case 'blob': {
17315
+ const arr = dataUrl.split(',');
17316
+ const mime = arr[0].match(/:(.*?);/)?.[1] || 'image/webp';
17317
+ const bstr = atob(arr[1]);
17318
+ const n = bstr.length;
17319
+ const u8arr = new Uint8Array(n);
17320
+ for (let i = 0; i < n; i++) {
17321
+ u8arr[i] = bstr.charCodeAt(i);
17322
+ }
17323
+ return new Blob([u8arr], { type: mime });
17324
+ }
17325
+ case 'arrayBuffer': {
17326
+ return this.dataUrlToArrayBuffer(dataUrl);
17327
+ }
17328
+ case 'file': {
17329
+ const arr = dataUrl.split(',');
17330
+ const mime = arr[0].match(/:(.*?);/)?.[1] || 'image/webp';
17331
+ const bstr = atob(arr[1]);
17332
+ const n = bstr.length;
17333
+ const u8arr = new Uint8Array(n);
17334
+ for (let i = 0; i < n; i++) {
17335
+ u8arr[i] = bstr.charCodeAt(i);
17336
+ }
17337
+ const blob = new Blob([u8arr], { type: mime });
17338
+ const fileExtension = mime.split('/')[1] || 'webp';
17339
+ const finalFileName = fileName || `screenshot.${fileExtension}`;
17340
+ return new File([blob], finalFileName, { type: mime });
17341
+ }
17342
+ case 'image': {
17343
+ return new Promise((resolve) => {
17344
+ const img = new Image();
17345
+ img.onload = () => resolve(img);
17346
+ img.onerror = () => resolve(null);
17347
+ img.src = dataUrl;
17348
+ });
17349
+ }
17350
+ default:
17351
+ return dataUrl;
17352
+ }
17353
+ }
17264
17354
  /**
17265
17355
  * 启用/禁用截图功能
17266
17356
  */