@navios/schedule 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +7 -0
- package/README.md +221 -317
- package/dist/src/decorators/cron.decorator.d.mts.map +1 -1
- package/dist/src/scheduler.service.d.mts +1 -0
- package/dist/src/scheduler.service.d.mts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/lib/_tsup-dts-rollup.d.mts +1 -0
- package/lib/_tsup-dts-rollup.d.ts +1 -0
- package/lib/index.js +3 -3
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +4 -4
- package/lib/index.mjs.map +1 -1
- package/package.json +4 -4
- package/src/__tests__/schedule.spec.mts +5 -3
- package/src/decorators/cron.decorator.mts +0 -1
- package/src/scheduler.service.mts +4 -10
- package/dist/tsdown.config.d.mts +0 -3
- package/dist/tsdown.config.d.mts.map +0 -1
- package/dist/tsup.config.d.mts +0 -3
- package/dist/tsup.config.d.mts.map +0 -1
- package/dist/vitest.config.d.mts +0 -3
- package/dist/vitest.config.d.mts.map +0 -1
|
@@ -92,6 +92,7 @@ export { ScheduleMetadataKey as ScheduleMetadataKey_alias_2 }
|
|
|
92
92
|
|
|
93
93
|
declare class SchedulerService {
|
|
94
94
|
private readonly logger;
|
|
95
|
+
private readonly container;
|
|
95
96
|
private readonly jobs;
|
|
96
97
|
register(service: ClassType): void;
|
|
97
98
|
getJob<T extends ClassType>(service: T, method: keyof InstanceType<T>): CronJob | undefined;
|
|
@@ -92,6 +92,7 @@ export { ScheduleMetadataKey as ScheduleMetadataKey_alias_2 }
|
|
|
92
92
|
|
|
93
93
|
declare class SchedulerService {
|
|
94
94
|
private readonly logger;
|
|
95
|
+
private readonly container;
|
|
95
96
|
private readonly jobs;
|
|
96
97
|
register(service: ClassType): void;
|
|
97
98
|
getJob<T extends ClassType>(service: T, method: keyof InstanceType<T>): CronJob | undefined;
|
package/lib/index.js
CHANGED
|
@@ -157,10 +157,10 @@ var Schedule = /* @__PURE__ */ ((Schedule2) => {
|
|
|
157
157
|
var _SchedulerService_decorators, _init;
|
|
158
158
|
_SchedulerService_decorators = [core.Injectable()];
|
|
159
159
|
var _SchedulerService = class _SchedulerService {
|
|
160
|
-
|
|
161
|
-
logger = core.syncInject(core.Logger, {
|
|
160
|
+
logger = core.inject(core.Logger, {
|
|
162
161
|
context: _SchedulerService.name
|
|
163
162
|
});
|
|
163
|
+
container = core.inject(core.Container);
|
|
164
164
|
jobs = /* @__PURE__ */ new Map();
|
|
165
165
|
register(service) {
|
|
166
166
|
if (!hasScheduleMetadata(service)) {
|
|
@@ -192,7 +192,7 @@ var _SchedulerService = class _SchedulerService {
|
|
|
192
192
|
async onTick() {
|
|
193
193
|
try {
|
|
194
194
|
self.logger.debug("Executing job", name);
|
|
195
|
-
const instance = await
|
|
195
|
+
const instance = await self.container.get(service);
|
|
196
196
|
await instance[job.classMethod]();
|
|
197
197
|
} catch (error) {
|
|
198
198
|
self.logger.error("Error executing job", name, error);
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/metadata/cron.metadata.mts","../src/metadata/schedule.metadata.mts","../src/decorators/cron.decorator.mts","../src/decorators/schedulable.decorator.mts","../src/cron.constants.mts","../src/scheduler.service.mts"],"names":["Injectable","Schedule","syncInject","Logger","CronJob","inject"],"mappings":"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","file":"index.js","sourcesContent":["import type { CronJobParams } from 'cron'\n\nexport const CronMetadataKey = Symbol('CronMetadataKey')\n\nexport interface CronMetadata {\n classMethod: string\n cronTime: CronJobParams['cronTime'] | null\n disabled: boolean\n}\n\nexport function getAllCronMetadata(\n context: ClassMethodDecoratorContext | ClassDecoratorContext,\n): Set<CronMetadata> {\n if (context.metadata) {\n const metadata = context.metadata[CronMetadataKey] as\n | Set<CronMetadata>\n | undefined\n if (metadata) {\n return metadata\n } else {\n context.metadata[CronMetadataKey] = new Set<CronMetadata>()\n return context.metadata[CronMetadataKey] as Set<CronMetadata>\n }\n }\n throw new Error('[Navios-Schedule] Wrong environment.')\n}\n\nexport function getCronMetadata(\n target: Function,\n context: ClassMethodDecoratorContext,\n): CronMetadata {\n if (context.metadata) {\n const metadata = getAllCronMetadata(context)\n if (metadata) {\n const endpointMetadata = Array.from(metadata).find(\n (item) => item.classMethod === target.name,\n )\n if (endpointMetadata) {\n return endpointMetadata\n } else {\n const newMetadata: CronMetadata = {\n classMethod: target.name,\n cronTime: null,\n disabled: false,\n }\n metadata.add(newMetadata)\n return newMetadata\n }\n }\n }\n throw new Error('[Navios-Schedule] Wrong environment.')\n}\n","import type { ClassType } from '@navios/core'\n\nimport type { CronMetadata } from './cron.metadata.mjs'\n\nimport { getAllCronMetadata } from './cron.metadata.mjs'\n\nexport const ScheduleMetadataKey = Symbol('ControllerMetadataKey')\n\nexport interface ScheduleMetadata {\n name: string\n jobs: Set<CronMetadata>\n}\n\nexport function getScheduleMetadata(\n target: ClassType,\n context: ClassDecoratorContext,\n): ScheduleMetadata {\n if (context.metadata) {\n const metadata = context.metadata[ScheduleMetadataKey] as\n | ScheduleMetadata\n | undefined\n if (metadata) {\n return metadata\n } else {\n const jobsMetadata = getAllCronMetadata(context)\n const newMetadata: ScheduleMetadata = {\n name: target.name,\n jobs: jobsMetadata,\n }\n context.metadata[ScheduleMetadataKey] = newMetadata\n // @ts-expect-error We add a custom metadata key to the target\n target[ScheduleMetadataKey] = newMetadata\n return newMetadata\n }\n }\n throw new Error('[Navios-Schedule] Wrong environment.')\n}\n\nexport function extractScheduleMetadata(target: ClassType): ScheduleMetadata {\n // @ts-expect-error We add a custom metadata key to the target\n const metadata = target[ScheduleMetadataKey] as ScheduleMetadata | undefined\n if (!metadata) {\n throw new Error(\n '[Navios-Schedule] Controller metadata not found. Make sure to use @Controller decorator.',\n )\n }\n return metadata\n}\n\nexport function hasScheduleMetadata(target: ClassType): boolean {\n // @ts-expect-error We add a custom metadata key to the target\n const metadata = target[ScheduleMetadataKey] as ScheduleMetadata | undefined\n\n return !!metadata\n}\n","import type { ClassType } from '@navios/core'\nimport type { CronJobParams } from 'cron'\n\nimport { getCronMetadata } from '../metadata/index.mjs'\n\nexport interface CronOptions {\n disabled?: boolean\n}\n\nexport function Cron(\n cronTime: CronJobParams['cronTime'],\n options?: CronOptions,\n) {\n return (\n target: () => Promise<void>,\n context: ClassMethodDecoratorContext,\n ) => {\n if (context.kind !== 'method') {\n throw new Error(\n `Cron can only be applied to methods, not ${context.kind}`,\n )\n }\n if (context.metadata) {\n const metadata = getCronMetadata(target, context)\n metadata.cronTime = cronTime\n metadata.disabled = options?.disabled ?? false\n }\n return target\n }\n}\n","import type { ClassType } from '@navios/core'\n\nimport { Injectable } from '@navios/core'\n\nimport { getScheduleMetadata } from '../metadata/index.mjs'\n\nexport function Schedulable() {\n return (target: ClassType, context: ClassDecoratorContext) => {\n if (context.kind !== 'class') {\n throw new Error(\n `SchedulableDecorator can only be applied to classes, not ${context.kind}`,\n )\n }\n if (context.metadata) {\n getScheduleMetadata(target, context)\n }\n return Injectable()(target, context)\n }\n}\n","export enum Schedule {\n EveryMinute = '*/1 * * * *',\n EveryFiveMinutes = '*/5 * * * *',\n EveryTenMinutes = '*/10 * * * *',\n EveryFifteenMinutes = '*/15 * * * *',\n EveryThirtyMinutes = '*/30 * * * *',\n EveryHour = '0 * * * *',\n EveryTwoHours = '0 */2 * * *',\n EveryThreeHours = '0 */3 * * *',\n EveryFourHours = '0 */4 * * *',\n EverySixHours = '0 */6 * * *',\n EveryTwelveHours = '0 */12 * * *',\n EveryDay = '0 0 * * *',\n EveryWeek = '0 0 * * 0',\n EveryMonth = '0 0 1 * *',\n}\n","import type { ClassType } from '@navios/core'\n\nimport {\n EnvConfigProvider,\n inject,\n Injectable,\n Logger,\n syncInject,\n} from '@navios/core'\n\nimport { CronJob } from 'cron'\n\nimport type { ScheduleMetadata } from './metadata/index.mjs'\n\nimport {\n extractScheduleMetadata,\n hasScheduleMetadata,\n} from './metadata/index.mjs'\n\n@Injectable()\nexport class SchedulerService {\n // private readonly configService = syncInject(EnvConfigProvider)\n private readonly logger = syncInject(Logger, {\n context: SchedulerService.name,\n })\n private readonly jobs: Map<string, CronJob> = new Map()\n\n register(service: ClassType) {\n if (!hasScheduleMetadata(service)) {\n throw new Error(\n `[Navios-Schedule] Service ${service.name} is not schedulable. Make sure to use @Schedulable decorator.`,\n )\n }\n const metadata = extractScheduleMetadata(service)\n this.logger.debug('Scheduling service', metadata.name)\n this.registerJobs(service, metadata)\n }\n\n getJob<T extends ClassType>(\n service: T,\n method: keyof InstanceType<T>,\n ): CronJob | undefined {\n const metadata = extractScheduleMetadata(service)\n const jobName = `${metadata.name}.${method as string}()`\n return this.jobs.get(jobName)\n }\n\n private registerJobs(service: ClassType, metadata: ScheduleMetadata) {\n const jobs = metadata.jobs\n for (const job of jobs) {\n if (!job.cronTime) {\n this.logger.debug('Skipping job', job.classMethod)\n continue\n }\n const name = `${metadata.name}.${job.classMethod}()`\n const self = this\n const defaultDisabled = false\n const cronJob = CronJob.from({\n cronTime: job.cronTime,\n name,\n async onTick() {\n try {\n self.logger.debug('Executing job', name)\n const instance = await inject(service)\n await instance[job.classMethod]()\n } catch (error) {\n self.logger.error('Error executing job', name, error)\n }\n },\n start: !(defaultDisabled || job.disabled),\n })\n this.jobs.set(name, cronJob)\n }\n }\n\n startAll() {\n for (const job of this.jobs.values()) {\n if (job.isActive) {\n continue\n }\n job.start()\n }\n }\n\n stopAll() {\n for (const job of this.jobs.values()) {\n if (!job.isActive) {\n continue\n }\n job.stop()\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/metadata/cron.metadata.mts","../src/metadata/schedule.metadata.mts","../src/decorators/cron.decorator.mts","../src/decorators/schedulable.decorator.mts","../src/cron.constants.mts","../src/scheduler.service.mts"],"names":["Injectable","Schedule","inject","Logger","Container","CronJob"],"mappings":"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","file":"index.js","sourcesContent":["import type { CronJobParams } from 'cron'\n\nexport const CronMetadataKey = Symbol('CronMetadataKey')\n\nexport interface CronMetadata {\n classMethod: string\n cronTime: CronJobParams['cronTime'] | null\n disabled: boolean\n}\n\nexport function getAllCronMetadata(\n context: ClassMethodDecoratorContext | ClassDecoratorContext,\n): Set<CronMetadata> {\n if (context.metadata) {\n const metadata = context.metadata[CronMetadataKey] as\n | Set<CronMetadata>\n | undefined\n if (metadata) {\n return metadata\n } else {\n context.metadata[CronMetadataKey] = new Set<CronMetadata>()\n return context.metadata[CronMetadataKey] as Set<CronMetadata>\n }\n }\n throw new Error('[Navios-Schedule] Wrong environment.')\n}\n\nexport function getCronMetadata(\n target: Function,\n context: ClassMethodDecoratorContext,\n): CronMetadata {\n if (context.metadata) {\n const metadata = getAllCronMetadata(context)\n if (metadata) {\n const endpointMetadata = Array.from(metadata).find(\n (item) => item.classMethod === target.name,\n )\n if (endpointMetadata) {\n return endpointMetadata\n } else {\n const newMetadata: CronMetadata = {\n classMethod: target.name,\n cronTime: null,\n disabled: false,\n }\n metadata.add(newMetadata)\n return newMetadata\n }\n }\n }\n throw new Error('[Navios-Schedule] Wrong environment.')\n}\n","import type { ClassType } from '@navios/core'\n\nimport type { CronMetadata } from './cron.metadata.mjs'\n\nimport { getAllCronMetadata } from './cron.metadata.mjs'\n\nexport const ScheduleMetadataKey = Symbol('ControllerMetadataKey')\n\nexport interface ScheduleMetadata {\n name: string\n jobs: Set<CronMetadata>\n}\n\nexport function getScheduleMetadata(\n target: ClassType,\n context: ClassDecoratorContext,\n): ScheduleMetadata {\n if (context.metadata) {\n const metadata = context.metadata[ScheduleMetadataKey] as\n | ScheduleMetadata\n | undefined\n if (metadata) {\n return metadata\n } else {\n const jobsMetadata = getAllCronMetadata(context)\n const newMetadata: ScheduleMetadata = {\n name: target.name,\n jobs: jobsMetadata,\n }\n context.metadata[ScheduleMetadataKey] = newMetadata\n // @ts-expect-error We add a custom metadata key to the target\n target[ScheduleMetadataKey] = newMetadata\n return newMetadata\n }\n }\n throw new Error('[Navios-Schedule] Wrong environment.')\n}\n\nexport function extractScheduleMetadata(target: ClassType): ScheduleMetadata {\n // @ts-expect-error We add a custom metadata key to the target\n const metadata = target[ScheduleMetadataKey] as ScheduleMetadata | undefined\n if (!metadata) {\n throw new Error(\n '[Navios-Schedule] Controller metadata not found. Make sure to use @Controller decorator.',\n )\n }\n return metadata\n}\n\nexport function hasScheduleMetadata(target: ClassType): boolean {\n // @ts-expect-error We add a custom metadata key to the target\n const metadata = target[ScheduleMetadataKey] as ScheduleMetadata | undefined\n\n return !!metadata\n}\n","import type { CronJobParams } from 'cron'\n\nimport { getCronMetadata } from '../metadata/index.mjs'\n\nexport interface CronOptions {\n disabled?: boolean\n}\n\nexport function Cron(\n cronTime: CronJobParams['cronTime'],\n options?: CronOptions,\n) {\n return (\n target: () => Promise<void>,\n context: ClassMethodDecoratorContext,\n ) => {\n if (context.kind !== 'method') {\n throw new Error(\n `Cron can only be applied to methods, not ${context.kind}`,\n )\n }\n if (context.metadata) {\n const metadata = getCronMetadata(target, context)\n metadata.cronTime = cronTime\n metadata.disabled = options?.disabled ?? false\n }\n return target\n }\n}\n","import type { ClassType } from '@navios/core'\n\nimport { Injectable } from '@navios/core'\n\nimport { getScheduleMetadata } from '../metadata/index.mjs'\n\nexport function Schedulable() {\n return (target: ClassType, context: ClassDecoratorContext) => {\n if (context.kind !== 'class') {\n throw new Error(\n `SchedulableDecorator can only be applied to classes, not ${context.kind}`,\n )\n }\n if (context.metadata) {\n getScheduleMetadata(target, context)\n }\n return Injectable()(target, context)\n }\n}\n","export enum Schedule {\n EveryMinute = '*/1 * * * *',\n EveryFiveMinutes = '*/5 * * * *',\n EveryTenMinutes = '*/10 * * * *',\n EveryFifteenMinutes = '*/15 * * * *',\n EveryThirtyMinutes = '*/30 * * * *',\n EveryHour = '0 * * * *',\n EveryTwoHours = '0 */2 * * *',\n EveryThreeHours = '0 */3 * * *',\n EveryFourHours = '0 */4 * * *',\n EverySixHours = '0 */6 * * *',\n EveryTwelveHours = '0 */12 * * *',\n EveryDay = '0 0 * * *',\n EveryWeek = '0 0 * * 0',\n EveryMonth = '0 0 1 * *',\n}\n","import type { ClassType } from '@navios/core'\n\nimport { Container, inject, Injectable, Logger } from '@navios/core'\n\nimport { CronJob } from 'cron'\n\nimport type { ScheduleMetadata } from './metadata/index.mjs'\n\nimport {\n extractScheduleMetadata,\n hasScheduleMetadata,\n} from './metadata/index.mjs'\n\n@Injectable()\nexport class SchedulerService {\n private readonly logger = inject(Logger, {\n context: SchedulerService.name,\n })\n private readonly container = inject(Container)\n private readonly jobs: Map<string, CronJob> = new Map()\n\n register(service: ClassType) {\n if (!hasScheduleMetadata(service)) {\n throw new Error(\n `[Navios-Schedule] Service ${service.name} is not schedulable. Make sure to use @Schedulable decorator.`,\n )\n }\n const metadata = extractScheduleMetadata(service)\n this.logger.debug('Scheduling service', metadata.name)\n this.registerJobs(service, metadata)\n }\n\n getJob<T extends ClassType>(\n service: T,\n method: keyof InstanceType<T>,\n ): CronJob | undefined {\n const metadata = extractScheduleMetadata(service)\n const jobName = `${metadata.name}.${method as string}()`\n return this.jobs.get(jobName)\n }\n\n private registerJobs(service: ClassType, metadata: ScheduleMetadata) {\n const jobs = metadata.jobs\n for (const job of jobs) {\n if (!job.cronTime) {\n this.logger.debug('Skipping job', job.classMethod)\n continue\n }\n const name = `${metadata.name}.${job.classMethod}()`\n const self = this\n const defaultDisabled = false\n const cronJob = CronJob.from({\n cronTime: job.cronTime,\n name,\n async onTick() {\n try {\n self.logger.debug('Executing job', name)\n const instance = await self.container.get(service)\n await instance[job.classMethod]()\n } catch (error) {\n self.logger.error('Error executing job', name, error)\n }\n },\n start: !(defaultDisabled || job.disabled),\n })\n this.jobs.set(name, cronJob)\n }\n }\n\n startAll() {\n for (const job of this.jobs.values()) {\n if (job.isActive) {\n continue\n }\n job.start()\n }\n }\n\n stopAll() {\n for (const job of this.jobs.values()) {\n if (!job.isActive) {\n continue\n }\n job.stop()\n }\n }\n}\n"]}
|
package/lib/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Injectable,
|
|
1
|
+
import { Injectable, inject, Logger, Container } from '@navios/core';
|
|
2
2
|
import { CronJob } from 'cron';
|
|
3
3
|
|
|
4
4
|
var __create = Object.create;
|
|
@@ -155,10 +155,10 @@ var Schedule = /* @__PURE__ */ ((Schedule2) => {
|
|
|
155
155
|
var _SchedulerService_decorators, _init;
|
|
156
156
|
_SchedulerService_decorators = [Injectable()];
|
|
157
157
|
var _SchedulerService = class _SchedulerService {
|
|
158
|
-
|
|
159
|
-
logger = syncInject(Logger, {
|
|
158
|
+
logger = inject(Logger, {
|
|
160
159
|
context: _SchedulerService.name
|
|
161
160
|
});
|
|
161
|
+
container = inject(Container);
|
|
162
162
|
jobs = /* @__PURE__ */ new Map();
|
|
163
163
|
register(service) {
|
|
164
164
|
if (!hasScheduleMetadata(service)) {
|
|
@@ -190,7 +190,7 @@ var _SchedulerService = class _SchedulerService {
|
|
|
190
190
|
async onTick() {
|
|
191
191
|
try {
|
|
192
192
|
self.logger.debug("Executing job", name);
|
|
193
|
-
const instance = await
|
|
193
|
+
const instance = await self.container.get(service);
|
|
194
194
|
await instance[job.classMethod]();
|
|
195
195
|
} catch (error) {
|
|
196
196
|
self.logger.error("Error executing job", name, error);
|
package/lib/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/metadata/cron.metadata.mts","../src/metadata/schedule.metadata.mts","../src/decorators/cron.decorator.mts","../src/decorators/schedulable.decorator.mts","../src/cron.constants.mts","../src/scheduler.service.mts"],"names":["Schedule","Injectable"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { CronJobParams } from 'cron'\n\nexport const CronMetadataKey = Symbol('CronMetadataKey')\n\nexport interface CronMetadata {\n classMethod: string\n cronTime: CronJobParams['cronTime'] | null\n disabled: boolean\n}\n\nexport function getAllCronMetadata(\n context: ClassMethodDecoratorContext | ClassDecoratorContext,\n): Set<CronMetadata> {\n if (context.metadata) {\n const metadata = context.metadata[CronMetadataKey] as\n | Set<CronMetadata>\n | undefined\n if (metadata) {\n return metadata\n } else {\n context.metadata[CronMetadataKey] = new Set<CronMetadata>()\n return context.metadata[CronMetadataKey] as Set<CronMetadata>\n }\n }\n throw new Error('[Navios-Schedule] Wrong environment.')\n}\n\nexport function getCronMetadata(\n target: Function,\n context: ClassMethodDecoratorContext,\n): CronMetadata {\n if (context.metadata) {\n const metadata = getAllCronMetadata(context)\n if (metadata) {\n const endpointMetadata = Array.from(metadata).find(\n (item) => item.classMethod === target.name,\n )\n if (endpointMetadata) {\n return endpointMetadata\n } else {\n const newMetadata: CronMetadata = {\n classMethod: target.name,\n cronTime: null,\n disabled: false,\n }\n metadata.add(newMetadata)\n return newMetadata\n }\n }\n }\n throw new Error('[Navios-Schedule] Wrong environment.')\n}\n","import type { ClassType } from '@navios/core'\n\nimport type { CronMetadata } from './cron.metadata.mjs'\n\nimport { getAllCronMetadata } from './cron.metadata.mjs'\n\nexport const ScheduleMetadataKey = Symbol('ControllerMetadataKey')\n\nexport interface ScheduleMetadata {\n name: string\n jobs: Set<CronMetadata>\n}\n\nexport function getScheduleMetadata(\n target: ClassType,\n context: ClassDecoratorContext,\n): ScheduleMetadata {\n if (context.metadata) {\n const metadata = context.metadata[ScheduleMetadataKey] as\n | ScheduleMetadata\n | undefined\n if (metadata) {\n return metadata\n } else {\n const jobsMetadata = getAllCronMetadata(context)\n const newMetadata: ScheduleMetadata = {\n name: target.name,\n jobs: jobsMetadata,\n }\n context.metadata[ScheduleMetadataKey] = newMetadata\n // @ts-expect-error We add a custom metadata key to the target\n target[ScheduleMetadataKey] = newMetadata\n return newMetadata\n }\n }\n throw new Error('[Navios-Schedule] Wrong environment.')\n}\n\nexport function extractScheduleMetadata(target: ClassType): ScheduleMetadata {\n // @ts-expect-error We add a custom metadata key to the target\n const metadata = target[ScheduleMetadataKey] as ScheduleMetadata | undefined\n if (!metadata) {\n throw new Error(\n '[Navios-Schedule] Controller metadata not found. Make sure to use @Controller decorator.',\n )\n }\n return metadata\n}\n\nexport function hasScheduleMetadata(target: ClassType): boolean {\n // @ts-expect-error We add a custom metadata key to the target\n const metadata = target[ScheduleMetadataKey] as ScheduleMetadata | undefined\n\n return !!metadata\n}\n","import type { ClassType } from '@navios/core'\nimport type { CronJobParams } from 'cron'\n\nimport { getCronMetadata } from '../metadata/index.mjs'\n\nexport interface CronOptions {\n disabled?: boolean\n}\n\nexport function Cron(\n cronTime: CronJobParams['cronTime'],\n options?: CronOptions,\n) {\n return (\n target: () => Promise<void>,\n context: ClassMethodDecoratorContext,\n ) => {\n if (context.kind !== 'method') {\n throw new Error(\n `Cron can only be applied to methods, not ${context.kind}`,\n )\n }\n if (context.metadata) {\n const metadata = getCronMetadata(target, context)\n metadata.cronTime = cronTime\n metadata.disabled = options?.disabled ?? false\n }\n return target\n }\n}\n","import type { ClassType } from '@navios/core'\n\nimport { Injectable } from '@navios/core'\n\nimport { getScheduleMetadata } from '../metadata/index.mjs'\n\nexport function Schedulable() {\n return (target: ClassType, context: ClassDecoratorContext) => {\n if (context.kind !== 'class') {\n throw new Error(\n `SchedulableDecorator can only be applied to classes, not ${context.kind}`,\n )\n }\n if (context.metadata) {\n getScheduleMetadata(target, context)\n }\n return Injectable()(target, context)\n }\n}\n","export enum Schedule {\n EveryMinute = '*/1 * * * *',\n EveryFiveMinutes = '*/5 * * * *',\n EveryTenMinutes = '*/10 * * * *',\n EveryFifteenMinutes = '*/15 * * * *',\n EveryThirtyMinutes = '*/30 * * * *',\n EveryHour = '0 * * * *',\n EveryTwoHours = '0 */2 * * *',\n EveryThreeHours = '0 */3 * * *',\n EveryFourHours = '0 */4 * * *',\n EverySixHours = '0 */6 * * *',\n EveryTwelveHours = '0 */12 * * *',\n EveryDay = '0 0 * * *',\n EveryWeek = '0 0 * * 0',\n EveryMonth = '0 0 1 * *',\n}\n","import type { ClassType } from '@navios/core'\n\nimport {\n EnvConfigProvider,\n inject,\n Injectable,\n Logger,\n syncInject,\n} from '@navios/core'\n\nimport { CronJob } from 'cron'\n\nimport type { ScheduleMetadata } from './metadata/index.mjs'\n\nimport {\n extractScheduleMetadata,\n hasScheduleMetadata,\n} from './metadata/index.mjs'\n\n@Injectable()\nexport class SchedulerService {\n // private readonly configService = syncInject(EnvConfigProvider)\n private readonly logger = syncInject(Logger, {\n context: SchedulerService.name,\n })\n private readonly jobs: Map<string, CronJob> = new Map()\n\n register(service: ClassType) {\n if (!hasScheduleMetadata(service)) {\n throw new Error(\n `[Navios-Schedule] Service ${service.name} is not schedulable. Make sure to use @Schedulable decorator.`,\n )\n }\n const metadata = extractScheduleMetadata(service)\n this.logger.debug('Scheduling service', metadata.name)\n this.registerJobs(service, metadata)\n }\n\n getJob<T extends ClassType>(\n service: T,\n method: keyof InstanceType<T>,\n ): CronJob | undefined {\n const metadata = extractScheduleMetadata(service)\n const jobName = `${metadata.name}.${method as string}()`\n return this.jobs.get(jobName)\n }\n\n private registerJobs(service: ClassType, metadata: ScheduleMetadata) {\n const jobs = metadata.jobs\n for (const job of jobs) {\n if (!job.cronTime) {\n this.logger.debug('Skipping job', job.classMethod)\n continue\n }\n const name = `${metadata.name}.${job.classMethod}()`\n const self = this\n const defaultDisabled = false\n const cronJob = CronJob.from({\n cronTime: job.cronTime,\n name,\n async onTick() {\n try {\n self.logger.debug('Executing job', name)\n const instance = await inject(service)\n await instance[job.classMethod]()\n } catch (error) {\n self.logger.error('Error executing job', name, error)\n }\n },\n start: !(defaultDisabled || job.disabled),\n })\n this.jobs.set(name, cronJob)\n }\n }\n\n startAll() {\n for (const job of this.jobs.values()) {\n if (job.isActive) {\n continue\n }\n job.start()\n }\n }\n\n stopAll() {\n for (const job of this.jobs.values()) {\n if (!job.isActive) {\n continue\n }\n job.stop()\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/metadata/cron.metadata.mts","../src/metadata/schedule.metadata.mts","../src/decorators/cron.decorator.mts","../src/decorators/schedulable.decorator.mts","../src/cron.constants.mts","../src/scheduler.service.mts"],"names":["Schedule","Injectable"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { CronJobParams } from 'cron'\n\nexport const CronMetadataKey = Symbol('CronMetadataKey')\n\nexport interface CronMetadata {\n classMethod: string\n cronTime: CronJobParams['cronTime'] | null\n disabled: boolean\n}\n\nexport function getAllCronMetadata(\n context: ClassMethodDecoratorContext | ClassDecoratorContext,\n): Set<CronMetadata> {\n if (context.metadata) {\n const metadata = context.metadata[CronMetadataKey] as\n | Set<CronMetadata>\n | undefined\n if (metadata) {\n return metadata\n } else {\n context.metadata[CronMetadataKey] = new Set<CronMetadata>()\n return context.metadata[CronMetadataKey] as Set<CronMetadata>\n }\n }\n throw new Error('[Navios-Schedule] Wrong environment.')\n}\n\nexport function getCronMetadata(\n target: Function,\n context: ClassMethodDecoratorContext,\n): CronMetadata {\n if (context.metadata) {\n const metadata = getAllCronMetadata(context)\n if (metadata) {\n const endpointMetadata = Array.from(metadata).find(\n (item) => item.classMethod === target.name,\n )\n if (endpointMetadata) {\n return endpointMetadata\n } else {\n const newMetadata: CronMetadata = {\n classMethod: target.name,\n cronTime: null,\n disabled: false,\n }\n metadata.add(newMetadata)\n return newMetadata\n }\n }\n }\n throw new Error('[Navios-Schedule] Wrong environment.')\n}\n","import type { ClassType } from '@navios/core'\n\nimport type { CronMetadata } from './cron.metadata.mjs'\n\nimport { getAllCronMetadata } from './cron.metadata.mjs'\n\nexport const ScheduleMetadataKey = Symbol('ControllerMetadataKey')\n\nexport interface ScheduleMetadata {\n name: string\n jobs: Set<CronMetadata>\n}\n\nexport function getScheduleMetadata(\n target: ClassType,\n context: ClassDecoratorContext,\n): ScheduleMetadata {\n if (context.metadata) {\n const metadata = context.metadata[ScheduleMetadataKey] as\n | ScheduleMetadata\n | undefined\n if (metadata) {\n return metadata\n } else {\n const jobsMetadata = getAllCronMetadata(context)\n const newMetadata: ScheduleMetadata = {\n name: target.name,\n jobs: jobsMetadata,\n }\n context.metadata[ScheduleMetadataKey] = newMetadata\n // @ts-expect-error We add a custom metadata key to the target\n target[ScheduleMetadataKey] = newMetadata\n return newMetadata\n }\n }\n throw new Error('[Navios-Schedule] Wrong environment.')\n}\n\nexport function extractScheduleMetadata(target: ClassType): ScheduleMetadata {\n // @ts-expect-error We add a custom metadata key to the target\n const metadata = target[ScheduleMetadataKey] as ScheduleMetadata | undefined\n if (!metadata) {\n throw new Error(\n '[Navios-Schedule] Controller metadata not found. Make sure to use @Controller decorator.',\n )\n }\n return metadata\n}\n\nexport function hasScheduleMetadata(target: ClassType): boolean {\n // @ts-expect-error We add a custom metadata key to the target\n const metadata = target[ScheduleMetadataKey] as ScheduleMetadata | undefined\n\n return !!metadata\n}\n","import type { CronJobParams } from 'cron'\n\nimport { getCronMetadata } from '../metadata/index.mjs'\n\nexport interface CronOptions {\n disabled?: boolean\n}\n\nexport function Cron(\n cronTime: CronJobParams['cronTime'],\n options?: CronOptions,\n) {\n return (\n target: () => Promise<void>,\n context: ClassMethodDecoratorContext,\n ) => {\n if (context.kind !== 'method') {\n throw new Error(\n `Cron can only be applied to methods, not ${context.kind}`,\n )\n }\n if (context.metadata) {\n const metadata = getCronMetadata(target, context)\n metadata.cronTime = cronTime\n metadata.disabled = options?.disabled ?? false\n }\n return target\n }\n}\n","import type { ClassType } from '@navios/core'\n\nimport { Injectable } from '@navios/core'\n\nimport { getScheduleMetadata } from '../metadata/index.mjs'\n\nexport function Schedulable() {\n return (target: ClassType, context: ClassDecoratorContext) => {\n if (context.kind !== 'class') {\n throw new Error(\n `SchedulableDecorator can only be applied to classes, not ${context.kind}`,\n )\n }\n if (context.metadata) {\n getScheduleMetadata(target, context)\n }\n return Injectable()(target, context)\n }\n}\n","export enum Schedule {\n EveryMinute = '*/1 * * * *',\n EveryFiveMinutes = '*/5 * * * *',\n EveryTenMinutes = '*/10 * * * *',\n EveryFifteenMinutes = '*/15 * * * *',\n EveryThirtyMinutes = '*/30 * * * *',\n EveryHour = '0 * * * *',\n EveryTwoHours = '0 */2 * * *',\n EveryThreeHours = '0 */3 * * *',\n EveryFourHours = '0 */4 * * *',\n EverySixHours = '0 */6 * * *',\n EveryTwelveHours = '0 */12 * * *',\n EveryDay = '0 0 * * *',\n EveryWeek = '0 0 * * 0',\n EveryMonth = '0 0 1 * *',\n}\n","import type { ClassType } from '@navios/core'\n\nimport { Container, inject, Injectable, Logger } from '@navios/core'\n\nimport { CronJob } from 'cron'\n\nimport type { ScheduleMetadata } from './metadata/index.mjs'\n\nimport {\n extractScheduleMetadata,\n hasScheduleMetadata,\n} from './metadata/index.mjs'\n\n@Injectable()\nexport class SchedulerService {\n private readonly logger = inject(Logger, {\n context: SchedulerService.name,\n })\n private readonly container = inject(Container)\n private readonly jobs: Map<string, CronJob> = new Map()\n\n register(service: ClassType) {\n if (!hasScheduleMetadata(service)) {\n throw new Error(\n `[Navios-Schedule] Service ${service.name} is not schedulable. Make sure to use @Schedulable decorator.`,\n )\n }\n const metadata = extractScheduleMetadata(service)\n this.logger.debug('Scheduling service', metadata.name)\n this.registerJobs(service, metadata)\n }\n\n getJob<T extends ClassType>(\n service: T,\n method: keyof InstanceType<T>,\n ): CronJob | undefined {\n const metadata = extractScheduleMetadata(service)\n const jobName = `${metadata.name}.${method as string}()`\n return this.jobs.get(jobName)\n }\n\n private registerJobs(service: ClassType, metadata: ScheduleMetadata) {\n const jobs = metadata.jobs\n for (const job of jobs) {\n if (!job.cronTime) {\n this.logger.debug('Skipping job', job.classMethod)\n continue\n }\n const name = `${metadata.name}.${job.classMethod}()`\n const self = this\n const defaultDisabled = false\n const cronJob = CronJob.from({\n cronTime: job.cronTime,\n name,\n async onTick() {\n try {\n self.logger.debug('Executing job', name)\n const instance = await self.container.get(service)\n await instance[job.classMethod]()\n } catch (error) {\n self.logger.error('Error executing job', name, error)\n }\n },\n start: !(defaultDisabled || job.disabled),\n })\n this.jobs.set(name, cronJob)\n }\n }\n\n startAll() {\n for (const job of this.jobs.values()) {\n if (job.isActive) {\n continue\n }\n job.start()\n }\n }\n\n stopAll() {\n for (const job of this.jobs.values()) {\n if (!job.isActive) {\n continue\n }\n job.stop()\n }\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@navios/schedule",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"author": {
|
|
5
5
|
"name": "Oleksandr Hanzha",
|
|
6
6
|
"email": "alex@granted.name"
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
},
|
|
13
13
|
"license": "MIT",
|
|
14
14
|
"peerDependencies": {
|
|
15
|
-
"@navios/core": "^0.
|
|
15
|
+
"@navios/core": "^0.5.0",
|
|
16
16
|
"zod": "^3.25.0 || ^4.0.0"
|
|
17
17
|
},
|
|
18
18
|
"typings": "./lib/index.d.mts",
|
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
}
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@navios/core": "^0.
|
|
34
|
+
"@navios/core": "^0.5.0",
|
|
35
35
|
"typescript": "^5.9.2",
|
|
36
|
-
"zod": "^4.1.
|
|
36
|
+
"zod": "^4.1.8"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"cron": "^4.3.3"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Container, Injectable } from '@navios/core'
|
|
2
2
|
|
|
3
3
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
4
4
|
|
|
@@ -6,14 +6,16 @@ import { Cron, Schedulable } from '../decorators/index.mjs'
|
|
|
6
6
|
import { SchedulerService } from '../scheduler.service.mjs'
|
|
7
7
|
|
|
8
8
|
describe('Schedule Module', () => {
|
|
9
|
+
let container: Container
|
|
9
10
|
let schedulerService: SchedulerService
|
|
10
11
|
|
|
11
12
|
beforeEach(async () => {
|
|
12
13
|
vi.useFakeTimers()
|
|
13
|
-
|
|
14
|
+
container = new Container()
|
|
15
|
+
schedulerService = await container.get(SchedulerService)
|
|
14
16
|
})
|
|
15
17
|
|
|
16
|
-
afterEach(() => {
|
|
18
|
+
afterEach(async () => {
|
|
17
19
|
schedulerService.stopAll()
|
|
18
20
|
vi.useRealTimers()
|
|
19
21
|
vi.clearAllMocks()
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import type { ClassType } from '@navios/core'
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
EnvConfigProvider,
|
|
5
|
-
inject,
|
|
6
|
-
Injectable,
|
|
7
|
-
Logger,
|
|
8
|
-
syncInject,
|
|
9
|
-
} from '@navios/core'
|
|
3
|
+
import { Container, inject, Injectable, Logger } from '@navios/core'
|
|
10
4
|
|
|
11
5
|
import { CronJob } from 'cron'
|
|
12
6
|
|
|
@@ -19,10 +13,10 @@ import {
|
|
|
19
13
|
|
|
20
14
|
@Injectable()
|
|
21
15
|
export class SchedulerService {
|
|
22
|
-
|
|
23
|
-
private readonly logger = syncInject(Logger, {
|
|
16
|
+
private readonly logger = inject(Logger, {
|
|
24
17
|
context: SchedulerService.name,
|
|
25
18
|
})
|
|
19
|
+
private readonly container = inject(Container)
|
|
26
20
|
private readonly jobs: Map<string, CronJob> = new Map()
|
|
27
21
|
|
|
28
22
|
register(service: ClassType) {
|
|
@@ -61,7 +55,7 @@ export class SchedulerService {
|
|
|
61
55
|
async onTick() {
|
|
62
56
|
try {
|
|
63
57
|
self.logger.debug('Executing job', name)
|
|
64
|
-
const instance = await
|
|
58
|
+
const instance = await self.container.get(service)
|
|
65
59
|
await instance[job.classMethod]()
|
|
66
60
|
} catch (error) {
|
|
67
61
|
self.logger.error('Error executing job', name, error)
|
package/dist/tsdown.config.d.mts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tsdown.config.d.mts","sourceRoot":"","sources":["../tsdown.config.mts"],"names":[],"mappings":";AAEA,wBAQE"}
|
package/dist/tsup.config.d.mts
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
declare const _default: import("tsup").Options | import("tsup").Options[] | ((overrideOptions: import("tsup").Options) => import("tsup").Options | import("tsup").Options[] | Promise<import("tsup").Options | import("tsup").Options[]>);
|
|
2
|
-
export default _default;
|
|
3
|
-
//# sourceMappingURL=tsup.config.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tsup.config.d.mts","sourceRoot":"","sources":["../tsup.config.mts"],"names":[],"mappings":";AAEA,wBAQE"}
|
package/dist/vitest.config.d.mts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vitest.config.d.mts","sourceRoot":"","sources":["../vitest.config.mts"],"names":[],"mappings":";AAEA,wBASE"}
|