object-storage-js
Version:
Object storage SDK for browser — supports server upload, MinIO, OBS, OSS, AWS S3, Qiniu Kodo, and Baidu BOS
229 lines (226 loc) • 8.66 kB
TypeScript
/*!
* object-storage-js v0.0.4
* Object storage SDK for browser — supports server upload, MinIO, OBS, OSS, AWS S3, Qiniu Kodo, and Baidu BOS
* https://gitee.com/lilele01/object-storage-js
* Released under the MIT License.
*/
/**
* 统一的上传进度快照。
*/
interface UploadProgress {
/** 已上传字节数。 */
loaded: number;
/** 本次上传的总字节数。 */
total: number;
/** 上传百分比,范围为 0-100,保留 2 位小数。 */
percent: number;
}
/**
* 所有存储类型共用的上传参数。
*/
interface UploadParams {
/** 需要上传的浏览器 File 对象。 */
file: File;
/** 目标对象 key;不传时默认使用 file.name。 */
fileName?: string;
/** 切换为分片上传的文件大小阈值。 */
maxSize?: number;
/** 分片大小,单位为字节。 */
partSize?: number;
/** 分片上传时允许同时上传的最大分片数。 */
queueLength?: number;
/** 服务端上传地址,仅 normal 上传需要。 */
uploadUrl?: string;
/** 服务端合并地址,仅 normal 分片上传需要。 */
mergeUrl?: string;
/** 上传凭证;例如七牛云上传 token。 */
uploadToken?: string;
/** 内容类型;未传时优先使用 file.type 或由 SDK 推断。 */
contentType?: string;
/** 透传给厂商上传方法的额外参数。 */
sdkUploadParams?: Record<string, unknown>;
/** 接收标准化后的整文件上传进度。 */
onUploadProgress?: (progress: UploadProgress) => void;
/** 上传可取消后接收取消句柄。 */
onCancel?: (handle: CancelHandle) => void;
}
/**
* 不同厂商 SDK 返回结构不一致,这里刻意保持宽松类型,仅约束 Promise 边界。
*/
type UploadResult = unknown;
/**
* 支持的上传后端类型。
*/
declare enum ObjectStorageType {
/** 上传到业务服务端接口。 */
NORMAL = "normal",
/** 阿里云 OSS 浏览器 SDK。 */
OSS = "oss",
/** 华为云 OBS 浏览器 SDK。 */
OBS = "obs",
/** 通过 AWS SDK v2 接入兼容 S3 协议的 MinIO。 */
MINIO = "minio",
/** 通过 AWS SDK v2 接入 AWS S3。 */
AWS = "aws",
/** 七牛云 Kodo JS SDK。 */
QINIU = "qiniu",
/** 百度智能云 BOS 浏览器 SDK。 */
BOS = "bos"
}
/**
* 暴露给调用方的上传取消句柄。
*/
interface CancelHandle {
/** 基于 XHR 上传时的当前 XHR 实例。 */
instance: XMLHttpRequest | null;
/** 中断该句柄对应的上传任务。 */
cancel: () => void;
}
/**
* 内部适配器协议,用于隔离不同厂商 SDK 的差异。
*/
interface StorageAdapter<TInstance = unknown> {
/** 当前适配器实现的存储后端类型。 */
readonly type: ObjectStorageType;
/** 已初始化的第三方 SDK 实例;normal 上传没有 SDK 实例。 */
readonly instance: TInstance;
/** 上传文件,并隐藏具体厂商实现细节。 */
upload(params: UploadParams): Promise<UploadResult>;
/** 当 SDK 支持全局取消时,取消厂商侧上传任务。 */
cancel?(): void;
}
/**
* 存储配置的公共字段。
*/
interface BaseObjectStorageConfig<TSdkObject = unknown> {
/** 存储后端类型。 */
type: ObjectStorageType;
/** 透传给厂商 SDK 构造函数的额外参数。 */
sdkOtherParams?: Record<string, unknown>;
/** 由业务方传入的 SDK 构造函数或模块,避免本包内置厂商 SDK。 */
sdkObject?: TSdkObject;
}
/**
* 业务服务端上传配置。
*/
interface NormalObjectStorageConfig<TSdkObject = unknown> extends BaseObjectStorageConfig<TSdkObject> {
type: ObjectStorageType.NORMAL;
}
/**
* 阿里云 OSS 上传配置。
*/
interface OssObjectStorageConfig<TSdkObject = unknown> extends BaseObjectStorageConfig<TSdkObject> {
type: ObjectStorageType.OSS;
/** OSS SDK 构造函数,例如 ali-oss 的默认导出。 */
sdkObject: TSdkObject;
/** OSS endpoint,例如 https://oss-cn-hangzhou.aliyuncs.com。 */
endPoint: string;
/** SDK 客户端使用的 bucket 名称。 */
bucketName: string;
/** AccessKeyId;浏览器侧建议使用 STS 临时凭证。 */
accessKey?: string;
/** AccessKeySecret;浏览器侧建议使用 STS 临时凭证。 */
secretKey?: string;
/** 临时安全令牌。 */
securityToken?: string;
/** OSS region;不传时会尽量从 endPoint 推断。 */
region?: string;
}
/**
* 华为云 OBS 上传配置。
*/
interface ObsObjectStorageConfig<TSdkObject = unknown> extends BaseObjectStorageConfig<TSdkObject> {
type: ObjectStorageType.OBS;
/** OBS SDK 构造函数。 */
sdkObject: TSdkObject;
/** OBS 服务端点。 */
endPoint: string;
/** 签名和分片上传使用的 bucket 名称。 */
bucketName: string;
/** AccessKeyId;浏览器侧建议使用临时凭证。 */
accessKey?: string;
/** SecretAccessKey;浏览器侧建议使用临时凭证。 */
secretKey?: string;
/** 临时安全令牌。 */
securityToken?: string;
}
/**
* AWS S3 以及兼容 S3 协议的 MinIO 上传配置。
*/
interface S3ObjectStorageConfig<TSdkObject = unknown> extends BaseObjectStorageConfig<TSdkObject> {
type: ObjectStorageType.MINIO | ObjectStorageType.AWS;
/** 暴露 S3 构造函数的 AWS SDK v2 模块。 */
sdkObject: TSdkObject;
/** 目标 bucket 名称。 */
bucketName: string;
/** AccessKeyId;浏览器侧建议使用临时凭证。 */
accessKey?: string;
/** SecretAccessKey;浏览器侧建议使用临时凭证。 */
secretKey?: string;
/** 临时会话令牌。 */
securityToken?: string;
/** S3 endpoint;MinIO 或自建兼容 S3 服务通常必填。 */
endPoint?: string;
/** 目标服务需要时传入 AWS region。 */
region?: string;
}
/**
* 七牛云 Kodo 上传配置。
*/
interface QiniuObjectStorageConfig<TSdkObject = unknown> extends BaseObjectStorageConfig<TSdkObject> {
type: ObjectStorageType.QINIU;
/** 七牛云 JS SDK 模块,需暴露 upload 方法。 */
sdkObject: TSdkObject;
/** 默认上传 token;也可以在 upload(params.uploadToken) 中按次传入。 */
uploadToken?: string;
}
/**
* 百度智能云 BOS 上传配置。
*/
interface BosObjectStorageConfig<TSdkObject = unknown> extends BaseObjectStorageConfig<TSdkObject> {
type: ObjectStorageType.BOS;
/** 百度 BOS 浏览器 SDK 模块,需暴露 BosClient。 */
sdkObject: TSdkObject;
/** 目标 bucket 名称。 */
bucketName: string;
/** BOS endpoint,例如 https://bj.bcebos.com。 */
endPoint: string;
/** AccessKeyId;浏览器侧建议使用服务端签名或临时策略。 */
accessKey?: string;
/** SecretAccessKey;浏览器侧建议使用服务端签名或临时策略。 */
secretKey?: string;
/** 服务端签名接口;传入后会覆盖 SDK 默认签名逻辑。 */
signatureUrl?: string;
}
/**
* 所有支持的存储配置联合类型。
*/
type ObjectStorageConfig<TSdkObject = unknown> = NormalObjectStorageConfig<TSdkObject> | OssObjectStorageConfig<TSdkObject> | ObsObjectStorageConfig<TSdkObject> | S3ObjectStorageConfig<TSdkObject> | QiniuObjectStorageConfig<TSdkObject> | BosObjectStorageConfig<TSdkObject>;
/**
* 浏览器端统一对象存储客户端。
*
* 该类保持对外 API 稳定,并将厂商初始化、上传等差异委托给内部适配器。
*/
declare class ObjectStorage<TInstance = unknown, TSdkObject = unknown> {
private readonly adapter;
/** 云厂商上传时为已初始化的 SDK 实例;normal 上传时为 undefined。 */
readonly instance: TInstance;
/** 当前存储后端使用 bucket 时的 bucket 名称。 */
readonly bucketName: string | undefined;
/** 当前选择的上传后端类型。 */
readonly uploadType: ObjectStorageType;
/**
* 根据厂商配置创建存储客户端。
*/
constructor(config: ObjectStorageConfig<TSdkObject>);
/**
* 使用当前配置的后端上传文件。
*/
upload(params: UploadParams): Promise<UploadResult>;
/**
* 当适配器支持取消时,取消厂商侧上传任务。
*/
cancel(): void;
}
export { ObjectStorage, ObjectStorageType, ObjectStorage as default };
export type { BaseObjectStorageConfig, BosObjectStorageConfig, CancelHandle, NormalObjectStorageConfig, ObjectStorageConfig, ObsObjectStorageConfig, OssObjectStorageConfig, QiniuObjectStorageConfig, S3ObjectStorageConfig, StorageAdapter, UploadParams, UploadProgress, UploadResult };