sa2kit 1.0.0
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/LICENSE +22 -0
- package/README.md +298 -0
- package/dist/AliyunOSSProvider-7JLMJDXK.js +15 -0
- package/dist/AliyunOSSProvider-7JLMJDXK.js.map +1 -0
- package/dist/AliyunOSSProvider-GQMSDJGZ.mjs +6 -0
- package/dist/AliyunOSSProvider-GQMSDJGZ.mjs.map +1 -0
- package/dist/LocalStorageProvider-FVLLHBHO.mjs +6 -0
- package/dist/LocalStorageProvider-FVLLHBHO.mjs.map +1 -0
- package/dist/LocalStorageProvider-NBNHHWLY.js +15 -0
- package/dist/LocalStorageProvider-NBNHHWLY.js.map +1 -0
- package/dist/analytics/index.d.mts +1084 -0
- package/dist/analytics/index.d.ts +1084 -0
- package/dist/analytics/index.js +2595 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/index.mjs +2518 -0
- package/dist/analytics/index.mjs.map +1 -0
- package/dist/analytics/server/index.d.mts +499 -0
- package/dist/analytics/server/index.d.ts +499 -0
- package/dist/analytics/server/index.js +529 -0
- package/dist/analytics/server/index.js.map +1 -0
- package/dist/analytics/server/index.mjs +525 -0
- package/dist/analytics/server/index.mjs.map +1 -0
- package/dist/auth/client/index.d.mts +104 -0
- package/dist/auth/client/index.d.ts +104 -0
- package/dist/auth/client/index.js +21 -0
- package/dist/auth/client/index.js.map +1 -0
- package/dist/auth/client/index.mjs +4 -0
- package/dist/auth/client/index.mjs.map +1 -0
- package/dist/auth/components/index.d.mts +82 -0
- package/dist/auth/components/index.d.ts +82 -0
- package/dist/auth/components/index.js +93 -0
- package/dist/auth/components/index.js.map +1 -0
- package/dist/auth/components/index.mjs +86 -0
- package/dist/auth/components/index.mjs.map +1 -0
- package/dist/auth/hooks/index.d.mts +2 -0
- package/dist/auth/hooks/index.d.ts +2 -0
- package/dist/auth/hooks/index.js +17 -0
- package/dist/auth/hooks/index.js.map +1 -0
- package/dist/auth/hooks/index.mjs +4 -0
- package/dist/auth/hooks/index.mjs.map +1 -0
- package/dist/auth/index.d.mts +15 -0
- package/dist/auth/index.d.ts +15 -0
- package/dist/auth/index.js +110 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/index.mjs +9 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/auth/middleware/index.d.mts +75 -0
- package/dist/auth/middleware/index.d.ts +75 -0
- package/dist/auth/middleware/index.js +15 -0
- package/dist/auth/middleware/index.js.map +1 -0
- package/dist/auth/middleware/index.mjs +6 -0
- package/dist/auth/middleware/index.mjs.map +1 -0
- package/dist/auth/routes/index.d.mts +163 -0
- package/dist/auth/routes/index.d.ts +163 -0
- package/dist/auth/routes/index.js +27 -0
- package/dist/auth/routes/index.js.map +1 -0
- package/dist/auth/routes/index.mjs +6 -0
- package/dist/auth/routes/index.mjs.map +1 -0
- package/dist/auth/schema/index.d.mts +789 -0
- package/dist/auth/schema/index.d.ts +789 -0
- package/dist/auth/schema/index.js +41 -0
- package/dist/auth/schema/index.js.map +1 -0
- package/dist/auth/schema/index.mjs +4 -0
- package/dist/auth/schema/index.mjs.map +1 -0
- package/dist/auth/services/index.d.mts +47 -0
- package/dist/auth/services/index.d.ts +47 -0
- package/dist/auth/services/index.js +34 -0
- package/dist/auth/services/index.js.map +1 -0
- package/dist/auth/services/index.mjs +5 -0
- package/dist/auth/services/index.mjs.map +1 -0
- package/dist/chunk-3RFBUDRA.js +507 -0
- package/dist/chunk-3RFBUDRA.js.map +1 -0
- package/dist/chunk-3XG5OHFD.mjs +37 -0
- package/dist/chunk-3XG5OHFD.mjs.map +1 -0
- package/dist/chunk-6BL3AZGD.js +285 -0
- package/dist/chunk-6BL3AZGD.js.map +1 -0
- package/dist/chunk-6FNUWAIV.js +394 -0
- package/dist/chunk-6FNUWAIV.js.map +1 -0
- package/dist/chunk-6PRFP5EG.js +171 -0
- package/dist/chunk-6PRFP5EG.js.map +1 -0
- package/dist/chunk-6VHWOPRR.mjs +90 -0
- package/dist/chunk-6VHWOPRR.mjs.map +1 -0
- package/dist/chunk-AIKEVVDR.mjs +122 -0
- package/dist/chunk-AIKEVVDR.mjs.map +1 -0
- package/dist/chunk-APY57REU.js +300 -0
- package/dist/chunk-APY57REU.js.map +1 -0
- package/dist/chunk-BJTO5JO5.mjs +10 -0
- package/dist/chunk-BJTO5JO5.mjs.map +1 -0
- package/dist/chunk-C64RY2OW.mjs +295 -0
- package/dist/chunk-C64RY2OW.mjs.map +1 -0
- package/dist/chunk-DGUM43GV.js +12 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-FV3FNHQY.js +92 -0
- package/dist/chunk-FV3FNHQY.js.map +1 -0
- package/dist/chunk-GSTLV3MB.mjs +316 -0
- package/dist/chunk-GSTLV3MB.mjs.map +1 -0
- package/dist/chunk-HEMA7SWK.mjs +212 -0
- package/dist/chunk-HEMA7SWK.mjs.map +1 -0
- package/dist/chunk-HWJ34NL6.js +43 -0
- package/dist/chunk-HWJ34NL6.js.map +1 -0
- package/dist/chunk-HXFFYNIF.mjs +385 -0
- package/dist/chunk-HXFFYNIF.mjs.map +1 -0
- package/dist/chunk-KGRQNEIR.mjs +183 -0
- package/dist/chunk-KGRQNEIR.mjs.map +1 -0
- package/dist/chunk-KH6RQ4J5.js +28 -0
- package/dist/chunk-KH6RQ4J5.js.map +1 -0
- package/dist/chunk-KQGP6BTS.mjs +165 -0
- package/dist/chunk-KQGP6BTS.mjs.map +1 -0
- package/dist/chunk-NMF4ANIC.js +365 -0
- package/dist/chunk-NMF4ANIC.js.map +1 -0
- package/dist/chunk-O26VCNS3.js +216 -0
- package/dist/chunk-O26VCNS3.js.map +1 -0
- package/dist/chunk-OLHGZXN3.mjs +86 -0
- package/dist/chunk-OLHGZXN3.mjs.map +1 -0
- package/dist/chunk-QU5OT4DF.js +88 -0
- package/dist/chunk-QU5OT4DF.js.map +1 -0
- package/dist/chunk-RCNNVNLT.mjs +356 -0
- package/dist/chunk-RCNNVNLT.mjs.map +1 -0
- package/dist/chunk-ROEYW4A7.js +186 -0
- package/dist/chunk-ROEYW4A7.js.map +1 -0
- package/dist/chunk-SVWQN2LR.js +131 -0
- package/dist/chunk-SVWQN2LR.js.map +1 -0
- package/dist/chunk-TKCYPDWU.js +338 -0
- package/dist/chunk-TKCYPDWU.js.map +1 -0
- package/dist/chunk-U2L6V7KD.mjs +273 -0
- package/dist/chunk-U2L6V7KD.mjs.map +1 -0
- package/dist/chunk-YVBU7QDJ.mjs +505 -0
- package/dist/chunk-YVBU7QDJ.mjs.map +1 -0
- package/dist/chunk-ZGVB35L2.mjs +25 -0
- package/dist/chunk-ZGVB35L2.mjs.map +1 -0
- package/dist/config/index.d.mts +64 -0
- package/dist/config/index.d.ts +64 -0
- package/dist/config/index.js +136 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/index.mjs +128 -0
- package/dist/config/index.mjs.map +1 -0
- package/dist/drizzle-auth-service-Bxlovhv8.d.ts +145 -0
- package/dist/drizzle-auth-service-DZY2F1sv.d.mts +145 -0
- package/dist/enums-Dume-V5Y.d.mts +16 -0
- package/dist/enums-Dume-V5Y.d.ts +16 -0
- package/dist/i18n/index.d.mts +416 -0
- package/dist/i18n/index.d.ts +416 -0
- package/dist/i18n/index.js +671 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/index.mjs +650 -0
- package/dist/i18n/index.mjs.map +1 -0
- package/dist/index-8VoHap_4.d.mts +105 -0
- package/dist/index-8VoHap_4.d.ts +105 -0
- package/dist/index.d.mts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +84 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +7 -0
- package/dist/index.mjs.map +1 -0
- package/dist/logger/index.d.mts +125 -0
- package/dist/logger/index.d.ts +125 -0
- package/dist/logger/index.js +29 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/index.mjs +4 -0
- package/dist/logger/index.mjs.map +1 -0
- package/dist/request/index.d.mts +51 -0
- package/dist/request/index.d.ts +51 -0
- package/dist/request/index.js +85 -0
- package/dist/request/index.js.map +1 -0
- package/dist/request/index.mjs +82 -0
- package/dist/request/index.mjs.map +1 -0
- package/dist/storage/index.d.mts +74 -0
- package/dist/storage/index.d.ts +74 -0
- package/dist/storage/index.js +46 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/index.mjs +5 -0
- package/dist/storage/index.mjs.map +1 -0
- package/dist/types-BINlP9MK.d.mts +286 -0
- package/dist/types-BINlP9MK.d.ts +286 -0
- package/dist/types-BaZccpvk.d.mts +48 -0
- package/dist/types-BaZccpvk.d.ts +48 -0
- package/dist/types-CbTsi9CZ.d.mts +31 -0
- package/dist/types-CbTsi9CZ.d.ts +31 -0
- package/dist/types-CoGG1rNV.d.mts +258 -0
- package/dist/types-CoGG1rNV.d.ts +258 -0
- package/dist/types-DAxQ1MeY.d.ts +70 -0
- package/dist/types-DT8LVCvE.d.mts +70 -0
- package/dist/types-DW9qar-w.d.mts +52 -0
- package/dist/types-DW9qar-w.d.ts +52 -0
- package/dist/universalExport/index.d.mts +235 -0
- package/dist/universalExport/index.d.ts +235 -0
- package/dist/universalExport/index.js +621 -0
- package/dist/universalExport/index.js.map +1 -0
- package/dist/universalExport/index.mjs +580 -0
- package/dist/universalExport/index.mjs.map +1 -0
- package/dist/universalExport/server/index.d.mts +429 -0
- package/dist/universalExport/server/index.d.ts +429 -0
- package/dist/universalExport/server/index.js +263 -0
- package/dist/universalExport/server/index.js.map +1 -0
- package/dist/universalExport/server/index.mjs +242 -0
- package/dist/universalExport/server/index.mjs.map +1 -0
- package/dist/universalFile/index.d.mts +310 -0
- package/dist/universalFile/index.d.ts +310 -0
- package/dist/universalFile/index.js +811 -0
- package/dist/universalFile/index.js.map +1 -0
- package/dist/universalFile/index.mjs +736 -0
- package/dist/universalFile/index.mjs.map +1 -0
- package/dist/universalFile/server/index.d.mts +2428 -0
- package/dist/universalFile/server/index.d.ts +2428 -0
- package/dist/universalFile/server/index.js +4578 -0
- package/dist/universalFile/server/index.js.map +1 -0
- package/dist/universalFile/server/index.mjs +4518 -0
- package/dist/universalFile/server/index.mjs.map +1 -0
- package/dist/useElectronStorage-Dj0rcorG.d.mts +65 -0
- package/dist/useElectronStorage-DwnNfIhl.d.ts +65 -0
- package/dist/utils/index.d.mts +188 -0
- package/dist/utils/index.d.ts +188 -0
- package/dist/utils/index.js +42 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +5 -0
- package/dist/utils/index.mjs.map +1 -0
- package/package.json +220 -0
- package/tailwind.animations.js +34 -0
|
@@ -0,0 +1,2428 @@
|
|
|
1
|
+
import { F as FileMetadata, A as AccessPermission, i as UploadStatus, f as StorageType$1, U as UploadFileInfo$1, g as CDNType$1, h as ProcessorType$1, j as ProcessingOptions$1, I as ImageProcessingOptions, k as AudioProcessingOptions, V as VideoProcessingOptions, a as UploadProgress, o as FileEventListener$1 } from '../../types-CoGG1rNV.js';
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
3
|
+
import { NextResponse } from 'next/server';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* UniversalFile Server 端类型定义
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
type StorageType = StorageType$1;
|
|
10
|
+
type CDNType = CDNType$1;
|
|
11
|
+
type ProcessorType = ProcessorType$1;
|
|
12
|
+
type UploadFileInfo = UploadFileInfo$1;
|
|
13
|
+
type ProcessingOptions = ProcessingOptions$1;
|
|
14
|
+
/** 存储提供者接口 */
|
|
15
|
+
interface IStorageProvider {
|
|
16
|
+
/** 提供者类型 */
|
|
17
|
+
readonly type: StorageType;
|
|
18
|
+
/** 初始化 */
|
|
19
|
+
initialize(config: StorageConfig): Promise<void>;
|
|
20
|
+
/** 上传文件 */
|
|
21
|
+
upload(fileInfo: UploadFileInfo, path: string): Promise<StorageResult>;
|
|
22
|
+
/** 下载文件 */
|
|
23
|
+
download(path: string): Promise<Buffer>;
|
|
24
|
+
/** 删除文件 */
|
|
25
|
+
delete(path: string): Promise<StorageResult>;
|
|
26
|
+
/** 获取文件信息 */
|
|
27
|
+
getFileInfo(path: string): Promise<StorageResult>;
|
|
28
|
+
/** 生成访问URL */
|
|
29
|
+
getAccessUrl(path: string, expiresIn?: number): Promise<string>;
|
|
30
|
+
/** 生成预签名上传URL */
|
|
31
|
+
getUploadUrl(path: string, expiresIn?: number): Promise<string>;
|
|
32
|
+
/** 检查文件是否存在 */
|
|
33
|
+
exists(path: string): Promise<boolean>;
|
|
34
|
+
/** 列出文件 */
|
|
35
|
+
list(prefix: string, maxKeys?: number): Promise<string[]>;
|
|
36
|
+
}
|
|
37
|
+
/** CDN 提供者接口 */
|
|
38
|
+
interface ICDNProvider {
|
|
39
|
+
/** 提供者类型 */
|
|
40
|
+
readonly type: CDNType;
|
|
41
|
+
/** 初始化 */
|
|
42
|
+
initialize(config: CDNConfig): Promise<void>;
|
|
43
|
+
/** 生成CDN URL */
|
|
44
|
+
generateUrl(originalUrl: string): Promise<string>;
|
|
45
|
+
/** 刷新缓存 */
|
|
46
|
+
refreshCache(urls: string[]): Promise<CDNResult>;
|
|
47
|
+
/** 预热缓存 */
|
|
48
|
+
preheatCache(urls: string[]): Promise<CDNResult>;
|
|
49
|
+
/** 获取访问统计 */
|
|
50
|
+
getAccessStats(startTime: Date, endTime: Date): Promise<CDNResult>;
|
|
51
|
+
}
|
|
52
|
+
/** 文件处理器接口 */
|
|
53
|
+
interface IFileProcessor {
|
|
54
|
+
/** 处理器类型 */
|
|
55
|
+
readonly type: ProcessorType;
|
|
56
|
+
/** 初始化 */
|
|
57
|
+
initialize(): Promise<void>;
|
|
58
|
+
/** 处理文件 */
|
|
59
|
+
process(inputPath: string, outputPath: string, options: ProcessingOptions): Promise<ProcessingResult>;
|
|
60
|
+
/** 检查文件是否支持处理 */
|
|
61
|
+
supports(mimeType: string): boolean;
|
|
62
|
+
/** 获取文件信息 */
|
|
63
|
+
getFileInfo(filePath: string): Promise<Record<string, any>>;
|
|
64
|
+
}
|
|
65
|
+
/** 存储配置基础接口 */
|
|
66
|
+
interface StorageConfig {
|
|
67
|
+
/** 存储类型 */
|
|
68
|
+
type: StorageType;
|
|
69
|
+
/** 是否启用 */
|
|
70
|
+
enabled: boolean;
|
|
71
|
+
}
|
|
72
|
+
/** 本地存储配置 */
|
|
73
|
+
interface LocalStorageConfig extends StorageConfig {
|
|
74
|
+
type: 'local';
|
|
75
|
+
/** 存储根目录 */
|
|
76
|
+
rootPath: string;
|
|
77
|
+
/** 基础URL */
|
|
78
|
+
baseUrl: string;
|
|
79
|
+
}
|
|
80
|
+
/** 阿里云 OSS 配置 */
|
|
81
|
+
interface AliyunOSSConfig extends StorageConfig {
|
|
82
|
+
type: 'aliyun-oss';
|
|
83
|
+
/** 地域 */
|
|
84
|
+
region: string;
|
|
85
|
+
/** 存储桶名称 */
|
|
86
|
+
bucket: string;
|
|
87
|
+
/** 访问密钥ID */
|
|
88
|
+
accessKeyId: string;
|
|
89
|
+
/** 访问密钥密码 */
|
|
90
|
+
accessKeySecret: string;
|
|
91
|
+
/** 自定义域名 */
|
|
92
|
+
customDomain?: string;
|
|
93
|
+
/** 是否使用HTTPS */
|
|
94
|
+
secure?: boolean;
|
|
95
|
+
/** 是否使用内网访问 */
|
|
96
|
+
internal?: boolean;
|
|
97
|
+
}
|
|
98
|
+
/** CDN配置基础接口 */
|
|
99
|
+
interface CDNConfig {
|
|
100
|
+
/** CDN类型 */
|
|
101
|
+
type: CDNType;
|
|
102
|
+
/** 是否启用 */
|
|
103
|
+
enabled: boolean;
|
|
104
|
+
}
|
|
105
|
+
/** 阿里云 CDN 配置 */
|
|
106
|
+
interface AliyunCDNConfig extends CDNConfig {
|
|
107
|
+
type: 'aliyun-cdn';
|
|
108
|
+
/** CDN域名 */
|
|
109
|
+
domain: string;
|
|
110
|
+
/** 访问密钥ID */
|
|
111
|
+
accessKeyId: string;
|
|
112
|
+
/** 访问密钥密码 */
|
|
113
|
+
accessKeySecret: string;
|
|
114
|
+
/** 地域 */
|
|
115
|
+
region?: string;
|
|
116
|
+
}
|
|
117
|
+
/** 缓存配置 */
|
|
118
|
+
interface CacheConfig {
|
|
119
|
+
/** 是否启用缓存 */
|
|
120
|
+
enabled: boolean;
|
|
121
|
+
/** 最大缓存大小 */
|
|
122
|
+
maxSize?: number;
|
|
123
|
+
/** 缓存 TTL(秒) */
|
|
124
|
+
ttl?: number;
|
|
125
|
+
/** 是否使用 Redis */
|
|
126
|
+
useRedis?: boolean;
|
|
127
|
+
/** Redis 配置 */
|
|
128
|
+
redisConfig?: {
|
|
129
|
+
host: string;
|
|
130
|
+
port: number;
|
|
131
|
+
password?: string;
|
|
132
|
+
db?: number;
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/** 文件服务配置 */
|
|
136
|
+
/** 缓存配置扩展 */
|
|
137
|
+
interface CacheConfig {
|
|
138
|
+
/** 是否启用缓存 */
|
|
139
|
+
enabled: boolean;
|
|
140
|
+
/** 元数据缓存TTL(秒) */
|
|
141
|
+
metadataTTL?: number;
|
|
142
|
+
/** URL缓存TTL(秒) */
|
|
143
|
+
urlTTL?: number;
|
|
144
|
+
/** 最大缓存条目数 */
|
|
145
|
+
maxSize?: number;
|
|
146
|
+
}
|
|
147
|
+
interface UniversalFileServiceConfig {
|
|
148
|
+
/** 存储配置 */
|
|
149
|
+
storage: StorageConfig;
|
|
150
|
+
/** CDN 配置(可选) */
|
|
151
|
+
cdn?: CDNConfig;
|
|
152
|
+
/** 缓存配置(可选) */
|
|
153
|
+
cache?: CacheConfig;
|
|
154
|
+
/** 数据库持久化配置(可选) */
|
|
155
|
+
persistence?: FileServicePersistenceConfig;
|
|
156
|
+
/** 启用的处理器 */
|
|
157
|
+
processors?: ProcessorType[];
|
|
158
|
+
/** 数据库连接(可选) @deprecated 使用 persistence.repository 代替 */
|
|
159
|
+
db?: any;
|
|
160
|
+
/** 最大文件大小(字节) */
|
|
161
|
+
maxFileSize?: number;
|
|
162
|
+
/** 允许的文件类型 */
|
|
163
|
+
allowedMimeTypes?: string[];
|
|
164
|
+
/** 是否启用监控 */
|
|
165
|
+
enableMonitoring?: boolean;
|
|
166
|
+
/** 存储提供者映射(内部使用) */
|
|
167
|
+
storageProviders?: Map<StorageType, IStorageProvider>;
|
|
168
|
+
/** 默认存储类型 */
|
|
169
|
+
defaultStorage?: StorageType;
|
|
170
|
+
/** 默认CDN类型 */
|
|
171
|
+
defaultCDN?: CDNType;
|
|
172
|
+
}
|
|
173
|
+
/** 存储结果 */
|
|
174
|
+
/** 存储操作结果 */
|
|
175
|
+
interface StorageResult {
|
|
176
|
+
/** 是否成功 */
|
|
177
|
+
success: boolean;
|
|
178
|
+
/** 存储路径 */
|
|
179
|
+
path?: string;
|
|
180
|
+
/** 访问URL */
|
|
181
|
+
url?: string;
|
|
182
|
+
/** 文件大小 */
|
|
183
|
+
size?: number;
|
|
184
|
+
/** 错误信息 */
|
|
185
|
+
error?: string;
|
|
186
|
+
/** 额外数据 */
|
|
187
|
+
data?: Record<string, any>;
|
|
188
|
+
}
|
|
189
|
+
/** 存储元数据 */
|
|
190
|
+
interface StorageMetadata {
|
|
191
|
+
/** 文件大小 */
|
|
192
|
+
size: number;
|
|
193
|
+
/** MIME 类型 */
|
|
194
|
+
mimeType: string;
|
|
195
|
+
/** 最后修改时间 */
|
|
196
|
+
lastModified: Date;
|
|
197
|
+
/** 自定义元数据 */
|
|
198
|
+
metadata?: Record<string, any>;
|
|
199
|
+
}
|
|
200
|
+
/** CDN 结果 */
|
|
201
|
+
/** CDN操作结果 */
|
|
202
|
+
interface CDNResult {
|
|
203
|
+
/** 是否成功 */
|
|
204
|
+
success: boolean;
|
|
205
|
+
/** CDN URL */
|
|
206
|
+
url?: string;
|
|
207
|
+
/** 错误信息 */
|
|
208
|
+
error?: string;
|
|
209
|
+
/** 额外数据 */
|
|
210
|
+
data?: Record<string, any>;
|
|
211
|
+
}
|
|
212
|
+
/** CDN 统计信息 */
|
|
213
|
+
interface CDNStats {
|
|
214
|
+
/** 带宽(字节/秒) */
|
|
215
|
+
bandwidth: number;
|
|
216
|
+
/** 请求数 */
|
|
217
|
+
requests: number;
|
|
218
|
+
/** 流量(字节) */
|
|
219
|
+
traffic: number;
|
|
220
|
+
/** 统计时间范围 */
|
|
221
|
+
timeRange: {
|
|
222
|
+
start: Date;
|
|
223
|
+
end: Date;
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/** 处理结果 */
|
|
227
|
+
interface ProcessingResult {
|
|
228
|
+
/** 是否成功 */
|
|
229
|
+
success: boolean;
|
|
230
|
+
/** 处理后的文件路径 */
|
|
231
|
+
processedPath?: string;
|
|
232
|
+
/** 处理后的文件大小 */
|
|
233
|
+
processedSize?: number;
|
|
234
|
+
/** 缩略图路径 */
|
|
235
|
+
thumbnailPath?: string;
|
|
236
|
+
/** 错误信息 */
|
|
237
|
+
error?: string;
|
|
238
|
+
/** 处理耗时(毫秒) */
|
|
239
|
+
processingTime?: number;
|
|
240
|
+
/** 额外数据 */
|
|
241
|
+
data?: Record<string, any>;
|
|
242
|
+
}
|
|
243
|
+
/** 处理器信息 */
|
|
244
|
+
interface ProcessorInfo {
|
|
245
|
+
/** 处理器名称 */
|
|
246
|
+
name: string;
|
|
247
|
+
/** 处理器版本 */
|
|
248
|
+
version: string;
|
|
249
|
+
/** 支持的格式 */
|
|
250
|
+
supportedFormats: string[];
|
|
251
|
+
/** 支持的操作 */
|
|
252
|
+
supportedOperations: string[];
|
|
253
|
+
}
|
|
254
|
+
/** 文件数据库记录 */
|
|
255
|
+
interface FileRecord extends FileMetadata {
|
|
256
|
+
/** 创建时间 */
|
|
257
|
+
createdAt: Date | string;
|
|
258
|
+
/** 更新时间 */
|
|
259
|
+
updatedAt: Date | string;
|
|
260
|
+
}
|
|
261
|
+
/** 文件查询选项 */
|
|
262
|
+
interface FileQueryOptions {
|
|
263
|
+
/** 模块 ID */
|
|
264
|
+
moduleId?: string;
|
|
265
|
+
/** 业务 ID */
|
|
266
|
+
businessId?: string;
|
|
267
|
+
/** 上传者 ID */
|
|
268
|
+
uploaderId?: string;
|
|
269
|
+
/** 文件类型 */
|
|
270
|
+
mimeType?: string;
|
|
271
|
+
/** 访问权限 */
|
|
272
|
+
permission?: AccessPermission;
|
|
273
|
+
/** 状态 */
|
|
274
|
+
status?: UploadStatus;
|
|
275
|
+
/** 分页 */
|
|
276
|
+
page?: number;
|
|
277
|
+
pageSize?: number;
|
|
278
|
+
/** 排序 */
|
|
279
|
+
orderBy?: string;
|
|
280
|
+
orderDirection?: 'asc' | 'desc';
|
|
281
|
+
}
|
|
282
|
+
/** 分页结果 */
|
|
283
|
+
interface PaginatedResult<T> {
|
|
284
|
+
/** 数据列表 */
|
|
285
|
+
items: T[];
|
|
286
|
+
/** 总数 */
|
|
287
|
+
total: number;
|
|
288
|
+
/** 当前页 */
|
|
289
|
+
page: number;
|
|
290
|
+
/** 每页大小 */
|
|
291
|
+
pageSize: number;
|
|
292
|
+
/** 总页数 */
|
|
293
|
+
totalPages: number;
|
|
294
|
+
}
|
|
295
|
+
/** 文件事件类型 */
|
|
296
|
+
type FileEventType = 'upload:start' | 'upload:progress' | 'upload:complete' | 'upload:error' | 'download:start' | 'download:complete' | 'download:error' | 'delete:complete' | 'delete:error' | 'process:start' | 'process:complete' | 'process:error';
|
|
297
|
+
/** 文件事件 */
|
|
298
|
+
interface FileEvent {
|
|
299
|
+
/** 事件类型 */
|
|
300
|
+
type: FileEventType;
|
|
301
|
+
/** 文件 ID */
|
|
302
|
+
fileId: string;
|
|
303
|
+
/** 事件数据 */
|
|
304
|
+
data?: any;
|
|
305
|
+
/** 时间戳 */
|
|
306
|
+
timestamp: Date;
|
|
307
|
+
}
|
|
308
|
+
/** 事件监听器 */
|
|
309
|
+
type FileEventListener = (event: FileEvent) => void | Promise<void>;
|
|
310
|
+
/**
|
|
311
|
+
* 文件元数据数据库持久化接口
|
|
312
|
+
*
|
|
313
|
+
* 实现此接口以提供自定义的数据库持久化支持
|
|
314
|
+
*
|
|
315
|
+
* @example
|
|
316
|
+
* ```typescript
|
|
317
|
+
* // Drizzle ORM 实现
|
|
318
|
+
* class DrizzleFileRepository implements IFileMetadataRepository {
|
|
319
|
+
* async save(metadata: FileMetadata): Promise<void> {
|
|
320
|
+
* await db.insert(fileMetadata).values(metadata);
|
|
321
|
+
* }
|
|
322
|
+
* // ... 其他方法
|
|
323
|
+
* }
|
|
324
|
+
* ```
|
|
325
|
+
*/
|
|
326
|
+
interface IFileMetadataRepository {
|
|
327
|
+
/**
|
|
328
|
+
* 保存文件元数据到数据库
|
|
329
|
+
*/
|
|
330
|
+
save(metadata: FileMetadata): Promise<void>;
|
|
331
|
+
/**
|
|
332
|
+
* 从数据库获取文件元数据
|
|
333
|
+
*/
|
|
334
|
+
get(fileId: string): Promise<FileMetadata | null>;
|
|
335
|
+
/**
|
|
336
|
+
* 查询文件列表
|
|
337
|
+
*/
|
|
338
|
+
query(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>>;
|
|
339
|
+
/**
|
|
340
|
+
* 从数据库删除文件元数据
|
|
341
|
+
*/
|
|
342
|
+
delete(fileId: string): Promise<void>;
|
|
343
|
+
/**
|
|
344
|
+
* 批量删除文件元数据
|
|
345
|
+
*/
|
|
346
|
+
batchDelete(fileIds: string[]): Promise<void>;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* 数据库持久化配置
|
|
350
|
+
*/
|
|
351
|
+
interface FileServicePersistenceConfig {
|
|
352
|
+
/**
|
|
353
|
+
* 是否启用持久化
|
|
354
|
+
*/
|
|
355
|
+
enabled: boolean;
|
|
356
|
+
/**
|
|
357
|
+
* 持久化仓储实现
|
|
358
|
+
*/
|
|
359
|
+
repository: IFileMetadataRepository;
|
|
360
|
+
/**
|
|
361
|
+
* 是否自动持久化(默认 true)
|
|
362
|
+
* 如果为 true,文件上传完成后自动保存到数据库
|
|
363
|
+
*/
|
|
364
|
+
autoPersist?: boolean;
|
|
365
|
+
/**
|
|
366
|
+
* 是否优先使用缓存(默认 false)
|
|
367
|
+
* 如果为 true,查询时优先从缓存获取
|
|
368
|
+
*/
|
|
369
|
+
cacheFirst?: boolean;
|
|
370
|
+
}
|
|
371
|
+
/** 文件服务异常基类 */
|
|
372
|
+
declare class FileServiceError extends Error {
|
|
373
|
+
readonly code: string;
|
|
374
|
+
readonly details?: Record<string, any> | undefined;
|
|
375
|
+
constructor(message: string, code: string, details?: Record<string, any> | undefined);
|
|
376
|
+
}
|
|
377
|
+
/** 文件上传异常 */
|
|
378
|
+
declare class FileUploadError extends FileServiceError {
|
|
379
|
+
constructor(message: string, details?: Record<string, any>);
|
|
380
|
+
}
|
|
381
|
+
/** 文件处理异常 */
|
|
382
|
+
declare class FileProcessingError extends FileServiceError {
|
|
383
|
+
constructor(message: string, details?: Record<string, any>);
|
|
384
|
+
}
|
|
385
|
+
/** 存储提供者异常 */
|
|
386
|
+
declare class StorageProviderError extends FileServiceError {
|
|
387
|
+
constructor(message: string, details?: Record<string, any>);
|
|
388
|
+
}
|
|
389
|
+
/** CDN提供者异常 */
|
|
390
|
+
declare class CDNProviderError extends FileServiceError {
|
|
391
|
+
constructor(message: string, details?: Record<string, any>);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* UniversalFile Service 工厂函数
|
|
396
|
+
* 提供简化的服务初始化方式
|
|
397
|
+
*/
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* 创建文件服务配置(带智能默认值)
|
|
401
|
+
*/
|
|
402
|
+
declare function createFileServiceConfig(options: Partial<UniversalFileServiceConfig> & {
|
|
403
|
+
storage: StorageConfig | 'local';
|
|
404
|
+
}): UniversalFileServiceConfig;
|
|
405
|
+
/**
|
|
406
|
+
* 创建文件服务实例(简化版)
|
|
407
|
+
*
|
|
408
|
+
* @example
|
|
409
|
+
* ```typescript
|
|
410
|
+
* // 最简配置 - 使用本地存储
|
|
411
|
+
* const service = createUniversalFileService({ storage: 'local' });
|
|
412
|
+
*
|
|
413
|
+
* // 标准配置 - 使用阿里云 OSS
|
|
414
|
+
* const service = createUniversalFileService({
|
|
415
|
+
* storage: {
|
|
416
|
+
* type: 'aliyun-oss',
|
|
417
|
+
* config: {
|
|
418
|
+
* accessKeyId: process.env.OSS_KEY!,
|
|
419
|
+
* accessKeySecret: process.env.OSS_SECRET!,
|
|
420
|
+
* bucket: process.env.OSS_BUCKET!,
|
|
421
|
+
* region: process.env.OSS_REGION!,
|
|
422
|
+
* },
|
|
423
|
+
* },
|
|
424
|
+
* db: drizzleDb,
|
|
425
|
+
* });
|
|
426
|
+
* ```
|
|
427
|
+
*/
|
|
428
|
+
declare function createUniversalFileService(options: Partial<UniversalFileServiceConfig> & {
|
|
429
|
+
storage: StorageConfig | 'local';
|
|
430
|
+
}): {
|
|
431
|
+
config: UniversalFileServiceConfig;
|
|
432
|
+
upload(): Promise<never>;
|
|
433
|
+
download(): Promise<never>;
|
|
434
|
+
};
|
|
435
|
+
/**
|
|
436
|
+
* 从环境变量创建配置(便利函数)
|
|
437
|
+
*
|
|
438
|
+
* @example
|
|
439
|
+
* ```typescript
|
|
440
|
+
* // .env
|
|
441
|
+
* // STORAGE_TYPE=aliyun-oss
|
|
442
|
+
* // OSS_ACCESS_KEY_ID=xxx
|
|
443
|
+
* // OSS_ACCESS_KEY_SECRET=xxx
|
|
444
|
+
* // OSS_BUCKET=my-bucket
|
|
445
|
+
* // OSS_REGION=oss-cn-hangzhou
|
|
446
|
+
*
|
|
447
|
+
* const service = createFileServiceFromEnv();
|
|
448
|
+
* ```
|
|
449
|
+
*/
|
|
450
|
+
declare function createFileServiceFromEnv(db?: any): {
|
|
451
|
+
config: UniversalFileServiceConfig;
|
|
452
|
+
upload(): Promise<never>;
|
|
453
|
+
download(): Promise<never>;
|
|
454
|
+
};
|
|
455
|
+
|
|
456
|
+
/**
|
|
457
|
+
* UniversalFile 预设配置
|
|
458
|
+
* 提供常见场景的开箱即用配置
|
|
459
|
+
*/
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* 本地开发环境预设
|
|
463
|
+
*/
|
|
464
|
+
declare function createLocalDevPreset(baseUrl?: string): StorageConfig;
|
|
465
|
+
/**
|
|
466
|
+
* 生产环境 OSS 预设
|
|
467
|
+
*/
|
|
468
|
+
declare function createAliyunOSSPreset(config: {
|
|
469
|
+
accessKeyId: string;
|
|
470
|
+
accessKeySecret: string;
|
|
471
|
+
bucket: string;
|
|
472
|
+
region?: string;
|
|
473
|
+
}): StorageConfig;
|
|
474
|
+
/**
|
|
475
|
+
* 智能预设:根据环境自动选择
|
|
476
|
+
*/
|
|
477
|
+
declare function createSmartPreset(): StorageConfig;
|
|
478
|
+
/**
|
|
479
|
+
* 图片服务预设(针对图片处理优化)
|
|
480
|
+
*/
|
|
481
|
+
declare function createImageServicePreset(storage: StorageConfig): {
|
|
482
|
+
storage: StorageConfig;
|
|
483
|
+
maxFileSize: number;
|
|
484
|
+
allowedMimeTypes: string[];
|
|
485
|
+
};
|
|
486
|
+
/**
|
|
487
|
+
* 视频服务预设(针对大文件优化)
|
|
488
|
+
*/
|
|
489
|
+
declare function createVideoServicePreset(storage: StorageConfig): {
|
|
490
|
+
storage: StorageConfig;
|
|
491
|
+
maxFileSize: number;
|
|
492
|
+
allowedMimeTypes: string[];
|
|
493
|
+
enableStreaming: boolean;
|
|
494
|
+
};
|
|
495
|
+
/**
|
|
496
|
+
* 文档服务预设
|
|
497
|
+
*/
|
|
498
|
+
declare function createDocumentServicePreset(storage: StorageConfig): {
|
|
499
|
+
storage: StorageConfig;
|
|
500
|
+
maxFileSize: number;
|
|
501
|
+
allowedMimeTypes: string[];
|
|
502
|
+
};
|
|
503
|
+
|
|
504
|
+
/**
|
|
505
|
+
* UniversalFile 配置验证
|
|
506
|
+
*/
|
|
507
|
+
|
|
508
|
+
declare class ConfigValidationError extends Error {
|
|
509
|
+
field: string;
|
|
510
|
+
constructor(message: string, field: string);
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* 验证存储配置
|
|
514
|
+
*/
|
|
515
|
+
declare function validateStorageConfig(storage: StorageConfig): void;
|
|
516
|
+
/**
|
|
517
|
+
* 验证完整的服务配置
|
|
518
|
+
*/
|
|
519
|
+
declare function validateServiceConfig(config: UniversalFileServiceConfig): void;
|
|
520
|
+
/**
|
|
521
|
+
* 验证环境变量
|
|
522
|
+
*/
|
|
523
|
+
declare function validateEnvironment(requiredVars: string[]): void;
|
|
524
|
+
/**
|
|
525
|
+
* 获取环境变量所需的变量列表(根据存储类型)
|
|
526
|
+
*/
|
|
527
|
+
declare function getRequiredEnvVars(storageType: string): string[];
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* 本地存储提供者实现
|
|
531
|
+
*/
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* 本地文件系统存储提供者
|
|
535
|
+
*/
|
|
536
|
+
declare class LocalStorageProvider implements IStorageProvider {
|
|
537
|
+
readonly type: StorageType;
|
|
538
|
+
private config;
|
|
539
|
+
private isInitialized;
|
|
540
|
+
/**
|
|
541
|
+
* 初始化存储提供者
|
|
542
|
+
*/
|
|
543
|
+
initialize(config: StorageConfig): Promise<void>;
|
|
544
|
+
/**
|
|
545
|
+
* 上传文件
|
|
546
|
+
*/
|
|
547
|
+
upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult>;
|
|
548
|
+
/**
|
|
549
|
+
* 下载文件
|
|
550
|
+
*/
|
|
551
|
+
download(path: string): Promise<Buffer>;
|
|
552
|
+
/**
|
|
553
|
+
* 删除文件
|
|
554
|
+
*/
|
|
555
|
+
delete(path: string): Promise<StorageResult>;
|
|
556
|
+
/**
|
|
557
|
+
* 获取文件信息
|
|
558
|
+
*/
|
|
559
|
+
getFileInfo(path: string): Promise<StorageResult>;
|
|
560
|
+
/**
|
|
561
|
+
* 生成访问URL
|
|
562
|
+
*/
|
|
563
|
+
getAccessUrl(path: string, _expiresIn?: number): Promise<string>;
|
|
564
|
+
/**
|
|
565
|
+
* 生成预签名上传URL
|
|
566
|
+
*/
|
|
567
|
+
getUploadUrl(path: string, _expiresIn?: number): Promise<string>;
|
|
568
|
+
/**
|
|
569
|
+
* 检查文件是否存在
|
|
570
|
+
*/
|
|
571
|
+
exists(path: string): Promise<boolean>;
|
|
572
|
+
/**
|
|
573
|
+
* 列出文件
|
|
574
|
+
*/
|
|
575
|
+
list(prefix: string, maxKeys?: number): Promise<string[]>;
|
|
576
|
+
/**
|
|
577
|
+
* 确保已初始化
|
|
578
|
+
*/
|
|
579
|
+
private ensureInitialized;
|
|
580
|
+
/**
|
|
581
|
+
* 获取完整文件路径
|
|
582
|
+
*/
|
|
583
|
+
private getFullPath;
|
|
584
|
+
/**
|
|
585
|
+
* 生成访问URL
|
|
586
|
+
*/
|
|
587
|
+
private generateAccessUrl;
|
|
588
|
+
/**
|
|
589
|
+
* 确保目录存在
|
|
590
|
+
*/
|
|
591
|
+
private ensureDirectoryExists;
|
|
592
|
+
/**
|
|
593
|
+
* 验证目录访问权限
|
|
594
|
+
*/
|
|
595
|
+
private validateDirectoryAccess;
|
|
596
|
+
/**
|
|
597
|
+
* 流式上传大文件(可选实现)
|
|
598
|
+
*/
|
|
599
|
+
uploadStream(readableStream: NodeJS.ReadableStream, filePath: string): Promise<StorageResult>;
|
|
600
|
+
/**
|
|
601
|
+
* 流式下载大文件(可选实现)
|
|
602
|
+
*/
|
|
603
|
+
createDownloadStream(path: string): NodeJS.ReadableStream;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* 阿里云OSS存储提供者实现
|
|
608
|
+
*/
|
|
609
|
+
|
|
610
|
+
/**
|
|
611
|
+
* 阿里云OSS存储提供者
|
|
612
|
+
*/
|
|
613
|
+
declare class AliyunOSSProvider implements IStorageProvider {
|
|
614
|
+
readonly type: StorageType;
|
|
615
|
+
private config;
|
|
616
|
+
private client;
|
|
617
|
+
private isInitialized;
|
|
618
|
+
/**
|
|
619
|
+
* 初始化存储提供者
|
|
620
|
+
*/
|
|
621
|
+
initialize(config: StorageConfig): Promise<void>;
|
|
622
|
+
/**
|
|
623
|
+
* 重新初始化存储提供者(支持配置热更新)
|
|
624
|
+
*/
|
|
625
|
+
reinitialize(config: StorageConfig): Promise<void>;
|
|
626
|
+
/**
|
|
627
|
+
* 上传文件
|
|
628
|
+
*/
|
|
629
|
+
upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult>;
|
|
630
|
+
/**
|
|
631
|
+
* 下载文件
|
|
632
|
+
*/
|
|
633
|
+
download(filePath: string): Promise<Buffer>;
|
|
634
|
+
/**
|
|
635
|
+
* 删除文件
|
|
636
|
+
*/
|
|
637
|
+
delete(filePath: string): Promise<StorageResult>;
|
|
638
|
+
/**
|
|
639
|
+
* 获取文件信息
|
|
640
|
+
*/
|
|
641
|
+
getFileInfo(filePath: string): Promise<StorageResult>;
|
|
642
|
+
/**
|
|
643
|
+
* 生成访问URL
|
|
644
|
+
*/
|
|
645
|
+
getAccessUrl(filePath: string, expiresIn?: number): Promise<string>;
|
|
646
|
+
/**
|
|
647
|
+
* 生成预签名上传URL
|
|
648
|
+
*/
|
|
649
|
+
getUploadUrl(filePath: string, expiresIn?: number): Promise<string>;
|
|
650
|
+
/**
|
|
651
|
+
* 检查文件是否存在
|
|
652
|
+
*/
|
|
653
|
+
exists(filePath: string): Promise<boolean>;
|
|
654
|
+
/**
|
|
655
|
+
* 列出文件
|
|
656
|
+
*/
|
|
657
|
+
list(prefix: string, maxKeys?: number): Promise<string[]>;
|
|
658
|
+
/**
|
|
659
|
+
* 确保已初始化
|
|
660
|
+
*/
|
|
661
|
+
private ensureInitialized;
|
|
662
|
+
/**
|
|
663
|
+
* 验证配置
|
|
664
|
+
*/
|
|
665
|
+
private validateConfig;
|
|
666
|
+
/**
|
|
667
|
+
* 测试连接
|
|
668
|
+
*/
|
|
669
|
+
private testConnection;
|
|
670
|
+
/**
|
|
671
|
+
* 分片上传大文件
|
|
672
|
+
*/
|
|
673
|
+
private multipartUpload;
|
|
674
|
+
/**
|
|
675
|
+
* 生成公开访问URL
|
|
676
|
+
*/
|
|
677
|
+
private generateAccessUrl;
|
|
678
|
+
/**
|
|
679
|
+
* 判断是否为OSS错误
|
|
680
|
+
*/
|
|
681
|
+
private isOSSError;
|
|
682
|
+
/**
|
|
683
|
+
* 格式化OSS错误信息
|
|
684
|
+
*/
|
|
685
|
+
private formatOSSError;
|
|
686
|
+
/**
|
|
687
|
+
* 流式上传(可选实现)
|
|
688
|
+
*/
|
|
689
|
+
uploadStream(readableStream: NodeJS.ReadableStream, filePath: string, contentType?: string, contentLength?: number): Promise<StorageResult>;
|
|
690
|
+
/**
|
|
691
|
+
* 批量删除文件
|
|
692
|
+
*/
|
|
693
|
+
batchDelete(filePaths: string[]): Promise<StorageResult>;
|
|
694
|
+
/**
|
|
695
|
+
* 复制文件
|
|
696
|
+
*/
|
|
697
|
+
copy(sourcePath: string, targetPath: string): Promise<StorageResult>;
|
|
698
|
+
/**
|
|
699
|
+
* 编码元数据,避免中文字符在HTTP头部中的问题
|
|
700
|
+
*/
|
|
701
|
+
private encodeMetadata;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
/**
|
|
705
|
+
* 阿里云CDN提供者实现
|
|
706
|
+
*/
|
|
707
|
+
|
|
708
|
+
/**
|
|
709
|
+
* 阿里云CDN提供者
|
|
710
|
+
*/
|
|
711
|
+
declare class AliyunCDNProvider implements ICDNProvider {
|
|
712
|
+
readonly type: CDNType;
|
|
713
|
+
private config;
|
|
714
|
+
private client;
|
|
715
|
+
private isInitialized;
|
|
716
|
+
/**
|
|
717
|
+
* 初始化CDN提供者
|
|
718
|
+
*/
|
|
719
|
+
initialize(config: CDNConfig): Promise<void>;
|
|
720
|
+
/**
|
|
721
|
+
* 生成CDN URL
|
|
722
|
+
*/
|
|
723
|
+
generateUrl(originalUrl: string): Promise<string>;
|
|
724
|
+
/**
|
|
725
|
+
* 刷新缓存
|
|
726
|
+
*/
|
|
727
|
+
refreshCache(urls: string[]): Promise<CDNResult>;
|
|
728
|
+
/**
|
|
729
|
+
* 预热缓存
|
|
730
|
+
*/
|
|
731
|
+
preheatCache(urls: string[]): Promise<CDNResult>;
|
|
732
|
+
/**
|
|
733
|
+
* 获取访问统计
|
|
734
|
+
*/
|
|
735
|
+
getAccessStats(startTime: Date, endTime: Date): Promise<CDNResult>;
|
|
736
|
+
/**
|
|
737
|
+
* 生成防盗链签名URL
|
|
738
|
+
*/
|
|
739
|
+
generateSignedUrl(originalUrl: string, expiresIn?: number, authKey?: string): Promise<string>;
|
|
740
|
+
/**
|
|
741
|
+
* 查询刷新任务状态
|
|
742
|
+
*/
|
|
743
|
+
getRefreshTaskStatus(taskId: string): Promise<CDNResult>;
|
|
744
|
+
/**
|
|
745
|
+
* 查询预热任务状态
|
|
746
|
+
*/
|
|
747
|
+
getPreheatTaskStatus(taskId: string): Promise<CDNResult>;
|
|
748
|
+
/**
|
|
749
|
+
* 获取域名配置
|
|
750
|
+
*/
|
|
751
|
+
getDomainConfig(): Promise<CDNResult>;
|
|
752
|
+
/**
|
|
753
|
+
* 优化URL (添加图像处理参数等)
|
|
754
|
+
*/
|
|
755
|
+
optimizeUrl(originalUrl: string, options?: {
|
|
756
|
+
imageQuality?: number;
|
|
757
|
+
imageFormat?: 'webp' | 'jpg' | 'png';
|
|
758
|
+
imageResize?: {
|
|
759
|
+
width?: number;
|
|
760
|
+
height?: number;
|
|
761
|
+
};
|
|
762
|
+
enableGzip?: boolean;
|
|
763
|
+
}): Promise<string>;
|
|
764
|
+
/**
|
|
765
|
+
* 确保已初始化
|
|
766
|
+
*/
|
|
767
|
+
private ensureInitialized;
|
|
768
|
+
/**
|
|
769
|
+
* 验证配置
|
|
770
|
+
*/
|
|
771
|
+
private validateConfig;
|
|
772
|
+
/**
|
|
773
|
+
* 验证域名格式
|
|
774
|
+
*/
|
|
775
|
+
private isValidDomain;
|
|
776
|
+
/**
|
|
777
|
+
* 测试连接
|
|
778
|
+
*/
|
|
779
|
+
private testConnection;
|
|
780
|
+
/**
|
|
781
|
+
* 创建模拟客户端(用于开发测试)
|
|
782
|
+
*/
|
|
783
|
+
private createMockClient;
|
|
784
|
+
/**
|
|
785
|
+
* 批量刷新缓存(带进度回调)
|
|
786
|
+
*/
|
|
787
|
+
batchRefreshCache(urls: string[], batchSize?: number, onProgress?: (completed: number, total: number) => void): Promise<CDNResult>;
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
/**
|
|
791
|
+
* CDN缓存策略管理
|
|
792
|
+
* 优化静态资源缓存策略和预热机制
|
|
793
|
+
*/
|
|
794
|
+
/**
|
|
795
|
+
* 缓存策略类型
|
|
796
|
+
*/
|
|
797
|
+
declare enum CacheStrategyType$1 {
|
|
798
|
+
/** 图片资源 */
|
|
799
|
+
IMAGE = "image",
|
|
800
|
+
/** 视频资源 */
|
|
801
|
+
VIDEO = "video",
|
|
802
|
+
/** 音频资源 */
|
|
803
|
+
AUDIO = "audio",
|
|
804
|
+
/** 文档资源 */
|
|
805
|
+
DOCUMENT = "document",
|
|
806
|
+
/** 压缩包 */
|
|
807
|
+
ARCHIVE = "archive",
|
|
808
|
+
/** 静态资源 */
|
|
809
|
+
STATIC = "static",
|
|
810
|
+
/** 其他 */
|
|
811
|
+
OTHER = "other"
|
|
812
|
+
}
|
|
813
|
+
/**
|
|
814
|
+
* 缓存策略配置
|
|
815
|
+
*/
|
|
816
|
+
interface CacheStrategyConfig$1 {
|
|
817
|
+
/** 缓存策略类型 */
|
|
818
|
+
type: CacheStrategyType$1;
|
|
819
|
+
/** 缓存时间(秒) */
|
|
820
|
+
ttl: number;
|
|
821
|
+
/** 是否启用浏览器缓存 */
|
|
822
|
+
browserCache: boolean;
|
|
823
|
+
/** 浏览器缓存时间(秒) */
|
|
824
|
+
browserCacheTtl: number;
|
|
825
|
+
/** 是否启用CDN缓存 */
|
|
826
|
+
cdnCache: boolean;
|
|
827
|
+
/** CDN缓存时间(秒) */
|
|
828
|
+
cdnCacheTtl: number;
|
|
829
|
+
/** 是否启用预热 */
|
|
830
|
+
enableWarmup: boolean;
|
|
831
|
+
/** 缓存控制头 */
|
|
832
|
+
cacheControl: string;
|
|
833
|
+
/** 允许的文件类型 */
|
|
834
|
+
allowedMimeTypes: string[];
|
|
835
|
+
/** 文件大小限制(字节) */
|
|
836
|
+
maxFileSize?: number;
|
|
837
|
+
}
|
|
838
|
+
/**
|
|
839
|
+
* 缓存统计信息
|
|
840
|
+
*/
|
|
841
|
+
interface CacheStats$2 {
|
|
842
|
+
/** 命中次数 */
|
|
843
|
+
hits: number;
|
|
844
|
+
/** 未命中次数 */
|
|
845
|
+
misses: number;
|
|
846
|
+
/** 命中率 */
|
|
847
|
+
hitRate: number;
|
|
848
|
+
/** 总请求数 */
|
|
849
|
+
totalRequests: number;
|
|
850
|
+
/** 缓存大小估算 */
|
|
851
|
+
estimatedSize: number;
|
|
852
|
+
/** 节省的带宽(字节) */
|
|
853
|
+
bandwidthSaved: number;
|
|
854
|
+
}
|
|
855
|
+
/**
|
|
856
|
+
* CDN缓存策略管理器
|
|
857
|
+
*/
|
|
858
|
+
declare class CdnCacheStrategy$1 {
|
|
859
|
+
private strategies;
|
|
860
|
+
private stats;
|
|
861
|
+
constructor();
|
|
862
|
+
/**
|
|
863
|
+
* 初始化默认缓存策略
|
|
864
|
+
*/
|
|
865
|
+
private initializeDefaultStrategies;
|
|
866
|
+
/**
|
|
867
|
+
* 根据MIME类型获取缓存策略
|
|
868
|
+
*/
|
|
869
|
+
getStrategyByMimeType(mimeType: string): CacheStrategyConfig$1;
|
|
870
|
+
/**
|
|
871
|
+
* 生成缓存控制头
|
|
872
|
+
*/
|
|
873
|
+
generateCacheHeaders(mimeType: string, fileSize?: number): Record<string, string>;
|
|
874
|
+
/**
|
|
875
|
+
* 检查是否需要缓存预热
|
|
876
|
+
*/
|
|
877
|
+
shouldWarmupCache(mimeType: string): boolean;
|
|
878
|
+
/**
|
|
879
|
+
* 记录缓存命中
|
|
880
|
+
*/
|
|
881
|
+
recordCacheHit(mimeType: string, fileSize?: number): void;
|
|
882
|
+
/**
|
|
883
|
+
* 记录缓存未命中
|
|
884
|
+
*/
|
|
885
|
+
recordCacheMiss(mimeType: string, fileSize?: number): void;
|
|
886
|
+
/**
|
|
887
|
+
* 获取缓存统计信息
|
|
888
|
+
*/
|
|
889
|
+
getCacheStats(): Map<CacheStrategyType$1, CacheStats$2>;
|
|
890
|
+
/**
|
|
891
|
+
* 获取总体缓存统计
|
|
892
|
+
*/
|
|
893
|
+
getOverallStats(): CacheStats$2;
|
|
894
|
+
/**
|
|
895
|
+
* 生成缓存优化建议
|
|
896
|
+
*/
|
|
897
|
+
generateOptimizationSuggestions(): Array<{
|
|
898
|
+
type: CacheStrategyType$1;
|
|
899
|
+
issue: string;
|
|
900
|
+
suggestion: string;
|
|
901
|
+
severity: 'low' | 'medium' | 'high';
|
|
902
|
+
}>;
|
|
903
|
+
/**
|
|
904
|
+
* 更新缓存策略
|
|
905
|
+
*/
|
|
906
|
+
updateStrategy(type: CacheStrategyType$1, config: Partial<CacheStrategyConfig$1>): void;
|
|
907
|
+
/**
|
|
908
|
+
* 重置统计信息
|
|
909
|
+
*/
|
|
910
|
+
resetStats(): void;
|
|
911
|
+
}
|
|
912
|
+
/**
|
|
913
|
+
* 单例CDN缓存策略管理器
|
|
914
|
+
*/
|
|
915
|
+
declare const cdnCacheStrategy: CdnCacheStrategy$1;
|
|
916
|
+
|
|
917
|
+
/**
|
|
918
|
+
* 图片处理器实现
|
|
919
|
+
* 支持压缩、裁剪、水印、格式转换等功能
|
|
920
|
+
*/
|
|
921
|
+
|
|
922
|
+
/**
|
|
923
|
+
* 图片处理器
|
|
924
|
+
* 使用Sharp库进行高性能图片处理
|
|
925
|
+
*/
|
|
926
|
+
declare class ImageProcessor implements IFileProcessor {
|
|
927
|
+
readonly type: ProcessorType;
|
|
928
|
+
private sharp;
|
|
929
|
+
private isInitialized;
|
|
930
|
+
/**
|
|
931
|
+
* 初始化图片处理器
|
|
932
|
+
*/
|
|
933
|
+
initialize(): Promise<void>;
|
|
934
|
+
/**
|
|
935
|
+
* 处理图片文件
|
|
936
|
+
*/
|
|
937
|
+
process(inputPath: string, outputPath: string, options: ProcessingOptions): Promise<ProcessingResult>;
|
|
938
|
+
/**
|
|
939
|
+
* 检查文件是否支持处理
|
|
940
|
+
*/
|
|
941
|
+
supports(mimeType: string): boolean;
|
|
942
|
+
/**
|
|
943
|
+
* 获取图片文件信息
|
|
944
|
+
*/
|
|
945
|
+
getFileInfo(filePath: string): Promise<Record<string, any>>;
|
|
946
|
+
/**
|
|
947
|
+
* 确保处理器已初始化
|
|
948
|
+
*/
|
|
949
|
+
private ensureInitialized;
|
|
950
|
+
/**
|
|
951
|
+
* 获取图片元数据
|
|
952
|
+
*/
|
|
953
|
+
private getImageMetadata;
|
|
954
|
+
/**
|
|
955
|
+
* 应用图片处理操作
|
|
956
|
+
*/
|
|
957
|
+
private applyImageOperations;
|
|
958
|
+
/**
|
|
959
|
+
* 应用水印
|
|
960
|
+
*/
|
|
961
|
+
private applyWatermark;
|
|
962
|
+
/**
|
|
963
|
+
* 创建文字水印SVG
|
|
964
|
+
*/
|
|
965
|
+
private createTextWatermarkSvg;
|
|
966
|
+
/**
|
|
967
|
+
* 获取水印位置对应的gravity值
|
|
968
|
+
*/
|
|
969
|
+
private getWatermarkGravity;
|
|
970
|
+
/**
|
|
971
|
+
* 确定输出格式
|
|
972
|
+
*/
|
|
973
|
+
private determineOutputFormat;
|
|
974
|
+
/**
|
|
975
|
+
* 应用输出设置
|
|
976
|
+
*/
|
|
977
|
+
private applyOutputSettings;
|
|
978
|
+
/**
|
|
979
|
+
* 是否需要生成缩略图
|
|
980
|
+
*/
|
|
981
|
+
private shouldGenerateThumbnail;
|
|
982
|
+
/**
|
|
983
|
+
* 生成缩略图
|
|
984
|
+
*/
|
|
985
|
+
private generateThumbnail;
|
|
986
|
+
/**
|
|
987
|
+
* 获取缩略图路径
|
|
988
|
+
*/
|
|
989
|
+
private getThumbnailPath;
|
|
990
|
+
/**
|
|
991
|
+
* 创建模拟Sharp对象(开发测试用)
|
|
992
|
+
*/
|
|
993
|
+
private createMockSharp;
|
|
994
|
+
/**
|
|
995
|
+
* 批量图片处理
|
|
996
|
+
*/
|
|
997
|
+
batchProcess(inputPaths: string[], outputDir: string, options: ImageProcessingOptions, onProgress?: (completed: number, total: number) => void): Promise<ProcessingResult[]>;
|
|
998
|
+
}
|
|
999
|
+
|
|
1000
|
+
/**
|
|
1001
|
+
* 音频处理器实现
|
|
1002
|
+
* 支持格式转换、压缩、音质调整等功能
|
|
1003
|
+
*/
|
|
1004
|
+
|
|
1005
|
+
/**
|
|
1006
|
+
* 音频处理器
|
|
1007
|
+
* 使用FFmpeg进行音频处理
|
|
1008
|
+
*/
|
|
1009
|
+
declare class AudioProcessor implements IFileProcessor {
|
|
1010
|
+
readonly type: ProcessorType;
|
|
1011
|
+
private ffmpeg;
|
|
1012
|
+
private isInitialized;
|
|
1013
|
+
/**
|
|
1014
|
+
* 初始化音频处理器
|
|
1015
|
+
*/
|
|
1016
|
+
initialize(): Promise<void>;
|
|
1017
|
+
/**
|
|
1018
|
+
* 处理音频文件
|
|
1019
|
+
*/
|
|
1020
|
+
process(inputPath: string, outputPath: string, options: ProcessingOptions): Promise<ProcessingResult>;
|
|
1021
|
+
/**
|
|
1022
|
+
* 检查文件是否支持处理
|
|
1023
|
+
*/
|
|
1024
|
+
supports(mimeType: string): boolean;
|
|
1025
|
+
/**
|
|
1026
|
+
* 获取音频文件信息
|
|
1027
|
+
*/
|
|
1028
|
+
getFileInfo(filePath: string): Promise<Record<string, any>>;
|
|
1029
|
+
/**
|
|
1030
|
+
* 确保处理器已初始化
|
|
1031
|
+
*/
|
|
1032
|
+
private ensureInitialized;
|
|
1033
|
+
/**
|
|
1034
|
+
* 获取音频元数据
|
|
1035
|
+
*/
|
|
1036
|
+
private getAudioMetadata;
|
|
1037
|
+
/**
|
|
1038
|
+
* 执行音频处理
|
|
1039
|
+
*/
|
|
1040
|
+
private processAudio;
|
|
1041
|
+
/**
|
|
1042
|
+
* 设置音频编解码器
|
|
1043
|
+
*/
|
|
1044
|
+
private setAudioCodec;
|
|
1045
|
+
/**
|
|
1046
|
+
* 确定输出格式
|
|
1047
|
+
*/
|
|
1048
|
+
private determineOutputFormat;
|
|
1049
|
+
/**
|
|
1050
|
+
* 格式化时长显示
|
|
1051
|
+
*/
|
|
1052
|
+
private formatDuration;
|
|
1053
|
+
/**
|
|
1054
|
+
* 获取声道描述
|
|
1055
|
+
*/
|
|
1056
|
+
private getChannelsDescription;
|
|
1057
|
+
/**
|
|
1058
|
+
* 获取音质描述
|
|
1059
|
+
*/
|
|
1060
|
+
private getQualityDescription;
|
|
1061
|
+
/**
|
|
1062
|
+
* 创建模拟FFmpeg对象(开发测试用)
|
|
1063
|
+
*/
|
|
1064
|
+
private createMockFFmpeg;
|
|
1065
|
+
/**
|
|
1066
|
+
* 批量音频处理
|
|
1067
|
+
*/
|
|
1068
|
+
batchProcess(inputPaths: string[], outputDir: string, options: AudioProcessingOptions, onProgress?: (completed: number, total: number) => void): Promise<ProcessingResult[]>;
|
|
1069
|
+
/**
|
|
1070
|
+
* 提取音频封面
|
|
1071
|
+
*/
|
|
1072
|
+
extractCover(inputPath: string, outputPath: string): Promise<boolean>;
|
|
1073
|
+
/**
|
|
1074
|
+
* 音频降噪处理
|
|
1075
|
+
*/
|
|
1076
|
+
denoise(inputPath: string, outputPath: string): Promise<ProcessingResult>;
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
/**
|
|
1080
|
+
* 视频处理器实现
|
|
1081
|
+
* 支持缩略图生成、格式转换、压缩等功能
|
|
1082
|
+
*/
|
|
1083
|
+
|
|
1084
|
+
/**
|
|
1085
|
+
* 视频处理器
|
|
1086
|
+
* 使用FFmpeg进行视频处理
|
|
1087
|
+
*/
|
|
1088
|
+
declare class VideoProcessor implements IFileProcessor {
|
|
1089
|
+
readonly type: ProcessorType;
|
|
1090
|
+
private ffmpeg;
|
|
1091
|
+
private isInitialized;
|
|
1092
|
+
/**
|
|
1093
|
+
* 初始化视频处理器
|
|
1094
|
+
*/
|
|
1095
|
+
initialize(): Promise<void>;
|
|
1096
|
+
/**
|
|
1097
|
+
* 处理视频文件
|
|
1098
|
+
*/
|
|
1099
|
+
process(inputPath: string, outputPath: string, options: ProcessingOptions): Promise<ProcessingResult>;
|
|
1100
|
+
/**
|
|
1101
|
+
* 检查文件是否支持处理
|
|
1102
|
+
*/
|
|
1103
|
+
supports(mimeType: string): boolean;
|
|
1104
|
+
/**
|
|
1105
|
+
* 获取视频文件信息
|
|
1106
|
+
*/
|
|
1107
|
+
getFileInfo(filePath: string): Promise<Record<string, any>>;
|
|
1108
|
+
/**
|
|
1109
|
+
* 确保处理器已初始化
|
|
1110
|
+
*/
|
|
1111
|
+
private ensureInitialized;
|
|
1112
|
+
/**
|
|
1113
|
+
* 获取视频元数据
|
|
1114
|
+
*/
|
|
1115
|
+
private getVideoMetadata;
|
|
1116
|
+
/**
|
|
1117
|
+
* 解析帧率
|
|
1118
|
+
*/
|
|
1119
|
+
private parseFPS;
|
|
1120
|
+
/**
|
|
1121
|
+
* 执行视频处理
|
|
1122
|
+
*/
|
|
1123
|
+
private processVideo;
|
|
1124
|
+
/**
|
|
1125
|
+
* 设置视频编解码器
|
|
1126
|
+
*/
|
|
1127
|
+
private setVideoCodec;
|
|
1128
|
+
/**
|
|
1129
|
+
* 设置视频质量
|
|
1130
|
+
*/
|
|
1131
|
+
private setVideoQuality;
|
|
1132
|
+
/**
|
|
1133
|
+
* 确定输出格式
|
|
1134
|
+
*/
|
|
1135
|
+
private determineOutputFormat;
|
|
1136
|
+
/**
|
|
1137
|
+
* 生成缩略图
|
|
1138
|
+
*/
|
|
1139
|
+
private generateThumbnail;
|
|
1140
|
+
/**
|
|
1141
|
+
* 获取缩略图路径
|
|
1142
|
+
*/
|
|
1143
|
+
private getThumbnailPath;
|
|
1144
|
+
/**
|
|
1145
|
+
* 格式化时长显示
|
|
1146
|
+
*/
|
|
1147
|
+
private formatDuration;
|
|
1148
|
+
/**
|
|
1149
|
+
* 获取分辨率描述
|
|
1150
|
+
*/
|
|
1151
|
+
private getResolutionDescription;
|
|
1152
|
+
/**
|
|
1153
|
+
* 获取视频质量描述
|
|
1154
|
+
*/
|
|
1155
|
+
private getQualityDescription;
|
|
1156
|
+
/**
|
|
1157
|
+
* 创建模拟FFmpeg对象(开发测试用)
|
|
1158
|
+
*/
|
|
1159
|
+
private createMockFFmpeg;
|
|
1160
|
+
/**
|
|
1161
|
+
* 批量视频处理
|
|
1162
|
+
*/
|
|
1163
|
+
batchProcess(inputPaths: string[], outputDir: string, options: VideoProcessingOptions, onProgress?: (completed: number, total: number) => void): Promise<ProcessingResult[]>;
|
|
1164
|
+
/**
|
|
1165
|
+
* 提取视频帧
|
|
1166
|
+
*/
|
|
1167
|
+
extractFrames(inputPath: string, outputDir: string, options?: {
|
|
1168
|
+
count?: number;
|
|
1169
|
+
interval?: number;
|
|
1170
|
+
format?: 'jpg' | 'png';
|
|
1171
|
+
}): Promise<string[]>;
|
|
1172
|
+
/**
|
|
1173
|
+
* 视频压缩
|
|
1174
|
+
*/
|
|
1175
|
+
compress(inputPath: string, outputPath: string, compressionLevel?: 'low' | 'medium' | 'high'): Promise<ProcessingResult>;
|
|
1176
|
+
/**
|
|
1177
|
+
* 获取压缩质量
|
|
1178
|
+
*/
|
|
1179
|
+
private getCompressionQuality;
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
/**
|
|
1183
|
+
* 文件处理队列管理系统
|
|
1184
|
+
* 支持异步任务调度、优先级排序、并发控制等功能
|
|
1185
|
+
*/
|
|
1186
|
+
|
|
1187
|
+
interface QueueTask {
|
|
1188
|
+
id: string;
|
|
1189
|
+
inputPath: string;
|
|
1190
|
+
outputPath: string;
|
|
1191
|
+
options: ProcessingOptions;
|
|
1192
|
+
priority: TaskPriority;
|
|
1193
|
+
status: TaskStatus;
|
|
1194
|
+
processor?: IFileProcessor;
|
|
1195
|
+
startTime?: number;
|
|
1196
|
+
endTime?: number;
|
|
1197
|
+
result?: ProcessingResult;
|
|
1198
|
+
error?: string;
|
|
1199
|
+
retries: number;
|
|
1200
|
+
maxRetries: number;
|
|
1201
|
+
onProgress?: (task: QueueTask, progress: number) => void;
|
|
1202
|
+
onComplete?: (task: QueueTask, result: ProcessingResult) => void;
|
|
1203
|
+
onError?: (task: QueueTask, error: string) => void;
|
|
1204
|
+
}
|
|
1205
|
+
type TaskPriority = 'low' | 'normal' | 'high' | 'urgent';
|
|
1206
|
+
type TaskStatus = 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
1207
|
+
interface QueueOptions {
|
|
1208
|
+
maxConcurrentTasks?: number;
|
|
1209
|
+
maxRetries?: number;
|
|
1210
|
+
retryDelay?: number;
|
|
1211
|
+
taskTimeout?: number;
|
|
1212
|
+
autoStart?: boolean;
|
|
1213
|
+
}
|
|
1214
|
+
interface QueueStats {
|
|
1215
|
+
totalTasks: number;
|
|
1216
|
+
pendingTasks: number;
|
|
1217
|
+
runningTasks: number;
|
|
1218
|
+
completedTasks: number;
|
|
1219
|
+
failedTasks: number;
|
|
1220
|
+
cancelledTasks: number;
|
|
1221
|
+
averageProcessingTime: number;
|
|
1222
|
+
successRate: number;
|
|
1223
|
+
}
|
|
1224
|
+
/**
|
|
1225
|
+
* 文件处理队列管理器
|
|
1226
|
+
*/
|
|
1227
|
+
declare class ProcessingQueue extends EventEmitter {
|
|
1228
|
+
private tasks;
|
|
1229
|
+
private runningTasks;
|
|
1230
|
+
private processors;
|
|
1231
|
+
private options;
|
|
1232
|
+
private isStarted;
|
|
1233
|
+
private processInterval;
|
|
1234
|
+
constructor(options?: QueueOptions);
|
|
1235
|
+
/**
|
|
1236
|
+
* 注册文件处理器
|
|
1237
|
+
*/
|
|
1238
|
+
registerProcessor(processor: IFileProcessor): void;
|
|
1239
|
+
/**
|
|
1240
|
+
* 添加任务到队列
|
|
1241
|
+
*/
|
|
1242
|
+
addTask(inputPath: string, outputPath: string, options: ProcessingOptions, taskOptions?: Partial<Pick<QueueTask, 'priority' | 'maxRetries' | 'onProgress' | 'onComplete' | 'onError'>>): string;
|
|
1243
|
+
/**
|
|
1244
|
+
* 启动队列处理
|
|
1245
|
+
*/
|
|
1246
|
+
start(): void;
|
|
1247
|
+
/**
|
|
1248
|
+
* 停止队列处理
|
|
1249
|
+
*/
|
|
1250
|
+
stop(): void;
|
|
1251
|
+
/**
|
|
1252
|
+
* 暂停任务
|
|
1253
|
+
*/
|
|
1254
|
+
pauseTask(taskId: string): boolean;
|
|
1255
|
+
/**
|
|
1256
|
+
* 取消任务
|
|
1257
|
+
*/
|
|
1258
|
+
cancelTask(taskId: string): boolean;
|
|
1259
|
+
/**
|
|
1260
|
+
* 获取任务状态
|
|
1261
|
+
*/
|
|
1262
|
+
getTask(taskId: string): QueueTask | undefined;
|
|
1263
|
+
/**
|
|
1264
|
+
* 获取所有任务
|
|
1265
|
+
*/
|
|
1266
|
+
getAllTasks(): QueueTask[];
|
|
1267
|
+
/**
|
|
1268
|
+
* 获取待处理任务
|
|
1269
|
+
*/
|
|
1270
|
+
getPendingTasks(): QueueTask[];
|
|
1271
|
+
/**
|
|
1272
|
+
* 获取正在运行的任务
|
|
1273
|
+
*/
|
|
1274
|
+
getRunningTasks(): QueueTask[];
|
|
1275
|
+
/**
|
|
1276
|
+
* 获取队列统计信息
|
|
1277
|
+
*/
|
|
1278
|
+
getStats(): QueueStats;
|
|
1279
|
+
/**
|
|
1280
|
+
* 清理已完成的任务
|
|
1281
|
+
*/
|
|
1282
|
+
cleanup(): void;
|
|
1283
|
+
/**
|
|
1284
|
+
* 处理下一个任务
|
|
1285
|
+
*/
|
|
1286
|
+
private processNext;
|
|
1287
|
+
/**
|
|
1288
|
+
* 获取下一个待处理任务(按优先级排序)
|
|
1289
|
+
*/
|
|
1290
|
+
private getNextTask;
|
|
1291
|
+
/**
|
|
1292
|
+
* 处理单个任务
|
|
1293
|
+
*/
|
|
1294
|
+
private processTask;
|
|
1295
|
+
/**
|
|
1296
|
+
* 完成任务
|
|
1297
|
+
*/
|
|
1298
|
+
private completeTask;
|
|
1299
|
+
/**
|
|
1300
|
+
* 重试或失败任务
|
|
1301
|
+
*/
|
|
1302
|
+
private retryOrFailTask;
|
|
1303
|
+
/**
|
|
1304
|
+
* 失败任务
|
|
1305
|
+
*/
|
|
1306
|
+
private failTask;
|
|
1307
|
+
/**
|
|
1308
|
+
* 生成唯一任务ID
|
|
1309
|
+
*/
|
|
1310
|
+
private generateTaskId;
|
|
1311
|
+
/**
|
|
1312
|
+
* 批量添加任务
|
|
1313
|
+
*/
|
|
1314
|
+
addBatchTasks(tasks: Array<{
|
|
1315
|
+
inputPath: string;
|
|
1316
|
+
outputPath: string;
|
|
1317
|
+
options: ProcessingOptions;
|
|
1318
|
+
priority?: TaskPriority;
|
|
1319
|
+
}>, onBatchProgress?: (completed: number, total: number) => void, onBatchComplete?: (results: Map<string, ProcessingResult>) => void): string[];
|
|
1320
|
+
/**
|
|
1321
|
+
* 获取队列健康状态
|
|
1322
|
+
*/
|
|
1323
|
+
getHealthStatus(): {
|
|
1324
|
+
isHealthy: boolean;
|
|
1325
|
+
issues: string[];
|
|
1326
|
+
recommendations: string[];
|
|
1327
|
+
};
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1330
|
+
/**
|
|
1331
|
+
* MIME 类型工具函数
|
|
1332
|
+
*/
|
|
1333
|
+
/**
|
|
1334
|
+
* 根据文件名获取 MIME 类型
|
|
1335
|
+
*
|
|
1336
|
+
* @param filename 文件名
|
|
1337
|
+
* @returns MIME 类型
|
|
1338
|
+
*
|
|
1339
|
+
* @example
|
|
1340
|
+
* ```typescript
|
|
1341
|
+
* getMimeType('photo.jpg') // 'image/jpeg'
|
|
1342
|
+
* getMimeType('video.mp4') // 'video/mp4'
|
|
1343
|
+
* getMimeType('unknown.xyz') // 'application/octet-stream'
|
|
1344
|
+
* ```
|
|
1345
|
+
*/
|
|
1346
|
+
declare function getMimeType(filename: string): string;
|
|
1347
|
+
|
|
1348
|
+
/**
|
|
1349
|
+
* 通用文件服务核心实现
|
|
1350
|
+
*
|
|
1351
|
+
* 提供统一的文件上传、下载、管理接口
|
|
1352
|
+
*/
|
|
1353
|
+
|
|
1354
|
+
/**
|
|
1355
|
+
* 通用文件服务类
|
|
1356
|
+
*/
|
|
1357
|
+
declare class UniversalFileService extends EventEmitter {
|
|
1358
|
+
private config;
|
|
1359
|
+
private storageProviders;
|
|
1360
|
+
private cdnProviders;
|
|
1361
|
+
private fileProcessors;
|
|
1362
|
+
private uploadProgressMap;
|
|
1363
|
+
private metadataCache;
|
|
1364
|
+
private urlCache;
|
|
1365
|
+
private processingQueue;
|
|
1366
|
+
private isProcessingQueueRunning;
|
|
1367
|
+
constructor(config: UniversalFileServiceConfig);
|
|
1368
|
+
/**
|
|
1369
|
+
* 设置数据库持久化监听器
|
|
1370
|
+
*
|
|
1371
|
+
* 当文件上传完成或删除时,自动触发数据库操作
|
|
1372
|
+
*/
|
|
1373
|
+
private setupPersistenceListeners;
|
|
1374
|
+
/**
|
|
1375
|
+
* 初始化文件服务
|
|
1376
|
+
*/
|
|
1377
|
+
initialize(): Promise<void>;
|
|
1378
|
+
/**
|
|
1379
|
+
* 重新初始化存储提供者(支持配置热更新)
|
|
1380
|
+
*/
|
|
1381
|
+
reinitializeStorageProviders(): Promise<void>;
|
|
1382
|
+
/**
|
|
1383
|
+
* 注册存储提供者
|
|
1384
|
+
*/
|
|
1385
|
+
registerStorageProvider(provider: IStorageProvider): void;
|
|
1386
|
+
/**
|
|
1387
|
+
* 注册CDN提供者
|
|
1388
|
+
*/
|
|
1389
|
+
registerCDNProvider(provider: ICDNProvider): void;
|
|
1390
|
+
/**
|
|
1391
|
+
* 注册文件处理器
|
|
1392
|
+
*/
|
|
1393
|
+
registerFileProcessor(processor: IFileProcessor): void;
|
|
1394
|
+
/**
|
|
1395
|
+
* 上传文件
|
|
1396
|
+
*/
|
|
1397
|
+
uploadFile(fileInfo: UploadFileInfo$1, storageType?: StorageType$1, onProgress?: (progress: UploadProgress) => void): Promise<FileMetadata>;
|
|
1398
|
+
/**
|
|
1399
|
+
* 获取上传进度
|
|
1400
|
+
*/
|
|
1401
|
+
getUploadProgress(fileId: string): UploadProgress | undefined;
|
|
1402
|
+
/**
|
|
1403
|
+
* 监听文件事件
|
|
1404
|
+
*/
|
|
1405
|
+
onFileEvent(eventType: string, listener: FileEventListener$1): void;
|
|
1406
|
+
/**
|
|
1407
|
+
* 移除文件事件监听器
|
|
1408
|
+
*/
|
|
1409
|
+
offFileEvent(eventType: string, listener: FileEventListener$1): void;
|
|
1410
|
+
private initializeStorageProviders;
|
|
1411
|
+
private registerDefaultStorageProviders;
|
|
1412
|
+
private initializeCDNProviders;
|
|
1413
|
+
private initializeFileProcessors;
|
|
1414
|
+
private validateFile;
|
|
1415
|
+
private generateFileMetadata;
|
|
1416
|
+
private generateStoragePath;
|
|
1417
|
+
private generateFileHash;
|
|
1418
|
+
private queueFileProcessing;
|
|
1419
|
+
private generateProcessedPath;
|
|
1420
|
+
private processFileQueue;
|
|
1421
|
+
private cacheMetadata;
|
|
1422
|
+
private _clearMetadataCache2;
|
|
1423
|
+
private emitFileEvent;
|
|
1424
|
+
}
|
|
1425
|
+
|
|
1426
|
+
/**
|
|
1427
|
+
* 通用文件服务缓存管理器
|
|
1428
|
+
* 支持多层缓存策略:内存缓存 + Redis缓存
|
|
1429
|
+
*/
|
|
1430
|
+
/**
|
|
1431
|
+
* 缓存项接口
|
|
1432
|
+
*/
|
|
1433
|
+
interface CacheItem<T = any> {
|
|
1434
|
+
/** 缓存数据 */
|
|
1435
|
+
data: T;
|
|
1436
|
+
/** 创建时间 */
|
|
1437
|
+
createdAt: number;
|
|
1438
|
+
/** 过期时间 */
|
|
1439
|
+
expiresAt: number;
|
|
1440
|
+
/** 访问次数 */
|
|
1441
|
+
accessCount: number;
|
|
1442
|
+
/** 最后访问时间 */
|
|
1443
|
+
lastAccessAt: number;
|
|
1444
|
+
}
|
|
1445
|
+
/**
|
|
1446
|
+
* 缓存统计信息
|
|
1447
|
+
*/
|
|
1448
|
+
interface CacheStats$1 {
|
|
1449
|
+
/** 总请求次数 */
|
|
1450
|
+
totalRequests: number;
|
|
1451
|
+
/** 命中次数 */
|
|
1452
|
+
hits: number;
|
|
1453
|
+
/** 未命中次数 */
|
|
1454
|
+
misses: number;
|
|
1455
|
+
/** 命中率 */
|
|
1456
|
+
hitRate: number;
|
|
1457
|
+
/** 内存缓存大小 */
|
|
1458
|
+
memorySize: number;
|
|
1459
|
+
/** Redis缓存状态 */
|
|
1460
|
+
redisConnected: boolean;
|
|
1461
|
+
}
|
|
1462
|
+
/**
|
|
1463
|
+
* 缓存配置选项
|
|
1464
|
+
*/
|
|
1465
|
+
interface CacheOptions {
|
|
1466
|
+
/** 默认过期时间(秒) */
|
|
1467
|
+
defaultTTL?: number;
|
|
1468
|
+
/** 内存缓存最大条目数 */
|
|
1469
|
+
maxMemoryItems?: number;
|
|
1470
|
+
/** 是否启用Redis缓存 */
|
|
1471
|
+
enableRedis?: boolean;
|
|
1472
|
+
/** Redis连接配置 */
|
|
1473
|
+
redisConfig?: {
|
|
1474
|
+
host: string;
|
|
1475
|
+
port: number;
|
|
1476
|
+
password?: string;
|
|
1477
|
+
db?: number;
|
|
1478
|
+
};
|
|
1479
|
+
/** 缓存键前缀 */
|
|
1480
|
+
keyPrefix?: string;
|
|
1481
|
+
}
|
|
1482
|
+
/**
|
|
1483
|
+
* 缓存管理器
|
|
1484
|
+
*/
|
|
1485
|
+
declare class CacheManager {
|
|
1486
|
+
private memoryCache;
|
|
1487
|
+
private redisClient;
|
|
1488
|
+
private stats;
|
|
1489
|
+
private options;
|
|
1490
|
+
constructor(options?: CacheOptions);
|
|
1491
|
+
/**
|
|
1492
|
+
* 初始化Redis连接
|
|
1493
|
+
*/
|
|
1494
|
+
private initRedis;
|
|
1495
|
+
/**
|
|
1496
|
+
* 生成缓存键
|
|
1497
|
+
*/
|
|
1498
|
+
private generateKey;
|
|
1499
|
+
/**
|
|
1500
|
+
* 获取缓存数据
|
|
1501
|
+
*/
|
|
1502
|
+
get<T = any>(key: string): Promise<T | null>;
|
|
1503
|
+
/**
|
|
1504
|
+
* 设置缓存数据
|
|
1505
|
+
*/
|
|
1506
|
+
set<T = any>(key: string, data: T, ttl?: number): Promise<void>;
|
|
1507
|
+
/**
|
|
1508
|
+
* 删除缓存数据
|
|
1509
|
+
*/
|
|
1510
|
+
delete(key: string): Promise<void>;
|
|
1511
|
+
/**
|
|
1512
|
+
* 批量删除缓存(支持模式匹配)
|
|
1513
|
+
*/
|
|
1514
|
+
deletePattern(pattern: string): Promise<void>;
|
|
1515
|
+
/**
|
|
1516
|
+
* 清空所有缓存
|
|
1517
|
+
*/
|
|
1518
|
+
clear(): Promise<void>;
|
|
1519
|
+
/**
|
|
1520
|
+
* 获取缓存统计信息
|
|
1521
|
+
*/
|
|
1522
|
+
getStats(): CacheStats$1;
|
|
1523
|
+
/**
|
|
1524
|
+
* 获取缓存项详情(用于调试)
|
|
1525
|
+
*/
|
|
1526
|
+
getCacheItem(key: string): CacheItem | null;
|
|
1527
|
+
/**
|
|
1528
|
+
* 预热缓存
|
|
1529
|
+
*/
|
|
1530
|
+
warmup<T>(items: Array<{
|
|
1531
|
+
key: string;
|
|
1532
|
+
data: T;
|
|
1533
|
+
ttl?: number;
|
|
1534
|
+
}>): Promise<void>;
|
|
1535
|
+
/**
|
|
1536
|
+
* 更新命中率
|
|
1537
|
+
*/
|
|
1538
|
+
private updateHitRate;
|
|
1539
|
+
/**
|
|
1540
|
+
* 更新内存使用量
|
|
1541
|
+
*/
|
|
1542
|
+
private updateMemorySize;
|
|
1543
|
+
/**
|
|
1544
|
+
* 模式匹配函数
|
|
1545
|
+
*/
|
|
1546
|
+
private matchPattern;
|
|
1547
|
+
/**
|
|
1548
|
+
* 获取或设置缓存(如果不存在则调用生成函数)
|
|
1549
|
+
*/
|
|
1550
|
+
getOrSet<T>(key: string, generator: () => Promise<T>, ttl?: number): Promise<T>;
|
|
1551
|
+
/**
|
|
1552
|
+
* 关闭缓存管理器
|
|
1553
|
+
*/
|
|
1554
|
+
close(): Promise<void>;
|
|
1555
|
+
}
|
|
1556
|
+
|
|
1557
|
+
/**
|
|
1558
|
+
* 通用文件服务性能监控器
|
|
1559
|
+
* 监控API响应时间、数据库查询性能、缓存命中率等指标
|
|
1560
|
+
*/
|
|
1561
|
+
/**
|
|
1562
|
+
* 性能指标类型
|
|
1563
|
+
*/
|
|
1564
|
+
interface PerformanceMetric {
|
|
1565
|
+
/** 指标名称 */
|
|
1566
|
+
name: string;
|
|
1567
|
+
/** 指标值 */
|
|
1568
|
+
value: number;
|
|
1569
|
+
/** 单位 */
|
|
1570
|
+
unit: string;
|
|
1571
|
+
/** 时间戳 */
|
|
1572
|
+
timestamp: number;
|
|
1573
|
+
/** 标签 */
|
|
1574
|
+
labels?: Record<string, string>;
|
|
1575
|
+
}
|
|
1576
|
+
/**
|
|
1577
|
+
* 性能统计信息
|
|
1578
|
+
*/
|
|
1579
|
+
interface PerformanceStats {
|
|
1580
|
+
/** API响应时间统计 */
|
|
1581
|
+
apiResponseTimes: {
|
|
1582
|
+
/** 平均响应时间(毫秒) */
|
|
1583
|
+
average: number;
|
|
1584
|
+
/** 最小响应时间 */
|
|
1585
|
+
min: number;
|
|
1586
|
+
/** 最大响应时间 */
|
|
1587
|
+
max: number;
|
|
1588
|
+
/** P95响应时间 */
|
|
1589
|
+
p95: number;
|
|
1590
|
+
/** P99响应时间 */
|
|
1591
|
+
p99: number;
|
|
1592
|
+
/** 总请求数 */
|
|
1593
|
+
totalRequests: number;
|
|
1594
|
+
};
|
|
1595
|
+
/** 数据库查询性能 */
|
|
1596
|
+
databasePerformance: {
|
|
1597
|
+
/** 平均查询时间(毫秒) */
|
|
1598
|
+
averageQueryTime: number;
|
|
1599
|
+
/** 慢查询数量 */
|
|
1600
|
+
slowQueries: number;
|
|
1601
|
+
/** 总查询数 */
|
|
1602
|
+
totalQueries: number;
|
|
1603
|
+
/** 查询错误数 */
|
|
1604
|
+
queryErrors: number;
|
|
1605
|
+
};
|
|
1606
|
+
/** 文件操作性能 */
|
|
1607
|
+
fileOperations: {
|
|
1608
|
+
/** 文件上传统计 */
|
|
1609
|
+
uploads: {
|
|
1610
|
+
/** 总上传数 */
|
|
1611
|
+
total: number;
|
|
1612
|
+
/** 成功上传数 */
|
|
1613
|
+
successful: number;
|
|
1614
|
+
/** 失败上传数 */
|
|
1615
|
+
failed: number;
|
|
1616
|
+
/** 平均上传时间 */
|
|
1617
|
+
averageTime: number;
|
|
1618
|
+
/** 平均文件大小 */
|
|
1619
|
+
averageSize: number;
|
|
1620
|
+
};
|
|
1621
|
+
/** 文件下载统计 */
|
|
1622
|
+
downloads: {
|
|
1623
|
+
/** 总下载数 */
|
|
1624
|
+
total: number;
|
|
1625
|
+
/** 成功下载数 */
|
|
1626
|
+
successful: number;
|
|
1627
|
+
/** 失败下载数 */
|
|
1628
|
+
failed: number;
|
|
1629
|
+
/** 平均下载时间 */
|
|
1630
|
+
averageTime: number;
|
|
1631
|
+
};
|
|
1632
|
+
};
|
|
1633
|
+
/** 系统资源使用 */
|
|
1634
|
+
systemResources: {
|
|
1635
|
+
/** 内存使用量(MB) */
|
|
1636
|
+
memoryUsage: number;
|
|
1637
|
+
/** CPU使用率(%) */
|
|
1638
|
+
cpuUsage: number;
|
|
1639
|
+
/** 磁盘使用量(MB) */
|
|
1640
|
+
diskUsage: number;
|
|
1641
|
+
};
|
|
1642
|
+
}
|
|
1643
|
+
/**
|
|
1644
|
+
* 请求跟踪信息
|
|
1645
|
+
*/
|
|
1646
|
+
interface RequestTrace {
|
|
1647
|
+
/** 请求ID */
|
|
1648
|
+
requestId: string;
|
|
1649
|
+
/** 请求路径 */
|
|
1650
|
+
path: string;
|
|
1651
|
+
/** HTTP方法 */
|
|
1652
|
+
method: string;
|
|
1653
|
+
/** 开始时间 */
|
|
1654
|
+
startTime: number;
|
|
1655
|
+
/** 结束时间 */
|
|
1656
|
+
endTime?: number;
|
|
1657
|
+
/** 响应时间(毫秒) */
|
|
1658
|
+
duration?: number;
|
|
1659
|
+
/** 状态码 */
|
|
1660
|
+
statusCode?: number;
|
|
1661
|
+
/** 错误信息 */
|
|
1662
|
+
error?: string;
|
|
1663
|
+
/** 用户ID */
|
|
1664
|
+
userId?: string;
|
|
1665
|
+
/** 文件大小(字节) */
|
|
1666
|
+
fileSize?: number;
|
|
1667
|
+
}
|
|
1668
|
+
/**
|
|
1669
|
+
* 性能监控器
|
|
1670
|
+
*/
|
|
1671
|
+
declare class PerformanceMonitor {
|
|
1672
|
+
private metrics;
|
|
1673
|
+
private requestTraces;
|
|
1674
|
+
private stats;
|
|
1675
|
+
private readonly maxMetrics;
|
|
1676
|
+
private readonly maxTraces;
|
|
1677
|
+
constructor();
|
|
1678
|
+
/**
|
|
1679
|
+
* 初始化统计信息
|
|
1680
|
+
*/
|
|
1681
|
+
private initializeStats;
|
|
1682
|
+
/**
|
|
1683
|
+
* 开始请求跟踪
|
|
1684
|
+
*/
|
|
1685
|
+
startRequest(requestId: string, path: string, method: string, userId?: string): void;
|
|
1686
|
+
/**
|
|
1687
|
+
* 结束请求跟踪
|
|
1688
|
+
*/
|
|
1689
|
+
endRequest(requestId: string, statusCode: number, error?: string, fileSize?: number): void;
|
|
1690
|
+
/**
|
|
1691
|
+
* 记录数据库查询性能
|
|
1692
|
+
*/
|
|
1693
|
+
recordDatabaseQuery(queryTime: number, isError?: boolean): void;
|
|
1694
|
+
/**
|
|
1695
|
+
* 记录系统资源使用情况
|
|
1696
|
+
*/
|
|
1697
|
+
recordSystemResources(): void;
|
|
1698
|
+
/**
|
|
1699
|
+
* 记录自定义指标
|
|
1700
|
+
*/
|
|
1701
|
+
recordMetric(name: string, value: number, unit: string, labels?: Record<string, string>): void;
|
|
1702
|
+
/**
|
|
1703
|
+
* 获取性能统计信息
|
|
1704
|
+
*/
|
|
1705
|
+
getStats(): PerformanceStats;
|
|
1706
|
+
/**
|
|
1707
|
+
* 获取指定时间范围内的指标
|
|
1708
|
+
*/
|
|
1709
|
+
getMetrics(name?: string, startTime?: number, endTime?: number): PerformanceMetric[];
|
|
1710
|
+
/**
|
|
1711
|
+
* 获取请求跟踪信息
|
|
1712
|
+
*/
|
|
1713
|
+
getRequestTraces(limit?: number): RequestTrace[];
|
|
1714
|
+
/**
|
|
1715
|
+
* 获取慢请求列表
|
|
1716
|
+
*/
|
|
1717
|
+
getSlowRequests(threshold?: number): RequestTrace[];
|
|
1718
|
+
/**
|
|
1719
|
+
* 获取错误请求列表
|
|
1720
|
+
*/
|
|
1721
|
+
getErrorRequests(): RequestTrace[];
|
|
1722
|
+
/**
|
|
1723
|
+
* 生成性能报告
|
|
1724
|
+
*/
|
|
1725
|
+
generateReport(): {
|
|
1726
|
+
summary: any;
|
|
1727
|
+
topSlowRequests: RequestTrace[];
|
|
1728
|
+
recentErrors: RequestTrace[];
|
|
1729
|
+
systemHealth: any;
|
|
1730
|
+
};
|
|
1731
|
+
/**
|
|
1732
|
+
* 更新API统计信息
|
|
1733
|
+
*/
|
|
1734
|
+
private updateApiStats;
|
|
1735
|
+
/**
|
|
1736
|
+
* 更新上传统计信息
|
|
1737
|
+
*/
|
|
1738
|
+
private updateUploadStats;
|
|
1739
|
+
/**
|
|
1740
|
+
* 更新下载统计信息
|
|
1741
|
+
*/
|
|
1742
|
+
private updateDownloadStats;
|
|
1743
|
+
/**
|
|
1744
|
+
* 清理过期数据
|
|
1745
|
+
*/
|
|
1746
|
+
private cleanupOldData;
|
|
1747
|
+
/**
|
|
1748
|
+
* 重置统计信息
|
|
1749
|
+
*/
|
|
1750
|
+
reset(): void;
|
|
1751
|
+
}
|
|
1752
|
+
|
|
1753
|
+
/**
|
|
1754
|
+
* CDN缓存策略管理
|
|
1755
|
+
* 优化静态资源缓存策略和预热机制
|
|
1756
|
+
*/
|
|
1757
|
+
/**
|
|
1758
|
+
* 缓存策略类型
|
|
1759
|
+
*/
|
|
1760
|
+
declare enum CacheStrategyType {
|
|
1761
|
+
/** 图片资源 */
|
|
1762
|
+
IMAGE = "image",
|
|
1763
|
+
/** 视频资源 */
|
|
1764
|
+
VIDEO = "video",
|
|
1765
|
+
/** 音频资源 */
|
|
1766
|
+
AUDIO = "audio",
|
|
1767
|
+
/** 文档资源 */
|
|
1768
|
+
DOCUMENT = "document",
|
|
1769
|
+
/** 压缩包 */
|
|
1770
|
+
ARCHIVE = "archive",
|
|
1771
|
+
/** 静态资源 */
|
|
1772
|
+
STATIC = "static",
|
|
1773
|
+
/** 其他 */
|
|
1774
|
+
OTHER = "other"
|
|
1775
|
+
}
|
|
1776
|
+
/**
|
|
1777
|
+
* 缓存策略配置
|
|
1778
|
+
*/
|
|
1779
|
+
interface CacheStrategyConfig {
|
|
1780
|
+
/** 缓存策略类型 */
|
|
1781
|
+
type: CacheStrategyType;
|
|
1782
|
+
/** 缓存时间(秒) */
|
|
1783
|
+
ttl: number;
|
|
1784
|
+
/** 是否启用浏览器缓存 */
|
|
1785
|
+
browserCache: boolean;
|
|
1786
|
+
/** 浏览器缓存时间(秒) */
|
|
1787
|
+
browserCacheTtl: number;
|
|
1788
|
+
/** 是否启用CDN缓存 */
|
|
1789
|
+
cdnCache: boolean;
|
|
1790
|
+
/** CDN缓存时间(秒) */
|
|
1791
|
+
cdnCacheTtl: number;
|
|
1792
|
+
/** 是否启用预热 */
|
|
1793
|
+
enableWarmup: boolean;
|
|
1794
|
+
/** 缓存控制头 */
|
|
1795
|
+
cacheControl: string;
|
|
1796
|
+
/** 允许的文件类型 */
|
|
1797
|
+
allowedMimeTypes: string[];
|
|
1798
|
+
/** 文件大小限制(字节) */
|
|
1799
|
+
maxFileSize?: number;
|
|
1800
|
+
}
|
|
1801
|
+
/**
|
|
1802
|
+
* 缓存统计信息
|
|
1803
|
+
*/
|
|
1804
|
+
interface CacheStats {
|
|
1805
|
+
/** 命中次数 */
|
|
1806
|
+
hits: number;
|
|
1807
|
+
/** 未命中次数 */
|
|
1808
|
+
misses: number;
|
|
1809
|
+
/** 命中率 */
|
|
1810
|
+
hitRate: number;
|
|
1811
|
+
/** 总请求数 */
|
|
1812
|
+
totalRequests: number;
|
|
1813
|
+
/** 缓存大小估算 */
|
|
1814
|
+
estimatedSize: number;
|
|
1815
|
+
/** 节省的带宽(字节) */
|
|
1816
|
+
bandwidthSaved: number;
|
|
1817
|
+
}
|
|
1818
|
+
/**
|
|
1819
|
+
* CDN缓存策略管理器
|
|
1820
|
+
*/
|
|
1821
|
+
declare class CdnCacheStrategy {
|
|
1822
|
+
private strategies;
|
|
1823
|
+
private stats;
|
|
1824
|
+
constructor();
|
|
1825
|
+
/**
|
|
1826
|
+
* 初始化默认缓存策略
|
|
1827
|
+
*/
|
|
1828
|
+
private initializeDefaultStrategies;
|
|
1829
|
+
/**
|
|
1830
|
+
* 根据MIME类型获取缓存策略
|
|
1831
|
+
*/
|
|
1832
|
+
getStrategyByMimeType(mimeType: string): CacheStrategyConfig;
|
|
1833
|
+
/**
|
|
1834
|
+
* 生成缓存控制头
|
|
1835
|
+
*/
|
|
1836
|
+
generateCacheHeaders(mimeType: string, fileSize?: number): Record<string, string>;
|
|
1837
|
+
/**
|
|
1838
|
+
* 检查是否需要缓存预热
|
|
1839
|
+
*/
|
|
1840
|
+
shouldWarmupCache(mimeType: string): boolean;
|
|
1841
|
+
/**
|
|
1842
|
+
* 记录缓存命中
|
|
1843
|
+
*/
|
|
1844
|
+
recordCacheHit(mimeType: string, fileSize?: number): void;
|
|
1845
|
+
/**
|
|
1846
|
+
* 记录缓存未命中
|
|
1847
|
+
*/
|
|
1848
|
+
recordCacheMiss(mimeType: string, fileSize?: number): void;
|
|
1849
|
+
/**
|
|
1850
|
+
* 获取缓存统计信息
|
|
1851
|
+
*/
|
|
1852
|
+
getCacheStats(): Map<CacheStrategyType, CacheStats>;
|
|
1853
|
+
/**
|
|
1854
|
+
* 获取总体缓存统计
|
|
1855
|
+
*/
|
|
1856
|
+
getOverallStats(): CacheStats;
|
|
1857
|
+
/**
|
|
1858
|
+
* 生成缓存优化建议
|
|
1859
|
+
*/
|
|
1860
|
+
generateOptimizationSuggestions(): Array<{
|
|
1861
|
+
type: CacheStrategyType;
|
|
1862
|
+
issue: string;
|
|
1863
|
+
suggestion: string;
|
|
1864
|
+
severity: 'low' | 'medium' | 'high';
|
|
1865
|
+
}>;
|
|
1866
|
+
/**
|
|
1867
|
+
* 更新缓存策略
|
|
1868
|
+
*/
|
|
1869
|
+
updateStrategy(type: CacheStrategyType, config: Partial<CacheStrategyConfig>): void;
|
|
1870
|
+
/**
|
|
1871
|
+
* 重置统计信息
|
|
1872
|
+
*/
|
|
1873
|
+
resetStats(): void;
|
|
1874
|
+
}
|
|
1875
|
+
|
|
1876
|
+
/**
|
|
1877
|
+
* 通用文件服务 API 类型定义
|
|
1878
|
+
* 定义所有API接口的请求和响应格式
|
|
1879
|
+
*/
|
|
1880
|
+
/**
|
|
1881
|
+
* API响应的基础接口
|
|
1882
|
+
*/
|
|
1883
|
+
interface ApiResponse<T = any> {
|
|
1884
|
+
/** 是否成功 */
|
|
1885
|
+
success: boolean;
|
|
1886
|
+
/** 响应数据 */
|
|
1887
|
+
data?: T;
|
|
1888
|
+
/** 错误信息 */
|
|
1889
|
+
error?: {
|
|
1890
|
+
/** 错误代码 */
|
|
1891
|
+
code: string;
|
|
1892
|
+
/** 错误消息 */
|
|
1893
|
+
message: string;
|
|
1894
|
+
/** 详细错误信息 */
|
|
1895
|
+
details?: any;
|
|
1896
|
+
};
|
|
1897
|
+
/** 元数据 */
|
|
1898
|
+
meta?: {
|
|
1899
|
+
/** 总记录数 */
|
|
1900
|
+
total?: number;
|
|
1901
|
+
/** 当前页码 */
|
|
1902
|
+
page?: number;
|
|
1903
|
+
/** 每页大小 */
|
|
1904
|
+
pageSize?: number;
|
|
1905
|
+
/** 总页数 */
|
|
1906
|
+
totalPages?: number;
|
|
1907
|
+
/** 请求ID */
|
|
1908
|
+
requestId?: string;
|
|
1909
|
+
/** 时间戳 */
|
|
1910
|
+
timestamp?: string;
|
|
1911
|
+
};
|
|
1912
|
+
}
|
|
1913
|
+
/**
|
|
1914
|
+
* 分页查询参数
|
|
1915
|
+
*/
|
|
1916
|
+
interface PaginationParams {
|
|
1917
|
+
/** 页码,从1开始 */
|
|
1918
|
+
page?: number;
|
|
1919
|
+
/** 每页大小 */
|
|
1920
|
+
pageSize?: number;
|
|
1921
|
+
/** 排序字段 */
|
|
1922
|
+
orderBy?: string;
|
|
1923
|
+
/** 排序方向 */
|
|
1924
|
+
orderDirection?: 'asc' | 'desc';
|
|
1925
|
+
}
|
|
1926
|
+
/**
|
|
1927
|
+
* 文件上传响应
|
|
1928
|
+
*/
|
|
1929
|
+
interface UploadResponse {
|
|
1930
|
+
/** 文件ID */
|
|
1931
|
+
fileId: string;
|
|
1932
|
+
/** 原始文件名 */
|
|
1933
|
+
originalName: string;
|
|
1934
|
+
/** 文件大小 */
|
|
1935
|
+
size: number;
|
|
1936
|
+
/** MIME类型 */
|
|
1937
|
+
mimeType: string;
|
|
1938
|
+
/** 访问URL */
|
|
1939
|
+
url: string;
|
|
1940
|
+
/** CDN URL */
|
|
1941
|
+
cdnUrl?: string;
|
|
1942
|
+
/** MD5哈希 */
|
|
1943
|
+
md5Hash: string;
|
|
1944
|
+
/** 上传时间 */
|
|
1945
|
+
uploadTime: string;
|
|
1946
|
+
}
|
|
1947
|
+
/**
|
|
1948
|
+
* 文件上传请求参数
|
|
1949
|
+
*/
|
|
1950
|
+
interface FileUploadParams {
|
|
1951
|
+
/** 目标文件夹ID */
|
|
1952
|
+
folderId?: string;
|
|
1953
|
+
/** 模块ID */
|
|
1954
|
+
moduleId?: string;
|
|
1955
|
+
/** 业务ID */
|
|
1956
|
+
businessId?: string;
|
|
1957
|
+
/** 文件标签 */
|
|
1958
|
+
tags?: string[];
|
|
1959
|
+
/** 是否为临时文件 */
|
|
1960
|
+
isTemporary?: boolean;
|
|
1961
|
+
/** 过期时间 */
|
|
1962
|
+
expiresAt?: string;
|
|
1963
|
+
/** 自定义元数据 */
|
|
1964
|
+
metadata?: Record<string, any>;
|
|
1965
|
+
}
|
|
1966
|
+
/**
|
|
1967
|
+
* 文件查询参数
|
|
1968
|
+
*/
|
|
1969
|
+
interface FileQueryParams extends PaginationParams {
|
|
1970
|
+
/** 模块ID */
|
|
1971
|
+
moduleId?: string;
|
|
1972
|
+
/** 业务ID */
|
|
1973
|
+
businessId?: string;
|
|
1974
|
+
/** 文件夹ID */
|
|
1975
|
+
folderId?: string;
|
|
1976
|
+
/** MIME类型过滤 */
|
|
1977
|
+
mimeType?: string;
|
|
1978
|
+
/** 文件名搜索 */
|
|
1979
|
+
search?: string;
|
|
1980
|
+
/** 标签过滤 */
|
|
1981
|
+
tags?: string[];
|
|
1982
|
+
/** 文件大小范围 */
|
|
1983
|
+
sizeMin?: number;
|
|
1984
|
+
sizeMax?: number;
|
|
1985
|
+
/** 上传时间范围 */
|
|
1986
|
+
uploadTimeStart?: string;
|
|
1987
|
+
uploadTimeEnd?: string;
|
|
1988
|
+
/** 是否已删除 */
|
|
1989
|
+
isDeleted?: boolean;
|
|
1990
|
+
/** 是否临时文件 */
|
|
1991
|
+
isTemporary?: boolean;
|
|
1992
|
+
/** 上传者ID */
|
|
1993
|
+
uploaderId?: string;
|
|
1994
|
+
}
|
|
1995
|
+
/**
|
|
1996
|
+
* 文件信息响应
|
|
1997
|
+
*/
|
|
1998
|
+
interface FileInfo {
|
|
1999
|
+
/** 文件ID */
|
|
2000
|
+
id: string;
|
|
2001
|
+
/** 原始文件名 */
|
|
2002
|
+
originalName: string;
|
|
2003
|
+
/** 存储文件名 */
|
|
2004
|
+
storedName: string;
|
|
2005
|
+
/** 文件扩展名 */
|
|
2006
|
+
extension?: string;
|
|
2007
|
+
/** MIME类型 */
|
|
2008
|
+
mimeType: string;
|
|
2009
|
+
/** 文件大小 */
|
|
2010
|
+
size: number;
|
|
2011
|
+
/** MD5哈希 */
|
|
2012
|
+
md5Hash: string;
|
|
2013
|
+
/** SHA256哈希 */
|
|
2014
|
+
sha256Hash?: string;
|
|
2015
|
+
/** 存储路径 */
|
|
2016
|
+
storagePath: string;
|
|
2017
|
+
/** CDN访问URL */
|
|
2018
|
+
cdnUrl?: string;
|
|
2019
|
+
/** 所属文件夹ID */
|
|
2020
|
+
folderId?: string;
|
|
2021
|
+
/** 模块ID */
|
|
2022
|
+
moduleId?: string;
|
|
2023
|
+
/** 业务ID */
|
|
2024
|
+
businessId?: string;
|
|
2025
|
+
/** 文件标签 */
|
|
2026
|
+
tags?: string[];
|
|
2027
|
+
/** 文件元信息 */
|
|
2028
|
+
metadata?: Record<string, any>;
|
|
2029
|
+
/** 是否为临时文件 */
|
|
2030
|
+
isTemporary: boolean;
|
|
2031
|
+
/** 是否已删除 */
|
|
2032
|
+
isDeleted: boolean;
|
|
2033
|
+
/** 访问次数 */
|
|
2034
|
+
accessCount: number;
|
|
2035
|
+
/** 下载次数 */
|
|
2036
|
+
downloadCount: number;
|
|
2037
|
+
/** 上传者ID */
|
|
2038
|
+
uploaderId: string;
|
|
2039
|
+
/** 上传时间 */
|
|
2040
|
+
uploadTime: string;
|
|
2041
|
+
/** 最后访问时间 */
|
|
2042
|
+
lastAccessTime?: string;
|
|
2043
|
+
/** 过期时间 */
|
|
2044
|
+
expiresAt?: string;
|
|
2045
|
+
/** 创建时间 */
|
|
2046
|
+
createdAt: string;
|
|
2047
|
+
/** 更新时间 */
|
|
2048
|
+
updatedAt: string;
|
|
2049
|
+
}
|
|
2050
|
+
/**
|
|
2051
|
+
* 文件列表响应
|
|
2052
|
+
*/
|
|
2053
|
+
interface FileListResponse {
|
|
2054
|
+
/** 文件列表 */
|
|
2055
|
+
files: FileInfo[];
|
|
2056
|
+
/** 分页信息 */
|
|
2057
|
+
pagination: {
|
|
2058
|
+
/** 总记录数 */
|
|
2059
|
+
total: number;
|
|
2060
|
+
/** 当前页码 */
|
|
2061
|
+
page: number;
|
|
2062
|
+
/** 每页大小 */
|
|
2063
|
+
pageSize: number;
|
|
2064
|
+
/** 总页数 */
|
|
2065
|
+
totalPages: number;
|
|
2066
|
+
};
|
|
2067
|
+
}
|
|
2068
|
+
/**
|
|
2069
|
+
* 文件更新参数
|
|
2070
|
+
*/
|
|
2071
|
+
interface FileUpdateParams {
|
|
2072
|
+
/** 新的文件名 */
|
|
2073
|
+
originalName?: string;
|
|
2074
|
+
/** 文件夹ID */
|
|
2075
|
+
folderId?: string;
|
|
2076
|
+
/** 文件标签 */
|
|
2077
|
+
tags?: string[];
|
|
2078
|
+
/** 自定义元数据 */
|
|
2079
|
+
metadata?: Record<string, any>;
|
|
2080
|
+
/** 过期时间 */
|
|
2081
|
+
expiresAt?: string;
|
|
2082
|
+
}
|
|
2083
|
+
/**
|
|
2084
|
+
* 文件夹创建参数
|
|
2085
|
+
*/
|
|
2086
|
+
interface FolderCreateParams {
|
|
2087
|
+
/** 文件夹名称 */
|
|
2088
|
+
name: string;
|
|
2089
|
+
/** 父文件夹ID */
|
|
2090
|
+
parentId?: string;
|
|
2091
|
+
/** 模块ID */
|
|
2092
|
+
moduleId?: string;
|
|
2093
|
+
/** 业务ID */
|
|
2094
|
+
businessId?: string;
|
|
2095
|
+
/** 文件夹描述 */
|
|
2096
|
+
description?: string;
|
|
2097
|
+
/** 显示顺序 */
|
|
2098
|
+
sortOrder?: number;
|
|
2099
|
+
}
|
|
2100
|
+
/**
|
|
2101
|
+
* 文件夹信息响应
|
|
2102
|
+
*/
|
|
2103
|
+
interface FolderInfo {
|
|
2104
|
+
/** 文件夹ID */
|
|
2105
|
+
id: string;
|
|
2106
|
+
/** 文件夹名称 */
|
|
2107
|
+
name: string;
|
|
2108
|
+
/** 父文件夹ID */
|
|
2109
|
+
parentId?: string;
|
|
2110
|
+
/** 模块ID */
|
|
2111
|
+
moduleId?: string;
|
|
2112
|
+
/** 业务ID */
|
|
2113
|
+
businessId?: string;
|
|
2114
|
+
/** 文件夹路径 */
|
|
2115
|
+
path: string;
|
|
2116
|
+
/** 层级深度 */
|
|
2117
|
+
depth: number;
|
|
2118
|
+
/** 显示顺序 */
|
|
2119
|
+
sortOrder: number;
|
|
2120
|
+
/** 文件夹描述 */
|
|
2121
|
+
description?: string;
|
|
2122
|
+
/** 是否为系统文件夹 */
|
|
2123
|
+
isSystem: boolean;
|
|
2124
|
+
/** 创建者ID */
|
|
2125
|
+
createdBy: string;
|
|
2126
|
+
/** 创建时间 */
|
|
2127
|
+
createdAt: string;
|
|
2128
|
+
/** 更新时间 */
|
|
2129
|
+
updatedAt: string;
|
|
2130
|
+
/** 子文件夹列表 */
|
|
2131
|
+
children?: FolderInfo[];
|
|
2132
|
+
/** 文件数量 */
|
|
2133
|
+
fileCount?: number;
|
|
2134
|
+
}
|
|
2135
|
+
/**
|
|
2136
|
+
* 文件夹更新参数
|
|
2137
|
+
*/
|
|
2138
|
+
interface FolderUpdateParams {
|
|
2139
|
+
/** 文件夹名称 */
|
|
2140
|
+
name?: string;
|
|
2141
|
+
/** 父文件夹ID */
|
|
2142
|
+
parentId?: string;
|
|
2143
|
+
/** 文件夹描述 */
|
|
2144
|
+
description?: string;
|
|
2145
|
+
/** 显示顺序 */
|
|
2146
|
+
sortOrder?: number;
|
|
2147
|
+
}
|
|
2148
|
+
/**
|
|
2149
|
+
* 文件处理请求参数
|
|
2150
|
+
*/
|
|
2151
|
+
interface FileProcessParams {
|
|
2152
|
+
/** 处理类型 */
|
|
2153
|
+
type: 'compress' | 'resize' | 'convert' | 'thumbnail' | 'watermark';
|
|
2154
|
+
/** 处理参数 */
|
|
2155
|
+
parameters: Record<string, any>;
|
|
2156
|
+
/** 优先级 */
|
|
2157
|
+
priority?: number;
|
|
2158
|
+
}
|
|
2159
|
+
/**
|
|
2160
|
+
* 文件处理状态响应
|
|
2161
|
+
*/
|
|
2162
|
+
interface ProcessingStatus {
|
|
2163
|
+
/** 处理记录ID */
|
|
2164
|
+
id: string;
|
|
2165
|
+
/** 文件ID */
|
|
2166
|
+
fileId: string;
|
|
2167
|
+
/** 处理类型 */
|
|
2168
|
+
type: string;
|
|
2169
|
+
/** 处理状态 */
|
|
2170
|
+
status: 'pending' | 'processing' | 'completed' | 'failed';
|
|
2171
|
+
/** 处理进度 */
|
|
2172
|
+
progress?: number;
|
|
2173
|
+
/** 处理参数 */
|
|
2174
|
+
parameters?: Record<string, any>;
|
|
2175
|
+
/** 处理结果 */
|
|
2176
|
+
result?: Record<string, any>;
|
|
2177
|
+
/** 输出文件路径 */
|
|
2178
|
+
outputPath?: string;
|
|
2179
|
+
/** 错误信息 */
|
|
2180
|
+
errorMessage?: string;
|
|
2181
|
+
/** 开始时间 */
|
|
2182
|
+
startedAt?: string;
|
|
2183
|
+
/** 完成时间 */
|
|
2184
|
+
completedAt?: string;
|
|
2185
|
+
/** 创建时间 */
|
|
2186
|
+
createdAt: string;
|
|
2187
|
+
}
|
|
2188
|
+
/**
|
|
2189
|
+
* 文件分享创建参数
|
|
2190
|
+
*/
|
|
2191
|
+
interface ShareCreateParams {
|
|
2192
|
+
/** 分享的文件ID列表 */
|
|
2193
|
+
fileIds: string[];
|
|
2194
|
+
/** 分享标题 */
|
|
2195
|
+
title?: string;
|
|
2196
|
+
/** 分享描述 */
|
|
2197
|
+
description?: string;
|
|
2198
|
+
/** 访问密码 */
|
|
2199
|
+
password?: string;
|
|
2200
|
+
/** 访问权限 */
|
|
2201
|
+
permission?: 'view' | 'download';
|
|
2202
|
+
/** 最大下载次数 */
|
|
2203
|
+
maxDownloads?: number;
|
|
2204
|
+
/** 最大访问次数 */
|
|
2205
|
+
maxAccess?: number;
|
|
2206
|
+
/** 过期时间 */
|
|
2207
|
+
expiresAt?: string;
|
|
2208
|
+
}
|
|
2209
|
+
/**
|
|
2210
|
+
* 文件分享信息响应
|
|
2211
|
+
*/
|
|
2212
|
+
interface ShareInfo {
|
|
2213
|
+
/** 分享ID */
|
|
2214
|
+
id: string;
|
|
2215
|
+
/** 分享代码 */
|
|
2216
|
+
shareCode: string;
|
|
2217
|
+
/** 分享的文件ID列表 */
|
|
2218
|
+
fileIds: string[];
|
|
2219
|
+
/** 分享标题 */
|
|
2220
|
+
title?: string;
|
|
2221
|
+
/** 分享描述 */
|
|
2222
|
+
description?: string;
|
|
2223
|
+
/** 是否有密码保护 */
|
|
2224
|
+
hasPassword: boolean;
|
|
2225
|
+
/** 访问权限 */
|
|
2226
|
+
permission: 'view' | 'download';
|
|
2227
|
+
/** 最大下载次数 */
|
|
2228
|
+
maxDownloads?: number;
|
|
2229
|
+
/** 当前下载次数 */
|
|
2230
|
+
downloadCount: number;
|
|
2231
|
+
/** 最大访问次数 */
|
|
2232
|
+
maxAccess?: number;
|
|
2233
|
+
/** 当前访问次数 */
|
|
2234
|
+
accessCount: number;
|
|
2235
|
+
/** 是否启用 */
|
|
2236
|
+
isActive: boolean;
|
|
2237
|
+
/** 过期时间 */
|
|
2238
|
+
expiresAt?: string;
|
|
2239
|
+
/** 创建者ID */
|
|
2240
|
+
createdBy: string;
|
|
2241
|
+
/** 创建时间 */
|
|
2242
|
+
createdAt: string;
|
|
2243
|
+
/** 分享链接 */
|
|
2244
|
+
shareUrl: string;
|
|
2245
|
+
}
|
|
2246
|
+
/**
|
|
2247
|
+
* 分享访问验证参数
|
|
2248
|
+
*/
|
|
2249
|
+
interface ShareAccessParams {
|
|
2250
|
+
/** 分享代码 */
|
|
2251
|
+
shareCode: string;
|
|
2252
|
+
/** 访问密码 */
|
|
2253
|
+
password?: string;
|
|
2254
|
+
}
|
|
2255
|
+
/**
|
|
2256
|
+
* 文件统计信息响应
|
|
2257
|
+
*/
|
|
2258
|
+
interface FileStats {
|
|
2259
|
+
/** 总文件数 */
|
|
2260
|
+
totalFiles: number;
|
|
2261
|
+
/** 总文件大小 */
|
|
2262
|
+
totalSize: number;
|
|
2263
|
+
/** 按类型统计 */
|
|
2264
|
+
byType: Array<{
|
|
2265
|
+
/** MIME类型 */
|
|
2266
|
+
mimeType: string;
|
|
2267
|
+
/** 文件数量 */
|
|
2268
|
+
count: number;
|
|
2269
|
+
/** 总大小 */
|
|
2270
|
+
totalSize: number;
|
|
2271
|
+
}>;
|
|
2272
|
+
/** 按日期统计(最近30天) */
|
|
2273
|
+
byDate: Array<{
|
|
2274
|
+
/** 日期 */
|
|
2275
|
+
date: string;
|
|
2276
|
+
/** 上传数量 */
|
|
2277
|
+
count: number;
|
|
2278
|
+
/** 总大小 */
|
|
2279
|
+
totalSize: number;
|
|
2280
|
+
}>;
|
|
2281
|
+
/** 按模块统计 */
|
|
2282
|
+
byModule: Array<{
|
|
2283
|
+
/** 模块ID */
|
|
2284
|
+
moduleId: string;
|
|
2285
|
+
/** 文件数量 */
|
|
2286
|
+
count: number;
|
|
2287
|
+
/** 总大小 */
|
|
2288
|
+
totalSize: number;
|
|
2289
|
+
}>;
|
|
2290
|
+
}
|
|
2291
|
+
/**
|
|
2292
|
+
* API错误代码枚举
|
|
2293
|
+
*/
|
|
2294
|
+
declare enum ApiErrorCode {
|
|
2295
|
+
UNKNOWN_ERROR = "UNKNOWN_ERROR",
|
|
2296
|
+
VALIDATION_ERROR = "VALIDATION_ERROR",
|
|
2297
|
+
AUTHENTICATION_ERROR = "AUTHENTICATION_ERROR",
|
|
2298
|
+
AUTHORIZATION_ERROR = "AUTHORIZATION_ERROR",
|
|
2299
|
+
NOT_FOUND = "NOT_FOUND",
|
|
2300
|
+
CONFLICT = "CONFLICT",
|
|
2301
|
+
RATE_LIMIT_EXCEEDED = "RATE_LIMIT_EXCEEDED",
|
|
2302
|
+
FILE_NOT_FOUND = "FILE_NOT_FOUND",
|
|
2303
|
+
FILE_TOO_LARGE = "FILE_TOO_LARGE",
|
|
2304
|
+
FILE_TYPE_NOT_SUPPORTED = "FILE_TYPE_NOT_SUPPORTED",
|
|
2305
|
+
FILE_UPLOAD_FAILED = "FILE_UPLOAD_FAILED",
|
|
2306
|
+
FILE_PROCESSING_FAILED = "FILE_PROCESSING_FAILED",
|
|
2307
|
+
FILE_ALREADY_EXISTS = "FILE_ALREADY_EXISTS",
|
|
2308
|
+
FILE_CORRUPTED = "FILE_CORRUPTED",
|
|
2309
|
+
FOLDER_NOT_FOUND = "FOLDER_NOT_FOUND",
|
|
2310
|
+
FOLDER_NOT_EMPTY = "FOLDER_NOT_EMPTY",
|
|
2311
|
+
FOLDER_NAME_CONFLICT = "FOLDER_NAME_CONFLICT",
|
|
2312
|
+
FOLDER_DEPTH_EXCEEDED = "FOLDER_DEPTH_EXCEEDED",
|
|
2313
|
+
STORAGE_PROVIDER_ERROR = "STORAGE_PROVIDER_ERROR",
|
|
2314
|
+
STORAGE_QUOTA_EXCEEDED = "STORAGE_QUOTA_EXCEEDED",
|
|
2315
|
+
STORAGE_UNAVAILABLE = "STORAGE_UNAVAILABLE",
|
|
2316
|
+
SHARE_NOT_FOUND = "SHARE_NOT_FOUND",
|
|
2317
|
+
SHARE_EXPIRED = "SHARE_EXPIRED",
|
|
2318
|
+
SHARE_PASSWORD_INCORRECT = "SHARE_PASSWORD_INCORRECT",
|
|
2319
|
+
SHARE_ACCESS_DENIED = "SHARE_ACCESS_DENIED",
|
|
2320
|
+
SHARE_DOWNLOAD_LIMIT_EXCEEDED = "SHARE_DOWNLOAD_LIMIT_EXCEEDED"
|
|
2321
|
+
}
|
|
2322
|
+
/**
|
|
2323
|
+
* 错误消息映射
|
|
2324
|
+
*/
|
|
2325
|
+
declare const ErrorMessages: Record<ApiErrorCode, string>;
|
|
2326
|
+
/**
|
|
2327
|
+
* 错误代码到HTTP状态码的映射
|
|
2328
|
+
*/
|
|
2329
|
+
declare const ErrorHttpStatusMap: Record<ApiErrorCode, number>;
|
|
2330
|
+
|
|
2331
|
+
/**
|
|
2332
|
+
* API错误处理工具类
|
|
2333
|
+
* 提供标准化的错误处理和响应格式
|
|
2334
|
+
*/
|
|
2335
|
+
|
|
2336
|
+
/**
|
|
2337
|
+
* API错误类
|
|
2338
|
+
* 继承自Error,添加错误代码和详细信息
|
|
2339
|
+
*/
|
|
2340
|
+
declare class ApiError extends Error {
|
|
2341
|
+
readonly code: ApiErrorCode;
|
|
2342
|
+
readonly statusCode: number;
|
|
2343
|
+
readonly details?: any;
|
|
2344
|
+
constructor(code: ApiErrorCode, message?: string, details?: any, statusCode?: number);
|
|
2345
|
+
/**
|
|
2346
|
+
* 转换为API响应格式
|
|
2347
|
+
*/
|
|
2348
|
+
toApiResponse(): ApiResponse;
|
|
2349
|
+
/**
|
|
2350
|
+
* 转换为NextResponse
|
|
2351
|
+
*/
|
|
2352
|
+
toNextResponse(): NextResponse;
|
|
2353
|
+
}
|
|
2354
|
+
|
|
2355
|
+
/**
|
|
2356
|
+
* Drizzle ORM 文件元数据持久化适配器
|
|
2357
|
+
*
|
|
2358
|
+
* 提供基于 Drizzle ORM 的数据库持久化实现
|
|
2359
|
+
*/
|
|
2360
|
+
|
|
2361
|
+
/**
|
|
2362
|
+
* Drizzle 表定义类型(兼容多种 Drizzle 表结构)
|
|
2363
|
+
*/
|
|
2364
|
+
type DrizzleTable = any;
|
|
2365
|
+
/**
|
|
2366
|
+
* Drizzle 数据库连接类型
|
|
2367
|
+
*/
|
|
2368
|
+
type DrizzleDb = any;
|
|
2369
|
+
/**
|
|
2370
|
+
* 字段映射配置
|
|
2371
|
+
*
|
|
2372
|
+
* 将 FileMetadata 的字段映射到数据库表的列名
|
|
2373
|
+
*/
|
|
2374
|
+
interface FieldMapping {
|
|
2375
|
+
id?: string;
|
|
2376
|
+
filename?: string;
|
|
2377
|
+
originalName?: string;
|
|
2378
|
+
mimeType?: string;
|
|
2379
|
+
size?: string;
|
|
2380
|
+
hash?: string;
|
|
2381
|
+
storageType?: string;
|
|
2382
|
+
storagePath?: string;
|
|
2383
|
+
url?: string;
|
|
2384
|
+
cdnUrl?: string;
|
|
2385
|
+
moduleId?: string;
|
|
2386
|
+
businessId?: string;
|
|
2387
|
+
userId?: string;
|
|
2388
|
+
uploadedAt?: string;
|
|
2389
|
+
expiresAt?: string;
|
|
2390
|
+
metadata?: string;
|
|
2391
|
+
status?: string;
|
|
2392
|
+
processingStatus?: string;
|
|
2393
|
+
versions?: string;
|
|
2394
|
+
tags?: string;
|
|
2395
|
+
}
|
|
2396
|
+
/**
|
|
2397
|
+
* Drizzle 仓储配置
|
|
2398
|
+
*/
|
|
2399
|
+
interface DrizzleRepositoryConfig {
|
|
2400
|
+
/** Drizzle 数据库实例 */
|
|
2401
|
+
db: DrizzleDb;
|
|
2402
|
+
/** 文件元数据表 */
|
|
2403
|
+
table: DrizzleTable;
|
|
2404
|
+
/** 字段映射(如果数据库列名与 FileMetadata 字段不同) */
|
|
2405
|
+
fieldMapping?: FieldMapping;
|
|
2406
|
+
}
|
|
2407
|
+
/**
|
|
2408
|
+
* 创建 Drizzle ORM 文件仓储
|
|
2409
|
+
*
|
|
2410
|
+
* @example
|
|
2411
|
+
* ```typescript
|
|
2412
|
+
* import { createDrizzleRepository } from '@qhr123/sa2kit/universalFile/server';
|
|
2413
|
+
* import { db } from './db';
|
|
2414
|
+
* import { fileMetadata } from './schema';
|
|
2415
|
+
*
|
|
2416
|
+
* const repository = createDrizzleRepository({
|
|
2417
|
+
* db,
|
|
2418
|
+
* table: fileMetadata,
|
|
2419
|
+
* fieldMapping: {
|
|
2420
|
+
* // 如果列名与 FileMetadata 字段不同,可以在这里映射
|
|
2421
|
+
* originalName: 'original_filename',
|
|
2422
|
+
* }
|
|
2423
|
+
* });
|
|
2424
|
+
* ```
|
|
2425
|
+
*/
|
|
2426
|
+
declare function createDrizzleRepository(config: DrizzleRepositoryConfig): IFileMetadataRepository;
|
|
2427
|
+
|
|
2428
|
+
export { type AliyunCDNConfig, AliyunCDNProvider, type AliyunOSSConfig, AliyunOSSProvider, ApiError, ApiErrorCode, type ApiResponse, AudioProcessor, type CDNConfig, CDNProviderError, type CDNResult, type CDNStats, type CDNType, type CacheConfig, CacheManager, CacheStrategyType$1 as CacheStrategyType, CdnCacheStrategy, ConfigValidationError, type DrizzleDb, type DrizzleRepositoryConfig, type DrizzleTable, ErrorHttpStatusMap, ErrorMessages, type FieldMapping, type FileEvent, type FileEventListener, type FileEventType, type FileInfo, type FileListResponse, type FileProcessParams, FileProcessingError, type FileQueryOptions, type FileQueryParams, type FileRecord, FileServiceError, type FileServicePersistenceConfig, type FileStats, type FileUpdateParams, FileUploadError, type FileUploadParams, type FolderCreateParams, type FolderInfo, type FolderUpdateParams, type ICDNProvider, type IFileMetadataRepository, type IFileProcessor, type IStorageProvider, ImageProcessor, type LocalStorageConfig, LocalStorageProvider, type PaginatedResult, type PaginationParams, PerformanceMonitor, type ProcessingOptions, ProcessingQueue, type ProcessingResult, type ProcessingStatus, type ProcessorInfo, type ProcessorType, type ShareAccessParams, type ShareCreateParams, type ShareInfo, type StorageConfig, type StorageMetadata, StorageProviderError, type StorageResult, type StorageType, UniversalFileService, type UniversalFileServiceConfig, type UploadFileInfo, type UploadResponse, VideoProcessor, cdnCacheStrategy, createAliyunOSSPreset, createDocumentServicePreset, createDrizzleRepository, createFileServiceConfig, createFileServiceFromEnv, createImageServicePreset, createLocalDevPreset, createSmartPreset, createUniversalFileService, createVideoServicePreset, getMimeType, getRequiredEnvVars, validateEnvironment, validateServiceConfig, validateStorageConfig };
|