{"version":3,"sources":["jsdelivr-header.js","/npm/@xmcl/task@4.1.1/index.ts"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,kuBCNA,aAAA,GAAA,SAAA,aAAA,CAAA,cAAA,IAAA,cAAA,SAAA,IAAA,SAAA,eAAA,IAAA,eAAA,UAAA,IAAA,UAAA,YAAA,IAAA,YAAA,UAAA,IAAA,UAAA,WAAA,IAAA,WAAA,KAAA,IAAA,OAAA,OAAA,QAAA,aAAA,cAGO,IAAM,eAAN,cAA6B,MAClC,WAAA,GACE,MAAM,aACN,KAAK,KAAO,gBACd,GAGU,UAAL,CAAK,IACV,IAAA,eACA,IAAA,qBACA,IAAA,yBACA,IAAA,mBACA,IAAA,qBACA,IAAA,mBANU,GAAL,CAAK,WAAA,IAyDL,SAAS,aACd,IAAI,EAAK,EACT,MAAO,IAAM,GACf,CAEO,IAAe,SAAf,MAsBL,WAAA,GArBA,cAAA,KAAU,SAAoB,GAC9B,cAAA,KAAU,YAEV,cAAA,KAAU,WACV,cAAA,KAAU,UAEV,cAAA,KAAU,SACV,cAAA,KAAU,OACV,cAAA,KAAU,YAAY,GACtB,cAAA,KAAU,UAAS,GACnB,cAAA,KAAU,QAAQ,IAClB,cAAA,KAAU,MAAM,GAEhB,cAAA,KAAA,UACA,cAAA,KAAA,UAAuB,CAAC,GAExB,cAAA,KAAA,OAAO,IACP,cAAA,KAAA,QAAgB,CAAC,GAEjB,cAAA,KAAU,iBAGR,KAAK,SAAW,IAAI,SAAQ,CAAC,EAAS,KACpC,KAAK,QAAU,EACf,KAAK,OAAS,CAAA,GAElB,CAEA,OAAA,CAAQ,EAAc,GAGpB,OAFA,KAAK,KAAO,EACZ,KAAK,MAAQ,GAAS,KAAK,MACpB,IACT,CAEA,GAAA,GACE,GAAmB,IAAf,KAAK,MACP,OAAO,KAAK,cACd,GAA0B,IAAf,KAAK,MACd,MAAM,KAAK,aAEf,CAEA,MAAI,GAAO,OAAO,KAAK,GAAI,CAC3B,QAAI,GAAS,OAAO,KAAK,KAAM,CAC/B,YAAI,GAAa,OAAO,KAAK,SAAU,CACvC,SAAI,GAAU,OAAO,KAAK,MAAO,CACjC,MAAI,GAAO,OAAO,KAAK,GAAI,CAC3B,QAAI,GAAS,OAAO,KAAK,KAAM,CAC/B,SAAI,GAAU,OAAO,KAAK,MAAO,CAEjC,eAAI,GAAgB,OAAuB,IAAhB,KAAK,MAA+B,CAC/D,YAAI,GAAa,OAAuB,IAAhB,KAAK,MAA4B,CACzD,UAAI,GAAW,OAAuB,IAAhB,KAAK,MAA6B,CACxD,aAAI,GAAc,OAAuB,IAAhB,KAAK,MAA6B,CAE3D,WAAM,GACgB,IAAhB,KAAK,cACH,KAAK,YAAY,MAAK,KAC1B,KAAK,OAAS,EACd,KAAK,QAAQ,WAAW,KAAI,GAEhC,CAEA,YAAM,GACgB,IAAhB,KAAK,SACT,KAAK,OAAS,QACR,KAAK,aAAa,MAAK,KAC3B,KAAK,QAAQ,YAAY,KAAI,IAEjC,CAEA,YAAM,CAAO,GACX,GAAmB,IAAf,KAAK,OAA8C,IAAf,KAAK,MAA7C,CACA,KAAK,OAAO,IAAI,gBAChB,IACM,QACI,QAAQ,KAAK,CAAC,KAAK,aAAc,IAAI,SAAS,GAAY,WAAW,EAAS,aAE9E,KAAK,YAEf,SACE,KAAK,OAAS,EACd,KAAK,QAAQ,cAAc,KAC7B,CAXgF,CAYlF,CAEA,IAAA,GACE,OAAO,KAAK,QACd,CAEA,KAAA,CAAM,EAAuB,GAC3B,GAAoB,IAAhB,KAAK,OACP,MAAM,IAAI,eAEQ,IAAhB,KAAK,SAGL,GACF,OAAO,OAAO,KAAK,QAAS,GAEzB,KAAK,QAAQ,OAAQ,KAAK,QAAQ,KAAO,cAC9C,KAAK,OAAS,EACd,KAAK,OAAS,EACd,KAAK,IAAM,KAAK,QAAQ,KAAM,MAC9B,KAAK,MAAQ,EAAS,GAAG,EAAO,QAAQ,KAAK,OAAS,KAAK,KAC3D,KAAK,QAAQ,UAAU,MACvB,KAAK,UAAU,MAAM,IACnB,KAAK,QAAQ,GACb,KAAK,OAAS,EACd,KAAK,cAAgB,EACrB,KAAK,QAAQ,YAAY,KAAM,EAAK,IAClC,IACF,KAAK,OAAO,GACZ,KAAK,cAAgB,EACF,IAAf,KAAK,QACP,KAAK,OAAS,EACd,KAAK,QAAQ,WAAW,KAAM,GAChC,IAEJ,CAEA,YAAA,CAAa,EAAuB,GAElC,OADA,KAAK,MAAM,EAAS,GACb,KAAK,MACd,CAEU,MAAA,CAAO,GACf,KAAK,QAAQ,WAAW,KAAM,GAC9B,KAAK,QAAQ,cAAc,EAC7B,CAEA,aAAA,CAAc,GAAqB,CAOnC,GAAA,CAAO,GACL,MAAM,EAAO,OAAO,OAAO,MACrB,EAAO,EAAK,KAKlB,OAJA,EAAK,KAAO,WAEV,OAAO,EAAK,KAAK,KAAV,GAAkB,MAAM,GAAM,EAAU,KAAK,KAAf,CAAqB,IAC5D,EACO,CACT,GAGoB,cAAf,cAAwC,SAAxC,WAAA,GAAA,SAAA,WACL,cAAA,KAAU,WAA0B,QAAQ,WAC5C,cAAA,KAAU,YAAW,SACrB,cAAA,KAAU,cAAa,SACvB,cAAA,KAAU,aAAY,QAAQ,CAMpB,UAAA,GAER,OADA,KAAK,OAAM,GACJ,IAAI,SAAS,IAClB,KAAK,WAAa,CAAA,GAEtB,CAEU,SAAA,GAKR,OAJA,KAAK,SAAW,IAAI,SAAS,IAC3B,KAAK,SAAW,CAAA,IAElB,KAAK,OAAM,GACJ,IAAI,SAAS,IAClB,KAAK,WAAa,CAAA,GAEtB,CAEU,UAAA,GAER,OADA,KAAK,WACE,IAAI,SAAS,IAClB,KAAK,UAAY,CAAA,GAErB,CAEA,aAAgB,GACd,OACE,IACE,GAAmB,IAAf,KAAK,MACP,MAAM,IAAI,qBAEN,KAAK,SAEX,KAAK,YAEL,aADqB,KAAK,SAE5B,OAAS,GACP,GAAI,KAAK,eAAe,GAAI,CAE1B,KAAK,aACL,QACF,CAKA,MAJoB,IAAhB,KAAK,QAEP,KAAK,aAED,CACR,CAEJ,GAGoB,UAAf,cAAoC,SAApC,WAAA,GAAA,SAAA,WACL,cAAA,KAAU,WAAwB,GAAC,CAEnC,aAAA,CAAc,GACZ,IAAI,EAAQ,EACR,EAAW,EACf,UAAW,KAAQ,KAAK,SACtB,GAAY,EAAK,SACjB,GAAS,EAAK,MAEhB,KAAK,OAAS,EACd,KAAK,UAAY,EACjB,KAAK,OAAO,EACd,CAEA,gBAAgB,SACR,QAAQ,IAAI,KAAK,SAAS,KAAK,GAAS,EAAK,WACrD,CAEA,eAAgB,SACR,QAAQ,IAAI,KAAK,SAAS,KAAK,GAAS,EAAK,UACrD,CAEA,gBAAgB,SACR,QAAQ,IAAI,KAAK,SAAS,KAAK,GAAS,EAAK,WACrD,CAEA,SAAM,CAAyB,GAAoB,sBAAE,EAAA,gBAAuB,GAAsG,CAAE,uBAAuB,EAAM,gBAAkB,GAAkB,KACnP,MAAM,EAAoB,GACpB,EAAkC,GACxC,UAAW,KAAQ,EAAO,CACxB,KAAK,SAAS,KAAK,GACnB,MAAM,EAAU,EAAK,aAAa,KAAK,QAAS,MAAM,OAAO,IAC3D,GAAI,GAAyB,aAAiB,eAC5C,MAAM,EAER,EAAO,KAAK,EAAK,IAEnB,EAAS,KAAK,EAChB,CACA,IACE,MAAM,QAAe,QAAQ,IAAI,GAEjC,GAAI,EAAO,OAAS,EAAG,CACrB,GAAsB,IAAlB,EAAO,OACT,MAAM,EAAO,GAEf,MAAM,EAAU,GACV,EAAa,IACjB,GAAI,aAAa,eACf,UAAW,KAAO,EAAE,OAClB,EAAU,GAGd,EAAQ,KAAK,EAAC,EAEhB,UAAW,KAAK,EACd,EAAU,GAEZ,MAAM,IAAI,eAAe,EAAS,IAAkB,GACtD,CACA,OAAO,CACT,OAAS,GAGP,GAAI,EACF,UAAW,KAAQ,EACb,EAAK,WACP,EAAK,SAAS,OAAO,IACnB,EAAO,KAAK,EAAC,IAKrB,MAAM,CACR,CACF,GAIW,YAAN,cAA6B,UAClC,WAAA,CAAY,EAAuB,EAA2B,EAAgB,CAAC,GAC7E,QADiC,KAAA,WAEjC,KAAK,QAAQ,EAAM,EACrB,CAEA,MAAA,CAAU,GACR,IACE,MAAM,EAAS,EAAK,SAAS,KAAK,KAAnB,GACf,OAAI,aAAkB,QACb,EAEF,QAAQ,QAAQ,EACzB,OAAS,GACP,OAAO,QAAQ,OAAO,EACxB,CACF,CAKA,KAAA,CAAS,GACP,GAAmB,IAAf,KAAK,MACP,MAAM,IAAI,MAAM,gBAGlB,OADA,KAAK,SAAS,KAAK,GACZ,EAAK,aAAa,KAAK,QAAS,KACzC,CAEU,OAAA,GACR,IACE,MAAM,EAAS,KAAK,SAAS,KAAK,KAAnB,GACf,OAAI,aAAkB,QACb,EAEF,QAAQ,QAAQ,EACzB,OAAS,GACP,OAAO,QAAQ,OAAO,EACxB,CACF,GAGK,SAAS,KAAQ,EAAc,EAA2B,EAAgB,CAAC,GAChF,OAAO,IAAI,YAAe,EAAM,EAAU,EAC5C","file":"/npm/@xmcl/task@4.1.1/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@xmcl/task@4.1.1/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * @module @xmcl/task\n */\nexport class CancelledError extends Error {\n  constructor() {\n    super('Cancelled')\n    this.name = 'CancelledError'\n  }\n}\n\nexport enum TaskState {\n  Idle,\n  Running,\n  Cancelled,\n  Paused,\n  Succeed,\n  Failed,\n}\n\nexport interface Task<T = any> {\n  readonly id: number\n  readonly name: string\n  readonly param: Record<string, any>\n  readonly progress: number\n  readonly total: number\n  readonly from: string | undefined\n  readonly to: string | undefined\n\n  readonly path: string\n  readonly isCancelled: boolean\n  readonly isPaused: boolean\n  readonly isDone: boolean\n  readonly isRunning: boolean\n  readonly state: TaskState\n\n  readonly context: TaskContext | undefined\n  readonly parent: Task<any> | undefined\n\n  pause(): Promise<void>\n  resume(): Promise<void>\n  cancel(timeout?: number): Promise<void>\n  start(context?: TaskContext, parent?: Task<any>): void\n  wait(): Promise<T>\n  startAndWait(context?: TaskContext, parent?: Task<any>): Promise<T>\n\n  onChildUpdate(chunkSize: number): void\n\n  map<N>(transform: Transform<this, N>): Task<N extends Promise<infer R> ? R : N>\n\n  setName(name: string, param?: Record<string, any>): this\n}\n\nexport interface Transform<T, N> {\n  (this: T, value: T): N\n}\n\nexport interface TaskContext {\n  fork?(task: Task<any>): number\n  onStart?(task: Task<any>): void\n  onUpdate?(task: Task<any>, chunkSize: number): void\n  onFailed?(task: Task<any>, error: any): void\n  onSucceed?(task: Task<any>, result: any): void\n  onPaused?(task: Task<any>): void\n  onResumed?(task: Task<any>): void\n  onCancelled?(task: Task<any>): void\n}\n\nexport function createFork(): TaskContext['fork'] {\n  let id = 0\n  return () => id++\n}\n\nexport abstract class BaseTask<T> implements Task<T> {\n  protected _state: TaskState = TaskState.Idle\n  protected _promise: Promise<T>\n\n  protected resolve!: (value: T) => void\n  protected reject!: (err: any) => void\n\n  protected _from: string | undefined\n  protected _to: string | undefined\n  protected _progress = 0\n  protected _total = -1\n  protected _path = ''\n  protected _id = 0\n\n  parent: Task<any> | undefined\n  context: TaskContext = {}\n\n  name = ''\n  param: object = {}\n\n  protected resultOrError: T | any\n\n  constructor() {\n    this._promise = new Promise((resolve, reject) => {\n      this.resolve = resolve\n      this.reject = reject\n    })\n  }\n\n  setName(name: string, param?: object) {\n    this.name = name\n    this.param = param || this.param\n    return this\n  }\n\n  get(): T | void {\n    if (this.state === TaskState.Succeed) {\n      return this.resultOrError\n    } else if (this.state === TaskState.Failed) {\n      throw this.resultOrError\n    }\n  }\n\n  get id() { return this._id }\n  get path() { return this._path }\n  get progress() { return this._progress }\n  get total() { return this._total }\n  get to() { return this._to }\n  get from() { return this._from }\n  get state() { return this._state }\n\n  get isCancelled() { return this._state === TaskState.Cancelled }\n  get isPaused() { return this._state === TaskState.Paused }\n  get isDone() { return this._state === TaskState.Succeed }\n  get isRunning() { return this._state === TaskState.Running }\n\n  async pause() {\n    if (this._state !== TaskState.Running) { return }\n    await this.pauseTask().then(() => {\n      this._state = TaskState.Paused\n      this.context.onPaused?.(this)\n    })\n  }\n\n  async resume() {\n    if (this._state !== TaskState.Paused) { return }\n    this._state = TaskState.Running\n    await this.resumeTask().then(() => {\n      this.context.onResumed?.(this)\n    })\n  }\n\n  async cancel(timeout?: number) {\n    if (this.state !== TaskState.Running && this.state !== TaskState.Idle) { return }\n    this.reject(new CancelledError())\n    try {\n      if (timeout) {\n        await Promise.race([this.cancelTask(), new Promise((resolve) => setTimeout(resolve, timeout))])\n      } else {\n        await this.cancelTask()\n      }\n    } finally {\n      this._state = TaskState.Cancelled\n      this.context.onCancelled?.(this)\n    }\n  }\n\n  wait() {\n    return this._promise\n  }\n\n  start(context?: TaskContext, parent?: Task<any>) {\n    if (this._state === TaskState.Cancelled) {\n      throw new CancelledError()\n    }\n    if (this._state !== TaskState.Idle) {\n      return\n    }\n    if (context) {\n      Object.assign(this.context, context)\n    }\n    if (!this.context.fork) { this.context.fork = createFork() }\n    this.parent = parent\n    this._state = TaskState.Running\n    this._id = this.context.fork!(this)\n    this._path = parent ? `${parent.path}.${this.name}` : this.name\n    this.context.onStart?.(this)\n    this.runTask().then((value) => {\n      this.resolve(value)\n      this._state = TaskState.Succeed\n      this.resultOrError = value\n      this.context.onSucceed?.(this, value)\n    }, (error) => {\n      this.reject(error)\n      this.resultOrError = error\n      if (this.state !== TaskState.Cancelled) {\n        this._state = TaskState.Failed\n        this.context.onFailed?.(this, error)\n      }\n    })\n  }\n\n  startAndWait(context?: TaskContext, parent?: Task<any>) {\n    this.start(context, parent)\n    return this.wait()\n  }\n\n  protected update(chunkSize: number) {\n    this.context.onUpdate?.(this, chunkSize)\n    this.parent?.onChildUpdate(chunkSize)\n  }\n\n  onChildUpdate(chunkSize: number) { }\n\n  protected abstract runTask(): Promise<T>\n  protected abstract cancelTask(): Promise<void>\n  protected abstract pauseTask(): Promise<void>\n  protected abstract resumeTask(): Promise<void>\n\n  map<N>(transform: Transform<this, N>): Task<N extends Promise<infer R> ? R : N> {\n    const copy = Object.create(this)\n    const wait = copy.wait\n    copy.wait = function (this: typeof copy) {\n      // @ts-expect-error\n      return wait.bind(this)().then((r) => transform.bind(this)(r))\n    }\n    return copy\n  }\n}\n\nexport abstract class AbortableTask<T> extends BaseTask<T> {\n  protected _pausing: Promise<void> = Promise.resolve()\n  protected _unpause = () => { }\n  protected _onAborted = () => { }\n  protected _onResume = () => { }\n\n  protected abstract process(): Promise<T>\n  protected abstract abort(isCancelled: boolean): void\n  protected abstract isAbortedError(e: any): boolean\n\n  protected cancelTask(): Promise<void> {\n    this.abort(true)\n    return new Promise((resolve) => {\n      this._onAborted = resolve\n    })\n  }\n\n  protected pauseTask(): Promise<void> {\n    this._pausing = new Promise((resolve) => {\n      this._unpause = resolve\n    })\n    this.abort(false)\n    return new Promise((resolve) => {\n      this._onAborted = resolve\n    })\n  }\n\n  protected resumeTask(): Promise<void> {\n    this._unpause()\n    return new Promise((resolve) => {\n      this._onResume = resolve\n    })\n  }\n\n  protected async runTask() {\n    while (true) {\n      try {\n        if (this.state === TaskState.Cancelled) {\n          throw new CancelledError()\n        }\n        await this._pausing\n        // notify resume task method\n        this._onResume()\n        const result = await this.process()\n        return result\n      } catch (e) {\n        if (this.isAbortedError(e)) {\n          // notify pauseTask method\n          this._onAborted()\n          continue\n        }\n        if (this._state === TaskState.Cancelled) {\n          // notify cancelTask method\n          this._onAborted()\n        }\n        throw e\n      }\n    }\n  }\n}\n\nexport abstract class TaskGroup<T> extends BaseTask<T> {\n  protected children: Task<any>[] = []\n\n  onChildUpdate(chunkSize: number) {\n    let total = 0\n    let progress = 0\n    for (const task of this.children) {\n      progress += task.progress\n      total += task.total\n    }\n    this._total = total\n    this._progress = progress\n    this.update(chunkSize)\n  }\n\n  protected async cancelTask(): Promise<void> {\n    await Promise.all(this.children.map((task) => task.cancel()))\n  }\n\n  protected async pauseTask(): Promise<void> {\n    await Promise.all(this.children.map((task) => task.pause()))\n  }\n\n  protected async resumeTask(): Promise<void> {\n    await Promise.all(this.children.map((task) => task.resume()))\n  }\n\n  async all<T extends Task<any>>(tasks: Iterable<T>, { throwErrorImmediately, getErrorMessage }: { throwErrorImmediately?: boolean; getErrorMessage?: (errors: any[]) => string } = { throwErrorImmediately: true, getErrorMessage: (errors: any[]) => '' }): Promise<(T extends Task<infer R> ? R : never)[]> {\n    const errors: unknown[] = []\n    const promises: Promise<any | void>[] = []\n    for (const task of tasks) {\n      this.children.push(task)\n      const promise = task.startAndWait(this.context, this).catch((error) => {\n        if (throwErrorImmediately || error instanceof CancelledError) {\n          throw error\n        }\n        errors.push(error)\n      })\n      promises.push(promise)\n    }\n    try {\n      const result = await Promise.all(promises)\n      // if not throwErrorImmediately, we still need to check if other task failed\n      if (errors.length > 0) {\n        if (errors.length === 1) {\n          throw errors[0]\n        }\n        const flatten = [] as Error[]\n        const flatError = (e: any) => {\n          if (e instanceof AggregateError) {\n            for (const err of e.errors) {\n              flatError(err)\n            }\n          }\n          flatten.push(e)\n        }\n        for (const e of errors) {\n          flatError(e)\n        }\n        throw new AggregateError(flatten, getErrorMessage?.(errors))\n      }\n      return result\n    } catch (e) {\n      // if throwErrorImmediately\n      // force cancel all other tasks\n      if (throwErrorImmediately) {\n        for (const task of tasks) {\n          if (task.isRunning) {\n            task.cancel().catch((e) => {\n              errors.push(e)\n            })\n          }\n        }\n      }\n      throw e\n    }\n  }\n}\n\nexport type TaskExecutor<T> = (this: TaskRoutine<any>) => Promise<T> | T\nexport class TaskRoutine<T> extends TaskGroup<T> {\n  constructor(name: string, readonly executor: TaskExecutor<T>, param: object = {}) {\n    super()\n    this.setName(name, param)\n  }\n\n  concat<T>(task: TaskRoutine<T>): Promise<T> {\n    try {\n      const result = task.executor.bind(this)()\n      if (result instanceof Promise) {\n        return result\n      }\n      return Promise.resolve(result)\n    } catch (e) {\n      return Promise.reject(e)\n    }\n  }\n\n  /**\n     * Yield a new child task to this routine\n     */\n  yield<T>(task: Task<T>): Promise<T> {\n    if (this.state !== TaskState.Running) {\n      throw new Error('IllegalState')\n    }\n    this.children.push(task)\n    return task.startAndWait(this.context, this)\n  }\n\n  protected runTask(): Promise<T> {\n    try {\n      const result = this.executor.bind(this)()\n      if (result instanceof Promise) {\n        return result\n      }\n      return Promise.resolve(result)\n    } catch (e) {\n      return Promise.reject(e)\n    }\n  }\n}\n\nexport function task<T>(name: string, executor: TaskExecutor<T>, param: object = {}): TaskRoutine<T> {\n  return new TaskRoutine<T>(name, executor, param)\n}\n"]}