@fluidframework/container-loader 2.0.0-rc.2.0.2 → 2.0.0-rc.3.0.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 +33 -0
- package/api-report/container-loader.api.md +13 -13
- package/dist/attachment.d.ts +6 -9
- package/dist/attachment.d.ts.map +1 -1
- package/dist/attachment.js +5 -5
- package/dist/attachment.js.map +1 -1
- package/dist/audience.d.ts +1 -1
- package/dist/audience.d.ts.map +1 -1
- package/dist/audience.js +4 -4
- package/dist/audience.js.map +1 -1
- package/dist/catchUpMonitor.d.ts +1 -1
- package/dist/catchUpMonitor.d.ts.map +1 -1
- package/dist/catchUpMonitor.js +2 -2
- package/dist/catchUpMonitor.js.map +1 -1
- package/dist/connectionManager.d.ts +4 -4
- package/dist/connectionManager.d.ts.map +1 -1
- package/dist/connectionManager.js +48 -43
- package/dist/connectionManager.js.map +1 -1
- package/dist/connectionStateHandler.d.ts +3 -3
- package/dist/connectionStateHandler.d.ts.map +1 -1
- package/dist/connectionStateHandler.js +27 -27
- package/dist/connectionStateHandler.js.map +1 -1
- package/dist/container.d.ts +9 -46
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +105 -116
- package/dist/container.js.map +1 -1
- package/dist/containerContext.d.ts +19 -7
- package/dist/containerContext.d.ts.map +1 -1
- package/dist/containerContext.js +7 -2
- package/dist/containerContext.js.map +1 -1
- package/dist/containerStorageAdapter.d.ts +3 -3
- package/dist/containerStorageAdapter.d.ts.map +1 -1
- package/dist/containerStorageAdapter.js +6 -6
- package/dist/containerStorageAdapter.js.map +1 -1
- package/dist/contracts.d.ts +4 -3
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +2 -2
- package/dist/contracts.js.map +1 -1
- package/dist/debugLogger.d.ts +2 -1
- package/dist/debugLogger.d.ts.map +1 -1
- package/dist/debugLogger.js +4 -4
- package/dist/debugLogger.js.map +1 -1
- package/dist/deltaManager.d.ts +11 -7
- package/dist/deltaManager.d.ts.map +1 -1
- package/dist/deltaManager.js +53 -50
- package/dist/deltaManager.js.map +1 -1
- package/dist/deltaQueue.d.ts +1 -1
- package/dist/deltaQueue.d.ts.map +1 -1
- package/dist/deltaQueue.js +5 -5
- package/dist/deltaQueue.js.map +1 -1
- package/dist/error.d.ts +3 -2
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +5 -5
- package/dist/error.js.map +1 -1
- package/dist/legacy.d.ts +29 -0
- package/dist/loader.d.ts +4 -4
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +23 -23
- package/dist/loader.js.map +1 -1
- package/dist/location-redirection-utilities/resolveWithLocationRedirection.d.ts +2 -2
- package/dist/location-redirection-utilities/resolveWithLocationRedirection.d.ts.map +1 -1
- package/dist/location-redirection-utilities/resolveWithLocationRedirection.js +2 -2
- package/dist/location-redirection-utilities/resolveWithLocationRedirection.js.map +1 -1
- package/dist/noopHeuristic.d.ts +1 -1
- package/dist/noopHeuristic.d.ts.map +1 -1
- package/dist/noopHeuristic.js +6 -6
- package/dist/noopHeuristic.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/protocol.d.ts +1 -1
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +2 -2
- package/dist/protocol.js.map +1 -1
- package/dist/protocolTreeDocumentStorageService.d.ts +4 -4
- package/dist/protocolTreeDocumentStorageService.d.ts.map +1 -1
- package/dist/protocolTreeDocumentStorageService.js.map +1 -1
- package/dist/public.d.ts +14 -0
- package/dist/quorum.d.ts +1 -1
- package/dist/quorum.d.ts.map +1 -1
- package/dist/quorum.js +4 -0
- package/dist/quorum.js.map +1 -1
- package/dist/retriableDocumentStorageService.d.ts +2 -2
- package/dist/retriableDocumentStorageService.d.ts.map +1 -1
- package/dist/retriableDocumentStorageService.js +7 -7
- package/dist/retriableDocumentStorageService.js.map +1 -1
- package/dist/serializedStateManager.d.ts +86 -16
- package/dist/serializedStateManager.d.ts.map +1 -1
- package/dist/serializedStateManager.js +182 -82
- package/dist/serializedStateManager.js.map +1 -1
- package/dist/utils.d.ts +24 -9
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +82 -25
- package/dist/utils.js.map +1 -1
- package/internal.d.ts +11 -0
- package/legacy.d.ts +11 -0
- package/lib/attachment.d.ts +6 -9
- package/lib/attachment.d.ts.map +1 -1
- package/lib/attachment.js +1 -1
- package/lib/attachment.js.map +1 -1
- package/lib/audience.d.ts +1 -1
- package/lib/audience.d.ts.map +1 -1
- package/lib/audience.js +1 -1
- package/lib/audience.js.map +1 -1
- package/lib/catchUpMonitor.d.ts +1 -1
- package/lib/catchUpMonitor.d.ts.map +1 -1
- package/lib/catchUpMonitor.js +1 -1
- package/lib/catchUpMonitor.js.map +1 -1
- package/lib/connectionManager.d.ts +4 -4
- package/lib/connectionManager.d.ts.map +1 -1
- package/lib/connectionManager.js +11 -6
- package/lib/connectionManager.js.map +1 -1
- package/lib/connectionStateHandler.d.ts +3 -3
- package/lib/connectionStateHandler.d.ts.map +1 -1
- package/lib/connectionStateHandler.js +2 -2
- package/lib/connectionStateHandler.js.map +1 -1
- package/lib/container.d.ts +9 -46
- package/lib/container.d.ts.map +1 -1
- package/lib/container.js +37 -48
- package/lib/container.js.map +1 -1
- package/lib/containerContext.d.ts +19 -7
- package/lib/containerContext.d.ts.map +1 -1
- package/lib/containerContext.js +7 -2
- package/lib/containerContext.js.map +1 -1
- package/lib/containerStorageAdapter.d.ts +3 -3
- package/lib/containerStorageAdapter.d.ts.map +1 -1
- package/lib/containerStorageAdapter.js +2 -2
- package/lib/containerStorageAdapter.js.map +1 -1
- package/lib/contracts.d.ts +4 -3
- package/lib/contracts.d.ts.map +1 -1
- package/lib/contracts.js +1 -1
- package/lib/contracts.js.map +1 -1
- package/lib/debugLogger.d.ts +2 -1
- package/lib/debugLogger.d.ts.map +1 -1
- package/lib/debugLogger.js +1 -1
- package/lib/debugLogger.js.map +1 -1
- package/lib/deltaManager.d.ts +11 -7
- package/lib/deltaManager.d.ts.map +1 -1
- package/lib/deltaManager.js +13 -10
- package/lib/deltaManager.js.map +1 -1
- package/lib/deltaQueue.d.ts +1 -1
- package/lib/deltaQueue.d.ts.map +1 -1
- package/lib/deltaQueue.js +2 -2
- package/lib/deltaQueue.js.map +1 -1
- package/lib/error.d.ts +3 -2
- package/lib/error.d.ts.map +1 -1
- package/lib/error.js +2 -2
- package/lib/error.js.map +1 -1
- package/lib/legacy.d.ts +29 -0
- package/lib/loader.d.ts +4 -4
- package/lib/loader.d.ts.map +1 -1
- package/lib/loader.js +4 -4
- package/lib/loader.js.map +1 -1
- package/lib/location-redirection-utilities/resolveWithLocationRedirection.d.ts +2 -2
- package/lib/location-redirection-utilities/resolveWithLocationRedirection.d.ts.map +1 -1
- package/lib/location-redirection-utilities/resolveWithLocationRedirection.js +2 -2
- package/lib/location-redirection-utilities/resolveWithLocationRedirection.js.map +1 -1
- package/lib/noopHeuristic.d.ts +1 -1
- package/lib/noopHeuristic.d.ts.map +1 -1
- package/lib/noopHeuristic.js +2 -2
- package/lib/noopHeuristic.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/protocol.d.ts +1 -1
- package/lib/protocol.d.ts.map +1 -1
- package/lib/protocol.js +1 -1
- package/lib/protocol.js.map +1 -1
- package/lib/protocolTreeDocumentStorageService.d.ts +4 -4
- package/lib/protocolTreeDocumentStorageService.d.ts.map +1 -1
- package/lib/protocolTreeDocumentStorageService.js.map +1 -1
- package/lib/public.d.ts +14 -0
- package/lib/quorum.d.ts +1 -1
- package/lib/quorum.d.ts.map +1 -1
- package/lib/quorum.js +4 -0
- package/lib/quorum.js.map +1 -1
- package/lib/retriableDocumentStorageService.d.ts +2 -2
- package/lib/retriableDocumentStorageService.d.ts.map +1 -1
- package/lib/retriableDocumentStorageService.js +3 -3
- package/lib/retriableDocumentStorageService.js.map +1 -1
- package/lib/serializedStateManager.d.ts +86 -16
- package/lib/serializedStateManager.d.ts.map +1 -1
- package/lib/serializedStateManager.js +174 -77
- package/lib/serializedStateManager.js.map +1 -1
- package/lib/utils.d.ts +24 -9
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +69 -15
- package/lib/utils.js.map +1 -1
- package/package.json +37 -58
- package/src/attachment.ts +10 -8
- package/src/audience.ts +3 -2
- package/src/catchUpMonitor.ts +2 -2
- package/src/connectionManager.ts +27 -20
- package/src/connectionStateHandler.ts +7 -7
- package/src/container.ts +90 -143
- package/src/containerContext.ts +22 -12
- package/src/containerStorageAdapter.ts +7 -6
- package/src/contracts.ts +4 -5
- package/src/debugLogger.ts +3 -4
- package/src/deltaManager.ts +40 -30
- package/src/deltaQueue.ts +2 -2
- package/src/error.ts +5 -4
- package/src/loader.ts +25 -23
- package/src/location-redirection-utilities/resolveWithLocationRedirection.ts +4 -4
- package/src/noopHeuristic.ts +3 -3
- package/src/packageVersion.ts +1 -1
- package/src/protocol.ts +2 -2
- package/src/protocolTreeDocumentStorageService.ts +4 -1
- package/src/quorum.ts +2 -1
- package/src/retriableDocumentStorageService.ts +6 -5
- package/src/serializedStateManager.ts +299 -111
- package/src/utils.ts +103 -24
- package/api-extractor-cjs.json +0 -8
- package/dist/container-loader-alpha.d.ts +0 -275
- package/dist/container-loader-beta.d.ts +0 -101
- package/dist/container-loader-public.d.ts +0 -101
- package/dist/container-loader-untrimmed.d.ts +0 -331
- package/lib/container-loader-alpha.d.ts +0 -275
- package/lib/container-loader-beta.d.ts +0 -101
- package/lib/container-loader-public.d.ts +0 -101
- package/lib/container-loader-untrimmed.d.ts +0 -331
- package/lib/test/attachment.spec.js +0 -380
- package/lib/test/attachment.spec.js.map +0 -1
- package/lib/test/catchUpMonitor.spec.js +0 -88
- package/lib/test/catchUpMonitor.spec.js.map +0 -1
- package/lib/test/connectionManager.spec.js +0 -201
- package/lib/test/connectionManager.spec.js.map +0 -1
- package/lib/test/connectionStateHandler.spec.js +0 -555
- package/lib/test/connectionStateHandler.spec.js.map +0 -1
- package/lib/test/container.spec.js +0 -64
- package/lib/test/container.spec.js.map +0 -1
- package/lib/test/deltaManager.spec.js +0 -405
- package/lib/test/deltaManager.spec.js.map +0 -1
- package/lib/test/loader.spec.js +0 -212
- package/lib/test/loader.spec.js.map +0 -1
- package/lib/test/locationRedirectionTests.spec.js +0 -44
- package/lib/test/locationRedirectionTests.spec.js.map +0 -1
- package/lib/test/serializedStateManager.spec.js +0 -148
- package/lib/test/serializedStateManager.spec.js.map +0 -1
- package/lib/test/snapshotConversionTest.spec.js +0 -79
- package/lib/test/snapshotConversionTest.spec.js.map +0 -1
- package/lib/test/types/validateContainerLoaderPrevious.generated.js +0 -38
- package/lib/test/types/validateContainerLoaderPrevious.generated.js.map +0 -1
- package/lib/test/utils.spec.js +0 -31
- package/lib/test/utils.spec.js.map +0 -1
- /package/{dist → lib}/tsdoc-metadata.json +0 -0
package/dist/deltaManager.js
CHANGED
|
@@ -5,27 +5,27 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.DeltaManager = void 0;
|
|
8
|
-
const uuid_1 = require("uuid");
|
|
9
8
|
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
10
|
-
const
|
|
11
|
-
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
9
|
+
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
12
10
|
const driver_definitions_1 = require("@fluidframework/driver-definitions");
|
|
11
|
+
const internal_2 = require("@fluidframework/driver-utils/internal");
|
|
13
12
|
const protocol_definitions_1 = require("@fluidframework/protocol-definitions");
|
|
14
|
-
const
|
|
13
|
+
const internal_3 = require("@fluidframework/telemetry-utils/internal");
|
|
14
|
+
const uuid_1 = require("uuid");
|
|
15
15
|
const deltaQueue_js_1 = require("./deltaQueue.js");
|
|
16
16
|
const error_js_1 = require("./error.js");
|
|
17
17
|
/**
|
|
18
18
|
* Determines if message was sent by client, not service
|
|
19
19
|
*/
|
|
20
20
|
function isClientMessage(message) {
|
|
21
|
-
if ((0,
|
|
21
|
+
if ((0, internal_2.isRuntimeMessage)(message)) {
|
|
22
22
|
return true;
|
|
23
23
|
}
|
|
24
24
|
switch (message.type) {
|
|
25
25
|
case protocol_definitions_1.MessageType.Propose:
|
|
26
26
|
case protocol_definitions_1.MessageType.Reject:
|
|
27
27
|
case protocol_definitions_1.MessageType.NoOp:
|
|
28
|
-
case
|
|
28
|
+
case internal_2.MessageType2.Accept:
|
|
29
29
|
case protocol_definitions_1.MessageType.Summarize:
|
|
30
30
|
return true;
|
|
31
31
|
default:
|
|
@@ -90,7 +90,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
90
90
|
*/
|
|
91
91
|
get hasCheckpointSequenceNumber() {
|
|
92
92
|
// Valid to be called only if we have active connection.
|
|
93
|
-
(0,
|
|
93
|
+
(0, internal_1.assert)(this.connectionManager.connected, 0x0df /* "Missing active connection" */);
|
|
94
94
|
return this._checkpointSequenceNumber !== undefined;
|
|
95
95
|
}
|
|
96
96
|
// Forwarding connection manager properties / IDeltaManager implementation
|
|
@@ -129,7 +129,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
129
129
|
if (message === undefined) {
|
|
130
130
|
return -1;
|
|
131
131
|
}
|
|
132
|
-
(0,
|
|
132
|
+
(0, internal_1.assert)(isClientMessage(message), 0x419 /* client sends non-client message */);
|
|
133
133
|
if (contents !== undefined) {
|
|
134
134
|
this.opsSize += contents.length;
|
|
135
135
|
}
|
|
@@ -155,14 +155,14 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
155
155
|
// The prepareFlush event allows listeners to append metadata to the batch prior to submission.
|
|
156
156
|
this.emit("prepareSend", batch);
|
|
157
157
|
if (batch.length === 1) {
|
|
158
|
-
(0,
|
|
158
|
+
(0, internal_1.assert)(batch[0].metadata?.batch === undefined, 0x3c9 /* no batch markup on single message */);
|
|
159
159
|
}
|
|
160
160
|
else {
|
|
161
|
-
(0,
|
|
162
|
-
(0,
|
|
161
|
+
(0, internal_1.assert)(batch[0].metadata?.batch === true, 0x3ca /* no start batch markup */);
|
|
162
|
+
(0, internal_1.assert)(batch[batch.length - 1].metadata?.batch === false, 0x3cb /* no end batch markup */);
|
|
163
163
|
}
|
|
164
164
|
this.connectionManager.sendMessages(batch);
|
|
165
|
-
(0,
|
|
165
|
+
(0, internal_1.assert)(this.messageBuffer.length === 0, 0x3cc /* reentrancy */);
|
|
166
166
|
}
|
|
167
167
|
get connectionProps() {
|
|
168
168
|
return {
|
|
@@ -179,7 +179,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
179
179
|
* @param event - Event to log.
|
|
180
180
|
*/
|
|
181
181
|
logConnectionIssue(event) {
|
|
182
|
-
(0,
|
|
182
|
+
(0, internal_1.assert)(this.connectionManager.connected, 0x238 /* "called only in connected state" */);
|
|
183
183
|
const pendingSorted = this.pending.sort((a, b) => a.sequenceNumber - b.sequenceNumber);
|
|
184
184
|
this.logger.sendTelemetryEvent({
|
|
185
185
|
...event,
|
|
@@ -246,7 +246,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
246
246
|
}
|
|
247
247
|
catch (error) {
|
|
248
248
|
this.logger.sendErrorEvent({ eventName: "EnqueueMessages_Exception" }, error);
|
|
249
|
-
this.close((0,
|
|
249
|
+
this.close((0, internal_3.normalizeError)(error));
|
|
250
250
|
}
|
|
251
251
|
},
|
|
252
252
|
signalHandler: (signals) => {
|
|
@@ -260,7 +260,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
260
260
|
connectHandler: (connection) => this.connectHandler(connection),
|
|
261
261
|
pongHandler: (latency) => this.emit("pong", latency),
|
|
262
262
|
readonlyChangeHandler: (readonly, readonlyConnectionReason) => {
|
|
263
|
-
(0,
|
|
263
|
+
(0, internal_3.safeRaiseEvent)(this, this.logger, "readonly", readonly, readonlyConnectionReason);
|
|
264
264
|
},
|
|
265
265
|
establishConnectionHandler: (reason) => this.establishingConnection(reason),
|
|
266
266
|
cancelConnectionHandler: (reason) => this.cancelEstablishingConnection(reason),
|
|
@@ -270,7 +270,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
270
270
|
this.processInboundMessage(op);
|
|
271
271
|
});
|
|
272
272
|
this._inbound.on("error", (error) => {
|
|
273
|
-
this.close(
|
|
273
|
+
this.close(internal_3.DataProcessingError.wrapIfUnrecognized(error, "deltaManagerInboundErrorHandler", this.lastMessage));
|
|
274
274
|
});
|
|
275
275
|
// Inbound signal queue
|
|
276
276
|
this._inboundSignal = new deltaQueue_js_1.DeltaQueue((message) => {
|
|
@@ -283,7 +283,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
283
283
|
});
|
|
284
284
|
});
|
|
285
285
|
this._inboundSignal.on("error", (error) => {
|
|
286
|
-
this.close((0,
|
|
286
|
+
this.close((0, internal_3.normalizeError)(error));
|
|
287
287
|
});
|
|
288
288
|
// Initially, all queues are created paused.
|
|
289
289
|
// - outbound is flipped back and forth in setupNewSuccessfulConnection / disconnectFromDeltaStream
|
|
@@ -310,7 +310,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
310
310
|
// but it's safe to assume (until better design is put into place) that batches should not exist
|
|
311
311
|
// across multiple connections. Right now we assume runtime will not submit any ops in disconnected
|
|
312
312
|
// state. As requirements change, so should these checks.
|
|
313
|
-
(0,
|
|
313
|
+
(0, internal_1.assert)(this.messageBuffer.length === 0, 0x0e9 /* "messageBuffer is not empty on new connection" */);
|
|
314
314
|
this.opsSize = 0;
|
|
315
315
|
this.noOpCount = 0;
|
|
316
316
|
this.emit("connect", connection, checkpointSequenceNumber !== undefined
|
|
@@ -333,24 +333,27 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
333
333
|
}
|
|
334
334
|
/**
|
|
335
335
|
* Sets the sequence number from which inbound messages should be returned
|
|
336
|
+
* @param snapshotSequenceNumber - The sequence number of the snapshot at which the document loaded from.
|
|
337
|
+
* @param lastProcessedSequenceNumber - The last processed sequence number, for offline, it should be greater than the sequence number.
|
|
338
|
+
* Setting lastProcessedSequenceNumber allows the DeltaManager to skip downloading and processing ops that have already been processed.
|
|
336
339
|
*/
|
|
337
|
-
async attachOpHandler(minSequenceNumber,
|
|
338
|
-
this.initSequenceNumber =
|
|
339
|
-
this.lastProcessedSequenceNumber =
|
|
340
|
+
async attachOpHandler(minSequenceNumber, snapshotSequenceNumber, handler, prefetchType = "none", lastProcessedSequenceNumber = snapshotSequenceNumber) {
|
|
341
|
+
this.initSequenceNumber = snapshotSequenceNumber;
|
|
342
|
+
this.lastProcessedSequenceNumber = lastProcessedSequenceNumber;
|
|
340
343
|
this.minSequenceNumber = minSequenceNumber;
|
|
341
|
-
this.lastQueuedSequenceNumber =
|
|
342
|
-
this.lastObservedSeqNumber =
|
|
344
|
+
this.lastQueuedSequenceNumber = lastProcessedSequenceNumber;
|
|
345
|
+
this.lastObservedSeqNumber = lastProcessedSequenceNumber;
|
|
343
346
|
// We will use same check in other places to make sure all the seq number above are set properly.
|
|
344
|
-
(0,
|
|
347
|
+
(0, internal_1.assert)(this.handler === undefined, 0x0e2 /* "DeltaManager already has attached op handler!" */);
|
|
345
348
|
this.handler = handler;
|
|
346
349
|
// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
|
|
347
|
-
(0,
|
|
350
|
+
(0, internal_1.assert)(!!this.handler, 0x0e3 /* "Newly set op handler is null/undefined!" */);
|
|
348
351
|
// There should be no pending fetch!
|
|
349
352
|
// This API is called right after attachOpHandler by Container.load().
|
|
350
353
|
// We might have connection already and it might have called fetchMissingDeltas() from
|
|
351
354
|
// setupNewSuccessfulConnection. But it should do nothing, because there is no way to fetch ops before
|
|
352
355
|
// we know snapshot sequence number that is set in attachOpHandler. So all such calls should be noop.
|
|
353
|
-
(0,
|
|
356
|
+
(0, internal_1.assert)(this.fetchReason === undefined, 0x268 /* "There can't be pending fetch that early in boot sequence!" */);
|
|
354
357
|
if (this._closed) {
|
|
355
358
|
return;
|
|
356
359
|
}
|
|
@@ -369,7 +372,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
369
372
|
}
|
|
370
373
|
}
|
|
371
374
|
// Ensure there is no need to call this.processPendingOps() at the end of boot sequence
|
|
372
|
-
(0,
|
|
375
|
+
(0, internal_1.assert)(this.fetchReason !== undefined || this.pending.length === 0, 0x269 /* "pending ops are not dropped" */);
|
|
373
376
|
}
|
|
374
377
|
connect(args) {
|
|
375
378
|
const fetchOpsFromStorage = args.fetchOpsFromStorage ?? true;
|
|
@@ -432,7 +435,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
432
435
|
const controller = new AbortController();
|
|
433
436
|
let opsFromFetch = false;
|
|
434
437
|
const opListener = (op) => {
|
|
435
|
-
(0,
|
|
438
|
+
(0, internal_1.assert)(op.sequenceNumber === this.lastQueuedSequenceNumber, 0x23a /* "seq#'s" */);
|
|
436
439
|
// Ops that are coming from this request should not cancel itself.
|
|
437
440
|
// This is useless for known ranges (to is defined) as it means request is over either way.
|
|
438
441
|
// And it will cancel unbound request too early, not allowing us to learn where the end of the file is.
|
|
@@ -443,7 +446,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
443
446
|
};
|
|
444
447
|
try {
|
|
445
448
|
this._inbound.on("push", opListener);
|
|
446
|
-
(0,
|
|
449
|
+
(0, internal_1.assert)(this.closeAbortController.signal.onabort === null, 0x1e8 /* "reentrancy" */);
|
|
447
450
|
this.closeAbortController.signal.onabort = () => controller.abort(this.closeAbortController.signal.reason);
|
|
448
451
|
const stream = this.deltaStorage.fetchMessages(from, // inclusive
|
|
449
452
|
to, // exclusive
|
|
@@ -473,7 +476,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
473
476
|
}
|
|
474
477
|
this.closeAbortController.signal.onabort = null;
|
|
475
478
|
this._inbound.off("push", opListener);
|
|
476
|
-
(0,
|
|
479
|
+
(0, internal_1.assert)(!opsFromFetch, 0x289 /* "logic error" */);
|
|
477
480
|
}
|
|
478
481
|
}
|
|
479
482
|
/**
|
|
@@ -505,8 +508,8 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
505
508
|
if (this._disposed) {
|
|
506
509
|
return;
|
|
507
510
|
}
|
|
508
|
-
if (error !== undefined && !(0,
|
|
509
|
-
throw new
|
|
511
|
+
if (error !== undefined && !(0, internal_3.isFluidError)(error)) {
|
|
512
|
+
throw new internal_3.UsageError("Error must be a Fluid error");
|
|
510
513
|
}
|
|
511
514
|
this._disposed = true;
|
|
512
515
|
this._closed = true; // We consider "disposed" as a further state than "closed"
|
|
@@ -579,7 +582,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
579
582
|
// It's responsibility of
|
|
580
583
|
// - attachOpHandler()
|
|
581
584
|
// - fetchMissingDeltas() after it's done with querying storage
|
|
582
|
-
(0,
|
|
585
|
+
(0, internal_1.assert)(this.pending.length === 0 || this.fetchReason !== undefined, 0x1e9 /* "Pending ops" */);
|
|
583
586
|
if (messages.length === 0) {
|
|
584
587
|
return;
|
|
585
588
|
}
|
|
@@ -645,7 +648,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
645
648
|
}
|
|
646
649
|
this.updateLatestKnownOpSeqNumber(messages[messages.length - 1].sequenceNumber);
|
|
647
650
|
const n = this.previouslyProcessedMessage?.sequenceNumber;
|
|
648
|
-
(0,
|
|
651
|
+
(0, internal_1.assert)(n === undefined || n === this.lastQueuedSequenceNumber, 0x0ec /* "Unexpected value for previously processed message's sequence number" */);
|
|
649
652
|
for (const message of messages) {
|
|
650
653
|
// Check that the messages are arriving in the expected order
|
|
651
654
|
if (message.sequenceNumber <= this.lastQueuedSequenceNumber) {
|
|
@@ -655,7 +658,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
655
658
|
const message1 = this.comparableMessagePayload(this.previouslyProcessedMessage);
|
|
656
659
|
const message2 = this.comparableMessagePayload(message);
|
|
657
660
|
if (message1 !== message2) {
|
|
658
|
-
const error = new
|
|
661
|
+
const error = new internal_2.NonRetryableError(
|
|
659
662
|
// This looks like a data corruption but the culprit was that the file was overwritten
|
|
660
663
|
// in storage. See PR #5882.
|
|
661
664
|
// Likely to be an issue with Fluid Services. Content does not match previous client
|
|
@@ -692,18 +695,18 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
692
695
|
}
|
|
693
696
|
processInboundMessage(message) {
|
|
694
697
|
const startTime = Date.now();
|
|
695
|
-
(0,
|
|
698
|
+
(0, internal_1.assert)(!this.currentlyProcessingOps, 0x3af /* Already processing ops. */);
|
|
696
699
|
this.currentlyProcessingOps = true;
|
|
697
700
|
this.lastProcessedMessage = message;
|
|
698
701
|
const isString = typeof message.clientId === "string";
|
|
699
|
-
(0,
|
|
702
|
+
(0, internal_1.assert)(message.clientId === null || isString, 0x41a /* undefined or string */);
|
|
700
703
|
// All client messages are coming from some client, and should have clientId,
|
|
701
704
|
// and non-client message should not have clientId. But, there are two exceptions:
|
|
702
705
|
// 1. (Legacy) We can see message.type === "attach" or "chunkedOp" for legacy files before RTM
|
|
703
706
|
// 2. Non-immediate noops (contents: null) can be sent by service without clientId
|
|
704
707
|
if (!isString && isClientMessage(message) && message.type !== protocol_definitions_1.MessageType.NoOp) {
|
|
705
|
-
throw new
|
|
706
|
-
...(0,
|
|
708
|
+
throw new internal_3.DataCorruptionError("Mismatch in clientId", {
|
|
709
|
+
...(0, internal_3.extractSafePropertiesFromMessage)(message),
|
|
707
710
|
messageType: message.type,
|
|
708
711
|
});
|
|
709
712
|
}
|
|
@@ -731,8 +734,8 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
731
734
|
// Watch the minimum sequence number and be ready to update as needed
|
|
732
735
|
if (this.minSequenceNumber > message.minimumSequenceNumber) {
|
|
733
736
|
// pre-0.58 error message: msnMovesBackwards
|
|
734
|
-
throw new
|
|
735
|
-
...(0,
|
|
737
|
+
throw new internal_3.DataCorruptionError("Found a lower minimumSequenceNumber (msn) than previously recorded", {
|
|
738
|
+
...(0, internal_3.extractSafePropertiesFromMessage)(message),
|
|
736
739
|
clientId: this.connectionManager.clientId,
|
|
737
740
|
});
|
|
738
741
|
}
|
|
@@ -741,19 +744,19 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
741
744
|
// System ops (when no clients are connected) are the only ops where equation is possible.
|
|
742
745
|
const diff = message.sequenceNumber - message.minimumSequenceNumber;
|
|
743
746
|
if (diff < 0 || (diff === 0 && message.clientId !== null)) {
|
|
744
|
-
throw new
|
|
747
|
+
throw new internal_3.DataCorruptionError("MSN has to be lower than sequence #", (0, internal_3.extractSafePropertiesFromMessage)(message));
|
|
745
748
|
}
|
|
746
749
|
this.minSequenceNumber = message.minimumSequenceNumber;
|
|
747
750
|
if (message.sequenceNumber !== this.lastProcessedSequenceNumber + 1) {
|
|
748
751
|
// pre-0.58 error message: nonSequentialSequenceNumber
|
|
749
|
-
throw new
|
|
750
|
-
...(0,
|
|
752
|
+
throw new internal_3.DataCorruptionError("Found a non-Sequential sequenceNumber", {
|
|
753
|
+
...(0, internal_3.extractSafePropertiesFromMessage)(message),
|
|
751
754
|
clientId: this.connectionManager.clientId,
|
|
752
755
|
});
|
|
753
756
|
}
|
|
754
757
|
this.lastProcessedSequenceNumber = message.sequenceNumber;
|
|
755
758
|
// a bunch of code assumes that this is true
|
|
756
|
-
(0,
|
|
759
|
+
(0, internal_1.assert)(this.lastProcessedSequenceNumber <= this.lastObservedSeqNumber, 0x267 /* "lastObservedSeqNumber should be updated first" */);
|
|
757
760
|
if (this.handler === undefined) {
|
|
758
761
|
throw new Error("Attempted to process an inbound message without a handler attached");
|
|
759
762
|
}
|
|
@@ -789,7 +792,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
789
792
|
}
|
|
790
793
|
if (this.handler === undefined) {
|
|
791
794
|
// We do not poses yet any information
|
|
792
|
-
(0,
|
|
795
|
+
(0, internal_1.assert)(this.lastQueuedSequenceNumber === 0, 0x26b /* "initial state" */);
|
|
793
796
|
return;
|
|
794
797
|
}
|
|
795
798
|
try {
|
|
@@ -801,8 +804,8 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
801
804
|
// Knowing about this mechanism, we could ask for op we already observed to increase validation.
|
|
802
805
|
// This is especially useful when coming out of offline mode or loading from
|
|
803
806
|
// very old cached (by client / driver) snapshot.
|
|
804
|
-
(0,
|
|
805
|
-
(0,
|
|
807
|
+
(0, internal_1.assert)(n === this.lastQueuedSequenceNumber, 0x0f2 /* "previouslyProcessedMessage" */);
|
|
808
|
+
(0, internal_1.assert)(from > 1, 0x0f3 /* "not positive" */);
|
|
806
809
|
from--;
|
|
807
810
|
}
|
|
808
811
|
const fetchReason = `${reason}_fetch`;
|
|
@@ -814,7 +817,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
814
817
|
}
|
|
815
818
|
catch (error) {
|
|
816
819
|
this.logger.sendErrorEvent({ eventName: "GetDeltas_Exception" }, error);
|
|
817
|
-
this.close((0,
|
|
820
|
+
this.close((0, internal_3.normalizeError)(error));
|
|
818
821
|
}
|
|
819
822
|
finally {
|
|
820
823
|
this.refreshDelayInfo(this.deltaStorageDelayId);
|
|
@@ -829,7 +832,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
829
832
|
if (this._closed) {
|
|
830
833
|
return;
|
|
831
834
|
}
|
|
832
|
-
(0,
|
|
835
|
+
(0, internal_1.assert)(this.handler !== undefined, 0x26c /* "handler should be installed" */);
|
|
833
836
|
const pendingSorted = this.pending.sort((a, b) => a.sequenceNumber - b.sequenceNumber);
|
|
834
837
|
this.pending = [];
|
|
835
838
|
// Given that we do not track where these ops came from any more, it's not very
|