exisjs 0.7.5 → 0.7.7
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/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +12 -0
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/clean.d.ts +5 -0
- package/dist/cli/commands/clean.d.ts.map +1 -0
- package/dist/cli/commands/clean.js +30 -0
- package/dist/cli/commands/clean.js.map +1 -0
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +171 -86
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/generate.d.ts +6 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +57 -2
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +54 -16
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/index.js +26 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/manifest.d.ts +1 -0
- package/dist/cli/manifest.d.ts.map +1 -1
- package/dist/cli/manifest.js +264 -33
- package/dist/cli/manifest.js.map +1 -1
- package/dist/cli/resolve-aliases.d.ts +1 -1
- package/dist/cli/resolve-aliases.d.ts.map +1 -1
- package/dist/cli/resolve-aliases.js +30 -13
- package/dist/cli/resolve-aliases.js.map +1 -1
- package/dist/config/config.d.ts +3 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +9 -0
- package/dist/config/config.js.map +1 -1
- package/dist/config/types.d.ts +6 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/cron/expressions.d.ts +45 -0
- package/dist/cron/expressions.d.ts.map +1 -0
- package/dist/cron/expressions.js +87 -0
- package/dist/cron/expressions.js.map +1 -0
- package/dist/cron/index.d.ts +6 -0
- package/dist/cron/index.d.ts.map +1 -0
- package/dist/cron/index.js +22 -0
- package/dist/cron/index.js.map +1 -0
- package/dist/cron/job.d.ts +50 -0
- package/dist/cron/job.d.ts.map +1 -0
- package/dist/cron/job.js +247 -0
- package/dist/cron/job.js.map +1 -0
- package/dist/cron/manager.d.ts +105 -0
- package/dist/cron/manager.d.ts.map +1 -0
- package/dist/cron/manager.js +245 -0
- package/dist/cron/manager.js.map +1 -0
- package/dist/cron/parser.d.ts +22 -0
- package/dist/cron/parser.d.ts.map +1 -0
- package/dist/cron/parser.js +269 -0
- package/dist/cron/parser.js.map +1 -0
- package/dist/cron/types.d.ts +76 -0
- package/dist/cron/types.d.ts.map +1 -0
- package/dist/cron/types.js +3 -0
- package/dist/cron/types.js.map +1 -0
- package/dist/decorators/constants.d.ts +2 -0
- package/dist/decorators/constants.d.ts.map +1 -1
- package/dist/decorators/constants.js +3 -1
- package/dist/decorators/constants.js.map +1 -1
- package/dist/decorators/core.d.ts +29 -11
- package/dist/decorators/core.d.ts.map +1 -1
- package/dist/decorators/core.js +49 -11
- package/dist/decorators/core.js.map +1 -1
- package/dist/decorators/cron.d.ts +57 -0
- package/dist/decorators/cron.d.ts.map +1 -0
- package/dist/decorators/cron.js +143 -0
- package/dist/decorators/cron.js.map +1 -0
- package/dist/decorators/index.d.ts +2 -0
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/decorators/index.js +2 -0
- package/dist/decorators/index.js.map +1 -1
- package/dist/decorators/middleware.d.ts +65 -2
- package/dist/decorators/middleware.d.ts.map +1 -1
- package/dist/decorators/middleware.js +148 -62
- package/dist/decorators/middleware.js.map +1 -1
- package/dist/decorators/params.d.ts +102 -2
- package/dist/decorators/params.d.ts.map +1 -1
- package/dist/decorators/params.js +105 -3
- package/dist/decorators/params.js.map +1 -1
- package/dist/decorators/response.d.ts.map +1 -1
- package/dist/decorators/response.js +32 -22
- package/dist/decorators/response.js.map +1 -1
- package/dist/decorators/routing.d.ts +81 -16
- package/dist/decorators/routing.d.ts.map +1 -1
- package/dist/decorators/routing.js +81 -16
- package/dist/decorators/routing.js.map +1 -1
- package/dist/di/container.d.ts.map +1 -1
- package/dist/di/container.js +6 -1
- package/dist/di/container.js.map +1 -1
- package/dist/docs/content/cli/commands.mdx +1 -1
- package/dist/docs/content/controllers.mdx +127 -10
- package/dist/docs/content/cron.mdx +196 -0
- package/dist/docs/content/decorators.mdx +22 -4
- package/dist/docs/content/errors.mdx +58 -9
- package/dist/docs/content/introduction.mdx +7 -7
- package/dist/docs/content/middleware.mdx +269 -6
- package/dist/docs/content/requests.mdx +180 -6
- package/dist/docs/content/responses.mdx +283 -32
- package/dist/docs/content/routing.mdx +46 -0
- package/dist/docs/content/swagger.mdx +228 -0
- package/dist/docs/content/validation.mdx +190 -11
- package/dist/docs/reference/context.mdx +11 -0
- package/dist/docs/reference/cron.mdx +300 -0
- package/dist/docs/reference/decorators.mdx +22 -4
- package/dist/docs/reference/error.mdx +88 -0
- package/dist/docs/reference/logger.mdx +175 -43
- package/dist/docs/reference/middleware.mdx +31 -0
- package/dist/docs/reference/router.mdx +22 -0
- package/dist/docs/reference/swagger.mdx +143 -0
- package/dist/docs/reference/validator.mdx +83 -23
- package/dist/error/errors.d.ts.map +1 -1
- package/dist/error/errors.js +95 -43
- package/dist/error/errors.js.map +1 -1
- package/dist/error/index.d.ts +1 -0
- package/dist/error/index.d.ts.map +1 -1
- package/dist/error/index.js +11 -1
- package/dist/error/index.js.map +1 -1
- package/dist/error/overlay.d.ts +42 -0
- package/dist/error/overlay.d.ts.map +1 -0
- package/dist/error/overlay.js +306 -0
- package/dist/error/overlay.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/start-server.js +33 -7
- package/dist/lib/start-server.js.map +1 -1
- package/dist/logger/index.d.ts +1 -1
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +9 -1
- package/dist/logger/index.js.map +1 -1
- package/dist/middleware/guard.d.ts +2 -2
- package/dist/middleware/guard.d.ts.map +1 -1
- package/dist/middleware/guard.js.map +1 -1
- package/dist/middleware/ip-filter.d.ts +1 -0
- package/dist/middleware/ip-filter.d.ts.map +1 -1
- package/dist/middleware/ip-filter.js +2 -0
- package/dist/middleware/ip-filter.js.map +1 -1
- package/dist/middleware/middleware.d.ts +2 -2
- package/dist/middleware/middleware.d.ts.map +1 -1
- package/dist/middleware/middleware.js +20 -2
- package/dist/middleware/middleware.js.map +1 -1
- package/dist/middleware/security.d.ts +43 -1
- package/dist/middleware/security.d.ts.map +1 -1
- package/dist/middleware/security.js +101 -0
- package/dist/middleware/security.js.map +1 -1
- package/dist/response/index.d.ts +229 -6
- package/dist/response/index.d.ts.map +1 -1
- package/dist/response/index.js +272 -2
- package/dist/response/index.js.map +1 -1
- package/dist/router/boundary.d.ts +41 -11
- package/dist/router/boundary.d.ts.map +1 -1
- package/dist/router/boundary.js +24 -2
- package/dist/router/boundary.js.map +1 -1
- package/dist/router/controller-registrar.d.ts.map +1 -1
- package/dist/router/controller-registrar.js +108 -4
- package/dist/router/controller-registrar.js.map +1 -1
- package/dist/router/index.d.ts +2 -2
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +2 -1
- package/dist/router/index.js.map +1 -1
- package/dist/router/route-builder.d.ts +262 -65
- package/dist/router/route-builder.d.ts.map +1 -1
- package/dist/router/route-builder.js +181 -23
- package/dist/router/route-builder.js.map +1 -1
- package/dist/router/route-scanner.d.ts +6 -0
- package/dist/router/route-scanner.d.ts.map +1 -1
- package/dist/router/route-scanner.js +71 -792
- package/dist/router/route-scanner.js.map +1 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +62 -17
- package/dist/router/router.js.map +1 -1
- package/dist/router/scanner/boundary-loader.d.ts +18 -0
- package/dist/router/scanner/boundary-loader.d.ts.map +1 -0
- package/dist/router/scanner/boundary-loader.js +539 -0
- package/dist/router/scanner/boundary-loader.js.map +1 -0
- package/dist/router/scanner/cron-mounter.d.ts +15 -0
- package/dist/router/scanner/cron-mounter.d.ts.map +1 -0
- package/dist/router/scanner/cron-mounter.js +216 -0
- package/dist/router/scanner/cron-mounter.js.map +1 -0
- package/dist/router/scanner/error-mounter.d.ts +14 -0
- package/dist/router/scanner/error-mounter.d.ts.map +1 -0
- package/dist/router/scanner/error-mounter.js +200 -0
- package/dist/router/scanner/error-mounter.js.map +1 -0
- package/dist/router/scanner/fs-scanner.d.ts +25 -0
- package/dist/router/scanner/fs-scanner.d.ts.map +1 -0
- package/dist/router/scanner/fs-scanner.js +115 -0
- package/dist/router/scanner/fs-scanner.js.map +1 -0
- package/dist/router/scanner/functional-compiler.d.ts +9 -0
- package/dist/router/scanner/functional-compiler.d.ts.map +1 -0
- package/dist/router/scanner/functional-compiler.js +233 -0
- package/dist/router/scanner/functional-compiler.js.map +1 -0
- package/dist/router/scanner/index.d.ts +9 -0
- package/dist/router/scanner/index.d.ts.map +1 -0
- package/dist/router/scanner/index.js +19 -0
- package/dist/router/scanner/index.js.map +1 -0
- package/dist/router/types.d.ts +23 -0
- package/dist/router/types.d.ts.map +1 -1
- package/dist/server/app.d.ts +3 -0
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +13 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/bootstrapper.d.ts.map +1 -1
- package/dist/server/bootstrapper.js +91 -30
- package/dist/server/bootstrapper.js.map +1 -1
- package/dist/server/cluster.d.ts.map +1 -1
- package/dist/server/cluster.js +13 -2
- package/dist/server/cluster.js.map +1 -1
- package/dist/server/context.d.ts +8 -0
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js +50 -6
- package/dist/server/context.js.map +1 -1
- package/dist/server/helpers/body-parser.d.ts +18 -0
- package/dist/server/helpers/body-parser.d.ts.map +1 -0
- package/dist/server/helpers/body-parser.js +246 -0
- package/dist/server/helpers/body-parser.js.map +1 -0
- package/dist/server/helpers/cookie.d.ts +4 -0
- package/dist/server/helpers/cookie.d.ts.map +1 -0
- package/dist/server/helpers/cookie.js +61 -0
- package/dist/server/helpers/cookie.js.map +1 -0
- package/dist/server/helpers/etag.d.ts +3 -0
- package/dist/server/helpers/etag.d.ts.map +1 -0
- package/dist/server/helpers/etag.js +25 -0
- package/dist/server/helpers/etag.js.map +1 -0
- package/dist/server/helpers/index.d.ts +6 -0
- package/dist/server/helpers/index.d.ts.map +1 -0
- package/dist/server/helpers/index.js +21 -0
- package/dist/server/helpers/index.js.map +1 -0
- package/dist/server/helpers/ip.d.ts +9 -0
- package/dist/server/helpers/ip.d.ts.map +1 -0
- package/dist/server/helpers/ip.js +62 -0
- package/dist/server/helpers/ip.js.map +1 -0
- package/dist/server/helpers/stream.d.ts +4 -0
- package/dist/server/helpers/stream.d.ts.map +1 -0
- package/dist/server/helpers/stream.js +193 -0
- package/dist/server/helpers/stream.js.map +1 -0
- package/dist/server/lifecycle.d.ts +22 -0
- package/dist/server/lifecycle.d.ts.map +1 -0
- package/dist/server/lifecycle.js +106 -0
- package/dist/server/lifecycle.js.map +1 -0
- package/dist/server/request-handler.d.ts +1 -0
- package/dist/server/request-handler.d.ts.map +1 -1
- package/dist/server/request-handler.js +27 -17
- package/dist/server/request-handler.js.map +1 -1
- package/dist/server/request.d.ts +1 -139
- package/dist/server/request.d.ts.map +1 -1
- package/dist/server/request.js +37 -433
- package/dist/server/request.js.map +1 -1
- package/dist/server/response.d.ts +112 -156
- package/dist/server/response.d.ts.map +1 -1
- package/dist/server/response.js +129 -279
- package/dist/server/response.js.map +1 -1
- package/dist/swagger/decorators.d.ts +81 -0
- package/dist/swagger/decorators.d.ts.map +1 -0
- package/dist/swagger/decorators.js +172 -0
- package/dist/swagger/decorators.js.map +1 -0
- package/dist/swagger/generator.d.ts +19 -0
- package/dist/swagger/generator.d.ts.map +1 -0
- package/dist/swagger/generator.js +344 -0
- package/dist/swagger/generator.js.map +1 -0
- package/dist/swagger/index.d.ts +31 -0
- package/dist/swagger/index.d.ts.map +1 -0
- package/dist/swagger/index.js +53 -0
- package/dist/swagger/index.js.map +1 -0
- package/dist/swagger/mounter.d.ts +7 -0
- package/dist/swagger/mounter.d.ts.map +1 -0
- package/dist/swagger/mounter.js +56 -0
- package/dist/swagger/mounter.js.map +1 -0
- package/dist/swagger/types.d.ts +190 -0
- package/dist/swagger/types.d.ts.map +1 -0
- package/dist/swagger/types.js +3 -0
- package/dist/swagger/types.js.map +1 -0
- package/dist/swagger/ui.d.ts +6 -0
- package/dist/swagger/ui.d.ts.map +1 -0
- package/dist/swagger/ui.js +118 -0
- package/dist/swagger/ui.js.map +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +6 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/mocks.d.ts.map +1 -1
- package/dist/testing/mocks.js +15 -3
- package/dist/testing/mocks.js.map +1 -1
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +184 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/validator/builder.d.ts +223 -0
- package/dist/validator/builder.d.ts.map +1 -0
- package/dist/validator/builder.js +517 -0
- package/dist/validator/builder.js.map +1 -0
- package/dist/validator/engine.d.ts +19 -0
- package/dist/validator/engine.d.ts.map +1 -0
- package/dist/validator/engine.js +568 -0
- package/dist/validator/engine.js.map +1 -0
- package/dist/validator/error.d.ts +12 -0
- package/dist/validator/error.d.ts.map +1 -0
- package/dist/validator/error.js +63 -0
- package/dist/validator/error.js.map +1 -0
- package/dist/validator/pagination.d.ts +40 -0
- package/dist/validator/pagination.d.ts.map +1 -0
- package/dist/validator/pagination.js +60 -0
- package/dist/validator/pagination.js.map +1 -0
- package/dist/validator/tex-types.d.ts +2 -1
- package/dist/validator/tex-types.d.ts.map +1 -1
- package/dist/validator/tex-types.js +2 -1
- package/dist/validator/tex-types.js.map +1 -1
- package/dist/validator/tex.d.ts +6 -142
- package/dist/validator/tex.d.ts.map +1 -1
- package/dist/validator/tex.js +14 -733
- package/dist/validator/tex.js.map +1 -1
- package/dist/validator/types.d.ts +83 -0
- package/dist/validator/types.d.ts.map +1 -0
- package/dist/validator/types.js +3 -0
- package/dist/validator/types.js.map +1 -0
- package/package.json +8 -4
- package/dist/dev/error-overlay.d.ts +0 -3
- package/dist/dev/error-overlay.d.ts.map +0 -1
- package/dist/dev/error-overlay.js +0 -118
- package/dist/dev/error-overlay.js.map +0 -1
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defineCron = exports.CronManager = void 0;
|
|
4
|
+
exports.cron = cron;
|
|
5
|
+
const job_1 = require("./job");
|
|
6
|
+
const expressions_1 = require("./expressions");
|
|
7
|
+
class CronManager {
|
|
8
|
+
constructor(app) {
|
|
9
|
+
this.jobs = new Map();
|
|
10
|
+
this.app = app;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Checks whether a cron job with the given name is registered.
|
|
14
|
+
*/
|
|
15
|
+
has(name) {
|
|
16
|
+
return this.jobs.has(name);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Registers and optionally starts a scheduled background task or cron job.
|
|
20
|
+
*
|
|
21
|
+
* @param nameOrOptions Job name or configuration options
|
|
22
|
+
* @param schedule Optional cron schedule pattern if name is passed as first argument
|
|
23
|
+
* @param handler Optional execution handler if name is passed as first argument
|
|
24
|
+
* @param options Optional additional configuration options
|
|
25
|
+
* @returns Active `CronJob` instance
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* app.cron.schedule({
|
|
30
|
+
* name: 'nightly-backup',
|
|
31
|
+
* schedule: '0 2 * * *',
|
|
32
|
+
* timezone: 'UTC',
|
|
33
|
+
* run: async ({ log }) => {
|
|
34
|
+
* log.info('Running database backup')
|
|
35
|
+
* }
|
|
36
|
+
* })
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
schedule(nameOrOptions, schedule, handler, options) {
|
|
40
|
+
let opts;
|
|
41
|
+
if (typeof nameOrOptions === 'string') {
|
|
42
|
+
opts = {
|
|
43
|
+
name: nameOrOptions,
|
|
44
|
+
schedule: schedule,
|
|
45
|
+
run: handler,
|
|
46
|
+
...options,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
opts = nameOrOptions;
|
|
51
|
+
}
|
|
52
|
+
const job = new job_1.CronJob(opts, this.app);
|
|
53
|
+
if (this.jobs.has(job.name)) {
|
|
54
|
+
this.app.log?.warn({ job: job.name }, `[exis:cron] Overwriting existing cron job "${job.name}"`);
|
|
55
|
+
this.jobs.get(job.name)?.stop();
|
|
56
|
+
}
|
|
57
|
+
this.jobs.set(job.name, job);
|
|
58
|
+
return job;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Schedules a recurring task using fixed millisecond intervals.
|
|
62
|
+
*/
|
|
63
|
+
interval(name, ms, handler, options) {
|
|
64
|
+
return this.schedule({
|
|
65
|
+
name,
|
|
66
|
+
interval: ms,
|
|
67
|
+
run: handler,
|
|
68
|
+
...options,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Schedules a one-time delayed task.
|
|
73
|
+
*/
|
|
74
|
+
timeout(name, ms, handler, options) {
|
|
75
|
+
return this.schedule({
|
|
76
|
+
name,
|
|
77
|
+
timeout: ms,
|
|
78
|
+
run: handler,
|
|
79
|
+
...options,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Retrieves a registered cron job by its unique identifier.
|
|
84
|
+
*/
|
|
85
|
+
getJob(name) {
|
|
86
|
+
return this.jobs.get(name);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Returns a snapshot map of all registered cron jobs and their execution statistics.
|
|
90
|
+
*/
|
|
91
|
+
getJobs() {
|
|
92
|
+
return this.jobs;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Returns an array of statistics for all registered jobs (last run, failure count, execution duration).
|
|
96
|
+
*/
|
|
97
|
+
getStats() {
|
|
98
|
+
return Array.from(this.jobs.values()).map((job) => job.getStats());
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Starts all registered idle, paused, or stopped cron jobs.
|
|
102
|
+
*/
|
|
103
|
+
startAll() {
|
|
104
|
+
for (const job of this.jobs.values()) {
|
|
105
|
+
job.start();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Pauses all registered active cron jobs.
|
|
110
|
+
*/
|
|
111
|
+
pauseAll() {
|
|
112
|
+
for (const job of this.jobs.values()) {
|
|
113
|
+
job.pause();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Permanently stops all registered cron jobs.
|
|
118
|
+
*/
|
|
119
|
+
stopAll() {
|
|
120
|
+
for (const job of this.jobs.values()) {
|
|
121
|
+
job.stop();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Triggers immediate manual execution of a specific cron job by name.
|
|
126
|
+
*/
|
|
127
|
+
async trigger(name) {
|
|
128
|
+
const job = this.jobs.get(name);
|
|
129
|
+
if (!job) {
|
|
130
|
+
throw new Error(`[exis:cron] Job "${name}" not found`);
|
|
131
|
+
}
|
|
132
|
+
return job.trigger();
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Gracefully waits for all in-flight cron job executions to finish before server shutdown.
|
|
136
|
+
*/
|
|
137
|
+
async drain(timeoutMs = 5000) {
|
|
138
|
+
const drainPromises = Array.from(this.jobs.values()).map((job) => job.drain(timeoutMs));
|
|
139
|
+
await Promise.all(drainPromises);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.CronManager = CronManager;
|
|
143
|
+
/**
|
|
144
|
+
* Declarative helper for creating scheduled background jobs and cron tasks.
|
|
145
|
+
*
|
|
146
|
+
* @param scheduleOrOptions Standard 5/6-field cron pattern (e.g. `'0 * * * *'`) or full `CronJobOptions`
|
|
147
|
+
* @param handler Execution function receiving `CronContext`
|
|
148
|
+
* @returns Functional cron definition ready for export
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```ts
|
|
152
|
+
* // src/cron/cleanup.ts
|
|
153
|
+
* export default cron('0 0 * * *', async ({ log }) => {
|
|
154
|
+
* log.info('Running nightly cleanup')
|
|
155
|
+
* })
|
|
156
|
+
* ```
|
|
157
|
+
*/
|
|
158
|
+
function cron(scheduleOrOptions, handler) {
|
|
159
|
+
let options;
|
|
160
|
+
if (typeof scheduleOrOptions === 'string') {
|
|
161
|
+
options = {
|
|
162
|
+
schedule: scheduleOrOptions,
|
|
163
|
+
run: handler,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
options = {
|
|
168
|
+
...scheduleOrOptions,
|
|
169
|
+
run: handler || scheduleOrOptions.run || scheduleOrOptions.handle,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
__isExisCron: true,
|
|
174
|
+
options,
|
|
175
|
+
handler: options.run,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Schedules a cron job with human-readable English duration expressions.
|
|
180
|
+
*
|
|
181
|
+
* @param duration Natural language interval (e.g. `'5 minutes'`, `'1 hour'`, `'30 seconds'`, `'every weekday'`)
|
|
182
|
+
* @param handler Execution function receiving `CronContext`
|
|
183
|
+
* @param options Additional job options (retries, timezone, onError)
|
|
184
|
+
* @returns Functional cron definition
|
|
185
|
+
*
|
|
186
|
+
* @example
|
|
187
|
+
* ```ts
|
|
188
|
+
* export default cron.every('15 minutes', async ({ log }) => {
|
|
189
|
+
* log.info('Heartbeat check')
|
|
190
|
+
* })
|
|
191
|
+
* ```
|
|
192
|
+
*/
|
|
193
|
+
cron.every = function (duration, handler, options = {}) {
|
|
194
|
+
return cron({
|
|
195
|
+
schedule: (0, expressions_1.every)(duration),
|
|
196
|
+
run: handler,
|
|
197
|
+
...options,
|
|
198
|
+
});
|
|
199
|
+
};
|
|
200
|
+
/**
|
|
201
|
+
* Schedules a background task using millisecond fixed intervals with drift correction.
|
|
202
|
+
*
|
|
203
|
+
* @param ms Millisecond interval between executions
|
|
204
|
+
* @param handler Execution function receiving `CronContext`
|
|
205
|
+
* @param options Additional job options (retries, preventOverlap)
|
|
206
|
+
* @returns Functional cron definition
|
|
207
|
+
*
|
|
208
|
+
* @example
|
|
209
|
+
* ```ts
|
|
210
|
+
* export default cron.interval(60000, async ({ log }) => {
|
|
211
|
+
* log.info('Running every 60 seconds')
|
|
212
|
+
* })
|
|
213
|
+
* ```
|
|
214
|
+
*/
|
|
215
|
+
cron.interval = function (ms, handler, options = {}) {
|
|
216
|
+
return cron({
|
|
217
|
+
interval: ms,
|
|
218
|
+
run: handler,
|
|
219
|
+
...options,
|
|
220
|
+
});
|
|
221
|
+
};
|
|
222
|
+
/**
|
|
223
|
+
* Schedules a one-time background task to execute after a specified delay.
|
|
224
|
+
*
|
|
225
|
+
* @param ms Delay in milliseconds before execution
|
|
226
|
+
* @param handler Execution function receiving `CronContext`
|
|
227
|
+
* @param options Additional job options
|
|
228
|
+
* @returns Functional cron definition
|
|
229
|
+
*
|
|
230
|
+
* @example
|
|
231
|
+
* ```ts
|
|
232
|
+
* export default cron.timeout(5000, async ({ log }) => {
|
|
233
|
+
* log.info('Executed once after 5s startup delay')
|
|
234
|
+
* })
|
|
235
|
+
* ```
|
|
236
|
+
*/
|
|
237
|
+
cron.timeout = function (ms, handler, options = {}) {
|
|
238
|
+
return cron({
|
|
239
|
+
timeout: ms,
|
|
240
|
+
run: handler,
|
|
241
|
+
...options,
|
|
242
|
+
});
|
|
243
|
+
};
|
|
244
|
+
exports.defineCron = cron;
|
|
245
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/cron/manager.ts"],"names":[],"mappings":";;;AAuMA,oBAuBC;AA7ND,+BAA+B;AAE/B,+CAAqC;AAErC,MAAa,WAAW;IAItB,YAAY,GAAa;QAHjB,SAAI,GAAG,IAAI,GAAG,EAAmB,CAAA;QAIvC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACI,QAAQ,CACb,aAAsC,EACtC,QAAiB,EACjB,OAAmC,EACnC,OAAiC;QAEjC,IAAI,IAAoB,CAAA;QACxB,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACtC,IAAI,GAAG;gBACL,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,QAAS;gBACnB,GAAG,EAAE,OAAQ;gBACb,GAAG,OAAO;aACX,CAAA;QACH,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,aAAa,CAAA;QACtB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,aAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;QACvC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAChB,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,EACjB,8CAA8C,GAAG,CAAC,IAAI,GAAG,CAC1D,CAAA;YACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA;QACjC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAC5B,OAAO,GAAG,CAAA;IACZ,CAAC;IAED;;OAEG;IACI,QAAQ,CACb,IAAY,EACZ,EAAU,EACV,OAAkC,EAClC,OAAiC;QAEjC,OAAO,IAAI,CAAC,QAAQ,CAAC;YACnB,IAAI;YACJ,QAAQ,EAAE,EAAE;YACZ,GAAG,EAAE,OAAO;YACZ,GAAG,OAAO;SACX,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACI,OAAO,CACZ,IAAY,EACZ,EAAU,EACV,OAAkC,EAClC,OAAiC;QAEjC,OAAO,IAAI,CAAC,QAAQ,CAAC;YACnB,IAAI;YACJ,OAAO,EAAE,EAAE;YACX,GAAG,EAAE,OAAO;YACZ,GAAG,OAAO;SACX,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAED;;OAEG;IACI,OAAO;QACZ,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED;;OAEG;IACI,QAAQ;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;IACpE,CAAC;IAED;;OAEG;IACI,QAAQ;QACb,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACrC,GAAG,CAAC,KAAK,EAAE,CAAA;QACb,CAAC;IACH,CAAC;IAED;;OAEG;IACI,QAAQ;QACb,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACrC,GAAG,CAAC,KAAK,EAAE,CAAA;QACb,CAAC;IACH,CAAC;IAED;;OAEG;IACI,OAAO;QACZ,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACrC,GAAG,CAAC,IAAI,EAAE,CAAA;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,OAAO,CAAC,IAAY;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,aAAa,CAAC,CAAA;QACxD,CAAC;QACD,OAAO,GAAG,CAAC,OAAO,EAAE,CAAA;IACtB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI;QACjC,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC/D,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CACrB,CAAA;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IAClC,CAAC;CACF;AAxKD,kCAwKC;AAWD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,IAAI,CAClB,iBAA0C,EAC1C,OAAmC;IAEnC,IAAI,OAAuB,CAAA;IAE3B,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,GAAG;YACR,QAAQ,EAAE,iBAAiB;YAC3B,GAAG,EAAE,OAAO;SACb,CAAA;IACH,CAAC;SAAM,CAAC;QACN,OAAO,GAAG;YACR,GAAG,iBAAiB;YACpB,GAAG,EAAE,OAAO,IAAI,iBAAiB,CAAC,GAAG,IAAI,iBAAiB,CAAC,MAAM;SAClE,CAAA;IACH,CAAC;IAED,OAAO;QACL,YAAY,EAAE,IAAI;QAClB,OAAO;QACP,OAAO,EAAE,OAAO,CAAC,GAAG;KACrB,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,IAAI,CAAC,KAAK,GAAG,UACX,QAAgB,EAChB,OAAkC,EAClC,UAA+D,EAAE;IAEjE,OAAO,IAAI,CAAC;QACV,QAAQ,EAAE,IAAA,mBAAK,EAAC,QAAQ,CAAC;QACzB,GAAG,EAAE,OAAO;QACZ,GAAG,OAAO;KACX,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,IAAI,CAAC,QAAQ,GAAG,UACd,EAAU,EACV,OAAkC,EAClC,UAA+D,EAAE;IAEjE,OAAO,IAAI,CAAC;QACV,QAAQ,EAAE,EAAE;QACZ,GAAG,EAAE,OAAO;QACZ,GAAG,OAAO;KACX,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,IAAI,CAAC,OAAO,GAAG,UACb,EAAU,EACV,OAAkC,EAClC,UAA8D,EAAE;IAEhE,OAAO,IAAI,CAAC;QACV,OAAO,EAAE,EAAE;QACX,GAAG,EAAE,OAAO;QACZ,GAAG,OAAO;KACX,CAAC,CAAA;AACJ,CAAC,CAAA;AAEY,QAAA,UAAU,GAAG,IAAI,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface ParsedCronPattern {
|
|
2
|
+
hasSeconds: boolean;
|
|
3
|
+
seconds: Set<number>;
|
|
4
|
+
minutes: Set<number>;
|
|
5
|
+
hours: Set<number>;
|
|
6
|
+
daysOfMonth: Set<number>;
|
|
7
|
+
months: Set<number>;
|
|
8
|
+
daysOfWeek: Set<number>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parses a 5 or 6 field cron expression into a structured pattern object.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseCronExpression(expression: string): ParsedCronPattern;
|
|
14
|
+
/**
|
|
15
|
+
* Validates whether a cron expression is syntactically valid.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isValidCron(expression: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Calculates the next occurrence Date for a cron pattern from a base date.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getNextCronDate(pattern: ParsedCronPattern | string, fromDate?: Date, timezone?: string): Date;
|
|
22
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/cron/parser.ts"],"names":[],"mappings":"AAmCA,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACpB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACpB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAClB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACxB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACnB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CACxB;AA8ED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,CAkCzE;AAkFD;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAOvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,iBAAiB,GAAG,MAAM,EACnC,QAAQ,OAAa,EACrB,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAwDN"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseCronExpression = parseCronExpression;
|
|
4
|
+
exports.isValidCron = isValidCron;
|
|
5
|
+
exports.getNextCronDate = getNextCronDate;
|
|
6
|
+
const MONTH_NAMES = {
|
|
7
|
+
jan: 1,
|
|
8
|
+
feb: 2,
|
|
9
|
+
mar: 3,
|
|
10
|
+
apr: 4,
|
|
11
|
+
may: 5,
|
|
12
|
+
jun: 6,
|
|
13
|
+
jul: 7,
|
|
14
|
+
aug: 8,
|
|
15
|
+
sep: 9,
|
|
16
|
+
oct: 10,
|
|
17
|
+
nov: 11,
|
|
18
|
+
dec: 12,
|
|
19
|
+
};
|
|
20
|
+
const DAY_NAMES = {
|
|
21
|
+
sun: 0,
|
|
22
|
+
mon: 1,
|
|
23
|
+
tue: 2,
|
|
24
|
+
wed: 3,
|
|
25
|
+
thu: 4,
|
|
26
|
+
fri: 5,
|
|
27
|
+
sat: 6,
|
|
28
|
+
};
|
|
29
|
+
const MACROS = {
|
|
30
|
+
'@yearly': '0 0 1 1 *',
|
|
31
|
+
'@annually': '0 0 1 1 *',
|
|
32
|
+
'@monthly': '0 0 1 * *',
|
|
33
|
+
'@weekly': '0 0 * * 0',
|
|
34
|
+
'@daily': '0 0 * * *',
|
|
35
|
+
'@midnight': '0 0 * * *',
|
|
36
|
+
'@hourly': '0 * * * *',
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Parses a single cron field expression (e.g. `*`, `1,2,5`, `10-20`, `* /5`, `L`, `W`).
|
|
40
|
+
*/
|
|
41
|
+
function parseField(field, min, max, aliases) {
|
|
42
|
+
const result = new Set();
|
|
43
|
+
const str = field.trim().toLowerCase();
|
|
44
|
+
if (!str)
|
|
45
|
+
return result;
|
|
46
|
+
let normalized = str;
|
|
47
|
+
if (aliases) {
|
|
48
|
+
for (const [alias, val] of Object.entries(aliases)) {
|
|
49
|
+
normalized = normalized.replace(new RegExp(alias, 'g'), String(val));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const parts = normalized.split(',');
|
|
53
|
+
for (const part of parts) {
|
|
54
|
+
if (part === '*' || part === '?') {
|
|
55
|
+
for (let i = min; i <= max; i++)
|
|
56
|
+
result.add(i);
|
|
57
|
+
}
|
|
58
|
+
else if (part.includes('/')) {
|
|
59
|
+
const [rangeStr, stepStr] = part.split('/');
|
|
60
|
+
const step = parseInt(stepStr, 10);
|
|
61
|
+
if (isNaN(step) || step <= 0) {
|
|
62
|
+
throw new Error(`Invalid cron step: ${part}`);
|
|
63
|
+
}
|
|
64
|
+
let start = min;
|
|
65
|
+
let end = max;
|
|
66
|
+
if (rangeStr && rangeStr !== '*' && rangeStr !== '?') {
|
|
67
|
+
if (rangeStr.includes('-')) {
|
|
68
|
+
const [s, e] = rangeStr.split('-').map((v) => parseInt(v, 10));
|
|
69
|
+
start = isNaN(s) ? min : s;
|
|
70
|
+
end = isNaN(e) ? max : e;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
start = parseInt(rangeStr, 10);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
for (let i = start; i <= end; i += step) {
|
|
77
|
+
if (i >= min && i <= max)
|
|
78
|
+
result.add(i);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else if (part.includes('-')) {
|
|
82
|
+
const [sStr, eStr] = part.split('-');
|
|
83
|
+
const s = parseInt(sStr, 10);
|
|
84
|
+
const e = parseInt(eStr, 10);
|
|
85
|
+
if (isNaN(s) || isNaN(e) || s > e || s < min || e > max) {
|
|
86
|
+
throw new Error(`Invalid cron range: ${part} (min: ${min}, max: ${max})`);
|
|
87
|
+
}
|
|
88
|
+
for (let i = s; i <= e; i++)
|
|
89
|
+
result.add(i);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
const val = parseInt(part, 10);
|
|
93
|
+
if (isNaN(val) || val < min || val > max) {
|
|
94
|
+
if (min === 0 && max === 6 && val === 7) {
|
|
95
|
+
result.add(0);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
throw new Error(`Invalid cron value: ${part} (expected ${min}-${max})`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
result.add(val);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Parses a 5 or 6 field cron expression into a structured pattern object.
|
|
110
|
+
*/
|
|
111
|
+
function parseCronExpression(expression) {
|
|
112
|
+
const trimmed = expression.trim();
|
|
113
|
+
const exp = MACROS[trimmed] || trimmed;
|
|
114
|
+
const tokens = exp.split(/\s+/).filter(Boolean);
|
|
115
|
+
if (tokens.length !== 5 && tokens.length !== 6) {
|
|
116
|
+
throw new Error(`Invalid cron expression "${expression}". Expected 5 or 6 fields, received ${tokens.length}.`);
|
|
117
|
+
}
|
|
118
|
+
const hasSeconds = tokens.length === 6;
|
|
119
|
+
let secStr = '0';
|
|
120
|
+
let minStr;
|
|
121
|
+
let hourStr;
|
|
122
|
+
let domStr;
|
|
123
|
+
let monthStr;
|
|
124
|
+
let dowStr;
|
|
125
|
+
if (hasSeconds) {
|
|
126
|
+
;
|
|
127
|
+
[secStr, minStr, hourStr, domStr, monthStr, dowStr] = tokens;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
;
|
|
131
|
+
[minStr, hourStr, domStr, monthStr, dowStr] = tokens;
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
hasSeconds,
|
|
135
|
+
seconds: parseField(secStr, 0, 59),
|
|
136
|
+
minutes: parseField(minStr, 0, 59),
|
|
137
|
+
hours: parseField(hourStr, 0, 23),
|
|
138
|
+
daysOfMonth: parseField(domStr, 1, 31),
|
|
139
|
+
months: parseField(monthStr, 1, 12, MONTH_NAMES),
|
|
140
|
+
daysOfWeek: parseField(dowStr, 0, 6, DAY_NAMES),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
const formatterCache = new Map();
|
|
144
|
+
function getFormatter(timezone) {
|
|
145
|
+
if (!timezone || timezone.toUpperCase() === 'UTC')
|
|
146
|
+
return null;
|
|
147
|
+
let fmt = formatterCache.get(timezone);
|
|
148
|
+
if (!fmt) {
|
|
149
|
+
fmt = new Intl.DateTimeFormat('en-US', {
|
|
150
|
+
timeZone: timezone,
|
|
151
|
+
year: 'numeric',
|
|
152
|
+
month: 'numeric',
|
|
153
|
+
day: 'numeric',
|
|
154
|
+
hour: 'numeric',
|
|
155
|
+
minute: 'numeric',
|
|
156
|
+
second: 'numeric',
|
|
157
|
+
weekday: 'short',
|
|
158
|
+
hour12: false,
|
|
159
|
+
});
|
|
160
|
+
formatterCache.set(timezone, fmt);
|
|
161
|
+
}
|
|
162
|
+
return fmt;
|
|
163
|
+
}
|
|
164
|
+
const dayOfWeekMap = {
|
|
165
|
+
Sun: 0,
|
|
166
|
+
Mon: 1,
|
|
167
|
+
Tue: 2,
|
|
168
|
+
Wed: 3,
|
|
169
|
+
Thu: 4,
|
|
170
|
+
Fri: 5,
|
|
171
|
+
Sat: 6,
|
|
172
|
+
};
|
|
173
|
+
/**
|
|
174
|
+
* Computes date parts in a given IANA timezone using cached formatter.
|
|
175
|
+
*/
|
|
176
|
+
function getDatePartsInTimezone(date, timezone) {
|
|
177
|
+
const formatter = getFormatter(timezone);
|
|
178
|
+
if (!formatter) {
|
|
179
|
+
return {
|
|
180
|
+
year: date.getUTCFullYear(),
|
|
181
|
+
month: date.getUTCMonth() + 1,
|
|
182
|
+
day: date.getUTCDate(),
|
|
183
|
+
hour: date.getUTCHours(),
|
|
184
|
+
minute: date.getUTCMinutes(),
|
|
185
|
+
second: date.getUTCSeconds(),
|
|
186
|
+
dayOfWeek: date.getUTCDay(),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
const parts = formatter.formatToParts(date);
|
|
190
|
+
const map = {};
|
|
191
|
+
for (const part of parts) {
|
|
192
|
+
map[part.type] = part.value;
|
|
193
|
+
}
|
|
194
|
+
let hour = parseInt(map.hour, 10);
|
|
195
|
+
if (hour === 24)
|
|
196
|
+
hour = 0;
|
|
197
|
+
return {
|
|
198
|
+
year: parseInt(map.year, 10),
|
|
199
|
+
month: parseInt(map.month, 10),
|
|
200
|
+
day: parseInt(map.day, 10),
|
|
201
|
+
hour,
|
|
202
|
+
minute: parseInt(map.minute, 10),
|
|
203
|
+
second: parseInt(map.second, 10),
|
|
204
|
+
dayOfWeek: dayOfWeekMap[map.weekday] ?? date.getUTCDay(),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Validates whether a cron expression is syntactically valid.
|
|
209
|
+
*/
|
|
210
|
+
function isValidCron(expression) {
|
|
211
|
+
try {
|
|
212
|
+
parseCronExpression(expression);
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Calculates the next occurrence Date for a cron pattern from a base date.
|
|
221
|
+
*/
|
|
222
|
+
function getNextCronDate(pattern, fromDate = new Date(), timezone) {
|
|
223
|
+
const parsed = typeof pattern === 'string' ? parseCronExpression(pattern) : pattern;
|
|
224
|
+
const current = new Date(fromDate.getTime());
|
|
225
|
+
if (parsed.hasSeconds) {
|
|
226
|
+
current.setUTCSeconds(current.getUTCSeconds() + 1, 0);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
current.setUTCSeconds(0, 0);
|
|
230
|
+
current.setUTCMinutes(current.getUTCMinutes() + 1);
|
|
231
|
+
}
|
|
232
|
+
const stepMs = parsed.hasSeconds ? 1000 : 60 * 1000;
|
|
233
|
+
const maxIterations = 5 * 365 * 24 * 60; // 5 years
|
|
234
|
+
for (let i = 0; i < maxIterations; i++) {
|
|
235
|
+
const parts = getDatePartsInTimezone(current, timezone);
|
|
236
|
+
if (!parsed.months.has(parts.month)) {
|
|
237
|
+
current.setTime(current.getTime() + 12 * 60 * 60 * 1000);
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
const domMatch = parsed.daysOfMonth.has(parts.day);
|
|
241
|
+
const dowMatch = parsed.daysOfWeek.has(parts.dayOfWeek);
|
|
242
|
+
if (!domMatch || !dowMatch) {
|
|
243
|
+
current.setTime(current.getTime() + 12 * 60 * 60 * 1000);
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
if (!parsed.hours.has(parts.hour)) {
|
|
247
|
+
current.setTime(current.getTime() + 60 * 60 * 1000);
|
|
248
|
+
// Align to start of hour in current timezone
|
|
249
|
+
const hourPart = getDatePartsInTimezone(current, timezone);
|
|
250
|
+
if (hourPart.minute !== 0) {
|
|
251
|
+
current.setTime(current.getTime() - hourPart.minute * 60 * 1000);
|
|
252
|
+
}
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
if (!parsed.minutes.has(parts.minute)) {
|
|
256
|
+
current.setTime(current.getTime() + stepMs);
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
if (parsed.hasSeconds) {
|
|
260
|
+
if (!parsed.seconds.has(parts.second)) {
|
|
261
|
+
current.setTime(current.getTime() + 1000);
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return current;
|
|
266
|
+
}
|
|
267
|
+
throw new Error('Unable to find next cron execution within 5-year window');
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/cron/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { App } from '../server/app';
|
|
2
|
+
import type { Logger } from '../types';
|
|
3
|
+
export type CronSchedule = string | Date | number;
|
|
4
|
+
export type OverlapPolicy = 'skip' | 'queue';
|
|
5
|
+
export type CronJobStatus = 'idle' | 'running' | 'paused' | 'stopped';
|
|
6
|
+
export interface CronJobOptions {
|
|
7
|
+
/** Unique name for the cron job */
|
|
8
|
+
name?: string;
|
|
9
|
+
/** Cron pattern (e.g. '0 0 * * *' or '0 *\/5 * * * *') */
|
|
10
|
+
schedule?: string;
|
|
11
|
+
/** Interval in milliseconds */
|
|
12
|
+
interval?: number;
|
|
13
|
+
/** Timeout delay in milliseconds (runs once) */
|
|
14
|
+
timeout?: number;
|
|
15
|
+
/** IANA Timezone string (e.g. 'UTC', 'America/New_York', 'Asia/Kolkata') */
|
|
16
|
+
timezone?: string;
|
|
17
|
+
/**
|
|
18
|
+
* If true, prevents concurrent executions if the job takes longer than its interval.
|
|
19
|
+
* Default: true
|
|
20
|
+
*/
|
|
21
|
+
preventOverlap?: boolean;
|
|
22
|
+
/** Action to take when an execution overlaps ('skip' to drop, 'queue' to run immediately after) */
|
|
23
|
+
onOverlap?: OverlapPolicy;
|
|
24
|
+
/** Whether the job starts running automatically upon registration. Default: true */
|
|
25
|
+
autoStart?: boolean;
|
|
26
|
+
/** Number of retry attempts if the handler throws an error */
|
|
27
|
+
retries?: number;
|
|
28
|
+
/** Backoff strategy between retries in milliseconds */
|
|
29
|
+
retryDelayMs?: number;
|
|
30
|
+
/** Optional error hook specific to this job */
|
|
31
|
+
onError?: (err: Error, context: CronContext) => void | Promise<void>;
|
|
32
|
+
/** Handler function for the cron job */
|
|
33
|
+
run?: (context: CronContext) => any | Promise<any>;
|
|
34
|
+
/** Alternative handler key name */
|
|
35
|
+
handle?: (context: CronContext) => any | Promise<any>;
|
|
36
|
+
}
|
|
37
|
+
export interface CronContext {
|
|
38
|
+
/** The Exis application instance */
|
|
39
|
+
app: App<any>;
|
|
40
|
+
/** Structured logger */
|
|
41
|
+
log: Logger;
|
|
42
|
+
/** Name of the running job */
|
|
43
|
+
jobName: string;
|
|
44
|
+
/** Timestamp when this execution started */
|
|
45
|
+
startedAt: Date;
|
|
46
|
+
/** Current execution iteration count */
|
|
47
|
+
iteration: number;
|
|
48
|
+
/** Signal that aborts when the server initiates graceful shutdown */
|
|
49
|
+
signal?: AbortSignal;
|
|
50
|
+
}
|
|
51
|
+
export interface CronJobStats {
|
|
52
|
+
name: string;
|
|
53
|
+
status: CronJobStatus;
|
|
54
|
+
schedule?: string;
|
|
55
|
+
intervalMs?: number;
|
|
56
|
+
timezone?: string;
|
|
57
|
+
preventOverlap: boolean;
|
|
58
|
+
lastRun?: Date;
|
|
59
|
+
nextRun?: Date;
|
|
60
|
+
executionCount: number;
|
|
61
|
+
failureCount: number;
|
|
62
|
+
lastDurationMs?: number;
|
|
63
|
+
lastError?: string;
|
|
64
|
+
}
|
|
65
|
+
export interface IntervalOptions {
|
|
66
|
+
name?: string;
|
|
67
|
+
preventOverlap?: boolean;
|
|
68
|
+
autoStart?: boolean;
|
|
69
|
+
onError?: (err: Error, context: CronContext) => void | Promise<void>;
|
|
70
|
+
}
|
|
71
|
+
export interface TimeoutOptions {
|
|
72
|
+
name?: string;
|
|
73
|
+
autoStart?: boolean;
|
|
74
|
+
onError?: (err: Error, context: CronContext) => void | Promise<void>;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cron/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cron/types.ts"],"names":[],"mappings":""}
|
|
@@ -9,6 +9,8 @@ export declare const PARAM_METADATA: unique symbol;
|
|
|
9
9
|
export declare const SERVER_CONFIG: unique symbol;
|
|
10
10
|
export declare const BOUNDARY_CONFIG: unique symbol;
|
|
11
11
|
export declare const MODULE_METADATA: unique symbol;
|
|
12
|
+
export declare const CRON_REGISTRY: unique symbol;
|
|
13
|
+
export declare const CRON_META: unique symbol;
|
|
12
14
|
export declare const ROUTE_META: unique symbol;
|
|
13
15
|
export declare const METHOD_MIDDLEWARES: unique symbol;
|
|
14
16
|
export declare const ROUTE_METADATA_PROP: unique symbol;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/decorators/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAGvD,eAAO,MAAM,cAAc,eAA8B,CAAA;AACzD,eAAO,MAAM,iBAAiB,eAAyC,CAAA;AACvE,eAAO,MAAM,eAAe,eAAuC,CAAA;AACnE,eAAO,MAAM,mBAAmB,eAAmC,CAAA;AACnE,eAAO,MAAM,cAAc,eAAsC,CAAA;AACjE,eAAO,MAAM,kBAAkB,eAA0C,CAAA;AACzE,eAAO,MAAM,cAAc,eAAsC,CAAA;AACjE,eAAO,MAAM,aAAa,eAAqC,CAAA;AAC/D,eAAO,MAAM,eAAe,eAAuC,CAAA;AACnE,eAAO,MAAM,eAAe,eAAuC,CAAA;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/decorators/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAGvD,eAAO,MAAM,cAAc,eAA8B,CAAA;AACzD,eAAO,MAAM,iBAAiB,eAAyC,CAAA;AACvE,eAAO,MAAM,eAAe,eAAuC,CAAA;AACnE,eAAO,MAAM,mBAAmB,eAAmC,CAAA;AACnE,eAAO,MAAM,cAAc,eAAsC,CAAA;AACjE,eAAO,MAAM,kBAAkB,eAA0C,CAAA;AACzE,eAAO,MAAM,cAAc,eAAsC,CAAA;AACjE,eAAO,MAAM,aAAa,eAAqC,CAAA;AAC/D,eAAO,MAAM,eAAe,eAAuC,CAAA;AACnE,eAAO,MAAM,eAAe,eAAuC,CAAA;AACnE,eAAO,MAAM,aAAa,eAAiC,CAAA;AAC3D,eAAO,MAAM,SAAS,eAAiC,CAAA;AAEvD,eAAO,MAAM,UAAU,eAAkC,CAAA;AACzD,eAAO,MAAM,kBAAkB,eAA0C,CAAA;AACzE,eAAO,MAAM,mBAAmB,eAA2C,CAAA;AAC3E,eAAO,MAAM,uBAAuB,eAEnC,CAAA;AACD,eAAO,MAAM,mBAAmB,eAA2C,CAAA;AAE3E,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IACxC,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,GAAG,EAAE,CAAA;IACf,SAAS,CAAC,EAAE,GAAG,EAAE,CAAA;IACjB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACZ,KAAK,CAAC,EAAE,GAAG,EAAE,CAAA;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,GAAG,EAAE,CAAA;IACf,UAAU,CAAC,EAAE,GAAG,EAAE,CAAA;IAClB,OAAO,CAAC,EAAE,GAAG,EAAE,CAAA;IACf,MAAM,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,YAAY,CAAC,EAAE,GAAG,EAAE,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,CAAA;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC9B,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAA;IACf,SAAS,CAAC,EAAE,GAAG,EAAE,CAAA;IACjB,YAAY,CAAC,EAAE,GAAG,CAAA;IAClB,WAAW,CAAC,EAAE,GAAG,CAAA;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAA;IACf,WAAW,CAAC,EAAE,GAAG,EAAE,CAAA;IACnB,SAAS,CAAC,EAAE,GAAG,EAAE,CAAA;IACjB,OAAO,CAAC,EAAE,GAAG,EAAE,CAAA;CAChB"}
|