@fluidframework/container-runtime 2.4.0-299707 → 2.5.0-302463

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 (84) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/container-runtime.test-files.tar +0 -0
  3. package/dist/blobManager/blobManager.d.ts.map +1 -1
  4. package/dist/blobManager/blobManager.js +10 -4
  5. package/dist/blobManager/blobManager.js.map +1 -1
  6. package/dist/channelCollection.d.ts.map +1 -1
  7. package/dist/channelCollection.js +10 -2
  8. package/dist/channelCollection.js.map +1 -1
  9. package/dist/containerRuntime.d.ts +6 -2
  10. package/dist/containerRuntime.d.ts.map +1 -1
  11. package/dist/containerRuntime.js +46 -28
  12. package/dist/containerRuntime.js.map +1 -1
  13. package/dist/dataStoreContexts.d.ts.map +1 -1
  14. package/dist/dataStoreContexts.js +14 -6
  15. package/dist/dataStoreContexts.js.map +1 -1
  16. package/dist/opLifecycle/index.d.ts +1 -1
  17. package/dist/opLifecycle/index.d.ts.map +1 -1
  18. package/dist/opLifecycle/index.js +2 -1
  19. package/dist/opLifecycle/index.js.map +1 -1
  20. package/dist/opLifecycle/outbox.d.ts +6 -0
  21. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  22. package/dist/opLifecycle/outbox.js +9 -1
  23. package/dist/opLifecycle/outbox.js.map +1 -1
  24. package/dist/opLifecycle/remoteMessageProcessor.d.ts +4 -4
  25. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  26. package/dist/opLifecycle/remoteMessageProcessor.js +6 -18
  27. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  28. package/dist/opProperties.js +1 -1
  29. package/dist/opProperties.js.map +1 -1
  30. package/dist/packageVersion.d.ts +1 -1
  31. package/dist/packageVersion.js +1 -1
  32. package/dist/packageVersion.js.map +1 -1
  33. package/dist/summary/documentSchema.js +2 -2
  34. package/dist/summary/documentSchema.js.map +1 -1
  35. package/dist/summary/summaryCollection.d.ts.map +1 -1
  36. package/dist/summary/summaryCollection.js +3 -4
  37. package/dist/summary/summaryCollection.js.map +1 -1
  38. package/lib/blobManager/blobManager.d.ts.map +1 -1
  39. package/lib/blobManager/blobManager.js +10 -4
  40. package/lib/blobManager/blobManager.js.map +1 -1
  41. package/lib/channelCollection.d.ts.map +1 -1
  42. package/lib/channelCollection.js +11 -3
  43. package/lib/channelCollection.js.map +1 -1
  44. package/lib/containerRuntime.d.ts +6 -2
  45. package/lib/containerRuntime.d.ts.map +1 -1
  46. package/lib/containerRuntime.js +44 -27
  47. package/lib/containerRuntime.js.map +1 -1
  48. package/lib/dataStoreContexts.d.ts.map +1 -1
  49. package/lib/dataStoreContexts.js +15 -7
  50. package/lib/dataStoreContexts.js.map +1 -1
  51. package/lib/opLifecycle/index.d.ts +1 -1
  52. package/lib/opLifecycle/index.d.ts.map +1 -1
  53. package/lib/opLifecycle/index.js +1 -1
  54. package/lib/opLifecycle/index.js.map +1 -1
  55. package/lib/opLifecycle/outbox.d.ts +6 -0
  56. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  57. package/lib/opLifecycle/outbox.js +7 -0
  58. package/lib/opLifecycle/outbox.js.map +1 -1
  59. package/lib/opLifecycle/remoteMessageProcessor.d.ts +4 -4
  60. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  61. package/lib/opLifecycle/remoteMessageProcessor.js +6 -18
  62. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  63. package/lib/opProperties.js +1 -1
  64. package/lib/opProperties.js.map +1 -1
  65. package/lib/packageVersion.d.ts +1 -1
  66. package/lib/packageVersion.js +1 -1
  67. package/lib/packageVersion.js.map +1 -1
  68. package/lib/summary/documentSchema.js +2 -2
  69. package/lib/summary/documentSchema.js.map +1 -1
  70. package/lib/summary/summaryCollection.d.ts.map +1 -1
  71. package/lib/summary/summaryCollection.js +3 -4
  72. package/lib/summary/summaryCollection.js.map +1 -1
  73. package/package.json +22 -26
  74. package/src/blobManager/blobManager.ts +10 -4
  75. package/src/channelCollection.ts +16 -7
  76. package/src/containerRuntime.ts +49 -27
  77. package/src/dataStoreContexts.ts +20 -7
  78. package/src/opLifecycle/index.ts +1 -1
  79. package/src/opLifecycle/outbox.ts +11 -0
  80. package/src/opLifecycle/remoteMessageProcessor.ts +8 -22
  81. package/src/opProperties.ts +1 -1
  82. package/src/packageVersion.ts +1 -1
  83. package/src/summary/documentSchema.ts +2 -2
  84. package/src/summary/summaryCollection.ts +3 -4
@@ -25,7 +25,7 @@ import { FluidDataStoreRegistry } from "./dataStoreRegistry.js";
25
25
  import { DeltaManagerPendingOpsProxy, DeltaManagerSummarizerProxy, } from "./deltaManagerProxies.js";
26
26
  import { GCNodeType, GarbageCollector, gcGenerationOptionName, } from "./gc/index.js";
27
27
  import { ContainerMessageType, } from "./messageTypes.js";
28
- import { DuplicateBatchDetector, ensureContentsDeserialized, OpCompressor, OpDecompressor, OpGroupingManager, OpSplitter, Outbox, RemoteMessageProcessor, } from "./opLifecycle/index.js";
28
+ import { DuplicateBatchDetector, ensureContentsDeserialized, OpCompressor, OpDecompressor, OpGroupingManager, OpSplitter, Outbox, RemoteMessageProcessor, serializeOpContents, } from "./opLifecycle/index.js";
29
29
  import { pkgVersion } from "./packageVersion.js";
30
30
  import { PendingStateManager, } from "./pendingStateManager.js";
31
31
  import { ScheduleManager } from "./scheduleManager.js";
@@ -89,12 +89,6 @@ export const TombstoneResponseHeaderKey = "isTombstoned";
89
89
  * to this was experimental and is no longer supported.
90
90
  */
91
91
  export const InactiveResponseHeaderKey = "isInactive";
92
- /** Default values for Runtime Headers */
93
- export const defaultRuntimeHeaderData = {
94
- wait: true,
95
- viaHandle: false,
96
- allowTombstone: false,
97
- };
98
92
  /**
99
93
  * Available compression algorithms for op compression.
100
94
  * @legacy
@@ -232,7 +226,7 @@ function lastMessageFromMetadata(metadata) {
232
226
  * to understand if/when it is hit.
233
227
  * We only want to log this once, to avoid spamming telemetry if we are wrong and these cases are hit commonly.
234
228
  */
235
- let getSingleUseLegacyLogCallback = (logger, type) => {
229
+ export let getSingleUseLegacyLogCallback = (logger, type) => {
236
230
  return (codePath) => {
237
231
  logger.sendTelemetryEvent({
238
232
  eventName: "LegacyMessageFormat",
@@ -1519,8 +1513,11 @@ export class ContainerRuntime extends TypedEventEmitter {
1519
1513
  const hasModernRuntimeMessageEnvelope = messageCopy.type === MessageType.Operation;
1520
1514
  const savedOp = messageCopy.metadata?.savedOp;
1521
1515
  const logLegacyCase = getSingleUseLegacyLogCallback(this.logger, messageCopy.type);
1522
- // We expect runtime messages to have JSON contents - deserialize it in place.
1523
- ensureContentsDeserialized(messageCopy, hasModernRuntimeMessageEnvelope, logLegacyCase);
1516
+ let runtimeBatch = hasModernRuntimeMessageEnvelope || isUnpackedRuntimeMessage(messageCopy);
1517
+ if (runtimeBatch) {
1518
+ // We expect runtime messages to have JSON contents - deserialize it in place.
1519
+ ensureContentsDeserialized(messageCopy);
1520
+ }
1524
1521
  if (hasModernRuntimeMessageEnvelope) {
1525
1522
  // If the message has the modern message envelope, then process it here.
1526
1523
  // Here we unpack the message (decompress, unchunk, and/or ungroup) into a batch of messages with ContainerMessageType
@@ -1549,7 +1546,6 @@ export class ContainerRuntime extends TypedEventEmitter {
1549
1546
  throw error;
1550
1547
  }
1551
1548
  }
1552
- let runtimeBatch = true;
1553
1549
  // Reach out to PendingStateManager, either to zip localOpMetadata into the *local* message list,
1554
1550
  // or to check to ensure the *remote* messages don't match the batchId of a pending local batch.
1555
1551
  // This latter case would indicate that the container has forked - two copies are trying to persist the same local changes.
@@ -1588,8 +1584,17 @@ export class ContainerRuntime extends TypedEventEmitter {
1588
1584
  this.processInboundMessages(messagesWithPendingState, locationInBatch, local, savedOp, runtimeBatch);
1589
1585
  }
1590
1586
  else {
1587
+ if (!runtimeBatch) {
1588
+ // The DeltaManager used to do this, but doesn't anymore as of Loader v2.4
1589
+ // Anyone listening to our "op" event would expect the contents to be parsed per this same logic
1590
+ if (typeof messageCopy.contents === "string" &&
1591
+ messageCopy.contents !== "" &&
1592
+ messageCopy.type !== MessageType.ClientLeave) {
1593
+ messageCopy.contents = JSON.parse(messageCopy.contents);
1594
+ }
1595
+ }
1591
1596
  this.processInboundMessages([{ message: messageCopy, localOpMetadata: undefined }], { batchStart: true, batchEnd: true }, // Single message
1592
- local, savedOp, isUnpackedRuntimeMessage(messageCopy) /* runtimeBatch */);
1597
+ local, savedOp, runtimeBatch);
1593
1598
  }
1594
1599
  if (local) {
1595
1600
  // If we have processed a local op, this means that the container is
@@ -1732,11 +1737,13 @@ export class ContainerRuntime extends TypedEventEmitter {
1732
1737
  const duration = Date.now() - this._signalTracking.signalTimestamp;
1733
1738
  this.mc.logger.sendPerformanceEvent({
1734
1739
  eventName: "SignalLatency",
1735
- duration, // Roundtrip duration of the tracked signal in milliseconds.
1736
- signalsSent: this._signalTracking.totalSignalsSentInLatencyWindow, // Signals sent since the last logged SignalLatency event.
1737
- signalsLost: this._signalTracking.signalsLost, // Signals lost since the last logged SignalLatency event.
1738
- outOfOrderSignals: this._signalTracking.signalsOutOfOrder, // Out of order signals since the last logged SignalLatency event.
1739
- reconnectCount: this.consecutiveReconnects, // Container reconnect count.
1740
+ details: {
1741
+ duration, // Roundtrip duration of the tracked signal in milliseconds.
1742
+ sent: this._signalTracking.totalSignalsSentInLatencyWindow, // Signals sent since the last logged SignalLatency event.
1743
+ lost: this._signalTracking.signalsLost, // Signals lost since the last logged SignalLatency event.
1744
+ outOfOrder: this._signalTracking.signalsOutOfOrder, // Out of order signals since the last logged SignalLatency event.
1745
+ reconnectCount: this.consecutiveReconnects, // Container reconnect count.
1746
+ },
1740
1747
  });
1741
1748
  this._signalTracking.signalsLost = 0;
1742
1749
  this._signalTracking.signalsOutOfOrder = 0;
@@ -1763,9 +1770,11 @@ export class ContainerRuntime extends TypedEventEmitter {
1763
1770
  this._signalTracking.signalsLost += signalsLost;
1764
1771
  this.mc.logger.sendErrorEvent({
1765
1772
  eventName: "SignalLost",
1766
- signalsLost, // Number of lost signals detected.
1767
- trackingSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
1768
- clientBroadcastSignalSequenceNumber, // Actual signal sequence number received.
1773
+ details: {
1774
+ signalsLost, // Number of lost signals detected.
1775
+ expectedSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
1776
+ clientBroadcastSignalSequenceNumber, // Actual signal sequence number received.
1777
+ },
1769
1778
  });
1770
1779
  }
1771
1780
  // Update the tracking signal sequence number to the next expected signal in the sequence.
@@ -1777,11 +1786,18 @@ export class ContainerRuntime extends TypedEventEmitter {
1777
1786
  clientBroadcastSignalSequenceNumber >=
1778
1787
  this._signalTracking.minimumTrackingSignalSequenceNumber) {
1779
1788
  this._signalTracking.signalsOutOfOrder++;
1789
+ const details = {
1790
+ expectedSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
1791
+ clientBroadcastSignalSequenceNumber, // Sequence number of the out of order signal.
1792
+ };
1793
+ // Only log `contents.type` when address is for container to avoid
1794
+ // chance that contents type is customer data.
1795
+ if (envelope.address === undefined) {
1796
+ details.contentsType = envelope.contents.type; // Type of signal that was received out of order.
1797
+ }
1780
1798
  this.mc.logger.sendTelemetryEvent({
1781
1799
  eventName: "SignalOutOfOrder",
1782
- type: envelope.contents.type, // Type of signal that was received out of order.
1783
- trackingSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
1784
- clientBroadcastSignalSequenceNumber, // Sequence number of the out of order signal.
1800
+ details,
1785
1801
  });
1786
1802
  }
1787
1803
  if (this._signalTracking.roundTripSignalSequenceNumber !== undefined &&
@@ -1790,7 +1806,8 @@ export class ContainerRuntime extends TypedEventEmitter {
1790
1806
  this._signalTracking.roundTripSignalSequenceNumber) {
1791
1807
  // Latency tracked signal has been received.
1792
1808
  // We now log the roundtrip duration of the tracked signal.
1793
- // This telemetry event also logs metrics for signals sent, signals lost, and out of order signals received.
1809
+ // This telemetry event also logs metrics for broadcast signals
1810
+ // sent, lost, and out of order.
1794
1811
  // These metrics are reset after logging the telemetry event.
1795
1812
  this.sendSignalTelemetryEvent();
1796
1813
  }
@@ -2636,7 +2653,7 @@ export class ContainerRuntime extends TypedEventEmitter {
2636
2653
  contents: idRange,
2637
2654
  };
2638
2655
  const idAllocationBatchMessage = {
2639
- contents: JSON.stringify(idAllocationMessage),
2656
+ contents: serializeOpContents(idAllocationMessage),
2640
2657
  referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
2641
2658
  };
2642
2659
  this.outbox.submitIdAllocation(idAllocationBatchMessage);
@@ -2679,12 +2696,12 @@ export class ContainerRuntime extends TypedEventEmitter {
2679
2696
  contents: schemaChangeMessage,
2680
2697
  };
2681
2698
  this.outbox.submit({
2682
- contents: JSON.stringify(msg),
2699
+ contents: serializeOpContents(msg),
2683
2700
  referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
2684
2701
  });
2685
2702
  }
2686
2703
  const message = {
2687
- contents: JSON.stringify(containerRuntimeMessage) /* serialized content */,
2704
+ contents: serializeOpContents(containerRuntimeMessage),
2688
2705
  metadata,
2689
2706
  localOpMetadata,
2690
2707
  referenceSequenceNumber: this.deltaManager.lastSequenceNumber,