@lynker-desktop/electron-sdk 0.0.9-alpha.47 → 0.0.9-alpha.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/main/clipboard.d.ts +32 -0
- package/esm/main/clipboard.d.ts.map +1 -0
- package/esm/main/clipboard.js +963 -0
- package/esm/main/clipboard.js.map +1 -0
- package/esm/main/index.d.ts.map +1 -1
- package/esm/main/index.js +2 -0
- package/esm/main/index.js.map +1 -1
- package/main/clipboard.d.ts +32 -0
- package/main/clipboard.d.ts.map +1 -0
- package/main/clipboard.js +963 -0
- package/main/clipboard.js.map +1 -0
- package/main/index.d.ts.map +1 -1
- package/main/index.js +2 -0
- package/main/index.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.js","sources":["../../src/main/clipboard.ts"],"sourcesContent":["import { clipboard, nativeImage } from 'electron';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport http from 'node:http';\nimport https from 'node:https';\nimport { app } from 'electron';\nimport ipc from '@lynker-desktop/electron-ipc/main';\n\n// 常量定义\nconst MAX_FILE_SIZE = 100 * 1024 * 1024; // 100MB,超过此大小不读取 buffer\nconst FILE_URI_PREFIX = 'file://';\nconst PLATFORM = process.platform;\nconst DOWNLOAD_TIMEOUT = 30000; // 30秒下载超时\nconst UNIX_FILE_FORMATS = ['public.file-url', 'text/uri-list', 'x-special/gnome-copied-files'];\n\nexport interface ClipboardFileData {\n name: string;\n path: string;\n size: number;\n type: string;\n lastModified: number;\n buffer?: ArrayBuffer;\n}\n\nexport interface ClipboardData {\n type: 'text' | 'html' | 'image' | 'file' | 'files' | 'url' | 'buffer';\n text?: string;\n html?: string;\n image?: ClipboardFileData;\n file?: ClipboardFileData;\n files?: ClipboardFileData[];\n url?: string;\n buffer?: ArrayBuffer;\n}\n\nexport interface ClipboardQuery {\n method: 'set' | 'get' | 'clear';\n value?: string | ClipboardFileData | ClipboardFileData[] | ArrayBuffer;\n type?: 'text' | 'html' | 'image' | 'file' | 'url' | 'buffer' | 'auto';\n options?: {\n includeBuffer?: boolean; // 是否包含文件内容 buffer\n maxFileSize?: number; // 最大文件大小(字节),超过则不读取 buffer\n };\n}\n\n// MIME 类型映射表\nconst MIME_TYPES: Readonly<Record<string, string>> = {\n // 文本文件\n '.txt': 'text/plain',\n '.text': 'text/plain',\n '.md': 'text/markdown',\n '.markdown': 'text/markdown',\n '.html': 'text/html',\n '.htm': 'text/html',\n '.css': 'text/css',\n '.js': 'text/javascript',\n '.jsx': 'text/javascript',\n '.ts': 'text/typescript',\n '.tsx': 'text/typescript',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.yaml': 'text/yaml',\n '.yml': 'text/yaml',\n '.csv': 'text/csv',\n '.rtf': 'application/rtf',\n '.log': 'text/plain',\n\n // 图片文件\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.bmp': 'image/bmp',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.tiff': 'image/tiff',\n '.tif': 'image/tiff',\n '.heic': 'image/heic',\n '.heif': 'image/heif',\n '.avif': 'image/avif',\n\n // 音频文件\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n '.oga': 'audio/ogg',\n '.m4a': 'audio/mp4',\n '.aac': 'audio/aac',\n '.flac': 'audio/flac',\n '.wma': 'audio/x-ms-wma',\n '.opus': 'audio/opus',\n '.amr': 'audio/amr',\n\n // 视频文件\n '.mp4': 'video/mp4',\n '.avi': 'video/x-msvideo',\n '.mov': 'video/quicktime',\n '.wmv': 'video/x-ms-wmv',\n '.flv': 'video/x-flv',\n '.webm': 'video/webm',\n '.mkv': 'video/x-matroska',\n '.m4v': 'video/mp4',\n '.3gp': 'video/3gpp',\n '.ogv': 'video/ogg',\n '.m2ts': 'video/mp2t',\n '.mts': 'video/mp2t',\n\n // 文档文件\n '.pdf': 'application/pdf',\n '.doc': 'application/msword',\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.xls': 'application/vnd.ms-excel',\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n '.ppt': 'application/vnd.ms-powerpoint',\n '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n '.odt': 'application/vnd.oasis.opendocument.text',\n '.ods': 'application/vnd.oasis.opendocument.spreadsheet',\n '.odp': 'application/vnd.oasis.opendocument.presentation',\n\n // 压缩文件\n '.zip': 'application/zip',\n '.rar': 'application/x-rar-compressed',\n '.7z': 'application/x-7z-compressed',\n '.tar': 'application/x-tar',\n '.gz': 'application/gzip',\n '.bz2': 'application/x-bzip2',\n '.xz': 'application/x-xz',\n\n // 字体文件\n '.ttf': 'font/ttf',\n '.otf': 'font/otf',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.eot': 'application/vnd.ms-fontobject',\n\n // 代码文件\n '.c': 'text/x-c',\n '.cpp': 'text/x-c++',\n '.h': 'text/x-c',\n '.hpp': 'text/x-c++',\n '.java': 'text/x-java-source',\n '.py': 'text/x-python',\n '.rb': 'text/x-ruby',\n '.php': 'text/x-php',\n '.go': 'text/x-go',\n '.rs': 'text/x-rust',\n '.swift': 'text/x-swift',\n '.kt': 'text/x-kotlin',\n '.scala': 'text/x-scala',\n '.sh': 'application/x-sh',\n '.bash': 'application/x-sh',\n '.zsh': 'application/x-sh',\n '.ps1': 'application/x-powershell',\n '.bat': 'application/x-msdos-program',\n '.cmd': 'application/x-msdos-program',\n\n // 数据文件\n '.db': 'application/x-sqlite3',\n '.sqlite': 'application/x-sqlite3',\n '.sql': 'application/sql',\n\n // 其他\n '.exe': 'application/x-msdownload',\n '.dll': 'application/x-msdownload',\n '.so': 'application/x-sharedlib',\n '.dylib': 'application/x-mach-binary',\n '.deb': 'application/vnd.debian.binary-package',\n '.rpm': 'application/x-rpm',\n '.apk': 'application/vnd.android.package-archive',\n '.ipa': 'application/octet-stream',\n '.dmg': 'application/x-apple-diskimage',\n '.iso': 'application/x-iso9660-image',\n} as const;\n\n/**\n * 获取文件的 MIME 类型\n */\nfunction getMimeType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n return MIME_TYPES[ext] || '';\n}\n\n/**\n * 类型守卫:判断是否为 ClipboardFileData\n */\nfunction isClipboardFileData(value: unknown): value is ClipboardFileData {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n 'name' in value &&\n 'path' in value\n );\n}\n\n/**\n * ArrayBuffer 转 Buffer\n */\nfunction arrayBufferToBuffer(arrayBuffer: ArrayBuffer): Buffer {\n return Buffer.from(new Uint8Array(arrayBuffer));\n}\n\n/**\n * Buffer 转 ArrayBuffer\n */\nfunction bufferToArrayBuffer(buffer: Buffer): ArrayBuffer {\n return new Uint8Array(buffer).buffer;\n}\n\n/**\n * 获取临时目录路径(缓存)\n */\nlet cachedTempDir: string | null = null;\nfunction getTempDir(): string {\n if (!cachedTempDir) {\n cachedTempDir = app.getPath('temp');\n }\n return cachedTempDir;\n}\n\n/**\n * 安全读取剪贴板操作(统一错误处理)\n */\nfunction safeClipboardOperation<T>(\n operation: () => T,\n defaultValue: T,\n errorMessage: string\n): T {\n try {\n return operation();\n } catch (error) {\n console.error(errorMessage, error);\n return defaultValue;\n }\n}\n\n/**\n * 解析文件 URI 为本地路径\n */\nfunction parseFileUri(uri: string): string {\n const cleanUri = uri.trim();\n if (cleanUri.startsWith(FILE_URI_PREFIX)) {\n try {\n return decodeURIComponent(cleanUri.substring(FILE_URI_PREFIX.length));\n } catch (error) {\n console.error('URI 解码失败:', error);\n return cleanUri.substring(FILE_URI_PREFIX.length);\n }\n }\n try {\n return decodeURIComponent(cleanUri);\n } catch (error) {\n console.error('URI 解码失败:', error);\n return cleanUri;\n }\n}\n\n/**\n * 规范化文件路径(移除 file:// 前缀,处理相对路径等)\n */\nfunction normalizeFilePath(filePath: string): string {\n const normalized = parseFileUri(filePath);\n return path.isAbsolute(normalized) ? normalized : path.resolve(normalized);\n}\n\n/**\n * 判断字符串是否为 URL\n */\nfunction isUrl(str: string): boolean {\n try {\n const url = new URL(str);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\n/**\n * 从 URL 下载文件到本地\n */\nasync function downloadFileFromUrl(url: string, outputPath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const lib = url.startsWith('https') ? https : http;\n const file = fs.createWriteStream(outputPath);\n let request: http.ClientRequest;\n\n const cleanup = () => {\n if (file) {\n file.close();\n if (fs.existsSync(outputPath)) {\n fs.unlinkSync(outputPath);\n }\n }\n if (request) {\n request.destroy();\n }\n };\n\n request = lib.get(url, (res) => {\n if (res.statusCode && res.statusCode !== 200) {\n res.resume(); // 消费响应数据以释放内存\n cleanup();\n reject(new Error(`下载失败,状态码: ${res.statusCode} for ${url}`));\n return;\n }\n\n res.pipe(file);\n\n file.on('finish', () => {\n file.close((err) => {\n if (err) {\n cleanup();\n reject(new Error(`关闭文件流失败: ${err.message}`));\n return;\n }\n resolve();\n });\n });\n\n file.on('error', (err) => {\n cleanup();\n reject(new Error(`写入文件失败: ${err.message}`));\n });\n });\n\n request.on('error', (err) => {\n cleanup();\n reject(new Error(`下载请求失败: ${err.message}`));\n });\n\n request.setTimeout(DOWNLOAD_TIMEOUT, () => {\n cleanup();\n reject(new Error('下载超时'));\n });\n });\n}\n\n/**\n * 从 Windows 剪贴板读取文件路径\n */\nfunction readWindowsClipboardFiles(): string[] {\n try {\n const buffer = clipboard.readBuffer('FileNameW');\n if (buffer.length === 0) {\n return [];\n }\n // Windows 使用 UCS-2 编码,以 \\u0000 分隔多个文件路径\n const content = buffer.toString('ucs2');\n return content.split('\\u0000').filter(Boolean).map(normalizeFilePath);\n } catch (error) {\n return [];\n }\n}\n\n/**\n * 从 macOS/Linux 剪贴板读取文件路径\n */\nfunction readUnixClipboardFiles(): string[] {\n const filePaths: string[] = [];\n\n // 方法1: 尝试从文本中解析 file:// URI\n try {\n const text = clipboard.readText();\n if (text && text.includes(FILE_URI_PREFIX)) {\n const uris = text.split('\\n').filter(Boolean);\n filePaths.push(...uris.map(parseFileUri).map(normalizeFilePath));\n if (filePaths.length > 0) {\n return filePaths;\n }\n }\n } catch (error) {\n // 继续尝试其他方法\n }\n\n // 方法2: 尝试从剪贴板格式列表中读取文件格式\n try {\n const formats = clipboard.availableFormats();\n\n for (const format of UNIX_FILE_FORMATS) {\n if (formats.includes(format)) {\n try {\n const buffer = clipboard.readBuffer(format);\n if (buffer.length > 0) {\n const text = buffer.toString('utf8');\n const uris = text.split('\\n').filter(Boolean);\n filePaths.push(...uris.map(parseFileUri).map(normalizeFilePath));\n if (filePaths.length > 0) {\n return filePaths;\n }\n }\n } catch (error) {\n // 继续尝试下一个格式\n }\n }\n }\n } catch (error) {\n // 忽略错误\n }\n\n return filePaths;\n}\n\n/**\n * 从系统剪贴板读取文件路径\n * 支持 Windows (FileNameW) 和 macOS/Linux (text/uri-list)\n */\nfunction readClipboardFiles(): string[] {\n try {\n if (PLATFORM === 'win32') {\n return readWindowsClipboardFiles();\n } else {\n return readUnixClipboardFiles();\n }\n } catch (error) {\n console.error('读取剪贴板文件失败:', error);\n return [];\n }\n}\n\n/**\n * 将文件路径转换为 URI 格式\n */\nfunction filePathToUri(filePath: string): string {\n return filePath.startsWith(FILE_URI_PREFIX) ? filePath : `${FILE_URI_PREFIX}${filePath}`;\n}\n\n/**\n * 将文件路径写入 Windows 剪贴板\n */\nfunction writeWindowsClipboardFiles(filePaths: string[]): void {\n try {\n // Windows 使用 UCS-2 编码,多个文件路径用 \\u0000 分隔,最后以 \\u0000\\u0000 结尾\n const content = filePaths.join('\\u0000') + '\\u0000\\u0000';\n clipboard.writeBuffer('FileNameW', Buffer.from(content, 'ucs2'));\n } catch (error) {\n console.error('写入文件到 Windows 剪贴板失败:', error);\n throw error;\n }\n}\n\n/**\n * 将文件路径写入 macOS/Linux 剪贴板\n */\nfunction writeUnixClipboardFiles(filePaths: string[]): void {\n try {\n // macOS/Linux 使用 URI 列表格式\n const uriList = filePaths.map(filePathToUri).join('\\n');\n clipboard.writeText(uriList);\n // 注意:macOS 的文件剪贴板需要使用原生 API (NSFilenamesPboardType)\n // 当前实现可能无法让系统完全识别为文件,需要进一步优化\n } catch (error) {\n console.error('写入文件到 Unix 剪贴板失败:', error);\n throw error;\n }\n}\n\n/**\n * 将文件路径写入系统剪贴板\n * 支持 Windows (FileNameW) 和 macOS/Linux (text/uri-list)\n */\nfunction writeClipboardFiles(filePaths: string[]): boolean {\n if (filePaths.length === 0) {\n return false;\n }\n\n try {\n if (PLATFORM === 'win32') {\n writeWindowsClipboardFiles(filePaths);\n } else {\n writeUnixClipboardFiles(filePaths);\n }\n return true;\n } catch (error) {\n console.error('写入文件到剪贴板失败:', error);\n return false;\n }\n}\n\n/**\n * 读取文件信息并返回 File 对象需要的数据\n */\nfunction readFileData(\n filePath: string,\n options: { includeBuffer?: boolean; maxFileSize?: number } = {}\n): ClipboardFileData | null {\n const { includeBuffer = true, maxFileSize = MAX_FILE_SIZE } = options;\n\n try {\n const normalizedPath = normalizeFilePath(filePath);\n\n if (!fs.existsSync(normalizedPath)) {\n console.warn('文件不存在:', normalizedPath);\n return null;\n }\n\n const stat = fs.statSync(normalizedPath);\n\n // 检查是否为文件(不是目录)\n if (!stat.isFile()) {\n console.warn('路径不是文件:', normalizedPath);\n return null;\n }\n\n const fileData: ClipboardFileData = {\n name: path.basename(normalizedPath),\n path: normalizedPath,\n size: stat.size,\n type: getMimeType(normalizedPath),\n lastModified: stat.mtimeMs,\n };\n\n // 根据选项决定是否读取文件内容\n if (includeBuffer && stat.size <= maxFileSize) {\n try {\n const buffer = fs.readFileSync(normalizedPath);\n fileData.buffer = bufferToArrayBuffer(buffer);\n } catch (error) {\n console.error('读取文件内容失败:', error);\n // 即使读取失败,也返回文件基本信息\n }\n }\n\n return fileData;\n } catch (error) {\n console.error('读取文件失败:', error);\n return null;\n }\n}\n\n/**\n * 从文件名或 URL 中提取文件扩展名\n */\nfunction extractExtension(fileNameOrUrl: string): string {\n try {\n // 如果是 URL,尝试从 URL 路径中获取扩展名\n if (isUrl(fileNameOrUrl)) {\n const url = new URL(fileNameOrUrl);\n const urlPath = url.pathname;\n const ext = path.extname(urlPath);\n if (ext) {\n return ext;\n }\n }\n // 否则从文件名获取扩展名\n return path.extname(fileNameOrUrl);\n } catch {\n return '';\n }\n}\n\n/**\n * 生成临时文件名(保留原始扩展名)\n */\nfunction generateTempFileName(originalName?: string, url?: string): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(7);\n\n if (originalName) {\n const ext = path.extname(originalName);\n const nameWithoutExt = path.basename(originalName, ext) || 'file';\n return `${nameWithoutExt}_${timestamp}_${random}${ext}`;\n }\n\n if (url) {\n const ext = extractExtension(url);\n return `clipboard_${timestamp}_${random}${ext}`;\n }\n\n return `clipboard_${timestamp}_${random}`;\n}\n\n/**\n * 将 File 对象保存到临时目录并返回文件路径\n * 支持本地路径、URL 和 buffer\n */\nasync function saveFileToTemp(fileData: ClipboardFileData): Promise<string | null> {\n try {\n const tempDir = getTempDir();\n\n // 如果已经有 buffer,直接保存到临时目录\n if (fileData.buffer) {\n const fileName = generateTempFileName(fileData.name, fileData.path);\n const tempPath = path.join(tempDir, fileName);\n const buffer = arrayBufferToBuffer(fileData.buffer);\n fs.writeFileSync(tempPath, buffer as any);\n return tempPath;\n }\n\n // 如果 path 是 URL,需要先下载\n if (fileData.path && isUrl(fileData.path)) {\n const fileName = generateTempFileName(fileData.name, fileData.path);\n const tempPath = path.join(tempDir, fileName);\n\n try {\n await downloadFileFromUrl(fileData.path, tempPath);\n return tempPath;\n } catch (error) {\n console.error('从 URL 下载文件失败:', error);\n return null;\n }\n }\n\n // 如果 path 是本地路径,检查文件是否存在\n if (fileData.path) {\n const normalizedPath = normalizeFilePath(fileData.path);\n if (fs.existsSync(normalizedPath)) {\n const stat = fs.statSync(normalizedPath);\n if (stat.isFile()) {\n return normalizedPath;\n }\n // 如果是目录,返回 null(目录不能复制到剪贴板)\n console.warn('路径是目录,不是文件:', normalizedPath);\n return null;\n }\n // 文件不存在\n console.warn('文件不存在:', normalizedPath);\n return null;\n }\n\n // 既没有 buffer 也没有有效路径\n return null;\n } catch (error) {\n console.error('保存文件到临时目录失败:', error);\n return null;\n }\n}\n\n/**\n * 读取文本类型\n */\nfunction handleGetText(): string {\n return safeClipboardOperation(\n () => clipboard.readText(),\n '',\n '读取文本失败:'\n );\n}\n\n/**\n * 读取 HTML 类型\n */\nfunction handleGetHtml(): ClipboardData {\n return safeClipboardOperation(\n () => {\n const html = clipboard.readHTML();\n return { type: 'html' as const, html: html || '' };\n },\n { type: 'html' as const, html: '' },\n '读取 HTML 失败:'\n );\n}\n\n/**\n * 从剪贴板图片创建文件数据(可重用逻辑)\n */\nfunction createImageFileDataFromClipboard(\n options?: ClipboardQuery['options']\n): ClipboardFileData | null {\n try {\n const image = clipboard.readImage();\n if (image.isEmpty()) {\n return null;\n }\n\n const pngBuffer = image.toPNG();\n const arrayBuffer = bufferToArrayBuffer(pngBuffer);\n const tempDir = getTempDir();\n const fileName = `clipboard_image_${Date.now()}.png`;\n const tempPath = path.join(tempDir, fileName);\n\n fs.writeFileSync(tempPath, pngBuffer as any);\n\n const fileData: ClipboardFileData = {\n name: fileName,\n path: tempPath,\n size: pngBuffer.length,\n type: 'image/png',\n lastModified: Date.now(),\n };\n\n // 如果选项允许,包含 buffer\n const maxSize = options?.maxFileSize || MAX_FILE_SIZE;\n if (options?.includeBuffer !== false && arrayBuffer.byteLength <= maxSize) {\n fileData.buffer = arrayBuffer;\n }\n\n return fileData;\n } catch (error) {\n console.error('创建图片文件数据失败:', error);\n return null;\n }\n}\n\n/**\n * 读取图片类型\n */\nfunction handleGetImage(options?: ClipboardQuery['options']): ClipboardData {\n const imageData = createImageFileDataFromClipboard(options);\n if (imageData) {\n return { type: 'image', image: imageData };\n }\n return { type: 'image' };\n}\n\n/**\n * 读取 URL 类型\n */\nfunction handleGetUrl(): ClipboardData {\n try {\n // 先尝试读取文本,检查是否为 URL\n const text = clipboard.readText();\n if (text && isUrl(text)) {\n return { type: 'url', url: text };\n }\n\n // 检查是否有链接格式\n const formats = clipboard.availableFormats();\n if (formats.includes('text/uri-list')) {\n const uriList = clipboard.readText();\n if (uriList) {\n const uris = uriList.split('\\n').filter(Boolean);\n const url = uris.find(uri => isUrl(uri));\n if (url) {\n return { type: 'url', url };\n }\n }\n }\n\n return { type: 'url' };\n } catch (error) {\n console.error('读取 URL 失败:', error);\n return { type: 'url' };\n }\n}\n\n/**\n * 读取 Buffer 类型\n */\nfunction handleGetBuffer(): ClipboardData {\n return safeClipboardOperation(\n () => {\n const formats = clipboard.availableFormats();\n if (formats.length === 0 || !formats[0]) {\n return { type: 'buffer' as const };\n }\n\n const buffer = clipboard.readBuffer(formats[0]);\n if (buffer.length > 0) {\n const arrayBuffer = bufferToArrayBuffer(buffer);\n return { type: 'buffer' as const, buffer: arrayBuffer };\n }\n\n return { type: 'buffer' as const };\n },\n { type: 'buffer' as const },\n '读取 Buffer 失败:'\n );\n}\n\n/**\n * 读取文件类型(单个)\n */\nfunction handleGetFile(options?: ClipboardQuery['options']): ClipboardData {\n const filePaths = readClipboardFiles();\n\n if (filePaths.length === 0 || !filePaths[0]) {\n return { type: 'file' };\n }\n\n const fileData = readFileData(filePaths[0], options);\n if (!fileData) {\n return { type: 'file' };\n }\n\n return { type: 'file', file: fileData };\n}\n\n/**\n * 自动检测类型(优先文件,然后是图片,最后是文本)\n */\nfunction handleGetAuto(options?: ClipboardQuery['options']): ClipboardData {\n // 1. 优先检测文件\n const filePaths = readClipboardFiles();\n if (filePaths.length > 0) {\n if (filePaths.length === 1) {\n const firstPath = filePaths[0];\n if (firstPath) {\n const fileData = readFileData(firstPath, options);\n if (fileData) {\n return { type: 'file', file: fileData };\n }\n }\n } else {\n // 多个文件\n const files = filePaths\n .map(filePath => readFileData(filePath, options))\n .filter((file): file is ClipboardFileData => file !== null);\n\n if (files.length > 0) {\n return { type: 'files', files };\n }\n }\n }\n\n // 2. 检测图片(直接使用可重用逻辑,避免重复读取)\n const imageData = createImageFileDataFromClipboard(options);\n if (imageData) {\n return { type: 'image', image: imageData };\n }\n\n // 3. 检测 HTML\n const htmlData = safeClipboardOperation(\n () => clipboard.readHTML(),\n '',\n '读取 HTML 失败:'\n );\n if (htmlData && htmlData.trim().length > 0) {\n return { type: 'html', html: htmlData };\n }\n\n // 4. 最后读取文本\n const text = handleGetText();\n return { type: 'text', text: text || '' };\n}\n\n/**\n * 判断字符串是否为文件路径或 URL\n */\nfunction isFilePathOrUrl(str: string): boolean {\n // 检查是否为 URL (http/https)\n if (isUrl(str)) {\n return true;\n }\n\n // 检查是否为 file:// URI\n if (str.startsWith(FILE_URI_PREFIX)) {\n return true;\n }\n\n // 检查是否为本地文件路径(绝对路径或相对路径)\n try {\n const normalizedPath = normalizeFilePath(str);\n if (fs.existsSync(normalizedPath)) {\n const stat = fs.statSync(normalizedPath);\n return stat.isFile();\n }\n } catch {\n // 忽略错误\n }\n\n return false;\n}\n\n/**\n * 处理字符串路径/URL:下载到临时文件后写入剪贴板\n */\nasync function handleSetStringAsFile(input: string): Promise<boolean> {\n try {\n let tempPath: string | null = null;\n\n // 如果是 http/https URL,下载到临时文件\n if (isUrl(input)) {\n const tempDir = app.getPath('temp');\n const fileName = generateTempFileName(undefined, input);\n tempPath = path.join(tempDir, fileName);\n\n try {\n await downloadFileFromUrl(input, tempPath);\n } catch (error) {\n console.error('从 URL 下载文件失败:', error);\n return false;\n }\n }\n // 如果是 file:// URI 或本地路径\n else {\n const normalizedPath = normalizeFilePath(input);\n\n if (!fs.existsSync(normalizedPath)) {\n console.warn('文件不存在:', normalizedPath);\n return false;\n }\n\n const stat = fs.statSync(normalizedPath);\n if (!stat.isFile()) {\n console.warn('路径不是文件:', normalizedPath);\n return false;\n }\n\n tempPath = normalizedPath;\n }\n\n if (!tempPath) {\n return false;\n }\n\n // 将临时文件路径写入剪贴板\n return writeClipboardFiles([tempPath]);\n } catch (error) {\n console.error('处理文件路径/URL 失败:', error);\n return false;\n }\n}\n\n/**\n * 写入文本\n */\nfunction handleSetText(text: string): boolean {\n return safeClipboardOperation(\n () => {\n clipboard.writeText(text);\n return true;\n },\n false,\n '写入文本到剪贴板失败:'\n );\n}\n\n/**\n * 写入 HTML\n */\nfunction handleSetHtml(html: string): boolean {\n return safeClipboardOperation(\n () => {\n clipboard.writeHTML(html);\n return true;\n },\n false,\n '写入 HTML 到剪贴板失败:'\n );\n}\n\n/**\n * 写入图片\n */\nasync function handleSetImage(imageData: ClipboardFileData | ArrayBuffer): Promise<boolean> {\n try {\n let image: Electron.NativeImage;\n\n // 如果传入的是 ArrayBuffer\n if (imageData instanceof ArrayBuffer) {\n const buffer = arrayBufferToBuffer(imageData);\n image = nativeImage.createFromBuffer(buffer);\n } else {\n // 如果传入的是 ClipboardFileData\n const savedPath = await saveFileToTemp(imageData);\n if (!savedPath) {\n return false;\n }\n image = nativeImage.createFromPath(savedPath);\n }\n\n if (!image.isEmpty()) {\n clipboard.writeImage(image);\n return true;\n }\n\n return false;\n } catch (error) {\n console.error('写入图片到剪贴板失败:', error);\n return false;\n }\n}\n\n/**\n * 写入 Buffer\n */\nfunction handleSetBuffer(buffer: ArrayBuffer): boolean {\n return safeClipboardOperation(\n () => {\n const nodeBuffer = arrayBufferToBuffer(buffer);\n // Electron 的 clipboard.writeBuffer 需要指定格式\n // 使用 'application/octet-stream' 作为默认格式\n clipboard.writeBuffer('application/octet-stream', nodeBuffer);\n return true;\n },\n false,\n '写入 Buffer 到剪贴板失败:'\n );\n}\n\n/**\n * 清空剪贴板\n */\nfunction handleClear(): boolean {\n return safeClipboardOperation(\n () => {\n clipboard.clear();\n return true;\n },\n false,\n '清空剪贴板失败:'\n );\n}\n\n/**\n * 写入单个文件\n */\nasync function handleSetFile(fileData: ClipboardFileData): Promise<boolean> {\n const savedPath = await saveFileToTemp(fileData);\n if (!savedPath) {\n return false;\n }\n return writeClipboardFiles([savedPath]);\n}\n\n/**\n * 写入多个文件\n */\nasync function handleSetFiles(files: ClipboardFileData[]): Promise<boolean> {\n if (files.length === 0) {\n return false;\n }\n\n const filePaths: string[] = [];\n for (const fileData of files) {\n const savedPath = await saveFileToTemp(fileData);\n if (savedPath) {\n filePaths.push(savedPath);\n }\n }\n\n if (filePaths.length === 0) {\n return false;\n }\n\n return writeClipboardFiles(filePaths);\n}\n\n/**\n * 初始化剪贴板 IPC 处理器\n */\nexport const initializeClipboard = () => {\n ipc.mainIPC.handleRenderer('core:clipboard', async (options: ClipboardQuery): Promise<ClipboardData | string | boolean> => {\n const { method, value, type = 'auto', options: fileOptions } = options;\n\n try {\n if (method === 'get') {\n // 从系统剪贴板读取内容\n switch (type) {\n case 'text':\n return handleGetText();\n case 'html':\n return handleGetHtml();\n case 'image':\n return handleGetImage();\n case 'file':\n return handleGetFile(fileOptions);\n case 'url':\n return handleGetUrl();\n case 'buffer':\n return handleGetBuffer();\n default: {\n return handleGetAuto(fileOptions);\n }\n }\n }\n\n if (method === 'set') {\n // 写入系统剪贴板\n if (value === undefined || value === null) {\n return false;\n }\n\n // 使用更清晰的类型检查和处理\n switch (type) {\n case 'text':\n if (typeof value === 'string') {\n return handleSetText(value);\n }\n break;\n\n case 'html':\n if (typeof value === 'string') {\n return handleSetHtml(value);\n }\n break;\n\n case 'image':\n if (typeof value === 'string' && isUrl(value)) {\n return await handleSetStringAsFile(value);\n }\n if (value instanceof ArrayBuffer) {\n return await handleSetImage(value);\n }\n if (isClipboardFileData(value)) {\n return await handleSetImage(value);\n }\n break;\n\n case 'file':\n if (isClipboardFileData(value)) {\n return await handleSetFile(value);\n }\n if (Array.isArray(value) && value.every(isClipboardFileData)) {\n return await handleSetFiles(value);\n }\n break;\n\n case 'url':\n if (typeof value === 'string' && isFilePathOrUrl(value)) {\n return await handleSetStringAsFile(value);\n }\n break;\n\n case 'buffer':\n if (value instanceof ArrayBuffer) {\n return handleSetBuffer(value);\n }\n break;\n }\n }\n\n if (method === 'clear') {\n return handleClear();\n }\n return false;\n } catch (error) {\n console.error('剪贴板操作失败:', error);\n return false;\n }\n });\n}\n"],"names":["ipc"],"mappings":"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"}
|
package/esm/main/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/main/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAY3C,OAAO,KAAK,GAAG,MAAM,mCAAmC,CAAA;AAExD,OAAO,KAAK,aAAa,MAAM,8CAA8C,CAAA;AAC7E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAA;AAC9F,OAAO,EAAuB,KAAK,YAAY,EAAE,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,KAAK,mBAAmB,EAAqB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/main/index.ts"],"names":[],"mappings":"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"}
|
package/esm/main/index.js
CHANGED
|
@@ -14,6 +14,7 @@ import * as logs from '@lynker-desktop/electron-logs/main';
|
|
|
14
14
|
import * as windowManager from '@lynker-desktop/electron-window-manager/main';
|
|
15
15
|
import { IPC_GET_APP_METRICS } from '../common/index.js';
|
|
16
16
|
import { initializeStore } from './store.js';
|
|
17
|
+
import { initializeClipboard } from './clipboard.js';
|
|
17
18
|
|
|
18
19
|
if (!remote.isInitialized()) {
|
|
19
20
|
remote.initialize();
|
|
@@ -49,6 +50,7 @@ const initialize = (options) => {
|
|
|
49
50
|
ipc.initialize();
|
|
50
51
|
logs.initialize();
|
|
51
52
|
initializeStore();
|
|
53
|
+
initializeClipboard();
|
|
52
54
|
if (options.ffmpegPath) {
|
|
53
55
|
VideoDownloader.getInstance().setFFmpegPath(options.ffmpegPath);
|
|
54
56
|
}
|
package/esm/main/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/main/index.ts"],"sourcesContent":["import type { WebContents } from 'electron'\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport {promisify} from 'node:util';\nimport http from 'node:http';\nimport https from 'node:https';\nimport { spawn, exec } from 'node:child_process';\nimport electron, { app, webContents } from 'electron';\nimport md5 from 'md5';\nimport { v5 as uuidv5 } from 'uuid';\nimport lodash from 'lodash';\nimport * as remote from '@electron/remote/main'\nimport * as ipc from '@lynker-desktop/electron-ipc/main'\nimport * as logs from '@lynker-desktop/electron-logs/main'\nimport * as windowManager from '@lynker-desktop/electron-window-manager/main'\nimport type { PreloadWebContentsConfig } from '@lynker-desktop/electron-window-manager/common'\nimport { IPC_GET_APP_METRICS, type ServeOptions, type VideoDownloadOptions, type VideoProgressCallback, type VideoDownloadResult, type CacheOptions } from '../common';\nimport { initializeStore } from './store';\n\nif (!remote.isInitialized()) {\n remote.initialize();\n}\n\nexport let isInitialized = false;\n\nexport interface SDK_TYPE {\n ipc: typeof ipc.mainIPC;\n windowManager: windowManager.WindowsManager,\n getPreload: () => string;\n downloadVideo: (options: VideoDownloadOptions, callbacks?: VideoProgressCallback) => Promise<VideoDownloadResult>;\n clearVideoCache: (outputDir: string) => void;\n getVideoCacheStats: (outputDir: string) => { size: number; entries: Array<{ fileName: string; filePath: string; fileSize: number; mtime: number }> };\n removeVideoCache: (options: VideoDownloadOptions) => boolean;\n}\n\n\nfunction findWebContentsByPid(pid: number): {id: number, url: string} | undefined {\n const all = webContents.getAllWebContents();\n\n const wc = all.find((wc) => {\n try {\n return wc.getOSProcessId() === pid;\n } catch (e) {\n return false;\n }\n });\n // @ts-ignore\n return wc ? {id: wc.id, url: wc.getURL()} : undefined;\n}\n\n\n/**\n * 初始化\n * @param protocol 唤起协议 例:dgz\n * @param preload 预加载js 必须传\n * @param loadingViewUrl 窗口管理默认loading页面\n * @returns\n */\nexport const initialize = (options: { protocol: string, preload: string, loadingViewUrl?: string, errorViewUrl?: string, preloadWebContentsConfig?: PreloadWebContentsConfig, webviewDomainWhiteList?: string[], serveOptions?: ServeOptions, resourceCacheOptions?: ResourceCacheOptions, ffmpegPath?: string }): SDK_TYPE => {\n let {protocol, preload, loadingViewUrl, serveOptions = [], errorViewUrl, preloadWebContentsConfig, webviewDomainWhiteList, resourceCacheOptions} = options;\n if (isInitialized) {\n // @ts-ignore\n return global['__GLBOAL_ELECTRON_SDK__'];\n }\n isInitialized = true;\n ipc.initialize();\n logs.initialize();\n initializeStore();\n if (options.ffmpegPath) {\n VideoDownloader.getInstance().setFFmpegPath(options.ffmpegPath);\n }\n const wm = windowManager.initialize(preload, loadingViewUrl, errorViewUrl, preloadWebContentsConfig, webviewDomainWhiteList || []);\n if (protocol) {\n registerProtocol(protocol);\n }\n if (!serveOptions) {\n serveOptions = []\n }\n if (resourceCacheOptions) {\n if (resourceCacheOptions.cacheDir) {\n serveOptions.push({\n scheme: ResourceCache.scheme,\n directory: resourceCacheOptions.cacheDir,\n })\n }\n }\n if (serveOptions && serveOptions.length) {\n serve(serveOptions);\n }\n if (resourceCacheOptions) {\n app.on('ready', () => {\n new ResourceCache(electron.session.defaultSession, resourceCacheOptions);\n });\n }\n class SDK {\n static ipc = ipc.mainIPC;\n static windowManager = wm;\n static getPreload = () => preload;\n static downloadVideo = downloadVideo;\n static clearVideoCache = clearVideoCache;\n static getVideoCacheStats = getVideoCacheStats;\n static removeVideoCache = removeVideoCache;\n }\n ipc.mainIPC.handleRenderer(IPC_GET_APP_METRICS, async () => {\n const metrics = app.getAppMetrics().map(i => {\n const webContents = findWebContentsByPid(i.pid || 0);\n console.log('webContents', webContents);\n return {\n ...i,\n webContents: webContents?.id || undefined,\n url: webContents?.url,\n }\n })\n return JSON.stringify(metrics);\n })\n ipc.mainIPC.handleRenderer(`__sdk_transcode_video__`, async (options:VideoDownloadOptions) => {\n const md5Options = md5(JSON.stringify(options.url));\n downloadVideo(options, {\n onDownloadProgress: (progress) => {\n ipc.mainIPC.invokeAllRenderer(`__sdk_transcode_video_callback_${md5Options}__`, {\n type: 'downloadProgress',\n data: progress\n });\n },\n onTranscodeProgress: (progress) => {\n ipc.mainIPC.invokeAllRenderer(`__sdk_transcode_video_callback_${md5Options}__`, {\n type: 'transcodeProgress',\n data: progress\n });\n },\n onComplete: (result) => {\n ipc.mainIPC.invokeAllRenderer(`__sdk_transcode_video_callback_${md5Options}__`, {\n type: 'complete',\n data: result\n });\n },\n });\n return true;\n })\n // @ts-ignore\n global['__GLBOAL_ELECTRON_SDK__'] = SDK;\n return SDK;\n}\n\n/** 后续再优化 */\nexport const getSDK = (): SDK_TYPE => {\n // @ts-ignore\n if (!global['__GLBOAL_ELECTRON_SDK__']) {\n throw '请在ready前先调用initialize'\n }\n // @ts-ignore\n return global['__GLBOAL_ELECTRON_SDK__'];\n}\n\n/**\n * 注册唤起\n */\nexport const registerProtocol = (() => {\n let isRegister = false;\n let launchOptions = ``;\n return (protocol: string) => {\n if (isRegister) {\n return;\n }\n isRegister = true;\n if (process.defaultApp) {\n if (process.argv.length >= 2) {\n app.setAsDefaultProtocolClient(protocol, process.execPath, [path.resolve(lodash.get(process, `argv[1]`, ''))]);\n }\n } else {\n app.setAsDefaultProtocolClient(protocol);\n }\n const handleUrl = (url: string) => {\n launchOptions = `${url ?? ''}`;\n ipc.mainIPC.invokeAllRenderer('__GLOBAL_CHANGE_LAUNCH_OPTIONS__', url)\n };\n\n function handleArgv(argv: string[]) {\n const prefix = `${protocol}:`;\n const offset = app?.isPackaged ? 1 : 2;\n const url = argv.find((arg, i) => i >= offset && arg.startsWith(prefix));\n if (url) handleUrl(url);\n }\n\n handleArgv(process.argv);\n\n app.on('second-instance', (event, argv) => {\n console.info(event)\n if (process.platform === 'win32') {\n // Windows\n handleArgv(argv);\n }\n });\n\n // macOS\n app.on('open-url', (event, urlStr) => {\n console.info(event)\n handleUrl(urlStr);\n });\n\n\n app.on(\"open-url\", (_event, url) => {\n handleUrl(url);\n });\n ipc.mainIPC.handleRenderer('__GLOBAL_GET_LAUNCH_OPTIONS__', async () => {\n return launchOptions;\n })\n ipc.mainIPC.handleRenderer('__GLOBAL_DEL_LAUNCH_OPTIONS__', async () => {\n launchOptions = ``;\n return launchOptions;\n })\n }\n})();\n\n/**\n * 注册协议\n * @param options\n * @returns\n */\nexport const serve = (options: ServeOptions) => {\n if (!options.length) {\n\t\tthrow new Error('请传入配置');\n\t}\n const stat = promisify(fs.stat);\n\n // See https://cs.chromium.org/chromium/src/net/base/net_error_list.h\n const FILE_NOT_FOUND = -6;\n\n const getPath: any = async (path_: string) => {\n try {\n const result = await stat(path_);\n\n if (result.isFile()) {\n return path_;\n }\n\n if (result.isDirectory()) {\n return getPath(path.join(path_, 'index.html'));\n }\n } catch (_) {}\n };\n\n const createHandler = (item: any) => {\n return async (request: any, callback: any) => {\n const indexPath = path.join(item.directory, 'index.html');\n const filePath = path.join(item.directory, decodeURIComponent(new URL(request.url).pathname));\n const resolvedPath = await getPath(filePath);\n const targetPath = resolvedPath || indexPath;\n const ext = path.extname(targetPath).toLowerCase();\n\n if (resolvedPath || !ext || ext === '.html' || ext === '.asar') {\n callback({\n path: resolvedPath || indexPath\n });\n } else {\n callback({error: FILE_NOT_FOUND});\n }\n }\n };\n\n\toptions = options.map((item) => {\n\t\treturn {\n\t\t\t...item,\n\t\t\tisCorsEnabled: !!item?.isCorsEnabled,\n\t\t\tscheme: item?.scheme || 'app',\n\t\t\tdirectory: path.resolve(electron.app.getAppPath(), item.directory),\n\t\t}\n\t})\n // 注册自定义协议的权限配置\n // 说明:\n // bypassCSP: 是否绕过内容安全策略(CSP),允许加载本地资源时不受 CSP 限制\n // standard: 使协议表现得像标准协议(如 http/https),支持标准 API\n // secure: 标记为安全协议,允许安全相关的操作\n // allowServiceWorkers: 允许该协议下注册 Service Worker\n // supportFetchAPI: 允许 fetch/XHR 等 API 访问该协议资源\n // corsEnabled: 是否启用跨域资源共享(CORS)\n // stream: 支持流式传输\n\telectron.protocol.registerSchemesAsPrivileged(options.map((item) => {\n\t\treturn {\n\t\t\tscheme: item.scheme,\n\t\t\tprivileges: {\n bypassCSP: true,\n\t\t\t\tstandard: true,\n\t\t\t\tsecure: true,\n\t\t\t\tallowServiceWorkers: true,\n\t\t\t\tsupportFetchAPI: true,\n\t\t\t\tcorsEnabled: item.isCorsEnabled ?? false,\n stream: true,\n\t\t\t}\n\t\t}\n\t}));\n\treturn new Promise((resolve, reject) => {\n\t\ttry {\n\t\t\telectron.app.on('ready', () => {\n\t\t\t\toptions.forEach((item) => {\n\t\t\t\t\tconst handler = createHandler(item);\n\t\t\t\t\tconst session = item.partition ? electron.session.fromPartition(item.partition) : electron.session.defaultSession;\n\t\t\t\t\tsession.protocol.registerFileProtocol(item.scheme, handler);\n\t\t\t\t})\n\t\t\t\tresolve(true)\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treject(error)\n\t\t}\n\t})\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 match: /\\.(png|jpe?g|webp|gif|svg|woff2?|ttf|mp4|webm|ogg|css|js)(\\?.*)?$/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 /**\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 this._cleanOldCache();\n }\n\n /**\n * 获取资源匹配函数\n */\n private _getMatchFunction(): (url: string) => boolean {\n const matcher = this.options.match;\n if (typeof matcher === 'function') return matcher;\n if (matcher instanceof RegExp) return (url: string) => matcher.test(url);\n return () => false;\n }\n\n /**\n * 获取来源校验函数\n */\n private _getOriginAllowFunction(): (url: string) => boolean {\n const origins = this.options.allowedOrigins;\n if (!origins) return () => true;\n if (typeof origins === 'function') return origins;\n const prefixList = origins.map(o => o.toLowerCase());\n return (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 /**\n * 获取缓存文件路径\n * @param url 资源URL\n */\n public getCachedPath(url: string): { filePath: string, hostPath: string } {\n const md5Str = md5(url);\n const urlObj = new URL(url);\n // 取文件扩展名,若无则用 .res\n const ext = path.extname(urlObj.pathname) || '.res';\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 if (!fs.existsSync(filePath)) return false;\n const stat = fs.statSync(filePath);\n return Date.now() - stat.mtimeMs < this.options.cacheTTL;\n }\n\n /**\n * 下载资源到本地缓存\n * @param url 资源URL\n * @param filePath 本地缓存路径\n */\n public downloadResource(url: string, filePath: string): void {\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 };\n\n request = lib.get(url, (res: http.IncomingMessage) => {\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 }\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 */\n private _cleanOldCache(): void {\n const files = fs.readdirSync(this.options.cacheDir);\n const now = Date.now();\n files.forEach(file => {\n const fullPath = path.join(this.options.cacheDir, file);\n try {\n const stat = fs.statSync(fullPath);\n if (now - stat.mtimeMs > this.options.cacheTTL) {\n fs.unlinkSync(fullPath);\n }\n } catch {\n // 忽略单个文件异常\n }\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 console.log('命中缓存: ', url, cachePath);\n return callback({ redirectURL: cachePath.hostPath});\n }\n console.log('未命中缓存: ', url);\n // 未命中则异步下载,当前请求正常放行\n this.downloadResource(url, cachePath.filePath);\n return callback({});\n }\n );\n }\n}\n\n/**\n * @electron/remote/main enable方法\n * @param webContents\n * @returns\n */\nexport const enable = (webContents: WebContents) => remote.enable(webContents);\n\n/**\n * 生成跨平台的文件URL\n * @param filePath 文件路径\n * @returns file:// URL\n */\nexport function getFileUrl(filePath: string): string {\n if (!filePath) {\n return '';\n }\n if (filePath.startsWith('file://')) {\n return filePath;\n }\n // 在Windows上,需要添加驱动器字母前的斜杠\n if (process.platform === 'win32') {\n // 如果路径是绝对路径(如 C:\\path\\to\\file),转换为 /C:/path/to/file\n if (filePath.match(/^[A-Za-z]:/)) {\n return `file:///${filePath}`;\n }\n // 如果已经是 /C:/path/to/file 格式,直接添加 file://\n return `file://${filePath}`;\n }\n\n // macOS 和 Linux 使用 file:/// 前缀\n return `file://${filePath}`;\n}\n\n/**\n * 获取随机UUID\n * @param key\n * @returns\n */\nexport function getRandomUUID(key: string = `${Date.now()}`): string {\n let webcrypto!: Crypto;\n let randomValue = Math?.random()?.toString()?.replace('0.', '');\n try {\n if (!webcrypto && !!window && window?.crypto) {\n webcrypto = window.crypto;\n }\n } catch (error) {console.log}\n try {\n const ar = webcrypto.getRandomValues(new Uint8Array(12));\n randomValue = `${md5(ar)}` || randomValue;\n } catch (error) {}\n const uuid = uuidv5(\n `${JSON.stringify(key)}_${Date.now()}_${randomValue}`,\n uuidv5.URL,\n );\n return uuid;\n}\n\n/**\n * 视频下载和转码类\n */\nclass VideoDownloader {\n private ffmpegPath: string = '';\n private static instance: VideoDownloader;\n private defaultCacheTTL: number = 24 * 60 * 60 * 1000; // 24小时缓存有效期\n\n static getInstance(): VideoDownloader {\n if (!VideoDownloader.instance) {\n VideoDownloader.instance = new VideoDownloader();\n }\n return VideoDownloader.instance;\n }\n\n setFFmpegPath(ffmpegPath: string): void {\n this.ffmpegPath = ffmpegPath;\n }\n\n /**\n * 下载视频文件\n */\n private async downloadVideoFile(\n url: string,\n outputPath: string,\n onProgress?: (progress: { downloaded: number; total: number; percentage: number; speed: number }) => void\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const lib = url.startsWith('https') ? https : http;\n const file = fs.createWriteStream(outputPath);\n let downloadedBytes = 0;\n let totalBytes = 0;\n let startTime = Date.now();\n let lastTime = startTime;\n let lastBytes = 0;\n\n const cleanup = () => {\n if (file) {\n file.close();\n fs.unlinkSync(outputPath);\n }\n };\n\n const request = lib.get(url, (res) => {\n if (res.statusCode !== 200) {\n cleanup();\n reject(new Error(`下载失败,状态码: ${res.statusCode}`));\n return;\n }\n\n totalBytes = parseInt(res.headers['content-length'] || '0', 10);\n\n res.on('data', (chunk) => {\n downloadedBytes += chunk.length;\n const now = Date.now();\n\n if (onProgress && (now - lastTime > 100 || downloadedBytes === totalBytes)) {\n const speed = ((downloadedBytes - lastBytes) * 1000) / (now - lastTime);\n onProgress({\n downloaded: downloadedBytes,\n total: totalBytes,\n percentage: totalBytes > 0 ? (downloadedBytes / totalBytes) * 100 : 0,\n speed: speed || 0\n });\n lastTime = now;\n lastBytes = downloadedBytes;\n }\n });\n\n res.pipe(file);\n\n file.on('finish', () => {\n file.close();\n resolve();\n });\n\n file.on('error', (err) => {\n cleanup();\n reject(err);\n });\n });\n\n request.on('error', (err) => {\n cleanup();\n reject(err);\n });\n });\n }\n\n /**\n * 使用FFmpeg转码视频\n */\n private async transcodeVideo(\n inputPath: string,\n outputPath: string,\n options: VideoDownloadOptions,\n onProgress?: (progress: { percentage: number; time: number; speed: number }) => void\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const ffmpegPath = options.ffmpegPath || this.ffmpegPath;\n if (!ffmpegPath) {\n reject(new Error('FFmpeg路径未设置'));\n return;\n }\n const format = options.format || 'mp4';\n const quality = options.quality || 18;\n const videoCodec = options.videoCodec || 'h264';\n const audioCodec = options.audioCodec || 'aac';\n\n // 根据格式选择合适的编码器\n const getCodecForFormat = (format: string, videoCodec: string, audioCodec: string) => {\n switch (format) {\n case 'webm':\n return {\n videoCodec: videoCodec === 'h264' ? 'libvpx-vp9' : videoCodec,\n audioCodec: audioCodec === 'aac' ? 'libopus' : audioCodec\n };\n case 'avi':\n return {\n videoCodec: videoCodec === 'h265' ? 'h264' : videoCodec, // AVI不支持H265\n audioCodec: audioCodec === 'opus' ? 'mp3' : audioCodec\n };\n case 'mov':\n return {\n videoCodec: videoCodec === 'vp9' ? 'h264' : videoCodec, // MOV对VP9支持有限\n audioCodec: audioCodec === 'opus' ? 'aac' : audioCodec\n };\n default: // mp4, mkv\n return { videoCodec, audioCodec };\n }\n };\n\n const { videoCodec: finalVideoCodec, audioCodec: finalAudioCodec } = getCodecForFormat(format, videoCodec, audioCodec);\n\n // 构建FFmpeg命令\n const args = [\n '-i', inputPath,\n '-c:v', finalVideoCodec,\n '-c:a', finalAudioCodec,\n '-crf', quality.toString(),\n '-preset', 'medium',\n '-f', format, // 指定输出格式\n '-y', // 覆盖输出文件\n outputPath\n ];\n\n const ffmpegProcess = spawn(ffmpegPath, args);\n let duration = 0;\n let stderr = '';\n\n ffmpegProcess.stderr.on('data', (data: Buffer) => {\n stderr += data.toString();\n\n // 解析FFmpeg输出获取进度\n if (onProgress) {\n const durationMatch = stderr.match(/Duration: (\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{2})/);\n if (durationMatch && duration === 0) {\n const hours = parseInt(durationMatch[1] || '0', 10);\n const minutes = parseInt(durationMatch[2] || '0', 10);\n const seconds = parseInt(durationMatch[3] || '0', 10);\n const centiseconds = parseInt(durationMatch[4] || '0', 10);\n duration = hours * 3600 + minutes * 60 + seconds + centiseconds / 100;\n }\n\n const timeMatch = stderr.match(/time=(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{2})/);\n if (timeMatch && duration > 0) {\n const hours = parseInt(timeMatch[1] || '0', 10);\n const minutes = parseInt(timeMatch[2] || '0', 10);\n const seconds = parseInt(timeMatch[3] || '0', 10);\n const centiseconds = parseInt(timeMatch[4] || '0', 10);\n const currentTime = hours * 3600 + minutes * 60 + seconds + centiseconds / 100;\n\n const percentage = (currentTime / duration) * 100;\n const speedMatch = stderr.match(/speed=([\\d.]+)x/);\n const speed = speedMatch ? parseFloat(speedMatch[1] || '1') : 1;\n\n onProgress({\n percentage: Math.min(percentage, 100),\n time: currentTime,\n speed: speed\n });\n }\n }\n });\n\n ffmpegProcess.on('close', (code: number) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`FFmpeg转码失败,退出码: ${code}\\n${stderr}`));\n }\n });\n\n ffmpegProcess.on('error', (err: Error) => {\n reject(new Error(`FFmpeg执行失败: ${err.message}`));\n });\n });\n }\n\n /**\n * 检查FFmpeg是否可用\n */\n private async checkFFmpegAvailable(ffmpegPath?: string): Promise<boolean> {\n return new Promise((resolve) => {\n const command = ffmpegPath || this.ffmpegPath;\n if (!command) {\n resolve(false);\n return;\n }\n const childProcess = spawn(command, ['-version']);\n childProcess.on('error', (error) => {\n console.log(\"checkFFmpegAvailable\", error);\n resolve(false);\n });\n childProcess.on('close', (code) => {\n console.log(\"checkFFmpegAvailable\", code);\n resolve(code === 0);\n });\n });\n }\n\n /**\n * 获取视频信息\n */\n private async getVideoInfo(inputPath: string, ffmpegPath?: string): Promise<{ duration: number; fileSize: number }> {\n return new Promise((resolve, reject) => {\n const ffmpegPath_cmd = ffmpegPath || this.ffmpegPath;\n const args = ['-i', inputPath, '-f', 'null', '-'];\n if (!ffmpegPath_cmd) {\n resolve({ duration: 0, fileSize: 0 });\n return;\n }\n const ffmpegProcess = spawn(ffmpegPath_cmd, args);\n let stderr = '';\n let duration = 0;\n\n ffmpegProcess.stderr.on('data', (data: Buffer) => {\n stderr += data.toString();\n const durationMatch = stderr.match(/Duration: (\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{2})/);\n if (durationMatch) {\n const hours = parseInt(durationMatch[1] || '0', 10);\n const minutes = parseInt(durationMatch[2] || '0', 10);\n const seconds = parseInt(durationMatch[3] || '0', 10);\n const centiseconds = parseInt(durationMatch[4] || '0', 10);\n duration = hours * 3600 + minutes * 60 + seconds + centiseconds / 100;\n }\n });\n\n ffmpegProcess.on('close', () => {\n const stats = fs.statSync(inputPath);\n resolve({\n duration,\n fileSize: stats.size\n });\n });\n\n ffmpegProcess.on('error', (err: Error) => {\n reject(err);\n });\n });\n }\n\n /**\n * 生成缓存文件名(基于URL的MD5)\n */\n private generateCacheFileName(options: VideoDownloadOptions): string {\n const format = options.format || 'mp4';\n const urlMd5 = md5(options.url);\n return `${urlMd5}.${format}`;\n }\n\n /**\n * 检查缓存文件是否存在\n */\n private isCacheFileExists(cacheFilePath: string): boolean {\n console.log('检查缓存文件是否存在: ', cacheFilePath);\n return fs.existsSync(cacheFilePath);\n }\n\n /**\n * 清理过期缓存文件\n */\n private cleanExpiredCacheFiles(outputDir: string, cacheTTL: number = this.defaultCacheTTL): void {\n try {\n const files = fs.readdirSync(outputDir);\n const now = Date.now();\n\n files.forEach(file => {\n const filePath = path.join(outputDir, file);\n try {\n const stats = fs.statSync(filePath);\n // 如果文件超过缓存时间,删除它\n if (now - stats.mtimeMs > cacheTTL) {\n fs.unlinkSync(filePath);\n console.log(`🧹 删除过期缓存文件: ${file}`);\n }\n } catch (error) {\n // 忽略单个文件错误\n }\n });\n } catch (error) {\n // 忽略目录读取错误\n }\n }\n\n /**\n * 下载并转码视频\n */\n async downloadAndTranscode(\n options: VideoDownloadOptions,\n callbacks?: VideoProgressCallback\n ): Promise<VideoDownloadResult> {\n try {\n const outputDir = options.outputDir || app.getPath('temp');\n // 获取缓存配置\n const cacheConfig = options.cache || { enabled: true, ttl: this.defaultCacheTTL };\n const cacheEnabled = cacheConfig.enabled !== false;\n const cacheTTL = cacheConfig.ttl || this.defaultCacheTTL;\n\n // 确保输出目录存在\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // 清理过期缓存文件\n this.cleanExpiredCacheFiles(outputDir, cacheTTL);\n\n // 生成缓存文件名\n const cacheFileName = this.generateCacheFileName(options);\n const cacheFilePath = path.join(outputDir, cacheFileName);\n\n // 如果启用缓存,检查缓存文件是否存在\n if (cacheEnabled && this.isCacheFileExists(cacheFilePath)) {\n console.log('🎯 命中缓存,直接返回缓存文件');\n\n // 获取文件信息\n const stats = fs.statSync(cacheFilePath);\n\n const result: VideoDownloadResult = {\n success: true,\n outputPath: getFileUrl(cacheFilePath),\n fileSize: stats.size,\n fromCache: true\n };\n\n callbacks?.onComplete?.({\n success: true,\n outputPath: result.outputPath\n });\n\n return result;\n }\n\n // 检查FFmpeg是否可用\n const ffmpegAvailable = await this.checkFFmpegAvailable(options.ffmpegPath);\n if (!ffmpegAvailable) {\n throw new Error('FFmpeg不可用,请确保已安装FFmpeg或提供正确的路径');\n }\n\n // 生成临时文件名和最终输出路径\n const fileName = options.outputName || md5(options.url);\n const format = options.format || 'mp4';\n const tempPath = path.join(outputDir, `${fileName}.temp`);\n const finalOutputPath = path.join(outputDir, `${fileName}.${format}`);\n const outputPath = cacheEnabled ? cacheFilePath : finalOutputPath;\n\n console.log('📥 开始下载视频...');\n // 下载视频\n await this.downloadVideoFile(\n options.url,\n tempPath,\n callbacks?.onDownloadProgress\n );\n\n console.log('🔄 开始转码视频...');\n // 转码视频\n await this.transcodeVideo(\n tempPath,\n outputPath,\n {\n ...options,\n outputDir\n },\n callbacks?.onTranscodeProgress\n );\n\n // 如果启用了缓存,将缓存文件复制到最终输出路径\n if (cacheEnabled && outputPath !== finalOutputPath) {\n fs.copyFileSync(outputPath, finalOutputPath);\n console.log('📋 缓存文件已复制到最终输出路径');\n }\n\n // 获取视频信息\n const videoInfo = await this.getVideoInfo(outputPath, options.ffmpegPath);\n\n // 清理临时文件\n if (!options.keepOriginal) {\n fs.unlinkSync(tempPath);\n }\n\n console.log('💾 文件已保存到缓存');\n\n const result: VideoDownloadResult = {\n success: true,\n outputPath: getFileUrl(cacheEnabled ? finalOutputPath : outputPath),\n originalPath: options.keepOriginal ? getFileUrl(tempPath) : undefined,\n duration: videoInfo.duration,\n fileSize: videoInfo.fileSize,\n fromCache: false\n };\n\n callbacks?.onComplete?.({\n success: true,\n outputPath: result.outputPath\n });\n\n return result;\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '未知错误';\n\n const result: VideoDownloadResult = {\n success: false,\n error: errorMessage\n };\n\n callbacks?.onComplete?.({\n success: false,\n error: errorMessage\n });\n\n return result;\n }\n }\n\n /**\n * 清除指定目录的所有缓存文件\n */\n clearCache(outputDir: string): void {\n try {\n const files = fs.readdirSync(outputDir);\n files.forEach(file => {\n const filePath = path.join(outputDir, file);\n try {\n fs.unlinkSync(filePath);\n } catch (error) {\n // 忽略单个文件删除错误\n }\n });\n console.log('🧹 缓存文件已清空');\n } catch (error) {\n console.log('⚠️ 清理缓存时发生错误:', error instanceof Error ? error.message : '未知错误');\n }\n }\n\n /**\n * 获取缓存统计信息\n */\n getCacheStats(outputDir: string): { size: number; entries: Array<{ fileName: string; filePath: string; fileSize: number; mtime: number }> } {\n try {\n const files = fs.readdirSync(outputDir);\n const entries = files.map(file => {\n const filePath = path.join(outputDir, file);\n try {\n const stats = fs.statSync(filePath);\n return {\n fileName: file,\n filePath: filePath,\n fileSize: stats.size,\n mtime: stats.mtimeMs\n };\n } catch {\n return null;\n }\n }).filter((entry): entry is { fileName: string; filePath: string; fileSize: number; mtime: number } => entry !== null);\n\n return {\n size: entries.length,\n entries\n };\n } catch (error) {\n return { size: 0, entries: [] };\n }\n }\n\n /**\n * 删除指定URL的缓存文件\n */\n removeCache(options: VideoDownloadOptions): boolean {\n try {\n const cacheFileName = this.generateCacheFileName(options);\n const cacheFilePath = path.join(options.outputDir, cacheFileName);\n\n if (fs.existsSync(cacheFilePath)) {\n fs.unlinkSync(cacheFilePath);\n console.log(`🗑️ 删除缓存文件: ${cacheFileName}`);\n return true;\n }\n return false;\n } catch (error) {\n console.log('⚠️ 删除缓存文件时发生错误:', error instanceof Error ? error.message : '未知错误');\n return false;\n }\n }\n}\n\n/**\n * 下载视频并转码\n * @param options 下载和转码选项\n * @param callbacks 进度回调\n * @returns 转码结果\n */\nexport const downloadVideo = async (\n options: VideoDownloadOptions,\n callbacks?: VideoProgressCallback\n): Promise<VideoDownloadResult> => {\n const downloader = VideoDownloader.getInstance();\n return downloader.downloadAndTranscode(options, callbacks);\n};\n\n/**\n * 清除指定目录的所有缓存文件\n */\nexport const clearVideoCache = (outputDir: string): void => {\n const downloader = VideoDownloader.getInstance();\n downloader.clearCache(outputDir);\n};\n\n/**\n * 获取缓存统计信息\n */\nexport const getVideoCacheStats = (outputDir: string): { size: number; entries: Array<{ fileName: string; filePath: string; fileSize: number; mtime: number }> } => {\n const downloader = VideoDownloader.getInstance();\n return downloader.getCacheStats(outputDir);\n};\n\n/**\n * 删除指定URL的缓存文件\n */\nexport const removeVideoCache = (options: VideoDownloadOptions): boolean => {\n const downloader = VideoDownloader.getInstance();\n return downloader.removeCache(options);\n};\n\n/**\n * 获取定制Session\n */\nexport const getCustomSession = windowManager.getCustomSession;\n\n/**\n * 获取SDK实例\n * @returns\n */\nexport default new Proxy({} as SDK_TYPE, {\n get(_target, prop) {\n if (!isInitialized) {\n throw new Error('请在ready前先调用initialize');\n }\n if (!prop) {\n // @ts-ignore\n return global['__GLBOAL_ELECTRON_SDK__'];\n }\n // @ts-ignore\n return global['__GLBOAL_ELECTRON_SDK__'][prop];\n },\n set() {\n return false;\n }\n});\n"],"names":["uuidv5"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/main/index.ts"],"sourcesContent":["import type { WebContents } from 'electron'\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport {promisify} from 'node:util';\nimport http from 'node:http';\nimport https from 'node:https';\nimport { spawn, exec } from 'node:child_process';\nimport electron, { app, webContents } from 'electron';\nimport md5 from 'md5';\nimport { v5 as uuidv5 } from 'uuid';\nimport lodash from 'lodash';\nimport * as remote from '@electron/remote/main'\nimport * as ipc from '@lynker-desktop/electron-ipc/main'\nimport * as logs from '@lynker-desktop/electron-logs/main'\nimport * as windowManager from '@lynker-desktop/electron-window-manager/main'\nimport type { PreloadWebContentsConfig } from '@lynker-desktop/electron-window-manager/common'\nimport { IPC_GET_APP_METRICS, type ServeOptions, type VideoDownloadOptions, type VideoProgressCallback, type VideoDownloadResult, type CacheOptions } from '../common';\nimport { initializeStore } from './store';\nimport { initializeClipboard } from './clipboard';\n\nif (!remote.isInitialized()) {\n remote.initialize();\n}\n\nexport let isInitialized = false;\n\nexport interface SDK_TYPE {\n ipc: typeof ipc.mainIPC;\n windowManager: windowManager.WindowsManager,\n getPreload: () => string;\n downloadVideo: (options: VideoDownloadOptions, callbacks?: VideoProgressCallback) => Promise<VideoDownloadResult>;\n clearVideoCache: (outputDir: string) => void;\n getVideoCacheStats: (outputDir: string) => { size: number; entries: Array<{ fileName: string; filePath: string; fileSize: number; mtime: number }> };\n removeVideoCache: (options: VideoDownloadOptions) => boolean;\n}\n\n\nfunction findWebContentsByPid(pid: number): {id: number, url: string} | undefined {\n const all = webContents.getAllWebContents();\n\n const wc = all.find((wc) => {\n try {\n return wc.getOSProcessId() === pid;\n } catch (e) {\n return false;\n }\n });\n // @ts-ignore\n return wc ? {id: wc.id, url: wc.getURL()} : undefined;\n}\n\n\n/**\n * 初始化\n * @param protocol 唤起协议 例:dgz\n * @param preload 预加载js 必须传\n * @param loadingViewUrl 窗口管理默认loading页面\n * @returns\n */\nexport const initialize = (options: { protocol: string, preload: string, loadingViewUrl?: string, errorViewUrl?: string, preloadWebContentsConfig?: PreloadWebContentsConfig, webviewDomainWhiteList?: string[], serveOptions?: ServeOptions, resourceCacheOptions?: ResourceCacheOptions, ffmpegPath?: string }): SDK_TYPE => {\n let {protocol, preload, loadingViewUrl, serveOptions = [], errorViewUrl, preloadWebContentsConfig, webviewDomainWhiteList, resourceCacheOptions} = options;\n if (isInitialized) {\n // @ts-ignore\n return global['__GLBOAL_ELECTRON_SDK__'];\n }\n isInitialized = true;\n ipc.initialize();\n logs.initialize();\n initializeStore();\n initializeClipboard();\n if (options.ffmpegPath) {\n VideoDownloader.getInstance().setFFmpegPath(options.ffmpegPath);\n }\n const wm = windowManager.initialize(preload, loadingViewUrl, errorViewUrl, preloadWebContentsConfig, webviewDomainWhiteList || []);\n if (protocol) {\n registerProtocol(protocol);\n }\n if (!serveOptions) {\n serveOptions = []\n }\n if (resourceCacheOptions) {\n if (resourceCacheOptions.cacheDir) {\n serveOptions.push({\n scheme: ResourceCache.scheme,\n directory: resourceCacheOptions.cacheDir,\n })\n }\n }\n if (serveOptions && serveOptions.length) {\n serve(serveOptions);\n }\n if (resourceCacheOptions) {\n app.on('ready', () => {\n new ResourceCache(electron.session.defaultSession, resourceCacheOptions);\n });\n }\n class SDK {\n static ipc = ipc.mainIPC;\n static windowManager = wm;\n static getPreload = () => preload;\n static downloadVideo = downloadVideo;\n static clearVideoCache = clearVideoCache;\n static getVideoCacheStats = getVideoCacheStats;\n static removeVideoCache = removeVideoCache;\n }\n ipc.mainIPC.handleRenderer(IPC_GET_APP_METRICS, async () => {\n const metrics = app.getAppMetrics().map(i => {\n const webContents = findWebContentsByPid(i.pid || 0);\n console.log('webContents', webContents);\n return {\n ...i,\n webContents: webContents?.id || undefined,\n url: webContents?.url,\n }\n })\n return JSON.stringify(metrics);\n })\n ipc.mainIPC.handleRenderer(`__sdk_transcode_video__`, async (options:VideoDownloadOptions) => {\n const md5Options = md5(JSON.stringify(options.url));\n downloadVideo(options, {\n onDownloadProgress: (progress) => {\n ipc.mainIPC.invokeAllRenderer(`__sdk_transcode_video_callback_${md5Options}__`, {\n type: 'downloadProgress',\n data: progress\n });\n },\n onTranscodeProgress: (progress) => {\n ipc.mainIPC.invokeAllRenderer(`__sdk_transcode_video_callback_${md5Options}__`, {\n type: 'transcodeProgress',\n data: progress\n });\n },\n onComplete: (result) => {\n ipc.mainIPC.invokeAllRenderer(`__sdk_transcode_video_callback_${md5Options}__`, {\n type: 'complete',\n data: result\n });\n },\n });\n return true;\n })\n // @ts-ignore\n global['__GLBOAL_ELECTRON_SDK__'] = SDK;\n return SDK;\n}\n\n/** 后续再优化 */\nexport const getSDK = (): SDK_TYPE => {\n // @ts-ignore\n if (!global['__GLBOAL_ELECTRON_SDK__']) {\n throw '请在ready前先调用initialize'\n }\n // @ts-ignore\n return global['__GLBOAL_ELECTRON_SDK__'];\n}\n\n/**\n * 注册唤起\n */\nexport const registerProtocol = (() => {\n let isRegister = false;\n let launchOptions = ``;\n return (protocol: string) => {\n if (isRegister) {\n return;\n }\n isRegister = true;\n if (process.defaultApp) {\n if (process.argv.length >= 2) {\n app.setAsDefaultProtocolClient(protocol, process.execPath, [path.resolve(lodash.get(process, `argv[1]`, ''))]);\n }\n } else {\n app.setAsDefaultProtocolClient(protocol);\n }\n const handleUrl = (url: string) => {\n launchOptions = `${url ?? ''}`;\n ipc.mainIPC.invokeAllRenderer('__GLOBAL_CHANGE_LAUNCH_OPTIONS__', url)\n };\n\n function handleArgv(argv: string[]) {\n const prefix = `${protocol}:`;\n const offset = app?.isPackaged ? 1 : 2;\n const url = argv.find((arg, i) => i >= offset && arg.startsWith(prefix));\n if (url) handleUrl(url);\n }\n\n handleArgv(process.argv);\n\n app.on('second-instance', (event, argv) => {\n console.info(event)\n if (process.platform === 'win32') {\n // Windows\n handleArgv(argv);\n }\n });\n\n // macOS\n app.on('open-url', (event, urlStr) => {\n console.info(event)\n handleUrl(urlStr);\n });\n\n\n app.on(\"open-url\", (_event, url) => {\n handleUrl(url);\n });\n ipc.mainIPC.handleRenderer('__GLOBAL_GET_LAUNCH_OPTIONS__', async () => {\n return launchOptions;\n })\n ipc.mainIPC.handleRenderer('__GLOBAL_DEL_LAUNCH_OPTIONS__', async () => {\n launchOptions = ``;\n return launchOptions;\n })\n }\n})();\n\n/**\n * 注册协议\n * @param options\n * @returns\n */\nexport const serve = (options: ServeOptions) => {\n if (!options.length) {\n\t\tthrow new Error('请传入配置');\n\t}\n const stat = promisify(fs.stat);\n\n // See https://cs.chromium.org/chromium/src/net/base/net_error_list.h\n const FILE_NOT_FOUND = -6;\n\n const getPath: any = async (path_: string) => {\n try {\n const result = await stat(path_);\n\n if (result.isFile()) {\n return path_;\n }\n\n if (result.isDirectory()) {\n return getPath(path.join(path_, 'index.html'));\n }\n } catch (_) {}\n };\n\n const createHandler = (item: any) => {\n return async (request: any, callback: any) => {\n const indexPath = path.join(item.directory, 'index.html');\n const filePath = path.join(item.directory, decodeURIComponent(new URL(request.url).pathname));\n const resolvedPath = await getPath(filePath);\n const targetPath = resolvedPath || indexPath;\n const ext = path.extname(targetPath).toLowerCase();\n\n if (resolvedPath || !ext || ext === '.html' || ext === '.asar') {\n callback({\n path: resolvedPath || indexPath\n });\n } else {\n callback({error: FILE_NOT_FOUND});\n }\n }\n };\n\n\toptions = options.map((item) => {\n\t\treturn {\n\t\t\t...item,\n\t\t\tisCorsEnabled: !!item?.isCorsEnabled,\n\t\t\tscheme: item?.scheme || 'app',\n\t\t\tdirectory: path.resolve(electron.app.getAppPath(), item.directory),\n\t\t}\n\t})\n // 注册自定义协议的权限配置\n // 说明:\n // bypassCSP: 是否绕过内容安全策略(CSP),允许加载本地资源时不受 CSP 限制\n // standard: 使协议表现得像标准协议(如 http/https),支持标准 API\n // secure: 标记为安全协议,允许安全相关的操作\n // allowServiceWorkers: 允许该协议下注册 Service Worker\n // supportFetchAPI: 允许 fetch/XHR 等 API 访问该协议资源\n // corsEnabled: 是否启用跨域资源共享(CORS)\n // stream: 支持流式传输\n\telectron.protocol.registerSchemesAsPrivileged(options.map((item) => {\n\t\treturn {\n\t\t\tscheme: item.scheme,\n\t\t\tprivileges: {\n bypassCSP: true,\n\t\t\t\tstandard: true,\n\t\t\t\tsecure: true,\n\t\t\t\tallowServiceWorkers: true,\n\t\t\t\tsupportFetchAPI: true,\n\t\t\t\tcorsEnabled: item.isCorsEnabled ?? false,\n stream: true,\n\t\t\t}\n\t\t}\n\t}));\n\treturn new Promise((resolve, reject) => {\n\t\ttry {\n\t\t\telectron.app.on('ready', () => {\n\t\t\t\toptions.forEach((item) => {\n\t\t\t\t\tconst handler = createHandler(item);\n\t\t\t\t\tconst session = item.partition ? electron.session.fromPartition(item.partition) : electron.session.defaultSession;\n\t\t\t\t\tsession.protocol.registerFileProtocol(item.scheme, handler);\n\t\t\t\t})\n\t\t\t\tresolve(true)\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treject(error)\n\t\t}\n\t})\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 match: /\\.(png|jpe?g|webp|gif|svg|woff2?|ttf|mp4|webm|ogg|css|js)(\\?.*)?$/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 /**\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 this._cleanOldCache();\n }\n\n /**\n * 获取资源匹配函数\n */\n private _getMatchFunction(): (url: string) => boolean {\n const matcher = this.options.match;\n if (typeof matcher === 'function') return matcher;\n if (matcher instanceof RegExp) return (url: string) => matcher.test(url);\n return () => false;\n }\n\n /**\n * 获取来源校验函数\n */\n private _getOriginAllowFunction(): (url: string) => boolean {\n const origins = this.options.allowedOrigins;\n if (!origins) return () => true;\n if (typeof origins === 'function') return origins;\n const prefixList = origins.map(o => o.toLowerCase());\n return (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 /**\n * 获取缓存文件路径\n * @param url 资源URL\n */\n public getCachedPath(url: string): { filePath: string, hostPath: string } {\n const md5Str = md5(url);\n const urlObj = new URL(url);\n // 取文件扩展名,若无则用 .res\n const ext = path.extname(urlObj.pathname) || '.res';\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 if (!fs.existsSync(filePath)) return false;\n const stat = fs.statSync(filePath);\n return Date.now() - stat.mtimeMs < this.options.cacheTTL;\n }\n\n /**\n * 下载资源到本地缓存\n * @param url 资源URL\n * @param filePath 本地缓存路径\n */\n public downloadResource(url: string, filePath: string): void {\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 };\n\n request = lib.get(url, (res: http.IncomingMessage) => {\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 }\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 */\n private _cleanOldCache(): void {\n const files = fs.readdirSync(this.options.cacheDir);\n const now = Date.now();\n files.forEach(file => {\n const fullPath = path.join(this.options.cacheDir, file);\n try {\n const stat = fs.statSync(fullPath);\n if (now - stat.mtimeMs > this.options.cacheTTL) {\n fs.unlinkSync(fullPath);\n }\n } catch {\n // 忽略单个文件异常\n }\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 console.log('命中缓存: ', url, cachePath);\n return callback({ redirectURL: cachePath.hostPath});\n }\n console.log('未命中缓存: ', url);\n // 未命中则异步下载,当前请求正常放行\n this.downloadResource(url, cachePath.filePath);\n return callback({});\n }\n );\n }\n}\n\n/**\n * @electron/remote/main enable方法\n * @param webContents\n * @returns\n */\nexport const enable = (webContents: WebContents) => remote.enable(webContents);\n\n/**\n * 生成跨平台的文件URL\n * @param filePath 文件路径\n * @returns file:// URL\n */\nexport function getFileUrl(filePath: string): string {\n if (!filePath) {\n return '';\n }\n if (filePath.startsWith('file://')) {\n return filePath;\n }\n // 在Windows上,需要添加驱动器字母前的斜杠\n if (process.platform === 'win32') {\n // 如果路径是绝对路径(如 C:\\path\\to\\file),转换为 /C:/path/to/file\n if (filePath.match(/^[A-Za-z]:/)) {\n return `file:///${filePath}`;\n }\n // 如果已经是 /C:/path/to/file 格式,直接添加 file://\n return `file://${filePath}`;\n }\n\n // macOS 和 Linux 使用 file:/// 前缀\n return `file://${filePath}`;\n}\n\n/**\n * 获取随机UUID\n * @param key\n * @returns\n */\nexport function getRandomUUID(key: string = `${Date.now()}`): string {\n let webcrypto!: Crypto;\n let randomValue = Math?.random()?.toString()?.replace('0.', '');\n try {\n if (!webcrypto && !!window && window?.crypto) {\n webcrypto = window.crypto;\n }\n } catch (error) {console.log}\n try {\n const ar = webcrypto.getRandomValues(new Uint8Array(12));\n randomValue = `${md5(ar)}` || randomValue;\n } catch (error) {}\n const uuid = uuidv5(\n `${JSON.stringify(key)}_${Date.now()}_${randomValue}`,\n uuidv5.URL,\n );\n return uuid;\n}\n\n/**\n * 视频下载和转码类\n */\nclass VideoDownloader {\n private ffmpegPath: string = '';\n private static instance: VideoDownloader;\n private defaultCacheTTL: number = 24 * 60 * 60 * 1000; // 24小时缓存有效期\n\n static getInstance(): VideoDownloader {\n if (!VideoDownloader.instance) {\n VideoDownloader.instance = new VideoDownloader();\n }\n return VideoDownloader.instance;\n }\n\n setFFmpegPath(ffmpegPath: string): void {\n this.ffmpegPath = ffmpegPath;\n }\n\n /**\n * 下载视频文件\n */\n private async downloadVideoFile(\n url: string,\n outputPath: string,\n onProgress?: (progress: { downloaded: number; total: number; percentage: number; speed: number }) => void\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const lib = url.startsWith('https') ? https : http;\n const file = fs.createWriteStream(outputPath);\n let downloadedBytes = 0;\n let totalBytes = 0;\n let startTime = Date.now();\n let lastTime = startTime;\n let lastBytes = 0;\n\n const cleanup = () => {\n if (file) {\n file.close();\n fs.unlinkSync(outputPath);\n }\n };\n\n const request = lib.get(url, (res) => {\n if (res.statusCode !== 200) {\n cleanup();\n reject(new Error(`下载失败,状态码: ${res.statusCode}`));\n return;\n }\n\n totalBytes = parseInt(res.headers['content-length'] || '0', 10);\n\n res.on('data', (chunk) => {\n downloadedBytes += chunk.length;\n const now = Date.now();\n\n if (onProgress && (now - lastTime > 100 || downloadedBytes === totalBytes)) {\n const speed = ((downloadedBytes - lastBytes) * 1000) / (now - lastTime);\n onProgress({\n downloaded: downloadedBytes,\n total: totalBytes,\n percentage: totalBytes > 0 ? (downloadedBytes / totalBytes) * 100 : 0,\n speed: speed || 0\n });\n lastTime = now;\n lastBytes = downloadedBytes;\n }\n });\n\n res.pipe(file);\n\n file.on('finish', () => {\n file.close();\n resolve();\n });\n\n file.on('error', (err) => {\n cleanup();\n reject(err);\n });\n });\n\n request.on('error', (err) => {\n cleanup();\n reject(err);\n });\n });\n }\n\n /**\n * 使用FFmpeg转码视频\n */\n private async transcodeVideo(\n inputPath: string,\n outputPath: string,\n options: VideoDownloadOptions,\n onProgress?: (progress: { percentage: number; time: number; speed: number }) => void\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const ffmpegPath = options.ffmpegPath || this.ffmpegPath;\n if (!ffmpegPath) {\n reject(new Error('FFmpeg路径未设置'));\n return;\n }\n const format = options.format || 'mp4';\n const quality = options.quality || 18;\n const videoCodec = options.videoCodec || 'h264';\n const audioCodec = options.audioCodec || 'aac';\n\n // 根据格式选择合适的编码器\n const getCodecForFormat = (format: string, videoCodec: string, audioCodec: string) => {\n switch (format) {\n case 'webm':\n return {\n videoCodec: videoCodec === 'h264' ? 'libvpx-vp9' : videoCodec,\n audioCodec: audioCodec === 'aac' ? 'libopus' : audioCodec\n };\n case 'avi':\n return {\n videoCodec: videoCodec === 'h265' ? 'h264' : videoCodec, // AVI不支持H265\n audioCodec: audioCodec === 'opus' ? 'mp3' : audioCodec\n };\n case 'mov':\n return {\n videoCodec: videoCodec === 'vp9' ? 'h264' : videoCodec, // MOV对VP9支持有限\n audioCodec: audioCodec === 'opus' ? 'aac' : audioCodec\n };\n default: // mp4, mkv\n return { videoCodec, audioCodec };\n }\n };\n\n const { videoCodec: finalVideoCodec, audioCodec: finalAudioCodec } = getCodecForFormat(format, videoCodec, audioCodec);\n\n // 构建FFmpeg命令\n const args = [\n '-i', inputPath,\n '-c:v', finalVideoCodec,\n '-c:a', finalAudioCodec,\n '-crf', quality.toString(),\n '-preset', 'medium',\n '-f', format, // 指定输出格式\n '-y', // 覆盖输出文件\n outputPath\n ];\n\n const ffmpegProcess = spawn(ffmpegPath, args);\n let duration = 0;\n let stderr = '';\n\n ffmpegProcess.stderr.on('data', (data: Buffer) => {\n stderr += data.toString();\n\n // 解析FFmpeg输出获取进度\n if (onProgress) {\n const durationMatch = stderr.match(/Duration: (\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{2})/);\n if (durationMatch && duration === 0) {\n const hours = parseInt(durationMatch[1] || '0', 10);\n const minutes = parseInt(durationMatch[2] || '0', 10);\n const seconds = parseInt(durationMatch[3] || '0', 10);\n const centiseconds = parseInt(durationMatch[4] || '0', 10);\n duration = hours * 3600 + minutes * 60 + seconds + centiseconds / 100;\n }\n\n const timeMatch = stderr.match(/time=(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{2})/);\n if (timeMatch && duration > 0) {\n const hours = parseInt(timeMatch[1] || '0', 10);\n const minutes = parseInt(timeMatch[2] || '0', 10);\n const seconds = parseInt(timeMatch[3] || '0', 10);\n const centiseconds = parseInt(timeMatch[4] || '0', 10);\n const currentTime = hours * 3600 + minutes * 60 + seconds + centiseconds / 100;\n\n const percentage = (currentTime / duration) * 100;\n const speedMatch = stderr.match(/speed=([\\d.]+)x/);\n const speed = speedMatch ? parseFloat(speedMatch[1] || '1') : 1;\n\n onProgress({\n percentage: Math.min(percentage, 100),\n time: currentTime,\n speed: speed\n });\n }\n }\n });\n\n ffmpegProcess.on('close', (code: number) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`FFmpeg转码失败,退出码: ${code}\\n${stderr}`));\n }\n });\n\n ffmpegProcess.on('error', (err: Error) => {\n reject(new Error(`FFmpeg执行失败: ${err.message}`));\n });\n });\n }\n\n /**\n * 检查FFmpeg是否可用\n */\n private async checkFFmpegAvailable(ffmpegPath?: string): Promise<boolean> {\n return new Promise((resolve) => {\n const command = ffmpegPath || this.ffmpegPath;\n if (!command) {\n resolve(false);\n return;\n }\n const childProcess = spawn(command, ['-version']);\n childProcess.on('error', (error) => {\n console.log(\"checkFFmpegAvailable\", error);\n resolve(false);\n });\n childProcess.on('close', (code) => {\n console.log(\"checkFFmpegAvailable\", code);\n resolve(code === 0);\n });\n });\n }\n\n /**\n * 获取视频信息\n */\n private async getVideoInfo(inputPath: string, ffmpegPath?: string): Promise<{ duration: number; fileSize: number }> {\n return new Promise((resolve, reject) => {\n const ffmpegPath_cmd = ffmpegPath || this.ffmpegPath;\n const args = ['-i', inputPath, '-f', 'null', '-'];\n if (!ffmpegPath_cmd) {\n resolve({ duration: 0, fileSize: 0 });\n return;\n }\n const ffmpegProcess = spawn(ffmpegPath_cmd, args);\n let stderr = '';\n let duration = 0;\n\n ffmpegProcess.stderr.on('data', (data: Buffer) => {\n stderr += data.toString();\n const durationMatch = stderr.match(/Duration: (\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{2})/);\n if (durationMatch) {\n const hours = parseInt(durationMatch[1] || '0', 10);\n const minutes = parseInt(durationMatch[2] || '0', 10);\n const seconds = parseInt(durationMatch[3] || '0', 10);\n const centiseconds = parseInt(durationMatch[4] || '0', 10);\n duration = hours * 3600 + minutes * 60 + seconds + centiseconds / 100;\n }\n });\n\n ffmpegProcess.on('close', () => {\n const stats = fs.statSync(inputPath);\n resolve({\n duration,\n fileSize: stats.size\n });\n });\n\n ffmpegProcess.on('error', (err: Error) => {\n reject(err);\n });\n });\n }\n\n /**\n * 生成缓存文件名(基于URL的MD5)\n */\n private generateCacheFileName(options: VideoDownloadOptions): string {\n const format = options.format || 'mp4';\n const urlMd5 = md5(options.url);\n return `${urlMd5}.${format}`;\n }\n\n /**\n * 检查缓存文件是否存在\n */\n private isCacheFileExists(cacheFilePath: string): boolean {\n console.log('检查缓存文件是否存在: ', cacheFilePath);\n return fs.existsSync(cacheFilePath);\n }\n\n /**\n * 清理过期缓存文件\n */\n private cleanExpiredCacheFiles(outputDir: string, cacheTTL: number = this.defaultCacheTTL): void {\n try {\n const files = fs.readdirSync(outputDir);\n const now = Date.now();\n\n files.forEach(file => {\n const filePath = path.join(outputDir, file);\n try {\n const stats = fs.statSync(filePath);\n // 如果文件超过缓存时间,删除它\n if (now - stats.mtimeMs > cacheTTL) {\n fs.unlinkSync(filePath);\n console.log(`🧹 删除过期缓存文件: ${file}`);\n }\n } catch (error) {\n // 忽略单个文件错误\n }\n });\n } catch (error) {\n // 忽略目录读取错误\n }\n }\n\n /**\n * 下载并转码视频\n */\n async downloadAndTranscode(\n options: VideoDownloadOptions,\n callbacks?: VideoProgressCallback\n ): Promise<VideoDownloadResult> {\n try {\n const outputDir = options.outputDir || app.getPath('temp');\n // 获取缓存配置\n const cacheConfig = options.cache || { enabled: true, ttl: this.defaultCacheTTL };\n const cacheEnabled = cacheConfig.enabled !== false;\n const cacheTTL = cacheConfig.ttl || this.defaultCacheTTL;\n\n // 确保输出目录存在\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // 清理过期缓存文件\n this.cleanExpiredCacheFiles(outputDir, cacheTTL);\n\n // 生成缓存文件名\n const cacheFileName = this.generateCacheFileName(options);\n const cacheFilePath = path.join(outputDir, cacheFileName);\n\n // 如果启用缓存,检查缓存文件是否存在\n if (cacheEnabled && this.isCacheFileExists(cacheFilePath)) {\n console.log('🎯 命中缓存,直接返回缓存文件');\n\n // 获取文件信息\n const stats = fs.statSync(cacheFilePath);\n\n const result: VideoDownloadResult = {\n success: true,\n outputPath: getFileUrl(cacheFilePath),\n fileSize: stats.size,\n fromCache: true\n };\n\n callbacks?.onComplete?.({\n success: true,\n outputPath: result.outputPath\n });\n\n return result;\n }\n\n // 检查FFmpeg是否可用\n const ffmpegAvailable = await this.checkFFmpegAvailable(options.ffmpegPath);\n if (!ffmpegAvailable) {\n throw new Error('FFmpeg不可用,请确保已安装FFmpeg或提供正确的路径');\n }\n\n // 生成临时文件名和最终输出路径\n const fileName = options.outputName || md5(options.url);\n const format = options.format || 'mp4';\n const tempPath = path.join(outputDir, `${fileName}.temp`);\n const finalOutputPath = path.join(outputDir, `${fileName}.${format}`);\n const outputPath = cacheEnabled ? cacheFilePath : finalOutputPath;\n\n console.log('📥 开始下载视频...');\n // 下载视频\n await this.downloadVideoFile(\n options.url,\n tempPath,\n callbacks?.onDownloadProgress\n );\n\n console.log('🔄 开始转码视频...');\n // 转码视频\n await this.transcodeVideo(\n tempPath,\n outputPath,\n {\n ...options,\n outputDir\n },\n callbacks?.onTranscodeProgress\n );\n\n // 如果启用了缓存,将缓存文件复制到最终输出路径\n if (cacheEnabled && outputPath !== finalOutputPath) {\n fs.copyFileSync(outputPath, finalOutputPath);\n console.log('📋 缓存文件已复制到最终输出路径');\n }\n\n // 获取视频信息\n const videoInfo = await this.getVideoInfo(outputPath, options.ffmpegPath);\n\n // 清理临时文件\n if (!options.keepOriginal) {\n fs.unlinkSync(tempPath);\n }\n\n console.log('💾 文件已保存到缓存');\n\n const result: VideoDownloadResult = {\n success: true,\n outputPath: getFileUrl(cacheEnabled ? finalOutputPath : outputPath),\n originalPath: options.keepOriginal ? getFileUrl(tempPath) : undefined,\n duration: videoInfo.duration,\n fileSize: videoInfo.fileSize,\n fromCache: false\n };\n\n callbacks?.onComplete?.({\n success: true,\n outputPath: result.outputPath\n });\n\n return result;\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '未知错误';\n\n const result: VideoDownloadResult = {\n success: false,\n error: errorMessage\n };\n\n callbacks?.onComplete?.({\n success: false,\n error: errorMessage\n });\n\n return result;\n }\n }\n\n /**\n * 清除指定目录的所有缓存文件\n */\n clearCache(outputDir: string): void {\n try {\n const files = fs.readdirSync(outputDir);\n files.forEach(file => {\n const filePath = path.join(outputDir, file);\n try {\n fs.unlinkSync(filePath);\n } catch (error) {\n // 忽略单个文件删除错误\n }\n });\n console.log('🧹 缓存文件已清空');\n } catch (error) {\n console.log('⚠️ 清理缓存时发生错误:', error instanceof Error ? error.message : '未知错误');\n }\n }\n\n /**\n * 获取缓存统计信息\n */\n getCacheStats(outputDir: string): { size: number; entries: Array<{ fileName: string; filePath: string; fileSize: number; mtime: number }> } {\n try {\n const files = fs.readdirSync(outputDir);\n const entries = files.map(file => {\n const filePath = path.join(outputDir, file);\n try {\n const stats = fs.statSync(filePath);\n return {\n fileName: file,\n filePath: filePath,\n fileSize: stats.size,\n mtime: stats.mtimeMs\n };\n } catch {\n return null;\n }\n }).filter((entry): entry is { fileName: string; filePath: string; fileSize: number; mtime: number } => entry !== null);\n\n return {\n size: entries.length,\n entries\n };\n } catch (error) {\n return { size: 0, entries: [] };\n }\n }\n\n /**\n * 删除指定URL的缓存文件\n */\n removeCache(options: VideoDownloadOptions): boolean {\n try {\n const cacheFileName = this.generateCacheFileName(options);\n const cacheFilePath = path.join(options.outputDir, cacheFileName);\n\n if (fs.existsSync(cacheFilePath)) {\n fs.unlinkSync(cacheFilePath);\n console.log(`🗑️ 删除缓存文件: ${cacheFileName}`);\n return true;\n }\n return false;\n } catch (error) {\n console.log('⚠️ 删除缓存文件时发生错误:', error instanceof Error ? error.message : '未知错误');\n return false;\n }\n }\n}\n\n/**\n * 下载视频并转码\n * @param options 下载和转码选项\n * @param callbacks 进度回调\n * @returns 转码结果\n */\nexport const downloadVideo = async (\n options: VideoDownloadOptions,\n callbacks?: VideoProgressCallback\n): Promise<VideoDownloadResult> => {\n const downloader = VideoDownloader.getInstance();\n return downloader.downloadAndTranscode(options, callbacks);\n};\n\n/**\n * 清除指定目录的所有缓存文件\n */\nexport const clearVideoCache = (outputDir: string): void => {\n const downloader = VideoDownloader.getInstance();\n downloader.clearCache(outputDir);\n};\n\n/**\n * 获取缓存统计信息\n */\nexport const getVideoCacheStats = (outputDir: string): { size: number; entries: Array<{ fileName: string; filePath: string; fileSize: number; mtime: number }> } => {\n const downloader = VideoDownloader.getInstance();\n return downloader.getCacheStats(outputDir);\n};\n\n/**\n * 删除指定URL的缓存文件\n */\nexport const removeVideoCache = (options: VideoDownloadOptions): boolean => {\n const downloader = VideoDownloader.getInstance();\n return downloader.removeCache(options);\n};\n\n/**\n * 获取定制Session\n */\nexport const getCustomSession = windowManager.getCustomSession;\n\n/**\n * 获取SDK实例\n * @returns\n */\nexport default new Proxy({} as SDK_TYPE, {\n get(_target, prop) {\n if (!isInitialized) {\n throw new Error('请在ready前先调用initialize');\n }\n if (!prop) {\n // @ts-ignore\n return global['__GLBOAL_ELECTRON_SDK__'];\n }\n // @ts-ignore\n return global['__GLBOAL_ELECTRON_SDK__'][prop];\n },\n set() {\n return false;\n }\n});\n"],"names":["uuidv5"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface ClipboardFileData {
|
|
2
|
+
name: string;
|
|
3
|
+
path: string;
|
|
4
|
+
size: number;
|
|
5
|
+
type: string;
|
|
6
|
+
lastModified: number;
|
|
7
|
+
buffer?: ArrayBuffer;
|
|
8
|
+
}
|
|
9
|
+
export interface ClipboardData {
|
|
10
|
+
type: 'text' | 'html' | 'image' | 'file' | 'files' | 'url' | 'buffer';
|
|
11
|
+
text?: string;
|
|
12
|
+
html?: string;
|
|
13
|
+
image?: ClipboardFileData;
|
|
14
|
+
file?: ClipboardFileData;
|
|
15
|
+
files?: ClipboardFileData[];
|
|
16
|
+
url?: string;
|
|
17
|
+
buffer?: ArrayBuffer;
|
|
18
|
+
}
|
|
19
|
+
export interface ClipboardQuery {
|
|
20
|
+
method: 'set' | 'get' | 'clear';
|
|
21
|
+
value?: string | ClipboardFileData | ClipboardFileData[] | ArrayBuffer;
|
|
22
|
+
type?: 'text' | 'html' | 'image' | 'file' | 'url' | 'buffer' | 'auto';
|
|
23
|
+
options?: {
|
|
24
|
+
includeBuffer?: boolean;
|
|
25
|
+
maxFileSize?: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 初始化剪贴板 IPC 处理器
|
|
30
|
+
*/
|
|
31
|
+
export declare const initializeClipboard: () => void;
|
|
32
|
+
//# sourceMappingURL=clipboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../src/main/clipboard.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,iBAAiB,GAAG,iBAAiB,EAAE,GAAG,WAAW,CAAC;IACvE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtE,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AA09BD;;GAEG;AACH,eAAO,MAAM,mBAAmB,YA0F/B,CAAA"}
|