@fluidframework/container-runtime 2.0.0-dev.2.3.0.115467 → 2.0.0-dev.4.1.0.148229

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 (563) hide show
  1. package/.eslintrc.js +21 -10
  2. package/.mocharc.js +2 -2
  3. package/api-extractor.json +2 -2
  4. package/dist/batchTracker.d.ts +1 -2
  5. package/dist/batchTracker.d.ts.map +1 -1
  6. package/dist/batchTracker.js +2 -1
  7. package/dist/batchTracker.js.map +1 -1
  8. package/dist/blobManager.d.ts +74 -42
  9. package/dist/blobManager.d.ts.map +1 -1
  10. package/dist/blobManager.js +321 -152
  11. package/dist/blobManager.js.map +1 -1
  12. package/dist/connectionTelemetry.d.ts.map +1 -1
  13. package/dist/connectionTelemetry.js +11 -9
  14. package/dist/connectionTelemetry.js.map +1 -1
  15. package/dist/containerHandleContext.d.ts.map +1 -1
  16. package/dist/containerHandleContext.js +3 -1
  17. package/dist/containerHandleContext.js.map +1 -1
  18. package/dist/containerRuntime.d.ts +148 -114
  19. package/dist/containerRuntime.d.ts.map +1 -1
  20. package/dist/containerRuntime.js +534 -342
  21. package/dist/containerRuntime.js.map +1 -1
  22. package/dist/dataStore.d.ts.map +1 -1
  23. package/dist/dataStore.js +11 -9
  24. package/dist/dataStore.js.map +1 -1
  25. package/dist/dataStoreContext.d.ts +40 -13
  26. package/dist/dataStoreContext.d.ts.map +1 -1
  27. package/dist/dataStoreContext.js +146 -66
  28. package/dist/dataStoreContext.js.map +1 -1
  29. package/dist/dataStoreContexts.d.ts.map +1 -1
  30. package/dist/dataStoreContexts.js +7 -3
  31. package/dist/dataStoreContexts.js.map +1 -1
  32. package/dist/dataStoreRegistry.d.ts.map +1 -1
  33. package/dist/dataStoreRegistry.js +3 -1
  34. package/dist/dataStoreRegistry.js.map +1 -1
  35. package/dist/dataStores.d.ts +39 -12
  36. package/dist/dataStores.d.ts.map +1 -1
  37. package/dist/dataStores.js +164 -76
  38. package/dist/dataStores.js.map +1 -1
  39. package/dist/deltaManagerSummarizerProxy.d.ts +19 -0
  40. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -0
  41. package/dist/deltaManagerSummarizerProxy.js +40 -0
  42. package/dist/deltaManagerSummarizerProxy.js.map +1 -0
  43. package/dist/deltaScheduler.d.ts.map +1 -1
  44. package/dist/deltaScheduler.js +8 -3
  45. package/dist/deltaScheduler.js.map +1 -1
  46. package/dist/gc/garbageCollection.d.ts +204 -0
  47. package/dist/gc/garbageCollection.d.ts.map +1 -0
  48. package/dist/gc/garbageCollection.js +926 -0
  49. package/dist/gc/garbageCollection.js.map +1 -0
  50. package/dist/gc/gcConfigs.d.ts +22 -0
  51. package/dist/gc/gcConfigs.d.ts.map +1 -0
  52. package/dist/gc/gcConfigs.js +143 -0
  53. package/dist/gc/gcConfigs.js.map +1 -0
  54. package/dist/gc/gcDefinitions.d.ts +320 -0
  55. package/dist/gc/gcDefinitions.d.ts.map +1 -0
  56. package/dist/gc/gcDefinitions.js +81 -0
  57. package/dist/gc/gcDefinitions.js.map +1 -0
  58. package/dist/gc/gcHelpers.d.ts +86 -0
  59. package/dist/gc/gcHelpers.d.ts.map +1 -0
  60. package/dist/gc/gcHelpers.js +268 -0
  61. package/dist/gc/gcHelpers.js.map +1 -0
  62. package/dist/gc/gcReferenceGraphAlgorithm.d.ts +16 -0
  63. package/dist/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -0
  64. package/dist/gc/gcReferenceGraphAlgorithm.js +49 -0
  65. package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -0
  66. package/dist/gc/gcSummaryDefinitions.d.ts +52 -0
  67. package/dist/gc/gcSummaryDefinitions.d.ts.map +1 -0
  68. package/dist/gc/gcSummaryDefinitions.js +7 -0
  69. package/dist/gc/gcSummaryDefinitions.js.map +1 -0
  70. package/dist/gc/gcSummaryStateTracker.d.ts +93 -0
  71. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -0
  72. package/dist/gc/gcSummaryStateTracker.js +239 -0
  73. package/dist/gc/gcSummaryStateTracker.js.map +1 -0
  74. package/{lib → dist/gc}/gcSweepReadyUsageDetection.d.ts +5 -5
  75. package/dist/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
  76. package/dist/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +15 -11
  77. package/dist/gc/gcSweepReadyUsageDetection.js.map +1 -0
  78. package/dist/gc/gcUnreferencedStateTracker.d.ts +34 -0
  79. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
  80. package/dist/gc/gcUnreferencedStateTracker.js +94 -0
  81. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -0
  82. package/dist/gc/index.d.ts +13 -0
  83. package/dist/gc/index.d.ts.map +1 -0
  84. package/dist/gc/index.js +50 -0
  85. package/dist/gc/index.js.map +1 -0
  86. package/dist/index.d.ts +3 -8
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +7 -13
  89. package/dist/index.js.map +1 -1
  90. package/dist/opLifecycle/batchManager.d.ts +10 -0
  91. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  92. package/dist/opLifecycle/batchManager.js +37 -8
  93. package/dist/opLifecycle/batchManager.js.map +1 -1
  94. package/dist/opLifecycle/definitions.d.ts +29 -1
  95. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  96. package/dist/opLifecycle/definitions.js.map +1 -1
  97. package/dist/opLifecycle/index.d.ts +3 -3
  98. package/dist/opLifecycle/index.d.ts.map +1 -1
  99. package/dist/opLifecycle/index.js +3 -1
  100. package/dist/opLifecycle/index.js.map +1 -1
  101. package/dist/opLifecycle/opCompressor.d.ts +1 -1
  102. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  103. package/dist/opLifecycle/opCompressor.js +46 -17
  104. package/dist/opLifecycle/opCompressor.js.map +1 -1
  105. package/dist/opLifecycle/opDecompressor.d.ts +6 -1
  106. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  107. package/dist/opLifecycle/opDecompressor.js +72 -18
  108. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  109. package/dist/opLifecycle/opSplitter.d.ts +46 -2
  110. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  111. package/dist/opLifecycle/opSplitter.js +142 -5
  112. package/dist/opLifecycle/opSplitter.js.map +1 -1
  113. package/dist/opLifecycle/outbox.d.ts +23 -2
  114. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  115. package/dist/opLifecycle/outbox.js +101 -51
  116. package/dist/opLifecycle/outbox.js.map +1 -1
  117. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  118. package/dist/opLifecycle/remoteMessageProcessor.js +17 -2
  119. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  120. package/dist/opProperties.d.ts.map +1 -1
  121. package/dist/opProperties.js +1 -3
  122. package/dist/opProperties.js.map +1 -1
  123. package/dist/packageVersion.d.ts +1 -1
  124. package/dist/packageVersion.js +1 -1
  125. package/dist/packageVersion.js.map +1 -1
  126. package/dist/pendingStateManager.d.ts +6 -15
  127. package/dist/pendingStateManager.d.ts.map +1 -1
  128. package/dist/pendingStateManager.js +137 -165
  129. package/dist/pendingStateManager.js.map +1 -1
  130. package/dist/scheduleManager.d.ts +0 -1
  131. package/dist/scheduleManager.d.ts.map +1 -1
  132. package/dist/scheduleManager.js +11 -21
  133. package/dist/scheduleManager.js.map +1 -1
  134. package/dist/storageServiceWithAttachBlobs.d.ts +17 -0
  135. package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -0
  136. package/dist/storageServiceWithAttachBlobs.js +32 -0
  137. package/dist/storageServiceWithAttachBlobs.js.map +1 -0
  138. package/dist/summary/index.d.ts +17 -0
  139. package/dist/summary/index.d.ts.map +1 -0
  140. package/dist/summary/index.js +46 -0
  141. package/dist/summary/index.js.map +1 -0
  142. package/dist/summary/orderedClientElection.d.ts.map +1 -0
  143. package/dist/{orderedClientElection.js → summary/orderedClientElection.js} +10 -4
  144. package/dist/summary/orderedClientElection.js.map +1 -0
  145. package/{lib → dist/summary}/runWhileConnectedCoordinator.d.ts +3 -2
  146. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
  147. package/dist/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +5 -4
  148. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -0
  149. package/{lib → dist/summary}/runningSummarizer.d.ts +19 -18
  150. package/dist/summary/runningSummarizer.d.ts.map +1 -0
  151. package/dist/{runningSummarizer.js → summary/runningSummarizer.js} +191 -77
  152. package/dist/summary/runningSummarizer.js.map +1 -0
  153. package/dist/{summarizer.d.ts → summary/summarizer.d.ts} +6 -12
  154. package/dist/summary/summarizer.d.ts.map +1 -0
  155. package/dist/{summarizer.js → summary/summarizer.js} +32 -76
  156. package/dist/summary/summarizer.js.map +1 -0
  157. package/dist/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +1 -2
  158. package/dist/summary/summarizerClientElection.d.ts.map +1 -0
  159. package/dist/{summarizerClientElection.js → summary/summarizerClientElection.js} +3 -30
  160. package/dist/summary/summarizerClientElection.js.map +1 -0
  161. package/dist/{summarizerHeuristics.d.ts → summary/summarizerHeuristics.d.ts} +1 -1
  162. package/dist/summary/summarizerHeuristics.d.ts.map +1 -0
  163. package/dist/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +9 -12
  164. package/dist/summary/summarizerHeuristics.js.map +1 -0
  165. package/dist/summary/summarizerNode/index.d.ts +8 -0
  166. package/dist/summary/summarizerNode/index.d.ts.map +1 -0
  167. package/dist/summary/summarizerNode/index.js +12 -0
  168. package/dist/summary/summarizerNode/index.js.map +1 -0
  169. package/dist/summary/summarizerNode/summarizerNode.d.ts +149 -0
  170. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -0
  171. package/dist/summary/summarizerNode/summarizerNode.js +531 -0
  172. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -0
  173. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +125 -0
  174. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -0
  175. package/dist/summary/summarizerNode/summarizerNodeUtils.js +132 -0
  176. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
  177. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +22 -0
  178. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
  179. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +423 -0
  180. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
  181. package/{lib → dist/summary}/summarizerTypes.d.ts +29 -42
  182. package/dist/summary/summarizerTypes.d.ts.map +1 -0
  183. package/dist/{summarizerTypes.js → summary/summarizerTypes.js} +0 -5
  184. package/dist/summary/summarizerTypes.js.map +1 -0
  185. package/dist/summary/summaryCollection.d.ts.map +1 -0
  186. package/dist/{summaryCollection.js → summary/summaryCollection.js} +18 -8
  187. package/dist/summary/summaryCollection.js.map +1 -0
  188. package/{lib → dist/summary}/summaryFormat.d.ts +3 -21
  189. package/dist/summary/summaryFormat.d.ts.map +1 -0
  190. package/dist/{summaryFormat.js → summary/summaryFormat.js} +19 -21
  191. package/dist/summary/summaryFormat.js.map +1 -0
  192. package/dist/summary/summaryGenerator.d.ts.map +1 -0
  193. package/dist/{summaryGenerator.js → summary/summaryGenerator.js} +34 -16
  194. package/dist/summary/summaryGenerator.js.map +1 -0
  195. package/dist/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
  196. package/dist/summary/summaryManager.d.ts.map +1 -0
  197. package/dist/{summaryManager.js → summary/summaryManager.js} +21 -9
  198. package/dist/summary/summaryManager.js.map +1 -0
  199. package/dist/throttler.d.ts +2 -2
  200. package/dist/throttler.d.ts.map +1 -1
  201. package/dist/throttler.js +4 -4
  202. package/dist/throttler.js.map +1 -1
  203. package/lib/batchTracker.d.ts +1 -2
  204. package/lib/batchTracker.d.ts.map +1 -1
  205. package/lib/batchTracker.js +2 -1
  206. package/lib/batchTracker.js.map +1 -1
  207. package/lib/blobManager.d.ts +74 -42
  208. package/lib/blobManager.d.ts.map +1 -1
  209. package/lib/blobManager.js +322 -153
  210. package/lib/blobManager.js.map +1 -1
  211. package/lib/connectionTelemetry.d.ts.map +1 -1
  212. package/lib/connectionTelemetry.js +11 -9
  213. package/lib/connectionTelemetry.js.map +1 -1
  214. package/lib/containerHandleContext.d.ts.map +1 -1
  215. package/lib/containerHandleContext.js +3 -1
  216. package/lib/containerHandleContext.js.map +1 -1
  217. package/lib/containerRuntime.d.ts +148 -114
  218. package/lib/containerRuntime.d.ts.map +1 -1
  219. package/lib/containerRuntime.js +506 -314
  220. package/lib/containerRuntime.js.map +1 -1
  221. package/lib/dataStore.d.ts.map +1 -1
  222. package/lib/dataStore.js +11 -9
  223. package/lib/dataStore.js.map +1 -1
  224. package/lib/dataStoreContext.d.ts +40 -13
  225. package/lib/dataStoreContext.d.ts.map +1 -1
  226. package/lib/dataStoreContext.js +136 -56
  227. package/lib/dataStoreContext.js.map +1 -1
  228. package/lib/dataStoreContexts.d.ts.map +1 -1
  229. package/lib/dataStoreContexts.js +7 -3
  230. package/lib/dataStoreContexts.js.map +1 -1
  231. package/lib/dataStoreRegistry.d.ts.map +1 -1
  232. package/lib/dataStoreRegistry.js +3 -1
  233. package/lib/dataStoreRegistry.js.map +1 -1
  234. package/lib/dataStores.d.ts +39 -12
  235. package/lib/dataStores.d.ts.map +1 -1
  236. package/lib/dataStores.js +162 -74
  237. package/lib/dataStores.js.map +1 -1
  238. package/lib/deltaManagerSummarizerProxy.d.ts +19 -0
  239. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -0
  240. package/lib/deltaManagerSummarizerProxy.js +36 -0
  241. package/lib/deltaManagerSummarizerProxy.js.map +1 -0
  242. package/lib/deltaScheduler.d.ts.map +1 -1
  243. package/lib/deltaScheduler.js +9 -4
  244. package/lib/deltaScheduler.js.map +1 -1
  245. package/lib/gc/garbageCollection.d.ts +204 -0
  246. package/lib/gc/garbageCollection.d.ts.map +1 -0
  247. package/lib/gc/garbageCollection.js +922 -0
  248. package/lib/gc/garbageCollection.js.map +1 -0
  249. package/lib/gc/gcConfigs.d.ts +22 -0
  250. package/lib/gc/gcConfigs.d.ts.map +1 -0
  251. package/lib/gc/gcConfigs.js +139 -0
  252. package/lib/gc/gcConfigs.js.map +1 -0
  253. package/lib/gc/gcDefinitions.d.ts +320 -0
  254. package/lib/gc/gcDefinitions.d.ts.map +1 -0
  255. package/lib/gc/gcDefinitions.js +78 -0
  256. package/lib/gc/gcDefinitions.js.map +1 -0
  257. package/lib/gc/gcHelpers.d.ts +86 -0
  258. package/lib/gc/gcHelpers.d.ts.map +1 -0
  259. package/lib/gc/gcHelpers.js +254 -0
  260. package/lib/gc/gcHelpers.js.map +1 -0
  261. package/lib/gc/gcReferenceGraphAlgorithm.d.ts +16 -0
  262. package/lib/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -0
  263. package/lib/gc/gcReferenceGraphAlgorithm.js +45 -0
  264. package/lib/gc/gcReferenceGraphAlgorithm.js.map +1 -0
  265. package/lib/gc/gcSummaryDefinitions.d.ts +52 -0
  266. package/lib/gc/gcSummaryDefinitions.d.ts.map +1 -0
  267. package/lib/gc/gcSummaryDefinitions.js +6 -0
  268. package/lib/gc/gcSummaryDefinitions.js.map +1 -0
  269. package/lib/gc/gcSummaryStateTracker.d.ts +93 -0
  270. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -0
  271. package/lib/gc/gcSummaryStateTracker.js +235 -0
  272. package/lib/gc/gcSummaryStateTracker.js.map +1 -0
  273. package/{dist → lib/gc}/gcSweepReadyUsageDetection.d.ts +5 -5
  274. package/lib/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
  275. package/lib/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +15 -11
  276. package/lib/gc/gcSweepReadyUsageDetection.js.map +1 -0
  277. package/lib/gc/gcUnreferencedStateTracker.d.ts +34 -0
  278. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
  279. package/lib/gc/gcUnreferencedStateTracker.js +90 -0
  280. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -0
  281. package/lib/gc/index.d.ts +13 -0
  282. package/lib/gc/index.d.ts.map +1 -0
  283. package/lib/gc/index.js +12 -0
  284. package/lib/gc/index.js.map +1 -0
  285. package/lib/index.d.ts +3 -8
  286. package/lib/index.d.ts.map +1 -1
  287. package/lib/index.js +2 -6
  288. package/lib/index.js.map +1 -1
  289. package/lib/opLifecycle/batchManager.d.ts +10 -0
  290. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  291. package/lib/opLifecycle/batchManager.js +35 -7
  292. package/lib/opLifecycle/batchManager.js.map +1 -1
  293. package/lib/opLifecycle/definitions.d.ts +29 -1
  294. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  295. package/lib/opLifecycle/definitions.js.map +1 -1
  296. package/lib/opLifecycle/index.d.ts +3 -3
  297. package/lib/opLifecycle/index.d.ts.map +1 -1
  298. package/lib/opLifecycle/index.js +2 -2
  299. package/lib/opLifecycle/index.js.map +1 -1
  300. package/lib/opLifecycle/opCompressor.d.ts +1 -1
  301. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  302. package/lib/opLifecycle/opCompressor.js +47 -18
  303. package/lib/opLifecycle/opCompressor.js.map +1 -1
  304. package/lib/opLifecycle/opDecompressor.d.ts +6 -1
  305. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  306. package/lib/opLifecycle/opDecompressor.js +72 -18
  307. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  308. package/lib/opLifecycle/opSplitter.d.ts +46 -2
  309. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  310. package/lib/opLifecycle/opSplitter.js +141 -5
  311. package/lib/opLifecycle/opSplitter.js.map +1 -1
  312. package/lib/opLifecycle/outbox.d.ts +23 -2
  313. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  314. package/lib/opLifecycle/outbox.js +103 -53
  315. package/lib/opLifecycle/outbox.js.map +1 -1
  316. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  317. package/lib/opLifecycle/remoteMessageProcessor.js +17 -2
  318. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  319. package/lib/opProperties.d.ts.map +1 -1
  320. package/lib/opProperties.js +1 -3
  321. package/lib/opProperties.js.map +1 -1
  322. package/lib/packageVersion.d.ts +1 -1
  323. package/lib/packageVersion.js +1 -1
  324. package/lib/packageVersion.js.map +1 -1
  325. package/lib/pendingStateManager.d.ts +6 -15
  326. package/lib/pendingStateManager.d.ts.map +1 -1
  327. package/lib/pendingStateManager.js +137 -165
  328. package/lib/pendingStateManager.js.map +1 -1
  329. package/lib/scheduleManager.d.ts +0 -1
  330. package/lib/scheduleManager.d.ts.map +1 -1
  331. package/lib/scheduleManager.js +11 -21
  332. package/lib/scheduleManager.js.map +1 -1
  333. package/lib/storageServiceWithAttachBlobs.d.ts +17 -0
  334. package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -0
  335. package/lib/storageServiceWithAttachBlobs.js +28 -0
  336. package/lib/storageServiceWithAttachBlobs.js.map +1 -0
  337. package/lib/summary/index.d.ts +17 -0
  338. package/lib/summary/index.d.ts.map +1 -0
  339. package/lib/summary/index.js +15 -0
  340. package/lib/summary/index.js.map +1 -0
  341. package/lib/summary/orderedClientElection.d.ts.map +1 -0
  342. package/lib/{orderedClientElection.js → summary/orderedClientElection.js} +10 -4
  343. package/lib/summary/orderedClientElection.js.map +1 -0
  344. package/{dist → lib/summary}/runWhileConnectedCoordinator.d.ts +3 -2
  345. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
  346. package/lib/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +5 -4
  347. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -0
  348. package/{dist → lib/summary}/runningSummarizer.d.ts +19 -18
  349. package/lib/summary/runningSummarizer.d.ts.map +1 -0
  350. package/lib/{runningSummarizer.js → summary/runningSummarizer.js} +193 -79
  351. package/lib/summary/runningSummarizer.js.map +1 -0
  352. package/lib/{summarizer.d.ts → summary/summarizer.d.ts} +6 -12
  353. package/lib/summary/summarizer.d.ts.map +1 -0
  354. package/lib/{summarizer.js → summary/summarizer.js} +34 -78
  355. package/lib/summary/summarizer.js.map +1 -0
  356. package/lib/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +1 -2
  357. package/lib/summary/summarizerClientElection.d.ts.map +1 -0
  358. package/lib/{summarizerClientElection.js → summary/summarizerClientElection.js} +3 -30
  359. package/lib/summary/summarizerClientElection.js.map +1 -0
  360. package/lib/{summarizerHeuristics.d.ts → summary/summarizerHeuristics.d.ts} +1 -1
  361. package/lib/summary/summarizerHeuristics.d.ts.map +1 -0
  362. package/lib/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +9 -12
  363. package/lib/summary/summarizerHeuristics.js.map +1 -0
  364. package/lib/summary/summarizerNode/index.d.ts +8 -0
  365. package/lib/summary/summarizerNode/index.d.ts.map +1 -0
  366. package/lib/summary/summarizerNode/index.js +7 -0
  367. package/lib/summary/summarizerNode/index.js.map +1 -0
  368. package/lib/summary/summarizerNode/summarizerNode.d.ts +149 -0
  369. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -0
  370. package/lib/summary/summarizerNode/summarizerNode.js +526 -0
  371. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -0
  372. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +125 -0
  373. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -0
  374. package/lib/summary/summarizerNode/summarizerNodeUtils.js +125 -0
  375. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
  376. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +22 -0
  377. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
  378. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +419 -0
  379. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
  380. package/{dist → lib/summary}/summarizerTypes.d.ts +29 -42
  381. package/lib/summary/summarizerTypes.d.ts.map +1 -0
  382. package/lib/summary/summarizerTypes.js +6 -0
  383. package/lib/summary/summarizerTypes.js.map +1 -0
  384. package/lib/summary/summaryCollection.d.ts.map +1 -0
  385. package/lib/{summaryCollection.js → summary/summaryCollection.js} +18 -8
  386. package/lib/summary/summaryCollection.js.map +1 -0
  387. package/{dist → lib/summary}/summaryFormat.d.ts +3 -21
  388. package/lib/summary/summaryFormat.d.ts.map +1 -0
  389. package/lib/{summaryFormat.js → summary/summaryFormat.js} +20 -21
  390. package/lib/summary/summaryFormat.js.map +1 -0
  391. package/lib/summary/summaryGenerator.d.ts.map +1 -0
  392. package/lib/{summaryGenerator.js → summary/summaryGenerator.js} +34 -16
  393. package/lib/summary/summaryGenerator.js.map +1 -0
  394. package/lib/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
  395. package/lib/summary/summaryManager.d.ts.map +1 -0
  396. package/lib/{summaryManager.js → summary/summaryManager.js} +21 -9
  397. package/lib/summary/summaryManager.js.map +1 -0
  398. package/lib/throttler.d.ts +2 -2
  399. package/lib/throttler.d.ts.map +1 -1
  400. package/lib/throttler.js +4 -4
  401. package/lib/throttler.js.map +1 -1
  402. package/package.json +67 -61
  403. package/prettier.config.cjs +1 -1
  404. package/src/batchTracker.ts +55 -50
  405. package/src/blobManager.ts +863 -594
  406. package/src/connectionTelemetry.ts +280 -249
  407. package/src/containerHandleContext.ts +27 -29
  408. package/src/containerRuntime.ts +3174 -2805
  409. package/src/dataStore.ts +172 -159
  410. package/src/dataStoreContext.ts +1141 -993
  411. package/src/dataStoreContexts.ts +178 -161
  412. package/src/dataStoreRegistry.ts +25 -20
  413. package/src/dataStores.ts +887 -716
  414. package/src/deltaManagerSummarizerProxy.ts +46 -0
  415. package/src/deltaScheduler.ts +158 -150
  416. package/{garbageCollection.md → src/gc/garbageCollection.md} +16 -3
  417. package/src/gc/garbageCollection.ts +1250 -0
  418. package/src/gc/gcConfigs.ts +193 -0
  419. package/src/gc/gcDefinitions.ts +387 -0
  420. package/src/gc/gcHelpers.ts +332 -0
  421. package/src/gc/gcReferenceGraphAlgorithm.ts +52 -0
  422. package/src/gc/gcSummaryDefinitions.ts +54 -0
  423. package/src/gc/gcSummaryStateTracker.ts +329 -0
  424. package/src/gc/gcSweepReadyUsageDetection.ts +145 -0
  425. package/src/gc/gcUnreferencedStateTracker.ts +114 -0
  426. package/src/gc/index.ts +65 -0
  427. package/src/index.ts +61 -75
  428. package/src/opLifecycle/README.md +157 -0
  429. package/src/opLifecycle/batchManager.ts +119 -86
  430. package/src/opLifecycle/definitions.ts +49 -19
  431. package/src/opLifecycle/index.ts +7 -6
  432. package/src/opLifecycle/opCompressor.ts +78 -40
  433. package/src/opLifecycle/opDecompressor.ts +148 -64
  434. package/src/opLifecycle/opSplitter.ts +269 -66
  435. package/src/opLifecycle/outbox.ts +268 -184
  436. package/src/opLifecycle/remoteMessageProcessor.ts +63 -47
  437. package/src/opProperties.ts +11 -9
  438. package/src/packageVersion.ts +1 -1
  439. package/src/pendingStateManager.ts +386 -381
  440. package/src/scheduleManager.ts +299 -280
  441. package/src/storageServiceWithAttachBlobs.ts +38 -0
  442. package/src/summary/index.ts +105 -0
  443. package/src/summary/orderedClientElection.ts +564 -0
  444. package/src/summary/runWhileConnectedCoordinator.ts +113 -0
  445. package/src/summary/runningSummarizer.ts +788 -0
  446. package/src/summary/summarizer.ts +372 -0
  447. package/src/summary/summarizerClientElection.ts +139 -0
  448. package/src/summary/summarizerHeuristics.ts +224 -0
  449. package/src/summary/summarizerNode/index.ts +12 -0
  450. package/src/summary/summarizerNode/summarizerNode.ts +766 -0
  451. package/src/summary/summarizerNode/summarizerNodeUtils.ts +214 -0
  452. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +644 -0
  453. package/src/summary/summarizerTypes.ts +507 -0
  454. package/src/summary/summaryCollection.ts +450 -0
  455. package/src/summary/summaryFormat.ts +228 -0
  456. package/src/summary/summaryGenerator.ts +505 -0
  457. package/src/summary/summaryManager.ts +423 -0
  458. package/src/throttler.ts +131 -122
  459. package/tsconfig.esnext.json +6 -6
  460. package/tsconfig.json +9 -13
  461. package/dist/garbageCollection.d.ts +0 -387
  462. package/dist/garbageCollection.d.ts.map +0 -1
  463. package/dist/garbageCollection.js +0 -1138
  464. package/dist/garbageCollection.js.map +0 -1
  465. package/dist/garbageCollectionConstants.d.ts +0 -19
  466. package/dist/garbageCollectionConstants.d.ts.map +0 -1
  467. package/dist/garbageCollectionConstants.js +0 -34
  468. package/dist/garbageCollectionConstants.js.map +0 -1
  469. package/dist/gcSweepReadyUsageDetection.d.ts.map +0 -1
  470. package/dist/gcSweepReadyUsageDetection.js.map +0 -1
  471. package/dist/orderedClientElection.d.ts.map +0 -1
  472. package/dist/orderedClientElection.js.map +0 -1
  473. package/dist/runWhileConnectedCoordinator.d.ts.map +0 -1
  474. package/dist/runWhileConnectedCoordinator.js.map +0 -1
  475. package/dist/runningSummarizer.d.ts.map +0 -1
  476. package/dist/runningSummarizer.js.map +0 -1
  477. package/dist/serializedSnapshotStorage.d.ts +0 -58
  478. package/dist/serializedSnapshotStorage.d.ts.map +0 -1
  479. package/dist/serializedSnapshotStorage.js +0 -108
  480. package/dist/serializedSnapshotStorage.js.map +0 -1
  481. package/dist/summarizer.d.ts.map +0 -1
  482. package/dist/summarizer.js.map +0 -1
  483. package/dist/summarizerClientElection.d.ts.map +0 -1
  484. package/dist/summarizerClientElection.js.map +0 -1
  485. package/dist/summarizerHandle.d.ts +0 -12
  486. package/dist/summarizerHandle.d.ts.map +0 -1
  487. package/dist/summarizerHandle.js +0 -22
  488. package/dist/summarizerHandle.js.map +0 -1
  489. package/dist/summarizerHeuristics.d.ts.map +0 -1
  490. package/dist/summarizerHeuristics.js.map +0 -1
  491. package/dist/summarizerTypes.d.ts.map +0 -1
  492. package/dist/summarizerTypes.js.map +0 -1
  493. package/dist/summaryCollection.d.ts.map +0 -1
  494. package/dist/summaryCollection.js.map +0 -1
  495. package/dist/summaryFormat.d.ts.map +0 -1
  496. package/dist/summaryFormat.js.map +0 -1
  497. package/dist/summaryGenerator.d.ts.map +0 -1
  498. package/dist/summaryGenerator.js.map +0 -1
  499. package/dist/summaryManager.d.ts.map +0 -1
  500. package/dist/summaryManager.js.map +0 -1
  501. package/lib/garbageCollection.d.ts +0 -387
  502. package/lib/garbageCollection.d.ts.map +0 -1
  503. package/lib/garbageCollection.js +0 -1133
  504. package/lib/garbageCollection.js.map +0 -1
  505. package/lib/garbageCollectionConstants.d.ts +0 -19
  506. package/lib/garbageCollectionConstants.d.ts.map +0 -1
  507. package/lib/garbageCollectionConstants.js +0 -31
  508. package/lib/garbageCollectionConstants.js.map +0 -1
  509. package/lib/gcSweepReadyUsageDetection.d.ts.map +0 -1
  510. package/lib/gcSweepReadyUsageDetection.js.map +0 -1
  511. package/lib/orderedClientElection.d.ts.map +0 -1
  512. package/lib/orderedClientElection.js.map +0 -1
  513. package/lib/runWhileConnectedCoordinator.d.ts.map +0 -1
  514. package/lib/runWhileConnectedCoordinator.js.map +0 -1
  515. package/lib/runningSummarizer.d.ts.map +0 -1
  516. package/lib/runningSummarizer.js.map +0 -1
  517. package/lib/serializedSnapshotStorage.d.ts +0 -58
  518. package/lib/serializedSnapshotStorage.d.ts.map +0 -1
  519. package/lib/serializedSnapshotStorage.js +0 -104
  520. package/lib/serializedSnapshotStorage.js.map +0 -1
  521. package/lib/summarizer.d.ts.map +0 -1
  522. package/lib/summarizer.js.map +0 -1
  523. package/lib/summarizerClientElection.d.ts.map +0 -1
  524. package/lib/summarizerClientElection.js.map +0 -1
  525. package/lib/summarizerHandle.d.ts +0 -12
  526. package/lib/summarizerHandle.d.ts.map +0 -1
  527. package/lib/summarizerHandle.js +0 -18
  528. package/lib/summarizerHandle.js.map +0 -1
  529. package/lib/summarizerHeuristics.d.ts.map +0 -1
  530. package/lib/summarizerHeuristics.js.map +0 -1
  531. package/lib/summarizerTypes.d.ts.map +0 -1
  532. package/lib/summarizerTypes.js +0 -9
  533. package/lib/summarizerTypes.js.map +0 -1
  534. package/lib/summaryCollection.d.ts.map +0 -1
  535. package/lib/summaryCollection.js.map +0 -1
  536. package/lib/summaryFormat.d.ts.map +0 -1
  537. package/lib/summaryFormat.js.map +0 -1
  538. package/lib/summaryGenerator.d.ts.map +0 -1
  539. package/lib/summaryGenerator.js.map +0 -1
  540. package/lib/summaryManager.d.ts.map +0 -1
  541. package/lib/summaryManager.js.map +0 -1
  542. package/src/garbageCollection.ts +0 -1646
  543. package/src/garbageCollectionConstants.ts +0 -35
  544. package/src/gcSweepReadyUsageDetection.ts +0 -139
  545. package/src/orderedClientElection.ts +0 -532
  546. package/src/runWhileConnectedCoordinator.ts +0 -106
  547. package/src/runningSummarizer.ts +0 -611
  548. package/src/serializedSnapshotStorage.ts +0 -146
  549. package/src/summarizer.ts +0 -421
  550. package/src/summarizerClientElection.ts +0 -161
  551. package/src/summarizerHandle.ts +0 -21
  552. package/src/summarizerHeuristics.ts +0 -222
  553. package/src/summarizerTypes.ts +0 -510
  554. package/src/summaryCollection.ts +0 -421
  555. package/src/summaryFormat.ts +0 -235
  556. package/src/summaryGenerator.ts +0 -446
  557. package/src/summaryManager.ts +0 -394
  558. /package/dist/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
  559. /package/dist/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
  560. /package/dist/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +0 -0
  561. /package/lib/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
  562. /package/lib/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
  563. /package/lib/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +0 -0
package/lib/dataStores.js CHANGED
@@ -2,35 +2,35 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { DataCorruptionError, extractSafePropertiesFromMessage } from "@fluidframework/container-utils";
5
+ import { DataCorruptionError, extractSafePropertiesFromMessage, } from "@fluidframework/container-utils";
6
6
  import { FluidObjectHandle } from "@fluidframework/datastore";
7
7
  import { channelsTreeName, CreateSummarizerNodeSource, } from "@fluidframework/runtime-definitions";
8
- import { convertSnapshotTreeToSummaryTree, convertToSummaryTree, create404Response, createResponseError, responseToException, packagePathToTelemetryProperty, SummaryTreeBuilder, } from "@fluidframework/runtime-utils";
9
- import { ChildLogger, loggerToMonitoringContext, LoggingError, TelemetryDataTag } from "@fluidframework/telemetry-utils";
8
+ import { convertSnapshotTreeToSummaryTree, convertToSummaryTree, create404Response, createResponseError, GCDataBuilder, responseToException, SummaryTreeBuilder, unpackChildNodesUsedRoutes, } from "@fluidframework/runtime-utils";
9
+ import { ChildLogger, loggerToMonitoringContext, LoggingError, TelemetryDataTag, } from "@fluidframework/telemetry-utils";
10
10
  import { AttachState } from "@fluidframework/container-definitions";
11
- import { BlobCacheStorageService, buildSnapshotTree } from "@fluidframework/driver-utils";
12
- import { assert, Lazy, LazyPromise } from "@fluidframework/common-utils";
11
+ import { buildSnapshotTree } from "@fluidframework/driver-utils";
12
+ import { assert, Lazy } from "@fluidframework/common-utils";
13
13
  import { v4 as uuid } from "uuid";
14
- import { GCDataBuilder, unpackChildNodesUsedRoutes } from "@fluidframework/garbage-collector";
15
14
  import { DataStoreContexts } from "./dataStoreContexts";
15
+ import { defaultRuntimeHeaderData, TombstoneResponseHeaderKey, } from "./containerRuntime";
16
16
  import { RemoteFluidDataStoreContext, LocalFluidDataStoreContext, createAttributesBlob, LocalDetachedFluidDataStoreContext, } from "./dataStoreContext";
17
- import { nonDataStorePaths, rootHasIsolatedChannels } from "./summaryFormat";
17
+ import { StorageServiceWithAttachBlobs } from "./storageServiceWithAttachBlobs";
18
18
  import { isDataStoreAliasMessage } from "./dataStore";
19
- import { GCNodeType } from "./garbageCollection";
20
- import { throwOnTombstoneUsageKey } from "./garbageCollectionConstants";
21
- import { summarizerClientType } from "./summarizerClientElection";
19
+ import { GCNodeType, sweepDatastoresKey, throwOnTombstoneLoadKey, sendGCUnexpectedUsageEvent, } from "./gc";
20
+ import { summarizerClientType, nonDataStorePaths, rootHasIsolatedChannels, } from "./summary";
22
21
  /**
23
22
  * This class encapsulates data store handling. Currently it is only used by the container runtime,
24
23
  * but eventually could be hosted on any channel once we formalize the channel api boundary.
25
24
  */
26
25
  export class DataStores {
27
- constructor(baseSnapshot, runtime, submitAttachFn, getCreateChildSummarizerNodeFn, deleteChildSummarizerNodeFn, baseLogger, getBaseGCDetails, gcNodeUpdated, aliasMap, contexts = new DataStoreContexts(baseLogger)) {
26
+ constructor(baseSnapshot, runtime, submitAttachFn, getCreateChildSummarizerNodeFn, deleteChildSummarizerNodeFn, baseLogger, gcNodeUpdated, isDataStoreDeleted, aliasMap, contexts = new DataStoreContexts(baseLogger)) {
28
27
  this.baseSnapshot = baseSnapshot;
29
28
  this.runtime = runtime;
30
29
  this.submitAttachFn = submitAttachFn;
31
30
  this.getCreateChildSummarizerNodeFn = getCreateChildSummarizerNodeFn;
32
31
  this.deleteChildSummarizerNodeFn = deleteChildSummarizerNodeFn;
33
32
  this.gcNodeUpdated = gcNodeUpdated;
33
+ this.isDataStoreDeleted = isDataStoreDeleted;
34
34
  this.aliasMap = aliasMap;
35
35
  this.contexts = contexts;
36
36
  // Stores tracked by the Domain
@@ -45,17 +45,10 @@ export class DataStores {
45
45
  this.dispose = () => this.disposeOnce.value;
46
46
  this.mc = loggerToMonitoringContext(ChildLogger.create(baseLogger));
47
47
  this.containerRuntimeHandle = new FluidObjectHandle(this.runtime, "/", this.runtime.IFluidHandleContext);
48
- const baseGCDetailsP = new LazyPromise(async () => {
49
- return getBaseGCDetails();
50
- });
51
- // Returns the base GC details for the data store with the given id.
52
- const dataStoreBaseGCDetails = async (dataStoreId) => {
53
- const baseGCDetails = await baseGCDetailsP;
54
- return baseGCDetails.get(dataStoreId);
55
- };
56
48
  // Tombstone should only throw when the feature flag is enabled and the client isn't a summarizer
57
- this.throwOnTombstoneUsage =
58
- this.mc.config.getBoolean(throwOnTombstoneUsageKey) === true &&
49
+ this.throwOnTombstoneLoad =
50
+ this.mc.config.getBoolean(throwOnTombstoneLoadKey) === true &&
51
+ this.runtime.gcTombstoneEnforcementAllowed &&
59
52
  this.runtime.clientDetails.type !== summarizerClientType;
60
53
  // Extract stores stored inside the snapshot
61
54
  const fluidDataStores = new Map();
@@ -77,11 +70,12 @@ export class DataStores {
77
70
  dataStoreContext = new RemoteFluidDataStoreContext({
78
71
  id: key,
79
72
  snapshotTree: value,
80
- getBaseGCDetails: async () => dataStoreBaseGCDetails(key),
81
73
  runtime: this.runtime,
82
74
  storage: this.runtime.storage,
83
75
  scope: this.runtime.scope,
84
- createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(key, { type: CreateSummarizerNodeSource.FromSummary }),
76
+ createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(key, {
77
+ type: CreateSummarizerNodeSource.FromSummary,
78
+ }),
85
79
  });
86
80
  }
87
81
  else {
@@ -95,7 +89,9 @@ export class DataStores {
95
89
  runtime: this.runtime,
96
90
  storage: this.runtime.storage,
97
91
  scope: this.runtime.scope,
98
- createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(key, { type: CreateSummarizerNodeSource.FromSummary }),
92
+ createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(key, {
93
+ type: CreateSummarizerNodeSource.FromSummary,
94
+ }),
99
95
  makeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(key),
100
96
  snapshotTree,
101
97
  isRootDataStore: undefined,
@@ -140,10 +136,10 @@ export class DataStores {
140
136
  } }));
141
137
  throw error;
142
138
  }
143
- const flatBlobs = new Map();
139
+ const flatAttachBlobs = new Map();
144
140
  let snapshotTree;
145
141
  if (attachMessage.snapshot) {
146
- snapshotTree = buildSnapshotTree(attachMessage.snapshot.entries, flatBlobs);
142
+ snapshotTree = buildSnapshotTree(attachMessage.snapshot.entries, flatAttachBlobs);
147
143
  }
148
144
  // Include the type of attach message which is the pkg of the store to be
149
145
  // used by RemoteFluidDataStoreContext in case it is not in the snapshot.
@@ -151,10 +147,8 @@ export class DataStores {
151
147
  const remoteFluidDataStoreContext = new RemoteFluidDataStoreContext({
152
148
  id: attachMessage.id,
153
149
  snapshotTree,
154
- // New data stores begin with empty GC details since GC hasn't run on them yet.
155
- getBaseGCDetails: async () => { return {}; },
156
150
  runtime: this.runtime,
157
- storage: new BlobCacheStorageService(this.runtime.storage, flatBlobs),
151
+ storage: new StorageServiceWithAttachBlobs(this.runtime.storage, flatAttachBlobs),
158
152
  scope: this.runtime.scope,
159
153
  createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(attachMessage.id, {
160
154
  type: CreateSummarizerNodeSource.FromAttach,
@@ -229,7 +223,9 @@ export class DataStores {
229
223
  runtime: this.runtime,
230
224
  storage: this.runtime.storage,
231
225
  scope: this.runtime.scope,
232
- createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(id, { type: CreateSummarizerNodeSource.Local }),
226
+ createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(id, {
227
+ type: CreateSummarizerNodeSource.Local,
228
+ }),
233
229
  makeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(id),
234
230
  snapshotTree: undefined,
235
231
  isRootDataStore: isRoot,
@@ -245,7 +241,9 @@ export class DataStores {
245
241
  runtime: this.runtime,
246
242
  storage: this.runtime.storage,
247
243
  scope: this.runtime.scope,
248
- createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(id, { type: CreateSummarizerNodeSource.Local }),
244
+ createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(id, {
245
+ type: CreateSummarizerNodeSource.Local,
246
+ }),
249
247
  makeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(id),
250
248
  snapshotTree: undefined,
251
249
  isRootDataStore: false,
@@ -254,7 +252,9 @@ export class DataStores {
254
252
  this.contexts.addUnbound(context);
255
253
  return context;
256
254
  }
257
- get disposed() { return this.disposeOnce.evaluated; }
255
+ get disposed() {
256
+ return this.disposeOnce.evaluated;
257
+ }
258
258
  resubmitDataStoreOp(content, localOpMetadata) {
259
259
  const envelope = content;
260
260
  const context = this.contexts.get(envelope.address);
@@ -281,6 +281,8 @@ export class DataStores {
281
281
  processFluidDataStoreOp(message, local, localMessageMetadata) {
282
282
  const envelope = message.contents;
283
283
  const transformed = Object.assign(Object.assign({}, message), { contents: envelope.contents });
284
+ const request = { url: envelope.address };
285
+ this.validateNotDeleted(envelope.address, request);
284
286
  const context = this.contexts.get(envelope.address);
285
287
  assert(!!context, 0x162 /* "There should be a store context for the op" */);
286
288
  context.process(transformed, local, localMessageMetadata);
@@ -288,32 +290,70 @@ export class DataStores {
288
290
  // being used.
289
291
  this.gcNodeUpdated(`/${envelope.address}`, message.timestamp, context.isLoaded ? context.packagePath : undefined);
290
292
  }
291
- async getDataStore(id, wait, viaHandle) {
292
- const context = await this.contexts.getBoundOrRemoted(id, wait);
293
+ async getDataStore(id, requestHeaderData) {
294
+ const headerData = Object.assign(Object.assign({}, defaultRuntimeHeaderData), requestHeaderData);
293
295
  const request = { url: id };
296
+ this.validateNotDeleted(id, request, headerData);
297
+ const context = await this.contexts.getBoundOrRemoted(id, headerData.wait);
294
298
  if (context === undefined) {
295
299
  // The requested data store does not exits. Throw a 404 response exception.
296
300
  throw responseToException(create404Response(request), request);
297
301
  }
302
+ this.validateNotTombstoned(context, request, requestHeaderData);
303
+ return context;
304
+ }
305
+ /**
306
+ * Validate that the data store had not been deleted by GC.
307
+ *
308
+ * @param id - data store id
309
+ * @param request - the request information to log if the validation detects the data store has been deleted
310
+ * @param requestHeaderData - the request header information to log if the validation detects the data store has been deleted
311
+ */
312
+ validateNotDeleted(id, request, requestHeaderData) {
313
+ const dataStoreNodePath = `/${id}`;
314
+ if (this.isDataStoreDeleted(dataStoreNodePath)) {
315
+ assert(!this.contexts.has(id), 0x570 /* Inconsistent state! GC says the data store is deleted, but the data store is not deleted from the runtime. */);
316
+ // The requested data store is removed by gc. Create a 404 gc response exception.
317
+ const error = responseToException(createResponseError(404, "DataStore was deleted", request), request);
318
+ sendGCUnexpectedUsageEvent(this.mc, {
319
+ eventName: "GC_Deleted_DataStore_Requested",
320
+ category: "error",
321
+ isSummarizerClient: this.runtime.clientDetails.type === summarizerClientType,
322
+ headers: JSON.stringify(requestHeaderData),
323
+ gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
324
+ }, undefined /** packagePath */, error);
325
+ throw error;
326
+ }
327
+ }
328
+ /**
329
+ * Validates that the data store context requested has not been marked as tombstone by GC.
330
+ *
331
+ * @param context - the data store context in question
332
+ * @param request - the request information to log if the validation detects the data store has been tombstoned
333
+ * @param headerData - the request header information to log if the validation detects the data store has been tombstoned
334
+ */
335
+ validateNotTombstoned(context, request, headerData) {
298
336
  if (context.tombstoned) {
337
+ const shouldFail = this.throwOnTombstoneLoad && !headerData.allowTombstone;
299
338
  // The requested data store is removed by gc. Create a 404 gc response exception.
300
- const error = responseToException(createResponseError(404, "Datastore removed by gc", request), request);
301
- // Note: if a user writes a request to look like it's viaHandle, we will also send this telemetry event
302
- this.mc.logger.sendErrorEvent({
339
+ const error = responseToException(createResponseError(404, "DataStore was deleted", request, {
340
+ [TombstoneResponseHeaderKey]: true,
341
+ }), request);
342
+ sendGCUnexpectedUsageEvent(this.mc, {
303
343
  eventName: "GC_Tombstone_DataStore_Requested",
304
- url: request.url,
305
- pkg: packagePathToTelemetryProperty(context.isLoaded ? context.packagePath : undefined),
306
- viaHandle,
307
- }, error);
308
- // Always log an error when tombstoned data store is used. However, throw an error only if
309
- // throwOnTombstoneUsage is set.
310
- if (this.throwOnTombstoneUsage) {
344
+ category: shouldFail ? "error" : "generic",
345
+ isSummarizerClient: this.runtime.clientDetails.type === summarizerClientType,
346
+ headers: JSON.stringify(headerData),
347
+ gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
348
+ }, context.isLoaded ? context.packagePath : undefined, error);
349
+ if (shouldFail) {
311
350
  throw error;
312
351
  }
313
352
  }
314
- return context;
315
353
  }
316
354
  processSignal(address, message, local) {
355
+ const request = { url: address };
356
+ this.validateNotDeleted(address, request);
317
357
  const context = this.contexts.get(address);
318
358
  if (!context) {
319
359
  // Attach message may not have been processed yet
@@ -339,6 +379,10 @@ export class DataStores {
339
379
  eventName: "SetConnectionStateError",
340
380
  clientId,
341
381
  fluidDataStore,
382
+ details: JSON.stringify({
383
+ runtimeConnected: this.runtime.connected,
384
+ connected,
385
+ }),
342
386
  }, error);
343
387
  }
344
388
  }
@@ -360,10 +404,12 @@ export class DataStores {
360
404
  // Iterate over each store and ask it to snapshot
361
405
  await Promise.all(Array.from(this.contexts)
362
406
  .filter(([_, context]) => {
363
- // Summarizer works only with clients with no local changes!
364
- assert(context.attachState !== AttachState.Attaching, 0x165 /* "Summarizer cannot work if client has local changes" */);
407
+ // Summarizer works only with clients with no local changes. A data store in attaching
408
+ // state indicates an op was sent to attach a local data store.
409
+ assert(context.attachState !== AttachState.Attaching, 0x588 /* Local data store detected in attaching state during summarize */);
365
410
  return context.attachState === AttachState.Attached;
366
- }).map(async ([contextId, context]) => {
411
+ })
412
+ .map(async ([contextId, context]) => {
367
413
  const contextSummary = await context.summarize(fullTree, trackState, telemetryContext);
368
414
  summaryBuilder.addWithStats(contextId, contextSummary);
369
415
  }));
@@ -383,9 +429,9 @@ export class DataStores {
383
429
  // Take summary of bounded data stores only, make sure we haven't summarized them already
384
430
  // and no attach op has been fired for that data store because for loader versions <= 0.24
385
431
  // we set attach state as "attaching" before taking createNew summary.
386
- !(this.contexts.isNotBound(key)
387
- || builderTree[key]
388
- || this.attachOpFiredForDataStore.has(key)))
432
+ !(this.contexts.isNotBound(key) ||
433
+ builderTree[key] ||
434
+ this.attachOpFiredForDataStore.has(key)))
389
435
  .map(([key, value]) => {
390
436
  let dataStoreSummary;
391
437
  if (value.isLoaded) {
@@ -438,10 +484,12 @@ export class DataStores {
438
484
  // Iterate over each store and get their GC data.
439
485
  await Promise.all(Array.from(this.contexts)
440
486
  .filter(([_, context]) => {
441
- // Get GC data only for attached contexts. Detached contexts are not connected in the GC reference
442
- // graph so any references they might have won't be connected as well.
487
+ // Summarizer client and hence GC works only with clients with no local changes. A data store in
488
+ // attaching state indicates an op was sent to attach a local data store.
489
+ assert(context.attachState !== AttachState.Attaching, 0x589 /* Local data store detected in attaching state while running GC */);
443
490
  return context.attachState === AttachState.Attached;
444
- }).map(async ([contextId, context]) => {
491
+ })
492
+ .map(async ([contextId, context]) => {
445
493
  const contextGCData = await context.getGCData(fullGC);
446
494
  // Prefix the child's id to the ids of its GC nodes so they can be identified as belonging to the child.
447
495
  // This also gradually builds the id of each node to be a path from the root.
@@ -462,10 +510,6 @@ export class DataStores {
462
510
  // Verify that the used routes are correct.
463
511
  for (const [id] of usedDataStoreRoutes) {
464
512
  assert(this.contexts.has(id), 0x167 /* "Used route does not belong to any known data store" */);
465
- // Revive datastores regardless of whether or not tombstone the tombstone flag is flipped
466
- const dataStore = this.contexts.get(id);
467
- assert(dataStore !== undefined, 0x46e /* No data store retrieved with specified id */);
468
- dataStore.setTombstone(false /* tombstone */);
469
513
  }
470
514
  // Update the used routes in each data store. Used routes is empty for unused data stores.
471
515
  for (const [contextId, context] of this.contexts) {
@@ -473,13 +517,10 @@ export class DataStores {
473
517
  }
474
518
  }
475
519
  /**
476
- * This is called to update objects whose routes are unused. The unused objects are either deleted or marked as
477
- * tombstones.
520
+ * This is called to update objects whose routes are unused. The unused objects are deleted.
478
521
  * @param unusedRoutes - The routes that are unused in all data stores in this Container.
479
- * @param tombstone - if true, the objects corresponding to unused routes are marked tombstones. Otherwise, they
480
- * are deleted.
481
522
  */
482
- updateUnusedRoutes(unusedRoutes, tombstone) {
523
+ updateUnusedRoutes(unusedRoutes) {
483
524
  for (const route of unusedRoutes) {
484
525
  const pathParts = route.split("/");
485
526
  // Delete data store only if its route (/datastoreId) is in unusedRoutes. We don't want to delete a data
@@ -489,23 +530,70 @@ export class DataStores {
489
530
  }
490
531
  const dataStoreId = pathParts[1];
491
532
  assert(this.contexts.has(dataStoreId), 0x2d7 /* No data store with specified id */);
492
- /**
493
- * When running GC in tombstone mode, datastore contexts are tombstoned. Tombstoned datastore contexts
494
- * enable testing scenarios with accessing deleted content without actually deleting content from
495
- * summaries.
496
- */
497
- if (tombstone) {
498
- const dataStore = this.contexts.get(dataStoreId);
499
- assert(dataStore !== undefined, 0x442 /* No data store retrieved with specified id */);
500
- dataStore.setTombstone(true /* tombstone */);
501
- continue;
502
- }
503
533
  // Delete the contexts of unused data stores.
504
534
  this.contexts.delete(dataStoreId);
505
535
  // Delete the summarizer node of the unused data stores.
506
536
  this.deleteChildSummarizerNodeFn(dataStoreId);
507
537
  }
508
538
  }
539
+ /**
540
+ * Delete data stores and its objects that are sweep ready.
541
+ * @param sweepReadyDataStoreRoutes - The routes of data stores and its objects that are sweep ready and should
542
+ * be deleted.
543
+ * @returns - The routes of data stores and its objects that were deleted.
544
+ */
545
+ deleteSweepReadyNodes(sweepReadyDataStoreRoutes) {
546
+ // If sweep for data stores is not enabled, return empty list indicating nothing is deleted.
547
+ if (this.mc.config.getBoolean(sweepDatastoresKey) !== true) {
548
+ return [];
549
+ }
550
+ for (const route of sweepReadyDataStoreRoutes) {
551
+ const pathParts = route.split("/");
552
+ const dataStoreId = pathParts[1];
553
+ // TODO: GC:Validation - Skip any routes already deleted
554
+ // Ignore sub-data store routes because a data store and its sub-routes are deleted together, so, we only
555
+ // need to delete the data store.
556
+ if (pathParts.length > 2) {
557
+ continue;
558
+ }
559
+ if (!this.contexts.has(dataStoreId)) {
560
+ this.mc.logger.sendErrorEvent({
561
+ eventName: "DeletedDataStoreNotFound",
562
+ dataStoreId,
563
+ });
564
+ }
565
+ const dataStore = this.contexts.get(dataStoreId);
566
+ assert(dataStore !== undefined, 0x571 /* Attempting to delete unknown dataStore */);
567
+ dataStore.delete();
568
+ // Delete the contexts of sweep ready data stores.
569
+ this.contexts.delete(dataStoreId);
570
+ // Delete the summarizer node of the sweep ready data stores.
571
+ this.deleteChildSummarizerNodeFn(dataStoreId);
572
+ }
573
+ return Array.from(sweepReadyDataStoreRoutes);
574
+ }
575
+ /**
576
+ * This is called to update objects whose routes are tombstones. Tombstoned datastore contexts enable testing
577
+ * scenarios with accessing deleted content without actually deleting content from summaries.
578
+ * @param tombstonedRoutes - The routes that are tombstones in all data stores in this Container.
579
+ */
580
+ updateTombstonedRoutes(tombstonedRoutes) {
581
+ const tombstonedDataStoresSet = new Set();
582
+ for (const route of tombstonedRoutes) {
583
+ const pathParts = route.split("/");
584
+ // Tombstone data store only if its route (/datastoreId) is directly in tombstoneRoutes.
585
+ if (pathParts.length > 2) {
586
+ continue;
587
+ }
588
+ const dataStoreId = pathParts[1];
589
+ assert(this.contexts.has(dataStoreId), 0x510 /* No data store with specified id */);
590
+ tombstonedDataStoresSet.add(dataStoreId);
591
+ }
592
+ // Update the used routes in each data store. Used routes is empty for unused data stores.
593
+ for (const [contextId, context] of this.contexts) {
594
+ context.setTombstone(tombstonedDataStoresSet.has(contextId));
595
+ }
596
+ }
509
597
  /**
510
598
  * Returns the outbound routes of this channel. Only root data stores are considered referenced and their paths are
511
599
  * part of outbound routes.