@fluidframework/container-runtime 2.5.0-302463 → 2.5.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 (99) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/api-report/container-runtime.legacy.alpha.api.md +3 -1
  3. package/container-runtime.test-files.tar +0 -0
  4. package/dist/blobManager/blobManager.d.ts +3 -3
  5. package/dist/blobManager/blobManager.d.ts.map +1 -1
  6. package/dist/blobManager/blobManager.js +1 -1
  7. package/dist/blobManager/blobManager.js.map +1 -1
  8. package/dist/channelCollection.d.ts +20 -5
  9. package/dist/channelCollection.d.ts.map +1 -1
  10. package/dist/channelCollection.js +185 -129
  11. package/dist/channelCollection.js.map +1 -1
  12. package/dist/containerRuntime.d.ts +14 -4
  13. package/dist/containerRuntime.d.ts.map +1 -1
  14. package/dist/containerRuntime.js +138 -55
  15. package/dist/containerRuntime.js.map +1 -1
  16. package/dist/dataStoreContext.d.ts +15 -3
  17. package/dist/dataStoreContext.d.ts.map +1 -1
  18. package/dist/dataStoreContext.js +48 -19
  19. package/dist/dataStoreContext.js.map +1 -1
  20. package/dist/dataStoreContexts.d.ts.map +1 -1
  21. package/dist/dataStoreContexts.js +6 -14
  22. package/dist/dataStoreContexts.js.map +1 -1
  23. package/dist/gc/garbageCollection.d.ts +5 -6
  24. package/dist/gc/garbageCollection.d.ts.map +1 -1
  25. package/dist/gc/garbageCollection.js +23 -22
  26. package/dist/gc/garbageCollection.js.map +1 -1
  27. package/dist/gc/gcDefinitions.d.ts +2 -2
  28. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  29. package/dist/gc/gcDefinitions.js.map +1 -1
  30. package/dist/opLifecycle/outbox.d.ts +3 -0
  31. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  32. package/dist/opLifecycle/outbox.js +9 -0
  33. package/dist/opLifecycle/outbox.js.map +1 -1
  34. package/dist/opLifecycle/remoteMessageProcessor.d.ts +1 -0
  35. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  36. package/dist/opLifecycle/remoteMessageProcessor.js +2 -0
  37. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  38. package/dist/packageVersion.d.ts +1 -1
  39. package/dist/packageVersion.d.ts.map +1 -1
  40. package/dist/packageVersion.js +1 -1
  41. package/dist/packageVersion.js.map +1 -1
  42. package/dist/summary/documentSchema.d.ts +11 -0
  43. package/dist/summary/documentSchema.d.ts.map +1 -1
  44. package/dist/summary/documentSchema.js +43 -28
  45. package/dist/summary/documentSchema.js.map +1 -1
  46. package/lib/blobManager/blobManager.d.ts +3 -3
  47. package/lib/blobManager/blobManager.d.ts.map +1 -1
  48. package/lib/blobManager/blobManager.js +1 -1
  49. package/lib/blobManager/blobManager.js.map +1 -1
  50. package/lib/channelCollection.d.ts +20 -5
  51. package/lib/channelCollection.d.ts.map +1 -1
  52. package/lib/channelCollection.js +186 -130
  53. package/lib/channelCollection.js.map +1 -1
  54. package/lib/containerRuntime.d.ts +14 -4
  55. package/lib/containerRuntime.d.ts.map +1 -1
  56. package/lib/containerRuntime.js +137 -54
  57. package/lib/containerRuntime.js.map +1 -1
  58. package/lib/dataStoreContext.d.ts +15 -3
  59. package/lib/dataStoreContext.d.ts.map +1 -1
  60. package/lib/dataStoreContext.js +48 -19
  61. package/lib/dataStoreContext.js.map +1 -1
  62. package/lib/dataStoreContexts.d.ts.map +1 -1
  63. package/lib/dataStoreContexts.js +7 -15
  64. package/lib/dataStoreContexts.js.map +1 -1
  65. package/lib/gc/garbageCollection.d.ts +5 -6
  66. package/lib/gc/garbageCollection.d.ts.map +1 -1
  67. package/lib/gc/garbageCollection.js +23 -22
  68. package/lib/gc/garbageCollection.js.map +1 -1
  69. package/lib/gc/gcDefinitions.d.ts +2 -2
  70. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  71. package/lib/gc/gcDefinitions.js.map +1 -1
  72. package/lib/opLifecycle/outbox.d.ts +3 -0
  73. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  74. package/lib/opLifecycle/outbox.js +9 -0
  75. package/lib/opLifecycle/outbox.js.map +1 -1
  76. package/lib/opLifecycle/remoteMessageProcessor.d.ts +1 -0
  77. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  78. package/lib/opLifecycle/remoteMessageProcessor.js +2 -0
  79. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  80. package/lib/packageVersion.d.ts +1 -1
  81. package/lib/packageVersion.d.ts.map +1 -1
  82. package/lib/packageVersion.js +1 -1
  83. package/lib/packageVersion.js.map +1 -1
  84. package/lib/summary/documentSchema.d.ts +11 -0
  85. package/lib/summary/documentSchema.d.ts.map +1 -1
  86. package/lib/summary/documentSchema.js +43 -28
  87. package/lib/summary/documentSchema.js.map +1 -1
  88. package/package.json +23 -19
  89. package/src/blobManager/blobManager.ts +2 -2
  90. package/src/channelCollection.ts +234 -176
  91. package/src/containerRuntime.ts +179 -68
  92. package/src/dataStoreContext.ts +66 -23
  93. package/src/dataStoreContexts.ts +7 -20
  94. package/src/gc/garbageCollection.ts +32 -32
  95. package/src/gc/gcDefinitions.ts +3 -3
  96. package/src/opLifecycle/outbox.ts +12 -0
  97. package/src/opLifecycle/remoteMessageProcessor.ts +3 -0
  98. package/src/packageVersion.ts +1 -1
  99. package/src/summary/documentSchema.ts +56 -37
@@ -38,14 +38,6 @@ var RuntimeHeaders;
38
38
  * @alpha
39
39
  */
40
40
  exports.AllowTombstoneRequestHeaderKey = "allowTombstone"; // Belongs in the enum above, but avoiding the breaking change
41
- function computeRuntimeHeaderData(config, data) {
42
- return {
43
- wait: config.getBoolean("Fluid.ContainerRuntime.WaitHeaderDefault") ?? true,
44
- viaHandle: false,
45
- allowTombstone: false,
46
- ...data,
47
- };
48
- }
49
41
  /**
50
42
  * Creates a shallow wrapper of {@link IFluidParentContext}. The wrapper can then have its methods overwritten as needed
51
43
  */
@@ -264,87 +256,93 @@ class ChannelCollection {
264
256
  makeVisibleAndAttachGraph() {
265
257
  this.parentContext.makeLocallyVisible();
266
258
  }
267
- processAttachMessage(message, local) {
268
- const attachMessage = message.contents;
269
- // We need to process the GC Data for both local and remote attach messages
270
- const foundGCData = (0, internal_5.processAttachMessageGCData)(attachMessage.snapshot, (nodeId, toPath) => {
271
- // nodeId is the relative path under the node being attached. Always starts with "/", but no trailing "/" after an id
272
- const fromPath = `/${attachMessage.id}${nodeId === "/" ? "" : nodeId}`;
273
- this.parentContext.addedGCOutboundRoute(fromPath, toPath, message.timestamp);
274
- });
275
- // Only log once per container to avoid noise/cost.
276
- // Allows longitudinal tracking of various state (e.g. foundGCData), and some sampled details
277
- if (this.shouldSendAttachLog) {
278
- this.shouldSendAttachLog = false;
279
- this.mc.logger.sendTelemetryEvent({
280
- eventName: "dataStoreAttachMessage_sampled",
281
- ...(0, internal_6.tagCodeArtifacts)({ id: attachMessage.id, pkg: attachMessage.type }),
282
- details: {
283
- local,
284
- snapshot: !!attachMessage.snapshot,
285
- foundGCData,
286
- },
287
- ...(0, internal_6.extractSafePropertiesFromMessage)(message),
288
- });
289
- }
290
- // The local object has already been attached
291
- if (local) {
292
- (0, internal_1.assert)(this.pendingAttach.has(attachMessage.id), 0x15e /* "Local object does not have matching attach message id" */);
293
- this.contexts.get(attachMessage.id)?.setAttachState(container_definitions_1.AttachState.Attached);
294
- this.pendingAttach.delete(attachMessage.id);
295
- return;
296
- }
297
- // If a non-local operation then go and create the object, otherwise mark it as officially attached.
298
- if (this.alreadyProcessed(attachMessage.id)) {
299
- // TODO: dataStoreId may require a different tag from PackageData #7488
300
- const error = new internal_6.DataCorruptionError(
301
- // pre-0.58 error message: duplicateDataStoreCreatedWithExistingId
302
- "Duplicate DataStore created with existing id", {
303
- ...(0, internal_6.extractSafePropertiesFromMessage)(message),
304
- ...(0, internal_6.tagCodeArtifacts)({ dataStoreId: attachMessage.id }),
259
+ processAttachMessages(messageCollection) {
260
+ const { envelope, messagesContent, local } = messageCollection;
261
+ for (const { contents } of messagesContent) {
262
+ const attachMessage = contents;
263
+ // We need to process the GC Data for both local and remote attach messages
264
+ const foundGCData = (0, internal_5.processAttachMessageGCData)(attachMessage.snapshot, (nodeId, toPath) => {
265
+ // nodeId is the relative path under the node being attached. Always starts with "/", but no trailing "/" after an id
266
+ const fromPath = `/${attachMessage.id}${nodeId === "/" ? "" : nodeId}`;
267
+ this.parentContext.addedGCOutboundRoute(fromPath, toPath, envelope.timestamp);
305
268
  });
306
- throw error;
307
- }
308
- const flatAttachBlobs = new Map();
309
- let snapshot;
310
- if (attachMessage.snapshot) {
311
- snapshot = (0, internal_3.buildSnapshotTree)(attachMessage.snapshot.entries, flatAttachBlobs);
312
- if ((0, internal_3.isInstanceOfISnapshot)(this.baseSnapshot)) {
313
- snapshot = { ...this.baseSnapshot, snapshotTree: snapshot };
269
+ // Only log once per container to avoid noise/cost.
270
+ // Allows longitudinal tracking of various state (e.g. foundGCData), and some sampled details
271
+ if (this.shouldSendAttachLog) {
272
+ this.shouldSendAttachLog = false;
273
+ this.mc.logger.sendTelemetryEvent({
274
+ eventName: "dataStoreAttachMessage_sampled",
275
+ ...(0, internal_6.tagCodeArtifacts)({ id: attachMessage.id, pkg: attachMessage.type }),
276
+ details: {
277
+ local,
278
+ snapshot: !!attachMessage.snapshot,
279
+ foundGCData,
280
+ },
281
+ ...(0, internal_6.extractSafePropertiesFromMessage)(envelope),
282
+ });
314
283
  }
315
- }
316
- // Include the type of attach message which is the pkg of the store to be
317
- // used by RemoteFluidDataStoreContext in case it is not in the snapshot.
318
- const pkg = [attachMessage.type];
319
- const remoteFluidDataStoreContext = new dataStoreContext_js_1.RemoteFluidDataStoreContext({
320
- id: attachMessage.id,
321
- snapshot,
322
- parentContext: this.wrapContextForInnerChannel(attachMessage.id),
323
- storage: new storageServiceWithAttachBlobs_js_1.StorageServiceWithAttachBlobs(this.parentContext.storage, flatAttachBlobs),
324
- scope: this.parentContext.scope,
325
- loadingGroupId: attachMessage.snapshot?.groupId,
326
- createSummarizerNodeFn: this.parentContext.getCreateChildSummarizerNodeFn(attachMessage.id, {
327
- type: internal_4.CreateSummarizerNodeSource.FromAttach,
328
- sequenceNumber: message.sequenceNumber,
329
- snapshot: attachMessage.snapshot ?? {
330
- entries: [(0, dataStoreContext_js_1.createAttributesBlob)(pkg, true /* isRootDataStore */)],
331
- },
332
- }),
333
- pkg,
334
- });
335
- this.contexts.addBoundOrRemoted(remoteFluidDataStoreContext);
336
- }
337
- processAliasMessage(message, localOpMetadata, local) {
338
- const aliasMessage = message.contents;
339
- if (!(0, dataStore_js_1.isDataStoreAliasMessage)(aliasMessage)) {
340
- throw new internal_6.DataCorruptionError("malformedDataStoreAliasMessage", {
341
- ...(0, internal_6.extractSafePropertiesFromMessage)(message),
284
+ // The local object has already been attached
285
+ if (local) {
286
+ (0, internal_1.assert)(this.pendingAttach.has(attachMessage.id), 0x15e /* "Local object does not have matching attach message id" */);
287
+ this.contexts.get(attachMessage.id)?.setAttachState(container_definitions_1.AttachState.Attached);
288
+ this.pendingAttach.delete(attachMessage.id);
289
+ continue;
290
+ }
291
+ // If a non-local operation then go and create the object, otherwise mark it as officially attached.
292
+ if (this.alreadyProcessed(attachMessage.id)) {
293
+ // TODO: dataStoreId may require a different tag from PackageData #7488
294
+ const error = new internal_6.DataCorruptionError(
295
+ // pre-0.58 error message: duplicateDataStoreCreatedWithExistingId
296
+ "Duplicate DataStore created with existing id", {
297
+ ...(0, internal_6.extractSafePropertiesFromMessage)(envelope),
298
+ ...(0, internal_6.tagCodeArtifacts)({ dataStoreId: attachMessage.id }),
299
+ });
300
+ throw error;
301
+ }
302
+ const flatAttachBlobs = new Map();
303
+ let snapshot;
304
+ if (attachMessage.snapshot) {
305
+ snapshot = (0, internal_3.buildSnapshotTree)(attachMessage.snapshot.entries, flatAttachBlobs);
306
+ if ((0, internal_3.isInstanceOfISnapshot)(this.baseSnapshot)) {
307
+ snapshot = { ...this.baseSnapshot, snapshotTree: snapshot };
308
+ }
309
+ }
310
+ // Include the type of attach message which is the pkg of the store to be
311
+ // used by RemoteFluidDataStoreContext in case it is not in the snapshot.
312
+ const pkg = [attachMessage.type];
313
+ const remoteFluidDataStoreContext = new dataStoreContext_js_1.RemoteFluidDataStoreContext({
314
+ id: attachMessage.id,
315
+ snapshot,
316
+ parentContext: this.wrapContextForInnerChannel(attachMessage.id),
317
+ storage: new storageServiceWithAttachBlobs_js_1.StorageServiceWithAttachBlobs(this.parentContext.storage, flatAttachBlobs),
318
+ scope: this.parentContext.scope,
319
+ loadingGroupId: attachMessage.snapshot?.groupId,
320
+ createSummarizerNodeFn: this.parentContext.getCreateChildSummarizerNodeFn(attachMessage.id, {
321
+ type: internal_4.CreateSummarizerNodeSource.FromAttach,
322
+ sequenceNumber: envelope.sequenceNumber,
323
+ snapshot: attachMessage.snapshot ?? {
324
+ entries: [(0, dataStoreContext_js_1.createAttributesBlob)(pkg, true /* isRootDataStore */)],
325
+ },
326
+ }),
327
+ pkg,
342
328
  });
329
+ this.contexts.addBoundOrRemoted(remoteFluidDataStoreContext);
343
330
  }
344
- const resolve = localOpMetadata;
345
- const aliasResult = this.processAliasMessageCore(aliasMessage.internalId, aliasMessage.alias, message.timestamp);
346
- if (local) {
347
- resolve(aliasResult);
331
+ }
332
+ processAliasMessages(messageCollection) {
333
+ const { envelope, messagesContent, local } = messageCollection;
334
+ for (const { contents, localOpMetadata } of messagesContent) {
335
+ const aliasMessage = contents;
336
+ if (!(0, dataStore_js_1.isDataStoreAliasMessage)(aliasMessage)) {
337
+ throw new internal_6.DataCorruptionError("malformedDataStoreAliasMessage", {
338
+ ...(0, internal_6.extractSafePropertiesFromMessage)(envelope),
339
+ });
340
+ }
341
+ const resolve = localOpMetadata;
342
+ const aliasResult = this.processAliasMessageCore(aliasMessage.internalId, aliasMessage.alias, envelope.timestamp);
343
+ if (local) {
344
+ resolve(aliasResult);
345
+ }
348
346
  }
349
347
  }
350
348
  processAliasMessageCore(internalId, alias, messageTimestampMs) {
@@ -591,61 +589,119 @@ class ChannelCollection {
591
589
  this.pendingAttach.set(message.id, message);
592
590
  }
593
591
  }
594
- process(message, local, localMessageMetadata) {
595
- switch (message.type) {
592
+ /**
593
+ * Process messages for this channel collection. The messages here are contiguous messages in a batch.
594
+ * @param messageCollection - The collection of messages to process.
595
+ */
596
+ processMessages(messageCollection) {
597
+ switch (messageCollection.envelope.type) {
598
+ case messageTypes_js_1.ContainerMessageType.FluidDataStoreOp:
599
+ this.processChannelMessages(messageCollection);
600
+ break;
596
601
  case messageTypes_js_1.ContainerMessageType.Attach:
597
- this.processAttachMessage(message, local);
598
- return;
602
+ this.processAttachMessages(messageCollection);
603
+ break;
599
604
  case messageTypes_js_1.ContainerMessageType.Alias:
600
- this.processAliasMessage(message, localMessageMetadata, local);
601
- return;
602
- case messageTypes_js_1.ContainerMessageType.FluidDataStoreOp: {
603
- const envelope = message.contents;
604
- const innerContents = envelope.contents;
605
- const transformed = {
606
- ...message,
607
- type: innerContents.type,
608
- contents: innerContents.content,
609
- };
610
- this.processChannelOp(envelope.address, transformed, local, localMessageMetadata);
611
- // Notify GC of any outbound references that were added by this op.
612
- detectOutboundReferences(envelope.address, transformed.contents, (fromPath, toPath) => this.parentContext.addedGCOutboundRoute(fromPath, toPath, message.timestamp));
605
+ this.processAliasMessages(messageCollection);
613
606
  break;
614
- }
615
607
  default:
616
608
  (0, internal_1.assert)(false, 0x8e9 /* unreached */);
617
609
  }
618
610
  }
619
- processChannelOp(address, message, local, localMessageMetadata) {
620
- const context = this.contexts.get(address);
621
- // If the data store has been deleted, log an error and ignore this message. This helps prevent document
622
- // corruption in case a deleted data store accidentally submitted an op.
623
- if (this.checkAndLogIfDeleted(address, context, "Changed", "processFluidDataStoreOp")) {
624
- return;
625
- }
626
- if (context === undefined) {
627
- // Former assert 0x162
628
- throw internal_6.DataProcessingError.create("No context for op", "processFluidDataStoreOp", message, {
611
+ /**
612
+ * This is still here for back-compat purposes because channel collection implements
613
+ * IFluidDataStoreChannel. Once it is removed from the interface, this method can be removed.
614
+ * Container runtime calls `processMessages` instead.
615
+ */
616
+ process(message, local, localOpMetadata) {
617
+ this.processMessages({
618
+ envelope: message,
619
+ messagesContent: [
620
+ {
621
+ contents: message.contents,
622
+ localOpMetadata,
623
+ clientSequenceNumber: message.clientSequenceNumber,
624
+ },
625
+ ],
626
+ local,
627
+ });
628
+ }
629
+ /**
630
+ * Process channel messages. The messages here are contiguous channel type messages in a batch. Bunch
631
+ * of contiguous messages for a data store should be sent to it together.
632
+ * @param messageCollection - The collection of messages to process.
633
+ */
634
+ processChannelMessages(messageCollection) {
635
+ const { messagesContent, local } = messageCollection;
636
+ let currentMessageState;
637
+ let currentMessagesContent = [];
638
+ // Helper that sends the current bunch of messages to the data store. It validates that the data stores exists.
639
+ const sendBunchedMessages = () => {
640
+ // Current message state will be undefined for the first message in the list.
641
+ if (currentMessageState === undefined) {
642
+ return;
643
+ }
644
+ const currentContext = this.contexts.get(currentMessageState.address);
645
+ (0, internal_1.assert)(!!currentContext, 0xa66 /* Context not found */);
646
+ currentContext.processMessages({
647
+ envelope: { ...messageCollection.envelope, type: currentMessageState.type },
648
+ messagesContent: currentMessagesContent,
629
649
  local,
630
- messageDetails: JSON.stringify({
631
- type: message.type,
632
- contentType: typeof message.contents,
633
- }),
634
- ...(0, internal_6.tagCodeArtifacts)({ address }),
635
650
  });
651
+ currentMessagesContent = [];
652
+ };
653
+ /**
654
+ * Bunch contiguous messages for the same data store and send them together.
655
+ * This is an optimization mainly for DDSes, where it can process a bunch of ops together. DDSes
656
+ * like merge tree or shared tree can process ops more efficiently when they are bunched together.
657
+ */
658
+ for (const { contents, ...restOfMessagesContent } of messagesContent) {
659
+ const contentsEnvelope = contents;
660
+ const address = contentsEnvelope.address;
661
+ const context = this.contexts.get(address);
662
+ // If the data store has been deleted, log an error and ignore this message. This helps prevent document
663
+ // corruption in case a deleted data store accidentally submitted an op.
664
+ if (this.checkAndLogIfDeleted(address, context, "Changed", "processFluidDataStoreOp")) {
665
+ continue;
666
+ }
667
+ if (context === undefined) {
668
+ // Former assert 0x162
669
+ throw internal_6.DataProcessingError.create("No context for op", "processFluidDataStoreOp", messageCollection.envelope, {
670
+ local,
671
+ messageDetails: JSON.stringify({
672
+ type: messageCollection.envelope.type,
673
+ contentType: typeof contents,
674
+ }),
675
+ ...(0, internal_6.tagCodeArtifacts)({ address }),
676
+ });
677
+ }
678
+ const { type: contextType, content: contextContents } = contentsEnvelope.contents;
679
+ // If the address or type of the message changes while processing the message, send the current bunch.
680
+ if (currentMessageState?.address !== address ||
681
+ currentMessageState?.type !== contextType) {
682
+ sendBunchedMessages();
683
+ }
684
+ currentMessagesContent.push({
685
+ contents: contextContents,
686
+ ...restOfMessagesContent,
687
+ });
688
+ currentMessageState = { address, type: contextType };
689
+ // Notify that a GC node for the data store changed. This is used to detect if a deleted data store is
690
+ // being used.
691
+ this.gcNodeUpdated({
692
+ node: { type: "DataStore", path: `/${address}` },
693
+ reason: "Changed",
694
+ timestampMs: messageCollection.envelope.timestamp,
695
+ packagePath: context.isLoaded ? context.packagePath : undefined,
696
+ });
697
+ detectOutboundReferences(address, contextContents, (fromPath, toPath) => this.parentContext.addedGCOutboundRoute(fromPath, toPath, messageCollection.envelope.timestamp));
636
698
  }
637
- context.process(message, local, localMessageMetadata);
638
- // Notify that a GC node for the data store changed. This is used to detect if a deleted data store is
639
- // being used.
640
- this.gcNodeUpdated({
641
- node: { type: "DataStore", path: `/${address}` },
642
- reason: "Changed",
643
- timestampMs: message.timestamp,
644
- packagePath: context.isLoaded ? context.packagePath : undefined,
645
- });
699
+ // Process the last bunch of messages, if any. Note that there may not be any messages in case all of them are
700
+ // ignored because the data store is deleted.
701
+ sendBunchedMessages();
646
702
  }
647
703
  async getDataStore(id, requestHeaderData, originalRequest) {
648
- const headerData = computeRuntimeHeaderData(this.mc.config, requestHeaderData);
704
+ const headerData = { ...containerRuntime_js_1.defaultRuntimeHeaderData, ...requestHeaderData };
649
705
  if (this.checkAndLogIfDeleted(id, this.contexts.get(id), "Requested", "getDataStore", requestHeaderData, originalRequest)) {
650
706
  // The requested data store has been deleted by gc. Create a 404 response exception.
651
707
  throw (0, internal_5.responseToException)((0, internal_5.createResponseError)(404, "DataStore was deleted", originalRequest, {
@@ -668,7 +724,7 @@ class ChannelCollection {
668
724
  if (this.checkAndLogIfDeleted(id, this.contexts.get(id), "Requested", "getDataStoreIfAvailable", requestHeaderData)) {
669
725
  return undefined;
670
726
  }
671
- const headerData = computeRuntimeHeaderData(this.mc.config, requestHeaderData);
727
+ const headerData = { ...containerRuntime_js_1.defaultRuntimeHeaderData, ...requestHeaderData };
672
728
  const context = await this.contexts.getBoundOrRemoted(id, headerData.wait);
673
729
  if (context === undefined) {
674
730
  return undefined;