@fluidframework/container-runtime 1.4.0-115997 → 2.0.0-dev-rc.1.0.0.224419

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 (703) hide show
  1. package/.eslintrc.js +19 -29
  2. package/.mocharc.js +12 -0
  3. package/CHANGELOG.md +427 -0
  4. package/README.md +69 -0
  5. package/api-extractor-lint.json +4 -0
  6. package/api-extractor.json +2 -2
  7. package/api-report/container-runtime.api.md +863 -0
  8. package/dist/{batchTracker.js → batchTracker.cjs} +9 -8
  9. package/dist/batchTracker.cjs.map +1 -0
  10. package/dist/batchTracker.d.ts +6 -6
  11. package/dist/batchTracker.d.ts.map +1 -1
  12. package/dist/blobManager.cjs +704 -0
  13. package/dist/blobManager.cjs.map +1 -0
  14. package/dist/blobManager.d.ts +135 -39
  15. package/dist/blobManager.d.ts.map +1 -1
  16. package/dist/connectionTelemetry.cjs +230 -0
  17. package/dist/connectionTelemetry.cjs.map +1 -0
  18. package/dist/connectionTelemetry.d.ts +2 -2
  19. package/dist/connectionTelemetry.d.ts.map +1 -1
  20. package/dist/container-runtime-alpha.d.ts +1677 -0
  21. package/dist/container-runtime-beta.d.ts +250 -0
  22. package/dist/container-runtime-public.d.ts +250 -0
  23. package/dist/container-runtime-untrimmed.d.ts +1792 -0
  24. package/dist/{containerHandleContext.js → containerHandleContext.cjs} +4 -2
  25. package/dist/containerHandleContext.cjs.map +1 -0
  26. package/dist/containerHandleContext.d.ts.map +1 -1
  27. package/dist/containerRuntime.cjs +2531 -0
  28. package/dist/containerRuntime.cjs.map +1 -0
  29. package/dist/containerRuntime.d.ts +454 -257
  30. package/dist/containerRuntime.d.ts.map +1 -1
  31. package/dist/{dataStore.js → dataStore.cjs} +54 -45
  32. package/dist/dataStore.cjs.map +1 -0
  33. package/dist/dataStore.d.ts +2 -2
  34. package/dist/dataStore.d.ts.map +1 -1
  35. package/dist/{dataStoreContext.js → dataStoreContext.cjs} +343 -247
  36. package/dist/dataStoreContext.cjs.map +1 -0
  37. package/dist/dataStoreContext.d.ts +73 -41
  38. package/dist/dataStoreContext.d.ts.map +1 -1
  39. package/dist/{dataStoreContexts.js → dataStoreContexts.cjs} +19 -15
  40. package/dist/dataStoreContexts.cjs.map +1 -0
  41. package/dist/dataStoreContexts.d.ts +1 -1
  42. package/dist/dataStoreContexts.d.ts.map +1 -1
  43. package/dist/{dataStoreRegistry.js → dataStoreRegistry.cjs} +9 -4
  44. package/dist/dataStoreRegistry.cjs.map +1 -0
  45. package/dist/dataStoreRegistry.d.ts +3 -0
  46. package/dist/dataStoreRegistry.d.ts.map +1 -1
  47. package/dist/{dataStores.js → dataStores.cjs} +273 -124
  48. package/dist/dataStores.cjs.map +1 -0
  49. package/dist/dataStores.d.ts +53 -23
  50. package/dist/dataStores.d.ts.map +1 -1
  51. package/dist/deltaManagerProxyBase.cjs +77 -0
  52. package/dist/deltaManagerProxyBase.cjs.map +1 -0
  53. package/dist/deltaManagerProxyBase.d.ts +35 -0
  54. package/dist/deltaManagerProxyBase.d.ts.map +1 -0
  55. package/dist/deltaManagerSummarizerProxy.cjs +42 -0
  56. package/dist/deltaManagerSummarizerProxy.cjs.map +1 -0
  57. package/dist/deltaManagerSummarizerProxy.d.ts +19 -0
  58. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -0
  59. package/dist/{deltaScheduler.js → deltaScheduler.cjs} +25 -18
  60. package/dist/deltaScheduler.cjs.map +1 -0
  61. package/dist/deltaScheduler.d.ts +8 -6
  62. package/dist/deltaScheduler.d.ts.map +1 -1
  63. package/dist/error.cjs +21 -0
  64. package/dist/error.cjs.map +1 -0
  65. package/dist/error.d.ts +14 -0
  66. package/dist/error.d.ts.map +1 -0
  67. package/dist/gc/garbageCollection.cjs +861 -0
  68. package/dist/gc/garbageCollection.cjs.map +1 -0
  69. package/dist/gc/garbageCollection.d.ts +224 -0
  70. package/dist/gc/garbageCollection.d.ts.map +1 -0
  71. package/dist/gc/gcConfigs.cjs +153 -0
  72. package/dist/gc/gcConfigs.cjs.map +1 -0
  73. package/dist/gc/gcConfigs.d.ts +23 -0
  74. package/dist/gc/gcConfigs.d.ts.map +1 -0
  75. package/dist/gc/gcDefinitions.cjs +96 -0
  76. package/dist/gc/gcDefinitions.cjs.map +1 -0
  77. package/dist/gc/gcDefinitions.d.ts +437 -0
  78. package/dist/gc/gcDefinitions.d.ts.map +1 -0
  79. package/dist/gc/gcHelpers.cjs +235 -0
  80. package/dist/gc/gcHelpers.cjs.map +1 -0
  81. package/dist/gc/gcHelpers.d.ts +71 -0
  82. package/dist/gc/gcHelpers.d.ts.map +1 -0
  83. package/dist/gc/gcReferenceGraphAlgorithm.cjs +49 -0
  84. package/dist/gc/gcReferenceGraphAlgorithm.cjs.map +1 -0
  85. package/dist/gc/gcReferenceGraphAlgorithm.d.ts +16 -0
  86. package/dist/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -0
  87. package/dist/{summarizerTypes.js → gc/gcSummaryDefinitions.cjs} +1 -6
  88. package/dist/gc/gcSummaryDefinitions.cjs.map +1 -0
  89. package/dist/gc/gcSummaryDefinitions.d.ts +52 -0
  90. package/dist/gc/gcSummaryDefinitions.d.ts.map +1 -0
  91. package/dist/gc/gcSummaryStateTracker.cjs +213 -0
  92. package/dist/gc/gcSummaryStateTracker.cjs.map +1 -0
  93. package/dist/gc/gcSummaryStateTracker.d.ts +94 -0
  94. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -0
  95. package/dist/gc/gcTelemetry.cjs +298 -0
  96. package/dist/gc/gcTelemetry.cjs.map +1 -0
  97. package/dist/gc/gcTelemetry.d.ts +92 -0
  98. package/dist/gc/gcTelemetry.d.ts.map +1 -0
  99. package/dist/gc/gcUnreferencedStateTracker.cjs +118 -0
  100. package/dist/gc/gcUnreferencedStateTracker.cjs.map +1 -0
  101. package/dist/gc/gcUnreferencedStateTracker.d.ts +40 -0
  102. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
  103. package/dist/gc/index.cjs +44 -0
  104. package/dist/gc/index.cjs.map +1 -0
  105. package/dist/gc/index.d.ts +13 -0
  106. package/dist/gc/index.d.ts.map +1 -0
  107. package/dist/index.cjs +47 -0
  108. package/dist/index.cjs.map +1 -0
  109. package/dist/index.d.ts +19 -8
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/messageTypes.cjs +37 -0
  112. package/dist/messageTypes.cjs.map +1 -0
  113. package/dist/messageTypes.d.ts +142 -0
  114. package/dist/messageTypes.d.ts.map +1 -0
  115. package/dist/metadata.cjs +7 -0
  116. package/dist/metadata.cjs.map +1 -0
  117. package/dist/metadata.d.ts +24 -0
  118. package/dist/metadata.d.ts.map +1 -0
  119. package/dist/opLifecycle/batchManager.cjs +139 -0
  120. package/dist/opLifecycle/batchManager.cjs.map +1 -0
  121. package/dist/opLifecycle/batchManager.d.ts +48 -0
  122. package/dist/opLifecycle/batchManager.d.ts.map +1 -0
  123. package/dist/opLifecycle/definitions.cjs +7 -0
  124. package/dist/opLifecycle/definitions.cjs.map +1 -0
  125. package/dist/opLifecycle/definitions.d.ts +83 -0
  126. package/dist/opLifecycle/definitions.d.ts.map +1 -0
  127. package/dist/opLifecycle/index.cjs +26 -0
  128. package/dist/opLifecycle/index.cjs.map +1 -0
  129. package/dist/opLifecycle/index.d.ts +13 -0
  130. package/dist/opLifecycle/index.d.ts.map +1 -0
  131. package/dist/opLifecycle/opCompressor.cjs +84 -0
  132. package/dist/opLifecycle/opCompressor.cjs.map +1 -0
  133. package/dist/opLifecycle/opCompressor.d.ts +18 -0
  134. package/dist/opLifecycle/opCompressor.d.ts.map +1 -0
  135. package/dist/opLifecycle/opDecompressor.cjs +132 -0
  136. package/dist/opLifecycle/opDecompressor.cjs.map +1 -0
  137. package/dist/opLifecycle/opDecompressor.d.ts +25 -0
  138. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -0
  139. package/dist/opLifecycle/opGroupingManager.cjs +95 -0
  140. package/dist/opLifecycle/opGroupingManager.cjs.map +1 -0
  141. package/dist/opLifecycle/opGroupingManager.d.ts +22 -0
  142. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -0
  143. package/dist/opLifecycle/opSplitter.cjs +202 -0
  144. package/dist/opLifecycle/opSplitter.cjs.map +1 -0
  145. package/dist/opLifecycle/opSplitter.d.ts +61 -0
  146. package/dist/opLifecycle/opSplitter.d.ts.map +1 -0
  147. package/dist/opLifecycle/outbox.cjs +323 -0
  148. package/dist/opLifecycle/outbox.cjs.map +1 -0
  149. package/dist/opLifecycle/outbox.d.ts +104 -0
  150. package/dist/opLifecycle/outbox.d.ts.map +1 -0
  151. package/dist/opLifecycle/remoteMessageProcessor.cjs +136 -0
  152. package/dist/opLifecycle/remoteMessageProcessor.cjs.map +1 -0
  153. package/dist/opLifecycle/remoteMessageProcessor.d.ts +47 -0
  154. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -0
  155. package/dist/opProperties.cjs +17 -0
  156. package/dist/opProperties.cjs.map +1 -0
  157. package/dist/opProperties.d.ts +7 -0
  158. package/dist/opProperties.d.ts.map +1 -0
  159. package/dist/{packageVersion.js → packageVersion.cjs} +2 -2
  160. package/dist/packageVersion.cjs.map +1 -0
  161. package/dist/packageVersion.d.ts +1 -1
  162. package/dist/packageVersion.d.ts.map +1 -1
  163. package/dist/pendingStateManager.cjs +282 -0
  164. package/dist/pendingStateManager.cjs.map +1 -0
  165. package/dist/pendingStateManager.d.ts +32 -69
  166. package/dist/pendingStateManager.d.ts.map +1 -1
  167. package/dist/scheduleManager.cjs +258 -0
  168. package/dist/scheduleManager.cjs.map +1 -0
  169. package/dist/scheduleManager.d.ts +31 -0
  170. package/dist/scheduleManager.d.ts.map +1 -0
  171. package/dist/storageServiceWithAttachBlobs.cjs +32 -0
  172. package/dist/storageServiceWithAttachBlobs.cjs.map +1 -0
  173. package/dist/storageServiceWithAttachBlobs.d.ts +17 -0
  174. package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -0
  175. package/dist/summary/index.cjs +51 -0
  176. package/dist/summary/index.cjs.map +1 -0
  177. package/dist/summary/index.d.ts +17 -0
  178. package/dist/summary/index.d.ts.map +1 -0
  179. package/dist/{orderedClientElection.js → summary/orderedClientElection.cjs} +100 -84
  180. package/dist/summary/orderedClientElection.cjs.map +1 -0
  181. package/{lib → dist/summary}/orderedClientElection.d.ts +41 -18
  182. package/dist/summary/orderedClientElection.d.ts.map +1 -0
  183. package/dist/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.cjs} +12 -10
  184. package/dist/summary/runWhileConnectedCoordinator.cjs.map +1 -0
  185. package/{lib → dist/summary}/runWhileConnectedCoordinator.d.ts +8 -2
  186. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
  187. package/dist/summary/runningSummarizer.cjs +679 -0
  188. package/dist/summary/runningSummarizer.cjs.map +1 -0
  189. package/dist/summary/runningSummarizer.d.ts +128 -0
  190. package/dist/summary/runningSummarizer.d.ts.map +1 -0
  191. package/dist/summary/summarizer.cjs +263 -0
  192. package/dist/summary/summarizer.cjs.map +1 -0
  193. package/dist/{summarizer.d.ts → summary/summarizer.d.ts} +18 -34
  194. package/dist/summary/summarizer.d.ts.map +1 -0
  195. package/dist/{summarizerClientElection.js → summary/summarizerClientElection.cjs} +15 -46
  196. package/dist/summary/summarizerClientElection.cjs.map +1 -0
  197. package/{lib → dist/summary}/summarizerClientElection.d.ts +4 -4
  198. package/dist/summary/summarizerClientElection.d.ts.map +1 -0
  199. package/dist/summary/summarizerHeuristics.cjs +156 -0
  200. package/dist/summary/summarizerHeuristics.cjs.map +1 -0
  201. package/{lib → dist/summary}/summarizerHeuristics.d.ts +28 -6
  202. package/dist/summary/summarizerHeuristics.d.ts.map +1 -0
  203. package/dist/summary/summarizerNode/index.cjs +12 -0
  204. package/dist/summary/summarizerNode/index.cjs.map +1 -0
  205. package/dist/summary/summarizerNode/index.d.ts +8 -0
  206. package/dist/summary/summarizerNode/index.d.ts.map +1 -0
  207. package/dist/summary/summarizerNode/summarizerNode.cjs +526 -0
  208. package/dist/summary/summarizerNode/summarizerNode.cjs.map +1 -0
  209. package/dist/summary/summarizerNode/summarizerNode.d.ts +167 -0
  210. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -0
  211. package/dist/summary/summarizerNode/summarizerNodeUtils.cjs +130 -0
  212. package/dist/summary/summarizerNode/summarizerNodeUtils.cjs.map +1 -0
  213. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +121 -0
  214. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -0
  215. package/dist/summary/summarizerNode/summarizerNodeWithGc.cjs +375 -0
  216. package/dist/summary/summarizerNode/summarizerNodeWithGc.cjs.map +1 -0
  217. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +153 -0
  218. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
  219. package/dist/summary/summarizerTypes.cjs +7 -0
  220. package/dist/summary/summarizerTypes.cjs.map +1 -0
  221. package/{lib → dist/summary}/summarizerTypes.d.ts +233 -83
  222. package/dist/summary/summarizerTypes.d.ts.map +1 -0
  223. package/dist/{summaryCollection.js → summary/summaryCollection.cjs} +80 -49
  224. package/dist/summary/summaryCollection.cjs.map +1 -0
  225. package/dist/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +23 -5
  226. package/dist/summary/summaryCollection.d.ts.map +1 -0
  227. package/dist/{summaryFormat.js → summary/summaryFormat.cjs} +29 -26
  228. package/dist/summary/summaryFormat.cjs.map +1 -0
  229. package/{lib → dist/summary}/summaryFormat.d.ts +25 -30
  230. package/dist/summary/summaryFormat.d.ts.map +1 -0
  231. package/dist/{summaryGenerator.js → summary/summaryGenerator.cjs} +162 -74
  232. package/dist/summary/summaryGenerator.cjs.map +1 -0
  233. package/dist/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +53 -11
  234. package/dist/summary/summaryGenerator.d.ts.map +1 -0
  235. package/dist/{summaryManager.js → summary/summaryManager.cjs} +98 -55
  236. package/dist/summary/summaryManager.cjs.map +1 -0
  237. package/{lib → dist/summary}/summaryManager.d.ts +13 -11
  238. package/dist/summary/summaryManager.d.ts.map +1 -0
  239. package/dist/{throttler.js → throttler.cjs} +21 -21
  240. package/dist/throttler.cjs.map +1 -0
  241. package/dist/throttler.d.ts +2 -2
  242. package/dist/throttler.d.ts.map +1 -1
  243. package/dist/tsdoc-metadata.json +11 -0
  244. package/lib/{batchTracker.d.ts → batchTracker.d.mts} +6 -6
  245. package/lib/batchTracker.d.mts.map +1 -0
  246. package/lib/{batchTracker.js → batchTracker.mjs} +9 -8
  247. package/lib/batchTracker.mjs.map +1 -0
  248. package/lib/blobManager.d.mts +191 -0
  249. package/lib/blobManager.d.mts.map +1 -0
  250. package/lib/blobManager.mjs +699 -0
  251. package/lib/blobManager.mjs.map +1 -0
  252. package/lib/{connectionTelemetry.d.ts → connectionTelemetry.d.mts} +2 -2
  253. package/lib/connectionTelemetry.d.mts.map +1 -0
  254. package/lib/connectionTelemetry.mjs +226 -0
  255. package/lib/connectionTelemetry.mjs.map +1 -0
  256. package/lib/container-runtime-alpha.d.mts +1677 -0
  257. package/lib/container-runtime-beta.d.mts +250 -0
  258. package/lib/container-runtime-public.d.mts +250 -0
  259. package/lib/container-runtime-untrimmed.d.mts +1792 -0
  260. package/lib/{containerHandleContext.d.ts → containerHandleContext.d.mts} +1 -1
  261. package/lib/containerHandleContext.d.mts.map +1 -0
  262. package/lib/{containerHandleContext.js → containerHandleContext.mjs} +4 -2
  263. package/lib/containerHandleContext.mjs.map +1 -0
  264. package/lib/containerRuntime.d.mts +809 -0
  265. package/lib/containerRuntime.d.mts.map +1 -0
  266. package/lib/containerRuntime.mjs +2526 -0
  267. package/lib/containerRuntime.mjs.map +1 -0
  268. package/lib/{dataStore.d.ts → dataStore.d.mts} +4 -4
  269. package/lib/dataStore.d.mts.map +1 -0
  270. package/lib/{dataStore.js → dataStore.mjs} +52 -43
  271. package/lib/dataStore.mjs.map +1 -0
  272. package/lib/{dataStoreContext.d.ts → dataStoreContext.d.mts} +74 -42
  273. package/lib/dataStoreContext.d.mts.map +1 -0
  274. package/lib/{dataStoreContext.js → dataStoreContext.mjs} +309 -213
  275. package/lib/dataStoreContext.mjs.map +1 -0
  276. package/lib/{dataStoreContexts.d.ts → dataStoreContexts.d.mts} +2 -2
  277. package/lib/dataStoreContexts.d.mts.map +1 -0
  278. package/lib/{dataStoreContexts.js → dataStoreContexts.mjs} +12 -8
  279. package/lib/dataStoreContexts.mjs.map +1 -0
  280. package/lib/{dataStoreRegistry.d.ts → dataStoreRegistry.d.mts} +3 -0
  281. package/lib/dataStoreRegistry.d.mts.map +1 -0
  282. package/lib/{dataStoreRegistry.js → dataStoreRegistry.mjs} +7 -6
  283. package/lib/dataStoreRegistry.mjs.map +1 -0
  284. package/lib/{dataStores.d.ts → dataStores.d.mts} +56 -26
  285. package/lib/dataStores.d.mts.map +1 -0
  286. package/lib/{dataStores.js → dataStores.mjs} +254 -105
  287. package/lib/dataStores.mjs.map +1 -0
  288. package/lib/deltaManagerProxyBase.d.mts +35 -0
  289. package/lib/deltaManagerProxyBase.d.mts.map +1 -0
  290. package/lib/deltaManagerProxyBase.mjs +73 -0
  291. package/lib/deltaManagerProxyBase.mjs.map +1 -0
  292. package/lib/deltaManagerSummarizerProxy.d.mts +19 -0
  293. package/lib/deltaManagerSummarizerProxy.d.mts.map +1 -0
  294. package/lib/deltaManagerSummarizerProxy.mjs +38 -0
  295. package/lib/deltaManagerSummarizerProxy.mjs.map +1 -0
  296. package/lib/{deltaScheduler.d.ts → deltaScheduler.d.mts} +8 -6
  297. package/lib/deltaScheduler.d.mts.map +1 -0
  298. package/lib/{deltaScheduler.js → deltaScheduler.mjs} +22 -15
  299. package/lib/deltaScheduler.mjs.map +1 -0
  300. package/lib/error.d.mts +14 -0
  301. package/lib/error.d.mts.map +1 -0
  302. package/lib/error.mjs +17 -0
  303. package/lib/error.mjs.map +1 -0
  304. package/lib/gc/garbageCollection.d.mts +224 -0
  305. package/lib/gc/garbageCollection.d.mts.map +1 -0
  306. package/lib/gc/garbageCollection.mjs +857 -0
  307. package/lib/gc/garbageCollection.mjs.map +1 -0
  308. package/lib/gc/gcConfigs.d.mts +23 -0
  309. package/lib/gc/gcConfigs.d.mts.map +1 -0
  310. package/lib/gc/gcConfigs.mjs +149 -0
  311. package/lib/gc/gcConfigs.mjs.map +1 -0
  312. package/lib/gc/gcDefinitions.d.mts +437 -0
  313. package/lib/gc/gcDefinitions.d.mts.map +1 -0
  314. package/lib/gc/gcDefinitions.mjs +93 -0
  315. package/lib/gc/gcDefinitions.mjs.map +1 -0
  316. package/lib/gc/gcHelpers.d.mts +71 -0
  317. package/lib/gc/gcHelpers.d.mts.map +1 -0
  318. package/lib/gc/gcHelpers.mjs +222 -0
  319. package/lib/gc/gcHelpers.mjs.map +1 -0
  320. package/lib/gc/gcReferenceGraphAlgorithm.d.mts +16 -0
  321. package/lib/gc/gcReferenceGraphAlgorithm.d.mts.map +1 -0
  322. package/lib/gc/gcReferenceGraphAlgorithm.mjs +45 -0
  323. package/lib/gc/gcReferenceGraphAlgorithm.mjs.map +1 -0
  324. package/lib/gc/gcSummaryDefinitions.d.mts +52 -0
  325. package/lib/gc/gcSummaryDefinitions.d.mts.map +1 -0
  326. package/lib/gc/gcSummaryDefinitions.mjs +6 -0
  327. package/lib/gc/gcSummaryDefinitions.mjs.map +1 -0
  328. package/lib/gc/gcSummaryStateTracker.d.mts +94 -0
  329. package/lib/gc/gcSummaryStateTracker.d.mts.map +1 -0
  330. package/lib/gc/gcSummaryStateTracker.mjs +209 -0
  331. package/lib/gc/gcSummaryStateTracker.mjs.map +1 -0
  332. package/lib/gc/gcTelemetry.d.mts +92 -0
  333. package/lib/gc/gcTelemetry.d.mts.map +1 -0
  334. package/lib/gc/gcTelemetry.mjs +293 -0
  335. package/lib/gc/gcTelemetry.mjs.map +1 -0
  336. package/lib/gc/gcUnreferencedStateTracker.d.mts +40 -0
  337. package/lib/gc/gcUnreferencedStateTracker.d.mts.map +1 -0
  338. package/lib/gc/gcUnreferencedStateTracker.mjs +114 -0
  339. package/lib/gc/gcUnreferencedStateTracker.mjs.map +1 -0
  340. package/lib/gc/index.d.mts +13 -0
  341. package/lib/gc/index.d.mts.map +1 -0
  342. package/lib/gc/index.mjs +12 -0
  343. package/lib/gc/index.mjs.map +1 -0
  344. package/lib/index.d.mts +25 -0
  345. package/lib/index.d.mts.map +1 -0
  346. package/lib/index.mjs +24 -0
  347. package/lib/index.mjs.map +1 -0
  348. package/lib/messageTypes.d.mts +142 -0
  349. package/lib/messageTypes.d.mts.map +1 -0
  350. package/lib/messageTypes.mjs +34 -0
  351. package/lib/messageTypes.mjs.map +1 -0
  352. package/lib/metadata.d.mts +24 -0
  353. package/lib/metadata.d.mts.map +1 -0
  354. package/lib/metadata.mjs +6 -0
  355. package/lib/metadata.mjs.map +1 -0
  356. package/lib/opLifecycle/batchManager.d.mts +48 -0
  357. package/lib/opLifecycle/batchManager.d.mts.map +1 -0
  358. package/lib/opLifecycle/batchManager.mjs +133 -0
  359. package/lib/opLifecycle/batchManager.mjs.map +1 -0
  360. package/lib/opLifecycle/definitions.d.mts +83 -0
  361. package/lib/opLifecycle/definitions.d.mts.map +1 -0
  362. package/lib/opLifecycle/definitions.mjs +6 -0
  363. package/lib/opLifecycle/definitions.mjs.map +1 -0
  364. package/lib/opLifecycle/index.d.mts +13 -0
  365. package/lib/opLifecycle/index.d.mts.map +1 -0
  366. package/lib/opLifecycle/index.mjs +12 -0
  367. package/lib/opLifecycle/index.mjs.map +1 -0
  368. package/lib/opLifecycle/opCompressor.d.mts +18 -0
  369. package/lib/opLifecycle/opCompressor.d.mts.map +1 -0
  370. package/lib/opLifecycle/opCompressor.mjs +80 -0
  371. package/lib/opLifecycle/opCompressor.mjs.map +1 -0
  372. package/lib/opLifecycle/opDecompressor.d.mts +25 -0
  373. package/lib/opLifecycle/opDecompressor.d.mts.map +1 -0
  374. package/lib/opLifecycle/opDecompressor.mjs +128 -0
  375. package/lib/opLifecycle/opDecompressor.mjs.map +1 -0
  376. package/lib/opLifecycle/opGroupingManager.d.mts +22 -0
  377. package/lib/opLifecycle/opGroupingManager.d.mts.map +1 -0
  378. package/lib/opLifecycle/opGroupingManager.mjs +91 -0
  379. package/lib/opLifecycle/opGroupingManager.mjs.map +1 -0
  380. package/lib/opLifecycle/opSplitter.d.mts +61 -0
  381. package/lib/opLifecycle/opSplitter.d.mts.map +1 -0
  382. package/lib/opLifecycle/opSplitter.mjs +197 -0
  383. package/lib/opLifecycle/opSplitter.mjs.map +1 -0
  384. package/lib/opLifecycle/outbox.d.mts +104 -0
  385. package/lib/opLifecycle/outbox.d.mts.map +1 -0
  386. package/lib/opLifecycle/outbox.mjs +318 -0
  387. package/lib/opLifecycle/outbox.mjs.map +1 -0
  388. package/lib/opLifecycle/remoteMessageProcessor.d.mts +47 -0
  389. package/lib/opLifecycle/remoteMessageProcessor.d.mts.map +1 -0
  390. package/lib/opLifecycle/remoteMessageProcessor.mjs +131 -0
  391. package/lib/opLifecycle/remoteMessageProcessor.mjs.map +1 -0
  392. package/lib/opProperties.d.mts +7 -0
  393. package/lib/opProperties.d.mts.map +1 -0
  394. package/lib/opProperties.mjs +13 -0
  395. package/lib/opProperties.mjs.map +1 -0
  396. package/lib/{packageVersion.d.ts → packageVersion.d.mts} +1 -1
  397. package/lib/{packageVersion.d.ts.map → packageVersion.d.mts.map} +1 -1
  398. package/lib/{packageVersion.js → packageVersion.mjs} +2 -2
  399. package/lib/packageVersion.mjs.map +1 -0
  400. package/lib/{pendingStateManager.d.ts → pendingStateManager.d.mts} +32 -69
  401. package/lib/pendingStateManager.d.mts.map +1 -0
  402. package/lib/pendingStateManager.mjs +275 -0
  403. package/lib/pendingStateManager.mjs.map +1 -0
  404. package/lib/scheduleManager.d.mts +27 -0
  405. package/lib/scheduleManager.d.mts.map +1 -0
  406. package/lib/scheduleManager.mjs +254 -0
  407. package/lib/scheduleManager.mjs.map +1 -0
  408. package/lib/storageServiceWithAttachBlobs.d.mts +17 -0
  409. package/lib/storageServiceWithAttachBlobs.d.mts.map +1 -0
  410. package/lib/storageServiceWithAttachBlobs.mjs +28 -0
  411. package/lib/storageServiceWithAttachBlobs.mjs.map +1 -0
  412. package/lib/summary/index.d.mts +17 -0
  413. package/lib/summary/index.d.mts.map +1 -0
  414. package/lib/summary/index.mjs +16 -0
  415. package/lib/summary/index.mjs.map +1 -0
  416. package/{dist/orderedClientElection.d.ts → lib/summary/orderedClientElection.d.mts} +41 -22
  417. package/lib/summary/orderedClientElection.d.mts.map +1 -0
  418. package/lib/{orderedClientElection.js → summary/orderedClientElection.mjs} +95 -79
  419. package/lib/summary/orderedClientElection.mjs.map +1 -0
  420. package/{dist/runWhileConnectedCoordinator.d.ts → lib/summary/runWhileConnectedCoordinator.d.mts} +9 -3
  421. package/lib/summary/runWhileConnectedCoordinator.d.mts.map +1 -0
  422. package/lib/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.mjs} +12 -10
  423. package/lib/summary/runWhileConnectedCoordinator.mjs.map +1 -0
  424. package/lib/summary/runningSummarizer.d.mts +128 -0
  425. package/lib/summary/runningSummarizer.d.mts.map +1 -0
  426. package/lib/summary/runningSummarizer.mjs +675 -0
  427. package/lib/summary/runningSummarizer.mjs.map +1 -0
  428. package/lib/{summarizer.d.ts → summary/summarizer.d.mts} +20 -36
  429. package/lib/summary/summarizer.d.mts.map +1 -0
  430. package/lib/summary/summarizer.mjs +257 -0
  431. package/lib/summary/summarizer.mjs.map +1 -0
  432. package/{dist/summarizerClientElection.d.ts → lib/summary/summarizerClientElection.d.mts} +6 -6
  433. package/lib/summary/summarizerClientElection.d.mts.map +1 -0
  434. package/lib/{summarizerClientElection.js → summary/summarizerClientElection.mjs} +14 -45
  435. package/lib/summary/summarizerClientElection.mjs.map +1 -0
  436. package/{dist/summarizerHeuristics.d.ts → lib/summary/summarizerHeuristics.d.mts} +29 -7
  437. package/lib/summary/summarizerHeuristics.d.mts.map +1 -0
  438. package/lib/summary/summarizerHeuristics.mjs +151 -0
  439. package/lib/summary/summarizerHeuristics.mjs.map +1 -0
  440. package/lib/summary/summarizerNode/index.d.mts +8 -0
  441. package/lib/summary/summarizerNode/index.d.mts.map +1 -0
  442. package/lib/summary/summarizerNode/index.mjs +7 -0
  443. package/lib/summary/summarizerNode/index.mjs.map +1 -0
  444. package/lib/summary/summarizerNode/summarizerNode.d.mts +167 -0
  445. package/lib/summary/summarizerNode/summarizerNode.d.mts.map +1 -0
  446. package/lib/summary/summarizerNode/summarizerNode.mjs +521 -0
  447. package/lib/summary/summarizerNode/summarizerNode.mjs.map +1 -0
  448. package/lib/summary/summarizerNode/summarizerNodeUtils.d.mts +121 -0
  449. package/lib/summary/summarizerNode/summarizerNodeUtils.d.mts.map +1 -0
  450. package/lib/summary/summarizerNode/summarizerNodeUtils.mjs +123 -0
  451. package/lib/summary/summarizerNode/summarizerNodeUtils.mjs.map +1 -0
  452. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.mts +153 -0
  453. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.mts.map +1 -0
  454. package/lib/summary/summarizerNode/summarizerNodeWithGc.mjs +370 -0
  455. package/lib/summary/summarizerNode/summarizerNodeWithGc.mjs.map +1 -0
  456. package/{dist/summarizerTypes.d.ts → lib/summary/summarizerTypes.d.mts} +234 -84
  457. package/lib/summary/summarizerTypes.d.mts.map +1 -0
  458. package/lib/summary/summarizerTypes.mjs +6 -0
  459. package/lib/summary/summarizerTypes.mjs.map +1 -0
  460. package/lib/{summaryCollection.d.ts → summary/summaryCollection.d.mts} +23 -5
  461. package/lib/summary/summaryCollection.d.mts.map +1 -0
  462. package/lib/{summaryCollection.js → summary/summaryCollection.mjs} +76 -45
  463. package/lib/summary/summaryCollection.mjs.map +1 -0
  464. package/{dist/summaryFormat.d.ts → lib/summary/summaryFormat.d.mts} +25 -30
  465. package/lib/summary/summaryFormat.d.mts.map +1 -0
  466. package/lib/{summaryFormat.js → summary/summaryFormat.mjs} +30 -26
  467. package/lib/summary/summaryFormat.mjs.map +1 -0
  468. package/lib/summary/summaryGenerator.d.mts +127 -0
  469. package/lib/summary/summaryGenerator.d.mts.map +1 -0
  470. package/lib/{summaryGenerator.js → summary/summaryGenerator.mjs} +153 -67
  471. package/lib/summary/summaryGenerator.mjs.map +1 -0
  472. package/{dist/summaryManager.d.ts → lib/summary/summaryManager.d.mts} +15 -13
  473. package/lib/summary/summaryManager.d.mts.map +1 -0
  474. package/lib/{summaryManager.js → summary/summaryManager.mjs} +94 -51
  475. package/lib/summary/summaryManager.mjs.map +1 -0
  476. package/lib/{throttler.d.ts → throttler.d.mts} +2 -2
  477. package/lib/throttler.d.mts.map +1 -0
  478. package/lib/{throttler.js → throttler.mjs} +21 -21
  479. package/lib/throttler.mjs.map +1 -0
  480. package/package.json +174 -73
  481. package/prettier.config.cjs +8 -0
  482. package/src/batchTracker.ts +60 -55
  483. package/src/blobManager.ts +937 -294
  484. package/src/connectionTelemetry.ts +342 -252
  485. package/src/containerHandleContext.ts +27 -29
  486. package/src/containerRuntime.ts +3879 -3143
  487. package/src/dataStore.ts +170 -140
  488. package/src/dataStoreContext.ts +1166 -986
  489. package/src/dataStoreContexts.ts +176 -163
  490. package/src/dataStoreRegistry.ts +29 -21
  491. package/src/dataStores.ts +921 -678
  492. package/src/deltaManagerProxyBase.ts +111 -0
  493. package/src/deltaManagerSummarizerProxy.ts +49 -0
  494. package/src/deltaScheduler.ts +161 -156
  495. package/src/error.ts +21 -0
  496. package/src/gc/garbageCollection.md +106 -0
  497. package/src/gc/garbageCollection.ts +1153 -0
  498. package/src/gc/gcConfigs.ts +216 -0
  499. package/src/gc/gcDefinitions.ts +502 -0
  500. package/src/gc/gcHelpers.ts +284 -0
  501. package/src/gc/gcReferenceGraphAlgorithm.ts +52 -0
  502. package/src/gc/gcSummaryDefinitions.ts +54 -0
  503. package/src/gc/gcSummaryStateTracker.ts +299 -0
  504. package/src/gc/gcTelemetry.ts +423 -0
  505. package/src/gc/gcUnreferencedStateTracker.ts +153 -0
  506. package/src/gc/index.ts +59 -0
  507. package/src/index.ts +101 -74
  508. package/src/messageTypes.ts +238 -0
  509. package/src/metadata.ts +26 -0
  510. package/src/opLifecycle/README.md +321 -0
  511. package/src/opLifecycle/batchManager.ts +179 -0
  512. package/src/opLifecycle/definitions.ts +89 -0
  513. package/src/opLifecycle/index.ts +19 -0
  514. package/src/opLifecycle/opCompressor.ts +99 -0
  515. package/src/opLifecycle/opDecompressor.ts +190 -0
  516. package/src/opLifecycle/opGroupingManager.ts +133 -0
  517. package/src/opLifecycle/opSplitter.ts +279 -0
  518. package/src/opLifecycle/outbox.ts +471 -0
  519. package/src/opLifecycle/remoteMessageProcessor.ts +175 -0
  520. package/src/opProperties.ts +21 -0
  521. package/src/packageVersion.ts +1 -1
  522. package/src/pendingStateManager.ts +396 -465
  523. package/src/scheduleManager.ts +358 -0
  524. package/src/storageServiceWithAttachBlobs.ts +38 -0
  525. package/src/summary/index.ts +109 -0
  526. package/src/summary/orderedClientElection.ts +571 -0
  527. package/src/summary/runWhileConnectedCoordinator.ts +117 -0
  528. package/src/summary/runningSummarizer.ts +920 -0
  529. package/src/summary/summarizer.ts +352 -0
  530. package/src/summary/summarizerClientElection.ts +140 -0
  531. package/src/summary/summarizerHeuristics.ts +227 -0
  532. package/src/summary/summarizerNode/index.ts +12 -0
  533. package/src/summary/summarizerNode/summarizerNode.ts +725 -0
  534. package/src/summary/summarizerNode/summarizerNodeUtils.ts +206 -0
  535. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +571 -0
  536. package/src/summary/summarizerTypes.ts +631 -0
  537. package/src/summary/summaryCollection.ts +474 -0
  538. package/src/summary/summaryFormat.ts +249 -0
  539. package/src/summary/summaryGenerator.ts +539 -0
  540. package/src/summary/summaryManager.ts +452 -0
  541. package/src/throttler.ts +131 -122
  542. package/tsc-multi.test.json +4 -0
  543. package/tsconfig.json +11 -13
  544. package/dist/batchTracker.js.map +0 -1
  545. package/dist/blobManager.js +0 -249
  546. package/dist/blobManager.js.map +0 -1
  547. package/dist/connectionTelemetry.js +0 -178
  548. package/dist/connectionTelemetry.js.map +0 -1
  549. package/dist/containerHandleContext.js.map +0 -1
  550. package/dist/containerRuntime.js +0 -2174
  551. package/dist/containerRuntime.js.map +0 -1
  552. package/dist/dataStore.js.map +0 -1
  553. package/dist/dataStoreContext.js.map +0 -1
  554. package/dist/dataStoreContexts.js.map +0 -1
  555. package/dist/dataStoreRegistry.js.map +0 -1
  556. package/dist/dataStores.js.map +0 -1
  557. package/dist/deltaScheduler.js.map +0 -1
  558. package/dist/garbageCollection.d.ts +0 -319
  559. package/dist/garbageCollection.d.ts.map +0 -1
  560. package/dist/garbageCollection.js +0 -993
  561. package/dist/garbageCollection.js.map +0 -1
  562. package/dist/index.js +0 -33
  563. package/dist/index.js.map +0 -1
  564. package/dist/opTelemetry.d.ts +0 -22
  565. package/dist/opTelemetry.d.ts.map +0 -1
  566. package/dist/opTelemetry.js +0 -60
  567. package/dist/opTelemetry.js.map +0 -1
  568. package/dist/orderedClientElection.d.ts.map +0 -1
  569. package/dist/orderedClientElection.js.map +0 -1
  570. package/dist/packageVersion.js.map +0 -1
  571. package/dist/pendingStateManager.js +0 -346
  572. package/dist/pendingStateManager.js.map +0 -1
  573. package/dist/runWhileConnectedCoordinator.d.ts.map +0 -1
  574. package/dist/runWhileConnectedCoordinator.js.map +0 -1
  575. package/dist/runningSummarizer.d.ts +0 -93
  576. package/dist/runningSummarizer.d.ts.map +0 -1
  577. package/dist/runningSummarizer.js +0 -384
  578. package/dist/runningSummarizer.js.map +0 -1
  579. package/dist/serializedSnapshotStorage.d.ts +0 -58
  580. package/dist/serializedSnapshotStorage.d.ts.map +0 -1
  581. package/dist/serializedSnapshotStorage.js +0 -108
  582. package/dist/serializedSnapshotStorage.js.map +0 -1
  583. package/dist/summarizer.d.ts.map +0 -1
  584. package/dist/summarizer.js +0 -348
  585. package/dist/summarizer.js.map +0 -1
  586. package/dist/summarizerClientElection.d.ts.map +0 -1
  587. package/dist/summarizerClientElection.js.map +0 -1
  588. package/dist/summarizerHandle.d.ts +0 -12
  589. package/dist/summarizerHandle.d.ts.map +0 -1
  590. package/dist/summarizerHandle.js +0 -22
  591. package/dist/summarizerHandle.js.map +0 -1
  592. package/dist/summarizerHeuristics.d.ts.map +0 -1
  593. package/dist/summarizerHeuristics.js +0 -84
  594. package/dist/summarizerHeuristics.js.map +0 -1
  595. package/dist/summarizerTypes.d.ts.map +0 -1
  596. package/dist/summarizerTypes.js.map +0 -1
  597. package/dist/summaryCollection.d.ts.map +0 -1
  598. package/dist/summaryCollection.js.map +0 -1
  599. package/dist/summaryFormat.d.ts.map +0 -1
  600. package/dist/summaryFormat.js.map +0 -1
  601. package/dist/summaryGenerator.d.ts.map +0 -1
  602. package/dist/summaryGenerator.js.map +0 -1
  603. package/dist/summaryManager.d.ts.map +0 -1
  604. package/dist/summaryManager.js.map +0 -1
  605. package/dist/throttler.js.map +0 -1
  606. package/garbageCollection.md +0 -41
  607. package/lib/batchTracker.d.ts.map +0 -1
  608. package/lib/batchTracker.js.map +0 -1
  609. package/lib/blobManager.d.ts +0 -95
  610. package/lib/blobManager.d.ts.map +0 -1
  611. package/lib/blobManager.js +0 -244
  612. package/lib/blobManager.js.map +0 -1
  613. package/lib/connectionTelemetry.d.ts.map +0 -1
  614. package/lib/connectionTelemetry.js +0 -174
  615. package/lib/connectionTelemetry.js.map +0 -1
  616. package/lib/containerHandleContext.d.ts.map +0 -1
  617. package/lib/containerHandleContext.js.map +0 -1
  618. package/lib/containerRuntime.d.ts +0 -616
  619. package/lib/containerRuntime.d.ts.map +0 -1
  620. package/lib/containerRuntime.js +0 -2166
  621. package/lib/containerRuntime.js.map +0 -1
  622. package/lib/dataStore.d.ts.map +0 -1
  623. package/lib/dataStore.js.map +0 -1
  624. package/lib/dataStoreContext.d.ts.map +0 -1
  625. package/lib/dataStoreContext.js.map +0 -1
  626. package/lib/dataStoreContexts.d.ts.map +0 -1
  627. package/lib/dataStoreContexts.js.map +0 -1
  628. package/lib/dataStoreRegistry.d.ts.map +0 -1
  629. package/lib/dataStoreRegistry.js.map +0 -1
  630. package/lib/dataStores.d.ts.map +0 -1
  631. package/lib/dataStores.js.map +0 -1
  632. package/lib/deltaScheduler.d.ts.map +0 -1
  633. package/lib/deltaScheduler.js.map +0 -1
  634. package/lib/garbageCollection.d.ts +0 -319
  635. package/lib/garbageCollection.d.ts.map +0 -1
  636. package/lib/garbageCollection.js +0 -989
  637. package/lib/garbageCollection.js.map +0 -1
  638. package/lib/index.d.ts +0 -14
  639. package/lib/index.d.ts.map +0 -1
  640. package/lib/index.js +0 -13
  641. package/lib/index.js.map +0 -1
  642. package/lib/opTelemetry.d.ts +0 -22
  643. package/lib/opTelemetry.d.ts.map +0 -1
  644. package/lib/opTelemetry.js +0 -56
  645. package/lib/opTelemetry.js.map +0 -1
  646. package/lib/orderedClientElection.d.ts.map +0 -1
  647. package/lib/orderedClientElection.js.map +0 -1
  648. package/lib/packageVersion.js.map +0 -1
  649. package/lib/pendingStateManager.d.ts.map +0 -1
  650. package/lib/pendingStateManager.js +0 -339
  651. package/lib/pendingStateManager.js.map +0 -1
  652. package/lib/runWhileConnectedCoordinator.d.ts.map +0 -1
  653. package/lib/runWhileConnectedCoordinator.js.map +0 -1
  654. package/lib/runningSummarizer.d.ts +0 -93
  655. package/lib/runningSummarizer.d.ts.map +0 -1
  656. package/lib/runningSummarizer.js +0 -380
  657. package/lib/runningSummarizer.js.map +0 -1
  658. package/lib/serializedSnapshotStorage.d.ts +0 -58
  659. package/lib/serializedSnapshotStorage.d.ts.map +0 -1
  660. package/lib/serializedSnapshotStorage.js +0 -104
  661. package/lib/serializedSnapshotStorage.js.map +0 -1
  662. package/lib/summarizer.d.ts.map +0 -1
  663. package/lib/summarizer.js +0 -342
  664. package/lib/summarizer.js.map +0 -1
  665. package/lib/summarizerClientElection.d.ts.map +0 -1
  666. package/lib/summarizerClientElection.js.map +0 -1
  667. package/lib/summarizerHandle.d.ts +0 -12
  668. package/lib/summarizerHandle.d.ts.map +0 -1
  669. package/lib/summarizerHandle.js +0 -18
  670. package/lib/summarizerHandle.js.map +0 -1
  671. package/lib/summarizerHeuristics.d.ts.map +0 -1
  672. package/lib/summarizerHeuristics.js +0 -79
  673. package/lib/summarizerHeuristics.js.map +0 -1
  674. package/lib/summarizerTypes.d.ts.map +0 -1
  675. package/lib/summarizerTypes.js +0 -9
  676. package/lib/summarizerTypes.js.map +0 -1
  677. package/lib/summaryCollection.d.ts.map +0 -1
  678. package/lib/summaryCollection.js.map +0 -1
  679. package/lib/summaryFormat.d.ts.map +0 -1
  680. package/lib/summaryFormat.js.map +0 -1
  681. package/lib/summaryGenerator.d.ts +0 -85
  682. package/lib/summaryGenerator.d.ts.map +0 -1
  683. package/lib/summaryGenerator.js.map +0 -1
  684. package/lib/summaryManager.d.ts.map +0 -1
  685. package/lib/summaryManager.js.map +0 -1
  686. package/lib/throttler.d.ts.map +0 -1
  687. package/lib/throttler.js.map +0 -1
  688. package/src/garbageCollection.ts +0 -1434
  689. package/src/opTelemetry.ts +0 -71
  690. package/src/orderedClientElection.ts +0 -511
  691. package/src/runWhileConnectedCoordinator.ts +0 -106
  692. package/src/runningSummarizer.ts +0 -550
  693. package/src/serializedSnapshotStorage.ts +0 -146
  694. package/src/summarizer.ts +0 -438
  695. package/src/summarizerClientElection.ts +0 -161
  696. package/src/summarizerHandle.ts +0 -21
  697. package/src/summarizerHeuristics.ts +0 -108
  698. package/src/summarizerTypes.ts +0 -462
  699. package/src/summaryCollection.ts +0 -406
  700. package/src/summaryFormat.ts +0 -239
  701. package/src/summaryGenerator.ts +0 -427
  702. package/src/summaryManager.ts +0 -368
  703. package/tsconfig.esnext.json +0 -7
@@ -2,70 +2,31 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { BindState, AttachState, } from "@fluidframework/container-definitions";
6
- import { assert, Deferred, LazyPromise, TypedEventEmitter, } from "@fluidframework/common-utils";
7
- import { readAndParse } from "@fluidframework/driver-utils";
8
- import { BlobTreeEntry } from "@fluidframework/protocol-base";
9
- import { channelsTreeName, gcBlobKey, } from "@fluidframework/runtime-definitions";
5
+ import { AttachState, } from "@fluidframework/container-definitions";
6
+ import { TypedEventEmitter } from "@fluid-internal/client-utils";
7
+ import { assert, Deferred, LazyPromise } from "@fluidframework/core-utils";
8
+ import { BlobTreeEntry, readAndParse } from "@fluidframework/driver-utils";
9
+ import { channelsTreeName, VisibilityState, } from "@fluidframework/runtime-definitions";
10
10
  import { addBlobToSummary, convertSummaryTreeToITree } from "@fluidframework/runtime-utils";
11
- import { ChildLogger, LoggingError, TelemetryDataTag, ThresholdCounter, } from "@fluidframework/telemetry-utils";
12
- import { DataProcessingError } from "@fluidframework/container-utils";
13
- import { dataStoreAttributesBlobName, hasIsolatedChannels, wrapSummaryInChannelsTree, getAttributesFormatVersion, getFluidDataStoreAttributes, } from "./summaryFormat";
14
- function createAttributes(pkg, isRootDataStore, disableIsolatedChannels) {
11
+ import { createChildMonitoringContext, DataCorruptionError, DataProcessingError, extractSafePropertiesFromMessage, generateStack, LoggingError, tagCodeArtifacts, ThresholdCounter, } from "@fluidframework/telemetry-utils";
12
+ import { dataStoreAttributesBlobName, hasIsolatedChannels, wrapSummaryInChannelsTree, getAttributesFormatVersion, getFluidDataStoreAttributes, summarizerClientType, } from "./summary/index.mjs";
13
+ import { sendGCUnexpectedUsageEvent } from "./gc/index.mjs";
14
+ function createAttributes(pkg, isRootDataStore) {
15
15
  const stringifiedPkg = JSON.stringify(pkg);
16
- return disableIsolatedChannels ? {
17
- pkg: stringifiedPkg,
18
- snapshotFormatVersion: "0.1",
19
- isRootDataStore,
20
- } : {
16
+ return {
21
17
  pkg: stringifiedPkg,
22
18
  summaryFormatVersion: 2,
23
19
  isRootDataStore,
24
20
  };
25
21
  }
26
- export function createAttributesBlob(pkg, isRootDataStore, disableIsolatedChannels) {
27
- const attributes = createAttributes(pkg, isRootDataStore, disableIsolatedChannels);
22
+ export function createAttributesBlob(pkg, isRootDataStore) {
23
+ const attributes = createAttributes(pkg, isRootDataStore);
28
24
  return new BlobTreeEntry(dataStoreAttributesBlobName, JSON.stringify(attributes));
29
25
  }
30
26
  /**
31
27
  * Represents the context for the store. This context is passed to the store runtime.
32
28
  */
33
29
  export class FluidDataStoreContext extends TypedEventEmitter {
34
- constructor(props, existing, bindState, isLocalDataStore, makeLocallyVisibleFn) {
35
- super();
36
- this.existing = existing;
37
- this.bindState = bindState;
38
- this.isLocalDataStore = isLocalDataStore;
39
- this.makeLocallyVisibleFn = makeLocallyVisibleFn;
40
- this._disposed = false;
41
- this.detachedRuntimeCreation = false;
42
- this.loaded = false;
43
- this.pending = [];
44
- this._isInMemoryRoot = false;
45
- this._containerRuntime = props.runtime;
46
- this.id = props.id;
47
- this.storage = props.storage;
48
- this.scope = props.scope;
49
- this.writeGCDataAtRoot = props.writeGCDataAtRoot;
50
- this.disableIsolatedChannels = props.disableIsolatedChannels;
51
- this.pkg = props.pkg;
52
- // URIs use slashes as delimiters. Handles use URIs.
53
- // Thus having slashes in types almost guarantees trouble down the road!
54
- assert(!this.id.includes("/"), 0x13a /* Data store ID contains slash */);
55
- this._attachState = this.containerRuntime.attachState !== AttachState.Detached && this.existing ?
56
- this.containerRuntime.attachState : AttachState.Detached;
57
- this.bindToContext = () => {
58
- assert(this.bindState === BindState.NotBound, 0x13b /* "datastore context is already in bound state" */);
59
- this.bindState = BindState.Binding;
60
- assert(this.channel !== undefined, 0x13c /* "undefined channel on datastore context" */);
61
- this.makeLocallyVisible();
62
- this.bindState = BindState.Bound;
63
- };
64
- const thisSummarizeInternal = async (fullTree, trackState, telemetryContext) => this.summarizeInternal(fullTree, trackState, telemetryContext);
65
- this.summarizerNode = props.createSummarizerNodeFn(thisSummarizeInternal, async (fullGC) => this.getGCDataInternal(fullGC), async () => this.getBaseGCDetails());
66
- this.subLogger = ChildLogger.create(this.logger, "FluidDataStoreContext");
67
- this.thresholdOpsCounter = new ThresholdCounter(FluidDataStoreContext.pendingOpsCountThreshold, this.subLogger);
68
- }
69
30
  get packagePath() {
70
31
  assert(this.pkg !== undefined, 0x139 /* "Undefined package path" */);
71
32
  return this.pkg;
@@ -94,13 +55,24 @@ export class FluidDataStoreContext extends TypedEventEmitter {
94
55
  get containerRuntime() {
95
56
  return this._containerRuntime;
96
57
  }
58
+ ensureNoDataModelChanges(callback) {
59
+ return this._containerRuntime.ensureNoDataModelChanges(callback);
60
+ }
97
61
  get isLoaded() {
98
62
  return this.loaded;
99
63
  }
100
64
  get baseSnapshot() {
101
65
  return this._baseSnapshot;
102
66
  }
103
- get disposed() { return this._disposed; }
67
+ get idCompressor() {
68
+ return this._containerRuntime.idCompressor;
69
+ }
70
+ get disposed() {
71
+ return this._disposed;
72
+ }
73
+ get tombstoned() {
74
+ return this._tombstoned;
75
+ }
104
76
  get attachState() {
105
77
  return this._attachState;
106
78
  }
@@ -126,6 +98,55 @@ export class FluidDataStoreContext extends TypedEventEmitter {
126
98
  isInMemoryRoot() {
127
99
  return this._isInMemoryRoot;
128
100
  }
101
+ constructor(props, existing, isLocalDataStore, makeLocallyVisibleFn) {
102
+ super();
103
+ this.existing = existing;
104
+ this.isLocalDataStore = isLocalDataStore;
105
+ this.makeLocallyVisibleFn = makeLocallyVisibleFn;
106
+ this._disposed = false;
107
+ /**
108
+ * Tombstone is a temporary feature that prevents a data store from sending / receiving ops, signals and from
109
+ * loading.
110
+ */
111
+ this._tombstoned = false;
112
+ /** If true, this means that this data store context and its children have been removed from the runtime */
113
+ this.deleted = false;
114
+ this.detachedRuntimeCreation = false;
115
+ this.loaded = false;
116
+ this.pending = [];
117
+ this._isInMemoryRoot = false;
118
+ this._containerRuntime = props.runtime;
119
+ this.id = props.id;
120
+ this.storage = props.storage;
121
+ this.scope = props.scope;
122
+ this.pkg = props.pkg;
123
+ // URIs use slashes as delimiters. Handles use URIs.
124
+ // Thus having slashes in types almost guarantees trouble down the road!
125
+ assert(!this.id.includes("/"), 0x13a /* Data store ID contains slash */);
126
+ this._attachState =
127
+ this.containerRuntime.attachState !== AttachState.Detached && this.existing
128
+ ? this.containerRuntime.attachState
129
+ : AttachState.Detached;
130
+ const thisSummarizeInternal = async (fullTree, trackState, telemetryContext) => this.summarizeInternal(fullTree, trackState, telemetryContext);
131
+ this.summarizerNode = props.createSummarizerNodeFn(thisSummarizeInternal, async (fullGC) => this.getGCDataInternal(fullGC));
132
+ this.mc = createChildMonitoringContext({
133
+ logger: this.logger,
134
+ namespace: "FluidDataStoreContext",
135
+ properties: {
136
+ all: tagCodeArtifacts({
137
+ fluidDataStoreId: this.id,
138
+ // The package name is a getter because `this.pkg` may not be initialized during construction.
139
+ // For data stores loaded from summary, it is initialized during data store realization.
140
+ fullPackageName: () => this.pkg?.join("/"),
141
+ }),
142
+ },
143
+ });
144
+ this.thresholdOpsCounter = new ThresholdCounter(FluidDataStoreContext.pendingOpsCountThreshold, this.mc.logger);
145
+ this.throwOnTombstoneUsage = this._containerRuntime.gcThrowOnTombstoneUsage;
146
+ // By default, a data store can log maximum 10 local changes telemetry in summarizer.
147
+ this.localChangesTelemetryCount =
148
+ this.mc.config.getNumber("Fluid.Telemetry.LocalChangesTelemetryCount") ?? 10;
149
+ }
129
150
  dispose() {
130
151
  if (this._disposed) {
131
152
  return;
@@ -134,24 +155,45 @@ export class FluidDataStoreContext extends TypedEventEmitter {
134
155
  // Dispose any pending runtime after it gets fulfilled
135
156
  // Errors are logged where this.channelDeferred is consumed/generated (realizeCore(), bindRuntime())
136
157
  if (this.channelDeferred) {
137
- this.channelDeferred.promise.then((runtime) => {
158
+ this.channelDeferred.promise
159
+ .then((runtime) => {
138
160
  runtime.dispose();
139
- }).catch((error) => { });
161
+ })
162
+ .catch((error) => { });
140
163
  }
141
164
  }
142
- rejectDeferredRealize(reason, packageName) {
143
- throw new LoggingError(reason, { packageName: { value: packageName, tag: TelemetryDataTag.PackageData } });
165
+ /**
166
+ * When delete is called, that means that the data store is permanently removed from the runtime, and will not show up in future summaries
167
+ * This function is called to prevent ops from being generated from this data store once it has been deleted. Furthermore, this data store
168
+ * should not receive any ops/signals.
169
+ */
170
+ delete() {
171
+ this.deleted = true;
172
+ }
173
+ setTombstone(tombstone) {
174
+ if (this.tombstoned === tombstone) {
175
+ return;
176
+ }
177
+ this._tombstoned = tombstone;
178
+ }
179
+ rejectDeferredRealize(reason, failedPkgPath, fullPackageName) {
180
+ throw new LoggingError(reason, tagCodeArtifacts({
181
+ failedPkgPath,
182
+ packagePath: fullPackageName?.join("/"),
183
+ }));
144
184
  }
145
185
  async realize() {
146
186
  assert(!this.detachedRuntimeCreation, 0x13d /* "Detached runtime creation on realize()" */);
147
187
  if (!this.channelDeferred) {
148
188
  this.channelDeferred = new Deferred();
149
189
  this.realizeCore(this.existing).catch((error) => {
150
- var _a;
151
190
  const errorWrapped = DataProcessingError.wrapIfUnrecognized(error, "realizeFluidDataStoreContext");
152
- errorWrapped.addTelemetryProperties({ fluidDataStoreId: { value: this.id, tag: "PackageData" } });
153
- (_a = this.channelDeferred) === null || _a === void 0 ? void 0 : _a.reject(errorWrapped);
154
- this.logger.sendErrorEvent({ eventName: "RealizeError" }, errorWrapped);
191
+ errorWrapped.addTelemetryProperties(tagCodeArtifacts({
192
+ fullPackageName: this.pkg?.join("/"),
193
+ fluidDataStoreId: this.id,
194
+ }));
195
+ this.channelDeferred?.reject(errorWrapped);
196
+ this.mc.logger.sendErrorEvent({ eventName: "RealizeError" }, errorWrapped);
155
197
  });
156
198
  }
157
199
  return this.channelDeferred.promise;
@@ -166,18 +208,18 @@ export class FluidDataStoreContext extends TypedEventEmitter {
166
208
  let lastPkg;
167
209
  for (const pkg of packages) {
168
210
  if (!registry) {
169
- this.rejectDeferredRealize("No registry for package", lastPkg);
211
+ this.rejectDeferredRealize("No registry for package", lastPkg, packages);
170
212
  }
171
213
  lastPkg = pkg;
172
214
  entry = await registry.get(pkg);
173
215
  if (!entry) {
174
- this.rejectDeferredRealize("Registry does not contain entry for the package", pkg);
216
+ this.rejectDeferredRealize("Registry does not contain entry for the package", pkg, packages);
175
217
  }
176
218
  registry = entry.IFluidDataStoreRegistry;
177
219
  }
178
- const factory = entry === null || entry === void 0 ? void 0 : entry.IFluidDataStoreFactory;
220
+ const factory = entry?.IFluidDataStoreFactory;
179
221
  if (factory === undefined) {
180
- this.rejectDeferredRealize("Can't find factory for package", lastPkg);
222
+ this.rejectDeferredRealize("Can't find factory for package", lastPkg, packages);
181
223
  }
182
224
  return { factory, registry };
183
225
  }
@@ -194,15 +236,21 @@ export class FluidDataStoreContext extends TypedEventEmitter {
194
236
  const channel = await factory.instantiateDataStore(this, existing);
195
237
  assert(channel !== undefined, 0x140 /* "undefined channel on datastore context" */);
196
238
  this.bindRuntime(channel);
239
+ // This data store may have been disposed before the channel is created during realization. If so,
240
+ // dispose the channel now.
241
+ if (this.disposed) {
242
+ channel.dispose();
243
+ }
197
244
  }
198
245
  /**
199
246
  * Notifies this object about changes in the connection state.
200
247
  * @param value - New connection state.
201
- * @param clientId - ID of the client. It's old ID when in disconnected state and
202
- * it's new client ID when we are connecting or connected.
248
+ * @param clientId - ID of the client. Its old ID when in disconnected state and
249
+ * its new client ID when we are connecting or connected.
203
250
  */
204
251
  setConnectionState(connected, clientId) {
205
- this.verifyNotClosed();
252
+ // ConnectionState should not fail in tombstone mode as this is internally run
253
+ this.verifyNotClosed("setConnectionState", false /* checkTombstone */);
206
254
  // Connection events are ignored if the store is not yet loaded
207
255
  if (!this.loaded) {
208
256
  return;
@@ -212,13 +260,22 @@ export class FluidDataStoreContext extends TypedEventEmitter {
212
260
  this.channel.setConnectionState(connected, clientId);
213
261
  }
214
262
  process(messageArg, local, localOpMetadata) {
215
- var _a;
216
- this.verifyNotClosed();
263
+ const safeTelemetryProps = extractSafePropertiesFromMessage(messageArg);
264
+ // On op process, tombstone error is logged in garbage collector. So, set "checkTombstone" to false when calling
265
+ // "verifyNotClosed" which logs tombstone errors. Throw error if tombstoned and throwing on load is configured.
266
+ this.verifyNotClosed("process", false /* checkTombstone */, safeTelemetryProps);
267
+ if (this.tombstoned && this.throwOnTombstoneUsage) {
268
+ throw new DataCorruptionError("Context is tombstoned! Call site [process]", safeTelemetryProps);
269
+ }
217
270
  const innerContents = messageArg.contents;
218
- const message = Object.assign(Object.assign({}, messageArg), { type: innerContents.type, contents: innerContents.content });
271
+ const message = {
272
+ ...messageArg,
273
+ type: innerContents.type,
274
+ contents: innerContents.content,
275
+ };
219
276
  this.summarizerNode.recordChange(message);
220
277
  if (this.loaded) {
221
- return (_a = this.channel) === null || _a === void 0 ? void 0 : _a.process(message, local, localOpMetadata);
278
+ return this.channel?.process(message, local, localOpMetadata);
222
279
  }
223
280
  else {
224
281
  assert(!local, 0x142 /* "local store channel is not loaded" */);
@@ -228,13 +285,12 @@ export class FluidDataStoreContext extends TypedEventEmitter {
228
285
  }
229
286
  }
230
287
  processSignal(message, local) {
231
- var _a;
232
- this.verifyNotClosed();
288
+ this.verifyNotClosed("processSignal");
233
289
  // Signals are ignored if the store is not yet loaded
234
290
  if (!this.loaded) {
235
291
  return;
236
292
  }
237
- (_a = this.channel) === null || _a === void 0 ? void 0 : _a.processSignal(message, local);
293
+ this.channel?.processSignal(message, local);
238
294
  }
239
295
  getQuorum() {
240
296
  return this._containerRuntime.getQuorum();
@@ -255,28 +311,25 @@ export class FluidDataStoreContext extends TypedEventEmitter {
255
311
  await this.realize();
256
312
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
257
313
  const summarizeResult = await this.channel.summarize(fullTree, trackState, telemetryContext);
258
- let pathPartsForChildren;
259
- if (!this.disableIsolatedChannels) {
260
- // Wrap dds summaries in .channels subtree.
261
- wrapSummaryInChannelsTree(summarizeResult);
262
- pathPartsForChildren = [channelsTreeName];
263
- }
314
+ // Wrap dds summaries in .channels subtree.
315
+ wrapSummaryInChannelsTree(summarizeResult);
316
+ const pathPartsForChildren = [channelsTreeName];
264
317
  // Add data store's attributes to the summary.
265
318
  const { pkg } = await this.getInitialSnapshotDetails();
266
319
  const isRoot = await this.isRoot();
267
- const attributes = createAttributes(pkg, isRoot, this.disableIsolatedChannels);
320
+ const attributes = createAttributes(pkg, isRoot);
268
321
  addBlobToSummary(summarizeResult, dataStoreAttributesBlobName, JSON.stringify(attributes));
269
- // Add GC data to the summary if it's not written at the root.
270
- if (!this.writeGCDataAtRoot) {
271
- addBlobToSummary(summarizeResult, gcBlobKey, JSON.stringify(this.summarizerNode.getGCSummaryDetails()));
272
- }
273
322
  // If we are not referenced, mark the summary tree as unreferenced. Also, update unreferenced blob
274
323
  // size in the summary stats with the blobs size of this data store.
275
324
  if (!this.summarizerNode.isReferenced()) {
276
325
  summarizeResult.summary.unreferenced = true;
277
326
  summarizeResult.stats.unreferencedBlobSize = summarizeResult.stats.totalBlobSize;
278
327
  }
279
- return Object.assign(Object.assign({}, summarizeResult), { id: this.id, pathPartsForChildren });
328
+ return {
329
+ ...summarizeResult,
330
+ id: this.id,
331
+ pathPartsForChildren,
332
+ };
280
333
  }
281
334
  /**
282
335
  * Returns the data used for garbage collection. This includes a list of GC nodes that represent this data store
@@ -301,27 +354,29 @@ export class FluidDataStoreContext extends TypedEventEmitter {
301
354
  }
302
355
  /**
303
356
  * After GC has run, called to notify the data store of routes used in it. These are used for the following:
357
+ *
304
358
  * 1. To identify if this data store is being referenced in the document or not.
359
+ *
305
360
  * 2. To determine if it needs to re-summarize in case used routes changed since last summary.
361
+ *
306
362
  * 3. These are added to the summary generated by the data store.
307
- * 4. To notify child contexts of their used routes. This is done immediately if the data store is loaded. Else,
308
- * it is done when realizing the data store.
363
+ *
364
+ * 4. To notify child contexts of their used routes. This is done immediately if the data store is loaded.
365
+ * Else, it is done when realizing the data store.
366
+ *
309
367
  * 5. To update the timestamp when this data store or any children are marked as unreferenced.
368
+ *
310
369
  * @param usedRoutes - The routes that are used in this data store.
311
- * @param gcTimestamp - The time when GC was run that generated these used routes. If any node becomes unreferenced
312
- * as part of this GC run, this should be used to update the time when it happens.
313
370
  */
314
- updateUsedRoutes(usedRoutes, gcTimestamp) {
371
+ updateUsedRoutes(usedRoutes) {
315
372
  // Update the used routes in this data store's summarizer node.
316
- this.summarizerNode.updateUsedRoutes(usedRoutes, gcTimestamp);
373
+ this.summarizerNode.updateUsedRoutes(usedRoutes);
317
374
  /**
318
- * If the data store has not been realized yet, we need this used state to update the used state of the channel
319
- * when it realizes. It's safe to keep only the last used state because if something changes because of this GC
320
- * run, the data store will be immediately realized as part of the summary that follows GC. For example, if a
321
- * child's reference state changes, the gcTimestamp has to be used to update its unreferencedTimestamp. Since
322
- * it will result in a change in this data store's used routes, it will be realized to regenerate its summary.
375
+ * Store the used routes to update the channel if the data store is not loaded yet. If the used routes changed
376
+ * since the previous run, the data store will be loaded during summarize since the used state changed. So, it's
377
+ * safe to only store the last used routes.
323
378
  */
324
- this.lastUsedState = { usedRoutes, gcTimestamp };
379
+ this.lastUsedRoutes = usedRoutes;
325
380
  // If we are loaded, call the channel so it can update the used routes of the child contexts.
326
381
  // If we are not loaded, we will update this when we are realized.
327
382
  if (this.loaded) {
@@ -346,13 +401,15 @@ export class FluidDataStoreContext extends TypedEventEmitter {
346
401
  updateChannelUsedRoutes() {
347
402
  assert(this.loaded, 0x144 /* "Channel should be loaded when updating used routes" */);
348
403
  assert(this.channel !== undefined, 0x145 /* "Channel should be present when data store is loaded" */);
349
- // If there is no lastUsedState, GC has not run up until this point.
350
- if (this.lastUsedState === undefined) {
404
+ // If there is no lastUsedRoutes, GC has not run up until this point.
405
+ if (this.lastUsedRoutes === undefined) {
351
406
  return;
352
407
  }
353
408
  // Remove the route to this data store, if it exists.
354
- const usedChannelRoutes = this.lastUsedState.usedRoutes.filter((id) => { return id !== "/" && id !== ""; });
355
- this.channel.updateUsedRoutes(usedChannelRoutes, this.lastUsedState.gcTimestamp);
409
+ const usedChannelRoutes = this.lastUsedRoutes.filter((id) => {
410
+ return id !== "/" && id !== "";
411
+ });
412
+ this.channel.updateUsedRoutes(usedChannelRoutes);
356
413
  }
357
414
  /**
358
415
  * @deprecated 0.18.Should call request on the runtime directly
@@ -362,12 +419,14 @@ export class FluidDataStoreContext extends TypedEventEmitter {
362
419
  return runtime.request(request);
363
420
  }
364
421
  submitMessage(type, content, localOpMetadata) {
365
- this.verifyNotClosed();
422
+ this.verifyNotClosed("submitMessage");
366
423
  assert(!!this.channel, 0x146 /* "Channel must exist when submitting message" */);
367
424
  const fluidDataStoreContent = {
368
425
  content,
369
426
  type,
370
427
  };
428
+ // Summarizer clients should not submit messages.
429
+ this.identifyLocalChangeInSummarizer("DataStoreMessageSubmittedInSummarizer", type);
371
430
  this._containerRuntime.submitDataStoreOp(this.id, fluidDataStoreContent, localOpMetadata);
372
431
  }
373
432
  /**
@@ -380,7 +439,7 @@ export class FluidDataStoreContext extends TypedEventEmitter {
380
439
  *
381
440
  */
382
441
  setChannelDirty(address) {
383
- this.verifyNotClosed();
442
+ this.verifyNotClosed("setChannelDirty");
384
443
  // Get the latest sequence number.
385
444
  const latestSequenceNumber = this.deltaManager.lastSequenceNumber;
386
445
  this.summarizerNode.invalidate(latestSequenceNumber);
@@ -389,10 +448,16 @@ export class FluidDataStoreContext extends TypedEventEmitter {
389
448
  channelSummarizerNode.invalidate(latestSequenceNumber); // TODO: lazy load problem?
390
449
  }
391
450
  }
392
- submitSignal(type, content) {
393
- this.verifyNotClosed();
451
+ /**
452
+ * Submits the signal to be sent to other clients.
453
+ * @param type - Type of the signal.
454
+ * @param content - Content of the signal.
455
+ * @param targetClientId - When specified, the signal is only sent to the provided client id.
456
+ */
457
+ submitSignal(type, content, targetClientId) {
458
+ this.verifyNotClosed("submitSignal");
394
459
  assert(!!this.channel, 0x147 /* "Channel must exist on submitting signal" */);
395
- return this._containerRuntime.submitDataStoreSignal(this.id, type, content);
460
+ return this._containerRuntime.submitDataStoreSignal(this.id, type, content, targetClientId);
396
461
  }
397
462
  /**
398
463
  * This is called by the data store channel when it becomes locally visible indicating that it is ready to become
@@ -400,10 +465,10 @@ export class FluidDataStoreContext extends TypedEventEmitter {
400
465
  */
401
466
  makeLocallyVisible() {
402
467
  assert(this.channel !== undefined, 0x2cf /* "undefined channel on datastore context" */);
468
+ assert(this.channel.visibilityState === VisibilityState.LocallyVisible, 0x590 /* Channel must be locally visible */);
403
469
  this.makeLocallyVisibleFn();
404
470
  }
405
471
  bindRuntime(channel) {
406
- var _a;
407
472
  if (this.channel) {
408
473
  throw new Error("Runtime already bound");
409
474
  }
@@ -437,8 +502,10 @@ export class FluidDataStoreContext extends TypedEventEmitter {
437
502
  this.channelDeferred.resolve(this.channel);
438
503
  }
439
504
  catch (error) {
440
- (_a = this.channelDeferred) === null || _a === void 0 ? void 0 : _a.reject(error);
441
- this.logger.sendErrorEvent({ eventName: "BindRuntimeError", fluidDataStoreId: { value: this.id, tag: "PackageData" } }, error);
505
+ this.channelDeferred?.reject(error);
506
+ this.mc.logger.sendErrorEvent({
507
+ eventName: "BindRuntimeError",
508
+ }, error);
442
509
  }
443
510
  }
444
511
  async getAbsoluteUrl(relativeUrl) {
@@ -448,13 +515,19 @@ export class FluidDataStoreContext extends TypedEventEmitter {
448
515
  return this._containerRuntime.getAbsoluteUrl(relativeUrl);
449
516
  }
450
517
  /**
451
- * @deprecated - Sets the datastore as root, for aliasing purposes: #7948
518
+ * @deprecated Sets the datastore as root, for aliasing purposes: #7948
452
519
  * This method should not be used outside of the aliasing context.
453
520
  * It will be removed, as the source of truth for this flag will be the aliasing blob.
454
521
  */
455
522
  setInMemoryRoot() {
456
523
  this._isInMemoryRoot = true;
457
524
  }
525
+ /**
526
+ * @deprecated The functionality to get base GC details has been moved to summarizer node.
527
+ */
528
+ async getBaseGCDetails() {
529
+ return {};
530
+ }
458
531
  reSubmit(contents, localOpMetadata) {
459
532
  assert(!!this.channel, 0x14b /* "Channel must exist when resubmitting ops" */);
460
533
  const innerContents = contents;
@@ -475,62 +548,86 @@ export class FluidDataStoreContext extends TypedEventEmitter {
475
548
  await this.realize();
476
549
  }
477
550
  assert(!!this.channel, 0x14c /* "Channel must exist when rebasing ops" */);
478
- const innerContents = contents;
479
- return this.channel.applyStashedOp(innerContents.content);
480
- }
481
- verifyNotClosed() {
551
+ return this.channel.applyStashedOp(contents);
552
+ }
553
+ verifyNotClosed(callSite, checkTombstone = true, safeTelemetryProps = {}) {
554
+ if (this.deleted) {
555
+ const messageString = `Context is deleted! Call site [${callSite}]`;
556
+ const error = new DataCorruptionError(messageString, safeTelemetryProps);
557
+ this.mc.logger.sendErrorEvent({
558
+ eventName: "GC_Deleted_DataStore_Changed",
559
+ callSite,
560
+ }, error);
561
+ throw error;
562
+ }
482
563
  if (this._disposed) {
483
- throw new Error("Context is closed");
564
+ throw new Error(`Context is closed! Call site [${callSite}]`);
565
+ }
566
+ if (checkTombstone && this.tombstoned) {
567
+ const messageString = `Context is tombstoned! Call site [${callSite}]`;
568
+ const error = new DataCorruptionError(messageString, safeTelemetryProps);
569
+ sendGCUnexpectedUsageEvent(this.mc, {
570
+ eventName: "GC_Tombstone_DataStore_Changed",
571
+ category: this.throwOnTombstoneUsage ? "error" : "generic",
572
+ gcTombstoneEnforcementAllowed: this._containerRuntime.gcTombstoneEnforcementAllowed,
573
+ callSite,
574
+ }, this.pkg, error);
575
+ if (this.throwOnTombstoneUsage) {
576
+ throw error;
577
+ }
484
578
  }
485
579
  }
580
+ /**
581
+ * Summarizer client should not have local changes. These changes can become part of the summary and can break
582
+ * eventual consistency. For example, the next summary (say at ref seq# 100) may contain these changes whereas
583
+ * other clients that are up-to-date till seq# 100 may not have them yet.
584
+ */
585
+ identifyLocalChangeInSummarizer(eventName, type) {
586
+ if (this.clientDetails.type !== summarizerClientType ||
587
+ this.localChangesTelemetryCount <= 0) {
588
+ return;
589
+ }
590
+ // Log a telemetry if there are local changes in the summarizer. This will give us data on how often
591
+ // this is happening and which data stores do this. The eventual goal is to disallow local changes
592
+ // in the summarizer and the data will help us plan this.
593
+ this.mc.logger.sendTelemetryEvent({
594
+ eventName,
595
+ type,
596
+ isSummaryInProgress: this.summarizerNode.isSummaryInProgress?.(),
597
+ stack: generateStack(),
598
+ });
599
+ this.localChangesTelemetryCount--;
600
+ }
486
601
  getCreateChildSummarizerNodeFn(id, createParam) {
487
- return (summarizeInternal, getGCDataFn, getBaseGCDetailsFn) => this.summarizerNode.createChild(summarizeInternal, id, createParam,
602
+ return (summarizeInternal, getGCDataFn) => this.summarizerNode.createChild(summarizeInternal, id, createParam,
488
603
  // DDS will not create failure summaries
489
- { throwOnFailure: true }, getGCDataFn, getBaseGCDetailsFn);
604
+ { throwOnFailure: true }, getGCDataFn);
490
605
  }
491
- async uploadBlob(blob) {
492
- return this.containerRuntime.uploadBlob(blob);
606
+ async uploadBlob(blob, signal) {
607
+ return this.containerRuntime.uploadBlob(blob, signal);
493
608
  }
494
609
  }
495
610
  FluidDataStoreContext.pendingOpsCountThreshold = 1000;
496
611
  export class RemoteFluidDataStoreContext extends FluidDataStoreContext {
497
612
  constructor(props) {
498
- super(props, true /* existing */, BindState.Bound, false /* isLocalDataStore */, () => {
613
+ super(props, true /* existing */, false /* isLocalDataStore */, () => {
499
614
  throw new Error("Already attached");
500
615
  });
501
616
  this.initialSnapshotDetailsP = new LazyPromise(async () => {
502
- var _a, _b;
503
- let tree;
617
+ let tree = this.initSnapshotValue;
504
618
  let isRootDataStore = true;
505
- if (typeof this.initSnapshotValue === "string") {
506
- const commit = (await this.storage.getVersions(this.initSnapshotValue, 1))[0];
507
- tree = (_a = await this.storage.getSnapshotTree(commit)) !== null && _a !== void 0 ? _a : undefined;
508
- }
509
- else {
510
- tree = this.initSnapshotValue;
511
- }
512
- const localReadAndParse = async (id) => readAndParse(this.storage, id);
513
- if (tree) {
514
- const loadedSummary = await this.summarizerNode.loadBaseSummary(tree, localReadAndParse);
515
- tree = loadedSummary.baseSummary;
516
- // Prepend outstanding ops to pending queue of ops to process.
517
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
518
- this.pending = loadedSummary.outstandingOps.concat(this.pending);
519
- }
520
619
  if (!!tree && tree.blobs[dataStoreAttributesBlobName] !== undefined) {
521
620
  // Need to get through snapshot and use that to populate extraBlobs
522
- const attributes = await localReadAndParse(tree.blobs[dataStoreAttributesBlobName]);
621
+ const attributes = await readAndParse(this.storage, tree.blobs[dataStoreAttributesBlobName]);
523
622
  let pkgFromSnapshot;
524
623
  // Use the snapshotFormatVersion to determine how the pkg is encoded in the snapshot.
525
624
  // For snapshotFormatVersion = "0.1" (1) or above, pkg is jsonified, otherwise it is just a string.
526
625
  const formatVersion = getAttributesFormatVersion(attributes);
527
626
  if (formatVersion < 1) {
528
- if (attributes.pkg.startsWith("[\"") && attributes.pkg.endsWith("\"]")) {
529
- pkgFromSnapshot = JSON.parse(attributes.pkg);
530
- }
531
- else {
532
- pkgFromSnapshot = [attributes.pkg];
533
- }
627
+ pkgFromSnapshot =
628
+ attributes.pkg.startsWith('["') && attributes.pkg.endsWith('"]')
629
+ ? JSON.parse(attributes.pkg)
630
+ : [attributes.pkg];
534
631
  }
535
632
  else {
536
633
  pkgFromSnapshot = JSON.parse(attributes.pkg);
@@ -541,7 +638,7 @@ export class RemoteFluidDataStoreContext extends FluidDataStoreContext {
541
638
  * data stores in older documents are not garbage collected incorrectly. This may lead to additional
542
639
  * roots in the document but they won't break.
543
640
  */
544
- isRootDataStore = (_b = attributes.isRootDataStore) !== null && _b !== void 0 ? _b : true;
641
+ isRootDataStore = attributes.isRootDataStore ?? true;
545
642
  if (hasIsolatedChannels(attributes)) {
546
643
  tree = tree.trees[channelsTreeName];
547
644
  assert(tree !== undefined, 0x1fe /* "isolated channels subtree should exist in remote datastore snapshot" */);
@@ -555,23 +652,13 @@ export class RemoteFluidDataStoreContext extends FluidDataStoreContext {
555
652
  };
556
653
  });
557
654
  this.initSnapshotValue = props.snapshotTree;
558
- this.baseGCDetailsP = new LazyPromise(async () => {
559
- var _a;
560
- return (_a = (await props.getBaseGCDetails())) !== null && _a !== void 0 ? _a : {};
561
- });
655
+ if (props.snapshotTree !== undefined) {
656
+ this.summarizerNode.updateBaseSummaryState(props.snapshotTree);
657
+ }
562
658
  }
563
659
  async getInitialSnapshotDetails() {
564
660
  return this.initialSnapshotDetailsP;
565
661
  }
566
- /**
567
- * @deprecated - Renamed to getBaseGCDetails.
568
- */
569
- async getInitialGCSummaryDetails() {
570
- return this.getBaseGCDetails();
571
- }
572
- async getBaseGCDetails() {
573
- return this.baseGCDetailsP;
574
- }
575
662
  generateAttachMessage() {
576
663
  throw new Error("Cannot attach remote store");
577
664
  }
@@ -581,7 +668,39 @@ export class RemoteFluidDataStoreContext extends FluidDataStoreContext {
581
668
  */
582
669
  export class LocalFluidDataStoreContextBase extends FluidDataStoreContext {
583
670
  constructor(props) {
584
- super(props, props.snapshotTree !== undefined ? true : false /* existing */, props.snapshotTree ? BindState.Bound : BindState.NotBound, true /* isLocalDataStore */, props.makeLocallyVisibleFn);
671
+ super(props, props.snapshotTree !== undefined ? true : false /* existing */, true /* isLocalDataStore */, props.makeLocallyVisibleFn);
672
+ this.initialSnapshotDetailsP = new LazyPromise(async () => {
673
+ let snapshot = this.snapshotTree;
674
+ let attributes;
675
+ let isRootDataStore = false;
676
+ if (snapshot !== undefined) {
677
+ // Get the dataStore attributes.
678
+ // Note: storage can be undefined in special case while detached.
679
+ attributes = await getFluidDataStoreAttributes(this.storage, snapshot);
680
+ if (hasIsolatedChannels(attributes)) {
681
+ snapshot = snapshot.trees[channelsTreeName];
682
+ assert(snapshot !== undefined, 0x1ff /* "isolated channels subtree should exist in local datastore snapshot" */);
683
+ }
684
+ if (this.pkg === undefined) {
685
+ this.pkg = JSON.parse(attributes.pkg);
686
+ // If there is no isRootDataStore in the attributes blob, set it to true. This ensures that data
687
+ // stores in older documents are not garbage collected incorrectly. This may lead to additional
688
+ // roots in the document but they won't break.
689
+ if (attributes.isRootDataStore ?? true) {
690
+ isRootDataStore = true;
691
+ this.setInMemoryRoot();
692
+ }
693
+ }
694
+ }
695
+ assert(this.pkg !== undefined, 0x152 /* "pkg should be available in local data store" */);
696
+ return {
697
+ pkg: this.pkg,
698
+ isRootDataStore,
699
+ snapshot,
700
+ };
701
+ });
702
+ // Summarizer client should not create local data stores.
703
+ this.identifyLocalChangeInSummarizer("DataStoreCreatedInSummarizer");
585
704
  this.snapshotTree = props.snapshotTree;
586
705
  if (props.isRootDataStore === true) {
587
706
  this.setInMemoryRoot();
@@ -603,12 +722,10 @@ export class LocalFluidDataStoreContextBase extends FluidDataStoreContext {
603
722
  assert(this.channel !== undefined, 0x14f /* "There should be a channel when generating attach message" */);
604
723
  assert(this.pkg !== undefined, 0x150 /* "pkg should be available in local data store context" */);
605
724
  const summarizeResult = this.channel.getAttachSummary();
606
- if (!this.disableIsolatedChannels) {
607
- // Wrap dds summaries in .channels subtree.
608
- wrapSummaryInChannelsTree(summarizeResult);
609
- }
725
+ // Wrap dds summaries in .channels subtree.
726
+ wrapSummaryInChannelsTree(summarizeResult);
610
727
  // Add data store's attributes to the summary.
611
- const attributes = createAttributes(this.pkg, this.isInMemoryRoot(), this.disableIsolatedChannels);
728
+ const attributes = createAttributes(this.pkg, this.isInMemoryRoot());
612
729
  addBlobToSummary(summarizeResult, dataStoreAttributesBlobName, JSON.stringify(attributes));
613
730
  // Attach message needs the summary in ITree format. Convert the ISummaryTree into an ITree.
614
731
  const snapshot = convertSummaryTreeToITree(summarizeResult.summary);
@@ -620,46 +737,24 @@ export class LocalFluidDataStoreContextBase extends FluidDataStoreContext {
620
737
  return message;
621
738
  }
622
739
  async getInitialSnapshotDetails() {
623
- var _a;
624
- let snapshot = this.snapshotTree;
625
- let attributes;
626
- let isRootDataStore = false;
627
- if (snapshot !== undefined) {
628
- // Get the dataStore attributes.
629
- // Note: storage can be undefined in special case while detached.
630
- attributes = await getFluidDataStoreAttributes(this.storage, snapshot);
631
- if (hasIsolatedChannels(attributes)) {
632
- snapshot = snapshot.trees[channelsTreeName];
633
- assert(snapshot !== undefined, 0x1ff /* "isolated channels subtree should exist in local datastore snapshot" */);
634
- }
635
- if (this.pkg === undefined) {
636
- this.pkg = JSON.parse(attributes.pkg);
637
- // If there is no isRootDataStore in the attributes blob, set it to true. This ensures that data
638
- // stores in older documents are not garbage collected incorrectly. This may lead to additional
639
- // roots in the document but they won't break.
640
- if ((_a = attributes.isRootDataStore) !== null && _a !== void 0 ? _a : true) {
641
- isRootDataStore = true;
642
- this.setInMemoryRoot();
643
- }
644
- }
645
- }
646
- assert(this.pkg !== undefined, 0x152 /* "pkg should be available in local data store" */);
647
- return {
648
- pkg: this.pkg,
649
- isRootDataStore,
650
- snapshot,
651
- };
740
+ return this.initialSnapshotDetailsP;
652
741
  }
653
742
  /**
654
- * @deprecated - Renamed to getBaseGCDetails.
743
+ * A context should only be marked as deleted when its a remote context.
744
+ * Session Expiry at the runtime level should have closed the container creating the local data store context
745
+ * before delete is even possible. Session Expiry is at 30 days, and sweep is done 36+ days later from the time
746
+ * it was unreferenced. Thus the sweeping container should have loaded from a snapshot and thus creating a remote
747
+ * context.
655
748
  */
656
- async getInitialGCSummaryDetails() {
657
- // Local data store does not have initial summary.
658
- return {};
659
- }
660
- async getBaseGCDetails() {
661
- // Local data store does not have initial summary.
662
- return {};
749
+ delete() {
750
+ // TODO: GC:Validation - potentially prevent this from happening or asserting. Maybe throw here.
751
+ sendGCUnexpectedUsageEvent(this.mc, {
752
+ eventName: "GC_Deleted_DataStore_Unexpected_Delete",
753
+ message: "Unexpected deletion of a local data store context",
754
+ category: "error",
755
+ gcTombstoneEnforcementAllowed: undefined,
756
+ }, this.pkg);
757
+ super.delete();
663
758
  }
664
759
  }
665
760
  /**
@@ -686,24 +781,25 @@ export class LocalDetachedFluidDataStoreContext extends LocalFluidDataStoreConte
686
781
  }
687
782
  async attachRuntime(registry, dataStoreChannel) {
688
783
  assert(this.detachedRuntimeCreation, 0x154 /* "runtime creation is already attached" */);
784
+ this.detachedRuntimeCreation = false;
689
785
  assert(this.channelDeferred === undefined, 0x155 /* "channel deferral is already set" */);
786
+ this.channelDeferred = new Deferred();
690
787
  const factory = registry.IFluidDataStoreFactory;
691
788
  const entry = await this.factoryFromPackagePath(this.pkg);
692
789
  assert(entry.factory === factory, 0x156 /* "Unexpected factory for package path" */);
693
790
  assert(this.registry === undefined, 0x157 /* "datastore registry already attached" */);
694
791
  this.registry = entry.registry;
695
- this.detachedRuntimeCreation = false;
696
- this.channelDeferred = new Deferred();
697
792
  super.bindRuntime(dataStoreChannel);
793
+ // Load the handle to the data store's entryPoint to make sure that for a detached data store, the entryPoint
794
+ // initialization function is called before the data store gets attached and potentially connected to the
795
+ // delta stream, so it gets a chance to do things while the data store is still "purely local".
796
+ // This preserves the behavior from before we introduced entryPoints, where the instantiateDataStore method
797
+ // of data store factories tends to construct the data object (at least kick off an async method that returns
798
+ // it); that code moved to the entryPoint initialization function, so we want to ensure it still executes
799
+ // before the data store is attached.
800
+ await dataStoreChannel.entryPoint.get();
698
801
  if (await this.isRoot()) {
699
- // back-compat 0.59.1000 - makeVisibleAndAttachGraph was added in this version to IFluidDataStoreChannel.
700
- // For older versions, we still have to call bindToContext.
701
- if (dataStoreChannel.makeVisibleAndAttachGraph !== undefined) {
702
- dataStoreChannel.makeVisibleAndAttachGraph();
703
- }
704
- else {
705
- dataStoreChannel.bindToContext();
706
- }
802
+ dataStoreChannel.makeVisibleAndAttachGraph();
707
803
  }
708
804
  }
709
805
  async getInitialSnapshotDetails() {
@@ -713,4 +809,4 @@ export class LocalDetachedFluidDataStoreContext extends LocalFluidDataStoreConte
713
809
  return super.getInitialSnapshotDetails();
714
810
  }
715
811
  }
716
- //# sourceMappingURL=dataStoreContext.js.map
812
+ //# sourceMappingURL=dataStoreContext.mjs.map