2025-09-06 13:36:04 +00:00
|
|
|
import type { ITaskStep } from './taskbuffer.classes.taskstep.js';
|
2026-02-15 12:20:01 +00:00
|
|
|
import type { Task } from './taskbuffer.classes.task.js';
|
|
|
|
|
|
2026-02-15 21:51:55 +00:00
|
|
|
export interface IRateLimitConfig {
|
|
|
|
|
maxPerWindow: number; // max completions allowed within the sliding window
|
|
|
|
|
windowMs: number; // sliding window duration in ms
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export type TResultSharingMode = 'none' | 'share-latest';
|
|
|
|
|
|
2026-02-15 12:20:01 +00:00
|
|
|
export interface ITaskConstraintGroupOptions<TData extends Record<string, unknown> = Record<string, unknown>> {
|
|
|
|
|
name: string;
|
2026-02-15 15:15:37 +00:00
|
|
|
constraintKeyForExecution: (task: Task<any, any, TData>, input?: any) => string | null | undefined;
|
2026-02-15 12:20:01 +00:00
|
|
|
maxConcurrent?: number; // default: Infinity
|
|
|
|
|
cooldownMs?: number; // default: 0
|
2026-02-15 15:15:37 +00:00
|
|
|
shouldExecute?: (task: Task<any, any, TData>, input?: any) => boolean | Promise<boolean>;
|
2026-02-15 21:51:55 +00:00
|
|
|
rateLimit?: IRateLimitConfig;
|
|
|
|
|
resultSharingMode?: TResultSharingMode; // default: 'none'
|
2026-02-15 15:15:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface ITaskExecution<TData extends Record<string, unknown> = Record<string, unknown>> {
|
|
|
|
|
task: Task<any, any, TData>;
|
|
|
|
|
input: any;
|
2026-02-15 12:20:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface IConstrainedTaskEntry {
|
|
|
|
|
task: Task<any, any, any>;
|
|
|
|
|
input: any;
|
|
|
|
|
deferred: import('@push.rocks/smartpromise').Deferred<any>;
|
2026-02-15 15:15:37 +00:00
|
|
|
constraintKeys: Map<string, string>; // groupName -> key
|
2026-02-15 12:20:01 +00:00
|
|
|
}
|
2025-09-06 13:36:04 +00:00
|
|
|
|
|
|
|
|
export interface ITaskMetadata {
|
|
|
|
|
name: string;
|
|
|
|
|
version?: string;
|
|
|
|
|
status: 'idle' | 'running' | 'completed' | 'failed';
|
|
|
|
|
steps: ITaskStep[];
|
|
|
|
|
currentStep?: string;
|
|
|
|
|
currentProgress: number; // 0-100
|
|
|
|
|
lastRun?: Date;
|
|
|
|
|
nextRun?: Date; // For scheduled tasks
|
|
|
|
|
runCount: number;
|
|
|
|
|
averageDuration?: number;
|
|
|
|
|
cronSchedule?: string;
|
|
|
|
|
buffered?: boolean;
|
|
|
|
|
bufferMax?: number;
|
|
|
|
|
timeout?: number;
|
2026-01-25 23:29:00 +00:00
|
|
|
lastError?: string;
|
|
|
|
|
errorCount?: number;
|
2026-01-26 00:39:30 +00:00
|
|
|
labels?: Record<string, string>;
|
2025-09-06 13:36:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface ITaskExecutionReport {
|
|
|
|
|
taskName: string;
|
|
|
|
|
startTime: number;
|
|
|
|
|
endTime: number;
|
|
|
|
|
duration: number;
|
|
|
|
|
steps: ITaskStep[];
|
|
|
|
|
stepsCompleted: string[];
|
|
|
|
|
progress: number;
|
|
|
|
|
result?: any;
|
|
|
|
|
error?: Error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface IScheduledTaskInfo {
|
|
|
|
|
name: string;
|
|
|
|
|
schedule: string;
|
|
|
|
|
nextRun: Date;
|
|
|
|
|
lastRun?: Date;
|
|
|
|
|
steps?: ITaskStep[];
|
|
|
|
|
metadata?: ITaskMetadata;
|
2026-01-26 00:39:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export type TTaskEventType = 'started' | 'step' | 'completed' | 'failed';
|
|
|
|
|
|
|
|
|
|
export interface ITaskEvent {
|
|
|
|
|
type: TTaskEventType;
|
|
|
|
|
task: ITaskMetadata;
|
|
|
|
|
timestamp: number;
|
|
|
|
|
stepName?: string; // present when type === 'step'
|
|
|
|
|
error?: string; // present when type === 'failed'
|
2025-09-06 13:36:04 +00:00
|
|
|
}
|