UNPKG

@kwiz/common

Version:

KWIZ common utilities and helpers for M365 platform

109 lines 4.5 kB
"use strict"; 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