@fluidframework/container-runtime 2.0.0-dev.5.3.2.178189 → 2.0.0-dev.6.4.0.191258

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 (526) hide show
  1. package/CHANGELOG.md +123 -0
  2. package/README.md +4 -3
  3. package/dist/batchTracker.d.ts +3 -2
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js +6 -5
  6. package/dist/batchTracker.js.map +1 -1
  7. package/dist/blobManager.d.ts +10 -16
  8. package/dist/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager.js +184 -172
  10. package/dist/blobManager.js.map +1 -1
  11. package/dist/connectionTelemetry.d.ts.map +1 -1
  12. package/dist/connectionTelemetry.js +25 -16
  13. package/dist/connectionTelemetry.js.map +1 -1
  14. package/dist/containerRuntime.d.ts +161 -35
  15. package/dist/containerRuntime.d.ts.map +1 -1
  16. package/dist/containerRuntime.js +697 -449
  17. package/dist/containerRuntime.js.map +1 -1
  18. package/dist/dataStore.d.ts.map +1 -1
  19. package/dist/dataStore.js +15 -7
  20. package/dist/dataStore.js.map +1 -1
  21. package/dist/dataStoreContext.d.ts +3 -2
  22. package/dist/dataStoreContext.d.ts.map +1 -1
  23. package/dist/dataStoreContext.js +83 -87
  24. package/dist/dataStoreContext.js.map +1 -1
  25. package/dist/dataStoreContexts.d.ts +1 -2
  26. package/dist/dataStoreContexts.d.ts.map +1 -1
  27. package/dist/dataStoreContexts.js +8 -9
  28. package/dist/dataStoreContexts.js.map +1 -1
  29. package/dist/dataStoreRegistry.js +2 -2
  30. package/dist/dataStoreRegistry.js.map +1 -1
  31. package/dist/dataStores.d.ts +22 -6
  32. package/dist/dataStores.d.ts.map +1 -1
  33. package/dist/dataStores.js +123 -81
  34. package/dist/dataStores.js.map +1 -1
  35. package/dist/deltaManagerProxyBase.d.ts +35 -0
  36. package/dist/deltaManagerProxyBase.d.ts.map +1 -0
  37. package/dist/deltaManagerProxyBase.js +77 -0
  38. package/dist/deltaManagerProxyBase.js.map +1 -0
  39. package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
  40. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  41. package/dist/deltaManagerSummarizerProxy.js +4 -2
  42. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  43. package/dist/deltaScheduler.d.ts.map +1 -1
  44. package/dist/deltaScheduler.js +10 -10
  45. package/dist/deltaScheduler.js.map +1 -1
  46. package/dist/error.d.ts +14 -0
  47. package/dist/error.d.ts.map +1 -0
  48. package/dist/error.js +21 -0
  49. package/dist/error.js.map +1 -0
  50. package/dist/gc/garbageCollection.d.ts +10 -9
  51. package/dist/gc/garbageCollection.d.ts.map +1 -1
  52. package/dist/gc/garbageCollection.js +61 -53
  53. package/dist/gc/garbageCollection.js.map +1 -1
  54. package/dist/gc/gcConfigs.d.ts.map +1 -1
  55. package/dist/gc/gcConfigs.js +18 -14
  56. package/dist/gc/gcConfigs.js.map +1 -1
  57. package/dist/gc/gcDefinitions.d.ts +17 -4
  58. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  59. package/dist/gc/gcDefinitions.js +14 -15
  60. package/dist/gc/gcDefinitions.js.map +1 -1
  61. package/dist/gc/gcHelpers.d.ts +0 -8
  62. package/dist/gc/gcHelpers.d.ts.map +1 -1
  63. package/dist/gc/gcHelpers.js +11 -24
  64. package/dist/gc/gcHelpers.js.map +1 -1
  65. package/dist/gc/gcSummaryStateTracker.d.ts +4 -7
  66. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  67. package/dist/gc/gcSummaryStateTracker.js +19 -58
  68. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  69. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  70. package/dist/gc/gcTelemetry.js +45 -35
  71. package/dist/gc/gcTelemetry.js.map +1 -1
  72. package/dist/gc/gcUnreferencedStateTracker.js +4 -4
  73. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  74. package/dist/gc/index.d.ts +2 -2
  75. package/dist/gc/index.d.ts.map +1 -1
  76. package/dist/gc/index.js +3 -5
  77. package/dist/gc/index.js.map +1 -1
  78. package/dist/id-compressor/appendOnlySortedMap.d.ts +8 -30
  79. package/dist/id-compressor/appendOnlySortedMap.d.ts.map +1 -1
  80. package/dist/id-compressor/appendOnlySortedMap.js +26 -68
  81. package/dist/id-compressor/appendOnlySortedMap.js.map +1 -1
  82. package/dist/id-compressor/finalSpace.d.ts +29 -0
  83. package/dist/id-compressor/finalSpace.d.ts.map +1 -0
  84. package/dist/id-compressor/finalSpace.js +62 -0
  85. package/dist/id-compressor/finalSpace.js.map +1 -0
  86. package/dist/id-compressor/idCompressor.d.ts +25 -250
  87. package/dist/id-compressor/idCompressor.d.ts.map +1 -1
  88. package/dist/id-compressor/idCompressor.js +390 -1153
  89. package/dist/id-compressor/idCompressor.js.map +1 -1
  90. package/dist/id-compressor/identifiers.d.ts +32 -0
  91. package/dist/id-compressor/identifiers.d.ts.map +1 -0
  92. package/dist/id-compressor/identifiers.js +15 -0
  93. package/dist/id-compressor/identifiers.js.map +1 -0
  94. package/dist/id-compressor/index.d.ts +5 -6
  95. package/dist/id-compressor/index.d.ts.map +1 -1
  96. package/dist/id-compressor/index.js +20 -26
  97. package/dist/id-compressor/index.js.map +1 -1
  98. package/dist/id-compressor/persistanceUtilities.d.ts +22 -0
  99. package/dist/id-compressor/persistanceUtilities.d.ts.map +1 -0
  100. package/dist/id-compressor/persistanceUtilities.js +43 -0
  101. package/dist/id-compressor/persistanceUtilities.js.map +1 -0
  102. package/dist/id-compressor/sessionSpaceNormalizer.d.ts +46 -0
  103. package/dist/id-compressor/sessionSpaceNormalizer.d.ts.map +1 -0
  104. package/dist/id-compressor/sessionSpaceNormalizer.js +80 -0
  105. package/dist/id-compressor/sessionSpaceNormalizer.js.map +1 -0
  106. package/dist/id-compressor/sessions.d.ts +115 -0
  107. package/dist/id-compressor/sessions.d.ts.map +1 -0
  108. package/dist/id-compressor/sessions.js +305 -0
  109. package/dist/id-compressor/sessions.js.map +1 -0
  110. package/dist/id-compressor/utilities.d.ts +49 -0
  111. package/dist/id-compressor/utilities.d.ts.map +1 -0
  112. package/dist/id-compressor/utilities.js +166 -0
  113. package/dist/id-compressor/utilities.js.map +1 -0
  114. package/dist/index.d.ts +3 -3
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +6 -4
  117. package/dist/index.js.map +1 -1
  118. package/dist/opLifecycle/batchManager.js +10 -6
  119. package/dist/opLifecycle/batchManager.js.map +1 -1
  120. package/dist/opLifecycle/opCompressor.d.ts +2 -2
  121. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  122. package/dist/opLifecycle/opCompressor.js +12 -7
  123. package/dist/opLifecycle/opCompressor.js.map +1 -1
  124. package/dist/opLifecycle/opDecompressor.d.ts +2 -2
  125. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  126. package/dist/opLifecycle/opDecompressor.js +23 -20
  127. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  128. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  129. package/dist/opLifecycle/opGroupingManager.js +19 -9
  130. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  131. package/dist/opLifecycle/opSplitter.d.ts +2 -2
  132. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  133. package/dist/opLifecycle/opSplitter.js +22 -19
  134. package/dist/opLifecycle/opSplitter.js.map +1 -1
  135. package/dist/opLifecycle/outbox.d.ts +7 -5
  136. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  137. package/dist/opLifecycle/outbox.js +22 -31
  138. package/dist/opLifecycle/outbox.js.map +1 -1
  139. package/dist/opLifecycle/remoteMessageProcessor.d.ts +6 -1
  140. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  141. package/dist/opLifecycle/remoteMessageProcessor.js +19 -7
  142. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  143. package/dist/opProperties.js +1 -2
  144. package/dist/opProperties.js.map +1 -1
  145. package/dist/packageVersion.d.ts +1 -1
  146. package/dist/packageVersion.js +1 -1
  147. package/dist/packageVersion.js.map +1 -1
  148. package/dist/pendingStateManager.d.ts +18 -8
  149. package/dist/pendingStateManager.d.ts.map +1 -1
  150. package/dist/pendingStateManager.js +73 -51
  151. package/dist/pendingStateManager.js.map +1 -1
  152. package/dist/scheduleManager.d.ts.map +1 -1
  153. package/dist/scheduleManager.js +36 -32
  154. package/dist/scheduleManager.js.map +1 -1
  155. package/dist/summary/index.d.ts +3 -3
  156. package/dist/summary/index.d.ts.map +1 -1
  157. package/dist/summary/index.js +2 -1
  158. package/dist/summary/index.js.map +1 -1
  159. package/dist/summary/orderedClientElection.d.ts +3 -3
  160. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  161. package/dist/summary/orderedClientElection.js +26 -27
  162. package/dist/summary/orderedClientElection.js.map +1 -1
  163. package/dist/summary/runWhileConnectedCoordinator.js +3 -3
  164. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  165. package/dist/summary/runningSummarizer.d.ts +31 -10
  166. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  167. package/dist/summary/runningSummarizer.js +271 -139
  168. package/dist/summary/runningSummarizer.js.map +1 -1
  169. package/dist/summary/summarizer.d.ts +8 -7
  170. package/dist/summary/summarizer.d.ts.map +1 -1
  171. package/dist/summary/summarizer.js +79 -78
  172. package/dist/summary/summarizer.js.map +1 -1
  173. package/dist/summary/summarizerClientElection.d.ts +2 -2
  174. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  175. package/dist/summary/summarizerClientElection.js +7 -11
  176. package/dist/summary/summarizerClientElection.js.map +1 -1
  177. package/dist/summary/summarizerHeuristics.js +10 -14
  178. package/dist/summary/summarizerHeuristics.js.map +1 -1
  179. package/dist/summary/summarizerNode/index.d.ts +1 -1
  180. package/dist/summary/summarizerNode/index.d.ts.map +1 -1
  181. package/dist/summary/summarizerNode/index.js.map +1 -1
  182. package/dist/summary/summarizerNode/summarizerNode.d.ts +10 -19
  183. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  184. package/dist/summary/summarizerNode/summarizerNode.js +57 -130
  185. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  186. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +6 -30
  187. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  188. package/dist/summary/summarizerNode/summarizerNodeUtils.js +2 -4
  189. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  190. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -14
  191. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  192. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +15 -101
  193. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  194. package/dist/summary/summarizerTypes.d.ts +38 -25
  195. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  196. package/dist/summary/summarizerTypes.js.map +1 -1
  197. package/dist/summary/summaryCollection.d.ts +2 -3
  198. package/dist/summary/summaryCollection.d.ts.map +1 -1
  199. package/dist/summary/summaryCollection.js +12 -13
  200. package/dist/summary/summaryCollection.js.map +1 -1
  201. package/dist/summary/summaryFormat.d.ts +3 -0
  202. package/dist/summary/summaryFormat.d.ts.map +1 -1
  203. package/dist/summary/summaryFormat.js +6 -4
  204. package/dist/summary/summaryFormat.js.map +1 -1
  205. package/dist/summary/summaryGenerator.d.ts +10 -4
  206. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  207. package/dist/summary/summaryGenerator.js +106 -57
  208. package/dist/summary/summaryGenerator.js.map +1 -1
  209. package/dist/summary/summaryManager.d.ts +8 -8
  210. package/dist/summary/summaryManager.d.ts.map +1 -1
  211. package/dist/summary/summaryManager.js +38 -28
  212. package/dist/summary/summaryManager.js.map +1 -1
  213. package/lib/batchTracker.d.ts +3 -2
  214. package/lib/batchTracker.d.ts.map +1 -1
  215. package/lib/batchTracker.js +5 -4
  216. package/lib/batchTracker.js.map +1 -1
  217. package/lib/blobManager.d.ts +10 -16
  218. package/lib/blobManager.d.ts.map +1 -1
  219. package/lib/blobManager.js +159 -147
  220. package/lib/blobManager.js.map +1 -1
  221. package/lib/connectionTelemetry.d.ts.map +1 -1
  222. package/lib/connectionTelemetry.js +15 -6
  223. package/lib/connectionTelemetry.js.map +1 -1
  224. package/lib/containerRuntime.d.ts +161 -35
  225. package/lib/containerRuntime.d.ts.map +1 -1
  226. package/lib/containerRuntime.js +651 -402
  227. package/lib/containerRuntime.js.map +1 -1
  228. package/lib/dataStore.d.ts.map +1 -1
  229. package/lib/dataStore.js +13 -5
  230. package/lib/dataStore.js.map +1 -1
  231. package/lib/dataStoreContext.d.ts +3 -2
  232. package/lib/dataStoreContext.d.ts.map +1 -1
  233. package/lib/dataStoreContext.js +47 -51
  234. package/lib/dataStoreContext.js.map +1 -1
  235. package/lib/dataStoreContexts.d.ts +1 -2
  236. package/lib/dataStoreContexts.d.ts.map +1 -1
  237. package/lib/dataStoreContexts.js +3 -4
  238. package/lib/dataStoreContexts.js.map +1 -1
  239. package/lib/dataStoreRegistry.js +1 -1
  240. package/lib/dataStoreRegistry.js.map +1 -1
  241. package/lib/dataStores.d.ts +22 -6
  242. package/lib/dataStores.d.ts.map +1 -1
  243. package/lib/dataStores.js +107 -65
  244. package/lib/dataStores.js.map +1 -1
  245. package/lib/deltaManagerProxyBase.d.ts +35 -0
  246. package/lib/deltaManagerProxyBase.d.ts.map +1 -0
  247. package/lib/deltaManagerProxyBase.js +73 -0
  248. package/lib/deltaManagerProxyBase.js.map +1 -0
  249. package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
  250. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  251. package/lib/deltaManagerSummarizerProxy.js +3 -1
  252. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  253. package/lib/deltaScheduler.d.ts.map +1 -1
  254. package/lib/deltaScheduler.js +7 -7
  255. package/lib/deltaScheduler.js.map +1 -1
  256. package/lib/error.d.ts +14 -0
  257. package/lib/error.d.ts.map +1 -0
  258. package/lib/error.js +17 -0
  259. package/lib/error.js.map +1 -0
  260. package/lib/gc/garbageCollection.d.ts +10 -9
  261. package/lib/gc/garbageCollection.d.ts.map +1 -1
  262. package/lib/gc/garbageCollection.js +61 -53
  263. package/lib/gc/garbageCollection.js.map +1 -1
  264. package/lib/gc/gcConfigs.d.ts.map +1 -1
  265. package/lib/gc/gcConfigs.js +16 -12
  266. package/lib/gc/gcConfigs.js.map +1 -1
  267. package/lib/gc/gcDefinitions.d.ts +17 -4
  268. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  269. package/lib/gc/gcDefinitions.js +13 -14
  270. package/lib/gc/gcDefinitions.js.map +1 -1
  271. package/lib/gc/gcHelpers.d.ts +0 -8
  272. package/lib/gc/gcHelpers.d.ts.map +1 -1
  273. package/lib/gc/gcHelpers.js +5 -17
  274. package/lib/gc/gcHelpers.js.map +1 -1
  275. package/lib/gc/gcSummaryStateTracker.d.ts +4 -7
  276. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  277. package/lib/gc/gcSummaryStateTracker.js +20 -59
  278. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  279. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  280. package/lib/gc/gcTelemetry.js +46 -36
  281. package/lib/gc/gcTelemetry.js.map +1 -1
  282. package/lib/gc/gcUnreferencedStateTracker.js +1 -1
  283. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  284. package/lib/gc/index.d.ts +2 -2
  285. package/lib/gc/index.d.ts.map +1 -1
  286. package/lib/gc/index.js +2 -2
  287. package/lib/gc/index.js.map +1 -1
  288. package/lib/id-compressor/appendOnlySortedMap.d.ts +8 -30
  289. package/lib/id-compressor/appendOnlySortedMap.d.ts.map +1 -1
  290. package/lib/id-compressor/appendOnlySortedMap.js +25 -66
  291. package/lib/id-compressor/appendOnlySortedMap.js.map +1 -1
  292. package/lib/id-compressor/finalSpace.d.ts +29 -0
  293. package/lib/id-compressor/finalSpace.d.ts.map +1 -0
  294. package/lib/id-compressor/finalSpace.js +58 -0
  295. package/lib/id-compressor/finalSpace.js.map +1 -0
  296. package/lib/id-compressor/idCompressor.d.ts +25 -250
  297. package/lib/id-compressor/idCompressor.d.ts.map +1 -1
  298. package/lib/id-compressor/idCompressor.js +385 -1142
  299. package/lib/id-compressor/idCompressor.js.map +1 -1
  300. package/lib/id-compressor/identifiers.d.ts +32 -0
  301. package/lib/id-compressor/identifiers.d.ts.map +1 -0
  302. package/lib/id-compressor/identifiers.js +11 -0
  303. package/lib/id-compressor/identifiers.js.map +1 -0
  304. package/lib/id-compressor/index.d.ts +5 -6
  305. package/lib/id-compressor/index.d.ts.map +1 -1
  306. package/lib/id-compressor/index.js +5 -6
  307. package/lib/id-compressor/index.js.map +1 -1
  308. package/lib/id-compressor/persistanceUtilities.d.ts +22 -0
  309. package/lib/id-compressor/persistanceUtilities.d.ts.map +1 -0
  310. package/lib/id-compressor/persistanceUtilities.js +34 -0
  311. package/lib/id-compressor/persistanceUtilities.js.map +1 -0
  312. package/lib/id-compressor/sessionSpaceNormalizer.d.ts +46 -0
  313. package/lib/id-compressor/sessionSpaceNormalizer.d.ts.map +1 -0
  314. package/lib/id-compressor/sessionSpaceNormalizer.js +76 -0
  315. package/lib/id-compressor/sessionSpaceNormalizer.js.map +1 -0
  316. package/lib/id-compressor/sessions.d.ts +115 -0
  317. package/lib/id-compressor/sessions.d.ts.map +1 -0
  318. package/lib/id-compressor/sessions.js +290 -0
  319. package/lib/id-compressor/sessions.js.map +1 -0
  320. package/lib/id-compressor/utilities.d.ts +49 -0
  321. package/lib/id-compressor/utilities.d.ts.map +1 -0
  322. package/lib/id-compressor/utilities.js +148 -0
  323. package/lib/id-compressor/utilities.js.map +1 -0
  324. package/lib/index.d.ts +3 -3
  325. package/lib/index.d.ts.map +1 -1
  326. package/lib/index.js +2 -2
  327. package/lib/index.js.map +1 -1
  328. package/lib/opLifecycle/batchManager.js +10 -6
  329. package/lib/opLifecycle/batchManager.js.map +1 -1
  330. package/lib/opLifecycle/opCompressor.d.ts +2 -2
  331. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  332. package/lib/opLifecycle/opCompressor.js +10 -5
  333. package/lib/opLifecycle/opCompressor.js.map +1 -1
  334. package/lib/opLifecycle/opDecompressor.d.ts +2 -2
  335. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  336. package/lib/opLifecycle/opDecompressor.js +15 -12
  337. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  338. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  339. package/lib/opLifecycle/opGroupingManager.js +17 -7
  340. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  341. package/lib/opLifecycle/opSplitter.d.ts +2 -2
  342. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  343. package/lib/opLifecycle/opSplitter.js +13 -10
  344. package/lib/opLifecycle/opSplitter.js.map +1 -1
  345. package/lib/opLifecycle/outbox.d.ts +7 -5
  346. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  347. package/lib/opLifecycle/outbox.js +13 -22
  348. package/lib/opLifecycle/outbox.js.map +1 -1
  349. package/lib/opLifecycle/remoteMessageProcessor.d.ts +6 -1
  350. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  351. package/lib/opLifecycle/remoteMessageProcessor.js +20 -8
  352. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  353. package/lib/opProperties.js +1 -2
  354. package/lib/opProperties.js.map +1 -1
  355. package/lib/packageVersion.d.ts +1 -1
  356. package/lib/packageVersion.js +1 -1
  357. package/lib/packageVersion.js.map +1 -1
  358. package/lib/pendingStateManager.d.ts +18 -8
  359. package/lib/pendingStateManager.d.ts.map +1 -1
  360. package/lib/pendingStateManager.js +62 -40
  361. package/lib/pendingStateManager.js.map +1 -1
  362. package/lib/scheduleManager.d.ts.map +1 -1
  363. package/lib/scheduleManager.js +18 -14
  364. package/lib/scheduleManager.js.map +1 -1
  365. package/lib/summary/index.d.ts +3 -3
  366. package/lib/summary/index.d.ts.map +1 -1
  367. package/lib/summary/index.js +1 -1
  368. package/lib/summary/index.js.map +1 -1
  369. package/lib/summary/orderedClientElection.d.ts +3 -3
  370. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  371. package/lib/summary/orderedClientElection.js +21 -22
  372. package/lib/summary/orderedClientElection.js.map +1 -1
  373. package/lib/summary/runWhileConnectedCoordinator.js +1 -1
  374. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  375. package/lib/summary/runningSummarizer.d.ts +31 -10
  376. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  377. package/lib/summary/runningSummarizer.js +265 -133
  378. package/lib/summary/runningSummarizer.js.map +1 -1
  379. package/lib/summary/summarizer.d.ts +8 -7
  380. package/lib/summary/summarizer.d.ts.map +1 -1
  381. package/lib/summary/summarizer.js +75 -74
  382. package/lib/summary/summarizer.js.map +1 -1
  383. package/lib/summary/summarizerClientElection.d.ts +2 -2
  384. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  385. package/lib/summary/summarizerClientElection.js +6 -10
  386. package/lib/summary/summarizerClientElection.js.map +1 -1
  387. package/lib/summary/summarizerHeuristics.js +9 -13
  388. package/lib/summary/summarizerHeuristics.js.map +1 -1
  389. package/lib/summary/summarizerNode/index.d.ts +1 -1
  390. package/lib/summary/summarizerNode/index.d.ts.map +1 -1
  391. package/lib/summary/summarizerNode/index.js.map +1 -1
  392. package/lib/summary/summarizerNode/summarizerNode.d.ts +10 -19
  393. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  394. package/lib/summary/summarizerNode/summarizerNode.js +42 -115
  395. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  396. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +6 -30
  397. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  398. package/lib/summary/summarizerNode/summarizerNodeUtils.js +2 -4
  399. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  400. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -14
  401. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  402. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +14 -100
  403. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  404. package/lib/summary/summarizerTypes.d.ts +38 -25
  405. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  406. package/lib/summary/summarizerTypes.js.map +1 -1
  407. package/lib/summary/summaryCollection.d.ts +2 -3
  408. package/lib/summary/summaryCollection.d.ts.map +1 -1
  409. package/lib/summary/summaryCollection.js +5 -6
  410. package/lib/summary/summaryCollection.js.map +1 -1
  411. package/lib/summary/summaryFormat.d.ts +3 -0
  412. package/lib/summary/summaryFormat.d.ts.map +1 -1
  413. package/lib/summary/summaryFormat.js +5 -3
  414. package/lib/summary/summaryFormat.js.map +1 -1
  415. package/lib/summary/summaryGenerator.d.ts +10 -4
  416. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  417. package/lib/summary/summaryGenerator.js +100 -51
  418. package/lib/summary/summaryGenerator.js.map +1 -1
  419. package/lib/summary/summaryManager.d.ts +8 -8
  420. package/lib/summary/summaryManager.d.ts.map +1 -1
  421. package/lib/summary/summaryManager.js +35 -25
  422. package/lib/summary/summaryManager.js.map +1 -1
  423. package/package.json +28 -31
  424. package/src/batchTracker.ts +7 -5
  425. package/src/blobManager.ts +188 -166
  426. package/src/connectionTelemetry.ts +9 -4
  427. package/src/containerRuntime.ts +806 -441
  428. package/src/dataStore.ts +12 -4
  429. package/src/dataStoreContext.ts +39 -43
  430. package/src/dataStoreContexts.ts +4 -6
  431. package/src/dataStoreRegistry.ts +1 -1
  432. package/src/dataStores.ts +114 -80
  433. package/src/deltaManagerProxyBase.ts +111 -0
  434. package/src/deltaManagerSummarizerProxy.ts +4 -1
  435. package/src/deltaScheduler.ts +7 -11
  436. package/src/error.ts +18 -0
  437. package/src/gc/garbageCollection.md +53 -5
  438. package/src/gc/garbageCollection.ts +58 -52
  439. package/src/gc/gcConfigs.ts +4 -2
  440. package/src/gc/gcDefinitions.ts +17 -20
  441. package/src/gc/gcEarlyAdoption.md +145 -0
  442. package/src/gc/gcHelpers.ts +1 -12
  443. package/src/gc/gcSummaryStateTracker.ts +19 -65
  444. package/src/gc/gcTelemetry.ts +14 -12
  445. package/src/gc/gcUnreferencedStateTracker.ts +1 -1
  446. package/src/gc/index.ts +2 -4
  447. package/src/id-compressor/appendOnlySortedMap.ts +26 -87
  448. package/src/id-compressor/finalSpace.ts +67 -0
  449. package/src/id-compressor/idCompressor.ts +458 -1682
  450. package/src/id-compressor/identifiers.ts +42 -0
  451. package/src/id-compressor/index.ts +11 -20
  452. package/src/id-compressor/persistanceUtilities.ts +58 -0
  453. package/src/id-compressor/sessionSpaceNormalizer.ts +83 -0
  454. package/src/id-compressor/sessions.ts +405 -0
  455. package/src/id-compressor/utilities.ts +187 -0
  456. package/src/index.ts +7 -2
  457. package/src/opLifecycle/opCompressor.ts +6 -5
  458. package/src/opLifecycle/opDecompressor.ts +6 -4
  459. package/src/opLifecycle/opGroupingManager.ts +9 -6
  460. package/src/opLifecycle/opSplitter.ts +7 -6
  461. package/src/opLifecycle/outbox.ts +23 -32
  462. package/src/opLifecycle/remoteMessageProcessor.ts +27 -8
  463. package/src/packageVersion.ts +1 -1
  464. package/src/pendingStateManager.ts +72 -42
  465. package/src/scheduleManager.ts +7 -5
  466. package/src/summary/index.ts +4 -3
  467. package/src/summary/orderedClientElection.ts +10 -6
  468. package/src/summary/runWhileConnectedCoordinator.ts +1 -1
  469. package/src/summary/runningSummarizer.ts +291 -163
  470. package/src/summary/summarizer.ts +27 -16
  471. package/src/summary/summarizerClientElection.ts +2 -2
  472. package/src/summary/summarizerHeuristics.ts +1 -1
  473. package/src/summary/summarizerNode/index.ts +1 -2
  474. package/src/summary/summarizerNode/summarizerNode.ts +36 -160
  475. package/src/summary/summarizerNode/summarizerNodeUtils.ts +7 -38
  476. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +11 -130
  477. package/src/summary/summarizerTypes.ts +40 -25
  478. package/src/summary/summaryCollection.ts +3 -3
  479. package/src/summary/summaryFormat.ts +4 -1
  480. package/src/summary/summaryGenerator.ts +52 -52
  481. package/src/summary/summaryManager.ts +44 -17
  482. package/dist/id-compressor/idRange.d.ts +0 -11
  483. package/dist/id-compressor/idRange.d.ts.map +0 -1
  484. package/dist/id-compressor/idRange.js +0 -29
  485. package/dist/id-compressor/idRange.js.map +0 -1
  486. package/dist/id-compressor/numericUuid.d.ts +0 -59
  487. package/dist/id-compressor/numericUuid.d.ts.map +0 -1
  488. package/dist/id-compressor/numericUuid.js +0 -325
  489. package/dist/id-compressor/numericUuid.js.map +0 -1
  490. package/dist/id-compressor/sessionIdNormalizer.d.ts +0 -138
  491. package/dist/id-compressor/sessionIdNormalizer.d.ts.map +0 -1
  492. package/dist/id-compressor/sessionIdNormalizer.js +0 -488
  493. package/dist/id-compressor/sessionIdNormalizer.js.map +0 -1
  494. package/dist/id-compressor/utils.d.ts +0 -57
  495. package/dist/id-compressor/utils.d.ts.map +0 -1
  496. package/dist/id-compressor/utils.js +0 -90
  497. package/dist/id-compressor/utils.js.map +0 -1
  498. package/dist/id-compressor/uuidUtilities.d.ts +0 -28
  499. package/dist/id-compressor/uuidUtilities.d.ts.map +0 -1
  500. package/dist/id-compressor/uuidUtilities.js +0 -104
  501. package/dist/id-compressor/uuidUtilities.js.map +0 -1
  502. package/lib/id-compressor/idRange.d.ts +0 -11
  503. package/lib/id-compressor/idRange.d.ts.map +0 -1
  504. package/lib/id-compressor/idRange.js +0 -25
  505. package/lib/id-compressor/idRange.js.map +0 -1
  506. package/lib/id-compressor/numericUuid.d.ts +0 -59
  507. package/lib/id-compressor/numericUuid.d.ts.map +0 -1
  508. package/lib/id-compressor/numericUuid.js +0 -315
  509. package/lib/id-compressor/numericUuid.js.map +0 -1
  510. package/lib/id-compressor/sessionIdNormalizer.d.ts +0 -138
  511. package/lib/id-compressor/sessionIdNormalizer.d.ts.map +0 -1
  512. package/lib/id-compressor/sessionIdNormalizer.js +0 -484
  513. package/lib/id-compressor/sessionIdNormalizer.js.map +0 -1
  514. package/lib/id-compressor/utils.d.ts +0 -57
  515. package/lib/id-compressor/utils.d.ts.map +0 -1
  516. package/lib/id-compressor/utils.js +0 -79
  517. package/lib/id-compressor/utils.js.map +0 -1
  518. package/lib/id-compressor/uuidUtilities.d.ts +0 -28
  519. package/lib/id-compressor/uuidUtilities.d.ts.map +0 -1
  520. package/lib/id-compressor/uuidUtilities.js +0 -96
  521. package/lib/id-compressor/uuidUtilities.js.map +0 -1
  522. package/src/id-compressor/idRange.ts +0 -35
  523. package/src/id-compressor/numericUuid.ts +0 -383
  524. package/src/id-compressor/sessionIdNormalizer.ts +0 -609
  525. package/src/id-compressor/utils.ts +0 -114
  526. package/src/id-compressor/uuidUtilities.ts +0 -120
@@ -3,30 +3,27 @@
3
3
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
4
  * Licensed under the MIT License.
5
5
  */
6
- var __rest = (this && this.__rest) || function (s, e) {
7
- var t = {};
8
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
9
- t[p] = s[p];
10
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
11
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
12
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
13
- t[p[i]] = s[p[i]];
14
- }
15
- return t;
16
- };
17
6
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.RunningSummarizer = void 0;
7
+ exports.RunningSummarizer = exports.defaultMaxAttemptsForSubmitFailures = exports.defaultMaxAttempts = void 0;
19
8
  const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
20
- const common_utils_1 = require("@fluidframework/common-utils");
21
- const container_utils_1 = require("@fluidframework/container-utils");
9
+ const core_utils_1 = require("@fluidframework/core-utils");
10
+ const client_utils_1 = require("@fluid-internal/client-utils");
22
11
  const driver_definitions_1 = require("@fluidframework/driver-definitions");
23
- const driver_utils_1 = require("@fluidframework/driver-utils");
24
12
  const protocol_definitions_1 = require("@fluidframework/protocol-definitions");
25
13
  const opProperties_1 = require("../opProperties");
26
14
  const summarizerHeuristics_1 = require("./summarizerHeuristics");
27
15
  const summaryGenerator_1 = require("./summaryGenerator");
28
16
  const maxSummarizeAckWaitTime = 10 * 60 * 1000; // 10 minutes
29
- const defaultNumberSummarizationAttempts = 2; // only up to 2 attempts
17
+ /**
18
+ * The maximum number of summarization attempts that will be done by default in case of failures
19
+ * that can be retried.
20
+ */
21
+ exports.defaultMaxAttempts = 2;
22
+ /**
23
+ * The default value for maximum number of summarization attempts that will be done for summarization failures where
24
+ * submit fails and the failure can be retried.
25
+ */
26
+ exports.defaultMaxAttemptsForSubmitFailures = 5;
30
27
  /**
31
28
  * An instance of RunningSummarizer manages the heuristics for summarizing.
32
29
  * Until disposed, the instance of RunningSummarizer can assume that it is
@@ -34,8 +31,9 @@ const defaultNumberSummarizationAttempts = 2; // only up to 2 attempts
34
31
  * track of summaries that it is generating as they are broadcast and acked/nacked.
35
32
  * This object is created and controlled by Summarizer object.
36
33
  */
37
- class RunningSummarizer {
34
+ class RunningSummarizer extends client_utils_1.TypedEventEmitter {
38
35
  constructor(baseLogger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime) {
36
+ super();
39
37
  this.summaryWatcher = summaryWatcher;
40
38
  this.configuration = configuration;
41
39
  this.submitSummaryCallback = submitSummaryCallback;
@@ -66,18 +64,22 @@ class RunningSummarizer {
66
64
  summarizeCount: () => this.summarizeCount,
67
65
  summarizerSuccessfulAttempts: () => this.totalSuccessfulAttempts,
68
66
  };
69
- this.mc = (0, telemetry_utils_1.loggerToMonitoringContext)(telemetry_utils_1.ChildLogger.create(baseLogger, "Running", {
70
- all: telemetryProps,
71
- }));
67
+ this.mc = (0, telemetry_utils_1.createChildMonitoringContext)({
68
+ logger: baseLogger,
69
+ namespace: "Running",
70
+ properties: {
71
+ all: telemetryProps,
72
+ },
73
+ });
72
74
  if (configuration.state !== "disableHeuristics") {
73
- (0, common_utils_1.assert)(this.configuration.state === "enabled", 0x2ea /* "Configuration state should be enabled" */);
75
+ (0, core_utils_1.assert)(this.configuration.state === "enabled", 0x2ea /* "Configuration state should be enabled" */);
74
76
  this.heuristicRunner = new summarizerHeuristics_1.SummarizeHeuristicRunner(heuristicData, this.configuration, (reason) => this.trySummarize(reason), this.mc.logger);
75
77
  }
76
- (0, common_utils_1.assert)(this.configuration.state !== "disabled", 0x2eb /* "Summary not supported with configuration disabled" */);
78
+ (0, core_utils_1.assert)(this.configuration.state !== "disabled", 0x2eb /* "Summary not supported with configuration disabled" */);
77
79
  // Cap the maximum amount of time client will wait for a summarize op ack to maxSummarizeAckWaitTime
78
80
  // configuration.maxAckWaitTime is composed from defaults, server values, and runtime overrides
79
81
  const maxAckWaitTime = Math.min(this.configuration.maxAckWaitTime, maxSummarizeAckWaitTime);
80
- this.pendingAckTimer = new common_utils_1.PromiseTimer(maxAckWaitTime, () => {
82
+ this.pendingAckTimer = new core_utils_1.PromiseTimer(maxAckWaitTime, () => {
81
83
  // Note: summarizeCount (from ChildLogger definition) may be 0,
82
84
  // since this code path is hit when RunningSummarizer first starts up,
83
85
  // before this instance has kicked off a new summarize run.
@@ -104,26 +106,21 @@ class RunningSummarizer {
104
106
  this.generator = new summaryGenerator_1.SummaryGenerator(this.pendingAckTimer, this.heuristicData, this.submitSummaryCallback, () => {
105
107
  this.totalSuccessfulAttempts++;
106
108
  }, this.summaryWatcher, this.mc.logger);
107
- // Listen to deltaManager for non-runtime ops
108
- this.deltaManagerListener = (op) => {
109
- if (!(0, driver_utils_1.isRuntimeMessage)(op)) {
110
- this.handleOp(op, false);
111
- }
112
- };
113
- // Listen to runtime for runtime ops
109
+ // Listen to runtime for ops
114
110
  this.runtimeListener = (op, runtimeMessage) => {
115
- if (runtimeMessage) {
116
- this.handleOp(op, true);
117
- }
111
+ this.handleOp(op, runtimeMessage === true);
118
112
  };
119
- // Purpose of listening to deltaManager is for back-compat
120
- // Can remove and only listen to runtime once loader version is past 2.0.0-internal.1.2.0 (https://github.com/microsoft/FluidFramework/pull/11832)
121
- // Tracked by AB#3883
122
- this.runtime.deltaManager.on("op", this.deltaManagerListener);
123
113
  this.runtime.on("op", this.runtimeListener);
114
+ // The max attempts for submit failures can be overridden via a feature flag. This allows us to
115
+ // tweak this as per telemetry data until we arrive at a stable number.
116
+ // If its set to a number higher than `defaultMaxAttemptsForSubmitFailures`, it will be ignored.
117
+ const overrideMaxAttempts = this.mc.config.getNumber("Fluid.Summarizer.AttemptsForSubmitFailures");
118
+ this.maxAttemptsForSubmitFailures =
119
+ overrideMaxAttempts && overrideMaxAttempts < exports.defaultMaxAttemptsForSubmitFailures
120
+ ? overrideMaxAttempts
121
+ : exports.defaultMaxAttemptsForSubmitFailures;
124
122
  }
125
123
  static async start(logger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime) {
126
- var _a, _b;
127
124
  const summarizer = new RunningSummarizer(logger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime);
128
125
  // Before doing any heuristics or proceeding with its refreshing, if there is a summary ack received while
129
126
  // this summarizer catches up, let's refresh state before proceeding with the summarization.
@@ -132,7 +129,7 @@ class RunningSummarizer {
132
129
  // Handle summary acks asynchronously
133
130
  // Note: no exceptions are thrown from processIncomingSummaryAcks handler as it handles all exceptions
134
131
  summarizer.processIncomingSummaryAcks(lastAckRefSeq).catch((error) => {
135
- logger.sendErrorEvent({ eventName: "HandleSummaryAckFatalError" }, error);
132
+ (0, telemetry_utils_1.createChildLogger)({ logger }).sendErrorEvent({ eventName: "HandleSummaryAckFatalError" }, error);
136
133
  });
137
134
  // Update heuristic counts
138
135
  // By the time we get here, there are potentially ops missing from the heuristic summary counts
@@ -153,21 +150,20 @@ class RunningSummarizer {
153
150
  // Update last seq number (in case the handlers haven't processed anything yet)
154
151
  heuristicData.lastOpSequenceNumber = runtime.deltaManager.lastSequenceNumber;
155
152
  // Start heuristics
156
- (_a = summarizer.heuristicRunner) === null || _a === void 0 ? void 0 : _a.start();
157
- (_b = summarizer.heuristicRunner) === null || _b === void 0 ? void 0 : _b.run();
153
+ summarizer.heuristicRunner?.start();
154
+ summarizer.heuristicRunner?.run();
158
155
  return summarizer;
159
156
  }
160
157
  get disposed() {
161
158
  return this._disposed;
162
159
  }
163
160
  async handleSummaryAck() {
164
- var _a;
165
161
  const lastAck = this.summaryCollection.latestAck;
166
162
  let refSequenceNumber = -1;
167
163
  // In case we haven't received the lastestAck yet, just return.
168
164
  if (lastAck !== undefined) {
169
165
  refSequenceNumber = lastAck.summaryOp.referenceSequenceNumber;
170
- const summaryLogger = (_a = this.tryGetCorrelatedLogger(refSequenceNumber)) !== null && _a !== void 0 ? _a : this.mc.logger;
166
+ const summaryLogger = this.tryGetCorrelatedLogger(refSequenceNumber) ?? this.mc.logger;
171
167
  const summaryOpHandle = lastAck.summaryOp.contents.handle;
172
168
  const summaryAckHandle = lastAck.summaryAck.contents.handle;
173
169
  while (this.summarizingLock !== undefined) {
@@ -195,7 +191,7 @@ class RunningSummarizer {
195
191
  // code in `submitSummary` function in container runtime, will refresh the latest state
196
192
  // by calling `refreshLatestSummaryAckFromServer` and we will be fine.
197
193
  const isIgnoredError = (0, telemetry_utils_1.isFluidError)(error) &&
198
- error.errorType === driver_definitions_1.DriverErrorType.fileNotFoundOrAccessDeniedError;
194
+ error.errorType === driver_definitions_1.DriverErrorTypes.fileNotFoundOrAccessDeniedError;
199
195
  summaryLogger.sendTelemetryEvent({
200
196
  eventName: isIgnoredError
201
197
  ? "HandleSummaryAckErrorIgnored"
@@ -218,10 +214,9 @@ class RunningSummarizer {
218
214
  * and, in case of a positive one, it will wait for a summary ack that is greater than this current reference sequence number.
219
215
  */
220
216
  async processIncomingSummaryAcks(lastAckRefSeq) {
221
- var _a;
222
217
  let refSequenceNumber = lastAckRefSeq > 0 ? lastAckRefSeq : this.runtime.deltaManager.initialSequenceNumber;
223
218
  while (!this.disposed) {
224
- const summaryLogger = (_a = this.tryGetCorrelatedLogger(refSequenceNumber)) !== null && _a !== void 0 ? _a : this.mc.logger;
219
+ const summaryLogger = this.tryGetCorrelatedLogger(refSequenceNumber) ?? this.mc.logger;
225
220
  // Initialize ack with undefined if exception happens inside of waitSummaryAck on second iteration,
226
221
  // we record undefined, not previous handles.
227
222
  await this.summaryCollection.waitSummaryAck(refSequenceNumber);
@@ -232,15 +227,13 @@ class RunningSummarizer {
232
227
  });
233
228
  refSequenceNumber = await this.handleSummaryAck();
234
229
  // A valid Summary Ack must have been processed.
235
- (0, common_utils_1.assert)(refSequenceNumber >= 0, 0x58f /* Invalid ref sequence number */);
230
+ (0, core_utils_1.assert)(refSequenceNumber >= 0, 0x58f /* Invalid ref sequence number */);
236
231
  }
237
232
  }
238
233
  dispose() {
239
- var _a;
240
- this.runtime.deltaManager.off("op", this.deltaManagerListener);
241
234
  this.runtime.off("op", this.runtimeListener);
242
235
  this.summaryWatcher.dispose();
243
- (_a = this.heuristicRunner) === null || _a === void 0 ? void 0 : _a.dispose();
236
+ this.heuristicRunner?.dispose();
244
237
  this.heuristicRunner = undefined;
245
238
  this.generator.dispose();
246
239
  this.pendingAckTimer.clear();
@@ -265,8 +258,7 @@ class RunningSummarizer {
265
258
  this.heuristicRunnerMicroTaskExists = true;
266
259
  Promise.resolve()
267
260
  .then(() => {
268
- var _a;
269
- (_a = this.heuristicRunner) === null || _a === void 0 ? void 0 : _a.run();
261
+ this.heuristicRunner?.run();
270
262
  })
271
263
  .finally(() => {
272
264
  this.heuristicRunnerMicroTaskExists = false;
@@ -297,18 +289,17 @@ class RunningSummarizer {
297
289
  this.configuration.nonRuntimeHeuristicThreshold <= opsSinceLastAck));
298
290
  }
299
291
  async waitStop(allowLastSummary) {
300
- var _a;
301
292
  if (this.stopping) {
302
293
  return;
303
294
  }
304
295
  this.stopping = true;
305
296
  this.disposeEnqueuedSummary();
306
297
  // This will try to run lastSummary if needed.
307
- if (allowLastSummary && ((_a = this.heuristicRunner) === null || _a === void 0 ? void 0 : _a.shouldRunLastSummary())) {
298
+ if (allowLastSummary && this.heuristicRunner?.shouldRunLastSummary()) {
308
299
  if (this.summarizingLock === undefined) {
309
300
  this.trySummarizeOnce(
310
301
  // summarizeProps
311
- { reason: "lastSummary" },
302
+ { summarizeReason: "lastSummary" },
312
303
  // ISummarizeOptions, using defaults: { refreshLatestAck: false, fullTree: false }
313
304
  {});
314
305
  }
@@ -341,13 +332,12 @@ class RunningSummarizer {
341
332
  this.summarizeCount++;
342
333
  }
343
334
  afterSummaryAction() {
344
- var _a;
345
335
  const retry = this.tryWhileSummarizing;
346
336
  this.tryWhileSummarizing = false;
347
337
  // After summarizing, we should check to see if we need to summarize again.
348
338
  // Rerun the heuristics and check for enqueued summaries.
349
339
  if (!this.stopping && !this.tryRunEnqueuedSummary() && retry) {
350
- (_a = this.heuristicRunner) === null || _a === void 0 ? void 0 : _a.run();
340
+ this.heuristicRunner?.run();
351
341
  }
352
342
  }
353
343
  /**
@@ -357,11 +347,11 @@ class RunningSummarizer {
357
347
  * @param before - set of instructions to run before running the action.
358
348
  * @param action - action to perform.
359
349
  * @param after - set of instructions to run after running the action.
360
- * @returns - result of action.
350
+ * @returns The result of the action.
361
351
  */
362
352
  async lockedSummaryAction(before, action, after) {
363
- (0, common_utils_1.assert)(this.summarizingLock === undefined, 0x25b /* "Caller is responsible for checking lock" */);
364
- const summarizingLock = new common_utils_1.Deferred();
353
+ (0, core_utils_1.assert)(this.summarizingLock === undefined, 0x25b /* "Caller is responsible for checking lock" */);
354
+ const summarizingLock = new core_utils_1.Deferred();
365
355
  this.summarizingLock = summarizingLock.promise;
366
356
  before();
367
357
  return action().finally(() => {
@@ -378,11 +368,20 @@ class RunningSummarizer {
378
368
  * @param resultsBuilder - optional, result builder to use.
379
369
  * @returns ISummarizeResult - result of running a summary.
380
370
  */
381
- trySummarizeOnce(summarizeProps, options, cancellationToken = this.cancellationToken, resultsBuilder = new summaryGenerator_1.SummarizeResultBuilder()) {
371
+ trySummarizeOnce(summarizeProps, options, resultsBuilder = new summaryGenerator_1.SummarizeResultBuilder()) {
382
372
  this.lockedSummaryAction(() => {
383
373
  this.beforeSummaryAction();
384
374
  }, async () => {
385
- const summarizeResult = this.generator.summarize(summarizeProps, options, cancellationToken, resultsBuilder);
375
+ const summaryLogger = (0, telemetry_utils_1.createChildLogger)({
376
+ logger: this.mc.logger,
377
+ properties: { all: summarizeProps },
378
+ });
379
+ const summaryOptions = {
380
+ ...options,
381
+ summaryLogger,
382
+ cancellationToken: this.cancellationToken,
383
+ };
384
+ const summarizeResult = this.generator.summarize(summaryOptions, resultsBuilder);
386
385
  // ensure we wait till the end of the process
387
386
  return summarizeResult.receivedSummaryAckOrNack;
388
387
  }, () => {
@@ -396,7 +395,7 @@ class RunningSummarizer {
396
395
  return resultsBuilder.build();
397
396
  }
398
397
  /** Heuristics summarize attempt. */
399
- trySummarize(reason, cancellationToken = this.cancellationToken) {
398
+ trySummarize(reason) {
400
399
  if (this.summarizingLock !== undefined) {
401
400
  // lockedSummaryAction() will retry heuristic-based summary at the end of current attempt
402
401
  // if it's still needed
@@ -406,79 +405,207 @@ class RunningSummarizer {
406
405
  this.lockedSummaryAction(() => {
407
406
  this.beforeSummaryAction();
408
407
  }, async () => {
409
- var _a;
410
- const attempts = [
411
- { refreshLatestAck: false, fullTree: false },
412
- { refreshLatestAck: true, fullTree: false },
413
- { refreshLatestAck: true, fullTree: false, delaySeconds: 2 * 60 },
414
- { refreshLatestAck: true, fullTree: true, delaySeconds: 10 * 60 },
415
- ];
416
- let overrideDelaySeconds;
417
- let summaryAttempts = 0;
418
- let summaryAttemptsPerPhase = 0;
419
- // Reducing the default number of attempts to defaultNumberofSummarizationAttempts.
420
- let totalAttempts = (_a = this.mc.config.getNumber("Fluid.Summarizer.Attempts")) !== null && _a !== void 0 ? _a : defaultNumberSummarizationAttempts;
421
- if (totalAttempts > attempts.length) {
422
- this.mc.logger.sendTelemetryEvent({
423
- eventName: "InvalidSummarizerAttempts",
424
- attempts: totalAttempts,
425
- });
426
- totalAttempts = defaultNumberSummarizationAttempts;
427
- }
428
- else if (totalAttempts < 1) {
429
- throw new container_utils_1.UsageError("Invalid number of attempts.");
430
- }
431
- let lastResult;
432
- for (let summaryAttemptPhase = 0; summaryAttemptPhase < totalAttempts;) {
433
- if (this.cancellationToken.cancelled) {
434
- return;
435
- }
436
- // We only want to attempt 1 summary when reason is "lastSummary"
437
- if (++summaryAttempts > 1 && reason === "lastSummary") {
438
- return;
439
- }
440
- summaryAttemptsPerPhase++;
441
- const _b = attempts[summaryAttemptPhase], { delaySeconds: regularDelaySeconds = 0 } = _b, options = __rest(_b, ["delaySeconds"]);
442
- const summarizeProps = Object.assign({ reason,
443
- summaryAttempts,
444
- summaryAttemptsPerPhase, summaryAttemptPhase: summaryAttemptPhase + 1 }, options);
445
- // Note: no need to account for cancellationToken.waitCancelled here, as
446
- // this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.
447
- const resultSummarize = this.generator.summarize(summarizeProps, options, cancellationToken);
448
- const result = await resultSummarize.receivedSummaryAckOrNack;
449
- if (result.success) {
450
- return;
451
- }
452
- // Check for retryDelay that can come from summaryNack or upload summary flow.
453
- // Retry the same step only once per retryAfter response.
454
- overrideDelaySeconds = result.retryAfterSeconds;
455
- if (overrideDelaySeconds === undefined || summaryAttemptsPerPhase > 1) {
456
- summaryAttemptPhase++;
457
- summaryAttemptsPerPhase = 0;
458
- }
459
- lastResult = result;
460
- const delaySeconds = overrideDelaySeconds !== null && overrideDelaySeconds !== void 0 ? overrideDelaySeconds : regularDelaySeconds;
461
- if (delaySeconds > 0) {
462
- this.mc.logger.sendPerformanceEvent(Object.assign({ eventName: "SummarizeAttemptDelay", duration: delaySeconds, summaryNackDelay: overrideDelaySeconds !== undefined }, summarizeProps));
463
- await (0, common_utils_1.delay)(delaySeconds * 1000);
464
- }
465
- }
466
- // If all attempts failed, log error (with last attempt info) and close the summarizer container
467
- this.mc.logger.sendErrorEvent({
468
- eventName: "FailToSummarize",
469
- reason,
470
- message: lastResult === null || lastResult === void 0 ? void 0 : lastResult.message,
471
- }, lastResult === null || lastResult === void 0 ? void 0 : lastResult.error);
472
- this.stopSummarizerCallback("failToSummarize");
408
+ return this.mc.config.getBoolean("Fluid.Summarizer.UseDynamicRetries")
409
+ ? this.trySummarizeWithRetries(reason)
410
+ : this.trySummarizeWithStaticAttempts(reason);
473
411
  }, () => {
474
412
  this.afterSummaryAction();
475
413
  }).catch((error) => {
476
414
  this.mc.logger.sendErrorEvent({ eventName: "UnexpectedSummarizeError" }, error);
477
415
  });
478
416
  }
417
+ /**
418
+ * Tries to summarize 2 times with pre-defined summary options. If an attempt fails with "retryAfterSeconds"
419
+ * param, that attempt is tried once more.
420
+ */
421
+ async trySummarizeWithStaticAttempts(reason) {
422
+ const attemptOptions = [
423
+ { refreshLatestAck: false, fullTree: false },
424
+ { refreshLatestAck: true, fullTree: false },
425
+ ];
426
+ let summaryAttempts = 0;
427
+ let summaryAttemptsPerPhase = 0;
428
+ let summaryAttemptPhase = 0;
429
+ while (summaryAttemptPhase < attemptOptions.length) {
430
+ if (this.cancellationToken.cancelled) {
431
+ return;
432
+ }
433
+ // We only want to attempt 1 summary when reason is "lastSummary"
434
+ if (++summaryAttempts > 1 && reason === "lastSummary") {
435
+ return;
436
+ }
437
+ summaryAttemptsPerPhase++;
438
+ const summarizeOptions = attemptOptions[summaryAttemptPhase];
439
+ const summarizeProps = {
440
+ summarizeReason: reason,
441
+ summaryAttempts,
442
+ summaryAttemptsPerPhase,
443
+ summaryAttemptPhase: summaryAttemptPhase + 1,
444
+ ...summarizeOptions,
445
+ };
446
+ const summaryLogger = (0, telemetry_utils_1.createChildLogger)({
447
+ logger: this.mc.logger,
448
+ properties: { all: summarizeProps },
449
+ });
450
+ const summaryOptions = {
451
+ ...summarizeOptions,
452
+ summaryLogger,
453
+ cancellationToken: this.cancellationToken,
454
+ };
455
+ // Note: no need to account for cancellationToken.waitCancelled here, as
456
+ // this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.
457
+ const resultSummarize = this.generator.summarize(summaryOptions);
458
+ const ackNackResult = await resultSummarize.receivedSummaryAckOrNack;
459
+ if (ackNackResult.success) {
460
+ return;
461
+ }
462
+ // Check for retryDelay that can come from summaryNack, upload summary or submit summary flows.
463
+ // Retry the same step only once per retryAfter response.
464
+ const submitResult = await resultSummarize.summarySubmitted;
465
+ const delaySeconds = !submitResult.success
466
+ ? submitResult.data?.retryAfterSeconds
467
+ : ackNackResult.data?.retryAfterSeconds;
468
+ if (delaySeconds === undefined || summaryAttemptsPerPhase > 1) {
469
+ summaryAttemptPhase++;
470
+ summaryAttemptsPerPhase = 0;
471
+ }
472
+ if (delaySeconds !== undefined) {
473
+ this.mc.logger.sendPerformanceEvent({
474
+ eventName: "SummarizeAttemptDelay",
475
+ duration: delaySeconds,
476
+ summaryNackDelay: ackNackResult.data?.retryAfterSeconds !== undefined,
477
+ ...summarizeProps,
478
+ });
479
+ await (0, core_utils_1.delay)(delaySeconds * 1000);
480
+ }
481
+ }
482
+ this.stopSummarizerCallback("failToSummarize");
483
+ }
484
+ /**
485
+ * Tries to summarize with retries where retry is based on the failure params.
486
+ * For example, summarization may be retried for failures with "retryAfterSeconds" param.
487
+ */
488
+ async trySummarizeWithRetries(reason) {
489
+ // Helper to set summarize options, telemetry properties and call summarize.
490
+ const attemptSummarize = (attemptNumber, finalAttempt) => {
491
+ const summarizeOptions = {
492
+ fullTree: false,
493
+ };
494
+ const summarizeProps = {
495
+ summarizeReason: reason,
496
+ summaryAttempts: attemptNumber,
497
+ ...summarizeOptions,
498
+ finalAttempt,
499
+ };
500
+ const summaryLogger = (0, telemetry_utils_1.createChildLogger)({
501
+ logger: this.mc.logger,
502
+ properties: { all: summarizeProps },
503
+ });
504
+ const summaryOptions = {
505
+ ...summarizeOptions,
506
+ summaryLogger,
507
+ cancellationToken: this.cancellationToken,
508
+ finalAttempt,
509
+ };
510
+ const summarizeResult = this.generator.summarize(summaryOptions);
511
+ return { summarizeProps, summarizeResult };
512
+ };
513
+ // The max number of attempts are based on the stage at which summarization failed. If it fails before it is
514
+ // submitted, a different value is used compared to if it fails after submission. Usually, in the former case,
515
+ // we would retry more often as its cheaper and retries are likely to succeed.
516
+ // This makes it harder to predict how many attempts would actually happen as that depends on how far an attempt
517
+ // made. To keep things simple, the max attempts is reset after every attempt based on where it failed. This may
518
+ // result in some failures not being retried depending on what happened before this attempt. That's fine because
519
+ // such scenarios are very unlikely and even if it happens, it would resolve when a new summarizer starts over.
520
+ // For example - When failure switches from one the submit failures to nack failure, only one more retry will
521
+ // happen irrespective of the value of `defaultMaxAttempts`.
522
+ let maxAttempts = exports.defaultMaxAttempts;
523
+ let currentAttempt = 0;
524
+ let retryAfterSeconds;
525
+ let done = false;
526
+ let result = "success";
527
+ do {
528
+ currentAttempt++;
529
+ if (this.cancellationToken.cancelled) {
530
+ result = "canceled";
531
+ done = true;
532
+ break;
533
+ }
534
+ const { summarizeProps, summarizeResult } = attemptSummarize(currentAttempt, false /* finalAttempt */);
535
+ // Ack / nack is the final step, so if it succeeds we're done.
536
+ const ackNackResult = await summarizeResult.receivedSummaryAckOrNack;
537
+ if (ackNackResult.success) {
538
+ result = "success";
539
+ done = true;
540
+ break;
541
+ }
542
+ // Update max attempts and retry params from the failure result.
543
+ // If submit summary failed, use the params from "summarySubmitted" result. Else, use the params
544
+ // from "receivedSummaryAckOrNack" result.
545
+ // Note: Check "summarySubmitted" result first because if it fails, ack nack would fail as well.
546
+ const submitSummaryResult = await summarizeResult.summarySubmitted;
547
+ if (!submitSummaryResult.success) {
548
+ maxAttempts = this.maxAttemptsForSubmitFailures;
549
+ retryAfterSeconds = submitSummaryResult.data?.retryAfterSeconds;
550
+ }
551
+ else {
552
+ maxAttempts = exports.defaultMaxAttempts;
553
+ retryAfterSeconds = ackNackResult.data?.retryAfterSeconds;
554
+ }
555
+ // Emit "summarize" event for this failed attempt.
556
+ result = "failure";
557
+ const eventProps = {
558
+ result,
559
+ currentAttempt,
560
+ maxAttempts,
561
+ error: ackNackResult.error,
562
+ };
563
+ this.emit("summarize", eventProps);
564
+ // If the failure doesn't have "retryAfterSeconds" or the max number of attempts have been done, we're done.
565
+ if (retryAfterSeconds === undefined || currentAttempt >= maxAttempts - 1) {
566
+ done = true;
567
+ }
568
+ // If the failure has "retryAfterSeconds", add a delay of that time. In this case, a final attempt will
569
+ // take place and we need to wait for "retryAfterSeconds" before that.
570
+ if (retryAfterSeconds !== undefined) {
571
+ this.mc.logger.sendPerformanceEvent({
572
+ eventName: "SummarizeAttemptDelay",
573
+ duration: retryAfterSeconds,
574
+ summaryNackDelay: ackNackResult.data?.retryAfterSeconds !== undefined,
575
+ stage: submitSummaryResult.data?.stage,
576
+ dynamicRetries: true,
577
+ ...summarizeProps,
578
+ });
579
+ await (0, core_utils_1.delay)(retryAfterSeconds * 1000);
580
+ }
581
+ } while (!done);
582
+ // If summarize attempt did not fail, emit "summarize" event and return. A failed attempt may be retried below.
583
+ if (result !== "failure") {
584
+ this.emit("summarize", { result, currentAttempt, maxAttempts });
585
+ return;
586
+ }
587
+ // If summarization wasn't successful above and the failure contains "retryAfterSeconds", perform one last
588
+ // attempt. This gives a chance to the runtime to perform additional steps in the last attempt.
589
+ if (retryAfterSeconds !== undefined) {
590
+ const { summarizeResult } = attemptSummarize(++currentAttempt, true /* finalAttempt */);
591
+ // Ack / nack is the final step, so if it succeeds we're done.
592
+ const ackNackResult = await summarizeResult.receivedSummaryAckOrNack;
593
+ result = ackNackResult.success ? "success" : "failure";
594
+ const eventProps = {
595
+ result,
596
+ currentAttempt,
597
+ maxAttempts,
598
+ error: ackNackResult.success ? undefined : ackNackResult.error,
599
+ };
600
+ this.emit("summarize", eventProps);
601
+ }
602
+ // If summarization is still unsuccessful, stop the summarizer.
603
+ if (result === "failure") {
604
+ this.stopSummarizerCallback("failToSummarize");
605
+ }
606
+ }
479
607
  /** {@inheritdoc (ISummarizer:interface).summarizeOnDemand} */
480
- summarizeOnDemand(resultsBuilder = new summaryGenerator_1.SummarizeResultBuilder(), _a) {
481
- var { reason } = _a, options = __rest(_a, ["reason"]);
608
+ summarizeOnDemand(options, resultsBuilder = new summaryGenerator_1.SummarizeResultBuilder()) {
482
609
  if (this.stopping) {
483
610
  resultsBuilder.fail("RunningSummarizer stopped or disposed", undefined);
484
611
  return resultsBuilder.build();
@@ -487,15 +614,15 @@ class RunningSummarizer {
487
614
  // return a promise that caller can await before trying again.
488
615
  if (this.summarizingLock !== undefined) {
489
616
  // The heuristics are blocking concurrent summarize attempts.
490
- throw new container_utils_1.UsageError("Attempted to run an already-running summarizer on demand");
617
+ throw new telemetry_utils_1.UsageError("Attempted to run an already-running summarizer on demand");
491
618
  }
492
- const result = this.trySummarizeOnce({ reason: `onDemand/${reason}` }, options, this.cancellationToken, resultsBuilder);
619
+ const { reason, ...summarizeOptions } = options;
620
+ const result = this.trySummarizeOnce({ summarizeReason: `onDemand/${reason}` }, summarizeOptions, resultsBuilder);
493
621
  return result;
494
622
  }
495
623
  /** {@inheritdoc (ISummarizer:interface).enqueueSummarize} */
496
- enqueueSummarize(_a) {
497
- var { reason, afterSequenceNumber = 0, override = false } = _a, options = __rest(_a, ["reason", "afterSequenceNumber", "override"]);
498
- const onDemandReason = `enqueue;${reason}`;
624
+ enqueueSummarize(options) {
625
+ const { reason, afterSequenceNumber = 0, override = false, ...summarizeOptions } = options;
499
626
  let overridden = false;
500
627
  if (this.enqueuedSummary !== undefined) {
501
628
  if (!override) {
@@ -507,15 +634,20 @@ class RunningSummarizer {
507
634
  overridden = true;
508
635
  }
509
636
  this.enqueuedSummary = {
510
- reason: onDemandReason,
637
+ reason: `enqueue;${reason}`,
511
638
  afterSequenceNumber,
512
- options,
639
+ summarizeOptions,
513
640
  resultsBuilder: new summaryGenerator_1.SummarizeResultBuilder(),
514
641
  };
515
642
  const results = this.enqueuedSummary.resultsBuilder.build();
516
643
  this.tryRunEnqueuedSummary();
517
644
  return overridden
518
- ? Object.assign(Object.assign({}, results), { alreadyEnqueued: true, overridden: true }) : results;
645
+ ? {
646
+ ...results,
647
+ alreadyEnqueued: true,
648
+ overridden: true,
649
+ }
650
+ : results;
519
651
  }
520
652
  tryRunEnqueuedSummary() {
521
653
  if (this.stopping) {
@@ -528,10 +660,10 @@ class RunningSummarizer {
528
660
  // If no enqueued summary is ready or a summary is already in progress, take no action.
529
661
  return false;
530
662
  }
531
- const { reason, resultsBuilder, options } = this.enqueuedSummary;
663
+ const { reason, resultsBuilder, summarizeOptions } = this.enqueuedSummary;
532
664
  // Set to undefined first, so that subsequent enqueue attempt while summarize will occur later.
533
665
  this.enqueuedSummary = undefined;
534
- this.trySummarizeOnce({ reason: `enqueuedSummary/${reason}` }, options, this.cancellationToken, resultsBuilder);
666
+ this.trySummarizeOnce({ summarizeReason: `enqueuedSummary/${reason}` }, summarizeOptions, resultsBuilder);
535
667
  return true;
536
668
  }
537
669
  disposeEnqueuedSummary() {