refactor: add cron job core package (#704)
* refactor: add cron job core package * docs: add comments to cron validation types * chore(deps): move node-cron dependencies from tasks app to cron-jobs-core package * fix: runOnInit is not running on start and rather on job creation * fix: format issues * fix: build fails when using top level await in cjs * chore: update turbo gen package json typescript version to 5.5.2 * fix: format issue * fix: deepsource issues * chore: update turbo gen package json eslint version to 9.5.0 * chore: fix frozen lockfile and format
This commit is contained in:
1 parent
ea12da991a
commit
92afd82d22
26 files changed
+397
-128
No files matched your search
@@ -1,7 +0,0 @@
|
||||
export const EVERY_5_SECONDS = "*/5 * * * * *";
|
||||
export const EVERY_MINUTE = "* * * * *";
|
||||
export const EVERY_5_MINUTES = "*/5 * * * *";
|
||||
export const EVERY_10_MINUTES = "*/10 * * * *";
|
||||
export const EVERY_HOUR = "0 * * * *";
|
||||
export const EVERY_DAY = "0 0 * * */1";
|
||||
export const EVERY_WEEK = "0 0 * * 1";
|
||||
@@ -1,37 +0,0 @@
|
||||
import cron from "node-cron";
|
||||
|
||||
import type { MaybePromise } from "@homarr/common/types";
|
||||
import { logger } from "@homarr/log";
|
||||
|
||||
interface CreateCronJobOptions {
|
||||
runOnStart?: boolean;
|
||||
}
|
||||
|
||||
export const createCronJob = (cronExpression: string, options: CreateCronJobOptions = { runOnStart: false }) => {
|
||||
return {
|
||||
withCallback: (callback: () => MaybePromise<void>) => {
|
||||
const catchingCallbackAsync = async () => {
|
||||
try {
|
||||
await callback();
|
||||
} catch (error) {
|
||||
logger.error(
|
||||
`apps/tasks/src/lib/cron-job/creator.ts: The callback of a cron job failed, expression ${cronExpression}, with error:`,
|
||||
error,
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
if (options.runOnStart) {
|
||||
void catchingCallbackAsync();
|
||||
}
|
||||
|
||||
const task = cron.schedule(cronExpression, () => void catchingCallbackAsync(), {
|
||||
scheduled: false,
|
||||
});
|
||||
return {
|
||||
_expression: cronExpression,
|
||||
_task: task,
|
||||
};
|
||||
},
|
||||
};
|
||||
};
|
||||
@@ -1,45 +0,0 @@
|
||||
import { objectEntries } from "@homarr/common";
|
||||
|
||||
import type { createCronJob } from "./creator";
|
||||
import { jobRegistry } from "./registry";
|
||||
|
||||
type Jobs = Record<string, ReturnType<ReturnType<typeof createCronJob>["withCallback"]>>;
|
||||
|
||||
export const createJobGroup = <TJobs extends Jobs>(jobs: TJobs) => {
|
||||
for (const [name, job] of objectEntries(jobs)) {
|
||||
if (typeof name !== "string") continue;
|
||||
jobRegistry.set(name, {
|
||||
name,
|
||||
expression: job._expression,
|
||||
active: false,
|
||||
task: job._task,
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
start: (name: keyof TJobs) => {
|
||||
const job = jobRegistry.get(name as string);
|
||||
if (!job) return;
|
||||
job.active = true;
|
||||
job.task.start();
|
||||
},
|
||||
startAll: () => {
|
||||
for (const job of jobRegistry.values()) {
|
||||
job.active = true;
|
||||
job.task.start();
|
||||
}
|
||||
},
|
||||
stop: (name: keyof TJobs) => {
|
||||
const job = jobRegistry.get(name as string);
|
||||
if (!job) return;
|
||||
job.active = false;
|
||||
job.task.stop();
|
||||
},
|
||||
stopAll: () => {
|
||||
for (const job of jobRegistry.values()) {
|
||||
job.active = false;
|
||||
job.task.stop();
|
||||
}
|
||||
},
|
||||
};
|
||||
};
|
||||
@@ -1,9 +0,0 @@
|
||||
import type cron from "node-cron";
|
||||
|
||||
interface Job {
|
||||
name: string;
|
||||
expression: string;
|
||||
active: boolean;
|
||||
task: cron.ScheduledTask;
|
||||
}
|
||||
export const jobRegistry = new Map<string, Job>();
|
||||
@@ -0,0 +1,21 @@
|
||||
import { createCronJobFunctions } from "@homarr/cron-jobs-core";
|
||||
import type { Logger } from "@homarr/cron-jobs-core/logger";
|
||||
import { logger } from "@homarr/log";
|
||||
|
||||
class WinstonCronJobLogger implements Logger {
|
||||
logDebug(message: string) {
|
||||
logger.debug(message);
|
||||
}
|
||||
|
||||
logInfo(message: string) {
|
||||
logger.info(message);
|
||||
}
|
||||
|
||||
logError(error: unknown) {
|
||||
logger.error(error);
|
||||
}
|
||||
}
|
||||
|
||||
export const { createCronJob, createCronJobGroup } = createCronJobFunctions({
|
||||
logger: new WinstonCronJobLogger(),
|
||||
});
|
||||
Reference in new issue
Block a user