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.
Files changed (163) hide show
  1. package/README.md +40 -22
  2. package/dist/dashboard/index.html +40 -0
  3. package/dist/lib/playground/server.js +131 -0
  4. package/dist/lib/playground/server.js.map +1 -0
  5. package/dist/lib/src/ConcurrentRunner.js +148 -0
  6. package/dist/lib/src/ConcurrentRunner.js.map +1 -0
  7. package/dist/lib/{OnError.js → src/OnError.js} +3 -3
  8. package/dist/lib/src/OnError.js.map +1 -0
  9. package/dist/lib/{OnInfo.js → src/OnInfo.js} +6 -3
  10. package/dist/lib/src/OnInfo.js.map +1 -0
  11. package/dist/lib/{createContinuousLock.js → src/createContinuousLock.js} +5 -3
  12. package/dist/lib/src/createContinuousLock.js.map +1 -0
  13. package/dist/lib/{cronTasks.js → src/cronTasks.js} +129 -73
  14. package/dist/lib/src/cronTasks.js.map +1 -0
  15. package/dist/lib/{getCollection.js → src/getCollection.js} +2 -2
  16. package/dist/lib/src/getCollection.js.map +1 -0
  17. package/dist/lib/{getMongoClient.js → src/getMongoClient.js} +2 -2
  18. package/dist/lib/src/getMongoClient.js.map +1 -0
  19. package/dist/lib/src/globalsCollection.js +10 -0
  20. package/dist/lib/src/globalsCollection.js.map +1 -0
  21. package/dist/lib/src/index.js +101 -0
  22. package/dist/lib/src/index.js.map +1 -0
  23. package/dist/lib/{initPromise.js → src/initPromise.js} +2 -3
  24. package/dist/lib/src/initPromise.js.map +1 -0
  25. package/dist/lib/src/mongoCompatibility.js +10 -0
  26. package/dist/lib/src/mongoCompatibility.js.map +1 -0
  27. package/dist/lib/src/parseInterval.js +60 -0
  28. package/dist/lib/src/parseInterval.js.map +1 -0
  29. package/dist/lib/src/prefixFilterKeys.js +69 -0
  30. package/dist/lib/src/prefixFilterKeys.js.map +1 -0
  31. package/dist/lib/src/processInBatches.js +46 -0
  32. package/dist/lib/src/processInBatches.js.map +1 -0
  33. package/dist/lib/src/reactiveTasks/LeaderElector.js +155 -0
  34. package/dist/lib/src/reactiveTasks/LeaderElector.js.map +1 -0
  35. package/dist/lib/src/reactiveTasks/MetricsCollector.js +410 -0
  36. package/dist/lib/src/reactiveTasks/MetricsCollector.js.map +1 -0
  37. package/dist/lib/src/reactiveTasks/ReactiveTaskManager.js +288 -0
  38. package/dist/lib/src/reactiveTasks/ReactiveTaskManager.js.map +1 -0
  39. package/dist/lib/src/reactiveTasks/ReactiveTaskOps.js +185 -0
  40. package/dist/lib/src/reactiveTasks/ReactiveTaskOps.js.map +1 -0
  41. package/dist/lib/src/reactiveTasks/ReactiveTaskPlanner.js +443 -0
  42. package/dist/lib/src/reactiveTasks/ReactiveTaskPlanner.js.map +1 -0
  43. package/dist/lib/src/reactiveTasks/ReactiveTaskReconciler.js +218 -0
  44. package/dist/lib/src/reactiveTasks/ReactiveTaskReconciler.js.map +1 -0
  45. package/dist/lib/src/reactiveTasks/ReactiveTaskRegistry.js +184 -0
  46. package/dist/lib/src/reactiveTasks/ReactiveTaskRegistry.js.map +1 -0
  47. package/dist/lib/src/reactiveTasks/ReactiveTaskRepository.js +355 -0
  48. package/dist/lib/src/reactiveTasks/ReactiveTaskRepository.js.map +1 -0
  49. package/dist/lib/src/reactiveTasks/ReactiveTaskRetryStrategy.js +153 -0
  50. package/dist/lib/src/reactiveTasks/ReactiveTaskRetryStrategy.js.map +1 -0
  51. package/dist/lib/src/reactiveTasks/ReactiveTaskTypes.js +34 -0
  52. package/dist/lib/src/reactiveTasks/ReactiveTaskTypes.js.map +1 -0
  53. package/dist/lib/src/reactiveTasks/ReactiveTaskWorker.js +186 -0
  54. package/dist/lib/src/reactiveTasks/ReactiveTaskWorker.js.map +1 -0
  55. package/dist/lib/src/reactiveTasks/compileWatchProjection.js +65 -0
  56. package/dist/lib/src/reactiveTasks/compileWatchProjection.js.map +1 -0
  57. package/dist/lib/src/reactiveTasks/index.js +298 -0
  58. package/dist/lib/src/reactiveTasks/index.js.map +1 -0
  59. package/dist/lib/src/reactiveTasks/queryToExpression.js +160 -0
  60. package/dist/lib/src/reactiveTasks/queryToExpression.js.map +1 -0
  61. package/dist/lib/src/reactiveTasks/validateTaskFilter.js +88 -0
  62. package/dist/lib/src/reactiveTasks/validateTaskFilter.js.map +1 -0
  63. package/dist/lib/src/task-management/OperationalTaskController.js +162 -0
  64. package/dist/lib/src/task-management/OperationalTaskController.js.map +1 -0
  65. package/dist/lib/src/task-management/index.js +27 -0
  66. package/dist/lib/src/task-management/index.js.map +1 -0
  67. package/dist/lib/src/task-management/serveDashboard.js +149 -0
  68. package/dist/lib/src/task-management/serveDashboard.js.map +1 -0
  69. package/dist/lib/src/task-management/types.js +10 -0
  70. package/dist/lib/src/task-management/types.js.map +1 -0
  71. package/dist/lib/{withLock.js → src/withLock.js} +3 -4
  72. package/dist/lib/src/withLock.js.map +1 -0
  73. package/dist/lib/{withTransaction.js → src/withTransaction.js} +4 -4
  74. package/dist/lib/src/withTransaction.js.map +1 -0
  75. package/dist/lib/tools/check-db-connection.js +28 -0
  76. package/dist/lib/tools/check-db-connection.js.map +1 -0
  77. package/dist/lib/tools/clean-testing-databases.js +12 -0
  78. package/dist/lib/tools/clean-testing-databases.js.map +1 -0
  79. package/dist/lib/tools/prepare-republish.js +27 -0
  80. package/dist/lib/tools/prepare-republish.js.map +1 -0
  81. package/dist/lib/tools/test-matrix-local.js +212 -0
  82. package/dist/lib/tools/test-matrix-local.js.map +1 -0
  83. package/dist/lib/tools/testingDatabase.js +55 -0
  84. package/dist/lib/tools/testingDatabase.js.map +1 -0
  85. package/dist/types/playground/server.d.ts +1 -0
  86. package/dist/types/src/ConcurrentRunner.d.ts +30 -0
  87. package/dist/types/{OnInfo.d.ts → src/OnInfo.d.ts} +1 -1
  88. package/dist/types/{cronTasks.d.ts → src/cronTasks.d.ts} +44 -1
  89. package/dist/types/src/globalsCollection.d.ts +4 -0
  90. package/dist/types/src/index.d.ts +28 -0
  91. package/dist/types/src/mongoCompatibility.d.ts +29 -0
  92. package/dist/types/src/parseInterval.d.ts +12 -0
  93. package/dist/types/src/prefixFilterKeys.d.ts +11 -0
  94. package/dist/types/src/processInBatches.d.ts +10 -0
  95. package/dist/types/src/reactiveTasks/LeaderElector.d.ts +42 -0
  96. package/dist/types/src/reactiveTasks/MetricsCollector.d.ts +73 -0
  97. package/dist/types/src/reactiveTasks/ReactiveTaskManager.d.ts +18 -0
  98. package/dist/types/src/reactiveTasks/ReactiveTaskOps.d.ts +17 -0
  99. package/dist/types/src/reactiveTasks/ReactiveTaskPlanner.d.ts +62 -0
  100. package/dist/types/src/reactiveTasks/ReactiveTaskReconciler.d.ts +29 -0
  101. package/dist/types/src/reactiveTasks/ReactiveTaskRegistry.d.ts +34 -0
  102. package/dist/types/src/reactiveTasks/ReactiveTaskRepository.d.ts +59 -0
  103. package/dist/types/src/reactiveTasks/ReactiveTaskRetryStrategy.d.ts +21 -0
  104. package/dist/types/src/reactiveTasks/ReactiveTaskTypes.d.ts +389 -0
  105. package/dist/types/src/reactiveTasks/ReactiveTaskWorker.d.ts +36 -0
  106. package/dist/types/src/reactiveTasks/compileWatchProjection.d.ts +12 -0
  107. package/dist/types/src/reactiveTasks/index.d.ts +82 -0
  108. package/dist/types/src/reactiveTasks/queryToExpression.d.ts +13 -0
  109. package/dist/types/src/reactiveTasks/validateTaskFilter.d.ts +10 -0
  110. package/dist/types/src/task-management/OperationalTaskController.d.ts +59 -0
  111. package/dist/types/src/task-management/index.d.ts +3 -0
  112. package/dist/types/src/task-management/serveDashboard.d.ts +12 -0
  113. package/dist/types/src/task-management/types.d.ts +95 -0
  114. package/dist/types/tools/check-db-connection.d.ts +2 -0
  115. package/dist/types/tools/clean-testing-databases.d.ts +1 -0
  116. package/dist/types/tools/prepare-republish.d.ts +2 -0
  117. package/dist/types/tools/test-matrix-local.d.ts +1 -0
  118. package/dist/types/tools/testingDatabase.d.ts +2 -0
  119. package/docs/.vitepress/cache/deps/_metadata.json +31 -0
  120. package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js +12824 -0
  121. package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js.map +7 -0
  122. package/docs/.vitepress/cache/deps/package.json +3 -0
  123. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +4505 -0
  124. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +7 -0
  125. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +9731 -0
  126. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +7 -0
  127. package/docs/.vitepress/cache/deps/vue.js +347 -0
  128. package/docs/.vitepress/cache/deps/vue.js.map +7 -0
  129. package/docs/.vitepress/config.mts +48 -0
  130. package/docs/.vitepress/theme/index.ts +4 -0
  131. package/docs/.vitepress/theme/style.css +16 -0
  132. package/docs/assets/dashboard.png +0 -0
  133. package/docs/cron-tasks.md +172 -0
  134. package/docs/dashboard.md +117 -0
  135. package/docs/getters.md +31 -0
  136. package/docs/getting-started.md +120 -0
  137. package/docs/index.md +29 -0
  138. package/docs/initialization.md +59 -0
  139. package/docs/process-in-batches.md +73 -0
  140. package/docs/reactive-tasks.md +914 -0
  141. package/docs/with-lock.md +45 -0
  142. package/docs/with-transaction.md +65 -0
  143. package/grafana/reactive_tasks.json +765 -0
  144. package/package.json +127 -116
  145. package/dist/lib/OnError.js.map +0 -1
  146. package/dist/lib/OnInfo.js.map +0 -1
  147. package/dist/lib/createContinuousLock.js.map +0 -1
  148. package/dist/lib/cronTasks.js.map +0 -1
  149. package/dist/lib/getCollection.js.map +0 -1
  150. package/dist/lib/getMongoClient.js.map +0 -1
  151. package/dist/lib/index.js +0 -64
  152. package/dist/lib/index.js.map +0 -1
  153. package/dist/lib/initPromise.js.map +0 -1
  154. package/dist/lib/withLock.js.map +0 -1
  155. package/dist/lib/withTransaction.js.map +0 -1
  156. package/dist/types/index.d.ts +0 -17
  157. /package/dist/types/{OnError.d.ts → src/OnError.d.ts} +0 -0
  158. /package/dist/types/{createContinuousLock.d.ts → src/createContinuousLock.d.ts} +0 -0
  159. /package/dist/types/{getCollection.d.ts → src/getCollection.d.ts} +0 -0
  160. /package/dist/types/{getMongoClient.d.ts → src/getMongoClient.d.ts} +0 -0
  161. /package/dist/types/{initPromise.d.ts → src/initPromise.d.ts} +0 -0
  162. /package/dist/types/{withLock.d.ts → src/withLock.d.ts} +0 -0
  163. /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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"}