import type { WorkerPool } from "../../packages"; import type { IAbstractService } from "./abstract.service"; import type { NDiscoveryService } from "./discovery.service"; export interface ITaskScheduler< K = string, V extends NTaskScheduler.Task = NTaskScheduler.Task > { on( event: "first", listener: (key: K, val: NTaskScheduler.TimePayload) => void ): void; on( event: "next", listener: (key: K, val: NTaskScheduler.TimePayload) => void ): void; on( event: "success", listener: (key: K, val?: NTaskScheduler.OnSuccess) => void ): void; on( event: "error", listener: (key: K, val?: NTaskScheduler.OnError) => void ): void; on(event: "delete", listener: (key: K) => void): void; on(event: string | symbol, listener: (...args: any[]) => void): void; once(event: string | symbol, listener: (...args: any[]) => void): void; removeListener( event: string | symbol, listener: (...args: any[]) => void ): void; set(key: K, value: V): this; get(key: K): V | undefined; delete(key: K): boolean; destroy(): void; } export namespace NTaskScheduler { export type Event = "set" | "success" | "error" | "delete" | "next" | "first"; export type PeriodKind = | "minutely" | "hourly" | "daily" | "weekly" | "monthly" | "yearly" | "interval" | "disposable"; type DateStructure = { seconds: number; minutes: number; hours: number; days: number; month: number; weeklyDay: number; }; interface ISchedulerKind { kind: PeriodKind; } interface MinutelyKind extends ISchedulerKind { kind: "minutely"; time: Pick; } interface HourlyKind extends ISchedulerKind { kind: "hourly"; time: Pick; } interface DailyKind extends ISchedulerKind { kind: "daily"; time: Pick; } export type WeeklyStructure = Pick< DateStructure, "seconds" | "minutes" | "hours" | "weeklyDay" >; interface WeeklyKind extends ISchedulerKind { kind: "weekly"; time: WeeklyStructure; } interface MonthlyKind extends ISchedulerKind { kind: "monthly"; time: Pick; } type YearStructure = Pick< DateStructure, "seconds" | "minutes" | "hours" | "days" | "month" >; interface YearlyKind extends ISchedulerKind { kind: "yearly"; time: YearStructure; } interface IntervalKind extends ISchedulerKind { kind: "interval"; time: Pick; } interface DisposableKind extends ISchedulerKind { kind: "disposable"; time: YearStructure; } type TimeKind = | MinutelyKind | HourlyKind | DailyKind | WeeklyKind | MonthlyKind | YearlyKind | IntervalKind | DisposableKind; export type SchedulerOptions = { workers?: WorkerPool.WorkerPoolOptions; periodicity?: number; }; export type Task = { args?: any; job: (...args: any[]) => any; time: TimeKind; }; export type TimePayload = { timestamp: number; date: Date; kind: TimeKind; }; export type OnError = { task: Task; time: Date; message: T; }; export type OnSuccess = { task: Task; time: Date; result: T; }; } export interface ITaskService extends IAbstractService { on( event: "first", listener: (key: K, val: NTaskScheduler.TimePayload) => void ): void; on( event: "next", listener: (key: K, val: NTaskScheduler.TimePayload) => void ): void; on( event: "success", listener: (key: K, val?: NTaskScheduler.OnSuccess) => void ): void; on( event: "error", listener: (key: K, val?: NTaskScheduler.OnError) => void ): void; on(event: "delete", listener: (key: K) => void): void; on(event: string | symbol, listener: (...args: any[]) => void): void; off(event: string | symbol, listener: (...args: any[]) => void): void; once(event: string | symbol, listener: (...args: any[]) => void): void; removeListener( event: string | symbol, listener: (...args: any[]) => void ): void; set(key: K, value: NTaskScheduler.Task): ITaskScheduler; get(key: K): NTaskScheduler.Task | undefined; delete(key: K): boolean; destroy(): void; } export namespace NTaskService { export type Config = Pick< NDiscoveryService.CoreConfig["services"]["scheduler"], "enable" | "maxTask" | "periodicity" | "workers" >; }