1
0
silverbullet/plugos/hooks/cron.ts

86 lines
2.1 KiB
TypeScript
Raw Normal View History

import { Hook, Manifest } from "../types.ts";
import { Cron } from "https://cdn.jsdelivr.net/gh/hexagon/croner@4/src/croner.js";
import { safeRun } from "../util.ts";
import { System } from "../system.ts";
export type CronHookT = {
2022-03-27 09:26:13 +00:00
cron?: string | string[];
2022-03-23 14:41:12 +00:00
};
export class CronHook implements Hook<CronHookT> {
2023-01-25 17:29:47 +00:00
tasks: Cron[] = [];
constructor(private system: System<CronHookT>) {
}
apply(system: System<CronHookT>): void {
2023-01-25 17:29:47 +00:00
this.system = system;
2022-03-23 14:41:12 +00:00
system.on({
2022-04-26 17:04:36 +00:00
plugLoaded: () => {
2023-01-25 17:29:47 +00:00
this.reloadCrons();
2022-03-23 14:41:12 +00:00
},
2023-01-25 17:29:47 +00:00
plugUnloaded: () => {
this.reloadCrons();
2022-03-23 14:41:12 +00:00
},
});
2023-01-25 17:29:47 +00:00
this.reloadCrons();
}
2022-03-23 14:41:12 +00:00
2023-01-25 17:29:47 +00:00
stop() {
this.tasks.forEach((task) => task.stop());
this.tasks = [];
}
reloadCrons() {
this.stop();
for (const plug of this.system.loadedPlugs.values()) {
if (!plug.manifest) {
continue;
}
for (
const [name, functionDef] of Object.entries(
plug.manifest.functions,
)
) {
if (!functionDef.cron) {
2022-03-27 09:26:13 +00:00
continue;
}
2023-01-25 17:29:47 +00:00
const crons = Array.isArray(functionDef.cron)
? functionDef.cron
: [functionDef.cron];
for (const cronDef of crons) {
this.tasks.push(
new Cron(cronDef, () => {
// console.log("Now acting on cron", cronDef);
safeRun(async () => {
try {
await plug.invoke(name, [cronDef]);
} catch (e: any) {
console.error("Execution of cron function failed", e);
}
});
}),
);
2022-03-23 14:41:12 +00:00
}
}
}
}
validateManifest(manifest: Manifest<CronHookT>): string[] {
2022-10-15 17:02:56 +00:00
const errors: string[] = [];
for (const functionDef of Object.values(manifest.functions)) {
2022-03-27 09:26:13 +00:00
if (!functionDef.cron) {
continue;
}
const crons = Array.isArray(functionDef.cron)
? functionDef.cron
: [functionDef.cron];
2022-10-15 17:02:56 +00:00
for (const _cronDef of crons) {
// if (!cron.validate(cronDef)) {
// errors.push(`Invalid cron expression ${cronDef}`);
// }
2022-03-23 14:41:12 +00:00
}
}
return errors;
}
}