taozen
Version:
一个轻量级的任务管理库
250 lines (249 loc) • 7.41 kB
TypeScript
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>>;
}