mongodash 2.6.0 → 2.7.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/README.md +52 -0
- package/dist/lib/ConcurrentRunner.js +32 -2
- package/dist/lib/ConcurrentRunner.js.map +1 -1
- package/dist/lib/createContinuousLock.js +23 -6
- package/dist/lib/createContinuousLock.js.map +1 -1
- package/dist/lib/cronTasks.js +158 -19
- package/dist/lib/cronTasks.js.map +1 -1
- package/dist/lib/index.js +10 -6
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/reactiveTasks/LeaderElector.js +21 -3
- package/dist/lib/reactiveTasks/LeaderElector.js.map +1 -1
- package/dist/lib/reactiveTasks/MetricsCollector.js +31 -5
- package/dist/lib/reactiveTasks/MetricsCollector.js.map +1 -1
- package/dist/lib/reactiveTasks/ReactiveTaskPlanner.js +66 -31
- package/dist/lib/reactiveTasks/ReactiveTaskPlanner.js.map +1 -1
- package/dist/lib/reactiveTasks/ReactiveTaskRepository.js +19 -1
- package/dist/lib/reactiveTasks/ReactiveTaskRepository.js.map +1 -1
- package/dist/lib/reactiveTasks/ReactiveTaskTypes.js +7 -1
- package/dist/lib/reactiveTasks/ReactiveTaskTypes.js.map +1 -1
- package/dist/lib/reactiveTasks/ReactiveTaskWorker.js +80 -5
- package/dist/lib/reactiveTasks/ReactiveTaskWorker.js.map +1 -1
- package/dist/lib/reactiveTasks/index.js +19 -12
- package/dist/lib/reactiveTasks/index.js.map +1 -1
- package/dist/lib/testing/assertNoReactiveTaskErrors.js +16 -12
- package/dist/lib/testing/assertNoReactiveTaskErrors.js.map +1 -1
- package/dist/lib/testing/index.js +2 -0
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/resolveWhitelistFilter.js +48 -0
- package/dist/lib/testing/resolveWhitelistFilter.js.map +1 -0
- package/dist/lib/testing/waitUntilReactiveTasksIdle.js +17 -46
- package/dist/lib/testing/waitUntilReactiveTasksIdle.js.map +1 -1
- package/dist/types/ConcurrentRunner.d.ts +14 -0
- package/dist/types/createContinuousLock.d.ts +17 -1
- package/dist/types/cronTasks.d.ts +17 -2
- package/dist/types/index.d.ts +1 -1
- package/dist/types/reactiveTasks/LeaderElector.d.ts +15 -1
- package/dist/types/reactiveTasks/MetricsCollector.d.ts +8 -0
- package/dist/types/reactiveTasks/ReactiveTaskPlanner.d.ts +11 -0
- package/dist/types/reactiveTasks/ReactiveTaskRepository.d.ts +10 -1
- package/dist/types/reactiveTasks/ReactiveTaskTypes.d.ts +6 -0
- package/dist/types/reactiveTasks/index.d.ts +8 -2
- package/dist/types/testing/assertNoReactiveTaskErrors.d.ts +4 -4
- package/dist/types/testing/index.d.ts +2 -0
- package/dist/types/testing/resolveWhitelistFilter.d.ts +35 -0
- package/dist/types/testing/waitUntilReactiveTasksIdle.d.ts +7 -13
- package/docs/.vitepress/config.mts +9 -1
- package/docs/cron-tasks.md +130 -1
- package/docs/error-handling.md +156 -0
- package/docs/reactive-tasks/guides.md +1 -1
- package/docs/reactive-tasks/index.md +1 -1
- package/docs/reactive-tasks/monitoring.md +7 -0
- package/docs/reactive-tasks/testing.md +187 -0
- package/docs/testing.md +60 -94
- package/package.json +34 -24
- package/docs/.vitepress/cache/deps/_metadata.json +0 -31
- package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js +0 -12824
- package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js.map +0 -7
- package/docs/.vitepress/cache/deps/package.json +0 -3
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +0 -4505
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +0 -7
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +0 -9731
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +0 -7
- package/docs/.vitepress/cache/deps/vue.js +0 -347
- package/docs/.vitepress/cache/deps/vue.js.map +0 -7
|
@@ -63,17 +63,49 @@ class ReactiveTaskWorker {
|
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
async processTask(taskRecord) {
|
|
66
|
-
var _a, _b;
|
|
66
|
+
var _a, _b, _c;
|
|
67
67
|
const taskDef = this.registry.getTask(taskRecord.task);
|
|
68
68
|
const tasksCollection = taskDef.tasksCollection;
|
|
69
69
|
let deferredTo;
|
|
70
70
|
let throttledUntil;
|
|
71
71
|
let isManuallyFinalized = false;
|
|
72
|
+
let lockLost = false;
|
|
73
|
+
// Set by the outer flow once the continuous-lock is stopped; used by
|
|
74
|
+
// markCompleted below so we can halt renewal *before* the finalize
|
|
75
|
+
// write changes nextRunAt. Without this the next CAS renewal would
|
|
76
|
+
// see its expected value no longer present and falsely report
|
|
77
|
+
// onLockLost for a completion the same worker performed.
|
|
78
|
+
let stopLock = async () => { };
|
|
72
79
|
const finalizeTaskSuccess = async (duration, session) => {
|
|
73
|
-
var _a;
|
|
80
|
+
var _a, _b;
|
|
81
|
+
if (lockLost) {
|
|
82
|
+
// Lock was stolen mid-handler. The new owner's claim rewrote
|
|
83
|
+
// nextRunAt; writing completion here would either clobber that
|
|
84
|
+
// claim or violate the at-least-once contract by marking the
|
|
85
|
+
// task complete before the new owner finishes.
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// Record the metric eagerly so scrapes that happen between the
|
|
89
|
+
// handler returning and this DB write observing the success are
|
|
90
|
+
// not misled. The finalize CAS below is a second line of defence
|
|
91
|
+
// against a stolen lock; if it fires we surface lock-lost but
|
|
92
|
+
// keep the duration sample (the handler did run successfully).
|
|
74
93
|
(_a = this.metricsCollector) === null || _a === void 0 ? void 0 : _a.recordTaskExecution(taskRecord.task, 'success', duration);
|
|
75
94
|
const entry = this.registry.getEntry(tasksCollection.collectionName);
|
|
76
|
-
await entry.repository.finalizeTask(taskRecord, taskDef.retryStrategy, undefined, taskDef.debounceMs, { durationMs: duration }, taskDef.executionHistoryLimit, session ? { session } : undefined);
|
|
95
|
+
const finalized = await entry.repository.finalizeTask(taskRecord, taskDef.retryStrategy, undefined, taskDef.debounceMs, { durationMs: duration }, taskDef.executionHistoryLimit, session ? { session } : undefined);
|
|
96
|
+
if (!finalized && !lockLost) {
|
|
97
|
+
// Silent lock loss: startedAt changed out from under us
|
|
98
|
+
// between the continuous-lock CAS renewal ticks. Flip the
|
|
99
|
+
// flag so later paths skip their own writes, bump the
|
|
100
|
+
// lock-lost counter, and emit onInfo for operator visibility.
|
|
101
|
+
lockLost = true;
|
|
102
|
+
(_b = this.metricsCollector) === null || _b === void 0 ? void 0 : _b.recordLockLost(taskRecord.task);
|
|
103
|
+
(0, OnInfo_1.onInfo)({
|
|
104
|
+
message: `Reactive task '${taskRecord.task}' finalize skipped - lock lost (startedAt mismatch). Another worker is handling this task.`,
|
|
105
|
+
taskId: taskRecord._id.toString(),
|
|
106
|
+
code: ReactiveTaskTypes_1.CODE_REACTIVE_TASK_LOCK_LOST,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
77
109
|
};
|
|
78
110
|
const context = {
|
|
79
111
|
docId: taskRecord.sourceDocId,
|
|
@@ -108,6 +140,11 @@ class ReactiveTaskWorker {
|
|
|
108
140
|
}
|
|
109
141
|
isManuallyFinalized = true;
|
|
110
142
|
const duration = Date.now() - start;
|
|
143
|
+
// Stop the continuous-lock renewal *before* finalize writes a
|
|
144
|
+
// new nextRunAt. Otherwise an in-flight renewal CAS would see
|
|
145
|
+
// its expected value overwritten and report a false
|
|
146
|
+
// onLockLost for a completion the same worker performed.
|
|
147
|
+
await stopLock();
|
|
111
148
|
try {
|
|
112
149
|
await finalizeTaskSuccess(duration, options === null || options === void 0 ? void 0 : options.session);
|
|
113
150
|
}
|
|
@@ -117,7 +154,19 @@ class ReactiveTaskWorker {
|
|
|
117
154
|
}
|
|
118
155
|
},
|
|
119
156
|
};
|
|
120
|
-
|
|
157
|
+
stopLock = (0, createContinuousLock_1.createContinuousLock)(tasksCollection, taskRecord._id, 'nextRunAt', this.internalOptions.visibilityTimeoutMs, {
|
|
158
|
+
expectedInitialValue: taskRecord.nextRunAt,
|
|
159
|
+
onLockLost: () => {
|
|
160
|
+
var _a;
|
|
161
|
+
lockLost = true;
|
|
162
|
+
(_a = this.metricsCollector) === null || _a === void 0 ? void 0 : _a.recordLockLost(taskRecord.task);
|
|
163
|
+
(0, OnInfo_1.onInfo)({
|
|
164
|
+
message: `Reactive task '${taskRecord.task}' lock lost - another worker took over (likely visibility timeout elapsed). Skipping finalize to preserve new claim.`,
|
|
165
|
+
taskId: taskRecord._id.toString(),
|
|
166
|
+
code: ReactiveTaskTypes_1.CODE_REACTIVE_TASK_LOCK_LOST,
|
|
167
|
+
});
|
|
168
|
+
},
|
|
169
|
+
});
|
|
121
170
|
const processTheTask = async () => {
|
|
122
171
|
const start = Date.now();
|
|
123
172
|
(0, OnInfo_1.onInfo)({
|
|
@@ -173,6 +222,13 @@ class ReactiveTaskWorker {
|
|
|
173
222
|
this.throttledUntil.set(taskRecord.task, throttledUntil);
|
|
174
223
|
debug(`[Scheduler ${this.instanceId}] Throttling task '${taskRecord.task}' until ${throttledUntil.toISOString()}`);
|
|
175
224
|
}
|
|
225
|
+
if (lockLost) {
|
|
226
|
+
// Another worker took over this task. Skip state transitions to
|
|
227
|
+
// avoid stomping on the new owner's updates. Side effects done
|
|
228
|
+
// by the handler have executed (at-least-once), the replacement
|
|
229
|
+
// worker will run the task again and finalize it.
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
176
232
|
if (deferredTo) {
|
|
177
233
|
if (isManuallyFinalized) {
|
|
178
234
|
(0, OnInfo_1.onInfo)({
|
|
@@ -195,9 +251,28 @@ class ReactiveTaskWorker {
|
|
|
195
251
|
// Logging is already done in processTheTask via onInfo
|
|
196
252
|
await stopLock();
|
|
197
253
|
const duration = Date.now() - start;
|
|
254
|
+
if (lockLost) {
|
|
255
|
+
// Skip both metrics and finalize: the new owner will execute
|
|
256
|
+
// and record its own metrics. See the success branch above
|
|
257
|
+
// for the reasoning behind skipping finalize.
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
198
260
|
(_b = this.metricsCollector) === null || _b === void 0 ? void 0 : _b.recordTaskExecution(taskRecord.task, 'failed', duration);
|
|
199
261
|
const entry = this.registry.getEntry(tasksCollection.collectionName);
|
|
200
|
-
await entry.repository.finalizeTask(taskRecord, taskDef.retryStrategy, error, taskDef.debounceMs, { durationMs: duration }, taskDef.executionHistoryLimit);
|
|
262
|
+
const finalized = await entry.repository.finalizeTask(taskRecord, taskDef.retryStrategy, error, taskDef.debounceMs, { durationMs: duration }, taskDef.executionHistoryLimit);
|
|
263
|
+
if (!finalized) {
|
|
264
|
+
// Silent lock loss (startedAt no longer matches): another
|
|
265
|
+
// worker has re-claimed the task. The failure metric is
|
|
266
|
+
// kept (the handler did throw) but we surface lock-lost
|
|
267
|
+
// so operators can see why retry scheduling / dead-letter
|
|
268
|
+
// transitions did not persist.
|
|
269
|
+
(_c = this.metricsCollector) === null || _c === void 0 ? void 0 : _c.recordLockLost(taskRecord.task);
|
|
270
|
+
(0, OnInfo_1.onInfo)({
|
|
271
|
+
message: `Reactive task '${taskRecord.task}' error-finalize skipped - lock lost (startedAt mismatch). Another worker is handling this task.`,
|
|
272
|
+
taskId: taskRecord._id.toString(),
|
|
273
|
+
code: ReactiveTaskTypes_1.CODE_REACTIVE_TASK_LOCK_LOST,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
201
276
|
}
|
|
202
277
|
}
|
|
203
278
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactiveTaskWorker.js","sourceRoot":"","sources":["../../../src/reactiveTasks/ReactiveTaskWorker.ts"],"names":[],"mappings":";;;AAAA,gCAAgC;AAEhC,kEAA+D;AAC/D,wCAAqC;AACrC,sCAAmC;AACnC,qEAAkE;AAElE,
|
|
1
|
+
{"version":3,"file":"ReactiveTaskWorker.js","sourceRoot":"","sources":["../../../src/reactiveTasks/ReactiveTaskWorker.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
11
11
|
return t;
|
|
12
12
|
};
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.ReactiveTaskScheduler = exports._scheduler = exports.TaskConditionFailedError = exports.REACTIVE_TASK_META_DOC_ID = exports.CODE_REACTIVE_TASK_STARTED = exports.CODE_REACTIVE_TASK_PLANNER_STREAM_ERROR = exports.CODE_REACTIVE_TASK_PLANNER_STOPPED = exports.CODE_REACTIVE_TASK_PLANNER_STARTED = exports.CODE_REACTIVE_TASK_PLANNER_RECONCILIATION_STARTED = exports.CODE_REACTIVE_TASK_PLANNER_RECONCILIATION_FINISHED = exports.CODE_REACTIVE_TASK_LEADER_LOCK_LOST = exports.CODE_REACTIVE_TASK_INITIALIZED = exports.CODE_REACTIVE_TASK_FINISHED = exports.CODE_REACTIVE_TASK_FAILED = exports.CODE_REACTIVE_TASK_CLEANUP = void 0;
|
|
14
|
+
exports.ReactiveTaskScheduler = exports._scheduler = exports.TaskConditionFailedError = exports.REACTIVE_TASK_META_DOC_ID = exports.CODE_REACTIVE_TASK_STARTED = exports.CODE_REACTIVE_TASK_PLANNER_STREAM_ERROR = exports.CODE_REACTIVE_TASK_PLANNER_STOPPED = exports.CODE_REACTIVE_TASK_PLANNER_STARTED = exports.CODE_REACTIVE_TASK_PLANNER_RECONCILIATION_STARTED = exports.CODE_REACTIVE_TASK_PLANNER_RECONCILIATION_FINISHED = exports.CODE_REACTIVE_TASK_LOCK_LOST = exports.CODE_REACTIVE_TASK_LEADER_LOCK_LOST = exports.CODE_REACTIVE_TASK_INITIALIZED = exports.CODE_REACTIVE_TASK_FINISHED = exports.CODE_REACTIVE_TASK_FAILED = exports.CODE_REACTIVE_TASK_CLEANUP = void 0;
|
|
15
15
|
exports.init = init;
|
|
16
16
|
exports.reactiveTask = reactiveTask;
|
|
17
17
|
exports.stopReactiveTasks = stopReactiveTasks;
|
|
@@ -40,6 +40,7 @@ Object.defineProperty(exports, "CODE_REACTIVE_TASK_FAILED", { enumerable: true,
|
|
|
40
40
|
Object.defineProperty(exports, "CODE_REACTIVE_TASK_FINISHED", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_FINISHED; } });
|
|
41
41
|
Object.defineProperty(exports, "CODE_REACTIVE_TASK_INITIALIZED", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_INITIALIZED; } });
|
|
42
42
|
Object.defineProperty(exports, "CODE_REACTIVE_TASK_LEADER_LOCK_LOST", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_LEADER_LOCK_LOST; } });
|
|
43
|
+
Object.defineProperty(exports, "CODE_REACTIVE_TASK_LOCK_LOST", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_LOCK_LOST; } });
|
|
43
44
|
Object.defineProperty(exports, "CODE_REACTIVE_TASK_PLANNER_RECONCILIATION_FINISHED", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_PLANNER_RECONCILIATION_FINISHED; } });
|
|
44
45
|
Object.defineProperty(exports, "CODE_REACTIVE_TASK_PLANNER_RECONCILIATION_STARTED", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_PLANNER_RECONCILIATION_STARTED; } });
|
|
45
46
|
Object.defineProperty(exports, "CODE_REACTIVE_TASK_PLANNER_STARTED", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_PLANNER_STARTED; } });
|
|
@@ -100,7 +101,7 @@ class ReactiveTaskScheduler {
|
|
|
100
101
|
}
|
|
101
102
|
configure(options) {
|
|
102
103
|
if (this.concurrentRunner) {
|
|
103
|
-
throw new Error('Cannot configure scheduler after
|
|
104
|
+
throw new Error('Cannot configure reactive task scheduler after it has already been configured. Call configure() (or init()) only once, before startReactiveTasks().');
|
|
104
105
|
}
|
|
105
106
|
// Configure instanceId if provided
|
|
106
107
|
if (options.instanceId) {
|
|
@@ -166,6 +167,8 @@ class ReactiveTaskScheduler {
|
|
|
166
167
|
if (this.registry.getTask(taskDef.task)) {
|
|
167
168
|
throw new Error(`Task with name '${taskDef.task}' already exists.`);
|
|
168
169
|
}
|
|
170
|
+
// The registry stores tasks type-erased to Document; each task's handler
|
|
171
|
+
// was captured with its concrete T so it stays type-safe at invocation time.
|
|
169
172
|
await this.registry.addTask(taskDef);
|
|
170
173
|
}
|
|
171
174
|
/**
|
|
@@ -200,17 +203,13 @@ class ReactiveTaskScheduler {
|
|
|
200
203
|
// Initialize components
|
|
201
204
|
this.taskPlanner = new ReactiveTaskPlanner_1.ReactiveTaskPlanner(globalsCollection, this.instanceId, this.registry, {
|
|
202
205
|
onStreamError: () => {
|
|
203
|
-
var _a;
|
|
206
|
+
var _a, _b;
|
|
204
207
|
(0, OnInfo_1.onInfo)({
|
|
205
208
|
message: `Change Stream error.`,
|
|
206
209
|
code: ReactiveTaskTypes_1.CODE_REACTIVE_TASK_PLANNER_STREAM_ERROR,
|
|
207
210
|
});
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
// LeaderElector handles its own loop.
|
|
211
|
-
// If stream fails, Planner stops.
|
|
212
|
-
// We can ask LeaderElector to give up leadership.
|
|
213
|
-
(_a = this.leaderElector) === null || _a === void 0 ? void 0 : _a.forceLoseLeader();
|
|
211
|
+
(_a = this.metricsCollector) === null || _a === void 0 ? void 0 : _a.recordStreamError();
|
|
212
|
+
(_b = this.leaderElector) === null || _b === void 0 ? void 0 : _b.forceLoseLeader();
|
|
214
213
|
},
|
|
215
214
|
onTaskPlanned: (tasksCollectionName, debounceMs) => {
|
|
216
215
|
setTimeout(() => {
|
|
@@ -218,6 +217,14 @@ class ReactiveTaskScheduler {
|
|
|
218
217
|
(_a = this.concurrentRunner) === null || _a === void 0 ? void 0 : _a.speedUp(tasksCollectionName);
|
|
219
218
|
}, debounceMs);
|
|
220
219
|
},
|
|
220
|
+
onFlushFailure: () => {
|
|
221
|
+
var _a;
|
|
222
|
+
(_a = this.metricsCollector) === null || _a === void 0 ? void 0 : _a.recordFlushFailure();
|
|
223
|
+
},
|
|
224
|
+
onRequestRestart: () => {
|
|
225
|
+
var _a;
|
|
226
|
+
(_a = this.leaderElector) === null || _a === void 0 ? void 0 : _a.forceLoseLeader();
|
|
227
|
+
},
|
|
221
228
|
}, {
|
|
222
229
|
batchSize: this.internalOptions.batchSize,
|
|
223
230
|
batchIntervalMs: this.internalOptions.batchIntervalMs,
|
|
@@ -233,14 +240,15 @@ class ReactiveTaskScheduler {
|
|
|
233
240
|
metaDocId: ReactiveTaskTypes_1.REACTIVE_TASK_META_DOC_ID,
|
|
234
241
|
}, {
|
|
235
242
|
onBecomeLeader: async () => {
|
|
236
|
-
var _a;
|
|
243
|
+
var _a, _b;
|
|
244
|
+
(_a = this.metricsCollector) === null || _a === void 0 ? void 0 : _a.recordLeaderElection();
|
|
237
245
|
const tasks = this.registry.getAllTasks();
|
|
238
246
|
if (tasks.length === 0) {
|
|
239
247
|
debug(`[Scheduler ${this.instanceId}] Became leader, but no tasks registered. Skipping planner start.`);
|
|
240
248
|
return;
|
|
241
249
|
}
|
|
242
250
|
debug(`[Scheduler ${this.instanceId}] Became leader, starting planner.`);
|
|
243
|
-
await ((
|
|
251
|
+
await ((_b = this.taskPlanner) === null || _b === void 0 ? void 0 : _b.start());
|
|
244
252
|
},
|
|
245
253
|
onLoseLeader: async () => {
|
|
246
254
|
var _a;
|
|
@@ -312,7 +320,6 @@ function init(initOptions) {
|
|
|
312
320
|
scheduler.configure(schedulerOptions);
|
|
313
321
|
}
|
|
314
322
|
async function reactiveTask(taskDef) {
|
|
315
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
316
323
|
await scheduler.addTask(taskDef);
|
|
317
324
|
}
|
|
318
325
|
async function stopReactiveTasks() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/reactiveTasks/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/reactiveTasks/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.assertNoReactiveTaskErrors = assertNoReactiveTaskErrors;
|
|
4
4
|
const reactiveTasks_1 = require("../reactiveTasks");
|
|
5
|
+
const resolveWhitelistFilter_1 = require("./resolveWhitelistFilter");
|
|
5
6
|
/**
|
|
6
7
|
* Asserts that no reactive tasks have failed during the test run.
|
|
7
8
|
* Checks the 'executionHistory' and 'lastError' of tasks in all registered collections.
|
|
@@ -13,20 +14,23 @@ async function assertNoReactiveTaskErrors(options) {
|
|
|
13
14
|
registry = schedulerToUse.getRegistry();
|
|
14
15
|
const entries = registry.getAllEntries();
|
|
15
16
|
const errorsFound = [];
|
|
17
|
+
const hasWhitelist = options.whitelist && options.whitelist.length > 0;
|
|
16
18
|
for (const entry of entries) {
|
|
19
|
+
// If whitelist is active, check if this collection is relevant
|
|
20
|
+
let whitelistFilter = null;
|
|
21
|
+
if (hasWhitelist) {
|
|
22
|
+
const resolution = await (0, resolveWhitelistFilter_1.resolveWhitelistFilter)(options.whitelist, entry.sourceCollection);
|
|
23
|
+
if (resolution === 'skip')
|
|
24
|
+
continue;
|
|
25
|
+
if (resolution !== 'matchAll') {
|
|
26
|
+
whitelistFilter = resolution;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
17
29
|
// Build independent query for each collection
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
$or: [
|
|
21
|
-
{ 'executionHistory.status': 'failed', 'executionHistory.at': { $gte: options.since } },
|
|
22
|
-
// Also check lastError if it happened recently (though executionHistory covers history)
|
|
23
|
-
// We rely on executionHistory for the time-based check.
|
|
24
|
-
],
|
|
30
|
+
const baseQuery = {
|
|
31
|
+
$or: [{ 'executionHistory.status': 'failed', 'executionHistory.at': { $gte: options.since } }],
|
|
25
32
|
};
|
|
26
|
-
|
|
27
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
-
query.sourceDocId = { $in: options.sourceDocIds };
|
|
29
|
-
}
|
|
33
|
+
const query = whitelistFilter ? { $and: [baseQuery, whitelistFilter] } : baseQuery;
|
|
30
34
|
const tasksWithHistory = await entry.tasksCollection.find(query).toArray();
|
|
31
35
|
for (const taskRecord of tasksWithHistory) {
|
|
32
36
|
if (!taskRecord.executionHistory)
|
|
@@ -39,7 +43,7 @@ async function assertNoReactiveTaskErrors(options) {
|
|
|
39
43
|
if (item.status !== 'failed')
|
|
40
44
|
continue;
|
|
41
45
|
const errorMessage = item.error || 'Unknown error';
|
|
42
|
-
// 3. Check Whitelist
|
|
46
|
+
// 3. Check Whitelist (excludeErrors)
|
|
43
47
|
let isExcluded = false;
|
|
44
48
|
if (options.excludeErrors) {
|
|
45
49
|
for (const pattern of options.excludeErrors) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assertNoReactiveTaskErrors.js","sourceRoot":"","sources":["../../../src/testing/assertNoReactiveTaskErrors.ts"],"names":[],"mappings":";;AAmCA,
|
|
1
|
+
{"version":3,"file":"assertNoReactiveTaskErrors.js","sourceRoot":"","sources":["../../../src/testing/assertNoReactiveTaskErrors.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,5 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./assertNoReactiveTaskErrors"), exports);
|
|
18
18
|
__exportStar(require("./configureForTesting"), exports);
|
|
19
|
+
__exportStar(require("./resolveWhitelistFilter"), exports);
|
|
20
|
+
__exportStar(require("./waitUntil"), exports);
|
|
19
21
|
__exportStar(require("./waitUntilReactiveTasksIdle"), exports);
|
|
20
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA6C;AAC7C,wDAAsC;AACtC,+DAA6C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA6C;AAC7C,wDAAsC;AACtC,2DAAyC;AACzC,8CAA4B;AAC5B,+DAA6C"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveWhitelistFilter = resolveWhitelistFilter;
|
|
4
|
+
/**
|
|
5
|
+
* Build the `Filter<ReactiveTaskRecord>` for a single registry entry based on
|
|
6
|
+
* the provided whitelist rules. Extracted from `waitUntilReactiveTasksIdle` /
|
|
7
|
+
* `assertNoReactiveTaskErrors` so the two utilities cannot drift.
|
|
8
|
+
*/
|
|
9
|
+
async function resolveWhitelistFilter(whitelist, sourceCollection) {
|
|
10
|
+
const rules = whitelist.filter((rule) => rule.collection === sourceCollection.collectionName);
|
|
11
|
+
if (rules.length === 0) {
|
|
12
|
+
return 'skip';
|
|
13
|
+
}
|
|
14
|
+
const criteria = [];
|
|
15
|
+
for (const rule of rules) {
|
|
16
|
+
let ruleIds = null;
|
|
17
|
+
if (rule.filter) {
|
|
18
|
+
const matchingDocs = (await sourceCollection.find(rule.filter, { projection: { _id: 1 } }).toArray());
|
|
19
|
+
ruleIds = matchingDocs.map((d) => d._id);
|
|
20
|
+
}
|
|
21
|
+
if (ruleIds === null && !rule.task) {
|
|
22
|
+
// Rule covers every document in this collection and every task.
|
|
23
|
+
return 'matchAll';
|
|
24
|
+
}
|
|
25
|
+
// A filter-scoped rule that matched zero source documents can never
|
|
26
|
+
// contribute tasks of its own - drop it even when a task is also
|
|
27
|
+
// specified (the AND of "task=X" and "sourceDocId IN []" is still
|
|
28
|
+
// empty, so emitting that filter just produces useless `$in: []` queries).
|
|
29
|
+
if (ruleIds !== null && ruleIds.length === 0) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const ruleCriteria = {};
|
|
33
|
+
if (rule.task) {
|
|
34
|
+
ruleCriteria.task = rule.task;
|
|
35
|
+
}
|
|
36
|
+
if (ruleIds !== null) {
|
|
37
|
+
ruleCriteria.sourceDocId = { $in: ruleIds };
|
|
38
|
+
}
|
|
39
|
+
criteria.push(ruleCriteria);
|
|
40
|
+
}
|
|
41
|
+
if (criteria.length === 0) {
|
|
42
|
+
// Rules matched this collection but every rule resolved to an empty
|
|
43
|
+
// document set - nothing to wait for / check.
|
|
44
|
+
return 'skip';
|
|
45
|
+
}
|
|
46
|
+
return { $or: criteria };
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=resolveWhitelistFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveWhitelistFilter.js","sourceRoot":"","sources":["../../../src/testing/resolveWhitelistFilter.ts"],"names":[],"mappings":";;AAqCA,wDAiDC;AAtDD;;;;GAIG;AACI,KAAK,UAAU,sBAAsB,CACxC,SAA0B,EAC1B,gBAAuE;IAEvE,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAC9F,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAsC,EAAE,CAAC;IAEvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,OAAO,GAAqB,IAAI,CAAC;QAErC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,MAAM,YAAY,GAAG,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAe,CAAC;YACpH,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACjC,gEAAgE;YAChE,OAAO,UAAU,CAAC;QACtB,CAAC;QAED,oEAAoE;QACpE,iEAAiE;QACjE,kEAAkE;QAClE,2EAA2E;QAC3E,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,SAAS;QACb,CAAC;QAED,MAAM,YAAY,GAA+B,EAAE,CAAC;QACpD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAClC,CAAC;QACD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACnB,YAAY,CAAC,WAAW,GAAG,EAAE,GAAG,EAAE,OAA8C,EAAE,CAAC;QACvF,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,oEAAoE;QACpE,8CAA8C;QAC9C,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.waitUntilReactiveTasksIdle = waitUntilReactiveTasksIdle;
|
|
4
4
|
const _debug = require("debug");
|
|
5
5
|
const reactiveTasks_1 = require("../reactiveTasks");
|
|
6
|
+
const resolveWhitelistFilter_1 = require("./resolveWhitelistFilter");
|
|
6
7
|
const waitUntil_1 = require("./waitUntil");
|
|
7
8
|
const debug = _debug('mongodash:testing');
|
|
8
9
|
async function waitUntilReactiveTasksIdle(customOptions = {}) {
|
|
@@ -13,16 +14,22 @@ async function waitUntilReactiveTasksIdle(customOptions = {}) {
|
|
|
13
14
|
const planner = reactiveTasks_1._scheduler.taskPlannerInstance;
|
|
14
15
|
const runner = reactiveTasks_1._scheduler.concurrentRunnerInstance;
|
|
15
16
|
const registry = reactiveTasks_1._scheduler.getRegistry();
|
|
16
|
-
// --- 1. Global Checks
|
|
17
|
-
//
|
|
17
|
+
// --- 1. Global Checks ---
|
|
18
|
+
// The planner buffer check is kept in whitelist mode too: change-stream
|
|
19
|
+
// events for *our* collections land there before task records exist,
|
|
20
|
+
// and skipping the check altogether would let us return idle before
|
|
21
|
+
// the events have been turned into rows the DB check below can see.
|
|
22
|
+
// The worker check is only applied globally - in whitelist mode
|
|
23
|
+
// other tests' workers must not block us.
|
|
18
24
|
if (planner && !planner.isEmpty) {
|
|
19
25
|
debug('Planner not empty');
|
|
20
26
|
return false;
|
|
21
27
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
28
|
+
if (!hasWhitelist) {
|
|
29
|
+
if (runner && runner.activeWorkers > 0) {
|
|
30
|
+
debug(`Active workers: ${runner.activeWorkers}`);
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
26
33
|
}
|
|
27
34
|
// --- 2. Check Database ---
|
|
28
35
|
const entries = registry.getAllEntries();
|
|
@@ -31,47 +38,11 @@ async function waitUntilReactiveTasksIdle(customOptions = {}) {
|
|
|
31
38
|
// If whitelisting is active, we only check tasks that match the whitelist
|
|
32
39
|
let whitelistFilter = null;
|
|
33
40
|
if (hasWhitelist) {
|
|
34
|
-
const
|
|
35
|
-
if (
|
|
41
|
+
const resolution = await (0, resolveWhitelistFilter_1.resolveWhitelistFilter)(customOptions.whitelist, entry.sourceCollection);
|
|
42
|
+
if (resolution === 'skip')
|
|
36
43
|
continue;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
let matchAll = false;
|
|
40
|
-
for (const rule of rules) {
|
|
41
|
-
let ruleIds = null;
|
|
42
|
-
if (rule.filter) {
|
|
43
|
-
// If we have a filter, we need to find which docs match it.
|
|
44
|
-
// We can't filter tasks directly by source properties efficiently without joining,
|
|
45
|
-
// so we find the matching source docs first.
|
|
46
|
-
const matchingDocs = (await entry.sourceCollection.find(rule.filter, { projection: { _id: 1 } }).toArray());
|
|
47
|
-
ruleIds = matchingDocs.map((d) => d._id);
|
|
48
|
-
}
|
|
49
|
-
if (ruleIds === null && !rule.task) {
|
|
50
|
-
// One rule validates 'all', so we wait for everything in this collection
|
|
51
|
-
matchAll = true;
|
|
52
|
-
break;
|
|
53
|
-
}
|
|
54
|
-
if (rule.task) {
|
|
55
|
-
criteria.push({ task: rule.task });
|
|
56
|
-
}
|
|
57
|
-
if (ruleIds !== null) {
|
|
58
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
59
|
-
criteria.push({ sourceDocId: { $in: ruleIds } });
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
if (!matchAll) {
|
|
63
|
-
if (criteria.length > 0) {
|
|
64
|
-
whitelistFilter = { $or: criteria };
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
// Whitelist is active, but we have rules that result in effectively "nothing"
|
|
68
|
-
// (e.g. filter returned no docs).
|
|
69
|
-
// If we have NO criteria and NO matchAll, it implies we wait for nothing on this collection?
|
|
70
|
-
// Or should we treat it as blocking?
|
|
71
|
-
// If filter didn't match any doc, then we effectively wait for nothing for that rule.
|
|
72
|
-
// If ALL rules resulted in nothing, we continue to next entry.
|
|
73
|
-
continue;
|
|
74
|
-
}
|
|
44
|
+
if (resolution !== 'matchAll') {
|
|
45
|
+
whitelistFilter = resolution;
|
|
75
46
|
}
|
|
76
47
|
}
|
|
77
48
|
const stableThresholdMs = (options.timeoutMs || 0) + (options.stabilityDurationMs || 0) + 100;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"waitUntilReactiveTasksIdle.js","sourceRoot":"","sources":["../../../src/testing/waitUntilReactiveTasksIdle.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"waitUntilReactiveTasksIdle.js","sourceRoot":"","sources":["../../../src/testing/waitUntilReactiveTasksIdle.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,20 @@ export declare class ConcurrentRunner {
|
|
|
23
23
|
start(tryRunATask: TryRunATaskCallback): void;
|
|
24
24
|
stop(): Promise<void>;
|
|
25
25
|
speedUp(sourceName: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* Override the back-off schedule so the next poll for `sourceName`
|
|
28
|
+
* happens at approximately `runAt` (a millisecond epoch timestamp).
|
|
29
|
+
* Intended for callers that already know when their next unit of work
|
|
30
|
+
* is due - e.g. cron scheduling an hour out - to skip wasted polls.
|
|
31
|
+
*
|
|
32
|
+
* - `runAt` must be a finite number; non-finite values are ignored.
|
|
33
|
+
* - The timestamp is *not* clamped relative to `now`. Passing a value in
|
|
34
|
+
* the past is valid and behaves like {@link speedUp}; passing a value
|
|
35
|
+
* far in the future means the source will not be polled until then
|
|
36
|
+
* (or until `speedUp` / `setNextRunAt` is called again).
|
|
37
|
+
* - Back-off is reset so a subsequent wake-up fires at `minPollMs`.
|
|
38
|
+
*/
|
|
39
|
+
setNextRunAt(sourceName: string, runAt: number): void;
|
|
26
40
|
updateAllSources(options: Partial<SourceOptions>): void;
|
|
27
41
|
private runWorker;
|
|
28
42
|
private prolongNextRun;
|
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
import { Collection, ObjectId } from 'mongodb';
|
|
2
2
|
type StopContinuousLock = () => Promise<void>;
|
|
3
|
+
export interface CreateContinuousLockOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Initial value of the lock property written by whoever acquired the lock.
|
|
6
|
+
* When provided, every renewal becomes a compare-and-swap: the update only
|
|
7
|
+
* succeeds if the lock still carries the previously-written value. If another
|
|
8
|
+
* actor has taken over the lock in the meantime, `onLockLost` is invoked and
|
|
9
|
+
* no further renewals are attempted. This prevents a slow renewal from
|
|
10
|
+
* accidentally extending a lock that has already been stolen.
|
|
11
|
+
*/
|
|
12
|
+
expectedInitialValue?: unknown;
|
|
13
|
+
/**
|
|
14
|
+
* Invoked once when CAS detects we no longer own the lock. Only fires when
|
|
15
|
+
* `expectedInitialValue` is set. Renewals stop after this callback.
|
|
16
|
+
*/
|
|
17
|
+
onLockLost?: () => void;
|
|
18
|
+
}
|
|
3
19
|
export declare function createContinuousLock<DocumentType extends {
|
|
4
20
|
_id: string | ObjectId;
|
|
5
|
-
}>(collection: Collection<DocumentType>, documentId: DocumentType['_id'], lockProperty: keyof DocumentType, lockTime: number): StopContinuousLock;
|
|
21
|
+
}>(collection: Collection<DocumentType>, documentId: DocumentType['_id'], lockProperty: keyof DocumentType, lockTime: number, options?: CreateContinuousLockOptions): StopContinuousLock;
|
|
6
22
|
export {};
|