@lynker-desktop/electron-sdk 0.0.9-alpha.62 → 0.0.9-alpha.65
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.map +1 -1
- package/esm/main/clipboard.js +245 -44
- package/esm/main/clipboard.js.map +1 -1
- package/esm/main/downloader.d.ts +15 -1
- package/esm/main/downloader.d.ts.map +1 -1
- package/esm/main/downloader.js +132 -40
- package/esm/main/downloader.js.map +1 -1
- 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/esm/main/shortcut.d.ts +14 -0
- package/esm/main/shortcut.d.ts.map +1 -0
- package/esm/main/shortcut.js +173 -0
- package/esm/main/shortcut.js.map +1 -0
- package/main/clipboard.d.ts.map +1 -1
- package/main/clipboard.js +245 -44
- package/main/clipboard.js.map +1 -1
- package/main/downloader.d.ts +15 -1
- package/main/downloader.d.ts.map +1 -1
- package/main/downloader.js +132 -40
- package/main/downloader.js.map +1 -1
- package/main/index.d.ts.map +1 -1
- package/main/index.js +2 -0
- package/main/index.js.map +1 -1
- package/main/shortcut.d.ts +14 -0
- package/main/shortcut.d.ts.map +1 -0
- package/main/shortcut.js +173 -0
- package/main/shortcut.js.map +1 -0
- package/package.json +5 -5
|
@@ -1 +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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"}
|
|
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// 图片相关的剪贴板格式\nconst IMAGE_FORMATS = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif', 'image/bmp', 'image/webp', 'image/tiff', 'image/x-png', 'image/x-icon'];\n// Windows 文件格式\nconst WINDOWS_FILE_FORMAT = 'FileNameW';\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 if (!str || typeof str !== 'string') {\n return false;\n }\n\n const trimmed = str.trim();\n if (trimmed.length === 0) {\n return false;\n }\n\n try {\n const url = new URL(trimmed);\n // 必须是 http 或 https 协议\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n return false;\n }\n // 必须有 hostname\n if (!url.hostname || url.hostname.length === 0) {\n return false;\n }\n // 避免将本地文件路径误判为 URL(如 C:\\path\\to\\file)\n if (url.hostname.includes('\\\\') || url.hostname.includes(':')) {\n return false;\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * 检查剪贴板是否有图片格式\n */\nfunction hasImageFormat(): boolean {\n try {\n const formats = clipboard.availableFormats();\n // 检查是否有图片格式\n for (const format of formats) {\n if (!format) continue;\n const lowerFormat = format.toLowerCase();\n // 检查是否匹配图片格式\n if (IMAGE_FORMATS.some(imgFormat => lowerFormat.includes(imgFormat.toLowerCase()))) {\n return true;\n }\n // 检查常见的图片格式标识\n if (lowerFormat.startsWith('image/')) {\n return true;\n }\n }\n // Electron 的 readImage 可能在没有明确格式时也能读取\n // 尝试读取一次来验证(但不实际读取数据,只检查是否为空)\n try {\n const image = clipboard.readImage();\n if (!image.isEmpty()) {\n return true;\n }\n } catch {\n // 读取失败,说明不是图片\n }\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * 检查剪贴板是否有文件格式\n */\nfunction hasFileFormat(): boolean {\n try {\n const formats = clipboard.availableFormats();\n\n if (PLATFORM === 'win32') {\n // Windows: 检查 FileNameW 格式\n return formats.includes(WINDOWS_FILE_FORMAT);\n } else {\n // macOS/Linux: 检查文件 URI 格式\n for (const format of UNIX_FILE_FORMATS) {\n if (formats.includes(format)) {\n return true;\n }\n }\n // 也检查文本中是否包含 file:// URI\n try {\n const text = clipboard.readText();\n if (text && text.includes(FILE_URI_PREFIX)) {\n // 进一步验证:检查是否真的是文件路径\n const lines = text.split('\\n').filter(Boolean);\n for (const line of lines) {\n if (line.trim().startsWith(FILE_URI_PREFIX)) {\n const filePath = parseFileUri(line.trim());\n const normalizedPath = normalizeFilePath(filePath);\n if (fs.existsSync(normalizedPath)) {\n const stat = fs.statSync(normalizedPath);\n if (stat.isFile()) {\n return true;\n }\n }\n }\n }\n }\n } catch {\n // 忽略错误\n }\n }\n\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * 检查剪贴板内容是否为 URL(基于格式判断,不读取内容)\n */\nfunction hasUrlFormat(): boolean {\n try {\n const formats = clipboard.availableFormats();\n\n // 检查是否有 URL 相关的格式\n if (formats.includes('text/uri-list') || formats.includes('text/x-moz-url')) {\n return true;\n }\n\n // 注意:这里不读取文本内容来判断,因为读取会消耗剪贴板\n // URL 检测将在 handleGetUrl 中进行\n\n return false;\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 // 先检查是否有图片格式,避免误判\n if (!hasImageFormat()) {\n // 即使没有明确的图片格式,也尝试读取(Electron 可能能读取)\n // 但如果读取失败,返回空结果\n const imageData = createImageFileDataFromClipboard(options);\n if (imageData) {\n return { type: 'image', image: imageData };\n }\n return { type: 'image' };\n }\n\n // 有图片格式,尝试读取\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 if (!hasUrlFormat()) {\n return { type: 'url' };\n }\n\n // 检查是否有 URL 相关的格式\n const formats = clipboard.availableFormats();\n\n // 优先检查 text/uri-list 或 text/x-moz-url 格式\n if (formats.includes('text/uri-list') || formats.includes('text/x-moz-url')) {\n try {\n const uriList = clipboard.readText();\n if (uriList) {\n const uris = uriList.split('\\n').filter(Boolean);\n // 查找第一个有效的 HTTP/HTTPS URL\n for (const uri of uris) {\n const trimmed = uri.trim();\n if (isUrl(trimmed)) {\n return { type: 'url', url: trimmed };\n }\n }\n }\n } catch {\n // 忽略错误,继续尝试其他方法\n }\n }\n\n // 尝试从普通文本中读取 URL\n try {\n const text = clipboard.readText();\n if (text) {\n const trimmed = text.trim();\n // 检查整段文本是否为 URL\n if (isUrl(trimmed)) {\n return { type: 'url', url: trimmed };\n }\n // 尝试从文本中提取 URL(简单模式:查找 http:// 或 https://)\n const urlMatch = trimmed.match(/https?:\\/\\/[^\\s]+/);\n if (urlMatch && urlMatch[0] && isUrl(urlMatch[0])) {\n return { type: 'url', url: urlMatch[0] };\n }\n }\n } catch {\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 // 先检查是否有文件格式,避免误判\n if (!hasFileFormat()) {\n return { type: 'file' };\n }\n\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 * 自动检测类型(基于格式检测,优先文件,然后是图片、URL,最后是文本)\n */\nfunction handleGetAuto(options?: ClipboardQuery['options']): ClipboardData {\n // 先获取剪贴板格式,避免重复调用\n let formats: string[] = [];\n try {\n formats = clipboard.availableFormats();\n } catch {\n // 如果获取格式失败,降级到文本\n const text = handleGetText();\n return { type: 'text', text: text || '' };\n }\n\n // 1. 优先检测文件(基于格式检测)\n if (hasFileFormat()) {\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\n // 2. 检测图片(基于格式检测)\n if (hasImageFormat()) {\n const imageData = createImageFileDataFromClipboard(options);\n if (imageData) {\n return { type: 'image', image: imageData };\n }\n }\n\n // 3. 检测 URL(基于格式检测,或文本内容判断)\n // 优先检查是否有 URL 格式\n if (hasUrlFormat()) {\n const urlResult = handleGetUrl();\n if (urlResult.url) {\n return urlResult;\n }\n }\n\n // 4. 检测 HTML(检查格式)\n if (formats.includes('text/html') || formats.some(f => f && f.toLowerCase().includes('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\n // 5. 最后读取文本,并检查是否为 URL\n const text = safeClipboardOperation(\n () => clipboard.readText(),\n '',\n '读取文本失败:'\n );\n\n if (text && text.trim().length > 0) {\n const trimmed = text.trim();\n // 如果文本是纯 URL(单行且是有效的 URL),且之前没有检测到 URL 格式\n // 则判断为 URL 类型\n if (!trimmed.includes('\\n') && isUrl(trimmed)) {\n return { type: 'url', url: trimmed };\n }\n // 否则返回文本类型\n return { type: 'text', text: trimmed };\n }\n\n return { type: '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/downloader.d.ts
CHANGED
|
@@ -109,6 +109,14 @@ declare class Downloader {
|
|
|
109
109
|
url: string;
|
|
110
110
|
id?: string;
|
|
111
111
|
}>;
|
|
112
|
+
/**
|
|
113
|
+
* 获取文件名(统一处理所有来源)
|
|
114
|
+
* @param url 下载 URL
|
|
115
|
+
* @param options 下载选项
|
|
116
|
+
* @param defaultExt 默认扩展名(可选,用于 base64 URL)
|
|
117
|
+
* @returns 清理后的文件名
|
|
118
|
+
*/
|
|
119
|
+
private _getFileName;
|
|
112
120
|
/**
|
|
113
121
|
* 显示保存对话框
|
|
114
122
|
* @param url 下载 URL
|
|
@@ -166,10 +174,16 @@ declare class Downloader {
|
|
|
166
174
|
* @returns 唯一的文件名
|
|
167
175
|
*/
|
|
168
176
|
private _generateUniqueFileName;
|
|
177
|
+
/**
|
|
178
|
+
* 清理文件名,移除 query 参数和特殊字符
|
|
179
|
+
* @param fileName 原始文件名
|
|
180
|
+
* @returns 清理后的文件名
|
|
181
|
+
*/
|
|
182
|
+
private _cleanFileName;
|
|
169
183
|
/**
|
|
170
184
|
* 从 URL 中提取文件名
|
|
171
185
|
* @param url 下载 URL
|
|
172
|
-
* @returns
|
|
186
|
+
* @returns 文件名(已清理特殊字符,不包含query参数)
|
|
173
187
|
*/
|
|
174
188
|
private _extractFileNameFromUrl;
|
|
175
189
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloader.d.ts","sourceRoot":"","sources":["../../src/main/downloader.ts"],"names":[],"mappings":"AA4CA;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,CAAC,QAAQ,EAAE;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,KAAK,IAAI,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,sBAAsB;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2BAA2B;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sBAAsB;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,KAAK,CAAC,EAAE;QACN,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,mBAAmB;IACnB,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,mBAAmB;IACnB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,mBAAmB;IACnB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,gBAAgB;IAChB,kBAAkB,CAAC,EAAE;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,cAAM,UAAU;IACd,2BAA2B;IAC3B,OAAO,CAAC,gBAAgB,CAAuC;IAC/D,oBAAoB;IACpB,OAAO,CAAC,gBAAgB,CAAuB;;IAiC/C;;;;;;OAMG;IACU,QAAQ,CACnB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,eAAoB,EAC7B,UAAU,CAAC,EAAE,wBAAwB,GACpC,OAAO,CAAC,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"downloader.d.ts","sourceRoot":"","sources":["../../src/main/downloader.ts"],"names":[],"mappings":"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"}
|
package/esm/main/downloader.js
CHANGED
|
@@ -115,13 +115,17 @@ class Downloader {
|
|
|
115
115
|
return pathCheckResult;
|
|
116
116
|
}
|
|
117
117
|
const downloadDir = path.dirname(outputPath);
|
|
118
|
-
|
|
118
|
+
let downloadFileName = path.basename(outputPath);
|
|
119
|
+
// 再次清理文件名,确保不包含 query 参数和特殊字符
|
|
120
|
+
downloadFileName = this._cleanFileName(downloadFileName);
|
|
121
|
+
// 更新 outputPath 使用清理后的文件名
|
|
122
|
+
outputPath = path.join(downloadDir, downloadFileName);
|
|
119
123
|
// 如果是 base64 data URL,使用已确定的输出路径进行处理
|
|
120
124
|
if (base64Info.isBase64 && base64Info.ext && base64Info.mimeType && base64Info.data) {
|
|
121
125
|
return await this._handleBase64Download(url, { ext: base64Info.ext, mimeType: base64Info.mimeType, data: base64Info.data }, outputPath, options, progressCallback);
|
|
122
126
|
}
|
|
123
127
|
// 使用临时文件下载,避免下载中断时文件不完整
|
|
124
|
-
const tempFilePath =
|
|
128
|
+
const tempFilePath = path.join(downloadDir, downloadFileName + '.cache');
|
|
125
129
|
return new Promise((resolve, reject) => {
|
|
126
130
|
// 创建下载器实例
|
|
127
131
|
const dl = new DownloaderHelper(url, downloadDir, {
|
|
@@ -270,31 +274,36 @@ class Downloader {
|
|
|
270
274
|
});
|
|
271
275
|
}
|
|
272
276
|
/**
|
|
273
|
-
*
|
|
277
|
+
* 获取文件名(统一处理所有来源)
|
|
274
278
|
* @param url 下载 URL
|
|
275
279
|
* @param options 下载选项
|
|
276
280
|
* @param defaultExt 默认扩展名(可选,用于 base64 URL)
|
|
277
|
-
* @returns
|
|
281
|
+
* @returns 清理后的文件名
|
|
278
282
|
*/
|
|
279
|
-
|
|
280
|
-
//
|
|
281
|
-
let defaultFileName;
|
|
283
|
+
_getFileName(url, options, defaultExt) {
|
|
284
|
+
// 优先级:defaultPath > fileName > defaultExt > URL提取
|
|
282
285
|
if (options.defaultPath) {
|
|
283
|
-
|
|
286
|
+
return this._cleanFileName(path.basename(options.defaultPath));
|
|
284
287
|
}
|
|
285
|
-
|
|
286
|
-
|
|
288
|
+
if (options.fileName) {
|
|
289
|
+
return this._cleanFileName(options.fileName);
|
|
287
290
|
}
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
if (defaultExt) {
|
|
291
|
-
// 如果提供了默认扩展名(base64 情况),使用它
|
|
292
|
-
defaultFileName = `${DEFAULT_FILENAME}.${defaultExt}`;
|
|
293
|
-
}
|
|
294
|
-
else {
|
|
295
|
-
defaultFileName = this._extractFileNameFromUrl(url);
|
|
296
|
-
}
|
|
291
|
+
if (defaultExt) {
|
|
292
|
+
return this._cleanFileName(`${DEFAULT_FILENAME}.${defaultExt}`);
|
|
297
293
|
}
|
|
294
|
+
// 从 URL 中提取文件名(_extractFileNameFromUrl 已经包含清理逻辑)
|
|
295
|
+
return this._extractFileNameFromUrl(url);
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* 显示保存对话框
|
|
299
|
+
* @param url 下载 URL
|
|
300
|
+
* @param options 下载选项
|
|
301
|
+
* @param defaultExt 默认扩展名(可选,用于 base64 URL)
|
|
302
|
+
* @returns Promise<string | null> 用户选择的保存路径,如果取消则返回 null
|
|
303
|
+
*/
|
|
304
|
+
async _showSaveDialog(url, options, defaultExt) {
|
|
305
|
+
// 获取并清理默认文件名
|
|
306
|
+
let defaultFileName = this._getFileName(url, options, defaultExt);
|
|
298
307
|
// 获取默认目录
|
|
299
308
|
let defaultDir;
|
|
300
309
|
if (options.defaultPath) {
|
|
@@ -514,18 +523,112 @@ class Downloader {
|
|
|
514
523
|
} while (fs.existsSync(newPath) && counter < MAX_FILENAME_COUNTER);
|
|
515
524
|
return newFileName;
|
|
516
525
|
}
|
|
526
|
+
/**
|
|
527
|
+
* 清理文件名,移除 query 参数和特殊字符
|
|
528
|
+
* @param fileName 原始文件名
|
|
529
|
+
* @returns 清理后的文件名
|
|
530
|
+
*/
|
|
531
|
+
_cleanFileName(fileName) {
|
|
532
|
+
if (!fileName || fileName.length === 0) {
|
|
533
|
+
return DEFAULT_FILENAME;
|
|
534
|
+
}
|
|
535
|
+
// 移除 query 参数(如果文件名中包含 ?)
|
|
536
|
+
const queryIndex = fileName.indexOf('?');
|
|
537
|
+
if (queryIndex !== -1) {
|
|
538
|
+
fileName = fileName.substring(0, queryIndex);
|
|
539
|
+
}
|
|
540
|
+
// 解码 URL 编码的字符(如 %20 -> 空格)
|
|
541
|
+
try {
|
|
542
|
+
fileName = decodeURIComponent(fileName);
|
|
543
|
+
}
|
|
544
|
+
catch {
|
|
545
|
+
// 如果解码失败,使用原始文件名
|
|
546
|
+
}
|
|
547
|
+
// 清理文件名中的特殊字符(文件系统不允许的字符)
|
|
548
|
+
// 移除或替换:/ \ : * ? " < > |
|
|
549
|
+
fileName = fileName.replace(/[/\\:*?"<>|]/g, '_');
|
|
550
|
+
// 移除前后空格和点号(Windows 不允许)
|
|
551
|
+
fileName = fileName.trim().replace(/^\.+|\.+$/g, '');
|
|
552
|
+
// 如果清理后文件名为空,使用默认文件名
|
|
553
|
+
if (!fileName || fileName.length === 0) {
|
|
554
|
+
fileName = DEFAULT_FILENAME;
|
|
555
|
+
}
|
|
556
|
+
return fileName;
|
|
557
|
+
}
|
|
517
558
|
/**
|
|
518
559
|
* 从 URL 中提取文件名
|
|
519
560
|
* @param url 下载 URL
|
|
520
|
-
* @returns
|
|
561
|
+
* @returns 文件名(已清理特殊字符,不包含query参数)
|
|
521
562
|
*/
|
|
522
563
|
_extractFileNameFromUrl(url) {
|
|
564
|
+
if (!url || typeof url !== 'string' || url.trim().length === 0) {
|
|
565
|
+
return `${DEFAULT_FILENAME}${DEFAULT_EXT}`;
|
|
566
|
+
}
|
|
523
567
|
try {
|
|
524
|
-
|
|
525
|
-
|
|
568
|
+
// 确保 URL 是完整的(如果缺少协议,添加 https://)
|
|
569
|
+
let normalizedUrl = url.trim();
|
|
570
|
+
if (!normalizedUrl.match(/^https?:\/\//i)) {
|
|
571
|
+
normalizedUrl = `https://${normalizedUrl}`;
|
|
572
|
+
}
|
|
573
|
+
const urlObj = new URL(normalizedUrl);
|
|
574
|
+
// 验证 pathname 是否有效
|
|
575
|
+
if (!urlObj.pathname || urlObj.pathname === '/' || urlObj.pathname.length === 0) {
|
|
576
|
+
return `${DEFAULT_FILENAME}${DEFAULT_EXT}`;
|
|
577
|
+
}
|
|
578
|
+
// 只使用 pathname 部分,确保不包含 query 参数
|
|
579
|
+
let fileName = path.basename(urlObj.pathname);
|
|
580
|
+
// 如果 pathname 以 / 结尾或 basename 为空,尝试从路径中提取
|
|
581
|
+
if (!fileName || fileName === '/' || fileName.length === 0) {
|
|
582
|
+
// 移除首尾的斜杠,然后取最后一部分
|
|
583
|
+
const pathParts = urlObj.pathname.replace(/^\/+|\/+$/g, '').split('/');
|
|
584
|
+
fileName = pathParts[pathParts.length - 1] || DEFAULT_FILENAME;
|
|
585
|
+
}
|
|
586
|
+
// 如果还是没有有效的文件名,使用默认值
|
|
587
|
+
if (!fileName || fileName === '/' || fileName.length === 0) {
|
|
588
|
+
return `${DEFAULT_FILENAME}${DEFAULT_EXT}`;
|
|
589
|
+
}
|
|
590
|
+
// 解码 URL 编码的字符(如 %20 -> 空格)
|
|
591
|
+
try {
|
|
592
|
+
fileName = decodeURIComponent(fileName);
|
|
593
|
+
}
|
|
594
|
+
catch {
|
|
595
|
+
// 如果解码失败,使用原始文件名
|
|
596
|
+
}
|
|
597
|
+
// 清理文件名中的特殊字符(文件系统不允许的字符)
|
|
598
|
+
// 移除或替换:/ \ : * ? " < > |
|
|
599
|
+
fileName = fileName.replace(/[/\\:*?"<>|]/g, '_');
|
|
600
|
+
// 移除前后空格和点号(Windows 不允许)
|
|
601
|
+
fileName = fileName.trim().replace(/^\.+|\.+$/g, '');
|
|
602
|
+
// 如果清理后文件名为空,使用默认文件名
|
|
603
|
+
if (!fileName || fileName.length === 0) {
|
|
604
|
+
fileName = DEFAULT_FILENAME;
|
|
605
|
+
}
|
|
606
|
+
// 确保有扩展名
|
|
526
607
|
return path.extname(fileName) ? fileName : `${fileName}${DEFAULT_EXT}`;
|
|
527
608
|
}
|
|
528
|
-
catch {
|
|
609
|
+
catch (error) {
|
|
610
|
+
// URL 解析失败,尝试手动提取
|
|
611
|
+
try {
|
|
612
|
+
// 移除 query 参数和 hash
|
|
613
|
+
const urlWithoutQuery = url.split('?')[0];
|
|
614
|
+
const cleanUrl = urlWithoutQuery ? urlWithoutQuery.split('#')[0] : url;
|
|
615
|
+
if (cleanUrl) {
|
|
616
|
+
// 尝试提取最后一个路径段
|
|
617
|
+
const match = cleanUrl.match(/\/([^\/]+)$/);
|
|
618
|
+
if (match && match[1]) {
|
|
619
|
+
let fileName = match[1];
|
|
620
|
+
// 清理文件名
|
|
621
|
+
fileName = fileName.replace(/[/\\:*?"<>|]/g, '_');
|
|
622
|
+
fileName = fileName.trim().replace(/^\.+|\.+$/g, '');
|
|
623
|
+
if (fileName && fileName.length > 0) {
|
|
624
|
+
return path.extname(fileName) ? fileName : `${fileName}${DEFAULT_EXT}`;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
catch {
|
|
630
|
+
// 忽略手动提取的错误
|
|
631
|
+
}
|
|
529
632
|
return `${DEFAULT_FILENAME}${DEFAULT_EXT}`;
|
|
530
633
|
}
|
|
531
634
|
}
|
|
@@ -537,29 +640,18 @@ class Downloader {
|
|
|
537
640
|
* @returns 输出文件路径
|
|
538
641
|
*/
|
|
539
642
|
_resolveOutputPath(url, options, defaultExt) {
|
|
540
|
-
//
|
|
643
|
+
// 如果提供了完整路径,直接使用(但需要清理文件名部分)
|
|
541
644
|
if (options.outputPath) {
|
|
542
|
-
|
|
645
|
+
const dir = path.dirname(options.outputPath);
|
|
646
|
+
const fileName = this._cleanFileName(path.basename(options.outputPath));
|
|
647
|
+
return path.resolve(path.join(dir, fileName));
|
|
543
648
|
}
|
|
544
649
|
// 确定输出目录:优先使用指定的目录,否则使用 Electron 的下载目录
|
|
545
650
|
const outputDir = options.outputDir
|
|
546
651
|
? path.resolve(options.outputDir)
|
|
547
652
|
: app.getPath('downloads');
|
|
548
|
-
//
|
|
549
|
-
|
|
550
|
-
if (options.fileName) {
|
|
551
|
-
fileName = options.fileName;
|
|
552
|
-
}
|
|
553
|
-
else {
|
|
554
|
-
// 如果提供了默认扩展名(base64 情况),使用它
|
|
555
|
-
if (defaultExt) {
|
|
556
|
-
fileName = `${DEFAULT_FILENAME}.${defaultExt}`;
|
|
557
|
-
}
|
|
558
|
-
else {
|
|
559
|
-
// 尝试从 URL 中提取文件名
|
|
560
|
-
fileName = this._extractFileNameFromUrl(url);
|
|
561
|
-
}
|
|
562
|
-
}
|
|
653
|
+
// 使用统一的文件名获取方法
|
|
654
|
+
const fileName = this._getFileName(url, options, defaultExt);
|
|
563
655
|
return path.join(outputDir, fileName);
|
|
564
656
|
}
|
|
565
657
|
}
|