UNPKG

@kwiz/common

Version:

KWIZ common utilities and helpers for M365 platform

103 lines 3.93 kB
import { firstOrNull, sortNumberArrayAsc } from "../collections.base"; import { cloneDate } from "../date"; import { padLeft } from "../strings"; import { isNotEmptyArray, isNullOrUndefined } from "../typecheckers"; export var ScheduleTypes; (function (ScheduleTypes) { ScheduleTypes["hourly"] = "hourly"; ScheduleTypes["daily"] = "daily"; ScheduleTypes["weekly"] = "weekly"; })(ScheduleTypes || (ScheduleTypes = {})); export const ScheduleTypesDefinitions = { weekly: { value: ScheduleTypes.weekly, title: "Run on specific days, at specific times" }, daily: { value: ScheduleTypes.daily, title: "Run every day, at specific times" }, hourly: { value: ScheduleTypes.hourly, title: "Run every few hours" } }; export const defaultWeeklySchedule = { ScheduleType: ScheduleTypes.weekly, days: [1, 2, 3, 4, 5], hours: [0] }; export const defaultDailySchedule = { ScheduleType: ScheduleTypes.daily, hours: [0, 12] }; export const defaultHourlySchedule = { ScheduleType: ScheduleTypes.hourly, interval: 4 }; export function isValidSchedule(schedule) { if (isNullOrUndefined(schedule)) return false; if (schedule.ScheduleType === ScheduleTypes.hourly) return schedule.interval > 0 && schedule.interval <= 12; else if (schedule.ScheduleType === ScheduleTypes.daily) { return isNotEmptyArray(schedule.hours) && schedule.hours.every(h => h >= 0 && h <= 23); } else if (schedule.ScheduleType === ScheduleTypes.weekly) { return isNotEmptyArray(schedule.hours) && schedule.hours.every(h => h >= 0 && h <= 23) && isNotEmptyArray(schedule.days) && schedule.days.every(d => d >= 0 && d <= 6); } else return false; } /** returns a yyyyMMddHH for the next time this schedule needs to run after the currentDate */ export function getNextUTC(currentDate, schedule) { if (!isValidSchedule(schedule)) return "9999999999"; currentDate = cloneDate(currentDate); let date = currentDate.getUTCDate(); let hour = currentDate.getUTCHours(); let day = currentDate.getUTCDay(); //adjust date based on selected schedule if (schedule.ScheduleType === ScheduleTypes.hourly) { hour += schedule.interval; currentDate.setUTCHours(hour); } else if (schedule.ScheduleType === ScheduleTypes.daily) { //get current hour, see if the next run is today or tomorrow let sortedHours = schedule.hours.sort(sortNumberArrayAsc); let nextHour = firstOrNull(sortedHours.filter(h => h > hour)); if (nextHour !== null) { currentDate.setUTCHours(nextHour); } else { //tomorrow at the first scheduled hour currentDate.setUTCHours(sortedHours[0]); currentDate.setUTCDate(date + 1); } } else { //implement weekly let sortedDays = schedule.days.sort(sortNumberArrayAsc); let sortedHours = schedule.hours.sort(sortNumberArrayAsc); let nextHour = firstOrNull(sortedHours.filter(h => h > hour)); let nextDay = firstOrNull(sortedDays.filter(h => h > day)); if (sortedDays.includes(day) && nextHour !== null) //today is allowed { currentDate.setUTCHours(nextHour); } else //move to next allowed day, at first hour allowed { let daysToAdd = nextDay === null ? 7 - day + sortedDays[0] : nextDay - day; currentDate.setUTCHours(sortedHours[0]); currentDate.setUTCDate(date + daysToAdd); } } return getUTCDateMarker(currentDate); } export function getUTCDateMarker(date) { return `${date.getUTCFullYear()}${padLeft(date.getUTCMonth() + 1, 2)}${padLeft(date.getUTCDate(), 2)}${padLeft(date.getUTCHours(), 2)}`; } //# sourceMappingURL=scheduler.js.map