Files
FastGPT/sdk/storage/src/interface.ts
roy 6213f0001d chore: add extra sub path for custom S3 (#6339)
* fix: storage sdk

* chore: add extra sub path for custom S3
2026-01-30 11:56:53 +08:00

390 lines
12 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type {
DeleteObjectParams,
DeleteObjectResult,
DeleteObjectsParams,
DeleteObjectsResult,
DeleteObjectsByPrefixParams,
DownloadObjectParams,
DownloadObjectResult,
EnsureBucketResult,
GetObjectMetadataParams,
GetObjectMetadataResult,
ListObjectsParams,
ListObjectsResult,
PresignedPutUrlParams,
PresignedPutUrlResult,
UploadObjectParams,
UploadObjectResult,
ExistsObjectParams,
ExistsObjectResult,
PresignedGetUrlParams,
PresignedGetUrlResult,
CopyObjectParams,
CopyObjectResult,
GeneratePublicGetUrlParams,
GeneratePublicGetUrlResult
} from './types';
/**
* 通用存储配置(与具体云厂商无关)。
*
* 说明:
* - 本包的适配器以「对象存储」为抽象S3/OSS/COS/MinIO 等)。
* - `bucket` / `region` / `credentials` 是大多数厂商的最小必填集合。
* - `endpoint` 用于 S3 兼容协议的自定义域名/私有部署地址等场景。
*
* 注意:
* - 不同厂商对 `region` 的含义略有差异(有的会叫作 `region`,有的叫 `location`),这里统一命名为 `region`
* 由各 adapter 在内部做映射或直传。
*/
export interface ICommonStorageOptions {
/**
* 存储桶名称Bucket
*
* - 一般全局唯一(取决于厂商),建议使用小写字母/数字/短横线组合。
* - 对于已存在的 bucket此处填写目标 bucket 名称即可。
*/
bucket: string;
/**
* 区域Region / Location
*
* - AWS: 例如 `ap-northeast-1`
* - 腾讯云 COS: 例如 `ap-guangzhou`
* - 阿里云 OSS: 例如 `oss-cn-hangzhou`(具体取值以厂商为准)
*/
region: string;
/**
* 访问凭证AK/SK
*
* 注意:
* - 不同厂商字段命名不同,这里统一为 `accessKeyId` / `secretAccessKey`。
* - 强烈建议从环境变量/密钥管理服务中读取,不要硬编码在仓库里。
*/
credentials: {
/** AccessKeyId / SecretId / AK */
accessKeyId: string;
/** SecretAccessKey / SecretKey / SK */
secretAccessKey: string;
};
/**
* 公共访问时额外添加的子路径,可选。
*
* 说明:
* - 用于在公共访问时添加额外的前缀,例如 `/sub-path`。
*/
publicAccessExtraSubPath?: string;
}
/**
* AWS S3 兼容协议的存储配置。
*
* 适用范围:
* - AWS S3
* - MinIO以及其他兼容 S3 的对象存储)
*
* 设计:
* - 通过 `vendor` 做判别联合discriminated union便于在运行时和类型层面区分不同厂商配置。
*/
export interface IAwsS3CompatibleStorageOptions extends ICommonStorageOptions {
/**
* 存储厂商标识S3 兼容系)。
*
* - `aws-s3`: AWS S3
* - `minio`: MinIOS3 协议兼容)
*/
vendor: 'aws-s3' | 'minio';
/**
* 自定义服务端点Endpoint可选。
*
* 常见用途:
* - MinIO / 私有 S3 兼容服务:`http(s)://host:port`
* - 某些厂商的加速域名、内网域名等
*
* 注意:是否需要带协议、端口、路径取决于具体 adapter 的实现。
*/
endpoint: string;
/**
* 是否强制使用 Path-Style 访问(`/{bucket}/{key}`),可选。
*
* 背景:
* - S3 支持两种寻址方式virtual-hosted-style`{bucket}.endpoint/{key}`)和 path-style`endpoint/{bucket}/{key}`)。
* - 一些自建/本地化服务(或特定网络环境)对 virtual-hosted-style 支持不完整,此时可能需要开启。
*/
forcePathStyle?: boolean;
/**
* 最大重试次数,可选。
*
* 说明:
* - 仅影响 adapter 内部使用的 SDK 请求重试策略(如果 adapter 支持)。
* - 若不设置,通常由 SDK 使用默认值。
*/
maxRetries?: number;
}
/**
* 阿里云 OSS 存储配置。
*/
export interface IOssStorageOptions extends ICommonStorageOptions {
/** 存储厂商标识OSS。 */
vendor: 'oss';
/**
* 是否使用自定义域名CNAME可选。
*
* - 开启后通常会影响 endpoint/host 的拼接方式。
* - 具体行为取决于 OSS SDK 与 adapter 实现。
*/
cname?: boolean;
/**
* 自定义服务端点Endpoint可选。
*
* 常见用途:
* - MinIO / 私有 S3 兼容服务:`http(s)://host:port`
* - 某些厂商的加速域名、内网域名等
*
* 注意:是否需要带协议、端口、路径取决于具体 adapter 的实现。
*/
endpoint?: string;
/**
* 是否使用 HTTPS 协议,可选。
*
* 说明:
* - 默认使用 HTTPS 协议。
* - 如果设置为 false则使用 HTTP 协议。
*/
secure?: boolean;
/**
* 是否启用代理,可选。
*/
enableProxy?: boolean;
/**
* 是否走内网internal endpoint可选。
*
* - 在同地域云内网环境可显著降低延迟与流量费用。
* - 若设置为 trueadapter 可能会自动选择 internal endpoint。
*/
internal?: boolean;
}
/**
* 腾讯云 COS 存储配置。
*/
export interface ICosStorageOptions extends ICommonStorageOptions {
/** 存储厂商标识COS。 */
vendor: 'cos';
/**
* 请求协议,可选。
*
* - `https:` 为默认推荐
* - 某些内网/测试环境可能使用 `http:`
*/
protocol?: 'http:' | 'https:';
/**
* 是否启用全球加速,可选。
*
* 说明:
* - 仅当 COS 账号/桶已开通加速能力时才有意义。
* - 开启后 endpoint/域名可能会发生变化(由 adapter 处理)。
*/
useAccelerate?: boolean;
/**
* 自定义域名,可选。
*
* 说明:
* - 用于替代默认的域名,例如 `https://{bucket}.cos.${region}.myqcloud.com`。
* - 通常用于某些厂商的私有化部署环境。
*/
domain?: string;
/**
* 代理,可选。
*
* 说明:
* - 用于 HTTP 代理访问,例如 `http://127.0.0.1:8080`。
*/
proxy?: string;
}
/**
* 百度 BOS 存储配置(预留)。
*
* 说明:
* - 当前 `IStorageOptions` 并未包含该类型,可能尚未完整实现/接入。
* - 先保留接口便于后续扩展。
*/
export interface IBosStorageOptions extends ICommonStorageOptions {
/** 存储厂商标识BOS。 */
vendor: 'bos';
}
/**
* 存储配置联合类型(判别联合)。
*
* 用法:
* - 根据 `vendor` 字段区分不同厂商配置adapter 工厂函数通常也会基于该字段选择实现。
*
* 注意:
* - 当前仅包含 `aws-s3`/`minio`/`oss`/`cos`;若后续接入新厂商,需要在此处补齐联合成员。
*/
export type IStorageOptions =
| IAwsS3CompatibleStorageOptions
| IOssStorageOptions
| ICosStorageOptions;
/**
* 统一的对象存储能力接口vendor-agnostic
*
* 约定:
* - `key` 通常表示对象在 bucket 内的路径(例如 `a/b/c.txt`),由调用方自行约定命名规则。
* - 所有方法都应当是幂等或尽可能接近幂等(例如删除不存在的对象不应抛出致命错误),以便业务层重试。
*/
export interface IStorage {
bucketName: string;
/**
* 确保存储桶存在;若不存在则**可能**尝试创建(取决于 vendor 与账号权限)。
*
* 返回值说明:
* - `exists`: 调用前 bucket 是否存在
* - `created`: 本次调用是否创建了 bucket
*
* 建议:
* - 对于 OSS/COS 等厂商,很多团队更倾向于在控制台/基础设施层面创建 bucket权限/策略/生命周期等更可控),
* 应用侧仅做存在性校验即可bucket 不存在时会抛出底层 SDK 错误)。
*/
ensureBucket(): Promise<EnsureBucketResult>;
/**
* 判断对象是否存在。
*
* 返回值说明:
* - `exists`: 对象是否存在
*/
checkObjectExists(params: ExistsObjectParams): Promise<ExistsObjectResult>;
/**
* 上传对象到 bucket。
*
* 典型用法:
* - 上传文件内容Buffer/Readable
* - 上传文本string
*
* 注意:
* - `contentType`/`contentDisposition`/`metadata` 会映射为不同厂商的 HTTP 头或元数据字段adapter 负责兼容。
*/
uploadObject(params: UploadObjectParams): Promise<UploadObjectResult>;
/**
* 下载对象(以 Node.js `Readable` 流形式返回)。
*
* 说明:
* - 适合大文件流式读取,避免一次性加载到内存。
* - 调用方负责消费/关闭流(正常读取结束会自动关闭)。
*/
downloadObject(params: DownloadObjectParams): Promise<DownloadObjectResult>;
/**
* 删除单个对象(按 key
*
* 建议:
* - 作为幂等操作处理:若对象不存在,最好仍返回成功(由 adapter 决定具体行为)。
*/
deleteObject(params: DeleteObjectParams): Promise<DeleteObjectResult>;
/**
* 根据多个 key 批量删除对象。
*
* 注意:
* - 各厂商对单次批量删除的最大数量限制不同adapter 可能需要分批处理。
* - 返回的 `deleted` 通常只包含实际删除/确认删除的 key。
*/
deleteObjectsByMultiKeys(params: DeleteObjectsParams): Promise<DeleteObjectsResult>;
/**
* 根据前缀批量删除对象(危险操作)。
*
* 安全建议:
* - `prefix` 必须是非空字符串,且建议包含业务域前缀(例如 `team/{teamId}/`),避免误删整个 bucket。
* - 对于大规模删除adapter 可能会先 list 再 delete耗时与费用需评估。
*
* 注意:
* - 理论上可以使用 `this.listObjects` 然后 `this.deleteObjectsByMultiKeys`
* 但是这样可能会产生不必要的内存占用问题,所以这里单独实现了一个方法
*/
deleteObjectsByPrefix(params: DeleteObjectsByPrefixParams): Promise<DeleteObjectsResult>;
/**
* 生成对象的上传预签名 URLPresigned URL
*
* 用途:
* - 前端直传PUT
*
* 注意:
* - 过期时间、签名算法、header 约束等通常由 adapter 或其底层 SDK 决定。
* - 返回值中的 `metadata` 字段语义更接近“直传时需要附带的 headers”不同厂商前缀不同如 `x-oss-meta-*` / `x-cos-meta-*`)。
* 字段名因历史原因沿用 `metadata`。
*/
generatePresignedPutUrl(params: PresignedPutUrlParams): Promise<PresignedPutUrlResult>;
/**
* 生成对象的下载预签名 URLPresigned URL
*
* 用途:
* - 临时授权下载GET
*/
generatePresignedGetUrl(params: PresignedGetUrlParams): Promise<PresignedGetUrlResult>;
/**
* 生成公共对象的访问 URL。
*/
generatePublicGetUrl(params: GeneratePublicGetUrlParams): GeneratePublicGetUrlResult;
/**
* 列出对象 key可按前缀过滤
*
* 注意:
* - 当前返回结构只包含 key 列表,未包含分页/marker/continuationToken 等信息;
* 若业务需要大规模遍历,应扩展 `ListObjectsParams/Result` 支持分页与更多元数据。
* - `prefix` 为可选;不传则表示列出整个 bucket 内对象(注意对象很多时可能会很慢/很贵)。
* - 不要用 listObjects + deleteObjectsByMultiKeys 来实现“按前缀删除”:批量删除单次最多 1000 个对象,且 list 结果量可能很大;
* 请使用 `deleteObjectsByPrefix`adapter 会在内部分页与分批删除)。
*/
listObjects(params: ListObjectsParams): Promise<ListObjectsResult>;
/**
* 复制对象。
*/
copyObjectInSelfBucket(params: CopyObjectParams): Promise<CopyObjectResult>;
/**
* 获取对象元数据Metadata
*
* 说明:
* - 元数据通常包含用户自定义 metadata 以及部分系统字段(取决于 adapter 的实现)。
* - 不同厂商会对 metadata 的 key 前缀、大小写、可用字符做限制,调用方应尽量使用简单的 ASCII key。
*/
getObjectMetadata(params: GetObjectMetadataParams): Promise<GetObjectMetadataResult>;
/**
* 资源清理/连接释放。
*
* 说明:
* - 某些 SDK 会维护连接池或后台任务,业务在进程退出前可调用以更快释放资源。
* - 若 adapter 无需清理应实现为空操作resolved Promise
*/
destroy(): Promise<void>;
}