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,45 @@
|
|
|
1
|
+
# withLock
|
|
2
|
+
|
|
3
|
+
Utility function to control concurrency.
|
|
4
|
+
|
|
5
|
+
## withLock(key, callback [, options]) => Promise
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
withLock(key, callback [, options]) => Promise
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
The `withLock` function ensures only one process steps into the [critical section](https://en.wikipedia.org/wiki/Critical_section) (callback).
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { withLock } from 'mongodash';
|
|
15
|
+
|
|
16
|
+
function updateUser (userId, data) {
|
|
17
|
+
return withLock(`user-update-${userId}`, async () => {
|
|
18
|
+
const user = await getUserFromDatabase(userId);
|
|
19
|
+
user.setData(data);
|
|
20
|
+
await saveUserToDatabase(user);
|
|
21
|
+
return user;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// all calls are triggered in parallel,
|
|
26
|
+
// the withLock ensures they will be processed one by one
|
|
27
|
+
updateUser(1, { name: 'Joe' });
|
|
28
|
+
updateUser(1, { surname: 'Doe' });
|
|
29
|
+
updateUser(1, { nick: 'J' });
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The `withLock` function uses [busy wait](https://en.wikipedia.org/wiki/Busy_waiting) with a combination of sleep if the lock is occupied. The sleep time is determined by the [exponential backoff](https://en.wikipedia.org/wiki/Exponential_backoff) strategy.
|
|
33
|
+
|
|
34
|
+
The key is always converted to a string internally, so `100` and `"100"` are considered as the same key.
|
|
35
|
+
|
|
36
|
+
The lock is acquired for an amount of time (see expireIn option). If the callback lasts too long, the lock is prolonged automatically.
|
|
37
|
+
|
|
38
|
+
## Usable even in scalable (multi-instance) applications
|
|
39
|
+
|
|
40
|
+
Usable even in scalable (multi-instance) applications thanks to lock registration in MongoDB.
|
|
41
|
+
Mongodash will ensure only one execution process step into the callback.
|
|
42
|
+
|
|
43
|
+
## Options
|
|
44
|
+
|
|
45
|
+
(Documentation for options was not fully retrievable. Common options likely include `expireIn`.)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# withTransaction
|
|
2
|
+
|
|
3
|
+
The more perfect variant of the native driver's `withTransaction` function.
|
|
4
|
+
|
|
5
|
+
## withTransaction(callback) => Promise
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
withTransaction(callback) => Promise
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
import { withTransaction, getCollection } from 'mongodash';
|
|
13
|
+
import { ClientSession } from 'mongodb';
|
|
14
|
+
|
|
15
|
+
const createdDocuments = await withTransaction(async (session: ClientSession) => {
|
|
16
|
+
const collection = getCollection('myCollection');
|
|
17
|
+
const myDocument1 = { value: 1 };
|
|
18
|
+
const myDocument2 = { value: 2 };
|
|
19
|
+
|
|
20
|
+
await collection.insertOne(myDocument1, { session });
|
|
21
|
+
await collection.insertOne(myDocument2, { session });
|
|
22
|
+
|
|
23
|
+
return [myDocument1, myDocument2];
|
|
24
|
+
});
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Benefits over the native driver's function
|
|
28
|
+
|
|
29
|
+
Benefits over the native driver's [withTransaction](https://mongodb.github.io/node-mongodb-native/4.0/classes/clientsession.html#withtransaction) function:
|
|
30
|
+
|
|
31
|
+
- automatically starts a new `clientSession`
|
|
32
|
+
- automatically ends the `clientSession` (even on failure)
|
|
33
|
+
- propagates the value returned from the callback
|
|
34
|
+
|
|
35
|
+
It does all the necessary code described in the [official docs](https://docs.mongodb.com/realm/mongodb/transactions/) automatically.
|
|
36
|
+
|
|
37
|
+
## Post Commit Hooks
|
|
38
|
+
|
|
39
|
+
You can register hooks that will be executed **only after the transaction successfully commits**.
|
|
40
|
+
|
|
41
|
+
### registerPostCommitHook(session, callback) => void
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
registerPostCommitHook(session: ClientSession, callback: () => void | Promise<void>) => void
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
This is extremely useful for side effects that should happen effectively "outside" the transaction but only if the transaction succeeds, such as:
|
|
48
|
+
- Sending emails
|
|
49
|
+
- invalidating caches
|
|
50
|
+
- Triggering webhooks
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
import { withTransaction, registerPostCommitHook } from 'mongodash';
|
|
54
|
+
|
|
55
|
+
await withTransaction(async (session) => {
|
|
56
|
+
// 1. Modify DB inside transaction
|
|
57
|
+
await db.collection('orders').insertOne({ status: 'created' }, { session });
|
|
58
|
+
|
|
59
|
+
// 2. Register side-effect
|
|
60
|
+
registerPostCommitHook(session, async () => {
|
|
61
|
+
// This runs ONLY if transaction commits successfully
|
|
62
|
+
await emailService.sendOrderConfirmation();
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
```
|