@fluidframework/container-runtime 2.0.0-dev-rc.2.0.0.245554 → 2.0.0-dev-rc.3.0.0.250606

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 (459) hide show
  1. package/api-report/container-runtime.api.md +81 -27
  2. package/dist/batchTracker.d.ts +1 -1
  3. package/dist/batchTracker.d.ts.map +1 -1
  4. package/dist/batchTracker.js +2 -2
  5. package/dist/batchTracker.js.map +1 -1
  6. package/dist/blobManager.d.ts +3 -3
  7. package/dist/blobManager.d.ts.map +1 -1
  8. package/dist/blobManager.js +3 -3
  9. package/dist/blobManager.js.map +1 -1
  10. package/dist/channelCollection.d.ts +6 -5
  11. package/dist/channelCollection.d.ts.map +1 -1
  12. package/dist/channelCollection.js +57 -19
  13. package/dist/channelCollection.js.map +1 -1
  14. package/dist/connectionTelemetry.d.ts +2 -2
  15. package/dist/connectionTelemetry.d.ts.map +1 -1
  16. package/dist/connectionTelemetry.js +3 -3
  17. package/dist/connectionTelemetry.js.map +1 -1
  18. package/dist/container-runtime-alpha.d.ts +205 -12
  19. package/dist/container-runtime-beta.d.ts +16 -3
  20. package/dist/container-runtime-public.d.ts +16 -3
  21. package/dist/container-runtime-untrimmed.d.ts +207 -26
  22. package/dist/containerHandleContext.d.ts.map +1 -1
  23. package/dist/containerHandleContext.js.map +1 -1
  24. package/dist/containerRuntime.d.ts +32 -26
  25. package/dist/containerRuntime.d.ts.map +1 -1
  26. package/dist/containerRuntime.js +235 -133
  27. package/dist/containerRuntime.js.map +1 -1
  28. package/dist/dataStore.d.ts +1 -1
  29. package/dist/dataStore.d.ts.map +1 -1
  30. package/dist/dataStore.js +2 -2
  31. package/dist/dataStore.js.map +1 -1
  32. package/dist/dataStoreContext.d.ts +4 -4
  33. package/dist/dataStoreContext.d.ts.map +1 -1
  34. package/dist/dataStoreContext.js +18 -18
  35. package/dist/dataStoreContext.js.map +1 -1
  36. package/dist/dataStoreContexts.d.ts.map +1 -1
  37. package/dist/dataStoreContexts.js.map +1 -1
  38. package/dist/dataStoreRegistry.d.ts +4 -0
  39. package/dist/dataStoreRegistry.d.ts.map +1 -1
  40. package/dist/dataStoreRegistry.js +2 -2
  41. package/dist/dataStoreRegistry.js.map +1 -1
  42. package/dist/deltaScheduler.d.ts +1 -1
  43. package/dist/deltaScheduler.d.ts.map +1 -1
  44. package/dist/deltaScheduler.js +1 -1
  45. package/dist/deltaScheduler.js.map +1 -1
  46. package/dist/gc/garbageCollection.d.ts +1 -1
  47. package/dist/gc/garbageCollection.d.ts.map +1 -1
  48. package/dist/gc/garbageCollection.js +1 -1
  49. package/dist/gc/garbageCollection.js.map +1 -1
  50. package/dist/gc/gcConfigs.d.ts +1 -1
  51. package/dist/gc/gcConfigs.d.ts.map +1 -1
  52. package/dist/gc/gcConfigs.js.map +1 -1
  53. package/dist/gc/gcDefinitions.d.ts +1 -1
  54. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  55. package/dist/gc/gcDefinitions.js.map +1 -1
  56. package/dist/gc/gcHelpers.d.ts.map +1 -1
  57. package/dist/gc/gcHelpers.js.map +1 -1
  58. package/dist/gc/gcSummaryStateTracker.d.ts +1 -1
  59. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  60. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  61. package/dist/gc/gcTelemetry.d.ts +1 -1
  62. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  63. package/dist/gc/gcTelemetry.js.map +1 -1
  64. package/dist/index.d.ts +2 -2
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +4 -2
  67. package/dist/index.js.map +1 -1
  68. package/dist/messageTypes.d.ts +11 -5
  69. package/dist/messageTypes.d.ts.map +1 -1
  70. package/dist/messageTypes.js +4 -0
  71. package/dist/messageTypes.js.map +1 -1
  72. package/dist/opLifecycle/definitions.d.ts +1 -19
  73. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  74. package/dist/opLifecycle/definitions.js.map +1 -1
  75. package/dist/opLifecycle/index.d.ts +3 -3
  76. package/dist/opLifecycle/index.d.ts.map +1 -1
  77. package/dist/opLifecycle/index.js +3 -1
  78. package/dist/opLifecycle/index.js.map +1 -1
  79. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  80. package/dist/opLifecycle/opCompressor.js +2 -3
  81. package/dist/opLifecycle/opCompressor.js.map +1 -1
  82. package/dist/opLifecycle/opDecompressor.d.ts +15 -4
  83. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  84. package/dist/opLifecycle/opDecompressor.js +60 -61
  85. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  86. package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
  87. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  88. package/dist/opLifecycle/opGroupingManager.js +9 -11
  89. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  90. package/dist/opLifecycle/opSplitter.d.ts +11 -3
  91. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  92. package/dist/opLifecycle/opSplitter.js +48 -38
  93. package/dist/opLifecycle/opSplitter.js.map +1 -1
  94. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  95. package/dist/opLifecycle/outbox.js +18 -17
  96. package/dist/opLifecycle/outbox.js.map +1 -1
  97. package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  98. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  99. package/dist/opLifecycle/remoteMessageProcessor.js +36 -32
  100. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  101. package/dist/packageVersion.d.ts +1 -1
  102. package/dist/packageVersion.js +1 -1
  103. package/dist/packageVersion.js.map +1 -1
  104. package/dist/pendingStateManager.d.ts +1 -1
  105. package/dist/pendingStateManager.d.ts.map +1 -1
  106. package/dist/pendingStateManager.js.map +1 -1
  107. package/dist/scheduleManager.d.ts +1 -1
  108. package/dist/scheduleManager.d.ts.map +1 -1
  109. package/dist/scheduleManager.js +6 -2
  110. package/dist/scheduleManager.js.map +1 -1
  111. package/dist/summary/documentSchema.d.ts +178 -0
  112. package/dist/summary/documentSchema.d.ts.map +1 -0
  113. package/dist/summary/documentSchema.js +345 -0
  114. package/dist/summary/documentSchema.js.map +1 -0
  115. package/dist/summary/index.d.ts +2 -1
  116. package/dist/summary/index.d.ts.map +1 -1
  117. package/dist/summary/index.js +4 -1
  118. package/dist/summary/index.js.map +1 -1
  119. package/dist/summary/orderedClientElection.d.ts +2 -2
  120. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  121. package/dist/summary/orderedClientElection.js +7 -2
  122. package/dist/summary/orderedClientElection.js.map +1 -1
  123. package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
  124. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  125. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  126. package/dist/summary/runningSummarizer.d.ts +2 -2
  127. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  128. package/dist/summary/runningSummarizer.js +2 -2
  129. package/dist/summary/runningSummarizer.js.map +1 -1
  130. package/dist/summary/summarizer.d.ts +2 -2
  131. package/dist/summary/summarizer.d.ts.map +1 -1
  132. package/dist/summary/summarizer.js +2 -2
  133. package/dist/summary/summarizer.js.map +1 -1
  134. package/dist/summary/summarizerClientElection.d.ts +2 -2
  135. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  136. package/dist/summary/summarizerClientElection.js.map +1 -1
  137. package/dist/summary/summarizerHeuristics.d.ts +1 -1
  138. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  139. package/dist/summary/summarizerHeuristics.js.map +1 -1
  140. package/dist/summary/summarizerNode/summarizerNode.d.ts +2 -2
  141. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  142. package/dist/summary/summarizerNode/summarizerNode.js +3 -3
  143. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  144. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
  145. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  146. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  147. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
  148. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  149. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
  150. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  151. package/dist/summary/summarizerTypes.d.ts +3 -3
  152. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  153. package/dist/summary/summarizerTypes.js.map +1 -1
  154. package/dist/summary/summaryCollection.d.ts +2 -2
  155. package/dist/summary/summaryCollection.d.ts.map +1 -1
  156. package/dist/summary/summaryCollection.js +1 -1
  157. package/dist/summary/summaryCollection.js.map +1 -1
  158. package/dist/summary/summaryFormat.d.ts +5 -16
  159. package/dist/summary/summaryFormat.d.ts.map +1 -1
  160. package/dist/summary/summaryFormat.js.map +1 -1
  161. package/dist/summary/summaryGenerator.d.ts +2 -2
  162. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  163. package/dist/summary/summaryGenerator.js +2 -2
  164. package/dist/summary/summaryGenerator.js.map +1 -1
  165. package/dist/summary/summaryManager.d.ts +1 -1
  166. package/dist/summary/summaryManager.d.ts.map +1 -1
  167. package/dist/summary/summaryManager.js +2 -2
  168. package/dist/summary/summaryManager.js.map +1 -1
  169. package/lib/batchTracker.d.ts +1 -1
  170. package/lib/batchTracker.d.ts.map +1 -1
  171. package/lib/batchTracker.js +2 -2
  172. package/lib/batchTracker.js.map +1 -1
  173. package/lib/blobManager.d.ts +3 -3
  174. package/lib/blobManager.d.ts.map +1 -1
  175. package/lib/blobManager.js +5 -5
  176. package/lib/blobManager.js.map +1 -1
  177. package/lib/channelCollection.d.ts +6 -5
  178. package/lib/channelCollection.d.ts.map +1 -1
  179. package/lib/channelCollection.js +59 -21
  180. package/lib/channelCollection.js.map +1 -1
  181. package/lib/connectionTelemetry.d.ts +2 -2
  182. package/lib/connectionTelemetry.d.ts.map +1 -1
  183. package/lib/connectionTelemetry.js +3 -3
  184. package/lib/connectionTelemetry.js.map +1 -1
  185. package/lib/container-runtime-alpha.d.ts +205 -12
  186. package/lib/container-runtime-beta.d.ts +16 -3
  187. package/lib/container-runtime-public.d.ts +16 -3
  188. package/lib/container-runtime-untrimmed.d.ts +207 -26
  189. package/lib/containerHandleContext.d.ts.map +1 -1
  190. package/lib/containerHandleContext.js.map +1 -1
  191. package/lib/containerRuntime.d.ts +32 -26
  192. package/lib/containerRuntime.d.ts.map +1 -1
  193. package/lib/containerRuntime.js +197 -95
  194. package/lib/containerRuntime.js.map +1 -1
  195. package/lib/dataStore.d.ts +1 -1
  196. package/lib/dataStore.d.ts.map +1 -1
  197. package/lib/dataStore.js +2 -2
  198. package/lib/dataStore.js.map +1 -1
  199. package/lib/dataStoreContext.d.ts +4 -4
  200. package/lib/dataStoreContext.d.ts.map +1 -1
  201. package/lib/dataStoreContext.js +3 -3
  202. package/lib/dataStoreContext.js.map +1 -1
  203. package/lib/dataStoreContexts.d.ts.map +1 -1
  204. package/lib/dataStoreContexts.js.map +1 -1
  205. package/lib/dataStoreRegistry.d.ts +4 -0
  206. package/lib/dataStoreRegistry.d.ts.map +1 -1
  207. package/lib/dataStoreRegistry.js.map +1 -1
  208. package/lib/deltaScheduler.d.ts +1 -1
  209. package/lib/deltaScheduler.d.ts.map +1 -1
  210. package/lib/deltaScheduler.js +1 -1
  211. package/lib/deltaScheduler.js.map +1 -1
  212. package/lib/gc/garbageCollection.d.ts +1 -1
  213. package/lib/gc/garbageCollection.d.ts.map +1 -1
  214. package/lib/gc/garbageCollection.js +3 -3
  215. package/lib/gc/garbageCollection.js.map +1 -1
  216. package/lib/gc/gcConfigs.d.ts +1 -1
  217. package/lib/gc/gcConfigs.d.ts.map +1 -1
  218. package/lib/gc/gcConfigs.js +1 -1
  219. package/lib/gc/gcConfigs.js.map +1 -1
  220. package/lib/gc/gcDefinitions.d.ts +1 -1
  221. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  222. package/lib/gc/gcDefinitions.js.map +1 -1
  223. package/lib/gc/gcHelpers.d.ts.map +1 -1
  224. package/lib/gc/gcHelpers.js.map +1 -1
  225. package/lib/gc/gcSummaryStateTracker.d.ts +1 -1
  226. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  227. package/lib/gc/gcSummaryStateTracker.js +1 -1
  228. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  229. package/lib/gc/gcTelemetry.d.ts +1 -1
  230. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  231. package/lib/gc/gcTelemetry.js +1 -1
  232. package/lib/gc/gcTelemetry.js.map +1 -1
  233. package/lib/index.d.ts +2 -2
  234. package/lib/index.d.ts.map +1 -1
  235. package/lib/index.js +2 -2
  236. package/lib/index.js.map +1 -1
  237. package/lib/messageTypes.d.ts +11 -5
  238. package/lib/messageTypes.d.ts.map +1 -1
  239. package/lib/messageTypes.js +4 -0
  240. package/lib/messageTypes.js.map +1 -1
  241. package/lib/opLifecycle/definitions.d.ts +1 -19
  242. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  243. package/lib/opLifecycle/definitions.js.map +1 -1
  244. package/lib/opLifecycle/index.d.ts +3 -3
  245. package/lib/opLifecycle/index.d.ts.map +1 -1
  246. package/lib/opLifecycle/index.js +2 -2
  247. package/lib/opLifecycle/index.js.map +1 -1
  248. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  249. package/lib/opLifecycle/opCompressor.js +2 -3
  250. package/lib/opLifecycle/opCompressor.js.map +1 -1
  251. package/lib/opLifecycle/opDecompressor.d.ts +15 -4
  252. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  253. package/lib/opLifecycle/opDecompressor.js +60 -61
  254. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  255. package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
  256. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  257. package/lib/opLifecycle/opGroupingManager.js +7 -10
  258. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  259. package/lib/opLifecycle/opSplitter.d.ts +11 -3
  260. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  261. package/lib/opLifecycle/opSplitter.js +46 -37
  262. package/lib/opLifecycle/opSplitter.js.map +1 -1
  263. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  264. package/lib/opLifecycle/outbox.js +18 -17
  265. package/lib/opLifecycle/outbox.js.map +1 -1
  266. package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  267. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  268. package/lib/opLifecycle/remoteMessageProcessor.js +36 -32
  269. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  270. package/lib/packageVersion.d.ts +1 -1
  271. package/lib/packageVersion.js +1 -1
  272. package/lib/packageVersion.js.map +1 -1
  273. package/lib/pendingStateManager.d.ts +1 -1
  274. package/lib/pendingStateManager.d.ts.map +1 -1
  275. package/lib/pendingStateManager.js.map +1 -1
  276. package/lib/scheduleManager.d.ts +1 -1
  277. package/lib/scheduleManager.d.ts.map +1 -1
  278. package/lib/scheduleManager.js +6 -2
  279. package/lib/scheduleManager.js.map +1 -1
  280. package/lib/summary/documentSchema.d.ts +178 -0
  281. package/lib/summary/documentSchema.d.ts.map +1 -0
  282. package/lib/summary/documentSchema.js +341 -0
  283. package/lib/summary/documentSchema.js.map +1 -0
  284. package/lib/summary/index.d.ts +2 -1
  285. package/lib/summary/index.d.ts.map +1 -1
  286. package/lib/summary/index.js +1 -0
  287. package/lib/summary/index.js.map +1 -1
  288. package/lib/summary/orderedClientElection.d.ts +2 -2
  289. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  290. package/lib/summary/orderedClientElection.js +7 -2
  291. package/lib/summary/orderedClientElection.js.map +1 -1
  292. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
  293. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  294. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  295. package/lib/summary/runningSummarizer.d.ts +2 -2
  296. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  297. package/lib/summary/runningSummarizer.js +3 -3
  298. package/lib/summary/runningSummarizer.js.map +1 -1
  299. package/lib/summary/summarizer.d.ts +2 -2
  300. package/lib/summary/summarizer.d.ts.map +1 -1
  301. package/lib/summary/summarizer.js +3 -3
  302. package/lib/summary/summarizer.js.map +1 -1
  303. package/lib/summary/summarizerClientElection.d.ts +2 -2
  304. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  305. package/lib/summary/summarizerClientElection.js.map +1 -1
  306. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  307. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  308. package/lib/summary/summarizerHeuristics.js.map +1 -1
  309. package/lib/summary/summarizerNode/summarizerNode.d.ts +2 -2
  310. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  311. package/lib/summary/summarizerNode/summarizerNode.js +4 -4
  312. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  313. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
  314. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  315. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  316. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
  317. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  318. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
  319. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  320. package/lib/summary/summarizerTypes.d.ts +3 -3
  321. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  322. package/lib/summary/summarizerTypes.js.map +1 -1
  323. package/lib/summary/summaryCollection.d.ts +2 -2
  324. package/lib/summary/summaryCollection.d.ts.map +1 -1
  325. package/lib/summary/summaryCollection.js +1 -1
  326. package/lib/summary/summaryCollection.js.map +1 -1
  327. package/lib/summary/summaryFormat.d.ts +5 -16
  328. package/lib/summary/summaryFormat.d.ts.map +1 -1
  329. package/lib/summary/summaryFormat.js +1 -1
  330. package/lib/summary/summaryFormat.js.map +1 -1
  331. package/lib/summary/summaryGenerator.d.ts +2 -2
  332. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  333. package/lib/summary/summaryGenerator.js +3 -3
  334. package/lib/summary/summaryGenerator.js.map +1 -1
  335. package/lib/summary/summaryManager.d.ts +1 -1
  336. package/lib/summary/summaryManager.d.ts.map +1 -1
  337. package/lib/summary/summaryManager.js +2 -2
  338. package/lib/summary/summaryManager.js.map +1 -1
  339. package/lib/test/blobManager.spec.js +3 -3
  340. package/lib/test/blobManager.spec.js.map +1 -1
  341. package/lib/test/containerRuntime.spec.js +6 -4
  342. package/lib/test/containerRuntime.spec.js.map +1 -1
  343. package/lib/test/dataStoreContext.spec.js +4 -4
  344. package/lib/test/dataStoreContext.spec.js.map +1 -1
  345. package/lib/test/dataStoreCreation.spec.js +1 -1
  346. package/lib/test/dataStoreCreation.spec.js.map +1 -1
  347. package/lib/test/dataStoreRegistry.spec.js.map +1 -1
  348. package/lib/test/documentSchema.spec.js +282 -0
  349. package/lib/test/documentSchema.spec.js.map +1 -0
  350. package/lib/test/fuzz/fuzzUtils.js +11 -7
  351. package/lib/test/fuzz/fuzzUtils.js.map +1 -1
  352. package/lib/test/fuzz/summarizer.fuzz.spec.js +9 -7
  353. package/lib/test/fuzz/summarizer.fuzz.spec.js.map +1 -1
  354. package/lib/test/fuzz/summarizerFuzzMocks.js +43 -25
  355. package/lib/test/fuzz/summarizerFuzzMocks.js.map +1 -1
  356. package/lib/test/fuzz/summarizerFuzzSuite.js +7 -4
  357. package/lib/test/fuzz/summarizerFuzzSuite.js.map +1 -1
  358. package/lib/test/gc/garbageCollection.spec.js +5 -5
  359. package/lib/test/gc/garbageCollection.spec.js.map +1 -1
  360. package/lib/test/gc/gcConfigs.spec.js +2 -2
  361. package/lib/test/gc/gcConfigs.spec.js.map +1 -1
  362. package/lib/test/gc/gcHelpers.spec.js.map +1 -1
  363. package/lib/test/gc/gcStats.spec.js +2 -2
  364. package/lib/test/gc/gcStats.spec.js.map +1 -1
  365. package/lib/test/gc/gcSummaryStateTracker.spec.js +1 -1
  366. package/lib/test/gc/gcSummaryStateTracker.spec.js.map +1 -1
  367. package/lib/test/gc/gcTelemetry.spec.js +3 -3
  368. package/lib/test/gc/gcTelemetry.spec.js.map +1 -1
  369. package/lib/test/gc/gcUnreferencedStateTracker.spec.js +1 -1
  370. package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +1 -1
  371. package/lib/test/getPendingBlobs.spec.js +1 -1
  372. package/lib/test/getPendingBlobs.spec.js.map +1 -1
  373. package/lib/test/hardwareStats.spec.js +1 -1
  374. package/lib/test/hardwareStats.spec.js.map +1 -1
  375. package/lib/test/opLifecycle/OpGroupingManager.spec.js +95 -118
  376. package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +1 -1
  377. package/lib/test/opLifecycle/batchManager.spec.js +1 -1
  378. package/lib/test/opLifecycle/batchManager.spec.js.map +1 -1
  379. package/lib/test/opLifecycle/opCompressor.spec.js +0 -1
  380. package/lib/test/opLifecycle/opCompressor.spec.js.map +1 -1
  381. package/lib/test/opLifecycle/opDecompressor.spec.js +60 -55
  382. package/lib/test/opLifecycle/opDecompressor.spec.js.map +1 -1
  383. package/lib/test/opLifecycle/opSplitter.spec.js +56 -41
  384. package/lib/test/opLifecycle/opSplitter.spec.js.map +1 -1
  385. package/lib/test/opLifecycle/outbox.spec.js +118 -10
  386. package/lib/test/opLifecycle/outbox.spec.js.map +1 -1
  387. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +115 -91
  388. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +1 -1
  389. package/lib/test/pendingStateManager.spec.js +1 -1
  390. package/lib/test/pendingStateManager.spec.js.map +1 -1
  391. package/lib/test/scheduleManager.spec.js +1 -1
  392. package/lib/test/scheduleManager.spec.js.map +1 -1
  393. package/lib/test/summarizerNode.spec.js +1 -1
  394. package/lib/test/summarizerNode.spec.js.map +1 -1
  395. package/lib/test/summarizerNodeWithGc.spec.js +1 -1
  396. package/lib/test/summarizerNodeWithGc.spec.js.map +1 -1
  397. package/lib/test/summary/runningSummarizer.spec.js +4 -4
  398. package/lib/test/summary/runningSummarizer.spec.js.map +1 -1
  399. package/lib/test/summary/summarizer.spec.js.map +1 -1
  400. package/lib/test/summary/summarizerClientElection.spec.js +2 -2
  401. package/lib/test/summary/summarizerClientElection.spec.js.map +1 -1
  402. package/lib/test/summary/summarizerHeuristics.spec.js +1 -1
  403. package/lib/test/summary/summarizerHeuristics.spec.js.map +1 -1
  404. package/lib/test/summary/summaryCollection.spec.js +1 -1
  405. package/lib/test/summary/summaryCollection.spec.js.map +1 -1
  406. package/lib/test/summary/summaryManager.spec.js +3 -3
  407. package/lib/test/summary/summaryManager.spec.js.map +1 -1
  408. package/lib/test/throttler.spec.js +1 -1
  409. package/lib/test/throttler.spec.js.map +1 -1
  410. package/lib/test/types/validateContainerRuntimePrevious.generated.js +6 -4
  411. package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +1 -1
  412. package/package.json +35 -21
  413. package/src/batchTracker.ts +3 -3
  414. package/src/blobManager.ts +15 -15
  415. package/src/channelCollection.ts +90 -44
  416. package/src/connectionTelemetry.ts +10 -10
  417. package/src/containerHandleContext.ts +1 -1
  418. package/src/containerRuntime.ts +375 -213
  419. package/src/dataStore.ts +2 -2
  420. package/src/dataStoreContext.ts +19 -19
  421. package/src/dataStoreContexts.ts +2 -2
  422. package/src/dataStoreRegistry.ts +2 -1
  423. package/src/deltaScheduler.ts +1 -1
  424. package/src/gc/garbageCollection.ts +12 -12
  425. package/src/gc/gcConfigs.ts +11 -11
  426. package/src/gc/gcDefinitions.ts +2 -2
  427. package/src/gc/gcHelpers.ts +2 -2
  428. package/src/gc/gcSummaryStateTracker.ts +4 -4
  429. package/src/gc/gcTelemetry.ts +6 -6
  430. package/src/index.ts +8 -1
  431. package/src/messageTypes.ts +18 -5
  432. package/src/opLifecycle/README.md +89 -0
  433. package/src/opLifecycle/definitions.ts +1 -20
  434. package/src/opLifecycle/index.ts +3 -9
  435. package/src/opLifecycle/opCompressor.ts +4 -5
  436. package/src/opLifecycle/opDecompressor.ts +83 -100
  437. package/src/opLifecycle/opGroupingManager.ts +9 -12
  438. package/src/opLifecycle/opSplitter.ts +73 -47
  439. package/src/opLifecycle/outbox.ts +26 -37
  440. package/src/opLifecycle/remoteMessageProcessor.ts +41 -55
  441. package/src/packageVersion.ts +1 -1
  442. package/src/pendingStateManager.ts +2 -2
  443. package/src/scheduleManager.ts +8 -7
  444. package/src/summary/documentSchema.ts +553 -0
  445. package/src/summary/index.ts +10 -1
  446. package/src/summary/orderedClientElection.ts +7 -5
  447. package/src/summary/runWhileConnectedCoordinator.ts +1 -1
  448. package/src/summary/runningSummarizer.ts +19 -19
  449. package/src/summary/summarizer.ts +14 -14
  450. package/src/summary/summarizerClientElection.ts +2 -2
  451. package/src/summary/summarizerHeuristics.ts +2 -2
  452. package/src/summary/summarizerNode/summarizerNode.ts +15 -15
  453. package/src/summary/summarizerNode/summarizerNodeUtils.ts +1 -1
  454. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +4 -4
  455. package/src/summary/summarizerTypes.ts +3 -3
  456. package/src/summary/summaryCollection.ts +3 -3
  457. package/src/summary/summaryFormat.ts +8 -19
  458. package/src/summary/summaryGenerator.ts +10 -10
  459. package/src/summary/summaryManager.ts +4 -4
@@ -1 +1 @@
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"]}
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,EAAE,UAAU,EAAwB,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 { Summarizer, SummarizerStopReason } 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"]}
@@ -3,11 +3,11 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "assert";
6
- import { Deferred } from "@fluidframework/core-utils";
7
6
  import { TypedEventEmitter } from "@fluid-internal/client-utils";
7
+ import { Deferred } from "@fluidframework/core-utils";
8
8
  import { MessageType } from "@fluidframework/protocol-definitions";
9
9
  import { MockLogger } from "@fluidframework/telemetry-utils";
10
- import { OrderedClientCollection, OrderedClientElection, SummarizerClientElection, summarizerClientType, SummaryManager, } from "../../summary/index.js";
10
+ import { OrderedClientCollection, OrderedClientElection, SummarizerClientElection, SummaryManager, summarizerClientType, } from "../../summary/index.js";
11
11
  import { TestQuorumClients } from "./testQuorumClients.js";
12
12
  describe("Summarizer Client Election", () => {
13
13
  const maxOps = 1000;
@@ -1 +1 @@
1
- {"version":3,"file":"summarizerClientElection.spec.js","sourceRoot":"","sources":["../../../src/test/summary/summarizerClientElection.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 { Deferred } from \"@fluidframework/core-utils\";\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { ISequencedClient, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport {\n\tISerializedElection,\n\tOrderedClientCollection,\n\tOrderedClientElection,\n\tISummaryCollectionOpEvents,\n\tSummarizerClientElection,\n\tsummarizerClientType,\n\tIConnectedEvents,\n\tIConnectedState,\n\tSummaryManager,\n\tISummarizer,\n\tISummarizerEvents,\n\tSummarizerStopReason,\n} from \"../../summary/index.js\";\nimport { TestQuorumClients } from \"./testQuorumClients.js\";\n\ndescribe(\"Summarizer Client Election\", () => {\n\tconst maxOps = 1000;\n\tconst testQuorum = new TestQuorumClients();\n\tlet currentSequenceNumber: number = 0;\n\tconst testDeltaManager = {\n\t\tget lastSequenceNumber() {\n\t\t\treturn currentSequenceNumber;\n\t\t},\n\t};\n\tconst mockLogger = new MockLogger();\n\tlet refreshSummarizerCallCount = 0;\n\tconst summaryCollectionEmitter = new TypedEventEmitter<ISummaryCollectionOpEvents>();\n\tlet election: SummarizerClientElection;\n\tlet summaryManager: SummaryManager;\n\n\tconst summaryCollection = {\n\t\topsSinceLastAck: 0,\n\t\taddOpListener: () => {},\n\t\tremoveOpListener: () => {},\n\t};\n\n\tclass TestConnectedState\n\t\textends TypedEventEmitter<IConnectedEvents>\n\t\timplements IConnectedState\n\t{\n\t\tpublic connected = false;\n\t\tpublic clientId: string | undefined;\n\n\t\tpublic connect() {\n\t\t\tthis.connected = true;\n\t\t\tthis.clientId = election.electedParentId;\n\t\t\tthis.emit(\"connected\", this.clientId);\n\t\t}\n\n\t\tpublic disconnect() {\n\t\t\tthis.connected = false;\n\t\t\tthis.emit(\"disconnected\");\n\t\t}\n\t}\n\n\tclass TestSummarizer extends TypedEventEmitter<ISummarizerEvents> implements ISummarizer {\n\t\tprivate notImplemented(): never {\n\t\t\tthrow Error(\"not implemented\");\n\t\t}\n\t\tpublic onBehalfOf: string | undefined;\n\t\tpublic state: \"notStarted\" | \"running\" | \"stopped\" = \"notStarted\";\n\t\tpublic readonly stopDeferred = new Deferred<string | undefined>();\n\t\tpublic readonly runDeferred = new Deferred<void>();\n\t\tpublic clientId: string | undefined;\n\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t}\n\t\tpublic async setSummarizer() {\n\t\t\tthis.notImplemented();\n\t\t}\n\t\tpublic get cancelled() {\n\t\t\t// Approximation, as ideally it should become cancelled immediately after stop() call\n\t\t\treturn this.state !== \"running\";\n\t\t}\n\t\tpublic close() {}\n\t\tpublic stop(reason?: string): void {\n\t\t\tthis.stopDeferred.resolve(reason);\n\t\t}\n\t\tpublic async run(onBehalfOf: string): Promise<SummarizerStopReason> {\n\t\t\tthis.onBehalfOf = onBehalfOf;\n\t\t\tthis.state = \"running\";\n\t\t\tawait Promise.all([this.stopDeferred.promise, this.runDeferred.promise]);\n\t\t\tthis.state = \"stopped\";\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tremoveClient(this.clientId!, 0);\n\t\t\treturn \"summarizerClientDisconnected\";\n\t\t}\n\n\t\tpublic readonly summarizeOnDemand = () => this.notImplemented();\n\t\tpublic readonly enqueueSummarize = () => this.notImplemented();\n\t\tpublic get IFluidLoadable() {\n\t\t\treturn this.notImplemented();\n\t\t}\n\t\tpublic get handle() {\n\t\t\treturn this.notImplemented();\n\t\t}\n\t}\n\n\tlet connectedState: TestConnectedState;\n\tlet summarizer: TestSummarizer;\n\n\tconst flushPromises = async () => new Promise((resolve) => process.nextTick(resolve));\n\n\tfunction addClient(\n\t\tclientId: string,\n\t\tsequenceNumber: number,\n\t\tinteractive = true,\n\t\ttype?: string,\n\t) {\n\t\tif (sequenceNumber > currentSequenceNumber) {\n\t\t\tcurrentSequenceNumber = sequenceNumber;\n\t\t}\n\t\tconst details: ISequencedClient[\"client\"][\"details\"] = {\n\t\t\ttype,\n\t\t\tcapabilities: { interactive },\n\t\t};\n\t\tconst c: Partial<ISequencedClient[\"client\"]> = { details };\n\t\tconst client: ISequencedClient = {\n\t\t\tclient: c as ISequencedClient[\"client\"],\n\t\t\tsequenceNumber,\n\t\t};\n\t\ttestQuorum.addClient(clientId, client);\n\t}\n\tfunction removeClient(clientId: string, opCount = 1) {\n\t\tcurrentSequenceNumber += opCount;\n\t\ttestQuorum.removeClient(clientId);\n\t}\n\n\tconst requestSummarizer = async (): Promise<ISummarizer> => {\n\t\tsummarizer = new TestSummarizer();\n\t\tconst parentId = election.electedParentId;\n\t\tconst clientId = `${parentId}-summarizer`;\n\t\tsummarizer.clientId = clientId;\n\t\taddClient(clientId, currentSequenceNumber, false, summarizerClientType);\n\t\treturn summarizer;\n\t};\n\n\tconst throttler = {\n\t\tdelayMs: 0,\n\t\tnumAttempts: 0,\n\t\tgetDelay() {\n\t\t\treturn this.delayMs;\n\t\t},\n\t\tmaxDelayMs: 0,\n\t\tdelayWindowMs: 0,\n\t\tdelayFn: () => 0,\n\t};\n\n\tfunction createElection(\n\t\tinitialClients: [id: string, seq: number, int: boolean][] = [],\n\t\tinitialState?: ISerializedElection,\n\t) {\n\t\tfor (const [id, seq, int] of initialClients) {\n\t\t\taddClient(id, seq, int);\n\t\t}\n\t\telection = new SummarizerClientElection(\n\t\t\tmockLogger.toTelemetryLogger(),\n\t\t\tsummaryCollectionEmitter,\n\t\t\tnew OrderedClientElection(\n\t\t\t\tmockLogger.toTelemetryLogger(),\n\t\t\t\tnew OrderedClientCollection(mockLogger, testDeltaManager, testQuorum),\n\t\t\t\tinitialState ?? currentSequenceNumber,\n\t\t\t\tSummarizerClientElection.isClientEligible,\n\t\t\t),\n\t\t\tmaxOps,\n\t\t);\n\t\tconnectedState = new TestConnectedState();\n\t\tsummaryManager = new SummaryManager(\n\t\t\telection,\n\t\t\tconnectedState,\n\t\t\tsummaryCollection,\n\t\t\tmockLogger,\n\t\t\trequestSummarizer,\n\t\t\tthrottler,\n\t\t\t{\n\t\t\t\tinitialDelayMs: 0,\n\t\t\t\topsToBypassInitialDelay: 0,\n\t\t\t},\n\t\t);\n\t\tsummaryManager.start();\n\t\telection.on(\"electedSummarizerChanged\", () => {\n\t\t\tconnectedState.clientId = election.electedParentId;\n\t\t});\n\t\telection.on(\"shouldSummarizeStateChanged\", () => refreshSummarizerCallCount++);\n\t}\n\tfunction defaultOp(opCount = 1) {\n\t\tcurrentSequenceNumber += opCount;\n\t\tsummaryCollectionEmitter.emit(\"default\", { sequenceNumber: currentSequenceNumber });\n\t}\n\tfunction summaryAck(opCount = 1) {\n\t\tcurrentSequenceNumber += opCount;\n\t\tsummaryCollectionEmitter.emit(MessageType.SummaryAck, {\n\t\t\tsequenceNumber: currentSequenceNumber,\n\t\t});\n\t}\n\n\tfunction assertState(\n\t\texpectedId: string | undefined,\n\t\texpectedParentId: string | undefined,\n\t\texpectedSeq: number,\n\t\tmessage: string,\n\t) {\n\t\tconst { electedClientId, electedParentId, electionSequenceNumber } = election.serialize();\n\t\tassert.strictEqual(\n\t\t\telectedClientId,\n\t\t\telection.electedClientId,\n\t\t\t`Inconsistent clientId; ${message}`,\n\t\t);\n\t\tassert.strictEqual(\n\t\t\telectedParentId,\n\t\t\telection.electedParentId,\n\t\t\t`Inconsistent parentId; ${message}`,\n\t\t);\n\t\tassert.strictEqual(electedClientId, expectedId, `Invalid clientId; ${message}`);\n\t\tassert.strictEqual(electedParentId, expectedParentId, `Invalid parentId; ${message}`);\n\t\tassert.strictEqual(electionSequenceNumber, expectedSeq, `Invalid seq #; ${message}`);\n\t}\n\n\tafterEach(() => {\n\t\tmockLogger.events = [];\n\t\ttestQuorum.reset();\n\t\tsummaryCollectionEmitter.removeAllListeners();\n\t\tsummarizer.removeAllListeners();\n\t\telection.removeAllListeners();\n\t\tcurrentSequenceNumber = 0;\n\t});\n\n\tdescribe(\"With initial state\", () => {\n\t\tit(\"Should automatically elect oldest eligible client on op when undefined initial client\", async () => {\n\t\t\tcurrentSequenceNumber = 678;\n\t\t\tcreateElection(\n\t\t\t\t[\n\t\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t\t[\"a\", 2, true],\n\t\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t\t[\"b\", 7, true],\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\telectedClientId: undefined,\n\t\t\t\t\telectedParentId: undefined,\n\t\t\t\t\telectionSequenceNumber: 432,\n\t\t\t\t},\n\t\t\t);\n\t\t\tassertState(undefined, undefined, 432, \"no elected client at first\");\n\t\t\tdefaultOp();\n\t\t\tassertState(\"a\", \"a\", 679, \"auto-elect first eligible client\");\n\t\t\tconnectedState.connect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"a-summarizer\", \"a\", 679, \"a's summarizer elected on connect\");\n\t\t\tconnectedState.disconnect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"a-summarizer\", \"a\", 679, \"summarizer still elected while completing work\");\n\t\t\tsummarizer.runDeferred.resolve();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"a\", \"a\", 679, \"revert to parent election\");\n\t\t});\n\n\t\tit(\"Should automatically elect oldest eligible client on op when not found initial client\", async () => {\n\t\t\tcurrentSequenceNumber = 678;\n\t\t\tcreateElection(\n\t\t\t\t[\n\t\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t\t[\"a\", 2, true],\n\t\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t\t[\"b\", 7, true],\n\t\t\t\t],\n\t\t\t\t{ electedClientId: \"x\", electedParentId: \"x\", electionSequenceNumber: 432 },\n\t\t\t);\n\t\t\tassertState(undefined, undefined, 432, \"no elected client at first\");\n\t\t\tdefaultOp();\n\t\t\tassertState(\"a\", \"a\", 679, \"auto-elect first eligible client\");\n\t\t\tconnectedState.connect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"a-summarizer\", \"a\", 679, \"a's summarizer elected on connect\");\n\t\t\tconnectedState.disconnect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"a-summarizer\", \"a\", 679, \"summarizer still elected while completing work\");\n\t\t\tsummarizer.runDeferred.resolve();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"a\", \"a\", 679, \"revert to parent election\");\n\t\t});\n\n\t\tit(\"Should already have elected next eligible client when ineligible initial client\", () => {\n\t\t\tcurrentSequenceNumber = 678;\n\t\t\tcreateElection(\n\t\t\t\t[\n\t\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t\t[\"a\", 2, true],\n\t\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t\t[\"b\", 7, true],\n\t\t\t\t],\n\t\t\t\t{ electedClientId: \"s2\", electedParentId: \"s2\", electionSequenceNumber: 432 },\n\t\t\t);\n\t\t\tassertState(\"b\", \"b\", 432, \"auto-elect next eligible client\");\n\t\t});\n\n\t\tit(\"Should remain unelected with empty quorum\", () => {\n\t\t\tcurrentSequenceNumber = 678;\n\t\t\tcreateElection([], {\n\t\t\t\telectedClientId: undefined,\n\t\t\t\telectedParentId: undefined,\n\t\t\t\telectionSequenceNumber: 432,\n\t\t\t});\n\t\t\tassertState(undefined, undefined, 432, \"no elected client at first\");\n\t\t\tdefaultOp();\n\t\t\tassertState(undefined, undefined, 432, \"still no client to elect\");\n\t\t});\n\n\t\tit(\"Should remain unelected with empty quorum and not found client\", () => {\n\t\t\tcurrentSequenceNumber = 678;\n\t\t\tcreateElection([], {\n\t\t\t\telectedClientId: \"x\",\n\t\t\t\telectedParentId: \"x\",\n\t\t\t\telectionSequenceNumber: 432,\n\t\t\t});\n\t\t\tassertState(undefined, undefined, 432, \"no client to elect\");\n\t\t});\n\n\t\tit(\"Should reelect during add/remove clients\", async () => {\n\t\t\tcreateElection([], {\n\t\t\t\telectedClientId: undefined,\n\t\t\t\telectedParentId: undefined,\n\t\t\t\telectionSequenceNumber: 12,\n\t\t\t});\n\t\t\tassertState(undefined, undefined, 12, \"no clients, should initially be undefined\");\n\n\t\t\t// Add non-interactive client, no effect\n\t\t\taddClient(\"s1\", 1, false);\n\t\t\tassertState(undefined, undefined, 12, \"only non-interactive client in quorum\");\n\n\t\t\t// Add interactive client, should elect\n\t\t\taddClient(\"a\", 17, true);\n\t\t\tassertState(\"a\", \"a\", 17, \"only one interactive client in quorum, should elect\");\n\t\t\tconnectedState.connect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"a-summarizer\", \"a\", 17, \"a's summarizer elected on connect\");\n\n\t\t\t// Add more clients, no effect\n\t\t\taddClient(\"s2\", 19, false);\n\t\t\taddClient(\"b\", 41, true);\n\t\t\tassertState(\n\t\t\t\t\"a-summarizer\",\n\t\t\t\t\"a\",\n\t\t\t\t17,\n\t\t\t\t\"additional younger clients should have no effect\",\n\t\t\t);\n\n\t\t\t// Remove elected client, should reelect\n\t\t\tremoveClient(\"a\", 400);\n\t\t\tconnectedState.disconnect();\n\t\t\tassertState(\"a-summarizer\", \"b\", 17, \"summarizer still doing work\");\n\t\t\tsummarizer.runDeferred.resolve();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"b\", \"b\", 441, \"elected client leaving should reelect next oldest client\");\n\t\t\tconnectedState.connect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"b-summarizer\", \"b\", 441, \"should elect new summarizer\");\n\t\t});\n\n\t\tit(\"Should not reelect when client not summarizing\", async () => {\n\t\t\tcurrentSequenceNumber = 4800;\n\t\t\tcreateElection(\n\t\t\t\t[\n\t\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t\t[\"a\", 2, true],\n\t\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t\t[\"b\", 7, true],\n\t\t\t\t],\n\t\t\t\t{ electedClientId: \"b\", electedParentId: \"b\", electionSequenceNumber: 4000 },\n\t\t\t);\n\t\t\tassertState(\"b\", \"b\", 4000, \"elected client based on initial state\");\n\t\t\tconnectedState.connect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"b-summarizer\", \"b\", 4800, \"should elect b's summarizer\");\n\n\t\t\t// Should stay the same right up until max ops\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"b-summarizer\", \"b\", 4800, \"should not reelect <= max ops\");\n\n\t\t\t// Should not elect another client at this point, so the parent will stay as \"b\"\n\t\t\tdefaultOp();\n\t\t\tassertState(\"b-summarizer\", \"b\", 4800, \"b's summarizer still working\");\n\t\t\tsummarizer.runDeferred.resolve();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\n\t\t\t\t\"b-summarizer\",\n\t\t\t\t\"b\",\n\t\t\t\t4800,\n\t\t\t\t\"should not reelect a summarizer as b is still in the quorum\",\n\t\t\t);\n\n\t\t\t// Should not trigger another reelection as the client is \"unresponsive\" but not out of the quorum.\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"b-summarizer\", \"b\", 4800, \"should not reelect <= max ops since baseline\");\n\t\t\tdefaultOp();\n\t\t\tsummarizer.runDeferred.resolve();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"b-summarizer\", \"b\", 4800, \"should not reelect again\");\n\n\t\t\t// Only once the client is removed we will reelect.\n\t\t\tremoveClient(\"b\", 400);\n\t\t\tconnectedState.disconnect();\n\t\t\tassertState(\"b-summarizer\", \"a\", 4800, \"summarizer still doing work\");\n\t\t\tsummarizer.runDeferred.resolve();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\n\t\t\t\t\"a\",\n\t\t\t\t\"a\",\n\t\t\t\t2 * maxOps + 2 + 4800 + 400,\n\t\t\t\t\"elected client leaving should reelect next oldest client\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"Should not reelect even when summary ack is found\", () => {\n\t\t\tcurrentSequenceNumber = 4800;\n\t\t\tcreateElection(\n\t\t\t\t[\n\t\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t\t[\"a\", 2, true],\n\t\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t\t[\"b\", 7, true],\n\t\t\t\t],\n\t\t\t\t{ electedClientId: \"s2\", electedParentId: \"s2\", electionSequenceNumber: 4000 },\n\t\t\t);\n\t\t\tassertState(\"b\", \"b\", 4000, \"elected based on initial state\");\n\n\t\t\t// Should stay the same right up until max ops\n\t\t\tdefaultOp(maxOps - 800);\n\t\t\tassertState(\"b\", \"b\", 4000, \"should not reelect <= max ops\");\n\n\t\t\t// Summary ack should only increment election seq #\n\t\t\tsummaryAck();\n\t\t\tassertState(\"b\", \"b\", maxOps + 4001, \"should not reelect after summary ack\");\n\n\t\t\t// Summary ack should prevent reelection.\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"b\", \"b\", maxOps + 4001, \"should not reelect <= max ops since summary ack\");\n\n\t\t\t// Should not elect next client at this point as client election is disabled.\n\t\t\tdefaultOp();\n\t\t\tassertState(\n\t\t\t\t\"b\",\n\t\t\t\t\"b\",\n\t\t\t\tmaxOps + 4001,\n\t\t\t\t\"should not reelect even when > max ops since summary ack\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"Should never reelect when disabled\", () => {\n\t\t\tcurrentSequenceNumber = 4800;\n\t\t\tcreateElection(\n\t\t\t\t[\n\t\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t\t[\"a\", 2, true],\n\t\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t\t[\"b\", 7, true],\n\t\t\t\t],\n\t\t\t\t{ electedClientId: \"b\", electedParentId: \"b\", electionSequenceNumber: 4000 },\n\t\t\t);\n\t\t\tassertState(\"b\", \"b\", 4000, \"elected client based on initial state\");\n\n\t\t\t// Should stay the same right up until max ops\n\t\t\tdefaultOp(maxOps - 800);\n\t\t\tassertState(\"b\", \"b\", 4000, \"should not reelect <= max ops\");\n\n\t\t\t// Should elect first client at this point if enabled\n\t\t\tdefaultOp();\n\t\t\tassertState(\"b\", \"b\", 4000, \"would reelect > max ops, but not since disabled\");\n\n\t\t\t// Trigger another reelection if it were to be enabled\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"b\", \"b\", 4000, \"should not reelect <= max ops since baseline\");\n\t\t\tdefaultOp();\n\t\t\tassertState(\"b\", \"b\", 4000, \"would reelect again, but not since disabled\");\n\t\t});\n\t});\n\n\tdescribe(\"No initial state\", () => {\n\t\tit(\"Should reelect during add/remove clients\", () => {\n\t\t\tcreateElection();\n\t\t\tassertState(undefined, undefined, 0, \"no clients, should initially be undefined\");\n\n\t\t\t// Add non-interactive client, no effect\n\t\t\taddClient(\"s1\", 1, false);\n\t\t\tassertState(undefined, undefined, 0, \"only non-interactive client in quorum\");\n\n\t\t\t// Add interactive client, should elect\n\t\t\taddClient(\"a\", 2, true);\n\t\t\tassertState(\"a\", \"a\", 2, \"only one interactive client in quorum, should elect\");\n\n\t\t\t// Add more clients, no effect\n\t\t\taddClient(\"s2\", 3, false);\n\t\t\taddClient(\"b\", 4, true);\n\t\t\tassertState(\"a\", \"a\", 2, \"additional younger clients should have no effect\");\n\n\t\t\t// Remove elected client, should reelect\n\t\t\tremoveClient(\"a\", 4);\n\t\t\tassertState(\"b\", \"b\", 8, \"elected client leaving should reelect next oldest client\");\n\t\t});\n\n\t\tit(\"Should not reelect when client not summarizing\", () => {\n\t\t\tcreateElection([\n\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t[\"a\", 2, true],\n\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t[\"b\", 7, true],\n\t\t\t]);\n\t\t\tassertState(\"a\", \"a\", 7, \"initially should be oldest interactive client\");\n\n\t\t\t// Should stay the same right up until max ops\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"a\", \"a\", 7, \"should not reelect <= max ops\");\n\n\t\t\t// Should not elect next client when reelect > max ops.\n\t\t\tdefaultOp();\n\t\t\tassertState(\"a\", \"a\", 7, \"should not reelect > max ops\");\n\n\t\t\t// Next election should be undefined, which resets to first client\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"a\", \"a\", 7, \"should not reelect <= max ops since baseline\");\n\t\t\tdefaultOp();\n\t\t\tassertState(\n\t\t\t\t\"a\",\n\t\t\t\t\"a\",\n\t\t\t\t7,\n\t\t\t\t\"should not reelect back to oldest client as election is disabled.\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"Should not reelect when summary ack is found\", () => {\n\t\t\tcreateElection([\n\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t[\"a\", 2, true],\n\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t[\"b\", 7, true],\n\t\t\t]);\n\t\t\tassertState(\"a\", \"a\", 7, \"initially should elect oldest interactive client\");\n\n\t\t\t// Should stay the same right up until max ops\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"a\", \"a\", 7, \"should not reelect <= max ops\");\n\n\t\t\t// Summary ack should only increment election seq #\n\t\t\tsummaryAck();\n\t\t\tassertState(\"a\", \"a\", maxOps + 8, \"should not reelect after summary ack\");\n\n\t\t\t// Summary ack should prevent reelection\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"a\", \"a\", maxOps + 8, \"should not reelect <= max ops since summary ack\");\n\n\t\t\t// Should not elect next client at this point\n\t\t\tdefaultOp();\n\t\t\tassertState(\"a\", \"a\", maxOps + 8, \"should not reelect > max ops since summary ack\");\n\t\t});\n\n\t\tit(\"Should never reelect when disabled\", () => {\n\t\t\tcreateElection(\n\t\t\t\t[\n\t\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t\t[\"a\", 2, true],\n\t\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t\t[\"b\", 7, true],\n\t\t\t\t],\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tassertState(\"a\", \"a\", 7, \"initially should be oldest interactive client\");\n\n\t\t\t// Should stay the same right up until max ops\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"a\", \"a\", 7, \"should not reelect <= max ops\");\n\n\t\t\t// Should elect next client at this point\n\t\t\tdefaultOp();\n\t\t\tassertState(\"a\", \"a\", 7, \"would reelect > max ops, but not since disabled\");\n\n\t\t\t// Next election should be undefined, which resets to first client\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"a\", \"a\", 7, \"should not reelect <= max ops since baseline\");\n\t\t\tdefaultOp();\n\t\t\tassertState(\"a\", \"a\", 7, \"would reelect back to oldest client, but not since disabled\");\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"summarizerClientElection.spec.js","sourceRoot":"","sources":["../../../src/test/summary/summarizerClientElection.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 { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { Deferred } from \"@fluidframework/core-utils\";\nimport { ISequencedClient, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport {\n\tIConnectedEvents,\n\tIConnectedState,\n\tISerializedElection,\n\tISummarizer,\n\tISummarizerEvents,\n\tISummaryCollectionOpEvents,\n\tOrderedClientCollection,\n\tOrderedClientElection,\n\tSummarizerClientElection,\n\tSummarizerStopReason,\n\tSummaryManager,\n\tsummarizerClientType,\n} from \"../../summary/index.js\";\nimport { TestQuorumClients } from \"./testQuorumClients.js\";\n\ndescribe(\"Summarizer Client Election\", () => {\n\tconst maxOps = 1000;\n\tconst testQuorum = new TestQuorumClients();\n\tlet currentSequenceNumber: number = 0;\n\tconst testDeltaManager = {\n\t\tget lastSequenceNumber() {\n\t\t\treturn currentSequenceNumber;\n\t\t},\n\t};\n\tconst mockLogger = new MockLogger();\n\tlet refreshSummarizerCallCount = 0;\n\tconst summaryCollectionEmitter = new TypedEventEmitter<ISummaryCollectionOpEvents>();\n\tlet election: SummarizerClientElection;\n\tlet summaryManager: SummaryManager;\n\n\tconst summaryCollection = {\n\t\topsSinceLastAck: 0,\n\t\taddOpListener: () => {},\n\t\tremoveOpListener: () => {},\n\t};\n\n\tclass TestConnectedState\n\t\textends TypedEventEmitter<IConnectedEvents>\n\t\timplements IConnectedState\n\t{\n\t\tpublic connected = false;\n\t\tpublic clientId: string | undefined;\n\n\t\tpublic connect() {\n\t\t\tthis.connected = true;\n\t\t\tthis.clientId = election.electedParentId;\n\t\t\tthis.emit(\"connected\", this.clientId);\n\t\t}\n\n\t\tpublic disconnect() {\n\t\t\tthis.connected = false;\n\t\t\tthis.emit(\"disconnected\");\n\t\t}\n\t}\n\n\tclass TestSummarizer extends TypedEventEmitter<ISummarizerEvents> implements ISummarizer {\n\t\tprivate notImplemented(): never {\n\t\t\tthrow Error(\"not implemented\");\n\t\t}\n\t\tpublic onBehalfOf: string | undefined;\n\t\tpublic state: \"notStarted\" | \"running\" | \"stopped\" = \"notStarted\";\n\t\tpublic readonly stopDeferred = new Deferred<string | undefined>();\n\t\tpublic readonly runDeferred = new Deferred<void>();\n\t\tpublic clientId: string | undefined;\n\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t}\n\t\tpublic async setSummarizer() {\n\t\t\tthis.notImplemented();\n\t\t}\n\t\tpublic get cancelled() {\n\t\t\t// Approximation, as ideally it should become cancelled immediately after stop() call\n\t\t\treturn this.state !== \"running\";\n\t\t}\n\t\tpublic close() {}\n\t\tpublic stop(reason?: string): void {\n\t\t\tthis.stopDeferred.resolve(reason);\n\t\t}\n\t\tpublic async run(onBehalfOf: string): Promise<SummarizerStopReason> {\n\t\t\tthis.onBehalfOf = onBehalfOf;\n\t\t\tthis.state = \"running\";\n\t\t\tawait Promise.all([this.stopDeferred.promise, this.runDeferred.promise]);\n\t\t\tthis.state = \"stopped\";\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tremoveClient(this.clientId!, 0);\n\t\t\treturn \"summarizerClientDisconnected\";\n\t\t}\n\n\t\tpublic readonly summarizeOnDemand = () => this.notImplemented();\n\t\tpublic readonly enqueueSummarize = () => this.notImplemented();\n\t\tpublic get IFluidLoadable() {\n\t\t\treturn this.notImplemented();\n\t\t}\n\t\tpublic get handle() {\n\t\t\treturn this.notImplemented();\n\t\t}\n\t}\n\n\tlet connectedState: TestConnectedState;\n\tlet summarizer: TestSummarizer;\n\n\tconst flushPromises = async () => new Promise((resolve) => process.nextTick(resolve));\n\n\tfunction addClient(\n\t\tclientId: string,\n\t\tsequenceNumber: number,\n\t\tinteractive = true,\n\t\ttype?: string,\n\t) {\n\t\tif (sequenceNumber > currentSequenceNumber) {\n\t\t\tcurrentSequenceNumber = sequenceNumber;\n\t\t}\n\t\tconst details: ISequencedClient[\"client\"][\"details\"] = {\n\t\t\ttype,\n\t\t\tcapabilities: { interactive },\n\t\t};\n\t\tconst c: Partial<ISequencedClient[\"client\"]> = { details };\n\t\tconst client: ISequencedClient = {\n\t\t\tclient: c as ISequencedClient[\"client\"],\n\t\t\tsequenceNumber,\n\t\t};\n\t\ttestQuorum.addClient(clientId, client);\n\t}\n\tfunction removeClient(clientId: string, opCount = 1) {\n\t\tcurrentSequenceNumber += opCount;\n\t\ttestQuorum.removeClient(clientId);\n\t}\n\n\tconst requestSummarizer = async (): Promise<ISummarizer> => {\n\t\tsummarizer = new TestSummarizer();\n\t\tconst parentId = election.electedParentId;\n\t\tconst clientId = `${parentId}-summarizer`;\n\t\tsummarizer.clientId = clientId;\n\t\taddClient(clientId, currentSequenceNumber, false, summarizerClientType);\n\t\treturn summarizer;\n\t};\n\n\tconst throttler = {\n\t\tdelayMs: 0,\n\t\tnumAttempts: 0,\n\t\tgetDelay() {\n\t\t\treturn this.delayMs;\n\t\t},\n\t\tmaxDelayMs: 0,\n\t\tdelayWindowMs: 0,\n\t\tdelayFn: () => 0,\n\t};\n\n\tfunction createElection(\n\t\tinitialClients: [id: string, seq: number, int: boolean][] = [],\n\t\tinitialState?: ISerializedElection,\n\t) {\n\t\tfor (const [id, seq, int] of initialClients) {\n\t\t\taddClient(id, seq, int);\n\t\t}\n\t\telection = new SummarizerClientElection(\n\t\t\tmockLogger.toTelemetryLogger(),\n\t\t\tsummaryCollectionEmitter,\n\t\t\tnew OrderedClientElection(\n\t\t\t\tmockLogger.toTelemetryLogger(),\n\t\t\t\tnew OrderedClientCollection(mockLogger, testDeltaManager, testQuorum),\n\t\t\t\tinitialState ?? currentSequenceNumber,\n\t\t\t\tSummarizerClientElection.isClientEligible,\n\t\t\t),\n\t\t\tmaxOps,\n\t\t);\n\t\tconnectedState = new TestConnectedState();\n\t\tsummaryManager = new SummaryManager(\n\t\t\telection,\n\t\t\tconnectedState,\n\t\t\tsummaryCollection,\n\t\t\tmockLogger,\n\t\t\trequestSummarizer,\n\t\t\tthrottler,\n\t\t\t{\n\t\t\t\tinitialDelayMs: 0,\n\t\t\t\topsToBypassInitialDelay: 0,\n\t\t\t},\n\t\t);\n\t\tsummaryManager.start();\n\t\telection.on(\"electedSummarizerChanged\", () => {\n\t\t\tconnectedState.clientId = election.electedParentId;\n\t\t});\n\t\telection.on(\"shouldSummarizeStateChanged\", () => refreshSummarizerCallCount++);\n\t}\n\tfunction defaultOp(opCount = 1) {\n\t\tcurrentSequenceNumber += opCount;\n\t\tsummaryCollectionEmitter.emit(\"default\", { sequenceNumber: currentSequenceNumber });\n\t}\n\tfunction summaryAck(opCount = 1) {\n\t\tcurrentSequenceNumber += opCount;\n\t\tsummaryCollectionEmitter.emit(MessageType.SummaryAck, {\n\t\t\tsequenceNumber: currentSequenceNumber,\n\t\t});\n\t}\n\n\tfunction assertState(\n\t\texpectedId: string | undefined,\n\t\texpectedParentId: string | undefined,\n\t\texpectedSeq: number,\n\t\tmessage: string,\n\t) {\n\t\tconst { electedClientId, electedParentId, electionSequenceNumber } = election.serialize();\n\t\tassert.strictEqual(\n\t\t\telectedClientId,\n\t\t\telection.electedClientId,\n\t\t\t`Inconsistent clientId; ${message}`,\n\t\t);\n\t\tassert.strictEqual(\n\t\t\telectedParentId,\n\t\t\telection.electedParentId,\n\t\t\t`Inconsistent parentId; ${message}`,\n\t\t);\n\t\tassert.strictEqual(electedClientId, expectedId, `Invalid clientId; ${message}`);\n\t\tassert.strictEqual(electedParentId, expectedParentId, `Invalid parentId; ${message}`);\n\t\tassert.strictEqual(electionSequenceNumber, expectedSeq, `Invalid seq #; ${message}`);\n\t}\n\n\tafterEach(() => {\n\t\tmockLogger.events = [];\n\t\ttestQuorum.reset();\n\t\tsummaryCollectionEmitter.removeAllListeners();\n\t\tsummarizer.removeAllListeners();\n\t\telection.removeAllListeners();\n\t\tcurrentSequenceNumber = 0;\n\t});\n\n\tdescribe(\"With initial state\", () => {\n\t\tit(\"Should automatically elect oldest eligible client on op when undefined initial client\", async () => {\n\t\t\tcurrentSequenceNumber = 678;\n\t\t\tcreateElection(\n\t\t\t\t[\n\t\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t\t[\"a\", 2, true],\n\t\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t\t[\"b\", 7, true],\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\telectedClientId: undefined,\n\t\t\t\t\telectedParentId: undefined,\n\t\t\t\t\telectionSequenceNumber: 432,\n\t\t\t\t},\n\t\t\t);\n\t\t\tassertState(undefined, undefined, 432, \"no elected client at first\");\n\t\t\tdefaultOp();\n\t\t\tassertState(\"a\", \"a\", 679, \"auto-elect first eligible client\");\n\t\t\tconnectedState.connect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"a-summarizer\", \"a\", 679, \"a's summarizer elected on connect\");\n\t\t\tconnectedState.disconnect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"a-summarizer\", \"a\", 679, \"summarizer still elected while completing work\");\n\t\t\tsummarizer.runDeferred.resolve();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"a\", \"a\", 679, \"revert to parent election\");\n\t\t});\n\n\t\tit(\"Should automatically elect oldest eligible client on op when not found initial client\", async () => {\n\t\t\tcurrentSequenceNumber = 678;\n\t\t\tcreateElection(\n\t\t\t\t[\n\t\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t\t[\"a\", 2, true],\n\t\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t\t[\"b\", 7, true],\n\t\t\t\t],\n\t\t\t\t{ electedClientId: \"x\", electedParentId: \"x\", electionSequenceNumber: 432 },\n\t\t\t);\n\t\t\tassertState(undefined, undefined, 432, \"no elected client at first\");\n\t\t\tdefaultOp();\n\t\t\tassertState(\"a\", \"a\", 679, \"auto-elect first eligible client\");\n\t\t\tconnectedState.connect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"a-summarizer\", \"a\", 679, \"a's summarizer elected on connect\");\n\t\t\tconnectedState.disconnect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"a-summarizer\", \"a\", 679, \"summarizer still elected while completing work\");\n\t\t\tsummarizer.runDeferred.resolve();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"a\", \"a\", 679, \"revert to parent election\");\n\t\t});\n\n\t\tit(\"Should already have elected next eligible client when ineligible initial client\", () => {\n\t\t\tcurrentSequenceNumber = 678;\n\t\t\tcreateElection(\n\t\t\t\t[\n\t\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t\t[\"a\", 2, true],\n\t\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t\t[\"b\", 7, true],\n\t\t\t\t],\n\t\t\t\t{ electedClientId: \"s2\", electedParentId: \"s2\", electionSequenceNumber: 432 },\n\t\t\t);\n\t\t\tassertState(\"b\", \"b\", 432, \"auto-elect next eligible client\");\n\t\t});\n\n\t\tit(\"Should remain unelected with empty quorum\", () => {\n\t\t\tcurrentSequenceNumber = 678;\n\t\t\tcreateElection([], {\n\t\t\t\telectedClientId: undefined,\n\t\t\t\telectedParentId: undefined,\n\t\t\t\telectionSequenceNumber: 432,\n\t\t\t});\n\t\t\tassertState(undefined, undefined, 432, \"no elected client at first\");\n\t\t\tdefaultOp();\n\t\t\tassertState(undefined, undefined, 432, \"still no client to elect\");\n\t\t});\n\n\t\tit(\"Should remain unelected with empty quorum and not found client\", () => {\n\t\t\tcurrentSequenceNumber = 678;\n\t\t\tcreateElection([], {\n\t\t\t\telectedClientId: \"x\",\n\t\t\t\telectedParentId: \"x\",\n\t\t\t\telectionSequenceNumber: 432,\n\t\t\t});\n\t\t\tassertState(undefined, undefined, 432, \"no client to elect\");\n\t\t});\n\n\t\tit(\"Should reelect during add/remove clients\", async () => {\n\t\t\tcreateElection([], {\n\t\t\t\telectedClientId: undefined,\n\t\t\t\telectedParentId: undefined,\n\t\t\t\telectionSequenceNumber: 12,\n\t\t\t});\n\t\t\tassertState(undefined, undefined, 12, \"no clients, should initially be undefined\");\n\n\t\t\t// Add non-interactive client, no effect\n\t\t\taddClient(\"s1\", 1, false);\n\t\t\tassertState(undefined, undefined, 12, \"only non-interactive client in quorum\");\n\n\t\t\t// Add interactive client, should elect\n\t\t\taddClient(\"a\", 17, true);\n\t\t\tassertState(\"a\", \"a\", 17, \"only one interactive client in quorum, should elect\");\n\t\t\tconnectedState.connect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"a-summarizer\", \"a\", 17, \"a's summarizer elected on connect\");\n\n\t\t\t// Add more clients, no effect\n\t\t\taddClient(\"s2\", 19, false);\n\t\t\taddClient(\"b\", 41, true);\n\t\t\tassertState(\n\t\t\t\t\"a-summarizer\",\n\t\t\t\t\"a\",\n\t\t\t\t17,\n\t\t\t\t\"additional younger clients should have no effect\",\n\t\t\t);\n\n\t\t\t// Remove elected client, should reelect\n\t\t\tremoveClient(\"a\", 400);\n\t\t\tconnectedState.disconnect();\n\t\t\tassertState(\"a-summarizer\", \"b\", 17, \"summarizer still doing work\");\n\t\t\tsummarizer.runDeferred.resolve();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"b\", \"b\", 441, \"elected client leaving should reelect next oldest client\");\n\t\t\tconnectedState.connect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"b-summarizer\", \"b\", 441, \"should elect new summarizer\");\n\t\t});\n\n\t\tit(\"Should not reelect when client not summarizing\", async () => {\n\t\t\tcurrentSequenceNumber = 4800;\n\t\t\tcreateElection(\n\t\t\t\t[\n\t\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t\t[\"a\", 2, true],\n\t\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t\t[\"b\", 7, true],\n\t\t\t\t],\n\t\t\t\t{ electedClientId: \"b\", electedParentId: \"b\", electionSequenceNumber: 4000 },\n\t\t\t);\n\t\t\tassertState(\"b\", \"b\", 4000, \"elected client based on initial state\");\n\t\t\tconnectedState.connect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"b-summarizer\", \"b\", 4800, \"should elect b's summarizer\");\n\n\t\t\t// Should stay the same right up until max ops\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"b-summarizer\", \"b\", 4800, \"should not reelect <= max ops\");\n\n\t\t\t// Should not elect another client at this point, so the parent will stay as \"b\"\n\t\t\tdefaultOp();\n\t\t\tassertState(\"b-summarizer\", \"b\", 4800, \"b's summarizer still working\");\n\t\t\tsummarizer.runDeferred.resolve();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\n\t\t\t\t\"b-summarizer\",\n\t\t\t\t\"b\",\n\t\t\t\t4800,\n\t\t\t\t\"should not reelect a summarizer as b is still in the quorum\",\n\t\t\t);\n\n\t\t\t// Should not trigger another reelection as the client is \"unresponsive\" but not out of the quorum.\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"b-summarizer\", \"b\", 4800, \"should not reelect <= max ops since baseline\");\n\t\t\tdefaultOp();\n\t\t\tsummarizer.runDeferred.resolve();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\"b-summarizer\", \"b\", 4800, \"should not reelect again\");\n\n\t\t\t// Only once the client is removed we will reelect.\n\t\t\tremoveClient(\"b\", 400);\n\t\t\tconnectedState.disconnect();\n\t\t\tassertState(\"b-summarizer\", \"a\", 4800, \"summarizer still doing work\");\n\t\t\tsummarizer.runDeferred.resolve();\n\t\t\tawait flushPromises();\n\t\t\tassertState(\n\t\t\t\t\"a\",\n\t\t\t\t\"a\",\n\t\t\t\t2 * maxOps + 2 + 4800 + 400,\n\t\t\t\t\"elected client leaving should reelect next oldest client\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"Should not reelect even when summary ack is found\", () => {\n\t\t\tcurrentSequenceNumber = 4800;\n\t\t\tcreateElection(\n\t\t\t\t[\n\t\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t\t[\"a\", 2, true],\n\t\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t\t[\"b\", 7, true],\n\t\t\t\t],\n\t\t\t\t{ electedClientId: \"s2\", electedParentId: \"s2\", electionSequenceNumber: 4000 },\n\t\t\t);\n\t\t\tassertState(\"b\", \"b\", 4000, \"elected based on initial state\");\n\n\t\t\t// Should stay the same right up until max ops\n\t\t\tdefaultOp(maxOps - 800);\n\t\t\tassertState(\"b\", \"b\", 4000, \"should not reelect <= max ops\");\n\n\t\t\t// Summary ack should only increment election seq #\n\t\t\tsummaryAck();\n\t\t\tassertState(\"b\", \"b\", maxOps + 4001, \"should not reelect after summary ack\");\n\n\t\t\t// Summary ack should prevent reelection.\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"b\", \"b\", maxOps + 4001, \"should not reelect <= max ops since summary ack\");\n\n\t\t\t// Should not elect next client at this point as client election is disabled.\n\t\t\tdefaultOp();\n\t\t\tassertState(\n\t\t\t\t\"b\",\n\t\t\t\t\"b\",\n\t\t\t\tmaxOps + 4001,\n\t\t\t\t\"should not reelect even when > max ops since summary ack\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"Should never reelect when disabled\", () => {\n\t\t\tcurrentSequenceNumber = 4800;\n\t\t\tcreateElection(\n\t\t\t\t[\n\t\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t\t[\"a\", 2, true],\n\t\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t\t[\"b\", 7, true],\n\t\t\t\t],\n\t\t\t\t{ electedClientId: \"b\", electedParentId: \"b\", electionSequenceNumber: 4000 },\n\t\t\t);\n\t\t\tassertState(\"b\", \"b\", 4000, \"elected client based on initial state\");\n\n\t\t\t// Should stay the same right up until max ops\n\t\t\tdefaultOp(maxOps - 800);\n\t\t\tassertState(\"b\", \"b\", 4000, \"should not reelect <= max ops\");\n\n\t\t\t// Should elect first client at this point if enabled\n\t\t\tdefaultOp();\n\t\t\tassertState(\"b\", \"b\", 4000, \"would reelect > max ops, but not since disabled\");\n\n\t\t\t// Trigger another reelection if it were to be enabled\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"b\", \"b\", 4000, \"should not reelect <= max ops since baseline\");\n\t\t\tdefaultOp();\n\t\t\tassertState(\"b\", \"b\", 4000, \"would reelect again, but not since disabled\");\n\t\t});\n\t});\n\n\tdescribe(\"No initial state\", () => {\n\t\tit(\"Should reelect during add/remove clients\", () => {\n\t\t\tcreateElection();\n\t\t\tassertState(undefined, undefined, 0, \"no clients, should initially be undefined\");\n\n\t\t\t// Add non-interactive client, no effect\n\t\t\taddClient(\"s1\", 1, false);\n\t\t\tassertState(undefined, undefined, 0, \"only non-interactive client in quorum\");\n\n\t\t\t// Add interactive client, should elect\n\t\t\taddClient(\"a\", 2, true);\n\t\t\tassertState(\"a\", \"a\", 2, \"only one interactive client in quorum, should elect\");\n\n\t\t\t// Add more clients, no effect\n\t\t\taddClient(\"s2\", 3, false);\n\t\t\taddClient(\"b\", 4, true);\n\t\t\tassertState(\"a\", \"a\", 2, \"additional younger clients should have no effect\");\n\n\t\t\t// Remove elected client, should reelect\n\t\t\tremoveClient(\"a\", 4);\n\t\t\tassertState(\"b\", \"b\", 8, \"elected client leaving should reelect next oldest client\");\n\t\t});\n\n\t\tit(\"Should not reelect when client not summarizing\", () => {\n\t\t\tcreateElection([\n\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t[\"a\", 2, true],\n\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t[\"b\", 7, true],\n\t\t\t]);\n\t\t\tassertState(\"a\", \"a\", 7, \"initially should be oldest interactive client\");\n\n\t\t\t// Should stay the same right up until max ops\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"a\", \"a\", 7, \"should not reelect <= max ops\");\n\n\t\t\t// Should not elect next client when reelect > max ops.\n\t\t\tdefaultOp();\n\t\t\tassertState(\"a\", \"a\", 7, \"should not reelect > max ops\");\n\n\t\t\t// Next election should be undefined, which resets to first client\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"a\", \"a\", 7, \"should not reelect <= max ops since baseline\");\n\t\t\tdefaultOp();\n\t\t\tassertState(\n\t\t\t\t\"a\",\n\t\t\t\t\"a\",\n\t\t\t\t7,\n\t\t\t\t\"should not reelect back to oldest client as election is disabled.\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"Should not reelect when summary ack is found\", () => {\n\t\t\tcreateElection([\n\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t[\"a\", 2, true],\n\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t[\"b\", 7, true],\n\t\t\t]);\n\t\t\tassertState(\"a\", \"a\", 7, \"initially should elect oldest interactive client\");\n\n\t\t\t// Should stay the same right up until max ops\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"a\", \"a\", 7, \"should not reelect <= max ops\");\n\n\t\t\t// Summary ack should only increment election seq #\n\t\t\tsummaryAck();\n\t\t\tassertState(\"a\", \"a\", maxOps + 8, \"should not reelect after summary ack\");\n\n\t\t\t// Summary ack should prevent reelection\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"a\", \"a\", maxOps + 8, \"should not reelect <= max ops since summary ack\");\n\n\t\t\t// Should not elect next client at this point\n\t\t\tdefaultOp();\n\t\t\tassertState(\"a\", \"a\", maxOps + 8, \"should not reelect > max ops since summary ack\");\n\t\t});\n\n\t\tit(\"Should never reelect when disabled\", () => {\n\t\t\tcreateElection(\n\t\t\t\t[\n\t\t\t\t\t[\"s1\", 1, false],\n\t\t\t\t\t[\"a\", 2, true],\n\t\t\t\t\t[\"s2\", 4, false],\n\t\t\t\t\t[\"b\", 7, true],\n\t\t\t\t],\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tassertState(\"a\", \"a\", 7, \"initially should be oldest interactive client\");\n\n\t\t\t// Should stay the same right up until max ops\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"a\", \"a\", 7, \"should not reelect <= max ops\");\n\n\t\t\t// Should elect next client at this point\n\t\t\tdefaultOp();\n\t\t\tassertState(\"a\", \"a\", 7, \"would reelect > max ops, but not since disabled\");\n\n\t\t\t// Next election should be undefined, which resets to first client\n\t\t\tdefaultOp(maxOps);\n\t\t\tassertState(\"a\", \"a\", 7, \"should not reelect <= max ops since baseline\");\n\t\t\tdefaultOp();\n\t\t\tassertState(\"a\", \"a\", 7, \"would reelect back to oldest client, but not since disabled\");\n\t\t});\n\t});\n});\n"]}
@@ -3,8 +3,8 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "assert";
6
- import sinon from "sinon";
7
6
  import { MockLogger } from "@fluidframework/telemetry-utils";
7
+ import sinon from "sinon";
8
8
  import { SummarizeHeuristicData, SummarizeHeuristicRunner, } from "../../summary/index.js";
9
9
  describe("Runtime", () => {
10
10
  describe("Summarization", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"summarizerHeuristics.spec.js","sourceRoot":"","sources":["../../../src/test/summary/summarizerHeuristics.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 { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { ISummaryConfiguration, ISummaryConfigurationHeuristics } from \"../../containerRuntime.js\";\nimport {\n\tSummarizeHeuristicData,\n\tSummarizeHeuristicRunner,\n\tISummarizeHeuristicData,\n\tISummarizeAttempt,\n\tSummarizeReason,\n} from \"../../summary/index.js\";\n\ndescribe(\"Runtime\", () => {\n\tdescribe(\"Summarization\", () => {\n\t\tdescribe(\"Summarize Heuristic Runner\", () => {\n\t\t\tlet clock: sinon.SinonFakeTimers;\n\t\t\tbefore(() => {\n\t\t\t\tclock = sinon.useFakeTimers();\n\t\t\t});\n\t\t\tafter(() => {\n\t\t\t\tclock.restore();\n\t\t\t});\n\n\t\t\tconst defaultSummaryConfig: ISummaryConfigurationHeuristics = {\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\tmaxAckWaitTime: 120000, // 2 min\n\t\t\t\tmaxOpsSinceLastSummary: 7000,\n\t\t\t\tinitialSummarizerDelayMs: 0,\n\t\t\t\tminIdleTime: 5000, // 5 sec (idle)\n\t\t\t\tmaxIdleTime: 5000, // 5 sec (idle)\n\t\t\t\tnonRuntimeOpWeight: 0.1,\n\t\t\t\truntimeOpWeight: 1.0,\n\t\t\t};\n\t\t\tlet summaryConfig: Readonly<ISummaryConfiguration>;\n\t\t\tlet data: ISummarizeHeuristicData;\n\t\t\tlet runner: SummarizeHeuristicRunner;\n\t\t\tlet mockLogger: MockLogger;\n\n\t\t\tlet attempts: SummarizeReason[];\n\t\t\tconst trySummarize = (reason: SummarizeReason) => {\n\t\t\t\tattempts.push(reason);\n\t\t\t};\n\t\t\tconst getLastAttempt = () =>\n\t\t\t\tattempts.length > 0 ? attempts[attempts.length - 1] : undefined;\n\t\t\tfunction assertAttemptCount(count: number, message?: string) {\n\t\t\t\tconst fullMessage = `${attempts.length} !== ${count}; ${\n\t\t\t\t\tmessage ?? \"unexpected attempt count\"\n\t\t\t\t}`;\n\t\t\t\tassert(attempts.length === count, fullMessage);\n\t\t\t}\n\n\t\t\tfunction initialize({\n\t\t\t\trefSequenceNumber = 0,\n\t\t\t\tlastOpSequenceNumber = refSequenceNumber,\n\t\t\t\tsummaryTime = Date.now(),\n\t\t\t\tmaxTime = defaultSummaryConfig.maxTime,\n\t\t\t\tmaxOps = defaultSummaryConfig.maxOps,\n\t\t\t\tmaxAckWaitTime = defaultSummaryConfig.maxAckWaitTime,\n\t\t\t\tmaxOpsSinceLastSummary = defaultSummaryConfig.maxOpsSinceLastSummary,\n\t\t\t\tinitialSummarizerDelayMs = defaultSummaryConfig.initialSummarizerDelayMs,\n\t\t\t\tminOpsForLastSummaryAttempt = defaultSummaryConfig.minOpsForLastSummaryAttempt,\n\t\t\t\trun = true,\n\t\t\t\tminIdleTime = defaultSummaryConfig.minIdleTime,\n\t\t\t\tmaxIdleTime = defaultSummaryConfig.maxIdleTime,\n\t\t\t\tnonRuntimeOpWeight = defaultSummaryConfig.nonRuntimeOpWeight,\n\t\t\t\truntimeOpWeight = defaultSummaryConfig.runtimeOpWeight,\n\t\t\t}: Partial<\n\t\t\t\tISummaryConfigurationHeuristics &\n\t\t\t\t\tISummarizeAttempt & {\n\t\t\t\t\t\tlastOpSequenceNumber: number;\n\t\t\t\t\t\trun: boolean;\n\t\t\t\t\t}\n\t\t\t> = {}) {\n\t\t\t\tmockLogger = new MockLogger();\n\t\t\t\tdata = new SummarizeHeuristicData(lastOpSequenceNumber, {\n\t\t\t\t\trefSequenceNumber,\n\t\t\t\t\tsummaryTime,\n\t\t\t\t});\n\t\t\t\tsummaryConfig = {\n\t\t\t\t\tstate: \"enabled\",\n\t\t\t\t\tmaxTime,\n\t\t\t\t\tmaxOps,\n\t\t\t\t\tmaxAckWaitTime,\n\t\t\t\t\tmaxOpsSinceLastSummary,\n\t\t\t\t\tinitialSummarizerDelayMs,\n\t\t\t\t\tminOpsForLastSummaryAttempt,\n\t\t\t\t\tminIdleTime,\n\t\t\t\t\tmaxIdleTime,\n\t\t\t\t\tnonRuntimeOpWeight,\n\t\t\t\t\truntimeOpWeight,\n\t\t\t\t} as const;\n\n\t\t\t\trunner = new SummarizeHeuristicRunner(\n\t\t\t\t\tdata,\n\t\t\t\t\tsummaryConfig,\n\t\t\t\t\ttrySummarize,\n\t\t\t\t\tmockLogger.toTelemetryLogger(),\n\t\t\t\t);\n\n\t\t\t\tif (run) {\n\t\t\t\t\trunner.run();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbeforeEach(() => {\n\t\t\t\tattempts = [];\n\t\t\t});\n\t\t\tafterEach(() => {\n\t\t\t\tclock.reset();\n\t\t\t});\n\n\t\t\tit(\"Should summarize after maxOps with no prior summary\", () => {\n\t\t\t\tconst maxOps = 100;\n\t\t\t\tinitialize({ maxOps });\n\n\t\t\t\tdata.lastOpSequenceNumber = maxOps;\n\t\t\t\tdata.numRuntimeOps = maxOps;\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(0, \"should not run yet\");\n\n\t\t\t\tdata.lastOpSequenceNumber++;\n\t\t\t\tdata.numRuntimeOps++;\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(1, \"should run now\");\n\t\t\t\tassert(getLastAttempt() === \"maxOps\");\n\t\t\t});\n\n\t\t\tit(\"Should summarize after maxOps\", () => {\n\t\t\t\tconst lastSummary = 1000;\n\t\t\t\tconst maxOps = 100;\n\t\t\t\tinitialize({ refSequenceNumber: lastSummary, maxOps });\n\n\t\t\t\tdata.lastOpSequenceNumber = lastSummary + maxOps;\n\t\t\t\tdata.numRuntimeOps = maxOps;\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(0, \"should not run yet\");\n\n\t\t\t\tdata.lastOpSequenceNumber++;\n\t\t\t\tdata.numRuntimeOps++;\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(1, \"should run now\");\n\t\t\t\tassert(getLastAttempt() === \"maxOps\");\n\t\t\t});\n\n\t\t\tit(\"Should summarize after maxTime\", () => {\n\t\t\t\tconst lastSummary = 1000;\n\t\t\t\tconst idleTime = 101;\n\t\t\t\tconst maxTime = 1000;\n\t\t\t\tconst idlesPerActive = Math.floor((maxTime + 1) / (idleTime - 1));\n\t\t\t\tconst remainingTime = (maxTime + 1) % (idleTime - 1);\n\t\t\t\tinitialize({\n\t\t\t\t\trefSequenceNumber: lastSummary,\n\t\t\t\t\tminIdleTime: idleTime,\n\t\t\t\t\tmaxIdleTime: idleTime,\n\t\t\t\t\tmaxTime,\n\t\t\t\t});\n\n\t\t\t\tdata.lastOpSequenceNumber = lastSummary + 1;\n\n\t\t\t\tfor (let i = 0; i < idlesPerActive; i++) {\n\t\t\t\t\t// Prevent idle timer from triggering with periodic \"ops\" (heuristic runs)\n\t\t\t\t\tclock.tick(idleTime - 1);\n\t\t\t\t\trunner.run();\n\t\t\t\t}\n\t\t\t\tclock.tick(remainingTime - 1);\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(0, \"should not run yet\");\n\n\t\t\t\tclock.tick(1);\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(1, \"should run now\");\n\t\t\t\tassert(getLastAttempt() === \"maxTime\");\n\t\t\t});\n\n\t\t\tit(\"Should summarize after idleTime\", () => {\n\t\t\t\tconst lastSummary = 1000;\n\t\t\t\tconst idleTime = 101;\n\t\t\t\tconst maxTime = 1000;\n\t\t\t\tinitialize({\n\t\t\t\t\trefSequenceNumber: lastSummary,\n\t\t\t\t\tminIdleTime: idleTime,\n\t\t\t\t\tmaxIdleTime: idleTime,\n\t\t\t\t\tmaxTime,\n\t\t\t\t});\n\n\t\t\t\tdata.lastOpSequenceNumber = lastSummary + 1;\n\n\t\t\t\tclock.tick(idleTime - 1);\n\t\t\t\tassertAttemptCount(0, \"should not run yet\");\n\n\t\t\t\tclock.tick(1);\n\t\t\t\tassertAttemptCount(1, \"should run now\");\n\t\t\t\tassert(getLastAttempt() === \"idle\");\n\t\t\t});\n\n\t\t\tit(\"Should summarize after idleTime after a few interruptions\", () => {\n\t\t\t\tconst lastSummary = 1000;\n\t\t\t\tconst idleTime = 101;\n\t\t\t\tconst maxTime = 1000;\n\t\t\t\tinitialize({\n\t\t\t\t\trefSequenceNumber: lastSummary,\n\t\t\t\t\tminIdleTime: idleTime,\n\t\t\t\t\tmaxIdleTime: idleTime,\n\t\t\t\t\tmaxTime,\n\t\t\t\t});\n\n\t\t\t\tdata.lastOpSequenceNumber = lastSummary + 1;\n\n\t\t\t\tclock.tick(idleTime - 1);\n\t\t\t\tassertAttemptCount(0, \"should not run yet\");\n\t\t\t\trunner.run(); // interrupts idle timer\n\n\t\t\t\tclock.tick(idleTime - 1);\n\t\t\t\tassertAttemptCount(0, \"still should not run yet\");\n\t\t\t\trunner.run(); // interrupts idle timer\n\n\t\t\t\tclock.tick(idleTime - 1);\n\t\t\t\tassertAttemptCount(0, \"still should not run yet again\");\n\n\t\t\t\tclock.tick(idleTime);\n\t\t\t\tassertAttemptCount(1, \"should run now\");\n\t\t\t\tassert(getLastAttempt() === \"idle\");\n\t\t\t});\n\n\t\t\tit(\"Should summarize on close if enough outstanding ops\", () => {\n\t\t\t\tconst minOpsForLastSummaryAttempt = 10;\n\t\t\t\tinitialize({ minOpsForLastSummaryAttempt, runtimeOpWeight: 1.0 });\n\n\t\t\t\tdata.numRuntimeOps = minOpsForLastSummaryAttempt;\n\t\t\t\tassert.strictEqual(runner.shouldRunLastSummary(), true, \"should run on close\");\n\t\t\t});\n\n\t\t\tit(\"Should not summarize on close if insufficient outstanding ops\", () => {\n\t\t\t\tconst minOpsForLastSummaryAttempt = 10;\n\t\t\t\tinitialize({ minOpsForLastSummaryAttempt, runtimeOpWeight: 1.0 });\n\n\t\t\t\tdata.numRuntimeOps = minOpsForLastSummaryAttempt - 1;\n\t\t\t\tassert.strictEqual(runner.shouldRunLastSummary(), false, \"should not run on close\");\n\t\t\t});\n\n\t\t\tit(\"Should summarize on close weights ops properly\", () => {\n\t\t\t\tconst minOpsForLastSummaryAttempt = 2;\n\t\t\t\tinitialize({\n\t\t\t\t\tminOpsForLastSummaryAttempt,\n\t\t\t\t\truntimeOpWeight: 0.1,\n\t\t\t\t\tnonRuntimeOpWeight: 1.1,\n\t\t\t\t});\n\n\t\t\t\tdata.numRuntimeOps += 8;\n\t\t\t\tassert.strictEqual(runner.shouldRunLastSummary(), false, \"should not run yet\");\n\n\t\t\t\tdata.numNonRuntimeOps += 1;\n\t\t\t\tassert.strictEqual(runner.shouldRunLastSummary(), false, \"should not run yet\");\n\n\t\t\t\tdata.numRuntimeOps += 1;\n\t\t\t\tassert.strictEqual(runner.shouldRunLastSummary(), true, \"should run\");\n\t\t\t});\n\n\t\t\tit(\"Should not run idle timer after dispose\", () => {\n\t\t\t\tconst lastSummary = 1000;\n\t\t\t\tconst idleTime = 101;\n\t\t\t\tconst maxTime = 1000;\n\t\t\t\tinitialize({\n\t\t\t\t\trefSequenceNumber: lastSummary,\n\t\t\t\t\tminIdleTime: idleTime,\n\t\t\t\t\tmaxIdleTime: idleTime,\n\t\t\t\t\tmaxTime,\n\t\t\t\t});\n\n\t\t\t\tdata.lastOpSequenceNumber = lastSummary + 1;\n\n\t\t\t\tclock.tick(idleTime - 1);\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(0, \"should not run yet\");\n\n\t\t\t\trunner.dispose();\n\t\t\t\tclock.tick(1);\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(0, \"should still run since disposed\");\n\t\t\t});\n\n\t\t\tit(\"Idle time value should change based on op counts\", () => {\n\t\t\t\tconst minIdleTime = 0;\n\t\t\t\tconst maxIdleTime = 1;\n\t\t\t\tconst maxTime = 1000;\n\t\t\t\tconst maxOps = 1000;\n\t\t\t\tconst runtimeOpWeight = 1.0;\n\t\t\t\tconst nonRuntimeOpWeight = 1.0;\n\t\t\t\tinitialize({\n\t\t\t\t\tminIdleTime,\n\t\t\t\t\tmaxIdleTime,\n\t\t\t\t\tmaxTime,\n\t\t\t\t\tmaxOps,\n\t\t\t\t\truntimeOpWeight,\n\t\t\t\t\tnonRuntimeOpWeight,\n\t\t\t\t});\n\n\t\t\t\tdata.lastOpSequenceNumber = maxOps;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime, \"should start at the maxIdleTime\");\n\n\t\t\t\tdata.numRuntimeOps += 50;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime - 0.05);\n\n\t\t\t\tdata.numRuntimeOps += 123;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime - 0.173);\n\n\t\t\t\tdata.numRuntimeOps += 500;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime - 0.673);\n\n\t\t\t\tdata.numRuntimeOps += 326;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime - 0.999);\n\n\t\t\t\tdata.numRuntimeOps += 1;\n\t\t\t\tassert.strictEqual(runner.idleTime, minIdleTime);\n\n\t\t\t\tdata.numRuntimeOps += 100;\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\trunner.idleTime,\n\t\t\t\t\tminIdleTime,\n\t\t\t\t\t\"should never go below the minIdleTime\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Idle time should change based on op weights\", () => {\n\t\t\t\tconst minIdleTime = 0;\n\t\t\t\tconst maxIdleTime = 1000;\n\t\t\t\tconst maxTime = 1000;\n\t\t\t\tconst maxOps = 1000;\n\t\t\t\tconst runtimeOpWeight = 0.1;\n\t\t\t\tconst nonRuntimeOpWeight = 1.1;\n\t\t\t\tinitialize({\n\t\t\t\t\tminIdleTime,\n\t\t\t\t\tmaxIdleTime,\n\t\t\t\t\tmaxTime,\n\t\t\t\t\tmaxOps,\n\t\t\t\t\truntimeOpWeight,\n\t\t\t\t\tnonRuntimeOpWeight,\n\t\t\t\t});\n\n\t\t\t\tdata.lastOpSequenceNumber = maxOps;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime, \"should start at the maxIdleTime\");\n\n\t\t\t\tdata.numRuntimeOps += 50;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime - 5);\n\n\t\t\t\tdata.numRuntimeOps += 123;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime - 17.3);\n\n\t\t\t\tdata.numNonRuntimeOps += 500;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime - 567.3);\n\n\t\t\t\tdata.numNonRuntimeOps += 1;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime - 568.4);\n\t\t\t});\n\n\t\t\tit(\"Weights ops properly\", () => {\n\t\t\t\tconst maxOps = 2;\n\t\t\t\tconst runtimeOpWeight = 0.1;\n\t\t\t\tconst nonRuntimeOpWeight = 1.1;\n\t\t\t\tinitialize({ maxOps, runtimeOpWeight, nonRuntimeOpWeight });\n\n\t\t\t\tdata.lastOpSequenceNumber = maxOps;\n\n\t\t\t\tdata.numRuntimeOps += 9;\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(0, \"should not run yet\");\n\n\t\t\t\tdata.numNonRuntimeOps += 1;\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(0, \"should not run yet\");\n\n\t\t\t\tdata.numRuntimeOps += 1;\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(1, \"should run\");\n\t\t\t\tassert(getLastAttempt() === \"maxOps\");\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"summarizerHeuristics.spec.js","sourceRoot":"","sources":["../../../src/test/summary/summarizerHeuristics.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 { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport sinon from \"sinon\";\nimport { ISummaryConfiguration, ISummaryConfigurationHeuristics } from \"../../containerRuntime.js\";\nimport {\n\tISummarizeAttempt,\n\tISummarizeHeuristicData,\n\tSummarizeHeuristicData,\n\tSummarizeHeuristicRunner,\n\tSummarizeReason,\n} from \"../../summary/index.js\";\n\ndescribe(\"Runtime\", () => {\n\tdescribe(\"Summarization\", () => {\n\t\tdescribe(\"Summarize Heuristic Runner\", () => {\n\t\t\tlet clock: sinon.SinonFakeTimers;\n\t\t\tbefore(() => {\n\t\t\t\tclock = sinon.useFakeTimers();\n\t\t\t});\n\t\t\tafter(() => {\n\t\t\t\tclock.restore();\n\t\t\t});\n\n\t\t\tconst defaultSummaryConfig: ISummaryConfigurationHeuristics = {\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\tmaxAckWaitTime: 120000, // 2 min\n\t\t\t\tmaxOpsSinceLastSummary: 7000,\n\t\t\t\tinitialSummarizerDelayMs: 0,\n\t\t\t\tminIdleTime: 5000, // 5 sec (idle)\n\t\t\t\tmaxIdleTime: 5000, // 5 sec (idle)\n\t\t\t\tnonRuntimeOpWeight: 0.1,\n\t\t\t\truntimeOpWeight: 1.0,\n\t\t\t};\n\t\t\tlet summaryConfig: Readonly<ISummaryConfiguration>;\n\t\t\tlet data: ISummarizeHeuristicData;\n\t\t\tlet runner: SummarizeHeuristicRunner;\n\t\t\tlet mockLogger: MockLogger;\n\n\t\t\tlet attempts: SummarizeReason[];\n\t\t\tconst trySummarize = (reason: SummarizeReason) => {\n\t\t\t\tattempts.push(reason);\n\t\t\t};\n\t\t\tconst getLastAttempt = () =>\n\t\t\t\tattempts.length > 0 ? attempts[attempts.length - 1] : undefined;\n\t\t\tfunction assertAttemptCount(count: number, message?: string) {\n\t\t\t\tconst fullMessage = `${attempts.length} !== ${count}; ${\n\t\t\t\t\tmessage ?? \"unexpected attempt count\"\n\t\t\t\t}`;\n\t\t\t\tassert(attempts.length === count, fullMessage);\n\t\t\t}\n\n\t\t\tfunction initialize({\n\t\t\t\trefSequenceNumber = 0,\n\t\t\t\tlastOpSequenceNumber = refSequenceNumber,\n\t\t\t\tsummaryTime = Date.now(),\n\t\t\t\tmaxTime = defaultSummaryConfig.maxTime,\n\t\t\t\tmaxOps = defaultSummaryConfig.maxOps,\n\t\t\t\tmaxAckWaitTime = defaultSummaryConfig.maxAckWaitTime,\n\t\t\t\tmaxOpsSinceLastSummary = defaultSummaryConfig.maxOpsSinceLastSummary,\n\t\t\t\tinitialSummarizerDelayMs = defaultSummaryConfig.initialSummarizerDelayMs,\n\t\t\t\tminOpsForLastSummaryAttempt = defaultSummaryConfig.minOpsForLastSummaryAttempt,\n\t\t\t\trun = true,\n\t\t\t\tminIdleTime = defaultSummaryConfig.minIdleTime,\n\t\t\t\tmaxIdleTime = defaultSummaryConfig.maxIdleTime,\n\t\t\t\tnonRuntimeOpWeight = defaultSummaryConfig.nonRuntimeOpWeight,\n\t\t\t\truntimeOpWeight = defaultSummaryConfig.runtimeOpWeight,\n\t\t\t}: Partial<\n\t\t\t\tISummaryConfigurationHeuristics &\n\t\t\t\t\tISummarizeAttempt & {\n\t\t\t\t\t\tlastOpSequenceNumber: number;\n\t\t\t\t\t\trun: boolean;\n\t\t\t\t\t}\n\t\t\t> = {}) {\n\t\t\t\tmockLogger = new MockLogger();\n\t\t\t\tdata = new SummarizeHeuristicData(lastOpSequenceNumber, {\n\t\t\t\t\trefSequenceNumber,\n\t\t\t\t\tsummaryTime,\n\t\t\t\t});\n\t\t\t\tsummaryConfig = {\n\t\t\t\t\tstate: \"enabled\",\n\t\t\t\t\tmaxTime,\n\t\t\t\t\tmaxOps,\n\t\t\t\t\tmaxAckWaitTime,\n\t\t\t\t\tmaxOpsSinceLastSummary,\n\t\t\t\t\tinitialSummarizerDelayMs,\n\t\t\t\t\tminOpsForLastSummaryAttempt,\n\t\t\t\t\tminIdleTime,\n\t\t\t\t\tmaxIdleTime,\n\t\t\t\t\tnonRuntimeOpWeight,\n\t\t\t\t\truntimeOpWeight,\n\t\t\t\t} as const;\n\n\t\t\t\trunner = new SummarizeHeuristicRunner(\n\t\t\t\t\tdata,\n\t\t\t\t\tsummaryConfig,\n\t\t\t\t\ttrySummarize,\n\t\t\t\t\tmockLogger.toTelemetryLogger(),\n\t\t\t\t);\n\n\t\t\t\tif (run) {\n\t\t\t\t\trunner.run();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbeforeEach(() => {\n\t\t\t\tattempts = [];\n\t\t\t});\n\t\t\tafterEach(() => {\n\t\t\t\tclock.reset();\n\t\t\t});\n\n\t\t\tit(\"Should summarize after maxOps with no prior summary\", () => {\n\t\t\t\tconst maxOps = 100;\n\t\t\t\tinitialize({ maxOps });\n\n\t\t\t\tdata.lastOpSequenceNumber = maxOps;\n\t\t\t\tdata.numRuntimeOps = maxOps;\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(0, \"should not run yet\");\n\n\t\t\t\tdata.lastOpSequenceNumber++;\n\t\t\t\tdata.numRuntimeOps++;\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(1, \"should run now\");\n\t\t\t\tassert(getLastAttempt() === \"maxOps\");\n\t\t\t});\n\n\t\t\tit(\"Should summarize after maxOps\", () => {\n\t\t\t\tconst lastSummary = 1000;\n\t\t\t\tconst maxOps = 100;\n\t\t\t\tinitialize({ refSequenceNumber: lastSummary, maxOps });\n\n\t\t\t\tdata.lastOpSequenceNumber = lastSummary + maxOps;\n\t\t\t\tdata.numRuntimeOps = maxOps;\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(0, \"should not run yet\");\n\n\t\t\t\tdata.lastOpSequenceNumber++;\n\t\t\t\tdata.numRuntimeOps++;\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(1, \"should run now\");\n\t\t\t\tassert(getLastAttempt() === \"maxOps\");\n\t\t\t});\n\n\t\t\tit(\"Should summarize after maxTime\", () => {\n\t\t\t\tconst lastSummary = 1000;\n\t\t\t\tconst idleTime = 101;\n\t\t\t\tconst maxTime = 1000;\n\t\t\t\tconst idlesPerActive = Math.floor((maxTime + 1) / (idleTime - 1));\n\t\t\t\tconst remainingTime = (maxTime + 1) % (idleTime - 1);\n\t\t\t\tinitialize({\n\t\t\t\t\trefSequenceNumber: lastSummary,\n\t\t\t\t\tminIdleTime: idleTime,\n\t\t\t\t\tmaxIdleTime: idleTime,\n\t\t\t\t\tmaxTime,\n\t\t\t\t});\n\n\t\t\t\tdata.lastOpSequenceNumber = lastSummary + 1;\n\n\t\t\t\tfor (let i = 0; i < idlesPerActive; i++) {\n\t\t\t\t\t// Prevent idle timer from triggering with periodic \"ops\" (heuristic runs)\n\t\t\t\t\tclock.tick(idleTime - 1);\n\t\t\t\t\trunner.run();\n\t\t\t\t}\n\t\t\t\tclock.tick(remainingTime - 1);\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(0, \"should not run yet\");\n\n\t\t\t\tclock.tick(1);\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(1, \"should run now\");\n\t\t\t\tassert(getLastAttempt() === \"maxTime\");\n\t\t\t});\n\n\t\t\tit(\"Should summarize after idleTime\", () => {\n\t\t\t\tconst lastSummary = 1000;\n\t\t\t\tconst idleTime = 101;\n\t\t\t\tconst maxTime = 1000;\n\t\t\t\tinitialize({\n\t\t\t\t\trefSequenceNumber: lastSummary,\n\t\t\t\t\tminIdleTime: idleTime,\n\t\t\t\t\tmaxIdleTime: idleTime,\n\t\t\t\t\tmaxTime,\n\t\t\t\t});\n\n\t\t\t\tdata.lastOpSequenceNumber = lastSummary + 1;\n\n\t\t\t\tclock.tick(idleTime - 1);\n\t\t\t\tassertAttemptCount(0, \"should not run yet\");\n\n\t\t\t\tclock.tick(1);\n\t\t\t\tassertAttemptCount(1, \"should run now\");\n\t\t\t\tassert(getLastAttempt() === \"idle\");\n\t\t\t});\n\n\t\t\tit(\"Should summarize after idleTime after a few interruptions\", () => {\n\t\t\t\tconst lastSummary = 1000;\n\t\t\t\tconst idleTime = 101;\n\t\t\t\tconst maxTime = 1000;\n\t\t\t\tinitialize({\n\t\t\t\t\trefSequenceNumber: lastSummary,\n\t\t\t\t\tminIdleTime: idleTime,\n\t\t\t\t\tmaxIdleTime: idleTime,\n\t\t\t\t\tmaxTime,\n\t\t\t\t});\n\n\t\t\t\tdata.lastOpSequenceNumber = lastSummary + 1;\n\n\t\t\t\tclock.tick(idleTime - 1);\n\t\t\t\tassertAttemptCount(0, \"should not run yet\");\n\t\t\t\trunner.run(); // interrupts idle timer\n\n\t\t\t\tclock.tick(idleTime - 1);\n\t\t\t\tassertAttemptCount(0, \"still should not run yet\");\n\t\t\t\trunner.run(); // interrupts idle timer\n\n\t\t\t\tclock.tick(idleTime - 1);\n\t\t\t\tassertAttemptCount(0, \"still should not run yet again\");\n\n\t\t\t\tclock.tick(idleTime);\n\t\t\t\tassertAttemptCount(1, \"should run now\");\n\t\t\t\tassert(getLastAttempt() === \"idle\");\n\t\t\t});\n\n\t\t\tit(\"Should summarize on close if enough outstanding ops\", () => {\n\t\t\t\tconst minOpsForLastSummaryAttempt = 10;\n\t\t\t\tinitialize({ minOpsForLastSummaryAttempt, runtimeOpWeight: 1.0 });\n\n\t\t\t\tdata.numRuntimeOps = minOpsForLastSummaryAttempt;\n\t\t\t\tassert.strictEqual(runner.shouldRunLastSummary(), true, \"should run on close\");\n\t\t\t});\n\n\t\t\tit(\"Should not summarize on close if insufficient outstanding ops\", () => {\n\t\t\t\tconst minOpsForLastSummaryAttempt = 10;\n\t\t\t\tinitialize({ minOpsForLastSummaryAttempt, runtimeOpWeight: 1.0 });\n\n\t\t\t\tdata.numRuntimeOps = minOpsForLastSummaryAttempt - 1;\n\t\t\t\tassert.strictEqual(runner.shouldRunLastSummary(), false, \"should not run on close\");\n\t\t\t});\n\n\t\t\tit(\"Should summarize on close weights ops properly\", () => {\n\t\t\t\tconst minOpsForLastSummaryAttempt = 2;\n\t\t\t\tinitialize({\n\t\t\t\t\tminOpsForLastSummaryAttempt,\n\t\t\t\t\truntimeOpWeight: 0.1,\n\t\t\t\t\tnonRuntimeOpWeight: 1.1,\n\t\t\t\t});\n\n\t\t\t\tdata.numRuntimeOps += 8;\n\t\t\t\tassert.strictEqual(runner.shouldRunLastSummary(), false, \"should not run yet\");\n\n\t\t\t\tdata.numNonRuntimeOps += 1;\n\t\t\t\tassert.strictEqual(runner.shouldRunLastSummary(), false, \"should not run yet\");\n\n\t\t\t\tdata.numRuntimeOps += 1;\n\t\t\t\tassert.strictEqual(runner.shouldRunLastSummary(), true, \"should run\");\n\t\t\t});\n\n\t\t\tit(\"Should not run idle timer after dispose\", () => {\n\t\t\t\tconst lastSummary = 1000;\n\t\t\t\tconst idleTime = 101;\n\t\t\t\tconst maxTime = 1000;\n\t\t\t\tinitialize({\n\t\t\t\t\trefSequenceNumber: lastSummary,\n\t\t\t\t\tminIdleTime: idleTime,\n\t\t\t\t\tmaxIdleTime: idleTime,\n\t\t\t\t\tmaxTime,\n\t\t\t\t});\n\n\t\t\t\tdata.lastOpSequenceNumber = lastSummary + 1;\n\n\t\t\t\tclock.tick(idleTime - 1);\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(0, \"should not run yet\");\n\n\t\t\t\trunner.dispose();\n\t\t\t\tclock.tick(1);\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(0, \"should still run since disposed\");\n\t\t\t});\n\n\t\t\tit(\"Idle time value should change based on op counts\", () => {\n\t\t\t\tconst minIdleTime = 0;\n\t\t\t\tconst maxIdleTime = 1;\n\t\t\t\tconst maxTime = 1000;\n\t\t\t\tconst maxOps = 1000;\n\t\t\t\tconst runtimeOpWeight = 1.0;\n\t\t\t\tconst nonRuntimeOpWeight = 1.0;\n\t\t\t\tinitialize({\n\t\t\t\t\tminIdleTime,\n\t\t\t\t\tmaxIdleTime,\n\t\t\t\t\tmaxTime,\n\t\t\t\t\tmaxOps,\n\t\t\t\t\truntimeOpWeight,\n\t\t\t\t\tnonRuntimeOpWeight,\n\t\t\t\t});\n\n\t\t\t\tdata.lastOpSequenceNumber = maxOps;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime, \"should start at the maxIdleTime\");\n\n\t\t\t\tdata.numRuntimeOps += 50;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime - 0.05);\n\n\t\t\t\tdata.numRuntimeOps += 123;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime - 0.173);\n\n\t\t\t\tdata.numRuntimeOps += 500;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime - 0.673);\n\n\t\t\t\tdata.numRuntimeOps += 326;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime - 0.999);\n\n\t\t\t\tdata.numRuntimeOps += 1;\n\t\t\t\tassert.strictEqual(runner.idleTime, minIdleTime);\n\n\t\t\t\tdata.numRuntimeOps += 100;\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\trunner.idleTime,\n\t\t\t\t\tminIdleTime,\n\t\t\t\t\t\"should never go below the minIdleTime\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Idle time should change based on op weights\", () => {\n\t\t\t\tconst minIdleTime = 0;\n\t\t\t\tconst maxIdleTime = 1000;\n\t\t\t\tconst maxTime = 1000;\n\t\t\t\tconst maxOps = 1000;\n\t\t\t\tconst runtimeOpWeight = 0.1;\n\t\t\t\tconst nonRuntimeOpWeight = 1.1;\n\t\t\t\tinitialize({\n\t\t\t\t\tminIdleTime,\n\t\t\t\t\tmaxIdleTime,\n\t\t\t\t\tmaxTime,\n\t\t\t\t\tmaxOps,\n\t\t\t\t\truntimeOpWeight,\n\t\t\t\t\tnonRuntimeOpWeight,\n\t\t\t\t});\n\n\t\t\t\tdata.lastOpSequenceNumber = maxOps;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime, \"should start at the maxIdleTime\");\n\n\t\t\t\tdata.numRuntimeOps += 50;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime - 5);\n\n\t\t\t\tdata.numRuntimeOps += 123;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime - 17.3);\n\n\t\t\t\tdata.numNonRuntimeOps += 500;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime - 567.3);\n\n\t\t\t\tdata.numNonRuntimeOps += 1;\n\t\t\t\tassert.strictEqual(runner.idleTime, maxIdleTime - 568.4);\n\t\t\t});\n\n\t\t\tit(\"Weights ops properly\", () => {\n\t\t\t\tconst maxOps = 2;\n\t\t\t\tconst runtimeOpWeight = 0.1;\n\t\t\t\tconst nonRuntimeOpWeight = 1.1;\n\t\t\t\tinitialize({ maxOps, runtimeOpWeight, nonRuntimeOpWeight });\n\n\t\t\t\tdata.lastOpSequenceNumber = maxOps;\n\n\t\t\t\tdata.numRuntimeOps += 9;\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(0, \"should not run yet\");\n\n\t\t\t\tdata.numNonRuntimeOps += 1;\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(0, \"should not run yet\");\n\n\t\t\t\tdata.numRuntimeOps += 1;\n\t\t\t\trunner.run();\n\t\t\t\tassertAttemptCount(1, \"should run\");\n\t\t\t\tassert(getLastAttempt() === \"maxOps\");\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
@@ -3,9 +3,9 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "assert";
6
- import { MockDeltaManager } from "@fluidframework/test-runtime-utils";
7
6
  import { MessageType, } from "@fluidframework/protocol-definitions";
8
7
  import { MockLogger } from "@fluidframework/telemetry-utils";
8
+ import { MockDeltaManager } from "@fluidframework/test-runtime-utils";
9
9
  import { SummaryCollection } from "../../summary/index.js";
10
10
  const summaryOp = {
11
11
  clientId: "cliendId",
@@ -1 +1 @@
1
- {"version":3,"file":"summaryCollection.spec.js","sourceRoot":"","sources":["../../../src/test/summary/summaryCollection.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAGN,WAAW,GACX,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAqB,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE9E,MAAM,SAAS,GAAsB;IACpC,QAAQ,EAAE,UAAU;IACpB,oBAAoB,EAAE,CAAC;IACvB,qBAAqB,EAAE,CAAC;IACxB,uBAAuB,EAAE,CAAC;IAC1B,cAAc,EAAE,CAAC;IACjB,SAAS,EAAE,CAAC;IACZ,IAAI,EAAE,WAAW,CAAC,SAAS;IAC3B,QAAQ,EAAE;QACT,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,CAAC,SAAS,CAAC;KACpB;CACD,CAAC;AAEF,MAAM,kBAAkB,GAAG;IAC1B,MAAM,EAAE,WAAW;IACnB,eAAe,EAAE,EAAE,qBAAqB,EAAE,SAAS,CAAC,cAAc,EAAE;CACpE,CAAC;AACF,MAAM,UAAU,GAAiD;IAChE,QAAQ,EAAE,UAAU;IACpB,oBAAoB,EAAE,SAAS,CAAC,oBAAoB,GAAG,CAAC;IACxD,qBAAqB,EAAE,SAAS,CAAC,cAAc;IAC/C,uBAAuB,EAAE,SAAS,CAAC,cAAc;IACjD,cAAc,EAAE,SAAS,CAAC,cAAc,GAAG,CAAC;IAC5C,SAAS,EAAE,SAAS,CAAC,SAAS,GAAG,CAAC;IAClC,IAAI,EAAE,WAAW,CAAC,UAAU;IAC5B,QAAQ,EAAE,kBAAkB;IAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;CACxC,CAAC;AAEF,MAAM,mBAAmB,GAAG;IAC3B,OAAO,EAAE,MAAM;IACf,eAAe,EAAE,EAAE,qBAAqB,EAAE,SAAS,CAAC,cAAc,EAAE;CACpE,CAAC;AACF,MAAM,WAAW,GAAiD;IACjE,QAAQ,EAAE,UAAU;IACpB,oBAAoB,EAAE,SAAS,CAAC,oBAAoB,GAAG,CAAC;IACxD,qBAAqB,EAAE,SAAS,CAAC,cAAc;IAC/C,uBAAuB,EAAE,SAAS,CAAC,cAAc;IACjD,cAAc,EAAE,SAAS,CAAC,cAAc,GAAG,CAAC;IAC5C,SAAS,EAAE,SAAS,CAAC,SAAS,GAAG,CAAC;IAClC,IAAI,EAAE,WAAW,CAAC,WAAW;IAC7B,QAAQ,EAAE,mBAAmB;IAC7B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC;CACzC,CAAC;AAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IACnC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;YACtB,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC3E,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;YAC5D,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,oEAAoE;YACpE,MAAM,SAAS,GAAG,EAAE,CAAC,SAAU,CAAC;YAChC,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,oBAAoB,CAAC,CAAC;YACtD,MAAM,CAAC,SAAS,CACf;gBACC,SAAS;gBACT,UAAU;aACV,EACD,EAAE,CAAC,SAAS,CACZ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;YACzB,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC3E,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;YAC5D,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACvB,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC3E,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;YAC5D,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;YACtB,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;gBAClB,EAAE,CAAC,kBAAkB,GAAG,EAAE,CAAC,cAAc,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC3E,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YACpC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;YAC3D,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACvB,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;gBAClB,EAAE,CAAC,kBAAkB,GAAG,EAAE,CAAC,cAAc,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC3E,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YACpC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;YAC3D,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YACjC,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;gBAClB,EAAE,CAAC,kBAAkB,GAAG,EAAE,CAAC,cAAc,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC3E,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YACpC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3B,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QAU1B,SAAS,uBAAuB,CAC/B,YAAwE;YAExE,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAC9C,YAAY,EACZ,IAAI,UAAU,EAAE,CAAC,iBAAiB,EAAE,CACpC,CAAC;YACF,MAAM,UAAU,GAAiD;gBAChE,OAAO,EAAE,CAAC;gBACV,SAAS,EAAE,CAAC;gBACZ,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;aACd,CAAC;YACF,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5D,iBAAiB,CAAC,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;YAC1E,iBAAiB,CAAC,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;YAC5E,iBAAiB,CAAC,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;YAC9E,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC;QAC1C,CAAC;QACD,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;YACrB,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YACjC,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;YAC9B,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACrC,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YAClC,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;YAC/B,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACtC,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3B,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YAClB,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrC,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 { MockDeltaManager } from \"@fluidframework/test-runtime-utils\";\nimport {\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tMessageType,\n} from \"@fluidframework/protocol-definitions\";\nimport { IDeltaManager } from \"@fluidframework/container-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { ISummaryOpMessage, SummaryCollection } from \"../../summary/index.js\";\n\nconst summaryOp: ISummaryOpMessage = {\n\tclientId: \"cliendId\",\n\tclientSequenceNumber: 5,\n\tminimumSequenceNumber: 5,\n\treferenceSequenceNumber: 5,\n\tsequenceNumber: 6,\n\ttimestamp: 6,\n\ttype: MessageType.Summarize,\n\tcontents: {\n\t\thandle: \"OpHandle\",\n\t\thead: \"head\",\n\t\tmessage: \"message\",\n\t\tparents: [\"parents\"],\n\t},\n};\n\nconst summaryAckContents = {\n\thandle: \"AckHandle\",\n\tsummaryProposal: { summarySequenceNumber: summaryOp.sequenceNumber },\n};\nconst summaryAck: ISequencedDocumentMessage & { data: string } = {\n\tclientId: \"cliendId\",\n\tclientSequenceNumber: summaryOp.clientSequenceNumber + 1,\n\tminimumSequenceNumber: summaryOp.sequenceNumber,\n\treferenceSequenceNumber: summaryOp.sequenceNumber,\n\tsequenceNumber: summaryOp.sequenceNumber + 1,\n\ttimestamp: summaryOp.timestamp + 1,\n\ttype: MessageType.SummaryAck,\n\tcontents: summaryAckContents,\n\tdata: JSON.stringify(summaryAckContents),\n};\n\nconst summaryNackContents = {\n\tmessage: \"Nack\",\n\tsummaryProposal: { summarySequenceNumber: summaryOp.sequenceNumber },\n};\nconst summaryNack: ISequencedDocumentMessage & { data: string } = {\n\tclientId: \"cliendId\",\n\tclientSequenceNumber: summaryOp.clientSequenceNumber + 1,\n\tminimumSequenceNumber: summaryOp.sequenceNumber,\n\treferenceSequenceNumber: summaryOp.sequenceNumber,\n\tsequenceNumber: summaryOp.sequenceNumber + 1,\n\ttimestamp: summaryOp.timestamp + 1,\n\ttype: MessageType.SummaryNack,\n\tcontents: summaryNackContents,\n\tdata: JSON.stringify(summaryNackContents),\n};\n\ndescribe(\"Summary Collection\", () => {\n\tdescribe(\"latestAck\", () => {\n\t\tit(\"Ack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst sc = new SummaryCollection(dm, new MockLogger().toTelemetryLogger());\n\t\t\tassert.equal(sc.latestAck, undefined, \"last ack undefined\");\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst latestAck = sc.latestAck!;\n\t\t\tassert(latestAck !== undefined, \"last ack undefined\");\n\t\t\tassert.deepEqual(\n\t\t\t\t{\n\t\t\t\t\tsummaryOp,\n\t\t\t\t\tsummaryAck,\n\t\t\t\t},\n\t\t\t\tsc.latestAck,\n\t\t\t);\n\t\t});\n\n\t\tit(\"Ack without op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst sc = new SummaryCollection(dm, new MockLogger().toTelemetryLogger());\n\t\t\tassert.equal(sc.latestAck, undefined, \"last ack undefined\");\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\tassert.equal(sc.latestAck, undefined, \"last ack undefined\");\n\t\t});\n\n\t\tit(\"Nack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst sc = new SummaryCollection(dm, new MockLogger().toTelemetryLogger());\n\t\t\tassert.equal(sc.latestAck, undefined, \"last ack undefined\");\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\tdm.emit(\"op\", summaryNack);\n\t\t\tassert.equal(sc.latestAck, undefined, \"last ack undefined\");\n\t\t});\n\t});\n\tdescribe(\"opsSinceLastAck\", () => {\n\t\tit(\"Ack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tdm.on(\"op\", (op) => {\n\t\t\t\tdm.lastSequenceNumber = op.sequenceNumber;\n\t\t\t});\n\n\t\t\tconst sc = new SummaryCollection(dm, new MockLogger().toTelemetryLogger());\n\t\t\tassert.equal(sc.opsSinceLastAck, 0);\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tassert.equal(sc.opsSinceLastAck, summaryOp.sequenceNumber);\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\tassert.equal(sc.opsSinceLastAck, 0);\n\t\t});\n\t\tit(\"Nack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tdm.on(\"op\", (op) => {\n\t\t\t\tdm.lastSequenceNumber = op.sequenceNumber;\n\t\t\t});\n\n\t\t\tconst sc = new SummaryCollection(dm, new MockLogger().toTelemetryLogger());\n\t\t\tassert.equal(sc.opsSinceLastAck, 0);\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tassert.equal(sc.opsSinceLastAck, summaryOp.sequenceNumber);\n\t\t\tdm.emit(\"op\", summaryNack);\n\t\t\tassert.equal(sc.opsSinceLastAck, summaryNack.sequenceNumber);\n\t\t});\n\t\tit(\"Ack after Nack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tdm.on(\"op\", (op) => {\n\t\t\t\tdm.lastSequenceNumber = op.sequenceNumber;\n\t\t\t});\n\n\t\t\tconst sc = new SummaryCollection(dm, new MockLogger().toTelemetryLogger());\n\t\t\tassert.equal(sc.opsSinceLastAck, 0);\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tdm.emit(\"op\", summaryNack);\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\tassert.equal(sc.opsSinceLastAck, summaryAck.sequenceNumber);\n\t\t});\n\t});\n\n\tdescribe(\"opActions\", () => {\n\t\tinterface ISummaryCollectionWithCounters {\n\t\t\tsummaryCollection: SummaryCollection;\n\t\t\tcallCounts: {\n\t\t\t\tdefault: number;\n\t\t\t\tsummarize: number;\n\t\t\t\tsummaryAck: number;\n\t\t\t\tsummaryNack: number;\n\t\t\t};\n\t\t}\n\t\tfunction createSummaryCollection(\n\t\t\tdeltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t\t): ISummaryCollectionWithCounters {\n\t\t\tconst summaryCollection = new SummaryCollection(\n\t\t\t\tdeltaManager,\n\t\t\t\tnew MockLogger().toTelemetryLogger(),\n\t\t\t);\n\t\t\tconst callCounts: ISummaryCollectionWithCounters[\"callCounts\"] = {\n\t\t\t\tdefault: 0,\n\t\t\t\tsummarize: 0,\n\t\t\t\tsummaryAck: 0,\n\t\t\t\tsummaryNack: 0,\n\t\t\t};\n\t\t\tsummaryCollection.on(\"default\", () => callCounts.default++);\n\t\t\tsummaryCollection.on(MessageType.Summarize, () => callCounts.summarize++);\n\t\t\tsummaryCollection.on(MessageType.SummaryAck, () => callCounts.summaryAck++);\n\t\t\tsummaryCollection.on(MessageType.SummaryNack, () => callCounts.summaryNack++);\n\t\t\treturn { summaryCollection, callCounts };\n\t\t}\n\t\tit(\"Summary op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst { callCounts } = createSummaryCollection(dm);\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tassert.equal(callCounts.summarize, 1);\n\t\t});\n\n\t\tit(\"Summary Ack without op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst { callCounts } = createSummaryCollection(dm);\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\tassert.equal(callCounts.summaryAck, 0);\n\t\t});\n\n\t\tit(\"Summary Ack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst { callCounts } = createSummaryCollection(dm);\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\tassert.equal(callCounts.summarize, 1);\n\t\t\tassert.equal(callCounts.summaryAck, 1);\n\t\t});\n\n\t\tit(\"Double Summary Ack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst { callCounts } = createSummaryCollection(dm);\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\tassert.equal(callCounts.summarize, 1);\n\t\t\tassert.equal(callCounts.summaryAck, 1);\n\t\t});\n\n\t\tit(\"Summary Nack without op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst { callCounts } = createSummaryCollection(dm);\n\t\t\tdm.emit(\"op\", summaryNack);\n\t\t\tassert.equal(callCounts.summaryNack, 0);\n\t\t});\n\n\t\tit(\"Summary Nack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst { callCounts } = createSummaryCollection(dm);\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tdm.emit(\"op\", summaryNack);\n\t\t\tassert.equal(callCounts.summarize, 1);\n\t\t\tassert.equal(callCounts.summaryNack, 1);\n\t\t});\n\n\t\tit(\"Double Summary Nack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst { callCounts } = createSummaryCollection(dm);\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tdm.emit(\"op\", summaryNack);\n\t\t\tdm.emit(\"op\", summaryNack);\n\t\t\tassert.equal(callCounts.summarize, 1);\n\t\t\tassert.equal(callCounts.summaryNack, 1);\n\t\t});\n\n\t\tit(\"default\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst { callCounts } = createSummaryCollection(dm);\n\t\t\tdm.emit(\"op\", {});\n\t\t\tassert.equal(callCounts.default, 1);\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"summaryCollection.spec.js","sourceRoot":"","sources":["../../../src/test/summary/summaryCollection.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE1C,OAAO,EAGN,WAAW,GACX,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAqB,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE9E,MAAM,SAAS,GAAsB;IACpC,QAAQ,EAAE,UAAU;IACpB,oBAAoB,EAAE,CAAC;IACvB,qBAAqB,EAAE,CAAC;IACxB,uBAAuB,EAAE,CAAC;IAC1B,cAAc,EAAE,CAAC;IACjB,SAAS,EAAE,CAAC;IACZ,IAAI,EAAE,WAAW,CAAC,SAAS;IAC3B,QAAQ,EAAE;QACT,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,CAAC,SAAS,CAAC;KACpB;CACD,CAAC;AAEF,MAAM,kBAAkB,GAAG;IAC1B,MAAM,EAAE,WAAW;IACnB,eAAe,EAAE,EAAE,qBAAqB,EAAE,SAAS,CAAC,cAAc,EAAE;CACpE,CAAC;AACF,MAAM,UAAU,GAAiD;IAChE,QAAQ,EAAE,UAAU;IACpB,oBAAoB,EAAE,SAAS,CAAC,oBAAoB,GAAG,CAAC;IACxD,qBAAqB,EAAE,SAAS,CAAC,cAAc;IAC/C,uBAAuB,EAAE,SAAS,CAAC,cAAc;IACjD,cAAc,EAAE,SAAS,CAAC,cAAc,GAAG,CAAC;IAC5C,SAAS,EAAE,SAAS,CAAC,SAAS,GAAG,CAAC;IAClC,IAAI,EAAE,WAAW,CAAC,UAAU;IAC5B,QAAQ,EAAE,kBAAkB;IAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;CACxC,CAAC;AAEF,MAAM,mBAAmB,GAAG;IAC3B,OAAO,EAAE,MAAM;IACf,eAAe,EAAE,EAAE,qBAAqB,EAAE,SAAS,CAAC,cAAc,EAAE;CACpE,CAAC;AACF,MAAM,WAAW,GAAiD;IACjE,QAAQ,EAAE,UAAU;IACpB,oBAAoB,EAAE,SAAS,CAAC,oBAAoB,GAAG,CAAC;IACxD,qBAAqB,EAAE,SAAS,CAAC,cAAc;IAC/C,uBAAuB,EAAE,SAAS,CAAC,cAAc;IACjD,cAAc,EAAE,SAAS,CAAC,cAAc,GAAG,CAAC;IAC5C,SAAS,EAAE,SAAS,CAAC,SAAS,GAAG,CAAC;IAClC,IAAI,EAAE,WAAW,CAAC,WAAW;IAC7B,QAAQ,EAAE,mBAAmB;IAC7B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC;CACzC,CAAC;AAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IACnC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;YACtB,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC3E,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;YAC5D,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,oEAAoE;YACpE,MAAM,SAAS,GAAG,EAAE,CAAC,SAAU,CAAC;YAChC,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,oBAAoB,CAAC,CAAC;YACtD,MAAM,CAAC,SAAS,CACf;gBACC,SAAS;gBACT,UAAU;aACV,EACD,EAAE,CAAC,SAAS,CACZ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;YACzB,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC3E,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;YAC5D,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACvB,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC3E,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;YAC5D,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;YACtB,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;gBAClB,EAAE,CAAC,kBAAkB,GAAG,EAAE,CAAC,cAAc,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC3E,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YACpC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;YAC3D,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACvB,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;gBAClB,EAAE,CAAC,kBAAkB,GAAG,EAAE,CAAC,cAAc,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC3E,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YACpC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;YAC3D,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YACjC,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;gBAClB,EAAE,CAAC,kBAAkB,GAAG,EAAE,CAAC,cAAc,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC3E,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YACpC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3B,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QAU1B,SAAS,uBAAuB,CAC/B,YAAwE;YAExE,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAC9C,YAAY,EACZ,IAAI,UAAU,EAAE,CAAC,iBAAiB,EAAE,CACpC,CAAC;YACF,MAAM,UAAU,GAAiD;gBAChE,OAAO,EAAE,CAAC;gBACV,SAAS,EAAE,CAAC;gBACZ,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;aACd,CAAC;YACF,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5D,iBAAiB,CAAC,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;YAC1E,iBAAiB,CAAC,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;YAC5E,iBAAiB,CAAC,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;YAC9E,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC;QAC1C,CAAC;QACD,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;YACrB,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YACjC,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;YAC9B,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACrC,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YAClC,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;YAC/B,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACtC,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3B,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YAClB,MAAM,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAClC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrC,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 { IDeltaManager } from \"@fluidframework/container-definitions\";\nimport {\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tMessageType,\n} from \"@fluidframework/protocol-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { MockDeltaManager } from \"@fluidframework/test-runtime-utils\";\nimport { ISummaryOpMessage, SummaryCollection } from \"../../summary/index.js\";\n\nconst summaryOp: ISummaryOpMessage = {\n\tclientId: \"cliendId\",\n\tclientSequenceNumber: 5,\n\tminimumSequenceNumber: 5,\n\treferenceSequenceNumber: 5,\n\tsequenceNumber: 6,\n\ttimestamp: 6,\n\ttype: MessageType.Summarize,\n\tcontents: {\n\t\thandle: \"OpHandle\",\n\t\thead: \"head\",\n\t\tmessage: \"message\",\n\t\tparents: [\"parents\"],\n\t},\n};\n\nconst summaryAckContents = {\n\thandle: \"AckHandle\",\n\tsummaryProposal: { summarySequenceNumber: summaryOp.sequenceNumber },\n};\nconst summaryAck: ISequencedDocumentMessage & { data: string } = {\n\tclientId: \"cliendId\",\n\tclientSequenceNumber: summaryOp.clientSequenceNumber + 1,\n\tminimumSequenceNumber: summaryOp.sequenceNumber,\n\treferenceSequenceNumber: summaryOp.sequenceNumber,\n\tsequenceNumber: summaryOp.sequenceNumber + 1,\n\ttimestamp: summaryOp.timestamp + 1,\n\ttype: MessageType.SummaryAck,\n\tcontents: summaryAckContents,\n\tdata: JSON.stringify(summaryAckContents),\n};\n\nconst summaryNackContents = {\n\tmessage: \"Nack\",\n\tsummaryProposal: { summarySequenceNumber: summaryOp.sequenceNumber },\n};\nconst summaryNack: ISequencedDocumentMessage & { data: string } = {\n\tclientId: \"cliendId\",\n\tclientSequenceNumber: summaryOp.clientSequenceNumber + 1,\n\tminimumSequenceNumber: summaryOp.sequenceNumber,\n\treferenceSequenceNumber: summaryOp.sequenceNumber,\n\tsequenceNumber: summaryOp.sequenceNumber + 1,\n\ttimestamp: summaryOp.timestamp + 1,\n\ttype: MessageType.SummaryNack,\n\tcontents: summaryNackContents,\n\tdata: JSON.stringify(summaryNackContents),\n};\n\ndescribe(\"Summary Collection\", () => {\n\tdescribe(\"latestAck\", () => {\n\t\tit(\"Ack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst sc = new SummaryCollection(dm, new MockLogger().toTelemetryLogger());\n\t\t\tassert.equal(sc.latestAck, undefined, \"last ack undefined\");\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst latestAck = sc.latestAck!;\n\t\t\tassert(latestAck !== undefined, \"last ack undefined\");\n\t\t\tassert.deepEqual(\n\t\t\t\t{\n\t\t\t\t\tsummaryOp,\n\t\t\t\t\tsummaryAck,\n\t\t\t\t},\n\t\t\t\tsc.latestAck,\n\t\t\t);\n\t\t});\n\n\t\tit(\"Ack without op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst sc = new SummaryCollection(dm, new MockLogger().toTelemetryLogger());\n\t\t\tassert.equal(sc.latestAck, undefined, \"last ack undefined\");\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\tassert.equal(sc.latestAck, undefined, \"last ack undefined\");\n\t\t});\n\n\t\tit(\"Nack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst sc = new SummaryCollection(dm, new MockLogger().toTelemetryLogger());\n\t\t\tassert.equal(sc.latestAck, undefined, \"last ack undefined\");\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\tdm.emit(\"op\", summaryNack);\n\t\t\tassert.equal(sc.latestAck, undefined, \"last ack undefined\");\n\t\t});\n\t});\n\tdescribe(\"opsSinceLastAck\", () => {\n\t\tit(\"Ack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tdm.on(\"op\", (op) => {\n\t\t\t\tdm.lastSequenceNumber = op.sequenceNumber;\n\t\t\t});\n\n\t\t\tconst sc = new SummaryCollection(dm, new MockLogger().toTelemetryLogger());\n\t\t\tassert.equal(sc.opsSinceLastAck, 0);\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tassert.equal(sc.opsSinceLastAck, summaryOp.sequenceNumber);\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\tassert.equal(sc.opsSinceLastAck, 0);\n\t\t});\n\t\tit(\"Nack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tdm.on(\"op\", (op) => {\n\t\t\t\tdm.lastSequenceNumber = op.sequenceNumber;\n\t\t\t});\n\n\t\t\tconst sc = new SummaryCollection(dm, new MockLogger().toTelemetryLogger());\n\t\t\tassert.equal(sc.opsSinceLastAck, 0);\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tassert.equal(sc.opsSinceLastAck, summaryOp.sequenceNumber);\n\t\t\tdm.emit(\"op\", summaryNack);\n\t\t\tassert.equal(sc.opsSinceLastAck, summaryNack.sequenceNumber);\n\t\t});\n\t\tit(\"Ack after Nack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tdm.on(\"op\", (op) => {\n\t\t\t\tdm.lastSequenceNumber = op.sequenceNumber;\n\t\t\t});\n\n\t\t\tconst sc = new SummaryCollection(dm, new MockLogger().toTelemetryLogger());\n\t\t\tassert.equal(sc.opsSinceLastAck, 0);\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tdm.emit(\"op\", summaryNack);\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\tassert.equal(sc.opsSinceLastAck, summaryAck.sequenceNumber);\n\t\t});\n\t});\n\n\tdescribe(\"opActions\", () => {\n\t\tinterface ISummaryCollectionWithCounters {\n\t\t\tsummaryCollection: SummaryCollection;\n\t\t\tcallCounts: {\n\t\t\t\tdefault: number;\n\t\t\t\tsummarize: number;\n\t\t\t\tsummaryAck: number;\n\t\t\t\tsummaryNack: number;\n\t\t\t};\n\t\t}\n\t\tfunction createSummaryCollection(\n\t\t\tdeltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t\t): ISummaryCollectionWithCounters {\n\t\t\tconst summaryCollection = new SummaryCollection(\n\t\t\t\tdeltaManager,\n\t\t\t\tnew MockLogger().toTelemetryLogger(),\n\t\t\t);\n\t\t\tconst callCounts: ISummaryCollectionWithCounters[\"callCounts\"] = {\n\t\t\t\tdefault: 0,\n\t\t\t\tsummarize: 0,\n\t\t\t\tsummaryAck: 0,\n\t\t\t\tsummaryNack: 0,\n\t\t\t};\n\t\t\tsummaryCollection.on(\"default\", () => callCounts.default++);\n\t\t\tsummaryCollection.on(MessageType.Summarize, () => callCounts.summarize++);\n\t\t\tsummaryCollection.on(MessageType.SummaryAck, () => callCounts.summaryAck++);\n\t\t\tsummaryCollection.on(MessageType.SummaryNack, () => callCounts.summaryNack++);\n\t\t\treturn { summaryCollection, callCounts };\n\t\t}\n\t\tit(\"Summary op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst { callCounts } = createSummaryCollection(dm);\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tassert.equal(callCounts.summarize, 1);\n\t\t});\n\n\t\tit(\"Summary Ack without op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst { callCounts } = createSummaryCollection(dm);\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\tassert.equal(callCounts.summaryAck, 0);\n\t\t});\n\n\t\tit(\"Summary Ack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst { callCounts } = createSummaryCollection(dm);\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\tassert.equal(callCounts.summarize, 1);\n\t\t\tassert.equal(callCounts.summaryAck, 1);\n\t\t});\n\n\t\tit(\"Double Summary Ack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst { callCounts } = createSummaryCollection(dm);\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\tdm.emit(\"op\", summaryAck);\n\t\t\tassert.equal(callCounts.summarize, 1);\n\t\t\tassert.equal(callCounts.summaryAck, 1);\n\t\t});\n\n\t\tit(\"Summary Nack without op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst { callCounts } = createSummaryCollection(dm);\n\t\t\tdm.emit(\"op\", summaryNack);\n\t\t\tassert.equal(callCounts.summaryNack, 0);\n\t\t});\n\n\t\tit(\"Summary Nack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst { callCounts } = createSummaryCollection(dm);\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tdm.emit(\"op\", summaryNack);\n\t\t\tassert.equal(callCounts.summarize, 1);\n\t\t\tassert.equal(callCounts.summaryNack, 1);\n\t\t});\n\n\t\tit(\"Double Summary Nack with op\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst { callCounts } = createSummaryCollection(dm);\n\t\t\tdm.emit(\"op\", summaryOp);\n\t\t\tdm.emit(\"op\", summaryNack);\n\t\t\tdm.emit(\"op\", summaryNack);\n\t\t\tassert.equal(callCounts.summarize, 1);\n\t\t\tassert.equal(callCounts.summaryNack, 1);\n\t\t});\n\n\t\tit(\"default\", () => {\n\t\t\tconst dm = new MockDeltaManager();\n\t\t\tconst { callCounts } = createSummaryCollection(dm);\n\t\t\tdm.emit(\"op\", {});\n\t\t\tassert.equal(callCounts.default, 1);\n\t\t});\n\t});\n});\n"]}
@@ -3,14 +3,14 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "assert";
6
- import sinon from "sinon";
7
- import { Deferred } from "@fluidframework/core-utils";
8
6
  import { TypedEventEmitter } from "@fluid-internal/client-utils";
7
+ import { Deferred } from "@fluidframework/core-utils";
9
8
  import { MessageType, } from "@fluidframework/protocol-definitions";
10
9
  import { MockLogger } from "@fluidframework/telemetry-utils";
11
10
  import { MockDeltaManager } from "@fluidframework/test-runtime-utils";
11
+ import sinon from "sinon";
12
12
  import { DefaultSummaryConfiguration } from "../../containerRuntime.js";
13
- import { SummaryManager, SummaryManagerState, RunningSummarizer, SummarizeHeuristicData, SummaryCollection, neverCancelledSummaryToken, } from "../../summary/index.js";
13
+ import { RunningSummarizer, SummarizeHeuristicData, SummaryCollection, SummaryManager, SummaryManagerState, neverCancelledSummaryToken, } from "../../summary/index.js";
14
14
  class MockRuntime {
15
15
  constructor(deltaManager) {
16
16
  this.deltaManager = deltaManager;