@fluidframework/container-runtime 2.0.0-rc.2.0.2 → 2.0.0-rc.3.0.0

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 (554) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/api-report/container-runtime.api.md +471 -52
  3. package/dist/batchTracker.d.ts +1 -1
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js +4 -4
  6. package/dist/batchTracker.js.map +1 -1
  7. package/dist/blobManager.d.ts +33 -30
  8. package/dist/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager.js +82 -107
  10. package/dist/blobManager.js.map +1 -1
  11. package/dist/channelCollection.d.ts +27 -22
  12. package/dist/channelCollection.d.ts.map +1 -1
  13. package/dist/channelCollection.js +155 -165
  14. package/dist/channelCollection.js.map +1 -1
  15. package/dist/connectionTelemetry.d.ts +3 -3
  16. package/dist/connectionTelemetry.d.ts.map +1 -1
  17. package/dist/connectionTelemetry.js +17 -17
  18. package/dist/connectionTelemetry.js.map +1 -1
  19. package/dist/containerHandleContext.d.ts.map +1 -1
  20. package/dist/containerHandleContext.js +2 -2
  21. package/dist/containerHandleContext.js.map +1 -1
  22. package/dist/containerRuntime.d.ts +42 -39
  23. package/dist/containerRuntime.d.ts.map +1 -1
  24. package/dist/containerRuntime.js +425 -292
  25. package/dist/containerRuntime.js.map +1 -1
  26. package/dist/dataStore.d.ts +1 -1
  27. package/dist/dataStore.d.ts.map +1 -1
  28. package/dist/dataStore.js +8 -8
  29. package/dist/dataStore.js.map +1 -1
  30. package/dist/dataStoreContext.d.ts +58 -19
  31. package/dist/dataStoreContext.d.ts.map +1 -1
  32. package/dist/dataStoreContext.js +169 -114
  33. package/dist/dataStoreContext.js.map +1 -1
  34. package/dist/dataStoreContexts.d.ts +1 -0
  35. package/dist/dataStoreContexts.d.ts.map +1 -1
  36. package/dist/dataStoreContexts.js +12 -11
  37. package/dist/dataStoreContexts.js.map +1 -1
  38. package/dist/dataStoreRegistry.d.ts +5 -1
  39. package/dist/dataStoreRegistry.d.ts.map +1 -1
  40. package/dist/dataStoreRegistry.js +4 -4
  41. package/dist/dataStoreRegistry.js.map +1 -1
  42. package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
  43. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  44. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  45. package/dist/deltaScheduler.d.ts +1 -1
  46. package/dist/deltaScheduler.d.ts.map +1 -1
  47. package/dist/deltaScheduler.js +6 -6
  48. package/dist/deltaScheduler.js.map +1 -1
  49. package/dist/error.d.ts +1 -1
  50. package/dist/error.d.ts.map +1 -1
  51. package/dist/error.js +4 -4
  52. package/dist/error.js.map +1 -1
  53. package/dist/gc/garbageCollection.d.ts +3 -2
  54. package/dist/gc/garbageCollection.d.ts.map +1 -1
  55. package/dist/gc/garbageCollection.js +23 -23
  56. package/dist/gc/garbageCollection.js.map +1 -1
  57. package/dist/gc/gcConfigs.d.ts +2 -2
  58. package/dist/gc/gcConfigs.d.ts.map +1 -1
  59. package/dist/gc/gcConfigs.js +4 -5
  60. package/dist/gc/gcConfigs.js.map +1 -1
  61. package/dist/gc/gcDefinitions.d.ts +4 -5
  62. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  63. package/dist/gc/gcDefinitions.js.map +1 -1
  64. package/dist/gc/gcHelpers.d.ts +5 -1
  65. package/dist/gc/gcHelpers.d.ts.map +1 -1
  66. package/dist/gc/gcHelpers.js +21 -12
  67. package/dist/gc/gcHelpers.js.map +1 -1
  68. package/dist/gc/gcSummaryStateTracker.d.ts +2 -2
  69. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  70. package/dist/gc/gcSummaryStateTracker.js +11 -11
  71. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  72. package/dist/gc/gcTelemetry.d.ts +2 -1
  73. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  74. package/dist/gc/gcTelemetry.js +11 -9
  75. package/dist/gc/gcTelemetry.js.map +1 -1
  76. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  77. package/dist/gc/gcUnreferencedStateTracker.js +6 -6
  78. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  79. package/dist/gc/index.d.ts +1 -1
  80. package/dist/gc/index.d.ts.map +1 -1
  81. package/dist/gc/index.js +2 -1
  82. package/dist/gc/index.js.map +1 -1
  83. package/dist/index.d.ts +5 -2
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +12 -2
  86. package/dist/index.js.map +1 -1
  87. package/dist/legacy.d.ts +91 -0
  88. package/dist/messageTypes.d.ts +11 -5
  89. package/dist/messageTypes.d.ts.map +1 -1
  90. package/dist/messageTypes.js +4 -0
  91. package/dist/messageTypes.js.map +1 -1
  92. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  93. package/dist/opLifecycle/batchManager.js.map +1 -1
  94. package/dist/opLifecycle/definitions.d.ts +2 -20
  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.map +1 -1
  102. package/dist/opLifecycle/opCompressor.js +5 -6
  103. package/dist/opLifecycle/opCompressor.js.map +1 -1
  104. package/dist/opLifecycle/opDecompressor.d.ts +15 -4
  105. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  106. package/dist/opLifecycle/opDecompressor.js +62 -63
  107. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  108. package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
  109. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  110. package/dist/opLifecycle/opGroupingManager.js +14 -16
  111. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  112. package/dist/opLifecycle/opSplitter.d.ts +12 -4
  113. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  114. package/dist/opLifecycle/opSplitter.js +63 -53
  115. package/dist/opLifecycle/opSplitter.js.map +1 -1
  116. package/dist/opLifecycle/outbox.d.ts +2 -1
  117. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  118. package/dist/opLifecycle/outbox.js +30 -29
  119. package/dist/opLifecycle/outbox.js.map +1 -1
  120. package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  121. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  122. package/dist/opLifecycle/remoteMessageProcessor.js +36 -32
  123. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  124. package/dist/packageVersion.d.ts +1 -1
  125. package/dist/packageVersion.js +1 -1
  126. package/dist/packageVersion.js.map +1 -1
  127. package/dist/pendingStateManager.d.ts +1 -1
  128. package/dist/pendingStateManager.d.ts.map +1 -1
  129. package/dist/pendingStateManager.js +18 -18
  130. package/dist/pendingStateManager.js.map +1 -1
  131. package/dist/public.d.ts +12 -0
  132. package/dist/scheduleManager.d.ts +1 -1
  133. package/dist/scheduleManager.d.ts.map +1 -1
  134. package/dist/scheduleManager.js +28 -24
  135. package/dist/scheduleManager.js.map +1 -1
  136. package/dist/storageServiceWithAttachBlobs.d.ts +2 -2
  137. package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -1
  138. package/dist/storageServiceWithAttachBlobs.js +2 -2
  139. package/dist/storageServiceWithAttachBlobs.js.map +1 -1
  140. package/dist/summary/documentSchema.d.ts +209 -0
  141. package/dist/summary/documentSchema.d.ts.map +1 -0
  142. package/dist/summary/documentSchema.js +390 -0
  143. package/dist/summary/documentSchema.js.map +1 -0
  144. package/dist/summary/index.d.ts +2 -1
  145. package/dist/summary/index.d.ts.map +1 -1
  146. package/dist/summary/index.js +4 -1
  147. package/dist/summary/index.js.map +1 -1
  148. package/dist/summary/orderedClientElection.d.ts +2 -2
  149. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  150. package/dist/summary/orderedClientElection.js +12 -7
  151. package/dist/summary/orderedClientElection.js.map +1 -1
  152. package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
  153. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  154. package/dist/summary/runWhileConnectedCoordinator.js +3 -3
  155. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  156. package/dist/summary/runningSummarizer.d.ts +3 -3
  157. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  158. package/dist/summary/runningSummarizer.js +16 -16
  159. package/dist/summary/runningSummarizer.js.map +1 -1
  160. package/dist/summary/summarizer.d.ts +3 -2
  161. package/dist/summary/summarizer.d.ts.map +1 -1
  162. package/dist/summary/summarizer.js +13 -13
  163. package/dist/summary/summarizer.js.map +1 -1
  164. package/dist/summary/summarizerClientElection.d.ts +2 -2
  165. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  166. package/dist/summary/summarizerClientElection.js.map +1 -1
  167. package/dist/summary/summarizerHeuristics.d.ts +1 -1
  168. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  169. package/dist/summary/summarizerHeuristics.js +2 -2
  170. package/dist/summary/summarizerHeuristics.js.map +1 -1
  171. package/dist/summary/summarizerNode/summarizerNode.d.ts +3 -2
  172. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  173. package/dist/summary/summarizerNode/summarizerNode.js +28 -28
  174. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  175. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  176. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  177. package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
  178. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  179. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  180. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  181. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +14 -14
  182. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  183. package/dist/summary/summarizerTypes.d.ts +5 -3
  184. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  185. package/dist/summary/summarizerTypes.js.map +1 -1
  186. package/dist/summary/summaryCollection.d.ts +2 -2
  187. package/dist/summary/summaryCollection.d.ts.map +1 -1
  188. package/dist/summary/summaryCollection.js +7 -7
  189. package/dist/summary/summaryCollection.js.map +1 -1
  190. package/dist/summary/summaryFormat.d.ts +6 -17
  191. package/dist/summary/summaryFormat.d.ts.map +1 -1
  192. package/dist/summary/summaryFormat.js +8 -8
  193. package/dist/summary/summaryFormat.js.map +1 -1
  194. package/dist/summary/summaryGenerator.d.ts +4 -3
  195. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  196. package/dist/summary/summaryGenerator.js +17 -17
  197. package/dist/summary/summaryGenerator.js.map +1 -1
  198. package/dist/summary/summaryManager.d.ts +1 -1
  199. package/dist/summary/summaryManager.d.ts.map +1 -1
  200. package/dist/summary/summaryManager.js +15 -14
  201. package/dist/summary/summaryManager.js.map +1 -1
  202. package/internal.d.ts +11 -0
  203. package/legacy.d.ts +11 -0
  204. package/lib/batchTracker.d.ts +1 -1
  205. package/lib/batchTracker.d.ts.map +1 -1
  206. package/lib/batchTracker.js +2 -2
  207. package/lib/batchTracker.js.map +1 -1
  208. package/lib/blobManager.d.ts +33 -30
  209. package/lib/blobManager.d.ts.map +1 -1
  210. package/lib/blobManager.js +48 -73
  211. package/lib/blobManager.js.map +1 -1
  212. package/lib/channelCollection.d.ts +27 -22
  213. package/lib/channelCollection.d.ts.map +1 -1
  214. package/lib/channelCollection.js +96 -106
  215. package/lib/channelCollection.js.map +1 -1
  216. package/lib/connectionTelemetry.d.ts +3 -3
  217. package/lib/connectionTelemetry.d.ts.map +1 -1
  218. package/lib/connectionTelemetry.js +3 -3
  219. package/lib/connectionTelemetry.js.map +1 -1
  220. package/lib/containerHandleContext.d.ts.map +1 -1
  221. package/lib/containerHandleContext.js +1 -1
  222. package/lib/containerHandleContext.js.map +1 -1
  223. package/lib/containerRuntime.d.ts +42 -39
  224. package/lib/containerRuntime.d.ts.map +1 -1
  225. package/lib/containerRuntime.js +276 -141
  226. package/lib/containerRuntime.js.map +1 -1
  227. package/lib/dataStore.d.ts +1 -1
  228. package/lib/dataStore.d.ts.map +1 -1
  229. package/lib/dataStore.js +3 -3
  230. package/lib/dataStore.js.map +1 -1
  231. package/lib/dataStoreContext.d.ts +58 -19
  232. package/lib/dataStoreContext.d.ts.map +1 -1
  233. package/lib/dataStoreContext.js +107 -52
  234. package/lib/dataStoreContext.js.map +1 -1
  235. package/lib/dataStoreContexts.d.ts +1 -0
  236. package/lib/dataStoreContexts.d.ts.map +1 -1
  237. package/lib/dataStoreContexts.js +3 -2
  238. package/lib/dataStoreContexts.js.map +1 -1
  239. package/lib/dataStoreRegistry.d.ts +5 -1
  240. package/lib/dataStoreRegistry.d.ts.map +1 -1
  241. package/lib/dataStoreRegistry.js +1 -1
  242. package/lib/dataStoreRegistry.js.map +1 -1
  243. package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
  244. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  245. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  246. package/lib/deltaScheduler.d.ts +1 -1
  247. package/lib/deltaScheduler.d.ts.map +1 -1
  248. package/lib/deltaScheduler.js +1 -1
  249. package/lib/deltaScheduler.js.map +1 -1
  250. package/lib/error.d.ts +1 -1
  251. package/lib/error.d.ts.map +1 -1
  252. package/lib/error.js +2 -2
  253. package/lib/error.js.map +1 -1
  254. package/lib/gc/garbageCollection.d.ts +3 -2
  255. package/lib/gc/garbageCollection.d.ts.map +1 -1
  256. package/lib/gc/garbageCollection.js +8 -8
  257. package/lib/gc/garbageCollection.js.map +1 -1
  258. package/lib/gc/gcConfigs.d.ts +2 -2
  259. package/lib/gc/gcConfigs.d.ts.map +1 -1
  260. package/lib/gc/gcConfigs.js +4 -5
  261. package/lib/gc/gcConfigs.js.map +1 -1
  262. package/lib/gc/gcDefinitions.d.ts +4 -5
  263. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  264. package/lib/gc/gcDefinitions.js.map +1 -1
  265. package/lib/gc/gcHelpers.d.ts +5 -1
  266. package/lib/gc/gcHelpers.d.ts.map +1 -1
  267. package/lib/gc/gcHelpers.js +10 -2
  268. package/lib/gc/gcHelpers.js.map +1 -1
  269. package/lib/gc/gcSummaryStateTracker.d.ts +2 -2
  270. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  271. package/lib/gc/gcSummaryStateTracker.js +2 -2
  272. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  273. package/lib/gc/gcTelemetry.d.ts +2 -1
  274. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  275. package/lib/gc/gcTelemetry.js +4 -2
  276. package/lib/gc/gcTelemetry.js.map +1 -1
  277. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  278. package/lib/gc/gcUnreferencedStateTracker.js +2 -2
  279. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  280. package/lib/gc/index.d.ts +1 -1
  281. package/lib/gc/index.d.ts.map +1 -1
  282. package/lib/gc/index.js +1 -1
  283. package/lib/gc/index.js.map +1 -1
  284. package/lib/index.d.ts +5 -2
  285. package/lib/index.d.ts.map +1 -1
  286. package/lib/index.js +5 -2
  287. package/lib/index.js.map +1 -1
  288. package/lib/legacy.d.ts +91 -0
  289. package/lib/messageTypes.d.ts +11 -5
  290. package/lib/messageTypes.d.ts.map +1 -1
  291. package/lib/messageTypes.js +4 -0
  292. package/lib/messageTypes.js.map +1 -1
  293. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  294. package/lib/opLifecycle/batchManager.js.map +1 -1
  295. package/lib/opLifecycle/definitions.d.ts +2 -20
  296. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  297. package/lib/opLifecycle/definitions.js.map +1 -1
  298. package/lib/opLifecycle/index.d.ts +3 -3
  299. package/lib/opLifecycle/index.d.ts.map +1 -1
  300. package/lib/opLifecycle/index.js +2 -2
  301. package/lib/opLifecycle/index.js.map +1 -1
  302. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  303. package/lib/opLifecycle/opCompressor.js +2 -3
  304. package/lib/opLifecycle/opCompressor.js.map +1 -1
  305. package/lib/opLifecycle/opDecompressor.d.ts +15 -4
  306. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  307. package/lib/opLifecycle/opDecompressor.js +61 -62
  308. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  309. package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
  310. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  311. package/lib/opLifecycle/opGroupingManager.js +9 -12
  312. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  313. package/lib/opLifecycle/opSplitter.d.ts +12 -4
  314. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  315. package/lib/opLifecycle/opSplitter.js +47 -38
  316. package/lib/opLifecycle/opSplitter.js.map +1 -1
  317. package/lib/opLifecycle/outbox.d.ts +2 -1
  318. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  319. package/lib/opLifecycle/outbox.js +19 -18
  320. package/lib/opLifecycle/outbox.js.map +1 -1
  321. package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  322. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  323. package/lib/opLifecycle/remoteMessageProcessor.js +36 -32
  324. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  325. package/lib/packageVersion.d.ts +1 -1
  326. package/lib/packageVersion.js +1 -1
  327. package/lib/packageVersion.js.map +1 -1
  328. package/lib/pendingStateManager.d.ts +1 -1
  329. package/lib/pendingStateManager.d.ts.map +1 -1
  330. package/lib/pendingStateManager.js +2 -2
  331. package/lib/pendingStateManager.js.map +1 -1
  332. package/lib/public.d.ts +12 -0
  333. package/lib/scheduleManager.d.ts +1 -1
  334. package/lib/scheduleManager.d.ts.map +1 -1
  335. package/lib/scheduleManager.js +7 -3
  336. package/lib/scheduleManager.js.map +1 -1
  337. package/lib/storageServiceWithAttachBlobs.d.ts +2 -2
  338. package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -1
  339. package/lib/storageServiceWithAttachBlobs.js +1 -1
  340. package/lib/storageServiceWithAttachBlobs.js.map +1 -1
  341. package/lib/summary/documentSchema.d.ts +209 -0
  342. package/lib/summary/documentSchema.d.ts.map +1 -0
  343. package/lib/summary/documentSchema.js +386 -0
  344. package/lib/summary/documentSchema.js.map +1 -0
  345. package/lib/summary/index.d.ts +2 -1
  346. package/lib/summary/index.d.ts.map +1 -1
  347. package/lib/summary/index.js +1 -0
  348. package/lib/summary/index.js.map +1 -1
  349. package/lib/summary/orderedClientElection.d.ts +2 -2
  350. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  351. package/lib/summary/orderedClientElection.js +7 -2
  352. package/lib/summary/orderedClientElection.js.map +1 -1
  353. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
  354. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  355. package/lib/summary/runWhileConnectedCoordinator.js +1 -1
  356. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  357. package/lib/summary/runningSummarizer.d.ts +3 -3
  358. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  359. package/lib/summary/runningSummarizer.js +3 -3
  360. package/lib/summary/runningSummarizer.js.map +1 -1
  361. package/lib/summary/summarizer.d.ts +3 -2
  362. package/lib/summary/summarizer.d.ts.map +1 -1
  363. package/lib/summary/summarizer.js +3 -3
  364. package/lib/summary/summarizer.js.map +1 -1
  365. package/lib/summary/summarizerClientElection.d.ts +2 -2
  366. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  367. package/lib/summary/summarizerClientElection.js.map +1 -1
  368. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  369. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  370. package/lib/summary/summarizerHeuristics.js +1 -1
  371. package/lib/summary/summarizerHeuristics.js.map +1 -1
  372. package/lib/summary/summarizerNode/summarizerNode.d.ts +3 -2
  373. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  374. package/lib/summary/summarizerNode/summarizerNode.js +5 -5
  375. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  376. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  377. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  378. package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -1
  379. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  380. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  381. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  382. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
  383. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  384. package/lib/summary/summarizerTypes.d.ts +5 -3
  385. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  386. package/lib/summary/summarizerTypes.js.map +1 -1
  387. package/lib/summary/summaryCollection.d.ts +2 -2
  388. package/lib/summary/summaryCollection.d.ts.map +1 -1
  389. package/lib/summary/summaryCollection.js +1 -1
  390. package/lib/summary/summaryCollection.js.map +1 -1
  391. package/lib/summary/summaryFormat.d.ts +6 -17
  392. package/lib/summary/summaryFormat.d.ts.map +1 -1
  393. package/lib/summary/summaryFormat.js +3 -3
  394. package/lib/summary/summaryFormat.js.map +1 -1
  395. package/lib/summary/summaryGenerator.d.ts +4 -3
  396. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  397. package/lib/summary/summaryGenerator.js +4 -4
  398. package/lib/summary/summaryGenerator.js.map +1 -1
  399. package/lib/summary/summaryManager.d.ts +1 -1
  400. package/lib/summary/summaryManager.d.ts.map +1 -1
  401. package/lib/summary/summaryManager.js +9 -8
  402. package/lib/summary/summaryManager.js.map +1 -1
  403. package/package.json +57 -65
  404. package/src/batchTracker.ts +4 -3
  405. package/src/blobManager.ts +100 -77
  406. package/src/channelCollection.ts +180 -165
  407. package/src/connectionTelemetry.ts +12 -12
  408. package/src/containerHandleContext.ts +3 -2
  409. package/src/containerRuntime.ts +481 -277
  410. package/src/dataStore.ts +9 -4
  411. package/src/dataStoreContext.ts +195 -93
  412. package/src/dataStoreContexts.ts +5 -2
  413. package/src/dataStoreRegistry.ts +3 -2
  414. package/src/deltaManagerSummarizerProxy.ts +1 -1
  415. package/src/deltaScheduler.ts +2 -1
  416. package/src/error.ts +2 -2
  417. package/src/gc/garbageCollection.ts +21 -20
  418. package/src/gc/gcConfigs.ts +15 -18
  419. package/src/gc/gcDefinitions.ts +6 -8
  420. package/src/gc/gcHelpers.ts +22 -5
  421. package/src/gc/gcSummaryStateTracker.ts +7 -5
  422. package/src/gc/gcTelemetry.ts +13 -7
  423. package/src/gc/gcUnreferencedStateTracker.ts +3 -2
  424. package/src/gc/index.ts +1 -0
  425. package/src/index.ts +22 -1
  426. package/src/messageTypes.ts +20 -6
  427. package/src/opLifecycle/README.md +89 -0
  428. package/src/opLifecycle/batchManager.ts +1 -0
  429. package/src/opLifecycle/definitions.ts +3 -21
  430. package/src/opLifecycle/index.ts +3 -9
  431. package/src/opLifecycle/opCompressor.ts +6 -5
  432. package/src/opLifecycle/opDecompressor.ts +90 -100
  433. package/src/opLifecycle/opGroupingManager.ts +12 -14
  434. package/src/opLifecycle/opSplitter.ts +76 -48
  435. package/src/opLifecycle/outbox.ts +30 -38
  436. package/src/opLifecycle/remoteMessageProcessor.ts +43 -55
  437. package/src/packageVersion.ts +1 -1
  438. package/src/pendingStateManager.ts +6 -6
  439. package/src/scheduleManager.ts +10 -8
  440. package/src/storageServiceWithAttachBlobs.ts +2 -2
  441. package/src/summary/documentSchema.ts +631 -0
  442. package/src/summary/index.ts +10 -1
  443. package/src/summary/orderedClientElection.ts +7 -7
  444. package/src/summary/runWhileConnectedCoordinator.ts +3 -2
  445. package/src/summary/runningSummarizer.ts +22 -20
  446. package/src/summary/summarizer.ts +17 -15
  447. package/src/summary/summarizerClientElection.ts +3 -2
  448. package/src/summary/summarizerHeuristics.ts +4 -2
  449. package/src/summary/summarizerNode/summarizerNode.ts +20 -18
  450. package/src/summary/summarizerNode/summarizerNodeUtils.ts +3 -2
  451. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +16 -8
  452. package/src/summary/summarizerTypes.ts +7 -3
  453. package/src/summary/summaryCollection.ts +3 -3
  454. package/src/summary/summaryFormat.ts +14 -26
  455. package/src/summary/summaryGenerator.ts +12 -15
  456. package/src/summary/summaryManager.ts +16 -13
  457. package/api-extractor-cjs.json +0 -8
  458. package/dist/container-runtime-alpha.d.ts +0 -1753
  459. package/dist/container-runtime-beta.d.ts +0 -268
  460. package/dist/container-runtime-public.d.ts +0 -268
  461. package/dist/container-runtime-untrimmed.d.ts +0 -1893
  462. package/lib/container-runtime-alpha.d.ts +0 -1753
  463. package/lib/container-runtime-beta.d.ts +0 -268
  464. package/lib/container-runtime-public.d.ts +0 -268
  465. package/lib/container-runtime-untrimmed.d.ts +0 -1893
  466. package/lib/test/batchTracker.spec.js +0 -88
  467. package/lib/test/batchTracker.spec.js.map +0 -1
  468. package/lib/test/blobManager.spec.js +0 -835
  469. package/lib/test/blobManager.spec.js.map +0 -1
  470. package/lib/test/channelCollection.spec.js +0 -141
  471. package/lib/test/channelCollection.spec.js.map +0 -1
  472. package/lib/test/containerRuntime.spec.js +0 -1748
  473. package/lib/test/containerRuntime.spec.js.map +0 -1
  474. package/lib/test/dataStoreContext.spec.js +0 -801
  475. package/lib/test/dataStoreContext.spec.js.map +0 -1
  476. package/lib/test/dataStoreCreation.spec.js +0 -312
  477. package/lib/test/dataStoreCreation.spec.js.map +0 -1
  478. package/lib/test/dataStoreRegistry.spec.js +0 -26
  479. package/lib/test/dataStoreRegistry.spec.js.map +0 -1
  480. package/lib/test/fuzz/fuzzUtils.js +0 -66
  481. package/lib/test/fuzz/fuzzUtils.js.map +0 -1
  482. package/lib/test/fuzz/summarizer.fuzz.spec.js +0 -31
  483. package/lib/test/fuzz/summarizer.fuzz.spec.js.map +0 -1
  484. package/lib/test/fuzz/summarizerFuzzMocks.js +0 -162
  485. package/lib/test/fuzz/summarizerFuzzMocks.js.map +0 -1
  486. package/lib/test/fuzz/summarizerFuzzSuite.js +0 -106
  487. package/lib/test/fuzz/summarizerFuzzSuite.js.map +0 -1
  488. package/lib/test/gc/garbageCollection.spec.js +0 -1465
  489. package/lib/test/gc/garbageCollection.spec.js.map +0 -1
  490. package/lib/test/gc/gcConfigs.spec.js +0 -690
  491. package/lib/test/gc/gcConfigs.spec.js.map +0 -1
  492. package/lib/test/gc/gcHelpers.spec.js +0 -110
  493. package/lib/test/gc/gcHelpers.spec.js.map +0 -1
  494. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +0 -68
  495. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +0 -1
  496. package/lib/test/gc/gcStats.spec.js +0 -391
  497. package/lib/test/gc/gcStats.spec.js.map +0 -1
  498. package/lib/test/gc/gcSummaryStateTracker.spec.js +0 -228
  499. package/lib/test/gc/gcSummaryStateTracker.spec.js.map +0 -1
  500. package/lib/test/gc/gcTelemetry.spec.js +0 -530
  501. package/lib/test/gc/gcTelemetry.spec.js.map +0 -1
  502. package/lib/test/gc/gcUnitTestHelpers.js +0 -29
  503. package/lib/test/gc/gcUnitTestHelpers.js.map +0 -1
  504. package/lib/test/gc/gcUnreferencedStateTracker.spec.js +0 -192
  505. package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +0 -1
  506. package/lib/test/getPendingBlobs.spec.js +0 -193
  507. package/lib/test/getPendingBlobs.spec.js.map +0 -1
  508. package/lib/test/hardwareStats.spec.js +0 -93
  509. package/lib/test/hardwareStats.spec.js.map +0 -1
  510. package/lib/test/index.js +0 -6
  511. package/lib/test/index.js.map +0 -1
  512. package/lib/test/opLifecycle/OpGroupingManager.spec.js +0 -225
  513. package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +0 -1
  514. package/lib/test/opLifecycle/batchManager.spec.js +0 -189
  515. package/lib/test/opLifecycle/batchManager.spec.js.map +0 -1
  516. package/lib/test/opLifecycle/opCompressor.spec.js +0 -74
  517. package/lib/test/opLifecycle/opCompressor.spec.js.map +0 -1
  518. package/lib/test/opLifecycle/opDecompressor.spec.js +0 -218
  519. package/lib/test/opLifecycle/opDecompressor.spec.js.map +0 -1
  520. package/lib/test/opLifecycle/opSplitter.spec.js +0 -272
  521. package/lib/test/opLifecycle/opSplitter.spec.js.map +0 -1
  522. package/lib/test/opLifecycle/outbox.spec.js +0 -675
  523. package/lib/test/opLifecycle/outbox.spec.js.map +0 -1
  524. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +0 -196
  525. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +0 -1
  526. package/lib/test/pendingStateManager.spec.js +0 -329
  527. package/lib/test/pendingStateManager.spec.js.map +0 -1
  528. package/lib/test/scheduleManager.spec.js +0 -270
  529. package/lib/test/scheduleManager.spec.js.map +0 -1
  530. package/lib/test/summarizerNode.spec.js +0 -326
  531. package/lib/test/summarizerNode.spec.js.map +0 -1
  532. package/lib/test/summarizerNodeWithGc.spec.js +0 -318
  533. package/lib/test/summarizerNodeWithGc.spec.js.map +0 -1
  534. package/lib/test/summary/orderedClientElection.spec.js +0 -535
  535. package/lib/test/summary/orderedClientElection.spec.js.map +0 -1
  536. package/lib/test/summary/runningSummarizer.spec.js +0 -1349
  537. package/lib/test/summary/runningSummarizer.spec.js.map +0 -1
  538. package/lib/test/summary/summarizer.spec.js +0 -29
  539. package/lib/test/summary/summarizer.spec.js.map +0 -1
  540. package/lib/test/summary/summarizerClientElection.spec.js +0 -436
  541. package/lib/test/summary/summarizerClientElection.spec.js.map +0 -1
  542. package/lib/test/summary/summarizerHeuristics.spec.js +0 -289
  543. package/lib/test/summary/summarizerHeuristics.spec.js.map +0 -1
  544. package/lib/test/summary/summaryCollection.spec.js +0 -200
  545. package/lib/test/summary/summaryCollection.spec.js.map +0 -1
  546. package/lib/test/summary/summaryManager.spec.js +0 -430
  547. package/lib/test/summary/summaryManager.spec.js.map +0 -1
  548. package/lib/test/summary/testQuorumClients.js +0 -34
  549. package/lib/test/summary/testQuorumClients.js.map +0 -1
  550. package/lib/test/throttler.spec.js +0 -175
  551. package/lib/test/throttler.spec.js.map +0 -1
  552. package/lib/test/types/validateContainerRuntimePrevious.generated.js +0 -180
  553. package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +0 -1
  554. /package/{dist → lib}/tsdoc-metadata.json +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"runningSummarizer.spec.js","sourceRoot":"","sources":["../../../src/test/summary/runningSummarizer.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport sinon from \"sinon\";\nimport { Deferred } from \"@fluidframework/core-utils\";\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport {\n\tConfigTypes,\n\tIConfigProviderBase,\n\tITelemetryBaseEvent,\n} from \"@fluidframework/core-interfaces\";\nimport {\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tISummaryAck,\n\tISummaryNack,\n\tISummaryProposal,\n\tMessageType,\n\tSummaryType,\n} from \"@fluidframework/protocol-definitions\";\nimport { MockLogger, mixinMonitoringContext } from \"@fluidframework/telemetry-utils\";\nimport { MockDeltaManager } from \"@fluidframework/test-runtime-utils\";\nimport { IDeltaManager } from \"@fluidframework/container-definitions\";\nimport { IContainerRuntimeEvents } from \"@fluidframework/container-runtime-definitions\";\nimport { isRuntimeMessage } from \"@fluidframework/driver-utils\";\nimport { ISummaryConfiguration } from \"../../containerRuntime.js\";\nimport {\n\tgetFailMessage,\n\tneverCancelledSummaryToken,\n\tRunningSummarizer,\n\tSummaryCollection,\n\tSummarizeHeuristicData,\n\tISummarizerRuntime,\n\tISummarizeHeuristicData,\n\tSubmitSummaryResult,\n\tRetriableSummaryError,\n\tIGeneratedSummaryStats,\n\tISummarizeEventProps,\n\tISummaryCancellationToken,\n} from \"../../summary/index.js\";\nimport {\n\tdefaultMaxAttempts,\n\tdefaultMaxAttemptsForSubmitFailures,\n\t// eslint-disable-next-line import/no-internal-modules\n} from \"../../summary/runningSummarizer.js\";\n\nclass MockRuntime extends TypedEventEmitter<IContainerRuntimeEvents> {\n\tdisposed = false;\n\n\tconstructor(\n\t\tpublic readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t) {\n\t\tsuper();\n\t}\n\n\tcloseFn() {\n\t\tthis.disposed = true;\n\t}\n}\n\nconst configProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => ({\n\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n});\n\ndescribe(\"Runtime\", () => {\n\tdescribe(\"Summarization\", () => {\n\t\tdescribe(\"RunningSummarizer\", () => {\n\t\t\tlet stopCall: number;\n\t\t\tlet runCount: number;\n\t\t\tlet fullTreeRunCount: number;\n\t\t\tlet refreshLatestAckRunCount: number;\n\t\t\tlet clock: sinon.SinonFakeTimers;\n\t\t\tlet mockLogger: MockLogger;\n\t\t\tlet settings = {};\n\t\t\tlet mockDeltaManager: MockDeltaManager;\n\t\t\tlet summaryCollection: SummaryCollection;\n\t\t\tlet summarizer: RunningSummarizer;\n\t\t\tconst summarizerClientId = \"test\";\n\t\t\tlet lastRefSeq = 0;\n\t\t\tlet lastClientSeq: number;\n\t\t\tlet lastSummarySeq: number;\n\t\t\tlet mockRuntime: MockRuntime;\n\t\t\tlet heuristicData: ISummarizeHeuristicData;\n\t\t\tconst summaryCommon = {\n\t\t\t\tmaxAckWaitTime: 120000, // 2 min\n\t\t\t\tmaxOpsSinceLastSummary: 7000,\n\t\t\t\tinitialSummarizerDelayMs: 0,\n\t\t\t};\n\t\t\tconst summaryConfig: ISummaryConfiguration = {\n\t\t\t\tstate: \"enabled\",\n\t\t\t\tmaxTime: 5000 * 12, // 1 min (active)\n\t\t\t\tmaxOps: 1000, // 1k ops (active)\n\t\t\t\tminOpsForLastSummaryAttempt: 50,\n\t\t\t\tminIdleTime: 5000, // 5 sec (idle)\n\t\t\t\tmaxIdleTime: 5000, // This must remain the same as minIdleTime for tests to pass nicely\n\t\t\t\tnonRuntimeOpWeight: 0.1,\n\t\t\t\truntimeOpWeight: 1.0,\n\t\t\t\tnonRuntimeHeuristicThreshold: 20,\n\t\t\t\t...summaryCommon,\n\t\t\t};\n\t\t\tconst summaryConfigDisableHeuristics: ISummaryConfiguration = {\n\t\t\t\tstate: \"disableHeuristics\",\n\t\t\t\t...summaryCommon,\n\t\t\t};\n\n\t\t\tconst emptySummaryStats: IGeneratedSummaryStats = {\n\t\t\t\ttreeNodeCount: 0,\n\t\t\t\tblobNodeCount: 0,\n\t\t\t\thandleNodeCount: 0,\n\t\t\t\ttotalBlobSize: 0,\n\t\t\t\tdataStoreCount: 0,\n\t\t\t\tsummarizedDataStoreCount: 0,\n\t\t\t\tunreferencedBlobSize: 0,\n\t\t\t\tsummaryNumber: 0,\n\t\t\t};\n\n\t\t\tlet shouldDeferGenerateSummary: boolean = false;\n\t\t\tlet deferGenerateSummary: Deferred<void> | undefined;\n\n\t\t\tconst flushPromises = async () => new Promise((resolve) => process.nextTick(resolve));\n\n\t\t\tasync function emitNextOp(\n\t\t\t\tincrement: number = 1,\n\t\t\t\ttimestamp: number = Date.now(),\n\t\t\t\ttype: string = MessageType.Operation,\n\t\t\t) {\n\t\t\t\theuristicData.numRuntimeOps += increment - 1; // -1 because we emit an op below\n\t\t\t\tlastRefSeq += increment;\n\t\t\t\tconst op: Partial<ISequencedDocumentMessage> = {\n\t\t\t\t\tsequenceNumber: lastRefSeq,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype,\n\t\t\t\t};\n\t\t\t\tmockDeltaManager.emit(\"op\", op);\n\t\t\t\tmockRuntime.emit(\"op\", op, isRuntimeMessage({ type }));\n\t\t\t\tawait flushPromises();\n\t\t\t}\n\n\t\t\tasync function emitNoOp(increment: number = 1) {\n\t\t\t\theuristicData.numNonRuntimeOps += increment - 1; // -1 because we emit an op below\n\t\t\t\tlastRefSeq += increment;\n\t\t\t\tconst op: Partial<ISequencedDocumentMessage> = {\n\t\t\t\t\tsequenceNumber: lastRefSeq,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\ttype: MessageType.NoOp,\n\t\t\t\t};\n\t\t\t\tmockDeltaManager.emit(\"op\", op);\n\t\t\t\tmockRuntime.emit(\"op\", op, isRuntimeMessage({ type: MessageType.NoOp }));\n\t\t\t\tawait flushPromises();\n\t\t\t}\n\n\t\t\tfunction emitBroadcast(timestamp = Date.now()) {\n\t\t\t\tconst referenceSequenceNumber = lastRefSeq;\n\t\t\t\tlastSummarySeq = ++lastRefSeq;\n\t\t\t\tconst op = {\n\t\t\t\t\ttype: MessageType.Summarize,\n\t\t\t\t\tclientId: summarizerClientId,\n\t\t\t\t\treferenceSequenceNumber,\n\t\t\t\t\tclientSequenceNumber: ++lastClientSeq,\n\t\t\t\t\tsequenceNumber: lastSummarySeq,\n\t\t\t\t\tcontents: {\n\t\t\t\t\t\thandle: \"test-broadcast-handle\",\n\t\t\t\t\t},\n\t\t\t\t\ttimestamp,\n\t\t\t\t};\n\t\t\t\tmockDeltaManager.emit(\"op\", op);\n\t\t\t\tmockRuntime.emit(\"op\", op, isRuntimeMessage(op));\n\t\t\t}\n\n\t\t\tasync function emitAck() {\n\t\t\t\tconst summaryProposal: ISummaryProposal = {\n\t\t\t\t\tsummarySequenceNumber: lastSummarySeq,\n\t\t\t\t};\n\t\t\t\tconst contents: ISummaryAck = {\n\t\t\t\t\thandle: \"test-ack-handle\",\n\t\t\t\t\tsummaryProposal,\n\t\t\t\t};\n\t\t\t\tconst op = {\n\t\t\t\t\tdata: JSON.stringify(contents),\n\t\t\t\t\ttype: MessageType.SummaryAck,\n\t\t\t\t\tsequenceNumber: ++lastRefSeq,\n\t\t\t\t};\n\t\t\t\tmockDeltaManager.emit(\"op\", op);\n\t\t\t\tmockRuntime.emit(\"op\", op, isRuntimeMessage(op));\n\n\t\t\t\tawait flushPromises(); // let summarize run\n\t\t\t}\n\n\t\t\tasync function emitNack(retryAfterSeconds?: number) {\n\t\t\t\tconst summaryProposal: ISummaryProposal = {\n\t\t\t\t\tsummarySequenceNumber: lastSummarySeq,\n\t\t\t\t};\n\t\t\t\tconst contents: ISummaryNack & { retryAfter?: number } = {\n\t\t\t\t\tsummaryProposal,\n\t\t\t\t\tretryAfter: retryAfterSeconds,\n\t\t\t\t\tmessage: \"test-nack\",\n\t\t\t\t};\n\t\t\t\tconst op = {\n\t\t\t\t\tdata: JSON.stringify(contents),\n\t\t\t\t\ttype: MessageType.SummaryNack,\n\t\t\t\t\tsequenceNumber: ++lastRefSeq,\n\t\t\t\t};\n\t\t\t\tmockDeltaManager.emit(\"op\", op);\n\t\t\t\tmockRuntime.emit(\"op\", op, isRuntimeMessage(op));\n\n\t\t\t\tawait flushPromises();\n\t\t\t}\n\n\t\t\tasync function tickAndFlushPromises(ms: number) {\n\t\t\t\tclock.tick(ms);\n\t\t\t\tawait flushPromises();\n\t\t\t}\n\n\t\t\tfunction assertRunCounts(\n\t\t\t\texpectedTotalRunCount: number,\n\t\t\t\texpectedFullTreeRunCount: number,\n\t\t\t\texpectedRefreshLatestAckRunCount: number,\n\t\t\t\terrorMessage?: string,\n\t\t\t\texpectedStopCount = 0,\n\t\t\t) {\n\t\t\t\tconst errorPrefix = errorMessage ? `${errorMessage}: ` : \"\";\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\trunCount,\n\t\t\t\t\texpectedTotalRunCount,\n\t\t\t\t\t`${errorPrefix}unexpected total run count`,\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tfullTreeRunCount,\n\t\t\t\t\texpectedFullTreeRunCount,\n\t\t\t\t\t`${errorPrefix}unexpected fullTree count`,\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\trefreshLatestAckRunCount,\n\t\t\t\t\texpectedRefreshLatestAckRunCount,\n\t\t\t\t\t`${errorPrefix}unexpected refreshLatestAck count`,\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tstopCall,\n\t\t\t\t\texpectedStopCount,\n\t\t\t\t\t`${errorPrefix}summarizer should${\n\t\t\t\t\t\texpectedStopCount === 1 ? \"\" : \" not\"\n\t\t\t\t\t} have stopped`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tasync function successfulSubmitSummary(): Promise<SubmitSummaryResult> {\n\t\t\t\t// emitBroadcast will increment this number\n\t\t\t\tconst lastRefSeqBefore = lastRefSeq;\n\n\t\t\t\t// immediate broadcast\n\t\t\t\temitBroadcast();\n\n\t\t\t\tif (shouldDeferGenerateSummary) {\n\t\t\t\t\tdeferGenerateSummary = new Deferred<void>();\n\t\t\t\t\tawait deferGenerateSummary.promise;\n\t\t\t\t\tdeferGenerateSummary = undefined;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstage: \"submit\",\n\t\t\t\t\treferenceSequenceNumber: lastRefSeqBefore,\n\t\t\t\t\tminimumSequenceNumber: 0,\n\t\t\t\t\tgenerateDuration: 0,\n\t\t\t\t\tuploadDuration: 0,\n\t\t\t\t\tsubmitOpDuration: 0,\n\t\t\t\t\tsummaryTree: { type: SummaryType.Tree, tree: {} },\n\t\t\t\t\tsummaryStats: emptySummaryStats,\n\t\t\t\t\thandle: \"test-handle\",\n\t\t\t\t\tclientSequenceNumber: lastClientSeq,\n\t\t\t\t\tforcedFullTree: false,\n\t\t\t\t} as const;\n\t\t\t}\n\n\t\t\tconst startRunningSummarizer = async (\n\t\t\t\tdisableHeuristics?: boolean,\n\t\t\t\tsubmitSummaryCallback: () => Promise<SubmitSummaryResult> = successfulSubmitSummary,\n\t\t\t\tcancellationToken: ISummaryCancellationToken = neverCancelledSummaryToken,\n\t\t\t): Promise<void> => {\n\t\t\t\theuristicData = new SummarizeHeuristicData(0, {\n\t\t\t\t\trefSequenceNumber: 0,\n\t\t\t\t\tsummaryTime: Date.now(),\n\t\t\t\t});\n\t\t\t\tsummarizer = await RunningSummarizer.start(\n\t\t\t\t\tmockLogger,\n\t\t\t\t\tsummaryCollection.createWatcher(summarizerClientId),\n\t\t\t\t\tdisableHeuristics ? summaryConfigDisableHeuristics : summaryConfig,\n\t\t\t\t\tasync (options) => {\n\t\t\t\t\t\trunCount++;\n\t\t\t\t\t\theuristicData.recordAttempt(lastRefSeq);\n\n\t\t\t\t\t\tconst { fullTree = false, refreshLatestAck = false } = options;\n\t\t\t\t\t\tif (fullTree) {\n\t\t\t\t\t\t\tfullTreeRunCount++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (refreshLatestAck) {\n\t\t\t\t\t\t\trefreshLatestAckRunCount++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn submitSummaryCallback();\n\t\t\t\t\t},\n\t\t\t\t\tasync (options) => {},\n\t\t\t\t\theuristicData,\n\t\t\t\t\tsummaryCollection,\n\t\t\t\t\tcancellationToken,\n\t\t\t\t\t// stopSummarizerCallback\n\t\t\t\t\t(reason) => {\n\t\t\t\t\t\tstopCall++;\n\t\t\t\t\t},\n\t\t\t\t\tmockRuntime as any as ISummarizerRuntime,\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tbefore(() => {\n\t\t\t\t// eslint-disable-next-line import/no-named-as-default-member\n\t\t\t\tclock = sinon.useFakeTimers();\n\t\t\t});\n\n\t\t\tafter(() => {\n\t\t\t\tclock.restore();\n\t\t\t});\n\n\t\t\tbeforeEach(async () => {\n\t\t\t\tshouldDeferGenerateSummary = false;\n\t\t\t\tdeferGenerateSummary = undefined;\n\t\t\t\tclock.reset();\n\t\t\t\trunCount = 0;\n\t\t\t\tstopCall = 0;\n\t\t\t\tfullTreeRunCount = 0;\n\t\t\t\trefreshLatestAckRunCount = 0;\n\t\t\t\tlastRefSeq = 0;\n\t\t\t\tlastClientSeq = -1000; // negative/decrement for test\n\t\t\t\tlastSummarySeq = 0; // negative/decrement for test\n\t\t\t\tsettings = {};\n\t\t\t\tmockLogger = mixinMonitoringContext(\n\t\t\t\t\tnew MockLogger(),\n\t\t\t\t\tconfigProvider(settings),\n\t\t\t\t).logger;\n\t\t\t\tmockDeltaManager = new MockDeltaManager();\n\t\t\t\tmockRuntime = new MockRuntime(mockDeltaManager);\n\t\t\t\tsummaryCollection = new SummaryCollection(\n\t\t\t\t\tmockDeltaManager,\n\t\t\t\t\tmockLogger.toTelemetryLogger(),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tdescribe(\"Summary Schedule\", () => {\n\t\t\t\tbeforeEach(async () => {\n\t\t\t\t\tawait startRunningSummarizer();\n\t\t\t\t});\n\n\t\t\t\tit(\"Should summarize after configured number of ops when not pending\", async () => {\n\t\t\t\t\t// too early, should not run yet\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps);\n\t\t\t\t\tassertRunCounts(0, 0, 0);\n\n\t\t\t\t\t// now should run\n\t\t\t\t\tawait emitNextOp(1);\n\t\t\t\t\tassertRunCounts(1, 0, 0);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t\t\t{ eventName: \"Running:Summarize_generate\", summarizeCount: runCount },\n\t\t\t\t\t\t\t{ eventName: \"Running:Summarize_Op\", summarizeCount: runCount },\n\t\t\t\t\t\t]),\n\t\t\t\t\t\t\"unexpected log sequence\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// should not run, because our summary hasnt been acked/nacked yet\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(1, 0, 0);\n\n\t\t\t\t\t// should run, because another op has come in, and our summary has been acked\n\t\t\t\t\tawait emitAck();\n\t\t\t\t\tassertRunCounts(2, 0, 0);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t\t\t{ eventName: \"Running:Summarize_end\", summarizeCount: runCount - 1 }, // ack for previous run\n\t\t\t\t\t\t\t{ eventName: \"Running:Summarize_generate\", summarizeCount: runCount },\n\t\t\t\t\t\t\t{ eventName: \"Running:Summarize_Op\", summarizeCount: runCount },\n\t\t\t\t\t\t]),\n\t\t\t\t\t\t\"unexpected log sequence\",\n\t\t\t\t\t);\n\n\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\tassertRunCounts(2, 0, 0);\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!mockLogger.matchEvents([{ eventName: \"Running:Summarize_end\" }]),\n\t\t\t\t\t\t\"No ack expected yet\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should summarize after configured idle time when not pending\", async () => {\n\t\t\t\t\tawait emitNextOp();\n\n\t\t\t\t\t// too early, should not run yet\n\t\t\t\t\tawait tickAndFlushPromises(summaryConfig.minIdleTime - 1);\n\t\t\t\t\tassertRunCounts(0, 0, 0);\n\n\t\t\t\t\t// now should run\n\t\t\t\t\tawait tickAndFlushPromises(1);\n\t\t\t\t\tassertRunCounts(1, 0, 0);\n\n\t\t\t\t\t// should not run, because our summary hasnt been acked/nacked yet\n\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\tawait tickAndFlushPromises(summaryConfig.minIdleTime);\n\t\t\t\t\tassertRunCounts(1, 0, 0);\n\n\t\t\t\t\t// should run, because another op has come in, and our summary has been acked\n\t\t\t\t\tawait emitAck();\n\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\tawait tickAndFlushPromises(summaryConfig.minIdleTime);\n\t\t\t\t\tassertRunCounts(2, 0, 0);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should summarize after configured active time when not pending\", async () => {\n\t\t\t\t\tconst idlesPerActive = Math.floor(\n\t\t\t\t\t\t(summaryConfig.maxTime + 1) / (summaryConfig.minIdleTime - 1),\n\t\t\t\t\t);\n\t\t\t\t\tconst remainingTime =\n\t\t\t\t\t\t(summaryConfig.maxTime + 1) % (summaryConfig.minIdleTime - 1);\n\t\t\t\t\tawait emitNextOp();\n\n\t\t\t\t\t// too early should not run yet\n\t\t\t\t\tfor (let i = 0; i < idlesPerActive; i++) {\n\t\t\t\t\t\t// prevent idle from triggering with periodic ops\n\t\t\t\t\t\tawait tickAndFlushPromises(summaryConfig.minIdleTime - 1);\n\t\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\t}\n\t\t\t\t\tawait tickAndFlushPromises(remainingTime - 1);\n\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\tassertRunCounts(0, 0, 0);\n\n\t\t\t\t\t// now should run\n\t\t\t\t\tawait tickAndFlushPromises(1);\n\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\tassertRunCounts(1, 0, 0);\n\n\t\t\t\t\t// should not run because our summary hasnt been acked/nacked yet\n\t\t\t\t\tfor (let i = 0; i < idlesPerActive; i++) {\n\t\t\t\t\t\t// prevent idle from triggering with periodic ops\n\t\t\t\t\t\tawait tickAndFlushPromises(summaryConfig.minIdleTime - 1);\n\t\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\t}\n\t\t\t\t\tawait tickAndFlushPromises(remainingTime);\n\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\tassertRunCounts(1, 0, 0);\n\n\t\t\t\t\t// should run, because another op has come in, and our summary has been acked\n\t\t\t\t\tawait emitAck();\n\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\tassertRunCounts(2, 0, 0);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should summarize after pending timeout\", async () => {\n\t\t\t\t\t// first run to start pending\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(1, 0, 0);\n\n\t\t\t\t\t// should not run because still pending\n\t\t\t\t\tawait tickAndFlushPromises(summaryConfig.maxAckWaitTime - 1);\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(1, 0, 0);\n\n\t\t\t\t\t// should run because pending timeout\n\t\t\t\t\tawait tickAndFlushPromises(1);\n\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\tassertRunCounts(2, 0, 1);\n\n\t\t\t\t\t// verify subsequent ack works\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(2, 0, 1);\n\t\t\t\t\tawait emitAck();\n\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\tassertRunCounts(3, 0, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should not cause pending ack timeouts using older summary time\", async () => {\n\t\t\t\t\tshouldDeferGenerateSummary = true;\n\t\t\t\t\tawait emitNextOp();\n\n\t\t\t\t\t// should do first summary fine\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps);\n\t\t\t\t\tassertRunCounts(1, 0, 0);\n\t\t\t\t\tassert(deferGenerateSummary !== undefined, \"submitSummary was not called\");\n\t\t\t\t\tdeferGenerateSummary.resolve();\n\t\t\t\t\tawait emitAck();\n\n\t\t\t\t\t// pass time that should not count towards the next max ack wait time\n\t\t\t\t\tawait tickAndFlushPromises(summaryConfig.maxAckWaitTime);\n\n\t\t\t\t\t// subsequent summary should not cancel pending!\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(2, 0, 0);\n\t\t\t\t\tawait emitNextOp(); // fine\n\t\t\t\t\tawait tickAndFlushPromises(1); // next op will exceed maxAckWaitTime from first summary\n\t\t\t\t\tawait emitNextOp(); // not fine, nay cancel pending too soon\n\t\t\t\t\tassert(deferGenerateSummary !== undefined, \"submitSummary was not called\");\n\t\t\t\t\tdeferGenerateSummary.resolve();\n\n\t\t\t\t\t// we should not generate another summary without previous ack\n\t\t\t\t\tawait emitNextOp(); // flush finish summarizing\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(2, 0, 0);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should summarize one last time before closing >=min ops\", async () => {\n\t\t\t\t\tawait emitNextOp(summaryConfig.minOpsForLastSummaryAttempt);\n\t\t\t\t\tconst stopP = summarizer.waitStop(true);\n\t\t\t\t\tawait flushPromises();\n\t\t\t\t\tawait emitAck();\n\t\t\t\t\tawait stopP;\n\n\t\t\t\t\tassertRunCounts(1, 0, 0, \"should perform lastSummary\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should not summarize one last time before closing <min ops\", async () => {\n\t\t\t\t\tawait emitNextOp(summaryConfig.minOpsForLastSummaryAttempt - 1);\n\t\t\t\t\tconst stopP = summarizer.waitStop(true);\n\t\t\t\t\tawait flushPromises();\n\t\t\t\t\tawait emitAck();\n\t\t\t\t\tawait stopP;\n\n\t\t\t\t\tassertRunCounts(0, 0, 0, \"should not perform lastSummary\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should not summarize when processing summary ack op\", async () => {\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps);\n\t\t\t\t\tassertRunCounts(0, 0, 0, \"should not perform summary\");\n\n\t\t\t\t\tawait emitAck();\n\t\t\t\t\tassertRunCounts(0, 0, 0, \"should not perform summary\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should not summarize when processing summary nack op\", async () => {\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps);\n\t\t\t\t\tassertRunCounts(0, 0, 0, \"should not perform summary\");\n\n\t\t\t\t\tawait emitNack();\n\t\t\t\t\tassertRunCounts(0, 0, 0, \"should not perform summary\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should not summarize when processing summarize op\", async () => {\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps);\n\t\t\t\t\tassertRunCounts(0, 0, 0, \"should not perform summary\");\n\n\t\t\t\t\tawait emitNextOp(1, Date.now(), MessageType.Summarize);\n\t\t\t\t\tassertRunCounts(0, 0, 0, \"should not perform summary\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should not include Summarize ops with runtime count\", async () => {\n\t\t\t\t\tassert.strictEqual(heuristicData.numRuntimeOps, 0);\n\t\t\t\t\tassert.strictEqual(heuristicData.numNonRuntimeOps, 0);\n\n\t\t\t\t\tawait emitNextOp(1, Date.now(), MessageType.Summarize);\n\n\t\t\t\t\tassert.strictEqual(heuristicData.numRuntimeOps, 0);\n\t\t\t\t\tassert.strictEqual(heuristicData.numNonRuntimeOps, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should not summarize on non-runtime op before threshold is reached\", async () => {\n\t\t\t\t\t// Creating RunningSummarizer starts heuristics automatically\n\t\t\t\t\tawait emitNoOp(1);\n\t\t\t\t\tawait tickAndFlushPromises(summaryConfig.minIdleTime);\n\t\t\t\t\tassertRunCounts(1, 0, 0, \"should perform summary\");\n\t\t\t\t\tawait emitAck();\n\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsummaryConfig.nonRuntimeHeuristicThreshold !== undefined,\n\t\t\t\t\t\t\"Expect nonRuntimeHeuristicThreshold to be provided\",\n\t\t\t\t\t);\n\n\t\t\t\t\tawait emitNoOp(summaryConfig.nonRuntimeHeuristicThreshold - 3); // Summarize and SummaryAck are included\n\t\t\t\t\tawait tickAndFlushPromises(summaryConfig.minIdleTime);\n\n\t\t\t\t\tassertRunCounts(1, 0, 0, \"should not perform summary\");\n\t\t\t\t\tassert.strictEqual(heuristicData.numRuntimeOps, 0);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\theuristicData.numNonRuntimeOps,\n\t\t\t\t\t\tsummaryConfig.nonRuntimeHeuristicThreshold - 1,\n\t\t\t\t\t);\n\n\t\t\t\t\tawait emitNoOp(1);\n\t\t\t\t\tawait tickAndFlushPromises(summaryConfig.minIdleTime);\n\n\t\t\t\t\tassertRunCounts(2, 0, 0, \"should perform summary\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Safe Retries\", () => {\n\t\t\t\tbeforeEach(async () => {\n\t\t\t\t\tshouldDeferGenerateSummary = false;\n\t\t\t\t\tdeferGenerateSummary = undefined;\n\t\t\t\t\tawait startRunningSummarizer();\n\t\t\t\t});\n\n\t\t\t\tit(\"Should retry on failures\", async () => {\n\t\t\t\t\tawait emitNextOp();\n\n\t\t\t\t\t// too early, should not run yet\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps - 1);\n\t\t\t\t\tassertRunCounts(0, 0, 0);\n\n\t\t\t\t\t// now should run a normal run\n\t\t\t\t\tawait emitNextOp(1);\n\t\t\t\t\tassertRunCounts(1, 0, 0);\n\t\t\t\t\tconst retryProps1 = {\n\t\t\t\t\t\tsummarizeCount: 1,\n\t\t\t\t\t\tsummaryAttemptsPerPhase: 1,\n\t\t\t\t\t\tsummaryAttempts: 1,\n\t\t\t\t\t\tsummaryAttemptPhase: 1,\n\t\t\t\t\t};\n\t\t\t\t\tassert(\n\t\t\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t\t\t{ eventName: \"Running:Summarize_generate\", ...retryProps1 },\n\t\t\t\t\t\t\t{ eventName: \"Running:Summarize_Op\", ...retryProps1 },\n\t\t\t\t\t\t]),\n\t\t\t\t\t\t\"unexpected log sequence\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// should not run, because our summary hasn't been acked/nacked yet\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(1, 0, 0);\n\n\t\t\t\t\t// should run with refresh after first nack\n\t\t\t\t\tawait emitNack();\n\t\t\t\t\tassertRunCounts(2, 0, 1, \"retry1 should be refreshLatestAck\");\n\t\t\t\t\tconst retryProps2 = {\n\t\t\t\t\t\tsummarizeCount: 1,\n\t\t\t\t\t\tsummaryAttemptsPerPhase: 1,\n\t\t\t\t\t\tsummaryAttempts: 2,\n\t\t\t\t\t\tsummaryAttemptPhase: 2,\n\t\t\t\t\t};\n\t\t\t\t\tassert(\n\t\t\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\teventName: \"Running:Summarize_cancel\",\n\t\t\t\t\t\t\t\t...retryProps1,\n\t\t\t\t\t\t\t\treason: getFailMessage(\"summaryNack\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ eventName: \"Running:Summarize_generate\", ...retryProps2 },\n\t\t\t\t\t\t\t{ eventName: \"Running:Summarize_Op\", ...retryProps2 },\n\t\t\t\t\t\t]),\n\t\t\t\t\t\t\"unexpected log sequence\",\n\t\t\t\t\t);\n\t\t\t\t\t// Should stop after final nack\n\t\t\t\t\tassert.strictEqual(stopCall, 0);\n\t\t\t\t\tawait emitNack();\n\t\t\t\t\tassert.strictEqual(stopCall, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should retry after delay on failures with retryAfter\", async () => {\n\t\t\t\t\tawait emitNextOp();\n\n\t\t\t\t\t// too early, should not run yet\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps - 1);\n\t\t\t\t\tassertRunCounts(0, 0, 0, \"too early\");\n\n\t\t\t\t\t// now should run a normal run\n\t\t\t\t\tawait emitNextOp(1);\n\t\t\t\t\tassertRunCounts(1, 0, 0, \"normal run\");\n\t\t\t\t\tconst retryProps1 = {\n\t\t\t\t\t\tsummarizeCount: 1,\n\t\t\t\t\t\tsummaryAttemptsPerPhase: 1,\n\t\t\t\t\t\tsummaryAttempts: 1,\n\t\t\t\t\t\tsummaryAttemptPhase: 1,\n\t\t\t\t\t};\n\t\t\t\t\tassert(\n\t\t\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t\t\t{ eventName: \"Running:Summarize_generate\", ...retryProps1 },\n\t\t\t\t\t\t\t{ eventName: \"Running:Summarize_Op\", ...retryProps1 },\n\t\t\t\t\t\t]),\n\t\t\t\t\t\t\"unexpected log sequence\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// should not run, because our summary hasn't been acked/nacked yet\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(1, 0, 0, \"waiting for ack/nack\");\n\n\t\t\t\t\t// should not run, because of specified 30 sec delay\n\t\t\t\t\tawait emitNack(30);\n\t\t\t\t\tawait tickAndFlushPromises(30 * 1000 - 1);\n\t\t\t\t\tassertRunCounts(1, 0, 0, \"waiting for retryAfter delay\");\n\n\t\t\t\t\t// should rerun the normal try after the delay\n\t\t\t\t\tawait tickAndFlushPromises(1);\n\t\t\t\t\tassertRunCounts(2, 0, 0, \"rerun after retryAfter delay\");\n\t\t\t\t\tconst retryProps2 = {\n\t\t\t\t\t\tsummarizeCount: 1,\n\t\t\t\t\t\tsummaryAttemptsPerPhase: 2,\n\t\t\t\t\t\tsummaryAttempts: 2,\n\t\t\t\t\t\tsummaryAttemptPhase: 1,\n\t\t\t\t\t};\n\t\t\t\t\tassert(\n\t\t\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\teventName: \"Running:Summarize_cancel\",\n\t\t\t\t\t\t\t\tsummarizeCount: 1,\n\t\t\t\t\t\t\t\treason: getFailMessage(\"summaryNack\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\teventName: \"Running:SummarizeAttemptDelay\",\n\t\t\t\t\t\t\t\t...{\n\t\t\t\t\t\t\t\t\tsummarizeCount: 1,\n\t\t\t\t\t\t\t\t\tsummaryAttemptsPerPhase: 1,\n\t\t\t\t\t\t\t\t\tsummaryAttempts: 1,\n\t\t\t\t\t\t\t\t\tsummaryAttemptPhase: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\teventName: \"Running:Summarize_generate\",\n\t\t\t\t\t\t\t\t...retryProps2,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\teventName: \"Running:Summarize_Op\",\n\t\t\t\t\t\t\t\t...retryProps2,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]),\n\t\t\t\t\t\t\"unexpected log sequence\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should wait on 429 from uploadSummaryWithContext\", async () => {\n\t\t\t\t\tshouldDeferGenerateSummary = true;\n\t\t\t\t\tawait emitNextOp();\n\n\t\t\t\t\t// too early, should not run yet\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps);\n\t\t\t\t\tassert(deferGenerateSummary !== undefined, \"submitSummary was not called\");\n\t\t\t\t\tdeferGenerateSummary.reject({ message: \"error\", retryAfterSeconds: 30 });\n\n\t\t\t\t\tawait flushPromises();\n\t\t\t\t\tawait tickAndFlushPromises(30 * 1000 - 1);\n\n\t\t\t\t\tassertRunCounts(1, 0, 0, \"failed upload\");\n\t\t\t\t\tconst retryProps1 = {\n\t\t\t\t\t\tsummarizeCount: 1,\n\t\t\t\t\t\tsummaryAttemptsPerPhase: 1,\n\t\t\t\t\t\tsummaryAttempts: 1,\n\t\t\t\t\t\tsummaryAttemptPhase: 1,\n\t\t\t\t\t};\n\t\t\t\t\tassert(\n\t\t\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t\t\t{ eventName: \"Running:Summarize_cancel\", ...retryProps1 },\n\t\t\t\t\t\t\t{ eventName: \"Running:SummarizeAttemptDelay\", ...retryProps1 },\n\t\t\t\t\t\t]),\n\t\t\t\t\t\t\"unexpected log sequence\",\n\t\t\t\t\t);\n\n\t\t\t\t\tshouldDeferGenerateSummary = false;\n\t\t\t\t\tawait tickAndFlushPromises(1);\n\t\t\t\t\tassertRunCounts(2, 0, 0, \"normal run\");\n\t\t\t\t\tconst retryProps2 = {\n\t\t\t\t\t\tsummarizeCount: 1,\n\t\t\t\t\t\tsummaryAttemptsPerPhase: 2,\n\t\t\t\t\t\tsummaryAttempts: 2,\n\t\t\t\t\t\tsummaryAttemptPhase: 1,\n\t\t\t\t\t};\n\n\t\t\t\t\tassert(\n\t\t\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t\t\t{ eventName: \"Running:Summarize_generate\", ...retryProps2 },\n\t\t\t\t\t\t\t{ eventName: \"Running:Summarize_Op\", ...retryProps2 },\n\t\t\t\t\t\t]),\n\t\t\t\t\t\t\"unexpected log sequence\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Summarization attempts with retry\", () => {\n\t\t\t\tbeforeEach(async () => {\n\t\t\t\t\tsettings[\"Fluid.Summarizer.UseDynamicRetries\"] = true;\n\t\t\t\t\tshouldDeferGenerateSummary = false;\n\t\t\t\t\tdeferGenerateSummary = undefined;\n\t\t\t\t});\n\n\t\t\t\ttype SummaryStage = SubmitSummaryResult[\"stage\"];\n\n\t\t\t\t/**\n\t\t\t\t * Validate that a summary attempt fails as expected, correct events are received and summarization\n\t\t\t\t * stops (or doesn't) as per the given params.\n\t\t\t\t * @param attemptNumber - The current attempt number.\n\t\t\t\t * @param totalAttempts - The total number of attempts. After the last attempt, summarizer should close.\n\t\t\t\t * @param lastSuccessfulStage - The stage after which summarization failed.\n\t\t\t\t * @param retryAfterSeconds - The number of seconds after which the next attempt should be tried.\n\t\t\t\t */\n\t\t\t\tconst validateSummaryAttemptFails = async (\n\t\t\t\t\tattemptNumber: number,\n\t\t\t\t\ttotalAttempts: number,\n\t\t\t\t\tlastSuccessfulStage: SummaryStage,\n\t\t\t\t\tretryAfterSeconds: number | undefined,\n\t\t\t\t) => {\n\t\t\t\t\tconst finalAttempt = attemptNumber >= totalAttempts;\n\t\t\t\t\t// Nack the summary with \"retryAfterSeconds\" specified.\n\t\t\t\t\tawait emitNack(retryAfterSeconds);\n\n\t\t\t\t\tassertRunCounts(\n\t\t\t\t\t\tattemptNumber,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t`Total run count should be ${attemptNumber}`,\n\t\t\t\t\t\tfinalAttempt ? 1 : 0 /* expectedStopCount */,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst retryProps1 = {\n\t\t\t\t\t\tsummarizeCount: 1,\n\t\t\t\t\t\tsummaryAttempts: attemptNumber,\n\t\t\t\t\t\tstage: lastSuccessfulStage,\n\t\t\t\t\t};\n\t\t\t\t\tconst expectedEvents: Omit<ITelemetryBaseEvent, \"category\">[] = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\teventName: \"Running:Summarize_cancel\",\n\t\t\t\t\t\t\t...retryProps1,\n\t\t\t\t\t\t\tretryAfterSeconds,\n\t\t\t\t\t\t\treason: getFailMessage(\n\t\t\t\t\t\t\t\tlastSuccessfulStage === \"submit\"\n\t\t\t\t\t\t\t\t\t? \"summaryNack\" // if last stage is submit, summarization fails due to summary nack\n\t\t\t\t\t\t\t\t\t: \"submitSummaryFailure\", // other stages fail because summary is not submitted\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\n\t\t\t\t\t// After the final attempt, there shouldn't be any delay.\n\t\t\t\t\tif (!finalAttempt) {\n\t\t\t\t\t\texpectedEvents.push({\n\t\t\t\t\t\t\teventName: \"Running:SummarizeAttemptDelay\",\n\t\t\t\t\t\t\t...retryProps1,\n\t\t\t\t\t\t\tduration: retryAfterSeconds,\n\t\t\t\t\t\t\tdynamicRetries: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tmockLogger.assertMatch(\n\t\t\t\t\t\texpectedEvents,\n\t\t\t\t\t\t`Summarizer attempt ${attemptNumber} did not fail as expected`,\n\t\t\t\t\t);\n\n\t\t\t\t\t// After the final attempt, summarizer should stop.\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tstopCall,\n\t\t\t\t\t\tfinalAttempt ? 1 : 0,\n\t\t\t\t\t\t`Summarizer should${\n\t\t\t\t\t\t\tfinalAttempt ? \"\" : \" not\"\n\t\t\t\t\t\t} have stopped after ${totalAttempts} attempts`,\n\t\t\t\t\t);\n\t\t\t\t};\n\n\t\t\t\t// Callback that fails the summary for all stages expect submit. For submit, the summarization\n\t\t\t\t// will fail because of summary ack not received withing timeout.\n\t\t\t\tconst submitSummaryCallback = async (\n\t\t\t\t\tstage: SummaryStage,\n\t\t\t\t\tretryAfterSeconds: number | undefined,\n\t\t\t\t): Promise<SubmitSummaryResult> => {\n\t\t\t\t\tif (stage === \"submit\") {\n\t\t\t\t\t\treturn successfulSubmitSummary();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst error = new RetriableSummaryError(\n\t\t\t\t\t\t\t`Fail summarization at ${stage}`,\n\t\t\t\t\t\t\tretryAfterSeconds,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst failedResult: Partial<SubmitSummaryResult> = {\n\t\t\t\t\t\t\tstage,\n\t\t\t\t\t\t\treferenceSequenceNumber: lastRefSeq,\n\t\t\t\t\t\t\tminimumSequenceNumber: 0,\n\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn failedResult as SubmitSummaryResult;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tit(`should not retry when summary attempt succeeds`, async () => {\n\t\t\t\t\tawait startRunningSummarizer();\n\n\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\t// This should run a summarization because max ops has reached.\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps);\n\t\t\t\t\tassertRunCounts(1, 0, 0, `Total run count should be 1`);\n\n\t\t\t\t\tawait emitAck();\n\t\t\t\t\tassertRunCounts(1, 0, 0, `The run count should still be 1`);\n\t\t\t\t\tassert.strictEqual(stopCall, 0, \"Summarizer should not have stopped\");\n\t\t\t\t});\n\n\t\t\t\tconst failedStages: SummaryStage[] = [\"base\", \"generate\", \"upload\", \"submit\"];\n\t\t\t\tfor (const [stageIndex, stage] of failedStages.entries()) {\n\t\t\t\t\t// When stage is \"submit\", the submit stage was successful and default max attempts is used\n\t\t\t\t\t// for any other failures.\n\t\t\t\t\tconst maxAttempts =\n\t\t\t\t\t\tstage === \"submit\"\n\t\t\t\t\t\t\t? defaultMaxAttempts\n\t\t\t\t\t\t\t: defaultMaxAttemptsForSubmitFailures;\n\t\t\t\t\tconst titleStage = stage === \"submit\" ? \"nack\" : stage;\n\n\t\t\t\t\tit(`should attempt 1 time only on failure without retry specified at ${titleStage} stage`, async () => {\n\t\t\t\t\t\tawait startRunningSummarizer(undefined /* disableHeuristics */, async () =>\n\t\t\t\t\t\t\tsubmitSummaryCallback(stage, undefined /* retryAfterSeconds */),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\t\t// This should run a summarization because max ops has reached.\n\t\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps);\n\t\t\t\t\t\tawait validateSummaryAttemptFails(\n\t\t\t\t\t\t\t1 /* attemptNumber */,\n\t\t\t\t\t\t\t1 /* totalAttempts */,\n\t\t\t\t\t\t\tstage,\n\t\t\t\t\t\t\tundefined /* retryAfterSeconds */,\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tit(`should attempt ${maxAttempts} times on failure with retryAfterSeconds at ${titleStage} stage`, async () => {\n\t\t\t\t\t\tconst retryAfterSeconds = 5;\n\t\t\t\t\t\tawait startRunningSummarizer(undefined /* disableHeuristics */, async () =>\n\t\t\t\t\t\t\tsubmitSummaryCallback(stage, retryAfterSeconds),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\t\t// This should run a summarization because max ops has reached.\n\t\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps);\n\n\t\t\t\t\t\tfor (let attemptNumber = 1; attemptNumber <= maxAttempts; attemptNumber++) {\n\t\t\t\t\t\t\tawait validateSummaryAttemptFails(\n\t\t\t\t\t\t\t\tattemptNumber,\n\t\t\t\t\t\t\t\tmaxAttempts,\n\t\t\t\t\t\t\t\tstage,\n\t\t\t\t\t\t\t\tretryAfterSeconds,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// Wait for \"retryAfterSeconds\". The next attempt should start after this.\n\t\t\t\t\t\t\tawait tickAndFlushPromises(retryAfterSeconds * 1000 + 1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// validate that summarization is not run again.\n\t\t\t\t\t\tassertRunCounts(\n\t\t\t\t\t\t\tmaxAttempts,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t`Summarization should not have been attempted more than ${maxAttempts} times`,\n\t\t\t\t\t\t\t1 /** expectedStopCount */,\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tit(`should attempt ${maxAttempts} times on failure when stage changes from ${titleStage}`, async () => {\n\t\t\t\t\t\t// Helper to get a different stage from the current one.\n\t\t\t\t\t\tconst getNewStage = () => {\n\t\t\t\t\t\t\tlet index = stageIndex + 1;\n\t\t\t\t\t\t\t// If the new stage is \"submit\", get another stage instead. This is because the logic is\n\t\t\t\t\t\t\t// different when failure happens after \"submit\" stage. This is validated in a separate test.\n\t\t\t\t\t\t\tif (index > failedStages.length - 2) {\n\t\t\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn failedStages[index];\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst retryAfterSeconds = 5;\n\t\t\t\t\t\tlet currentStage: SummaryStage = stage;\n\n\t\t\t\t\t\tawait startRunningSummarizer(\n\t\t\t\t\t\t\tundefined /* disableHeuristics */,\n\t\t\t\t\t\t\tasync () => {\n\t\t\t\t\t\t\t\tif (currentStage === \"submit\") {\n\t\t\t\t\t\t\t\t\treturn successfulSubmitSummary();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tconst error = new RetriableSummaryError(\n\t\t\t\t\t\t\t\t\t\t`Fail summarization at ${currentStage}`,\n\t\t\t\t\t\t\t\t\t\tretryAfterSeconds,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tconst failedResult: Partial<SubmitSummaryResult> = {\n\t\t\t\t\t\t\t\t\t\tstage: currentStage,\n\t\t\t\t\t\t\t\t\t\treferenceSequenceNumber: lastRefSeq,\n\t\t\t\t\t\t\t\t\t\tminimumSequenceNumber: 0,\n\t\t\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\treturn failedResult as SubmitSummaryResult;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\t\t// This should run a summarization because max ops has reached.\n\t\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps);\n\n\t\t\t\t\t\tfor (let attemptNumber = 1; attemptNumber <= maxAttempts; attemptNumber++) {\n\t\t\t\t\t\t\tawait validateSummaryAttemptFails(\n\t\t\t\t\t\t\t\tattemptNumber,\n\t\t\t\t\t\t\t\tmaxAttempts,\n\t\t\t\t\t\t\t\tcurrentStage,\n\t\t\t\t\t\t\t\tretryAfterSeconds,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t// Change the failure stage after 2 attempts.\n\t\t\t\t\t\t\tif (attemptNumber === 2) {\n\t\t\t\t\t\t\t\tcurrentStage = getNewStage();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Wait for \"retryAfterSeconds\". The next attempt should start after this.\n\t\t\t\t\t\t\tawait tickAndFlushPromises(retryAfterSeconds * 1000 + 1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Validate summarization is not run again.\n\t\t\t\t\t\tassertRunCounts(\n\t\t\t\t\t\t\tmaxAttempts,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t`Summarization should not have been attempted more than ${maxAttempts} times`,\n\t\t\t\t\t\t\t1 /** expectedStopCount */,\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tit(`should update max attempts on failure at ${titleStage} stage as per AttemptsForSubmitFailures`, async () => {\n\t\t\t\t\t\tconst retryAfterSeconds = 5;\n\t\t\t\t\t\tconst maxAttemptsOverride =\n\t\t\t\t\t\t\tstage === \"submit\"\n\t\t\t\t\t\t\t\t? defaultMaxAttempts\n\t\t\t\t\t\t\t\t: defaultMaxAttemptsForSubmitFailures - 1;\n\t\t\t\t\t\tsettings[\"Fluid.Summarizer.AttemptsForSubmitFailures\"] =\n\t\t\t\t\t\t\tmaxAttemptsOverride;\n\n\t\t\t\t\t\tawait startRunningSummarizer(undefined /* disableHeuristics */, async () =>\n\t\t\t\t\t\t\tsubmitSummaryCallback(stage, retryAfterSeconds),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\t\t// This should run a summarization because max ops has reached.\n\t\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps);\n\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tlet attemptNumber = 1;\n\t\t\t\t\t\t\tattemptNumber <= maxAttemptsOverride;\n\t\t\t\t\t\t\tattemptNumber++\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tawait validateSummaryAttemptFails(\n\t\t\t\t\t\t\t\tattemptNumber,\n\t\t\t\t\t\t\t\tmaxAttemptsOverride,\n\t\t\t\t\t\t\t\tstage,\n\t\t\t\t\t\t\t\tretryAfterSeconds,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// Wait for \"retryAfterSeconds\". The next attempt should start after this.\n\t\t\t\t\t\t\tawait tickAndFlushPromises(retryAfterSeconds * 1000 + 1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// validate that summarization is not run again.\n\t\t\t\t\t\tassertRunCounts(\n\t\t\t\t\t\t\tmaxAttemptsOverride,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t`Summarization should not have been attempted more than ${maxAttemptsOverride} times`,\n\t\t\t\t\t\t\t1 /** expectedStopCount */,\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * This test validates a special case where summarize failures switch from on of the submit stages to\n\t\t\t\t * a nack failure. Submit stage failures are retried more times than nack failures and so when the\n\t\t\t\t * failure switches from submit to nack, only one more retry happens irrespective of what the\n\t\t\t\t * defaultMaxAttempts value is.\n\t\t\t\t */\n\t\t\t\tfor (\n\t\t\t\t\tlet maxAttempts = 1;\n\t\t\t\t\tmaxAttempts < defaultMaxAttemptsForSubmitFailures;\n\t\t\t\t\tmaxAttempts++\n\t\t\t\t) {\n\t\t\t\t\tit(`should attempt one more time when stage changes to nack after ${maxAttempts} failed attempts`, async () => {\n\t\t\t\t\t\tconst retryAfterSeconds = 5;\n\t\t\t\t\t\tlet currentStage: SummaryStage = maxAttempts === 1 ? \"submit\" : \"generate\";\n\n\t\t\t\t\t\tawait startRunningSummarizer(\n\t\t\t\t\t\t\tundefined /* disableHeuristics */,\n\t\t\t\t\t\t\tasync () => {\n\t\t\t\t\t\t\t\tif (currentStage === \"submit\") {\n\t\t\t\t\t\t\t\t\treturn successfulSubmitSummary();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tconst error = new RetriableSummaryError(\n\t\t\t\t\t\t\t\t\t\t`Fail summarization at ${currentStage}`,\n\t\t\t\t\t\t\t\t\t\tretryAfterSeconds,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tconst failedResult: Partial<SubmitSummaryResult> = {\n\t\t\t\t\t\t\t\t\t\tstage: currentStage,\n\t\t\t\t\t\t\t\t\t\treferenceSequenceNumber: lastRefSeq,\n\t\t\t\t\t\t\t\t\t\tminimumSequenceNumber: 0,\n\t\t\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\treturn failedResult as SubmitSummaryResult;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// Fail at the \"generate\" stage 2 times.\n\t\t\t\t\t\tawait emitNextOp();\n\t\t\t\t\t\t// This should run a summarization because max ops has reached.\n\t\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps);\n\n\t\t\t\t\t\tlet attemptNumber = 1;\n\t\t\t\t\t\tfor (; attemptNumber <= maxAttempts; attemptNumber++) {\n\t\t\t\t\t\t\tawait validateSummaryAttemptFails(\n\t\t\t\t\t\t\t\tattemptNumber,\n\t\t\t\t\t\t\t\tmaxAttempts + 1,\n\t\t\t\t\t\t\t\tcurrentStage,\n\t\t\t\t\t\t\t\tretryAfterSeconds,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t// In the third attempt, fail at \"submit\" stage. This will trigger a nack failure. It should\n\t\t\t\t\t\t\t// not retry attempts anymore because \"defaultMaxAttempts\" attempts have already been done.\n\t\t\t\t\t\t\tif (attemptNumber === maxAttempts - 1) {\n\t\t\t\t\t\t\t\tcurrentStage = \"submit\";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Wait for \"retryAfterSeconds\". The next attempt should start after this.\n\t\t\t\t\t\t\tawait tickAndFlushPromises(retryAfterSeconds * 1000 + 1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Wait for \"retryAfterSeconds\". The next attempt should start after this.\n\t\t\t\t\t\tawait tickAndFlushPromises(retryAfterSeconds * 1000 + 1);\n\n\t\t\t\t\t\tawait validateSummaryAttemptFails(\n\t\t\t\t\t\t\tattemptNumber++,\n\t\t\t\t\t\t\tmaxAttempts + 1,\n\t\t\t\t\t\t\tcurrentStage,\n\t\t\t\t\t\t\tretryAfterSeconds,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// Wait for \"retryAfterSeconds\". There shouldn't be any more attempts.\n\t\t\t\t\t\tawait tickAndFlushPromises(retryAfterSeconds * 1000 + 1);\n\n\t\t\t\t\t\t// Validate summarization is not run again.\n\t\t\t\t\t\tassertRunCounts(\n\t\t\t\t\t\t\tmaxAttempts + 1,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t`Summarization should not have been attempted more than ${\n\t\t\t\t\t\t\t\tmaxAttempts + 1\n\t\t\t\t\t\t\t} times`,\n\t\t\t\t\t\t\t1 /** expectedStopCount */,\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tit(\"Should not retry last summary\", async () => {\n\t\t\t\t\tconst stage: SummaryStage = \"base\";\n\t\t\t\t\tconst retryAfterSeconds = 10;\n\t\t\t\t\tawait startRunningSummarizer(undefined /* disableHeuristics */, async () =>\n\t\t\t\t\t\tsubmitSummaryCallback(stage, retryAfterSeconds),\n\t\t\t\t\t);\n\n\t\t\t\t\t// This should trigger last summary when summarizer stops.\n\t\t\t\t\tawait emitNextOp(summaryConfig.minOpsForLastSummaryAttempt);\n\t\t\t\t\tconst stopP = summarizer.waitStop(true /* allowLastSummary */);\n\t\t\t\t\tawait flushPromises();\n\t\t\t\t\tawait stopP;\n\t\t\t\t\tsummarizer.dispose();\n\n\t\t\t\t\tassertRunCounts(1, 0, 0, \"should perform lastSummary\");\n\t\t\t\t\tconst expectedEvents: Omit<ITelemetryBaseEvent, \"category\">[] = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\teventName: \"Running:Summarize_cancel\",\n\t\t\t\t\t\t\tretryAfterSeconds,\n\t\t\t\t\t\t\tsummarizeCount: 1,\n\t\t\t\t\t\t\tstage,\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t\tmockLogger.assertMatch(\n\t\t\t\t\t\texpectedEvents,\n\t\t\t\t\t\t`last summary attempt did not fail as expected`,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Wait for \"retryAfterSeconds\". There shouldn't be any more attempts.\n\t\t\t\t\tawait tickAndFlushPromises(retryAfterSeconds * 1000 + 1);\n\t\t\t\t\tassertRunCounts(1, 0, 0, \"should not retry lastSummary\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"On-demand Summaries\", () => {\n\t\t\t\tconst reason = \"test\";\n\t\t\t\t// This is used to validate the summarizeReason property in telemetry.\n\t\t\t\tconst summarizeReason = `onDemand/${reason}`;\n\n\t\t\t\tbeforeEach(async () => {\n\t\t\t\t\tawait startRunningSummarizer();\n\t\t\t\t});\n\n\t\t\t\tit(\"Should create an on-demand summary\", async () => {\n\t\t\t\t\tawait emitNextOp(2); // set ref seq to 2\n\t\t\t\t\tconst result = summarizer.summarizeOnDemand({ reason });\n\n\t\t\t\t\tconst submitResult = await result.summarySubmitted;\n\t\t\t\t\tassertRunCounts(1, 0, 0, \"on-demand should run\");\n\n\t\t\t\t\tassert(submitResult.success, \"on-demand summary should submit\");\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsubmitResult.data.stage === \"submit\",\n\t\t\t\t\t\t\"on-demand summary submitted data stage should be submit\",\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.strictEqual(submitResult.data.referenceSequenceNumber, 2, \"ref seq num\");\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsubmitResult.data.summaryTree !== undefined,\n\t\t\t\t\t\t\"summary tree should exist\",\n\t\t\t\t\t);\n\n\t\t\t\t\tconst broadcastResult = await result.summaryOpBroadcasted;\n\t\t\t\t\tassert(broadcastResult.success, \"summary op should be broadcast\");\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbroadcastResult.data.summarizeOp.referenceSequenceNumber,\n\t\t\t\t\t\t2,\n\t\t\t\t\t\t\"summarize op ref seq num should be same as summary seq\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbroadcastResult.data.summarizeOp.sequenceNumber,\n\t\t\t\t\t\t3,\n\t\t\t\t\t\t\"unexpected summary sequence number\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbroadcastResult.data.summarizeOp.contents.handle,\n\t\t\t\t\t\t\"test-broadcast-handle\",\n\t\t\t\t\t\t\"summarize op handle should be test-broadcast-handle\",\n\t\t\t\t\t);\n\n\t\t\t\t\tassert(\n\t\t\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\teventName: \"Running:Summarize_generate\",\n\t\t\t\t\t\t\t\tsummarizeCount: runCount,\n\t\t\t\t\t\t\t\tsummarizeReason,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\teventName: \"Running:Summarize_Op\",\n\t\t\t\t\t\t\t\tsummarizeCount: runCount,\n\t\t\t\t\t\t\t\tsummarizeReason,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]),\n\t\t\t\t\t\t\"unexpected log sequence\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Verify that heuristics are blocked while waiting for ack\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(1, 0, 0);\n\n\t\t\t\t\tawait emitAck();\n\t\t\t\t\tconst ackNackResult = await result.receivedSummaryAckOrNack;\n\t\t\t\t\tassert(ackNackResult.success, \"on-demand summary should succeed\");\n\t\t\t\t\tassert(\n\t\t\t\t\t\tackNackResult.data.summaryAckOp.type === MessageType.SummaryAck,\n\t\t\t\t\t\t\"should be ack\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tackNackResult.data.summaryAckOp.contents.handle === \"test-ack-handle\",\n\t\t\t\t\t\t\"summary ack handle should be test-ack-handle\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should return already running for on-demand summary\", async () => {\n\t\t\t\t\t// Should start running by heuristics\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(1, 0, 0);\n\n\t\t\t\t\tlet resolved = false;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsummarizer.summarizeOnDemand({ reason });\n\t\t\t\t\t\tresolved = true;\n\t\t\t\t\t} catch {}\n\n\t\t\t\t\tawait flushPromises();\n\t\t\t\t\tassert(resolved === false, \"already running promise should not resolve yet\");\n\t\t\t\t});\n\n\t\t\t\tit(\"On-demand summary should fail on nack\", async () => {\n\t\t\t\t\tawait emitNextOp(2); // set ref seq to 2\n\t\t\t\t\tconst result = summarizer.summarizeOnDemand({ reason });\n\n\t\t\t\t\tconst submitResult = await result.summarySubmitted;\n\t\t\t\t\tassertRunCounts(1, 0, 0, \"on-demand should run\");\n\n\t\t\t\t\tassert(submitResult.success, \"on-demand summary should submit\");\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsubmitResult.data.stage === \"submit\",\n\t\t\t\t\t\t\"on-demand summary submitted data stage should be submit\",\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.strictEqual(submitResult.data.referenceSequenceNumber, 2, \"ref seq num\");\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsubmitResult.data.summaryTree !== undefined,\n\t\t\t\t\t\t\"summary tree should exist\",\n\t\t\t\t\t);\n\n\t\t\t\t\tconst broadcastResult = await result.summaryOpBroadcasted;\n\t\t\t\t\tassert(broadcastResult.success, \"summary op should be broadcast\");\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbroadcastResult.data.summarizeOp.referenceSequenceNumber,\n\t\t\t\t\t\t2,\n\t\t\t\t\t\t\"summarize op ref seq num should be same as summary seq\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbroadcastResult.data.summarizeOp.sequenceNumber,\n\t\t\t\t\t\t3,\n\t\t\t\t\t\t\"unexpected summary sequence number\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbroadcastResult.data.summarizeOp.contents.handle,\n\t\t\t\t\t\t\"test-broadcast-handle\",\n\t\t\t\t\t\t\"summarize op handle should be test-broadcast-handle\",\n\t\t\t\t\t);\n\n\t\t\t\t\tassert(\n\t\t\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\teventName: \"Running:Summarize_generate\",\n\t\t\t\t\t\t\t\tsummarizeCount: runCount,\n\t\t\t\t\t\t\t\tsummarizeReason,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\teventName: \"Running:Summarize_Op\",\n\t\t\t\t\t\t\t\tsummarizeCount: runCount,\n\t\t\t\t\t\t\t\tsummarizeReason,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]),\n\t\t\t\t\t\t\"unexpected log sequence\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Verify that heuristics are blocked while waiting for ack\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(1, 0, 0);\n\n\t\t\t\t\tawait emitNack();\n\t\t\t\t\tconst ackNackResult = await result.receivedSummaryAckOrNack;\n\t\t\t\t\tassert(!ackNackResult.success, \"on-demand summary should fail\");\n\t\t\t\t\tassert(\n\t\t\t\t\t\tackNackResult.data?.summaryNackOp.type === MessageType.SummaryNack,\n\t\t\t\t\t\t\"should be nack\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tJSON.parse((ackNackResult.data.summaryNackOp as any).data).message ===\n\t\t\t\t\t\t\t\"test-nack\",\n\t\t\t\t\t\t\"summary nack error should be test-nack\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should fail an on-demand summary if stopping\", async () => {\n\t\t\t\t\tsummarizer.waitStop(true).catch(() => {});\n\t\t\t\t\tconst [refreshLatestAck, fullTree] = [true, true];\n\t\t\t\t\tconst result1 = summarizer.summarizeOnDemand({ reason: \"test1\" });\n\t\t\t\t\tconst result2 = summarizer.summarizeOnDemand({\n\t\t\t\t\t\treason: \"test2\",\n\t\t\t\t\t\trefreshLatestAck,\n\t\t\t\t\t});\n\t\t\t\t\tconst result3 = summarizer.summarizeOnDemand({\n\t\t\t\t\t\treason: \"test3\",\n\t\t\t\t\t\tfullTree,\n\t\t\t\t\t});\n\t\t\t\t\tconst result4 = summarizer.summarizeOnDemand({\n\t\t\t\t\t\treason: \"test4\",\n\t\t\t\t\t\trefreshLatestAck,\n\t\t\t\t\t\tfullTree,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst allResults = (\n\t\t\t\t\t\tawait Promise.all([\n\t\t\t\t\t\t\tresult1.summarySubmitted,\n\t\t\t\t\t\t\tresult1.summaryOpBroadcasted,\n\t\t\t\t\t\t\tresult1.receivedSummaryAckOrNack,\n\t\t\t\t\t\t\tresult2.summarySubmitted,\n\t\t\t\t\t\t\tresult2.summaryOpBroadcasted,\n\t\t\t\t\t\t\tresult2.receivedSummaryAckOrNack,\n\t\t\t\t\t\t])\n\t\t\t\t\t).concat(\n\t\t\t\t\t\tawait Promise.all([\n\t\t\t\t\t\t\tresult3.summarySubmitted,\n\t\t\t\t\t\t\tresult3.summaryOpBroadcasted,\n\t\t\t\t\t\t\tresult3.receivedSummaryAckOrNack,\n\t\t\t\t\t\t\tresult4.summarySubmitted,\n\t\t\t\t\t\t\tresult4.summaryOpBroadcasted,\n\t\t\t\t\t\t\tresult4.receivedSummaryAckOrNack,\n\t\t\t\t\t\t]),\n\t\t\t\t\t);\n\t\t\t\t\tfor (const result of allResults) {\n\t\t\t\t\t\tassert(!result.success, \"all results should fail\");\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tit(\"Should fail an on-demand summary if disposed\", async () => {\n\t\t\t\t\tsummarizer.dispose();\n\t\t\t\t\tconst [refreshLatestAck, fullTree] = [true, true];\n\t\t\t\t\tconst result1 = summarizer.summarizeOnDemand({ reason: \"test1\" });\n\t\t\t\t\tconst result2 = summarizer.summarizeOnDemand({\n\t\t\t\t\t\treason: \"test2\",\n\t\t\t\t\t\trefreshLatestAck,\n\t\t\t\t\t});\n\t\t\t\t\tconst result3 = summarizer.summarizeOnDemand({\n\t\t\t\t\t\treason: \"test3\",\n\t\t\t\t\t\tfullTree,\n\t\t\t\t\t});\n\t\t\t\t\tconst result4 = summarizer.summarizeOnDemand({\n\t\t\t\t\t\treason: \"test4\",\n\t\t\t\t\t\trefreshLatestAck,\n\t\t\t\t\t\tfullTree,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst allResults = (\n\t\t\t\t\t\tawait Promise.all([\n\t\t\t\t\t\t\tresult1.summarySubmitted,\n\t\t\t\t\t\t\tresult1.summaryOpBroadcasted,\n\t\t\t\t\t\t\tresult1.receivedSummaryAckOrNack,\n\t\t\t\t\t\t\tresult2.summarySubmitted,\n\t\t\t\t\t\t\tresult2.summaryOpBroadcasted,\n\t\t\t\t\t\t\tresult2.receivedSummaryAckOrNack,\n\t\t\t\t\t\t])\n\t\t\t\t\t).concat(\n\t\t\t\t\t\tawait Promise.all([\n\t\t\t\t\t\t\tresult3.summarySubmitted,\n\t\t\t\t\t\t\tresult3.summaryOpBroadcasted,\n\t\t\t\t\t\t\tresult3.receivedSummaryAckOrNack,\n\t\t\t\t\t\t\tresult4.summarySubmitted,\n\t\t\t\t\t\t\tresult4.summaryOpBroadcasted,\n\t\t\t\t\t\t\tresult4.receivedSummaryAckOrNack,\n\t\t\t\t\t\t]),\n\t\t\t\t\t);\n\t\t\t\t\tfor (const result of allResults) {\n\t\t\t\t\t\tassert(!result.success, \"all results should fail\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Enqueue Summaries\", () => {\n\t\t\t\tconst reason = \"test\";\n\t\t\t\t// This is used to validate the summarizeReason property in telemetry.\n\t\t\t\tconst summarizeReason = `enqueuedSummary/enqueue;${reason}`;\n\n\t\t\t\tbeforeEach(async () => {\n\t\t\t\t\tawait startRunningSummarizer();\n\t\t\t\t});\n\n\t\t\t\tit(\"Should summarize after specified sequence number\", async () => {\n\t\t\t\t\tawait emitNextOp(2); // set ref seq to 2\n\t\t\t\t\tconst afterSequenceNumber = 9;\n\t\t\t\t\tconst result = summarizer.enqueueSummarize({\n\t\t\t\t\t\treason,\n\t\t\t\t\t\tafterSequenceNumber,\n\t\t\t\t\t});\n\t\t\t\t\tassert(result.alreadyEnqueued === undefined, \"should not be already enqueued\");\n\n\t\t\t\t\tawait emitNextOp(6);\n\t\t\t\t\tassertRunCounts(0, 0, 0, \"enqueued should not run yet, still 1 op short\");\n\n\t\t\t\t\tawait emitNextOp(1);\n\t\t\t\t\tassertRunCounts(1, 0, 0, \"enqueued should run\");\n\n\t\t\t\t\tconst submitResult = await result.summarySubmitted;\n\t\t\t\t\tassert(submitResult.success, \"enqueued summary should submit\");\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsubmitResult.data.stage === \"submit\",\n\t\t\t\t\t\t\"enqueued summary submitted data stage should be submit\",\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.strictEqual(submitResult.data.referenceSequenceNumber, 9, \"ref seq num\");\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsubmitResult.data.summaryTree !== undefined,\n\t\t\t\t\t\t\"summary tree should exist\",\n\t\t\t\t\t);\n\n\t\t\t\t\tconst broadcastResult = await result.summaryOpBroadcasted;\n\t\t\t\t\tassert(broadcastResult.success, \"summary op should be broadcast\");\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbroadcastResult.data.summarizeOp.referenceSequenceNumber,\n\t\t\t\t\t\t9,\n\t\t\t\t\t\t\"summarize op ref seq num should be same as summary seq\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbroadcastResult.data.summarizeOp.sequenceNumber,\n\t\t\t\t\t\t10,\n\t\t\t\t\t\t\"unexpected summary sequence number\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbroadcastResult.data.summarizeOp.contents.handle,\n\t\t\t\t\t\t\"test-broadcast-handle\",\n\t\t\t\t\t\t\"summarize op handle should be test-broadcast-handle\",\n\t\t\t\t\t);\n\n\t\t\t\t\tassert(\n\t\t\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\teventName: \"Running:Summarize_generate\",\n\t\t\t\t\t\t\t\tsummarizeCount: runCount,\n\t\t\t\t\t\t\t\tsummarizeReason,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\teventName: \"Running:Summarize_Op\",\n\t\t\t\t\t\t\t\tsummarizeCount: runCount,\n\t\t\t\t\t\t\t\tsummarizeReason,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]),\n\t\t\t\t\t\t\"unexpected log sequence\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Verify that heuristics are blocked while waiting for ack\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(1, 0, 0);\n\n\t\t\t\t\tawait emitAck();\n\t\t\t\t\tconst ackNackResult = await result.receivedSummaryAckOrNack;\n\t\t\t\t\tassert(ackNackResult.success, \"enqueued summary should succeed\");\n\t\t\t\t\tassert(\n\t\t\t\t\t\tackNackResult.data.summaryAckOp.type === MessageType.SummaryAck,\n\t\t\t\t\t\t\"should be ack\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tackNackResult.data.summaryAckOp.contents.handle === \"test-ack-handle\",\n\t\t\t\t\t\t\"summary ack handle should be test-ack-handle\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should summarize after specified sequence number after heuristics attempt finishes\", async () => {\n\t\t\t\t\tconst afterSequenceNumber = summaryConfig.maxOps * 2 + 10;\n\n\t\t\t\t\t// Should start running by heuristics\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(1, 0, 0);\n\n\t\t\t\t\tconst result = summarizer.enqueueSummarize({\n\t\t\t\t\t\treason,\n\t\t\t\t\t\tafterSequenceNumber,\n\t\t\t\t\t});\n\t\t\t\t\tassert(result.alreadyEnqueued === undefined, \"should not be already enqueued\");\n\t\t\t\t\tlet submitRan = false;\n\t\t\t\t\tresult.summarySubmitted.then(\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tsubmitRan = true;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {},\n\t\t\t\t\t);\n\n\t\t\t\t\t// Even after finishing first heuristic summary, enqueued shouldn't run yet.\n\t\t\t\t\tawait emitAck();\n\n\t\t\t\t\t// Should start running by heuristics again.\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(2, 0, 0);\n\t\t\t\t\tawait emitNextOp(20); // make sure enqueued is ready\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsubmitRan === false,\n\t\t\t\t\t\t\"enqueued summary should not run until 2nd heuristic ack\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// After this ack, it should start running enqueued summary.\n\t\t\t\t\tawait emitAck();\n\t\t\t\t\tassert((submitRan as boolean) === true, \"enqueued summary should run\");\n\t\t\t\t\tassertRunCounts(3, 0, 0);\n\n\t\t\t\t\tconst submitResult = await result.summarySubmitted;\n\t\t\t\t\tassert(submitResult.success, \"enqueued summary should submit\");\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsubmitResult.data.stage === \"submit\",\n\t\t\t\t\t\t\"enqueued summary submitted data stage should be submit\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// 26 = 22 regular runtime ops + 2 summary ack ops + 2 summarize ops\n\t\t\t\t\tconst expectedRefSeqNum = summaryConfig.maxOps * 2 + 26;\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tsubmitResult.data.referenceSequenceNumber,\n\t\t\t\t\t\texpectedRefSeqNum,\n\t\t\t\t\t\t\"ref seq num\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsubmitResult.data.summaryTree !== undefined,\n\t\t\t\t\t\t\"summary tree should exist\",\n\t\t\t\t\t);\n\n\t\t\t\t\tconst broadcastResult = await result.summaryOpBroadcasted;\n\t\t\t\t\tassert(broadcastResult.success, \"summary op should be broadcast\");\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbroadcastResult.data.summarizeOp.referenceSequenceNumber,\n\t\t\t\t\t\texpectedRefSeqNum,\n\t\t\t\t\t\t\"summarize op ref seq num should be same as summary seq\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbroadcastResult.data.summarizeOp.sequenceNumber,\n\t\t\t\t\t\texpectedRefSeqNum + 1,\n\t\t\t\t\t\t\"unexpected summary sequence number\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbroadcastResult.data.summarizeOp.contents.handle,\n\t\t\t\t\t\t\"test-broadcast-handle\",\n\t\t\t\t\t\t\"summarize op handle should be test-broadcast-handle\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Verify that heuristics are blocked while waiting for ack\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(3, 0, 0);\n\n\t\t\t\t\tawait emitAck();\n\t\t\t\t\tconst ackNackResult = await result.receivedSummaryAckOrNack;\n\t\t\t\t\tassert(ackNackResult.success, \"enqueued summary should succeed\");\n\t\t\t\t\tassert(\n\t\t\t\t\t\tackNackResult.data.summaryAckOp.type === MessageType.SummaryAck,\n\t\t\t\t\t\t\"should be ack\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tackNackResult.data.summaryAckOp.contents.handle === \"test-ack-handle\",\n\t\t\t\t\t\t\"summary ack handle should be test-ack-handle\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should reject subsequent enqueued summarize attempt unless overridden\", async () => {\n\t\t\t\t\tawait emitNextOp(2); // set ref seq to 2\n\t\t\t\t\tconst afterSequenceNumber = 9;\n\t\t\t\t\tconst result = summarizer.enqueueSummarize({\n\t\t\t\t\t\treason,\n\t\t\t\t\t\tafterSequenceNumber,\n\t\t\t\t\t});\n\t\t\t\t\tassert(result.alreadyEnqueued === undefined, \"should not be already enqueued\");\n\n\t\t\t\t\t// While first attempt is still enqueued, it should reject subsequent ones\n\t\t\t\t\tconst result2 = summarizer.enqueueSummarize({ reason: \"test-fail\" });\n\t\t\t\t\tassert(result2.alreadyEnqueued === true, \"should be already enqueued\");\n\t\t\t\t\tassert(result2.overridden === undefined, \"should not be overridden\");\n\n\t\t\t\t\tconst result3 = summarizer.enqueueSummarize({\n\t\t\t\t\t\treason: \"test-override\",\n\t\t\t\t\t\toverride: true,\n\t\t\t\t\t});\n\t\t\t\t\tassert(result3.alreadyEnqueued === true, \"should be already enqueued\");\n\t\t\t\t\tassert(result3.overridden === true, \"should be overridden\");\n\n\t\t\t\t\tconst firstResults = await Promise.all([\n\t\t\t\t\t\tresult.summarySubmitted,\n\t\t\t\t\t\tresult.summaryOpBroadcasted,\n\t\t\t\t\t\tresult.receivedSummaryAckOrNack,\n\t\t\t\t\t]);\n\t\t\t\t\tfor (const firstResult of firstResults) {\n\t\t\t\t\t\tassert(firstResult.success === false, \"should fail because of override\");\n\t\t\t\t\t}\n\n\t\t\t\t\tawait emitAck();\n\t\t\t\t\tconst newResults = await Promise.all([\n\t\t\t\t\t\tresult3.summarySubmitted,\n\t\t\t\t\t\tresult3.summaryOpBroadcasted,\n\t\t\t\t\t\tresult3.receivedSummaryAckOrNack,\n\t\t\t\t\t]);\n\t\t\t\t\tfor (const newResult of newResults) {\n\t\t\t\t\t\tassert(newResult.success === true, \"should succeed\");\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tit(\"Should fail an enqueue summarize attempt if stopping\", async () => {\n\t\t\t\t\tsummarizer.waitStop(true).catch(() => {});\n\t\t\t\t\tconst result1 = summarizer.enqueueSummarize({ reason: \"test1\" });\n\t\t\t\t\tassert(result1.alreadyEnqueued === undefined, \"should not be already enqueued\");\n\t\t\t\t\tconst result2 = summarizer.enqueueSummarize({\n\t\t\t\t\t\treason: \"test2\",\n\t\t\t\t\t\tafterSequenceNumber: 123,\n\t\t\t\t\t});\n\t\t\t\t\tassert(result2.alreadyEnqueued === undefined, \"should not be already enqueued\");\n\n\t\t\t\t\tconst allResults = await Promise.all([\n\t\t\t\t\t\tresult1.summarySubmitted,\n\t\t\t\t\t\tresult1.summaryOpBroadcasted,\n\t\t\t\t\t\tresult1.receivedSummaryAckOrNack,\n\t\t\t\t\t\tresult2.summarySubmitted,\n\t\t\t\t\t\tresult2.summaryOpBroadcasted,\n\t\t\t\t\t\tresult2.receivedSummaryAckOrNack,\n\t\t\t\t\t]);\n\t\t\t\t\tfor (const result of allResults) {\n\t\t\t\t\t\tassert(!result.success, \"all results should fail\");\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tit(\"Should fail an enqueue summarize attempt if disposed\", async () => {\n\t\t\t\t\tsummarizer.dispose();\n\t\t\t\t\tconst result1 = summarizer.enqueueSummarize({ reason: \"test1\" });\n\t\t\t\t\tassert(result1.alreadyEnqueued === undefined, \"should not be already enqueued\");\n\t\t\t\t\tconst result2 = summarizer.enqueueSummarize({\n\t\t\t\t\t\treason: \"test2\",\n\t\t\t\t\t\tafterSequenceNumber: 123,\n\t\t\t\t\t});\n\t\t\t\t\tassert(result2.alreadyEnqueued === undefined, \"should not be already enqueued\");\n\n\t\t\t\t\tconst allResults = await Promise.all([\n\t\t\t\t\t\tresult1.summarySubmitted,\n\t\t\t\t\t\tresult1.summaryOpBroadcasted,\n\t\t\t\t\t\tresult1.receivedSummaryAckOrNack,\n\t\t\t\t\t\tresult2.summarySubmitted,\n\t\t\t\t\t\tresult2.summaryOpBroadcasted,\n\t\t\t\t\t\tresult2.receivedSummaryAckOrNack,\n\t\t\t\t\t]);\n\t\t\t\t\tfor (const result of allResults) {\n\t\t\t\t\t\tassert(!result.success, \"all results should fail\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Summary Start\", () => {\n\t\t\t\tit(\"Should summarize immediately if summary ack is missing at startup\", async () => {\n\t\t\t\t\tassertRunCounts(0, 0, 0);\n\t\t\t\t\t// Simulate as summary op was in op stream.\n\t\t\t\t\tconst summaryTimestamp = Date.now();\n\t\t\t\t\temitBroadcast(summaryTimestamp);\n\n\t\t\t\t\tlet startStatus: \"starting\" | \"started\" | \"failed\" = \"starting\";\n\t\t\t\t\tstartRunningSummarizer().then(\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tstartStatus = \"started\";\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tstartStatus = \"failed\";\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tawait flushPromises();\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tstartStatus,\n\t\t\t\t\t\t\"starting\",\n\t\t\t\t\t\t\"RunningSummarizer should still be starting since outstanding summary op\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Still should be waiting\n\t\t\t\t\tawait emitNextOp(1, summaryTimestamp + summaryConfig.maxAckWaitTime - 1);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tstartStatus,\n\t\t\t\t\t\t\"starting\",\n\t\t\t\t\t\t\"RunningSummarizer should still be starting since timestamp is within maxAckWaitTime\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Emit next op after maxAckWaitTime\n\t\t\t\t\t// clock.tick(summaryConfig.maxAckWaitTime + 1000);\n\t\t\t\t\tawait emitNextOp(1, summaryTimestamp + summaryConfig.maxAckWaitTime);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t\t\t{ eventName: \"Running:MissingSummaryAckFoundByOps\" },\n\t\t\t\t\t\t]),\n\t\t\t\t\t\t\"unexpected log sequence 1\",\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tstartStatus,\n\t\t\t\t\t\t\"started\",\n\t\t\t\t\t\t\"RunningSummarizer should be started from the above op\",\n\t\t\t\t\t);\n\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(1, 0, 0, \"Should run summarizer once\");\n\t\t\t\t\tassert(\n\t\t\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t\t\t{ eventName: \"Running:Summarize_generate\", summarizeCount: runCount },\n\t\t\t\t\t\t\t{ eventName: \"Running:Summarize_Op\", summarizeCount: runCount },\n\t\t\t\t\t\t]),\n\t\t\t\t\t\t\"unexpected log sequence 2\",\n\t\t\t\t\t);\n\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!mockLogger.matchEvents([{ eventName: \"Running:Summarize_end\" }]),\n\t\t\t\t\t\t\"No ack expected yet\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Now emit ack\n\t\t\t\t\tawait emitAck();\n\t\t\t\t\tassert(\n\t\t\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\teventName: \"Running:Summarize_end\",\n\t\t\t\t\t\t\t\tsummarizeCount: runCount,\n\t\t\t\t\t\t\t\tsummarizerSuccessfulAttempts: runCount,\n\t\t\t\t\t\t\t\tsummarizeReason: \"maxOps\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]),\n\t\t\t\t\t\t\"unexpected log sequence 3\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Disabled Heuristics\", () => {\n\t\t\t\tit(\"Should not summarize after time or ops\", async () => {\n\t\t\t\t\tawait startRunningSummarizer(true /* disableHeuristics */);\n\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(0, 0, 0, \"should not summarize after maxOps\");\n\n\t\t\t\t\tawait tickAndFlushPromises(summaryConfig.minIdleTime + 1);\n\t\t\t\t\tassertRunCounts(0, 0, 0, \"should not summarize after minIdleTime\");\n\n\t\t\t\t\tawait tickAndFlushPromises(summaryConfig.maxTime + 1);\n\t\t\t\t\tassertRunCounts(0, 0, 0, \"should not summarize after maxTime\");\n\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps * 3 + 10000);\n\t\t\t\t\tawait tickAndFlushPromises(\n\t\t\t\t\t\tsummaryConfig.maxTime * 3 + summaryConfig.minIdleTime * 3 + 10000,\n\t\t\t\t\t);\n\t\t\t\t\tassertRunCounts(0, 0, 0, \"make extra sure\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should not summarize before closing\", async () => {\n\t\t\t\t\tawait startRunningSummarizer(true /* disableHeuristics */);\n\n\t\t\t\t\tawait emitNextOp(summaryConfig.minOpsForLastSummaryAttempt);\n\t\t\t\t\tconst stopP = summarizer.waitStop(true);\n\t\t\t\t\tawait flushPromises();\n\t\t\t\t\tawait emitAck();\n\t\t\t\t\tawait stopP;\n\n\t\t\t\t\tassertRunCounts(0, 0, 0, \"should not perform lastSummary\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should not summarize immediately if summary ack is missing at startup when disabled\", async () => {\n\t\t\t\t\tassertRunCounts(0, 0, 0);\n\t\t\t\t\t// Simulate as summary op was in op stream.\n\t\t\t\t\tconst summaryTimestamp = Date.now();\n\t\t\t\t\temitBroadcast(summaryTimestamp);\n\n\t\t\t\t\tlet startStatus: \"starting\" | \"started\" | \"failed\" = \"starting\";\n\t\t\t\t\tstartRunningSummarizer(true /* disableHeuristics */).then(\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tstartStatus = \"started\";\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tstartStatus = \"failed\";\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tawait flushPromises();\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tstartStatus,\n\t\t\t\t\t\t\"starting\",\n\t\t\t\t\t\t\"RunningSummarizer should still be starting since outstanding summary op\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Still should be waiting\n\t\t\t\t\tawait emitNextOp(1, summaryTimestamp + summaryConfig.maxAckWaitTime - 1);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tstartStatus,\n\t\t\t\t\t\t\"starting\",\n\t\t\t\t\t\t\"RunningSummarizer should still be starting since timestamp is within maxAckWaitTime\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Emit next op after maxAckWaitTime\n\t\t\t\t\t// clock.tick(summaryConfig.maxAckWaitTime + 1000);\n\t\t\t\t\tawait emitNextOp(1, summaryTimestamp + summaryConfig.maxAckWaitTime);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t\t\t{ eventName: \"Running:MissingSummaryAckFoundByOps\" },\n\t\t\t\t\t\t]),\n\t\t\t\t\t\t\"unexpected log sequence 1\",\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tstartStatus,\n\t\t\t\t\t\t\"started\",\n\t\t\t\t\t\t\"RunningSummarizer should be started from the above op\",\n\t\t\t\t\t);\n\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tassertRunCounts(0, 0, 0, \"Should not run summarizer\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Summarize events\", () => {\n\t\t\t\t/**\n\t\t\t\t * Helper function that creates a promise that would resolve when \"summarize\" event is emitted.\n\t\t\t\t */\n\t\t\t\tasync function getSummarizeEventPromise() {\n\t\t\t\t\treturn new Promise<ISummarizeEventProps>((resolve) => {\n\t\t\t\t\t\tconst handler = (props: ISummarizeEventProps) => {\n\t\t\t\t\t\t\tsummarizer.off(\"summarize\", handler);\n\t\t\t\t\t\t\tresolve(props);\n\t\t\t\t\t\t};\n\t\t\t\t\t\tsummarizer.on(\"summarize\", handler);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tbeforeEach(async () => {\n\t\t\t\t\t// Currently, summarize events are only logged with this feature.\n\t\t\t\t\tsettings[\"Fluid.Summarizer.UseDynamicRetries\"] = true;\n\t\t\t\t});\n\n\t\t\t\tit(\"should emit summarize event with success result\", async () => {\n\t\t\t\t\tawait startRunningSummarizer();\n\t\t\t\t\tconst summarizePromiseP = getSummarizeEventPromise();\n\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tawait emitAck();\n\n\t\t\t\t\tconst eventProps = await summarizePromiseP;\n\t\t\t\t\tconst expectedEventProps: ISummarizeEventProps = {\n\t\t\t\t\t\tresult: \"success\",\n\t\t\t\t\t\tcurrentAttempt: 1,\n\t\t\t\t\t\tmaxAttempts: defaultMaxAttempts,\n\t\t\t\t\t};\n\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\teventProps,\n\t\t\t\t\t\texpectedEventProps,\n\t\t\t\t\t\t\"Summarize event not as expected\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"should emit summarize event with failed result\", async () => {\n\t\t\t\t\tawait startRunningSummarizer();\n\t\t\t\t\tconst summarizePromiseP = getSummarizeEventPromise();\n\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tawait emitNack();\n\n\t\t\t\t\tconst { error, ...eventProps } = await summarizePromiseP;\n\t\t\t\t\tconst expectedEventProps: ISummarizeEventProps = {\n\t\t\t\t\t\tresult: \"failure\",\n\t\t\t\t\t\tcurrentAttempt: 1,\n\t\t\t\t\t\tmaxAttempts: defaultMaxAttempts,\n\t\t\t\t\t};\n\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\teventProps,\n\t\t\t\t\t\texpectedEventProps,\n\t\t\t\t\t\t\"Summarize event not as expected\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"should emit summarize event with canceled result\", async () => {\n\t\t\t\t\tawait startRunningSummarizer(\n\t\t\t\t\t\tundefined /* disableHeuristics */,\n\t\t\t\t\t\tundefined /* submitSummaryCallback */,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcancelled: true,\n\t\t\t\t\t\t\twaitCancelled: new Promise(() => {}),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tconst summarizePromiseP = getSummarizeEventPromise();\n\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\t\t\t\t\tawait emitNack();\n\n\t\t\t\t\tconst eventProps = await summarizePromiseP;\n\t\t\t\t\tconst expectedEventProps: ISummarizeEventProps = {\n\t\t\t\t\t\tresult: \"canceled\",\n\t\t\t\t\t\tcurrentAttempt: 1,\n\t\t\t\t\t\tmaxAttempts: defaultMaxAttempts,\n\t\t\t\t\t};\n\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\teventProps,\n\t\t\t\t\t\texpectedEventProps,\n\t\t\t\t\t\t\"Summarize event not as expected\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"should emit summarize event for every attempt with nack failure\", async () => {\n\t\t\t\t\tawait startRunningSummarizer();\n\t\t\t\t\tconst retryAfterSeconds = 5;\n\t\t\t\t\tlet summarizePromiseP = getSummarizeEventPromise();\n\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\n\t\t\t\t\t// Nack failures are attempted defaultMaxAttempts times. Each attempt should emit \"summarize\" event.\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet attemptNumber = 1;\n\t\t\t\t\t\tattemptNumber <= defaultMaxAttempts;\n\t\t\t\t\t\tattemptNumber++\n\t\t\t\t\t) {\n\t\t\t\t\t\tawait emitNack(retryAfterSeconds);\n\t\t\t\t\t\tconst { error, ...eventProps } = await summarizePromiseP;\n\t\t\t\t\t\tconst expectedEventProps: ISummarizeEventProps = {\n\t\t\t\t\t\t\tresult: \"failure\",\n\t\t\t\t\t\t\tcurrentAttempt: attemptNumber,\n\t\t\t\t\t\t\tmaxAttempts: defaultMaxAttempts,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\t\teventProps,\n\t\t\t\t\t\t\texpectedEventProps,\n\t\t\t\t\t\t\t`Summarize event for attempt ${attemptNumber} not as expected`,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tsummarizePromiseP = getSummarizeEventPromise();\n\n\t\t\t\t\t\t// Wait for \"retryAfterSeconds\". The next attempt should start after this.\n\t\t\t\t\t\tawait tickAndFlushPromises(retryAfterSeconds * 1000 + 1);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tit(\"should emit summarize event for every attempt with submit failure\", async () => {\n\t\t\t\t\tconst retryAfterSeconds = 5;\n\t\t\t\t\t// Callback that would result in summarization failed during submit.\n\t\t\t\t\tconst submitSummaryCallback = async (): Promise<SubmitSummaryResult> => {\n\t\t\t\t\t\tconst error = new RetriableSummaryError(\n\t\t\t\t\t\t\t`Fail summarization at base stage`,\n\t\t\t\t\t\t\tretryAfterSeconds,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst failedResult: Partial<SubmitSummaryResult> = {\n\t\t\t\t\t\t\tstage: \"base\",\n\t\t\t\t\t\t\treferenceSequenceNumber: lastRefSeq,\n\t\t\t\t\t\t\tminimumSequenceNumber: 0,\n\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn failedResult as SubmitSummaryResult;\n\t\t\t\t\t};\n\n\t\t\t\t\tawait startRunningSummarizer(\n\t\t\t\t\t\tundefined /* disableHeuristics */,\n\t\t\t\t\t\tsubmitSummaryCallback,\n\t\t\t\t\t);\n\t\t\t\t\tlet summarizePromiseP = getSummarizeEventPromise();\n\t\t\t\t\tawait emitNextOp(summaryConfig.maxOps + 1);\n\n\t\t\t\t\t// Submit failures are attempted defaultMaxAttemptsForSubmitFailures times.\n\t\t\t\t\t// Each attempt should emit \"summarize\" event.\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet attemptNumber = 1;\n\t\t\t\t\t\tattemptNumber <= defaultMaxAttemptsForSubmitFailures;\n\t\t\t\t\t\tattemptNumber++\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst { error, ...eventProps } = await summarizePromiseP;\n\t\t\t\t\t\tconst expectedEventProps: ISummarizeEventProps = {\n\t\t\t\t\t\t\tresult: \"failure\",\n\t\t\t\t\t\t\tcurrentAttempt: attemptNumber,\n\t\t\t\t\t\t\tmaxAttempts: defaultMaxAttemptsForSubmitFailures,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\t\teventProps,\n\t\t\t\t\t\t\texpectedEventProps,\n\t\t\t\t\t\t\t`Summarize event for attempt ${attemptNumber} not as expected`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsummarizePromiseP = getSummarizeEventPromise();\n\t\t\t\t\t\t// Wait for \"retryAfterSeconds\". The next attempt should start after this.\n\t\t\t\t\t\tawait tickAndFlushPromises(retryAfterSeconds * 1000 + 1);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
@@ -1,29 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { strict as assert } from "assert";
6
- import { Summarizer } from "../../summary/index.js";
7
- describe("Runtime", () => {
8
- describe("Summarization", () => {
9
- describe("Summarizer", () => {
10
- it("Should not run last summary when reason is not parentNotConnected", () => {
11
- const stopReasons = [
12
- "failToSummarize",
13
- "notElectedParent",
14
- "notElectedClient",
15
- "summarizerClientDisconnected",
16
- "summarizerException",
17
- ];
18
- // This doesn't prevent future stop reason additions, but it's a good baseline
19
- for (const stopReason of stopReasons) {
20
- assert(Summarizer.stopReasonCanRunLastSummary(stopReason) === false, "should not run last summary when stop reason is not parentNotConnected");
21
- }
22
- });
23
- it("Should run last summary when reason is parentNotConnected", () => {
24
- assert(Summarizer.stopReasonCanRunLastSummary("parentNotConnected") === true, "should run last summary when stop reason is parentNotConnected");
25
- });
26
- });
27
- });
28
- });
29
- //# sourceMappingURL=summarizer.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"summarizer.spec.js","sourceRoot":"","sources":["../../../src/test/summary/summarizer.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAwB,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAE1E,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACxB,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC9B,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;YAC3B,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;gBAC5E,MAAM,WAAW,GAA2B;oBAC3C,iBAAiB;oBACjB,kBAAkB;oBAClB,kBAAkB;oBAClB,8BAA8B;oBAC9B,qBAAqB;iBACrB,CAAC;gBAEF,8EAA8E;gBAC9E,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;oBACrC,MAAM,CACL,UAAU,CAAC,2BAA2B,CAAC,UAAU,CAAC,KAAK,KAAK,EAC5D,wEAAwE,CACxE,CAAC;iBACF;YACF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;gBACpE,MAAM,CACL,UAAU,CAAC,2BAA2B,CAAC,oBAAoB,CAAC,KAAK,IAAI,EACrE,gEAAgE,CAChE,CAAC;YACH,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { SummarizerStopReason, Summarizer } from \"../../summary/index.js\";\n\ndescribe(\"Runtime\", () => {\n\tdescribe(\"Summarization\", () => {\n\t\tdescribe(\"Summarizer\", () => {\n\t\t\tit(\"Should not run last summary when reason is not parentNotConnected\", () => {\n\t\t\t\tconst stopReasons: SummarizerStopReason[] = [\n\t\t\t\t\t\"failToSummarize\",\n\t\t\t\t\t\"notElectedParent\",\n\t\t\t\t\t\"notElectedClient\",\n\t\t\t\t\t\"summarizerClientDisconnected\",\n\t\t\t\t\t\"summarizerException\",\n\t\t\t\t];\n\n\t\t\t\t// This doesn't prevent future stop reason additions, but it's a good baseline\n\t\t\t\tfor (const stopReason of stopReasons) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tSummarizer.stopReasonCanRunLastSummary(stopReason) === false,\n\t\t\t\t\t\t\"should not run last summary when stop reason is not parentNotConnected\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"Should run last summary when reason is parentNotConnected\", () => {\n\t\t\t\tassert(\n\t\t\t\t\tSummarizer.stopReasonCanRunLastSummary(\"parentNotConnected\") === true,\n\t\t\t\t\t\"should run last summary when stop reason is parentNotConnected\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n});\n"]}