sa2kit 1.6.43 → 1.6.45
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/dist/AliyunOSSProvider-2FARPAQD.js +15 -0
- package/dist/{AliyunOSSProvider-HCNGDJL7.js.map → AliyunOSSProvider-2FARPAQD.js.map} +1 -1
- package/dist/AliyunOSSProvider-UMVGVBDJ.mjs +9 -0
- package/dist/{AliyunOSSProvider-4W47OFEK.mjs.map → AliyunOSSProvider-UMVGVBDJ.mjs.map} +1 -1
- package/dist/CollisionBalls-BpHufX3H.d.mts +41 -0
- package/dist/CollisionBalls-BpHufX3H.d.ts +41 -0
- package/dist/ConfigService-QR67WYNK.mjs +4 -0
- package/dist/{ConfigService-V6ZK273Z.mjs.map → ConfigService-QR67WYNK.mjs.map} +1 -1
- package/dist/{ConfigService-3DIC6C3Q.js → ConfigService-UYC6ZTCM.js} +3 -3
- package/dist/{ConfigService-3DIC6C3Q.js.map → ConfigService-UYC6ZTCM.js.map} +1 -1
- package/dist/GenericOrderManager-e4WizpNf.d.mts +28 -0
- package/dist/GenericOrderManager-e4WizpNf.d.ts +28 -0
- package/dist/LocalStorageProvider-JQF5WK5H.js +15 -0
- package/dist/{LocalStorageProvider-PP7MA5OT.js.map → LocalStorageProvider-JQF5WK5H.js.map} +1 -1
- package/dist/LocalStorageProvider-PYOHETJV.mjs +9 -0
- package/dist/{LocalStorageProvider-3RVPCQB3.mjs.map → LocalStorageProvider-PYOHETJV.mjs.map} +1 -1
- package/dist/PMXParser-RLBDO7YK.mjs +4 -0
- package/dist/{PMXParser-RNVQL76A.mjs.map → PMXParser-RLBDO7YK.mjs.map} +1 -1
- package/dist/{PMXParser-2VTA737I.js → PMXParser-XHNO2KNI.js} +3 -3
- package/dist/{PMXParser-2VTA737I.js.map → PMXParser-XHNO2KNI.js.map} +1 -1
- package/dist/UniversalFileService-RBV6EN5J.js +15 -0
- package/dist/UniversalFileService-RBV6EN5J.js.map +1 -0
- package/dist/UniversalFileService-TNYKO6JN.mjs +9 -0
- package/dist/UniversalFileService-TNYKO6JN.mjs.map +1 -0
- package/dist/analytics/index.js +1 -1
- package/dist/analytics/index.mjs +1 -1
- package/dist/analytics/server/index.js +1 -1
- package/dist/analytics/server/index.mjs +1 -1
- package/dist/api/index.js +1 -1
- package/dist/api/index.mjs +1 -1
- package/dist/audioDetection/index.js +1 -1
- package/dist/audioDetection/index.mjs +1 -1
- package/dist/auth/client/index.js +1 -1
- package/dist/auth/client/index.mjs +1 -1
- package/dist/auth/components/index.js +1 -1
- package/dist/auth/components/index.mjs +1 -1
- package/dist/auth/hooks/index.js +1 -1
- package/dist/auth/hooks/index.mjs +1 -1
- package/dist/auth/index.js +1 -1
- package/dist/auth/index.mjs +1 -1
- package/dist/auth/middleware/index.js +1 -1
- package/dist/auth/middleware/index.mjs +1 -1
- package/dist/auth/routes/index.js +1 -1
- package/dist/auth/routes/index.mjs +1 -1
- package/dist/auth/schema/index.js +1 -1
- package/dist/auth/schema/index.mjs +1 -1
- package/dist/auth/services/index.js +1 -1
- package/dist/auth/services/index.mjs +1 -1
- package/dist/calendar/index.js +12 -12
- package/dist/calendar/index.mjs +5 -5
- package/dist/calendar/routes/index.js +1 -1
- package/dist/calendar/routes/index.mjs +1 -1
- package/dist/calendar/server.js +1 -1
- package/dist/calendar/server.mjs +1 -1
- package/dist/chunk-2PS5PIXV.mjs +443 -0
- package/dist/chunk-2PS5PIXV.mjs.map +1 -0
- package/dist/chunk-35CXIK5Y.js +277 -0
- package/dist/chunk-35CXIK5Y.js.map +1 -0
- package/dist/{chunk-GMIUSZXC.mjs → chunk-3JW4X3AC.mjs} +3 -3
- package/dist/{chunk-GMIUSZXC.mjs.map → chunk-3JW4X3AC.mjs.map} +1 -1
- package/dist/chunk-3M6T5KVD.js +453 -0
- package/dist/chunk-3M6T5KVD.js.map +1 -0
- package/dist/chunk-3TNR6IMC.js +168 -0
- package/dist/chunk-3TNR6IMC.js.map +1 -0
- package/dist/chunk-4NFOSCM6.js +34 -0
- package/dist/chunk-4NFOSCM6.js.map +1 -0
- package/dist/{chunk-3NHAT7D4.mjs → chunk-4VJQZSPU.mjs} +4 -3
- package/dist/chunk-4VJQZSPU.mjs.map +1 -0
- package/dist/{chunk-SCDDMIF6.js → chunk-4XXIBWCO.js} +66 -66
- package/dist/{chunk-SCDDMIF6.js.map → chunk-4XXIBWCO.js.map} +1 -1
- package/dist/chunk-6AHYPPUP.js +344 -0
- package/dist/chunk-6AHYPPUP.js.map +1 -0
- package/dist/{chunk-EGJPS7OL.mjs → chunk-6BJ76BYC.mjs} +3 -3
- package/dist/{chunk-EGJPS7OL.mjs.map → chunk-6BJ76BYC.mjs.map} +1 -1
- package/dist/chunk-76V7EKBX.mjs +796 -0
- package/dist/chunk-76V7EKBX.mjs.map +1 -0
- package/dist/chunk-ACLOJXXE.js +195 -0
- package/dist/chunk-ACLOJXXE.js.map +1 -0
- package/dist/chunk-AEXPAH7Z.mjs +32 -0
- package/dist/chunk-AEXPAH7Z.mjs.map +1 -0
- package/dist/chunk-CFGX3EKK.js +560 -0
- package/dist/chunk-CFGX3EKK.js.map +1 -0
- package/dist/{chunk-435LATLS.mjs → chunk-CX5GPCCO.mjs} +3 -4
- package/dist/chunk-CX5GPCCO.mjs.map +1 -0
- package/dist/chunk-D2HXMGXS.js +46 -0
- package/dist/chunk-D2HXMGXS.js.map +1 -0
- package/dist/chunk-DM2GUVUH.js +1201 -0
- package/dist/chunk-DM2GUVUH.js.map +1 -0
- package/dist/{chunk-ZWQJSZEY.js → chunk-DVENFCQY.js} +5 -4
- package/dist/chunk-DVENFCQY.js.map +1 -0
- package/dist/chunk-EONPKLEJ.mjs +163 -0
- package/dist/chunk-EONPKLEJ.mjs.map +1 -0
- package/dist/{chunk-L47ZOYHL.js → chunk-EUIXQPPU.js} +4 -4
- package/dist/{chunk-L47ZOYHL.js.map → chunk-EUIXQPPU.js.map} +1 -1
- package/dist/{chunk-33YOJBQB.js → chunk-JOSNXSA6.js} +3 -4
- package/dist/chunk-JOSNXSA6.js.map +1 -0
- package/dist/chunk-K7WNCB4V.mjs +554 -0
- package/dist/chunk-K7WNCB4V.mjs.map +1 -0
- package/dist/chunk-L4ZYBFB2.mjs +44 -0
- package/dist/chunk-L4ZYBFB2.mjs.map +1 -0
- package/dist/chunk-M4HGHTIC.js +820 -0
- package/dist/chunk-M4HGHTIC.js.map +1 -0
- package/dist/{chunk-HHVDOIPV.js → chunk-MZKATHB7.js} +4 -4
- package/dist/{chunk-HHVDOIPV.js.map → chunk-MZKATHB7.js.map} +1 -1
- package/dist/{chunk-UKT3PLON.mjs → chunk-NXQVTAOP.mjs} +3 -3
- package/dist/{chunk-UKT3PLON.mjs.map → chunk-NXQVTAOP.mjs.map} +1 -1
- package/dist/chunk-OBIPI4GU.mjs +266 -0
- package/dist/chunk-OBIPI4GU.mjs.map +1 -0
- package/dist/chunk-PAX4S7QM.mjs +94 -0
- package/dist/chunk-PAX4S7QM.mjs.map +1 -0
- package/dist/chunk-PXWDQFWV.mjs +192 -0
- package/dist/chunk-PXWDQFWV.mjs.map +1 -0
- package/dist/chunk-QROLPPXP.mjs +5797 -0
- package/dist/chunk-QROLPPXP.mjs.map +1 -0
- package/dist/chunk-TGNUEULF.mjs +1158 -0
- package/dist/chunk-TGNUEULF.mjs.map +1 -0
- package/dist/chunk-VBQFVXOW.mjs +2772 -0
- package/dist/chunk-VBQFVXOW.mjs.map +1 -0
- package/dist/chunk-VLZ5N6XZ.js +5888 -0
- package/dist/chunk-VLZ5N6XZ.js.map +1 -0
- package/dist/chunk-VTGPHE4Z.mjs +322 -0
- package/dist/chunk-VTGPHE4Z.mjs.map +1 -0
- package/dist/chunk-WMJKH4XE.mjs +30 -0
- package/dist/{chunk-BJTO5JO5.mjs.map → chunk-WMJKH4XE.mjs.map} +1 -1
- package/dist/chunk-XYQMAF7H.js +96 -0
- package/dist/chunk-XYQMAF7H.js.map +1 -0
- package/dist/chunk-Z3G3IXEF.js +2814 -0
- package/dist/chunk-Z3G3IXEF.js.map +1 -0
- package/dist/chunk-Z6ZWNWWR.js +35 -0
- package/dist/{chunk-DGUM43GV.js.map → chunk-Z6ZWNWWR.js.map} +1 -1
- package/dist/components/index.d.mts +378 -0
- package/dist/components/index.d.ts +378 -0
- package/dist/components/index.js +414 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +9 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/config/index.js +1 -1
- package/dist/config/index.mjs +1 -1
- package/dist/config/server/index.js +1 -1
- package/dist/config/server/index.mjs +1 -1
- package/dist/fileService-O3W6YXCI.mjs +4 -0
- package/dist/fileService-O3W6YXCI.mjs.map +1 -0
- package/dist/fileService-YUDIYOAS.js +13 -0
- package/dist/fileService-YUDIYOAS.js.map +1 -0
- package/dist/i18n/index.js +7 -7
- package/dist/i18n/index.mjs +1 -1
- package/dist/imageCrop/index.js +1 -1
- package/dist/imageCrop/index.mjs +1 -1
- package/dist/index.d.mts +9 -580
- package/dist/index.d.ts +9 -580
- package/dist/index.js +313 -972
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +104 -790
- package/dist/index.mjs.map +1 -1
- package/dist/logger/index.js +8 -8
- package/dist/logger/index.mjs +5 -2
- package/dist/mikuFireworks3D/index.js +17 -17
- package/dist/mikuFireworks3D/index.mjs +2 -2
- package/dist/mikuFireworks3D/server/index.js +1 -1
- package/dist/mikuFireworks3D/server/index.mjs +1 -1
- package/dist/mikuFusionGame/index.js +5 -5
- package/dist/mikuFusionGame/index.mjs +4 -4
- package/dist/mmd/admin/index.js +1 -1
- package/dist/mmd/admin/index.mjs +1 -1
- package/dist/mmd/index.js +2 -2
- package/dist/mmd/index.mjs +2 -2
- package/dist/mmd/server/index.js +1 -1
- package/dist/mmd/server/index.mjs +1 -1
- package/dist/music/index.js +1 -1
- package/dist/music/index.mjs +1 -1
- package/dist/music/server/index.js +1 -1
- package/dist/music/server/index.mjs +1 -1
- package/dist/navigation/index.d.mts +93 -0
- package/dist/navigation/index.d.ts +93 -0
- package/dist/navigation/index.js +29 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/navigation/index.mjs +4 -0
- package/dist/navigation/index.mjs.map +1 -0
- package/dist/popupConfig-BznThU1O.d.mts +330 -0
- package/dist/popupConfig-BznThU1O.d.ts +330 -0
- package/dist/portfolio/index.d.mts +57 -0
- package/dist/portfolio/index.d.ts +57 -0
- package/dist/portfolio/index.js +35 -0
- package/dist/portfolio/index.js.map +1 -0
- package/dist/portfolio/index.mjs +10 -0
- package/dist/portfolio/index.mjs.map +1 -0
- package/dist/request/index.js +1 -1
- package/dist/request/index.mjs +1 -1
- package/dist/showmasterpiece/index.d.mts +2524 -0
- package/dist/showmasterpiece/index.d.ts +2524 -0
- package/dist/showmasterpiece/index.js +9681 -0
- package/dist/showmasterpiece/index.js.map +1 -0
- package/dist/showmasterpiece/index.mjs +9631 -0
- package/dist/showmasterpiece/index.mjs.map +1 -0
- package/dist/showmasterpiece/migration/index.d.mts +120 -0
- package/dist/showmasterpiece/migration/index.d.ts +120 -0
- package/dist/showmasterpiece/migration/index.js +595 -0
- package/dist/showmasterpiece/migration/index.js.map +1 -0
- package/dist/showmasterpiece/migration/index.mjs +589 -0
- package/dist/showmasterpiece/migration/index.mjs.map +1 -0
- package/dist/showmasterpiece/scripts/index.d.mts +28 -0
- package/dist/showmasterpiece/scripts/index.d.ts +28 -0
- package/dist/showmasterpiece/scripts/index.js +327 -0
- package/dist/showmasterpiece/scripts/index.js.map +1 -0
- package/dist/showmasterpiece/scripts/index.mjs +325 -0
- package/dist/showmasterpiece/scripts/index.mjs.map +1 -0
- package/dist/showmasterpiece/server/index.d.mts +2698 -0
- package/dist/showmasterpiece/server/index.d.ts +2698 -0
- package/dist/showmasterpiece/server/index.js +179 -0
- package/dist/showmasterpiece/server/index.js.map +1 -0
- package/dist/showmasterpiece/server/index.mjs +6 -0
- package/dist/showmasterpiece/server/index.mjs.map +1 -0
- package/dist/storage/index.js +8 -8
- package/dist/storage/index.mjs +2 -2
- package/dist/testYourself/admin/index.js +1 -1
- package/dist/testYourself/admin/index.mjs +1 -1
- package/dist/testYourself/index.js +2 -2
- package/dist/testYourself/index.mjs +2 -2
- package/dist/testYourself/server/index.js +1 -1
- package/dist/testYourself/server/index.mjs +1 -1
- package/dist/universalExport/index.js +154 -1195
- package/dist/universalExport/index.js.map +1 -1
- package/dist/universalExport/index.mjs +2 -1157
- package/dist/universalExport/index.mjs.map +1 -1
- package/dist/universalExport/server/index.js +5 -3
- package/dist/universalExport/server/index.js.map +1 -1
- package/dist/universalExport/server/index.mjs +4 -2
- package/dist/universalExport/server/index.mjs.map +1 -1
- package/dist/universalFile/index.js +10 -7
- package/dist/universalFile/index.js.map +1 -1
- package/dist/universalFile/index.mjs +6 -2
- package/dist/universalFile/index.mjs.map +1 -1
- package/dist/universalFile/server/index.d.mts +592 -265
- package/dist/universalFile/server/index.d.ts +592 -265
- package/dist/universalFile/server/index.js +298 -5637
- package/dist/universalFile/server/index.js.map +1 -1
- package/dist/universalFile/server/index.mjs +8 -5559
- package/dist/universalFile/server/index.mjs.map +1 -1
- package/dist/utils/index.js +12 -12
- package/dist/utils/index.mjs +3 -3
- package/package.json +36 -1
- package/dist/AliyunOSSProvider-4W47OFEK.mjs +0 -6
- package/dist/AliyunOSSProvider-HCNGDJL7.js +0 -15
- package/dist/ConfigService-V6ZK273Z.mjs +0 -4
- package/dist/LocalStorageProvider-3RVPCQB3.mjs +0 -6
- package/dist/LocalStorageProvider-PP7MA5OT.js +0 -15
- package/dist/PMXParser-RNVQL76A.mjs +0 -4
- package/dist/chunk-25OFOKNF.js +0 -171
- package/dist/chunk-25OFOKNF.js.map +0 -1
- package/dist/chunk-33YOJBQB.js.map +0 -1
- package/dist/chunk-3DXPQ4YV.mjs +0 -165
- package/dist/chunk-3DXPQ4YV.mjs.map +0 -1
- package/dist/chunk-3NHAT7D4.mjs.map +0 -1
- package/dist/chunk-435LATLS.mjs.map +0 -1
- package/dist/chunk-BJTO5JO5.mjs +0 -10
- package/dist/chunk-CIVO4R6N.mjs +0 -37
- package/dist/chunk-CIVO4R6N.mjs.map +0 -1
- package/dist/chunk-DGUM43GV.js +0 -12
- package/dist/chunk-HDMIOOZY.mjs +0 -546
- package/dist/chunk-HDMIOOZY.mjs.map +0 -1
- package/dist/chunk-HJ6MH7J7.js +0 -552
- package/dist/chunk-HJ6MH7J7.js.map +0 -1
- package/dist/chunk-KH6RQ4J5.js +0 -28
- package/dist/chunk-KH6RQ4J5.js.map +0 -1
- package/dist/chunk-Q5EDCKQA.js +0 -336
- package/dist/chunk-Q5EDCKQA.js.map +0 -1
- package/dist/chunk-YOTQG4NP.mjs +0 -314
- package/dist/chunk-YOTQG4NP.mjs.map +0 -1
- package/dist/chunk-ZGVB35L2.mjs +0 -25
- package/dist/chunk-ZGVB35L2.mjs.map +0 -1
- package/dist/chunk-ZRAW3HXA.js +0 -43
- package/dist/chunk-ZRAW3HXA.js.map +0 -1
- package/dist/chunk-ZWQJSZEY.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/universalFile/server/utils/mime.ts","../src/universalFile/server/UniversalFileService.ts"],"names":["path","__esm","UniversalFileService","init_logger","init_types","createLogger","EventEmitter","uuidv4","StorageProviderError","FileUploadError","path2","createHash","FileProcessingError"],"mappings":"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","file":"chunk-M4HGHTIC.js","sourcesContent":["/**\n * MIME 类型工具函数\n */\n\nimport * as path from 'path';\n\n/** MIME 类型映射表 */\nconst MIME_TYPES: Record<string, string> = {\n // 图片\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.bmp': 'image/bmp',\n '.ico': 'image/x-icon',\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 '.mkv': 'video/x-matroska',\n '.webm': 'video/webm',\n\n // 音频\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n '.m4a': 'audio/mp4',\n '.flac': 'audio/flac',\n '.aac': 'audio/aac',\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 '.txt': 'text/plain',\n '.rtf': 'application/rtf',\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\n // 代码文件\n '.js': 'application/javascript',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.html': 'text/html',\n '.css': 'text/css',\n '.ts': 'application/typescript',\n\n // 其他\n '.csv': 'text/csv',\n '.md': 'text/markdown',\n};\n\n/**\n * 根据文件名获取 MIME 类型\n *\n * @param filename 文件名\n * @returns MIME 类型\n *\n * @example\n * ```typescript\n * getMimeType('photo.jpg') // 'image/jpeg'\n * getMimeType('video.mp4') // 'video/mp4'\n * getMimeType('unknown.xyz') // 'application/octet-stream'\n * ```\n */\nexport function getMimeType(filename: string): string {\n const ext = path.extname(filename).toLowerCase();\n return MIME_TYPES[ext] || 'application/octet-stream';\n}\n\n/**\n * 根据 MIME 类型获取文件扩展名\n *\n * @param mimeType MIME 类型\n * @returns 文件扩展名(包含点号)\n *\n * @example\n * ```typescript\n * getExtensionFromMimeType('image/jpeg') // '.jpg'\n * getExtensionFromMimeType('video/mp4') // '.mp4'\n * ```\n */\nexport function getExtensionFromMimeType(mimeType: string): string | null {\n for (const [ext, mime] of Object.entries(MIME_TYPES)) {\n if (mime === mimeType) {\n return ext;\n }\n }\n return null;\n}\n\n/**\n * 检查是否为图片类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为图片\n */\nexport function isImageType(mimeType: string): boolean {\n return mimeType.startsWith('image/');\n}\n\n/**\n * 检查是否为视频类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为视频\n */\nexport function isVideoType(mimeType: string): boolean {\n return mimeType.startsWith('video/');\n}\n\n/**\n * 检查是否为音频类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为音频\n */\nexport function isAudioType(mimeType: string): boolean {\n return mimeType.startsWith('audio/');\n}\n\n/**\n * 检查是否为文档类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为文档\n */\nexport function isDocumentType(mimeType: string): boolean {\n const documentTypes = [\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument',\n 'text/plain',\n 'application/rtf',\n ];\n return documentTypes.some(type => mimeType.includes(type));\n}\n\n/**\n * 验证 MIME 类型是否在允许列表中\n *\n * @param mimeType MIME 类型\n * @param allowedTypes 允许的类型列表(支持通配符)\n * @returns 是否允许\n *\n * @example\n * ```typescript\n * isAllowedMimeType('image/jpeg', ['image/*']) // true\n * isAllowedMimeType('video/mp4', ['image/*']) // false\n * isAllowedMimeType('image/png', ['image/jpeg']) // false\n * ```\n */\nexport function isAllowedMimeType(\n mimeType: string,\n allowedTypes: string[]\n): boolean {\n return allowedTypes.some(allowed => {\n if (allowed === '*/*') {\n return true;\n }\n if (allowed.endsWith('/*')) {\n const prefix = allowed.slice(0, -2);\n return mimeType.startsWith(prefix + '/');\n }\n return mimeType === allowed;\n });\n}\n\n","/**\n * 通用文件服务核心实现\n *\n * 提供统一的文件上传、下载、管理接口\n */\n\nimport { EventEmitter } from 'events';\nimport { v4 as uuidv4 } from 'uuid';\nimport { createHash } from 'crypto';\nimport * as path from 'path';\nimport { createLogger } from '../../logger';\nimport { getMimeType } from './utils/mime';\n\nconst logger = createLogger('UniversalFileService');\n\nimport type {\n StorageType,\n CDNType,\n ProcessorType,\n FileMetadata,\n UploadFileInfo,\n UploadProgress,\n FileQueryOptions,\n PaginatedResult,\n BatchOperationResult,\n FileEvent,\n FileEventListener,\n UploadStatus,\n} from '../types';\n\n// Backend specific types\nimport type {\n UniversalFileServiceConfig,\n IStorageProvider,\n ICDNProvider,\n IFileProcessor,\n} from './types';\n\nimport {\n FileUploadError,\n FileProcessingError,\n StorageProviderError,\n} from '../types';\n\n/**\n * 通用文件服务类\n */\nexport class UniversalFileService extends EventEmitter {\n private config: UniversalFileServiceConfig;\n private storageProviders = new Map<StorageType, IStorageProvider>();\n private cdnProviders = new Map<CDNType, ICDNProvider>();\n private fileProcessors = new Map<ProcessorType, IFileProcessor>();\n private uploadProgressMap = new Map<string, UploadProgress>();\n private metadataCache = new Map<string, { data: FileMetadata; expires: number }>();\n private urlCache = new Map<string, { url: string; expires: number }>();\n private processingQueue: Array<{\n fileId: string;\n processor: IFileProcessor;\n inputPath: string;\n outputPath: string;\n options: any;\n }> = [];\n private isProcessingQueueRunning = false;\n\n constructor(config: UniversalFileServiceConfig) {\n super();\n this.config = config;\n\n // 如果启用了持久化,设置自动监听器\n if (this.config.persistence?.enabled && this.config.persistence.repository) {\n this.setupPersistenceListeners();\n }\n }\n\n // ============= 持久化设置 =============\n\n /**\n * 设置数据库持久化监听器\n *\n * 当文件上传完成或删除时,自动触发数据库操作\n */\n private setupPersistenceListeners(): void {\n const { repository, autoPersist = true } = this.config.persistence!;\n\n if (!autoPersist) {\n logger.info('⚙️ [UniversalFileService] 自动持久化已禁用');\n return;\n }\n\n logger.info('✅ [UniversalFileService] 已启用数据库持久化,自动监听文件事件');\n\n // 监听文件上传完成事件\n this.on('upload:complete', async (fileId: string, data: any) => {\n try {\n const metadata = data.metadata || data;\n await repository.save(metadata);\n logger.info('💾 [Persistence] 文件元数据已自动保存: ' + (fileId));\n } catch (error) {\n logger.error('❌ [Persistence] 保存失败: ' + (fileId), error);\n // 不抛出错误,避免影响上传流程\n }\n });\n\n // 监听文件删除事件\n this.on('file:deleted', async (fileId: string) => {\n try {\n await repository.delete(fileId);\n logger.info('🗑️ [Persistence] 文件元数据已自动删除: ' + (fileId));\n } catch (error) {\n logger.error('❌ [Persistence] 删除失败: ' + (fileId), error);\n }\n });\n\n // 监听批量删除事件\n this.on('files:batch-deleted', async (fileIds: string[]) => {\n try {\n await repository.batchDelete(fileIds);\n logger.info('🗑️ [Persistence] 批量删除元数据: ' + (fileIds.length) + ' 个文件');\n } catch (error) {\n logger.error(`❌ [Persistence] 批量删除失败`, error);\n }\n });\n }\n\n // ============= 初始化方法 =============\n\n /**\n * 初始化文件服务\n */\n async initialize(): Promise<void> {\n logger.info('🚀 [UniversalFileService] 开始初始化文件服务...');\n\n try {\n // 验证配置是否完整\n await this.validateConfiguration();\n\n // 初始化存储提供者\n await this.initializeStorageProviders();\n\n // 初始化CDN提供者\n await this.initializeCDNProviders();\n\n // 初始化文件处理器\n await this.initializeFileProcessors();\n\n logger.info('✅ [UniversalFileService] 文件服务初始化完成');\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件服务初始化失败:', error);\n throw error;\n }\n }\n\n /**\n * 重新初始化存储提供者(支持配置热更新)\n */\n async reinitializeStorageProviders(): Promise<void> {\n logger.info('🔄 [UniversalFileService] 重新初始化存储提供者...');\n\n try {\n // 重新初始化所有存储提供者\n for (const [type, provider] of this.storageProviders) {\n if ('reinitialize' in provider) {\n try {\n logger.info('🔄 [UniversalFileService] 重新初始化存储提供者: ' + (type) + '...');\n\n // 获取对应的配置(从原始配置中获取)\n const config = (this.config as any).storageProviders?.[type as string];\n if (config) {\n await (provider as any).reinitialize(config);\n logger.info('✅ [UniversalFileService] 存储提供者重新初始化完成: ' + (type));\n } else {\n logger.warn('⚠️ [UniversalFileService] 存储提供者配置不存在: ' + (type));\n }\n } catch (error) {\n logger.error('❌ [UniversalFileService] 存储提供者重新初始化失败: ' + (type), error);\n // 继续处理其他提供者\n }\n }\n }\n\n logger.info('✅ [UniversalFileService] 存储提供者重新初始化完成');\n } catch (error) {\n console.error('❌ [UniversalFileService] 存储提供者重新初始化失败:', error);\n throw error;\n }\n }\n\n /**\n * 注册存储提供者\n */\n registerStorageProvider(provider: IStorageProvider): void {\n this.storageProviders.set(provider.type, provider);\n logger.info('📦 [UniversalFileService] 注册存储提供者: ' + (provider.type));\n }\n\n /**\n * 注册CDN提供者\n */\n registerCDNProvider(provider: ICDNProvider): void {\n this.cdnProviders.set(provider.type, provider);\n logger.info('🌐 [UniversalFileService] 注册CDN提供者: ' + (provider.type));\n }\n\n /**\n * 注册文件处理器\n */\n registerFileProcessor(processor: IFileProcessor): void {\n this.fileProcessors.set(processor.type, processor);\n logger.info('⚙️ [UniversalFileService] 注册文件处理器: ' + (processor.type));\n }\n\n // ============= 核心文件操作方法 =============\n\n /**\n * 上传文件\n */\n async uploadFile(\n fileInfo: UploadFileInfo,\n storageType?: StorageType,\n onProgress?: (progress: UploadProgress) => void\n ): Promise<FileMetadata> {\n const fileId = uuidv4();\n const startTime = Date.now();\n\n logger.info('📤 [UniversalFileService] 开始上传文件: ' + (fileInfo.file.name) + ', ID: ' + (fileId));\n\n try {\n // 验证文件\n await this.validateFile(fileInfo.file);\n\n // 初始化上传进度\n const progress: UploadProgress = {\n fileId,\n status: 'pending',\n progress: 0,\n uploadedBytes: 0,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n };\n\n this.uploadProgressMap.set(fileId, progress);\n this.emitFileEvent('upload:start', fileId, { fileName: fileInfo.file.name });\n\n // 生成文件元数据\n const metadata = await this.generateFileMetadata(fileId, fileInfo);\n\n // 选择存储提供者\n const selectedStorageType = storageType || this.config.defaultStorage;\n let storageProvider = this.storageProviders.get(selectedStorageType as StorageType);\n\n // 如果指定的存储提供者不可用,优先尝试OSS\n if (!storageProvider) {\n logger.info(\n '⚠️ [UniversalFileService] 存储提供者 ' + (selectedStorageType) + ' 不可用,尝试使用OSS'\n );\n storageProvider = this.storageProviders.get('aliyun-oss');\n\n // 如果OSS也不可用,回退到本地存储\n if (!storageProvider) {\n logger.info(`⚠️ [UniversalFileService] OSS不可用,回退到本地存储`);\n storageProvider = this.storageProviders.get('local');\n }\n }\n\n if (!storageProvider) {\n throw new StorageProviderError(`没有可用的存储提供者`);\n }\n\n // 生成存储路径\n const storagePath = this.generateStoragePath(metadata);\n\n // 更新上传状态\n progress.status = 'uploading';\n progress.progress = 10;\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n this.emitFileEvent('upload:progress', fileId, { progress: progress.progress });\n\n // 执行上传\n const uploadResult = await storageProvider.upload(fileInfo, storagePath);\n\n if (!uploadResult.success) {\n throw new FileUploadError('上传失败: ' + (uploadResult.error));\n }\n\n // 更新元数据\n metadata.storagePath = uploadResult.path || storagePath;\n metadata.storageProvider = selectedStorageType as StorageType;\n\n // 生成CDN URL(如果启用)\n if (this.config.defaultCDN !== 'none') {\n const cdnProvider = this.cdnProviders.get(this.config.defaultCDN as CDNType);\n if (cdnProvider && uploadResult.url) {\n metadata.cdnUrl = await cdnProvider.generateUrl(uploadResult.url);\n }\n }\n\n // 更新上传进度\n progress.status = fileInfo.needsProcessing ? 'processing' : 'completed';\n progress.progress = fileInfo.needsProcessing ? 70 : 100;\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n\n // 如果需要处理,添加到处理队列\n if (fileInfo.needsProcessing && fileInfo.processingOptions) {\n await this.queueFileProcessing(metadata, fileInfo.processingOptions);\n }\n\n // 缓存元数据\n this.cacheMetadata(metadata);\n\n // 保存到数据库通过事件触发(如果启用了持久化)\n // persistence.repository 会监听 'upload:complete' 事件自动保存\n\n // 完成上传\n progress.status = 'completed';\n progress.progress = 100;\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [UniversalFileService] 文件上传完成: ' + (fileId) + ', 耗时: ' + (uploadTime) + 'ms');\n\n this.emitFileEvent('upload:complete', fileId, {\n fileName: fileInfo.file.name,\n size: fileInfo.file.size,\n uploadTime,\n });\n\n return metadata;\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件上传失败: ' + (fileId) + ':', error);\n\n // 更新上传状态为失败\n const progress = this.uploadProgressMap.get(fileId);\n if (progress) {\n progress.status = 'failed';\n progress.error = error instanceof Error ? error.message : '上传失败';\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n }\n\n this.emitFileEvent(\n 'upload:error',\n fileId,\n undefined,\n error instanceof Error ? error.message : '上传失败'\n );\n throw error;\n } finally {\n // 清理上传进度(可选,或设置过期时间)\n setTimeout(\n () => {\n this.uploadProgressMap.delete(fileId);\n },\n 5 * 60 * 1000\n ); // 5分钟后清理\n }\n }\n\n\n /**\n * 下载文件\n */\n async downloadFile(fileId: string, userId?: string): Promise<Buffer> {\n logger.info('📥 [UniversalFileService] 开始下载文件: ' + (fileId));\n\n try {\n this.emitFileEvent('download:start', fileId);\n\n // 获取文件元数据\n const metadata = await this.getFileMetadata(fileId);\n\n if (!metadata) {\n throw new FileUploadError('文件不存在: ' + (fileId));\n }\n\n // 检查权限\n await this.checkFileAccess(metadata, userId);\n\n // 获取存储提供者\n const storageProvider = this.storageProviders.get(metadata.storageProvider);\n\n if (!storageProvider) {\n throw new StorageProviderError('存储提供者不存在: ' + (metadata.storageProvider));\n }\n\n // 下载文件\n const fileBuffer = await storageProvider.download(metadata.storagePath);\n\n // 更新访问统计 (如果启用了持久化)\n if (this.config.persistence?.enabled) {\n await this.updateAccessStats(fileId);\n }\n\n logger.info('✅ [UniversalFileService] 文件下载完成: ' + (fileId));\n this.emitFileEvent('download:complete', fileId, { size: fileBuffer.length });\n\n return fileBuffer;\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件下载失败: ' + (fileId) + ':', error);\n this.emitFileEvent('download:error', fileId, undefined, error instanceof Error ? error.message : '下载失败');\n throw error;\n }\n }\n\n /**\n * 删除文件\n */\n async deleteFile(fileId: string, userId?: string): Promise<void> {\n logger.info('🗑️ [UniversalFileService] 开始删除文件: ' + (fileId));\n\n try {\n // 获取文件元数据\n const metadata = await this.getFileMetadata(fileId);\n\n if (!metadata) {\n throw new FileUploadError('文件不存在: ' + (fileId));\n }\n\n // 检查删除权限\n await this.checkFileDeleteAccess(metadata, userId);\n\n // 获取存储提供者\n const storageProvider = this.storageProviders.get(metadata.storageProvider);\n\n if (!storageProvider) {\n throw new StorageProviderError('存储提供者不存在: ' + (metadata.storageProvider));\n }\n\n // 从存储中删除文件\n const deleteResult = await storageProvider.delete(metadata.storagePath);\n\n if (!deleteResult.success) {\n console.warn('⚠️ [UniversalFileService] 存储文件删除失败: ' + (deleteResult.error));\n }\n\n // 从数据库中删除元数据 (通过事件触发)\n if (this.config.persistence?.enabled) {\n await this.deleteFileMetadata(fileId);\n }\n\n // 清除缓存\n this.clearMetadataCache(fileId);\n\n logger.info('✅ [UniversalFileService] 文件删除完成: ' + (fileId));\n this.emitFileEvent('delete:complete', fileId);\n this.emit('file:deleted', fileId);\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件删除失败: ' + (fileId) + ':', error);\n this.emitFileEvent('delete:error', fileId, undefined, error instanceof Error ? error.message : '删除失败');\n throw error;\n }\n }\n\n /**\n * 获取文件访问URL\n */\n async getFileUrl(fileId: string, userId?: string, expiresIn?: number): Promise<string> {\n // 检查缓存\n const cacheKey = (fileId) + '_' + (userId || 'public') + '_' + (expiresIn || 0);\n const cached = this.urlCache.get(cacheKey);\n\n if (cached && cached.expires > Date.now()) {\n return cached.url;\n }\n\n // 获取文件元数据\n const metadata = await this.getFileMetadata(fileId);\n\n if (!metadata) {\n throw new FileUploadError('文件不存在: ' + (fileId));\n }\n\n // 检查访问权限\n await this.checkFileAccess(metadata, userId);\n\n let url: string;\n\n // 优先使用CDN URL\n if (metadata.cdnUrl) {\n url = metadata.cdnUrl;\n } else {\n // 获取存储提供者访问URL\n const storageProvider = this.storageProviders.get(metadata.storageProvider);\n\n if (!storageProvider) {\n throw new StorageProviderError('存储提供者不存在: ' + (metadata.storageProvider));\n }\n\n url = await storageProvider.getAccessUrl(metadata.storagePath, expiresIn);\n }\n\n // 缓存URL\n const cacheExpires = Date.now() + (this.config.cache?.urlTTL || 1800) * 1000;\n this.urlCache.set(cacheKey, { url, expires: cacheExpires });\n\n return url;\n }\n\n /**\n * 获取文件元数据\n */\n async getFileMetadata(fileId: string): Promise<FileMetadata | null> {\n // 检查缓存\n const cached = this.metadataCache.get(fileId);\n if (cached && cached.expires > Date.now()) {\n return cached.data;\n }\n\n // 如果启用了持久化,从数据库查询\n if (this.config.persistence?.enabled && this.config.persistence.repository) {\n try {\n const metadata = await this.config.persistence.repository.get(fileId);\n if (metadata) {\n // 缓存结果\n this.cacheMetadata(metadata);\n }\n return metadata;\n } catch (error) {\n console.error('❌ [UniversalFileService] 查询文件元数据失败:', error);\n return null;\n }\n }\n\n // 如果没有启用持久化,返回 null\n logger.warn('⚠️ [UniversalFileService] 持久化未启用,无法查询文件元数据: ' + (fileId));\n return null;\n }\n\n /**\n * 查询文件列表\n */\n async queryFiles(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>> {\n if (!this.config.persistence?.enabled || !this.config.persistence.repository) {\n logger.warn('⚠️ [UniversalFileService] 持久化未启用,无法查询文件列表');\n return {\n items: [],\n total: 0,\n page: options.page || 1,\n pageSize: options.pageSize || 20,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n };\n }\n\n try {\n const result = await this.config.persistence.repository.query(options);\n // 添加 hasNext 和 hasPrev\n const hasNext = result.page < result.totalPages;\n const hasPrev = result.page > 1;\n return {\n ...result,\n hasNext,\n hasPrev,\n };\n } catch (error) {\n console.error('❌ [UniversalFileService] 查询文件列表失败:', error);\n throw error;\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDeleteFiles(fileIds: string[], userId?: string): Promise<BatchOperationResult> {\n const result: BatchOperationResult = {\n successCount: 0,\n failureCount: 0,\n failures: [],\n };\n\n for (const fileId of fileIds) {\n try {\n await this.deleteFile(fileId, userId);\n result.successCount++;\n } catch (error) {\n result.failureCount++;\n result.failures.push({\n fileId,\n error: error instanceof Error ? error.message : '删除失败',\n });\n }\n }\n\n // 触发批量删除事件\n if (result.successCount > 0) {\n this.emit('files:batch-deleted', fileIds.filter((_, i) => i < result.successCount));\n }\n\n return result;\n }\n\n /**\n * 获取上传进度\n */\n getUploadProgress(fileId: string): UploadProgress | undefined {\n return this.uploadProgressMap.get(fileId);\n }\n\n // ============= 事件处理方法 =============\n\n /**\n * 监听文件事件\n */\n onFileEvent(eventType: string, listener: FileEventListener): void {\n this.on(eventType, listener);\n }\n\n /**\n * 移除文件事件监听器\n */\n offFileEvent(eventType: string, listener: FileEventListener): void {\n this.off(eventType, listener);\n }\n\n // ============= 私有方法 =============\n\n /**\n * 验证配置是否完整\n */\n private async validateConfiguration(): Promise<void> {\n logger.info('🔍 [UniversalFileService] 验证配置文件...');\n\n // 检查基础配置\n if (!this.config) {\n throw new Error('文件服务配置为空');\n }\n\n // 检查存储配置\n if (!this.config.storage) {\n throw new Error('存储配置为空');\n }\n\n // 检查存储提供者配置\n if (this.config.storage.type === 'aliyun-oss') {\n const ossConfig = this.config.storage as any;\n\n // 如果配置不完整,等待配置加载\n if (!ossConfig.accessKeyId || !ossConfig.accessKeySecret || !ossConfig.bucket || !ossConfig.region) {\n logger.warn('⚠️ [UniversalFileService] OSS配置不完整,等待配置加载...');\n\n // 轮询检查配置是否加载完成,最多等待30秒\n const maxRetries = 30;\n const retryInterval = 1000; // 1秒\n\n for (let i = 0; i < maxRetries; i++) {\n await new Promise(resolve => setTimeout(resolve, retryInterval));\n\n // 重新检查配置(这里假设配置可能会被外部更新)\n const updatedConfig = this.config.storage as any;\n if (updatedConfig.accessKeyId && updatedConfig.accessKeySecret && updatedConfig.bucket && updatedConfig.region) {\n logger.info('✅ [UniversalFileService] OSS配置加载完成');\n break;\n }\n\n if (i === maxRetries - 1) {\n throw new Error('OSS配置加载超时:缺少必需的配置项 (accessKeyId, accessKeySecret, bucket, region)');\n }\n\n logger.debug('等待OSS配置加载中... (' + (i + 1) + '/' + (maxRetries) + ')');\n }\n }\n }\n\n // 检查默认存储类型\n if (!this.config.defaultStorage) {\n this.config.defaultStorage = this.config.storage.type as any;\n }\n\n logger.info('✅ [UniversalFileService] 配置验证完成');\n }\n\n private async initializeStorageProviders(): Promise<void> {\n logger.info('📦 [UniversalFileService] 开始初始化存储提供者...');\n\n // 如果还没有注册任何存储提供者,先注册默认的\n if (this.storageProviders.size === 0) {\n await this.registerDefaultStorageProviders();\n }\n\n if (this.config.storageProviders) {\n for (const [type, config] of Object.entries(this.config.storageProviders)) {\n if (config && config.enabled) {\n const provider = this.storageProviders.get(type as StorageType);\n if (provider) {\n try {\n await provider.initialize(config);\n logger.info('✅ [UniversalFileService] 存储提供者初始化完成: ' + (type));\n } catch (error) {\n console.warn('⚠️ [UniversalFileService] 存储提供者初始化失败: ' + (type) + ':', error);\n // 如果默认存储提供者初始化失败,切换到本地存储\n // if (type === this.config.defaultStorage) {\n // console.warn('⚠️ [UniversalFileService] 默认存储提供者 ' + (type) + ' 初始化失败,切换到本地存储');\n // this.config.defaultStorage = 'local';\n // }\n }\n } else {\n console.warn('⚠️ [UniversalFileService] 存储提供者未注册: ' + (type));\n }\n }\n }\n }\n }\n\n private async registerDefaultStorageProviders(): Promise<void> {\n logger.info('📦 [UniversalFileService] 注册默认存储提供者...');\n\n // 根据配置注册相应的存储提供者\n try {\n if (this.config.storage) {\n if (this.config.storage.type === 'aliyun-oss' && this.config.storage.enabled) {\n const { AliyunOSSProvider } = await import('./providers/AliyunOSSProvider');\n const ossProvider = new AliyunOSSProvider();\n this.registerStorageProvider(ossProvider);\n logger.info('✅ [UniversalFileService] 阿里云OSS提供者注册成功');\n } else if (this.config.storage.type === 'local' && this.config.storage.enabled) {\n const { LocalStorageProvider } = await import('./providers/LocalStorageProvider');\n const localProvider = new LocalStorageProvider();\n this.registerStorageProvider(localProvider);\n logger.info('✅ [UniversalFileService] 本地存储提供者注册成功');\n }\n }\n\n // 如果没有注册任何提供者,注册本地存储作为后备\n if (this.storageProviders.size === 0) {\n const { LocalStorageProvider } = await import('./providers/LocalStorageProvider');\n const fallbackProvider = new LocalStorageProvider();\n this.registerStorageProvider(fallbackProvider);\n logger.info('✅ [UniversalFileService] 已注册备用本地存储提供者');\n }\n } catch (error) {\n console.warn('⚠️ [UniversalFileService] 注册默认存储提供者失败:', error);\n throw new Error('无法初始化存储提供者');\n }\n }\n\n private async initializeCDNProviders(): Promise<void> {\n // CDN 初始化暂时跳过,未来支持多个 CDN 提供者时实现\n if (this.config.cdn && this.config.cdn.enabled) {\n logger.info('✅ [UniversalFileService] CDN配置已启用: ' + (this.config.cdn.type));\n }\n }\n\n private async initializeFileProcessors(): Promise<void> {\n for (const processor of Array.from(this.fileProcessors.values())) {\n await processor.initialize();\n logger.info('✅ [UniversalFileService] 文件处理器初始化完成: ' + (processor.type));\n }\n }\n\n private async validateFile(file: File): Promise<void> {\n // 检查文件大小\n if (this.config.maxFileSize && file.size > this.config.maxFileSize) {\n throw new FileUploadError('文件大小超过限制: ' + (file.size) + ' > ' + (this.config.maxFileSize));\n }\n\n // 检查文件类型\n const mimeType = file.type || getMimeType(file.name);\n\n if (\n this.config.allowedMimeTypes &&\n this.config.allowedMimeTypes.length > 0 &&\n !this.config.allowedMimeTypes.includes(mimeType)\n ) {\n throw new FileUploadError('不支持的文件类型: ' + (mimeType));\n }\n }\n\n private async generateFileMetadata(\n fileId: string,\n fileInfo: UploadFileInfo\n ): Promise<FileMetadata> {\n const now = new Date();\n const mimeType = fileInfo.file.type || getMimeType(fileInfo.file.name);\n const extension = path.extname(fileInfo.file.name).toLowerCase();\n\n // 生成文件哈希(用于去重检测)\n const hash = await this.generateFileHash(fileInfo.file);\n\n return {\n id: fileId,\n originalName: fileInfo.file.name,\n storageName: (fileId) + (extension),\n size: fileInfo.file.size,\n mimeType,\n extension,\n hash,\n uploadTime: now,\n permission: fileInfo.permission || 'public',\n uploaderId: fileInfo.metadata?.uploadedBy || 'system',\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId,\n storageProvider: (this.config.defaultStorage || 'local') as StorageType,\n storagePath: '',\n accessCount: 0,\n metadata: fileInfo.metadata || {},\n };\n }\n\n private generateStoragePath(metadata: FileMetadata): string {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return (metadata.moduleId) + '/' + (year) + '/' + (month) + '/' + (day) + '/' + (metadata.storageName);\n }\n\n private async generateFileHash(file: File): Promise<string> {\n const buffer = await file.arrayBuffer();\n const hash = createHash('sha256');\n hash.update(Buffer.from(buffer));\n return hash.digest('hex');\n }\n\n private async queueFileProcessing(metadata: FileMetadata, options: any): Promise<void> {\n if (!this.config.processors?.length || 0 > 0) {\n return;\n }\n\n const processor = this.fileProcessors.get(options.type);\n if (!processor) {\n console.warn('⚠️ [UniversalFileService] 文件处理器不存在: ' + (options.type));\n return;\n }\n\n if (this.processingQueue.length >= 1000) {\n throw new FileProcessingError('处理队列已满');\n }\n\n this.processingQueue.push({\n fileId: metadata.id,\n processor,\n inputPath: metadata.storagePath,\n outputPath: this.generateProcessedPath(metadata, options),\n options,\n });\n\n // 启动处理队列\n if (!this.isProcessingQueueRunning) {\n this.processFileQueue();\n }\n }\n\n private generateProcessedPath(metadata: FileMetadata, options: any): string {\n const basePath = metadata.storagePath;\n const extension = path.extname(basePath);\n const basename = basePath.replace(extension, '');\n\n return (basename) + '_processed' + (extension);\n }\n\n private async processFileQueue(): Promise<void> {\n if (this.isProcessingQueueRunning || this.processingQueue.length === 0) {\n return;\n }\n\n this.isProcessingQueueRunning = true;\n\n while (this.processingQueue.length > 0) {\n const task = this.processingQueue.shift();\n if (!task) break;\n\n try {\n this.emitFileEvent('processing:start', task.fileId);\n\n const result = await task.processor.process(task.inputPath, task.outputPath, task.options);\n\n if (result.success) {\n this.emitFileEvent('processing:complete', task.fileId, result);\n } else {\n this.emitFileEvent('processing:error', task.fileId, undefined, result.error);\n }\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件处理失败: ' + (task.fileId) + ':', error);\n this.emitFileEvent(\n 'processing:error',\n task.fileId,\n undefined,\n error instanceof Error ? error.message : '处理失败'\n );\n }\n }\n\n this.isProcessingQueueRunning = false;\n }\n\n private cacheMetadata(metadata: FileMetadata): void {\n const expires = Date.now() + (this.config.cache?.metadataTTL || 3600) * 1000;\n this.metadataCache.set(metadata.id, { data: metadata, expires });\n }\n\n private clearMetadataCache(fileId: string): void {\n this.metadataCache.delete(fileId);\n }\n\n private emitFileEvent(type: string, fileId: string, data?: any, error?: string): void {\n const event: FileEvent = {\n type: type as any,\n fileId,\n timestamp: new Date(),\n data,\n error,\n };\n\n this.emit(type, event);\n this.emit('*', event); // 通用事件监听\n }\n\n // ============= 数据库操作私有方法 =============\n\n /**\n * 保存文件元数据到数据库 (通过持久化仓储)\n */\n private async saveFileMetadata(metadata: FileMetadata): Promise<void> {\n if (!this.config.persistence?.enabled || !this.config.persistence.repository) {\n logger.warn('⚠️ [UniversalFileService] 持久化未启用,跳过保存元数据');\n return;\n }\n\n try {\n await this.config.persistence.repository.save(metadata);\n logger.info('💾 [UniversalFileService] 文件元数据保存成功:', metadata.id);\n } catch (error) {\n console.error('❌ [UniversalFileService] 保存文件元数据失败:', error);\n throw new FileUploadError(\n '保存文件元数据失败: ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 从数据库删除文件元数据 (通过持久化仓储)\n */\n private async deleteFileMetadata(fileId: string): Promise<void> {\n if (!this.config.persistence?.enabled || !this.config.persistence.repository) {\n return;\n }\n\n try {\n await this.config.persistence.repository.delete(fileId);\n logger.info('🗑️ [UniversalFileService] 文件元数据删除成功:', fileId);\n } catch (error) {\n console.error('❌ [UniversalFileService] 删除文件元数据失败:', error);\n throw new FileUploadError(\n '删除文件元数据失败: ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 更新访问统计\n */\n private async updateAccessStats(fileId: string): Promise<void> {\n // 访问统计更新由数据库仓储实现决定\n // 这里只记录日志\n logger.info('📊 [UniversalFileService] 需要更新访问统计:', fileId);\n }\n\n /**\n * 检查文件访问权限\n */\n private async checkFileAccess(metadata: FileMetadata, userId?: string): Promise<void> {\n // 如果文件是公开的,允许访问\n if (metadata.permission === 'public') {\n return;\n }\n\n // 如果是私有文件,检查用户权限\n if (metadata.permission === 'private' && metadata.uploaderId !== userId) {\n throw new FileUploadError('无权限访问此文件');\n }\n\n // 如果是认证用户可访问,检查是否提供了 userId\n if (metadata.permission === 'authenticated' && !userId) {\n throw new FileUploadError('需要登录才能访问此文件');\n }\n }\n\n /**\n * 检查文件删除权限\n */\n private async checkFileDeleteAccess(metadata: FileMetadata, userId?: string): Promise<void> {\n // 只有上传者可以删除文件\n if (metadata.uploaderId !== userId) {\n throw new FileUploadError('无权限删除此文件');\n }\n }\n\n /**\n * 检查服务是否完全可用(包括存储提供者)\n */\n isFullyInitialized(): boolean {\n // 检查是否有可用的存储提供者\n const hasStorageProvider = Array.from(this.storageProviders.values()).some(provider =>\n provider.type === 'aliyun-oss' || provider.type === 'local'\n );\n\n return hasStorageProvider;\n }\n\n /**\n * 等待服务完全初始化(带超时)\n */\n async waitForInitialization(timeoutMs: number = 30000): Promise<void> {\n const startTime = Date.now();\n\n while (!this.isFullyInitialized()) {\n if (Date.now() - startTime > timeoutMs) {\n throw new Error('服务初始化超时 (' + (timeoutMs) + 'ms)');\n }\n\n // 等待100ms后重试\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n\n logger.info('✅ [UniversalFileService] 服务完全初始化就绪');\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkDVENFCQY_js = require('./chunk-DVENFCQY.js');
|
|
4
4
|
var chunkKO73EBUT_js = require('./chunk-KO73EBUT.js');
|
|
5
5
|
var React = require('react');
|
|
6
6
|
|
|
@@ -39,7 +39,7 @@ function ImageMappingPanel({
|
|
|
39
39
|
delete next[id];
|
|
40
40
|
onChange(next);
|
|
41
41
|
};
|
|
42
|
-
return /* @__PURE__ */ React__default.default.createElement("details", { className:
|
|
42
|
+
return /* @__PURE__ */ React__default.default.createElement("details", { className: chunkDVENFCQY_js.cn("rounded-lg border border-slate-200 bg-white/80 p-3", className) }, /* @__PURE__ */ React__default.default.createElement("summary", { className: "cursor-pointer text-sm font-semibold text-slate-700" }, title), /* @__PURE__ */ React__default.default.createElement("div", { className: "mt-3 grid grid-cols-1 gap-2 sm:grid-cols-2" }, items.map((item) => {
|
|
43
43
|
const image = value[item.id];
|
|
44
44
|
return /* @__PURE__ */ React__default.default.createElement(
|
|
45
45
|
"div",
|
|
@@ -101,5 +101,5 @@ function LocalImageMappingPanel({
|
|
|
101
101
|
|
|
102
102
|
exports.ImageMappingPanel = ImageMappingPanel;
|
|
103
103
|
exports.LocalImageMappingPanel = LocalImageMappingPanel;
|
|
104
|
-
//# sourceMappingURL=chunk-
|
|
105
|
-
//# sourceMappingURL=chunk-
|
|
104
|
+
//# sourceMappingURL=chunk-MZKATHB7.js.map
|
|
105
|
+
//# sourceMappingURL=chunk-MZKATHB7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ImageMappingPanel.tsx","../src/components/LocalImageMappingPanel.tsx"],"names":["React","cn","useLocalStorage"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/ImageMappingPanel.tsx","../src/components/LocalImageMappingPanel.tsx"],"names":["React","cn","useLocalStorage"],"mappings":"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","file":"chunk-MZKATHB7.js","sourcesContent":["import React from 'react';\nimport { cn } from '../utils';\n\nexport interface ImageMappingItem {\n id: string;\n label: string;\n}\n\nexport type ImageMappingValue = Record<string, string>;\n\nexport interface ImageMappingPanelProps {\n title: string;\n items: ImageMappingItem[];\n value: ImageMappingValue;\n onChange: (next: ImageMappingValue) => void;\n className?: string;\n uploadLabel?: string;\n clearLabel?: string;\n}\n\nexport function ImageMappingPanel({\n title,\n items,\n value,\n onChange,\n className,\n uploadLabel = '上传图片',\n clearLabel = '清除',\n}: ImageMappingPanelProps) {\n const handleFileChange = (id: string, file?: File) => {\n if (!file) {\n return;\n }\n\n const reader = new FileReader();\n reader.onload = () => {\n const base64 = typeof reader.result === 'string' ? reader.result : '';\n if (!base64) {\n return;\n }\n onChange({\n ...value,\n [id]: base64,\n });\n };\n reader.readAsDataURL(file);\n };\n\n const handleRemove = (id: string) => {\n const next = { ...value };\n delete next[id];\n onChange(next);\n };\n\n return (\n <details className={cn('rounded-lg border border-slate-200 bg-white/80 p-3', className)}>\n <summary className=\"cursor-pointer text-sm font-semibold text-slate-700\">{title}</summary>\n <div className=\"mt-3 grid grid-cols-1 gap-2 sm:grid-cols-2\">\n {items.map((item) => {\n const image = value[item.id];\n return (\n <div\n key={item.id}\n className=\"flex items-center gap-2 rounded-md border border-slate-200 bg-white p-2\"\n >\n <div className=\"w-16 text-xs font-semibold text-slate-600\">{item.label}</div>\n <label className=\"flex-1 cursor-pointer rounded-md bg-cyan-600 px-2 py-1 text-center text-xs font-medium text-white\">\n {uploadLabel}\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={(event) => {\n handleFileChange(item.id, event.target.files?.[0]);\n event.currentTarget.value = '';\n }}\n />\n </label>\n {image ? (\n <>\n <img\n src={image}\n alt={item.label}\n className=\"h-8 w-8 rounded-full border border-slate-200 object-cover\"\n />\n <button\n type=\"button\"\n className=\"rounded-md border border-red-200 px-2 py-1 text-xs text-red-600\"\n onClick={() => handleRemove(item.id)}\n >\n {clearLabel}\n </button>\n </>\n ) : null}\n </div>\n );\n })}\n </div>\n </details>\n );\n}\n\n","import React from 'react';\nimport { useLocalStorage } from '../storage/hooks/useLocalStorage';\nimport {\n ImageMappingPanel,\n type ImageMappingItem,\n type ImageMappingPanelProps,\n type ImageMappingValue,\n} from './ImageMappingPanel';\n\nexport interface LocalImageMappingPanelProps\n extends Omit<ImageMappingPanelProps, 'value' | 'onChange'> {\n storageKey: string;\n defaultValue?: ImageMappingValue;\n onValueChange?: (next: ImageMappingValue) => void;\n}\n\nexport function LocalImageMappingPanel({\n storageKey,\n defaultValue = {},\n onValueChange,\n ...panelProps\n}: LocalImageMappingPanelProps) {\n const [value, setValue] = useLocalStorage<ImageMappingValue>(storageKey, defaultValue);\n\n return (\n <ImageMappingPanel\n {...panelProps}\n value={value}\n onChange={(next) => {\n setValue(next);\n onValueChange?.(next);\n }}\n />\n );\n}\n\nexport type { ImageMappingItem };\n\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useStorage } from './chunk-VVWQTO4Y.mjs';
|
|
2
|
-
import { __require } from './chunk-
|
|
2
|
+
import { __require } from './chunk-WMJKH4XE.mjs';
|
|
3
3
|
|
|
4
4
|
// src/storage/adapters/react-native-adapter.ts
|
|
5
5
|
var AsyncStorage = null;
|
|
@@ -355,5 +355,5 @@ function useElectronStorage(key, defaultValue) {
|
|
|
355
355
|
}
|
|
356
356
|
|
|
357
357
|
export { ElectronStorageAdapter, MiniAppStorageAdapter, ReactNativeStorageAdapter, useAsyncStorage, useElectronStorage, useTaroStorage };
|
|
358
|
-
//# sourceMappingURL=chunk-
|
|
359
|
-
//# sourceMappingURL=chunk-
|
|
358
|
+
//# sourceMappingURL=chunk-NXQVTAOP.mjs.map
|
|
359
|
+
//# sourceMappingURL=chunk-NXQVTAOP.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage/adapters/react-native-adapter.ts","../src/storage/hooks/useAsyncStorage.ts","../src/storage/adapters/miniapp-adapter.ts","../src/storage/hooks/useTaroStorage.ts","../src/storage/adapters/electron-adapter.ts","../src/storage/hooks/useElectronStorage.ts"],"names":[],"mappings":"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","file":"chunk-UKT3PLON.mjs","sourcesContent":["/**\n * React Native 平台存储适配器 (AsyncStorage)\n */\n\nimport type { StorageAdapter } from '../types';\n\n// 动态导入 AsyncStorage(避免在非 RN 环境报错)\nlet AsyncStorage: any = null;\n\ntry {\n AsyncStorage = require('@react-native-async-storage/async-storage').default;\n} catch (e) {\n // AsyncStorage 不可用(非 React Native 环境)\n // 这是正常的,不需要警告\n}\n\nexport class ReactNativeStorageAdapter implements StorageAdapter {\n private listeners: Map<string, Set<(key: string, value: string | null) => void>> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n if (!AsyncStorage) return null;\n\n try {\n return await AsyncStorage.getItem(key);\n } catch (error) {\n console.error('[ReactNativeStorage] Error getting item \"' + (key) + '\":', error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.setItem(key, value);\n this.notifyListeners(key, value);\n } catch (error) {\n console.error('[ReactNativeStorage] Error setting item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.removeItem(key);\n this.notifyListeners(key, null);\n } catch (error) {\n console.error('[ReactNativeStorage] Error removing item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.clear();\n } catch (error) {\n console.error('[ReactNativeStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n addChangeListener(callback: (key: string, value: string | null) => void): () => void {\n // React Native 没有原生的跨实例存储监听,我们使用内存中的监听器\n if (!this.listeners.has('*')) {\n this.listeners.set('*', new Set());\n }\n\n this.listeners.get('*')!.add(callback);\n\n // 返回清理函数\n return () => {\n this.listeners.get('*')?.delete(callback);\n };\n }\n\n private notifyListeners(key: string, value: string | null): void {\n const globalListeners = this.listeners.get('*');\n if (globalListeners) {\n globalListeners.forEach((callback) => callback(key, value));\n }\n }\n}\n\n","'use client';\n\n/**\n * React Native AsyncStorage Hook\n * 基于通用 useStorage 的便捷封装\n */\n\nimport { useStorage } from './useStorage';\nimport { ReactNativeStorageAdapter } from '../adapters/react-native-adapter';\n\n// 创建单例适配器\nconst asyncStorage = new ReactNativeStorageAdapter();\n\n/**\n * React Native 的 AsyncStorage Hook\n *\n * @param key - 存储键名\n * @param defaultValue - 默认值\n * @returns [value, setValue, removeValue, isLoading]\n */\nexport function useAsyncStorage<T>(\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n return useStorage(asyncStorage, key, defaultValue);\n}\n\n","/**\n * 小程序平台存储适配器 (wx.storage / Taro.storage)\n * 仅在小程序环境下加载和使用\n */\n\nimport type { StorageAdapter } from '../types';\n\n// 延迟加载 Taro(仅在小程序环境)\nlet Taro: any = null;\nlet taroLoadPromise: Promise<void> | null = null;\nlet isMiniAppEnvironment: boolean | null = null;\n\n/**\n * 检测是否是小程序环境\n */\nfunction checkIsMiniApp(): boolean {\n if (isMiniAppEnvironment !== null) return isMiniAppEnvironment;\n\n // 服务端环境,不是小程序\n if (typeof window === 'undefined') {\n isMiniAppEnvironment = false;\n return false;\n }\n\n // 检测是否有小程序全局对象\n const globalObj = window as any;\n isMiniAppEnvironment = !!(\n globalObj.wx || // 微信小程序\n globalObj.my || // 支付宝小程序\n globalObj.swan || // 百度小程序\n globalObj.tt || // 抖音小程序\n globalObj.qq || // QQ 小程序\n globalObj.Taro // Taro 环境\n );\n\n return isMiniAppEnvironment;\n}\n\n/**\n * 加载 Taro(仅在小程序环境)\n */\nasync function loadTaro() {\n // 如果不是小程序环境,直接返回\n if (!checkIsMiniApp()) {\n return;\n }\n\n if (Taro) return;\n if (taroLoadPromise) return taroLoadPromise;\n\n taroLoadPromise = (async () => {\n try {\n // 使用动态导入,仅在小程序环境加载\n // 使用 Function 构造器来避免 TypeScript 在编译时解析模块\n const importTaro = new Function('return import(\"@tarojs/taro\")');\n const taroModule = await importTaro();\n Taro = taroModule.default || taroModule;\n } catch (e) {\n // Taro 不可用(非小程序环境或未安装)\n console.warn('[MiniAppStorage] Taro is not available. This is expected in non-MiniApp environments.');\n }\n })();\n\n return taroLoadPromise;\n}\n\nexport class MiniAppStorageAdapter implements StorageAdapter {\n private listeners: Map<string, Set<(key: string, value: string | null) => void>> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n // 非小程序环境,直接返回 null\n if (!checkIsMiniApp()) {\n return null;\n }\n\n await loadTaro();\n if (!Taro) return null;\n\n try {\n const result = await Taro.getStorage({ key });\n return result.data;\n } catch (error: any) {\n // 如果 key 不存在,Taro 会抛出错误\n if (error.errMsg?.includes('data not found')) {\n return null;\n }\n console.error('[MiniAppStorage] Error getting item \"' + (key) + '\":', error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n // 非小程序环境,抛出错误\n if (!checkIsMiniApp()) {\n throw new Error('[MiniAppStorage] This adapter can only be used in MiniApp environment');\n }\n\n await loadTaro();\n if (!Taro) {\n throw new Error('[MiniAppStorage] Taro is not available');\n }\n\n try {\n await Taro.setStorage({ key, data: value });\n this.notifyListeners(key, value);\n } catch (error) {\n console.error('[MiniAppStorage] Error setting item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n // 非小程序环境,抛出错误\n if (!checkIsMiniApp()) {\n throw new Error('[MiniAppStorage] This adapter can only be used in MiniApp environment');\n }\n\n await loadTaro();\n if (!Taro) {\n throw new Error('[MiniAppStorage] Taro is not available');\n }\n\n try {\n await Taro.removeStorage({ key });\n this.notifyListeners(key, null);\n } catch (error) {\n console.error('[MiniAppStorage] Error removing item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n // 非小程序环境,抛出错误\n if (!checkIsMiniApp()) {\n throw new Error('[MiniAppStorage] This adapter can only be used in MiniApp environment');\n }\n\n await loadTaro();\n if (!Taro) {\n throw new Error('[MiniAppStorage] Taro is not available');\n }\n\n try {\n await Taro.clearStorage();\n } catch (error) {\n console.error('[MiniAppStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n addChangeListener(callback: (key: string, value: string | null) => void): () => void {\n // 小程序没有原生的存储监听,我们使用内存中的监听器\n if (!this.listeners.has('*')) {\n this.listeners.set('*', new Set());\n }\n\n this.listeners.get('*')!.add(callback);\n\n // 返回清理函数\n return () => {\n this.listeners.get('*')?.delete(callback);\n };\n }\n\n private notifyListeners(key: string, value: string | null): void {\n const globalListeners = this.listeners.get('*');\n if (globalListeners) {\n globalListeners.forEach((callback) => callback(key, value));\n }\n }\n}\n\n","'use client';\n\n/**\n * 小程序 Taro Storage Hook\n * 基于通用 useStorage 的便捷封装\n */\n\nimport { useStorage } from './useStorage';\nimport { MiniAppStorageAdapter } from '../adapters/miniapp-adapter';\n\n// 创建单例适配器\nconst taroStorage = new MiniAppStorageAdapter();\n\n/**\n * 小程序的 Taro Storage Hook\n *\n * @param key - 存储键名\n * @param defaultValue - 默认值\n * @returns [value, setValue, removeValue, isLoading]\n */\nexport function useTaroStorage<T>(\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n return useStorage(taroStorage, key, defaultValue);\n}\n\n","/**\n * Electron 桌面端存储适配器\n *\n * Electron 渲染进程可以使用 localStorage(和 Web 相同)\n * 但我们提供专门的适配器以支持未来可能的主进程存储需求\n */\n\nimport type { StorageAdapter } from '../types';\n\n/**\n * 检查 localStorage 是否可用(Electron 渲染进程)\n */\nconst hasLocalStorage = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';\n\nexport class ElectronStorageAdapter implements StorageAdapter {\n private listeners: Map<string, Set<(key: string, value: string | null) => void>> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n // 非 Electron 或无 localStorage 环境返回 null\n if (!hasLocalStorage) {\n return null;\n }\n\n try {\n return localStorage.getItem(key);\n } catch (error) {\n console.error('[ElectronStorage] Error getting item \"' + (key) + '\":', error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n // 非 Electron 或无 localStorage 环境静默忽略\n if (!hasLocalStorage) {\n return;\n }\n\n try {\n localStorage.setItem(key, value);\n this.notifyListeners(key, value);\n\n // 触发自定义事件(用于跨窗口同步)\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('electron-storage-change', {\n detail: { key, value },\n })\n );\n }\n } catch (error) {\n console.error('[ElectronStorage] Error setting item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n if (!hasLocalStorage) {\n return;\n }\n\n try {\n localStorage.removeItem(key);\n this.notifyListeners(key, null);\n\n // 触发自定义事件\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('electron-storage-change', {\n detail: { key, value: null },\n })\n );\n }\n } catch (error) {\n console.error('[ElectronStorage] Error removing item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n if (!hasLocalStorage) {\n return;\n }\n\n try {\n localStorage.clear();\n\n // 通知所有监听器\n this.listeners.forEach((listeners, key) => {\n listeners.forEach((listener) => {\n listener(key, null);\n });\n });\n\n // 触发自定义事件\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('electron-storage-change', {\n detail: { key: '*', value: null },\n })\n );\n }\n } catch (error) {\n console.error('[ElectronStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n /**\n * 添加存储变化监听器\n * 支持跨 Electron 窗口同步\n */\n addChangeListener(listener: (key: string, newValue: string | null) => void): () => void {\n // 添加到监听器集合\n const allListeners = this.listeners.get('*') || new Set();\n allListeners.add(listener);\n this.listeners.set('*', allListeners);\n\n // Storage 事件监听(同源窗口)\n const storageHandler = (e: StorageEvent) => {\n if (e.key) {\n listener(e.key, e.newValue);\n }\n };\n\n // 自定义事件监听(Electron 窗口间通信)\n const customHandler = (e: Event) => {\n const customEvent = e as CustomEvent;\n const { key, value } = customEvent.detail;\n if (key === '*') {\n // clear 操作\n this.listeners.forEach((_, k) => listener(k, null));\n } else {\n listener(key, value);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('storage', storageHandler);\n window.addEventListener('electron-storage-change', customHandler);\n }\n\n // 返回清理函数\n return () => {\n allListeners.delete(listener);\n if (allListeners.size === 0) {\n this.listeners.delete('*');\n }\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('storage', storageHandler);\n window.removeEventListener('electron-storage-change', customHandler);\n }\n };\n }\n\n removeChangeListener(listener: (key: string, newValue: string | null) => void): void {\n const allListeners = this.listeners.get('*');\n if (allListeners) {\n allListeners.delete(listener);\n if (allListeners.size === 0) {\n this.listeners.delete('*');\n }\n }\n }\n\n /**\n * 通知监听器\n */\n private notifyListeners(key: string, value: string | null): void {\n // 通知特定 key 的监听器\n const keyListeners = this.listeners.get(key);\n if (keyListeners) {\n keyListeners.forEach((listener) => {\n listener(key, value);\n });\n }\n\n // 通知通配符监听器\n const allListeners = this.listeners.get('*');\n if (allListeners) {\n allListeners.forEach((listener) => {\n listener(key, value);\n });\n }\n }\n}\n\n","'use client';\n\n/**\n * Electron 桌面端 Storage Hook\n * 基于通用 useStorage 的便捷封装\n */\n\nimport { useStorage } from './useStorage';\nimport { ElectronStorageAdapter } from '../adapters/electron-adapter';\n\n// 创建单例适配器\nconst electronStorage = new ElectronStorageAdapter();\n\n/**\n * Electron 桌面端的 Storage Hook\n *\n * 在 Electron 渲染进程中使用 localStorage\n * 支持跨窗口同步\n *\n * @param key - 存储键名\n * @param defaultValue - 默认值\n * @returns [value, setValue, removeValue, isLoading]\n *\n * @example\n * ```tsx\n * const [token, setToken, removeToken] = useElectronStorage('auth-token', '')\n * ```\n */\nexport function useElectronStorage<T>(\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n return useStorage(electronStorage, key, defaultValue);\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/storage/adapters/react-native-adapter.ts","../src/storage/hooks/useAsyncStorage.ts","../src/storage/adapters/miniapp-adapter.ts","../src/storage/hooks/useTaroStorage.ts","../src/storage/adapters/electron-adapter.ts","../src/storage/hooks/useElectronStorage.ts"],"names":[],"mappings":"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","file":"chunk-NXQVTAOP.mjs","sourcesContent":["/**\n * React Native 平台存储适配器 (AsyncStorage)\n */\n\nimport type { StorageAdapter } from '../types';\n\n// 动态导入 AsyncStorage(避免在非 RN 环境报错)\nlet AsyncStorage: any = null;\n\ntry {\n AsyncStorage = require('@react-native-async-storage/async-storage').default;\n} catch (e) {\n // AsyncStorage 不可用(非 React Native 环境)\n // 这是正常的,不需要警告\n}\n\nexport class ReactNativeStorageAdapter implements StorageAdapter {\n private listeners: Map<string, Set<(key: string, value: string | null) => void>> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n if (!AsyncStorage) return null;\n\n try {\n return await AsyncStorage.getItem(key);\n } catch (error) {\n console.error('[ReactNativeStorage] Error getting item \"' + (key) + '\":', error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.setItem(key, value);\n this.notifyListeners(key, value);\n } catch (error) {\n console.error('[ReactNativeStorage] Error setting item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.removeItem(key);\n this.notifyListeners(key, null);\n } catch (error) {\n console.error('[ReactNativeStorage] Error removing item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.clear();\n } catch (error) {\n console.error('[ReactNativeStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n addChangeListener(callback: (key: string, value: string | null) => void): () => void {\n // React Native 没有原生的跨实例存储监听,我们使用内存中的监听器\n if (!this.listeners.has('*')) {\n this.listeners.set('*', new Set());\n }\n\n this.listeners.get('*')!.add(callback);\n\n // 返回清理函数\n return () => {\n this.listeners.get('*')?.delete(callback);\n };\n }\n\n private notifyListeners(key: string, value: string | null): void {\n const globalListeners = this.listeners.get('*');\n if (globalListeners) {\n globalListeners.forEach((callback) => callback(key, value));\n }\n }\n}\n\n","'use client';\n\n/**\n * React Native AsyncStorage Hook\n * 基于通用 useStorage 的便捷封装\n */\n\nimport { useStorage } from './useStorage';\nimport { ReactNativeStorageAdapter } from '../adapters/react-native-adapter';\n\n// 创建单例适配器\nconst asyncStorage = new ReactNativeStorageAdapter();\n\n/**\n * React Native 的 AsyncStorage Hook\n *\n * @param key - 存储键名\n * @param defaultValue - 默认值\n * @returns [value, setValue, removeValue, isLoading]\n */\nexport function useAsyncStorage<T>(\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n return useStorage(asyncStorage, key, defaultValue);\n}\n\n","/**\n * 小程序平台存储适配器 (wx.storage / Taro.storage)\n * 仅在小程序环境下加载和使用\n */\n\nimport type { StorageAdapter } from '../types';\n\n// 延迟加载 Taro(仅在小程序环境)\nlet Taro: any = null;\nlet taroLoadPromise: Promise<void> | null = null;\nlet isMiniAppEnvironment: boolean | null = null;\n\n/**\n * 检测是否是小程序环境\n */\nfunction checkIsMiniApp(): boolean {\n if (isMiniAppEnvironment !== null) return isMiniAppEnvironment;\n\n // 服务端环境,不是小程序\n if (typeof window === 'undefined') {\n isMiniAppEnvironment = false;\n return false;\n }\n\n // 检测是否有小程序全局对象\n const globalObj = window as any;\n isMiniAppEnvironment = !!(\n globalObj.wx || // 微信小程序\n globalObj.my || // 支付宝小程序\n globalObj.swan || // 百度小程序\n globalObj.tt || // 抖音小程序\n globalObj.qq || // QQ 小程序\n globalObj.Taro // Taro 环境\n );\n\n return isMiniAppEnvironment;\n}\n\n/**\n * 加载 Taro(仅在小程序环境)\n */\nasync function loadTaro() {\n // 如果不是小程序环境,直接返回\n if (!checkIsMiniApp()) {\n return;\n }\n\n if (Taro) return;\n if (taroLoadPromise) return taroLoadPromise;\n\n taroLoadPromise = (async () => {\n try {\n // 使用动态导入,仅在小程序环境加载\n // 使用 Function 构造器来避免 TypeScript 在编译时解析模块\n const importTaro = new Function('return import(\"@tarojs/taro\")');\n const taroModule = await importTaro();\n Taro = taroModule.default || taroModule;\n } catch (e) {\n // Taro 不可用(非小程序环境或未安装)\n console.warn('[MiniAppStorage] Taro is not available. This is expected in non-MiniApp environments.');\n }\n })();\n\n return taroLoadPromise;\n}\n\nexport class MiniAppStorageAdapter implements StorageAdapter {\n private listeners: Map<string, Set<(key: string, value: string | null) => void>> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n // 非小程序环境,直接返回 null\n if (!checkIsMiniApp()) {\n return null;\n }\n\n await loadTaro();\n if (!Taro) return null;\n\n try {\n const result = await Taro.getStorage({ key });\n return result.data;\n } catch (error: any) {\n // 如果 key 不存在,Taro 会抛出错误\n if (error.errMsg?.includes('data not found')) {\n return null;\n }\n console.error('[MiniAppStorage] Error getting item \"' + (key) + '\":', error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n // 非小程序环境,抛出错误\n if (!checkIsMiniApp()) {\n throw new Error('[MiniAppStorage] This adapter can only be used in MiniApp environment');\n }\n\n await loadTaro();\n if (!Taro) {\n throw new Error('[MiniAppStorage] Taro is not available');\n }\n\n try {\n await Taro.setStorage({ key, data: value });\n this.notifyListeners(key, value);\n } catch (error) {\n console.error('[MiniAppStorage] Error setting item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n // 非小程序环境,抛出错误\n if (!checkIsMiniApp()) {\n throw new Error('[MiniAppStorage] This adapter can only be used in MiniApp environment');\n }\n\n await loadTaro();\n if (!Taro) {\n throw new Error('[MiniAppStorage] Taro is not available');\n }\n\n try {\n await Taro.removeStorage({ key });\n this.notifyListeners(key, null);\n } catch (error) {\n console.error('[MiniAppStorage] Error removing item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n // 非小程序环境,抛出错误\n if (!checkIsMiniApp()) {\n throw new Error('[MiniAppStorage] This adapter can only be used in MiniApp environment');\n }\n\n await loadTaro();\n if (!Taro) {\n throw new Error('[MiniAppStorage] Taro is not available');\n }\n\n try {\n await Taro.clearStorage();\n } catch (error) {\n console.error('[MiniAppStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n addChangeListener(callback: (key: string, value: string | null) => void): () => void {\n // 小程序没有原生的存储监听,我们使用内存中的监听器\n if (!this.listeners.has('*')) {\n this.listeners.set('*', new Set());\n }\n\n this.listeners.get('*')!.add(callback);\n\n // 返回清理函数\n return () => {\n this.listeners.get('*')?.delete(callback);\n };\n }\n\n private notifyListeners(key: string, value: string | null): void {\n const globalListeners = this.listeners.get('*');\n if (globalListeners) {\n globalListeners.forEach((callback) => callback(key, value));\n }\n }\n}\n\n","'use client';\n\n/**\n * 小程序 Taro Storage Hook\n * 基于通用 useStorage 的便捷封装\n */\n\nimport { useStorage } from './useStorage';\nimport { MiniAppStorageAdapter } from '../adapters/miniapp-adapter';\n\n// 创建单例适配器\nconst taroStorage = new MiniAppStorageAdapter();\n\n/**\n * 小程序的 Taro Storage Hook\n *\n * @param key - 存储键名\n * @param defaultValue - 默认值\n * @returns [value, setValue, removeValue, isLoading]\n */\nexport function useTaroStorage<T>(\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n return useStorage(taroStorage, key, defaultValue);\n}\n\n","/**\n * Electron 桌面端存储适配器\n *\n * Electron 渲染进程可以使用 localStorage(和 Web 相同)\n * 但我们提供专门的适配器以支持未来可能的主进程存储需求\n */\n\nimport type { StorageAdapter } from '../types';\n\n/**\n * 检查 localStorage 是否可用(Electron 渲染进程)\n */\nconst hasLocalStorage = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';\n\nexport class ElectronStorageAdapter implements StorageAdapter {\n private listeners: Map<string, Set<(key: string, value: string | null) => void>> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n // 非 Electron 或无 localStorage 环境返回 null\n if (!hasLocalStorage) {\n return null;\n }\n\n try {\n return localStorage.getItem(key);\n } catch (error) {\n console.error('[ElectronStorage] Error getting item \"' + (key) + '\":', error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n // 非 Electron 或无 localStorage 环境静默忽略\n if (!hasLocalStorage) {\n return;\n }\n\n try {\n localStorage.setItem(key, value);\n this.notifyListeners(key, value);\n\n // 触发自定义事件(用于跨窗口同步)\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('electron-storage-change', {\n detail: { key, value },\n })\n );\n }\n } catch (error) {\n console.error('[ElectronStorage] Error setting item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n if (!hasLocalStorage) {\n return;\n }\n\n try {\n localStorage.removeItem(key);\n this.notifyListeners(key, null);\n\n // 触发自定义事件\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('electron-storage-change', {\n detail: { key, value: null },\n })\n );\n }\n } catch (error) {\n console.error('[ElectronStorage] Error removing item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n if (!hasLocalStorage) {\n return;\n }\n\n try {\n localStorage.clear();\n\n // 通知所有监听器\n this.listeners.forEach((listeners, key) => {\n listeners.forEach((listener) => {\n listener(key, null);\n });\n });\n\n // 触发自定义事件\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('electron-storage-change', {\n detail: { key: '*', value: null },\n })\n );\n }\n } catch (error) {\n console.error('[ElectronStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n /**\n * 添加存储变化监听器\n * 支持跨 Electron 窗口同步\n */\n addChangeListener(listener: (key: string, newValue: string | null) => void): () => void {\n // 添加到监听器集合\n const allListeners = this.listeners.get('*') || new Set();\n allListeners.add(listener);\n this.listeners.set('*', allListeners);\n\n // Storage 事件监听(同源窗口)\n const storageHandler = (e: StorageEvent) => {\n if (e.key) {\n listener(e.key, e.newValue);\n }\n };\n\n // 自定义事件监听(Electron 窗口间通信)\n const customHandler = (e: Event) => {\n const customEvent = e as CustomEvent;\n const { key, value } = customEvent.detail;\n if (key === '*') {\n // clear 操作\n this.listeners.forEach((_, k) => listener(k, null));\n } else {\n listener(key, value);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('storage', storageHandler);\n window.addEventListener('electron-storage-change', customHandler);\n }\n\n // 返回清理函数\n return () => {\n allListeners.delete(listener);\n if (allListeners.size === 0) {\n this.listeners.delete('*');\n }\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('storage', storageHandler);\n window.removeEventListener('electron-storage-change', customHandler);\n }\n };\n }\n\n removeChangeListener(listener: (key: string, newValue: string | null) => void): void {\n const allListeners = this.listeners.get('*');\n if (allListeners) {\n allListeners.delete(listener);\n if (allListeners.size === 0) {\n this.listeners.delete('*');\n }\n }\n }\n\n /**\n * 通知监听器\n */\n private notifyListeners(key: string, value: string | null): void {\n // 通知特定 key 的监听器\n const keyListeners = this.listeners.get(key);\n if (keyListeners) {\n keyListeners.forEach((listener) => {\n listener(key, value);\n });\n }\n\n // 通知通配符监听器\n const allListeners = this.listeners.get('*');\n if (allListeners) {\n allListeners.forEach((listener) => {\n listener(key, value);\n });\n }\n }\n}\n\n","'use client';\n\n/**\n * Electron 桌面端 Storage Hook\n * 基于通用 useStorage 的便捷封装\n */\n\nimport { useStorage } from './useStorage';\nimport { ElectronStorageAdapter } from '../adapters/electron-adapter';\n\n// 创建单例适配器\nconst electronStorage = new ElectronStorageAdapter();\n\n/**\n * Electron 桌面端的 Storage Hook\n *\n * 在 Electron 渲染进程中使用 localStorage\n * 支持跨窗口同步\n *\n * @param key - 存储键名\n * @param defaultValue - 默认值\n * @returns [value, setValue, removeValue, isLoading]\n *\n * @example\n * ```tsx\n * const [token, setToken, removeToken] = useElectronStorage('auth-token', '')\n * ```\n */\nexport function useElectronStorage<T>(\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n return useStorage(electronStorage, key, defaultValue);\n}\n\n"]}
|