UNPKG

@bitblit/ratchet-epsilon-common

Version:

Tiny adapter to simplify building API gateway Lambda APIS

69 lines 3.26 kB
import { RequireRatchet } from '@bitblit/ratchet-common/lang/require-ratchet'; import { ErrorRatchet } from '@bitblit/ratchet-common/lang/error-ratchet'; import { StringRatchet } from '@bitblit/ratchet-common/lang/string-ratchet'; import { DateTime } from 'luxon'; export class CronUtil { static everyNMinuteFilter(n) { return CronUtil.everyNElementFilter(n, 60); } static everyNDaysOfYearFilter(n) { return CronUtil.everyNElementFilter(n, 365); } static everyNElementFilter(n, m) { RequireRatchet.notNullOrUndefined(n); RequireRatchet.notNullOrUndefined(m); const half = Math.floor(m / 2); if (!n || n < 2 || n > half || m % n !== 0) { ErrorRatchet.throwFormattedErr('Invalid config - this function only makes sense for 2 < N < %d and %d evenly divisible by N', half, m); throw new Error('Invalid config - this function only makes sense for 2 < N < 31 and 60 evenly divisible by N'); } const rval = []; for (let i = 0; i < 60; i += n) { rval.push(i); } return rval; } static numberMatchesFilter(num, filter) { return !filter || filter.length === 0 || filter.includes(num); } static eventMatchesEntry(event, entry, cfg, testTimeEpochMS = new Date().getTime()) { let rval = false; if (!!event && !!entry && !!cfg.timezone) { if (!!event.resources && event.resources.length > 0) { const eventSourceName = event.resources[0]; const targetTZ = StringRatchet.trimToNull(entry.overrideTimezone) || cfg.timezone; const nowInTZ = DateTime.fromMillis(testTimeEpochMS).setZone(targetTZ); rval = !entry.eventFilter || entry.eventFilter.test(eventSourceName); rval = rval && CronUtil.numberMatchesFilter(nowInTZ.minute, entry.minuteFilter); rval = rval && CronUtil.numberMatchesFilter(nowInTZ.hour, entry.hourFilter); rval = rval && CronUtil.numberMatchesFilter(nowInTZ.weekday, entry.dayOfWeekFilter); rval = rval && CronUtil.numberMatchesFilter(nowInTZ.day, entry.dayOfMonthFilter); rval = rval && CronUtil.numberMatchesFilter(nowInTZ.month, entry.monthOfYearFilter); rval = rval && (!entry.contextMatchFilter || entry.contextMatchFilter.test(StringRatchet.trimToEmpty(cfg.context))); rval = rval && (!entry.contextNoMatchFilter || !entry.contextNoMatchFilter.test(StringRatchet.trimToEmpty(cfg.context))); } } return rval; } static cronEntryName(entry, idx = null) { RequireRatchet.notNullOrUndefined(entry); let rval = null; if (entry) { rval = entry.name; rval = rval || entry['backgroundTaskType']; if (!rval && !!entry['directHandler']) { if (idx) { rval = 'Direct Entry ' + idx; } else { rval = 'Direct Entry (No idx specified)'; } } } else { rval = 'ERROR: no entry passed'; } return rval; } } //# sourceMappingURL=cron-util.js.map