cry-db 2.4.49 → 2.5.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 +74 -9
- package/dist/index.d.mts +2 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +3 -1
- package/dist/index.mjs.map +1 -1
- package/dist/mongo.d.mts +9 -0
- package/dist/mongo.d.mts.map +1 -1
- package/dist/mongo.mjs +55 -5
- package/dist/mongo.mjs.map +1 -1
- package/dist/types.d.mts +23 -0
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils.d.mts +74 -0
- package/dist/utils.d.mts.map +1 -0
- package/dist/utils.mjs +807 -0
- package/dist/utils.mjs.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -253,15 +253,22 @@ const results = await mongo.updateCollections([
|
|
|
253
253
|
collection: 'users',
|
|
254
254
|
batch: {
|
|
255
255
|
updates: [
|
|
256
|
-
{ _id: id1, update: { name: 'Alice' } },
|
|
257
|
-
{ _id: id2, update: { name: 'Bob' } },
|
|
256
|
+
{ _id: id1, _rev: 4, update: { name: 'Alice' } },
|
|
257
|
+
{ _id: id2, _rev: 1, update: { name: 'Bob' } },
|
|
258
258
|
],
|
|
259
|
-
deletes: [{ _id: id3 }],
|
|
259
|
+
deletes: [{ _id: id3, _rev: 2 }],
|
|
260
260
|
},
|
|
261
261
|
}],
|
|
262
262
|
]);
|
|
263
263
|
```
|
|
264
264
|
|
|
265
|
+
Each `updates`/`deletes` entry carries `_rev` — the revision the client's
|
|
266
|
+
change was computed against. The server uses it to detect concurrent
|
|
267
|
+
external writes and to surface server-resolved fields (see `mustRefresh`
|
|
268
|
+
below). Do **not** put `_rev` inside `update` (it is stripped). Omitting
|
|
269
|
+
`_rev` is treated as `0`, which forces a full-record refresh — the
|
|
270
|
+
old-client fallback.
|
|
271
|
+
|
|
265
272
|
**Partial-failure semantics**: per-record failures inside `updates` or
|
|
266
273
|
`deletes` are **caught**, surfaced in `result.results.errors`, and do
|
|
267
274
|
not stop the rest of the batch. Each `findOneAndUpdate` /
|
|
@@ -283,18 +290,53 @@ land in `errors` and the batch keeps going. Infrastructure failures
|
|
|
283
290
|
exception.
|
|
284
291
|
|
|
285
292
|
```ts
|
|
286
|
-
results[0].results.inserted
|
|
287
|
-
results[0].results.updated
|
|
288
|
-
results[0].results.deleted
|
|
289
|
-
results[0].results.
|
|
290
|
-
results[0].results.
|
|
291
|
-
|
|
293
|
+
results[0].results.inserted // DbEntity[] — records actually upserted as new
|
|
294
|
+
results[0].results.updated // DbEntity[] — records actually updated
|
|
295
|
+
results[0].results.deleted // DbEntity[] — records actually deleted
|
|
296
|
+
results[0].results.mustRefresh // (DbEntity & full record)[] — see below
|
|
297
|
+
results[0].results.errors // { _id, error }[] — per-record failures (omitted if none)
|
|
298
|
+
results[0].results.warnings // { _id, error }[] — non-fatal issues (e.g. dropped
|
|
299
|
+
// NESTED-bracket paths; omitted if none)
|
|
292
300
|
```
|
|
293
301
|
|
|
294
302
|
`errors` and `warnings` are **arrays** — one entry per affected record.
|
|
295
303
|
Both fields are omitted when empty. The call itself does not throw on
|
|
296
304
|
per-record failures; check `.errors.length` to detect them.
|
|
297
305
|
|
|
306
|
+
#### `mustRefresh` — records the client must re-adopt
|
|
307
|
+
|
|
308
|
+
The `inserted`/`updated`/`deleted` arrays carry only `{_id,_ts,_rev}`, so a
|
|
309
|
+
client that relied on them alone never learned what cry-db changed beyond
|
|
310
|
+
the diff it sent. `mustRefresh` closes that: it holds the **full, sanitized
|
|
311
|
+
post-write record** for any entry where the client's local copy is now
|
|
312
|
+
stale. A record lands in `mustRefresh` when:
|
|
313
|
+
|
|
314
|
+
- cry-db **resolved a field** the client sent as a placeholder — `SEQ_*`
|
|
315
|
+
(auto-increment) or `__hashed__*` (hashing); or
|
|
316
|
+
- the stored `_rev` **advanced beyond the client's base `_rev`** by more than
|
|
317
|
+
this write applied — i.e. another actor modified the record first
|
|
318
|
+
(conflict); or
|
|
319
|
+
- the request **omitted `_rev`** (old-client fallback — always refresh).
|
|
320
|
+
|
|
321
|
+
Contract:
|
|
322
|
+
|
|
323
|
+
- Every `mustRefresh._id` **also** appears in `inserted`/`updated`/`deleted`,
|
|
324
|
+
so dirty-clearing logic that keys off those arrays is unaffected — treat
|
|
325
|
+
`mustRefresh` as supplementary.
|
|
326
|
+
- Records are **full and sanitized**: `__hashed__*` values are never
|
|
327
|
+
included (the client adopting the record drops any local plaintext), and
|
|
328
|
+
`removeFieldsAlways`/`findNewerRemoveFields` are applied as on reads.
|
|
329
|
+
- The client should **replace** its local record with the `mustRefresh`
|
|
330
|
+
entry, then run its own dirty-merge — apply `mustRefresh` **before** the
|
|
331
|
+
merge so unsynced local edits to other fields are reconciled rather than
|
|
332
|
+
clobbered.
|
|
333
|
+
- Conflict detection requires `useRevisions()`. Field-resolution refresh
|
|
334
|
+
(SEQ/hash) works regardless of revisions.
|
|
335
|
+
|
|
336
|
+
> **Consumers** (e.g. `cry-synced-db-client`): send `_rev` per update/delete
|
|
337
|
+
> and apply `mustRefresh` on the response. The `applyObjDiff`/`computeObjDiff`
|
|
338
|
+
> helpers (also exported from this package) can drive the local replace.
|
|
339
|
+
|
|
298
340
|
## Features
|
|
299
341
|
|
|
300
342
|
### Revisions
|
|
@@ -536,6 +578,29 @@ users.removeFieldsAlways('secret,internal'); // set fields stripped f
|
|
|
536
578
|
users.removeFieldsAlways(['secret', 'internal']); // set fields stripped from ALL find* and publish
|
|
537
579
|
```
|
|
538
580
|
|
|
581
|
+
## Diff Utilities
|
|
582
|
+
|
|
583
|
+
Pure, mongo-independent helpers for computing and replaying document diffs,
|
|
584
|
+
exported from the package root. They are the server-side counterpart of the
|
|
585
|
+
cry-synced-db-client diff machinery (`computeObjDiff` / `applyObjDiff`).
|
|
586
|
+
|
|
587
|
+
```ts
|
|
588
|
+
import { computeObjDiff, applyObjDiff } from 'cry-db';
|
|
589
|
+
|
|
590
|
+
// Minimal MongoDB-style dot/bracket paths between two documents (only keys
|
|
591
|
+
// present in `update`). Arrays of `_id`-keyed objects diff element-wise via
|
|
592
|
+
// `arr[<id>].field`, with composition changes as `arr[<id>] = [el]` /
|
|
593
|
+
// `arr[<id>] = undefined`. `_ts`/`_rev`/`_csq` are never emitted.
|
|
594
|
+
const diff = computeObjDiff(existing, update);
|
|
595
|
+
// → { "koraki[k1].diag": "new", "koraki[k2]": [{ _id: "k2", ... }] }
|
|
596
|
+
|
|
597
|
+
// Replay a diff onto a base document the way a server-side `$set`+`$unset`
|
|
598
|
+
// would. Returns a fresh object (base is cloned, never mutated). Bracket
|
|
599
|
+
// paths whose parent array is missing are materialized; unrepresentable
|
|
600
|
+
// multi-bracket paths are dropped (logged unless the root field starts `_`).
|
|
601
|
+
const merged = applyObjDiff(base, diff, fallbackId, collection);
|
|
602
|
+
```
|
|
603
|
+
|
|
539
604
|
## Environment Variables
|
|
540
605
|
|
|
541
606
|
| Variable | Default | Description |
|
package/dist/index.d.mts
CHANGED
|
@@ -3,6 +3,7 @@ import { Base } from './base.mjs';
|
|
|
3
3
|
import { Mongo, fj } from './mongo.mjs';
|
|
4
4
|
import { Repo } from './repo.mjs';
|
|
5
5
|
import { Db } from './db.mjs';
|
|
6
|
-
|
|
6
|
+
import { computeObjDiff, applyObjDiff } from './utils.mjs';
|
|
7
|
+
export { Types, Base, Mongo, Repo, Db, fj, computeObjDiff, applyObjDiff, };
|
|
7
8
|
export type { DbChannel, DbRevChannel } from './types.mjs';
|
|
8
9
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAO,aAAa,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EACH,KAAK,EACL,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,EAAE,EACF,EAAE,EACF,cAAc,EACd,YAAY,GACf,CAAA;AAED,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
// AI modified: 2026-05-21 (export computeObjDiff / applyObjDiff from ./utils.mjs)
|
|
1
2
|
import * as Types from './types.mjs';
|
|
2
3
|
import { Base } from './base.mjs';
|
|
3
4
|
import { Mongo, fj } from './mongo.mjs';
|
|
4
5
|
import { Repo } from './repo.mjs';
|
|
5
6
|
import { Db } from './db.mjs';
|
|
6
|
-
|
|
7
|
+
import { computeObjDiff, applyObjDiff } from './utils.mjs';
|
|
8
|
+
export { Types, Base, Mongo, Repo, Db, fj, computeObjDiff, applyObjDiff, };
|
|
7
9
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAO,aAAa,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,OAAO,KAAK,KAAK,MAAO,aAAa,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EACH,KAAK,EACL,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,EAAE,EACF,EAAE,EACF,cAAc,EACd,YAAY,GACf,CAAA"}
|
package/dist/mongo.d.mts
CHANGED
|
@@ -233,6 +233,15 @@ export declare class Mongo extends Db {
|
|
|
233
233
|
* (`{ "arr[id]": v }`) or already wrapped in `$set`/`$unset`/etc.
|
|
234
234
|
*/
|
|
235
235
|
private _buildPublishDelta;
|
|
236
|
+
/**
|
|
237
|
+
* Build a `mustRefresh` entry: a full, sanitized clone of the post-write
|
|
238
|
+
* document the client must adopt locally. Sanitization strips `__hashed__`
|
|
239
|
+
* (the hash never leaves the server), other `__`-internal keys, and the
|
|
240
|
+
* configured `findNewerRemoveFields`/`removeFieldsAlways` — matching what a
|
|
241
|
+
* read/publish exposes. `_id`/`_rev`/`_ts` are preserved. Clones first so
|
|
242
|
+
* the caller's `res.value`/`res` is left intact for the publish payload.
|
|
243
|
+
*/
|
|
244
|
+
private _buildMustRefreshRecord;
|
|
236
245
|
private _shouldAuditCollection;
|
|
237
246
|
private _publishAndAudit;
|
|
238
247
|
private _makeDataPublication;
|
package/dist/mongo.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongo.d.mts","sourceRoot":"","sources":["../src/mongo.mts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"mongo.d.mts","sourceRoot":"","sources":["../src/mongo.mts"],"names":[],"mappings":"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"}
|
package/dist/mongo.mjs
CHANGED
|
@@ -897,11 +897,17 @@ export class Mongo extends Db {
|
|
|
897
897
|
inserted: [],
|
|
898
898
|
updated: [],
|
|
899
899
|
deleted: [],
|
|
900
|
+
mustRefresh: [],
|
|
900
901
|
}
|
|
901
902
|
};
|
|
902
903
|
const batchData = [];
|
|
903
904
|
const errors = [];
|
|
904
905
|
const warnings = [];
|
|
906
|
+
// Per-update flag: did the client send a field cry-db resolves
|
|
907
|
+
// server-side (SEQ_*/__hashed__)? Captured BEFORE the bulk sequence
|
|
908
|
+
// resolution and per-update hashing mutate the updates in place, so
|
|
909
|
+
// the placeholders are still observable here.
|
|
910
|
+
const updateResolvedFlags = (updates !== null && updates !== void 0 ? updates : []).map(u => this._hasSequenceFields(u.update) || this._hasHashedKeys(u.update));
|
|
905
911
|
// Handle sequences in updates before processing
|
|
906
912
|
if (updates === null || updates === void 0 ? void 0 : updates.length) {
|
|
907
913
|
const updatesWithSeq = updates.filter(u => this._hasSequenceFields(u.update));
|
|
@@ -911,7 +917,7 @@ export class Mongo extends Db {
|
|
|
911
917
|
}
|
|
912
918
|
// Process updates (with upsert) in parallel
|
|
913
919
|
if (updates === null || updates === void 0 ? void 0 : updates.length) {
|
|
914
|
-
const updatePromises = updates.map(async ({ _id, update }) => {
|
|
920
|
+
const updatePromises = updates.map(async ({ _id, _rev: clientRev, update }, idx) => {
|
|
915
921
|
var _a, _b;
|
|
916
922
|
try {
|
|
917
923
|
const objectId = Mongo._toId(_id);
|
|
@@ -945,6 +951,19 @@ export class Mongo extends Db {
|
|
|
945
951
|
// Determine if this was an insert or update based on lastErrorObject
|
|
946
952
|
const wasInsert = !((_b = res.lastErrorObject) === null || _b === void 0 ? void 0 : _b.updatedExisting);
|
|
947
953
|
const operation = wasInsert ? 'insert' : 'update';
|
|
954
|
+
// mustRefresh: the client must replace its local copy when cry-db
|
|
955
|
+
// resolved a field (SEQ_*/__hashed__) OR a concurrent external write
|
|
956
|
+
// advanced the stored `_rev` beyond this write (gap > the +1 this write
|
|
957
|
+
// applied). An omitted `_rev` (clientRev → 0) forces a refresh — the
|
|
958
|
+
// old-client fallback. Built from a sanitized clone (hash never leaks).
|
|
959
|
+
const writtenRev = res.value._rev;
|
|
960
|
+
const inc = this.revisions ? 1 : 0;
|
|
961
|
+
const externallyModified = !wasInsert
|
|
962
|
+
&& typeof writtenRev === 'number'
|
|
963
|
+
&& (writtenRev - inc) > (clientRev !== null && clientRev !== void 0 ? clientRev : 0);
|
|
964
|
+
const mustRefresh = (updateResolvedFlags[idx] || externallyModified)
|
|
965
|
+
? this._buildMustRefreshRecord(res.value)
|
|
966
|
+
: undefined;
|
|
948
967
|
// Inserts surface the full doc (query fields must reach the client).
|
|
949
968
|
// Updates always go through _buildPublishDelta so bracket keys collapse
|
|
950
969
|
// to top-level parent array slices read straight from the post-update
|
|
@@ -953,7 +972,7 @@ export class Mongo extends Db {
|
|
|
953
972
|
? res.value
|
|
954
973
|
: this._buildPublishDelta(res.value, inputUpdate, false);
|
|
955
974
|
this._processReturnedObject(retObj);
|
|
956
|
-
return { success: true, _id, data: retObj, operation, wasInsert, rawUpdate: wasInsert ? undefined : inputUpdate };
|
|
975
|
+
return { success: true, _id, data: retObj, operation, wasInsert, rawUpdate: wasInsert ? undefined : inputUpdate, mustRefresh };
|
|
957
976
|
}
|
|
958
977
|
return { success: false, _id, error: 'Operation failed' };
|
|
959
978
|
}
|
|
@@ -975,6 +994,8 @@ export class Mongo extends Db {
|
|
|
975
994
|
else {
|
|
976
995
|
result.results.updated.push(dbEntity);
|
|
977
996
|
}
|
|
997
|
+
if (res.mustRefresh)
|
|
998
|
+
result.results.mustRefresh.push(res.mustRefresh);
|
|
978
999
|
const item = { operation: res.operation, data: res.data };
|
|
979
1000
|
// rawUpdate is meaningful only for the update branch — inserts publish the full doc.
|
|
980
1001
|
if (!res.wasInsert)
|
|
@@ -988,7 +1009,7 @@ export class Mongo extends Db {
|
|
|
988
1009
|
}
|
|
989
1010
|
// Process deletes in parallel
|
|
990
1011
|
if (deletes === null || deletes === void 0 ? void 0 : deletes.length) {
|
|
991
|
-
const deletePromises = deletes.map(async ({ _id }) => {
|
|
1012
|
+
const deletePromises = deletes.map(async ({ _id, _rev: clientRev }) => {
|
|
992
1013
|
try {
|
|
993
1014
|
const objectId = Mongo._toId(_id);
|
|
994
1015
|
if (!this.softdelete) {
|
|
@@ -997,8 +1018,16 @@ export class Mongo extends Db {
|
|
|
997
1018
|
.collection(collection)
|
|
998
1019
|
.findOneAndDelete({ _id: objectId }, this._sessionOpt());
|
|
999
1020
|
if (res) {
|
|
1021
|
+
// Hard delete applies no `_rev` increment: the removed doc's `_rev`
|
|
1022
|
+
// exceeding the client's base means an external write landed first.
|
|
1023
|
+
// Omitted `_rev` (clientRev → 0) forces a refresh — old-client fallback.
|
|
1024
|
+
const externallyModified = typeof res._rev === 'number'
|
|
1025
|
+
&& res._rev > (clientRev !== null && clientRev !== void 0 ? clientRev : 0);
|
|
1026
|
+
const mustRefresh = externallyModified
|
|
1027
|
+
? this._buildMustRefreshRecord(res)
|
|
1028
|
+
: undefined;
|
|
1000
1029
|
this._processReturnedObject(res);
|
|
1001
|
-
return { success: true, _id, data: res, operation: 'delete' };
|
|
1030
|
+
return { success: true, _id, data: res, operation: 'delete', mustRefresh };
|
|
1002
1031
|
}
|
|
1003
1032
|
return { success: false, _id, error: 'Document not found' };
|
|
1004
1033
|
}
|
|
@@ -1018,8 +1047,16 @@ export class Mongo extends Db {
|
|
|
1018
1047
|
.collection(collection)
|
|
1019
1048
|
.findOneAndUpdate({ _id: objectId }, del, opts);
|
|
1020
1049
|
if (res) {
|
|
1050
|
+
// Soft delete applied a +1 `_rev` increment: a gap beyond that +1
|
|
1051
|
+
// means an external write modified the record before this delete.
|
|
1052
|
+
// Omitted `_rev` (clientRev → 0) forces a refresh — old-client fallback.
|
|
1053
|
+
const externallyModified = typeof res._rev === 'number'
|
|
1054
|
+
&& (res._rev - 1) > (clientRev !== null && clientRev !== void 0 ? clientRev : 0);
|
|
1055
|
+
const mustRefresh = externallyModified
|
|
1056
|
+
? this._buildMustRefreshRecord(res)
|
|
1057
|
+
: undefined;
|
|
1021
1058
|
this._processReturnedObject(res);
|
|
1022
|
-
return { success: true, _id, data: res, operation: 'delete' };
|
|
1059
|
+
return { success: true, _id, data: res, operation: 'delete', mustRefresh };
|
|
1023
1060
|
}
|
|
1024
1061
|
return { success: false, _id, error: 'Document not found' };
|
|
1025
1062
|
}
|
|
@@ -1038,6 +1075,8 @@ export class Mongo extends Db {
|
|
|
1038
1075
|
_deleted: res.data._deleted,
|
|
1039
1076
|
};
|
|
1040
1077
|
result.results.deleted.push(dbEntity);
|
|
1078
|
+
if (res.mustRefresh)
|
|
1079
|
+
result.results.mustRefresh.push(res.mustRefresh);
|
|
1041
1080
|
batchData.push({ operation: res.operation, data: res.data });
|
|
1042
1081
|
}
|
|
1043
1082
|
else if (!res.success && res.error) {
|
|
@@ -2297,6 +2336,17 @@ export class Mongo extends Db {
|
|
|
2297
2336
|
out._id = wholerecord._id;
|
|
2298
2337
|
return out;
|
|
2299
2338
|
}
|
|
2339
|
+
/**
|
|
2340
|
+
* Build a `mustRefresh` entry: a full, sanitized clone of the post-write
|
|
2341
|
+
* document the client must adopt locally. Sanitization strips `__hashed__`
|
|
2342
|
+
* (the hash never leaves the server), other `__`-internal keys, and the
|
|
2343
|
+
* configured `findNewerRemoveFields`/`removeFieldsAlways` — matching what a
|
|
2344
|
+
* read/publish exposes. `_id`/`_rev`/`_ts` are preserved. Clones first so
|
|
2345
|
+
* the caller's `res.value`/`res` is left intact for the publish payload.
|
|
2346
|
+
*/
|
|
2347
|
+
_buildMustRefreshRecord(fullDoc) {
|
|
2348
|
+
return this._processReturnedObject(cloneDeep(fullDoc), this._findNewerRemoveFields);
|
|
2349
|
+
}
|
|
2300
2350
|
_shouldAuditCollection(db, col) {
|
|
2301
2351
|
if (!this.auditing)
|
|
2302
2352
|
return false;
|