Add cron trigger table (#14110)
This Pr begins the extensibility journey - adds a `core.cronTrigger` table - add a oneToMany relation between core.serverlessFunction and `core.cronTrigger` (one serverlessFunction can be triggered by multiple cronTriggers) - add a job to trigger a serverless function - adds a cron to trigger serverlessFunction (via the trigger job) based on the core.cronTrigger.setting.pattern - adds a command to register the cron - add the command in `cron-register-all.command.ts`
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
import { shouldRunNow } from 'src/utils/should-run-now.utils';
|
||||
|
||||
const getNowDate = (hour: string) => {
|
||||
return new Date(`2025-01-01T${hour}.100Z`);
|
||||
};
|
||||
|
||||
describe('shouldRunNow', () => {
|
||||
it('returns true when now matches cron pattern */1 * * * *', () => {
|
||||
const cron = '*/1 * * * *';
|
||||
|
||||
expect(shouldRunNow(cron, getNowDate('10:00:00'))).toBe(true);
|
||||
});
|
||||
|
||||
it('returns true with a 50s root cron delay', () => {
|
||||
const cron = '*/1 * * * *';
|
||||
|
||||
expect(shouldRunNow(cron, getNowDate('10:00:50'))).toBe(true);
|
||||
});
|
||||
|
||||
it('returns true 5 times in a row for a */5 pattern', () => {
|
||||
const cron = '*/5 * * * *'; // every 5 minutes
|
||||
|
||||
expect(shouldRunNow(cron, getNowDate('09:59:00'))).toBe(false);
|
||||
expect(shouldRunNow(cron, getNowDate('10:00:00'))).toBe(true);
|
||||
expect(shouldRunNow(cron, getNowDate('10:01:00'))).toBe(false);
|
||||
expect(shouldRunNow(cron, getNowDate('10:02:00'))).toBe(false);
|
||||
expect(shouldRunNow(cron, getNowDate('10:03:00'))).toBe(false);
|
||||
expect(shouldRunNow(cron, getNowDate('10:04:00'))).toBe(false);
|
||||
expect(shouldRunNow(cron, getNowDate('10:05:00'))).toBe(true);
|
||||
expect(shouldRunNow(cron, getNowDate('10:06:00'))).toBe(false);
|
||||
});
|
||||
|
||||
it('returns false for invalid cron pattern', () => {
|
||||
const cron = 'invalid-cron';
|
||||
|
||||
expect(shouldRunNow(cron, getNowDate('10:00:00'))).toBe(false);
|
||||
});
|
||||
|
||||
it('returns false if the next run is outside the interval window (2 minutes)', () => {
|
||||
const cron = '*/10 * * * *'; // every 10 minutes
|
||||
const interval2min = 2 * 60_000;
|
||||
|
||||
expect(shouldRunNow(cron, getNowDate('10:06:00'), interval2min)).toBe(
|
||||
false,
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,20 @@
|
||||
import { CronExpressionParser } from 'cron-parser';
|
||||
|
||||
export const shouldRunNow = (
|
||||
pattern: string,
|
||||
now: Date,
|
||||
rootCronIntervalMs = 60_000,
|
||||
) => {
|
||||
try {
|
||||
const interval = CronExpressionParser.parse(pattern, {
|
||||
currentDate: now,
|
||||
});
|
||||
|
||||
const prevTriggerDate = interval.prev();
|
||||
const diff = Math.abs(prevTriggerDate.getTime() - now.getTime());
|
||||
|
||||
return diff < rootCronIntervalMs;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user