@procedures/mongo 0.43.0 → 0.45.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/CHANGELOG.md +26 -0
- package/README.md +47 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/database-changes.d.ts +120 -0
- package/dist/storage/database-changes.d.ts.map +1 -0
- package/dist/storage/database-changes.js +273 -0
- package/dist/storage/database-changes.js.map +1 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/materializer.d.ts +12 -2
- package/dist/storage/materializer.d.ts.map +1 -1
- package/dist/storage/materializer.js +27 -25
- package/dist/storage/materializer.js.map +1 -1
- package/dist/storage/storage-hints.d.ts +23 -2
- package/dist/storage/storage-hints.d.ts.map +1 -1
- package/dist/storage/storage-hints.js +45 -37
- package/dist/storage/storage-hints.js.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +3 -0
- package/src/storage/database-changes.ts +357 -0
- package/src/storage/index.ts +3 -0
- package/src/storage/materializer.ts +36 -25
- package/src/storage/storage-hints.ts +56 -37
package/dist/index.d.ts
CHANGED
|
@@ -30,6 +30,8 @@ export { MongoStorage, MongoDocumentStorage, selectorPrefilter, DOCUMENT_STORAGE
|
|
|
30
30
|
export type { MongoStorageOptions, MongoDocumentStorageOptions, SelectorPrefilterOptions, StoredForm, DecodeStoredDocumentOptions, StoredDocumentEntry } from "./storage/index.js";
|
|
31
31
|
export { watchStorageChanges, storageChangeOf } from "./storage/index.js";
|
|
32
32
|
export type { StorageChange, StorageChangeHint, StorageChangesWatch, StorageHintPublisher, WatchStorageChangesOptions } from "./storage/index.js";
|
|
33
|
+
export { watchDatabaseChanges } from "./storage/index.js";
|
|
34
|
+
export type { DatabaseChangesWatch, WatchDatabaseChangesOptions } from "./storage/index.js";
|
|
33
35
|
export { BLOCKED_PIPELINE_OPERATORS, ALLOWED_PIPELINE_STAGES, DEFAULT_PIPELINE_LIMITS, assertNoBlockedOperators, boundPipeline, cutResults, isTimeLimitError, scopePipeline, } from "./storage/index.js";
|
|
34
36
|
export type { PipelineLimits, PipelineScope } from "./storage/index.js";
|
|
35
37
|
export { registerMongoProcedures, procedures } from "./module.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -36,6 +36,8 @@ hasCollection, requireCollection, getBaseMeta, } from "./types.js";
|
|
|
36
36
|
export { MongoStorage, MongoDocumentStorage, selectorPrefilter, DOCUMENT_STORAGE_FIELDS, TOMBSTONE_FIELD, DEFAULT_STORED_FORM, decodeStoredDocument, versionOfStored, } from "./storage/index.js";
|
|
37
37
|
// The change hints of a storage collection from its change stream (roadmap CLI-77)
|
|
38
38
|
export { watchStorageChanges, storageChangeOf } from "./storage/index.js";
|
|
39
|
+
// One change watcher for a whole database, with resume and backoff (roadmap CLI-88)
|
|
40
|
+
export { watchDatabaseChanges } from "./storage/index.js";
|
|
39
41
|
// The guard of an aggregation pipeline over shared collections, and its limits (Graph's split plan, P3)
|
|
40
42
|
export { BLOCKED_PIPELINE_OPERATORS, ALLOWED_PIPELINE_STAGES, DEFAULT_PIPELINE_LIMITS, assertNoBlockedOperators, boundPipeline, cutResults, isTimeLimitError, scopePipeline, } from "./storage/index.js";
|
|
41
43
|
// =============================================================================
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,OAAO,EACL,OAAO,EACP,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,KAAK,EACL,SAAS,EACT,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAKzB,gFAAgF;AAChF,QAAQ;AACR,gFAAgF;AAEhF,OAAO;AACL,cAAc;AACd,aAAa,EACb,iBAAiB,EACjB,WAAW,GACZ,MAAM,YAAY,CAAC;AAqFpB,gFAAgF;AAChF,6CAA6C;AAC7C,gFAAgF;AAEhF,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B,mFAAmF;AACnF,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1E,wGAAwG;AACxG,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,aAAa,GACd,MAAM,oBAAoB,CAAC;AAG5B,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAEhF,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAElE,gFAAgF;AAChF,sDAAsD;AACtD,gFAAgF;AAEhF,cAAc,uBAAuB,CAAC;AAgBtC,uEAAuE;AACvE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,UAAU,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEhJ,6GAA6G;AAC7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,OAAO,EACL,OAAO,EACP,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,KAAK,EACL,SAAS,EACT,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAKzB,gFAAgF;AAChF,QAAQ;AACR,gFAAgF;AAEhF,OAAO;AACL,cAAc;AACd,aAAa,EACb,iBAAiB,EACjB,WAAW,GACZ,MAAM,YAAY,CAAC;AAqFpB,gFAAgF;AAChF,6CAA6C;AAC7C,gFAAgF;AAEhF,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B,mFAAmF;AACnF,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1E,oFAAoF;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,wGAAwG;AACxG,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,aAAa,GACd,MAAM,oBAAoB,CAAC;AAG5B,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAEhF,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAElE,gFAAgF;AAChF,sDAAsD;AACtD,gFAAgF;AAEhF,cAAc,uBAAuB,CAAC;AAgBtC,uEAAuE;AACvE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,UAAU,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEhJ,6GAA6G;AAC7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One change watcher for a whole database (roadmap CLI-88). `watchDatabaseChanges()` opens the
|
|
3
|
+
* change stream of the database, and gives each raw change event to `onChange`. After an error, it
|
|
4
|
+
* opens the stream again from the resume token of the last change that `onChange` took.
|
|
5
|
+
*
|
|
6
|
+
* - The event goes to `onChange` as the driver gives it: `fullDocument`, `fullDocumentBeforeChange`
|
|
7
|
+
* (the image before the change), `ns`, `clusterTime`, `wallTime` and each other field. Set
|
|
8
|
+
* `fullDocumentBeforeChange` to get the image. A collection gives it only with
|
|
9
|
+
* `changeStreamPreAndPostImages` (MongoDB 6 or later).
|
|
10
|
+
* - The events go one at a time, in the order of the stream. The watcher reads the next event
|
|
11
|
+
* after `onChange` resolves.
|
|
12
|
+
* - The resume token is the `_id` of the last event, after its `onChange` resolved. A batch without
|
|
13
|
+
* events gives the token of the batch (the post-batch resume token). `resumeToken` of the handle
|
|
14
|
+
* gives the token at this time.
|
|
15
|
+
* - After an error of the stream, the watcher waits for the backoff. Then it opens the stream again
|
|
16
|
+
* with `startAfter` and the token. Thus it loses no change and gives no change twice.
|
|
17
|
+
* - An error of `onChange` has the same backoff. The token stays at the change before, so the same
|
|
18
|
+
* change comes again.
|
|
19
|
+
* - The backoff starts at `initialDelay` and grows by `backoffMultiplier` to at most `maxDelay`,
|
|
20
|
+
* with `jitter`. A change or a batch without events sets it back to `initialDelay`.
|
|
21
|
+
* - Some errors do not go away. The watcher then stops, and the error goes to `onError` and to the
|
|
22
|
+
* logger:
|
|
23
|
+
* - An `invalidate` event (for example after `dropDatabase`). `resumeToken` is then the token of
|
|
24
|
+
* that event: a new watcher with `startAfter` starts after it.
|
|
25
|
+
* - A token that the server does not know any more (codes 260, 280 and 286, for example
|
|
26
|
+
* `ChangeStreamHistoryLost`).
|
|
27
|
+
* - Before the first open: a refused access, a single server (code 40573), a wrong option.
|
|
28
|
+
* - `stop()` or an abort of `signal` stops the watcher. It closes the stream and cancels the timer
|
|
29
|
+
* of the backoff. An `onChange` that runs finishes, and no change comes after it.
|
|
30
|
+
* - Change streams need a replica set or a sharded cluster. The watcher asks the server (`hello`)
|
|
31
|
+
* before the first open: on a single server, it stops with the code 40573.
|
|
32
|
+
*/
|
|
33
|
+
import type { ChangeStreamDocument, ChangeStreamOptions, Db, Document, ResumeToken, Timestamp } from "mongodb";
|
|
34
|
+
import { type Clock, type Logger, type ResubscribeBackoff } from "@procedures/client";
|
|
35
|
+
/** The options of `watchDatabaseChanges()`. */
|
|
36
|
+
export interface WatchDatabaseChangesOptions<TChange extends Document = ChangeStreamDocument> {
|
|
37
|
+
/**
|
|
38
|
+
* The function that gets each raw change event, one at a time. The watcher keeps the token of
|
|
39
|
+
* the event after the function resolves. When it fails, the same event comes again after the backoff.
|
|
40
|
+
*/
|
|
41
|
+
onChange: (change: TChange) => void | Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* The function that gets the error that stops the watcher. The error is an `invalidate` event, a
|
|
44
|
+
* lost resume token, or an error of the first open that does not go away. An `invalidate` event
|
|
45
|
+
* gives an `Error` with the event in its field `change`.
|
|
46
|
+
*/
|
|
47
|
+
onError?: ((error: unknown) => void) | undefined;
|
|
48
|
+
/** The resume token after which the first stream starts. Give only one of `resumeAfter`, `startAfter` and `startAtOperationTime`. */
|
|
49
|
+
resumeAfter?: ResumeToken | undefined;
|
|
50
|
+
/** The resume token after which the first stream starts, also the token of an `invalidate` event. */
|
|
51
|
+
startAfter?: ResumeToken | undefined;
|
|
52
|
+
/** The time of the cluster at which the first stream starts. */
|
|
53
|
+
startAtOperationTime?: Timestamp | undefined;
|
|
54
|
+
/** The `fullDocument` option of the stream: `updateLookup`, `whenAvailable` or `required`. */
|
|
55
|
+
fullDocument?: "updateLookup" | "whenAvailable" | "required" | undefined;
|
|
56
|
+
/** The `fullDocumentBeforeChange` option of the stream: `whenAvailable`, `required` or `off`. */
|
|
57
|
+
fullDocumentBeforeChange?: "whenAvailable" | "required" | "off" | undefined;
|
|
58
|
+
/** The pipeline of the stream, for example a `$match` of the collections. @default [] */
|
|
59
|
+
pipeline?: Document[] | undefined;
|
|
60
|
+
/** More options of the stream, for example `maxAwaitTimeMS`, `batchSize` or `showExpandedEvents`. */
|
|
61
|
+
streamOptions?: Omit<ChangeStreamOptions, "resumeAfter" | "startAfter" | "startAtOperationTime" | "fullDocument" | "fullDocumentBeforeChange"> | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* The backoff before the stream opens again after an error.
|
|
64
|
+
* @default { initialDelay: ms(250), maxDelay: seconds(30), backoffMultiplier: 2, jitter: 1 }
|
|
65
|
+
*/
|
|
66
|
+
backoff?: ResubscribeBackoff | undefined;
|
|
67
|
+
/**
|
|
68
|
+
* The logger of the watcher. The fields of each line hold its context: `database`, `collection`,
|
|
69
|
+
* `operationType`, `resumeToken` (true when the watcher has a token), `error`, `attempt` and `delayMs`.
|
|
70
|
+
* @default the console, with the prefix `[database-changes]`
|
|
71
|
+
*/
|
|
72
|
+
logger?: Logger | undefined;
|
|
73
|
+
/** The signal that stops the watcher. */
|
|
74
|
+
signal?: AbortSignal | undefined;
|
|
75
|
+
/** The clock of the timers (default the clock of the platform). The timers do not keep a process alive. */
|
|
76
|
+
clock?: Clock | undefined;
|
|
77
|
+
}
|
|
78
|
+
/** The handle of `watchDatabaseChanges()`. */
|
|
79
|
+
export interface DatabaseChangesWatch {
|
|
80
|
+
/**
|
|
81
|
+
* It resolves when the first stream is open (each later change reaches `onChange`), or when the
|
|
82
|
+
* watcher stops. It rejects when the watcher stops on an error before the first open.
|
|
83
|
+
*/
|
|
84
|
+
readonly ready: Promise<void>;
|
|
85
|
+
/** The resume token of the last change that `onChange` took, or of the last batch without events. It is undefined before the first open without a start token. */
|
|
86
|
+
readonly resumeToken: ResumeToken | undefined;
|
|
87
|
+
/** True after `stop()`, an abort of `signal`, or an error that stops the watcher. */
|
|
88
|
+
readonly stopped: boolean;
|
|
89
|
+
/** This method stops the watcher: it closes the stream and cancels the timer of a backoff. */
|
|
90
|
+
stop(): Promise<void>;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* This function watches the change stream of a whole database, and gives each raw change event to
|
|
94
|
+
* `onChange` (roadmap CLI-88). After an error, it opens the stream again from the resume token,
|
|
95
|
+
* after a bounded backoff. Refer to the module comment for the rules.
|
|
96
|
+
*
|
|
97
|
+
* @param db - The database, or a function that gives it
|
|
98
|
+
* @param options - The handlers, the start of the stream, its options, the backoff, the logger and the signal
|
|
99
|
+
* @returns The handle: `ready`, `resumeToken`, `stopped` and `stop()`
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```typescript
|
|
103
|
+
* const watch = watchDatabaseChanges(db, {
|
|
104
|
+
* fullDocument: "updateLookup",
|
|
105
|
+
* fullDocumentBeforeChange: "whenAvailable",
|
|
106
|
+
* resumeAfter: savedToken,
|
|
107
|
+
* onChange: async (change) => {
|
|
108
|
+
* await apply(change);
|
|
109
|
+
* savedToken = change._id;
|
|
110
|
+
* },
|
|
111
|
+
* onError: (error) => console.error("the watcher stopped", error),
|
|
112
|
+
* logger,
|
|
113
|
+
* });
|
|
114
|
+
* await watch.ready;
|
|
115
|
+
* // ...
|
|
116
|
+
* await watch.stop();
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
export declare function watchDatabaseChanges<TChange extends Document = ChangeStreamDocument>(db: Db | (() => Db | Promise<Db>), options: WatchDatabaseChangesOptions<TChange>): DatabaseChangesWatch;
|
|
120
|
+
//# sourceMappingURL=database-changes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-changes.d.ts","sourceRoot":"","sources":["../../src/storage/database-changes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,KAAK,EAAgB,oBAAoB,EAAE,mBAAmB,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7H,OAAO,EAAoC,KAAK,KAAK,EAAkB,KAAK,MAAM,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGxI,+CAA+C;AAC/C,MAAM,WAAW,2BAA2B,CAAC,OAAO,SAAS,QAAQ,GAAG,oBAAoB;IAC1F;;;OAGG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACjD,qIAAqI;IACrI,WAAW,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACtC,qGAAqG;IACrG,UAAU,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,gEAAgE;IAChE,oBAAoB,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7C,8FAA8F;IAC9F,YAAY,CAAC,EAAE,cAAc,GAAG,eAAe,GAAG,UAAU,GAAG,SAAS,CAAC;IACzE,iGAAiG;IACjG,wBAAwB,CAAC,EAAE,eAAe,GAAG,UAAU,GAAG,KAAK,GAAG,SAAS,CAAC;IAC5E,yFAAyF;IACzF,QAAQ,CAAC,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IAClC,qGAAqG;IACrG,aAAa,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,aAAa,GAAG,YAAY,GAAG,sBAAsB,GAAG,cAAc,GAAG,0BAA0B,CAAC,GAAG,SAAS,CAAC;IAC3J;;;OAGG;IACH,OAAO,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACzC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,yCAAyC;IACzC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,2GAA2G;IAC3G,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;CAC3B;AAED,8CAA8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,kKAAkK;IAClK,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IAC9C,qFAAqF;IACrF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,8FAA8F;IAC9F,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAkBD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,SAAS,QAAQ,GAAG,oBAAoB,EAClF,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,EACjC,OAAO,EAAE,2BAA2B,CAAC,OAAO,CAAC,GAC5C,oBAAoB,CAuNtB"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { realClock, writeLog } from "@procedures/client";
|
|
2
|
+
import { COMMAND_NOT_FOUND, LOST_TOKEN_CODES, backoffOf, codeOf, isPermanent, messageOf } from "./storage-hints.js";
|
|
3
|
+
/** An error of `onChange`: the watcher waits, and gives the same change again. */
|
|
4
|
+
class HandlerError extends Error {
|
|
5
|
+
error;
|
|
6
|
+
change;
|
|
7
|
+
constructor(error, change) {
|
|
8
|
+
super(`onChange failed: ${messageOf(error)}`);
|
|
9
|
+
this.error = error;
|
|
10
|
+
this.change = change;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** The collection of a change event, from its `ns`. */
|
|
14
|
+
function collectionOf(change) {
|
|
15
|
+
const ns = change["ns"];
|
|
16
|
+
return typeof ns === "object" && ns !== null ? ns["coll"] : undefined;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* This function watches the change stream of a whole database, and gives each raw change event to
|
|
20
|
+
* `onChange` (roadmap CLI-88). After an error, it opens the stream again from the resume token,
|
|
21
|
+
* after a bounded backoff. Refer to the module comment for the rules.
|
|
22
|
+
*
|
|
23
|
+
* @param db - The database, or a function that gives it
|
|
24
|
+
* @param options - The handlers, the start of the stream, its options, the backoff, the logger and the signal
|
|
25
|
+
* @returns The handle: `ready`, `resumeToken`, `stopped` and `stop()`
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const watch = watchDatabaseChanges(db, {
|
|
30
|
+
* fullDocument: "updateLookup",
|
|
31
|
+
* fullDocumentBeforeChange: "whenAvailable",
|
|
32
|
+
* resumeAfter: savedToken,
|
|
33
|
+
* onChange: async (change) => {
|
|
34
|
+
* await apply(change);
|
|
35
|
+
* savedToken = change._id;
|
|
36
|
+
* },
|
|
37
|
+
* onError: (error) => console.error("the watcher stopped", error),
|
|
38
|
+
* logger,
|
|
39
|
+
* });
|
|
40
|
+
* await watch.ready;
|
|
41
|
+
* // ...
|
|
42
|
+
* await watch.stop();
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export function watchDatabaseChanges(db, options) {
|
|
46
|
+
if (typeof options?.onChange !== "function")
|
|
47
|
+
throw new TypeError("onChange must be a function");
|
|
48
|
+
const starts = [options.resumeAfter, options.startAfter, options.startAtOperationTime].filter((value) => value !== undefined);
|
|
49
|
+
if (starts.length > 1)
|
|
50
|
+
throw new TypeError("give only one of resumeAfter, startAfter and startAtOperationTime");
|
|
51
|
+
const delayOf = backoffOf(options.backoff);
|
|
52
|
+
const clock = options.clock ?? realClock;
|
|
53
|
+
const logger = options.logger;
|
|
54
|
+
const dbOf = typeof db === "function" ? db : () => db;
|
|
55
|
+
let stopped = false;
|
|
56
|
+
/** The token of the last change that `onChange` took, or of the last batch without events. */
|
|
57
|
+
let token = options.startAfter ?? options.resumeAfter;
|
|
58
|
+
/** True after a stream was open. */
|
|
59
|
+
let opened = false;
|
|
60
|
+
/** True after the server said that it has change streams. */
|
|
61
|
+
let checked = false;
|
|
62
|
+
/** The tries since the last success. The backoff gives the delay of the next try from it. */
|
|
63
|
+
let attempt = 0;
|
|
64
|
+
let database;
|
|
65
|
+
let stream;
|
|
66
|
+
/** The timer of a backoff, and the end of its wait. */
|
|
67
|
+
let timer;
|
|
68
|
+
let wake;
|
|
69
|
+
let markReady = () => undefined;
|
|
70
|
+
let failReady = () => undefined;
|
|
71
|
+
const ready = new Promise((resolve, reject) => {
|
|
72
|
+
markReady = resolve;
|
|
73
|
+
failReady = reject;
|
|
74
|
+
});
|
|
75
|
+
// A caller that does not wait for `ready` gets no unhandled rejection: the logger tells the error
|
|
76
|
+
ready.catch(() => undefined);
|
|
77
|
+
const log = (level, message, fields) => {
|
|
78
|
+
const all = { component: "database-changes", database, resumeToken: token !== undefined, ...fields };
|
|
79
|
+
writeLog(logger, level, message, all, `[database-changes] ${message}`, all);
|
|
80
|
+
};
|
|
81
|
+
/** The end of the watcher after an error that does not go away. */
|
|
82
|
+
const fail = (error, fields) => {
|
|
83
|
+
if (stopped)
|
|
84
|
+
return;
|
|
85
|
+
log("error", "The change stream stopped: the error does not go away", { error, ...fields });
|
|
86
|
+
halt();
|
|
87
|
+
failReady(error);
|
|
88
|
+
try {
|
|
89
|
+
options.onError?.(error);
|
|
90
|
+
}
|
|
91
|
+
catch (thrown) {
|
|
92
|
+
log("error", "onError failed", { error: thrown });
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
/** The wait of the backoff. `stop()` ends it. */
|
|
96
|
+
const backoff = (message, fields) => {
|
|
97
|
+
const delay = delayOf(attempt);
|
|
98
|
+
attempt++;
|
|
99
|
+
log("warn", message, { ...fields, attempt, delayMs: Math.round(delay) });
|
|
100
|
+
return new Promise((resolve) => {
|
|
101
|
+
wake = resolve;
|
|
102
|
+
timer = clock.after(delay, () => {
|
|
103
|
+
timer = undefined;
|
|
104
|
+
wake = undefined;
|
|
105
|
+
resolve();
|
|
106
|
+
});
|
|
107
|
+
timer.unref?.();
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
/** The start of the next stream: after the token, else the start of the options. */
|
|
111
|
+
const start = () => {
|
|
112
|
+
if (!opened && options.resumeAfter !== undefined)
|
|
113
|
+
return { resumeAfter: options.resumeAfter };
|
|
114
|
+
if (token !== undefined)
|
|
115
|
+
return { startAfter: token };
|
|
116
|
+
return options.startAtOperationTime !== undefined ? { startAtOperationTime: options.startAtOperationTime } : {};
|
|
117
|
+
};
|
|
118
|
+
/** The stream is open: the next change reaches `onChange`. */
|
|
119
|
+
const markOpen = () => {
|
|
120
|
+
if (opened || stopped)
|
|
121
|
+
return;
|
|
122
|
+
opened = true;
|
|
123
|
+
markReady();
|
|
124
|
+
};
|
|
125
|
+
/** A success: a batch without events, or a change that `onChange` took. The backoff starts again. */
|
|
126
|
+
const succeeded = () => {
|
|
127
|
+
if (attempt > 0)
|
|
128
|
+
log("info", "The change stream opened again", { attempts: attempt });
|
|
129
|
+
attempt = 0;
|
|
130
|
+
};
|
|
131
|
+
/** One stream: it reads the events until an error, an `invalidate` event or the stop. */
|
|
132
|
+
const read = async (next) => {
|
|
133
|
+
for (;;) {
|
|
134
|
+
const change = await next.tryNext();
|
|
135
|
+
if (stopped)
|
|
136
|
+
return;
|
|
137
|
+
markOpen();
|
|
138
|
+
if (change === null) {
|
|
139
|
+
// A batch without events: its token is after each event that `onChange` took
|
|
140
|
+
const batchToken = next.resumeToken;
|
|
141
|
+
if (batchToken !== undefined && batchToken !== null)
|
|
142
|
+
token = batchToken;
|
|
143
|
+
succeeded();
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (change["operationType"] === "invalidate") {
|
|
147
|
+
token = change["_id"];
|
|
148
|
+
return fail(Object.assign(new Error(`the change stream of the database ${database ?? ""} was invalidated`), { change }), { operationType: "invalidate" });
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
await options.onChange(change);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
throw new HandlerError(error, change);
|
|
155
|
+
}
|
|
156
|
+
token = change["_id"];
|
|
157
|
+
succeeded();
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
const run = async () => {
|
|
161
|
+
while (!stopped) {
|
|
162
|
+
let handle;
|
|
163
|
+
try {
|
|
164
|
+
handle = await dbOf();
|
|
165
|
+
database = handle.databaseName;
|
|
166
|
+
if (!checked) {
|
|
167
|
+
// On a single server, the driver can wait without an error: the watcher asks the server first
|
|
168
|
+
let hello;
|
|
169
|
+
try {
|
|
170
|
+
hello = await handle.command({ hello: 1 });
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
// An old server without hello: the stream tells the error
|
|
174
|
+
if (codeOf(error) !== COMMAND_NOT_FOUND)
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
if (hello && typeof hello["setName"] !== "string" && hello["msg"] !== "isdbgrid") {
|
|
178
|
+
const single = Object.assign(new Error("change streams need a replica set or a sharded cluster, and the server is a single server"), { code: 40573 });
|
|
179
|
+
return fail(single, { code: 40573 });
|
|
180
|
+
}
|
|
181
|
+
checked = true;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
if (stopped)
|
|
186
|
+
return;
|
|
187
|
+
if (!opened && isPermanent(error))
|
|
188
|
+
return fail(error, { code: codeOf(error) });
|
|
189
|
+
await backoff("The database is not available: the change stream opens again after a backoff", { error, code: codeOf(error) });
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (stopped)
|
|
193
|
+
return;
|
|
194
|
+
if (token === undefined && opened)
|
|
195
|
+
log("warn", "The change stream opens again without a resume token: it can miss changes", {});
|
|
196
|
+
try {
|
|
197
|
+
const next = handle.watch(options.pipeline ?? [], {
|
|
198
|
+
...options.streamOptions,
|
|
199
|
+
...(options.fullDocument !== undefined && { fullDocument: options.fullDocument }),
|
|
200
|
+
...(options.fullDocumentBeforeChange !== undefined && { fullDocumentBeforeChange: options.fullDocumentBeforeChange }),
|
|
201
|
+
...start(),
|
|
202
|
+
});
|
|
203
|
+
stream = next;
|
|
204
|
+
// The first token of the stream comes with the answer of the server: the stream is open, before the first getMore
|
|
205
|
+
next.on("resumeTokenChanged", markOpen);
|
|
206
|
+
try {
|
|
207
|
+
await read(next);
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
if (stream === next)
|
|
211
|
+
stream = undefined;
|
|
212
|
+
await next.close().catch(() => undefined);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
if (stopped)
|
|
217
|
+
return;
|
|
218
|
+
if (error instanceof HandlerError) {
|
|
219
|
+
await backoff("onChange failed: the same change comes again after a backoff", {
|
|
220
|
+
error: error.error,
|
|
221
|
+
collection: collectionOf(error.change),
|
|
222
|
+
operationType: error.change["operationType"],
|
|
223
|
+
});
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
const code = codeOf(error);
|
|
227
|
+
if (code !== undefined && LOST_TOKEN_CODES.has(code))
|
|
228
|
+
return fail(error, { code });
|
|
229
|
+
if (!opened && isPermanent(error))
|
|
230
|
+
return fail(error, { code });
|
|
231
|
+
await backoff("The change stream failed: it opens again after a backoff", { error, code });
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
/** The end of the watcher: no new stream, no timer. */
|
|
236
|
+
const halt = () => {
|
|
237
|
+
stopped = true;
|
|
238
|
+
timer?.();
|
|
239
|
+
timer = undefined;
|
|
240
|
+
wake?.();
|
|
241
|
+
wake = undefined;
|
|
242
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
243
|
+
};
|
|
244
|
+
const stop = async () => {
|
|
245
|
+
if (stopped)
|
|
246
|
+
return;
|
|
247
|
+
halt();
|
|
248
|
+
markReady();
|
|
249
|
+
const current = stream;
|
|
250
|
+
stream = undefined;
|
|
251
|
+
await current?.close().catch(() => undefined);
|
|
252
|
+
};
|
|
253
|
+
const onAbort = () => void stop();
|
|
254
|
+
if (options.signal?.aborted) {
|
|
255
|
+
stopped = true;
|
|
256
|
+
markReady();
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
260
|
+
void run().catch((error) => fail(error, {}));
|
|
261
|
+
}
|
|
262
|
+
return {
|
|
263
|
+
ready,
|
|
264
|
+
get resumeToken() {
|
|
265
|
+
return token;
|
|
266
|
+
},
|
|
267
|
+
get stopped() {
|
|
268
|
+
return stopped;
|
|
269
|
+
},
|
|
270
|
+
stop,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=database-changes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-changes.js","sourceRoot":"","sources":["../../src/storage/database-changes.ts"],"names":[],"mappings":"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"}
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export { MongoDocumentStorage, selectorPrefilter, DOCUMENT_STORAGE_FIELDS, TOMBS
|
|
|
7
7
|
export type { MongoDocumentStorageOptions, SelectorPrefilterOptions, StoredForm, DecodeStoredDocumentOptions, StoredDocumentEntry } from "./document-storage.js";
|
|
8
8
|
export { watchStorageChanges, storageChangeOf } from "./storage-hints.js";
|
|
9
9
|
export type { StorageChange, StorageChangeHint, StorageChangesWatch, StorageHintPublisher, WatchStorageChangesOptions } from "./storage-hints.js";
|
|
10
|
+
export { watchDatabaseChanges } from "./database-changes.js";
|
|
11
|
+
export type { DatabaseChangesWatch, WatchDatabaseChangesOptions } from "./database-changes.js";
|
|
10
12
|
export { BLOCKED_PIPELINE_OPERATORS, ALLOWED_PIPELINE_STAGES, DEFAULT_PIPELINE_LIMITS, assertNoBlockedOperators, boundPipeline, cutResults, isTimeLimitError, scopePipeline, } from "./pipeline-scope.js";
|
|
11
13
|
export type { PipelineLimits, PipelineScope } from "./pipeline-scope.js";
|
|
12
14
|
export { ViewMaterializer, identityPartition, defaultStorageRowId, partitionTargetId, viewFilter, VIEW_GENERATION_FIELD, VIEW_HASH_FIELD } from "./materializer.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,UAAU,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjK,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,UAAU,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjK,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAElJ,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,YAAY,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,UAAU,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpK,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE3N,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/storage/index.js
CHANGED
|
@@ -6,6 +6,8 @@ export { MongoStorage } from "./mongo-storage.js";
|
|
|
6
6
|
export { MongoDocumentStorage, selectorPrefilter, DOCUMENT_STORAGE_FIELDS, TOMBSTONE_FIELD, DEFAULT_STORED_FORM, decodeStoredDocument, versionOfStored, } from "./document-storage.js";
|
|
7
7
|
// The change hints of a storage collection from its change stream (roadmap CLI-77)
|
|
8
8
|
export { watchStorageChanges, storageChangeOf } from "./storage-hints.js";
|
|
9
|
+
// One change watcher for a whole database, with resume and backoff (roadmap CLI-88)
|
|
10
|
+
export { watchDatabaseChanges } from "./database-changes.js";
|
|
9
11
|
export { BLOCKED_PIPELINE_OPERATORS, ALLOWED_PIPELINE_STAGES, DEFAULT_PIPELINE_LIMITS, assertNoBlockedOperators, boundPipeline, cutResults, isTimeLimitError, scopePipeline, } from "./pipeline-scope.js";
|
|
10
12
|
// Materialized views driven by change streams (Graph's split plan, P4)
|
|
11
13
|
export { ViewMaterializer, identityPartition, defaultStorageRowId, partitionTargetId, viewFilter, VIEW_GENERATION_FIELD, VIEW_HASH_FIELD } from "./materializer.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,0EAA0E;AAC1E,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B,mFAAmF;AACnF,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,uEAAuE;AACvE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,UAAU,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpK,6GAA6G;AAC7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,0EAA0E;AAC1E,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B,mFAAmF;AACnF,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1E,oFAAoF;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,uEAAuE;AACvE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,UAAU,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpK,6GAA6G;AAC7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
* `close()`. A host composes them with no adapter. The timers come from the injected clock.
|
|
54
54
|
*/
|
|
55
55
|
import { ObjectId, type Db, type Document } from "mongodb";
|
|
56
|
-
import { type Clock, type Duration } from "@procedures/client";
|
|
56
|
+
import { type Clock, type Duration, type Logger } from "@procedures/client";
|
|
57
57
|
import { MongoDocumentStorage, type StoredForm } from "./document-storage.js";
|
|
58
58
|
import type { StorageHintPublisher } from "./storage-hints.js";
|
|
59
59
|
/** The definition of a view, as a document of the views collection. */
|
|
@@ -122,7 +122,16 @@ export interface ViewMaterializerOptions {
|
|
|
122
122
|
maxTime?: Duration | undefined;
|
|
123
123
|
/** The most rows of the result of a view (default 100000). A larger result is an error of the view. */
|
|
124
124
|
maxRows?: number | undefined;
|
|
125
|
-
/**
|
|
125
|
+
/**
|
|
126
|
+
* The logger of the materializer (CLI-88). The fields of each line hold its context: the view, the
|
|
127
|
+
* partition, the collection, the error and the delay. When both are set, `logger` wins over `log`.
|
|
128
|
+
* @default the console, with the prefix `[materializer]`
|
|
129
|
+
*/
|
|
130
|
+
logger?: Logger | undefined;
|
|
131
|
+
/**
|
|
132
|
+
* The log function of each line, with the context in the text.
|
|
133
|
+
* @deprecated Use `logger`. Without a `logger`, the materializer still uses `log`.
|
|
134
|
+
*/
|
|
126
135
|
log?: ((level: "info" | "warn" | "error", message: string) => void) | undefined;
|
|
127
136
|
/** The clock of the timers (default the clock of the platform). A test gives a fake clock. The timers do not keep a process alive. */
|
|
128
137
|
clock?: Clock | undefined;
|
|
@@ -324,6 +333,7 @@ export declare class ViewMaterializer {
|
|
|
324
333
|
private storageTargetOf;
|
|
325
334
|
/** The target in a stored form of a collection at this time, or undefined. The function of `storageTargets` runs at each call. */
|
|
326
335
|
private storageTargetFor;
|
|
336
|
+
/** This method writes one line: to `logger` with the fields, else to the old `log` with the text, else to the console with the text. */
|
|
327
337
|
private log;
|
|
328
338
|
/**
|
|
329
339
|
* The guard of a pipeline of a view. A target of another view counts only in its current
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"materializer.d.ts","sourceRoot":"","sources":["../../src/storage/materializer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AAIH,OAAO,EAAQ,QAAQ,EAAsF,KAAK,EAAE,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AACrJ,OAAO,
|
|
1
|
+
{"version":3,"file":"materializer.d.ts","sourceRoot":"","sources":["../../src/storage/materializer.ts"],"names":[],"mappings":"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"}
|