@lynker-desktop/electron-sdk 0.0.9-alpha.7 → 0.0.9-alpha.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +160 -1
- package/common/index.d.ts +96 -0
- package/common/index.d.ts.map +1 -1
- package/common/index.js.map +1 -1
- package/esm/common/index.d.ts +96 -0
- package/esm/common/index.d.ts.map +1 -1
- package/esm/common/index.js.map +1 -1
- package/esm/main/clipboard.d.ts +32 -0
- package/esm/main/clipboard.d.ts.map +1 -0
- package/esm/main/clipboard.js +1208 -0
- package/esm/main/clipboard.js.map +1 -0
- package/esm/main/downloader.d.ts +212 -0
- package/esm/main/downloader.d.ts.map +1 -0
- package/esm/main/downloader.js +674 -0
- package/esm/main/downloader.js.map +1 -0
- package/esm/main/index.d.ts +20 -67
- package/esm/main/index.d.ts.map +1 -1
- package/esm/main/index.js +51 -202
- package/esm/main/index.js.map +1 -1
- package/esm/main/resource-cache.d.ts +245 -0
- package/esm/main/resource-cache.d.ts.map +1 -0
- package/esm/main/resource-cache.js +857 -0
- package/esm/main/resource-cache.js.map +1 -0
- 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/esm/main/store.d.ts +10 -0
- package/esm/main/store.d.ts.map +1 -0
- package/esm/main/store.js +62 -0
- package/esm/main/store.js.map +1 -0
- package/esm/main/video-downloader.d.ts +39 -0
- package/esm/main/video-downloader.d.ts.map +1 -0
- package/esm/main/video-downloader.js +505 -0
- package/esm/main/video-downloader.js.map +1 -0
- package/esm/preload/index.js +19 -1
- package/esm/preload/index.js.map +1 -1
- package/esm/renderer/index.d.ts +8 -0
- package/esm/renderer/index.d.ts.map +1 -1
- package/esm/renderer/index.js +25 -0
- package/esm/renderer/index.js.map +1 -1
- package/main/clipboard.d.ts +32 -0
- package/main/clipboard.d.ts.map +1 -0
- package/main/clipboard.js +1208 -0
- package/main/clipboard.js.map +1 -0
- package/main/downloader.d.ts +212 -0
- package/main/downloader.d.ts.map +1 -0
- package/main/downloader.js +674 -0
- package/main/downloader.js.map +1 -0
- package/main/index.d.ts +20 -67
- package/main/index.d.ts.map +1 -1
- package/main/index.js +54 -205
- package/main/index.js.map +1 -1
- package/main/resource-cache.d.ts +245 -0
- package/main/resource-cache.d.ts.map +1 -0
- package/main/resource-cache.js +857 -0
- package/main/resource-cache.js.map +1 -0
- 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/main/store.d.ts +10 -0
- package/main/store.d.ts.map +1 -0
- package/main/store.js +64 -0
- package/main/store.js.map +1 -0
- package/main/video-downloader.d.ts +39 -0
- package/main/video-downloader.d.ts.map +1 -0
- package/main/video-downloader.js +510 -0
- package/main/video-downloader.js.map +1 -0
- package/package.json +9 -5
- package/preload/index.js +19 -1
- package/preload/index.js.map +1 -1
- package/renderer/index.d.ts +8 -0
- package/renderer/index.d.ts.map +1 -1
- package/renderer/index.js +25 -0
- package/renderer/index.js.map +1 -1
|
@@ -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// 图片相关的剪贴板格式\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 console.log('error input', input);\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 | string): Promise<boolean> {\n try {\n let image: Electron.NativeImage;\n if (typeof imageData === 'string') {\n // 检查是否是 HTTP/HTTPS URL\n if (imageData.startsWith('http://') || imageData.startsWith('https://')) {\n // 下载图片到临时文件\n const tempDir = getTempDir();\n const fileName = generateTempFileName(undefined, imageData);\n const tempPath = path.join(tempDir, fileName);\n await downloadFileFromUrl(imageData, tempPath);\n // 检查下载后的文件是否存在\n if (!fs.existsSync(tempPath)) {\n console.error('下载的图片文件不存在:', tempPath);\n return false;\n }\n image = nativeImage.createFromPath(tempPath);\n } else if (imageData.startsWith('file://')) {\n // 处理 file:// 协议,去掉前缀\n const localPath = imageData.replace(/^file:\\/\\//, '');\n // 检查文件是否存在\n if (!fs.existsSync(localPath)) {\n console.error('图片文件不存在:', localPath);\n return false;\n }\n image = nativeImage.createFromPath(localPath);\n } else if (imageData.startsWith('/')) {\n // 本地路径,直接使用\n // 检查文件是否存在\n if (!fs.existsSync(imageData)) {\n console.error('图片文件不存在:', imageData);\n return false;\n }\n image = nativeImage.createFromPath(imageData);\n } else {\n // 其他情况,尝试直接使用\n // 检查文件是否存在\n if (!fs.existsSync(imageData)) {\n console.error('图片文件不存在:', imageData);\n return false;\n }\n image = nativeImage.createFromPath(imageData);\n }\n } else 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') {\n return await handleSetImage(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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"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 下载进度回调函数类型
|
|
3
|
+
*/
|
|
4
|
+
export type DownloadProgressCallback = (progress: {
|
|
5
|
+
url: string;
|
|
6
|
+
downloaded: number;
|
|
7
|
+
total: number;
|
|
8
|
+
percentage: number;
|
|
9
|
+
speed: number;
|
|
10
|
+
}) => void;
|
|
11
|
+
/**
|
|
12
|
+
* 下载选项
|
|
13
|
+
*/
|
|
14
|
+
export interface DownloadOptions {
|
|
15
|
+
/** 唯一标识(IPC 调用时必需) */
|
|
16
|
+
id?: string;
|
|
17
|
+
/** 输出文件路径(可选,如果不提供则使用 URL 的文件名) */
|
|
18
|
+
outputPath?: string;
|
|
19
|
+
/** 输出目录(可选,如果不提供则使用当前目录) */
|
|
20
|
+
outputDir?: string;
|
|
21
|
+
/** 输出文件名(可选,如果不提供则从 URL 提取) */
|
|
22
|
+
fileName?: string;
|
|
23
|
+
/** 是否覆盖已存在的文件(默认 true) */
|
|
24
|
+
override?: boolean;
|
|
25
|
+
/** 是否弹窗选择保存路径(默认 false) */
|
|
26
|
+
showSaveDialog?: boolean;
|
|
27
|
+
/** 保存对话框的默认文件名(可选) */
|
|
28
|
+
defaultPath?: string;
|
|
29
|
+
/** 超时时间(毫秒,默认 10 分钟) */
|
|
30
|
+
timeout?: number;
|
|
31
|
+
/** 重试配置 */
|
|
32
|
+
retry?: {
|
|
33
|
+
maxRetries?: number;
|
|
34
|
+
delay?: number;
|
|
35
|
+
};
|
|
36
|
+
/** 下载进度回调函数(可选) */
|
|
37
|
+
onProgress?: DownloadProgressCallback;
|
|
38
|
+
/** 下载完成回调函数(可选) */
|
|
39
|
+
onComplete?: (filePath: string) => void;
|
|
40
|
+
/** 下载错误回调函数(可选) */
|
|
41
|
+
onError?: (error: Error) => void;
|
|
42
|
+
/** HTTP 请求选项 */
|
|
43
|
+
httpRequestOptions?: {
|
|
44
|
+
headers?: Record<string, string>;
|
|
45
|
+
followRedirect?: boolean;
|
|
46
|
+
maxRedirects?: number;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 下载结果
|
|
51
|
+
*/
|
|
52
|
+
export interface DownloadResult {
|
|
53
|
+
/** 是否成功 */
|
|
54
|
+
success: boolean;
|
|
55
|
+
/** 下载的文件路径 */
|
|
56
|
+
filePath?: string;
|
|
57
|
+
/** 错误信息 */
|
|
58
|
+
error?: string;
|
|
59
|
+
/** 文件大小(字节) */
|
|
60
|
+
size?: number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 下载器类:提供文件下载功能
|
|
64
|
+
*/
|
|
65
|
+
declare class Downloader {
|
|
66
|
+
/** 正在下载的 URL 集合(避免重复下载) */
|
|
67
|
+
private _downloadingUrls;
|
|
68
|
+
/** 上一次选择的保存文件夹路径 */
|
|
69
|
+
private _lastSelectedDir;
|
|
70
|
+
constructor();
|
|
71
|
+
/**
|
|
72
|
+
* 下载文件
|
|
73
|
+
* @param url 要下载的 URL
|
|
74
|
+
* @param options 下载选项
|
|
75
|
+
* @param onProgress 进度回调函数(可选,优先级高于 options.onProgress)
|
|
76
|
+
* @returns Promise<DownloadResult> 下载结果
|
|
77
|
+
*/
|
|
78
|
+
download(url: string, options?: DownloadOptions, onProgress?: DownloadProgressCallback): Promise<DownloadResult>;
|
|
79
|
+
/**
|
|
80
|
+
* 生成下载任务的唯一标识
|
|
81
|
+
* @param url 下载 URL
|
|
82
|
+
* @param id 可选的任务 ID
|
|
83
|
+
* @returns 唯一标识
|
|
84
|
+
*/
|
|
85
|
+
private _getDownloadKey;
|
|
86
|
+
/**
|
|
87
|
+
* 取消下载
|
|
88
|
+
* @param url 要取消的 URL
|
|
89
|
+
* @param id 可选的任务 ID
|
|
90
|
+
* @returns 是否成功取消
|
|
91
|
+
*/
|
|
92
|
+
cancel(url: string, id?: string): boolean;
|
|
93
|
+
/**
|
|
94
|
+
* 取消所有正在进行的下载
|
|
95
|
+
*/
|
|
96
|
+
cancelAll(): void;
|
|
97
|
+
/**
|
|
98
|
+
* 检查指定 URL 是否正在下载
|
|
99
|
+
* @param url 要检查的 URL
|
|
100
|
+
* @param id 可选的任务 ID
|
|
101
|
+
* @returns 是否正在下载
|
|
102
|
+
*/
|
|
103
|
+
isDownloading(url: string, id?: string): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* 获取正在下载的任务列表
|
|
106
|
+
* @returns 正在下载的任务信息数组,包含 URL 和 ID(如果有)
|
|
107
|
+
*/
|
|
108
|
+
getDownloadingUrls(): Array<{
|
|
109
|
+
url: string;
|
|
110
|
+
id?: string;
|
|
111
|
+
}>;
|
|
112
|
+
/**
|
|
113
|
+
* 获取文件名(统一处理所有来源)
|
|
114
|
+
* @param url 下载 URL
|
|
115
|
+
* @param options 下载选项
|
|
116
|
+
* @param defaultExt 默认扩展名(可选,用于 base64 URL)
|
|
117
|
+
* @returns 清理后的文件名
|
|
118
|
+
*/
|
|
119
|
+
private _getFileName;
|
|
120
|
+
/**
|
|
121
|
+
* 显示保存对话框
|
|
122
|
+
* @param url 下载 URL
|
|
123
|
+
* @param options 下载选项
|
|
124
|
+
* @param defaultExt 默认扩展名(可选,用于 base64 URL)
|
|
125
|
+
* @returns Promise<string | null> 用户选择的保存路径,如果取消则返回 null
|
|
126
|
+
*/
|
|
127
|
+
private _showSaveDialog;
|
|
128
|
+
/**
|
|
129
|
+
* 检测并处理 base64 data URL
|
|
130
|
+
* @param url 资源URL
|
|
131
|
+
* @returns 如果是 base64 URL,返回 true、文件扩展名、MIME 类型和数据;否则返回 false
|
|
132
|
+
*/
|
|
133
|
+
private _isBase64DataUrl;
|
|
134
|
+
/**
|
|
135
|
+
* 保存 base64 数据到文件
|
|
136
|
+
* @param base64Data base64 编码的数据
|
|
137
|
+
* @param filePath 目标文件路径
|
|
138
|
+
*/
|
|
139
|
+
private _saveBase64ToFile;
|
|
140
|
+
/**
|
|
141
|
+
* 准备输出路径(确保目录存在、检查文件是否已存在)
|
|
142
|
+
* @param outputPath 输出路径
|
|
143
|
+
* @param options 下载选项
|
|
144
|
+
* @returns 如果文件已存在且不允许覆盖,返回结果;否则返回 null
|
|
145
|
+
*/
|
|
146
|
+
private _prepareOutputPath;
|
|
147
|
+
/**
|
|
148
|
+
* 创建成功结果
|
|
149
|
+
* @param filePath 文件路径
|
|
150
|
+
* @param size 文件大小
|
|
151
|
+
* @returns DownloadResult
|
|
152
|
+
*/
|
|
153
|
+
private _createSuccessResult;
|
|
154
|
+
/**
|
|
155
|
+
* 创建错误结果
|
|
156
|
+
* @param error 错误信息
|
|
157
|
+
* @returns DownloadResult
|
|
158
|
+
*/
|
|
159
|
+
private _createErrorResult;
|
|
160
|
+
/**
|
|
161
|
+
* 处理 base64 data URL 的下载
|
|
162
|
+
* @param url base64 data URL
|
|
163
|
+
* @param base64Info base64 信息
|
|
164
|
+
* @param outputPath 已确定的输出路径
|
|
165
|
+
* @param options 下载选项
|
|
166
|
+
* @param progressCallback 进度回调
|
|
167
|
+
* @returns Promise<DownloadResult> 下载结果
|
|
168
|
+
*/
|
|
169
|
+
private _handleBase64Download;
|
|
170
|
+
/**
|
|
171
|
+
* 生成唯一的文件名(如果文件已存在,添加数字后缀)
|
|
172
|
+
* @param dir 目录路径
|
|
173
|
+
* @param fileName 原始文件名
|
|
174
|
+
* @returns 唯一的文件名
|
|
175
|
+
*/
|
|
176
|
+
private _generateUniqueFileName;
|
|
177
|
+
/**
|
|
178
|
+
* 清理文件名,移除 query 参数和特殊字符
|
|
179
|
+
* @param fileName 原始文件名
|
|
180
|
+
* @returns 清理后的文件名
|
|
181
|
+
*/
|
|
182
|
+
private _cleanFileName;
|
|
183
|
+
/**
|
|
184
|
+
* 从 URL 中提取文件名
|
|
185
|
+
* @param url 下载 URL
|
|
186
|
+
* @returns 文件名(已清理特殊字符,不包含query参数)
|
|
187
|
+
*/
|
|
188
|
+
private _extractFileNameFromUrl;
|
|
189
|
+
/**
|
|
190
|
+
* 解析输出路径
|
|
191
|
+
* @param url 下载 URL
|
|
192
|
+
* @param options 下载选项
|
|
193
|
+
* @param defaultExt 默认扩展名(可选,用于 base64 URL)
|
|
194
|
+
* @returns 输出文件路径
|
|
195
|
+
*/
|
|
196
|
+
private _resolveOutputPath;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* 获取默认下载器实例
|
|
200
|
+
* @returns Downloader 实例
|
|
201
|
+
*/
|
|
202
|
+
export declare function getDownloader(): Downloader;
|
|
203
|
+
/**
|
|
204
|
+
* 下载文件的便捷函数
|
|
205
|
+
* @param url 要下载的 URL
|
|
206
|
+
* @param options 下载选项
|
|
207
|
+
* @param onProgress 进度回调函数(可选)
|
|
208
|
+
* @returns Promise<DownloadResult> 下载结果
|
|
209
|
+
*/
|
|
210
|
+
export declare function downloadFile(url: string, options?: DownloadOptions, onProgress?: DownloadProgressCallback): Promise<DownloadResult>;
|
|
211
|
+
export {};
|
|
212
|
+
//# sourceMappingURL=downloader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"downloader.d.ts","sourceRoot":"","sources":["../../src/main/downloader.ts"],"names":[],"mappings":"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"}
|