UNPKG

taozen

Version:

一个轻量级的任务管理库

250 lines (249 loc) 7.41 kB
import { TaoConfig, TaoEvent, TaoEventListener, TaoStatus, ZenExecutor, ZenInput, ZenRetryConfig, ZenState, ZenStatus } from "./type"; import { Zen } from "./Zen"; export interface TaoRuntimeState { name: string; description?: string; status: TaoStatus; progress: number; paused: boolean; executionTime?: number; startTime?: number; zens: { id: string; name: string; status: ZenStatus; error?: string; result?: any; startTime?: number; }[]; } export interface TaoState { taos: Record<string, TaoRuntimeState>; states: Record<string, Record<string, ZenState>>; events: Record<string, TaoEvent[]>; } export declare class Tao { private config; private static store; static use: <T = TaoState>(selector?: (state: TaoState) => T) => T; static current(): TaoState; private zens; private eventListeners; private abortController; private pausePromise?; private pauseResolve?; private hasRun; private id?; private status; private startTime?; private runningZens; private static instances; private cleanupFunctions; private static maxConcurrentTaos; private static runningTaos; /** * 创建任务实例 * @param config - 任务配置 */ constructor(config: TaoConfig); /** * 注册任务到存储 * @returns Tao - 返回任务实例 * @throws Error - 如果任务已注册则抛出错误 */ register(): Tao; /** * 从存储中移除任务 * @throws Error - 如果任务未注册则抛出错误 */ remove(): void; /** * 清理任务资源 * 包括: * 1. 取消所有运行中的步骤 * 2. 清理事件监听器 * 3. 清理步骤资源 * 4. 重置运行时状态 * 5. 执行注册的清理函数 */ private dispose; /** * 获取任务ID * @returns string - 任务ID * @throws Error - 如果任务未注册则抛出错误 */ getId(): string | undefined; /** * 创建新的任务步骤 * @template TOutput - 输出结果类型 * @param name - 步骤名称 * @returns Zen - 创建的步骤实例 */ zen<TOutput = any>(name: string): Zen<ZenInput, TOutput>; set description(description: string); /** * 执行整个任务流程 * @returns Promise<Map<string, any>> - 所有步骤的执行结果 * @throws Error - 任务执行失败时抛出错误 */ run(): Promise<Map<string, any>>; /** * 暂停任务执行 * @returns Promise<void> */ pause(): Promise<void>; /** * 恢复已暂停的任务 * @returns Promise<void> */ resume(): Promise<void>; /** * 取消任务执行 * @returns Promise<void> */ cancel(): Promise<void>; /** * 注册事件监听器 * @param listener - 事件处理函数 * @returns () => void - 用于移除监听器的函数 */ on(listener: TaoEventListener): () => void; onFinish(listener: () => void): () => void; /** * 发出任务事件 * 将事件通知所有注册的监听器 * @param event - 事件角色 */ emit(event: TaoEvent): void; /** * 为特定步骤注册事件监听器 * @param zenId - 步骤ID * @param listener - 事件处理函数 * @returns () => void - 用于移除监听器的函数 */ onZen(zenId: string, listener: (event: TaoEvent) => void): () => void; /** * 获取任务名称 * @returns string - 任务名称 */ getName(): string; /** * 获取所有步骤的状态 */ getAllZenStates(): Record<string, ZenState>; /** * 获取任务执行进度 */ getProgress(): number; /** * 获取任务状态 * @returns 'pending' | 'running' | 'completed' | 'failed' | 'cancelled' | 'paused' - 任务状态 */ getStatus(): TaoStatus; /** * 获取任务执行时间 * 计算从第一个步骤开始到最后一个步骤结束的时间 */ getExecutionTime(): number | undefined; /** * 获取所有步骤的错误信息 */ getErrors(): Map<string, Error>; /** * 根据ID获取步骤实例 * @param id - 步骤ID * @returns Zen<any, any> - 步骤实例 * @throws Error - 如果步骤不存在则抛出错误 */ getZenById(id: string): Zen<any, any>; /** * 根据名称获取步骤实例 * @param name - 步骤名称 * @returns Zen<any, any> | undefined - 步骤实例,如果不存在则返回undefined */ getZenByName(name: string): Zen<any, any> | undefined; /** * 根据条件查找步骤实例 * @param predicate - 查找条件函数 * @returns Zen<any, any> | undefined - 符合条件的步骤实例,如果不存在则返回undefined */ findZen(predicate: (zen: Zen<any, any>) => boolean): Zen<any, any> | undefined; /** * 获取任务的依赖关系树 * @param zenId - 步骤ID * @returns Array - 包含步骤ID和其依赖的数组 */ getDependencyTree(zenId: string): { id: string; dependencies: string[]; }[]; /** * 执行单个步骤 * @param zen - 要执行的步骤实例 * @returns Promise<any> - 步骤执行结果 */ private executeZen; /** * 计算步骤的执行顺序 * 使用拓扑排序算法,将步骤按依赖关系分组 * @returns string[][] - 按批次分组的步骤ID数组 * @throws Error - 如果存在循环依赖则抛出错误 */ private getExecutionOrder; /** * 获取任务的运行时状态 */ getRuntimeState(): TaoRuntimeState; /** * 快速执行单个任务 * 创建一个只包含单个步骤的任务并执行 * @param name - 任务名称 * @param executor - 执行函数 * @param options - 可选配置项 * @returns Promise<any> - 执行结果 */ static run<T = any>(name: string, executor: ZenExecutor<ZenInput, T>, options?: { retry?: ZenRetryConfig; timeout?: number; onEvent?: TaoEventListener; onCancel?: () => void; register?: boolean; }): Promise<T>; /** * 暂停指定的任务 * @param taoId - 任务ID * @returns Promise<boolean> - 是否成功暂停 */ static pause(taoId: string): Promise<boolean>; /** * 恢复指定的任务 * @param taoId - 任务ID * @returns Promise<boolean> - 是否成功恢复 */ static resume(taoId: string): Promise<boolean>; /** * 取消指定的任务 * @param taoId - 任务ID * @returns Promise<boolean> - 是否成功取消 */ static cancel(taoId: string): Promise<boolean>; /** * 重试指定的任务 * @param taoId - 任务ID * @returns Promise<boolean> - 是否成功开始重试 */ static retry(taoId: string): Promise<boolean>; /** * 从存储中移除指定的任务 * @param taoId - 任务ID * @returns boolean - 是否成功移除 */ static remove(taoId: string): boolean; private updateStatus; private handleZenError; /** * 重试任务 * @returns Promise<Map<string, any>> - 所有步骤的执行结果 */ retry(): Promise<Map<string, any>>; }