base.d.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import { QiniuError } from '../errors';
  2. import Logger, { LogLevel } from '../logger';
  3. import { region } from '../config';
  4. import * as utils from '../utils';
  5. import { Host, HostPool } from './hosts';
  6. export declare const DEFAULT_CHUNK_SIZE = 4;
  7. export declare const FREEZE_CODE_LIST: number[];
  8. export declare const RETRY_CODE_LIST: number[];
  9. /** 上传文件的资源信息配置 */
  10. export interface Extra {
  11. /** 文件原文件名 */
  12. fname: string;
  13. /** 用来放置自定义变量 */
  14. customVars?: {
  15. [key: string]: string;
  16. };
  17. /** 自定义元信息 */
  18. metadata?: {
  19. [key: string]: string;
  20. };
  21. /** 文件类型设置 */
  22. mimeType?: string;
  23. }
  24. export interface InternalConfig {
  25. /** 是否开启 cdn 加速 */
  26. useCdnDomain: boolean;
  27. /** 是否开启服务端校验 */
  28. checkByServer: boolean;
  29. /** 是否对分片进行 md5校验 */
  30. checkByMD5: boolean;
  31. /** 强制直传 */
  32. forceDirect: boolean;
  33. /** 上传失败后重试次数 */
  34. retryCount: number;
  35. /** 自定义上传域名 */
  36. uphost: string[];
  37. /** 自定义分片上传并发请求量 */
  38. concurrentRequestLimit: number;
  39. /** 分片大小,单位为 MB */
  40. chunkSize: number;
  41. /** 上传域名协议 */
  42. upprotocol: 'https' | 'http';
  43. /** 上传区域 */
  44. region?: typeof region[keyof typeof region];
  45. /** 是否禁止统计日志上报 */
  46. disableStatisticsReport: boolean;
  47. /** 设置调试日志输出模式,默认 `OFF`,不输出任何日志 */
  48. debugLogLevel?: LogLevel;
  49. }
  50. /** 上传任务的配置信息 */
  51. export interface Config extends Partial<Omit<InternalConfig, 'upprotocol' | 'uphost'>> {
  52. /** 上传域名协议 */
  53. upprotocol?: InternalConfig['upprotocol'] | 'https:' | 'http:';
  54. /** 自定义上传域名 */
  55. uphost?: InternalConfig['uphost'] | string;
  56. }
  57. export interface UploadOptions {
  58. file: File;
  59. key: string | null | undefined;
  60. token: string;
  61. config: InternalConfig;
  62. putExtra?: Partial<Extra>;
  63. }
  64. export interface UploadInfo {
  65. id: string;
  66. url: string;
  67. }
  68. /** 传递给外部的上传进度信息 */
  69. export interface UploadProgress {
  70. total: ProgressCompose;
  71. uploadInfo?: UploadInfo;
  72. chunks?: ProgressCompose[];
  73. }
  74. export interface UploadHandlers {
  75. onData: (data: UploadProgress) => void;
  76. onError: (err: QiniuError) => void;
  77. onComplete: (res: any) => void;
  78. }
  79. export interface Progress {
  80. total: number;
  81. loaded: number;
  82. }
  83. export interface ProgressCompose {
  84. size: number;
  85. loaded: number;
  86. percent: number;
  87. fromCache?: boolean;
  88. }
  89. export declare type XHRHandler = (xhr: XMLHttpRequest) => void;
  90. export default abstract class Base {
  91. protected hostPool: HostPool;
  92. protected logger: Logger;
  93. protected config: InternalConfig;
  94. protected putExtra: Extra;
  95. protected aborted: boolean;
  96. protected retryCount: number;
  97. protected uploadHost?: Host;
  98. protected xhrList: XMLHttpRequest[];
  99. protected file: File;
  100. protected key: string | null | undefined;
  101. protected token: string;
  102. protected assessKey: string;
  103. protected bucketName: string;
  104. protected uploadAt: number;
  105. protected progress: UploadProgress;
  106. protected onData: (data: UploadProgress) => void;
  107. protected onError: (err: QiniuError) => void;
  108. protected onComplete: (res: any) => void;
  109. /**
  110. * @returns utils.Response<any>
  111. * @description 子类通过该方法实现具体的任务处理
  112. */
  113. protected abstract run(): utils.Response<any>;
  114. constructor(options: UploadOptions, handlers: UploadHandlers, hostPool: HostPool, logger: Logger);
  115. protected checkAndUpdateUploadHost(): Promise<void>;
  116. protected checkAndUnfreezeHost(): void;
  117. private checkAndFreezeHost;
  118. private handleError;
  119. /**
  120. * @returns Promise 返回结果与上传最终状态无关,状态信息请通过 [Subscriber] 获取。
  121. * @description 上传文件,状态信息请通过 [Subscriber] 获取。
  122. */
  123. putFile(): Promise<void>;
  124. private clear;
  125. stop(): void;
  126. addXhr(xhr: XMLHttpRequest): void;
  127. private sendLog;
  128. getProgressInfoItem(loaded: number, size: number, fromCache?: boolean): ProgressCompose;
  129. }