@lossless.org/client 1.22.1 → 1.23.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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/nosqldb/classes.bootstraprecord.js +4 -4
- package/dist_ts/nosqldb/classes.connection.d.ts +3 -0
- package/dist_ts/nosqldb/classes.connection.js +3 -2
- package/dist_ts/nosqldb/classes.db.d.ts +31 -0
- package/dist_ts/nosqldb/classes.db.js +45 -2
- package/dist_ts/nosqldb/classes.doc.js +5 -5
- package/dist_ts/nosqldb/classes.exactpersistence.d.ts +3 -2
- package/dist_ts/nosqldb/classes.exactpersistence.js +8 -7
- package/dist_ts/nosqldb/classes.readtracker.d.ts +6 -4
- package/dist_ts/nosqldb/classes.readtracker.js +42 -10
- package/dist_ts/nosqldb/classes.session.d.ts +7 -6
- package/dist_ts/nosqldb/classes.session.js +91 -23
- package/dist_ts/nosqldb/classes.writelog.d.ts +129 -0
- package/dist_ts/nosqldb/classes.writelog.js +497 -0
- package/dist_ts/nosqldb/classes.writeobserver.d.ts +13 -0
- package/dist_ts/nosqldb/classes.writeobserver.js +47 -25
- package/dist_ts/nosqldb/classes.writerevisions.d.ts +18 -7
- package/dist_ts/nosqldb/classes.writerevisions.js +179 -30
- package/dist_ts/nosqldb/engineidentity.d.ts +6 -0
- package/dist_ts/nosqldb/engineidentity.js +14 -1
- package/package.json +2 -2
- package/readme.md +11 -10
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/nosqldb/classes.bootstraprecord.ts +3 -3
- package/ts/nosqldb/classes.connection.ts +5 -1
- package/ts/nosqldb/classes.db.ts +68 -0
- package/ts/nosqldb/classes.doc.ts +4 -4
- package/ts/nosqldb/classes.exactpersistence.ts +8 -7
- package/ts/nosqldb/classes.readtracker.ts +41 -7
- package/ts/nosqldb/classes.session.ts +107 -26
- package/ts/nosqldb/classes.writelog.ts +701 -0
- package/ts/nosqldb/classes.writeobserver.ts +62 -28
- package/ts/nosqldb/classes.writerevisions.ts +224 -32
- package/ts/nosqldb/engineidentity.ts +16 -0
|
@@ -3,23 +3,31 @@ import { SmartdataPersistenceError } from './classes.persistence.js';
|
|
|
3
3
|
import { logger } from './logging.js';
|
|
4
4
|
const maximumObservedFields = 64;
|
|
5
5
|
const observersByDb = new WeakMap();
|
|
6
|
+
/**
|
|
7
|
+
* @internal Validates the top-level field names a report carries: 1 to 64
|
|
8
|
+
* distinct names, no `.` and no leading `$`. `subjectArg` names what requires
|
|
9
|
+
* them in the refusal.
|
|
10
|
+
*/
|
|
11
|
+
export const normalizeObservedFields = (fieldsArg, subjectArg) => {
|
|
12
|
+
if (!Array.isArray(fieldsArg)
|
|
13
|
+
|| fieldsArg.length === 0
|
|
14
|
+
|| fieldsArg.length > maximumObservedFields
|
|
15
|
+
|| fieldsArg.some((fieldArg) => typeof fieldArg !== 'string'
|
|
16
|
+
|| fieldArg.length === 0
|
|
17
|
+
|| fieldArg.includes('.')
|
|
18
|
+
|| fieldArg.startsWith('$'))
|
|
19
|
+
|| new Set(fieldsArg).size !== fieldsArg.length) {
|
|
20
|
+
throw new SmartdataPersistenceError('invalid_argument', `${subjectArg} requires 1 to ${maximumObservedFields} distinct top-level field names.`);
|
|
21
|
+
}
|
|
22
|
+
return Object.freeze([...fieldsArg]);
|
|
23
|
+
};
|
|
6
24
|
const normalizeObserverOptions = (optionsArg) => {
|
|
7
25
|
const { fields, listener } = assertDataOptions(optionsArg, ['fields', 'listener']);
|
|
8
26
|
if (typeof listener !== 'function') {
|
|
9
27
|
throw new SmartdataPersistenceError('invalid_argument', 'A SmartData write observer requires a listener function.');
|
|
10
28
|
}
|
|
11
|
-
if (!Array.isArray(fields)
|
|
12
|
-
|| fields.length === 0
|
|
13
|
-
|| fields.length > maximumObservedFields
|
|
14
|
-
|| fields.some((fieldArg) => typeof fieldArg !== 'string'
|
|
15
|
-
|| fieldArg.length === 0
|
|
16
|
-
|| fieldArg.includes('.')
|
|
17
|
-
|| fieldArg.startsWith('$'))
|
|
18
|
-
|| new Set(fields).size !== fields.length) {
|
|
19
|
-
throw new SmartdataPersistenceError('invalid_argument', `A SmartData write observer requires 1 to ${maximumObservedFields} distinct top-level field names.`);
|
|
20
|
-
}
|
|
21
29
|
return {
|
|
22
|
-
fields:
|
|
30
|
+
fields: normalizeObservedFields(fields, 'A SmartData write observer'),
|
|
23
31
|
listener: listener,
|
|
24
32
|
};
|
|
25
33
|
};
|
|
@@ -98,6 +106,31 @@ const collectSelectorAnchors = (selectorArg, fieldsArg, identityDocumentIdFieldA
|
|
|
98
106
|
}
|
|
99
107
|
}
|
|
100
108
|
};
|
|
109
|
+
/**
|
|
110
|
+
* @internal The report of one acknowledged write with the values of `fieldsArg`,
|
|
111
|
+
* copied now and frozen.
|
|
112
|
+
*/
|
|
113
|
+
export const reportOfSmartdataWrite = (writeArg, fieldsArg) => {
|
|
114
|
+
const anchors = {};
|
|
115
|
+
collectSelectorAnchors(writeArg.selector, new Set(fieldsArg), writeArg.identityDocumentIdField, anchors);
|
|
116
|
+
return Object.freeze({
|
|
117
|
+
collection: writeArg.collection,
|
|
118
|
+
kind: writeArg.kind,
|
|
119
|
+
documents: writeArg.documents === null
|
|
120
|
+
? null
|
|
121
|
+
: Object.freeze(writeArg.documents.map((documentArg) => Object.freeze(pickDocumentFields(documentArg, fieldsArg)))),
|
|
122
|
+
anchors: Object.freeze(anchors),
|
|
123
|
+
});
|
|
124
|
+
};
|
|
125
|
+
/** @internal The same report with only the values of `fieldsArg`, which the report's fields include. */
|
|
126
|
+
export const narrowSmartdataWriteReport = (reportArg, fieldsArg) => Object.freeze({
|
|
127
|
+
collection: reportArg.collection,
|
|
128
|
+
kind: reportArg.kind,
|
|
129
|
+
documents: reportArg.documents === null
|
|
130
|
+
? null
|
|
131
|
+
: Object.freeze(reportArg.documents.map((documentArg) => Object.freeze(pickDocumentFields(documentArg, fieldsArg)))),
|
|
132
|
+
anchors: Object.freeze(pickDocumentFields(reportArg.anchors, fieldsArg)),
|
|
133
|
+
});
|
|
101
134
|
const describeError = (errorArg) => errorArg instanceof Error ? errorArg.message : String(errorArg);
|
|
102
135
|
/**
|
|
103
136
|
* @internal Captures one acknowledged write for the observers registered now,
|
|
@@ -111,24 +144,13 @@ export const captureSmartdataWrite = (dbArg, writeArg) => {
|
|
|
111
144
|
if (!registered || registered.size === 0)
|
|
112
145
|
return undefined;
|
|
113
146
|
const observers = [...registered];
|
|
114
|
-
const
|
|
115
|
-
const documents = writeArg.documents?.map((documentArg) => pickDocumentFields(documentArg, fields)) ?? null;
|
|
116
|
-
const anchors = {};
|
|
117
|
-
collectSelectorAnchors(writeArg.selector, new Set(fields), writeArg.identityDocumentIdField, anchors);
|
|
147
|
+
const report = reportOfSmartdataWrite(writeArg, [...new Set(observers.flatMap((observerArg) => observerArg.fields))]);
|
|
118
148
|
return () => {
|
|
119
149
|
for (const observer of observers) {
|
|
120
150
|
if (!observersByDb.get(dbArg)?.has(observer))
|
|
121
151
|
continue;
|
|
122
|
-
const report = Object.freeze({
|
|
123
|
-
collection: writeArg.collection,
|
|
124
|
-
kind: writeArg.kind,
|
|
125
|
-
documents: documents === null
|
|
126
|
-
? null
|
|
127
|
-
: Object.freeze(documents.map((documentArg) => Object.freeze(pickDocumentFields(documentArg, observer.fields)))),
|
|
128
|
-
anchors: Object.freeze(pickDocumentFields(anchors, observer.fields)),
|
|
129
|
-
});
|
|
130
152
|
try {
|
|
131
|
-
observer.listener(report);
|
|
153
|
+
observer.listener(narrowSmartdataWriteReport(report, observer.fields));
|
|
132
154
|
}
|
|
133
155
|
catch (errorArg) {
|
|
134
156
|
logger.log('error', `A SmartData write observer threw on a write to "${writeArg.collection}": ${describeError(errorArg)}`);
|
|
@@ -136,4 +158,4 @@ export const captureSmartdataWrite = (dbArg, writeArg) => {
|
|
|
136
158
|
}
|
|
137
159
|
};
|
|
138
160
|
};
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53cml0ZW9ic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbm9zcWxkYi9jbGFzc2VzLndyaXRlb2JzZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQXlFdEMsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFDakMsTUFBTSxhQUFhLEdBQUcsSUFBSSxPQUFPLEVBQW9DLENBQUM7QUFFdEU7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsU0FBa0IsRUFBRSxVQUFrQixFQUFxQixFQUFFO0lBQ25HLElBQ0UsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztXQUN0QixTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7V0FDdEIsU0FBUyxDQUFDLE1BQU0sR0FBRyxxQkFBcUI7V0FDeEMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQzdCLE9BQU8sUUFBUSxLQUFLLFFBQVE7ZUFDekIsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO2VBQ3JCLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2VBQ3RCLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7V0FDM0IsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxNQUFNLEVBQy9DLENBQUM7UUFDRCxNQUFNLElBQUkseUJBQXlCLENBQUMsa0JBQWtCLEVBQ3BELEdBQUcsVUFBVSxrQkFBa0IscUJBQXFCLGtDQUFrQyxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFD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
|
|
@@ -6,6 +6,11 @@ import type { SmartdataOperationDeadline } from './classes.operationdeadline.js'
|
|
|
6
6
|
* no writes at all. Every model write bumps a counter per collection and
|
|
7
7
|
* partition in the same transaction, and a read set compares the counters it
|
|
8
8
|
* read before its reads with the current ones.
|
|
9
|
+
*
|
|
10
|
+
* A bump inserts an entry of its own instead of incrementing a shared
|
|
11
|
+
* document, so concurrent transactions of one partition never conflict on its
|
|
12
|
+
* counter. A counter's value is its base document plus its entries; a
|
|
13
|
+
* background compaction folds entries into the base, which keeps the sum.
|
|
9
14
|
*/
|
|
10
15
|
export interface ISmartdataWriteRevisionsOptions {
|
|
11
16
|
/**
|
|
@@ -35,6 +40,8 @@ export declare const sharedRevisionId: (collectionArg: string) => string;
|
|
|
35
40
|
* its partition's for a string the counters can name, the shared one otherwise.
|
|
36
41
|
*/
|
|
37
42
|
export declare const revisionIdOfValue: (collectionArg: string, valueArg: unknown) => string;
|
|
43
|
+
export declare const writeRevisionBumpsOfKey: (keyArg: string, idsArg: ReadonlySet<string>) => number;
|
|
44
|
+
export declare const beginSmartdataWriteRevisionCommit: (dbArg: SmartdataDb, idsArg: ReadonlySet<string>) => (() => void);
|
|
38
45
|
/**
|
|
39
46
|
* @internal The snapshot keys one read depends on. A read the field pins
|
|
40
47
|
* depends on its partitions and the shared counter, which holds every
|
|
@@ -42,11 +49,6 @@ export declare const revisionIdOfValue: (collectionArg: string, valueArg: unknow
|
|
|
42
49
|
* whole collection.
|
|
43
50
|
*/
|
|
44
51
|
export declare const writeRevisionKeysOfRead: (dbArg: SmartdataDb, collectionArg: string, kindArg: 'documents' | 'count' | 'collection', filterArg: unknown) => string[];
|
|
45
|
-
/**
|
|
46
|
-
* @internal The current value of each snapshot key, or `undefined` for a key
|
|
47
|
-
* whose value cannot be known: a missing epoch means the counters restarted.
|
|
48
|
-
* Bounded by its own deadline.
|
|
49
|
-
*/
|
|
50
52
|
export declare const readWriteRevisionSnapshot: (dbArg: SmartdataDb, keysArg: readonly string[]) => Promise<Map<string, string | undefined>>;
|
|
51
53
|
/**
|
|
52
54
|
* @internal Creates the epoch of a database that has none, before `init()`
|
|
@@ -68,10 +70,19 @@ export declare const bumpSmartdataWriteRevisionEpoch: (dbArg: SmartdataDb, optio
|
|
|
68
70
|
}) => Promise<void>;
|
|
69
71
|
/**
|
|
70
72
|
* @internal Bumps the counters a transaction's writes touched, inside that
|
|
71
|
-
* transaction, right before its commit
|
|
72
|
-
*
|
|
73
|
+
* transaction, right before its commit: one new entry per counter, which no
|
|
74
|
+
* concurrent transaction writes.
|
|
73
75
|
*/
|
|
74
76
|
export declare const flushSmartdataWriteRevisions: (mongoDbArg: plugins.mongodb.Db, rawSessionArg: plugins.mongodb.ClientSession, idsArg: ReadonlySet<string>, signalArg: AbortSignal | undefined) => Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* @internal Counts the entries a committed transaction of this process added,
|
|
79
|
+
* and starts a compaction of each counter that reached `compactionEntries`.
|
|
80
|
+
* Compactions run in the background; `stopSmartdataWriteRevisionCompactions`
|
|
81
|
+
* ends them.
|
|
82
|
+
*/
|
|
83
|
+
export declare const noteSmartdataWriteRevisionEntries: (dbArg: SmartdataDb, idsArg: ReadonlySet<string>) => void;
|
|
84
|
+
/** @internal Aborts the database's compactions and waits until they settled; `close()` calls it. */
|
|
85
|
+
export declare const stopSmartdataWriteRevisionCompactions: (dbArg: SmartdataDb) => Promise<void>;
|
|
75
86
|
/**
|
|
76
87
|
* @internal The counters of the documents a write by selector is about to
|
|
77
88
|
* change, read in its transaction before it runs. Snapshot isolation makes
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import { assertDataOptions } from './classes.operationbudget.js';
|
|
3
3
|
import { SmartdataPersistenceError, isMongoDuplicateKeyError } from './classes.persistence.js';
|
|
4
|
+
import { logger } from './logging.js';
|
|
4
5
|
/** The collection that holds the counters. */
|
|
5
6
|
export const writeRevisionsCollectionName = '__smartdata_write_revisions';
|
|
6
7
|
/** The counter every write revision belongs to; a new generation restarts all counters. */
|
|
7
8
|
const epochId = '$epoch';
|
|
9
|
+
/**
|
|
10
|
+
* Joins a counter's id and the suffix of one of its entries. No counter id
|
|
11
|
+
* contains it, so a counter's base and entries are exactly the ids from the
|
|
12
|
+
* counter's own up to, not including, the id followed by `entryRangeEnd`.
|
|
13
|
+
*/
|
|
14
|
+
const entrySeparator = '\u0000';
|
|
15
|
+
const entryRangeEnd = '\u0001';
|
|
16
|
+
/** Entries one process adds to a counter before it folds the counter's entries into its base. */
|
|
17
|
+
const compactionEntries = 64;
|
|
18
|
+
const maximumCompactedEntries = 1024;
|
|
19
|
+
const compactionTimeoutMs = 5_000;
|
|
8
20
|
const maximumPartitionLength = 512;
|
|
9
21
|
const maximumPinnedPartitions = 64;
|
|
10
22
|
/** Beyond this many documents, a write by selector bumps the shared counter instead. */
|
|
@@ -31,7 +43,10 @@ export const writeRevisionsPartitionField = (dbArg) => partitionFields.get(dbArg
|
|
|
31
43
|
/** @internal Write revisions are configured and the engine runs transactions. */
|
|
32
44
|
export const isSmartdataWriteRevisionsActive = (dbArg) => partitionFields.has(dbArg) && dbArg.capabilities?.transactions === 'available';
|
|
33
45
|
/** A string the counters can name, or `undefined`. */
|
|
34
|
-
const partitionOf = (valueArg) => typeof valueArg === 'string'
|
|
46
|
+
const partitionOf = (valueArg) => typeof valueArg === 'string'
|
|
47
|
+
&& valueArg.length <= maximumPartitionLength
|
|
48
|
+
&& valueArg.isWellFormed()
|
|
49
|
+
&& !valueArg.includes(entrySeparator)
|
|
35
50
|
? valueArg
|
|
36
51
|
: undefined;
|
|
37
52
|
/** @internal The counter of one partition of a collection. */
|
|
@@ -102,6 +117,38 @@ const pinnedPartitions = (filterArg, fieldArg) => {
|
|
|
102
117
|
const epochKey = 'e';
|
|
103
118
|
const counterKey = (idArg) => `c${idArg}`;
|
|
104
119
|
const rangeKey = (collectionArg) => `r${collectionArg}`;
|
|
120
|
+
const localRevisionCommits = new WeakMap();
|
|
121
|
+
const revisionCommitsOfDb = (dbArg) => {
|
|
122
|
+
let commits = localRevisionCommits.get(dbArg);
|
|
123
|
+
if (!commits) {
|
|
124
|
+
commits = { pending: new Set(), snapshots: new Set() };
|
|
125
|
+
localRevisionCommits.set(dbArg, commits);
|
|
126
|
+
}
|
|
127
|
+
return commits;
|
|
128
|
+
};
|
|
129
|
+
export const writeRevisionBumpsOfKey = (keyArg, idsArg) => {
|
|
130
|
+
if (keyArg.startsWith('c'))
|
|
131
|
+
return idsArg.has(keyArg.slice(1)) ? 1 : 0;
|
|
132
|
+
if (!keyArg.startsWith('r'))
|
|
133
|
+
return 0;
|
|
134
|
+
const collection = keyArg.slice(1);
|
|
135
|
+
let bumps = 0;
|
|
136
|
+
for (const id of idsArg) {
|
|
137
|
+
if (id >= `${collection}$` && id < `${collection}%`)
|
|
138
|
+
bumps++;
|
|
139
|
+
}
|
|
140
|
+
return bumps;
|
|
141
|
+
};
|
|
142
|
+
export const beginSmartdataWriteRevisionCommit = (dbArg, idsArg) => {
|
|
143
|
+
const commits = revisionCommitsOfDb(dbArg);
|
|
144
|
+
const ids = new Set(idsArg);
|
|
145
|
+
commits.pending.add(ids);
|
|
146
|
+
for (const snapshot of commits.snapshots) {
|
|
147
|
+
if (snapshot.keys.some((keyArg) => writeRevisionBumpsOfKey(keyArg, ids) > 0))
|
|
148
|
+
snapshot.lost = true;
|
|
149
|
+
}
|
|
150
|
+
return () => { commits.pending.delete(ids); };
|
|
151
|
+
};
|
|
105
152
|
/**
|
|
106
153
|
* @internal The snapshot keys one read depends on. A read the field pins
|
|
107
154
|
* depends on its partitions and the shared counter, which holds every
|
|
@@ -131,9 +178,10 @@ const connectedDb = (dbArg) => {
|
|
|
131
178
|
/**
|
|
132
179
|
* @internal The current value of each snapshot key, or `undefined` for a key
|
|
133
180
|
* whose value cannot be known: a missing epoch means the counters restarted.
|
|
134
|
-
*
|
|
181
|
+
* Every counter and collection sum is one read, so a compaction that moves
|
|
182
|
+
* entries into a base never shows half done. Bounded by its own deadline.
|
|
135
183
|
*/
|
|
136
|
-
|
|
184
|
+
const readStoredWriteRevisionSnapshot = async (dbArg, keysArg) => {
|
|
137
185
|
const collection = revisionsCollection(connectedDb(dbArg));
|
|
138
186
|
const signal = AbortSignal.timeout(snapshotTimeoutMs);
|
|
139
187
|
const expiresAt = performance.now() + snapshotTimeoutMs;
|
|
@@ -142,35 +190,58 @@ export const readWriteRevisionSnapshot = async (dbArg, keysArg) => {
|
|
|
142
190
|
timeoutMode: 'cursorLifetime',
|
|
143
191
|
signal,
|
|
144
192
|
});
|
|
145
|
-
|
|
146
|
-
const
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
193
|
+
// `$sum` skips a value that is not a number, so such values are counted apart.
|
|
194
|
+
const sumOf = async (fromArg, toArg) => {
|
|
195
|
+
const [sum] = await collection.aggregate([
|
|
196
|
+
{ $match: { _id: { $gte: fromArg, $lt: toArg } } },
|
|
197
|
+
{ $group: { _id: null, n: { $sum: '$n' }, invalid: { $sum: { $cond: [{ $isNumber: '$n' }, 0, 1] } } } },
|
|
198
|
+
], options()).toArray();
|
|
199
|
+
if (sum === undefined)
|
|
200
|
+
return '0';
|
|
201
|
+
return sum.invalid === 0 && typeof sum.n === 'number' && Number.isSafeInteger(sum.n)
|
|
202
|
+
? String(sum.n)
|
|
203
|
+
: undefined;
|
|
204
|
+
};
|
|
205
|
+
const sums = keysArg.flatMap((keyArg) => {
|
|
206
|
+
if (keyArg.startsWith('c')) {
|
|
207
|
+
const id = keyArg.slice(1);
|
|
208
|
+
return [[keyArg, sumOf(id, `${id}${entryRangeEnd}`)]];
|
|
209
|
+
}
|
|
210
|
+
if (keyArg.startsWith('r')) {
|
|
211
|
+
const collectionName = keyArg.slice(1);
|
|
212
|
+
return [[keyArg, sumOf(`${collectionName}$`, `${collectionName}%`)]];
|
|
213
|
+
}
|
|
214
|
+
return [];
|
|
215
|
+
});
|
|
216
|
+
const [epoch, ...values] = await Promise.all([
|
|
217
|
+
collection.findOne({ _id: epochId }, { projection: { n: 1, generation: 1 }, ...options() }),
|
|
218
|
+
...sums.map(([, sumArg]) => sumArg),
|
|
153
219
|
]);
|
|
154
|
-
const byId = new Map(counters.map((documentArg) => [documentArg._id, documentArg]));
|
|
155
220
|
const snapshot = new Map();
|
|
156
|
-
const epoch = byId.get(epochId);
|
|
157
221
|
snapshot.set(epochKey, typeof epoch?.generation === 'string' && Number.isSafeInteger(epoch.n)
|
|
158
222
|
? `${epoch.generation}:${epoch.n}`
|
|
159
223
|
: undefined);
|
|
160
|
-
for (const
|
|
161
|
-
|
|
162
|
-
snapshot.set(counterKey(id), counter === undefined
|
|
163
|
-
? '0'
|
|
164
|
-
: Number.isSafeInteger(counter.n) ? String(counter.n) : undefined);
|
|
165
|
-
}
|
|
166
|
-
for (const [index, collectionArg] of ranges.entries()) {
|
|
167
|
-
const sum = sums[index].length === 0 ? 0 : sums[index][0].n;
|
|
168
|
-
snapshot.set(rangeKey(collectionArg), typeof sum === 'number' && Number.isSafeInteger(sum)
|
|
169
|
-
? String(sum)
|
|
170
|
-
: undefined);
|
|
171
|
-
}
|
|
224
|
+
for (const [index, [key]] of sums.entries())
|
|
225
|
+
snapshot.set(key, values[index]);
|
|
172
226
|
return snapshot;
|
|
173
227
|
};
|
|
228
|
+
export const readWriteRevisionSnapshot = async (dbArg, keysArg) => {
|
|
229
|
+
const commits = revisionCommitsOfDb(dbArg);
|
|
230
|
+
const snapshot = {
|
|
231
|
+
keys: keysArg,
|
|
232
|
+
lost: [...commits.pending].some((idsArg) => keysArg.some((keyArg) => writeRevisionBumpsOfKey(keyArg, idsArg) > 0)),
|
|
233
|
+
};
|
|
234
|
+
commits.snapshots.add(snapshot);
|
|
235
|
+
try {
|
|
236
|
+
const stored = await readStoredWriteRevisionSnapshot(dbArg, keysArg);
|
|
237
|
+
return snapshot.lost
|
|
238
|
+
? new Map(keysArg.map((keyArg) => [keyArg, undefined]))
|
|
239
|
+
: stored;
|
|
240
|
+
}
|
|
241
|
+
finally {
|
|
242
|
+
commits.snapshots.delete(snapshot);
|
|
243
|
+
}
|
|
244
|
+
};
|
|
174
245
|
/**
|
|
175
246
|
* @internal Creates the epoch of a database that has none, before `init()`
|
|
176
247
|
* publishes the connection. Another process creating it at the same time is
|
|
@@ -205,20 +276,98 @@ export const bumpSmartdataWriteRevisionEpoch = async (dbArg, optionsArg) => {
|
|
|
205
276
|
};
|
|
206
277
|
/**
|
|
207
278
|
* @internal Bumps the counters a transaction's writes touched, inside that
|
|
208
|
-
* transaction, right before its commit
|
|
209
|
-
*
|
|
279
|
+
* transaction, right before its commit: one new entry per counter, which no
|
|
280
|
+
* concurrent transaction writes.
|
|
210
281
|
*/
|
|
211
282
|
export const flushSmartdataWriteRevisions = async (mongoDbArg, rawSessionArg, idsArg, signalArg) => {
|
|
212
283
|
if (idsArg.size === 0)
|
|
213
284
|
return;
|
|
214
|
-
await revisionsCollection(mongoDbArg).
|
|
215
|
-
|
|
285
|
+
await revisionsCollection(mongoDbArg).insertMany([...idsArg].map((idArg) => ({
|
|
286
|
+
_id: `${idArg}${entrySeparator}${plugins.nodeCrypto.randomUUID()}`,
|
|
287
|
+
n: 1,
|
|
216
288
|
})), {
|
|
217
289
|
ordered: true,
|
|
218
290
|
session: rawSessionArg,
|
|
219
291
|
...(signalArg === undefined ? {} : { signal: signalArg }),
|
|
220
292
|
});
|
|
221
293
|
};
|
|
294
|
+
const revisionCompactions = new WeakMap();
|
|
295
|
+
/**
|
|
296
|
+
* Folds up to `maximumCompactedEntries` entries of one counter into its base
|
|
297
|
+
* in one transaction, which keeps the counter's value. A concurrent compaction
|
|
298
|
+
* of the same counter conflicts on the base and on the entries, and the driver
|
|
299
|
+
* retries it within the deadline; one that still fails leaves the entries for
|
|
300
|
+
* the next.
|
|
301
|
+
*/
|
|
302
|
+
const compactWriteRevisionEntries = async (dbArg, idArg, signalArg) => {
|
|
303
|
+
const collection = revisionsCollection(connectedDb(dbArg));
|
|
304
|
+
const abortable = { signal: signalArg };
|
|
305
|
+
const session = dbArg.mongoDbClient.startSession();
|
|
306
|
+
try {
|
|
307
|
+
await session.withTransaction(async () => {
|
|
308
|
+
const entries = await collection.find({ _id: { $gt: `${idArg}${entrySeparator}`, $lt: `${idArg}${entryRangeEnd}` } }, { projection: { n: 1 }, limit: maximumCompactedEntries, session, ...abortable }).toArray();
|
|
309
|
+
if (entries.length === 0)
|
|
310
|
+
return;
|
|
311
|
+
let sum = 0;
|
|
312
|
+
for (const entry of entries) {
|
|
313
|
+
if (!Number.isSafeInteger(entry.n)) {
|
|
314
|
+
throw new SmartdataPersistenceError('invalid_document', `Write-revision entry "${entry._id}" holds no safe integer.`);
|
|
315
|
+
}
|
|
316
|
+
sum += entry.n;
|
|
317
|
+
if (!Number.isSafeInteger(sum)) {
|
|
318
|
+
throw new SmartdataPersistenceError('invalid_document', `Write-revision entries of "${idArg}" do not sum to a safe integer.`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
await collection.deleteMany({ _id: { $in: entries.map((entryArg) => entryArg._id) } }, { session, ...abortable });
|
|
322
|
+
await collection.updateOne({ _id: idArg }, { $inc: { n: sum } }, { upsert: true, session, ...abortable });
|
|
323
|
+
}, { timeoutMS: compactionTimeoutMs });
|
|
324
|
+
}
|
|
325
|
+
finally {
|
|
326
|
+
await session.endSession();
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
/**
|
|
330
|
+
* @internal Counts the entries a committed transaction of this process added,
|
|
331
|
+
* and starts a compaction of each counter that reached `compactionEntries`.
|
|
332
|
+
* Compactions run in the background; `stopSmartdataWriteRevisionCompactions`
|
|
333
|
+
* ends them.
|
|
334
|
+
*/
|
|
335
|
+
export const noteSmartdataWriteRevisionEntries = (dbArg, idsArg) => {
|
|
336
|
+
if (idsArg.size === 0 || dbArg.status !== 'connected' || !isSmartdataWriteRevisionsActive(dbArg))
|
|
337
|
+
return;
|
|
338
|
+
let state = revisionCompactions.get(dbArg);
|
|
339
|
+
if (!state) {
|
|
340
|
+
state = { entries: new Map(), running: new Map(), controller: new AbortController() };
|
|
341
|
+
revisionCompactions.set(dbArg, state);
|
|
342
|
+
}
|
|
343
|
+
const compactions = state;
|
|
344
|
+
for (const id of idsArg) {
|
|
345
|
+
const entries = (compactions.entries.get(id) ?? 0) + 1;
|
|
346
|
+
if (entries < compactionEntries || compactions.running.has(id)) {
|
|
347
|
+
compactions.entries.set(id, entries);
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
compactions.entries.delete(id);
|
|
351
|
+
const signal = compactions.controller.signal;
|
|
352
|
+
const compaction = compactWriteRevisionEntries(dbArg, id, signal)
|
|
353
|
+
.catch((errorArg) => {
|
|
354
|
+
if (signal.aborted)
|
|
355
|
+
return;
|
|
356
|
+
logger.log('warn', `Compacting the write revisions of "${id}" failed; a later compaction retries: ${errorArg instanceof Error ? errorArg.message : String(errorArg)}`);
|
|
357
|
+
})
|
|
358
|
+
.finally(() => { compactions.running.delete(id); });
|
|
359
|
+
compactions.running.set(id, compaction);
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
/** @internal Aborts the database's compactions and waits until they settled; `close()` calls it. */
|
|
363
|
+
export const stopSmartdataWriteRevisionCompactions = async (dbArg) => {
|
|
364
|
+
const state = revisionCompactions.get(dbArg);
|
|
365
|
+
if (!state)
|
|
366
|
+
return;
|
|
367
|
+
revisionCompactions.delete(dbArg);
|
|
368
|
+
state.controller.abort();
|
|
369
|
+
await Promise.allSettled(state.running.values());
|
|
370
|
+
};
|
|
222
371
|
/**
|
|
223
372
|
* @internal The counters of the documents a write by selector is about to
|
|
224
373
|
* change, read in its transaction before it runs. Snapshot isolation makes
|
|
@@ -243,4 +392,4 @@ export const readPreviousRevisionIds = async (dbArg, collectionArg, rawSessionAr
|
|
|
243
392
|
}
|
|
244
393
|
return ids;
|
|
245
394
|
};
|
|
246
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53cml0ZXJldmlzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL25vc3FsZGIvY2xhc3Nlcy53cml0ZXJldmlzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUd4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVqRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQWtCL0YsOENBQThDO0FBQzlDLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLDZCQUE2QixDQUFDO0FBUTFFLDJGQUEyRjtBQUMzRixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFDekIsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7QUFDbkMsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLENBQUM7QUFDbkMsd0ZBQXdGO0FBQ3hGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQztBQUM1QyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQztBQUVoQyxNQUFNLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBdUIsQ0FBQztBQUUzRCw2RkFBNkY7QUFDN0YsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQyxLQUFrQixFQUFFLFVBQW1CLEVBQVEsRUFBRTtJQUNoRyxJQUFJLFVBQVUsS0FBSyxTQUFTO1FBQUUsT0FBTztJQUNyQyxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQzdFLElBQ0UsT0FBTyxjQUFjLEtBQUssUUFBUTtXQUMvQixjQUFjLENBQUMsTUFBTSxLQUFLLENBQUM7V0FDM0IsQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFO1dBQzlCLGNBQWMsQ0FBQyxRQUFRLENBQUMsR0FBRyxD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
|
|
395
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53cml0ZXJldmlzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL25vc3FsZGIvY2xhc3Nlcy53cml0ZXJldmlzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUd4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVqRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBdUJ0Qyw4Q0FBOEM7QUFDOUMsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsNkJBQTZCLENBQUM7QUFRMUUsMkZBQTJGO0FBQzNGLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQztBQUN6Qjs7OztHQUlHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDO0FBQ2hDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQztBQUMvQixpR0FBaUc7QUFDakcsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFDN0IsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUM7QUFDckMsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUM7QUFDbEMsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7QUFDbkMsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLENBQUM7QUFDbkMsd0ZBQXdGO0FBQ3hGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQztBQUM1QyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQztBQUVoQyxNQUFNLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBdUIsQ0FBQztBQUUzRCw2RkFBNkY7QUFDN0YsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQyxLQUFrQixFQUFFLFVBQW1CLEVBQVEsRUFBRTtJQUNoRyxJQUFJLFVB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
|
|
@@ -20,6 +20,12 @@ export interface ISmartdataEngineIdentity {
|
|
|
20
20
|
export declare const unidentifiedSmartdataEngine: ISmartdataEngineIdentity;
|
|
21
21
|
export declare const smartdataEngineBackend: (identityArg: ISmartdataEngineIdentity) => TSmartdataEngineBackend | undefined;
|
|
22
22
|
export declare const smartdataCompositeGrouping: (identityArg: ISmartdataEngineIdentity) => TCompositeGrouping;
|
|
23
|
+
/**
|
|
24
|
+
* Whether the identified engine publishes a durable, commit-ordered journal of
|
|
25
|
+
* the transactions it committed. Only NoSQLDB does, from 10.9.0 on; MongoDB's
|
|
26
|
+
* change streams are a different contract and are not used for it.
|
|
27
|
+
*/
|
|
28
|
+
export declare const smartdataCommitJournal: (identityArg: ISmartdataEngineIdentity) => boolean;
|
|
23
29
|
export declare const composeSmartdataCapabilities: (backendArg: TSmartdataEngineBackend, compositeGroupingArg: TCompositeGrouping) => ICapabilities;
|
|
24
30
|
/**
|
|
25
31
|
* Asks the connected engine what it is with one `buildInfo` command. NoSQLDB
|
|
@@ -8,6 +8,11 @@ export const unidentifiedSmartdataEngine = Object.freeze({
|
|
|
8
8
|
* answering with the literal field paths: @lossless.org/nosqldb 10.5.0.
|
|
9
9
|
*/
|
|
10
10
|
const compositeGroupingEngineRelease = '10.5.0';
|
|
11
|
+
/**
|
|
12
|
+
* The NoSQLDB release that publishes its durable commit journal through the
|
|
13
|
+
* `getCommittedWrites` command: @lossless.org/nosqldb 10.9.0.
|
|
14
|
+
*/
|
|
15
|
+
const commitJournalEngineRelease = '10.9.0';
|
|
11
16
|
const parseEngineVersion = (versionArg) => {
|
|
12
17
|
const parts = versionArg.split('.');
|
|
13
18
|
if (parts.length !== 3) {
|
|
@@ -57,6 +62,14 @@ export const smartdataCompositeGrouping = (identityArg) => {
|
|
|
57
62
|
return 'unsupported';
|
|
58
63
|
}
|
|
59
64
|
};
|
|
65
|
+
/**
|
|
66
|
+
* Whether the identified engine publishes a durable, commit-ordered journal of
|
|
67
|
+
* the transactions it committed. Only NoSQLDB does, from 10.9.0 on; MongoDB's
|
|
68
|
+
* change streams are a different contract and are not used for it.
|
|
69
|
+
*/
|
|
70
|
+
export const smartdataCommitJournal = (identityArg) => identityArg.product === 'NoSQLDB'
|
|
71
|
+
&& identityArg.version !== null
|
|
72
|
+
&& engineVersionReaches(identityArg.version, commitJournalEngineRelease);
|
|
60
73
|
export const composeSmartdataCapabilities = (backendArg, compositeGroupingArg) => {
|
|
61
74
|
const capabilities = {
|
|
62
75
|
backend: backendArg,
|
|
@@ -102,4 +115,4 @@ export const probeSmartdataEngineIdentity = async (dbArg, budgetArg) => {
|
|
|
102
115
|
return unidentifiedSmartdataEngine;
|
|
103
116
|
}
|
|
104
117
|
};
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5laWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9ub3NxbGRiL2VuZ2luZWlkZW50aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBdUJ4QyxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBNkIsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNqRixPQUFPLEVBQUUsU0FBUztJQUNsQixPQUFPLEVBQUUsSUFBSTtDQUNkLENBQUMsQ0FBQztBQUVIOzs7R0FHRztBQUNILE1BQU0sOEJBQThCLEdBQUcsUUFBUSxDQUFDO0FBRWhEOzs7R0FHRztBQUNILE1BQU0sMEJBQTBCLEdBQUcsUUFBUSxDQUFDO0FBRTVDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxVQUFrQixFQUFpQyxFQUFFO0lBQy9FLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDcEMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNyRCxDQUFDO0lBQ0YsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7QUFDN0YsQ0FBQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sb0JBQW9C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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lossless.org/client",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.23.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"registry": "https://verdaccio.lossless.digital"
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"@git.zone/tsrun": "3.0.3",
|
|
89
89
|
"@git.zone/tstest": "7.2.0",
|
|
90
90
|
"@lossless.org/nosqldb": "8.0.2",
|
|
91
|
-
"@lossless.org/nosqldb-qualified": "npm:@lossless.org/nosqldb@10.
|
|
91
|
+
"@lossless.org/nosqldb-qualified": "npm:@lossless.org/nosqldb@10.9.0",
|
|
92
92
|
"@lossless.org/objectstorage": "10.3.1",
|
|
93
93
|
"@lossless.org/sqldb": "0.2.3",
|
|
94
94
|
"@push.rocks/qenv": "^6.1.3",
|