@fluidframework/container-loader 2.0.0-internal.7.1.1 → 2.0.0-internal.7.2.1
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 +4 -0
- package/api-report/container-loader.api.md +13 -2
- package/dist/connectionManager.d.ts +1 -1
- package/dist/connectionManager.d.ts.map +1 -1
- package/dist/connectionManager.js +9 -4
- package/dist/connectionManager.js.map +1 -1
- package/dist/container.d.ts +6 -5
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +21 -19
- package/dist/container.js.map +1 -1
- package/dist/containerContext.d.ts +2 -2
- package/dist/containerContext.d.ts.map +1 -1
- package/dist/containerContext.js.map +1 -1
- package/dist/containerStorageAdapter.d.ts +1 -1
- package/dist/containerStorageAdapter.d.ts.map +1 -1
- package/dist/containerStorageAdapter.js +3 -3
- package/dist/containerStorageAdapter.js.map +1 -1
- package/dist/contracts.d.ts +1 -1
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js.map +1 -1
- package/dist/deltaManager.d.ts +1 -1
- package/dist/deltaManager.d.ts.map +1 -1
- package/dist/deltaManager.js +3 -8
- package/dist/deltaManager.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts +4 -4
- package/dist/loader.js +7 -7
- package/dist/loader.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/retriableDocumentStorageService.d.ts +3 -2
- package/dist/retriableDocumentStorageService.d.ts.map +1 -1
- package/dist/retriableDocumentStorageService.js +18 -11
- package/dist/retriableDocumentStorageService.js.map +1 -1
- package/dist/utils.d.ts +23 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +11 -3
- package/dist/utils.js.map +1 -1
- package/lib/connectionManager.d.ts +1 -1
- package/lib/connectionManager.d.ts.map +1 -1
- package/lib/connectionManager.js +9 -4
- package/lib/connectionManager.js.map +1 -1
- package/lib/container.d.ts +6 -5
- package/lib/container.d.ts.map +1 -1
- package/lib/container.js +21 -19
- package/lib/container.js.map +1 -1
- package/lib/containerContext.d.ts +2 -2
- package/lib/containerContext.d.ts.map +1 -1
- package/lib/containerContext.js.map +1 -1
- package/lib/containerStorageAdapter.d.ts +1 -1
- package/lib/containerStorageAdapter.d.ts.map +1 -1
- package/lib/containerStorageAdapter.js +3 -3
- package/lib/containerStorageAdapter.js.map +1 -1
- package/lib/contracts.d.ts +1 -1
- package/lib/contracts.d.ts.map +1 -1
- package/lib/contracts.js.map +1 -1
- package/lib/deltaManager.d.ts +1 -1
- package/lib/deltaManager.d.ts.map +1 -1
- package/lib/deltaManager.js +3 -8
- package/lib/deltaManager.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/loader.d.ts +4 -4
- package/lib/loader.js +8 -8
- package/lib/loader.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/retriableDocumentStorageService.d.ts +3 -2
- package/lib/retriableDocumentStorageService.d.ts.map +1 -1
- package/lib/retriableDocumentStorageService.js +18 -11
- package/lib/retriableDocumentStorageService.js.map +1 -1
- package/lib/utils.d.ts +23 -1
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +9 -1
- package/lib/utils.js.map +1 -1
- package/package.json +15 -16
- package/src/connectionManager.ts +13 -5
- package/src/container.ts +34 -24
- package/src/containerContext.ts +1 -1
- package/src/containerStorageAdapter.ts +3 -3
- package/src/contracts.ts +1 -1
- package/src/deltaManager.ts +6 -23
- package/src/index.ts +1 -0
- package/src/loader.ts +8 -8
- package/src/packageVersion.ts +1 -1
- package/src/retriableDocumentStorageService.ts +29 -15
- package/src/utils.ts +23 -1
- package/dist/container-loader-alpha.d.ts +0 -297
- package/dist/container-loader-beta.d.ts +0 -297
- package/dist/container-loader-public.d.ts +0 -297
- package/dist/container-loader.d.ts +0 -297
package/dist/container.js
CHANGED
|
@@ -36,6 +36,7 @@ const detachedContainerRefSeqNumber = 0;
|
|
|
36
36
|
const dirtyContainerEvent = "dirty";
|
|
37
37
|
const savedContainerEvent = "saved";
|
|
38
38
|
const packageNotFactoryError = "Code package does not implement IRuntimeFactory";
|
|
39
|
+
const hasBlobsSummaryTree = ".hasAttachmentBlobs";
|
|
39
40
|
/**
|
|
40
41
|
* Waits until container connects to delta storage and gets up-to-date.
|
|
41
42
|
*
|
|
@@ -189,6 +190,9 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
|
|
|
189
190
|
const container = new Container(createProps);
|
|
190
191
|
return telemetry_utils_1.PerformanceEvent.timedExecAsync(container.mc.logger, { eventName: "RehydrateDetachedFromSnapshot" }, async (_event) => {
|
|
191
192
|
const deserializedSummary = JSON.parse(snapshot);
|
|
193
|
+
if (!(0, driver_utils_1.isCombinedAppAndProtocolSummary)(deserializedSummary, hasBlobsSummaryTree)) {
|
|
194
|
+
throw new telemetry_utils_1.UsageError("Cannot rehydrate detached container. Incorrect format");
|
|
195
|
+
}
|
|
192
196
|
await container.rehydrateDetachedFromSnapshot(deserializedSummary);
|
|
193
197
|
return container;
|
|
194
198
|
}, { start: true, end: true, cancel: "generic" });
|
|
@@ -422,6 +426,7 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
|
|
|
422
426
|
const type = this.client.details.type;
|
|
423
427
|
const interactive = this.client.details.capabilities.interactive;
|
|
424
428
|
const clientType = `${interactive ? "interactive" : "noninteractive"}${type !== undefined && type !== "" ? `/${type}` : ""}`;
|
|
429
|
+
this._containerId = (0, uuid_1.v4)();
|
|
425
430
|
// Need to use the property getter for docId because for detached flow we don't have the docId initially.
|
|
426
431
|
// We assign the id later so property getter is used.
|
|
427
432
|
this.subLogger = (0, telemetry_utils_1.createChildLogger)({
|
|
@@ -429,7 +434,7 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
|
|
|
429
434
|
properties: {
|
|
430
435
|
all: {
|
|
431
436
|
clientType,
|
|
432
|
-
containerId:
|
|
437
|
+
containerId: this._containerId,
|
|
433
438
|
docId: () => this.resolvedUrl?.id,
|
|
434
439
|
containerAttachState: () => this._attachState,
|
|
435
440
|
containerLifecycleState: () => this._lifecycleState,
|
|
@@ -642,12 +647,15 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
|
|
|
642
647
|
this._lifecycleEvents.emit("disposed");
|
|
643
648
|
}
|
|
644
649
|
}
|
|
645
|
-
async closeAndGetPendingLocalState() {
|
|
650
|
+
async closeAndGetPendingLocalState(stopBlobAttachingSignal) {
|
|
646
651
|
// runtime matches pending ops to successful ones by clientId and client seq num, so we need to close the
|
|
647
652
|
// container at the same time we get pending state, otherwise this container could reconnect and resubmit with
|
|
648
653
|
// a new clientId and a future container using stale pending state without the new clientId would resubmit them
|
|
649
654
|
this.disconnectInternal({ text: "closeAndGetPendingLocalState" }); // TODO https://dev.azure.com/fluidframework/internal/_workitems/edit/5127
|
|
650
|
-
const pendingState = await this.getPendingLocalStateCore({
|
|
655
|
+
const pendingState = await this.getPendingLocalStateCore({
|
|
656
|
+
notifyImminentClosure: true,
|
|
657
|
+
stopBlobAttachingSignal,
|
|
658
|
+
});
|
|
651
659
|
this.close();
|
|
652
660
|
return pendingState;
|
|
653
661
|
}
|
|
@@ -693,7 +701,7 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
|
|
|
693
701
|
const protocolSummary = this.captureProtocolSummary();
|
|
694
702
|
const combinedSummary = (0, utils_1.combineAppAndProtocolSummary)(appSummary, protocolSummary);
|
|
695
703
|
if (this.detachedBlobStorage && this.detachedBlobStorage.size > 0) {
|
|
696
|
-
combinedSummary.tree[
|
|
704
|
+
combinedSummary.tree[hasBlobsSummaryTree] = {
|
|
697
705
|
type: protocol_definitions_1.SummaryType.Blob,
|
|
698
706
|
content: "true",
|
|
699
707
|
};
|
|
@@ -743,7 +751,7 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
|
|
|
743
751
|
cancel: this._deltaManager.closeAbortController.signal,
|
|
744
752
|
});
|
|
745
753
|
}
|
|
746
|
-
|
|
754
|
+
this.storageAdapter.connectToService(this.service);
|
|
747
755
|
if (hasAttachmentBlobs) {
|
|
748
756
|
// upload blobs to storage
|
|
749
757
|
(0, core_utils_1.assert)(!!this.detachedBlobStorage, 0x24e /* "assertion for type narrowing" */);
|
|
@@ -967,15 +975,7 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
|
|
|
967
975
|
if (loadMode.deltaConnection === undefined && !pendingLocalState) {
|
|
968
976
|
this.connectToDeltaStream(connectionArgs);
|
|
969
977
|
}
|
|
970
|
-
|
|
971
|
-
await this.storageAdapter.connectToService(this.service);
|
|
972
|
-
}
|
|
973
|
-
else {
|
|
974
|
-
// if we have pendingLocalState we can load without storage; don't wait for connection
|
|
975
|
-
this.storageAdapter.connectToService(this.service).catch((error) => {
|
|
976
|
-
this.close(error);
|
|
977
|
-
});
|
|
978
|
-
}
|
|
978
|
+
this.storageAdapter.connectToService(this.service);
|
|
979
979
|
this._attachState = container_definitions_1.AttachState.Attached;
|
|
980
980
|
timings.phase2 = client_utils_1.performance.now();
|
|
981
981
|
// Fetch specified snapshot.
|
|
@@ -1138,9 +1138,10 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
|
|
|
1138
1138
|
this.setLoaded();
|
|
1139
1139
|
}
|
|
1140
1140
|
async rehydrateDetachedFromSnapshot(detachedContainerSnapshot) {
|
|
1141
|
-
if (detachedContainerSnapshot.tree[
|
|
1141
|
+
if (detachedContainerSnapshot.tree[hasBlobsSummaryTree] !== undefined) {
|
|
1142
1142
|
(0, core_utils_1.assert)(!!this.detachedBlobStorage && this.detachedBlobStorage.size > 0, 0x250 /* "serialized container with attachment blobs must be rehydrated with detached blob storage" */);
|
|
1143
|
-
delete
|
|
1143
|
+
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
1144
|
+
delete detachedContainerSnapshot.tree[hasBlobsSummaryTree];
|
|
1144
1145
|
}
|
|
1145
1146
|
const snapshotTree = (0, utils_1.getSnapshotTreeFromSerializedContainer)(detachedContainerSnapshot);
|
|
1146
1147
|
this.storageAdapter.loadSnapshotForRehydratingContainer(snapshotTree);
|
|
@@ -1273,6 +1274,7 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
|
|
|
1273
1274
|
client.details.environment = [
|
|
1274
1275
|
client.details.environment,
|
|
1275
1276
|
` loaderVersion:${packageVersion_1.pkgVersion}`,
|
|
1277
|
+
` containerId:${this._containerId}`,
|
|
1276
1278
|
].join(";");
|
|
1277
1279
|
return client;
|
|
1278
1280
|
}
|
|
@@ -1486,8 +1488,8 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
|
|
|
1486
1488
|
}
|
|
1487
1489
|
this.emit("op", message);
|
|
1488
1490
|
}
|
|
1489
|
-
submitSignal(
|
|
1490
|
-
this._deltaManager.submitSignal(JSON.stringify(
|
|
1491
|
+
submitSignal(content, targetClientId) {
|
|
1492
|
+
this._deltaManager.submitSignal(JSON.stringify(content), targetClientId);
|
|
1491
1493
|
}
|
|
1492
1494
|
processSignal(message) {
|
|
1493
1495
|
// No clientId indicates a system signal message.
|
|
@@ -1542,7 +1544,7 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
|
|
|
1542
1544
|
const getSpecifiedCodeDetails = () => (this.protocolHandler.quorum.get("code") ??
|
|
1543
1545
|
this.protocolHandler.quorum.get("code2"));
|
|
1544
1546
|
const existing = snapshot !== undefined;
|
|
1545
|
-
const context = new containerContext_1.ContainerContext(this.options, this.scope, snapshot, this._loadedFromVersion, this._deltaManager, this.storageAdapter, this.protocolHandler.quorum, this.protocolHandler.audience, loader, (type, contents, batch, metadata) => this.submitContainerMessage(type, contents, batch, metadata), (summaryOp, referenceSequenceNumber) => this.submitSummaryMessage(summaryOp, referenceSequenceNumber), (batch, referenceSequenceNumber) => this.submitBatch(batch, referenceSequenceNumber), (
|
|
1547
|
+
const context = new containerContext_1.ContainerContext(this.options, this.scope, snapshot, this._loadedFromVersion, this._deltaManager, this.storageAdapter, this.protocolHandler.quorum, this.protocolHandler.audience, loader, (type, contents, batch, metadata) => this.submitContainerMessage(type, contents, batch, metadata), (summaryOp, referenceSequenceNumber) => this.submitSummaryMessage(summaryOp, referenceSequenceNumber), (batch, referenceSequenceNumber) => this.submitBatch(batch, referenceSequenceNumber), (content, targetClientId) => this.submitSignal(content, targetClientId), (error) => this.dispose(error), (error) => this.close(error), this.updateDirtyContainerState, this.getAbsoluteUrl, () => this.resolvedUrl?.id, () => this.clientId, () => this.attachState, () => this.connected, getSpecifiedCodeDetails, this._deltaManager.clientDetails, existing, this.subLogger, pendingLocalState);
|
|
1546
1548
|
this._runtime = await telemetry_utils_1.PerformanceEvent.timedExecAsync(this.subLogger, { eventName: "InstantiateRuntime" }, async () => runtimeFactory.instantiateRuntime(context, existing));
|
|
1547
1549
|
this._lifecycleEvents.emit("runtimeInstantiated");
|
|
1548
1550
|
this._loadedCodeDetails = codeDetails;
|