customer-chat-sdk 1.0.20 → 1.0.22

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.
package/README.md CHANGED
@@ -11,6 +11,7 @@
11
11
  - **设备指纹**: 自动获取设备唯一标识
12
12
  - **iframe隔离**: 完全隔离的聊天界面,避免样式冲突
13
13
  - **通知系统**: 红点徽章、数字提醒功能
14
+ - **页面截图**: 支持自动截图和上传功能,可配置截图引擎和压缩选项
14
15
  - **跨平台支持**: 支持UMD、ESM、CJS多种模块格式
15
16
 
16
17
  ## 📦 安装
@@ -96,12 +97,25 @@ CustomerSDK.clearNotification(); // 清除通知
96
97
  ### 高级配置
97
98
 
98
99
  ```javascript
99
- // 完整的配置选项
100
+ // 高级配置
100
101
  await CustomerSDK.init({
101
102
  agent: 'your_agent_id',
102
103
  token: 'your_jwt_token',
103
104
  iframeUrl: 'https://chat.example.com',
104
- debug: true
105
+ debug: true,
106
+ // 截图配置(可选)
107
+ screenshot: {
108
+ interval: 5000, // 截图间隔(毫秒),默认5000
109
+ quality: 0.4, // 图片质量(0-1),默认0.4
110
+ maxWidth: 1600, // 最大宽度,默认1600
111
+ maxHeight: 900, // 最大高度,默认900
112
+ outputFormat: 'webp', // 输出格式:'webp' | 'jpeg' | 'png',默认webp
113
+ engine: 'html2canvas', // 截图引擎(仅支持html2canvas)
114
+ compress: false, // 是否启用前端压缩,默认false
115
+ enableCORS: true, // 是否启用CORS处理,默认true
116
+ corsMode: 'canvas-proxy', // CORS处理模式,默认canvas-proxy
117
+ silentMode: false // 静默模式,减少控制台输出,默认false
118
+ }
105
119
  }, {
106
120
  // iframe选项(可选)
107
121
  width: 400,
@@ -116,6 +130,16 @@ await CustomerSDK.init({
116
130
  y: 80 // 距离顶部的距离(像素或CSS值,如'80px'、'10%')
117
131
  }
118
132
  });
133
+
134
+ // 设置自定义截图目标元素
135
+ CustomerSDK.setScreenshotTarget(document.getElementById('my-container'));
136
+
137
+ // 手动触发截图
138
+ await CustomerSDK.captureScreenshot();
139
+
140
+ // 获取截图状态
141
+ const state = CustomerSDK.getScreenshotState();
142
+ console.log('截图状态:', state);
119
143
  ```
120
144
 
121
145
  ## 📖 API 文档
@@ -138,6 +162,24 @@ interface SDKConfig {
138
162
  token: string; // 认证令牌
139
163
  iframeUrl: string; // iframe聊天页面URL (必需)
140
164
  debug?: boolean; // 调试模式
165
+ screenshot?: ScreenshotOptions; // 截图配置(可选)
166
+ }
167
+
168
+ interface ScreenshotOptions {
169
+ interval?: number; // 截图间隔(毫秒),默认5000
170
+ quality?: number; // 图片质量(0-1),默认0.4
171
+ scale?: number; // 缩放比例,默认1
172
+ maxHistory?: number; // 最大历史记录数,默认10
173
+ compress?: boolean; // 是否压缩图片,默认false
174
+ maxWidth?: number; // 最大宽度,默认1600
175
+ maxHeight?: number; // 最大高度,默认900
176
+ outputFormat?: 'webp' | 'jpeg' | 'png'; // 输出格式,默认webp
177
+ enableCORS?: boolean; // 是否启用CORS处理,默认true
178
+ proxyUrl?: string; // 代理服务器URL,用于处理CORS问题
179
+ engine?: 'html2canvas'; // 截图引擎(仅支持html2canvas,此选项已废弃,保留仅为兼容性)
180
+ corsMode?: 'simple' | 'smart' | 'proxy' | 'blob' | 'canvas-proxy' | 'ignore' | 'test-first'; // CORS处理模式,默认canvas-proxy
181
+ silentMode?: boolean; // 静默模式,减少控制台输出,默认false
182
+ maxRetries?: number; // 最大重试次数,默认2
141
183
  }
142
184
  ```
143
185
 
@@ -198,6 +240,34 @@ CustomerSDK.setIconCoordinates({ x: 50, y: 100 });
198
240
  CustomerSDK.setIconCoordinates({ x: '20px', y: '10%' });
199
241
  ```
200
242
 
243
+ #### `CustomerSDK.setScreenshotTarget(element)`
244
+
245
+ 设置截图目标元素。默认截图目标为 `document.body`。
246
+
247
+ **参数:**
248
+ - `element` (HTMLElement): 要截图的DOM元素
249
+
250
+ #### `CustomerSDK.captureScreenshot()`
251
+
252
+ 手动触发一次截图。
253
+
254
+ **返回:** `Promise<boolean>` - 是否截图成功
255
+
256
+ #### `CustomerSDK.getScreenshotState()`
257
+
258
+ 获取截图功能的状态信息。
259
+
260
+ **返回:** 状态对象,包含:
261
+ - `isRunning`: 是否正在运行
262
+ - `screenshotCount`: 截图次数
263
+ - `lastScreenshotTime`: 最后截图时间
264
+ - `error`: 错误信息
265
+ - `isEnabled`: 是否启用
266
+ - `isUploading`: 是否正在上传
267
+ - `uploadError`: 上传错误
268
+ - `uploadProgress`: 上传进度
269
+ - `currentUploadConfig`: 当前上传配置
270
+
201
271
  #### `CustomerSDK.isChatOpen()`
202
272
 
203
273
  检查聊天窗口是否打开。
@@ -0,0 +1,167 @@
1
+ /**
2
+ * 截图配置选项
3
+ */
4
+ export interface ScreenshotOptions {
5
+ interval?: number;
6
+ quality?: number;
7
+ scale?: number;
8
+ maxHistory?: number;
9
+ compress?: boolean;
10
+ maxWidth?: number;
11
+ maxHeight?: number;
12
+ outputFormat?: 'webp' | 'jpeg' | 'png';
13
+ enableCORS?: boolean;
14
+ proxyUrl?: string;
15
+ engine?: 'html2canvas';
16
+ corsMode?: 'simple' | 'smart' | 'proxy' | 'blob' | 'canvas-proxy' | 'ignore' | 'test-first';
17
+ silentMode?: boolean;
18
+ maxRetries?: number;
19
+ }
20
+ /**
21
+ * 上传配置接口
22
+ */
23
+ export interface UploadConfig {
24
+ uploadUrl: string;
25
+ objectKey: string;
26
+ bucketName: string;
27
+ contentType: string;
28
+ expirationMinutes: number;
29
+ duration: number;
30
+ }
31
+ /**
32
+ * 截图管理器
33
+ * 负责页面截图、压缩和上传功能
34
+ */
35
+ export declare class ScreenshotManager {
36
+ private options;
37
+ private targetElement;
38
+ private isRunning;
39
+ private screenshotCount;
40
+ private screenshotHistory;
41
+ private lastScreenshotTime;
42
+ private error;
43
+ private isEnabled;
44
+ private isUploading;
45
+ private uploadError;
46
+ private uploadProgress;
47
+ private currentUploadConfig;
48
+ private worker;
49
+ private screenshotTimer;
50
+ private messageHandler;
51
+ private dynamicInterval;
52
+ private expirationTimer;
53
+ private imageProxyCache;
54
+ private globalErrorHandler;
55
+ private globalRejectionHandler;
56
+ constructor(targetElement: HTMLElement | null, options?: ScreenshotOptions);
57
+ /**
58
+ * 设置目标元素
59
+ */
60
+ setTargetElement(element: HTMLElement | null): void;
61
+ /**
62
+ * 设置消息监听
63
+ */
64
+ private setupMessageListener;
65
+ /**
66
+ * 设置页面可见性监听
67
+ */
68
+ private setupVisibilityChangeListener;
69
+ /**
70
+ * 处理 iframe postMessage 消息
71
+ */
72
+ private handleIframeMessage;
73
+ /**
74
+ * 解析上传配置
75
+ */
76
+ private parseUploadConfig;
77
+ /**
78
+ * 开始轮询截图
79
+ */
80
+ startScreenshot(customInterval?: number): void;
81
+ /**
82
+ * 停止轮询截图
83
+ */
84
+ stopScreenshot(): void;
85
+ /**
86
+ * 手动截图一次
87
+ */
88
+ captureOnce(): Promise<boolean>;
89
+ /**
90
+ * 执行截图
91
+ */
92
+ private takeScreenshot;
93
+ /**
94
+ * 使用 html2canvas 截图
95
+ */
96
+ private takeScreenshotWithHtml2Canvas;
97
+ /**
98
+ * 预处理网络图片
99
+ */
100
+ private preprocessNetworkImages;
101
+ /**
102
+ * 等待图片加载完成
103
+ */
104
+ private waitForImagesToLoad;
105
+ /**
106
+ * 等待 CSS 和字体加载完成
107
+ */
108
+ private waitForStylesAndFonts;
109
+ /**
110
+ * 等待字体加载完成
111
+ */
112
+ private waitForFonts;
113
+ /**
114
+ * 计算压缩后的尺寸
115
+ */
116
+ private calculateCompressedSize;
117
+ /**
118
+ * 创建 WebWorker
119
+ */
120
+ private createWorker;
121
+ /**
122
+ * 设置全局错误处理器
123
+ */
124
+ private setupGlobalErrorHandlers;
125
+ /**
126
+ * 移除全局错误处理器
127
+ */
128
+ private removeGlobalErrorHandlers;
129
+ /**
130
+ * 上传截图到 S3
131
+ */
132
+ private uploadScreenshot;
133
+ /**
134
+ * 将 base64 data URL 转换为 Blob
135
+ */
136
+ private dataUrlToBlob;
137
+ /**
138
+ * 获取最新截图
139
+ */
140
+ private getLatestScreenshot;
141
+ /**
142
+ * 启用/禁用截图功能
143
+ */
144
+ enable(enabled: boolean): void;
145
+ /**
146
+ * 清理资源
147
+ */
148
+ destroy(): void;
149
+ /**
150
+ * 获取状态
151
+ */
152
+ getState(): {
153
+ isRunning: boolean;
154
+ screenshotCount: number;
155
+ lastScreenshotTime: number;
156
+ error: string | null;
157
+ isEnabled: boolean;
158
+ isUploading: boolean;
159
+ uploadError: string | null;
160
+ uploadProgress: {
161
+ success: number;
162
+ failed: number;
163
+ };
164
+ currentUploadConfig: UploadConfig | null;
165
+ };
166
+ }
167
+ //# sourceMappingURL=ScreenshotManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScreenshotManager.d.ts","sourceRoot":"","sources":["../../src/core/ScreenshotManager.ts"],"names":[],"mappings":"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"}