@fluidframework/container-runtime 2.0.0-internal.6.4.0 → 2.0.0-internal.7.0.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.
Files changed (223) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/dist/blobManager.d.ts +3 -6
  3. package/dist/blobManager.d.ts.map +1 -1
  4. package/dist/blobManager.js +23 -48
  5. package/dist/blobManager.js.map +1 -1
  6. package/dist/containerHandleContext.js +3 -3
  7. package/dist/containerHandleContext.js.map +1 -1
  8. package/dist/containerRuntime.d.ts +13 -14
  9. package/dist/containerRuntime.d.ts.map +1 -1
  10. package/dist/containerRuntime.js +253 -237
  11. package/dist/containerRuntime.js.map +1 -1
  12. package/dist/dataStore.js +9 -9
  13. package/dist/dataStore.js.map +1 -1
  14. package/dist/dataStoreContext.d.ts +2 -3
  15. package/dist/dataStoreContext.d.ts.map +1 -1
  16. package/dist/dataStoreContext.js +88 -87
  17. package/dist/dataStoreContext.js.map +1 -1
  18. package/dist/dataStoreRegistry.js +3 -3
  19. package/dist/dataStoreRegistry.js.map +1 -1
  20. package/dist/dataStores.d.ts +0 -16
  21. package/dist/dataStores.d.ts.map +1 -1
  22. package/dist/dataStores.js +0 -48
  23. package/dist/dataStores.js.map +1 -1
  24. package/dist/deltaManagerProxyBase.js +4 -4
  25. package/dist/deltaManagerProxyBase.js.map +1 -1
  26. package/dist/deltaManagerSummarizerProxy.js +6 -6
  27. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  28. package/dist/deltaScheduler.js.map +1 -1
  29. package/dist/gc/garbageCollection.d.ts +12 -3
  30. package/dist/gc/garbageCollection.d.ts.map +1 -1
  31. package/dist/gc/garbageCollection.js +54 -31
  32. package/dist/gc/garbageCollection.js.map +1 -1
  33. package/dist/gc/gcConfigs.d.ts +1 -0
  34. package/dist/gc/gcConfigs.d.ts.map +1 -1
  35. package/dist/gc/gcConfigs.js +12 -2
  36. package/dist/gc/gcConfigs.js.map +1 -1
  37. package/dist/gc/gcDefinitions.d.ts +25 -22
  38. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  39. package/dist/gc/gcDefinitions.js.map +1 -1
  40. package/dist/gc/gcTelemetry.d.ts +13 -7
  41. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  42. package/dist/gc/gcTelemetry.js +74 -42
  43. package/dist/gc/gcTelemetry.js.map +1 -1
  44. package/dist/gc/gcUnreferencedStateTracker.js +3 -3
  45. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  46. package/dist/gc/index.d.ts +2 -2
  47. package/dist/gc/index.d.ts.map +1 -1
  48. package/dist/gc/index.js +1 -5
  49. package/dist/gc/index.js.map +1 -1
  50. package/dist/id-compressor/appendOnlySortedMap.js.map +1 -1
  51. package/dist/id-compressor/idCompressor.js.map +1 -1
  52. package/dist/id-compressor/identifiers.d.ts +3 -3
  53. package/dist/id-compressor/identifiers.d.ts.map +1 -1
  54. package/dist/messageTypes.d.ts +17 -17
  55. package/dist/messageTypes.d.ts.map +1 -1
  56. package/dist/messageTypes.js +1 -1
  57. package/dist/messageTypes.js.map +1 -1
  58. package/dist/opLifecycle/batchManager.js +6 -6
  59. package/dist/opLifecycle/batchManager.js.map +1 -1
  60. package/dist/opLifecycle/definitions.d.ts +2 -2
  61. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  62. package/dist/packageVersion.d.ts +1 -1
  63. package/dist/packageVersion.js +1 -1
  64. package/dist/packageVersion.js.map +1 -1
  65. package/dist/pendingStateManager.d.ts +3 -19
  66. package/dist/pendingStateManager.d.ts.map +1 -1
  67. package/dist/pendingStateManager.js +20 -39
  68. package/dist/pendingStateManager.js.map +1 -1
  69. package/dist/summary/orderedClientElection.d.ts +3 -3
  70. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  71. package/dist/summary/orderedClientElection.js +54 -54
  72. package/dist/summary/orderedClientElection.js.map +1 -1
  73. package/dist/summary/runWhileConnectedCoordinator.js +6 -6
  74. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  75. package/dist/summary/runningSummarizer.js +37 -37
  76. package/dist/summary/runningSummarizer.js.map +1 -1
  77. package/dist/summary/summarizer.d.ts.map +1 -1
  78. package/dist/summary/summarizer.js +8 -6
  79. package/dist/summary/summarizer.js.map +1 -1
  80. package/dist/summary/summarizerClientElection.js +6 -6
  81. package/dist/summary/summarizerClientElection.js.map +1 -1
  82. package/dist/summary/summarizerHeuristics.js +9 -9
  83. package/dist/summary/summarizerHeuristics.js.map +1 -1
  84. package/dist/summary/summarizerNode/summarizerNode.js +7 -7
  85. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  86. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
  87. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  88. package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
  89. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  90. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -2
  91. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  92. package/dist/summary/summarizerTypes.d.ts +12 -12
  93. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  94. package/dist/summary/summaryCollection.d.ts +2 -2
  95. package/dist/summary/summaryCollection.d.ts.map +1 -1
  96. package/dist/summary/summaryCollection.js +21 -21
  97. package/dist/summary/summaryCollection.js.map +1 -1
  98. package/dist/summary/summaryFormat.d.ts +5 -5
  99. package/dist/summary/summaryFormat.d.ts.map +1 -1
  100. package/dist/summary/summaryGenerator.d.ts +3 -3
  101. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  102. package/dist/summary/summaryManager.js +7 -7
  103. package/dist/summary/summaryManager.js.map +1 -1
  104. package/dist/throttler.js +16 -16
  105. package/dist/throttler.js.map +1 -1
  106. package/dist/tsdoc-metadata.json +1 -1
  107. package/lib/blobManager.d.ts +3 -6
  108. package/lib/blobManager.d.ts.map +1 -1
  109. package/lib/blobManager.js +24 -49
  110. package/lib/blobManager.js.map +1 -1
  111. package/lib/containerHandleContext.js +3 -3
  112. package/lib/containerHandleContext.js.map +1 -1
  113. package/lib/containerRuntime.d.ts +13 -14
  114. package/lib/containerRuntime.d.ts.map +1 -1
  115. package/lib/containerRuntime.js +249 -235
  116. package/lib/containerRuntime.js.map +1 -1
  117. package/lib/dataStore.js +9 -9
  118. package/lib/dataStore.js.map +1 -1
  119. package/lib/dataStoreContext.d.ts +2 -3
  120. package/lib/dataStoreContext.d.ts.map +1 -1
  121. package/lib/dataStoreContext.js +89 -88
  122. package/lib/dataStoreContext.js.map +1 -1
  123. package/lib/dataStoreRegistry.js +3 -3
  124. package/lib/dataStoreRegistry.js.map +1 -1
  125. package/lib/dataStores.d.ts +0 -16
  126. package/lib/dataStores.d.ts.map +1 -1
  127. package/lib/dataStores.js +2 -50
  128. package/lib/dataStores.js.map +1 -1
  129. package/lib/deltaManagerProxyBase.js +4 -4
  130. package/lib/deltaManagerProxyBase.js.map +1 -1
  131. package/lib/deltaManagerSummarizerProxy.js +6 -6
  132. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  133. package/lib/deltaScheduler.js.map +1 -1
  134. package/lib/gc/garbageCollection.d.ts +12 -3
  135. package/lib/gc/garbageCollection.d.ts.map +1 -1
  136. package/lib/gc/garbageCollection.js +55 -32
  137. package/lib/gc/garbageCollection.js.map +1 -1
  138. package/lib/gc/gcConfigs.d.ts +1 -0
  139. package/lib/gc/gcConfigs.d.ts.map +1 -1
  140. package/lib/gc/gcConfigs.js +14 -4
  141. package/lib/gc/gcConfigs.js.map +1 -1
  142. package/lib/gc/gcDefinitions.d.ts +25 -22
  143. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  144. package/lib/gc/gcDefinitions.js.map +1 -1
  145. package/lib/gc/gcTelemetry.d.ts +13 -7
  146. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  147. package/lib/gc/gcTelemetry.js +74 -42
  148. package/lib/gc/gcTelemetry.js.map +1 -1
  149. package/lib/gc/gcUnreferencedStateTracker.js +3 -3
  150. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  151. package/lib/gc/index.d.ts +2 -2
  152. package/lib/gc/index.d.ts.map +1 -1
  153. package/lib/gc/index.js +2 -2
  154. package/lib/gc/index.js.map +1 -1
  155. package/lib/id-compressor/appendOnlySortedMap.js.map +1 -1
  156. package/lib/id-compressor/idCompressor.js.map +1 -1
  157. package/lib/id-compressor/identifiers.d.ts +3 -3
  158. package/lib/id-compressor/identifiers.d.ts.map +1 -1
  159. package/lib/messageTypes.d.ts +17 -17
  160. package/lib/messageTypes.d.ts.map +1 -1
  161. package/lib/opLifecycle/batchManager.js +6 -6
  162. package/lib/opLifecycle/batchManager.js.map +1 -1
  163. package/lib/opLifecycle/definitions.d.ts +2 -2
  164. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  165. package/lib/packageVersion.d.ts +1 -1
  166. package/lib/packageVersion.js +1 -1
  167. package/lib/packageVersion.js.map +1 -1
  168. package/lib/pendingStateManager.d.ts +3 -19
  169. package/lib/pendingStateManager.d.ts.map +1 -1
  170. package/lib/pendingStateManager.js +20 -39
  171. package/lib/pendingStateManager.js.map +1 -1
  172. package/lib/summary/orderedClientElection.d.ts +3 -3
  173. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  174. package/lib/summary/orderedClientElection.js +54 -54
  175. package/lib/summary/orderedClientElection.js.map +1 -1
  176. package/lib/summary/runWhileConnectedCoordinator.js +6 -6
  177. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  178. package/lib/summary/runningSummarizer.js +37 -37
  179. package/lib/summary/runningSummarizer.js.map +1 -1
  180. package/lib/summary/summarizer.d.ts.map +1 -1
  181. package/lib/summary/summarizer.js +8 -6
  182. package/lib/summary/summarizer.js.map +1 -1
  183. package/lib/summary/summarizerClientElection.js +6 -6
  184. package/lib/summary/summarizerClientElection.js.map +1 -1
  185. package/lib/summary/summarizerHeuristics.js +9 -9
  186. package/lib/summary/summarizerHeuristics.js.map +1 -1
  187. package/lib/summary/summarizerNode/summarizerNode.js +7 -7
  188. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  189. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
  190. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  191. package/lib/summary/summarizerNode/summarizerNodeUtils.js +3 -3
  192. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  193. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -2
  194. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  195. package/lib/summary/summarizerTypes.d.ts +12 -12
  196. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  197. package/lib/summary/summaryCollection.d.ts +2 -2
  198. package/lib/summary/summaryCollection.d.ts.map +1 -1
  199. package/lib/summary/summaryCollection.js +21 -21
  200. package/lib/summary/summaryCollection.js.map +1 -1
  201. package/lib/summary/summaryFormat.d.ts +5 -5
  202. package/lib/summary/summaryFormat.d.ts.map +1 -1
  203. package/lib/summary/summaryGenerator.d.ts +3 -3
  204. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  205. package/lib/summary/summaryManager.js +6 -6
  206. package/lib/summary/summaryManager.js.map +1 -1
  207. package/lib/throttler.js +16 -16
  208. package/lib/throttler.js.map +1 -1
  209. package/package.json +53 -21
  210. package/src/blobManager.ts +18 -58
  211. package/src/containerRuntime.ts +68 -49
  212. package/src/dataStore.ts +1 -1
  213. package/src/dataStoreContext.ts +18 -14
  214. package/src/dataStores.ts +2 -80
  215. package/src/gc/garbageCollection.ts +53 -24
  216. package/src/gc/gcConfigs.ts +22 -4
  217. package/src/gc/gcDefinitions.ts +23 -20
  218. package/src/gc/gcEarlyAdoption.md +1 -1
  219. package/src/gc/gcTelemetry.ts +103 -56
  220. package/src/gc/index.ts +0 -4
  221. package/src/packageVersion.ts +1 -1
  222. package/src/pendingStateManager.ts +7 -46
  223. package/src/summary/summarizer.ts +3 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/container-runtime",
3
- "version": "2.0.0-internal.6.4.0",
3
+ "version": "2.0.0-internal.7.0.1",
4
4
  "description": "Fluid container runtime",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -35,18 +35,18 @@
35
35
  "temp-directory": "nyc/.nyc_output"
36
36
  },
37
37
  "dependencies": {
38
- "@fluid-internal/client-utils": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
39
- "@fluidframework/container-definitions": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
40
- "@fluidframework/container-runtime-definitions": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
41
- "@fluidframework/core-interfaces": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
42
- "@fluidframework/core-utils": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
43
- "@fluidframework/datastore": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
44
- "@fluidframework/driver-definitions": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
45
- "@fluidframework/driver-utils": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
46
- "@fluidframework/protocol-definitions": "^1.1.0",
47
- "@fluidframework/runtime-definitions": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
48
- "@fluidframework/runtime-utils": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
49
- "@fluidframework/telemetry-utils": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
38
+ "@fluid-internal/client-utils": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
39
+ "@fluidframework/container-definitions": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
40
+ "@fluidframework/container-runtime-definitions": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
41
+ "@fluidframework/core-interfaces": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
42
+ "@fluidframework/core-utils": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
43
+ "@fluidframework/datastore": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
44
+ "@fluidframework/driver-definitions": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
45
+ "@fluidframework/driver-utils": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
46
+ "@fluidframework/protocol-definitions": "^3.0.0",
47
+ "@fluidframework/runtime-definitions": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
48
+ "@fluidframework/runtime-utils": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
49
+ "@fluidframework/telemetry-utils": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
50
50
  "double-ended-queue": "^2.1.0-0",
51
51
  "events": "^3.1.0",
52
52
  "lz4js": "^0.2.0",
@@ -54,16 +54,16 @@
54
54
  "uuid": "^9.0.0"
55
55
  },
56
56
  "devDependencies": {
57
- "@fluid-internal/stochastic-test-utils": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
57
+ "@fluid-internal/stochastic-test-utils": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
58
58
  "@fluid-tools/benchmark": "^0.48.0",
59
- "@fluid-tools/build-cli": "^0.22.0",
59
+ "@fluid-tools/build-cli": "^0.24.0",
60
60
  "@fluidframework/build-common": "^2.0.0",
61
- "@fluidframework/build-tools": "^0.22.0",
61
+ "@fluidframework/build-tools": "^0.24.0",
62
62
  "@fluidframework/container-runtime-previous": "npm:@fluidframework/container-runtime@2.0.0-internal.6.3.0",
63
63
  "@fluidframework/eslint-config-fluid": "^2.1.0",
64
- "@fluidframework/mocha-test-setup": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
65
- "@fluidframework/test-runtime-utils": ">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0",
66
- "@microsoft/api-extractor": "^7.34.4",
64
+ "@fluidframework/mocha-test-setup": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
65
+ "@fluidframework/test-runtime-utils": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
66
+ "@microsoft/api-extractor": "^7.37.0",
67
67
  "@types/double-ended-queue": "^2.1.0",
68
68
  "@types/events": "^3.0.0",
69
69
  "@types/mocha": "^9.1.1",
@@ -80,10 +80,42 @@
80
80
  "prettier": "~2.6.2",
81
81
  "rimraf": "^4.4.0",
82
82
  "sinon": "^7.4.2",
83
- "typescript": "~4.5.5"
83
+ "typescript": "~5.1.6"
84
84
  },
85
85
  "typeValidation": {
86
- "broken": {}
86
+ "broken": {
87
+ "ClassDeclaration_ContainerRuntime": {
88
+ "forwardCompat": false,
89
+ "backCompat": false
90
+ },
91
+ "InterfaceDeclaration_IAckedSummary": {
92
+ "backCompat": false
93
+ },
94
+ "InterfaceDeclaration_IAckSummaryResult": {
95
+ "backCompat": false
96
+ },
97
+ "InterfaceDeclaration_IBroadcastSummaryResult": {
98
+ "backCompat": false
99
+ },
100
+ "InterfaceDeclaration_ISummaryOpMessage": {
101
+ "backCompat": false
102
+ },
103
+ "InterfaceDeclaration_ISummaryNackMessage": {
104
+ "backCompat": false
105
+ },
106
+ "ClassDeclaration_Summarizer": {
107
+ "backCompat": false
108
+ },
109
+ "ClassDeclaration_SummaryCollection": {
110
+ "backCompat": false
111
+ },
112
+ "InterfaceDeclaration_INackSummaryResult": {
113
+ "backCompat": false
114
+ },
115
+ "InterfaceDeclaration_ISummaryAckMessage": {
116
+ "backCompat": false
117
+ }
118
+ }
87
119
  },
88
120
  "scripts": {
89
121
  "build": "fluid-build . --task build",
@@ -37,14 +37,8 @@ import {
37
37
  ITelemetryContext,
38
38
  } from "@fluidframework/runtime-definitions";
39
39
 
40
- import { ContainerRuntime, TombstoneResponseHeaderKey } from "./containerRuntime";
41
- import {
42
- sendGCUnexpectedUsageEvent,
43
- disableAttachmentBlobSweepKey,
44
- throwOnTombstoneLoadKey,
45
- } from "./gc";
40
+ import { disableAttachmentBlobSweepKey } from "./gc";
46
41
  import { Throttler, formExponentialFn, IThrottler } from "./throttler";
47
- import { summarizerClientType } from "./summary";
48
42
  import { IBlobMetadata } from "./metadata";
49
43
 
50
44
  /**
@@ -119,7 +113,6 @@ export type IBlobManagerRuntime = Pick<
119
113
  IContainerRuntime,
120
114
  "attachState" | "connected" | "logger" | "clientDetails"
121
115
  > &
122
- Pick<ContainerRuntime, "gcTombstoneEnforcementAllowed"> &
123
116
  TypedEventEmitter<IContainerRuntimeEvents>;
124
117
 
125
118
  type ICreateBlobResponseWithTTL = ICreateBlobResponse & Partial<Record<"minTTLInSeconds", number>>;
@@ -189,8 +182,6 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
189
182
  ),
190
183
  );
191
184
 
192
- /** If true, throw an error when a tombstone attachment blob is retrieved. */
193
- private readonly throwOnTombstoneLoad: boolean;
194
185
  /**
195
186
  * This stores IDs of tombstoned blobs.
196
187
  * Tombstone is a temporary feature that imitates a blob getting swept by garbage collection.
@@ -229,11 +220,6 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
229
220
  logger: this.runtime.logger,
230
221
  namespace: "BlobManager",
231
222
  });
232
- // Read the feature flag that tells whether to throw when a tombstone blob is requested.
233
- this.throwOnTombstoneLoad =
234
- this.mc.config.getBoolean(throwOnTombstoneLoadKey) === true &&
235
- this.runtime.gcTombstoneEnforcementAllowed &&
236
- this.runtime.clientDetails.type !== summarizerClientType;
237
223
 
238
224
  this.redirectTable = this.load(snapshot);
239
225
 
@@ -376,14 +362,19 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
376
362
  }
377
363
 
378
364
  public async getBlob(blobId: string): Promise<ArrayBufferLike> {
379
- // Verify that the blob is valid, i.e., it has not been garbage collected. If it is, this will throw an error,
380
- // failing the call.
381
- this.verifyBlobValidity(blobId);
365
+ // Verify that the blob is not deleted, i.e., it has not been garbage collected. If it is, this will throw
366
+ // an error, failing the call.
367
+ this.verifyBlobNotDeleted(blobId);
368
+ // Let runtime know that the corresponding GC node was requested.
369
+ // Note that this will throw if the blob is inactive or tombstoned and throwing on incorrect usage
370
+ // is configured.
371
+ this.blobRequested(getGCNodePathFromBlobId(blobId));
382
372
 
383
373
  const pending = this.pendingBlobs.get(blobId);
384
374
  if (pending) {
385
375
  return pending.blob;
386
376
  }
377
+
387
378
  let storageId: string;
388
379
  if (this.runtime.attachState === AttachState.Detached) {
389
380
  assert(this.redirectTable.has(blobId), 0x383 /* requesting unknown blobs */);
@@ -397,9 +388,6 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
397
388
  storageId = attachedStorageId;
398
389
  }
399
390
 
400
- // Let runtime know that the corresponding GC node was requested.
401
- this.blobRequested(getGCNodePathFromBlobId(blobId));
402
-
403
391
  return PerformanceEvent.timedExecAsync(
404
392
  this.mc.logger,
405
393
  { eventName: "AttachmentReadBlob", id: storageId },
@@ -858,56 +846,28 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
858
846
  }
859
847
 
860
848
  /**
861
- * Verifies that the blob with given id is valid, i.e., it has not been garbage collected. If the blob is GC'd,
849
+ * Verifies that the blob with given id is not deleted, i.e., it has not been garbage collected. If the blob is GC'd,
862
850
  * log an error and throw if necessary.
863
851
  */
864
- private verifyBlobValidity(blobId: string) {
865
- /**
866
- * A blob can be in one of the following states:
867
- * 1. "deleted" - It has been deleted by garbage collection sweep phase.
868
- * 2. "tombstoned" - It is ready for deletion but sweep phase isn't enabled and tombstone feature is enabled.
869
- * 3. "valid" - It has not been deleted or tombstoned.
870
- */
871
- let state: "valid" | "tombstoned" | "deleted" = "valid";
872
- if (this.isBlobDeleted(getGCNodePathFromBlobId(blobId))) {
873
- state = "deleted";
874
- } else if (this.tombstonedBlobs.has(blobId)) {
875
- state = "tombstoned";
876
- }
877
-
878
- if (state === "valid") {
852
+ private verifyBlobNotDeleted(blobId: string) {
853
+ if (!this.isBlobDeleted(getGCNodePathFromBlobId(blobId))) {
879
854
  return;
880
855
  }
881
856
 
882
- // If the blob is deleted or throw on tombstone load is enabled, throw an error which will fail any attempt
883
- // to load the blob.
884
- const shouldFail = state === "deleted" || this.throwOnTombstoneLoad;
885
857
  const request = { url: blobId };
886
858
  const error = responseToException(
887
- createResponseError(
888
- 404,
889
- "Blob was deleted",
890
- request,
891
- state === "tombstoned" ? { [TombstoneResponseHeaderKey]: true } : undefined,
892
- ),
859
+ createResponseError(404, `Blob was deleted`, request),
893
860
  request,
894
861
  );
895
- sendGCUnexpectedUsageEvent(
896
- this.mc,
862
+ // Only log deleted events. Tombstone events are logged by garbage collector.
863
+ this.mc.logger.sendErrorEvent(
897
864
  {
898
- eventName:
899
- state === "tombstoned"
900
- ? "GC_Tombstone_Blob_Requested"
901
- : "GC_Deleted_Blob_Requested",
902
- category: shouldFail ? "error" : "generic",
903
- gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
865
+ eventName: "GC_Deleted_Blob_Requested",
866
+ pkg: BlobManager.basePath,
904
867
  },
905
- [BlobManager.basePath],
906
868
  error,
907
869
  );
908
- if (shouldFail) {
909
- throw error;
910
- }
870
+ throw error;
911
871
  }
912
872
 
913
873
  public setRedirectTable(table: Map<string, string>) {
@@ -8,9 +8,11 @@ import {
8
8
  FluidObject,
9
9
  IFluidHandle,
10
10
  IFluidHandleContext,
11
+ // eslint-disable-next-line import/no-deprecated
11
12
  IFluidRouter,
12
13
  IRequest,
13
14
  IResponse,
15
+ IProvideFluidHandleContext,
14
16
  } from "@fluidframework/core-interfaces";
15
17
  import {
16
18
  IAudience,
@@ -97,6 +99,7 @@ import {
97
99
  create404Response,
98
100
  exceptionToResponse,
99
101
  GCDataBuilder,
102
+ // eslint-disable-next-line import/no-deprecated
100
103
  requestFluidObject,
101
104
  seqFromTree,
102
105
  calculateStats,
@@ -163,7 +166,6 @@ import {
163
166
  IGarbageCollector,
164
167
  IGCRuntimeOptions,
165
168
  IGCStats,
166
- shouldAllowGcTombstoneEnforcement,
167
169
  trimLeadingAndTrailingSlashes,
168
170
  } from "./gc";
169
171
  import { channelToDataStore, IDataStoreAliasMessage, isDataStoreAliasMessage } from "./dataStore";
@@ -472,6 +474,7 @@ export interface RuntimeHeaderData {
472
474
  wait?: boolean;
473
475
  viaHandle?: boolean;
474
476
  allowTombstone?: boolean;
477
+ allowInactive?: boolean;
475
478
  }
476
479
 
477
480
  /** Default values for Runtime Headers */
@@ -479,6 +482,7 @@ export const defaultRuntimeHeaderData: Required<RuntimeHeaderData> = {
479
482
  wait: true,
480
483
  viaHandle: false,
481
484
  allowTombstone: false,
485
+ allowInactive: false,
482
486
  };
483
487
 
484
488
  /**
@@ -632,7 +636,12 @@ type MessageWithContext =
632
636
  */
633
637
  export class ContainerRuntime
634
638
  extends TypedEventEmitter<IContainerRuntimeEvents & ISummarizerEvents>
635
- implements IContainerRuntime, IRuntime, ISummarizerRuntime, ISummarizerInternalsProvider
639
+ implements
640
+ IContainerRuntime,
641
+ IRuntime,
642
+ ISummarizerRuntime,
643
+ ISummarizerInternalsProvider,
644
+ IProvideFluidHandleContext
636
645
  {
637
646
  /**
638
647
  * @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the "entryPoint" pattern. Refer to Removing-IFluidRouter.md
@@ -669,10 +678,15 @@ export class ContainerRuntime
669
678
  context,
670
679
  registryEntries,
671
680
  existing: existingFlag,
672
- requestHandler,
673
681
  runtimeOptions,
674
682
  containerScope,
675
683
  containerRuntimeCtor,
684
+ requestHandler,
685
+ provideEntryPoint: () => {
686
+ throw new UsageError(
687
+ "ContainerRuntime.load is deprecated and should no longer be used",
688
+ );
689
+ },
676
690
  });
677
691
  }
678
692
 
@@ -688,7 +702,7 @@ export class ContainerRuntime
688
702
  * - containerScope - runtime services provided with context
689
703
  * - containerRuntimeCtor - Constructor to use to create the ContainerRuntime instance.
690
704
  * This allows mixin classes to leverage this method to define their own async initializer.
691
- * - initializeEntryPoint - Promise that resolves to an object which will act as entryPoint for the Container.
705
+ * - provideEntryPoint - Promise that resolves to an object which will act as entryPoint for the Container.
692
706
  * This object should provide all the functionality that the Container is expected to provide to the loader layer.
693
707
  */
694
708
  public static async loadRuntime(params: {
@@ -698,30 +712,21 @@ export class ContainerRuntime
698
712
  runtimeOptions?: IContainerRuntimeOptions;
699
713
  containerScope?: FluidObject;
700
714
  containerRuntimeCtor?: typeof ContainerRuntime;
715
+ /** @deprecated Will be removed in future major release. Migrate all usage of IFluidRouter to the "entryPoint" pattern. Refer to Removing-IFluidRouter.md */
701
716
  requestHandler?: (request: IRequest, runtime: IContainerRuntime) => Promise<IResponse>;
702
- initializeEntryPoint?: (containerRuntime: IContainerRuntime) => Promise<FluidObject>;
717
+ provideEntryPoint: (containerRuntime: IContainerRuntime) => Promise<FluidObject>;
703
718
  }): Promise<ContainerRuntime> {
704
719
  const {
705
720
  context,
706
721
  registryEntries,
707
722
  existing,
708
723
  requestHandler,
724
+ provideEntryPoint,
709
725
  runtimeOptions = {},
710
726
  containerScope = {},
711
727
  containerRuntimeCtor = ContainerRuntime,
712
728
  } = params;
713
729
 
714
- const initializeEntryPoint =
715
- params.initializeEntryPoint ??
716
- (async (containerRuntime: IContainerRuntime) => ({
717
- get IFluidRouter() {
718
- return this;
719
- },
720
- async request(req) {
721
- return containerRuntime.request(req);
722
- },
723
- }));
724
-
725
730
  // If taggedLogger exists, use it. Otherwise, wrap the vanilla logger:
726
731
  // back-compat: Remove the TaggedLoggerAdapter fallback once all the host are using loader > 0.45
727
732
  const backCompatContext: IContainerContext | OldContainerContextWithLogger = context;
@@ -850,9 +855,9 @@ export class ContainerRuntime
850
855
  blobManagerSnapshot,
851
856
  context.storage,
852
857
  idCompressor,
858
+ provideEntryPoint,
853
859
  requestHandler,
854
860
  undefined, // summaryConfiguration
855
- initializeEntryPoint,
856
861
  );
857
862
 
858
863
  // Apply stashed ops with a reference sequence number equal to the sequence number of the snapshot,
@@ -878,17 +883,6 @@ export class ContainerRuntime
878
883
  return this._storage;
879
884
  }
880
885
 
881
- /** @deprecated - The functionality is no longer exposed publicly */
882
- public get reSubmitFn() {
883
- return (
884
- type: ContainerMessageType,
885
- contents: any,
886
- localOpMetadata: unknown,
887
- opMetadata: Record<string, unknown> | undefined,
888
- ) => this.reSubmitCore({ type, contents }, localOpMetadata, opMetadata);
889
- // Note: compatDetails is not included in this deprecated API
890
- }
891
-
892
886
  private readonly submitFn: (
893
887
  type: MessageType,
894
888
  contents: any,
@@ -1097,10 +1091,15 @@ export class ContainerRuntime
1097
1091
  */
1098
1092
  private nextSummaryNumber: number;
1099
1093
 
1100
- /**
1101
- * If false, loading or using a Tombstoned object should merely log, not fail
1102
- */
1103
- public readonly gcTombstoneEnforcementAllowed: boolean;
1094
+ /** If false, loading or using a Tombstoned object should merely log, not fail */
1095
+ public get gcTombstoneEnforcementAllowed(): boolean {
1096
+ return this.garbageCollector.tombstoneEnforcementAllowed;
1097
+ }
1098
+
1099
+ /** If true, throw an error when a tombstone data store is used. */
1100
+ public get gcThrowOnTombstoneUsage(): boolean {
1101
+ return this.garbageCollector.throwOnTombstoneUsage;
1102
+ }
1104
1103
 
1105
1104
  /**
1106
1105
  * GUID to identify a document in telemetry
@@ -1140,6 +1139,7 @@ export class ContainerRuntime
1140
1139
  blobManagerSnapshot: IBlobManagerLoadInfo,
1141
1140
  private readonly _storage: IDocumentStorageService,
1142
1141
  idCompressor: (IIdCompressor & IIdCompressorCore) | undefined,
1142
+ provideEntryPoint: (containerRuntime: IContainerRuntime) => Promise<FluidObject>,
1143
1143
  private readonly requestHandler?: (
1144
1144
  request: IRequest,
1145
1145
  runtime: IContainerRuntime,
@@ -1150,7 +1150,6 @@ export class ContainerRuntime
1150
1150
  // the runtime configuration overrides
1151
1151
  ...runtimeOptions.summaryOptions?.summaryConfigOverrides,
1152
1152
  },
1153
- initializeEntryPoint?: (containerRuntime: IContainerRuntime) => Promise<FluidObject>,
1154
1153
  ) {
1155
1154
  super();
1156
1155
 
@@ -1247,11 +1246,6 @@ export class ContainerRuntime
1247
1246
  // Later updates come through calls to setConnectionState.
1248
1247
  this._connected = connected;
1249
1248
 
1250
- this.gcTombstoneEnforcementAllowed = shouldAllowGcTombstoneEnforcement(
1251
- metadata?.gcFeatureMatrix?.tombstoneGeneration /* persisted */,
1252
- this.runtimeOptions.gcOptions[gcTombstoneGenerationOptionName] /* current */,
1253
- );
1254
-
1255
1249
  this.mc.logger.sendTelemetryEvent({
1256
1250
  eventName: "GCFeatureMatrix",
1257
1251
  metadataValue: JSON.stringify(metadata?.gcFeatureMatrix),
@@ -1642,7 +1636,7 @@ export class ContainerRuntime
1642
1636
  );
1643
1637
  return this._summarizer;
1644
1638
  }
1645
- return initializeEntryPoint?.(this);
1639
+ return provideEntryPoint(this);
1646
1640
  });
1647
1641
  }
1648
1642
 
@@ -1733,7 +1727,10 @@ export class ContainerRuntime
1733
1727
  }
1734
1728
  : create404Response(request);
1735
1729
  } else if (requestParser.pathParts.length > 0) {
1736
- const dataStore = await this.getDataStoreFromRequest(id, request);
1730
+ // Differentiate between requesting the dataStore directly, or one of its children
1731
+ const requestForChild = !requestParser.isLeaf(1);
1732
+ const dataStore = await this.getDataStoreFromRequest(id, request, requestForChild);
1733
+
1737
1734
  const subRequest = requestParser.createSubRequest(1);
1738
1735
  // We always expect createSubRequest to include a leading slash, but asserting here to protect against
1739
1736
  // unintentionally modifying the url if that changes.
@@ -1753,10 +1750,10 @@ export class ContainerRuntime
1753
1750
  /**
1754
1751
  * {@inheritDoc @fluidframework/container-definitions#IRuntime.getEntryPoint}
1755
1752
  */
1756
- public async getEntryPoint?(): Promise<FluidObject | undefined> {
1753
+ public async getEntryPoint(): Promise<FluidObject> {
1757
1754
  return this.entryPoint;
1758
1755
  }
1759
- private readonly entryPoint: LazyPromise<FluidObject | undefined>;
1756
+ private readonly entryPoint: LazyPromise<FluidObject>;
1760
1757
 
1761
1758
  private internalId(maybeAlias: string): string {
1762
1759
  return this.dataStores.aliases.get(maybeAlias) ?? maybeAlias;
@@ -1765,6 +1762,7 @@ export class ContainerRuntime
1765
1762
  private async getDataStoreFromRequest(
1766
1763
  id: string,
1767
1764
  request: IRequest,
1765
+ requestForChild: boolean,
1768
1766
  ): Promise<IFluidDataStoreChannel> {
1769
1767
  const headerData: RuntimeHeaderData = {};
1770
1768
  if (typeof request.headers?.[RuntimeHeaders.wait] === "boolean") {
@@ -1776,24 +1774,36 @@ export class ContainerRuntime
1776
1774
  if (typeof request.headers?.[AllowTombstoneRequestHeaderKey] === "boolean") {
1777
1775
  headerData.allowTombstone = request.headers[AllowTombstoneRequestHeaderKey];
1778
1776
  }
1777
+ if (typeof request.headers?.[AllowInactiveRequestHeaderKey] === "boolean") {
1778
+ headerData.allowInactive = request.headers[AllowInactiveRequestHeaderKey];
1779
+ }
1780
+
1781
+ // We allow Tombstone requests for sub-DataStore objects
1782
+ if (requestForChild) {
1783
+ headerData.allowTombstone = true;
1784
+ }
1779
1785
 
1780
1786
  await this.dataStores.waitIfPendingAlias(id);
1781
1787
  const internalId = this.internalId(id);
1782
1788
  const dataStoreContext = await this.dataStores.getDataStore(internalId, headerData);
1783
- const dataStoreChannel = await dataStoreContext.realize();
1784
1789
 
1785
1790
  // Remove query params, leading and trailing slashes from the url. This is done to make sure the format is
1786
1791
  // the same as GC nodes id.
1787
1792
  const urlWithoutQuery = trimLeadingAndTrailingSlashes(request.url.split("?")[0]);
1793
+ // Get the initial snapshot details which contain the data store package path.
1794
+ const details = await dataStoreContext.getInitialSnapshotDetails();
1795
+
1796
+ // Note that this will throw if the data store is inactive or tombstoned and throwing on incorrect usage
1797
+ // is configured.
1788
1798
  this.garbageCollector.nodeUpdated(
1789
1799
  `/${urlWithoutQuery}`,
1790
1800
  "Loaded",
1791
1801
  undefined /* timestampMs */,
1792
- dataStoreContext.packagePath,
1793
- request?.headers,
1802
+ details.pkg,
1803
+ request,
1804
+ headerData,
1794
1805
  );
1795
-
1796
- return dataStoreChannel;
1806
+ return dataStoreContext.realize();
1797
1807
  }
1798
1808
 
1799
1809
  /** Adds the container's metadata to the given summary tree. */
@@ -2338,6 +2348,7 @@ export class ContainerRuntime
2338
2348
  * @param wait - True if you want to wait for it.
2339
2349
  * @deprecated - Use getAliasedDataStoreEntryPoint instead to get an aliased data store's entry point.
2340
2350
  */
2351
+ // eslint-disable-next-line import/no-deprecated
2341
2352
  public async getRootDataStore(id: string, wait = true): Promise<IFluidRouter> {
2342
2353
  return this.getRootDataStoreChannel(id, wait);
2343
2354
  }
@@ -2436,6 +2447,12 @@ export class ContainerRuntime
2436
2447
  "entryPoint must be defined on data store runtime for using getAliasedDataStoreEntryPoint",
2437
2448
  );
2438
2449
  }
2450
+ this.garbageCollector.nodeUpdated(
2451
+ `/${internalId}`,
2452
+ "Loaded",
2453
+ undefined /* timestampMs */,
2454
+ context.packagePath,
2455
+ );
2439
2456
  return channel.entryPoint;
2440
2457
  }
2441
2458
 
@@ -2526,7 +2543,7 @@ export class ContainerRuntime
2526
2543
  return false;
2527
2544
  }
2528
2545
  } else if (type === ContainerMessageType.FluidDataStoreOp) {
2529
- const envelope = contents as IEnvelope;
2546
+ const envelope = contents;
2530
2547
  if (envelope.address === agentSchedulerId) {
2531
2548
  return false;
2532
2549
  }
@@ -3664,7 +3681,7 @@ export class ContainerRuntime
3664
3681
  case ContainerMessageType.FluidDataStoreOp:
3665
3682
  // For operations, call rollbackDataStoreOp which will find the right store
3666
3683
  // and trigger rollback on it.
3667
- this.dataStores.rollbackDataStoreOp(contents as IEnvelope, localOpMetadata);
3684
+ this.dataStores.rollbackDataStoreOp(contents, localOpMetadata);
3668
3685
  break;
3669
3686
  default:
3670
3687
  // Don't check message.compatDetails because this is for rolling back a local op so the type will be known
@@ -3914,6 +3931,7 @@ export class ContainerRuntime
3914
3931
  * * Forms a function that will request a Summarizer.
3915
3932
  * @param loaderRouter - the loader acting as an IFluidRouter
3916
3933
  * */
3934
+ // eslint-disable-next-line import/no-deprecated
3917
3935
  private formRequestSummarizerFn(loaderRouter: IFluidRouter) {
3918
3936
  return async () => {
3919
3937
  const request: IRequest = {
@@ -3929,6 +3947,7 @@ export class ContainerRuntime
3929
3947
  url: "/_summarizer",
3930
3948
  };
3931
3949
 
3950
+ // eslint-disable-next-line import/no-deprecated
3932
3951
  const fluidObject = await requestFluidObject<FluidObject<ISummarizer>>(
3933
3952
  loaderRouter,
3934
3953
  request,
package/src/dataStore.ts CHANGED
@@ -170,7 +170,7 @@ class DataStore implements IDataStore {
170
170
  /**
171
171
  * {@inheritDoc @fluidframework/runtime-definitions#IDataStore.entryPoint}
172
172
  */
173
- get entryPoint(): IFluidHandle<FluidObject> | undefined {
173
+ get entryPoint(): IFluidHandle<FluidObject> {
174
174
  return this.fluidDataStoreChannel.entryPoint;
175
175
  }
176
176
 
@@ -78,7 +78,7 @@ import {
78
78
  summarizerClientType,
79
79
  } from "./summary";
80
80
  import { ContainerRuntime } from "./containerRuntime";
81
- import { sendGCUnexpectedUsageEvent, throwOnTombstoneUsageKey } from "./gc";
81
+ import { sendGCUnexpectedUsageEvent } from "./gc";
82
82
 
83
83
  function createAttributes(
84
84
  pkg: readonly string[],
@@ -325,11 +325,7 @@ export abstract class FluidDataStoreContext
325
325
  this.mc.logger,
326
326
  );
327
327
 
328
- // Tombstone should only throw when the feature flag is enabled and the client isn't a summarizer
329
- this.throwOnTombstoneUsage =
330
- this.mc.config.getBoolean(throwOnTombstoneUsageKey) === true &&
331
- this._containerRuntime.gcTombstoneEnforcementAllowed &&
332
- this.clientDetails.type !== summarizerClientType;
328
+ this.throwOnTombstoneUsage = this._containerRuntime.gcThrowOnTombstoneUsage;
333
329
 
334
330
  // By default, a data store can log maximum 10 local changes telemetry in summarizer.
335
331
  this.localChangesTelemetryCount =
@@ -486,7 +482,16 @@ export abstract class FluidDataStoreContext
486
482
  local: boolean,
487
483
  localOpMetadata: unknown,
488
484
  ): void {
489
- this.verifyNotClosed("process", true, extractSafePropertiesFromMessage(messageArg));
485
+ const safeTelemetryProps = extractSafePropertiesFromMessage(messageArg);
486
+ // On op process, tombstone error is logged in garbage collector. So, set "checkTombstone" to false when calling
487
+ // "verifyNotClosed" which logs tombstone errors. Throw error if tombstoned and throwing on load is configured.
488
+ this.verifyNotClosed("process", false /* checkTombstone */, safeTelemetryProps);
489
+ if (this.tombstoned && this.throwOnTombstoneUsage) {
490
+ throw new DataCorruptionError(
491
+ "Context is tombstoned! Call site [process]",
492
+ safeTelemetryProps,
493
+ );
494
+ }
490
495
 
491
496
  const innerContents = messageArg.contents as FluidDataStoreMessage;
492
497
  const message = {
@@ -740,11 +745,6 @@ export abstract class FluidDataStoreContext
740
745
  this.makeLocallyVisibleFn();
741
746
  }
742
747
 
743
- /** @deprecated - To be replaced by calling makeLocallyVisible directly */
744
- public bindToContext() {
745
- this.makeLocallyVisibleFn();
746
- }
747
-
748
748
  protected bindRuntime(channel: IFluidDataStoreChannel) {
749
749
  if (this.channel) {
750
750
  throw new Error("Runtime already bound");
@@ -1094,7 +1094,7 @@ export class LocalFluidDataStoreContextBase extends FluidDataStoreContext {
1094
1094
  return message;
1095
1095
  }
1096
1096
 
1097
- public async getInitialSnapshotDetails(): Promise<ISnapshotDetails> {
1097
+ private readonly initialSnapshotDetailsP = new LazyPromise<ISnapshotDetails>(async () => {
1098
1098
  let snapshot = this.snapshotTree;
1099
1099
  let attributes: ReadFluidDataStoreAttributes;
1100
1100
  let isRootDataStore = false;
@@ -1127,6 +1127,10 @@ export class LocalFluidDataStoreContextBase extends FluidDataStoreContext {
1127
1127
  isRootDataStore,
1128
1128
  snapshot,
1129
1129
  };
1130
+ });
1131
+
1132
+ public async getInitialSnapshotDetails(): Promise<ISnapshotDetails> {
1133
+ return this.initialSnapshotDetailsP;
1130
1134
  }
1131
1135
 
1132
1136
  /**
@@ -1206,7 +1210,7 @@ export class LocalDetachedFluidDataStoreContext
1206
1210
  // of data store factories tends to construct the data object (at least kick off an async method that returns
1207
1211
  // it); that code moved to the entryPoint initialization function, so we want to ensure it still executes
1208
1212
  // before the data store is attached.
1209
- await dataStoreChannel.entryPoint?.get();
1213
+ await dataStoreChannel.entryPoint.get();
1210
1214
 
1211
1215
  if (await this.isRoot()) {
1212
1216
  dataStoreChannel.makeVisibleAndAttachGraph();