sa2kit 1.0.0 → 1.0.2
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/UniversalFileService-CEZRJ87g.d.mts +727 -0
- package/dist/UniversalFileService-CEZRJ87g.d.ts +727 -0
- package/dist/api/index.d.mts +248 -0
- package/dist/api/index.d.ts +248 -0
- package/dist/api/index.js +294 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/index.mjs +290 -0
- package/dist/api/index.mjs.map +1 -0
- package/dist/auth/client/index.d.mts +52 -3
- package/dist/auth/client/index.d.ts +52 -3
- package/dist/auth/components/index.d.mts +149 -4
- package/dist/auth/components/index.d.ts +149 -4
- package/dist/auth/components/index.js +243 -9
- package/dist/auth/components/index.js.map +1 -1
- package/dist/auth/components/index.mjs +237 -4
- package/dist/auth/components/index.mjs.map +1 -1
- package/dist/auth/hooks/index.d.mts +31 -2
- package/dist/auth/hooks/index.d.ts +31 -2
- package/dist/auth/index.d.mts +5 -5
- package/dist/auth/index.d.ts +5 -5
- package/dist/auth/index.js +49 -17
- package/dist/auth/index.mjs +1 -1
- package/dist/auth/routes/index.d.mts +103 -5
- package/dist/auth/routes/index.d.ts +103 -5
- package/dist/auth/routes/index.js +37 -5
- package/dist/auth/routes/index.mjs +1 -1
- package/dist/chunk-42IJ7HEI.js +573 -0
- package/dist/chunk-42IJ7HEI.js.map +1 -0
- package/dist/chunk-7XLFSPDG.mjs +31 -0
- package/dist/chunk-7XLFSPDG.mjs.map +1 -0
- package/dist/chunk-GCVOKQZP.js +36 -0
- package/dist/chunk-GCVOKQZP.js.map +1 -0
- package/dist/chunk-IBLB7ARJ.mjs +560 -0
- package/dist/chunk-IBLB7ARJ.mjs.map +1 -0
- package/dist/{chunk-6FNUWAIV.js → chunk-LX4XX6W7.js} +54 -8
- package/dist/chunk-LX4XX6W7.js.map +1 -0
- package/dist/{chunk-HXFFYNIF.mjs → chunk-T5OZHYVM.mjs} +54 -8
- package/dist/chunk-T5OZHYVM.mjs.map +1 -0
- package/dist/config/server/index.d.mts +1533 -0
- package/dist/config/server/index.d.ts +1533 -0
- package/dist/config/server/index.js +1177 -0
- package/dist/config/server/index.js.map +1 -0
- package/dist/config/server/index.mjs +1138 -0
- package/dist/config/server/index.mjs.map +1 -0
- package/dist/i18n/index.d.mts +2 -1
- package/dist/i18n/index.d.ts +2 -1
- package/dist/i18n/index.js +125 -61
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/index.mjs +126 -62
- package/dist/i18n/index.mjs.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.mjs +1 -1
- package/dist/mmd/index.d.mts +346 -0
- package/dist/mmd/index.d.ts +346 -0
- package/dist/mmd/index.js +1535 -0
- package/dist/mmd/index.js.map +1 -0
- package/dist/mmd/index.mjs +1503 -0
- package/dist/mmd/index.mjs.map +1 -0
- package/dist/storage/index.d.mts +1 -0
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.js +9 -9
- package/dist/storage/index.mjs +1 -1
- package/dist/{index-8VoHap_4.d.mts → types-CroexXnI.d.ts} +38 -44
- package/dist/{index-8VoHap_4.d.ts → types-DmsXCWvm.d.mts} +38 -44
- package/dist/{types-DAxQ1MeY.d.ts → types-Dt0oqeFM.d.mts} +1 -1
- package/dist/{types-DT8LVCvE.d.mts → types-zK6kDzDQ.d.ts} +1 -1
- package/dist/universalExport/index.js +17 -32
- package/dist/universalExport/index.js.map +1 -1
- package/dist/universalExport/index.mjs +2 -29
- package/dist/universalExport/index.mjs.map +1 -1
- package/dist/universalExport/server/index.d.mts +849 -8
- package/dist/universalExport/server/index.d.ts +849 -8
- package/dist/universalExport/server/index.js +1382 -2
- package/dist/universalExport/server/index.js.map +1 -1
- package/dist/universalExport/server/index.mjs +1355 -3
- package/dist/universalExport/server/index.mjs.map +1 -1
- package/dist/universalFile/index.d.mts +54 -3
- package/dist/universalFile/index.d.ts +54 -3
- package/dist/universalFile/index.js +272 -0
- package/dist/universalFile/index.js.map +1 -1
- package/dist/universalFile/index.mjs +267 -1
- package/dist/universalFile/index.mjs.map +1 -1
- package/dist/universalFile/server/index.d.mts +2541 -469
- package/dist/universalFile/server/index.d.ts +2541 -469
- package/dist/universalFile/server/index.js +830 -64
- package/dist/universalFile/server/index.js.map +1 -1
- package/dist/universalFile/server/index.mjs +803 -66
- package/dist/universalFile/server/index.mjs.map +1 -1
- package/package.json +47 -23
- package/dist/chunk-6FNUWAIV.js.map +0 -1
- package/dist/chunk-APY57REU.js +0 -300
- package/dist/chunk-APY57REU.js.map +0 -1
- package/dist/chunk-C64RY2OW.mjs +0 -295
- package/dist/chunk-C64RY2OW.mjs.map +0 -1
- package/dist/chunk-HXFFYNIF.mjs.map +0 -1
- package/dist/types-CoGG1rNV.d.mts +0 -258
- package/dist/types-CoGG1rNV.d.ts +0 -258
- package/dist/types-DW9qar-w.d.mts +0 -52
- package/dist/types-DW9qar-w.d.ts +0 -52
|
@@ -0,0 +1,727 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 通用文件服务类型定义
|
|
5
|
+
*
|
|
6
|
+
* 定义了文件存储、上传、下载等核心接口和类型
|
|
7
|
+
*/
|
|
8
|
+
/** 文件存储类型 */
|
|
9
|
+
type StorageType$1 = 'local' | 'aliyun-oss' | 'aws-s3' | 'qcloud-cos';
|
|
10
|
+
/** CDN提供者类型 */
|
|
11
|
+
type CDNType$1 = 'none' | 'aliyun-cdn' | 'aws-cloudfront' | 'qcloud-cdn';
|
|
12
|
+
/** 文件处理类型 */
|
|
13
|
+
type ProcessorType$1 = 'image' | 'audio' | 'video' | 'document';
|
|
14
|
+
/** 文件上传状态 */
|
|
15
|
+
type UploadStatus = 'pending' | 'uploading' | 'processing' | 'completed' | 'failed';
|
|
16
|
+
/** 访问权限类型 */
|
|
17
|
+
type AccessPermission = 'public' | 'private' | 'authenticated' | 'owner-only';
|
|
18
|
+
/** 文件元数据基础接口 */
|
|
19
|
+
interface FileMetadata {
|
|
20
|
+
/** 文件ID */
|
|
21
|
+
id: string;
|
|
22
|
+
/** 原始文件名 */
|
|
23
|
+
originalName: string;
|
|
24
|
+
/** 存储文件名 */
|
|
25
|
+
storageName: string;
|
|
26
|
+
/** 文件大小(字节) */
|
|
27
|
+
size: number;
|
|
28
|
+
/** MIME类型 */
|
|
29
|
+
mimeType: string;
|
|
30
|
+
/** 文件扩展名 */
|
|
31
|
+
extension: string;
|
|
32
|
+
/** 文件哈希值 */
|
|
33
|
+
hash?: string;
|
|
34
|
+
/** 上传时间 */
|
|
35
|
+
uploadTime: Date;
|
|
36
|
+
/** 访问权限 */
|
|
37
|
+
permission: AccessPermission;
|
|
38
|
+
/** 上传者ID */
|
|
39
|
+
uploaderId: string;
|
|
40
|
+
/** 模块标识 */
|
|
41
|
+
moduleId: string;
|
|
42
|
+
/** 业务标识 */
|
|
43
|
+
businessId?: string;
|
|
44
|
+
/** 存储提供者 */
|
|
45
|
+
storageProvider: StorageType$1;
|
|
46
|
+
/** 存储路径 */
|
|
47
|
+
storagePath: string;
|
|
48
|
+
/** CDN URL */
|
|
49
|
+
cdnUrl?: string;
|
|
50
|
+
/** 访问次数 */
|
|
51
|
+
accessCount: number;
|
|
52
|
+
/** 最后访问时间 */
|
|
53
|
+
lastAccessTime?: Date;
|
|
54
|
+
/** 过期时间 */
|
|
55
|
+
expiresAt?: Date;
|
|
56
|
+
/** 自定义元数据 */
|
|
57
|
+
metadata?: Record<string, any>;
|
|
58
|
+
}
|
|
59
|
+
/** 上传文件信息(客户端使用) */
|
|
60
|
+
interface UploadFileInfo$1 {
|
|
61
|
+
/** 文件对象 */
|
|
62
|
+
file: File;
|
|
63
|
+
/** 模块标识 */
|
|
64
|
+
moduleId: string;
|
|
65
|
+
/** 业务标识 */
|
|
66
|
+
businessId?: string;
|
|
67
|
+
/** 访问权限 */
|
|
68
|
+
permission?: AccessPermission;
|
|
69
|
+
/** 自定义存储路径 */
|
|
70
|
+
customPath?: string;
|
|
71
|
+
/** 自定义元数据 */
|
|
72
|
+
metadata?: Record<string, any>;
|
|
73
|
+
/** 是否需要处理 */
|
|
74
|
+
needsProcessing?: boolean;
|
|
75
|
+
/** 处理选项 */
|
|
76
|
+
processingOptions?: ProcessingOptions$1;
|
|
77
|
+
}
|
|
78
|
+
/** 文件处理选项基础接口 */
|
|
79
|
+
interface ProcessingOptions$1 {
|
|
80
|
+
/** 处理器类型 */
|
|
81
|
+
type: ProcessorType$1;
|
|
82
|
+
/** 处理参数 */
|
|
83
|
+
params?: Record<string, any>;
|
|
84
|
+
}
|
|
85
|
+
/** 图片处理选项 */
|
|
86
|
+
interface ImageProcessingOptions extends ProcessingOptions$1 {
|
|
87
|
+
type: 'image';
|
|
88
|
+
/** 压缩质量 0-100 */
|
|
89
|
+
quality?: number;
|
|
90
|
+
/** 目标宽度 */
|
|
91
|
+
width?: number;
|
|
92
|
+
/** 目标高度 */
|
|
93
|
+
height?: number;
|
|
94
|
+
/** 格式转换 */
|
|
95
|
+
format?: 'jpeg' | 'png' | 'webp' | 'avif';
|
|
96
|
+
/** 是否添加水印 */
|
|
97
|
+
watermark?: boolean;
|
|
98
|
+
/** 水印配置 */
|
|
99
|
+
watermarkOptions?: {
|
|
100
|
+
text?: string;
|
|
101
|
+
image?: string;
|
|
102
|
+
position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'center';
|
|
103
|
+
opacity?: number;
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/** 音频处理选项 */
|
|
107
|
+
interface AudioProcessingOptions extends ProcessingOptions$1 {
|
|
108
|
+
type: 'audio';
|
|
109
|
+
/** 比特率 */
|
|
110
|
+
bitrate?: number;
|
|
111
|
+
/** 格式转换 */
|
|
112
|
+
format?: 'mp3' | 'wav' | 'ogg' | 'aac';
|
|
113
|
+
/** 采样率 */
|
|
114
|
+
sampleRate?: number;
|
|
115
|
+
/** 声道数 */
|
|
116
|
+
channels?: number;
|
|
117
|
+
}
|
|
118
|
+
/** 视频处理选项 */
|
|
119
|
+
interface VideoProcessingOptions extends ProcessingOptions$1 {
|
|
120
|
+
type: 'video';
|
|
121
|
+
/** 视频质量 */
|
|
122
|
+
quality?: number;
|
|
123
|
+
/** 格式转换 */
|
|
124
|
+
format?: 'mp4' | 'avi' | 'mov' | 'webm';
|
|
125
|
+
/** 生成缩略图 */
|
|
126
|
+
generateThumbnail?: boolean;
|
|
127
|
+
/** 缩略图时间点(秒) */
|
|
128
|
+
thumbnailTime?: number;
|
|
129
|
+
}
|
|
130
|
+
/** 上传进度 */
|
|
131
|
+
interface UploadProgress {
|
|
132
|
+
/** 文件ID */
|
|
133
|
+
fileId: string;
|
|
134
|
+
/** 上传状态 */
|
|
135
|
+
status: UploadStatus;
|
|
136
|
+
/** 进度百分比(0-100) */
|
|
137
|
+
progress: number;
|
|
138
|
+
/** 已上传字节数 */
|
|
139
|
+
uploadedBytes: number;
|
|
140
|
+
/** 总字节数 */
|
|
141
|
+
totalBytes: number;
|
|
142
|
+
/** 上传速度(字节/秒) */
|
|
143
|
+
speed: number;
|
|
144
|
+
/** 剩余时间(秒) */
|
|
145
|
+
remainingTime: number;
|
|
146
|
+
/** 错误信息 */
|
|
147
|
+
error?: string;
|
|
148
|
+
}
|
|
149
|
+
/** 上传结果 */
|
|
150
|
+
interface UploadResult {
|
|
151
|
+
/** 是否成功 */
|
|
152
|
+
success: boolean;
|
|
153
|
+
/** 文件元数据 */
|
|
154
|
+
file?: FileMetadata;
|
|
155
|
+
/** 文件访问URL */
|
|
156
|
+
url?: string;
|
|
157
|
+
/** 错误信息 */
|
|
158
|
+
error?: string;
|
|
159
|
+
}
|
|
160
|
+
/** 文件查询选项 */
|
|
161
|
+
interface FileQueryOptions$1 {
|
|
162
|
+
/** 模块标识 */
|
|
163
|
+
moduleId?: string;
|
|
164
|
+
/** 业务标识 */
|
|
165
|
+
businessId?: string;
|
|
166
|
+
/** 上传者ID */
|
|
167
|
+
uploaderId?: string;
|
|
168
|
+
/** MIME类型过滤 */
|
|
169
|
+
mimeType?: string;
|
|
170
|
+
/** 最小文件大小 */
|
|
171
|
+
minSize?: number;
|
|
172
|
+
/** 最大文件大小 */
|
|
173
|
+
maxSize?: number;
|
|
174
|
+
/** 开始时间 */
|
|
175
|
+
startTime?: Date;
|
|
176
|
+
/** 结束时间 */
|
|
177
|
+
endTime?: Date;
|
|
178
|
+
/** 搜索关键词 */
|
|
179
|
+
keyword?: string;
|
|
180
|
+
/** 标签 */
|
|
181
|
+
tags?: string[];
|
|
182
|
+
/** 排序字段 */
|
|
183
|
+
sortBy?: string;
|
|
184
|
+
/** 排序方向 */
|
|
185
|
+
sortOrder?: 'asc' | 'desc';
|
|
186
|
+
/** 页码 */
|
|
187
|
+
page?: number;
|
|
188
|
+
/** 每页数量 */
|
|
189
|
+
pageSize?: number;
|
|
190
|
+
}
|
|
191
|
+
/** 分页结果 */
|
|
192
|
+
interface PaginatedResult$1<T> {
|
|
193
|
+
/** 数据项 */
|
|
194
|
+
items: T[];
|
|
195
|
+
/** 总数 */
|
|
196
|
+
total: number;
|
|
197
|
+
/** 当前页码 */
|
|
198
|
+
page: number;
|
|
199
|
+
/** 每页数量 */
|
|
200
|
+
pageSize: number;
|
|
201
|
+
/** 总页数 */
|
|
202
|
+
totalPages: number;
|
|
203
|
+
/** 是否有下一页 */
|
|
204
|
+
hasNext: boolean;
|
|
205
|
+
/** 是否有上一页 */
|
|
206
|
+
hasPrev: boolean;
|
|
207
|
+
}
|
|
208
|
+
/** 批量操作结果 */
|
|
209
|
+
interface BatchOperationResult {
|
|
210
|
+
/** 成功数量 */
|
|
211
|
+
successCount: number;
|
|
212
|
+
/** 失败数量 */
|
|
213
|
+
failureCount: number;
|
|
214
|
+
/** 失败详情 */
|
|
215
|
+
failures: Array<{
|
|
216
|
+
fileId: string;
|
|
217
|
+
error: string;
|
|
218
|
+
}>;
|
|
219
|
+
}
|
|
220
|
+
/** 文件事件类型 */
|
|
221
|
+
type FileEventType$1 = 'upload:start' | 'upload:progress' | 'upload:complete' | 'upload:error' | 'download:start' | 'download:complete' | 'download:error' | 'delete:complete' | 'processing:start' | 'processing:complete' | 'processing:error';
|
|
222
|
+
/** 文件事件 */
|
|
223
|
+
interface FileEvent$1 {
|
|
224
|
+
/** 事件类型 */
|
|
225
|
+
type: FileEventType$1;
|
|
226
|
+
/** 文件ID */
|
|
227
|
+
fileId: string;
|
|
228
|
+
/** 事件时间 */
|
|
229
|
+
timestamp: Date;
|
|
230
|
+
/** 事件数据 */
|
|
231
|
+
data?: Record<string, any>;
|
|
232
|
+
/** 错误信息 */
|
|
233
|
+
error?: string;
|
|
234
|
+
}
|
|
235
|
+
/** 文件事件监听器 */
|
|
236
|
+
type FileEventListener$1 = (event: FileEvent$1) => void | Promise<void>;
|
|
237
|
+
/** 文件服务基础异常 */
|
|
238
|
+
declare class FileServiceError$1 extends Error {
|
|
239
|
+
readonly code: string;
|
|
240
|
+
readonly details?: Record<string, any> | undefined;
|
|
241
|
+
constructor(message: string, code: string, details?: Record<string, any> | undefined);
|
|
242
|
+
}
|
|
243
|
+
/** 文件上传错误 */
|
|
244
|
+
declare class FileUploadError$1 extends FileServiceError$1 {
|
|
245
|
+
constructor(message: string, details?: Record<string, any>);
|
|
246
|
+
}
|
|
247
|
+
/** 文件处理错误 */
|
|
248
|
+
declare class FileProcessingError$1 extends FileServiceError$1 {
|
|
249
|
+
constructor(message: string, details?: Record<string, any>);
|
|
250
|
+
}
|
|
251
|
+
/** 存储提供者错误 */
|
|
252
|
+
declare class StorageProviderError$1 extends FileServiceError$1 {
|
|
253
|
+
constructor(message: string, details?: Record<string, any>);
|
|
254
|
+
}
|
|
255
|
+
/** CDN提供者错误 */
|
|
256
|
+
declare class CDNProviderError$1 extends FileServiceError$1 {
|
|
257
|
+
constructor(message: string, details?: Record<string, any>);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* UniversalFile Server 端类型定义
|
|
262
|
+
*/
|
|
263
|
+
|
|
264
|
+
type StorageType = StorageType$1;
|
|
265
|
+
type CDNType = CDNType$1;
|
|
266
|
+
type ProcessorType = ProcessorType$1;
|
|
267
|
+
type UploadFileInfo = UploadFileInfo$1;
|
|
268
|
+
type ProcessingOptions = ProcessingOptions$1;
|
|
269
|
+
/** 存储提供者接口 */
|
|
270
|
+
interface IStorageProvider {
|
|
271
|
+
/** 提供者类型 */
|
|
272
|
+
readonly type: StorageType;
|
|
273
|
+
/** 初始化 */
|
|
274
|
+
initialize(config: StorageConfig): Promise<void>;
|
|
275
|
+
/** 上传文件 */
|
|
276
|
+
upload(fileInfo: UploadFileInfo, path: string): Promise<StorageResult>;
|
|
277
|
+
/** 下载文件 */
|
|
278
|
+
download(path: string): Promise<Buffer>;
|
|
279
|
+
/** 删除文件 */
|
|
280
|
+
delete(path: string): Promise<StorageResult>;
|
|
281
|
+
/** 获取文件信息 */
|
|
282
|
+
getFileInfo(path: string): Promise<StorageResult>;
|
|
283
|
+
/** 生成访问URL */
|
|
284
|
+
getAccessUrl(path: string, expiresIn?: number): Promise<string>;
|
|
285
|
+
/** 生成预签名上传URL */
|
|
286
|
+
getUploadUrl(path: string, expiresIn?: number): Promise<string>;
|
|
287
|
+
/** 检查文件是否存在 */
|
|
288
|
+
exists(path: string): Promise<boolean>;
|
|
289
|
+
/** 列出文件 */
|
|
290
|
+
list(prefix: string, maxKeys?: number): Promise<string[]>;
|
|
291
|
+
}
|
|
292
|
+
/** CDN 提供者接口 */
|
|
293
|
+
interface ICDNProvider {
|
|
294
|
+
/** 提供者类型 */
|
|
295
|
+
readonly type: CDNType;
|
|
296
|
+
/** 初始化 */
|
|
297
|
+
initialize(config: CDNConfig): Promise<void>;
|
|
298
|
+
/** 生成CDN URL */
|
|
299
|
+
generateUrl(originalUrl: string): Promise<string>;
|
|
300
|
+
/** 刷新缓存 */
|
|
301
|
+
refreshCache(urls: string[]): Promise<CDNResult>;
|
|
302
|
+
/** 预热缓存 */
|
|
303
|
+
preheatCache(urls: string[]): Promise<CDNResult>;
|
|
304
|
+
/** 获取访问统计 */
|
|
305
|
+
getAccessStats(startTime: Date, endTime: Date): Promise<CDNResult>;
|
|
306
|
+
}
|
|
307
|
+
/** 文件处理器接口 */
|
|
308
|
+
interface IFileProcessor {
|
|
309
|
+
/** 处理器类型 */
|
|
310
|
+
readonly type: ProcessorType;
|
|
311
|
+
/** 初始化 */
|
|
312
|
+
initialize(): Promise<void>;
|
|
313
|
+
/** 处理文件 */
|
|
314
|
+
process(inputPath: string, outputPath: string, options: ProcessingOptions): Promise<ProcessingResult>;
|
|
315
|
+
/** 检查文件是否支持处理 */
|
|
316
|
+
supports(mimeType: string): boolean;
|
|
317
|
+
/** 获取文件信息 */
|
|
318
|
+
getFileInfo(filePath: string): Promise<Record<string, any>>;
|
|
319
|
+
}
|
|
320
|
+
/** 存储配置基础接口 */
|
|
321
|
+
interface StorageConfig {
|
|
322
|
+
/** 存储类型 */
|
|
323
|
+
type: StorageType;
|
|
324
|
+
/** 是否启用 */
|
|
325
|
+
enabled: boolean;
|
|
326
|
+
}
|
|
327
|
+
/** 本地存储配置 */
|
|
328
|
+
interface LocalStorageConfig extends StorageConfig {
|
|
329
|
+
type: 'local';
|
|
330
|
+
/** 存储根目录 */
|
|
331
|
+
rootPath: string;
|
|
332
|
+
/** 基础URL */
|
|
333
|
+
baseUrl: string;
|
|
334
|
+
}
|
|
335
|
+
/** 阿里云 OSS 配置 */
|
|
336
|
+
interface AliyunOSSConfig extends StorageConfig {
|
|
337
|
+
type: 'aliyun-oss';
|
|
338
|
+
/** 地域 */
|
|
339
|
+
region: string;
|
|
340
|
+
/** 存储桶名称 */
|
|
341
|
+
bucket: string;
|
|
342
|
+
/** 访问密钥ID */
|
|
343
|
+
accessKeyId: string;
|
|
344
|
+
/** 访问密钥密码 */
|
|
345
|
+
accessKeySecret: string;
|
|
346
|
+
/** 自定义域名 */
|
|
347
|
+
customDomain?: string;
|
|
348
|
+
/** 是否使用HTTPS */
|
|
349
|
+
secure?: boolean;
|
|
350
|
+
/** 是否使用内网访问 */
|
|
351
|
+
internal?: boolean;
|
|
352
|
+
}
|
|
353
|
+
/** CDN配置基础接口 */
|
|
354
|
+
interface CDNConfig {
|
|
355
|
+
/** CDN类型 */
|
|
356
|
+
type: CDNType;
|
|
357
|
+
/** 是否启用 */
|
|
358
|
+
enabled: boolean;
|
|
359
|
+
}
|
|
360
|
+
/** 阿里云 CDN 配置 */
|
|
361
|
+
interface AliyunCDNConfig extends CDNConfig {
|
|
362
|
+
type: 'aliyun-cdn';
|
|
363
|
+
/** CDN域名 */
|
|
364
|
+
domain: string;
|
|
365
|
+
/** 访问密钥ID */
|
|
366
|
+
accessKeyId: string;
|
|
367
|
+
/** 访问密钥密码 */
|
|
368
|
+
accessKeySecret: string;
|
|
369
|
+
/** 地域 */
|
|
370
|
+
region?: string;
|
|
371
|
+
}
|
|
372
|
+
/** 缓存配置 */
|
|
373
|
+
interface CacheConfig {
|
|
374
|
+
/** 是否启用缓存 */
|
|
375
|
+
enabled: boolean;
|
|
376
|
+
/** 最大缓存大小 */
|
|
377
|
+
maxSize?: number;
|
|
378
|
+
/** 缓存 TTL(秒) */
|
|
379
|
+
ttl?: number;
|
|
380
|
+
/** 是否使用 Redis */
|
|
381
|
+
useRedis?: boolean;
|
|
382
|
+
/** Redis 配置 */
|
|
383
|
+
redisConfig?: {
|
|
384
|
+
host: string;
|
|
385
|
+
port: number;
|
|
386
|
+
password?: string;
|
|
387
|
+
db?: number;
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
/** 文件服务配置 */
|
|
391
|
+
/** 缓存配置扩展 */
|
|
392
|
+
interface CacheConfig {
|
|
393
|
+
/** 是否启用缓存 */
|
|
394
|
+
enabled: boolean;
|
|
395
|
+
/** 元数据缓存TTL(秒) */
|
|
396
|
+
metadataTTL?: number;
|
|
397
|
+
/** URL缓存TTL(秒) */
|
|
398
|
+
urlTTL?: number;
|
|
399
|
+
/** 最大缓存条目数 */
|
|
400
|
+
maxSize?: number;
|
|
401
|
+
}
|
|
402
|
+
interface UniversalFileServiceConfig {
|
|
403
|
+
/** 存储配置 */
|
|
404
|
+
storage: StorageConfig;
|
|
405
|
+
/** CDN 配置(可选) */
|
|
406
|
+
cdn?: CDNConfig;
|
|
407
|
+
/** 缓存配置(可选) */
|
|
408
|
+
cache?: CacheConfig;
|
|
409
|
+
/** 数据库持久化配置(可选) */
|
|
410
|
+
persistence?: FileServicePersistenceConfig;
|
|
411
|
+
/** 启用的处理器 */
|
|
412
|
+
processors?: ProcessorType[];
|
|
413
|
+
/** 数据库连接(可选) @deprecated 使用 persistence.repository 代替 */
|
|
414
|
+
db?: any;
|
|
415
|
+
/** 最大文件大小(字节) */
|
|
416
|
+
maxFileSize?: number;
|
|
417
|
+
/** 允许的文件类型 */
|
|
418
|
+
allowedMimeTypes?: string[];
|
|
419
|
+
/** 是否启用监控 */
|
|
420
|
+
enableMonitoring?: boolean;
|
|
421
|
+
/** 存储提供者映射(内部使用) */
|
|
422
|
+
storageProviders?: Map<StorageType, IStorageProvider>;
|
|
423
|
+
/** 默认存储类型 */
|
|
424
|
+
defaultStorage?: StorageType;
|
|
425
|
+
/** 默认CDN类型 */
|
|
426
|
+
defaultCDN?: CDNType;
|
|
427
|
+
}
|
|
428
|
+
/** 存储结果 */
|
|
429
|
+
/** 存储操作结果 */
|
|
430
|
+
interface StorageResult {
|
|
431
|
+
/** 是否成功 */
|
|
432
|
+
success: boolean;
|
|
433
|
+
/** 存储路径 */
|
|
434
|
+
path?: string;
|
|
435
|
+
/** 访问URL */
|
|
436
|
+
url?: string;
|
|
437
|
+
/** 文件大小 */
|
|
438
|
+
size?: number;
|
|
439
|
+
/** 错误信息 */
|
|
440
|
+
error?: string;
|
|
441
|
+
/** 额外数据 */
|
|
442
|
+
data?: Record<string, any>;
|
|
443
|
+
}
|
|
444
|
+
/** 存储元数据 */
|
|
445
|
+
interface StorageMetadata {
|
|
446
|
+
/** 文件大小 */
|
|
447
|
+
size: number;
|
|
448
|
+
/** MIME 类型 */
|
|
449
|
+
mimeType: string;
|
|
450
|
+
/** 最后修改时间 */
|
|
451
|
+
lastModified: Date;
|
|
452
|
+
/** 自定义元数据 */
|
|
453
|
+
metadata?: Record<string, any>;
|
|
454
|
+
}
|
|
455
|
+
/** CDN 结果 */
|
|
456
|
+
/** CDN操作结果 */
|
|
457
|
+
interface CDNResult {
|
|
458
|
+
/** 是否成功 */
|
|
459
|
+
success: boolean;
|
|
460
|
+
/** CDN URL */
|
|
461
|
+
url?: string;
|
|
462
|
+
/** 错误信息 */
|
|
463
|
+
error?: string;
|
|
464
|
+
/** 额外数据 */
|
|
465
|
+
data?: Record<string, any>;
|
|
466
|
+
}
|
|
467
|
+
/** CDN 统计信息 */
|
|
468
|
+
interface CDNStats {
|
|
469
|
+
/** 带宽(字节/秒) */
|
|
470
|
+
bandwidth: number;
|
|
471
|
+
/** 请求数 */
|
|
472
|
+
requests: number;
|
|
473
|
+
/** 流量(字节) */
|
|
474
|
+
traffic: number;
|
|
475
|
+
/** 统计时间范围 */
|
|
476
|
+
timeRange: {
|
|
477
|
+
start: Date;
|
|
478
|
+
end: Date;
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
/** 处理结果 */
|
|
482
|
+
interface ProcessingResult {
|
|
483
|
+
/** 是否成功 */
|
|
484
|
+
success: boolean;
|
|
485
|
+
/** 处理后的文件路径 */
|
|
486
|
+
processedPath?: string;
|
|
487
|
+
/** 处理后的文件大小 */
|
|
488
|
+
processedSize?: number;
|
|
489
|
+
/** 缩略图路径 */
|
|
490
|
+
thumbnailPath?: string;
|
|
491
|
+
/** 错误信息 */
|
|
492
|
+
error?: string;
|
|
493
|
+
/** 处理耗时(毫秒) */
|
|
494
|
+
processingTime?: number;
|
|
495
|
+
/** 额外数据 */
|
|
496
|
+
data?: Record<string, any>;
|
|
497
|
+
}
|
|
498
|
+
/** 处理器信息 */
|
|
499
|
+
interface ProcessorInfo {
|
|
500
|
+
/** 处理器名称 */
|
|
501
|
+
name: string;
|
|
502
|
+
/** 处理器版本 */
|
|
503
|
+
version: string;
|
|
504
|
+
/** 支持的格式 */
|
|
505
|
+
supportedFormats: string[];
|
|
506
|
+
/** 支持的操作 */
|
|
507
|
+
supportedOperations: string[];
|
|
508
|
+
}
|
|
509
|
+
/** 文件数据库记录 */
|
|
510
|
+
interface FileRecord extends FileMetadata {
|
|
511
|
+
/** 创建时间 */
|
|
512
|
+
createdAt: Date | string;
|
|
513
|
+
/** 更新时间 */
|
|
514
|
+
updatedAt: Date | string;
|
|
515
|
+
}
|
|
516
|
+
/** 文件查询选项 */
|
|
517
|
+
interface FileQueryOptions {
|
|
518
|
+
/** 模块 ID */
|
|
519
|
+
moduleId?: string;
|
|
520
|
+
/** 业务 ID */
|
|
521
|
+
businessId?: string;
|
|
522
|
+
/** 上传者 ID */
|
|
523
|
+
uploaderId?: string;
|
|
524
|
+
/** 文件类型 */
|
|
525
|
+
mimeType?: string;
|
|
526
|
+
/** 访问权限 */
|
|
527
|
+
permission?: AccessPermission;
|
|
528
|
+
/** 状态 */
|
|
529
|
+
status?: UploadStatus;
|
|
530
|
+
/** 分页 */
|
|
531
|
+
page?: number;
|
|
532
|
+
pageSize?: number;
|
|
533
|
+
/** 排序 */
|
|
534
|
+
orderBy?: string;
|
|
535
|
+
orderDirection?: 'asc' | 'desc';
|
|
536
|
+
}
|
|
537
|
+
/** 分页结果 */
|
|
538
|
+
interface PaginatedResult<T> {
|
|
539
|
+
/** 数据列表 */
|
|
540
|
+
items: T[];
|
|
541
|
+
/** 总数 */
|
|
542
|
+
total: number;
|
|
543
|
+
/** 当前页 */
|
|
544
|
+
page: number;
|
|
545
|
+
/** 每页大小 */
|
|
546
|
+
pageSize: number;
|
|
547
|
+
/** 总页数 */
|
|
548
|
+
totalPages: number;
|
|
549
|
+
}
|
|
550
|
+
/** 文件事件类型 */
|
|
551
|
+
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';
|
|
552
|
+
/** 文件事件 */
|
|
553
|
+
interface FileEvent {
|
|
554
|
+
/** 事件类型 */
|
|
555
|
+
type: FileEventType;
|
|
556
|
+
/** 文件 ID */
|
|
557
|
+
fileId: string;
|
|
558
|
+
/** 事件数据 */
|
|
559
|
+
data?: any;
|
|
560
|
+
/** 时间戳 */
|
|
561
|
+
timestamp: Date;
|
|
562
|
+
}
|
|
563
|
+
/** 事件监听器 */
|
|
564
|
+
type FileEventListener = (event: FileEvent) => void | Promise<void>;
|
|
565
|
+
/**
|
|
566
|
+
* 文件元数据数据库持久化接口
|
|
567
|
+
*
|
|
568
|
+
* 实现此接口以提供自定义的数据库持久化支持
|
|
569
|
+
*
|
|
570
|
+
* @example
|
|
571
|
+
* ```typescript
|
|
572
|
+
* // Drizzle ORM 实现
|
|
573
|
+
* class DrizzleFileRepository implements IFileMetadataRepository {
|
|
574
|
+
* async save(metadata: FileMetadata): Promise<void> {
|
|
575
|
+
* await db.insert(fileMetadata).values(metadata);
|
|
576
|
+
* }
|
|
577
|
+
* // ... 其他方法
|
|
578
|
+
* }
|
|
579
|
+
* ```
|
|
580
|
+
*/
|
|
581
|
+
interface IFileMetadataRepository {
|
|
582
|
+
/**
|
|
583
|
+
* 保存文件元数据到数据库
|
|
584
|
+
*/
|
|
585
|
+
save(metadata: FileMetadata): Promise<void>;
|
|
586
|
+
/**
|
|
587
|
+
* 从数据库获取文件元数据
|
|
588
|
+
*/
|
|
589
|
+
get(fileId: string): Promise<FileMetadata | null>;
|
|
590
|
+
/**
|
|
591
|
+
* 查询文件列表
|
|
592
|
+
*/
|
|
593
|
+
query(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>>;
|
|
594
|
+
/**
|
|
595
|
+
* 从数据库删除文件元数据
|
|
596
|
+
*/
|
|
597
|
+
delete(fileId: string): Promise<void>;
|
|
598
|
+
/**
|
|
599
|
+
* 批量删除文件元数据
|
|
600
|
+
*/
|
|
601
|
+
batchDelete(fileIds: string[]): Promise<void>;
|
|
602
|
+
}
|
|
603
|
+
/**
|
|
604
|
+
* 数据库持久化配置
|
|
605
|
+
*/
|
|
606
|
+
interface FileServicePersistenceConfig {
|
|
607
|
+
/**
|
|
608
|
+
* 是否启用持久化
|
|
609
|
+
*/
|
|
610
|
+
enabled: boolean;
|
|
611
|
+
/**
|
|
612
|
+
* 持久化仓储实现
|
|
613
|
+
*/
|
|
614
|
+
repository: IFileMetadataRepository;
|
|
615
|
+
/**
|
|
616
|
+
* 是否自动持久化(默认 true)
|
|
617
|
+
* 如果为 true,文件上传完成后自动保存到数据库
|
|
618
|
+
*/
|
|
619
|
+
autoPersist?: boolean;
|
|
620
|
+
/**
|
|
621
|
+
* 是否优先使用缓存(默认 false)
|
|
622
|
+
* 如果为 true,查询时优先从缓存获取
|
|
623
|
+
*/
|
|
624
|
+
cacheFirst?: boolean;
|
|
625
|
+
}
|
|
626
|
+
/** 文件服务异常基类 */
|
|
627
|
+
declare class FileServiceError extends Error {
|
|
628
|
+
readonly code: string;
|
|
629
|
+
readonly details?: Record<string, any> | undefined;
|
|
630
|
+
constructor(message: string, code: string, details?: Record<string, any> | undefined);
|
|
631
|
+
}
|
|
632
|
+
/** 文件上传异常 */
|
|
633
|
+
declare class FileUploadError extends FileServiceError {
|
|
634
|
+
constructor(message: string, details?: Record<string, any>);
|
|
635
|
+
}
|
|
636
|
+
/** 文件处理异常 */
|
|
637
|
+
declare class FileProcessingError extends FileServiceError {
|
|
638
|
+
constructor(message: string, details?: Record<string, any>);
|
|
639
|
+
}
|
|
640
|
+
/** 存储提供者异常 */
|
|
641
|
+
declare class StorageProviderError extends FileServiceError {
|
|
642
|
+
constructor(message: string, details?: Record<string, any>);
|
|
643
|
+
}
|
|
644
|
+
/** CDN提供者异常 */
|
|
645
|
+
declare class CDNProviderError extends FileServiceError {
|
|
646
|
+
constructor(message: string, details?: Record<string, any>);
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
/**
|
|
650
|
+
* 通用文件服务核心实现
|
|
651
|
+
*
|
|
652
|
+
* 提供统一的文件上传、下载、管理接口
|
|
653
|
+
*/
|
|
654
|
+
|
|
655
|
+
/**
|
|
656
|
+
* 通用文件服务类
|
|
657
|
+
*/
|
|
658
|
+
declare class UniversalFileService extends EventEmitter {
|
|
659
|
+
private config;
|
|
660
|
+
private storageProviders;
|
|
661
|
+
private cdnProviders;
|
|
662
|
+
private fileProcessors;
|
|
663
|
+
private uploadProgressMap;
|
|
664
|
+
private metadataCache;
|
|
665
|
+
private urlCache;
|
|
666
|
+
private processingQueue;
|
|
667
|
+
private isProcessingQueueRunning;
|
|
668
|
+
constructor(config: UniversalFileServiceConfig);
|
|
669
|
+
/**
|
|
670
|
+
* 设置数据库持久化监听器
|
|
671
|
+
*
|
|
672
|
+
* 当文件上传完成或删除时,自动触发数据库操作
|
|
673
|
+
*/
|
|
674
|
+
private setupPersistenceListeners;
|
|
675
|
+
/**
|
|
676
|
+
* 初始化文件服务
|
|
677
|
+
*/
|
|
678
|
+
initialize(): Promise<void>;
|
|
679
|
+
/**
|
|
680
|
+
* 重新初始化存储提供者(支持配置热更新)
|
|
681
|
+
*/
|
|
682
|
+
reinitializeStorageProviders(): Promise<void>;
|
|
683
|
+
/**
|
|
684
|
+
* 注册存储提供者
|
|
685
|
+
*/
|
|
686
|
+
registerStorageProvider(provider: IStorageProvider): void;
|
|
687
|
+
/**
|
|
688
|
+
* 注册CDN提供者
|
|
689
|
+
*/
|
|
690
|
+
registerCDNProvider(provider: ICDNProvider): void;
|
|
691
|
+
/**
|
|
692
|
+
* 注册文件处理器
|
|
693
|
+
*/
|
|
694
|
+
registerFileProcessor(processor: IFileProcessor): void;
|
|
695
|
+
/**
|
|
696
|
+
* 上传文件
|
|
697
|
+
*/
|
|
698
|
+
uploadFile(fileInfo: UploadFileInfo$1, storageType?: StorageType$1, onProgress?: (progress: UploadProgress) => void): Promise<FileMetadata>;
|
|
699
|
+
/**
|
|
700
|
+
* 获取上传进度
|
|
701
|
+
*/
|
|
702
|
+
getUploadProgress(fileId: string): UploadProgress | undefined;
|
|
703
|
+
/**
|
|
704
|
+
* 监听文件事件
|
|
705
|
+
*/
|
|
706
|
+
onFileEvent(eventType: string, listener: FileEventListener$1): void;
|
|
707
|
+
/**
|
|
708
|
+
* 移除文件事件监听器
|
|
709
|
+
*/
|
|
710
|
+
offFileEvent(eventType: string, listener: FileEventListener$1): void;
|
|
711
|
+
private initializeStorageProviders;
|
|
712
|
+
private registerDefaultStorageProviders;
|
|
713
|
+
private initializeCDNProviders;
|
|
714
|
+
private initializeFileProcessors;
|
|
715
|
+
private validateFile;
|
|
716
|
+
private generateFileMetadata;
|
|
717
|
+
private generateStoragePath;
|
|
718
|
+
private generateFileHash;
|
|
719
|
+
private queueFileProcessing;
|
|
720
|
+
private generateProcessedPath;
|
|
721
|
+
private processFileQueue;
|
|
722
|
+
private cacheMetadata;
|
|
723
|
+
private _clearMetadataCache2;
|
|
724
|
+
private emitFileEvent;
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
export { type FileEventType as $, type AccessPermission as A, type BatchOperationResult as B, CDNProviderError$1 as C, type IFileProcessor as D, type ProcessorType as E, type FileMetadata as F, type ProcessingOptions as G, type ProcessingResult as H, type ImageProcessingOptions as I, type IFileMetadataRepository as J, type AliyunOSSConfig as K, type AliyunCDNConfig as L, type LocalStorageConfig as M, type FileServicePersistenceConfig as N, type CacheConfig as O, type PaginatedResult$1 as P, type StorageMetadata as Q, type CDNStats as R, StorageProviderError$1 as S, type ProcessorInfo as T, type UploadFileInfo$1 as U, type VideoProcessingOptions as V, type FileRecord as W, type FileQueryOptions as X, type PaginatedResult as Y, type FileEvent as Z, type FileEventListener as _, type UploadProgress as a, FileServiceError as a0, FileUploadError as a1, FileProcessingError as a2, StorageProviderError as a3, CDNProviderError as a4, type FileQueryOptions$1 as b, UniversalFileService as c, type ProcessingOptions$1 as d, FileServiceError$1 as e, FileUploadError$1 as f, FileProcessingError$1 as g, type StorageType$1 as h, type CDNType$1 as i, type ProcessorType$1 as j, type UploadStatus as k, type AudioProcessingOptions as l, type UploadResult as m, type FileEventType$1 as n, type FileEvent$1 as o, type FileEventListener$1 as p, type UniversalFileServiceConfig as q, type StorageConfig as r, type IStorageProvider as s, type StorageType as t, type UploadFileInfo as u, type StorageResult as v, type ICDNProvider as w, type CDNType as x, type CDNConfig as y, type CDNResult as z };
|