import { type CosScene, type GetCosCredentialParams, type NormalizeCredential, type NormalizedCosCredential } from "../../api/cos"; import { usePntConfig, type PntHttpLike } from "../../config"; /** * 文件名生成策略 * @description 内置三种策略;如需自定义可传函数 * - uuid: UUID v4 + 原扩展名(默认,最简单) * - md5: 文件内容 MD5 + 原扩展名(与 pnt-tools CosApi 原策略一致) * - timestamp: 时间戳(36进制)+自增计数器 + 原扩展名(与 SDK 定制场景原策略一致) */ export type FileNameStrategy = 'uuid' | 'md5' | 'timestamp' | ((file: File) => string | Promise); /** * COS 上传配置 */ export interface PntCosUploadOptions { /** * 业务场景,决定走哪个凭证接口 * @description 内置 4 个 scene,消费方可传 string 自定义并配合 getCredential 使用 */ scene: CosScene; /** * 业务类型路径 key * @description 通用场景透传给后端 path map 选取对应业务路径; * sdk_customize 场景作为受控目录(filePath)下的子目录继续拼接 */ pathKey?: string; /** * 业务上下文参数(gameId/env/updType 等) * @description 按 scene 不同传递给后端;default/default_download 下 gameId 自动映射到 x-service-type 请求头 */ context?: Record; /** * 网关 audience * @default '/player-network' * @description 账号管理等子系统需覆盖为对应 audience(如 '/laas-pnt') */ audience?: string; /** * 文件名生成策略 * @default 'uuid' */ fileNameStrategy?: FileNameStrategy; /** * 是否走 CDN 域名拼接 * @description true 且凭证返回 cosHost 时用 cosHost + cosKey;否则用 COS putObject 返回的 Location * @default true */ useCdn?: boolean; /** * 自定义凭证获取函数(覆盖内置 scene 路由) * @description 后端接口非内置 scene 时使用;返回归一化后的凭证 */ getCredential?: (http: ReturnType['http'], params: GetCosCredentialParams) => Promise; /** * 自定义凭证响应归一化 * @description 后端字段不标准时使用;入参为内置 scene 接口返回的原始 data,需返回归一化凭证 */ normalizeCredential?: NormalizeCredential; } /** * COS 上传结果 */ export interface PntCosUploadResult { /** 上传后的可访问 URL */ fileUrl: string; /** COS 对象 Key */ cosKey: string; /** 原始文件名 */ fileName: string; } /** * 单次请求覆盖参数 * @description 上传/下载入口的 gameId/task_id/pathKey 常来自表单或表格行数据, * 可通过该参数在单次调用覆盖 hook 初始化时的配置 */ export interface PntCosRequestOverrides { /** 覆盖业务上下文(与初始化 context 浅合并,如行级 gameId/task_id) */ context?: Record; /** 覆盖网关 audience */ audience?: string; /** 覆盖凭证场景 */ scene?: CosScene; /** 覆盖业务路径 key */ pathKey?: string; } /** * COS 上传器实例 */ export interface PntCosUploader { /** * 上传文件到 COS * @param file 原始文件 * @param onProgress 上传进度回调(0~100) * @param overrides 单次调用覆盖配置(表单/行级 gameId 等) */ upload: (file: File, onProgress?: (percent: number) => void, overrides?: PntCosRequestOverrides) => Promise; /** * 获取文件预签名下载 URL(临时) * @param cosKey COS 对象 Key,或完整 URL(自动剥离域名) * @param overrides 单次调用覆盖配置(行级 gameId/task_id 等) */ getDownloadUrl: (cosKey: string, overrides?: PntCosRequestOverrides) => Promise; } export type { CosScene, GetCosCredentialParams, NormalizeCredential, NormalizedCosCredential, }; export { normalizeSnakeCredential } from "../../api/cos"; /** * 创建 COS 直传器实例(不依赖 React) * @description 与 usePntCosUploader 共用同一套核心逻辑,适用于 class 兼容层、 * 工具函数、非 React 入口等场景;React 组件请优先使用 usePntCosUploader * * @param http 消费方 axios 实例(约定响应拦截器已解包 response.data) * @param options 上传配置(固定值),或返回配置的 getter(需要动态配置时使用) * * @example * ```ts * const uploader = createPntCosUploader(http, { scene: 'default', pathKey: 'marketing_icon' }); * const { fileUrl } = await uploader.upload(file); * ``` */ export declare const createPntCosUploader: (http: PntHttpLike, options: PntCosUploadOptions | (() => PntCosUploadOptions)) => PntCosUploader; /** * COS 直传 Service Hook * @description 内置凭证获取 + COS SDK 初始化 + 文件名策略 + URL 拼接, * 收敛各项目重复的 4 份自实现;http 实例由 PntProvider 注入 * * @param options 上传配置 * * @example * ```ts * const uploader = usePntCosUploader({ scene: 'default', pathKey: 'marketing_icon' }); * const { fileUrl, cosKey } = await uploader.upload(file, (p) => setProgress(p)); * ``` */ export declare const usePntCosUploader: (options: PntCosUploadOptions) => PntCosUploader; export default usePntCosUploader;