mongodash 2.0.0 → 2.1.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 +40 -22
- package/dist/dashboard/index.html +40 -0
- package/dist/lib/playground/server.js +131 -0
- package/dist/lib/playground/server.js.map +1 -0
- package/dist/lib/src/ConcurrentRunner.js +148 -0
- package/dist/lib/src/ConcurrentRunner.js.map +1 -0
- package/dist/lib/{OnError.js → src/OnError.js} +3 -3
- package/dist/lib/src/OnError.js.map +1 -0
- package/dist/lib/{OnInfo.js → src/OnInfo.js} +6 -3
- package/dist/lib/src/OnInfo.js.map +1 -0
- package/dist/lib/{createContinuousLock.js → src/createContinuousLock.js} +5 -3
- package/dist/lib/src/createContinuousLock.js.map +1 -0
- package/dist/lib/{cronTasks.js → src/cronTasks.js} +129 -73
- package/dist/lib/src/cronTasks.js.map +1 -0
- package/dist/lib/{getCollection.js → src/getCollection.js} +2 -2
- package/dist/lib/src/getCollection.js.map +1 -0
- package/dist/lib/{getMongoClient.js → src/getMongoClient.js} +2 -2
- package/dist/lib/src/getMongoClient.js.map +1 -0
- package/dist/lib/src/globalsCollection.js +10 -0
- package/dist/lib/src/globalsCollection.js.map +1 -0
- package/dist/lib/src/index.js +101 -0
- package/dist/lib/src/index.js.map +1 -0
- package/dist/lib/{initPromise.js → src/initPromise.js} +2 -3
- package/dist/lib/src/initPromise.js.map +1 -0
- package/dist/lib/src/mongoCompatibility.js +10 -0
- package/dist/lib/src/mongoCompatibility.js.map +1 -0
- package/dist/lib/src/parseInterval.js +60 -0
- package/dist/lib/src/parseInterval.js.map +1 -0
- package/dist/lib/src/prefixFilterKeys.js +69 -0
- package/dist/lib/src/prefixFilterKeys.js.map +1 -0
- package/dist/lib/src/processInBatches.js +46 -0
- package/dist/lib/src/processInBatches.js.map +1 -0
- package/dist/lib/src/reactiveTasks/LeaderElector.js +155 -0
- package/dist/lib/src/reactiveTasks/LeaderElector.js.map +1 -0
- package/dist/lib/src/reactiveTasks/MetricsCollector.js +410 -0
- package/dist/lib/src/reactiveTasks/MetricsCollector.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskManager.js +288 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskManager.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskOps.js +185 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskOps.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskPlanner.js +443 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskPlanner.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskReconciler.js +218 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskReconciler.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskRegistry.js +184 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskRegistry.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskRepository.js +355 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskRepository.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskRetryStrategy.js +153 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskRetryStrategy.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskTypes.js +34 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskTypes.js.map +1 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskWorker.js +186 -0
- package/dist/lib/src/reactiveTasks/ReactiveTaskWorker.js.map +1 -0
- package/dist/lib/src/reactiveTasks/compileWatchProjection.js +65 -0
- package/dist/lib/src/reactiveTasks/compileWatchProjection.js.map +1 -0
- package/dist/lib/src/reactiveTasks/index.js +298 -0
- package/dist/lib/src/reactiveTasks/index.js.map +1 -0
- package/dist/lib/src/reactiveTasks/queryToExpression.js +160 -0
- package/dist/lib/src/reactiveTasks/queryToExpression.js.map +1 -0
- package/dist/lib/src/reactiveTasks/validateTaskFilter.js +88 -0
- package/dist/lib/src/reactiveTasks/validateTaskFilter.js.map +1 -0
- package/dist/lib/src/task-management/OperationalTaskController.js +162 -0
- package/dist/lib/src/task-management/OperationalTaskController.js.map +1 -0
- package/dist/lib/src/task-management/index.js +27 -0
- package/dist/lib/src/task-management/index.js.map +1 -0
- package/dist/lib/src/task-management/serveDashboard.js +149 -0
- package/dist/lib/src/task-management/serveDashboard.js.map +1 -0
- package/dist/lib/src/task-management/types.js +10 -0
- package/dist/lib/src/task-management/types.js.map +1 -0
- package/dist/lib/{withLock.js → src/withLock.js} +3 -4
- package/dist/lib/src/withLock.js.map +1 -0
- package/dist/lib/{withTransaction.js → src/withTransaction.js} +4 -4
- package/dist/lib/src/withTransaction.js.map +1 -0
- package/dist/lib/tools/check-db-connection.js +28 -0
- package/dist/lib/tools/check-db-connection.js.map +1 -0
- package/dist/lib/tools/clean-testing-databases.js +12 -0
- package/dist/lib/tools/clean-testing-databases.js.map +1 -0
- package/dist/lib/tools/prepare-republish.js +27 -0
- package/dist/lib/tools/prepare-republish.js.map +1 -0
- package/dist/lib/tools/test-matrix-local.js +212 -0
- package/dist/lib/tools/test-matrix-local.js.map +1 -0
- package/dist/lib/tools/testingDatabase.js +55 -0
- package/dist/lib/tools/testingDatabase.js.map +1 -0
- package/dist/types/playground/server.d.ts +1 -0
- package/dist/types/src/ConcurrentRunner.d.ts +30 -0
- package/dist/types/{OnInfo.d.ts → src/OnInfo.d.ts} +1 -1
- package/dist/types/{cronTasks.d.ts → src/cronTasks.d.ts} +44 -1
- package/dist/types/src/globalsCollection.d.ts +4 -0
- package/dist/types/src/index.d.ts +28 -0
- package/dist/types/src/mongoCompatibility.d.ts +29 -0
- package/dist/types/src/parseInterval.d.ts +12 -0
- package/dist/types/src/prefixFilterKeys.d.ts +11 -0
- package/dist/types/src/processInBatches.d.ts +10 -0
- package/dist/types/src/reactiveTasks/LeaderElector.d.ts +42 -0
- package/dist/types/src/reactiveTasks/MetricsCollector.d.ts +73 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskManager.d.ts +18 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskOps.d.ts +17 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskPlanner.d.ts +62 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskReconciler.d.ts +29 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskRegistry.d.ts +34 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskRepository.d.ts +59 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskRetryStrategy.d.ts +21 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskTypes.d.ts +389 -0
- package/dist/types/src/reactiveTasks/ReactiveTaskWorker.d.ts +36 -0
- package/dist/types/src/reactiveTasks/compileWatchProjection.d.ts +12 -0
- package/dist/types/src/reactiveTasks/index.d.ts +82 -0
- package/dist/types/src/reactiveTasks/queryToExpression.d.ts +13 -0
- package/dist/types/src/reactiveTasks/validateTaskFilter.d.ts +10 -0
- package/dist/types/src/task-management/OperationalTaskController.d.ts +59 -0
- package/dist/types/src/task-management/index.d.ts +3 -0
- package/dist/types/src/task-management/serveDashboard.d.ts +12 -0
- package/dist/types/src/task-management/types.d.ts +95 -0
- package/dist/types/tools/check-db-connection.d.ts +2 -0
- package/dist/types/tools/clean-testing-databases.d.ts +1 -0
- package/dist/types/tools/prepare-republish.d.ts +2 -0
- package/dist/types/tools/test-matrix-local.d.ts +1 -0
- package/dist/types/tools/testingDatabase.d.ts +2 -0
- package/docs/.vitepress/cache/deps/_metadata.json +31 -0
- package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js +12824 -0
- package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js.map +7 -0
- package/docs/.vitepress/cache/deps/package.json +3 -0
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +4505 -0
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +7 -0
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +9731 -0
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +7 -0
- package/docs/.vitepress/cache/deps/vue.js +347 -0
- package/docs/.vitepress/cache/deps/vue.js.map +7 -0
- package/docs/.vitepress/config.mts +48 -0
- package/docs/.vitepress/theme/index.ts +4 -0
- package/docs/.vitepress/theme/style.css +16 -0
- package/docs/assets/dashboard.png +0 -0
- package/docs/cron-tasks.md +172 -0
- package/docs/dashboard.md +117 -0
- package/docs/getters.md +31 -0
- package/docs/getting-started.md +120 -0
- package/docs/index.md +29 -0
- package/docs/initialization.md +59 -0
- package/docs/process-in-batches.md +73 -0
- package/docs/reactive-tasks.md +914 -0
- package/docs/with-lock.md +45 -0
- package/docs/with-transaction.md +65 -0
- package/grafana/reactive_tasks.json +765 -0
- package/package.json +127 -116
- package/dist/lib/OnError.js.map +0 -1
- package/dist/lib/OnInfo.js.map +0 -1
- package/dist/lib/createContinuousLock.js.map +0 -1
- package/dist/lib/cronTasks.js.map +0 -1
- package/dist/lib/getCollection.js.map +0 -1
- package/dist/lib/getMongoClient.js.map +0 -1
- package/dist/lib/index.js +0 -64
- package/dist/lib/index.js.map +0 -1
- package/dist/lib/initPromise.js.map +0 -1
- package/dist/lib/withLock.js.map +0 -1
- package/dist/lib/withTransaction.js.map +0 -1
- package/dist/types/index.d.ts +0 -17
- /package/dist/types/{OnError.d.ts → src/OnError.d.ts} +0 -0
- /package/dist/types/{createContinuousLock.d.ts → src/createContinuousLock.d.ts} +0 -0
- /package/dist/types/{getCollection.d.ts → src/getCollection.d.ts} +0 -0
- /package/dist/types/{getMongoClient.d.ts → src/getMongoClient.d.ts} +0 -0
- /package/dist/types/{initPromise.d.ts → src/initPromise.d.ts} +0 -0
- /package/dist/types/{withLock.d.ts → src/withLock.d.ts} +0 -0
- /package/dist/types/{withTransaction.d.ts → src/withTransaction.d.ts} +0 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**!
|
|
2
|
+
* mongodash v2.1.0
|
|
3
|
+
* git+https://github.com/VaclavObornik/mongodash.git
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2025 Václav Oborník
|
|
6
|
+
* Released under the MIT license
|
|
7
|
+
*/
|
|
8
|
+
"use strict";
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ReactiveTaskWorker = void 0;
|
|
11
|
+
const _debug = require("debug");
|
|
12
|
+
const createContinuousLock_1 = require("../createContinuousLock");
|
|
13
|
+
const compileWatchProjection_1 = require("./compileWatchProjection");
|
|
14
|
+
const ReactiveTaskTypes_1 = require("./ReactiveTaskTypes");
|
|
15
|
+
const OnInfo_1 = require("../OnInfo");
|
|
16
|
+
const OnError_1 = require("../OnError");
|
|
17
|
+
const debug = _debug('mongodash:reactiveTasks:worker');
|
|
18
|
+
/**
|
|
19
|
+
* Responsible for executing reactive tasks.
|
|
20
|
+
*
|
|
21
|
+
* Responsibilities:
|
|
22
|
+
* - Polls for pending tasks from the database.
|
|
23
|
+
* - Applies filtering to restrict which tasks this worker processes.
|
|
24
|
+
* - Locks tasks during execution to prevent concurrent processing.
|
|
25
|
+
* - Fetches the source document and executes the user-defined handler.
|
|
26
|
+
* - Handles task completion, failure, retries, and dead-letter queueing.
|
|
27
|
+
* - Manages the visibility timeout lock extension.
|
|
28
|
+
*/
|
|
29
|
+
class ReactiveTaskWorker {
|
|
30
|
+
constructor(instanceId, registry, callbacks, internalOptions = { visibilityTimeoutMs: 300000 }, taskCaller, taskFilter, onInfo = OnInfo_1.defaultOnInfo, onError = OnError_1.defaultOnError, metricsCollector) {
|
|
31
|
+
this.instanceId = instanceId;
|
|
32
|
+
this.registry = registry;
|
|
33
|
+
this.callbacks = callbacks;
|
|
34
|
+
this.internalOptions = internalOptions;
|
|
35
|
+
this.taskFilter = taskFilter;
|
|
36
|
+
this.onInfo = onInfo;
|
|
37
|
+
this.onError = onError;
|
|
38
|
+
this.metricsCollector = metricsCollector;
|
|
39
|
+
this.throttledUntil = new Map();
|
|
40
|
+
this.taskCaller = taskCaller || ((task) => task());
|
|
41
|
+
}
|
|
42
|
+
async tryRunATask(collectionName) {
|
|
43
|
+
const entry = this.registry.getEntry(collectionName);
|
|
44
|
+
let tasks = this.registry.getAllTasks();
|
|
45
|
+
if (this.taskFilter) {
|
|
46
|
+
tasks = tasks.filter((t) => this.taskFilter({ task: t.task }));
|
|
47
|
+
}
|
|
48
|
+
if (!tasks.length) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Filter out throttled tasks
|
|
52
|
+
const now = Date.now();
|
|
53
|
+
tasks = tasks.filter((t) => {
|
|
54
|
+
const until = this.throttledUntil.get(t.task);
|
|
55
|
+
if (until && until.getTime() > now) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
if (until) {
|
|
59
|
+
this.throttledUntil.delete(t.task); // Cleanup expired throttle
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
});
|
|
63
|
+
if (!tasks.length) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const taskRecord = await entry.repository.findAndLockNextTask(tasks, {
|
|
67
|
+
visibilityTimeoutMs: this.internalOptions.visibilityTimeoutMs,
|
|
68
|
+
});
|
|
69
|
+
if (taskRecord) {
|
|
70
|
+
this.callbacks.onTaskFound(collectionName);
|
|
71
|
+
await this.processTask(taskRecord);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async processTask(taskRecord) {
|
|
75
|
+
var _a, _b, _c;
|
|
76
|
+
const taskDef = this.registry.getTask(taskRecord.task);
|
|
77
|
+
const tasksCollection = taskDef.tasksCollection;
|
|
78
|
+
let deferredTo;
|
|
79
|
+
let throttledUntil;
|
|
80
|
+
const context = {
|
|
81
|
+
docId: taskRecord.sourceDocId,
|
|
82
|
+
watchedValues: taskRecord.lastObservedValues || null,
|
|
83
|
+
getDocument: async (options) => {
|
|
84
|
+
const queryConditions = [{ _id: taskRecord.sourceDocId }];
|
|
85
|
+
if (taskDef.filter) {
|
|
86
|
+
queryConditions.push({ $expr: taskDef.filter });
|
|
87
|
+
}
|
|
88
|
+
if (taskRecord.lastObservedValues && Object.keys(taskRecord.lastObservedValues).length > 0) {
|
|
89
|
+
// Optimistic Locking: Ensure watched values match what triggered the task
|
|
90
|
+
// We use the same projection logic as the planner to compare current DB state vs snapshot
|
|
91
|
+
const projectionExpr = (0, compileWatchProjection_1.compileWatchProjection)(taskDef.watchProjection);
|
|
92
|
+
queryConditions.push({ $expr: { $eq: [projectionExpr, taskRecord.lastObservedValues] } });
|
|
93
|
+
}
|
|
94
|
+
const query = (queryConditions.length > 1 ? { $and: queryConditions } : queryConditions[0]);
|
|
95
|
+
const sourceDoc = await taskDef.sourceCollection.findOne(query, options);
|
|
96
|
+
if (!sourceDoc) {
|
|
97
|
+
throw new ReactiveTaskTypes_1.TaskConditionFailedError();
|
|
98
|
+
}
|
|
99
|
+
return sourceDoc;
|
|
100
|
+
},
|
|
101
|
+
deferCurrent: (delay) => {
|
|
102
|
+
deferredTo = typeof delay === 'number' ? new Date(Date.now() + delay) : delay;
|
|
103
|
+
},
|
|
104
|
+
throttleAll: (until) => {
|
|
105
|
+
throttledUntil = typeof until === 'number' ? new Date(Date.now() + until) : until;
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
const stopLock = (0, createContinuousLock_1.createContinuousLock)(tasksCollection, taskRecord._id.toString(), 'lockExpiresAt', this.internalOptions.visibilityTimeoutMs, (error) => {
|
|
109
|
+
this.onError(error);
|
|
110
|
+
});
|
|
111
|
+
const processTheTask = async () => {
|
|
112
|
+
const start = Date.now();
|
|
113
|
+
this.onInfo({
|
|
114
|
+
message: `Reactive task '${taskRecord.task}' started.`,
|
|
115
|
+
taskId: taskRecord._id.toString(),
|
|
116
|
+
code: ReactiveTaskTypes_1.CODE_REACTIVE_TASK_STARTED,
|
|
117
|
+
});
|
|
118
|
+
try {
|
|
119
|
+
await taskDef.handler(context);
|
|
120
|
+
const duration = Date.now() - start;
|
|
121
|
+
this.onInfo({
|
|
122
|
+
message: `Reactive task '${taskRecord.task}' finished in ${duration}ms.`,
|
|
123
|
+
taskId: taskRecord._id.toString(),
|
|
124
|
+
code: ReactiveTaskTypes_1.CODE_REACTIVE_TASK_FINISHED,
|
|
125
|
+
duration,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
if (err instanceof ReactiveTaskTypes_1.TaskConditionFailedError) {
|
|
130
|
+
const duration = Date.now() - start;
|
|
131
|
+
debug(`[Scheduler ${this.instanceId}] Source document ${taskRecord.sourceDocId} not found or does not match filter for task ${taskRecord._id}. Marking as completed (skipped).`);
|
|
132
|
+
this.onInfo({
|
|
133
|
+
message: `Reactive task '${taskRecord.task}' finished in ${duration}ms (skipped - filter mismatch).`,
|
|
134
|
+
taskId: taskRecord._id.toString(),
|
|
135
|
+
code: ReactiveTaskTypes_1.CODE_REACTIVE_TASK_FINISHED,
|
|
136
|
+
duration,
|
|
137
|
+
});
|
|
138
|
+
// Treat as success
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const duration = Date.now() - start;
|
|
142
|
+
const reason = err instanceof Error ? err.message : `${err}`;
|
|
143
|
+
this.onInfo({
|
|
144
|
+
message: `Reactive task '${taskRecord.task}' failed in ${duration}ms.`,
|
|
145
|
+
taskId: taskRecord._id.toString(),
|
|
146
|
+
code: ReactiveTaskTypes_1.CODE_REACTIVE_TASK_FAILED,
|
|
147
|
+
reason,
|
|
148
|
+
duration,
|
|
149
|
+
});
|
|
150
|
+
throw err;
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
const start = Date.now();
|
|
154
|
+
if (taskRecord.attempts > 1) {
|
|
155
|
+
(_a = this.metricsCollector) === null || _a === void 0 ? void 0 : _a.recordRetry(taskRecord.task);
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
await this.taskCaller(processTheTask);
|
|
159
|
+
await stopLock();
|
|
160
|
+
const duration = Date.now() - start;
|
|
161
|
+
if (throttledUntil) {
|
|
162
|
+
this.throttledUntil.set(taskRecord.task, throttledUntil);
|
|
163
|
+
debug(`[Scheduler ${this.instanceId}] Throttling task '${taskRecord.task}' until ${throttledUntil.toISOString()}`);
|
|
164
|
+
}
|
|
165
|
+
if (deferredTo) {
|
|
166
|
+
debug(`[Scheduler ${this.instanceId}] Deferring task '${taskRecord.task}' until ${deferredTo.toISOString()}`);
|
|
167
|
+
const entry = this.registry.getEntry(tasksCollection.collectionName);
|
|
168
|
+
await entry.repository.deferTask(taskRecord, deferredTo);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
(_b = this.metricsCollector) === null || _b === void 0 ? void 0 : _b.recordTaskExecution(taskRecord.task, 'success', duration);
|
|
172
|
+
const entry = this.registry.getEntry(tasksCollection.collectionName);
|
|
173
|
+
await entry.repository.finalizeTask(taskRecord, taskDef.retryStrategy, undefined, taskDef.debounceMs, { durationMs: duration }, taskDef.executionHistoryLimit);
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
// Logging is already done in processTheTask via onInfo
|
|
177
|
+
await stopLock();
|
|
178
|
+
const duration = Date.now() - start;
|
|
179
|
+
(_c = this.metricsCollector) === null || _c === void 0 ? void 0 : _c.recordTaskExecution(taskRecord.task, 'failed', duration);
|
|
180
|
+
const entry = this.registry.getEntry(tasksCollection.collectionName);
|
|
181
|
+
await entry.repository.finalizeTask(taskRecord, taskDef.retryStrategy, error, taskDef.debounceMs, { durationMs: duration }, taskDef.executionHistoryLimit);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
exports.ReactiveTaskWorker = ReactiveTaskWorker;
|
|
186
|
+
//# sourceMappingURL=ReactiveTaskWorker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReactiveTaskWorker.js","sourceRoot":"","sources":["../../../../src/reactiveTasks/ReactiveTaskWorker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**!
|
|
2
|
+
* mongodash v2.1.0
|
|
3
|
+
* git+https://github.com/VaclavObornik/mongodash.git
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2025 Václav Oborník
|
|
6
|
+
* Released under the MIT license
|
|
7
|
+
*/
|
|
8
|
+
"use strict";
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.compileWatchProjection = compileWatchProjection;
|
|
11
|
+
const projectionCache = new WeakMap();
|
|
12
|
+
/**
|
|
13
|
+
* Compiles a user-friendly watchProjection into a strict Aggregation Expression.
|
|
14
|
+
* This handles:
|
|
15
|
+
* 1. Unflattening dotted keys (e.g. {'a.b': 1} -> {a: {b: '$a.b'}})
|
|
16
|
+
* 2. Converting shorthand inclusion (1/true) to field paths ('$key')
|
|
17
|
+
* 3. Validating that no unsupported features (like exclusion) are used.
|
|
18
|
+
*
|
|
19
|
+
* @param projection The user-provided projection.
|
|
20
|
+
* @returns An aggregation expression or string '$$ROOT'.
|
|
21
|
+
*/
|
|
22
|
+
function compileWatchProjection(projection) {
|
|
23
|
+
if (!projection) {
|
|
24
|
+
return '$$ROOT';
|
|
25
|
+
}
|
|
26
|
+
if (projectionCache.has(projection)) {
|
|
27
|
+
return projectionCache.get(projection);
|
|
28
|
+
}
|
|
29
|
+
if (Object.keys(projection).length === 0) {
|
|
30
|
+
const result = '$$ROOT';
|
|
31
|
+
projectionCache.set(projection, result);
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
const expression = {};
|
|
35
|
+
for (const [key, value] of Object.entries(projection)) {
|
|
36
|
+
let targetValue;
|
|
37
|
+
if (value === 1 || value === true) {
|
|
38
|
+
targetValue = `$${key}`;
|
|
39
|
+
}
|
|
40
|
+
else if (value === 0 || value === false) {
|
|
41
|
+
throw new Error('Exclusion style projection (0) is not supported in watchProjection yet. Use explicit inclusion or computed fields.');
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
targetValue = value;
|
|
45
|
+
}
|
|
46
|
+
// Handle dotted keys by unflattening them
|
|
47
|
+
const parts = key.split('.');
|
|
48
|
+
let current = expression;
|
|
49
|
+
for (let i = 0; i < parts.length; i++) {
|
|
50
|
+
const part = parts[i];
|
|
51
|
+
if (i === parts.length - 1) {
|
|
52
|
+
current[part] = targetValue;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
if (!current[part]) {
|
|
56
|
+
current[part] = {};
|
|
57
|
+
}
|
|
58
|
+
current = current[part];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
projectionCache.set(projection, expression);
|
|
63
|
+
return expression;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=compileWatchProjection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compileWatchProjection.js","sourceRoot":"","sources":["../../../../src/reactiveTasks/compileWatchProjection.ts"],"names":[],"mappings":";;AAcA,wDA4CC;AAxDD,MAAM,eAAe,GAAG,IAAI,OAAO,EAA6B,CAAC;AAEjE;;;;;;;;;GASG;AACH,SAAgB,sBAAsB,CAAC,UAAqB;IACxD,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,IAAI,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,OAAO,eAAe,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;IAC5C,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,QAAQ,CAAC;QACxB,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACpD,IAAI,WAAoB,CAAC;QACzB,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAChC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;QAC5B,CAAC;aAAM,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,oHAAoH,CAAC,CAAC;QAC1I,CAAC;aAAM,CAAC;YACJ,WAAW,GAAG,KAAK,CAAC;QACxB,CAAC;QAED,0CAA0C;QAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,OAAO,GAAG,UAAU,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjB,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,CAAC;gBACD,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC;IACL,CAAC;IAED,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5C,OAAO,UAAU,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**!
|
|
2
|
+
* mongodash v2.1.0
|
|
3
|
+
* git+https://github.com/VaclavObornik/mongodash.git
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2025 Václav Oborník
|
|
6
|
+
* Released under the MIT license
|
|
7
|
+
*/
|
|
8
|
+
"use strict";
|
|
9
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
10
|
+
var t = {};
|
|
11
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
12
|
+
t[p] = s[p];
|
|
13
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
14
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
15
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
16
|
+
t[p[i]] = s[p[i]];
|
|
17
|
+
}
|
|
18
|
+
return t;
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
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;
|
|
22
|
+
exports.init = init;
|
|
23
|
+
exports.reactiveTask = reactiveTask;
|
|
24
|
+
exports.stopReactiveTasks = stopReactiveTasks;
|
|
25
|
+
exports.startReactiveTasks = startReactiveTasks;
|
|
26
|
+
exports.getPrometheusMetrics = getPrometheusMetrics;
|
|
27
|
+
exports.getReactiveTasks = getReactiveTasks;
|
|
28
|
+
exports.countReactiveTasks = countReactiveTasks;
|
|
29
|
+
exports.retryReactiveTasks = retryReactiveTasks;
|
|
30
|
+
const _debug = require("debug");
|
|
31
|
+
const ConcurrentRunner_1 = require("../ConcurrentRunner");
|
|
32
|
+
const initPromise_1 = require("../initPromise");
|
|
33
|
+
const OnError_1 = require("../OnError");
|
|
34
|
+
const OnInfo_1 = require("../OnInfo");
|
|
35
|
+
const parseInterval_1 = require("../parseInterval");
|
|
36
|
+
const LeaderElector_1 = require("./LeaderElector");
|
|
37
|
+
const MetricsCollector_1 = require("./MetricsCollector");
|
|
38
|
+
const ReactiveTaskManager_1 = require("./ReactiveTaskManager");
|
|
39
|
+
const ReactiveTaskPlanner_1 = require("./ReactiveTaskPlanner");
|
|
40
|
+
const ReactiveTaskRegistry_1 = require("./ReactiveTaskRegistry");
|
|
41
|
+
const ReactiveTaskTypes_1 = require("./ReactiveTaskTypes");
|
|
42
|
+
const ReactiveTaskWorker_1 = require("./ReactiveTaskWorker");
|
|
43
|
+
const debug = _debug('mongodash:reactiveTasks');
|
|
44
|
+
// Re-export types for backward compatibility
|
|
45
|
+
var ReactiveTaskTypes_2 = require("./ReactiveTaskTypes");
|
|
46
|
+
Object.defineProperty(exports, "CODE_REACTIVE_TASK_CLEANUP", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_CLEANUP; } });
|
|
47
|
+
Object.defineProperty(exports, "CODE_REACTIVE_TASK_FAILED", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_FAILED; } });
|
|
48
|
+
Object.defineProperty(exports, "CODE_REACTIVE_TASK_FINISHED", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_FINISHED; } });
|
|
49
|
+
Object.defineProperty(exports, "CODE_REACTIVE_TASK_INITIALIZED", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_INITIALIZED; } });
|
|
50
|
+
Object.defineProperty(exports, "CODE_REACTIVE_TASK_LEADER_LOCK_LOST", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_LEADER_LOCK_LOST; } });
|
|
51
|
+
Object.defineProperty(exports, "CODE_REACTIVE_TASK_PLANNER_RECONCILIATION_FINISHED", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_PLANNER_RECONCILIATION_FINISHED; } });
|
|
52
|
+
Object.defineProperty(exports, "CODE_REACTIVE_TASK_PLANNER_RECONCILIATION_STARTED", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_PLANNER_RECONCILIATION_STARTED; } });
|
|
53
|
+
Object.defineProperty(exports, "CODE_REACTIVE_TASK_PLANNER_STARTED", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_PLANNER_STARTED; } });
|
|
54
|
+
Object.defineProperty(exports, "CODE_REACTIVE_TASK_PLANNER_STOPPED", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_PLANNER_STOPPED; } });
|
|
55
|
+
Object.defineProperty(exports, "CODE_REACTIVE_TASK_PLANNER_STREAM_ERROR", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_PLANNER_STREAM_ERROR; } });
|
|
56
|
+
Object.defineProperty(exports, "CODE_REACTIVE_TASK_STARTED", { enumerable: true, get: function () { return ReactiveTaskTypes_2.CODE_REACTIVE_TASK_STARTED; } });
|
|
57
|
+
Object.defineProperty(exports, "REACTIVE_TASK_META_DOC_ID", { enumerable: true, get: function () { return ReactiveTaskTypes_2.REACTIVE_TASK_META_DOC_ID; } });
|
|
58
|
+
Object.defineProperty(exports, "TaskConditionFailedError", { enumerable: true, get: function () { return ReactiveTaskTypes_2.TaskConditionFailedError; } });
|
|
59
|
+
let onError = OnError_1.defaultOnError;
|
|
60
|
+
let onInfo = OnInfo_1.defaultOnInfo;
|
|
61
|
+
let globalsCollection;
|
|
62
|
+
/**
|
|
63
|
+
* Main scheduler class implementing the described logic.
|
|
64
|
+
*/
|
|
65
|
+
/**
|
|
66
|
+
* Main entry point for the Reactive Tasks system.
|
|
67
|
+
*
|
|
68
|
+
* Responsibilities:
|
|
69
|
+
* - Orchestrates the initialization and configuration of the system.
|
|
70
|
+
* - Manages the lifecycle of `LeaderElector`, `ReactiveTaskPlanner`, and `ReactiveTaskWorker`.
|
|
71
|
+
* - Provides the public API for registering tasks and starting/stopping the system.
|
|
72
|
+
* - Configures the `ConcurrentRunner` for worker execution.
|
|
73
|
+
*/
|
|
74
|
+
class ReactiveTaskScheduler {
|
|
75
|
+
constructor() {
|
|
76
|
+
this.options = {
|
|
77
|
+
reactiveTaskConcurrency: 5,
|
|
78
|
+
};
|
|
79
|
+
// Registry for consumers and collections
|
|
80
|
+
this.registry = new ReactiveTaskRegistry_1.ReactiveTaskRegistry();
|
|
81
|
+
// Internal state
|
|
82
|
+
this.isRunning = false;
|
|
83
|
+
// Internal options for testing
|
|
84
|
+
this.internalOptions = {
|
|
85
|
+
lockTtlMs: 30000,
|
|
86
|
+
lockHeartbeatMs: 10000,
|
|
87
|
+
minPollMs: 200,
|
|
88
|
+
maxPollMs: 10000,
|
|
89
|
+
jitterMs: 100,
|
|
90
|
+
visibilityTimeoutMs: 60000,
|
|
91
|
+
batchSize: 1000,
|
|
92
|
+
batchIntervalMs: 500,
|
|
93
|
+
getNextCleanupDate: (d) => { var _a; return new Date(((_a = d === null || d === void 0 ? void 0 : d.getTime()) !== null && _a !== void 0 ? _a : Date.now()) + 24 * 60 * 60 * 1000); }, // 24h default
|
|
94
|
+
};
|
|
95
|
+
// Registry is created, instanceId is lazy-generated or configured later
|
|
96
|
+
this.taskManager = new ReactiveTaskManager_1.ReactiveTaskManager(this.registry);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get the instanceId, generating one if not configured.
|
|
100
|
+
*/
|
|
101
|
+
get instanceId() {
|
|
102
|
+
if (!this._instanceId) {
|
|
103
|
+
const { ObjectId } = require('mongodb');
|
|
104
|
+
this._instanceId = new ObjectId().toHexString();
|
|
105
|
+
}
|
|
106
|
+
return this._instanceId;
|
|
107
|
+
}
|
|
108
|
+
configure(options) {
|
|
109
|
+
if (this.concurrentRunner) {
|
|
110
|
+
throw new Error('Cannot configure scheduler after initialization.');
|
|
111
|
+
}
|
|
112
|
+
// Configure instanceId if provided
|
|
113
|
+
if (options.instanceId) {
|
|
114
|
+
this._instanceId = options.instanceId;
|
|
115
|
+
}
|
|
116
|
+
if (options.reactiveTaskCleanupInterval !== undefined) {
|
|
117
|
+
this.internalOptions.getNextCleanupDate = (0, parseInterval_1.createIntervalFunction)(options.reactiveTaskCleanupInterval);
|
|
118
|
+
}
|
|
119
|
+
this.options = Object.assign(Object.assign({}, this.options), options);
|
|
120
|
+
this.concurrentRunner = new ConcurrentRunner_1.ConcurrentRunner({ concurrency: this.options.reactiveTaskConcurrency }, onError);
|
|
121
|
+
this.registry.setCallbacks(onInfo, onError);
|
|
122
|
+
debug(`[Scheduler ${this.instanceId}] Configured. onInfo is ${onInfo === OnInfo_1.defaultOnInfo ? 'DEFAULT' : 'CUSTOM'}`);
|
|
123
|
+
}
|
|
124
|
+
async addTask(taskDef) {
|
|
125
|
+
if (this.isRunning) {
|
|
126
|
+
throw new Error('Cannot add task after scheduler has started.');
|
|
127
|
+
}
|
|
128
|
+
if (this.registry.getTask(taskDef.task)) {
|
|
129
|
+
throw new Error(`Task with name '${taskDef.task}' already exists.`);
|
|
130
|
+
}
|
|
131
|
+
await this.registry.addTask(taskDef);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Starts the entire system - leader election and workers.
|
|
135
|
+
*/
|
|
136
|
+
async start() {
|
|
137
|
+
if (this.isRunning) {
|
|
138
|
+
debug(`[Scheduler ${this.instanceId}] Attempt to start already running scheduler.`);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (!this.concurrentRunner) {
|
|
142
|
+
throw new Error('Scheduler is not configured. Call configure() first.');
|
|
143
|
+
}
|
|
144
|
+
this.isRunning = true;
|
|
145
|
+
debug(`[Scheduler ${this.instanceId}] Starting...`);
|
|
146
|
+
await initPromise_1.initPromise; // Ensure init is complete
|
|
147
|
+
await Promise.all(this.registry.getAllTasks().map((task) => task.initPromise));
|
|
148
|
+
for (const { tasksCollection } of this.registry.getAllEntries()) {
|
|
149
|
+
if (this.concurrentRunner.hasSource(tasksCollection.collectionName)) {
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
this.concurrentRunner.registerSource(tasksCollection.collectionName, {
|
|
153
|
+
minPollMs: this.internalOptions.minPollMs,
|
|
154
|
+
maxPollMs: this.internalOptions.maxPollMs,
|
|
155
|
+
jitterMs: this.internalOptions.jitterMs,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
// Initialize components
|
|
159
|
+
this.taskPlanner = new ReactiveTaskPlanner_1.ReactiveTaskPlanner(globalsCollection, this.instanceId, this.registry, {
|
|
160
|
+
onStreamError: () => {
|
|
161
|
+
var _a;
|
|
162
|
+
onInfo({
|
|
163
|
+
message: `Change Stream error.`,
|
|
164
|
+
code: ReactiveTaskTypes_1.CODE_REACTIVE_TASK_PLANNER_STREAM_ERROR,
|
|
165
|
+
});
|
|
166
|
+
// If stream fails, we should probably force lose leader to let someone else try,
|
|
167
|
+
// or just restart if we are still leader.
|
|
168
|
+
// LeaderElector handles its own loop.
|
|
169
|
+
// If stream fails, Planner stops.
|
|
170
|
+
// We can ask LeaderElector to give up leadership.
|
|
171
|
+
(_a = this.leaderElector) === null || _a === void 0 ? void 0 : _a.forceLoseLeader();
|
|
172
|
+
},
|
|
173
|
+
onTaskPlanned: (tasksCollectionName, debounceMs) => {
|
|
174
|
+
setTimeout(() => {
|
|
175
|
+
var _a;
|
|
176
|
+
(_a = this.concurrentRunner) === null || _a === void 0 ? void 0 : _a.speedUp(tasksCollectionName);
|
|
177
|
+
}, debounceMs);
|
|
178
|
+
},
|
|
179
|
+
}, {
|
|
180
|
+
batchSize: this.internalOptions.batchSize,
|
|
181
|
+
batchIntervalMs: this.internalOptions.batchIntervalMs,
|
|
182
|
+
getNextCleanupDate: this.internalOptions.getNextCleanupDate,
|
|
183
|
+
}, onInfo, onError);
|
|
184
|
+
this.leaderElector = new LeaderElector_1.LeaderElector(globalsCollection, this.instanceId, {
|
|
185
|
+
lockTtlMs: this.internalOptions.lockTtlMs,
|
|
186
|
+
lockHeartbeatMs: this.internalOptions.lockHeartbeatMs,
|
|
187
|
+
metaDocId: ReactiveTaskTypes_1.REACTIVE_TASK_META_DOC_ID,
|
|
188
|
+
}, {
|
|
189
|
+
onBecomeLeader: async () => {
|
|
190
|
+
var _a;
|
|
191
|
+
const tasks = this.registry.getAllTasks();
|
|
192
|
+
if (tasks.length === 0) {
|
|
193
|
+
debug(`[Scheduler ${this.instanceId}] Became leader, but no tasks registered. Skipping planner start.`);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
debug(`[Scheduler ${this.instanceId}] Became leader, starting planner.`);
|
|
197
|
+
await ((_a = this.taskPlanner) === null || _a === void 0 ? void 0 : _a.start());
|
|
198
|
+
},
|
|
199
|
+
onLoseLeader: async () => {
|
|
200
|
+
var _a;
|
|
201
|
+
debug(`[Scheduler ${this.instanceId}] Lost leader, stopping planner.`);
|
|
202
|
+
await ((_a = this.taskPlanner) === null || _a === void 0 ? void 0 : _a.stop());
|
|
203
|
+
},
|
|
204
|
+
onHeartbeat: async () => {
|
|
205
|
+
var _a;
|
|
206
|
+
await ((_a = this.taskPlanner) === null || _a === void 0 ? void 0 : _a.onHeartbeat());
|
|
207
|
+
},
|
|
208
|
+
}, onInfo, onError);
|
|
209
|
+
this.metricsCollector = new MetricsCollector_1.MetricsCollector(this.instanceId, this.registry, globalsCollection, this.leaderElector, this.options.monitoring, onInfo, onError);
|
|
210
|
+
this.worker = new ReactiveTaskWorker_1.ReactiveTaskWorker(this.instanceId, this.registry, {
|
|
211
|
+
onTaskFound: (collectionName) => {
|
|
212
|
+
this.concurrentRunner.speedUp(collectionName);
|
|
213
|
+
},
|
|
214
|
+
}, {
|
|
215
|
+
visibilityTimeoutMs: this.internalOptions.visibilityTimeoutMs,
|
|
216
|
+
}, this.options.reactiveTaskCaller, this.options.reactiveTaskFilter, onInfo, onError, this.metricsCollector);
|
|
217
|
+
// Start Leader Election
|
|
218
|
+
await this.leaderElector.start();
|
|
219
|
+
// Start Metrics Collector
|
|
220
|
+
if (this.metricsCollector) {
|
|
221
|
+
this.metricsCollector.start();
|
|
222
|
+
}
|
|
223
|
+
// Start Workers
|
|
224
|
+
this.concurrentRunner.start((collectionName) => this.worker.tryRunATask(collectionName));
|
|
225
|
+
debug(`[Scheduler ${this.instanceId}] Started with ${this.options.reactiveTaskConcurrency} workers.`);
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Stops the entire system.
|
|
229
|
+
*/
|
|
230
|
+
async stop() {
|
|
231
|
+
var _a, _b, _c;
|
|
232
|
+
if (!this.isRunning) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
debug(`[Scheduler ${this.instanceId}] Stopping...`);
|
|
236
|
+
this.isRunning = false;
|
|
237
|
+
await Promise.all([(_a = this.leaderElector) === null || _a === void 0 ? void 0 : _a.stop(), (_b = this.taskPlanner) === null || _b === void 0 ? void 0 : _b.stop(), this.concurrentRunner.stop(), (_c = this.metricsCollector) === null || _c === void 0 ? void 0 : _c.stop()]);
|
|
238
|
+
debug(`[Scheduler ${this.instanceId}] Stopped.`);
|
|
239
|
+
}
|
|
240
|
+
async getPrometheusMetrics() {
|
|
241
|
+
var _a, _b;
|
|
242
|
+
return (_b = (await ((_a = this.metricsCollector) === null || _a === void 0 ? void 0 : _a.getPrometheusMetrics()))) !== null && _b !== void 0 ? _b : null;
|
|
243
|
+
}
|
|
244
|
+
getTaskManager() {
|
|
245
|
+
return this.taskManager;
|
|
246
|
+
}
|
|
247
|
+
getRegistry() {
|
|
248
|
+
return this.registry;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
exports.ReactiveTaskScheduler = ReactiveTaskScheduler;
|
|
252
|
+
// --- SINGLETON INSTANCE ---
|
|
253
|
+
const scheduler = new ReactiveTaskScheduler();
|
|
254
|
+
exports._scheduler = scheduler;
|
|
255
|
+
// --- PUBLIC INITIALIZATION FUNCTION ---
|
|
256
|
+
function init(initOptions) {
|
|
257
|
+
const { onError: _onError, onInfo: _onInfo, globalsCollection: _globalsCollection } = initOptions, schedulerOptions = __rest(initOptions, ["onError", "onInfo", "globalsCollection"]);
|
|
258
|
+
onError = _onError;
|
|
259
|
+
onInfo = _onInfo;
|
|
260
|
+
globalsCollection = _globalsCollection;
|
|
261
|
+
scheduler.configure(schedulerOptions);
|
|
262
|
+
}
|
|
263
|
+
async function reactiveTask(taskDef) {
|
|
264
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
265
|
+
await scheduler.addTask(taskDef);
|
|
266
|
+
}
|
|
267
|
+
async function stopReactiveTasks() {
|
|
268
|
+
await scheduler.stop();
|
|
269
|
+
}
|
|
270
|
+
async function startReactiveTasks() {
|
|
271
|
+
await scheduler.start();
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Returns the Prometheus metrics for the Reactive Tasks system.
|
|
275
|
+
* Respects the 'scrapeMode' configuration.
|
|
276
|
+
*/
|
|
277
|
+
async function getPrometheusMetrics() {
|
|
278
|
+
return scheduler.getPrometheusMetrics();
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* List tasks matching the criteria.
|
|
282
|
+
*/
|
|
283
|
+
async function getReactiveTasks(query, pagination = {}) {
|
|
284
|
+
return scheduler.getTaskManager().getTasks(query, pagination);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Count tasks matching criteria.
|
|
288
|
+
*/
|
|
289
|
+
async function countReactiveTasks(query) {
|
|
290
|
+
return scheduler.getTaskManager().countTasks(query);
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Retries/Retriggers tasks matching the query.
|
|
294
|
+
*/
|
|
295
|
+
async function retryReactiveTasks(query) {
|
|
296
|
+
return scheduler.getTaskManager().retryTasks(query);
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/reactiveTasks/index.ts"],"names":[],"mappings":"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"}
|