mirror of
https://github.com/nicotsx/ironmount.git
synced 2025-12-10 12:10:51 +01:00
53 lines
1.1 KiB
TypeScript
53 lines
1.1 KiB
TypeScript
import cron, { type ScheduledTask } from "node-cron";
|
|
import { logger } from "../utils/logger";
|
|
|
|
export abstract class Job {
|
|
abstract run(): Promise<unknown>;
|
|
}
|
|
|
|
type JobConstructor = new () => Job;
|
|
|
|
class SchedulerClass {
|
|
private tasks: ScheduledTask[] = [];
|
|
|
|
async start() {
|
|
logger.info("Scheduler started");
|
|
}
|
|
|
|
build(JobClass: JobConstructor) {
|
|
const job = new JobClass();
|
|
return {
|
|
schedule: (cronExpression: string) => {
|
|
const task = cron.schedule(cronExpression, async () => {
|
|
try {
|
|
await job.run();
|
|
} catch (error) {
|
|
logger.error(`Job ${JobClass.name} failed:`, error);
|
|
}
|
|
});
|
|
|
|
this.tasks.push(task);
|
|
logger.info(`Scheduled job ${JobClass.name} with cron: ${cronExpression}`);
|
|
},
|
|
};
|
|
}
|
|
|
|
async stop() {
|
|
for (const task of this.tasks) {
|
|
task.stop();
|
|
}
|
|
this.tasks = [];
|
|
logger.info("Scheduler stopped");
|
|
}
|
|
|
|
async clear() {
|
|
for (const task of this.tasks) {
|
|
task.destroy();
|
|
}
|
|
this.tasks = [];
|
|
logger.info("Scheduler cleared all tasks");
|
|
}
|
|
}
|
|
|
|
export const Scheduler = new SchedulerClass();
|