@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
@@ -0,0 +1,332 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { ITelemetryGenericEvent } from "@fluidframework/common-definitions";
7
+ import { assert } from "@fluidframework/common-utils";
8
+ import { ISnapshotTree } from "@fluidframework/protocol-definitions";
9
+ import {
10
+ gcBlobPrefix,
11
+ gcDeletedBlobKey,
12
+ gcTombstoneBlobKey,
13
+ IGarbageCollectionData,
14
+ IGarbageCollectionDetailsBase,
15
+ } from "@fluidframework/runtime-definitions";
16
+ import { packagePathToTelemetryProperty } from "@fluidframework/runtime-utils";
17
+ import { MonitoringContext } from "@fluidframework/telemetry-utils";
18
+ import {
19
+ disableTombstoneKey,
20
+ GCFeatureMatrix,
21
+ GCVersion,
22
+ IGCMetadata,
23
+ runSweepKey,
24
+ throwOnTombstoneLoadKey,
25
+ throwOnTombstoneUsageKey,
26
+ } from "./gcDefinitions";
27
+ import {
28
+ IGarbageCollectionNodeData,
29
+ IGarbageCollectionSnapshotData,
30
+ IGarbageCollectionState,
31
+ } from "./gcSummaryDefinitions";
32
+
33
+ export function getGCVersion(metadata?: IGCMetadata): GCVersion {
34
+ if (!metadata) {
35
+ // Force to 0/disallowed in prior versions
36
+ return 0;
37
+ }
38
+ return metadata.gcFeature ?? 0;
39
+ }
40
+
41
+ /**
42
+ * Consolidates info / logic for logging when we encounter unexpected usage of GC'd objects. For example, when a
43
+ * tombstoned or deleted object is loaded.
44
+ */
45
+ export function sendGCUnexpectedUsageEvent(
46
+ mc: MonitoringContext,
47
+ event: ITelemetryGenericEvent & {
48
+ category: "error" | "generic";
49
+ gcTombstoneEnforcementAllowed: boolean | undefined;
50
+ },
51
+ packagePath: readonly string[] | undefined,
52
+ error?: unknown,
53
+ ) {
54
+ event.pkg = packagePathToTelemetryProperty(packagePath);
55
+ event.tombstoneFlags = JSON.stringify({
56
+ DisableTombstone: mc.config.getBoolean(disableTombstoneKey),
57
+ ThrowOnTombstoneUsage: mc.config.getBoolean(throwOnTombstoneUsageKey),
58
+ ThrowOnTombstoneLoad: mc.config.getBoolean(throwOnTombstoneLoadKey),
59
+ });
60
+ event.sweepFlags = JSON.stringify({
61
+ EnableSweepFlag: mc.config.getBoolean(runSweepKey),
62
+ });
63
+
64
+ mc.logger.sendTelemetryEvent(event, error);
65
+ }
66
+
67
+ /**
68
+ * Indicates whether Tombstone Enforcement is allowed for this document based on the current/persisted
69
+ * TombstoneGeneration values
70
+ *
71
+ * In order to protect old documents that were created at a time when known bugs exist that violate GC's invariants
72
+ * such that enforcing GC Tombstone (Failing on Tombstone load/usage) would cause legitimate data loss,
73
+ * the container author may increment the generation value for Tombstone such that containers created
74
+ * with a different value will not be subjected to GC enforcement.
75
+ *
76
+ * If no generation is provided at runtime, this defaults to return true to maintain expected default behavior
77
+ *
78
+ * @param persistedGeneration - The persisted tombstoneGeneration value
79
+ * @param currentGeneration - The current app-provided tombstoneGeneration value
80
+ * @returns true if GC Tombstone enforcement (Fail on Tombstone load/usage) should be allowed for this document
81
+ */
82
+ export function shouldAllowGcTombstoneEnforcement(
83
+ persistedGeneration: number | undefined,
84
+ currentGeneration: number | undefined,
85
+ ): boolean {
86
+ // If no Generation value is provided for this session, then we should default to letting Tombstone feature behave as intended.
87
+ if (currentGeneration === undefined) {
88
+ return true;
89
+ }
90
+ return persistedGeneration === currentGeneration;
91
+ }
92
+
93
+ /**
94
+ * Indicates whether Sweep is allowed for this document based on the GC Feature Matrix and current SweepGeneration
95
+ *
96
+ * In order to protect old documents that were created at a time when known bugs exist that violate GC's invariants
97
+ * such that enforcing GC Sweep would cause legitimate data loss, the container author may increment the generation value for Sweep
98
+ * such that containers created with a different value will not be subjected to GC Sweep.
99
+ *
100
+ * If no generation is provided, Sweep will be disabled.
101
+ * Passing 0 is a special case: Sweep will be enabled for any document with gcSweepGeneration OR gcTombstoneGeneration as 0.
102
+ *
103
+ * @param persistedGenerations - The persisted sweep/tombstone generations from the GC Feature Matrix
104
+ * @param currentGeneration - The current app-provided sweepGeneration value
105
+ * @returns true if GC Sweep should be allowed for this document
106
+ */
107
+ export function shouldAllowGcSweep(
108
+ persistedGenerations: Pick<GCFeatureMatrix, "sweepGeneration" | "tombstoneGeneration">,
109
+ currentGeneration: number | undefined,
110
+ ): boolean {
111
+ // If no Generation value is provided for this session, default to false
112
+ if (currentGeneration === undefined) {
113
+ return false;
114
+ }
115
+
116
+ // 0 is a special case: It matches both SweepGeneration and TombstoneGeneration
117
+ // This is an optimistic measure to maximize coverage of GC Sweep if no bumps to TombstoneGeneration are needed before enabling Sweep.
118
+ if (currentGeneration === 0) {
119
+ return (
120
+ persistedGenerations.sweepGeneration === 0 ||
121
+ persistedGenerations.tombstoneGeneration === 0
122
+ );
123
+ }
124
+
125
+ return persistedGenerations.sweepGeneration === currentGeneration;
126
+ }
127
+
128
+ /**
129
+ * Sorts the given GC state as per the id of the GC nodes. It also sorts the outbound routes array of each node.
130
+ */
131
+ export function generateSortedGCState(gcState: IGarbageCollectionState): IGarbageCollectionState {
132
+ const sortableArray: [string, IGarbageCollectionNodeData][] = Object.entries(gcState.gcNodes);
133
+ sortableArray.sort(([a], [b]) => a.localeCompare(b));
134
+ const sortedGCState: IGarbageCollectionState = { gcNodes: {} };
135
+ for (const [nodeId, nodeData] of sortableArray) {
136
+ nodeData.outboundRoutes.sort();
137
+ sortedGCState.gcNodes[nodeId] = nodeData;
138
+ }
139
+ return sortedGCState;
140
+ }
141
+
142
+ /**
143
+ * Concatenates the given GC states and returns the concatenated GC state.
144
+ */
145
+ export function concatGarbageCollectionStates(
146
+ gcState1: IGarbageCollectionState,
147
+ gcState2: IGarbageCollectionState,
148
+ ): IGarbageCollectionState {
149
+ const combinedGCNodes: { [id: string]: IGarbageCollectionNodeData } = {};
150
+ for (const [nodeId, nodeData] of Object.entries(gcState1.gcNodes)) {
151
+ combinedGCNodes[nodeId] = {
152
+ outboundRoutes: Array.from(nodeData.outboundRoutes),
153
+ unreferencedTimestampMs: nodeData.unreferencedTimestampMs,
154
+ };
155
+ }
156
+
157
+ for (const [nodeId, nodeData] of Object.entries(gcState2.gcNodes)) {
158
+ let combineNodeData = combinedGCNodes[nodeId];
159
+ if (combineNodeData === undefined) {
160
+ combineNodeData = {
161
+ outboundRoutes: Array.from(nodeData.outboundRoutes),
162
+ unreferencedTimestampMs: nodeData.unreferencedTimestampMs,
163
+ };
164
+ } else {
165
+ // Validate that same node doesn't have different unreferenced timestamp.
166
+ if (
167
+ nodeData.unreferencedTimestampMs !== undefined &&
168
+ combineNodeData.unreferencedTimestampMs !== undefined
169
+ ) {
170
+ assert(
171
+ nodeData.unreferencedTimestampMs === combineNodeData.unreferencedTimestampMs,
172
+ "Two entries for the same GC node with different unreferenced timestamp",
173
+ );
174
+ }
175
+ combineNodeData = {
176
+ outboundRoutes: [
177
+ ...new Set([...nodeData.outboundRoutes, ...combineNodeData.outboundRoutes]),
178
+ ],
179
+ unreferencedTimestampMs:
180
+ nodeData.unreferencedTimestampMs ?? combineNodeData.unreferencedTimestampMs,
181
+ };
182
+ }
183
+ combinedGCNodes[nodeId] = combineNodeData;
184
+ }
185
+ return { gcNodes: combinedGCNodes };
186
+ }
187
+
188
+ /**
189
+ * Helper function that clones the GC data.
190
+ * @param gcData - The GC data to clone.
191
+ * @returns a clone of the given GC data.
192
+ */
193
+ export function cloneGCData(gcData: IGarbageCollectionData): IGarbageCollectionData {
194
+ const clonedGCNodes: { [id: string]: string[] } = {};
195
+ for (const [id, outboundRoutes] of Object.entries(gcData.gcNodes)) {
196
+ clonedGCNodes[id] = Array.from(outboundRoutes);
197
+ }
198
+ return {
199
+ gcNodes: clonedGCNodes,
200
+ };
201
+ }
202
+
203
+ /**
204
+ * Concatenates the given GC data and returns the concatenated GC data.
205
+ */
206
+ export function concatGarbageCollectionData(
207
+ gcData1: IGarbageCollectionData,
208
+ gcData2: IGarbageCollectionData,
209
+ ) {
210
+ const combinedGCData: IGarbageCollectionData = cloneGCData(gcData1);
211
+ for (const [id, routes] of Object.entries(gcData2.gcNodes)) {
212
+ if (combinedGCData.gcNodes[id] === undefined) {
213
+ combinedGCData.gcNodes[id] = Array.from(routes);
214
+ } else {
215
+ const combinedRoutes = [...routes, ...combinedGCData.gcNodes[id]];
216
+ combinedGCData.gcNodes[id] = [...new Set(combinedRoutes)];
217
+ }
218
+ }
219
+ return combinedGCData;
220
+ }
221
+
222
+ /**
223
+ * Gets the base garbage collection state from the given snapshot tree. It contains GC state, deleted nodes and
224
+ * tombstones. The GC state may be written into multiple blobs. Merge the GC state from all such blobs into one.
225
+ */
226
+ export async function getGCDataFromSnapshot(
227
+ gcSnapshotTree: ISnapshotTree,
228
+ readAndParseBlob: <T>(id: string) => Promise<T>,
229
+ ): Promise<IGarbageCollectionSnapshotData> {
230
+ let rootGCState: IGarbageCollectionState = { gcNodes: {} };
231
+ let tombstones: string[] | undefined;
232
+ let deletedNodes: string[] | undefined;
233
+ for (const key of Object.keys(gcSnapshotTree.blobs)) {
234
+ // Update deleted nodes blob.
235
+ if (key === gcDeletedBlobKey) {
236
+ deletedNodes = await readAndParseBlob<string[]>(gcSnapshotTree.blobs[key]);
237
+ continue;
238
+ }
239
+
240
+ // Update tombstone blob.
241
+ if (key === gcTombstoneBlobKey) {
242
+ tombstones = await readAndParseBlob<string[]>(gcSnapshotTree.blobs[key]);
243
+ continue;
244
+ }
245
+
246
+ // Skip blobs that do not start with the GC prefix.
247
+ if (!key.startsWith(gcBlobPrefix)) {
248
+ continue;
249
+ }
250
+
251
+ const blobId = gcSnapshotTree.blobs[key];
252
+ if (blobId === undefined) {
253
+ continue;
254
+ }
255
+ const gcState = await readAndParseBlob<IGarbageCollectionState>(blobId);
256
+ assert(gcState !== undefined, "GC blob missing from snapshot");
257
+ // Merge the GC state of this blob into the root GC state.
258
+ rootGCState = concatGarbageCollectionStates(rootGCState, gcState);
259
+ }
260
+ return { gcState: rootGCState, tombstones, deletedNodes };
261
+ }
262
+
263
+ /**
264
+ * Helper function that unpacks the GC details of the children from a given node's GC details.
265
+ * @param gcDetails - The GC details of a node.
266
+ * @returns A map of GC details of each children of the the given node.
267
+ */
268
+ export function unpackChildNodesGCDetails(gcDetails: IGarbageCollectionDetailsBase) {
269
+ const childGCDetailsMap: Map<string, IGarbageCollectionDetailsBase> = new Map();
270
+
271
+ // If GC data is not available, bail out.
272
+ if (gcDetails.gcData === undefined) {
273
+ return childGCDetailsMap;
274
+ }
275
+
276
+ const gcNodes = gcDetails.gcData.gcNodes;
277
+ for (const [id, outboundRoutes] of Object.entries(gcNodes)) {
278
+ // Skip self-node since only children GC data is to be generated.
279
+ if (id === "/") {
280
+ continue;
281
+ }
282
+
283
+ assert(id.startsWith("/"), "node id should always be an absolute route");
284
+ const childId = id.split("/")[1];
285
+ let childGCNodeId = id.slice(childId.length + 1);
286
+ // GC node id always begins with "/". Handle the special case where a child's id in the parent's GC nodes is
287
+ // of format `/root`. In this case, the childId is root and childGCNodeId is "". Make childGCNodeId = "/".
288
+ if (childGCNodeId === "") {
289
+ childGCNodeId = "/";
290
+ }
291
+
292
+ let childGCDetails = childGCDetailsMap.get(childId);
293
+ if (childGCDetails === undefined) {
294
+ childGCDetails = { gcData: { gcNodes: {} }, usedRoutes: [] };
295
+ }
296
+ // gcData should not undefined as its always at least initialized as empty above.
297
+ assert(childGCDetails.gcData !== undefined, "Child GC data should have been initialized");
298
+ childGCDetails.gcData.gcNodes[childGCNodeId] = [...new Set(outboundRoutes)];
299
+ childGCDetailsMap.set(childId, childGCDetails);
300
+ }
301
+
302
+ if (gcDetails.usedRoutes === undefined) {
303
+ return childGCDetailsMap;
304
+ }
305
+
306
+ // Remove the node's self used route, if any, and generate the children used routes.
307
+ const usedRoutes = gcDetails.usedRoutes.filter((route) => route !== "" && route !== "/");
308
+ for (const route of usedRoutes) {
309
+ assert(route.startsWith("/"), "Used route should always be an absolute route");
310
+ const childId = route.split("/")[1];
311
+ const childUsedRoute = route.slice(childId.length + 1);
312
+
313
+ const childGCDetails = childGCDetailsMap.get(childId);
314
+ assert(
315
+ childGCDetails?.usedRoutes !== undefined,
316
+ "This should have be initialized when generate GC nodes above",
317
+ );
318
+
319
+ childGCDetails.usedRoutes.push(childUsedRoute);
320
+ childGCDetailsMap.set(childId, childGCDetails);
321
+ }
322
+ return childGCDetailsMap;
323
+ }
324
+
325
+ /**
326
+ * Trims the leading and trailing slashes from the given string.
327
+ * @param str - A string that may contain leading and / or trailing slashes.
328
+ * @returns A new string without leading and trailing slashes.
329
+ */
330
+ export function trimLeadingAndTrailingSlashes(str: string) {
331
+ return str.replace(/^\/+|\/+$/g, "");
332
+ }
@@ -0,0 +1,52 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { IGCResult } from "./gcDefinitions";
7
+
8
+ /**
9
+ * Runs garbage collection on the given reference graph.
10
+ * @param referenceGraph - The reference graph to run GC on. It's a list of nodes where each node has an id and set of
11
+ * routes to other nodes in the graph.
12
+ * @param rootIds - The ids of root nodes that are considered referenced.
13
+ * @returns the ids of referenced nodes and the ids of deleted nodes in the referenced graph.
14
+ */
15
+ export function runGarbageCollection(
16
+ referenceGraph: { [id: string]: string[] },
17
+ rootIds: string[],
18
+ ): IGCResult {
19
+ // This set keeps track of nodes that we have visited. It is used to detect cycles in the graph.
20
+ const visited: Set<string> = new Set();
21
+
22
+ // This tracks the ids of referenced nodes. The nodes corresponding to rootIds are always considered
23
+ // referenced so we start with those.
24
+ const referencedIds: string[] = [...rootIds];
25
+ for (const id of referencedIds) {
26
+ // If we have already seen this node, ignore and continue. Else, add it to visited list.
27
+ if (visited.has(id)) {
28
+ continue;
29
+ }
30
+ visited.add(id);
31
+
32
+ // Get the node for the referenced id and add its outbound routes to referencedIds since they are
33
+ // also referenced.
34
+ const routes = referenceGraph[id];
35
+ if (routes !== undefined) {
36
+ referencedIds.push(...routes);
37
+ }
38
+ }
39
+
40
+ const referencedNodeIds: string[] = [];
41
+ const deletedNodeIds: string[] = [];
42
+ for (const id of Object.keys(referenceGraph)) {
43
+ // The nodes from the reference graph whose ids are in the visited list are referenced.
44
+ // The rest of the nodes are deleted.
45
+ if (visited.has(id)) {
46
+ referencedNodeIds.push(id);
47
+ } else {
48
+ deletedNodeIds.push(id);
49
+ }
50
+ }
51
+ return { referencedNodeIds, deletedNodeIds };
52
+ }
@@ -0,0 +1,54 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { IGarbageCollectionData } from "@fluidframework/runtime-definitions";
7
+
8
+ /**
9
+ * The garbage collection data of each node in the reference graph. Each node's GC data is written in the summary
10
+ * in this format.
11
+ */
12
+ export interface IGarbageCollectionNodeData {
13
+ /**
14
+ * The set of routes to other nodes in the graph.
15
+ */
16
+ outboundRoutes: string[];
17
+ /**
18
+ * If the node is unreferenced, the timestamp of when it was marked unreferenced.
19
+ */
20
+ unreferencedTimestampMs?: number;
21
+ }
22
+
23
+ /**
24
+ * The garbage collection state of the reference graph. It contains a list of all the nodes in the graph and their
25
+ * GC data. The GC data is written in the summary in this format.
26
+ */
27
+ export interface IGarbageCollectionState {
28
+ gcNodes: { [id: string]: IGarbageCollectionNodeData };
29
+ }
30
+
31
+ /**
32
+ * The GC data that is read from a snapshot. It contains the Garbage CollectionState state and tombstone state.
33
+ */
34
+ export interface IGarbageCollectionSnapshotData {
35
+ /** The garbage collection state. It is a list of nodes in the container and their GC data. */
36
+ gcState: IGarbageCollectionState | undefined;
37
+ /** A list of nodes that have been tombstoned by GC. */
38
+ tombstones: string[] | undefined;
39
+ /** A list of nodes that have been deleted by GC. */
40
+ deletedNodes: string[] | undefined;
41
+ }
42
+
43
+ /**
44
+ * @deprecated - IGarbageCollectionState is written in the root of the summary now.
45
+ * Legacy GC details from when the GC details were written at the data store's summary tree.
46
+ */
47
+ export interface IGarbageCollectionSummaryDetailsLegacy {
48
+ /** A list of routes to Fluid objects that are used in this node. */
49
+ usedRoutes?: string[];
50
+ /** The GC data of this node. */
51
+ gcData?: IGarbageCollectionData;
52
+ /** If this node is unreferenced, the time when it was marked as such. */
53
+ unrefTimestamp?: number;
54
+ }