@fluidframework/container-loader 0.59.4000-71130 → 1.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/.eslintrc.js +1 -1
- package/README.md +1 -1
- package/dist/connectionState.d.ts +15 -3
- package/dist/connectionState.d.ts.map +1 -1
- package/dist/connectionState.js +15 -3
- package/dist/connectionState.js.map +1 -1
- package/dist/connectionStateHandler.d.ts +6 -4
- package/dist/connectionStateHandler.d.ts.map +1 -1
- package/dist/connectionStateHandler.js +21 -6
- package/dist/connectionStateHandler.js.map +1 -1
- package/dist/container.d.ts +18 -26
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +54 -88
- package/dist/container.js.map +1 -1
- package/dist/containerContext.d.ts +6 -4
- package/dist/containerContext.d.ts.map +1 -1
- package/dist/containerContext.js +8 -7
- package/dist/containerContext.js.map +1 -1
- package/dist/containerStorageAdapter.d.ts +2 -3
- package/dist/containerStorageAdapter.d.ts.map +1 -1
- package/dist/containerStorageAdapter.js +0 -3
- package/dist/containerStorageAdapter.js.map +1 -1
- package/dist/deltaManagerProxy.d.ts +0 -1
- package/dist/deltaManagerProxy.d.ts.map +1 -1
- package/dist/deltaManagerProxy.js +0 -3
- package/dist/deltaManagerProxy.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts +1 -13
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +2 -3
- package/dist/loader.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/protocolTreeDocumentStorageService.d.ts +0 -1
- package/dist/protocolTreeDocumentStorageService.d.ts.map +1 -1
- package/dist/protocolTreeDocumentStorageService.js +0 -1
- package/dist/protocolTreeDocumentStorageService.js.map +1 -1
- package/dist/retriableDocumentStorageService.d.ts +1 -2
- package/dist/retriableDocumentStorageService.d.ts.map +1 -1
- package/dist/retriableDocumentStorageService.js +0 -3
- package/dist/retriableDocumentStorageService.js.map +1 -1
- package/lib/connectionState.d.ts +15 -3
- package/lib/connectionState.d.ts.map +1 -1
- package/lib/connectionState.js +15 -3
- package/lib/connectionState.js.map +1 -1
- package/lib/connectionStateHandler.d.ts +6 -4
- package/lib/connectionStateHandler.d.ts.map +1 -1
- package/lib/connectionStateHandler.js +21 -6
- package/lib/connectionStateHandler.js.map +1 -1
- package/lib/container.d.ts +18 -26
- package/lib/container.d.ts.map +1 -1
- package/lib/container.js +54 -88
- package/lib/container.js.map +1 -1
- package/lib/containerContext.d.ts +6 -4
- package/lib/containerContext.d.ts.map +1 -1
- package/lib/containerContext.js +8 -7
- package/lib/containerContext.js.map +1 -1
- package/lib/containerStorageAdapter.d.ts +2 -3
- package/lib/containerStorageAdapter.d.ts.map +1 -1
- package/lib/containerStorageAdapter.js +0 -3
- package/lib/containerStorageAdapter.js.map +1 -1
- package/lib/deltaManagerProxy.d.ts +0 -1
- package/lib/deltaManagerProxy.d.ts.map +1 -1
- package/lib/deltaManagerProxy.js +0 -3
- package/lib/deltaManagerProxy.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/loader.d.ts +1 -13
- package/lib/loader.d.ts.map +1 -1
- package/lib/loader.js +2 -3
- package/lib/loader.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/protocolTreeDocumentStorageService.d.ts +0 -1
- package/lib/protocolTreeDocumentStorageService.d.ts.map +1 -1
- package/lib/protocolTreeDocumentStorageService.js +0 -1
- package/lib/protocolTreeDocumentStorageService.js.map +1 -1
- package/lib/retriableDocumentStorageService.d.ts +1 -2
- package/lib/retriableDocumentStorageService.d.ts.map +1 -1
- package/lib/retriableDocumentStorageService.js +0 -3
- package/lib/retriableDocumentStorageService.js.map +1 -1
- package/package.json +27 -27
- package/src/connectionState.ts +20 -6
- package/src/connectionStateHandler.ts +29 -8
- package/src/container.ts +77 -100
- package/src/containerContext.ts +10 -10
- package/src/containerStorageAdapter.ts +1 -6
- package/src/deltaManagerProxy.ts +0 -4
- package/src/index.ts +1 -0
- package/src/loader.ts +4 -21
- package/src/packageVersion.ts +1 -1
- package/src/protocolTreeDocumentStorageService.ts +0 -1
- package/src/retriableDocumentStorageService.ts +0 -8
package/lib/container.js
CHANGED
|
@@ -36,7 +36,7 @@ const savedContainerEvent = "saved";
|
|
|
36
36
|
* Useful when resolving URIs and hitting 404, due to container being loaded from (stale) snapshot and not being
|
|
37
37
|
* up to date. Host may chose to wait in such case and retry resolving URI.
|
|
38
38
|
* Warning: Will wait infinitely for connection to establish if there is no connection.
|
|
39
|
-
* May result in deadlock if Container.
|
|
39
|
+
* May result in deadlock if Container.disconnect() is called and never followed by a call to Container.connect().
|
|
40
40
|
* @returns true: container is up to date, it processed all the ops that were know at the time of first connection
|
|
41
41
|
* false: storage does not provide indication of how far the client is. Container processed
|
|
42
42
|
* all the ops known to it, but it maybe still behind.
|
|
@@ -58,7 +58,8 @@ export async function waitContainerToCatchUp(container) {
|
|
|
58
58
|
};
|
|
59
59
|
container.on("closed", closedCallback);
|
|
60
60
|
const waitForOps = () => {
|
|
61
|
-
assert(container.connectionState
|
|
61
|
+
assert(container.connectionState === ConnectionState.CatchingUp
|
|
62
|
+
|| container.connectionState === ConnectionState.Connected, 0x0cd /* "Container disconnected while waiting for ops!" */);
|
|
62
63
|
const hasCheckpointSequenceNumber = deltaManager.hasCheckpointSequenceNumber;
|
|
63
64
|
const connectionOpSeqNumber = deltaManager.lastKnownSeqNumber;
|
|
64
65
|
assert(deltaManager.lastSequenceNumber <= connectionOpSeqNumber, 0x266 /* "lastKnownSeqNumber should never be below last processed sequence number" */);
|
|
@@ -89,9 +90,7 @@ export async function waitContainerToCatchUp(container) {
|
|
|
89
90
|
waitForOps();
|
|
90
91
|
};
|
|
91
92
|
container.on(connectedEventName, callback);
|
|
92
|
-
|
|
93
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
94
|
-
container.resume();
|
|
93
|
+
container.connect();
|
|
95
94
|
});
|
|
96
95
|
}
|
|
97
96
|
const getCodeProposal =
|
|
@@ -100,7 +99,7 @@ const getCodeProposal =
|
|
|
100
99
|
const summarizerClientType = "summarizer";
|
|
101
100
|
export class Container extends EventEmitterWithErrorHandling {
|
|
102
101
|
constructor(loader, config) {
|
|
103
|
-
var _a;
|
|
102
|
+
var _a, _b;
|
|
104
103
|
super((name, error) => {
|
|
105
104
|
this.mc.logger.sendErrorEvent({
|
|
106
105
|
eventName: "ContainerEventHandlerException",
|
|
@@ -172,7 +171,7 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
172
171
|
// its own join op. Attempt recovery option.
|
|
173
172
|
this._deltaManager.logConnectionIssue({
|
|
174
173
|
eventName,
|
|
175
|
-
duration: performance.now() - this.connectionTransitionTimes[ConnectionState.
|
|
174
|
+
duration: performance.now() - this.connectionTransitionTimes[ConnectionState.CatchingUp],
|
|
176
175
|
});
|
|
177
176
|
},
|
|
178
177
|
connectionStateChanged: () => {
|
|
@@ -180,7 +179,7 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
180
179
|
this.propagateConnectionState();
|
|
181
180
|
}
|
|
182
181
|
},
|
|
183
|
-
}, this.mc.logger);
|
|
182
|
+
}, this.mc.logger, (_b = config.serializedContainerState) === null || _b === void 0 ? void 0 : _b.clientId);
|
|
184
183
|
this.on(savedContainerEvent, () => {
|
|
185
184
|
this.connectionStateHandler.containerSaved();
|
|
186
185
|
});
|
|
@@ -258,16 +257,17 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
258
257
|
clientDetailsOverride: loadOptions.clientDetailsOverride,
|
|
259
258
|
resolvedUrl: loadOptions.resolvedUrl,
|
|
260
259
|
canReconnect: loadOptions.canReconnect,
|
|
260
|
+
serializedContainerState: pendingLocalState,
|
|
261
261
|
});
|
|
262
262
|
return PerformanceEvent.timedExecAsync(container.mc.logger, { eventName: "Load" }, async (event) => new Promise((resolve, reject) => {
|
|
263
|
-
var _a;
|
|
263
|
+
var _a, _b;
|
|
264
264
|
container._lifecycleState = "loading";
|
|
265
265
|
const version = loadOptions.version;
|
|
266
|
-
// always load unpaused with pending ops!
|
|
267
|
-
// It is also default mode in general.
|
|
268
266
|
const defaultMode = { opsBeforeReturn: "cached" };
|
|
269
|
-
|
|
270
|
-
|
|
267
|
+
// if we have pendingLocalState, anything we cached is not useful and we shouldn't wait for connection
|
|
268
|
+
// to return container, so ignore this value and use undefined for opsBeforeReturn
|
|
269
|
+
const mode = pendingLocalState
|
|
270
|
+
? Object.assign(Object.assign({}, ((_a = loadOptions.loadMode) !== null && _a !== void 0 ? _a : defaultMode)), { opsBeforeReturn: undefined }) : (_b = loadOptions.loadMode) !== null && _b !== void 0 ? _b : defaultMode;
|
|
271
271
|
const onClosed = (err) => {
|
|
272
272
|
// pre-0.58 error message: containerClosedWithoutErrorDuringLoad
|
|
273
273
|
reject(err !== null && err !== void 0 ? err : new GenericError("Container closed without error during load"));
|
|
@@ -486,9 +486,13 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
486
486
|
// a new clientId and a future container using stale pending state without the new clientId would resubmit them
|
|
487
487
|
assert(this.attachState === AttachState.Attached, 0x0d1 /* "Container should be attached before close" */);
|
|
488
488
|
assert(this.resolvedUrl !== undefined && this.resolvedUrl.type === "fluid", 0x0d2 /* "resolved url should be valid Fluid url" */);
|
|
489
|
+
assert(!!this._protocolHandler, 0x2e3 /* "Must have a valid protocol handler instance" */);
|
|
489
490
|
const pendingState = {
|
|
490
491
|
pendingRuntimeState: this.context.getPendingLocalState(),
|
|
491
492
|
url: this.resolvedUrl.url,
|
|
493
|
+
protocol: this._protocolHandler.getProtocolState(),
|
|
494
|
+
term: this._protocolHandler.term,
|
|
495
|
+
clientId: this.clientId,
|
|
492
496
|
};
|
|
493
497
|
this.close();
|
|
494
498
|
return JSON.stringify(pendingState);
|
|
@@ -532,7 +536,7 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
532
536
|
// starting to attach the container to storage.
|
|
533
537
|
// Also, this should only be fired in detached container.
|
|
534
538
|
this._attachState = AttachState.Attaching;
|
|
535
|
-
this.context.notifyAttaching();
|
|
539
|
+
this.context.notifyAttaching(getSnapshotTreeFromSerializedContainer(summary));
|
|
536
540
|
}
|
|
537
541
|
// Actually go and create the resolved document
|
|
538
542
|
const createNewResolvedUrl = await this.urlResolver.resolve(request);
|
|
@@ -567,7 +571,7 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
567
571
|
const protocolSummary = this.captureProtocolSummary();
|
|
568
572
|
summary = combineAppAndProtocolSummary(appSummary, protocolSummary);
|
|
569
573
|
this._attachState = AttachState.Attaching;
|
|
570
|
-
this.context.notifyAttaching();
|
|
574
|
+
this.context.notifyAttaching(getSnapshotTreeFromSerializedContainer(summary));
|
|
571
575
|
await this.storageService.uploadSummaryWithContext(summary, {
|
|
572
576
|
referenceSequenceNumber: 0,
|
|
573
577
|
ackHandle: undefined,
|
|
@@ -597,27 +601,6 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
597
601
|
async request(path) {
|
|
598
602
|
return PerformanceEvent.timedExecAsync(this.mc.logger, { eventName: "Request" }, async () => this.context.request(path), { end: true, cancel: "error" });
|
|
599
603
|
}
|
|
600
|
-
/**
|
|
601
|
-
* Dictates whether or not the current container will automatically attempt to reconnect to the delta stream
|
|
602
|
-
* after receiving a disconnect event
|
|
603
|
-
* @param reconnect - Boolean indicating if reconnect should automatically occur
|
|
604
|
-
* @deprecated - 0.58, This API will be removed in 1.0
|
|
605
|
-
* Use `connect()` and `disconnect()` instead of `setAutoReconnect(true)` and `setAutoReconnect(false)` respectively
|
|
606
|
-
* See https://github.com/microsoft/FluidFramework/issues/9167 for context
|
|
607
|
-
*/
|
|
608
|
-
setAutoReconnect(reconnect) {
|
|
609
|
-
if (this.closed) {
|
|
610
|
-
throw new Error("Attempting to setAutoReconnect() a closed Container");
|
|
611
|
-
}
|
|
612
|
-
const mode = reconnect ? ReconnectMode.Enabled : ReconnectMode.Disabled;
|
|
613
|
-
this.setAutoReconnectInternal(mode);
|
|
614
|
-
// If container state is not attached and resumed, then don't connect to delta stream. Also don't set the
|
|
615
|
-
// manual reconnection flag to true as we haven't made the initial connection yet.
|
|
616
|
-
if (reconnect && this._attachState === AttachState.Attached && this.resumedOpProcessingAfterLoad) {
|
|
617
|
-
// Ensure connection to web socket
|
|
618
|
-
this.connectToDeltaStream({ reason: "autoReconnect" });
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
604
|
setAutoReconnectInternal(mode) {
|
|
622
605
|
const currentMode = this._deltaManager.connectionManager.reconnectMode;
|
|
623
606
|
if (currentMode === mode) {
|
|
@@ -671,22 +654,8 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
671
654
|
const mode = ReconnectMode.Disabled;
|
|
672
655
|
this.setAutoReconnectInternal(mode);
|
|
673
656
|
}
|
|
674
|
-
/**
|
|
675
|
-
* Have the container attempt to resume processing ops
|
|
676
|
-
* @deprecated - 0.58, This API will be removed in 1.0
|
|
677
|
-
* Use `connect()` instead
|
|
678
|
-
* See https://github.com/microsoft/FluidFramework/issues/9167 for context
|
|
679
|
-
*/
|
|
680
|
-
resume() {
|
|
681
|
-
if (!this.closed) {
|
|
682
|
-
// Note: no need to fetch ops as we do it preemptively as part of DeltaManager.attachOpHandler().
|
|
683
|
-
// If there is gap, we will learn about it once connected, but the gap should be small (if any),
|
|
684
|
-
// assuming that resume() is called quickly after initial container boot.
|
|
685
|
-
this.resumeInternal({ reason: "DocumentOpenResume", fetchOpsFromStorage: false });
|
|
686
|
-
}
|
|
687
|
-
}
|
|
688
657
|
resumeInternal(args) {
|
|
689
|
-
assert(!this.closed, 0x0d9 /* "Attempting to
|
|
658
|
+
assert(!this.closed, 0x0d9 /* "Attempting to connect() a closed DeltaManager" */);
|
|
690
659
|
// Resume processing ops
|
|
691
660
|
if (!this.resumedOpProcessingAfterLoad) {
|
|
692
661
|
this.resumedOpProcessingAfterLoad = true;
|
|
@@ -775,12 +744,26 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
775
744
|
if (loadMode.deltaConnection === undefined) {
|
|
776
745
|
this.connectToDeltaStream(connectionArgs);
|
|
777
746
|
}
|
|
778
|
-
|
|
747
|
+
if (!pendingLocalState) {
|
|
748
|
+
await this.connectStorageService();
|
|
749
|
+
}
|
|
750
|
+
else {
|
|
751
|
+
// if we have pendingLocalState we can load without storage; don't wait for connection
|
|
752
|
+
this.connectStorageService().catch((error) => this.close(error));
|
|
753
|
+
}
|
|
779
754
|
this._attachState = AttachState.Attached;
|
|
780
755
|
// Fetch specified snapshot.
|
|
781
|
-
const { snapshot, versionId } =
|
|
782
|
-
|
|
783
|
-
|
|
756
|
+
const { snapshot, versionId } = pendingLocalState === undefined
|
|
757
|
+
? await this.fetchSnapshotTree(specifiedVersion)
|
|
758
|
+
: { snapshot: undefined, versionId: undefined };
|
|
759
|
+
assert(snapshot !== undefined || pendingLocalState !== undefined, 0x237 /* "Snapshot should exist" */);
|
|
760
|
+
const attributes = pendingLocalState === undefined
|
|
761
|
+
? await this.getDocumentAttributes(this.storageService, snapshot)
|
|
762
|
+
: {
|
|
763
|
+
sequenceNumber: pendingLocalState.protocol.sequenceNumber,
|
|
764
|
+
minimumSequenceNumber: pendingLocalState.protocol.minimumSequenceNumber,
|
|
765
|
+
term: pendingLocalState.term,
|
|
766
|
+
};
|
|
784
767
|
let opsBeforeReturnP;
|
|
785
768
|
// Attach op handlers to finish initialization and be able to start processing ops
|
|
786
769
|
// Kick off any ops fetching if required.
|
|
@@ -801,11 +784,12 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
801
784
|
}
|
|
802
785
|
// ...load in the existing quorum
|
|
803
786
|
// Initialize the protocol handler
|
|
804
|
-
this._protocolHandler =
|
|
805
|
-
await this.initializeProtocolStateFromSnapshot(attributes, this.storageService, snapshot)
|
|
787
|
+
this._protocolHandler = pendingLocalState === undefined
|
|
788
|
+
? await this.initializeProtocolStateFromSnapshot(attributes, this.storageService, snapshot)
|
|
789
|
+
: await this.initializeProtocolState(attributes, pendingLocalState.protocol.members, pendingLocalState.protocol.proposals, pendingLocalState.protocol.values);
|
|
806
790
|
const codeDetails = this.getCodeDetailsFromQuorum();
|
|
807
791
|
await this.instantiateContext(true, // existing
|
|
808
|
-
codeDetails, snapshot, pendingLocalState);
|
|
792
|
+
codeDetails, snapshot, pendingLocalState === null || pendingLocalState === void 0 ? void 0 : pendingLocalState.pendingRuntimeState);
|
|
809
793
|
// Propagate current connection state through the system.
|
|
810
794
|
this.propagateConnectionState();
|
|
811
795
|
// Internal context is fully loaded at this point
|
|
@@ -822,7 +806,10 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
822
806
|
}
|
|
823
807
|
switch (loadMode.deltaConnection) {
|
|
824
808
|
case undefined:
|
|
825
|
-
|
|
809
|
+
// Note: no need to fetch ops as we do it preemptively as part of DeltaManager.attachOpHandler().
|
|
810
|
+
// If there is gap, we will learn about it once connected, but the gap should be small (if any),
|
|
811
|
+
// assuming that resumeInternal() is called quickly after initial container boot.
|
|
812
|
+
this.resumeInternal({ reason: "DocumentLoad", fetchOpsFromStorage: false });
|
|
826
813
|
break;
|
|
827
814
|
case "delayed":
|
|
828
815
|
this.resumedOpProcessingAfterLoad = true;
|
|
@@ -945,12 +932,7 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
945
932
|
protocolLogger.sendErrorEvent(error);
|
|
946
933
|
});
|
|
947
934
|
// Track membership changes and update connection state accordingly
|
|
948
|
-
|
|
949
|
-
this.connectionStateHandler.receivedAddMemberEvent(clientId);
|
|
950
|
-
});
|
|
951
|
-
protocol.quorum.on("removeMember", (clientId) => {
|
|
952
|
-
this.connectionStateHandler.receivedRemoveMemberEvent(clientId);
|
|
953
|
-
});
|
|
935
|
+
this.connectionStateHandler.initProtocol(protocol);
|
|
954
936
|
protocol.quorum.on("addProposal", (proposal) => {
|
|
955
937
|
if (proposal.key === "code" || proposal.key === "code2") {
|
|
956
938
|
this.emit("codeDetailsProposed", proposal.value, proposal);
|
|
@@ -1085,6 +1067,7 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
1085
1067
|
}, prefetchType);
|
|
1086
1068
|
}
|
|
1087
1069
|
logConnectionStateChangeTelemetry(value, oldState, reason) {
|
|
1070
|
+
var _a;
|
|
1088
1071
|
// Log actual event
|
|
1089
1072
|
const time = performance.now();
|
|
1090
1073
|
this.connectionTransitionTimes[value] = time;
|
|
@@ -1120,7 +1103,7 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
1120
1103
|
durationFromDisconnected,
|
|
1121
1104
|
reason,
|
|
1122
1105
|
connectionInitiationReason, pendingClientId: this.connectionStateHandler.pendingClientId, clientId: this.clientId, autoReconnect,
|
|
1123
|
-
opsBehind, online: OnlineStatus[isOnline()], lastVisible: this.lastVisible !== undefined ? performance.now() - this.lastVisible : undefined, checkpointSequenceNumber }, this._deltaManager.connectionProps));
|
|
1106
|
+
opsBehind, online: OnlineStatus[isOnline()], lastVisible: this.lastVisible !== undefined ? performance.now() - this.lastVisible : undefined, checkpointSequenceNumber, quorumSize: (_a = this._protocolHandler) === null || _a === void 0 ? void 0 : _a.quorum.getMembers().size }, this._deltaManager.connectionProps));
|
|
1124
1107
|
if (value === ConnectionState.Connected) {
|
|
1125
1108
|
this.firstConnection = false;
|
|
1126
1109
|
}
|
|
@@ -1179,6 +1162,7 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
1179
1162
|
return this._deltaManager.submit(type, contents, batch, metadata);
|
|
1180
1163
|
}
|
|
1181
1164
|
processRemoteMessage(message) {
|
|
1165
|
+
var _a, _b;
|
|
1182
1166
|
// Check and report if we're getting messages from a clientId that we previously
|
|
1183
1167
|
// flagged as shouldHaveLeft, or from a client that's not in the quorum but should be
|
|
1184
1168
|
if (message.clientId != null) {
|
|
@@ -1211,35 +1195,17 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
1211
1195
|
// That means that if relay service changes settings, such changes will impact only newly booted
|
|
1212
1196
|
// clients.
|
|
1213
1197
|
// All existing will continue to use settings they got earlier.
|
|
1214
|
-
|
|
1198
|
+
assert(this.serviceConfiguration !== undefined, 0x2e4 /* "there should be service config for active connection" */);
|
|
1215
1199
|
this.collabWindowTracker = new CollabWindowTracker((type, contents) => {
|
|
1216
1200
|
assert(this.activeConnection(), 0x241 /* "disconnect should result in stopSequenceNumberUpdate() call" */);
|
|
1217
1201
|
this.submitMessage(type, contents);
|
|
1218
|
-
}, noopTimeFrequency, noopCountFrequency);
|
|
1202
|
+
}, (_a = this.serviceConfiguration) === null || _a === void 0 ? void 0 : _a.noopTimeFrequency, (_b = this.serviceConfiguration) === null || _b === void 0 ? void 0 : _b.noopCountFrequency);
|
|
1219
1203
|
}
|
|
1220
1204
|
this.collabWindowTracker.scheduleSequenceNumberUpdate(message, result.immediateNoOp === true);
|
|
1221
1205
|
}
|
|
1222
1206
|
this.emit("op", message);
|
|
1223
1207
|
return result;
|
|
1224
1208
|
}
|
|
1225
|
-
/**
|
|
1226
|
-
* #260 (ADO)
|
|
1227
|
-
* back-compat: noopTimeFrequency & noopCountFrequency properties were added to
|
|
1228
|
-
* IClientConfiguration in 0.59.3000. During the integration, we must read the
|
|
1229
|
-
* available configuration from the loader options.
|
|
1230
|
-
*/
|
|
1231
|
-
getNoopConfig() {
|
|
1232
|
-
var _a, _b;
|
|
1233
|
-
assert(this.serviceConfiguration !== undefined, 0x2e2);
|
|
1234
|
-
if (this.serviceConfiguration.noopTimeFrequency !== undefined ||
|
|
1235
|
-
this.serviceConfiguration.noopCountFrequency !== undefined) {
|
|
1236
|
-
return [
|
|
1237
|
-
this.serviceConfiguration.noopTimeFrequency,
|
|
1238
|
-
this.serviceConfiguration.noopCountFrequency,
|
|
1239
|
-
];
|
|
1240
|
-
}
|
|
1241
|
-
return [(_a = this.loader.services.options) === null || _a === void 0 ? void 0 : _a.noopTimeFrequency, (_b = this.loader.services.options) === null || _b === void 0 ? void 0 : _b.noopCountFrequency];
|
|
1242
|
-
}
|
|
1243
1209
|
submitSignal(message) {
|
|
1244
1210
|
this._deltaManager.submitSignal(JSON.stringify(message));
|
|
1245
1211
|
}
|
|
@@ -1280,12 +1246,12 @@ export class Container extends EventEmitterWithErrorHandling {
|
|
|
1280
1246
|
}
|
|
1281
1247
|
return { snapshot, versionId: version === null || version === void 0 ? void 0 : version.id };
|
|
1282
1248
|
}
|
|
1283
|
-
async instantiateContextDetached(existing, snapshot
|
|
1249
|
+
async instantiateContextDetached(existing, snapshot) {
|
|
1284
1250
|
const codeDetails = this.getCodeDetailsFromQuorum();
|
|
1285
1251
|
if (codeDetails === undefined) {
|
|
1286
1252
|
throw new Error("pkg should be provided in create flow!!");
|
|
1287
1253
|
}
|
|
1288
|
-
await this.instantiateContext(existing, codeDetails, snapshot
|
|
1254
|
+
await this.instantiateContext(existing, codeDetails, snapshot);
|
|
1289
1255
|
}
|
|
1290
1256
|
async instantiateContext(existing, codeDetails, snapshot, pendingLocalState) {
|
|
1291
1257
|
var _a;
|