directus

Форк
0
/
schedule.ts 
43 строки · 829.0 Байт
1
import cron from 'cron-parser';
2
import schedule from 'node-schedule';
3
import { SynchronizedClock } from '../synchronization.js';
4

5
export interface ScheduledJob {
6
	stop(): Promise<void>;
7
}
8

9
export function validateCron(rule: string): boolean {
10
	try {
11
		cron.parseExpression(rule);
12
	} catch {
13
		return false;
14
	}
15

16
	return true;
17
}
18

19
export function scheduleSynchronizedJob(
20
	id: string,
21
	rule: string,
22
	cb: (fireDate: Date) => void | Promise<void>,
23
): ScheduledJob {
24
	const clock = new SynchronizedClock(`${id}:${rule}`);
25

26
	const job = schedule.scheduleJob(rule, async (fireDate) => {
27
		const nextTimestamp = job.nextInvocation().getTime();
28

29
		const wasSet = await clock.set(nextTimestamp);
30

31
		if (wasSet) {
32
			await cb(fireDate);
33
		}
34
	});
35

36
	const stop = async () => {
37
		job.cancel();
38

39
		await clock.reset();
40
	};
41

42
	return { stop };
43
}
44

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.