@kwiz/common
Version:
KWIZ common utilities and helpers for M365 platform
109 lines • 4.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.defaultHourlySchedule = exports.defaultDailySchedule = exports.defaultWeeklySchedule = exports.ScheduleTypesDefinitions = exports.ScheduleTypes = void 0;
exports.isValidSchedule = isValidSchedule;
exports.getNextUTC = getNextUTC;
exports.getUTCDateMarker = getUTCDateMarker;
const collections_base_1 = require("../collections.base");
const date_1 = require("../date");
const strings_1 = require("../strings");
const typecheckers_1 = require("../typecheckers");
var ScheduleTypes;
(function (ScheduleTypes) {
ScheduleTypes["hourly"] = "hourly";
ScheduleTypes["daily"] = "daily";
ScheduleTypes["weekly"] = "weekly";
})(ScheduleTypes || (exports.ScheduleTypes = ScheduleTypes = {}));
exports.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"
}
};
exports.defaultWeeklySchedule = {
ScheduleType: ScheduleTypes.weekly,
days: [1, 2, 3, 4, 5],
hours: [0]
};
exports.defaultDailySchedule = {
ScheduleType: ScheduleTypes.daily,
hours: [0, 12]
};
exports.defaultHourlySchedule = {
ScheduleType: ScheduleTypes.hourly,
interval: 4
};
function isValidSchedule(schedule) {
if ((0, typecheckers_1.isNullOrUndefined)(schedule))
return false;
if (schedule.ScheduleType === ScheduleTypes.hourly)
return schedule.interval > 0 && schedule.interval <= 12;
else if (schedule.ScheduleType === ScheduleTypes.daily) {
return (0, typecheckers_1.isNotEmptyArray)(schedule.hours) && schedule.hours.every(h => h >= 0 && h <= 23);
}
else if (schedule.ScheduleType === ScheduleTypes.weekly) {
return (0, typecheckers_1.isNotEmptyArray)(schedule.hours) && schedule.hours.every(h => h >= 0 && h <= 23)
&& (0, typecheckers_1.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 */
function getNextUTC(currentDate, schedule) {
if (!isValidSchedule(schedule))
return "9999999999";
currentDate = (0, date_1.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(collections_base_1.sortNumberArrayAsc);
let nextHour = (0, collections_base_1.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(collections_base_1.sortNumberArrayAsc);
let sortedHours = schedule.hours.sort(collections_base_1.sortNumberArrayAsc);
let nextHour = (0, collections_base_1.firstOrNull)(sortedHours.filter(h => h > hour));
let nextDay = (0, collections_base_1.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);
}
function getUTCDateMarker(date) {
return `${date.getUTCFullYear()}${(0, strings_1.padLeft)(date.getUTCMonth() + 1, 2)}${(0, strings_1.padLeft)(date.getUTCDate(), 2)}${(0, strings_1.padLeft)(date.getUTCHours(), 2)}`;
}
//# sourceMappingURL=scheduler.js.map