From 4f019b7a9941f8d2e9a7742fc810403a7ffe2d85 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Wed, 26 Apr 2023 22:14:10 -0400 Subject: [PATCH] Add new cron service, useful in dev to automatically run scheduled tasks and can be used in single-server deployments to avoid an external dependency --- package.json | 2 +- server/services/cron.ts | 24 ++++++++++++++++++++++++ server/services/index.ts | 2 ++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 server/services/cron.ts diff --git a/package.json b/package.json index cd0d31479..30250f9a2 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "build:server": "node ./build.js", "build": "yarn clean && yarn vite:build && yarn build:i18n && yarn build:server", "start": "node ./build/server/index.js", - "dev": "NODE_ENV=development yarn concurrently -n api,collaboration -c \"blue,magenta\" \"node --inspect=0.0.0.0 build/server/index.js --services=collaboration,websockets,admin,web,worker\"", + "dev": "NODE_ENV=development yarn concurrently -n api,collaboration -c \"blue,magenta\" \"node --inspect=0.0.0.0 build/server/index.js --services=cron,collaboration,websockets,admin,web,worker\"", "dev:backend": "NODE_ENV=development nodemon --exec \"yarn build:server && yarn dev\" -e js,ts,tsx --ignore build/ --ignore app/ --ignore shared/editor --ignore server/migrations", "dev:watch": "NODE_ENV=development yarn concurrently -n backend,frontend \"yarn dev:backend\" \"yarn vite:dev\"", "lint": "eslint app server shared plugins", diff --git a/server/services/cron.ts b/server/services/cron.ts new file mode 100644 index 000000000..929012b0f --- /dev/null +++ b/server/services/cron.ts @@ -0,0 +1,24 @@ +import { Day, Hour, Second } from "@shared/utils/time"; +import tasks from "@server/queues/tasks"; +import { TaskSchedule } from "@server/queues/tasks/BaseTask"; + +export default function init() { + async function run(schedule: TaskSchedule) { + for (const name in tasks) { + const TaskClass = tasks[name]; + if (TaskClass.cron === schedule) { + await TaskClass.schedule({ limit: 10000 }); + } + } + } + + setInterval(() => run(TaskSchedule.Daily), Day); + setInterval(() => run(TaskSchedule.Hourly), Hour); + + // Just give everything time to startup before running the first time. Not + // _technically_ required to function. + setTimeout(() => { + run(TaskSchedule.Daily); + run(TaskSchedule.Hourly); + }, 30 * Second); +} diff --git a/server/services/index.ts b/server/services/index.ts index 346075c3b..f4e1894c6 100644 --- a/server/services/index.ts +++ b/server/services/index.ts @@ -1,5 +1,6 @@ import admin from "./admin"; import collaboration from "./collaboration"; +import cron from "./cron"; import web from "./web"; import websockets from "./websockets"; import worker from "./worker"; @@ -10,4 +11,5 @@ export default { admin, web, worker, + cron, };