@zmdb/jobs 1.0.0-beta.1
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 +674 -0
- package/README.md +87 -0
- package/dist/extension.d.ts +15 -0
- package/dist/extension.d.ts.map +1 -0
- package/dist/extension.js +74 -0
- package/dist/extension.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/queues/index.d.ts +191 -0
- package/dist/queues/index.d.ts.map +1 -0
- package/dist/queues/index.js +527 -0
- package/dist/queues/index.js.map +1 -0
- package/dist/schedule/cron.d.ts +8 -0
- package/dist/schedule/cron.d.ts.map +1 -0
- package/dist/schedule/cron.js +390 -0
- package/dist/schedule/cron.js.map +1 -0
- package/dist/schedule/index.d.ts +62 -0
- package/dist/schedule/index.d.ts.map +1 -0
- package/dist/schedule/index.js +442 -0
- package/dist/schedule/index.js.map +1 -0
- package/dist/schedule/lease.d.ts +26 -0
- package/dist/schedule/lease.d.ts.map +1 -0
- package/dist/schedule/lease.js +90 -0
- package/dist/schedule/lease.js.map +1 -0
- package/package.json +53 -0
- package/src/extension.ts +93 -0
- package/src/index.ts +42 -0
- package/src/queues/index.ts +763 -0
- package/src/schedule/cron.ts +490 -0
- package/src/schedule/index.ts +590 -0
- package/src/schedule/lease.ts +116 -0
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
// Cron parsing and zoned next-instant calculation for @zmdb/jobs/schedule.
|
|
2
|
+
//
|
|
3
|
+
// Expressions are parsed once into numeric sets. Runtime state is always an
|
|
4
|
+
// epoch-millisecond instant; local calendar fields exist only while calculating
|
|
5
|
+
// the next one. Resolving a wall time uses Temporal's "compatible" rule: gaps
|
|
6
|
+
// move forward and overlaps choose the earlier instant.
|
|
7
|
+
const SECOND_MS = 1000;
|
|
8
|
+
const MINUTE_MS = 60 * SECOND_MS;
|
|
9
|
+
const HOUR_MS = 60 * MINUTE_MS;
|
|
10
|
+
const DAY_MS = 24 * HOUR_MS;
|
|
11
|
+
const MAX_SEARCH_DAYS = 366 * 8;
|
|
12
|
+
const MONTH_NAMES = new Map([
|
|
13
|
+
['JAN', 1],
|
|
14
|
+
['FEB', 2],
|
|
15
|
+
['MAR', 3],
|
|
16
|
+
['APR', 4],
|
|
17
|
+
['MAY', 5],
|
|
18
|
+
['JUN', 6],
|
|
19
|
+
['JUL', 7],
|
|
20
|
+
['AUG', 8],
|
|
21
|
+
['SEP', 9],
|
|
22
|
+
['OCT', 10],
|
|
23
|
+
['NOV', 11],
|
|
24
|
+
['DEC', 12],
|
|
25
|
+
]);
|
|
26
|
+
const WEEKDAY_NAMES = new Map([
|
|
27
|
+
['SUN', 0],
|
|
28
|
+
['MON', 1],
|
|
29
|
+
['TUE', 2],
|
|
30
|
+
['WED', 3],
|
|
31
|
+
['THU', 4],
|
|
32
|
+
['FRI', 5],
|
|
33
|
+
['SAT', 6],
|
|
34
|
+
]);
|
|
35
|
+
const NICKNAMES = new Map([
|
|
36
|
+
['@yearly', '0 0 1 1 *'],
|
|
37
|
+
['@annually', '0 0 1 1 *'],
|
|
38
|
+
['@monthly', '0 0 1 * *'],
|
|
39
|
+
['@weekly', '0 0 * * 0'],
|
|
40
|
+
['@daily', '0 0 * * *'],
|
|
41
|
+
['@midnight', '0 0 * * *'],
|
|
42
|
+
['@hourly', '0 * * * *'],
|
|
43
|
+
]);
|
|
44
|
+
const SECOND = { kind: 'second', minimum: 0, maximum: 59 };
|
|
45
|
+
const MINUTE = { kind: 'minute', minimum: 0, maximum: 59 };
|
|
46
|
+
const HOUR = { kind: 'hour', minimum: 0, maximum: 23 };
|
|
47
|
+
const DAY_OF_MONTH = { kind: 'day-of-month', minimum: 1, maximum: 31 };
|
|
48
|
+
const MONTH = { kind: 'month', minimum: 1, maximum: 12, names: MONTH_NAMES };
|
|
49
|
+
const DAY_OF_WEEK = { kind: 'day-of-week', minimum: 0, maximum: 7, names: WEEKDAY_NAMES };
|
|
50
|
+
/** Parse once and return the two next-instant operations the scheduler needs. */
|
|
51
|
+
export function createCronPlan(expression, timeZone, taskName) {
|
|
52
|
+
const parsed = parseExpression(expression, taskName);
|
|
53
|
+
const formatter = createFormatter(timeZone, taskName);
|
|
54
|
+
const nextAfter = (instant) => {
|
|
55
|
+
const local = localParts(formatter, instant);
|
|
56
|
+
const firstDay = Date.UTC(local.year, local.month - 1, local.day);
|
|
57
|
+
for (let offset = 0; offset < MAX_SEARCH_DAYS; offset += 1) {
|
|
58
|
+
const candidateDateValue = new Date(firstDay + offset * DAY_MS);
|
|
59
|
+
const date = {
|
|
60
|
+
year: candidateDateValue.getUTCFullYear(),
|
|
61
|
+
month: candidateDateValue.getUTCMonth() + 1,
|
|
62
|
+
day: candidateDateValue.getUTCDate(),
|
|
63
|
+
};
|
|
64
|
+
if (!dateMatches(parsed, date)) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const threshold = offset === 0 ? local.hour * 3600 + local.minute * 60 + local.second : -1;
|
|
68
|
+
const candidate = candidateOnDate(parsed, formatter, date, threshold, instant);
|
|
69
|
+
if (candidate !== undefined) {
|
|
70
|
+
return candidate;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
throw new RangeError(`@zmdb/jobs: schedule "${taskName}" has no cron instant within ${String(MAX_SEARCH_DAYS)} days`);
|
|
74
|
+
};
|
|
75
|
+
return {
|
|
76
|
+
nextAtOrAfter: instant => nextAfter(instant - 1),
|
|
77
|
+
nextAfter,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function parseExpression(expression, taskName) {
|
|
81
|
+
const source = expression.trim();
|
|
82
|
+
if (source === '@reboot') {
|
|
83
|
+
throw cronError(taskName, 'expression', expression, '@reboot is not an instant');
|
|
84
|
+
}
|
|
85
|
+
const expanded = source.startsWith('@') ? NICKNAMES.get(source.toLowerCase()) : source;
|
|
86
|
+
if (expanded === undefined) {
|
|
87
|
+
throw cronError(taskName, 'expression', expression, 'unknown cron nickname');
|
|
88
|
+
}
|
|
89
|
+
const fields = expanded.split(/\s+/);
|
|
90
|
+
if (fields.length !== 5 && fields.length !== 6) {
|
|
91
|
+
throw cronError(taskName, 'expression', expression, 'expected five fields or six with leading seconds');
|
|
92
|
+
}
|
|
93
|
+
const values = fields.length === 5 ? ['0', ...fields] : fields;
|
|
94
|
+
const second = values[0];
|
|
95
|
+
const minute = values[1];
|
|
96
|
+
const hour = values[2];
|
|
97
|
+
const dayOfMonth = values[3];
|
|
98
|
+
const month = values[4];
|
|
99
|
+
const dayOfWeek = values[5];
|
|
100
|
+
if (second === undefined ||
|
|
101
|
+
minute === undefined ||
|
|
102
|
+
hour === undefined ||
|
|
103
|
+
dayOfMonth === undefined ||
|
|
104
|
+
month === undefined ||
|
|
105
|
+
dayOfWeek === undefined) {
|
|
106
|
+
throw cronError(taskName, 'expression', expression, 'incomplete cron expression');
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
seconds: parseField(second, SECOND, taskName),
|
|
110
|
+
minutes: parseField(minute, MINUTE, taskName),
|
|
111
|
+
hours: parseField(hour, HOUR, taskName),
|
|
112
|
+
daysOfMonth: parseField(dayOfMonth, DAY_OF_MONTH, taskName),
|
|
113
|
+
months: parseField(month, MONTH, taskName),
|
|
114
|
+
daysOfWeek: parseField(dayOfWeek, DAY_OF_WEEK, taskName),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function parseField(source, spec, taskName) {
|
|
118
|
+
if (/[LW#?]/i.test(source)) {
|
|
119
|
+
throw cronError(taskName, spec.kind, source, 'Quartz extensions are not supported');
|
|
120
|
+
}
|
|
121
|
+
const values = new Set();
|
|
122
|
+
for (const segment of source.split(',')) {
|
|
123
|
+
if (segment.length === 0) {
|
|
124
|
+
throw cronError(taskName, spec.kind, source, 'empty list item');
|
|
125
|
+
}
|
|
126
|
+
const stepParts = segment.split('/');
|
|
127
|
+
if (stepParts.length > 2) {
|
|
128
|
+
throw cronError(taskName, spec.kind, source, 'too many step separators');
|
|
129
|
+
}
|
|
130
|
+
const base = stepParts[0];
|
|
131
|
+
const stepSource = stepParts[1];
|
|
132
|
+
if (base === undefined || base.length === 0) {
|
|
133
|
+
throw cronError(taskName, spec.kind, source, 'missing range before step');
|
|
134
|
+
}
|
|
135
|
+
const step = stepSource === undefined ? 1 : parseInteger(stepSource, spec, taskName, source);
|
|
136
|
+
if (step <= 0) {
|
|
137
|
+
throw cronError(taskName, spec.kind, source, 'step must be a positive integer');
|
|
138
|
+
}
|
|
139
|
+
let first;
|
|
140
|
+
let last;
|
|
141
|
+
if (base === '*') {
|
|
142
|
+
first = spec.minimum;
|
|
143
|
+
last = spec.maximum;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
const range = base.split('-');
|
|
147
|
+
if (range.length > 2) {
|
|
148
|
+
throw cronError(taskName, spec.kind, source, 'too many range separators');
|
|
149
|
+
}
|
|
150
|
+
const start = range[0];
|
|
151
|
+
const end = range[1];
|
|
152
|
+
if (start === undefined || start.length === 0) {
|
|
153
|
+
throw cronError(taskName, spec.kind, source, 'missing range start');
|
|
154
|
+
}
|
|
155
|
+
first = parseValue(start, spec, taskName, source);
|
|
156
|
+
last = end === undefined ? first : parseValue(end, spec, taskName, source);
|
|
157
|
+
if (stepSource !== undefined && end === undefined) {
|
|
158
|
+
throw cronError(taskName, spec.kind, source, 'a stepped value must use * or a range');
|
|
159
|
+
}
|
|
160
|
+
if (last < first) {
|
|
161
|
+
throw cronError(taskName, spec.kind, source, 'range end precedes its start');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
for (let value = first; value <= last; value += step) {
|
|
165
|
+
values.add(spec.kind === 'day-of-week' && value === 7 ? 0 : value);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const ordered = [...values].toSorted((left, right) => left - right);
|
|
169
|
+
if (ordered.length === 0) {
|
|
170
|
+
throw cronError(taskName, spec.kind, source, 'field selects no values');
|
|
171
|
+
}
|
|
172
|
+
return { values: ordered, matches: new Set(ordered), wildcard: source === '*' };
|
|
173
|
+
}
|
|
174
|
+
function parseValue(source, spec, taskName, field) {
|
|
175
|
+
const named = spec.names?.get(source.toUpperCase());
|
|
176
|
+
const value = named ?? parseInteger(source, spec, taskName, field);
|
|
177
|
+
if (value < spec.minimum || value > spec.maximum) {
|
|
178
|
+
throw cronError(taskName, spec.kind, field, `value ${String(value)} is outside ${String(spec.minimum)}-${String(spec.maximum)}`);
|
|
179
|
+
}
|
|
180
|
+
return value;
|
|
181
|
+
}
|
|
182
|
+
function parseInteger(source, spec, taskName, field) {
|
|
183
|
+
if (!/^\d+$/.test(source)) {
|
|
184
|
+
throw cronError(taskName, spec.kind, field, `"${source}" is not a number or known name`);
|
|
185
|
+
}
|
|
186
|
+
return Number.parseInt(source, 10);
|
|
187
|
+
}
|
|
188
|
+
function cronError(taskName, field, source, detail) {
|
|
189
|
+
return new RangeError(`@zmdb/jobs: schedule "${taskName}" has invalid ${field} "${source}": ${detail}`);
|
|
190
|
+
}
|
|
191
|
+
function createFormatter(timeZone, taskName) {
|
|
192
|
+
try {
|
|
193
|
+
const formatter = new Intl.DateTimeFormat('en-CA', {
|
|
194
|
+
timeZone,
|
|
195
|
+
calendar: 'iso8601',
|
|
196
|
+
numberingSystem: 'latn',
|
|
197
|
+
year: 'numeric',
|
|
198
|
+
month: '2-digit',
|
|
199
|
+
day: '2-digit',
|
|
200
|
+
hour: '2-digit',
|
|
201
|
+
minute: '2-digit',
|
|
202
|
+
second: '2-digit',
|
|
203
|
+
hourCycle: 'h23',
|
|
204
|
+
});
|
|
205
|
+
formatter.formatToParts(new Date(0));
|
|
206
|
+
return formatter;
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
throw new RangeError(`@zmdb/jobs: schedule "${taskName}" has unknown time zone "${timeZone}"`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function localParts(formatter, instant) {
|
|
213
|
+
let year = Number.NaN;
|
|
214
|
+
let month = Number.NaN;
|
|
215
|
+
let day = Number.NaN;
|
|
216
|
+
let hour = Number.NaN;
|
|
217
|
+
let minute = Number.NaN;
|
|
218
|
+
let second = Number.NaN;
|
|
219
|
+
for (const part of formatter.formatToParts(new Date(instant))) {
|
|
220
|
+
const value = Number.parseInt(part.value, 10);
|
|
221
|
+
if (part.type === 'year')
|
|
222
|
+
year = value;
|
|
223
|
+
else if (part.type === 'month')
|
|
224
|
+
month = value;
|
|
225
|
+
else if (part.type === 'day')
|
|
226
|
+
day = value;
|
|
227
|
+
else if (part.type === 'hour')
|
|
228
|
+
hour = value;
|
|
229
|
+
else if (part.type === 'minute')
|
|
230
|
+
minute = value;
|
|
231
|
+
else if (part.type === 'second')
|
|
232
|
+
second = value;
|
|
233
|
+
}
|
|
234
|
+
if ([year, month, day, hour, minute, second].some(value => !Number.isFinite(value))) {
|
|
235
|
+
throw new Error('@zmdb/jobs: Intl.DateTimeFormat omitted a required calendar field');
|
|
236
|
+
}
|
|
237
|
+
return { year, month, day, hour, minute, second };
|
|
238
|
+
}
|
|
239
|
+
function dateMatches(expression, date) {
|
|
240
|
+
if (!expression.months.matches.has(date.month)) {
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
const dayOfMonth = expression.daysOfMonth.matches.has(date.day);
|
|
244
|
+
const dayOfWeek = expression.daysOfWeek.matches.has(new Date(Date.UTC(date.year, date.month - 1, date.day)).getUTCDay());
|
|
245
|
+
if (expression.daysOfMonth.wildcard && expression.daysOfWeek.wildcard) {
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
if (expression.daysOfMonth.wildcard) {
|
|
249
|
+
return dayOfWeek;
|
|
250
|
+
}
|
|
251
|
+
if (expression.daysOfWeek.wildcard) {
|
|
252
|
+
return dayOfMonth;
|
|
253
|
+
}
|
|
254
|
+
return dayOfMonth || dayOfWeek;
|
|
255
|
+
}
|
|
256
|
+
function candidateOnDate(expression, formatter, date, threshold, after) {
|
|
257
|
+
let best;
|
|
258
|
+
let cursor = threshold;
|
|
259
|
+
for (let attempts = 0; attempts < 86_400; attempts += 1) {
|
|
260
|
+
const secondOfDay = firstAllowedTimeAfter(expression, cursor);
|
|
261
|
+
if (secondOfDay === undefined) {
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
const candidate = resolveWallTime(formatter, date, secondOfDay);
|
|
265
|
+
if (candidate > after) {
|
|
266
|
+
best = candidate;
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
cursor = secondOfDay;
|
|
270
|
+
}
|
|
271
|
+
for (const range of gapRanges(formatter, date)) {
|
|
272
|
+
let gapCursor = range.startSecond - 1;
|
|
273
|
+
for (let attempts = 0; attempts < 86_400; attempts += 1) {
|
|
274
|
+
const secondOfDay = firstAllowedTimeAfter(expression, gapCursor);
|
|
275
|
+
if (secondOfDay === undefined || secondOfDay >= range.endSecond) {
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
const candidate = resolveWallTime(formatter, date, secondOfDay);
|
|
279
|
+
if (candidate > after) {
|
|
280
|
+
best = best === undefined ? candidate : Math.min(best, candidate);
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
gapCursor = secondOfDay;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return best;
|
|
287
|
+
}
|
|
288
|
+
function firstAllowedTimeAfter(expression, threshold) {
|
|
289
|
+
for (const hour of expression.hours.values) {
|
|
290
|
+
for (const minute of expression.minutes.values) {
|
|
291
|
+
for (const second of expression.seconds.values) {
|
|
292
|
+
const candidate = hour * 3600 + minute * 60 + second;
|
|
293
|
+
if (candidate > threshold) {
|
|
294
|
+
return candidate;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return undefined;
|
|
300
|
+
}
|
|
301
|
+
function resolveWallTime(formatter, date, secondOfDay) {
|
|
302
|
+
const desired = {
|
|
303
|
+
...date,
|
|
304
|
+
hour: Math.floor(secondOfDay / 3600),
|
|
305
|
+
minute: Math.floor((secondOfDay % 3600) / 60),
|
|
306
|
+
second: secondOfDay % 60,
|
|
307
|
+
};
|
|
308
|
+
const wall = wallEpoch(desired);
|
|
309
|
+
const offsets = offsetsNear(formatter, wall);
|
|
310
|
+
const exact = [...offsets]
|
|
311
|
+
.map(offset => wall - offset)
|
|
312
|
+
.filter(candidate => sameLocal(localParts(formatter, candidate), desired))
|
|
313
|
+
.toSorted((left, right) => left - right);
|
|
314
|
+
const first = exact[0];
|
|
315
|
+
if (first !== undefined) {
|
|
316
|
+
return first;
|
|
317
|
+
}
|
|
318
|
+
// No instant owns this wall time: it is inside a forward offset transition.
|
|
319
|
+
// Temporal's "compatible" rule uses the pre-transition offset, shifting the
|
|
320
|
+
// local time forward by the size of the gap.
|
|
321
|
+
return wall - Math.min(...offsets);
|
|
322
|
+
}
|
|
323
|
+
function offsetsNear(formatter, wall) {
|
|
324
|
+
const offsets = new Set();
|
|
325
|
+
for (let hours = -36; hours <= 36; hours += 6) {
|
|
326
|
+
offsets.add(offsetAt(formatter, wall + hours * HOUR_MS));
|
|
327
|
+
}
|
|
328
|
+
return offsets;
|
|
329
|
+
}
|
|
330
|
+
function offsetAt(formatter, instant) {
|
|
331
|
+
const rounded = Math.floor(instant / SECOND_MS) * SECOND_MS;
|
|
332
|
+
return wallEpoch(localParts(formatter, rounded)) - rounded;
|
|
333
|
+
}
|
|
334
|
+
function wallEpoch(parts) {
|
|
335
|
+
return Date.UTC(parts.year, parts.month - 1, parts.day, parts.hour, parts.minute, parts.second);
|
|
336
|
+
}
|
|
337
|
+
function sameLocal(left, right) {
|
|
338
|
+
return (left.year === right.year &&
|
|
339
|
+
left.month === right.month &&
|
|
340
|
+
left.day === right.day &&
|
|
341
|
+
left.hour === right.hour &&
|
|
342
|
+
left.minute === right.minute &&
|
|
343
|
+
left.second === right.second);
|
|
344
|
+
}
|
|
345
|
+
function gapRanges(formatter, date) {
|
|
346
|
+
const dayStart = Date.UTC(date.year, date.month - 1, date.day);
|
|
347
|
+
const dayEnd = dayStart + DAY_MS;
|
|
348
|
+
const scanStart = dayStart - 36 * HOUR_MS;
|
|
349
|
+
const scanEnd = dayEnd + 36 * HOUR_MS;
|
|
350
|
+
const ranges = [];
|
|
351
|
+
let previousInstant = scanStart;
|
|
352
|
+
let previousOffset = offsetAt(formatter, previousInstant);
|
|
353
|
+
for (let instant = scanStart + HOUR_MS; instant <= scanEnd; instant += HOUR_MS) {
|
|
354
|
+
const currentOffset = offsetAt(formatter, instant);
|
|
355
|
+
if (currentOffset !== previousOffset) {
|
|
356
|
+
const transition = firstOffsetChange(formatter, previousInstant, instant, previousOffset);
|
|
357
|
+
const afterOffset = offsetAt(formatter, transition);
|
|
358
|
+
if (afterOffset > previousOffset) {
|
|
359
|
+
const gapStart = wallEpoch(localParts(formatter, transition - SECOND_MS)) + SECOND_MS;
|
|
360
|
+
const gapEnd = wallEpoch(localParts(formatter, transition));
|
|
361
|
+
const intersectionStart = Math.max(dayStart, gapStart);
|
|
362
|
+
const intersectionEnd = Math.min(dayEnd, gapEnd);
|
|
363
|
+
if (intersectionStart < intersectionEnd) {
|
|
364
|
+
ranges.push({
|
|
365
|
+
startSecond: (intersectionStart - dayStart) / SECOND_MS,
|
|
366
|
+
endSecond: (intersectionEnd - dayStart) / SECOND_MS,
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
previousOffset = currentOffset;
|
|
371
|
+
}
|
|
372
|
+
previousInstant = instant;
|
|
373
|
+
}
|
|
374
|
+
return ranges;
|
|
375
|
+
}
|
|
376
|
+
function firstOffsetChange(formatter, lower, upper, previousOffset) {
|
|
377
|
+
let left = lower;
|
|
378
|
+
let right = upper;
|
|
379
|
+
while (right - left > SECOND_MS) {
|
|
380
|
+
const middle = Math.floor((left + right) / (2 * SECOND_MS)) * SECOND_MS;
|
|
381
|
+
if (offsetAt(formatter, middle) === previousOffset) {
|
|
382
|
+
left = middle;
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
right = middle;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
return right;
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=cron.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/schedule/cron.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import '@zmdb/app';
|
|
2
|
+
import type { Clock } from '../queues/index.js';
|
|
3
|
+
import { type LeaseStore } from './lease.js';
|
|
4
|
+
export type { LeaseStore } from './lease.js';
|
|
5
|
+
type ScheduledMethod = (signal: AbortSignal) => void | Promise<void>;
|
|
6
|
+
export type TaskDecorator = (target: ScheduledMethod, context: ClassMethodDecoratorContext) => void;
|
|
7
|
+
export type TaskRuns = 'once-per-replica' | 'once-per-cluster';
|
|
8
|
+
export interface TaskOptions {
|
|
9
|
+
readonly runs: TaskRuns;
|
|
10
|
+
readonly name?: string;
|
|
11
|
+
readonly timeZone?: string;
|
|
12
|
+
readonly timeoutMs?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface IntervalOptions {
|
|
15
|
+
readonly runs: TaskRuns;
|
|
16
|
+
readonly name?: string;
|
|
17
|
+
readonly timeoutMs?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ScheduleDef {
|
|
20
|
+
readonly name: string;
|
|
21
|
+
readonly method: string;
|
|
22
|
+
readonly trigger: {
|
|
23
|
+
readonly kind: 'cron';
|
|
24
|
+
readonly expression: string;
|
|
25
|
+
} | {
|
|
26
|
+
readonly kind: 'interval';
|
|
27
|
+
readonly everyMs: number;
|
|
28
|
+
};
|
|
29
|
+
readonly runs: TaskRuns;
|
|
30
|
+
readonly timeZone: string;
|
|
31
|
+
readonly timeoutMs: number;
|
|
32
|
+
}
|
|
33
|
+
export interface SkippedRun {
|
|
34
|
+
readonly task: string;
|
|
35
|
+
readonly scheduledFor: Date;
|
|
36
|
+
readonly reason: 'still-running' | 'lease-not-held' | 'missed';
|
|
37
|
+
}
|
|
38
|
+
export interface SchedulerOptions {
|
|
39
|
+
readonly tasks: readonly object[];
|
|
40
|
+
readonly clock: Clock;
|
|
41
|
+
readonly onTaskError: (task: string, scheduledFor: Date, error: unknown) => void;
|
|
42
|
+
readonly onSkipped: (skipped: SkippedRun) => void;
|
|
43
|
+
readonly leases?: LeaseStore;
|
|
44
|
+
readonly leaseMs?: number;
|
|
45
|
+
readonly graceMs?: number;
|
|
46
|
+
}
|
|
47
|
+
export interface Scheduler {
|
|
48
|
+
start(): void;
|
|
49
|
+
onShutdown(options?: {
|
|
50
|
+
readonly graceMs: number;
|
|
51
|
+
}): Promise<void>;
|
|
52
|
+
tick(now: number): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
/** Declare one cron-triggered method. The expression is parsed at scheduler construction. */
|
|
55
|
+
export declare function Cron(expression: string, options: TaskOptions): TaskDecorator;
|
|
56
|
+
/** Declare one fixed-duration, completion-to-start method. */
|
|
57
|
+
export declare function Interval(everyMs: number, options: IntervalOptions): TaskDecorator;
|
|
58
|
+
/** Read and normalize the schedules declared by one class. */
|
|
59
|
+
export declare function schedulesOf(controller: abstract new (...args: never[]) => unknown): readonly ScheduleDef[];
|
|
60
|
+
/** Build one isolated scheduler for the supplied application-owned instances. */
|
|
61
|
+
export declare function createScheduler(options: SchedulerOptions): Scheduler;
|
|
62
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schedule/index.ts"],"names":[],"mappings":"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"}
|