@fluidframework/container-loader 2.62.0 → 2.63.0-359286
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.legacy.alpha.api.md +1 -9
- package/dist/connectionManager.d.ts.map +1 -1
- package/dist/connectionManager.js +64 -49
- package/dist/connectionManager.js.map +1 -1
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +3 -5
- package/dist/container.js.map +1 -1
- package/dist/containerContext.d.ts +10 -22
- package/dist/containerContext.d.ts.map +1 -1
- package/dist/containerContext.js +3 -1
- package/dist/containerContext.js.map +1 -1
- package/dist/contracts.d.ts +5 -1
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js.map +1 -1
- package/dist/createAndLoadContainerUtils.d.ts +1 -33
- package/dist/createAndLoadContainerUtils.d.ts.map +1 -1
- package/dist/createAndLoadContainerUtils.js +1 -1
- package/dist/createAndLoadContainerUtils.js.map +1 -1
- package/dist/deltaManager.d.ts.map +1 -1
- package/dist/deltaManager.js +56 -55
- package/dist/deltaManager.js.map +1 -1
- package/dist/frozenServices.d.ts +2 -0
- package/dist/frozenServices.d.ts.map +1 -1
- package/dist/frozenServices.js +20 -12
- package/dist/frozenServices.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/protocol.d.ts +51 -8
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +11 -12
- package/dist/protocol.js.map +1 -1
- package/dist/serializedStateManager.d.ts +4 -3
- package/dist/serializedStateManager.d.ts.map +1 -1
- package/dist/serializedStateManager.js +63 -23
- package/dist/serializedStateManager.js.map +1 -1
- package/lib/connectionManager.d.ts.map +1 -1
- package/lib/connectionManager.js +18 -3
- package/lib/connectionManager.js.map +1 -1
- package/lib/container.d.ts.map +1 -1
- package/lib/container.js +3 -5
- package/lib/container.js.map +1 -1
- package/lib/containerContext.d.ts +10 -22
- package/lib/containerContext.d.ts.map +1 -1
- package/lib/containerContext.js +3 -1
- package/lib/containerContext.js.map +1 -1
- package/lib/contracts.d.ts +5 -1
- package/lib/contracts.d.ts.map +1 -1
- package/lib/contracts.js.map +1 -1
- package/lib/createAndLoadContainerUtils.d.ts +1 -33
- package/lib/createAndLoadContainerUtils.d.ts.map +1 -1
- package/lib/createAndLoadContainerUtils.js +1 -1
- package/lib/createAndLoadContainerUtils.js.map +1 -1
- package/lib/deltaManager.d.ts.map +1 -1
- package/lib/deltaManager.js +2 -1
- package/lib/deltaManager.js.map +1 -1
- package/lib/frozenServices.d.ts +2 -0
- package/lib/frozenServices.d.ts.map +1 -1
- package/lib/frozenServices.js +20 -12
- package/lib/frozenServices.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/protocol.d.ts +51 -8
- package/lib/protocol.d.ts.map +1 -1
- package/lib/protocol.js +5 -6
- package/lib/protocol.js.map +1 -1
- package/lib/serializedStateManager.d.ts +4 -3
- package/lib/serializedStateManager.d.ts.map +1 -1
- package/lib/serializedStateManager.js +63 -23
- package/lib/serializedStateManager.js.map +1 -1
- package/package.json +12 -12
- package/src/connectionManager.ts +31 -14
- package/src/container.ts +9 -13
- package/src/containerContext.ts +34 -34
- package/src/contracts.ts +4 -1
- package/src/createAndLoadContainerUtils.ts +3 -42
- package/src/deltaManager.ts +12 -5
- package/src/frozenServices.ts +24 -12
- package/src/packageVersion.ts +1 -1
- package/src/protocol.ts +67 -10
- package/src/serializedStateManager.ts +60 -29
package/dist/deltaManager.js
CHANGED
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.DeltaManager = void 0;
|
|
8
|
-
const internal_1 = require("@fluidframework/core-
|
|
9
|
-
const internal_2 = require("@fluidframework/
|
|
10
|
-
const internal_3 = require("@fluidframework/driver-
|
|
11
|
-
const internal_4 = require("@fluidframework/
|
|
8
|
+
const internal_1 = require("@fluidframework/core-interfaces/internal");
|
|
9
|
+
const internal_2 = require("@fluidframework/core-utils/internal");
|
|
10
|
+
const internal_3 = require("@fluidframework/driver-definitions/internal");
|
|
11
|
+
const internal_4 = require("@fluidframework/driver-utils/internal");
|
|
12
|
+
const internal_5 = require("@fluidframework/telemetry-utils/internal");
|
|
12
13
|
const uuid_1 = require("uuid");
|
|
13
14
|
const deltaQueue_js_1 = require("./deltaQueue.js");
|
|
14
15
|
const error_js_1 = require("./error.js");
|
|
@@ -16,15 +17,15 @@ const error_js_1 = require("./error.js");
|
|
|
16
17
|
* Determines if message was sent by client, not service
|
|
17
18
|
*/
|
|
18
19
|
function isClientMessage(message) {
|
|
19
|
-
if ((0,
|
|
20
|
+
if ((0, internal_4.isRuntimeMessage)(message)) {
|
|
20
21
|
return true;
|
|
21
22
|
}
|
|
22
23
|
switch (message.type) {
|
|
23
|
-
case
|
|
24
|
-
case
|
|
25
|
-
case
|
|
26
|
-
case
|
|
27
|
-
case
|
|
24
|
+
case internal_3.MessageType.Propose:
|
|
25
|
+
case internal_3.MessageType.Reject:
|
|
26
|
+
case internal_3.MessageType.NoOp:
|
|
27
|
+
case internal_3.MessageType.Accept:
|
|
28
|
+
case internal_3.MessageType.Summarize: {
|
|
28
29
|
return true;
|
|
29
30
|
}
|
|
30
31
|
default: {
|
|
@@ -53,7 +54,7 @@ function logIfFalse(condition, logger, event) {
|
|
|
53
54
|
* Manages the flow of both inbound and outbound messages. This class ensures that shared objects receive delta
|
|
54
55
|
* messages in order regardless of possible network conditions or timings causing out of order delivery.
|
|
55
56
|
*/
|
|
56
|
-
class DeltaManager extends
|
|
57
|
+
class DeltaManager extends internal_5.EventEmitterWithErrorHandling {
|
|
57
58
|
get active() {
|
|
58
59
|
return this._active();
|
|
59
60
|
}
|
|
@@ -90,7 +91,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
90
91
|
*/
|
|
91
92
|
get hasCheckpointSequenceNumber() {
|
|
92
93
|
// Valid to be called only if we have active connection.
|
|
93
|
-
(0,
|
|
94
|
+
(0, internal_2.assert)(this.connectionManager.connected, 0x0df /* "Missing active connection" */);
|
|
94
95
|
return this._checkpointSequenceNumber !== undefined;
|
|
95
96
|
}
|
|
96
97
|
// Forwarding connection manager properties / IDeltaManager implementation
|
|
@@ -129,12 +130,12 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
129
130
|
if (message === undefined) {
|
|
130
131
|
return -1;
|
|
131
132
|
}
|
|
132
|
-
(0,
|
|
133
|
+
(0, internal_2.assert)(isClientMessage(message), 0x419 /* client sends non-client message */);
|
|
133
134
|
if (contents !== undefined) {
|
|
134
135
|
this.opsSize += contents.length;
|
|
135
136
|
}
|
|
136
137
|
this.messageBuffer.push(message);
|
|
137
|
-
if (message.type ===
|
|
138
|
+
if (message.type === internal_3.MessageType.NoOp) {
|
|
138
139
|
this.noOpCount++;
|
|
139
140
|
}
|
|
140
141
|
this.emit("submitOp", message);
|
|
@@ -155,14 +156,14 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
155
156
|
// The prepareFlush event allows listeners to append metadata to the batch prior to submission.
|
|
156
157
|
this.emit("prepareSend", batch);
|
|
157
158
|
if (batch.length === 1) {
|
|
158
|
-
(0,
|
|
159
|
+
(0, internal_2.assert)(batch[0].metadata?.batch === undefined, 0x3c9 /* no batch markup on single message */);
|
|
159
160
|
}
|
|
160
161
|
else {
|
|
161
|
-
(0,
|
|
162
|
-
(0,
|
|
162
|
+
(0, internal_2.assert)(batch[0].metadata?.batch === true, 0x3ca /* no start batch markup */);
|
|
163
|
+
(0, internal_2.assert)(batch[batch.length - 1].metadata?.batch === false, 0x3cb /* no end batch markup */);
|
|
163
164
|
}
|
|
164
165
|
this.connectionManager.sendMessages(batch);
|
|
165
|
-
(0,
|
|
166
|
+
(0, internal_2.assert)(this.messageBuffer.length === 0, 0x3cc /* reentrancy */);
|
|
166
167
|
}
|
|
167
168
|
get connectionProps() {
|
|
168
169
|
return {
|
|
@@ -179,7 +180,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
179
180
|
* @param event - Event to log.
|
|
180
181
|
*/
|
|
181
182
|
logConnectionIssue(event) {
|
|
182
|
-
(0,
|
|
183
|
+
(0, internal_2.assert)(this.connectionManager.connected, 0x238 /* "called only in connected state" */);
|
|
183
184
|
const pendingSorted = this.pending.sort((a, b) => a.sequenceNumber - b.sequenceNumber);
|
|
184
185
|
this.logger.sendTelemetryEvent({
|
|
185
186
|
...event,
|
|
@@ -205,7 +206,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
205
206
|
eventName: "DeltaManagerEventHandlerException",
|
|
206
207
|
name: typeof name === "string" ? name : undefined,
|
|
207
208
|
}, error);
|
|
208
|
-
this.close((0,
|
|
209
|
+
this.close((0, internal_5.normalizeError)(error));
|
|
209
210
|
});
|
|
210
211
|
this.serviceProvider = serviceProvider;
|
|
211
212
|
this.logger = logger;
|
|
@@ -256,7 +257,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
256
257
|
}
|
|
257
258
|
catch (error) {
|
|
258
259
|
this.logger.sendErrorEvent({ eventName: "EnqueueMessages_Exception" }, error);
|
|
259
|
-
this.close((0,
|
|
260
|
+
this.close((0, internal_5.normalizeError)(error));
|
|
260
261
|
}
|
|
261
262
|
},
|
|
262
263
|
signalHandler: (signals) => {
|
|
@@ -270,7 +271,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
270
271
|
connectHandler: (connection) => this.connectHandler(connection),
|
|
271
272
|
pongHandler: (latency) => this.emit("pong", latency),
|
|
272
273
|
readonlyChangeHandler: (readonly, readonlyConnectionReason) => {
|
|
273
|
-
(0,
|
|
274
|
+
(0, internal_5.safeRaiseEvent)(this, this.logger, "readonly", readonly, readonlyConnectionReason);
|
|
274
275
|
},
|
|
275
276
|
establishConnectionHandler: (reason) => this.establishingConnection(reason),
|
|
276
277
|
cancelConnectionHandler: (reason) => this.cancelEstablishingConnection(reason),
|
|
@@ -280,7 +281,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
280
281
|
this.processInboundMessage(op);
|
|
281
282
|
});
|
|
282
283
|
this._inbound.on("error", (error) => {
|
|
283
|
-
this.close(
|
|
284
|
+
this.close(internal_5.DataProcessingError.wrapIfUnrecognized(error, "deltaManagerInboundErrorHandler", this.lastMessage));
|
|
284
285
|
});
|
|
285
286
|
// Inbound signal queue
|
|
286
287
|
this._inboundSignal = new deltaQueue_js_1.DeltaQueue((message) => {
|
|
@@ -289,11 +290,11 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
289
290
|
}
|
|
290
291
|
this.handler.processSignal({
|
|
291
292
|
...message,
|
|
292
|
-
content:
|
|
293
|
+
content: (0, internal_1.JsonParse)(message.content),
|
|
293
294
|
});
|
|
294
295
|
});
|
|
295
296
|
this._inboundSignal.on("error", (error) => {
|
|
296
|
-
this.close((0,
|
|
297
|
+
this.close((0, internal_5.normalizeError)(error));
|
|
297
298
|
});
|
|
298
299
|
// Initially, all queues are created paused.
|
|
299
300
|
// - outbound is flipped back and forth in setupNewSuccessfulConnection / disconnectFromDeltaStream
|
|
@@ -320,7 +321,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
320
321
|
// but it's safe to assume (until better design is put into place) that batches should not exist
|
|
321
322
|
// across multiple connections. Right now we assume runtime will not submit any ops in disconnected
|
|
322
323
|
// state. As requirements change, so should these checks.
|
|
323
|
-
(0,
|
|
324
|
+
(0, internal_2.assert)(this.messageBuffer.length === 0, 0x0e9 /* "messageBuffer is not empty on new connection" */);
|
|
324
325
|
this.opsSize = 0;
|
|
325
326
|
this.noOpCount = 0;
|
|
326
327
|
this.emit("connect", connection, checkpointSequenceNumber === undefined
|
|
@@ -354,16 +355,16 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
354
355
|
this.lastQueuedSequenceNumber = lastProcessedSequenceNumber;
|
|
355
356
|
this.lastObservedSeqNumber = lastProcessedSequenceNumber;
|
|
356
357
|
// We will use same check in other places to make sure all the seq number above are set properly.
|
|
357
|
-
(0,
|
|
358
|
+
(0, internal_2.assert)(this.handler === undefined, 0x0e2 /* "DeltaManager already has attached op handler!" */);
|
|
358
359
|
this.handler = handler;
|
|
359
360
|
// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
|
|
360
|
-
(0,
|
|
361
|
+
(0, internal_2.assert)(!!this.handler, 0x0e3 /* "Newly set op handler is null/undefined!" */);
|
|
361
362
|
// There should be no pending fetch!
|
|
362
363
|
// This API is called right after attachOpHandler by Container.load().
|
|
363
364
|
// We might have connection already and it might have called fetchMissingDeltas() from
|
|
364
365
|
// setupNewSuccessfulConnection. But it should do nothing, because there is no way to fetch ops before
|
|
365
366
|
// we know snapshot sequence number that is set in attachOpHandler. So all such calls should be noop.
|
|
366
|
-
(0,
|
|
367
|
+
(0, internal_2.assert)(this.fetchReason === undefined, 0x268 /* "There can't be pending fetch that early in boot sequence!" */);
|
|
367
368
|
if (this._closed) {
|
|
368
369
|
return;
|
|
369
370
|
}
|
|
@@ -382,7 +383,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
382
383
|
}
|
|
383
384
|
}
|
|
384
385
|
// Ensure there is no need to call this.processPendingOps() at the end of boot sequence
|
|
385
|
-
(0,
|
|
386
|
+
(0, internal_2.assert)(this.fetchReason !== undefined || this.pending.length === 0, 0x269 /* "pending ops are not dropped" */);
|
|
386
387
|
}
|
|
387
388
|
connect(args) {
|
|
388
389
|
const fetchOpsFromStorage = args.fetchOpsFromStorage ?? true;
|
|
@@ -445,7 +446,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
445
446
|
const controller = new AbortController();
|
|
446
447
|
let opsFromFetch = false;
|
|
447
448
|
const opListener = (op) => {
|
|
448
|
-
(0,
|
|
449
|
+
(0, internal_2.assert)(op.sequenceNumber === this.lastQueuedSequenceNumber, 0x23a /* "seq#'s" */);
|
|
449
450
|
// Ops that are coming from this request should not cancel itself.
|
|
450
451
|
// This is useless for known ranges (to is defined) as it means request is over either way.
|
|
451
452
|
// And it will cancel unbound request too early, not allowing us to learn where the end of the file is.
|
|
@@ -456,7 +457,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
456
457
|
};
|
|
457
458
|
try {
|
|
458
459
|
this._inbound.on("push", opListener);
|
|
459
|
-
(0,
|
|
460
|
+
(0, internal_2.assert)(this.closeAbortController.signal.onabort === null, 0x1e8 /* "reentrancy" */);
|
|
460
461
|
this.closeAbortController.signal.addEventListener("abort", () => controller.abort(this.closeAbortController.signal.reason));
|
|
461
462
|
const stream = this.deltaStorage.fetchMessages(from, // inclusive
|
|
462
463
|
to, // exclusive
|
|
@@ -488,7 +489,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
488
489
|
// eslint-disable-next-line unicorn/no-null, unicorn/prefer-add-event-listener
|
|
489
490
|
this.closeAbortController.signal.onabort = null;
|
|
490
491
|
this._inbound.off("push", opListener);
|
|
491
|
-
(0,
|
|
492
|
+
(0, internal_2.assert)(!opsFromFetch, 0x289 /* "logic error" */);
|
|
492
493
|
}
|
|
493
494
|
}
|
|
494
495
|
/**
|
|
@@ -520,8 +521,8 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
520
521
|
if (this._disposed) {
|
|
521
522
|
return;
|
|
522
523
|
}
|
|
523
|
-
if (error !== undefined && !(0,
|
|
524
|
-
throw new
|
|
524
|
+
if (error !== undefined && !(0, internal_5.isFluidError)(error)) {
|
|
525
|
+
throw new internal_5.UsageError("Error must be a Fluid error");
|
|
525
526
|
}
|
|
526
527
|
this._disposed = true;
|
|
527
528
|
this._closed = true; // We consider "disposed" as a further state than "closed"
|
|
@@ -594,7 +595,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
594
595
|
// It's responsibility of
|
|
595
596
|
// - attachOpHandler()
|
|
596
597
|
// - fetchMissingDeltas() after it's done with querying storage
|
|
597
|
-
(0,
|
|
598
|
+
(0, internal_2.assert)(this.pending.length === 0 || this.fetchReason !== undefined, 0x1e9 /* "Pending ops" */);
|
|
598
599
|
if (messages.length === 0) {
|
|
599
600
|
return;
|
|
600
601
|
}
|
|
@@ -660,7 +661,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
660
661
|
}
|
|
661
662
|
this.updateLatestKnownOpSeqNumber(messages[messages.length - 1].sequenceNumber);
|
|
662
663
|
const n = this.previouslyProcessedMessage?.sequenceNumber;
|
|
663
|
-
(0,
|
|
664
|
+
(0, internal_2.assert)(n === undefined || n === this.lastQueuedSequenceNumber, 0x0ec /* "Unexpected value for previously processed message's sequence number" */);
|
|
664
665
|
for (const message of messages) {
|
|
665
666
|
// Check that the messages are arriving in the expected order
|
|
666
667
|
if (message.sequenceNumber <= this.lastQueuedSequenceNumber) {
|
|
@@ -670,7 +671,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
670
671
|
const message1 = this.comparableMessagePayload(this.previouslyProcessedMessage);
|
|
671
672
|
const message2 = this.comparableMessagePayload(message);
|
|
672
673
|
if (message1 !== message2) {
|
|
673
|
-
const error = new
|
|
674
|
+
const error = new internal_4.NonRetryableError(
|
|
674
675
|
// This looks like a data corruption but the culprit was that the file was overwritten
|
|
675
676
|
// in storage. See PR #5882.
|
|
676
677
|
// Likely to be an issue with Fluid Services. Content does not match previous client
|
|
@@ -679,7 +680,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
679
680
|
// instances such that the same sequence number is reused for two different ops.
|
|
680
681
|
// pre-0.58 error message: twoMessagesWithSameSeqNumAndDifferentPayload
|
|
681
682
|
"Found two messages with the same sequenceNumber but different payloads. Likely to be a " +
|
|
682
|
-
"service issue",
|
|
683
|
+
"service issue", internal_3.DriverErrorTypes.fileOverwrittenInStorage, {
|
|
683
684
|
clientId: this.connectionManager.clientId,
|
|
684
685
|
sequenceNumber: message.sequenceNumber,
|
|
685
686
|
message1,
|
|
@@ -707,18 +708,18 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
707
708
|
}
|
|
708
709
|
processInboundMessage(message) {
|
|
709
710
|
const startTime = Date.now();
|
|
710
|
-
(0,
|
|
711
|
+
(0, internal_2.assert)(!this.currentlyProcessingOps, 0x3af /* Already processing ops. */);
|
|
711
712
|
this.currentlyProcessingOps = true;
|
|
712
713
|
this.lastProcessedMessage = message;
|
|
713
714
|
const isString = typeof message.clientId === "string";
|
|
714
|
-
(0,
|
|
715
|
+
(0, internal_2.assert)(message.clientId === null || isString, 0x41a /* undefined or string */);
|
|
715
716
|
// All client messages are coming from some client, and should have clientId,
|
|
716
717
|
// and non-client message should not have clientId. But, there are two exceptions:
|
|
717
718
|
// 1. (Legacy) We can see message.type === "attach" or "chunkedOp" for legacy files before RTM
|
|
718
719
|
// 2. Non-immediate noops (contents: null) can be sent by service without clientId
|
|
719
|
-
if (!isString && isClientMessage(message) && message.type !==
|
|
720
|
-
throw new
|
|
721
|
-
...(0,
|
|
720
|
+
if (!isString && isClientMessage(message) && message.type !== internal_3.MessageType.NoOp) {
|
|
721
|
+
throw new internal_5.DataCorruptionError("Mismatch in clientId", {
|
|
722
|
+
...(0, internal_5.extractSafePropertiesFromMessage)(message),
|
|
722
723
|
messageType: message.type,
|
|
723
724
|
});
|
|
724
725
|
}
|
|
@@ -726,7 +727,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
726
727
|
// If the count ends up negative, that means we have a real gap and throw error
|
|
727
728
|
if (this.connectionManager.clientId !== undefined &&
|
|
728
729
|
this.connectionManager.clientId === message.clientId) {
|
|
729
|
-
if (message.type ===
|
|
730
|
+
if (message.type === internal_3.MessageType.NoOp) {
|
|
730
731
|
this.noOpCount--;
|
|
731
732
|
}
|
|
732
733
|
const clientSeqNumGap = message.clientSequenceNumber - this.lastClientSequenceNumber - 1;
|
|
@@ -746,7 +747,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
746
747
|
// something has changed out from under the file on the server, such that the service lost some ops
|
|
747
748
|
// which this client already processed - the very ops that made this _next_ op to appear invalid.
|
|
748
749
|
// In this case, only this client will fail (and lose this recent data), but others will be able to connect and continue.
|
|
749
|
-
throw
|
|
750
|
+
throw internal_5.DataProcessingError.create(
|
|
750
751
|
// error message through v0.57: msnMovesBackwards
|
|
751
752
|
// error message through v2.1: "Found a lower minimumSequenceNumber (msn) than previously recorded",
|
|
752
753
|
"Invalid MinimumSequenceNumber from service - document may have been restored to previous state", "DeltaManager.processInboundMessage", message, {
|
|
@@ -758,19 +759,19 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
758
759
|
// System ops (when no clients are connected) are the only ops where equation is possible.
|
|
759
760
|
const diff = message.sequenceNumber - message.minimumSequenceNumber;
|
|
760
761
|
if (diff < 0 || (diff === 0 && message.clientId !== null)) {
|
|
761
|
-
throw new
|
|
762
|
+
throw new internal_5.DataCorruptionError("MSN has to be lower than sequence #", (0, internal_5.extractSafePropertiesFromMessage)(message));
|
|
762
763
|
}
|
|
763
764
|
this.minSequenceNumber = message.minimumSequenceNumber;
|
|
764
765
|
if (message.sequenceNumber !== this.lastProcessedSequenceNumber + 1) {
|
|
765
766
|
// pre-0.58 error message: nonSequentialSequenceNumber
|
|
766
|
-
throw new
|
|
767
|
-
...(0,
|
|
767
|
+
throw new internal_5.DataCorruptionError("Found a non-Sequential sequenceNumber", {
|
|
768
|
+
...(0, internal_5.extractSafePropertiesFromMessage)(message),
|
|
768
769
|
clientId: this.connectionManager.clientId,
|
|
769
770
|
});
|
|
770
771
|
}
|
|
771
772
|
this.lastProcessedSequenceNumber = message.sequenceNumber;
|
|
772
773
|
// a bunch of code assumes that this is true
|
|
773
|
-
(0,
|
|
774
|
+
(0, internal_2.assert)(this.lastProcessedSequenceNumber <= this.lastObservedSeqNumber, 0x267 /* "lastObservedSeqNumber should be updated first" */);
|
|
774
775
|
if (this.handler === undefined) {
|
|
775
776
|
throw new Error("Attempted to process an inbound message without a handler attached");
|
|
776
777
|
}
|
|
@@ -806,7 +807,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
806
807
|
}
|
|
807
808
|
if (this.handler === undefined) {
|
|
808
809
|
// We do not poses yet any information
|
|
809
|
-
(0,
|
|
810
|
+
(0, internal_2.assert)(this.lastQueuedSequenceNumber === 0, 0x26b /* "initial state" */);
|
|
810
811
|
return;
|
|
811
812
|
}
|
|
812
813
|
try {
|
|
@@ -818,8 +819,8 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
818
819
|
// Knowing about this mechanism, we could ask for op we already observed to increase validation.
|
|
819
820
|
// This is especially useful when coming out of offline mode or loading from
|
|
820
821
|
// very old cached (by client / driver) snapshot.
|
|
821
|
-
(0,
|
|
822
|
-
(0,
|
|
822
|
+
(0, internal_2.assert)(n === this.lastQueuedSequenceNumber, 0x0f2 /* "previouslyProcessedMessage" */);
|
|
823
|
+
(0, internal_2.assert)(from > 1, 0x0f3 /* "not positive" */);
|
|
823
824
|
from--;
|
|
824
825
|
}
|
|
825
826
|
const fetchReason = `${reason}_fetch`;
|
|
@@ -831,7 +832,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
831
832
|
}
|
|
832
833
|
catch (error) {
|
|
833
834
|
this.logger.sendErrorEvent({ eventName: "GetDeltas_Exception" }, error);
|
|
834
|
-
this.close((0,
|
|
835
|
+
this.close((0, internal_5.normalizeError)(error));
|
|
835
836
|
}
|
|
836
837
|
finally {
|
|
837
838
|
this.refreshDelayInfo(this.deltaStorageDelayId);
|
|
@@ -846,7 +847,7 @@ class DeltaManager extends internal_4.EventEmitterWithErrorHandling {
|
|
|
846
847
|
if (this._closed) {
|
|
847
848
|
return;
|
|
848
849
|
}
|
|
849
|
-
(0,
|
|
850
|
+
(0, internal_2.assert)(this.handler !== undefined, 0x26c /* "handler should be installed" */);
|
|
850
851
|
const pendingSorted = this.pending.sort((a, b) => a.sequenceNumber - b.sequenceNumber);
|
|
851
852
|
this.pending = [];
|
|
852
853
|
// Given that we do not track where these ops came from any more, it's not very
|