import fs from "node:fs"; import { TypedEmitter } from "tiny-typed-emitter"; import { BaseRequest } from "../base/index.js"; import Auth from "../base/Auth.js"; import type { MediaPartOptions } from "../types/index.js"; export type Line = "auto" | string; interface WebEmitterEvents { start: () => void; completed: (response: { cid: number; filename: string; title: string; }) => void; progress: (response: { event: "init" | "preupload-start" | "preupload-end" | "getUploadInfo-start" | "getUploadInfo-end" | "uploading" | "merge-start" | "merge-end"; progress: number; data: { loaded: number; total: number; [key: string]: any; }; }) => void; error: (error: Error) => void; cancel: () => void; debug: (data: any) => void; } interface UploadChunkTask { filePath: string; start: number; chunk_size: number; size: number; auth: string; url: string; uploadId: string; chunk: number; chunks: number; controller?: AbortController; status?: "pending" | "completed" | "running" | "error" | "abort"; } export declare class WebVideoUploader extends BaseRequest { private status; private queue; emitter: TypedEmitter; progress: { [key: string]: number; }; chunkTasks: { [key: number]: UploadChunkTask; }; size: number; options: { concurrency: number; retryTimes: number; retryDelay: number; line: Line; lineBlacklist: string[]; zone: string; limitRate: number; bcutPreUpload: boolean; }; on: TypedEmitter["on"]; once: TypedEmitter["once"]; off: TypedEmitter["off"]; filePath: string; title: string; completedPart: { cid: number; filename: string; title: string; }; constructor(part: MediaPartOptions, auth?: Auth, options?: { concurrency?: number; retryTimes?: number; retryDelay?: number; line?: Line; /** 自动选择线路时排除的 zone-upcdn 组合,例如 cs-bldsa */ lineBlacklist?: string[]; zone?: string; throttleRate?: number; bcutPreUpload?: boolean; }); getFileSizeSync(filePath: string): number; upload(): Promise<{ cid: number; filename: string; title: string; }>; /** * 获取上传信息 */ getUploadInfo(url: string, biz_id: number, chunk_size: number, auth: string): Promise<{ OK: number; bucket: string; key: string; upload_id: string; }>; /** * 上传预处理,获取线路等信息 */ preupload(): Promise<{ url: string; biz_id: number; chunk_size: number; auth: string; }>; /** * 上传预处理,获取线路等信息 */ preuploadApi(query: Record): Promise<{ OK: number; auth: string; biz_id: number; chunk_retry: number; chunk_retry_delay: number; chunk_size: number; endpoint: string; endpoints: string[]; expose_params: any; put_query: string; threads: number; timeout: number; uip: string; upos_uri: string; }>; /** * 自动选择线路 */ getUploadLineApi(): Promise<{ os: string; query: string; probe_url: string; }>; private getUploadInfoApi; /** * 切片上传api - 使用原生https模块实现 */ uploadChunkApi(options: UploadChunkTask, throttleStream: fs.ReadStream | Buffer, streamSize: number): Promise; /** * 使用原生 https 模块进行流式上传 */ private uploadChunkWithHttps; _uploadChunk(options: UploadChunkTask, retryCount?: number): Promise; /** * 上传切片 * return boolean 是否上传成功,如果否可能就是被取消了 */ private uploadChunk; private mergeVideoApi; sleep: (ms: number) => Promise; pause(): void; start(): void; cancel(): void; taskClear(): void; private cleanupTaskState; } export {};