{"version":3,"file":"TaskQueue.mjs","sources":["../../../../../../packages/upload-sdk/src/upload-core/TaskQueue.ts"],"sourcesContent":["// 任务构造器\nimport { EventEmitter } from './EventEmitter';\n\nexport class Task {\n  fn: any; // 任务关联的执行函数\n  payload?: any; // 任务关联的其他信息\n  constructor(fn: any, payload?: any) {\n    this.fn = fn;\n    this.payload = payload;\n  }\n\n  // 执行任务\n  run() {\n    return this.fn(this.payload);\n  }\n}\n\n// 可并发执行的任务队列\nexport class TaskQueue extends EventEmitter<'start' | 'pause' | 'drain'> {\n  // 待执行的任务\n  private tasks: Set<Task> = new Set();\n  // 当前正在执行的任务数\n  private currentCount = 0;\n  // 任务状态\n  private status: 'paused' | 'running' = 'paused';\n  // 最大并发数\n  private concurrency = 4;\n\n  constructor(concurrency = 4) {\n    super();\n    this.concurrency = concurrency;\n  }\n\n  // 添加任务\n  add(...tasks: Task[]) {\n    for (const t of tasks) {\n      this.tasks.add(t);\n    }\n  }\n\n  // 添加任务并启动执行\n  addAndStart(...tasks: Task[]) {\n    this.add(...tasks);\n    this.start();\n  }\n\n  // 启动任务\n  start() {\n    if (this.status === 'running') {\n      return; // 任务正在进行中，结束\n    }\n    if (this.tasks.size === 0) {\n      // 当前已无任务，触发drain事件\n      this.emit('drain');\n      return;\n    }\n    // 设置任务状态为running\n    this.status = 'running';\n    this.emit('start'); // 触发start事件\n    this.runNext(); // 开始执行下一个任务\n  }\n\n  // 取出第一个任务\n  private takeHeadTask() {\n    const task = this.tasks.values().next().value;\n    if (task) {\n      this.tasks.delete(task);\n    }\n    return task;\n  }\n\n  // 执行下一个任务\n  private runNext() {\n    if (this.status !== 'running') {\n      return; // 如果整体的任务状态不是running，结束\n    }\n    if (this.currentCount >= this.concurrency) {\n      // 并发数已满，结束\n      return;\n    }\n    // 取出第一个任务\n    const task = this.takeHeadTask();\n    if (!task) {\n      // 没有任务了\n      this.status = 'paused'; // 暂停执行\n      this.emit('drain'); // 触发drain事件\n      return;\n    }\n    this.currentCount++; // 当前任务数+1\n    // 执行任务\n    Promise.resolve(task.run()).finally(() => {\n      // 任务执行完成后，当前任务数-1，继续执行下一个任务\n      this.currentCount--;\n      this.runNext();\n    });\n  }\n\n  // 暂停任务\n  pause() {\n    this.status = 'paused';\n    this.emit('pause');\n  }\n}\n"],"names":[],"mappings":"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"}