@fluidframework/container-loader 2.0.0-internal.7.1.0 → 2.0.0-internal.7.2.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.
Files changed (98) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/api-report/container-loader.api.md +13 -2
  3. package/dist/connectionManager.d.ts +1 -1
  4. package/dist/connectionManager.d.ts.map +1 -1
  5. package/dist/connectionManager.js +9 -4
  6. package/dist/connectionManager.js.map +1 -1
  7. package/dist/container.d.ts +6 -5
  8. package/dist/container.d.ts.map +1 -1
  9. package/dist/container.js +21 -19
  10. package/dist/container.js.map +1 -1
  11. package/dist/containerContext.d.ts +2 -2
  12. package/dist/containerContext.d.ts.map +1 -1
  13. package/dist/containerContext.js.map +1 -1
  14. package/dist/containerStorageAdapter.d.ts +1 -1
  15. package/dist/containerStorageAdapter.d.ts.map +1 -1
  16. package/dist/containerStorageAdapter.js +3 -3
  17. package/dist/containerStorageAdapter.js.map +1 -1
  18. package/dist/contracts.d.ts +1 -1
  19. package/dist/contracts.d.ts.map +1 -1
  20. package/dist/contracts.js.map +1 -1
  21. package/dist/deltaManager.d.ts +1 -1
  22. package/dist/deltaManager.d.ts.map +1 -1
  23. package/dist/deltaManager.js +3 -8
  24. package/dist/deltaManager.js.map +1 -1
  25. package/dist/index.d.ts +1 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +3 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/loader.d.ts +4 -4
  30. package/dist/loader.js +7 -7
  31. package/dist/loader.js.map +1 -1
  32. package/dist/packageVersion.d.ts +1 -1
  33. package/dist/packageVersion.js +1 -1
  34. package/dist/packageVersion.js.map +1 -1
  35. package/dist/retriableDocumentStorageService.d.ts +3 -2
  36. package/dist/retriableDocumentStorageService.d.ts.map +1 -1
  37. package/dist/retriableDocumentStorageService.js +18 -11
  38. package/dist/retriableDocumentStorageService.js.map +1 -1
  39. package/dist/utils.d.ts +23 -1
  40. package/dist/utils.d.ts.map +1 -1
  41. package/dist/utils.js +11 -3
  42. package/dist/utils.js.map +1 -1
  43. package/lib/connectionManager.d.ts +1 -1
  44. package/lib/connectionManager.d.ts.map +1 -1
  45. package/lib/connectionManager.js +9 -4
  46. package/lib/connectionManager.js.map +1 -1
  47. package/lib/container.d.ts +6 -5
  48. package/lib/container.d.ts.map +1 -1
  49. package/lib/container.js +21 -19
  50. package/lib/container.js.map +1 -1
  51. package/lib/containerContext.d.ts +2 -2
  52. package/lib/containerContext.d.ts.map +1 -1
  53. package/lib/containerContext.js.map +1 -1
  54. package/lib/containerStorageAdapter.d.ts +1 -1
  55. package/lib/containerStorageAdapter.d.ts.map +1 -1
  56. package/lib/containerStorageAdapter.js +3 -3
  57. package/lib/containerStorageAdapter.js.map +1 -1
  58. package/lib/contracts.d.ts +1 -1
  59. package/lib/contracts.d.ts.map +1 -1
  60. package/lib/contracts.js.map +1 -1
  61. package/lib/deltaManager.d.ts +1 -1
  62. package/lib/deltaManager.d.ts.map +1 -1
  63. package/lib/deltaManager.js +3 -8
  64. package/lib/deltaManager.js.map +1 -1
  65. package/lib/index.d.ts +1 -0
  66. package/lib/index.d.ts.map +1 -1
  67. package/lib/index.js +1 -0
  68. package/lib/index.js.map +1 -1
  69. package/lib/loader.d.ts +4 -4
  70. package/lib/loader.js +8 -8
  71. package/lib/loader.js.map +1 -1
  72. package/lib/packageVersion.d.ts +1 -1
  73. package/lib/packageVersion.js +1 -1
  74. package/lib/packageVersion.js.map +1 -1
  75. package/lib/retriableDocumentStorageService.d.ts +3 -2
  76. package/lib/retriableDocumentStorageService.d.ts.map +1 -1
  77. package/lib/retriableDocumentStorageService.js +18 -11
  78. package/lib/retriableDocumentStorageService.js.map +1 -1
  79. package/lib/utils.d.ts +23 -1
  80. package/lib/utils.d.ts.map +1 -1
  81. package/lib/utils.js +9 -1
  82. package/lib/utils.js.map +1 -1
  83. package/package.json +16 -17
  84. package/src/connectionManager.ts +13 -5
  85. package/src/container.ts +34 -24
  86. package/src/containerContext.ts +1 -1
  87. package/src/containerStorageAdapter.ts +3 -3
  88. package/src/contracts.ts +1 -1
  89. package/src/deltaManager.ts +6 -23
  90. package/src/index.ts +1 -0
  91. package/src/loader.ts +8 -8
  92. package/src/packageVersion.ts +1 -1
  93. package/src/retriableDocumentStorageService.ts +29 -15
  94. package/src/utils.ts +23 -1
  95. package/dist/container-loader-alpha.d.ts +0 -297
  96. package/dist/container-loader-beta.d.ts +0 -297
  97. package/dist/container-loader-public.d.ts +0 -297
  98. 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: (0, uuid_1.v4)(),
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({ notifyImminentClosure: true });
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[".hasAttachmentBlobs"] = {
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
- await this.storageAdapter.connectToService(this.service);
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
- if (!pendingLocalState) {
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[".hasAttachmentBlobs"] !== undefined) {
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 detachedContainerSnapshot.tree[".hasAttachmentBlobs"];
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(message) {
1490
- this._deltaManager.submitSignal(JSON.stringify(message));
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), (message) => this.submitSignal(message), (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);
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;