@lynker-desktop/electron-sdk 0.0.9-alpha.52 → 0.0.9-alpha.54

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.
@@ -1 +1 @@
1
- {"version":3,"file":"resource-cache.d.ts","sourceRoot":"","sources":["../../src/main/resource-cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource-cache.d.ts","sourceRoot":"","sources":["../../src/main/resource-cache.ts"],"names":[],"mappings":"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"}
@@ -93,19 +93,34 @@ class ResourceCache {
93
93
  console.log('初始化时清理过期缓存失败:', err);
94
94
  });
95
95
  ipc__default.mainIPC.handleRenderer('core:cache', async (options) => {
96
- if (options.type === 'clear') {
97
- return await this.clearCache();
98
- }
99
- if (options.type === 'add') {
100
- return await this.addCacheUrls(options.urls ?? [], options.force ?? false, true);
101
- }
102
- if (options.type === 'delete') {
103
- return await this.deleteCacheUrls(options.urls ?? []);
96
+ try {
97
+ if (options.method === 'clear') {
98
+ return await this.clearCache();
99
+ }
100
+ if (options.method === 'add') {
101
+ if (typeof options.urls === 'string') {
102
+ const data = await this.addCacheUrls([options.urls], options.force ?? false, true);
103
+ return data[0];
104
+ }
105
+ const data = await this.addCacheUrls(options.urls ?? [], options.force ?? false, true);
106
+ return data;
107
+ }
108
+ if (options.method === 'delete') {
109
+ if (typeof options.urls === 'string') {
110
+ const data = await this.deleteCacheUrls([options.urls]);
111
+ return data[0];
112
+ }
113
+ const data = await this.deleteCacheUrls(options.urls ?? []);
114
+ return data;
115
+ }
116
+ if (options.method === 'stats') {
117
+ return await this.getCacheStats();
118
+ }
119
+ return undefined;
104
120
  }
105
- if (options.type === 'stats') {
106
- return await this.getCacheStats();
121
+ catch (error) {
122
+ return { success: false, error: error instanceof Error ? error.message : '未知错误' };
107
123
  }
108
- return undefined;
109
124
  });
110
125
  }
111
126
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"resource-cache.js","sources":["../../src/main/resource-cache.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport http from 'node:http';\nimport https from 'node:https';\nimport md5 from 'md5';\nimport ipc from '@lynker-desktop/electron-ipc/main';\n\n/**\n * MIME 类型到文件扩展名的映射表\n */\nconst MIME_TO_EXT: Record<string, string> = {\n 'image/png': 'png',\n 'image/jpeg': 'jpeg',\n 'image/jpg': 'jpg',\n 'image/gif': 'gif',\n 'image/webp': 'webp',\n 'image/svg+xml': 'svg',\n 'image/x-icon': 'ico',\n 'image/bmp': 'bmp',\n 'image/avif': 'avif',\n 'image/heic': 'heic',\n 'image/heif': 'heif',\n 'image/tiff': 'tiff',\n 'font/woff': 'woff',\n 'font/woff2': 'woff2',\n 'font/ttf': 'ttf',\n 'font/otf': 'otf',\n 'application/font-woff': 'woff',\n 'application/font-woff2': 'woff2',\n 'video/mp4': 'mp4',\n 'video/webm': 'webm',\n 'video/ogg': 'ogg',\n 'audio/mpeg': 'mp3',\n 'audio/wav': 'wav',\n 'text/css': 'css',\n 'text/javascript': 'js',\n 'application/javascript': 'js',\n 'application/json': 'json',\n 'text/xml': 'xml',\n 'text/plain': 'txt',\n 'application/pdf': 'pdf',\n};\n\n/**\n * 资源缓存配置项\n */\nexport interface ResourceCacheOptions {\n /** 缓存目录,必填 */\n cacheDir: string;\n /** 缓存有效期(毫秒),默认24小时 */\n cacheTTL?: number;\n /** 匹配需要缓存的资源,支持正则或函数 */\n match?: RegExp | ((url: string) => boolean);\n /** 允许缓存的资源来源,支持null/数组/函数 */\n allowedOrigins?: null | string[] | ((url: string) => boolean);\n}\n\n/**\n * 默认配置\n */\nconst DEFAULT_OPTIONS: Required<Omit<ResourceCacheOptions, 'cacheDir'>> & { cacheDir: string } = {\n cacheDir: '',\n cacheTTL: 24 * 60 * 60 * 1000,\n // 图片格式:png, jpg/jpeg, webp, gif, svg, ico, bmp, avif, heic, heif, tiff, tif\n // 字体格式:woff, woff2, ttf, eot, otf\n // 视频格式:mp4, webm, ogg, mov, avi, mkv, flv, m4v, 3gp\n // 音频格式:mp3, wav, aac, m4a, flac, opus, wma\n // 样式和脚本:css, js, json, xml, txt\n // Web资源:wasm, map (source map)\n // 文档格式:pdf\n // 压缩文件:zip, 7z, rar, tar, gz, bz2\n match: /\\.(png|jpe?g|webp|gif|svg|ico|bmp|avif|heic|heif|tiff?|woff2?|ttf|eot|otf|mp4|webm|ogg|mov|avi|mkv|flv|m4v|3gp|mp3|wav|aac|m4a|flac|opus|wma|css|js|json|xml|txt|wasm|map|pdf|zip|7z|rar|tar|gz|bz2)(\\?.*)?$/i,\n allowedOrigins: null,\n};\n\n/**\n * 资源缓存类:拦截并缓存静态资源,提升加载性能\n */\nexport class ResourceCache {\n static scheme = 'cachefile';\n private cacheHost: string = `${ResourceCache.scheme}://-`;\n /** Electron session 实例 */\n private session: Electron.Session;\n /** 缓存配置 */\n private options: Required<ResourceCacheOptions>;\n /** 缓存的匹配函数(避免重复创建) */\n private _cachedMatchFunction?: (url: string) => boolean;\n /** 缓存的来源校验函数(避免重复创建) */\n private _cachedOriginFunction?: (url: string) => boolean;\n\n /**\n * 构造函数\n * @param session Electron session\n * @param options 缓存配置\n */\n constructor(session: Electron.Session, options: ResourceCacheOptions) {\n if (!session) throw new Error('ResourceCache: session is required');\n this.session = session;\n // 合并配置,保证类型安全\n this.options = {\n ...DEFAULT_OPTIONS,\n ...options,\n cacheDir: options.cacheDir,\n cacheTTL: options.cacheTTL ?? DEFAULT_OPTIONS.cacheTTL,\n match: options.match ?? DEFAULT_OPTIONS.match,\n allowedOrigins: options.allowedOrigins ?? DEFAULT_OPTIONS.allowedOrigins,\n };\n\n if (!this.options.cacheDir) {\n throw new Error('ResourceCache: cacheDir is required');\n }\n\n // 确保缓存目录存在\n if (!fs.existsSync(this.options.cacheDir)) {\n fs.mkdirSync(this.options.cacheDir, { recursive: true });\n }\n\n this._registerInterceptor();\n // 异步清理过期缓存,不阻塞初始化\n this._cleanOldCache().catch(err => {\n console.log('初始化时清理过期缓存失败:', err);\n });\n\n ipc.mainIPC.handleRenderer('core:cache', async (options: { type: 'add' | 'delete' | 'clear' | 'stats', urls?: string[], force?: boolean }) => {\n if (options.type === 'clear') {\n return await this.clearCache();\n }\n if (options.type === 'add') {\n return await this.addCacheUrls(options.urls ?? [], options.force ?? false, true);\n }\n if (options.type === 'delete') {\n return await this.deleteCacheUrls(options.urls ?? []);\n }\n if (options.type === 'stats') {\n return await this.getCacheStats();\n }\n return undefined;\n });\n }\n\n /**\n * 获取缓存统计信息(异步版本,性能更好)\n */\n public async getCacheStats(): Promise<{ size: number, totalSize: number }> {\n try {\n const files = await fs.promises.readdir(this.options.cacheDir);\n if (files.length === 0) {\n return { size: 0, totalSize: 0 };\n }\n\n // 并行获取文件信息,提升性能\n const fileInfos = await Promise.allSettled(\n files.map(async (file) => {\n const filePath = path.join(this.options.cacheDir, file);\n try {\n const stats = await fs.promises.stat(filePath);\n return { file, filePath, size: stats.size };\n } catch (error) {\n return { file, filePath, size: 0, error };\n }\n })\n );\n\n const validInfos = fileInfos\n .filter((r): r is PromiseFulfilledResult<{ file: string; filePath: string; size: number; error?: any }> => r.status === 'fulfilled')\n .map(r => r.value);\n\n return {\n size: validInfos.length,\n totalSize: validInfos.reduce((sum, info) => sum + info.size, 0)\n };\n } catch (error) {\n console.log('获取缓存统计信息失败:', error);\n return { size: 0, totalSize: 0 };\n }\n }\n\n /**\n * 获取资源匹配函数(带缓存,避免重复创建)\n */\n private _getMatchFunction(): (url: string) => boolean {\n if (this._cachedMatchFunction) {\n return this._cachedMatchFunction;\n }\n\n const matcher = this.options.match;\n if (typeof matcher === 'function') {\n this._cachedMatchFunction = matcher;\n } else if (matcher instanceof RegExp) {\n this._cachedMatchFunction = (url: string) => matcher.test(url);\n } else {\n this._cachedMatchFunction = () => false;\n }\n\n return this._cachedMatchFunction;\n }\n\n /**\n * 获取来源校验函数(带缓存,避免重复创建)\n */\n private _getOriginAllowFunction(): (url: string) => boolean {\n if (this._cachedOriginFunction) {\n return this._cachedOriginFunction;\n }\n\n const origins = this.options.allowedOrigins;\n if (!origins) {\n this._cachedOriginFunction = () => true;\n } else if (typeof origins === 'function') {\n this._cachedOriginFunction = origins;\n } else {\n const prefixList = origins.map(o => o.toLowerCase());\n this._cachedOriginFunction = (url: string) => {\n try {\n const origin = new URL(url).origin.toLowerCase();\n return prefixList.some(prefix => origin.startsWith(prefix));\n } catch {\n return false;\n }\n };\n }\n\n return this._cachedOriginFunction;\n }\n\n /**\n * 获取缓存文件路径\n * @param url 资源URL\n * @param customExt 自定义文件扩展名(可选,用于 base64 URL)\n */\n public getCachedPath(url: string, customExt?: string): { filePath: string, hostPath: string } {\n const md5Str = md5(url);\n let ext = '.res';\n\n if (customExt) {\n // 如果提供了自定义扩展名,使用它\n ext = customExt.startsWith('.') ? customExt : `.${customExt}`;\n } else {\n // 尝试从 URL 中提取扩展名\n try {\n const urlObj = new URL(url);\n ext = path.extname(urlObj.pathname) || '.res';\n } catch {\n // 如果 URL 解析失败(可能是 base64 data URL),使用默认扩展名\n ext = '.res';\n }\n }\n\n return {\n filePath: path.join(this.options.cacheDir, `${md5Str}${ext}`),\n hostPath: `${this.cacheHost}/${md5Str}${ext}`,\n }\n }\n\n /**\n * 判断缓存是否有效(同步版本,用于拦截器)\n * @param filePath 缓存文件路径\n */\n public isCacheValid(filePath: string): boolean {\n try {\n if (!fs.existsSync(filePath)) return false;\n const stat = fs.statSync(filePath);\n return Date.now() - stat.mtimeMs < this.options.cacheTTL;\n } catch {\n return false;\n }\n }\n\n /**\n * 判断缓存是否有效(异步版本,性能更好)\n * @param filePath 缓存文件路径\n */\n public async isCacheValidAsync(filePath: string): Promise<boolean> {\n try {\n const stat = await fs.promises.stat(filePath);\n return Date.now() - stat.mtimeMs < this.options.cacheTTL;\n } catch {\n return false;\n }\n }\n\n /**\n * 下载资源到本地缓存(异步版本,返回 Promise)\n * @param url 资源URL\n * @param filePath 本地缓存路径\n * @returns Promise<void> 下载完成或失败\n */\n public downloadResourceAsync(url: string, filePath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const tempFilePath = `${filePath}.cache`;\n const lib = url.startsWith('https') ? https : http;\n const file = fs.createWriteStream(tempFilePath);\n let request: http.ClientRequest;\n\n const cleanupAndAbort = (errMsg: string, err?: any) => {\n if (err) {\n console.log(errMsg, err);\n } else {\n console.log(errMsg);\n }\n if (request) {\n request.destroy();\n }\n file.close(() => {\n // 使用 existsSync 避免在文件不存在时 unlink 抛出错误\n if (fs.existsSync(tempFilePath)) {\n fs.unlink(tempFilePath, () => {});\n }\n });\n reject(new Error(errMsg));\n };\n\n request = lib.get(url, (res: http.IncomingMessage) => {\n // 处理重定向\n if (res.statusCode === 301 || res.statusCode === 302 || res.statusCode === 307 || res.statusCode === 308) {\n const location = res.headers.location;\n if (location) {\n request.destroy();\n file.close(() => {\n if (fs.existsSync(tempFilePath)) {\n fs.unlink(tempFilePath, () => {});\n }\n });\n // 递归处理重定向\n this.downloadResourceAsync(location, filePath).then(resolve).catch(reject);\n return;\n }\n // 如果没有 location,继续处理为错误\n }\n\n if (res.statusCode !== 200) {\n res.resume(); // 消费响应数据以释放内存\n cleanupAndAbort(`下载失败,状态码: ${res.statusCode} for ${url}`);\n return;\n }\n res.pipe(file);\n });\n\n file.on('finish', () => {\n file.close((err) => {\n if (err) {\n return cleanupAndAbort(`关闭临时文件流失败: ${tempFilePath}`, err);\n }\n fs.rename(tempFilePath, filePath, (renameErr) => {\n if (renameErr) {\n cleanupAndAbort(`缓存文件重命名失败 from ${tempFilePath} to ${filePath}`, renameErr);\n } else {\n resolve();\n }\n });\n });\n });\n\n file.on('error', (err) => {\n cleanupAndAbort(`写入临时文件失败: ${tempFilePath}`, err);\n });\n\n request.on('error', (err) => {\n cleanupAndAbort(`下载资源请求失败: ${url}`, err);\n });\n });\n }\n\n /**\n * 下载资源到本地缓存(同步版本,不返回 Promise,用于拦截器)\n * @param url 资源URL\n * @param filePath 本地缓存路径\n */\n public downloadResource(url: string, filePath: string): void {\n // 异步执行,不等待完成\n this.downloadResourceAsync(url, filePath).catch((err) => {\n console.log('后台下载资源失败:', err);\n });\n }\n\n /**\n * 检测并处理 base64 data URL\n * @param url 资源URL\n * @returns 如果是 base64 URL,返回 true 和文件扩展名;否则返回 false\n */\n private _isBase64DataUrl(url: string): { isBase64: boolean, ext?: string, data?: string } {\n if (!url.startsWith('data:')) {\n return { isBase64: false };\n }\n\n try {\n // 解析 data URL 格式:data:[<mediatype>][;base64],<data>\n const commaIndex = url.indexOf(',');\n if (commaIndex === -1) {\n return { isBase64: false };\n }\n\n const header = url.substring(0, commaIndex);\n const data = url.substring(commaIndex + 1);\n\n // 检查是否包含 base64 标识\n if (!header.includes('base64')) {\n return { isBase64: false };\n }\n\n // 从 mediatype 中提取文件扩展名\n // 例如:data:image/png;base64 -> png\n // 例如:data:image/jpeg;base64 -> jpeg\n let ext = 'res';\n const mimeMatch = header.match(/data:([^;]+)/);\n if (mimeMatch && mimeMatch[1]) {\n const mimeType = mimeMatch[1];\n ext = MIME_TO_EXT[mimeType] || ext;\n }\n\n return { isBase64: true, ext, data };\n } catch (error) {\n return { isBase64: false };\n }\n }\n\n /**\n * 保存 base64 数据到文件\n * @param base64Data base64 编码的数据\n * @param filePath 目标文件路径\n */\n private async _saveBase64ToFile(base64Data: string, filePath: string): Promise<void> {\n try {\n // 解码 base64 数据\n const buffer = Buffer.from(base64Data, 'base64');\n\n // 使用 Promise 版本的 writeFile\n // Buffer 继承自 Uint8Array,可以直接使用\n await fs.promises.writeFile(filePath, buffer as Uint8Array);\n } catch (error) {\n throw new Error(`保存 base64 文件失败: ${error instanceof Error ? error.message : '未知错误'}`);\n }\n }\n\n /**\n * 手动缓存指定 URL 的资源\n * @param url 要缓存的资源 URL(支持普通 URL 和 base64 data URL)\n * @param force 是否强制重新下载,即使缓存有效(默认 false)\n * @returns Promise<{ filePath: string, hostPath: string }> 返回缓存文件路径和主机路径\n * @throws 如果 URL 不匹配缓存规则或来源不允许,会抛出错误\n */\n public async cacheUrl(url: string, force: boolean = false, ignoreOrigin: boolean = false): Promise<{ filePath: string, hostPath: string }> {\n // 检查是否是 base64 data URL\n const base64Info = this._isBase64DataUrl(url);\n\n if (base64Info.isBase64) {\n // 处理 base64 data URL\n if (!base64Info.data || !base64Info.ext) {\n throw new Error(`无效的 base64 data URL: ${url}`);\n }\n\n // 获取缓存路径(使用检测到的扩展名)\n const cachePath = this.getCachedPath(url, base64Info.ext);\n\n // 如果缓存有效且不强制重新下载,直接返回\n if (!force && await this.isCacheValidAsync(cachePath.filePath)) {\n return cachePath;\n }\n\n // 保存 base64 数据到文件\n await this._saveBase64ToFile(base64Info.data, cachePath.filePath);\n\n return cachePath;\n }\n\n // 处理普通 URL\n const shouldCache = this._getMatchFunction();\n const isAllowedOrigin = ignoreOrigin ? () => true : this._getOriginAllowFunction();\n\n // 检查是否匹配缓存规则\n if (!shouldCache(url)) {\n throw new Error(`URL 不匹配缓存规则: ${url}`);\n }\n\n // 检查来源是否允许\n if (!isAllowedOrigin(url)) {\n throw new Error(`URL 来源不允许缓存: ${url}`);\n }\n\n // 获取缓存路径\n const cachePath = this.getCachedPath(url);\n\n // 如果缓存有效且不强制重新下载,直接返回\n if (!force && await this.isCacheValidAsync(cachePath.filePath)) {\n return cachePath;\n }\n\n // 下载资源\n await this.downloadResourceAsync(url, cachePath.filePath);\n\n return cachePath;\n }\n\n /**\n * 批量缓存多个 URL 的资源\n * @param urls 要缓存的资源 URL 数组\n * @param force 是否强制重新下载,即使缓存有效(默认 false)\n * @returns Promise<Array<{ url: string, success: boolean, filePath?: string, hostPath?: string, error?: string }>> 返回每个 URL 的缓存结果\n */\n public async addCacheUrls(urls: string[], force: boolean = false, ignoreOrigin: boolean = false): Promise<Array<{ url: string, success: boolean, filePath?: string, hostPath?: string, error?: string }>> {\n const results = await Promise.allSettled(\n urls.map(url => this.cacheUrl(url, force, ignoreOrigin))\n );\n\n return results.map((result, index) => {\n const url = urls[index] || '';\n if (result.status === 'fulfilled') {\n return {\n url,\n success: true,\n filePath: result.value.filePath,\n hostPath: result.value.hostPath\n };\n } else {\n return {\n url,\n success: false,\n error: result.reason?.message || '未知错误'\n };\n }\n });\n }\n\n /**\n * 删除多个 URL 的资源\n * @param urls 要删除的资源 URL 数组\n * @returns Promise<Array<{ url: string, success: boolean, error?: string }>> 返回每个 URL 的删除结果\n */\n public async deleteCacheUrls(urls: string[]): Promise<Array<{ url: string, success: boolean, error?: string }>> {\n const results = await Promise.allSettled(\n urls.map(url => this.deleteUrl(url))\n );\n return results.map((result, index) => {\n const url = urls[index] || '';\n if (result.status === 'fulfilled') {\n return { url, success: true };\n } else {\n return { url, success: false, error: result.reason?.message || '未知错误' };\n }\n });\n }\n\n /**\n * 删除单个 URL 的资源(异步版本,性能更好)\n * @param url 要删除的资源 URL\n * @returns Promise<{ url: string, success: boolean, error?: string }> 返回删除结果\n */\n public async deleteUrl(url: string): Promise<{ url: string, success: boolean, error?: string }> {\n try {\n const cachePath = this.getCachedPath(url);\n try {\n await fs.promises.unlink(cachePath.filePath);\n return { url, success: true };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return { url, success: false, error: '文件不存在' };\n }\n throw error;\n }\n } catch (error) {\n return {\n url,\n success: false,\n error: error instanceof Error ? error.message : '未知错误'\n };\n }\n }\n\n /**\n * 删除单个 URL 的资源(别名,保持向后兼容)\n * @deprecated 使用 deleteUrl 代替\n */\n public async deleteCache(url: string): Promise<{ url: string, success: boolean, error?: string }> {\n return this.deleteUrl(url);\n }\n\n /**\n * 清理过期缓存文件(异步并行处理,性能更好)\n */\n private async _cleanOldCache(): Promise<void> {\n try {\n const files = await fs.promises.readdir(this.options.cacheDir);\n if (files.length === 0) return;\n\n const now = Date.now();\n // 并行处理,提升性能\n await Promise.allSettled(\n files.map(async (file) => {\n const fullPath = path.join(this.options.cacheDir, file);\n try {\n const stat = await fs.promises.stat(fullPath);\n if (now - stat.mtimeMs > this.options.cacheTTL) {\n await fs.promises.unlink(fullPath);\n }\n } catch {\n // 忽略单个文件异常\n }\n })\n );\n } catch (error) {\n // 忽略目录读取错误\n console.log('清理过期缓存时发生错误:', error);\n }\n }\n\n /**\n * 清理所有缓存文件\n * @returns Promise<{ success: number, failed: number, totalSize: number }> 返回清理统计信息\n */\n public async clearCache(): Promise<{ success: number, failed: number, totalSize: number }> {\n try {\n const files = fs.readdirSync(this.options.cacheDir);\n if (files.length === 0) {\n console.log('缓存目录为空,无需清理');\n return { success: 0, failed: 0, totalSize: 0 };\n }\n\n // 先统计所有文件大小(避免并行时的竞态条件)\n const fileInfos = files.map((file) => {\n const filePath = path.join(this.options.cacheDir, file);\n try {\n const stats = fs.statSync(filePath);\n return { file, filePath, size: stats.size };\n } catch (error) {\n return { file, filePath, size: 0, error };\n }\n });\n\n // 计算总大小\n const totalSize = fileInfos.reduce((sum, info) => sum + info.size, 0);\n\n // 并行删除文件,提升性能\n const deleteResults = await Promise.allSettled(\n fileInfos.map(async (info) => {\n try {\n await fs.promises.unlink(info.filePath);\n return { success: true, file: info.file };\n } catch (error) {\n console.log(`清理缓存文件失败: ${info.file}`, error);\n throw error;\n }\n })\n );\n\n // 统计成功和失败数量\n const success = deleteResults.filter(r => r.status === 'fulfilled').length;\n const failed = deleteResults.filter(r => r.status === 'rejected').length;\n\n const sizeMB = (totalSize / (1024 * 1024)).toFixed(2);\n console.log(`缓存清理完成: 成功 ${success} 个, 失败 ${failed} 个, 释放空间 ${sizeMB} MB`);\n\n return { success, failed, totalSize };\n } catch (error) {\n console.log('清理缓存时发生错误:', error);\n throw error;\n }\n }\n\n /**\n * 注册 Electron 请求拦截器,实现资源缓存\n */\n private _registerInterceptor(): void {\n const shouldCache = this._getMatchFunction();\n const isAllowedOrigin = this._getOriginAllowFunction();\n\n this.session.webRequest.onBeforeRequest(\n { urls: ['http://*/*', 'https://*/*'] },\n (details: Electron.OnBeforeRequestListenerDetails, callback: (response: Electron.CallbackResponse) => void) => {\n const url = details.url;\n // 不匹配或来源不允许,直接放行\n if (details.method !== 'GET' || !shouldCache(url) || !isAllowedOrigin(url)) return callback({});\n\n const cachePath = this.getCachedPath(url);\n\n // 命中缓存,直接重定向到本地文件\n if (this.isCacheValid(cachePath.filePath)) {\n return callback({ redirectURL: cachePath.hostPath});\n }\n // 未命中则异步下载,当前请求正常放行\n this.downloadResource(url, cachePath.filePath);\n return callback({});\n }\n );\n }\n}\n\n"],"names":["ipc"],"mappings":"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"}
1
+ {"version":3,"file":"resource-cache.js","sources":["../../src/main/resource-cache.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport http from 'node:http';\nimport https from 'node:https';\nimport md5 from 'md5';\nimport ipc from '@lynker-desktop/electron-ipc/main';\n\n/**\n * MIME 类型到文件扩展名的映射表\n */\nconst MIME_TO_EXT: Record<string, string> = {\n 'image/png': 'png',\n 'image/jpeg': 'jpeg',\n 'image/jpg': 'jpg',\n 'image/gif': 'gif',\n 'image/webp': 'webp',\n 'image/svg+xml': 'svg',\n 'image/x-icon': 'ico',\n 'image/bmp': 'bmp',\n 'image/avif': 'avif',\n 'image/heic': 'heic',\n 'image/heif': 'heif',\n 'image/tiff': 'tiff',\n 'font/woff': 'woff',\n 'font/woff2': 'woff2',\n 'font/ttf': 'ttf',\n 'font/otf': 'otf',\n 'application/font-woff': 'woff',\n 'application/font-woff2': 'woff2',\n 'video/mp4': 'mp4',\n 'video/webm': 'webm',\n 'video/ogg': 'ogg',\n 'audio/mpeg': 'mp3',\n 'audio/wav': 'wav',\n 'text/css': 'css',\n 'text/javascript': 'js',\n 'application/javascript': 'js',\n 'application/json': 'json',\n 'text/xml': 'xml',\n 'text/plain': 'txt',\n 'application/pdf': 'pdf',\n};\n\n/**\n * 资源缓存配置项\n */\nexport interface ResourceCacheOptions {\n /** 缓存目录,必填 */\n cacheDir: string;\n /** 缓存有效期(毫秒),默认24小时 */\n cacheTTL?: number;\n /** 匹配需要缓存的资源,支持正则或函数 */\n match?: RegExp | ((url: string) => boolean);\n /** 允许缓存的资源来源,支持null/数组/函数 */\n allowedOrigins?: null | string[] | ((url: string) => boolean);\n}\n\n/**\n * 默认配置\n */\nconst DEFAULT_OPTIONS: Required<Omit<ResourceCacheOptions, 'cacheDir'>> & { cacheDir: string } = {\n cacheDir: '',\n cacheTTL: 24 * 60 * 60 * 1000,\n // 图片格式:png, jpg/jpeg, webp, gif, svg, ico, bmp, avif, heic, heif, tiff, tif\n // 字体格式:woff, woff2, ttf, eot, otf\n // 视频格式:mp4, webm, ogg, mov, avi, mkv, flv, m4v, 3gp\n // 音频格式:mp3, wav, aac, m4a, flac, opus, wma\n // 样式和脚本:css, js, json, xml, txt\n // Web资源:wasm, map (source map)\n // 文档格式:pdf\n // 压缩文件:zip, 7z, rar, tar, gz, bz2\n match: /\\.(png|jpe?g|webp|gif|svg|ico|bmp|avif|heic|heif|tiff?|woff2?|ttf|eot|otf|mp4|webm|ogg|mov|avi|mkv|flv|m4v|3gp|mp3|wav|aac|m4a|flac|opus|wma|css|js|json|xml|txt|wasm|map|pdf|zip|7z|rar|tar|gz|bz2)(\\?.*)?$/i,\n allowedOrigins: null,\n};\n\n/**\n * 资源缓存类:拦截并缓存静态资源,提升加载性能\n */\nexport class ResourceCache {\n static scheme = 'cachefile';\n private cacheHost: string = `${ResourceCache.scheme}://-`;\n /** Electron session 实例 */\n private session: Electron.Session;\n /** 缓存配置 */\n private options: Required<ResourceCacheOptions>;\n /** 缓存的匹配函数(避免重复创建) */\n private _cachedMatchFunction?: (url: string) => boolean;\n /** 缓存的来源校验函数(避免重复创建) */\n private _cachedOriginFunction?: (url: string) => boolean;\n\n /**\n * 构造函数\n * @param session Electron session\n * @param options 缓存配置\n */\n constructor(session: Electron.Session, options: ResourceCacheOptions) {\n if (!session) throw new Error('ResourceCache: session is required');\n this.session = session;\n // 合并配置,保证类型安全\n this.options = {\n ...DEFAULT_OPTIONS,\n ...options,\n cacheDir: options.cacheDir,\n cacheTTL: options.cacheTTL ?? DEFAULT_OPTIONS.cacheTTL,\n match: options.match ?? DEFAULT_OPTIONS.match,\n allowedOrigins: options.allowedOrigins ?? DEFAULT_OPTIONS.allowedOrigins,\n };\n\n if (!this.options.cacheDir) {\n throw new Error('ResourceCache: cacheDir is required');\n }\n\n // 确保缓存目录存在\n if (!fs.existsSync(this.options.cacheDir)) {\n fs.mkdirSync(this.options.cacheDir, { recursive: true });\n }\n\n this._registerInterceptor();\n // 异步清理过期缓存,不阻塞初始化\n this._cleanOldCache().catch(err => {\n console.log('初始化时清理过期缓存失败:', err);\n });\n\n ipc.mainIPC.handleRenderer('core:cache', async (options: { method: 'add' | 'delete' | 'clear' | 'stats', urls?: string | string[], force?: boolean }) => {\n try {\n if (options.method === 'clear') {\n return await this.clearCache();\n }\n if (options.method === 'add') {\n if ( typeof options.urls === 'string') {\n const data = await this.addCacheUrls([options.urls], options.force ?? false, true);\n return data[0];\n }\n const data = await this.addCacheUrls(options.urls ?? [], options.force ?? false, true);\n return data;\n }\n if (options.method === 'delete') {\n if ( typeof options.urls === 'string') {\n const data = await this.deleteCacheUrls([options.urls]);\n return data[0];\n }\n const data = await this.deleteCacheUrls(options.urls ?? []);\n return data;\n }\n if (options.method === 'stats') {\n return await this.getCacheStats();\n }\n return undefined;\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : '未知错误' };\n }\n });\n }\n\n /**\n * 获取缓存统计信息(异步版本,性能更好)\n */\n public async getCacheStats(): Promise<{ size: number, totalSize: number }> {\n try {\n const files = await fs.promises.readdir(this.options.cacheDir);\n if (files.length === 0) {\n return { size: 0, totalSize: 0 };\n }\n\n // 并行获取文件信息,提升性能\n const fileInfos = await Promise.allSettled(\n files.map(async (file) => {\n const filePath = path.join(this.options.cacheDir, file);\n try {\n const stats = await fs.promises.stat(filePath);\n return { file, filePath, size: stats.size };\n } catch (error) {\n return { file, filePath, size: 0, error };\n }\n })\n );\n\n const validInfos = fileInfos\n .filter((r): r is PromiseFulfilledResult<{ file: string; filePath: string; size: number; error?: any }> => r.status === 'fulfilled')\n .map(r => r.value);\n\n return {\n size: validInfos.length,\n totalSize: validInfos.reduce((sum, info) => sum + info.size, 0)\n };\n } catch (error) {\n console.log('获取缓存统计信息失败:', error);\n return { size: 0, totalSize: 0 };\n }\n }\n\n /**\n * 获取资源匹配函数(带缓存,避免重复创建)\n */\n private _getMatchFunction(): (url: string) => boolean {\n if (this._cachedMatchFunction) {\n return this._cachedMatchFunction;\n }\n\n const matcher = this.options.match;\n if (typeof matcher === 'function') {\n this._cachedMatchFunction = matcher;\n } else if (matcher instanceof RegExp) {\n this._cachedMatchFunction = (url: string) => matcher.test(url);\n } else {\n this._cachedMatchFunction = () => false;\n }\n\n return this._cachedMatchFunction;\n }\n\n /**\n * 获取来源校验函数(带缓存,避免重复创建)\n */\n private _getOriginAllowFunction(): (url: string) => boolean {\n if (this._cachedOriginFunction) {\n return this._cachedOriginFunction;\n }\n\n const origins = this.options.allowedOrigins;\n if (!origins) {\n this._cachedOriginFunction = () => true;\n } else if (typeof origins === 'function') {\n this._cachedOriginFunction = origins;\n } else {\n const prefixList = origins.map(o => o.toLowerCase());\n this._cachedOriginFunction = (url: string) => {\n try {\n const origin = new URL(url).origin.toLowerCase();\n return prefixList.some(prefix => origin.startsWith(prefix));\n } catch {\n return false;\n }\n };\n }\n\n return this._cachedOriginFunction;\n }\n\n /**\n * 获取缓存文件路径\n * @param url 资源URL\n * @param customExt 自定义文件扩展名(可选,用于 base64 URL)\n */\n public getCachedPath(url: string, customExt?: string): { filePath: string, hostPath: string } {\n const md5Str = md5(url);\n let ext = '.res';\n\n if (customExt) {\n // 如果提供了自定义扩展名,使用它\n ext = customExt.startsWith('.') ? customExt : `.${customExt}`;\n } else {\n // 尝试从 URL 中提取扩展名\n try {\n const urlObj = new URL(url);\n ext = path.extname(urlObj.pathname) || '.res';\n } catch {\n // 如果 URL 解析失败(可能是 base64 data URL),使用默认扩展名\n ext = '.res';\n }\n }\n\n return {\n filePath: path.join(this.options.cacheDir, `${md5Str}${ext}`),\n hostPath: `${this.cacheHost}/${md5Str}${ext}`,\n }\n }\n\n /**\n * 判断缓存是否有效(同步版本,用于拦截器)\n * @param filePath 缓存文件路径\n */\n public isCacheValid(filePath: string): boolean {\n try {\n if (!fs.existsSync(filePath)) return false;\n const stat = fs.statSync(filePath);\n return Date.now() - stat.mtimeMs < this.options.cacheTTL;\n } catch {\n return false;\n }\n }\n\n /**\n * 判断缓存是否有效(异步版本,性能更好)\n * @param filePath 缓存文件路径\n */\n public async isCacheValidAsync(filePath: string): Promise<boolean> {\n try {\n const stat = await fs.promises.stat(filePath);\n return Date.now() - stat.mtimeMs < this.options.cacheTTL;\n } catch {\n return false;\n }\n }\n\n /**\n * 下载资源到本地缓存(异步版本,返回 Promise)\n * @param url 资源URL\n * @param filePath 本地缓存路径\n * @returns Promise<void> 下载完成或失败\n */\n public downloadResourceAsync(url: string, filePath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const tempFilePath = `${filePath}.cache`;\n const lib = url.startsWith('https') ? https : http;\n const file = fs.createWriteStream(tempFilePath);\n let request: http.ClientRequest;\n\n const cleanupAndAbort = (errMsg: string, err?: any) => {\n if (err) {\n console.log(errMsg, err);\n } else {\n console.log(errMsg);\n }\n if (request) {\n request.destroy();\n }\n file.close(() => {\n // 使用 existsSync 避免在文件不存在时 unlink 抛出错误\n if (fs.existsSync(tempFilePath)) {\n fs.unlink(tempFilePath, () => {});\n }\n });\n reject(new Error(errMsg));\n };\n\n request = lib.get(url, (res: http.IncomingMessage) => {\n // 处理重定向\n if (res.statusCode === 301 || res.statusCode === 302 || res.statusCode === 307 || res.statusCode === 308) {\n const location = res.headers.location;\n if (location) {\n request.destroy();\n file.close(() => {\n if (fs.existsSync(tempFilePath)) {\n fs.unlink(tempFilePath, () => {});\n }\n });\n // 递归处理重定向\n this.downloadResourceAsync(location, filePath).then(resolve).catch(reject);\n return;\n }\n // 如果没有 location,继续处理为错误\n }\n\n if (res.statusCode !== 200) {\n res.resume(); // 消费响应数据以释放内存\n cleanupAndAbort(`下载失败,状态码: ${res.statusCode} for ${url}`);\n return;\n }\n res.pipe(file);\n });\n\n file.on('finish', () => {\n file.close((err) => {\n if (err) {\n return cleanupAndAbort(`关闭临时文件流失败: ${tempFilePath}`, err);\n }\n fs.rename(tempFilePath, filePath, (renameErr) => {\n if (renameErr) {\n cleanupAndAbort(`缓存文件重命名失败 from ${tempFilePath} to ${filePath}`, renameErr);\n } else {\n resolve();\n }\n });\n });\n });\n\n file.on('error', (err) => {\n cleanupAndAbort(`写入临时文件失败: ${tempFilePath}`, err);\n });\n\n request.on('error', (err) => {\n cleanupAndAbort(`下载资源请求失败: ${url}`, err);\n });\n });\n }\n\n /**\n * 下载资源到本地缓存(同步版本,不返回 Promise,用于拦截器)\n * @param url 资源URL\n * @param filePath 本地缓存路径\n */\n public downloadResource(url: string, filePath: string): void {\n // 异步执行,不等待完成\n this.downloadResourceAsync(url, filePath).catch((err) => {\n console.log('后台下载资源失败:', err);\n });\n }\n\n /**\n * 检测并处理 base64 data URL\n * @param url 资源URL\n * @returns 如果是 base64 URL,返回 true 和文件扩展名;否则返回 false\n */\n private _isBase64DataUrl(url: string): { isBase64: boolean, ext?: string, data?: string } {\n if (!url.startsWith('data:')) {\n return { isBase64: false };\n }\n\n try {\n // 解析 data URL 格式:data:[<mediatype>][;base64],<data>\n const commaIndex = url.indexOf(',');\n if (commaIndex === -1) {\n return { isBase64: false };\n }\n\n const header = url.substring(0, commaIndex);\n const data = url.substring(commaIndex + 1);\n\n // 检查是否包含 base64 标识\n if (!header.includes('base64')) {\n return { isBase64: false };\n }\n\n // 从 mediatype 中提取文件扩展名\n // 例如:data:image/png;base64 -> png\n // 例如:data:image/jpeg;base64 -> jpeg\n let ext = 'res';\n const mimeMatch = header.match(/data:([^;]+)/);\n if (mimeMatch && mimeMatch[1]) {\n const mimeType = mimeMatch[1];\n ext = MIME_TO_EXT[mimeType] || ext;\n }\n\n return { isBase64: true, ext, data };\n } catch (error) {\n return { isBase64: false };\n }\n }\n\n /**\n * 保存 base64 数据到文件\n * @param base64Data base64 编码的数据\n * @param filePath 目标文件路径\n */\n private async _saveBase64ToFile(base64Data: string, filePath: string): Promise<void> {\n try {\n // 解码 base64 数据\n const buffer = Buffer.from(base64Data, 'base64');\n\n // 使用 Promise 版本的 writeFile\n // Buffer 继承自 Uint8Array,可以直接使用\n await fs.promises.writeFile(filePath, buffer as Uint8Array);\n } catch (error) {\n throw new Error(`保存 base64 文件失败: ${error instanceof Error ? error.message : '未知错误'}`);\n }\n }\n\n /**\n * 手动缓存指定 URL 的资源\n * @param url 要缓存的资源 URL(支持普通 URL 和 base64 data URL)\n * @param force 是否强制重新下载,即使缓存有效(默认 false)\n * @returns Promise<{ filePath: string, hostPath: string }> 返回缓存文件路径和主机路径\n * @throws 如果 URL 不匹配缓存规则或来源不允许,会抛出错误\n */\n public async cacheUrl(url: string, force: boolean = false, ignoreOrigin: boolean = false): Promise<{ filePath: string, hostPath: string }> {\n // 检查是否是 base64 data URL\n const base64Info = this._isBase64DataUrl(url);\n\n if (base64Info.isBase64) {\n // 处理 base64 data URL\n if (!base64Info.data || !base64Info.ext) {\n throw new Error(`无效的 base64 data URL: ${url}`);\n }\n\n // 获取缓存路径(使用检测到的扩展名)\n const cachePath = this.getCachedPath(url, base64Info.ext);\n\n // 如果缓存有效且不强制重新下载,直接返回\n if (!force && await this.isCacheValidAsync(cachePath.filePath)) {\n return cachePath;\n }\n\n // 保存 base64 数据到文件\n await this._saveBase64ToFile(base64Info.data, cachePath.filePath);\n\n return cachePath;\n }\n\n // 处理普通 URL\n const shouldCache = this._getMatchFunction();\n const isAllowedOrigin = ignoreOrigin ? () => true : this._getOriginAllowFunction();\n\n // 检查是否匹配缓存规则\n if (!shouldCache(url)) {\n throw new Error(`URL 不匹配缓存规则: ${url}`);\n }\n\n // 检查来源是否允许\n if (!isAllowedOrigin(url)) {\n throw new Error(`URL 来源不允许缓存: ${url}`);\n }\n\n // 获取缓存路径\n const cachePath = this.getCachedPath(url);\n\n // 如果缓存有效且不强制重新下载,直接返回\n if (!force && await this.isCacheValidAsync(cachePath.filePath)) {\n return cachePath;\n }\n\n // 下载资源\n await this.downloadResourceAsync(url, cachePath.filePath);\n\n return cachePath;\n }\n\n /**\n * 批量缓存多个 URL 的资源\n * @param urls 要缓存的资源 URL 数组\n * @param force 是否强制重新下载,即使缓存有效(默认 false)\n * @returns Promise<Array<{ url: string, success: boolean, filePath?: string, hostPath?: string, error?: string }>> 返回每个 URL 的缓存结果\n */\n public async addCacheUrls(urls: string[], force: boolean = false, ignoreOrigin: boolean = false): Promise<Array<{ url: string, success: boolean, filePath?: string, hostPath?: string, error?: string }>> {\n const results = await Promise.allSettled(\n urls.map(url => this.cacheUrl(url, force, ignoreOrigin))\n );\n\n return results.map((result, index) => {\n const url = urls[index] || '';\n if (result.status === 'fulfilled') {\n return {\n url,\n success: true,\n filePath: result.value.filePath,\n hostPath: result.value.hostPath\n };\n } else {\n return {\n url,\n success: false,\n error: result.reason?.message || '未知错误'\n };\n }\n });\n }\n\n /**\n * 删除多个 URL 的资源\n * @param urls 要删除的资源 URL 数组\n * @returns Promise<Array<{ url: string, success: boolean, error?: string }>> 返回每个 URL 的删除结果\n */\n public async deleteCacheUrls(urls: string[]): Promise<Array<{ url: string, success: boolean, error?: string }>> {\n const results = await Promise.allSettled(\n urls.map(url => this.deleteUrl(url))\n );\n return results.map((result, index) => {\n const url = urls[index] || '';\n if (result.status === 'fulfilled') {\n return { url, success: true };\n } else {\n return { url, success: false, error: result.reason?.message || '未知错误' };\n }\n });\n }\n\n /**\n * 删除单个 URL 的资源(异步版本,性能更好)\n * @param url 要删除的资源 URL\n * @returns Promise<{ url: string, success: boolean, error?: string }> 返回删除结果\n */\n public async deleteUrl(url: string): Promise<{ url: string, success: boolean, error?: string }> {\n try {\n const cachePath = this.getCachedPath(url);\n try {\n await fs.promises.unlink(cachePath.filePath);\n return { url, success: true };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return { url, success: false, error: '文件不存在' };\n }\n throw error;\n }\n } catch (error) {\n return {\n url,\n success: false,\n error: error instanceof Error ? error.message : '未知错误'\n };\n }\n }\n\n /**\n * 删除单个 URL 的资源(别名,保持向后兼容)\n * @deprecated 使用 deleteUrl 代替\n */\n public async deleteCache(url: string): Promise<{ url: string, success: boolean, error?: string }> {\n return this.deleteUrl(url);\n }\n\n /**\n * 清理过期缓存文件(异步并行处理,性能更好)\n */\n private async _cleanOldCache(): Promise<void> {\n try {\n const files = await fs.promises.readdir(this.options.cacheDir);\n if (files.length === 0) return;\n\n const now = Date.now();\n // 并行处理,提升性能\n await Promise.allSettled(\n files.map(async (file) => {\n const fullPath = path.join(this.options.cacheDir, file);\n try {\n const stat = await fs.promises.stat(fullPath);\n if (now - stat.mtimeMs > this.options.cacheTTL) {\n await fs.promises.unlink(fullPath);\n }\n } catch {\n // 忽略单个文件异常\n }\n })\n );\n } catch (error) {\n // 忽略目录读取错误\n console.log('清理过期缓存时发生错误:', error);\n }\n }\n\n /**\n * 清理所有缓存文件\n * @returns Promise<{ success: number, failed: number, totalSize: number }> 返回清理统计信息\n */\n public async clearCache(): Promise<{ success: number, failed: number, totalSize: number }> {\n try {\n const files = fs.readdirSync(this.options.cacheDir);\n if (files.length === 0) {\n console.log('缓存目录为空,无需清理');\n return { success: 0, failed: 0, totalSize: 0 };\n }\n\n // 先统计所有文件大小(避免并行时的竞态条件)\n const fileInfos = files.map((file) => {\n const filePath = path.join(this.options.cacheDir, file);\n try {\n const stats = fs.statSync(filePath);\n return { file, filePath, size: stats.size };\n } catch (error) {\n return { file, filePath, size: 0, error };\n }\n });\n\n // 计算总大小\n const totalSize = fileInfos.reduce((sum, info) => sum + info.size, 0);\n\n // 并行删除文件,提升性能\n const deleteResults = await Promise.allSettled(\n fileInfos.map(async (info) => {\n try {\n await fs.promises.unlink(info.filePath);\n return { success: true, file: info.file };\n } catch (error) {\n console.log(`清理缓存文件失败: ${info.file}`, error);\n throw error;\n }\n })\n );\n\n // 统计成功和失败数量\n const success = deleteResults.filter(r => r.status === 'fulfilled').length;\n const failed = deleteResults.filter(r => r.status === 'rejected').length;\n\n const sizeMB = (totalSize / (1024 * 1024)).toFixed(2);\n console.log(`缓存清理完成: 成功 ${success} 个, 失败 ${failed} 个, 释放空间 ${sizeMB} MB`);\n\n return { success, failed, totalSize };\n } catch (error) {\n console.log('清理缓存时发生错误:', error);\n throw error;\n }\n }\n\n /**\n * 注册 Electron 请求拦截器,实现资源缓存\n */\n private _registerInterceptor(): void {\n const shouldCache = this._getMatchFunction();\n const isAllowedOrigin = this._getOriginAllowFunction();\n\n this.session.webRequest.onBeforeRequest(\n { urls: ['http://*/*', 'https://*/*'] },\n (details: Electron.OnBeforeRequestListenerDetails, callback: (response: Electron.CallbackResponse) => void) => {\n const url = details.url;\n // 不匹配或来源不允许,直接放行\n if (details.method !== 'GET' || !shouldCache(url) || !isAllowedOrigin(url)) return callback({});\n\n const cachePath = this.getCachedPath(url);\n\n // 命中缓存,直接重定向到本地文件\n if (this.isCacheValid(cachePath.filePath)) {\n return callback({ redirectURL: cachePath.hostPath});\n }\n // 未命中则异步下载,当前请求正常放行\n this.downloadResource(url, cachePath.filePath);\n return callback({});\n }\n );\n }\n}\n\n"],"names":["ipc"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"resource-cache.d.ts","sourceRoot":"","sources":["../src/main/resource-cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource-cache.d.ts","sourceRoot":"","sources":["../src/main/resource-cache.ts"],"names":[],"mappings":"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"}
@@ -93,19 +93,34 @@ class ResourceCache {
93
93
  console.log('初始化时清理过期缓存失败:', err);
94
94
  });
95
95
  ipc.mainIPC.handleRenderer('core:cache', async (options) => {
96
- if (options.type === 'clear') {
97
- return await this.clearCache();
98
- }
99
- if (options.type === 'add') {
100
- return await this.addCacheUrls(options.urls ?? [], options.force ?? false, true);
101
- }
102
- if (options.type === 'delete') {
103
- return await this.deleteCacheUrls(options.urls ?? []);
96
+ try {
97
+ if (options.method === 'clear') {
98
+ return await this.clearCache();
99
+ }
100
+ if (options.method === 'add') {
101
+ if (typeof options.urls === 'string') {
102
+ const data = await this.addCacheUrls([options.urls], options.force ?? false, true);
103
+ return data[0];
104
+ }
105
+ const data = await this.addCacheUrls(options.urls ?? [], options.force ?? false, true);
106
+ return data;
107
+ }
108
+ if (options.method === 'delete') {
109
+ if (typeof options.urls === 'string') {
110
+ const data = await this.deleteCacheUrls([options.urls]);
111
+ return data[0];
112
+ }
113
+ const data = await this.deleteCacheUrls(options.urls ?? []);
114
+ return data;
115
+ }
116
+ if (options.method === 'stats') {
117
+ return await this.getCacheStats();
118
+ }
119
+ return undefined;
104
120
  }
105
- if (options.type === 'stats') {
106
- return await this.getCacheStats();
121
+ catch (error) {
122
+ return { success: false, error: error instanceof Error ? error.message : '未知错误' };
107
123
  }
108
- return undefined;
109
124
  });
110
125
  }
111
126
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"resource-cache.js","sources":["../src/src/main/resource-cache.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport http from 'node:http';\nimport https from 'node:https';\nimport md5 from 'md5';\nimport ipc from '@lynker-desktop/electron-ipc/main';\n\n/**\n * MIME 类型到文件扩展名的映射表\n */\nconst MIME_TO_EXT: Record<string, string> = {\n 'image/png': 'png',\n 'image/jpeg': 'jpeg',\n 'image/jpg': 'jpg',\n 'image/gif': 'gif',\n 'image/webp': 'webp',\n 'image/svg+xml': 'svg',\n 'image/x-icon': 'ico',\n 'image/bmp': 'bmp',\n 'image/avif': 'avif',\n 'image/heic': 'heic',\n 'image/heif': 'heif',\n 'image/tiff': 'tiff',\n 'font/woff': 'woff',\n 'font/woff2': 'woff2',\n 'font/ttf': 'ttf',\n 'font/otf': 'otf',\n 'application/font-woff': 'woff',\n 'application/font-woff2': 'woff2',\n 'video/mp4': 'mp4',\n 'video/webm': 'webm',\n 'video/ogg': 'ogg',\n 'audio/mpeg': 'mp3',\n 'audio/wav': 'wav',\n 'text/css': 'css',\n 'text/javascript': 'js',\n 'application/javascript': 'js',\n 'application/json': 'json',\n 'text/xml': 'xml',\n 'text/plain': 'txt',\n 'application/pdf': 'pdf',\n};\n\n/**\n * 资源缓存配置项\n */\nexport interface ResourceCacheOptions {\n /** 缓存目录,必填 */\n cacheDir: string;\n /** 缓存有效期(毫秒),默认24小时 */\n cacheTTL?: number;\n /** 匹配需要缓存的资源,支持正则或函数 */\n match?: RegExp | ((url: string) => boolean);\n /** 允许缓存的资源来源,支持null/数组/函数 */\n allowedOrigins?: null | string[] | ((url: string) => boolean);\n}\n\n/**\n * 默认配置\n */\nconst DEFAULT_OPTIONS: Required<Omit<ResourceCacheOptions, 'cacheDir'>> & { cacheDir: string } = {\n cacheDir: '',\n cacheTTL: 24 * 60 * 60 * 1000,\n // 图片格式:png, jpg/jpeg, webp, gif, svg, ico, bmp, avif, heic, heif, tiff, tif\n // 字体格式:woff, woff2, ttf, eot, otf\n // 视频格式:mp4, webm, ogg, mov, avi, mkv, flv, m4v, 3gp\n // 音频格式:mp3, wav, aac, m4a, flac, opus, wma\n // 样式和脚本:css, js, json, xml, txt\n // Web资源:wasm, map (source map)\n // 文档格式:pdf\n // 压缩文件:zip, 7z, rar, tar, gz, bz2\n match: /\\.(png|jpe?g|webp|gif|svg|ico|bmp|avif|heic|heif|tiff?|woff2?|ttf|eot|otf|mp4|webm|ogg|mov|avi|mkv|flv|m4v|3gp|mp3|wav|aac|m4a|flac|opus|wma|css|js|json|xml|txt|wasm|map|pdf|zip|7z|rar|tar|gz|bz2)(\\?.*)?$/i,\n allowedOrigins: null,\n};\n\n/**\n * 资源缓存类:拦截并缓存静态资源,提升加载性能\n */\nexport class ResourceCache {\n static scheme = 'cachefile';\n private cacheHost: string = `${ResourceCache.scheme}://-`;\n /** Electron session 实例 */\n private session: Electron.Session;\n /** 缓存配置 */\n private options: Required<ResourceCacheOptions>;\n /** 缓存的匹配函数(避免重复创建) */\n private _cachedMatchFunction?: (url: string) => boolean;\n /** 缓存的来源校验函数(避免重复创建) */\n private _cachedOriginFunction?: (url: string) => boolean;\n\n /**\n * 构造函数\n * @param session Electron session\n * @param options 缓存配置\n */\n constructor(session: Electron.Session, options: ResourceCacheOptions) {\n if (!session) throw new Error('ResourceCache: session is required');\n this.session = session;\n // 合并配置,保证类型安全\n this.options = {\n ...DEFAULT_OPTIONS,\n ...options,\n cacheDir: options.cacheDir,\n cacheTTL: options.cacheTTL ?? DEFAULT_OPTIONS.cacheTTL,\n match: options.match ?? DEFAULT_OPTIONS.match,\n allowedOrigins: options.allowedOrigins ?? DEFAULT_OPTIONS.allowedOrigins,\n };\n\n if (!this.options.cacheDir) {\n throw new Error('ResourceCache: cacheDir is required');\n }\n\n // 确保缓存目录存在\n if (!fs.existsSync(this.options.cacheDir)) {\n fs.mkdirSync(this.options.cacheDir, { recursive: true });\n }\n\n this._registerInterceptor();\n // 异步清理过期缓存,不阻塞初始化\n this._cleanOldCache().catch(err => {\n console.log('初始化时清理过期缓存失败:', err);\n });\n\n ipc.mainIPC.handleRenderer('core:cache', async (options: { type: 'add' | 'delete' | 'clear' | 'stats', urls?: string[], force?: boolean }) => {\n if (options.type === 'clear') {\n return await this.clearCache();\n }\n if (options.type === 'add') {\n return await this.addCacheUrls(options.urls ?? [], options.force ?? false, true);\n }\n if (options.type === 'delete') {\n return await this.deleteCacheUrls(options.urls ?? []);\n }\n if (options.type === 'stats') {\n return await this.getCacheStats();\n }\n return undefined;\n });\n }\n\n /**\n * 获取缓存统计信息(异步版本,性能更好)\n */\n public async getCacheStats(): Promise<{ size: number, totalSize: number }> {\n try {\n const files = await fs.promises.readdir(this.options.cacheDir);\n if (files.length === 0) {\n return { size: 0, totalSize: 0 };\n }\n\n // 并行获取文件信息,提升性能\n const fileInfos = await Promise.allSettled(\n files.map(async (file) => {\n const filePath = path.join(this.options.cacheDir, file);\n try {\n const stats = await fs.promises.stat(filePath);\n return { file, filePath, size: stats.size };\n } catch (error) {\n return { file, filePath, size: 0, error };\n }\n })\n );\n\n const validInfos = fileInfos\n .filter((r): r is PromiseFulfilledResult<{ file: string; filePath: string; size: number; error?: any }> => r.status === 'fulfilled')\n .map(r => r.value);\n\n return {\n size: validInfos.length,\n totalSize: validInfos.reduce((sum, info) => sum + info.size, 0)\n };\n } catch (error) {\n console.log('获取缓存统计信息失败:', error);\n return { size: 0, totalSize: 0 };\n }\n }\n\n /**\n * 获取资源匹配函数(带缓存,避免重复创建)\n */\n private _getMatchFunction(): (url: string) => boolean {\n if (this._cachedMatchFunction) {\n return this._cachedMatchFunction;\n }\n\n const matcher = this.options.match;\n if (typeof matcher === 'function') {\n this._cachedMatchFunction = matcher;\n } else if (matcher instanceof RegExp) {\n this._cachedMatchFunction = (url: string) => matcher.test(url);\n } else {\n this._cachedMatchFunction = () => false;\n }\n\n return this._cachedMatchFunction;\n }\n\n /**\n * 获取来源校验函数(带缓存,避免重复创建)\n */\n private _getOriginAllowFunction(): (url: string) => boolean {\n if (this._cachedOriginFunction) {\n return this._cachedOriginFunction;\n }\n\n const origins = this.options.allowedOrigins;\n if (!origins) {\n this._cachedOriginFunction = () => true;\n } else if (typeof origins === 'function') {\n this._cachedOriginFunction = origins;\n } else {\n const prefixList = origins.map(o => o.toLowerCase());\n this._cachedOriginFunction = (url: string) => {\n try {\n const origin = new URL(url).origin.toLowerCase();\n return prefixList.some(prefix => origin.startsWith(prefix));\n } catch {\n return false;\n }\n };\n }\n\n return this._cachedOriginFunction;\n }\n\n /**\n * 获取缓存文件路径\n * @param url 资源URL\n * @param customExt 自定义文件扩展名(可选,用于 base64 URL)\n */\n public getCachedPath(url: string, customExt?: string): { filePath: string, hostPath: string } {\n const md5Str = md5(url);\n let ext = '.res';\n\n if (customExt) {\n // 如果提供了自定义扩展名,使用它\n ext = customExt.startsWith('.') ? customExt : `.${customExt}`;\n } else {\n // 尝试从 URL 中提取扩展名\n try {\n const urlObj = new URL(url);\n ext = path.extname(urlObj.pathname) || '.res';\n } catch {\n // 如果 URL 解析失败(可能是 base64 data URL),使用默认扩展名\n ext = '.res';\n }\n }\n\n return {\n filePath: path.join(this.options.cacheDir, `${md5Str}${ext}`),\n hostPath: `${this.cacheHost}/${md5Str}${ext}`,\n }\n }\n\n /**\n * 判断缓存是否有效(同步版本,用于拦截器)\n * @param filePath 缓存文件路径\n */\n public isCacheValid(filePath: string): boolean {\n try {\n if (!fs.existsSync(filePath)) return false;\n const stat = fs.statSync(filePath);\n return Date.now() - stat.mtimeMs < this.options.cacheTTL;\n } catch {\n return false;\n }\n }\n\n /**\n * 判断缓存是否有效(异步版本,性能更好)\n * @param filePath 缓存文件路径\n */\n public async isCacheValidAsync(filePath: string): Promise<boolean> {\n try {\n const stat = await fs.promises.stat(filePath);\n return Date.now() - stat.mtimeMs < this.options.cacheTTL;\n } catch {\n return false;\n }\n }\n\n /**\n * 下载资源到本地缓存(异步版本,返回 Promise)\n * @param url 资源URL\n * @param filePath 本地缓存路径\n * @returns Promise<void> 下载完成或失败\n */\n public downloadResourceAsync(url: string, filePath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const tempFilePath = `${filePath}.cache`;\n const lib = url.startsWith('https') ? https : http;\n const file = fs.createWriteStream(tempFilePath);\n let request: http.ClientRequest;\n\n const cleanupAndAbort = (errMsg: string, err?: any) => {\n if (err) {\n console.log(errMsg, err);\n } else {\n console.log(errMsg);\n }\n if (request) {\n request.destroy();\n }\n file.close(() => {\n // 使用 existsSync 避免在文件不存在时 unlink 抛出错误\n if (fs.existsSync(tempFilePath)) {\n fs.unlink(tempFilePath, () => {});\n }\n });\n reject(new Error(errMsg));\n };\n\n request = lib.get(url, (res: http.IncomingMessage) => {\n // 处理重定向\n if (res.statusCode === 301 || res.statusCode === 302 || res.statusCode === 307 || res.statusCode === 308) {\n const location = res.headers.location;\n if (location) {\n request.destroy();\n file.close(() => {\n if (fs.existsSync(tempFilePath)) {\n fs.unlink(tempFilePath, () => {});\n }\n });\n // 递归处理重定向\n this.downloadResourceAsync(location, filePath).then(resolve).catch(reject);\n return;\n }\n // 如果没有 location,继续处理为错误\n }\n\n if (res.statusCode !== 200) {\n res.resume(); // 消费响应数据以释放内存\n cleanupAndAbort(`下载失败,状态码: ${res.statusCode} for ${url}`);\n return;\n }\n res.pipe(file);\n });\n\n file.on('finish', () => {\n file.close((err) => {\n if (err) {\n return cleanupAndAbort(`关闭临时文件流失败: ${tempFilePath}`, err);\n }\n fs.rename(tempFilePath, filePath, (renameErr) => {\n if (renameErr) {\n cleanupAndAbort(`缓存文件重命名失败 from ${tempFilePath} to ${filePath}`, renameErr);\n } else {\n resolve();\n }\n });\n });\n });\n\n file.on('error', (err) => {\n cleanupAndAbort(`写入临时文件失败: ${tempFilePath}`, err);\n });\n\n request.on('error', (err) => {\n cleanupAndAbort(`下载资源请求失败: ${url}`, err);\n });\n });\n }\n\n /**\n * 下载资源到本地缓存(同步版本,不返回 Promise,用于拦截器)\n * @param url 资源URL\n * @param filePath 本地缓存路径\n */\n public downloadResource(url: string, filePath: string): void {\n // 异步执行,不等待完成\n this.downloadResourceAsync(url, filePath).catch((err) => {\n console.log('后台下载资源失败:', err);\n });\n }\n\n /**\n * 检测并处理 base64 data URL\n * @param url 资源URL\n * @returns 如果是 base64 URL,返回 true 和文件扩展名;否则返回 false\n */\n private _isBase64DataUrl(url: string): { isBase64: boolean, ext?: string, data?: string } {\n if (!url.startsWith('data:')) {\n return { isBase64: false };\n }\n\n try {\n // 解析 data URL 格式:data:[<mediatype>][;base64],<data>\n const commaIndex = url.indexOf(',');\n if (commaIndex === -1) {\n return { isBase64: false };\n }\n\n const header = url.substring(0, commaIndex);\n const data = url.substring(commaIndex + 1);\n\n // 检查是否包含 base64 标识\n if (!header.includes('base64')) {\n return { isBase64: false };\n }\n\n // 从 mediatype 中提取文件扩展名\n // 例如:data:image/png;base64 -> png\n // 例如:data:image/jpeg;base64 -> jpeg\n let ext = 'res';\n const mimeMatch = header.match(/data:([^;]+)/);\n if (mimeMatch && mimeMatch[1]) {\n const mimeType = mimeMatch[1];\n ext = MIME_TO_EXT[mimeType] || ext;\n }\n\n return { isBase64: true, ext, data };\n } catch (error) {\n return { isBase64: false };\n }\n }\n\n /**\n * 保存 base64 数据到文件\n * @param base64Data base64 编码的数据\n * @param filePath 目标文件路径\n */\n private async _saveBase64ToFile(base64Data: string, filePath: string): Promise<void> {\n try {\n // 解码 base64 数据\n const buffer = Buffer.from(base64Data, 'base64');\n\n // 使用 Promise 版本的 writeFile\n // Buffer 继承自 Uint8Array,可以直接使用\n await fs.promises.writeFile(filePath, buffer as Uint8Array);\n } catch (error) {\n throw new Error(`保存 base64 文件失败: ${error instanceof Error ? error.message : '未知错误'}`);\n }\n }\n\n /**\n * 手动缓存指定 URL 的资源\n * @param url 要缓存的资源 URL(支持普通 URL 和 base64 data URL)\n * @param force 是否强制重新下载,即使缓存有效(默认 false)\n * @returns Promise<{ filePath: string, hostPath: string }> 返回缓存文件路径和主机路径\n * @throws 如果 URL 不匹配缓存规则或来源不允许,会抛出错误\n */\n public async cacheUrl(url: string, force: boolean = false, ignoreOrigin: boolean = false): Promise<{ filePath: string, hostPath: string }> {\n // 检查是否是 base64 data URL\n const base64Info = this._isBase64DataUrl(url);\n\n if (base64Info.isBase64) {\n // 处理 base64 data URL\n if (!base64Info.data || !base64Info.ext) {\n throw new Error(`无效的 base64 data URL: ${url}`);\n }\n\n // 获取缓存路径(使用检测到的扩展名)\n const cachePath = this.getCachedPath(url, base64Info.ext);\n\n // 如果缓存有效且不强制重新下载,直接返回\n if (!force && await this.isCacheValidAsync(cachePath.filePath)) {\n return cachePath;\n }\n\n // 保存 base64 数据到文件\n await this._saveBase64ToFile(base64Info.data, cachePath.filePath);\n\n return cachePath;\n }\n\n // 处理普通 URL\n const shouldCache = this._getMatchFunction();\n const isAllowedOrigin = ignoreOrigin ? () => true : this._getOriginAllowFunction();\n\n // 检查是否匹配缓存规则\n if (!shouldCache(url)) {\n throw new Error(`URL 不匹配缓存规则: ${url}`);\n }\n\n // 检查来源是否允许\n if (!isAllowedOrigin(url)) {\n throw new Error(`URL 来源不允许缓存: ${url}`);\n }\n\n // 获取缓存路径\n const cachePath = this.getCachedPath(url);\n\n // 如果缓存有效且不强制重新下载,直接返回\n if (!force && await this.isCacheValidAsync(cachePath.filePath)) {\n return cachePath;\n }\n\n // 下载资源\n await this.downloadResourceAsync(url, cachePath.filePath);\n\n return cachePath;\n }\n\n /**\n * 批量缓存多个 URL 的资源\n * @param urls 要缓存的资源 URL 数组\n * @param force 是否强制重新下载,即使缓存有效(默认 false)\n * @returns Promise<Array<{ url: string, success: boolean, filePath?: string, hostPath?: string, error?: string }>> 返回每个 URL 的缓存结果\n */\n public async addCacheUrls(urls: string[], force: boolean = false, ignoreOrigin: boolean = false): Promise<Array<{ url: string, success: boolean, filePath?: string, hostPath?: string, error?: string }>> {\n const results = await Promise.allSettled(\n urls.map(url => this.cacheUrl(url, force, ignoreOrigin))\n );\n\n return results.map((result, index) => {\n const url = urls[index] || '';\n if (result.status === 'fulfilled') {\n return {\n url,\n success: true,\n filePath: result.value.filePath,\n hostPath: result.value.hostPath\n };\n } else {\n return {\n url,\n success: false,\n error: result.reason?.message || '未知错误'\n };\n }\n });\n }\n\n /**\n * 删除多个 URL 的资源\n * @param urls 要删除的资源 URL 数组\n * @returns Promise<Array<{ url: string, success: boolean, error?: string }>> 返回每个 URL 的删除结果\n */\n public async deleteCacheUrls(urls: string[]): Promise<Array<{ url: string, success: boolean, error?: string }>> {\n const results = await Promise.allSettled(\n urls.map(url => this.deleteUrl(url))\n );\n return results.map((result, index) => {\n const url = urls[index] || '';\n if (result.status === 'fulfilled') {\n return { url, success: true };\n } else {\n return { url, success: false, error: result.reason?.message || '未知错误' };\n }\n });\n }\n\n /**\n * 删除单个 URL 的资源(异步版本,性能更好)\n * @param url 要删除的资源 URL\n * @returns Promise<{ url: string, success: boolean, error?: string }> 返回删除结果\n */\n public async deleteUrl(url: string): Promise<{ url: string, success: boolean, error?: string }> {\n try {\n const cachePath = this.getCachedPath(url);\n try {\n await fs.promises.unlink(cachePath.filePath);\n return { url, success: true };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return { url, success: false, error: '文件不存在' };\n }\n throw error;\n }\n } catch (error) {\n return {\n url,\n success: false,\n error: error instanceof Error ? error.message : '未知错误'\n };\n }\n }\n\n /**\n * 删除单个 URL 的资源(别名,保持向后兼容)\n * @deprecated 使用 deleteUrl 代替\n */\n public async deleteCache(url: string): Promise<{ url: string, success: boolean, error?: string }> {\n return this.deleteUrl(url);\n }\n\n /**\n * 清理过期缓存文件(异步并行处理,性能更好)\n */\n private async _cleanOldCache(): Promise<void> {\n try {\n const files = await fs.promises.readdir(this.options.cacheDir);\n if (files.length === 0) return;\n\n const now = Date.now();\n // 并行处理,提升性能\n await Promise.allSettled(\n files.map(async (file) => {\n const fullPath = path.join(this.options.cacheDir, file);\n try {\n const stat = await fs.promises.stat(fullPath);\n if (now - stat.mtimeMs > this.options.cacheTTL) {\n await fs.promises.unlink(fullPath);\n }\n } catch {\n // 忽略单个文件异常\n }\n })\n );\n } catch (error) {\n // 忽略目录读取错误\n console.log('清理过期缓存时发生错误:', error);\n }\n }\n\n /**\n * 清理所有缓存文件\n * @returns Promise<{ success: number, failed: number, totalSize: number }> 返回清理统计信息\n */\n public async clearCache(): Promise<{ success: number, failed: number, totalSize: number }> {\n try {\n const files = fs.readdirSync(this.options.cacheDir);\n if (files.length === 0) {\n console.log('缓存目录为空,无需清理');\n return { success: 0, failed: 0, totalSize: 0 };\n }\n\n // 先统计所有文件大小(避免并行时的竞态条件)\n const fileInfos = files.map((file) => {\n const filePath = path.join(this.options.cacheDir, file);\n try {\n const stats = fs.statSync(filePath);\n return { file, filePath, size: stats.size };\n } catch (error) {\n return { file, filePath, size: 0, error };\n }\n });\n\n // 计算总大小\n const totalSize = fileInfos.reduce((sum, info) => sum + info.size, 0);\n\n // 并行删除文件,提升性能\n const deleteResults = await Promise.allSettled(\n fileInfos.map(async (info) => {\n try {\n await fs.promises.unlink(info.filePath);\n return { success: true, file: info.file };\n } catch (error) {\n console.log(`清理缓存文件失败: ${info.file}`, error);\n throw error;\n }\n })\n );\n\n // 统计成功和失败数量\n const success = deleteResults.filter(r => r.status === 'fulfilled').length;\n const failed = deleteResults.filter(r => r.status === 'rejected').length;\n\n const sizeMB = (totalSize / (1024 * 1024)).toFixed(2);\n console.log(`缓存清理完成: 成功 ${success} 个, 失败 ${failed} 个, 释放空间 ${sizeMB} MB`);\n\n return { success, failed, totalSize };\n } catch (error) {\n console.log('清理缓存时发生错误:', error);\n throw error;\n }\n }\n\n /**\n * 注册 Electron 请求拦截器,实现资源缓存\n */\n private _registerInterceptor(): void {\n const shouldCache = this._getMatchFunction();\n const isAllowedOrigin = this._getOriginAllowFunction();\n\n this.session.webRequest.onBeforeRequest(\n { urls: ['http://*/*', 'https://*/*'] },\n (details: Electron.OnBeforeRequestListenerDetails, callback: (response: Electron.CallbackResponse) => void) => {\n const url = details.url;\n // 不匹配或来源不允许,直接放行\n if (details.method !== 'GET' || !shouldCache(url) || !isAllowedOrigin(url)) return callback({});\n\n const cachePath = this.getCachedPath(url);\n\n // 命中缓存,直接重定向到本地文件\n if (this.isCacheValid(cachePath.filePath)) {\n return callback({ redirectURL: cachePath.hostPath});\n }\n // 未命中则异步下载,当前请求正常放行\n this.downloadResource(url, cachePath.filePath);\n return callback({});\n }\n );\n }\n}\n\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource-cache.js","sources":["../src/src/main/resource-cache.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport http from 'node:http';\nimport https from 'node:https';\nimport md5 from 'md5';\nimport ipc from '@lynker-desktop/electron-ipc/main';\n\n/**\n * MIME 类型到文件扩展名的映射表\n */\nconst MIME_TO_EXT: Record<string, string> = {\n 'image/png': 'png',\n 'image/jpeg': 'jpeg',\n 'image/jpg': 'jpg',\n 'image/gif': 'gif',\n 'image/webp': 'webp',\n 'image/svg+xml': 'svg',\n 'image/x-icon': 'ico',\n 'image/bmp': 'bmp',\n 'image/avif': 'avif',\n 'image/heic': 'heic',\n 'image/heif': 'heif',\n 'image/tiff': 'tiff',\n 'font/woff': 'woff',\n 'font/woff2': 'woff2',\n 'font/ttf': 'ttf',\n 'font/otf': 'otf',\n 'application/font-woff': 'woff',\n 'application/font-woff2': 'woff2',\n 'video/mp4': 'mp4',\n 'video/webm': 'webm',\n 'video/ogg': 'ogg',\n 'audio/mpeg': 'mp3',\n 'audio/wav': 'wav',\n 'text/css': 'css',\n 'text/javascript': 'js',\n 'application/javascript': 'js',\n 'application/json': 'json',\n 'text/xml': 'xml',\n 'text/plain': 'txt',\n 'application/pdf': 'pdf',\n};\n\n/**\n * 资源缓存配置项\n */\nexport interface ResourceCacheOptions {\n /** 缓存目录,必填 */\n cacheDir: string;\n /** 缓存有效期(毫秒),默认24小时 */\n cacheTTL?: number;\n /** 匹配需要缓存的资源,支持正则或函数 */\n match?: RegExp | ((url: string) => boolean);\n /** 允许缓存的资源来源,支持null/数组/函数 */\n allowedOrigins?: null | string[] | ((url: string) => boolean);\n}\n\n/**\n * 默认配置\n */\nconst DEFAULT_OPTIONS: Required<Omit<ResourceCacheOptions, 'cacheDir'>> & { cacheDir: string } = {\n cacheDir: '',\n cacheTTL: 24 * 60 * 60 * 1000,\n // 图片格式:png, jpg/jpeg, webp, gif, svg, ico, bmp, avif, heic, heif, tiff, tif\n // 字体格式:woff, woff2, ttf, eot, otf\n // 视频格式:mp4, webm, ogg, mov, avi, mkv, flv, m4v, 3gp\n // 音频格式:mp3, wav, aac, m4a, flac, opus, wma\n // 样式和脚本:css, js, json, xml, txt\n // Web资源:wasm, map (source map)\n // 文档格式:pdf\n // 压缩文件:zip, 7z, rar, tar, gz, bz2\n match: /\\.(png|jpe?g|webp|gif|svg|ico|bmp|avif|heic|heif|tiff?|woff2?|ttf|eot|otf|mp4|webm|ogg|mov|avi|mkv|flv|m4v|3gp|mp3|wav|aac|m4a|flac|opus|wma|css|js|json|xml|txt|wasm|map|pdf|zip|7z|rar|tar|gz|bz2)(\\?.*)?$/i,\n allowedOrigins: null,\n};\n\n/**\n * 资源缓存类:拦截并缓存静态资源,提升加载性能\n */\nexport class ResourceCache {\n static scheme = 'cachefile';\n private cacheHost: string = `${ResourceCache.scheme}://-`;\n /** Electron session 实例 */\n private session: Electron.Session;\n /** 缓存配置 */\n private options: Required<ResourceCacheOptions>;\n /** 缓存的匹配函数(避免重复创建) */\n private _cachedMatchFunction?: (url: string) => boolean;\n /** 缓存的来源校验函数(避免重复创建) */\n private _cachedOriginFunction?: (url: string) => boolean;\n\n /**\n * 构造函数\n * @param session Electron session\n * @param options 缓存配置\n */\n constructor(session: Electron.Session, options: ResourceCacheOptions) {\n if (!session) throw new Error('ResourceCache: session is required');\n this.session = session;\n // 合并配置,保证类型安全\n this.options = {\n ...DEFAULT_OPTIONS,\n ...options,\n cacheDir: options.cacheDir,\n cacheTTL: options.cacheTTL ?? DEFAULT_OPTIONS.cacheTTL,\n match: options.match ?? DEFAULT_OPTIONS.match,\n allowedOrigins: options.allowedOrigins ?? DEFAULT_OPTIONS.allowedOrigins,\n };\n\n if (!this.options.cacheDir) {\n throw new Error('ResourceCache: cacheDir is required');\n }\n\n // 确保缓存目录存在\n if (!fs.existsSync(this.options.cacheDir)) {\n fs.mkdirSync(this.options.cacheDir, { recursive: true });\n }\n\n this._registerInterceptor();\n // 异步清理过期缓存,不阻塞初始化\n this._cleanOldCache().catch(err => {\n console.log('初始化时清理过期缓存失败:', err);\n });\n\n ipc.mainIPC.handleRenderer('core:cache', async (options: { method: 'add' | 'delete' | 'clear' | 'stats', urls?: string | string[], force?: boolean }) => {\n try {\n if (options.method === 'clear') {\n return await this.clearCache();\n }\n if (options.method === 'add') {\n if ( typeof options.urls === 'string') {\n const data = await this.addCacheUrls([options.urls], options.force ?? false, true);\n return data[0];\n }\n const data = await this.addCacheUrls(options.urls ?? [], options.force ?? false, true);\n return data;\n }\n if (options.method === 'delete') {\n if ( typeof options.urls === 'string') {\n const data = await this.deleteCacheUrls([options.urls]);\n return data[0];\n }\n const data = await this.deleteCacheUrls(options.urls ?? []);\n return data;\n }\n if (options.method === 'stats') {\n return await this.getCacheStats();\n }\n return undefined;\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : '未知错误' };\n }\n });\n }\n\n /**\n * 获取缓存统计信息(异步版本,性能更好)\n */\n public async getCacheStats(): Promise<{ size: number, totalSize: number }> {\n try {\n const files = await fs.promises.readdir(this.options.cacheDir);\n if (files.length === 0) {\n return { size: 0, totalSize: 0 };\n }\n\n // 并行获取文件信息,提升性能\n const fileInfos = await Promise.allSettled(\n files.map(async (file) => {\n const filePath = path.join(this.options.cacheDir, file);\n try {\n const stats = await fs.promises.stat(filePath);\n return { file, filePath, size: stats.size };\n } catch (error) {\n return { file, filePath, size: 0, error };\n }\n })\n );\n\n const validInfos = fileInfos\n .filter((r): r is PromiseFulfilledResult<{ file: string; filePath: string; size: number; error?: any }> => r.status === 'fulfilled')\n .map(r => r.value);\n\n return {\n size: validInfos.length,\n totalSize: validInfos.reduce((sum, info) => sum + info.size, 0)\n };\n } catch (error) {\n console.log('获取缓存统计信息失败:', error);\n return { size: 0, totalSize: 0 };\n }\n }\n\n /**\n * 获取资源匹配函数(带缓存,避免重复创建)\n */\n private _getMatchFunction(): (url: string) => boolean {\n if (this._cachedMatchFunction) {\n return this._cachedMatchFunction;\n }\n\n const matcher = this.options.match;\n if (typeof matcher === 'function') {\n this._cachedMatchFunction = matcher;\n } else if (matcher instanceof RegExp) {\n this._cachedMatchFunction = (url: string) => matcher.test(url);\n } else {\n this._cachedMatchFunction = () => false;\n }\n\n return this._cachedMatchFunction;\n }\n\n /**\n * 获取来源校验函数(带缓存,避免重复创建)\n */\n private _getOriginAllowFunction(): (url: string) => boolean {\n if (this._cachedOriginFunction) {\n return this._cachedOriginFunction;\n }\n\n const origins = this.options.allowedOrigins;\n if (!origins) {\n this._cachedOriginFunction = () => true;\n } else if (typeof origins === 'function') {\n this._cachedOriginFunction = origins;\n } else {\n const prefixList = origins.map(o => o.toLowerCase());\n this._cachedOriginFunction = (url: string) => {\n try {\n const origin = new URL(url).origin.toLowerCase();\n return prefixList.some(prefix => origin.startsWith(prefix));\n } catch {\n return false;\n }\n };\n }\n\n return this._cachedOriginFunction;\n }\n\n /**\n * 获取缓存文件路径\n * @param url 资源URL\n * @param customExt 自定义文件扩展名(可选,用于 base64 URL)\n */\n public getCachedPath(url: string, customExt?: string): { filePath: string, hostPath: string } {\n const md5Str = md5(url);\n let ext = '.res';\n\n if (customExt) {\n // 如果提供了自定义扩展名,使用它\n ext = customExt.startsWith('.') ? customExt : `.${customExt}`;\n } else {\n // 尝试从 URL 中提取扩展名\n try {\n const urlObj = new URL(url);\n ext = path.extname(urlObj.pathname) || '.res';\n } catch {\n // 如果 URL 解析失败(可能是 base64 data URL),使用默认扩展名\n ext = '.res';\n }\n }\n\n return {\n filePath: path.join(this.options.cacheDir, `${md5Str}${ext}`),\n hostPath: `${this.cacheHost}/${md5Str}${ext}`,\n }\n }\n\n /**\n * 判断缓存是否有效(同步版本,用于拦截器)\n * @param filePath 缓存文件路径\n */\n public isCacheValid(filePath: string): boolean {\n try {\n if (!fs.existsSync(filePath)) return false;\n const stat = fs.statSync(filePath);\n return Date.now() - stat.mtimeMs < this.options.cacheTTL;\n } catch {\n return false;\n }\n }\n\n /**\n * 判断缓存是否有效(异步版本,性能更好)\n * @param filePath 缓存文件路径\n */\n public async isCacheValidAsync(filePath: string): Promise<boolean> {\n try {\n const stat = await fs.promises.stat(filePath);\n return Date.now() - stat.mtimeMs < this.options.cacheTTL;\n } catch {\n return false;\n }\n }\n\n /**\n * 下载资源到本地缓存(异步版本,返回 Promise)\n * @param url 资源URL\n * @param filePath 本地缓存路径\n * @returns Promise<void> 下载完成或失败\n */\n public downloadResourceAsync(url: string, filePath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const tempFilePath = `${filePath}.cache`;\n const lib = url.startsWith('https') ? https : http;\n const file = fs.createWriteStream(tempFilePath);\n let request: http.ClientRequest;\n\n const cleanupAndAbort = (errMsg: string, err?: any) => {\n if (err) {\n console.log(errMsg, err);\n } else {\n console.log(errMsg);\n }\n if (request) {\n request.destroy();\n }\n file.close(() => {\n // 使用 existsSync 避免在文件不存在时 unlink 抛出错误\n if (fs.existsSync(tempFilePath)) {\n fs.unlink(tempFilePath, () => {});\n }\n });\n reject(new Error(errMsg));\n };\n\n request = lib.get(url, (res: http.IncomingMessage) => {\n // 处理重定向\n if (res.statusCode === 301 || res.statusCode === 302 || res.statusCode === 307 || res.statusCode === 308) {\n const location = res.headers.location;\n if (location) {\n request.destroy();\n file.close(() => {\n if (fs.existsSync(tempFilePath)) {\n fs.unlink(tempFilePath, () => {});\n }\n });\n // 递归处理重定向\n this.downloadResourceAsync(location, filePath).then(resolve).catch(reject);\n return;\n }\n // 如果没有 location,继续处理为错误\n }\n\n if (res.statusCode !== 200) {\n res.resume(); // 消费响应数据以释放内存\n cleanupAndAbort(`下载失败,状态码: ${res.statusCode} for ${url}`);\n return;\n }\n res.pipe(file);\n });\n\n file.on('finish', () => {\n file.close((err) => {\n if (err) {\n return cleanupAndAbort(`关闭临时文件流失败: ${tempFilePath}`, err);\n }\n fs.rename(tempFilePath, filePath, (renameErr) => {\n if (renameErr) {\n cleanupAndAbort(`缓存文件重命名失败 from ${tempFilePath} to ${filePath}`, renameErr);\n } else {\n resolve();\n }\n });\n });\n });\n\n file.on('error', (err) => {\n cleanupAndAbort(`写入临时文件失败: ${tempFilePath}`, err);\n });\n\n request.on('error', (err) => {\n cleanupAndAbort(`下载资源请求失败: ${url}`, err);\n });\n });\n }\n\n /**\n * 下载资源到本地缓存(同步版本,不返回 Promise,用于拦截器)\n * @param url 资源URL\n * @param filePath 本地缓存路径\n */\n public downloadResource(url: string, filePath: string): void {\n // 异步执行,不等待完成\n this.downloadResourceAsync(url, filePath).catch((err) => {\n console.log('后台下载资源失败:', err);\n });\n }\n\n /**\n * 检测并处理 base64 data URL\n * @param url 资源URL\n * @returns 如果是 base64 URL,返回 true 和文件扩展名;否则返回 false\n */\n private _isBase64DataUrl(url: string): { isBase64: boolean, ext?: string, data?: string } {\n if (!url.startsWith('data:')) {\n return { isBase64: false };\n }\n\n try {\n // 解析 data URL 格式:data:[<mediatype>][;base64],<data>\n const commaIndex = url.indexOf(',');\n if (commaIndex === -1) {\n return { isBase64: false };\n }\n\n const header = url.substring(0, commaIndex);\n const data = url.substring(commaIndex + 1);\n\n // 检查是否包含 base64 标识\n if (!header.includes('base64')) {\n return { isBase64: false };\n }\n\n // 从 mediatype 中提取文件扩展名\n // 例如:data:image/png;base64 -> png\n // 例如:data:image/jpeg;base64 -> jpeg\n let ext = 'res';\n const mimeMatch = header.match(/data:([^;]+)/);\n if (mimeMatch && mimeMatch[1]) {\n const mimeType = mimeMatch[1];\n ext = MIME_TO_EXT[mimeType] || ext;\n }\n\n return { isBase64: true, ext, data };\n } catch (error) {\n return { isBase64: false };\n }\n }\n\n /**\n * 保存 base64 数据到文件\n * @param base64Data base64 编码的数据\n * @param filePath 目标文件路径\n */\n private async _saveBase64ToFile(base64Data: string, filePath: string): Promise<void> {\n try {\n // 解码 base64 数据\n const buffer = Buffer.from(base64Data, 'base64');\n\n // 使用 Promise 版本的 writeFile\n // Buffer 继承自 Uint8Array,可以直接使用\n await fs.promises.writeFile(filePath, buffer as Uint8Array);\n } catch (error) {\n throw new Error(`保存 base64 文件失败: ${error instanceof Error ? error.message : '未知错误'}`);\n }\n }\n\n /**\n * 手动缓存指定 URL 的资源\n * @param url 要缓存的资源 URL(支持普通 URL 和 base64 data URL)\n * @param force 是否强制重新下载,即使缓存有效(默认 false)\n * @returns Promise<{ filePath: string, hostPath: string }> 返回缓存文件路径和主机路径\n * @throws 如果 URL 不匹配缓存规则或来源不允许,会抛出错误\n */\n public async cacheUrl(url: string, force: boolean = false, ignoreOrigin: boolean = false): Promise<{ filePath: string, hostPath: string }> {\n // 检查是否是 base64 data URL\n const base64Info = this._isBase64DataUrl(url);\n\n if (base64Info.isBase64) {\n // 处理 base64 data URL\n if (!base64Info.data || !base64Info.ext) {\n throw new Error(`无效的 base64 data URL: ${url}`);\n }\n\n // 获取缓存路径(使用检测到的扩展名)\n const cachePath = this.getCachedPath(url, base64Info.ext);\n\n // 如果缓存有效且不强制重新下载,直接返回\n if (!force && await this.isCacheValidAsync(cachePath.filePath)) {\n return cachePath;\n }\n\n // 保存 base64 数据到文件\n await this._saveBase64ToFile(base64Info.data, cachePath.filePath);\n\n return cachePath;\n }\n\n // 处理普通 URL\n const shouldCache = this._getMatchFunction();\n const isAllowedOrigin = ignoreOrigin ? () => true : this._getOriginAllowFunction();\n\n // 检查是否匹配缓存规则\n if (!shouldCache(url)) {\n throw new Error(`URL 不匹配缓存规则: ${url}`);\n }\n\n // 检查来源是否允许\n if (!isAllowedOrigin(url)) {\n throw new Error(`URL 来源不允许缓存: ${url}`);\n }\n\n // 获取缓存路径\n const cachePath = this.getCachedPath(url);\n\n // 如果缓存有效且不强制重新下载,直接返回\n if (!force && await this.isCacheValidAsync(cachePath.filePath)) {\n return cachePath;\n }\n\n // 下载资源\n await this.downloadResourceAsync(url, cachePath.filePath);\n\n return cachePath;\n }\n\n /**\n * 批量缓存多个 URL 的资源\n * @param urls 要缓存的资源 URL 数组\n * @param force 是否强制重新下载,即使缓存有效(默认 false)\n * @returns Promise<Array<{ url: string, success: boolean, filePath?: string, hostPath?: string, error?: string }>> 返回每个 URL 的缓存结果\n */\n public async addCacheUrls(urls: string[], force: boolean = false, ignoreOrigin: boolean = false): Promise<Array<{ url: string, success: boolean, filePath?: string, hostPath?: string, error?: string }>> {\n const results = await Promise.allSettled(\n urls.map(url => this.cacheUrl(url, force, ignoreOrigin))\n );\n\n return results.map((result, index) => {\n const url = urls[index] || '';\n if (result.status === 'fulfilled') {\n return {\n url,\n success: true,\n filePath: result.value.filePath,\n hostPath: result.value.hostPath\n };\n } else {\n return {\n url,\n success: false,\n error: result.reason?.message || '未知错误'\n };\n }\n });\n }\n\n /**\n * 删除多个 URL 的资源\n * @param urls 要删除的资源 URL 数组\n * @returns Promise<Array<{ url: string, success: boolean, error?: string }>> 返回每个 URL 的删除结果\n */\n public async deleteCacheUrls(urls: string[]): Promise<Array<{ url: string, success: boolean, error?: string }>> {\n const results = await Promise.allSettled(\n urls.map(url => this.deleteUrl(url))\n );\n return results.map((result, index) => {\n const url = urls[index] || '';\n if (result.status === 'fulfilled') {\n return { url, success: true };\n } else {\n return { url, success: false, error: result.reason?.message || '未知错误' };\n }\n });\n }\n\n /**\n * 删除单个 URL 的资源(异步版本,性能更好)\n * @param url 要删除的资源 URL\n * @returns Promise<{ url: string, success: boolean, error?: string }> 返回删除结果\n */\n public async deleteUrl(url: string): Promise<{ url: string, success: boolean, error?: string }> {\n try {\n const cachePath = this.getCachedPath(url);\n try {\n await fs.promises.unlink(cachePath.filePath);\n return { url, success: true };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return { url, success: false, error: '文件不存在' };\n }\n throw error;\n }\n } catch (error) {\n return {\n url,\n success: false,\n error: error instanceof Error ? error.message : '未知错误'\n };\n }\n }\n\n /**\n * 删除单个 URL 的资源(别名,保持向后兼容)\n * @deprecated 使用 deleteUrl 代替\n */\n public async deleteCache(url: string): Promise<{ url: string, success: boolean, error?: string }> {\n return this.deleteUrl(url);\n }\n\n /**\n * 清理过期缓存文件(异步并行处理,性能更好)\n */\n private async _cleanOldCache(): Promise<void> {\n try {\n const files = await fs.promises.readdir(this.options.cacheDir);\n if (files.length === 0) return;\n\n const now = Date.now();\n // 并行处理,提升性能\n await Promise.allSettled(\n files.map(async (file) => {\n const fullPath = path.join(this.options.cacheDir, file);\n try {\n const stat = await fs.promises.stat(fullPath);\n if (now - stat.mtimeMs > this.options.cacheTTL) {\n await fs.promises.unlink(fullPath);\n }\n } catch {\n // 忽略单个文件异常\n }\n })\n );\n } catch (error) {\n // 忽略目录读取错误\n console.log('清理过期缓存时发生错误:', error);\n }\n }\n\n /**\n * 清理所有缓存文件\n * @returns Promise<{ success: number, failed: number, totalSize: number }> 返回清理统计信息\n */\n public async clearCache(): Promise<{ success: number, failed: number, totalSize: number }> {\n try {\n const files = fs.readdirSync(this.options.cacheDir);\n if (files.length === 0) {\n console.log('缓存目录为空,无需清理');\n return { success: 0, failed: 0, totalSize: 0 };\n }\n\n // 先统计所有文件大小(避免并行时的竞态条件)\n const fileInfos = files.map((file) => {\n const filePath = path.join(this.options.cacheDir, file);\n try {\n const stats = fs.statSync(filePath);\n return { file, filePath, size: stats.size };\n } catch (error) {\n return { file, filePath, size: 0, error };\n }\n });\n\n // 计算总大小\n const totalSize = fileInfos.reduce((sum, info) => sum + info.size, 0);\n\n // 并行删除文件,提升性能\n const deleteResults = await Promise.allSettled(\n fileInfos.map(async (info) => {\n try {\n await fs.promises.unlink(info.filePath);\n return { success: true, file: info.file };\n } catch (error) {\n console.log(`清理缓存文件失败: ${info.file}`, error);\n throw error;\n }\n })\n );\n\n // 统计成功和失败数量\n const success = deleteResults.filter(r => r.status === 'fulfilled').length;\n const failed = deleteResults.filter(r => r.status === 'rejected').length;\n\n const sizeMB = (totalSize / (1024 * 1024)).toFixed(2);\n console.log(`缓存清理完成: 成功 ${success} 个, 失败 ${failed} 个, 释放空间 ${sizeMB} MB`);\n\n return { success, failed, totalSize };\n } catch (error) {\n console.log('清理缓存时发生错误:', error);\n throw error;\n }\n }\n\n /**\n * 注册 Electron 请求拦截器,实现资源缓存\n */\n private _registerInterceptor(): void {\n const shouldCache = this._getMatchFunction();\n const isAllowedOrigin = this._getOriginAllowFunction();\n\n this.session.webRequest.onBeforeRequest(\n { urls: ['http://*/*', 'https://*/*'] },\n (details: Electron.OnBeforeRequestListenerDetails, callback: (response: Electron.CallbackResponse) => void) => {\n const url = details.url;\n // 不匹配或来源不允许,直接放行\n if (details.method !== 'GET' || !shouldCache(url) || !isAllowedOrigin(url)) return callback({});\n\n const cachePath = this.getCachedPath(url);\n\n // 命中缓存,直接重定向到本地文件\n if (this.isCacheValid(cachePath.filePath)) {\n return callback({ redirectURL: cachePath.hostPath});\n }\n // 未命中则异步下载,当前请求正常放行\n this.downloadResource(url, cachePath.filePath);\n return callback({});\n }\n );\n }\n}\n\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lynker-desktop/electron-sdk",
3
- "version": "0.0.9-alpha.52",
3
+ "version": "0.0.9-alpha.54",
4
4
  "description": "electron-sdk",
5
5
  "keywords": [
6
6
  "electron",
@@ -53,9 +53,9 @@
53
53
  "packageManager": "pnpm@9.6.0",
54
54
  "dependencies": {
55
55
  "@electron/remote": "^2.1.2",
56
- "@lynker-desktop/electron-ipc": "0.0.9-alpha.52",
57
- "@lynker-desktop/electron-logs": "0.0.9-alpha.52",
58
- "@lynker-desktop/electron-window-manager": "0.0.9-alpha.52",
56
+ "@lynker-desktop/electron-ipc": "0.0.9-alpha.54",
57
+ "@lynker-desktop/electron-logs": "0.0.9-alpha.54",
58
+ "@lynker-desktop/electron-window-manager": "0.0.9-alpha.54",
59
59
  "electron-store": "^11.0.2",
60
60
  "events": "^3.3.0",
61
61
  "lodash": "^4.17.21",
@@ -89,5 +89,5 @@
89
89
  "tslib": "^2.6.3",
90
90
  "typescript": "^5.5.3"
91
91
  },
92
- "gitHead": "c8f6e734d4e1540e6d8b762346529a0a33a1b14c"
92
+ "gitHead": "a635e2c345fcc6e9870dae413e8b23bea3513a0f"
93
93
  }