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,60 @@
|
|
|
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.createIntervalFunction = createIntervalFunction;
|
|
11
|
+
const CronParser = require('cron-parser');
|
|
12
|
+
const { Duration } = require('@sapphire/duration');
|
|
13
|
+
/**
|
|
14
|
+
* Create a function that returns the next run Date based on an interval specification.
|
|
15
|
+
*
|
|
16
|
+
* Supports:
|
|
17
|
+
* - Number: returns Date that is `interval` milliseconds from now
|
|
18
|
+
* - Duration string: '1h', '24h', '7d' - returns Date that is duration from now
|
|
19
|
+
* - Cron expression: 'CRON 0 3 * * *' (must start with CRON) - returns next cron occurrence
|
|
20
|
+
*/
|
|
21
|
+
function createIntervalFunction(interval, options = {}) {
|
|
22
|
+
const { cronOptions = {} } = options;
|
|
23
|
+
if (typeof interval === 'number') {
|
|
24
|
+
if (!Number.isFinite(interval)) {
|
|
25
|
+
throw new Error(`Error: Interval number has to be finite.`);
|
|
26
|
+
}
|
|
27
|
+
return (referenceDate) => { var _a; return new Date(((_a = referenceDate === null || referenceDate === void 0 ? void 0 : referenceDate.getTime()) !== null && _a !== void 0 ? _a : Date.now()) + interval); };
|
|
28
|
+
}
|
|
29
|
+
if (typeof interval !== 'string') {
|
|
30
|
+
throw new Error('Error: Invalid interval.');
|
|
31
|
+
}
|
|
32
|
+
// Check for CRON prefix (case insensitive)
|
|
33
|
+
if (/^CRON /i.test(interval)) {
|
|
34
|
+
try {
|
|
35
|
+
const expression = interval.slice(5); // Remove "CRON " prefix
|
|
36
|
+
// Validate immediately
|
|
37
|
+
CronParser.CronExpressionParser.parse(expression, cronOptions);
|
|
38
|
+
// We use parse to handle the options correctly, specifically currentDate
|
|
39
|
+
return (referenceDate) => {
|
|
40
|
+
const opts = Object.assign(Object.assign({}, cronOptions), { currentDate: referenceDate !== null && referenceDate !== void 0 ? referenceDate : new Date() });
|
|
41
|
+
const parsed = CronParser.CronExpressionParser.parse(expression, opts);
|
|
42
|
+
return parsed.next().toDate();
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
throw new Error(`Error: Invalid interval. ${err.message}.`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Safety check: if it looks like a cron expression but missing prefix, throw
|
|
50
|
+
if (interval.includes('*') && interval.split(' ').length >= 5) {
|
|
51
|
+
throw new Error("Error: Invalid interval. Cron expressions must start with 'CRON '.");
|
|
52
|
+
}
|
|
53
|
+
// Parse as duration string
|
|
54
|
+
const duration = new Duration(interval).offset;
|
|
55
|
+
if (typeof duration !== 'number' || Number.isNaN(duration)) {
|
|
56
|
+
throw new Error('Error: Invalid interval.');
|
|
57
|
+
}
|
|
58
|
+
return (referenceDate) => { var _a; return new Date(((_a = referenceDate === null || referenceDate === void 0 ? void 0 : referenceDate.getTime()) !== null && _a !== void 0 ? _a : Date.now()) + duration); };
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=parseInterval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseInterval.js","sourceRoot":"","sources":["../../../src/parseInterval.ts"],"names":[],"mappings":";;AAaA,wDA+CC;AA5DD,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAE1C,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAGnD;;;;;;;GAOG;AACH,SAAgB,sBAAsB,CAClC,QAA4D,EAC5D,UAAmD,EAAE;IAErD,MAAM,EAAE,WAAW,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAErC,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,CAAC,aAAoB,EAAE,EAAE,WAAC,OAAA,IAAI,IAAI,CAAC,CAAC,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO,EAAE,mCAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAA,EAAA,CAAC;IACnG,CAAC;IAED,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAChD,CAAC;IAED,2CAA2C;IAC3C,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACD,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB;YAE9D,uBAAuB;YACvB,UAAU,CAAC,oBAAoB,CAAC,KAAK,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YAE/D,yEAAyE;YACzE,OAAO,CAAC,aAAoB,EAAE,EAAE;gBAC5B,MAAM,IAAI,mCAAQ,WAAW,KAAE,WAAW,EAAE,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,IAAI,IAAI,EAAE,GAAE,CAAC;gBAC1E,MAAM,MAAM,GAAG,UAAU,CAAC,oBAAoB,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBACvE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;YAClC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,4BAA6B,GAAa,CAAC,OAAO,GAAG,CAAC,CAAC;QAC3E,CAAC;IACL,CAAC;IAED,6EAA6E;IAC7E,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IAC1F,CAAC;IAED,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;IAC/C,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,CAAC,aAAoB,EAAE,EAAE,WAAC,OAAA,IAAI,IAAI,CAAC,CAAC,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO,EAAE,mCAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAA,EAAA,CAAC;AACnG,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
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.prefixFilterKeys = prefixFilterKeys;
|
|
11
|
+
/**
|
|
12
|
+
* Recursively prefixes all keys in a MongoDB filter object.
|
|
13
|
+
* This is used to apply a filter meant for a document to a field
|
|
14
|
+
* within a larger document, such as 'fullDocument' in a change stream event.
|
|
15
|
+
*
|
|
16
|
+
* @param filter The filter object to process.
|
|
17
|
+
* @param prefix The prefix to add to each key (e.g., 'fullDocument').
|
|
18
|
+
* @returns A new filter object with all keys prefixed.
|
|
19
|
+
*/
|
|
20
|
+
function prefixFilterKeys(filter, prefix) {
|
|
21
|
+
const newFilter = {};
|
|
22
|
+
for (const key in filter) {
|
|
23
|
+
if (Object.prototype.hasOwnProperty.call(filter, key)) {
|
|
24
|
+
const value = filter[key];
|
|
25
|
+
if (key === '$expr') {
|
|
26
|
+
// Handle $expr specially: we need to prefix field paths inside it
|
|
27
|
+
newFilter[key] = prefixExpr(value, prefix);
|
|
28
|
+
}
|
|
29
|
+
else if (key.startsWith('$')) {
|
|
30
|
+
// Handle logical operators like $or, $and, $nor
|
|
31
|
+
if (Array.isArray(value) && (key === '$or' || key === '$and' || key === '$nor')) {
|
|
32
|
+
newFilter[key] = value.map((item) => typeof item === 'object' && item !== null && !Array.isArray(item) ? prefixFilterKeys(item, prefix) : item); // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// For other operators ($in, $eq, etc.), keep them as they are.
|
|
36
|
+
newFilter[key] = value;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// For regular field names, add the prefix.
|
|
41
|
+
const newKey = `${prefix}.${key}`;
|
|
42
|
+
newFilter[newKey] = value;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return newFilter;
|
|
47
|
+
}
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
49
|
+
function prefixExpr(expr, prefix) {
|
|
50
|
+
if (Array.isArray(expr)) {
|
|
51
|
+
return expr.map((item) => prefixExpr(item, prefix));
|
|
52
|
+
}
|
|
53
|
+
else if (typeof expr === 'object' && expr !== null) {
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
55
|
+
const newExpr = {};
|
|
56
|
+
for (const key in expr) {
|
|
57
|
+
newExpr[key] = prefixExpr(expr[key], prefix);
|
|
58
|
+
}
|
|
59
|
+
return newExpr;
|
|
60
|
+
}
|
|
61
|
+
else if (typeof expr === 'string') {
|
|
62
|
+
// Prefix field paths (starting with $) but not system variables (starting with $$)
|
|
63
|
+
if (expr.startsWith('$') && !expr.startsWith('$$')) {
|
|
64
|
+
return `$${prefix}.${expr.substring(1)}`;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return expr;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=prefixFilterKeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefixFilterKeys.js","sourceRoot":"","sources":["../../../src/prefixFilterKeys.ts"],"names":[],"mappings":";;AAWA,4CA6BC;AAtCD;;;;;;;;GAQG;AACH,SAAgB,gBAAgB,CAAqB,MAAiB,EAAE,MAAc;IAClF,MAAM,SAAS,GAAc,EAAE,CAAC;IAEhC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAsB,CAAC,CAAC;YAE7C,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;gBAClB,kEAAkE;gBAClE,SAAS,CAAC,GAAsB,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAClE,CAAC;iBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,gDAAgD;gBAChD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,CAAC,EAAE,CAAC;oBAC9E,SAAS,CAAC,GAAsB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACnD,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAClH,CAAC,CAAC,yDAAyD;gBACvE,CAAC;qBAAM,CAAC;oBACJ,+DAA+D;oBAC/D,SAAS,CAAC,GAAsB,CAAC,GAAG,KAAK,CAAC;gBAC9C,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,2CAA2C;gBAC3C,MAAM,MAAM,GAAG,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC;gBAClC,SAAS,CAAC,MAAyB,CAAC,GAAG,KAAK,CAAC;YACjD,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,8DAA8D;AAC9D,SAAS,UAAU,CAAC,IAAS,EAAE,MAAc;IACzC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,CAAC;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QACnD,8DAA8D;QAC9D,MAAM,OAAO,GAAQ,EAAE,CAAC;QACxB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAClC,mFAAmF;QACnF,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,OAAO,IAAI,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
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.processInBatches = processInBatches;
|
|
11
|
+
async function processInBatches(collection, queryOrPipeline, transform, executeBatch, options = {}) {
|
|
12
|
+
const { batchSize = 1000, shouldStop } = options;
|
|
13
|
+
const cursor = Array.isArray(queryOrPipeline) ? collection.aggregate(queryOrPipeline) : collection.find(queryOrPipeline);
|
|
14
|
+
let batch = [];
|
|
15
|
+
let processedDocuments = 0;
|
|
16
|
+
let operationsPerformed = 0;
|
|
17
|
+
while (await cursor.hasNext()) {
|
|
18
|
+
if (shouldStop && shouldStop()) {
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
const doc = (await cursor.next());
|
|
22
|
+
if (!doc)
|
|
23
|
+
continue;
|
|
24
|
+
processedDocuments++;
|
|
25
|
+
const result = await transform(doc);
|
|
26
|
+
if (result !== null && result !== undefined) {
|
|
27
|
+
if (Array.isArray(result)) {
|
|
28
|
+
batch.push(...result);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
batch.push(result);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (batch.length >= batchSize) {
|
|
35
|
+
await executeBatch(batch);
|
|
36
|
+
operationsPerformed += batch.length;
|
|
37
|
+
batch = [];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (batch.length > 0) {
|
|
41
|
+
await executeBatch(batch);
|
|
42
|
+
operationsPerformed += batch.length;
|
|
43
|
+
}
|
|
44
|
+
return { processedDocuments, operationsPerformed };
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=processInBatches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processInBatches.js","sourceRoot":"","sources":["../../../src/processInBatches.ts"],"names":[],"mappings":";;AAYA,4CA+CC;AA/CM,KAAK,UAAU,gBAAgB,CAClC,UAA4B,EAC5B,eAA0C,EAC1C,SAAkG,EAClG,YAA2C,EAC3C,UAAmC,EAAE;IAErC,MAAM,EAAE,SAAS,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAEjD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAO,eAAe,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAO,eAAe,CAAC,CAAC;IAErI,IAAI,KAAK,GAAU,EAAE,CAAC;IACtB,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAE5B,OAAO,MAAM,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5B,IAAI,UAAU,IAAI,UAAU,EAAE,EAAE,CAAC;YAC7B,MAAM;QACV,CAAC;QAED,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAS,CAAC;QAC1C,IAAI,CAAC,GAAG;YAAE,SAAS;QAEnB,kBAAkB,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;QAEpC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACJ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;QACL,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,mBAAmB,IAAI,KAAK,CAAC,MAAM,CAAC;YACpC,KAAK,GAAG,EAAE,CAAC;QACf,CAAC;IACL,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1B,mBAAmB,IAAI,KAAK,CAAC,MAAM,CAAC;IACxC,CAAC;IAED,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
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.LeaderElector = void 0;
|
|
11
|
+
const mongodb_1 = require("mongodb");
|
|
12
|
+
const ReactiveTaskTypes_1 = require("./ReactiveTaskTypes");
|
|
13
|
+
const _debug = require("debug");
|
|
14
|
+
const OnInfo_1 = require("../OnInfo");
|
|
15
|
+
const OnError_1 = require("../OnError");
|
|
16
|
+
const debug = _debug('mongodash:reactiveTasks:leader');
|
|
17
|
+
/**
|
|
18
|
+
* Manages leader election among multiple scheduler instances.
|
|
19
|
+
*
|
|
20
|
+
* Responsibilities:
|
|
21
|
+
* - Attempts to acquire a distributed lock in the globals collection.
|
|
22
|
+
* - Maintains the lock by periodically renewing it (heartbeat).
|
|
23
|
+
* - Notifies callbacks when the instance becomes leader or loses leadership.
|
|
24
|
+
* - Ensures only one instance (the leader) runs the `ReactiveTaskPlanner` at a time.
|
|
25
|
+
*/
|
|
26
|
+
class LeaderElector {
|
|
27
|
+
constructor(globalsCollection, instanceId, options, callbacks, onInfo = OnInfo_1.defaultOnInfo, onError = OnError_1.defaultOnError) {
|
|
28
|
+
this.globalsCollection = globalsCollection;
|
|
29
|
+
this.instanceId = instanceId;
|
|
30
|
+
this.options = options;
|
|
31
|
+
this.callbacks = callbacks;
|
|
32
|
+
this.onInfo = onInfo;
|
|
33
|
+
this.onError = onError;
|
|
34
|
+
this.isRunning = false;
|
|
35
|
+
this._isLeader = false;
|
|
36
|
+
this.leaderTimer = null;
|
|
37
|
+
this.metaDocId = ReactiveTaskTypes_1.REACTIVE_TASK_META_DOC_ID;
|
|
38
|
+
this.metaDocId = options.metaDocId || this.metaDocId;
|
|
39
|
+
}
|
|
40
|
+
get isLeader() {
|
|
41
|
+
return this._isLeader;
|
|
42
|
+
}
|
|
43
|
+
async start() {
|
|
44
|
+
if (this.isRunning)
|
|
45
|
+
return;
|
|
46
|
+
this.isRunning = true;
|
|
47
|
+
await this.runLeaderElectionLoop();
|
|
48
|
+
}
|
|
49
|
+
async stop() {
|
|
50
|
+
if (!this.isRunning)
|
|
51
|
+
return;
|
|
52
|
+
this.isRunning = false;
|
|
53
|
+
if (this.leaderTimer) {
|
|
54
|
+
clearTimeout(this.leaderTimer);
|
|
55
|
+
this.leaderTimer = null;
|
|
56
|
+
}
|
|
57
|
+
if (this._isLeader) {
|
|
58
|
+
await this.releaseLock();
|
|
59
|
+
this._isLeader = false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
forceLoseLeader() {
|
|
63
|
+
this._isLeader = false;
|
|
64
|
+
}
|
|
65
|
+
async runLeaderElectionLoop() {
|
|
66
|
+
const loop = async () => {
|
|
67
|
+
try {
|
|
68
|
+
await this.tryAcquireLock();
|
|
69
|
+
if (this._isLeader) {
|
|
70
|
+
await this.callbacks.onHeartbeat();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
this.onError(error);
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
if (this.isRunning) {
|
|
78
|
+
this.leaderTimer = setTimeout(loop, this.options.lockHeartbeatMs);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
await loop();
|
|
83
|
+
}
|
|
84
|
+
async tryAcquireLock() {
|
|
85
|
+
var _a, _b;
|
|
86
|
+
const now = new Date();
|
|
87
|
+
const expiresAt = new Date(now.getTime() + this.options.lockTtlMs);
|
|
88
|
+
try {
|
|
89
|
+
debug(`[Scheduler ${this.instanceId}] Trying to acquire lock on ${this.metaDocId} in ${this.globalsCollection.collectionName}`);
|
|
90
|
+
const updatePipeline = [
|
|
91
|
+
{
|
|
92
|
+
$set: {
|
|
93
|
+
lock: {
|
|
94
|
+
$cond: {
|
|
95
|
+
if: {
|
|
96
|
+
$or: [
|
|
97
|
+
{ $lt: ['$lock.expiresAt', now] },
|
|
98
|
+
{ $eq: ['$lock.expiresAt', null] },
|
|
99
|
+
{ $eq: ['$lock', null] },
|
|
100
|
+
{ $eq: ['$lock.instanceId', this.instanceId] },
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
then: { expiresAt, instanceId: this.instanceId },
|
|
104
|
+
else: '$lock',
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
const result = (await this.globalsCollection.findOneAndUpdate({ _id: this.metaDocId }, updatePipeline, {
|
|
111
|
+
upsert: true,
|
|
112
|
+
returnDocument: 'after',
|
|
113
|
+
includeResultMetadata: true,
|
|
114
|
+
}));
|
|
115
|
+
if (((_b = (_a = result.value) === null || _a === void 0 ? void 0 : _a.lock) === null || _b === void 0 ? void 0 : _b.instanceId) === this.instanceId) {
|
|
116
|
+
if (!this._isLeader) {
|
|
117
|
+
this._isLeader = true;
|
|
118
|
+
debug(`[Scheduler ${this.instanceId}] Leader lock acquired.`);
|
|
119
|
+
await this.callbacks.onBecomeLeader();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
if (this._isLeader) {
|
|
124
|
+
this._isLeader = false;
|
|
125
|
+
this.onInfo({ message: `Leader lock lost.`, code: ReactiveTaskTypes_1.CODE_REACTIVE_TASK_LEADER_LOCK_LOST });
|
|
126
|
+
await this.callbacks.onLoseLeader();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
const closedErrorAfterStop = !this.isRunning && error instanceof mongodb_1.MongoClientClosedError;
|
|
132
|
+
if (!closedErrorAfterStop) {
|
|
133
|
+
this.onError(error);
|
|
134
|
+
}
|
|
135
|
+
if (this._isLeader) {
|
|
136
|
+
this._isLeader = false;
|
|
137
|
+
await this.callbacks.onLoseLeader();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async releaseLock() {
|
|
142
|
+
try {
|
|
143
|
+
await this.globalsCollection.updateOne({
|
|
144
|
+
_id: this.metaDocId,
|
|
145
|
+
'lock.instanceId': this.instanceId,
|
|
146
|
+
}, { $unset: { lock: '' } });
|
|
147
|
+
debug(`[Scheduler ${this.instanceId}] Leader lock released.`);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
this.onError(error);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
exports.LeaderElector = LeaderElector;
|
|
155
|
+
//# sourceMappingURL=LeaderElector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LeaderElector.js","sourceRoot":"","sources":["../../../../src/reactiveTasks/LeaderElector.ts"],"names":[],"mappings":"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"}
|