@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,505 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { ITelemetryLogger } from "@fluidframework/common-definitions";
7
+ import {
8
+ assert,
9
+ Deferred,
10
+ IPromiseTimer,
11
+ IPromiseTimerResult,
12
+ Timer,
13
+ } from "@fluidframework/common-utils";
14
+ import { MessageType } from "@fluidframework/protocol-definitions";
15
+ import { PerformanceEvent, LoggingError, ChildLogger } from "@fluidframework/telemetry-utils";
16
+ import { getRetryDelaySecondsFromError } from "@fluidframework/driver-utils";
17
+ import { DriverErrorType } from "@fluidframework/driver-definitions";
18
+ import {
19
+ IAckSummaryResult,
20
+ INackSummaryResult,
21
+ ISummarizeOptions,
22
+ IBroadcastSummaryResult,
23
+ ISummarizeResults,
24
+ ISummarizeHeuristicData,
25
+ ISubmitSummaryOptions,
26
+ SubmitSummaryResult,
27
+ SummarizeResultPart,
28
+ ISummaryCancellationToken,
29
+ ISummarizeTelemetryProperties,
30
+ SummaryGeneratorTelemetry,
31
+ } from "./summarizerTypes";
32
+ import { IClientSummaryWatcher } from "./summaryCollection";
33
+
34
+ export type raceTimerResult<T> =
35
+ | { result: "done"; value: T }
36
+ | { result: IPromiseTimerResult["timerResult"] }
37
+ | { result: "cancelled" };
38
+
39
+ /** Helper function to wait for a promise or PromiseTimer to elapse. */
40
+ export async function raceTimer<T>(
41
+ promise: Promise<T>,
42
+ timer: Promise<IPromiseTimerResult>,
43
+ cancellationToken?: ISummaryCancellationToken,
44
+ ): Promise<raceTimerResult<T>> {
45
+ const promises: Promise<raceTimerResult<T>>[] = [
46
+ promise.then((value) => ({ result: "done", value } as const)),
47
+ timer.then(({ timerResult: result }) => ({ result } as const)),
48
+ ];
49
+ if (cancellationToken !== undefined) {
50
+ promises.push(
51
+ cancellationToken.waitCancelled.then(() => ({ result: "cancelled" } as const)),
52
+ );
53
+ }
54
+ return Promise.race(promises);
55
+ }
56
+
57
+ // Send some telemetry if generate summary takes too long
58
+ const maxSummarizeTimeoutTime = 20000; // 20 sec
59
+ const maxSummarizeTimeoutCount = 5; // Double and resend 5 times
60
+
61
+ export type SummarizeReason =
62
+ /**
63
+ * Attempt to summarize after idle timeout has elapsed.
64
+ * Idle timer restarts whenever an op is received. So this
65
+ * triggers only after some amount of time has passed with
66
+ * no ops being received.
67
+ */
68
+ | "idle"
69
+ /**
70
+ * Attempt to summarize after a maximum time since last
71
+ * successful summary has passed. This measures time since
72
+ * last summary ack op was processed.
73
+ */
74
+ | "maxTime"
75
+ /**
76
+ * Attempt to summarize after a maximum number of ops have
77
+ * passed since the last successful summary. This compares
78
+ * op sequence numbers with the reference sequence number
79
+ * of the summarize op corresponding to the last summary
80
+ * ack op.
81
+ */
82
+ | "maxOps"
83
+ /**
84
+ * Special case to attempt to summarize one last time before the
85
+ * summarizer client closes itself. This is to prevent cases where
86
+ * the summarizer client never gets a chance to summarize, because
87
+ * there are too many outstanding ops and/or parent client cannot
88
+ * stay connected long enough for summarizer client to catch up.
89
+ */
90
+ | "lastSummary"
91
+ /** On-demand summary requested with specified reason. */
92
+ | `onDemand;${string}`
93
+ /** Enqueue summarize attempt with specified reason. */
94
+ | `enqueue;${string}`;
95
+
96
+ const summarizeErrors = {
97
+ /**
98
+ * Error encountered while generating the summary tree, uploading
99
+ * it to storage, or submitting the op. It could be a result of
100
+ * the client becoming disconnected while generating or an actual error.
101
+ */
102
+ submitSummaryFailure: "Error while generating, uploading, or submitting summary",
103
+ /**
104
+ * The summaryAckWaitTimeout time has elapsed before receiving the summarize op
105
+ * sent by this summarize attempt. It is expected to be broadcast quickly.
106
+ */
107
+ summaryOpWaitTimeout: "Timeout while waiting for summarize op broadcast",
108
+ /**
109
+ * The summaryAckWaitTimeout time has elapsed before receiving either a
110
+ * summaryAck or summaryNack op from the server in response to this
111
+ * summarize attempt. It is expected that the server should respond.
112
+ */
113
+ summaryAckWaitTimeout: "Timeout while waiting for summaryAck/summaryNack op",
114
+ /**
115
+ * The server responded with a summaryNack op, thus rejecting this
116
+ * summarize attempt.
117
+ */
118
+ summaryNack: "Server rejected summary via summaryNack op",
119
+
120
+ disconnect: "Summary cancelled due to summarizer or main client disconnect",
121
+ } as const;
122
+
123
+ export class SummarizeResultBuilder {
124
+ public readonly summarySubmitted = new Deferred<SummarizeResultPart<SubmitSummaryResult>>();
125
+ public readonly summaryOpBroadcasted = new Deferred<
126
+ SummarizeResultPart<IBroadcastSummaryResult>
127
+ >();
128
+ public readonly receivedSummaryAckOrNack = new Deferred<
129
+ SummarizeResultPart<IAckSummaryResult, INackSummaryResult>
130
+ >();
131
+
132
+ public fail(
133
+ message: string,
134
+ error: any,
135
+ nackSummaryResult?: INackSummaryResult,
136
+ retryAfterSeconds?: number,
137
+ ) {
138
+ assert(
139
+ !this.receivedSummaryAckOrNack.isCompleted,
140
+ 0x25e /* "no reason to call fail if all promises have been completed" */,
141
+ );
142
+
143
+ const result: SummarizeResultPart<undefined> = {
144
+ success: false,
145
+ message,
146
+ data: undefined,
147
+ error,
148
+ retryAfterSeconds,
149
+ } as const;
150
+ this.summarySubmitted.resolve(result);
151
+ this.summaryOpBroadcasted.resolve(result);
152
+ this.receivedSummaryAckOrNack.resolve({ ...result, data: nackSummaryResult });
153
+ }
154
+ public build(): ISummarizeResults {
155
+ return {
156
+ summarySubmitted: this.summarySubmitted.promise,
157
+ summaryOpBroadcasted: this.summaryOpBroadcasted.promise,
158
+ receivedSummaryAckOrNack: this.receivedSummaryAckOrNack.promise,
159
+ } as const;
160
+ }
161
+ }
162
+
163
+ /**
164
+ * This class generates and tracks a summary attempt.
165
+ */
166
+ export class SummaryGenerator {
167
+ private readonly summarizeTimer: Timer;
168
+ constructor(
169
+ private readonly pendingAckTimer: IPromiseTimer,
170
+ private readonly heuristicData: ISummarizeHeuristicData,
171
+ private readonly submitSummaryCallback: (
172
+ options: ISubmitSummaryOptions,
173
+ ) => Promise<SubmitSummaryResult>,
174
+ private readonly raiseSummarizingError: (errorMessage: string) => void,
175
+ private readonly successfulSummaryCallback: () => void,
176
+ private readonly summaryWatcher: Pick<IClientSummaryWatcher, "watchSummary">,
177
+ private readonly logger: ITelemetryLogger,
178
+ ) {
179
+ this.summarizeTimer = new Timer(maxSummarizeTimeoutTime, () =>
180
+ this.summarizeTimerHandler(maxSummarizeTimeoutTime, 1),
181
+ );
182
+ }
183
+
184
+ /**
185
+ * Generates summary and listens for broadcast and ack/nack.
186
+ * Returns true for ack, false for nack, and undefined for failure or timeout.
187
+ * @param reason - reason for summarizing
188
+ * @param options - refreshLatestAck to fetch summary ack info from server,
189
+ * fullTree to generate tree without any summary handles even if unchanged
190
+ */
191
+ public summarize(
192
+ summarizeProps: ISummarizeTelemetryProperties,
193
+ options: ISummarizeOptions,
194
+ cancellationToken: ISummaryCancellationToken,
195
+ resultsBuilder = new SummarizeResultBuilder(),
196
+ ): ISummarizeResults {
197
+ this.summarizeCore(summarizeProps, options, resultsBuilder, cancellationToken).catch(
198
+ (error) => {
199
+ const message = "UnexpectedSummarizeError";
200
+ this.logger.sendErrorEvent({ eventName: message, ...summarizeProps }, error);
201
+ resultsBuilder.fail(message, error);
202
+ },
203
+ );
204
+
205
+ return resultsBuilder.build();
206
+ }
207
+
208
+ private async summarizeCore(
209
+ summarizeProps: ISummarizeTelemetryProperties,
210
+ options: ISummarizeOptions,
211
+ resultsBuilder: SummarizeResultBuilder,
212
+ cancellationToken: ISummaryCancellationToken,
213
+ ): Promise<void> {
214
+ const { refreshLatestAck, fullTree } = options;
215
+ const logger = ChildLogger.create(this.logger, undefined, { all: summarizeProps });
216
+
217
+ // Note: timeSinceLastAttempt and timeSinceLastSummary for the
218
+ // first summary are basically the time since the summarizer was loaded.
219
+ const timeSinceLastAttempt = Date.now() - this.heuristicData.lastAttempt.summaryTime;
220
+ const timeSinceLastSummary =
221
+ Date.now() - this.heuristicData.lastSuccessfulSummary.summaryTime;
222
+ let summarizeTelemetryProps: SummaryGeneratorTelemetry = {
223
+ fullTree,
224
+ timeSinceLastAttempt,
225
+ timeSinceLastSummary,
226
+ };
227
+
228
+ const summarizeEvent = PerformanceEvent.start(
229
+ logger,
230
+ {
231
+ eventName: "Summarize",
232
+ refreshLatestAck,
233
+ ...summarizeTelemetryProps,
234
+ },
235
+ { start: true, end: true, cancel: "generic" },
236
+ );
237
+
238
+ // Helper functions to report failures and return.
239
+ const getFailMessage = (errorCode: keyof typeof summarizeErrors) =>
240
+ `${errorCode}: ${summarizeErrors[errorCode]}`;
241
+ const fail = (
242
+ errorCode: keyof typeof summarizeErrors,
243
+ error?: any,
244
+ properties?: SummaryGeneratorTelemetry,
245
+ nackSummaryResult?: INackSummaryResult,
246
+ ) => {
247
+ this.raiseSummarizingError(summarizeErrors[errorCode]);
248
+ // UploadSummary may fail with 429 and retryAfter - respect that
249
+ // Summary Nack also can have retryAfter, it's parsed below and comes as a property.
250
+ const retryAfterSeconds = getRetryDelaySecondsFromError(error);
251
+
252
+ // Report any failure as an error unless it was due to cancellation (like "disconnected" error)
253
+ // If failure happened on upload, we may not yet realized that socket disconnected, so check
254
+ // offlineError too.
255
+ const category =
256
+ cancellationToken.cancelled || error?.errorType === DriverErrorType.offlineError
257
+ ? "generic"
258
+ : "error";
259
+
260
+ const message = getFailMessage(errorCode);
261
+ summarizeEvent.cancel(
262
+ {
263
+ ...properties,
264
+ reason: errorCode,
265
+ category,
266
+ retryAfterSeconds,
267
+ },
268
+ error ?? message,
269
+ ); // disconnect & summaryAckTimeout do not have proper error.
270
+ resultsBuilder.fail(message, error, nackSummaryResult, retryAfterSeconds);
271
+ };
272
+
273
+ // Wait to generate and send summary
274
+ this.summarizeTimer.start();
275
+
276
+ // Use record type to prevent unexpected value types
277
+ let summaryData: SubmitSummaryResult | undefined;
278
+ try {
279
+ summaryData = await this.submitSummaryCallback({
280
+ fullTree,
281
+ refreshLatestAck,
282
+ summaryLogger: logger,
283
+ cancellationToken,
284
+ });
285
+
286
+ // Cumulatively add telemetry properties based on how far generateSummary went.
287
+ const referenceSequenceNumber = summaryData.referenceSequenceNumber;
288
+ const opsSinceLastSummary =
289
+ referenceSequenceNumber -
290
+ this.heuristicData.lastSuccessfulSummary.refSequenceNumber;
291
+ summarizeTelemetryProps = {
292
+ ...summarizeTelemetryProps,
293
+ referenceSequenceNumber,
294
+ minimumSequenceNumber: summaryData.minimumSequenceNumber,
295
+ opsSinceLastAttempt:
296
+ referenceSequenceNumber - this.heuristicData.lastAttempt.refSequenceNumber,
297
+ opsSinceLastSummary,
298
+ };
299
+ summarizeTelemetryProps = this.addSummaryDataToTelemetryProps(
300
+ summaryData,
301
+ summarizeTelemetryProps,
302
+ );
303
+
304
+ if (summaryData.stage !== "submit") {
305
+ return fail("submitSummaryFailure", summaryData.error, summarizeTelemetryProps);
306
+ }
307
+
308
+ /**
309
+ * With incremental summaries, if the full tree was not summarized, only data stores that changed should
310
+ * be summarized. A data store is considered changed if either or both of the following is true:
311
+ * - It has received an op.
312
+ * - Its reference state changed, i.e., it went from referenced to unreferenced or vice-versa.
313
+ *
314
+ * In the extreme case, every op can be for a different data store and each op can result in the reference
315
+ * state change of multiple data stores. So, the total number of data stores that are summarized should not
316
+ * exceed the number of ops since last summary + number of data store whose reference state changed.
317
+ */
318
+ if (!fullTree && !summaryData.forcedFullTree) {
319
+ const { summarizedDataStoreCount, gcStateUpdatedDataStoreCount = 0 } =
320
+ summaryData.summaryStats;
321
+ if (summarizedDataStoreCount > gcStateUpdatedDataStoreCount + opsSinceLastSummary) {
322
+ logger.sendErrorEvent({
323
+ eventName: "IncrementalSummaryViolation",
324
+ summarizedDataStoreCount,
325
+ gcStateUpdatedDataStoreCount,
326
+ opsSinceLastSummary,
327
+ });
328
+ }
329
+ }
330
+
331
+ // Log event here on summary success only, as Summarize_cancel duplicates failure logging.
332
+ summarizeEvent.reportEvent("generate", { ...summarizeTelemetryProps });
333
+ resultsBuilder.summarySubmitted.resolve({ success: true, data: summaryData });
334
+ } catch (error) {
335
+ return fail("submitSummaryFailure", error);
336
+ } finally {
337
+ this.heuristicData.recordAttempt(summaryData?.referenceSequenceNumber);
338
+ this.summarizeTimer.clear();
339
+ }
340
+
341
+ try {
342
+ const pendingTimeoutP = this.pendingAckTimer.start();
343
+ const summary = this.summaryWatcher.watchSummary(summaryData.clientSequenceNumber);
344
+
345
+ // Wait for broadcast
346
+ const waitBroadcastResult = await raceTimer(
347
+ summary.waitBroadcast(),
348
+ pendingTimeoutP,
349
+ cancellationToken,
350
+ );
351
+ if (waitBroadcastResult.result === "cancelled") {
352
+ return fail("disconnect");
353
+ }
354
+ if (waitBroadcastResult.result !== "done") {
355
+ return fail("summaryOpWaitTimeout");
356
+ }
357
+ const summarizeOp = waitBroadcastResult.value;
358
+
359
+ const broadcastDuration = Date.now() - this.heuristicData.lastAttempt.summaryTime;
360
+ resultsBuilder.summaryOpBroadcasted.resolve({
361
+ success: true,
362
+ data: { summarizeOp, broadcastDuration },
363
+ });
364
+
365
+ this.heuristicData.lastAttempt.summarySequenceNumber = summarizeOp.sequenceNumber;
366
+ logger.sendTelemetryEvent({
367
+ eventName: "Summarize_Op",
368
+ duration: broadcastDuration,
369
+ referenceSequenceNumber: summarizeOp.referenceSequenceNumber,
370
+ summarySequenceNumber: summarizeOp.sequenceNumber,
371
+ handle: summarizeOp.contents.handle,
372
+ });
373
+
374
+ // Wait for ack/nack
375
+ const waitAckNackResult = await raceTimer(
376
+ summary.waitAckNack(),
377
+ pendingTimeoutP,
378
+ cancellationToken,
379
+ );
380
+ if (waitAckNackResult.result === "cancelled") {
381
+ return fail("disconnect");
382
+ }
383
+ if (waitAckNackResult.result !== "done") {
384
+ return fail("summaryAckWaitTimeout");
385
+ }
386
+ const ackNackOp = waitAckNackResult.value;
387
+ this.pendingAckTimer.clear();
388
+
389
+ // Update for success/failure
390
+ const ackNackDuration = Date.now() - this.heuristicData.lastAttempt.summaryTime;
391
+
392
+ // adding new properties
393
+ summarizeTelemetryProps = {
394
+ ackWaitDuration: ackNackDuration,
395
+ ackNackSequenceNumber: ackNackOp.sequenceNumber,
396
+ summarySequenceNumber: ackNackOp.contents.summaryProposal.summarySequenceNumber,
397
+ ...summarizeTelemetryProps,
398
+ };
399
+ if (ackNackOp.type === MessageType.SummaryAck) {
400
+ this.heuristicData.markLastAttemptAsSuccessful();
401
+ this.successfulSummaryCallback();
402
+ summarizeEvent.end({
403
+ ...summarizeTelemetryProps,
404
+ handle: ackNackOp.contents.handle,
405
+ });
406
+ resultsBuilder.receivedSummaryAckOrNack.resolve({
407
+ success: true,
408
+ data: {
409
+ summaryAckOp: ackNackOp,
410
+ ackNackDuration,
411
+ },
412
+ });
413
+ } else {
414
+ // Check for retryDelay in summaryNack response.
415
+ assert(ackNackOp.type === MessageType.SummaryNack, 0x274 /* "type check" */);
416
+ const summaryNack = ackNackOp.contents;
417
+ const errorMessage = summaryNack?.message;
418
+ const retryAfterSeconds = summaryNack?.retryAfter;
419
+
420
+ // pre-0.58 error message prefix: summaryNack
421
+ const error = new LoggingError(`Received summaryNack`, {
422
+ retryAfterSeconds,
423
+ errorMessage,
424
+ });
425
+
426
+ assert(
427
+ getRetryDelaySecondsFromError(error) === retryAfterSeconds,
428
+ 0x25f /* "retryAfterSeconds" */,
429
+ );
430
+ // This will only set resultsBuilder.receivedSummaryAckOrNack, as other promises are already set.
431
+ return fail(
432
+ "summaryNack",
433
+ error,
434
+ { ...summarizeTelemetryProps, nackRetryAfter: retryAfterSeconds },
435
+ { summaryNackOp: ackNackOp, ackNackDuration },
436
+ );
437
+ }
438
+ } finally {
439
+ this.pendingAckTimer.clear();
440
+ }
441
+ }
442
+
443
+ private addSummaryDataToTelemetryProps(
444
+ summaryData: SubmitSummaryResult,
445
+ initialProps: SummaryGeneratorTelemetry,
446
+ ): SummaryGeneratorTelemetry {
447
+ switch (summaryData.stage) {
448
+ case "base":
449
+ return initialProps;
450
+
451
+ case "generate":
452
+ return {
453
+ ...initialProps,
454
+ ...summaryData.summaryStats,
455
+ generateDuration: summaryData.generateDuration,
456
+ };
457
+
458
+ case "upload":
459
+ return {
460
+ ...initialProps,
461
+ ...summaryData.summaryStats,
462
+ generateDuration: summaryData.generateDuration,
463
+ handle: summaryData.handle,
464
+ uploadDuration: summaryData.uploadDuration,
465
+ };
466
+
467
+ case "submit":
468
+ return {
469
+ ...initialProps,
470
+ ...summaryData.summaryStats,
471
+ generateDuration: summaryData.generateDuration,
472
+ handle: summaryData.handle,
473
+ uploadDuration: summaryData.uploadDuration,
474
+ clientSequenceNumber: summaryData.clientSequenceNumber,
475
+ hasMissingOpData: this.heuristicData.hasMissingOpData,
476
+ opsSizesSinceLastSummary: this.heuristicData.totalOpsSize,
477
+ nonRuntimeOpsSinceLastSummary: this.heuristicData.numNonRuntimeOps,
478
+ };
479
+
480
+ default:
481
+ assert(true, 0x397 /* Unexpected summary stage */);
482
+ }
483
+
484
+ return initialProps;
485
+ }
486
+
487
+ private summarizeTimerHandler(time: number, count: number) {
488
+ this.logger.sendPerformanceEvent({
489
+ eventName: "SummarizeTimeout",
490
+ timeoutTime: time,
491
+ timeoutCount: count,
492
+ });
493
+ if (count < maxSummarizeTimeoutCount) {
494
+ // Double and start a new timer
495
+ const nextTime = time * 2;
496
+ this.summarizeTimer.start(nextTime, () =>
497
+ this.summarizeTimerHandler(nextTime, count + 1),
498
+ );
499
+ }
500
+ }
501
+
502
+ public dispose() {
503
+ this.summarizeTimer.clear();
504
+ }
505
+ }