{"version":3,"file":"cron.mjs","sources":["../../src/services/cron.ts"],"sourcesContent":["import { Job, Spec } from 'node-schedule';\nimport { isFunction } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\n\ninterface JobSpec {\n  job: Job;\n  options: Spec;\n  name: string | null;\n}\n\ntype TaskFn = ({ strapi }: { strapi: Core.Strapi }, ...args: unknown[]) => Promise<unknown>;\n\ntype Task =\n  | TaskFn\n  | {\n      task: TaskFn;\n      options: Spec;\n    };\n\ninterface Tasks {\n  [key: string]: Task;\n}\n\nconst createCronService = () => {\n  let jobsSpecs: JobSpec[] = [];\n  let running = false;\n\n  return {\n    add(tasks: Tasks = {}) {\n      for (const taskExpression of Object.keys(tasks)) {\n        const taskValue = tasks[taskExpression];\n\n        let fn: TaskFn;\n        let options: Spec;\n        let taskName: string | null;\n        if (isFunction(taskValue)) {\n          // don't use task name if key is the rule\n          taskName = null;\n          fn = taskValue.bind(tasks);\n          options = taskExpression;\n        } else if (isFunction(taskValue.task)) {\n          // set task name if key is not the rule\n          taskName = taskExpression;\n          fn = taskValue.task.bind(taskValue);\n          options = taskValue.options;\n        } else {\n          throw new Error(\n            `Could not schedule a cron job for \"${taskExpression}\": no function found.`\n          );\n        }\n\n        const fnWithStrapi = (...args: unknown[]) => fn({ strapi }, ...args);\n\n        // const job = new Job(null, fnWithStrapi);\n        const job = new Job(fnWithStrapi);\n        job.on('error', (error) => {\n          strapi.log.error(`Cron job \"${taskName ?? taskExpression}\" failed`, error);\n        });\n        jobsSpecs.push({ job, options, name: taskName });\n\n        if (running) {\n          job.schedule(options);\n        }\n      }\n      return this;\n    },\n\n    remove(name: string) {\n      if (!name) throw new Error('You must provide a name to remove a cron job.');\n      const matchingJobsSpecs = jobsSpecs.filter(({ name: jobSpecName }, index) => {\n        if (jobSpecName === name) {\n          jobsSpecs.splice(index, 1);\n          return true;\n        }\n        return false;\n      });\n      matchingJobsSpecs.forEach(({ job }) => job.cancel());\n      return this;\n    },\n\n    start() {\n      jobsSpecs.forEach(({ job, options }) => job.schedule(options));\n      running = true;\n      return this;\n    },\n\n    stop() {\n      jobsSpecs.forEach(({ job }) => job.cancel());\n      running = false;\n      return this;\n    },\n\n    destroy() {\n      this.stop();\n      jobsSpecs = [];\n      return this;\n    },\n    jobs: jobsSpecs,\n  };\n};\n\nexport default createCronService;\n"],"names":["createCronService","jobsSpecs","running","add","tasks","taskExpression","Object","keys","taskValue","fn","options","taskName","isFunction","bind","task","Error","fnWithStrapi","args","strapi","job","Job","on","error","log","push","name","schedule","remove","matchingJobsSpecs","filter","jobSpecName","index","splice","forEach","cancel","start","stop","destroy","jobs"],"mappings":"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"}