@fluidframework/container-loader 2.0.0-dev-rc.3.0.0.250606 → 2.0.0-dev-rc.3.0.0.253463
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/api-report/container-loader.api.md +11 -11
- package/dist/attachment.d.ts +2 -2
- package/dist/attachment.d.ts.map +1 -1
- package/dist/attachment.js +3 -3
- 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 +2 -2
- package/dist/audience.js.map +1 -1
- package/dist/catchUpMonitor.js +2 -2
- package/dist/catchUpMonitor.js.map +1 -1
- package/dist/connectionManager.d.ts +1 -1
- package/dist/connectionManager.d.ts.map +1 -1
- package/dist/connectionManager.js +41 -41
- package/dist/connectionManager.js.map +1 -1
- package/dist/connectionStateHandler.d.ts.map +1 -1
- package/dist/connectionStateHandler.js +27 -27
- package/dist/connectionStateHandler.js.map +1 -1
- package/dist/container-loader-alpha.d.ts +11 -11
- package/dist/container-loader-beta.d.ts +11 -11
- package/dist/container-loader-public.d.ts +11 -11
- package/dist/container-loader-untrimmed.d.ts +11 -11
- package/dist/container.d.ts +5 -3
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +74 -73
- package/dist/container.js.map +1 -1
- package/dist/containerContext.d.ts +5 -3
- package/dist/containerContext.d.ts.map +1 -1
- package/dist/containerContext.js.map +1 -1
- package/dist/containerStorageAdapter.d.ts +2 -2
- 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 +3 -2
- 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 +3 -2
- package/dist/deltaManager.d.ts.map +1 -1
- package/dist/deltaManager.js +44 -44
- package/dist/deltaManager.js.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/loader.d.ts +2 -2
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +21 -21
- package/dist/loader.js.map +1 -1
- package/dist/location-redirection-utilities/resolveWithLocationRedirection.d.ts +1 -1
- 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.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/quorum.d.ts +1 -1
- package/dist/quorum.d.ts.map +1 -1
- package/dist/quorum.js.map +1 -1
- package/dist/retriableDocumentStorageService.d.ts +1 -1
- 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 +40 -8
- package/dist/serializedStateManager.d.ts.map +1 -1
- package/dist/serializedStateManager.js +113 -20
- package/dist/serializedStateManager.js.map +1 -1
- package/dist/utils.d.ts +2 -2
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +14 -14
- package/dist/utils.js.map +1 -1
- package/lib/attachment.d.ts +2 -2
- 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.js +1 -1
- package/lib/catchUpMonitor.js.map +1 -1
- package/lib/connectionManager.d.ts +1 -1
- package/lib/connectionManager.d.ts.map +1 -1
- package/lib/connectionManager.js +4 -4
- package/lib/connectionManager.js.map +1 -1
- package/lib/connectionStateHandler.d.ts.map +1 -1
- package/lib/connectionStateHandler.js +2 -2
- package/lib/connectionStateHandler.js.map +1 -1
- package/lib/container-loader-alpha.d.ts +11 -11
- package/lib/container-loader-beta.d.ts +11 -11
- package/lib/container-loader-public.d.ts +11 -11
- package/lib/container-loader-untrimmed.d.ts +11 -11
- package/lib/container.d.ts +5 -3
- package/lib/container.d.ts.map +1 -1
- package/lib/container.js +5 -4
- package/lib/container.js.map +1 -1
- package/lib/containerContext.d.ts +5 -3
- package/lib/containerContext.d.ts.map +1 -1
- package/lib/containerContext.js.map +1 -1
- package/lib/containerStorageAdapter.d.ts +2 -2
- 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 +3 -2
- 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 +3 -2
- package/lib/deltaManager.d.ts.map +1 -1
- package/lib/deltaManager.js +4 -4
- package/lib/deltaManager.js.map +1 -1
- package/lib/deltaQueue.js +1 -1
- 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/loader.d.ts +2 -2
- package/lib/loader.d.ts.map +1 -1
- package/lib/loader.js +2 -2
- package/lib/loader.js.map +1 -1
- package/lib/location-redirection-utilities/resolveWithLocationRedirection.d.ts +1 -1
- 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.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/quorum.d.ts +1 -1
- package/lib/quorum.d.ts.map +1 -1
- package/lib/quorum.js.map +1 -1
- package/lib/retriableDocumentStorageService.d.ts +1 -1
- 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 +40 -8
- package/lib/serializedStateManager.d.ts.map +1 -1
- package/lib/serializedStateManager.js +107 -15
- package/lib/serializedStateManager.js.map +1 -1
- package/lib/tsdoc-metadata.json +11 -0
- package/lib/utils.d.ts +2 -2
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +3 -3
- package/lib/utils.js.map +1 -1
- package/package.json +13 -25
- package/src/attachment.ts +4 -3
- package/src/audience.ts +2 -2
- package/src/catchUpMonitor.ts +1 -1
- package/src/connectionManager.ts +7 -7
- package/src/connectionStateHandler.ts +4 -4
- package/src/container.ts +14 -12
- package/src/containerContext.ts +8 -5
- package/src/containerStorageAdapter.ts +5 -4
- package/src/contracts.ts +2 -3
- package/src/debugLogger.ts +2 -3
- package/src/deltaManager.ts +14 -8
- package/src/deltaQueue.ts +1 -1
- package/src/error.ts +5 -4
- package/src/loader.ts +5 -4
- package/src/location-redirection-utilities/resolveWithLocationRedirection.ts +3 -3
- package/src/noopHeuristic.ts +2 -2
- package/src/packageVersion.ts +1 -1
- package/src/protocol.ts +2 -2
- package/src/protocolTreeDocumentStorageService.ts +4 -1
- package/src/quorum.ts +1 -1
- package/src/retriableDocumentStorageService.ts +5 -4
- package/src/serializedStateManager.ts +167 -18
- package/src/utils.ts +6 -4
- 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 -151
- 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 -96
- package/lib/test/utils.spec.js.map +0 -1
package/dist/deltaManager.js
CHANGED
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.DeltaManager = void 0;
|
|
8
8
|
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
9
|
-
const
|
|
9
|
+
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
10
10
|
const driver_definitions_1 = require("@fluidframework/driver-definitions");
|
|
11
|
-
const
|
|
11
|
+
const internal_2 = require("@fluidframework/driver-utils/internal");
|
|
12
12
|
const protocol_definitions_1 = require("@fluidframework/protocol-definitions");
|
|
13
|
-
const
|
|
13
|
+
const internal_3 = require("@fluidframework/telemetry-utils/internal");
|
|
14
14
|
const uuid_1 = require("uuid");
|
|
15
15
|
const deltaQueue_js_1 = require("./deltaQueue.js");
|
|
16
16
|
const error_js_1 = require("./error.js");
|
|
@@ -18,14 +18,14 @@ const error_js_1 = require("./error.js");
|
|
|
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
|
|
@@ -341,16 +341,16 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
341
341
|
this.lastQueuedSequenceNumber = sequenceNumber;
|
|
342
342
|
this.lastObservedSeqNumber = sequenceNumber;
|
|
343
343
|
// We will use same check in other places to make sure all the seq number above are set properly.
|
|
344
|
-
(0,
|
|
344
|
+
(0, internal_1.assert)(this.handler === undefined, 0x0e2 /* "DeltaManager already has attached op handler!" */);
|
|
345
345
|
this.handler = handler;
|
|
346
346
|
// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
|
|
347
|
-
(0,
|
|
347
|
+
(0, internal_1.assert)(!!this.handler, 0x0e3 /* "Newly set op handler is null/undefined!" */);
|
|
348
348
|
// There should be no pending fetch!
|
|
349
349
|
// This API is called right after attachOpHandler by Container.load().
|
|
350
350
|
// We might have connection already and it might have called fetchMissingDeltas() from
|
|
351
351
|
// setupNewSuccessfulConnection. But it should do nothing, because there is no way to fetch ops before
|
|
352
352
|
// we know snapshot sequence number that is set in attachOpHandler. So all such calls should be noop.
|
|
353
|
-
(0,
|
|
353
|
+
(0, internal_1.assert)(this.fetchReason === undefined, 0x268 /* "There can't be pending fetch that early in boot sequence!" */);
|
|
354
354
|
if (this._closed) {
|
|
355
355
|
return;
|
|
356
356
|
}
|
|
@@ -369,7 +369,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
369
369
|
}
|
|
370
370
|
}
|
|
371
371
|
// Ensure there is no need to call this.processPendingOps() at the end of boot sequence
|
|
372
|
-
(0,
|
|
372
|
+
(0, internal_1.assert)(this.fetchReason !== undefined || this.pending.length === 0, 0x269 /* "pending ops are not dropped" */);
|
|
373
373
|
}
|
|
374
374
|
connect(args) {
|
|
375
375
|
const fetchOpsFromStorage = args.fetchOpsFromStorage ?? true;
|
|
@@ -432,7 +432,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
432
432
|
const controller = new AbortController();
|
|
433
433
|
let opsFromFetch = false;
|
|
434
434
|
const opListener = (op) => {
|
|
435
|
-
(0,
|
|
435
|
+
(0, internal_1.assert)(op.sequenceNumber === this.lastQueuedSequenceNumber, 0x23a /* "seq#'s" */);
|
|
436
436
|
// Ops that are coming from this request should not cancel itself.
|
|
437
437
|
// This is useless for known ranges (to is defined) as it means request is over either way.
|
|
438
438
|
// And it will cancel unbound request too early, not allowing us to learn where the end of the file is.
|
|
@@ -443,7 +443,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
443
443
|
};
|
|
444
444
|
try {
|
|
445
445
|
this._inbound.on("push", opListener);
|
|
446
|
-
(0,
|
|
446
|
+
(0, internal_1.assert)(this.closeAbortController.signal.onabort === null, 0x1e8 /* "reentrancy" */);
|
|
447
447
|
this.closeAbortController.signal.onabort = () => controller.abort(this.closeAbortController.signal.reason);
|
|
448
448
|
const stream = this.deltaStorage.fetchMessages(from, // inclusive
|
|
449
449
|
to, // exclusive
|
|
@@ -473,7 +473,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
473
473
|
}
|
|
474
474
|
this.closeAbortController.signal.onabort = null;
|
|
475
475
|
this._inbound.off("push", opListener);
|
|
476
|
-
(0,
|
|
476
|
+
(0, internal_1.assert)(!opsFromFetch, 0x289 /* "logic error" */);
|
|
477
477
|
}
|
|
478
478
|
}
|
|
479
479
|
/**
|
|
@@ -505,8 +505,8 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
505
505
|
if (this._disposed) {
|
|
506
506
|
return;
|
|
507
507
|
}
|
|
508
|
-
if (error !== undefined && !(0,
|
|
509
|
-
throw new
|
|
508
|
+
if (error !== undefined && !(0, internal_3.isFluidError)(error)) {
|
|
509
|
+
throw new internal_3.UsageError("Error must be a Fluid error");
|
|
510
510
|
}
|
|
511
511
|
this._disposed = true;
|
|
512
512
|
this._closed = true; // We consider "disposed" as a further state than "closed"
|
|
@@ -579,7 +579,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
579
579
|
// It's responsibility of
|
|
580
580
|
// - attachOpHandler()
|
|
581
581
|
// - fetchMissingDeltas() after it's done with querying storage
|
|
582
|
-
(0,
|
|
582
|
+
(0, internal_1.assert)(this.pending.length === 0 || this.fetchReason !== undefined, 0x1e9 /* "Pending ops" */);
|
|
583
583
|
if (messages.length === 0) {
|
|
584
584
|
return;
|
|
585
585
|
}
|
|
@@ -645,7 +645,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
645
645
|
}
|
|
646
646
|
this.updateLatestKnownOpSeqNumber(messages[messages.length - 1].sequenceNumber);
|
|
647
647
|
const n = this.previouslyProcessedMessage?.sequenceNumber;
|
|
648
|
-
(0,
|
|
648
|
+
(0, internal_1.assert)(n === undefined || n === this.lastQueuedSequenceNumber, 0x0ec /* "Unexpected value for previously processed message's sequence number" */);
|
|
649
649
|
for (const message of messages) {
|
|
650
650
|
// Check that the messages are arriving in the expected order
|
|
651
651
|
if (message.sequenceNumber <= this.lastQueuedSequenceNumber) {
|
|
@@ -655,7 +655,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
655
655
|
const message1 = this.comparableMessagePayload(this.previouslyProcessedMessage);
|
|
656
656
|
const message2 = this.comparableMessagePayload(message);
|
|
657
657
|
if (message1 !== message2) {
|
|
658
|
-
const error = new
|
|
658
|
+
const error = new internal_2.NonRetryableError(
|
|
659
659
|
// This looks like a data corruption but the culprit was that the file was overwritten
|
|
660
660
|
// in storage. See PR #5882.
|
|
661
661
|
// Likely to be an issue with Fluid Services. Content does not match previous client
|
|
@@ -692,18 +692,18 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
692
692
|
}
|
|
693
693
|
processInboundMessage(message) {
|
|
694
694
|
const startTime = Date.now();
|
|
695
|
-
(0,
|
|
695
|
+
(0, internal_1.assert)(!this.currentlyProcessingOps, 0x3af /* Already processing ops. */);
|
|
696
696
|
this.currentlyProcessingOps = true;
|
|
697
697
|
this.lastProcessedMessage = message;
|
|
698
698
|
const isString = typeof message.clientId === "string";
|
|
699
|
-
(0,
|
|
699
|
+
(0, internal_1.assert)(message.clientId === null || isString, 0x41a /* undefined or string */);
|
|
700
700
|
// All client messages are coming from some client, and should have clientId,
|
|
701
701
|
// and non-client message should not have clientId. But, there are two exceptions:
|
|
702
702
|
// 1. (Legacy) We can see message.type === "attach" or "chunkedOp" for legacy files before RTM
|
|
703
703
|
// 2. Non-immediate noops (contents: null) can be sent by service without clientId
|
|
704
704
|
if (!isString && isClientMessage(message) && message.type !== protocol_definitions_1.MessageType.NoOp) {
|
|
705
|
-
throw new
|
|
706
|
-
...(0,
|
|
705
|
+
throw new internal_3.DataCorruptionError("Mismatch in clientId", {
|
|
706
|
+
...(0, internal_3.extractSafePropertiesFromMessage)(message),
|
|
707
707
|
messageType: message.type,
|
|
708
708
|
});
|
|
709
709
|
}
|
|
@@ -731,8 +731,8 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
731
731
|
// Watch the minimum sequence number and be ready to update as needed
|
|
732
732
|
if (this.minSequenceNumber > message.minimumSequenceNumber) {
|
|
733
733
|
// pre-0.58 error message: msnMovesBackwards
|
|
734
|
-
throw new
|
|
735
|
-
...(0,
|
|
734
|
+
throw new internal_3.DataCorruptionError("Found a lower minimumSequenceNumber (msn) than previously recorded", {
|
|
735
|
+
...(0, internal_3.extractSafePropertiesFromMessage)(message),
|
|
736
736
|
clientId: this.connectionManager.clientId,
|
|
737
737
|
});
|
|
738
738
|
}
|
|
@@ -741,19 +741,19 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
741
741
|
// System ops (when no clients are connected) are the only ops where equation is possible.
|
|
742
742
|
const diff = message.sequenceNumber - message.minimumSequenceNumber;
|
|
743
743
|
if (diff < 0 || (diff === 0 && message.clientId !== null)) {
|
|
744
|
-
throw new
|
|
744
|
+
throw new internal_3.DataCorruptionError("MSN has to be lower than sequence #", (0, internal_3.extractSafePropertiesFromMessage)(message));
|
|
745
745
|
}
|
|
746
746
|
this.minSequenceNumber = message.minimumSequenceNumber;
|
|
747
747
|
if (message.sequenceNumber !== this.lastProcessedSequenceNumber + 1) {
|
|
748
748
|
// pre-0.58 error message: nonSequentialSequenceNumber
|
|
749
|
-
throw new
|
|
750
|
-
...(0,
|
|
749
|
+
throw new internal_3.DataCorruptionError("Found a non-Sequential sequenceNumber", {
|
|
750
|
+
...(0, internal_3.extractSafePropertiesFromMessage)(message),
|
|
751
751
|
clientId: this.connectionManager.clientId,
|
|
752
752
|
});
|
|
753
753
|
}
|
|
754
754
|
this.lastProcessedSequenceNumber = message.sequenceNumber;
|
|
755
755
|
// a bunch of code assumes that this is true
|
|
756
|
-
(0,
|
|
756
|
+
(0, internal_1.assert)(this.lastProcessedSequenceNumber <= this.lastObservedSeqNumber, 0x267 /* "lastObservedSeqNumber should be updated first" */);
|
|
757
757
|
if (this.handler === undefined) {
|
|
758
758
|
throw new Error("Attempted to process an inbound message without a handler attached");
|
|
759
759
|
}
|
|
@@ -789,7 +789,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
789
789
|
}
|
|
790
790
|
if (this.handler === undefined) {
|
|
791
791
|
// We do not poses yet any information
|
|
792
|
-
(0,
|
|
792
|
+
(0, internal_1.assert)(this.lastQueuedSequenceNumber === 0, 0x26b /* "initial state" */);
|
|
793
793
|
return;
|
|
794
794
|
}
|
|
795
795
|
try {
|
|
@@ -801,8 +801,8 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
801
801
|
// Knowing about this mechanism, we could ask for op we already observed to increase validation.
|
|
802
802
|
// This is especially useful when coming out of offline mode or loading from
|
|
803
803
|
// very old cached (by client / driver) snapshot.
|
|
804
|
-
(0,
|
|
805
|
-
(0,
|
|
804
|
+
(0, internal_1.assert)(n === this.lastQueuedSequenceNumber, 0x0f2 /* "previouslyProcessedMessage" */);
|
|
805
|
+
(0, internal_1.assert)(from > 1, 0x0f3 /* "not positive" */);
|
|
806
806
|
from--;
|
|
807
807
|
}
|
|
808
808
|
const fetchReason = `${reason}_fetch`;
|
|
@@ -814,7 +814,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
814
814
|
}
|
|
815
815
|
catch (error) {
|
|
816
816
|
this.logger.sendErrorEvent({ eventName: "GetDeltas_Exception" }, error);
|
|
817
|
-
this.close((0,
|
|
817
|
+
this.close((0, internal_3.normalizeError)(error));
|
|
818
818
|
}
|
|
819
819
|
finally {
|
|
820
820
|
this.refreshDelayInfo(this.deltaStorageDelayId);
|
|
@@ -829,7 +829,7 @@ class DeltaManager extends client_utils_1.TypedEventEmitter {
|
|
|
829
829
|
if (this._closed) {
|
|
830
830
|
return;
|
|
831
831
|
}
|
|
832
|
-
(0,
|
|
832
|
+
(0, internal_1.assert)(this.handler !== undefined, 0x26c /* "handler should be installed" */);
|
|
833
833
|
const pendingSorted = this.pending.sort((a, b) => a.sequenceNumber - b.sequenceNumber);
|
|
834
834
|
this.pending = [];
|
|
835
835
|
// Given that we do not track where these ops came from any more, it's not very
|