customer-chat-sdk 1.0.68 → 1.0.70
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.
|
@@ -21,13 +21,10 @@ export interface ScreenshotOptions {
|
|
|
21
21
|
maxConcurrentDownloads?: number;
|
|
22
22
|
onlyVisibleImages?: boolean;
|
|
23
23
|
imageCacheTTL?: number;
|
|
24
|
-
useIndexedDB?: boolean;
|
|
25
24
|
usePreconnect?: boolean;
|
|
26
25
|
imageLoadTimeout?: number;
|
|
27
26
|
useIntersectionObserver?: boolean;
|
|
28
27
|
fetchPriority?: 'high' | 'low' | 'auto';
|
|
29
|
-
maxCacheSize?: number;
|
|
30
|
-
maxCacheAge?: number;
|
|
31
28
|
maxImageSize?: number;
|
|
32
29
|
skipLargeImages?: boolean;
|
|
33
30
|
workerNumber?: number;
|
|
@@ -88,8 +85,6 @@ export declare class ScreenshotManager {
|
|
|
88
85
|
private isCurrentTaskCompleted;
|
|
89
86
|
private scheduleNextFn;
|
|
90
87
|
private imageProxyCache;
|
|
91
|
-
private indexedDBCache;
|
|
92
|
-
private indexedDBReady;
|
|
93
88
|
private intersectionObserver;
|
|
94
89
|
private visibleElementsCache;
|
|
95
90
|
private preconnected;
|
|
@@ -197,36 +192,28 @@ export declare class ScreenshotManager {
|
|
|
197
192
|
* 初始化 Intersection Observer(优化可见性检测)
|
|
198
193
|
*/
|
|
199
194
|
private initIntersectionObserver;
|
|
200
|
-
/**
|
|
201
|
-
* 初始化 IndexedDB(持久化缓存)
|
|
202
|
-
*/
|
|
203
|
-
private initIndexedDB;
|
|
204
|
-
/**
|
|
205
|
-
* 从 IndexedDB 获取缓存
|
|
206
|
-
*/
|
|
207
|
-
private getIndexedDBCache;
|
|
208
|
-
/**
|
|
209
|
-
* 设置 IndexedDB 缓存(带大小和时间控制)
|
|
210
|
-
*/
|
|
211
|
-
private setIndexedDBCache;
|
|
212
195
|
/**
|
|
213
196
|
* 估算 data URL 的大小(字节)
|
|
214
197
|
*/
|
|
215
198
|
private estimateDataUrlSize;
|
|
216
199
|
/**
|
|
217
|
-
* 获取 IndexedDB
|
|
200
|
+
* 获取 IndexedDB 当前缓存大小(已移除,不再使用)
|
|
201
|
+
* @deprecated IndexedDB 已移除,不再使用
|
|
218
202
|
*/
|
|
219
203
|
private getIndexedDBCacheSize;
|
|
220
204
|
/**
|
|
221
|
-
* 清理 IndexedDB
|
|
205
|
+
* 清理 IndexedDB 缓存(已移除,不再使用)
|
|
206
|
+
* @deprecated IndexedDB 已移除,不再使用
|
|
222
207
|
*/
|
|
223
208
|
private cleanIndexedDBCache;
|
|
224
209
|
/**
|
|
225
|
-
* 按大小清理 IndexedDB
|
|
210
|
+
* 按大小清理 IndexedDB 缓存(已移除,不再使用)
|
|
211
|
+
* @deprecated IndexedDB 已移除,不再使用
|
|
226
212
|
*/
|
|
227
213
|
private cleanIndexedDBCacheBySize;
|
|
228
214
|
/**
|
|
229
|
-
* 删除 IndexedDB
|
|
215
|
+
* 删除 IndexedDB 缓存(已移除,不再使用)
|
|
216
|
+
* @deprecated IndexedDB 已移除,不再使用
|
|
230
217
|
*/
|
|
231
218
|
private deleteIndexedDBCache;
|
|
232
219
|
/**
|
|
@@ -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,
|
|
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
|
@@ -14344,9 +14344,6 @@ class ScreenshotManager {
|
|
|
14344
14344
|
this.scheduleNextFn = null;
|
|
14345
14345
|
// 图片代理缓存(带过期时间)
|
|
14346
14346
|
this.imageProxyCache = new Map();
|
|
14347
|
-
// IndexedDB 缓存(持久化)
|
|
14348
|
-
this.indexedDBCache = null;
|
|
14349
|
-
this.indexedDBReady = false;
|
|
14350
14347
|
// Intersection Observer(用于高效检测可见性)
|
|
14351
14348
|
this.intersectionObserver = null;
|
|
14352
14349
|
this.visibleElementsCache = new Set();
|
|
@@ -14381,13 +14378,10 @@ class ScreenshotManager {
|
|
|
14381
14378
|
maxConcurrentDownloads: options.maxConcurrentDownloads ?? 10, // 增加并发数
|
|
14382
14379
|
onlyVisibleImages: options.onlyVisibleImages ?? true, // 默认只处理可视区域
|
|
14383
14380
|
imageCacheTTL: options.imageCacheTTL ?? 600000, // 默认10分钟(600000ms)
|
|
14384
|
-
useIndexedDB: options.useIndexedDB ?? true, // 默认启用 IndexedDB 持久化缓存
|
|
14385
14381
|
usePreconnect: options.usePreconnect ?? true, // 默认预连接代理服务器
|
|
14386
14382
|
imageLoadTimeout: options.imageLoadTimeout ?? 5000, // 默认5秒超时
|
|
14387
14383
|
useIntersectionObserver: options.useIntersectionObserver ?? true, // 默认使用 Intersection Observer
|
|
14388
14384
|
fetchPriority: options.fetchPriority ?? 'high', // 默认高优先级
|
|
14389
|
-
maxCacheSize: options.maxCacheSize ?? 50, // 默认最大50MB
|
|
14390
|
-
maxCacheAge: options.maxCacheAge ?? 86400000, // 默认24小时(86400000ms)
|
|
14391
14385
|
maxImageSize: options.maxImageSize ?? 5, // 不使用代理时,单个图片最大尺寸(MB),默认5MB
|
|
14392
14386
|
skipLargeImages: options.skipLargeImages ?? true, // 不使用代理时,是否跳过过大的图片,默认true(跳过)
|
|
14393
14387
|
workerNumber: options.workerNumber ?? undefined // modern-screenshot Worker 数量,默认自动计算(undefined 表示自动)
|
|
@@ -14410,15 +14404,6 @@ class ScreenshotManager {
|
|
|
14410
14404
|
if (this.options.useIntersectionObserver && this.options.onlyVisibleImages) {
|
|
14411
14405
|
this.initIntersectionObserver();
|
|
14412
14406
|
}
|
|
14413
|
-
// 初始化 IndexedDB(如果启用)
|
|
14414
|
-
if (this.options.useIndexedDB) {
|
|
14415
|
-
this.initIndexedDB().catch(() => {
|
|
14416
|
-
// IndexedDB 初始化失败,回退到内存缓存
|
|
14417
|
-
if (!this.options.silentMode) {
|
|
14418
|
-
console.warn('📸 IndexedDB 初始化失败,使用内存缓存');
|
|
14419
|
-
}
|
|
14420
|
-
});
|
|
14421
|
-
}
|
|
14422
14407
|
}
|
|
14423
14408
|
/**
|
|
14424
14409
|
* 设置目标元素
|
|
@@ -14883,20 +14868,12 @@ class ScreenshotManager {
|
|
|
14883
14868
|
if (this.options.preloadImages && this.options.enableCORS && selectedEngine === 'modern-screenshot') {
|
|
14884
14869
|
// 清理过期缓存
|
|
14885
14870
|
this.cleanExpiredCache();
|
|
14886
|
-
// 如果启用 IndexedDB,也清理 IndexedDB 缓存
|
|
14887
|
-
if (this.options.useIndexedDB) {
|
|
14888
|
-
await this.cleanIndexedDBCache();
|
|
14889
|
-
}
|
|
14890
14871
|
await this.preprocessNetworkImages(this.targetElement);
|
|
14891
14872
|
await this.waitForImagesToLoad(this.targetElement);
|
|
14892
14873
|
}
|
|
14893
14874
|
else {
|
|
14894
14875
|
// 即使不预加载,也清理一下过期缓存
|
|
14895
14876
|
this.cleanExpiredCache();
|
|
14896
|
-
// 如果启用 IndexedDB,也清理 IndexedDB 缓存
|
|
14897
|
-
if (this.options.useIndexedDB) {
|
|
14898
|
-
await this.cleanIndexedDBCache();
|
|
14899
|
-
}
|
|
14900
14877
|
}
|
|
14901
14878
|
let dataUrl;
|
|
14902
14879
|
// 根据选择的引擎进行截图
|
|
@@ -15689,18 +15666,6 @@ class ScreenshotManager {
|
|
|
15689
15666
|
}
|
|
15690
15667
|
return cachedDataUrl;
|
|
15691
15668
|
}
|
|
15692
|
-
// 检查 IndexedDB 缓存(如果启用)
|
|
15693
|
-
if (this.options.useIndexedDB) {
|
|
15694
|
-
const indexedDBCache = await this.getIndexedDBCache(url);
|
|
15695
|
-
if (indexedDBCache) {
|
|
15696
|
-
// 同步到内存缓存
|
|
15697
|
-
this.setCachedImage(url, indexedDBCache);
|
|
15698
|
-
if (!this.options.silentMode) {
|
|
15699
|
-
console.log(`📸 ✅ 使用 IndexedDB 缓存图片: ${url.substring(0, 50)}...`);
|
|
15700
|
-
}
|
|
15701
|
-
return indexedDBCache;
|
|
15702
|
-
}
|
|
15703
|
-
}
|
|
15704
15669
|
try {
|
|
15705
15670
|
// 构建代理请求参数
|
|
15706
15671
|
const params = new URLSearchParams({
|
|
@@ -15740,10 +15705,6 @@ class ScreenshotManager {
|
|
|
15740
15705
|
const dataUrl = await this.blobToDataUrl(blob);
|
|
15741
15706
|
// 缓存结果(带时间戳,10分钟有效)
|
|
15742
15707
|
this.setCachedImage(url, dataUrl);
|
|
15743
|
-
// 如果启用 IndexedDB,也保存到 IndexedDB
|
|
15744
|
-
if (this.options.useIndexedDB) {
|
|
15745
|
-
await this.setIndexedDBCache(url, dataUrl);
|
|
15746
|
-
}
|
|
15747
15708
|
return dataUrl;
|
|
15748
15709
|
}
|
|
15749
15710
|
catch (fetchError) {
|
|
@@ -15776,18 +15737,6 @@ class ScreenshotManager {
|
|
|
15776
15737
|
}
|
|
15777
15738
|
return cachedDataUrl;
|
|
15778
15739
|
}
|
|
15779
|
-
// 检查 IndexedDB 缓存(如果启用)
|
|
15780
|
-
if (this.options.useIndexedDB) {
|
|
15781
|
-
const indexedDBCache = await this.getIndexedDBCache(url);
|
|
15782
|
-
if (indexedDBCache) {
|
|
15783
|
-
// 同步到内存缓存
|
|
15784
|
-
this.setCachedImage(url, indexedDBCache);
|
|
15785
|
-
if (!this.options.silentMode) {
|
|
15786
|
-
console.log(`📸 ✅ 使用 IndexedDB 缓存图片(无代理模式): ${url.substring(0, 50)}...`);
|
|
15787
|
-
}
|
|
15788
|
-
return indexedDBCache;
|
|
15789
|
-
}
|
|
15790
|
-
}
|
|
15791
15740
|
// 检查是否正在下载(避免重复下载)
|
|
15792
15741
|
if (this.imageDownloadQueue.has(url)) {
|
|
15793
15742
|
// 如果已经在下载队列中,等待现有下载完成
|
|
@@ -15915,14 +15864,10 @@ class ScreenshotManager {
|
|
|
15915
15864
|
console.log(`📸 使用元素实际尺寸: ${elementWidth}x${elementHeight}`);
|
|
15916
15865
|
}
|
|
15917
15866
|
}
|
|
15918
|
-
//
|
|
15867
|
+
// 缩放配置:使用外部传递的参数
|
|
15919
15868
|
// scale < 1 会降低图片分辨率,减少 base64 大小
|
|
15920
|
-
if (this.options.scale !== 1) {
|
|
15921
|
-
contextOptions.scale =
|
|
15922
|
-
}
|
|
15923
|
-
else if (isMobile) {
|
|
15924
|
-
// 如果未指定 scale,移动设备默认使用 0.7
|
|
15925
|
-
contextOptions.scale = 0.7;
|
|
15869
|
+
if (this.options.scale !== undefined && this.options.scale !== 1) {
|
|
15870
|
+
contextOptions.scale = this.options.scale;
|
|
15926
15871
|
}
|
|
15927
15872
|
// 优化:复用 context,避免频繁创建和销毁(性能提升 20%+)
|
|
15928
15873
|
// 只在元素变化、配置变化或内容变化时重新创建 context
|
|
@@ -16120,28 +16065,83 @@ class ScreenshotManager {
|
|
|
16120
16065
|
if (!this.options.silentMode) {
|
|
16121
16066
|
console.log(`📸 使用 ${outputFormat.toUpperCase()} 格式截图(直接输出,无需转换)...`);
|
|
16122
16067
|
}
|
|
16123
|
-
//
|
|
16124
|
-
|
|
16125
|
-
|
|
16126
|
-
//
|
|
16127
|
-
|
|
16128
|
-
|
|
16129
|
-
|
|
16130
|
-
|
|
16131
|
-
|
|
16132
|
-
|
|
16133
|
-
|
|
16134
|
-
|
|
16135
|
-
|
|
16136
|
-
|
|
16137
|
-
|
|
16138
|
-
|
|
16139
|
-
|
|
16068
|
+
// 尝试使用 Worker 模式(context)
|
|
16069
|
+
try {
|
|
16070
|
+
// 根据输出格式选择对应的 API
|
|
16071
|
+
// modern-screenshot 内部已经处理了超时,不需要额外的 Promise.race
|
|
16072
|
+
if (outputFormat === 'webp') {
|
|
16073
|
+
// 使用 domToWebp,直接输出 WebP 格式,无需转换
|
|
16074
|
+
dataUrl = await domToWebp(this.screenshotContext);
|
|
16075
|
+
}
|
|
16076
|
+
else if (outputFormat === 'jpeg') {
|
|
16077
|
+
// 使用 domToJpeg,直接输出 JPEG 格式,无需转换
|
|
16078
|
+
dataUrl = await domToJpeg(this.screenshotContext);
|
|
16079
|
+
}
|
|
16080
|
+
else {
|
|
16081
|
+
// 默认使用 domToPng
|
|
16082
|
+
dataUrl = await domToPng(this.screenshotContext);
|
|
16083
|
+
}
|
|
16084
|
+
// 验证截图结果
|
|
16085
|
+
if (!dataUrl || dataUrl.length < 100) {
|
|
16086
|
+
throw new Error('生成的截图数据无效或过短');
|
|
16087
|
+
}
|
|
16088
|
+
if (!this.options.silentMode) {
|
|
16089
|
+
console.log(`📸 ✅ modern-screenshot 截图成功(Worker 模式,${outputFormat.toUpperCase()} 格式)`);
|
|
16090
|
+
}
|
|
16091
|
+
return dataUrl;
|
|
16140
16092
|
}
|
|
16141
|
-
|
|
16142
|
-
|
|
16093
|
+
catch (workerError) {
|
|
16094
|
+
// Worker 模式失败,回退到普通模式(参考用户代码)
|
|
16095
|
+
if (!this.options.silentMode) {
|
|
16096
|
+
console.warn('📸 Worker 模式失败,回退到普通模式:', workerError);
|
|
16097
|
+
}
|
|
16098
|
+
// 销毁失败的 context
|
|
16099
|
+
if (this.screenshotContext) {
|
|
16100
|
+
try {
|
|
16101
|
+
destroyContext(this.screenshotContext);
|
|
16102
|
+
}
|
|
16103
|
+
catch {
|
|
16104
|
+
// 忽略销毁错误
|
|
16105
|
+
}
|
|
16106
|
+
this.screenshotContext = null;
|
|
16107
|
+
}
|
|
16108
|
+
// 回退到普通模式(直接使用 domToWebp,不传 context)
|
|
16109
|
+
// 使用外部传递的参数,并给出合理的默认值
|
|
16110
|
+
const fallbackOptions = {
|
|
16111
|
+
scale: this.options.scale ?? 1, // 使用外部参数,默认 1
|
|
16112
|
+
backgroundColor: '#ffffff', // 默认白色背景
|
|
16113
|
+
type: `image/${outputFormat}`, // 使用配置的输出格式
|
|
16114
|
+
quality: this.options.quality ?? 0.8, // 使用外部参数,默认 0.4
|
|
16115
|
+
drawImageInterval: 20, // 默认 20ms,减少主线程阻塞
|
|
16116
|
+
features: {
|
|
16117
|
+
copyScrollbar: false,
|
|
16118
|
+
removeAbnormalAttributes: true,
|
|
16119
|
+
removeControlCharacter: true,
|
|
16120
|
+
fixSvgXmlDecode: true,
|
|
16121
|
+
restoreScrollPosition: false,
|
|
16122
|
+
},
|
|
16123
|
+
timeout: Math.max((this.options.interval ?? 5000) * 6, 10000), // 使用外部参数计算超时,默认 10 秒
|
|
16124
|
+
};
|
|
16125
|
+
// 限制 timeout 最多 15 秒
|
|
16126
|
+
fallbackOptions.timeout = Math.min(fallbackOptions.timeout, 15000);
|
|
16127
|
+
if (outputFormat === 'webp') {
|
|
16128
|
+
dataUrl = await domToWebp(element, fallbackOptions);
|
|
16129
|
+
}
|
|
16130
|
+
else if (outputFormat === 'jpeg') {
|
|
16131
|
+
dataUrl = await domToJpeg(element, fallbackOptions);
|
|
16132
|
+
}
|
|
16133
|
+
else {
|
|
16134
|
+
dataUrl = await domToPng(element, fallbackOptions);
|
|
16135
|
+
}
|
|
16136
|
+
// 验证截图结果
|
|
16137
|
+
if (!dataUrl || dataUrl.length < 100) {
|
|
16138
|
+
throw new Error('生成的截图数据无效或过短');
|
|
16139
|
+
}
|
|
16140
|
+
if (!this.options.silentMode) {
|
|
16141
|
+
console.log(`📸 ✅ modern-screenshot 截图成功(普通模式,${outputFormat.toUpperCase()} 格式)`);
|
|
16142
|
+
}
|
|
16143
|
+
return dataUrl;
|
|
16143
16144
|
}
|
|
16144
|
-
return dataUrl;
|
|
16145
16145
|
}
|
|
16146
16146
|
catch (error) {
|
|
16147
16147
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -16253,94 +16253,6 @@ class ScreenshotManager {
|
|
|
16253
16253
|
threshold: 0.01
|
|
16254
16254
|
});
|
|
16255
16255
|
}
|
|
16256
|
-
/**
|
|
16257
|
-
* 初始化 IndexedDB(持久化缓存)
|
|
16258
|
-
*/
|
|
16259
|
-
async initIndexedDB() {
|
|
16260
|
-
return new Promise((resolve, reject) => {
|
|
16261
|
-
const request = indexedDB.open('screenshot-cache', 1);
|
|
16262
|
-
request.onerror = () => reject(request.error);
|
|
16263
|
-
request.onsuccess = () => {
|
|
16264
|
-
this.indexedDBCache = request.result;
|
|
16265
|
-
this.indexedDBReady = true;
|
|
16266
|
-
// 初始化后立即清理过期和超大小的缓存
|
|
16267
|
-
this.cleanIndexedDBCache().catch(() => {
|
|
16268
|
-
// 清理失败不影响功能
|
|
16269
|
-
});
|
|
16270
|
-
resolve();
|
|
16271
|
-
};
|
|
16272
|
-
request.onupgradeneeded = (event) => {
|
|
16273
|
-
const db = event.target.result;
|
|
16274
|
-
if (!db.objectStoreNames.contains('images')) {
|
|
16275
|
-
const store = db.createObjectStore('images', { keyPath: 'url' });
|
|
16276
|
-
// 创建索引用于按时间排序
|
|
16277
|
-
store.createIndex('timestamp', 'timestamp', { unique: false });
|
|
16278
|
-
}
|
|
16279
|
-
};
|
|
16280
|
-
});
|
|
16281
|
-
}
|
|
16282
|
-
/**
|
|
16283
|
-
* 从 IndexedDB 获取缓存
|
|
16284
|
-
*/
|
|
16285
|
-
async getIndexedDBCache(url) {
|
|
16286
|
-
if (!this.indexedDBReady || !this.indexedDBCache) {
|
|
16287
|
-
return null;
|
|
16288
|
-
}
|
|
16289
|
-
try {
|
|
16290
|
-
const transaction = this.indexedDBCache.transaction(['images'], 'readonly');
|
|
16291
|
-
const store = transaction.objectStore('images');
|
|
16292
|
-
const request = store.get(url);
|
|
16293
|
-
return new Promise((resolve) => {
|
|
16294
|
-
request.onsuccess = () => {
|
|
16295
|
-
const result = request.result;
|
|
16296
|
-
if (result) {
|
|
16297
|
-
const now = Date.now();
|
|
16298
|
-
const age = now - result.timestamp;
|
|
16299
|
-
// 检查是否超过最大缓存时间
|
|
16300
|
-
if (age > this.options.maxCacheAge) {
|
|
16301
|
-
// 缓存过期,删除
|
|
16302
|
-
this.deleteIndexedDBCache(url);
|
|
16303
|
-
resolve(null);
|
|
16304
|
-
return;
|
|
16305
|
-
}
|
|
16306
|
-
// 返回缓存数据(即使超过 imageCacheTTL,只要未超过 maxCacheAge 仍可使用)
|
|
16307
|
-
resolve(result.dataUrl);
|
|
16308
|
-
}
|
|
16309
|
-
else {
|
|
16310
|
-
resolve(null);
|
|
16311
|
-
}
|
|
16312
|
-
};
|
|
16313
|
-
request.onerror = () => resolve(null);
|
|
16314
|
-
});
|
|
16315
|
-
}
|
|
16316
|
-
catch {
|
|
16317
|
-
return null;
|
|
16318
|
-
}
|
|
16319
|
-
}
|
|
16320
|
-
/**
|
|
16321
|
-
* 设置 IndexedDB 缓存(带大小和时间控制)
|
|
16322
|
-
*/
|
|
16323
|
-
async setIndexedDBCache(url, dataUrl) {
|
|
16324
|
-
if (!this.indexedDBReady || !this.indexedDBCache) {
|
|
16325
|
-
return;
|
|
16326
|
-
}
|
|
16327
|
-
try {
|
|
16328
|
-
// 计算当前缓存大小
|
|
16329
|
-
const currentSize = await this.getIndexedDBCacheSize();
|
|
16330
|
-
const newItemSize = this.estimateDataUrlSize(dataUrl);
|
|
16331
|
-
const maxSizeBytes = (this.options.maxCacheSize || 50) * 1024 * 1024; // 转换为字节
|
|
16332
|
-
// 如果添加新项后超过限制,清理最旧的数据
|
|
16333
|
-
if (currentSize + newItemSize > maxSizeBytes) {
|
|
16334
|
-
await this.cleanIndexedDBCacheBySize(maxSizeBytes - newItemSize);
|
|
16335
|
-
}
|
|
16336
|
-
const transaction = this.indexedDBCache.transaction(['images'], 'readwrite');
|
|
16337
|
-
const store = transaction.objectStore('images');
|
|
16338
|
-
store.put({ url, dataUrl, timestamp: Date.now() });
|
|
16339
|
-
}
|
|
16340
|
-
catch {
|
|
16341
|
-
// IndexedDB 写入失败,忽略
|
|
16342
|
-
}
|
|
16343
|
-
}
|
|
16344
16256
|
/**
|
|
16345
16257
|
* 估算 data URL 的大小(字节)
|
|
16346
16258
|
*/
|
|
@@ -16351,156 +16263,32 @@ class ScreenshotManager {
|
|
|
16351
16263
|
return Math.ceil(base64Data.length * 0.75) + 30;
|
|
16352
16264
|
}
|
|
16353
16265
|
/**
|
|
16354
|
-
* 获取 IndexedDB
|
|
16266
|
+
* 获取 IndexedDB 当前缓存大小(已移除,不再使用)
|
|
16267
|
+
* @deprecated IndexedDB 已移除,不再使用
|
|
16355
16268
|
*/
|
|
16356
16269
|
async getIndexedDBCacheSize() {
|
|
16357
|
-
|
|
16358
|
-
return 0;
|
|
16359
|
-
}
|
|
16360
|
-
try {
|
|
16361
|
-
const transaction = this.indexedDBCache.transaction(['images'], 'readonly');
|
|
16362
|
-
const store = transaction.objectStore('images');
|
|
16363
|
-
const request = store.getAll();
|
|
16364
|
-
return new Promise((resolve) => {
|
|
16365
|
-
request.onsuccess = () => {
|
|
16366
|
-
const items = request.result || [];
|
|
16367
|
-
let totalSize = 0;
|
|
16368
|
-
items.forEach((item) => {
|
|
16369
|
-
totalSize += this.estimateDataUrlSize(item.dataUrl);
|
|
16370
|
-
});
|
|
16371
|
-
resolve(totalSize);
|
|
16372
|
-
};
|
|
16373
|
-
request.onerror = () => resolve(0);
|
|
16374
|
-
});
|
|
16375
|
-
}
|
|
16376
|
-
catch {
|
|
16377
|
-
return 0;
|
|
16378
|
-
}
|
|
16270
|
+
return 0;
|
|
16379
16271
|
}
|
|
16380
16272
|
/**
|
|
16381
|
-
* 清理 IndexedDB
|
|
16273
|
+
* 清理 IndexedDB 缓存(已移除,不再使用)
|
|
16274
|
+
* @deprecated IndexedDB 已移除,不再使用
|
|
16382
16275
|
*/
|
|
16383
16276
|
async cleanIndexedDBCache() {
|
|
16384
|
-
|
|
16385
|
-
return;
|
|
16386
|
-
}
|
|
16387
|
-
try {
|
|
16388
|
-
const transaction = this.indexedDBCache.transaction(['images'], 'readwrite');
|
|
16389
|
-
const store = transaction.objectStore('images');
|
|
16390
|
-
const index = store.index('timestamp');
|
|
16391
|
-
const request = index.getAll();
|
|
16392
|
-
return new Promise((resolve) => {
|
|
16393
|
-
request.onsuccess = () => {
|
|
16394
|
-
const items = request.result || [];
|
|
16395
|
-
const now = Date.now();
|
|
16396
|
-
const expiredUrls = [];
|
|
16397
|
-
let currentSize = 0;
|
|
16398
|
-
const maxSizeBytes = (this.options.maxCacheSize || 50) * 1024 * 1024;
|
|
16399
|
-
// 按时间排序(最旧的在前)
|
|
16400
|
-
items.sort((a, b) => a.timestamp - b.timestamp);
|
|
16401
|
-
// 清理过期数据
|
|
16402
|
-
items.forEach((item) => {
|
|
16403
|
-
const age = now - item.timestamp;
|
|
16404
|
-
if (age > this.options.maxCacheAge) {
|
|
16405
|
-
expiredUrls.push(item.url);
|
|
16406
|
-
}
|
|
16407
|
-
else {
|
|
16408
|
-
currentSize += this.estimateDataUrlSize(item.dataUrl);
|
|
16409
|
-
}
|
|
16410
|
-
});
|
|
16411
|
-
// 如果仍然超过大小限制,删除最旧的数据
|
|
16412
|
-
const urlsToDelete = [...expiredUrls];
|
|
16413
|
-
if (currentSize > maxSizeBytes) {
|
|
16414
|
-
for (const item of items) {
|
|
16415
|
-
if (expiredUrls.includes(item.url))
|
|
16416
|
-
continue;
|
|
16417
|
-
currentSize -= this.estimateDataUrlSize(item.dataUrl);
|
|
16418
|
-
urlsToDelete.push(item.url);
|
|
16419
|
-
if (currentSize <= maxSizeBytes) {
|
|
16420
|
-
break;
|
|
16421
|
-
}
|
|
16422
|
-
}
|
|
16423
|
-
}
|
|
16424
|
-
// 删除过期和超大小的数据
|
|
16425
|
-
urlsToDelete.forEach((url) => {
|
|
16426
|
-
store.delete(url);
|
|
16427
|
-
});
|
|
16428
|
-
if (urlsToDelete.length > 0 && !this.options.silentMode) {
|
|
16429
|
-
console.log(`📸 IndexedDB 清理了 ${urlsToDelete.length} 个缓存项(过期或超大小)`);
|
|
16430
|
-
}
|
|
16431
|
-
resolve();
|
|
16432
|
-
};
|
|
16433
|
-
request.onerror = () => resolve();
|
|
16434
|
-
});
|
|
16435
|
-
}
|
|
16436
|
-
catch {
|
|
16437
|
-
// 清理失败,忽略
|
|
16438
|
-
}
|
|
16277
|
+
// IndexedDB 已移除,不再使用
|
|
16439
16278
|
}
|
|
16440
16279
|
/**
|
|
16441
|
-
* 按大小清理 IndexedDB
|
|
16280
|
+
* 按大小清理 IndexedDB 缓存(已移除,不再使用)
|
|
16281
|
+
* @deprecated IndexedDB 已移除,不再使用
|
|
16442
16282
|
*/
|
|
16443
|
-
async cleanIndexedDBCacheBySize(
|
|
16444
|
-
|
|
16445
|
-
return;
|
|
16446
|
-
}
|
|
16447
|
-
try {
|
|
16448
|
-
const transaction = this.indexedDBCache.transaction(['images'], 'readwrite');
|
|
16449
|
-
const store = transaction.objectStore('images');
|
|
16450
|
-
const index = store.index('timestamp');
|
|
16451
|
-
const request = index.getAll();
|
|
16452
|
-
return new Promise((resolve) => {
|
|
16453
|
-
request.onsuccess = () => {
|
|
16454
|
-
const items = request.result || [];
|
|
16455
|
-
// 按时间排序(最旧的在前)
|
|
16456
|
-
items.sort((a, b) => a.timestamp - b.timestamp);
|
|
16457
|
-
let currentSize = 0;
|
|
16458
|
-
const urlsToDelete = [];
|
|
16459
|
-
// 计算当前大小
|
|
16460
|
-
items.forEach((item) => {
|
|
16461
|
-
currentSize += this.estimateDataUrlSize(item.dataUrl);
|
|
16462
|
-
});
|
|
16463
|
-
// 如果超过目标大小,删除最旧的数据
|
|
16464
|
-
if (currentSize > targetSize) {
|
|
16465
|
-
for (const item of items) {
|
|
16466
|
-
if (currentSize <= targetSize) {
|
|
16467
|
-
break;
|
|
16468
|
-
}
|
|
16469
|
-
currentSize -= this.estimateDataUrlSize(item.dataUrl);
|
|
16470
|
-
urlsToDelete.push(item.url);
|
|
16471
|
-
}
|
|
16472
|
-
}
|
|
16473
|
-
// 删除数据
|
|
16474
|
-
urlsToDelete.forEach((url) => {
|
|
16475
|
-
store.delete(url);
|
|
16476
|
-
});
|
|
16477
|
-
if (urlsToDelete.length > 0 && !this.options.silentMode) {
|
|
16478
|
-
console.log(`📸 IndexedDB 清理了 ${urlsToDelete.length} 个缓存项(超过大小限制)`);
|
|
16479
|
-
}
|
|
16480
|
-
resolve();
|
|
16481
|
-
};
|
|
16482
|
-
request.onerror = () => resolve();
|
|
16483
|
-
});
|
|
16484
|
-
}
|
|
16485
|
-
catch {
|
|
16486
|
-
// 清理失败,忽略
|
|
16487
|
-
}
|
|
16283
|
+
async cleanIndexedDBCacheBySize(_targetSize) {
|
|
16284
|
+
// IndexedDB 已移除,不再使用
|
|
16488
16285
|
}
|
|
16489
16286
|
/**
|
|
16490
|
-
* 删除 IndexedDB
|
|
16287
|
+
* 删除 IndexedDB 缓存(已移除,不再使用)
|
|
16288
|
+
* @deprecated IndexedDB 已移除,不再使用
|
|
16491
16289
|
*/
|
|
16492
|
-
async deleteIndexedDBCache(
|
|
16493
|
-
|
|
16494
|
-
return;
|
|
16495
|
-
}
|
|
16496
|
-
try {
|
|
16497
|
-
const transaction = this.indexedDBCache.transaction(['images'], 'readwrite');
|
|
16498
|
-
const store = transaction.objectStore('images');
|
|
16499
|
-
store.delete(url);
|
|
16500
|
-
}
|
|
16501
|
-
catch {
|
|
16502
|
-
// 忽略错误
|
|
16503
|
-
}
|
|
16290
|
+
async deleteIndexedDBCache(_url) {
|
|
16291
|
+
// IndexedDB 已移除,不再使用
|
|
16504
16292
|
}
|
|
16505
16293
|
/**
|
|
16506
16294
|
* 检查元素是否在可视区域内(优化:使用 Intersection Observer 或 getBoundingClientRect)
|
|
@@ -16715,10 +16503,6 @@ class ScreenshotManager {
|
|
|
16715
16503
|
const dataUrl = await this.blobToDataUrl(blob);
|
|
16716
16504
|
// 缓存结果(带时间戳,10分钟有效)
|
|
16717
16505
|
this.setCachedImage(url, dataUrl);
|
|
16718
|
-
// 如果启用 IndexedDB,也保存到 IndexedDB
|
|
16719
|
-
if (this.options.useIndexedDB) {
|
|
16720
|
-
await this.setIndexedDBCache(url, dataUrl);
|
|
16721
|
-
}
|
|
16722
16506
|
return dataUrl;
|
|
16723
16507
|
}
|
|
16724
16508
|
// 如果下载失败,返回原 URL,让 modern-screenshot 自己处理
|
|
@@ -17748,12 +17532,7 @@ class ScreenshotManager {
|
|
|
17748
17532
|
this.intersectionObserver = null;
|
|
17749
17533
|
this.visibleElementsCache.clear();
|
|
17750
17534
|
}
|
|
17751
|
-
//
|
|
17752
|
-
if (this.indexedDBCache) {
|
|
17753
|
-
this.indexedDBCache.close();
|
|
17754
|
-
this.indexedDBCache = null;
|
|
17755
|
-
this.indexedDBReady = false;
|
|
17756
|
-
}
|
|
17535
|
+
// IndexedDB 已移除,不再使用
|
|
17757
17536
|
// 清理图片代理缓存
|
|
17758
17537
|
this.imageProxyCache.clear();
|
|
17759
17538
|
// 清理截图历史记录(释放大量内存)
|
|
@@ -17842,12 +17621,6 @@ class ScreenshotManager {
|
|
|
17842
17621
|
// 每2分钟清理一次过期缓存(从5分钟改为2分钟,更频繁)
|
|
17843
17622
|
setInterval(() => {
|
|
17844
17623
|
this.cleanExpiredCache();
|
|
17845
|
-
// 如果启用 IndexedDB,也清理 IndexedDB 缓存
|
|
17846
|
-
if (this.options.useIndexedDB) {
|
|
17847
|
-
this.cleanIndexedDBCache().catch(() => {
|
|
17848
|
-
// 清理失败,忽略
|
|
17849
|
-
});
|
|
17850
|
-
}
|
|
17851
17624
|
if (!this.options.silentMode) {
|
|
17852
17625
|
const memoryCacheSize = this.imageProxyCache.size;
|
|
17853
17626
|
const memoryCacheSizeMB = Array.from(this.imageProxyCache.values())
|