| 252 | * - 所有方法都应当是幂等或尽可能接近幂等(例如删除不存在的对象不应抛出致命错误),以便业务层重试。 |
| 253 | */ |
| 254 | export interface IStorage { |
| 255 | bucketName: string; |
| 256 | |
| 257 | /** |
| 258 | * 确保存储桶存在;若不存在则**可能**尝试创建(取决于 vendor 与账号权限)。 |
| 259 | * |
| 260 | * 返回值说明: |
| 261 | * - `exists`: 调用前 bucket 是否存在 |
| 262 | * - `created`: 本次调用是否创建了 bucket |
| 263 | * |
| 264 | * 建议: |
| 265 | * - 对于 OSS/COS 等厂商,很多团队更倾向于在控制台/基础设施层面创建 bucket(权限/策略/生命周期等更可控), |
| 266 | * 应用侧仅做存在性校验即可(bucket 不存在时会抛出底层 SDK 错误)。 |
| 267 | */ |
| 268 | ensureBucket(): Promise<EnsureBucketResult>; |
| 269 | |
| 270 | /** |
| 271 | * 判断对象是否存在。 |
| 272 | * |
| 273 | * 返回值说明: |
| 274 | * - `exists`: 对象是否存在 |
| 275 | */ |
| 276 | checkObjectExists(params: ExistsObjectParams): Promise<ExistsObjectResult>; |
| 277 | |
| 278 | /** |
| 279 | * 上传对象到 bucket。 |
| 280 | * |
| 281 | * 典型用法: |
| 282 | * - 上传文件内容(Buffer/Readable) |
| 283 | * - 上传文本(string) |
| 284 | * |
| 285 | * 注意: |
| 286 | * - `contentType`/`contentDisposition`/`metadata` 会映射为不同厂商的 HTTP 头或元数据字段,adapter 负责兼容。 |
| 287 | */ |
| 288 | uploadObject(params: UploadObjectParams): Promise<UploadObjectResult>; |
| 289 | |
| 290 | /** |
| 291 | * 下载对象(以 Node.js `Readable` 流形式返回)。 |
| 292 | * |
| 293 | * 说明: |
| 294 | * - 适合大文件流式读取,避免一次性加载到内存。 |
| 295 | * - 调用方负责消费/关闭流(正常读取结束会自动关闭)。 |
| 296 | */ |
| 297 | downloadObject(params: DownloadObjectParams): Promise<DownloadObjectResult>; |
| 298 | |
| 299 | /** |
| 300 | * 删除单个对象(按 key)。 |
| 301 | * |
| 302 | * 建议: |
| 303 | * - 作为幂等操作处理:若对象不存在,最好仍返回成功(由 adapter 决定具体行为)。 |
| 304 | */ |
| 305 | deleteObject(params: DeleteObjectParams): Promise<DeleteObjectResult>; |
| 306 | |
| 307 | /** |
| 308 | * 根据多个 key 批量删除对象。 |
| 309 | * |
| 310 | * 注意: |
| 311 | * - 各厂商对单次批量删除的最大数量限制不同,adapter 可能需要分批处理。 |
no outgoing calls
no test coverage detected