@kwiz/common
Version:
KWIZ common utilities and helpers for M365 platform
103 lines • 3.93 kB
JavaScript
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