timed-silky
Version:
Timed-Silky 是基于一款基于 TypeScript 的定时任务调度器。得益于 TypeScript,Timed-Silky 可以用符合特定句式的自然语言描述任务的调度规则,提供丝滑的链式调用接口。
134 lines (133 loc) • 5.16 kB
TypeScript
import { DayOfWeekNum, TimePoint } from "./time-type";
declare abstract class Head {
nextRule?: Tail;
/**
* 设置 Head 对象连接的 Tail
* @param rule 可以连接到 Head 对象后面的 Tail 对象
*/
setNextRule(rule: Tail): void;
/**
* 生成下一个时间,用 Date 对象表示,保证返回的 Date 对象表示的时间点在当前时间之后,在 leftBoudar 之后
* @param leftBoundary 上一个时间点,或时间左界,如果类型为 number,则为毫秒表示的时间戳
*/
abstract generateNextTime(leftBoundary: number | Date): Date;
}
interface Tail {
/**
* 调整 Date 对象表示的时间,使其落在合适的范围内
* @param dt 被调整的 Date 对象
* @param keepPoint 是否保持时间点(时分秒)不变
*/
adjustTime(dt: Date, keepPoint: boolean): Date;
}
/**
* 固定时间点规则,例如每天的 21:30,周六的 22:00
*/
declare class TimePointRule extends Head {
private points;
constructor(points: TimePoint | TimePoint[]);
addPoint(point: TimePoint): this;
addPoints(points: TimePoint[]): this;
/**
* 根据上一个时间点计算出下一个合法的时间点
* @param leftBoundary 上一个时间点
* @returns 下一个合法的时间点,下一个时间点和上一个时间点可能时分秒相同但个属于不同的天,也可能属于同一天,但是时分秒不同
*/
generateNextTime(leftBoundary: number | Date): Date;
}
/**
* 天级时间范围规则,例如周一至周五,周六,周天
*/
declare class DayRangeRule implements Tail {
/**
* 包含 7 个 boolean 值的数组,包含某天则对应的列表元素为 true,不包括则为 false
*/
private days;
/**
* @param _default 一周7天,每天是否默认,true 表示包括,false 表示不包括
*/
constructor(_default: boolean);
addDays(...days: DayOfWeekNum[]): void;
excludeDays(...days: DayOfWeekNum[]): void;
/**
* 如果需要,调整时间对象 dt,使其落在本规则规定的天内
* @param dt 需要被调整的时间
* @param keepPoint 是否保持之前的时分秒,如果 true,则调整过程不会改变时分秒,只会改变天
* @returns 被调整后的时间,可能等于被调整的时间
*/
adjustTime(dt: Date, keepPoint?: boolean): Date;
}
/**
* 小时级时间范围规则,分为所在范围,和排除范围
*/
declare class HourRangeRule implements Tail {
private includeOrExclude;
private rangeArrays;
constructor(includeOrExclude: boolean);
/**
* 添加时间段
* @param range 时间段,由两个 TimePoint 组成
* @param daysOfWeek 时间段所在天
*/
addRange(range: [TimePoint, TimePoint], ...daysOfWeek: DayOfWeekNum[]): void;
/**
* 将时间段添加到同属于某天(DayOfWeekNum)的列表
* @param range 时间段,由两个 TimePoint 组成
* @param day 时间段所在的天
*/
private _addRangeToOneDay;
/**
* 调整时间 dt,使其落在本规则规定的时间范围内
* @param dt 被调整的时间
* @returns 调整后的时间
*/
adjustTime(dt: Date): Date;
}
/**
* 频率规则,例如没多少天,多少小时,多少分钟,多少秒
*/
declare class Frequency extends Head {
count: number;
unitDuration: number;
/**
*
* @param count 多少个时间单位
* @param unitDuration 每个时间单位的时长(秒数)
*/
constructor(count: number, unitDuration: number);
/**
* 根据上一个时间、本规则规定频率以及当前时间产生下一个时间,但是保证产生的时间为未来时间
* @param lastTime 上一个时间
* @returns 根据上一个时间和本频率规则计算出的下一个时间
*/
generateNextTime(lastTime: number | Date): Date;
}
declare class SecondFrequency extends Frequency {
constructor(count: number);
}
declare class MinuteFrequency extends Frequency {
constructor(count?: number);
}
declare class HourFrequency extends Frequency {
constructor(count?: number);
}
declare class DayFrequency extends Frequency {
constructor(count?: number);
}
/**
* 规则链
* 内部至少包含一个 HeadRule 对象,该 HeadRule 可选的连接一个 TailRule 对象。
* 未来随着规则越来越复杂,一个规则链内部可以包含三个及以上规则对象。
*/
declare class RuleChain {
private headRule;
constructor(headRule: Head, tailRule?: Tail);
setTailRule(rule: Tail): void;
/**
*
* @param previousTime 上个时间,毫秒表示的时间戳
* @returns 下一个合法时间点,毫秒表示的时间戳
*/
generateNextTime(previousTime: number): number;
}
export { Head, Tail, RuleChain, TimePointRule, Frequency, SecondFrequency, MinuteFrequency, HourFrequency, DayFrequency, HourRangeRule, DayRangeRule, };