🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@fluojs/cron

Package Overview
Dependencies
Maintainers
1
Versions
11
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@fluojs/cron - npm Package Compare versions

Comparing version
1.0.0-beta.3
to
1.0.0-beta.4
+1
-1
dist/decorators.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,eAAe,EAEf,mBAAmB,EAEnB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAGpB,KAAK,yBAAyB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAC;AACjG,KAAK,mBAAmB,GAAG,yBAAyB,CAAC;AAoCrD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,mBAAmB,CAoB3F;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,mBAAmB,CAgB3F;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,mBAAmB,CAgBzF"}
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,eAAe,EAEf,mBAAmB,EAEnB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAGpB,KAAK,yBAAyB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAC;AACjG,KAAK,mBAAmB,GAAG,yBAAyB,CAAC;AAqCrD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,mBAAmB,CAoB3F;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,mBAAmB,CAgB3F;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,mBAAmB,CAgBzF"}

@@ -1,6 +0,6 @@

import { metadataSymbol } from '@fluojs/core/internal';
import { ensureMetadataSymbol } from '@fluojs/core/internal';
import { Cron as CronValidator } from 'croner';
import { schedulingMetadataSymbol } from './metadata.js';
ensureMetadataSymbol();
function getStandardMetadataBag(metadata) {
void metadataSymbol;
return metadata;

@@ -7,0 +7,0 @@ }

@@ -0,1 +1,4 @@

/**
* Provides the cron expression value.
*/
export declare const CronExpression: {

@@ -2,0 +5,0 @@ readonly EVERY_SECOND: "* * * * * *";

@@ -1,1 +0,1 @@

{"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../src/expressions.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;;;;;;;;;;CAWjB,CAAC"}
{"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../src/expressions.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;CAWjB,CAAC"}

@@ -0,1 +1,4 @@

/**
* Provides the cron expression value.
*/
export const CronExpression = {

@@ -2,0 +5,0 @@ EVERY_SECOND: '* * * * * *',

import { type MetadataPropertyKey } from '@fluojs/core';
import type { CronTaskMetadata, SchedulingTaskMetadata } from './types.js';
/**
* Define scheduling task metadata.
*
* @param target The target.
* @param propertyKey The property key.
* @param metadata The metadata.
*/
export declare function defineSchedulingTaskMetadata(target: object, propertyKey: MetadataPropertyKey, metadata: SchedulingTaskMetadata): void;
/**
* Define cron task metadata.
*
* @param target The target.
* @param propertyKey The property key.
* @param metadata The metadata.
*/
export declare function defineCronTaskMetadata(target: object, propertyKey: MetadataPropertyKey, metadata: CronTaskMetadata): void;
/**
* Get scheduling task metadata.
*
* @param target The target.
* @param propertyKey The property key.
* @returns The get scheduling task metadata result.
*/
export declare function getSchedulingTaskMetadata(target: object, propertyKey: MetadataPropertyKey): SchedulingTaskMetadata | undefined;
/**
* Get cron task metadata.
*
* @param target The target.
* @param propertyKey The property key.
* @returns The get cron task metadata result.
*/
export declare function getCronTaskMetadata(target: object, propertyKey: MetadataPropertyKey): CronTaskMetadata | undefined;
/**
* Get scheduling task metadata entries.
*
* @param target The target.
* @returns The get scheduling task metadata entries result.
*/
export declare function getSchedulingTaskMetadataEntries(target: object): Array<{

@@ -11,2 +45,8 @@ metadata: SchedulingTaskMetadata;

}>;
/**
* Get cron task metadata entries.
*
* @param target The target.
* @returns The get cron task metadata entries result.
*/
export declare function getCronTaskMetadataEntries(target: object): Array<{

@@ -16,4 +56,10 @@ metadata: CronTaskMetadata;

}>;
/**
* Provides the scheduling metadata symbol value.
*/
export declare const schedulingMetadataSymbol: symbol;
/**
* Provides the cron metadata symbol value.
*/
export declare const cronMetadataSymbol: symbol;
//# sourceMappingURL=metadata.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAgD3E,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,sBAAsB,GAC/B,IAAI,CAEN;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAEzH;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,GAAG,sBAAsB,GAAG,SAAS,CAS9H;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,GAAG,gBAAgB,GAAG,SAAS,CAIlH;AAED,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,MAAM,GACb,KAAK,CAAC;IAAE,QAAQ,EAAE,sBAAsB,CAAC;IAAC,WAAW,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAW/E;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,QAAQ,EAAE,gBAAgB,CAAC;IAAC,WAAW,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAIlI;AAED,eAAO,MAAM,wBAAwB,QAAgC,CAAC;AACtE,eAAO,MAAM,kBAAkB,QAAgC,CAAC"}
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAgD3E;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,sBAAsB,GAC/B,IAAI,CAEN;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAEzH;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,GAAG,sBAAsB,GAAG,SAAS,CAS9H;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,GAAG,gBAAgB,GAAG,SAAS,CAIlH;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,MAAM,GACb,KAAK,CAAC;IAAE,QAAQ,EAAE,sBAAsB,CAAC;IAAC,WAAW,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAW/E;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,QAAQ,EAAE,gBAAgB,CAAC;IAAC,WAAW,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAIlI;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,QAAgC,CAAC;AACtE;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAgC,CAAC"}

@@ -43,8 +43,32 @@ import { ensureSymbolMetadataPolyfill, getStandardConstructorMetadataBag } from '@fluojs/core/internal';

}
/**
* Define scheduling task metadata.
*
* @param target The target.
* @param propertyKey The property key.
* @param metadata The metadata.
*/
export function defineSchedulingTaskMetadata(target, propertyKey, metadata) {
getOrCreateSchedulingMap(target).set(propertyKey, cloneTaskMetadata(metadata));
}
/**
* Define cron task metadata.
*
* @param target The target.
* @param propertyKey The property key.
* @param metadata The metadata.
*/
export function defineCronTaskMetadata(target, propertyKey, metadata) {
defineSchedulingTaskMetadata(target, propertyKey, metadata);
}
/**
* Get scheduling task metadata.
*
* @param target The target.
* @param propertyKey The property key.
* @returns The get scheduling task metadata result.
*/
export function getSchedulingTaskMetadata(target, propertyKey) {

@@ -58,2 +82,10 @@ const stored = schedulingMetadataStore.get(target)?.get(propertyKey);

}
/**
* Get cron task metadata.
*
* @param target The target.
* @param propertyKey The property key.
* @returns The get cron task metadata result.
*/
export function getCronTaskMetadata(target, propertyKey) {

@@ -63,2 +95,9 @@ const metadata = getSchedulingTaskMetadata(target, propertyKey);

}
/**
* Get scheduling task metadata entries.
*
* @param target The target.
* @returns The get scheduling task metadata entries result.
*/
export function getSchedulingTaskMetadataEntries(target) {

@@ -73,6 +112,20 @@ const stored = schedulingMetadataStore.get(target) ?? new Map();

}
/**
* Get cron task metadata entries.
*
* @param target The target.
* @returns The get cron task metadata entries result.
*/
export function getCronTaskMetadataEntries(target) {
return getSchedulingTaskMetadataEntries(target).filter(entry => entry.metadata.kind === 'cron');
}
/**
* Provides the scheduling metadata symbol value.
*/
export const schedulingMetadataSymbol = standardSchedulingMetadataKey;
/**
* Provides the cron metadata symbol value.
*/
export const cronMetadataSymbol = standardSchedulingMetadataKey;
import type { CronScheduler } from './types.js';
/**
* Provides the default cron scheduler value.
*
* @param expression The expression.
* @param options The options.
* @param callback The callback.
*/
export declare const defaultCronScheduler: CronScheduler;
//# sourceMappingURL=scheduler.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,eAAO,MAAM,oBAAoB,EAAE,aAMlC,CAAC"}
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAMlC,CAAC"}
import { Cron as Croner } from 'croner';
/**
* Provides the default cron scheduler value.
*
* @param expression The expression.
* @param options The options.
* @param callback The callback.
*/
export const defaultCronScheduler = (expression, options, callback) => {

@@ -3,0 +10,0 @@ return new Croner(expression, {

import { type MetadataPropertyKey } from '@fluojs/core';
import type { ApplicationLogger, CompiledModule } from '@fluojs/runtime';
import type { CronTaskDescriptor, NormalizedCronModuleOptions } from './types.js';
/**
* Build default task name.
*
* @param targetName The target name.
* @param methodName The method name.
* @returns The build default task name result.
*/
export declare function buildDefaultTaskName(targetName: string, methodName: string): string;
/**
* Create lock key.
*
* @param prefix The prefix.
* @param taskName The task name.
* @returns The create lock key result.
*/
export declare function createLockKey(prefix: string, taskName: string): string;
/**
* Method key to name.
*
* @param methodKey The method key.
* @returns The method key to name result.
*/
export declare function methodKeyToName(methodKey: MetadataPropertyKey): string;
/**
* Discover cron task descriptors.
*
* @param compiledModules The compiled modules.
* @param options The options.
* @param logger The logger.
* @returns The discover cron task descriptors result.
*/
export declare function discoverCronTaskDescriptors(compiledModules: readonly CompiledModule[], options: NormalizedCronModuleOptions, logger: ApplicationLogger): CronTaskDescriptor[];
//# sourceMappingURL=task-discovery.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"task-discovery.d.ts","sourceRoot":"","sources":["../src/task-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAc,MAAM,cAAc,CAAC;AAGpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AASlF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,mBAAmB,GAAG,MAAM,CAEtE;AAED,wBAAgB,2BAA2B,CACzC,eAAe,EAAE,SAAS,cAAc,EAAE,EAC1C,OAAO,EAAE,2BAA2B,EACpC,MAAM,EAAE,iBAAiB,GACxB,kBAAkB,EAAE,CA4DtB"}
{"version":3,"file":"task-discovery.d.ts","sourceRoot":"","sources":["../src/task-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAc,MAAM,cAAc,CAAC;AAGpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AASlF;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,mBAAmB,GAAG,MAAM,CAEtE;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,eAAe,EAAE,SAAS,cAAc,EAAE,EAC1C,OAAO,EAAE,2BAA2B,EACpC,MAAM,EAAE,iBAAiB,GACxB,kBAAkB,EAAE,CA4DtB"}
import { getClassDiMetadata } from '@fluojs/core/internal';
import { getSchedulingTaskMetadataEntries } from './metadata.js';
/**
* Build default task name.
*
* @param targetName The target name.
* @param methodName The method name.
* @returns The build default task name result.
*/
export function buildDefaultTaskName(targetName, methodName) {
return `${targetName}.${methodName}`;
}
/**
* Create lock key.
*
* @param prefix The prefix.
* @param taskName The task name.
* @returns The create lock key result.
*/
export function createLockKey(prefix, taskName) {
return `${prefix}:${taskName}`;
}
/**
* Method key to name.
*
* @param methodKey The method key.
* @returns The method key to name result.
*/
export function methodKeyToName(methodKey) {
return typeof methodKey === 'symbol' ? methodKey.toString() : methodKey;
}
/**
* Discover cron task descriptors.
*
* @param compiledModules The compiled modules.
* @param options The options.
* @param logger The logger.
* @returns The discover cron task descriptors result.
*/
export function discoverCronTaskDescriptors(compiledModules, options, logger) {

@@ -13,0 +44,0 @@ const seen = new Map();

import type { Container } from '@fluojs/di';
import type { ApplicationLogger } from '@fluojs/runtime';
import type { CronTaskDescriptor } from './types.js';
/**
* Represents the cron task runner.
*/
export declare class CronTaskRunner {

@@ -5,0 +8,0 @@ private readonly runtimeContainer;

@@ -1,1 +0,1 @@

{"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../src/task-runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAOrD,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,gBAAgB,EAAE,SAAS,EAC3B,MAAM,EAAE,iBAAiB;IAGtC,WAAW,CACf,UAAU,EAAE,kBAAkB,EAC9B,oBAAoB,CAAC,EAAE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,SAAS,GAC1E,OAAO,CAAC,OAAO,CAAC;YA8BL,qBAAqB;YA8CrB,iBAAiB;YAQjB,kBAAkB;YAQlB,gBAAgB;YAUhB,gBAAgB;CAW/B"}
{"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../src/task-runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAOrD;;GAEG;AACH,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,gBAAgB,EAAE,SAAS,EAC3B,MAAM,EAAE,iBAAiB;IAGtC,WAAW,CACf,UAAU,EAAE,kBAAkB,EAC9B,oBAAoB,CAAC,EAAE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,SAAS,GAC1E,OAAO,CAAC,OAAO,CAAC;YA8BL,qBAAqB;YA8CrB,iBAAiB;YAQjB,kBAAkB;YAQlB,gBAAgB;YAUhB,gBAAgB;CAW/B"}

@@ -0,1 +1,4 @@

/**
* Represents the cron task runner.
*/
export class CronTaskRunner {

@@ -2,0 +5,0 @@ constructor(runtimeContainer, logger) {

@@ -12,3 +12,3 @@ {

],
"version": "1.0.0-beta.3",
"version": "1.0.0-beta.4",
"private": false,

@@ -41,6 +41,6 @@ "license": "MIT",

"croner": "^8.1.2",
"@fluojs/core": "^1.0.0-beta.2",
"@fluojs/di": "^1.0.0-beta.3",
"@fluojs/core": "^1.0.0-beta.4",
"@fluojs/di": "^1.0.0-beta.6",
"@fluojs/redis": "^1.0.0-beta.2",
"@fluojs/runtime": "^1.0.0-beta.3"
"@fluojs/runtime": "^1.0.0-beta.11"
},

@@ -47,0 +47,0 @@ "devDependencies": {

@@ -140,5 +140,7 @@ # @fluojs/cron

Registry는 `addCron`, `addInterval`, `addTimeout`, `remove`, `enable`, `disable`, `get`, `getAll`, `updateCronExpression`을 제공합니다. Timeout task는 한 번 실행된 뒤 비활성화되지만 registry에는 남아 있어 의도적으로 다시 활성화할 수 있습니다.
### 제한된 종료
`CronModule`은 애플리케이션 종료 시 실행 중인 작업을 drain하지만, 이제는 제한된 타임아웃 안에서만 기다립니다. 따라서 하나의 hung task 때문에 프로세스 종료가 영원히 막히지 않습니다.
`CronModule`은 애플리케이션 종료 시 실행 중인 작업을 제한된 타임아웃 안에서 drain합니다. 따라서 하나의 hung task 때문에 프로세스 종료가 영원히 막히지 않습니다.

@@ -160,2 +162,4 @@ 기본적으로 shutdown drain은 최대 `10_000ms` 동안 기다립니다. 이 시간이 지나면 스케줄러는 경고 로그를 남기고 hung task가 끝나기를 더 기다리지 않은 채 종료를 계속합니다. 분산 락을 사용하는 경우 아직 실행 중인 작업이 보유한 락은 timeout 시점에 즉시 해제하지 않습니다. 해당 작업이 정상적으로 끝날 때까지 락 소유권을 유지하거나, 프로세스가 종료된 뒤 Redis TTL로 만료되게 두어 원래 작업이 아직 실행 중인데 다른 노드가 같은 작업을 시작하지 않도록 합니다.

singleton provider/controller만 스케줄링됩니다. Request-scoped 및 transient scheduled class는 경고와 함께 건너뜁니다.
## 공개 API 개요

@@ -172,4 +176,7 @@

### 상수 및 토큰
- `CronExpression`: 공통 Cron 패턴(예: `EVERY_HOUR`, `EVERY_DAY_AT_MIDNIGHT`)을 담은 객체입니다.
- `CronExpression`: `EVERY_SECOND`, `EVERY_5_SECONDS`, `EVERY_30_SECONDS` 같은 sub-minute preset을 포함한 공통 Cron 패턴 객체입니다.
- `SCHEDULING_REGISTRY`: `SchedulingRegistry` 서비스를 위한 주입 토큰입니다.
- `normalizeCronModuleOptions(...)`: module option과 기본값을 정규화합니다.
- `createCronPlatformStatusSnapshot(...)`: health/readiness 통합을 위한 status snapshot을 생성합니다.
- 메타데이터 헬퍼와 심볼: `defineSchedulingTaskMetadata`, `defineCronTaskMetadata`, `getSchedulingTaskMetadata`, `getCronTaskMetadata`, `getSchedulingTaskMetadataEntries`, `getCronTaskMetadataEntries`, `schedulingMetadataSymbol`, `cronMetadataSymbol`.

@@ -186,2 +193,4 @@

- `packages/cron/src/module.test.ts`: 데코레이터 및 모듈 라이프사이클에 대한 종합 테스트.
- `packages/cron/src/scheduler.ts`: 코어 스케줄링 로직의 구현 상세.
- `packages/cron/src/service.ts`: 런타임 스케줄링, registry, shutdown 동작.
- `packages/cron/src/status.test.ts`: status snapshot 동작.
- `packages/cron/src/distributed-lock-manager.ts`: Redis distributed lock 동작.

@@ -140,5 +140,7 @@ # @fluojs/cron

The registry exposes `addCron`, `addInterval`, `addTimeout`, `remove`, `enable`, `disable`, `get`, `getAll`, and `updateCronExpression`. Timeout tasks run once, then disable themselves while remaining in the registry so they can be re-enabled deliberately.
### Bounded Shutdown
`CronModule` drains active task executions during application shutdown, but it now does so with a bounded timeout so one hung task cannot block process termination forever.
`CronModule` drains active task executions during application shutdown with a bounded timeout so one hung task cannot block process termination forever.

@@ -160,2 +162,4 @@ By default the shutdown drain waits up to `10_000ms`. If that timeout expires, the scheduler logs a warning and continues shutdown without waiting for the hung task to settle. When distributed locking is enabled, locks held by still-running tasks are not eagerly released on timeout; they remain owned by that task until it settles normally, or until Redis expires the lock after the process exits. This prevents another node from starting the same job while the original task is still running.

Only singleton providers/controllers are scheduled. Request-scoped and transient scheduled classes are skipped with a warning.
## Public API Overview

@@ -172,4 +176,7 @@

### Constants & Tokens
- `CronExpression`: Enum-like object with common cron patterns (e.g., `EVERY_HOUR`, `EVERY_DAY_AT_MIDNIGHT`).
- `CronExpression`: Enum-like object with common cron patterns, including sub-minute presets such as `EVERY_SECOND`, `EVERY_5_SECONDS`, and `EVERY_30_SECONDS`.
- `SCHEDULING_REGISTRY`: Injection token for the `SchedulingRegistry` service.
- `normalizeCronModuleOptions(...)`: Normalizes module options and defaults.
- `createCronPlatformStatusSnapshot(...)`: Creates a status snapshot for health/readiness integrations.
- Metadata helpers and symbols: `defineSchedulingTaskMetadata`, `defineCronTaskMetadata`, `getSchedulingTaskMetadata`, `getCronTaskMetadata`, `getSchedulingTaskMetadataEntries`, `getCronTaskMetadataEntries`, `schedulingMetadataSymbol`, `cronMetadataSymbol`.

@@ -186,2 +193,4 @@

- `packages/cron/src/module.test.ts`: Comprehensive tests for decorators and module lifecycle.
- `packages/cron/src/scheduler.ts`: Implementation details of the core scheduling logic.
- `packages/cron/src/service.ts`: Runtime scheduling, registry, and shutdown behavior.
- `packages/cron/src/status.test.ts`: Status snapshot behavior.
- `packages/cron/src/distributed-lock-manager.ts`: Redis distributed lock behavior.