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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (554) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/api-report/container-runtime.api.md +471 -52
  3. package/dist/batchTracker.d.ts +1 -1
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js +4 -4
  6. package/dist/batchTracker.js.map +1 -1
  7. package/dist/blobManager.d.ts +33 -30
  8. package/dist/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager.js +82 -107
  10. package/dist/blobManager.js.map +1 -1
  11. package/dist/channelCollection.d.ts +27 -22
  12. package/dist/channelCollection.d.ts.map +1 -1
  13. package/dist/channelCollection.js +155 -165
  14. package/dist/channelCollection.js.map +1 -1
  15. package/dist/connectionTelemetry.d.ts +3 -3
  16. package/dist/connectionTelemetry.d.ts.map +1 -1
  17. package/dist/connectionTelemetry.js +17 -17
  18. package/dist/connectionTelemetry.js.map +1 -1
  19. package/dist/containerHandleContext.d.ts.map +1 -1
  20. package/dist/containerHandleContext.js +2 -2
  21. package/dist/containerHandleContext.js.map +1 -1
  22. package/dist/containerRuntime.d.ts +42 -39
  23. package/dist/containerRuntime.d.ts.map +1 -1
  24. package/dist/containerRuntime.js +425 -292
  25. package/dist/containerRuntime.js.map +1 -1
  26. package/dist/dataStore.d.ts +1 -1
  27. package/dist/dataStore.d.ts.map +1 -1
  28. package/dist/dataStore.js +8 -8
  29. package/dist/dataStore.js.map +1 -1
  30. package/dist/dataStoreContext.d.ts +58 -19
  31. package/dist/dataStoreContext.d.ts.map +1 -1
  32. package/dist/dataStoreContext.js +169 -114
  33. package/dist/dataStoreContext.js.map +1 -1
  34. package/dist/dataStoreContexts.d.ts +1 -0
  35. package/dist/dataStoreContexts.d.ts.map +1 -1
  36. package/dist/dataStoreContexts.js +12 -11
  37. package/dist/dataStoreContexts.js.map +1 -1
  38. package/dist/dataStoreRegistry.d.ts +5 -1
  39. package/dist/dataStoreRegistry.d.ts.map +1 -1
  40. package/dist/dataStoreRegistry.js +4 -4
  41. package/dist/dataStoreRegistry.js.map +1 -1
  42. package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
  43. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  44. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  45. package/dist/deltaScheduler.d.ts +1 -1
  46. package/dist/deltaScheduler.d.ts.map +1 -1
  47. package/dist/deltaScheduler.js +6 -6
  48. package/dist/deltaScheduler.js.map +1 -1
  49. package/dist/error.d.ts +1 -1
  50. package/dist/error.d.ts.map +1 -1
  51. package/dist/error.js +4 -4
  52. package/dist/error.js.map +1 -1
  53. package/dist/gc/garbageCollection.d.ts +3 -2
  54. package/dist/gc/garbageCollection.d.ts.map +1 -1
  55. package/dist/gc/garbageCollection.js +23 -23
  56. package/dist/gc/garbageCollection.js.map +1 -1
  57. package/dist/gc/gcConfigs.d.ts +2 -2
  58. package/dist/gc/gcConfigs.d.ts.map +1 -1
  59. package/dist/gc/gcConfigs.js +4 -5
  60. package/dist/gc/gcConfigs.js.map +1 -1
  61. package/dist/gc/gcDefinitions.d.ts +4 -5
  62. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  63. package/dist/gc/gcDefinitions.js.map +1 -1
  64. package/dist/gc/gcHelpers.d.ts +5 -1
  65. package/dist/gc/gcHelpers.d.ts.map +1 -1
  66. package/dist/gc/gcHelpers.js +21 -12
  67. package/dist/gc/gcHelpers.js.map +1 -1
  68. package/dist/gc/gcSummaryStateTracker.d.ts +2 -2
  69. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  70. package/dist/gc/gcSummaryStateTracker.js +11 -11
  71. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  72. package/dist/gc/gcTelemetry.d.ts +2 -1
  73. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  74. package/dist/gc/gcTelemetry.js +11 -9
  75. package/dist/gc/gcTelemetry.js.map +1 -1
  76. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  77. package/dist/gc/gcUnreferencedStateTracker.js +6 -6
  78. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  79. package/dist/gc/index.d.ts +1 -1
  80. package/dist/gc/index.d.ts.map +1 -1
  81. package/dist/gc/index.js +2 -1
  82. package/dist/gc/index.js.map +1 -1
  83. package/dist/index.d.ts +5 -2
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +12 -2
  86. package/dist/index.js.map +1 -1
  87. package/dist/legacy.d.ts +91 -0
  88. package/dist/messageTypes.d.ts +11 -5
  89. package/dist/messageTypes.d.ts.map +1 -1
  90. package/dist/messageTypes.js +4 -0
  91. package/dist/messageTypes.js.map +1 -1
  92. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  93. package/dist/opLifecycle/batchManager.js.map +1 -1
  94. package/dist/opLifecycle/definitions.d.ts +2 -20
  95. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  96. package/dist/opLifecycle/definitions.js.map +1 -1
  97. package/dist/opLifecycle/index.d.ts +3 -3
  98. package/dist/opLifecycle/index.d.ts.map +1 -1
  99. package/dist/opLifecycle/index.js +3 -1
  100. package/dist/opLifecycle/index.js.map +1 -1
  101. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  102. package/dist/opLifecycle/opCompressor.js +5 -6
  103. package/dist/opLifecycle/opCompressor.js.map +1 -1
  104. package/dist/opLifecycle/opDecompressor.d.ts +15 -4
  105. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  106. package/dist/opLifecycle/opDecompressor.js +62 -63
  107. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  108. package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
  109. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  110. package/dist/opLifecycle/opGroupingManager.js +14 -16
  111. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  112. package/dist/opLifecycle/opSplitter.d.ts +12 -4
  113. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  114. package/dist/opLifecycle/opSplitter.js +63 -53
  115. package/dist/opLifecycle/opSplitter.js.map +1 -1
  116. package/dist/opLifecycle/outbox.d.ts +2 -1
  117. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  118. package/dist/opLifecycle/outbox.js +30 -29
  119. package/dist/opLifecycle/outbox.js.map +1 -1
  120. package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  121. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  122. package/dist/opLifecycle/remoteMessageProcessor.js +36 -32
  123. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  124. package/dist/packageVersion.d.ts +1 -1
  125. package/dist/packageVersion.js +1 -1
  126. package/dist/packageVersion.js.map +1 -1
  127. package/dist/pendingStateManager.d.ts +1 -1
  128. package/dist/pendingStateManager.d.ts.map +1 -1
  129. package/dist/pendingStateManager.js +18 -18
  130. package/dist/pendingStateManager.js.map +1 -1
  131. package/dist/public.d.ts +12 -0
  132. package/dist/scheduleManager.d.ts +1 -1
  133. package/dist/scheduleManager.d.ts.map +1 -1
  134. package/dist/scheduleManager.js +28 -24
  135. package/dist/scheduleManager.js.map +1 -1
  136. package/dist/storageServiceWithAttachBlobs.d.ts +2 -2
  137. package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -1
  138. package/dist/storageServiceWithAttachBlobs.js +2 -2
  139. package/dist/storageServiceWithAttachBlobs.js.map +1 -1
  140. package/dist/summary/documentSchema.d.ts +209 -0
  141. package/dist/summary/documentSchema.d.ts.map +1 -0
  142. package/dist/summary/documentSchema.js +390 -0
  143. package/dist/summary/documentSchema.js.map +1 -0
  144. package/dist/summary/index.d.ts +2 -1
  145. package/dist/summary/index.d.ts.map +1 -1
  146. package/dist/summary/index.js +4 -1
  147. package/dist/summary/index.js.map +1 -1
  148. package/dist/summary/orderedClientElection.d.ts +2 -2
  149. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  150. package/dist/summary/orderedClientElection.js +12 -7
  151. package/dist/summary/orderedClientElection.js.map +1 -1
  152. package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
  153. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  154. package/dist/summary/runWhileConnectedCoordinator.js +3 -3
  155. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  156. package/dist/summary/runningSummarizer.d.ts +3 -3
  157. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  158. package/dist/summary/runningSummarizer.js +16 -16
  159. package/dist/summary/runningSummarizer.js.map +1 -1
  160. package/dist/summary/summarizer.d.ts +3 -2
  161. package/dist/summary/summarizer.d.ts.map +1 -1
  162. package/dist/summary/summarizer.js +13 -13
  163. package/dist/summary/summarizer.js.map +1 -1
  164. package/dist/summary/summarizerClientElection.d.ts +2 -2
  165. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  166. package/dist/summary/summarizerClientElection.js.map +1 -1
  167. package/dist/summary/summarizerHeuristics.d.ts +1 -1
  168. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  169. package/dist/summary/summarizerHeuristics.js +2 -2
  170. package/dist/summary/summarizerHeuristics.js.map +1 -1
  171. package/dist/summary/summarizerNode/summarizerNode.d.ts +3 -2
  172. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  173. package/dist/summary/summarizerNode/summarizerNode.js +28 -28
  174. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  175. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  176. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  177. package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
  178. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  179. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  180. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  181. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +14 -14
  182. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  183. package/dist/summary/summarizerTypes.d.ts +5 -3
  184. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  185. package/dist/summary/summarizerTypes.js.map +1 -1
  186. package/dist/summary/summaryCollection.d.ts +2 -2
  187. package/dist/summary/summaryCollection.d.ts.map +1 -1
  188. package/dist/summary/summaryCollection.js +7 -7
  189. package/dist/summary/summaryCollection.js.map +1 -1
  190. package/dist/summary/summaryFormat.d.ts +6 -17
  191. package/dist/summary/summaryFormat.d.ts.map +1 -1
  192. package/dist/summary/summaryFormat.js +8 -8
  193. package/dist/summary/summaryFormat.js.map +1 -1
  194. package/dist/summary/summaryGenerator.d.ts +4 -3
  195. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  196. package/dist/summary/summaryGenerator.js +17 -17
  197. package/dist/summary/summaryGenerator.js.map +1 -1
  198. package/dist/summary/summaryManager.d.ts +1 -1
  199. package/dist/summary/summaryManager.d.ts.map +1 -1
  200. package/dist/summary/summaryManager.js +15 -14
  201. package/dist/summary/summaryManager.js.map +1 -1
  202. package/internal.d.ts +11 -0
  203. package/legacy.d.ts +11 -0
  204. package/lib/batchTracker.d.ts +1 -1
  205. package/lib/batchTracker.d.ts.map +1 -1
  206. package/lib/batchTracker.js +2 -2
  207. package/lib/batchTracker.js.map +1 -1
  208. package/lib/blobManager.d.ts +33 -30
  209. package/lib/blobManager.d.ts.map +1 -1
  210. package/lib/blobManager.js +48 -73
  211. package/lib/blobManager.js.map +1 -1
  212. package/lib/channelCollection.d.ts +27 -22
  213. package/lib/channelCollection.d.ts.map +1 -1
  214. package/lib/channelCollection.js +96 -106
  215. package/lib/channelCollection.js.map +1 -1
  216. package/lib/connectionTelemetry.d.ts +3 -3
  217. package/lib/connectionTelemetry.d.ts.map +1 -1
  218. package/lib/connectionTelemetry.js +3 -3
  219. package/lib/connectionTelemetry.js.map +1 -1
  220. package/lib/containerHandleContext.d.ts.map +1 -1
  221. package/lib/containerHandleContext.js +1 -1
  222. package/lib/containerHandleContext.js.map +1 -1
  223. package/lib/containerRuntime.d.ts +42 -39
  224. package/lib/containerRuntime.d.ts.map +1 -1
  225. package/lib/containerRuntime.js +276 -141
  226. package/lib/containerRuntime.js.map +1 -1
  227. package/lib/dataStore.d.ts +1 -1
  228. package/lib/dataStore.d.ts.map +1 -1
  229. package/lib/dataStore.js +3 -3
  230. package/lib/dataStore.js.map +1 -1
  231. package/lib/dataStoreContext.d.ts +58 -19
  232. package/lib/dataStoreContext.d.ts.map +1 -1
  233. package/lib/dataStoreContext.js +107 -52
  234. package/lib/dataStoreContext.js.map +1 -1
  235. package/lib/dataStoreContexts.d.ts +1 -0
  236. package/lib/dataStoreContexts.d.ts.map +1 -1
  237. package/lib/dataStoreContexts.js +3 -2
  238. package/lib/dataStoreContexts.js.map +1 -1
  239. package/lib/dataStoreRegistry.d.ts +5 -1
  240. package/lib/dataStoreRegistry.d.ts.map +1 -1
  241. package/lib/dataStoreRegistry.js +1 -1
  242. package/lib/dataStoreRegistry.js.map +1 -1
  243. package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
  244. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  245. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  246. package/lib/deltaScheduler.d.ts +1 -1
  247. package/lib/deltaScheduler.d.ts.map +1 -1
  248. package/lib/deltaScheduler.js +1 -1
  249. package/lib/deltaScheduler.js.map +1 -1
  250. package/lib/error.d.ts +1 -1
  251. package/lib/error.d.ts.map +1 -1
  252. package/lib/error.js +2 -2
  253. package/lib/error.js.map +1 -1
  254. package/lib/gc/garbageCollection.d.ts +3 -2
  255. package/lib/gc/garbageCollection.d.ts.map +1 -1
  256. package/lib/gc/garbageCollection.js +8 -8
  257. package/lib/gc/garbageCollection.js.map +1 -1
  258. package/lib/gc/gcConfigs.d.ts +2 -2
  259. package/lib/gc/gcConfigs.d.ts.map +1 -1
  260. package/lib/gc/gcConfigs.js +4 -5
  261. package/lib/gc/gcConfigs.js.map +1 -1
  262. package/lib/gc/gcDefinitions.d.ts +4 -5
  263. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  264. package/lib/gc/gcDefinitions.js.map +1 -1
  265. package/lib/gc/gcHelpers.d.ts +5 -1
  266. package/lib/gc/gcHelpers.d.ts.map +1 -1
  267. package/lib/gc/gcHelpers.js +10 -2
  268. package/lib/gc/gcHelpers.js.map +1 -1
  269. package/lib/gc/gcSummaryStateTracker.d.ts +2 -2
  270. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  271. package/lib/gc/gcSummaryStateTracker.js +2 -2
  272. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  273. package/lib/gc/gcTelemetry.d.ts +2 -1
  274. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  275. package/lib/gc/gcTelemetry.js +4 -2
  276. package/lib/gc/gcTelemetry.js.map +1 -1
  277. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  278. package/lib/gc/gcUnreferencedStateTracker.js +2 -2
  279. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  280. package/lib/gc/index.d.ts +1 -1
  281. package/lib/gc/index.d.ts.map +1 -1
  282. package/lib/gc/index.js +1 -1
  283. package/lib/gc/index.js.map +1 -1
  284. package/lib/index.d.ts +5 -2
  285. package/lib/index.d.ts.map +1 -1
  286. package/lib/index.js +5 -2
  287. package/lib/index.js.map +1 -1
  288. package/lib/legacy.d.ts +91 -0
  289. package/lib/messageTypes.d.ts +11 -5
  290. package/lib/messageTypes.d.ts.map +1 -1
  291. package/lib/messageTypes.js +4 -0
  292. package/lib/messageTypes.js.map +1 -1
  293. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  294. package/lib/opLifecycle/batchManager.js.map +1 -1
  295. package/lib/opLifecycle/definitions.d.ts +2 -20
  296. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  297. package/lib/opLifecycle/definitions.js.map +1 -1
  298. package/lib/opLifecycle/index.d.ts +3 -3
  299. package/lib/opLifecycle/index.d.ts.map +1 -1
  300. package/lib/opLifecycle/index.js +2 -2
  301. package/lib/opLifecycle/index.js.map +1 -1
  302. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  303. package/lib/opLifecycle/opCompressor.js +2 -3
  304. package/lib/opLifecycle/opCompressor.js.map +1 -1
  305. package/lib/opLifecycle/opDecompressor.d.ts +15 -4
  306. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  307. package/lib/opLifecycle/opDecompressor.js +61 -62
  308. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  309. package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
  310. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  311. package/lib/opLifecycle/opGroupingManager.js +9 -12
  312. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  313. package/lib/opLifecycle/opSplitter.d.ts +12 -4
  314. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  315. package/lib/opLifecycle/opSplitter.js +47 -38
  316. package/lib/opLifecycle/opSplitter.js.map +1 -1
  317. package/lib/opLifecycle/outbox.d.ts +2 -1
  318. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  319. package/lib/opLifecycle/outbox.js +19 -18
  320. package/lib/opLifecycle/outbox.js.map +1 -1
  321. package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  322. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  323. package/lib/opLifecycle/remoteMessageProcessor.js +36 -32
  324. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  325. package/lib/packageVersion.d.ts +1 -1
  326. package/lib/packageVersion.js +1 -1
  327. package/lib/packageVersion.js.map +1 -1
  328. package/lib/pendingStateManager.d.ts +1 -1
  329. package/lib/pendingStateManager.d.ts.map +1 -1
  330. package/lib/pendingStateManager.js +2 -2
  331. package/lib/pendingStateManager.js.map +1 -1
  332. package/lib/public.d.ts +12 -0
  333. package/lib/scheduleManager.d.ts +1 -1
  334. package/lib/scheduleManager.d.ts.map +1 -1
  335. package/lib/scheduleManager.js +7 -3
  336. package/lib/scheduleManager.js.map +1 -1
  337. package/lib/storageServiceWithAttachBlobs.d.ts +2 -2
  338. package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -1
  339. package/lib/storageServiceWithAttachBlobs.js +1 -1
  340. package/lib/storageServiceWithAttachBlobs.js.map +1 -1
  341. package/lib/summary/documentSchema.d.ts +209 -0
  342. package/lib/summary/documentSchema.d.ts.map +1 -0
  343. package/lib/summary/documentSchema.js +386 -0
  344. package/lib/summary/documentSchema.js.map +1 -0
  345. package/lib/summary/index.d.ts +2 -1
  346. package/lib/summary/index.d.ts.map +1 -1
  347. package/lib/summary/index.js +1 -0
  348. package/lib/summary/index.js.map +1 -1
  349. package/lib/summary/orderedClientElection.d.ts +2 -2
  350. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  351. package/lib/summary/orderedClientElection.js +7 -2
  352. package/lib/summary/orderedClientElection.js.map +1 -1
  353. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
  354. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  355. package/lib/summary/runWhileConnectedCoordinator.js +1 -1
  356. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  357. package/lib/summary/runningSummarizer.d.ts +3 -3
  358. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  359. package/lib/summary/runningSummarizer.js +3 -3
  360. package/lib/summary/runningSummarizer.js.map +1 -1
  361. package/lib/summary/summarizer.d.ts +3 -2
  362. package/lib/summary/summarizer.d.ts.map +1 -1
  363. package/lib/summary/summarizer.js +3 -3
  364. package/lib/summary/summarizer.js.map +1 -1
  365. package/lib/summary/summarizerClientElection.d.ts +2 -2
  366. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  367. package/lib/summary/summarizerClientElection.js.map +1 -1
  368. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  369. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  370. package/lib/summary/summarizerHeuristics.js +1 -1
  371. package/lib/summary/summarizerHeuristics.js.map +1 -1
  372. package/lib/summary/summarizerNode/summarizerNode.d.ts +3 -2
  373. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  374. package/lib/summary/summarizerNode/summarizerNode.js +5 -5
  375. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  376. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  377. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  378. package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -1
  379. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  380. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  381. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  382. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
  383. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  384. package/lib/summary/summarizerTypes.d.ts +5 -3
  385. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  386. package/lib/summary/summarizerTypes.js.map +1 -1
  387. package/lib/summary/summaryCollection.d.ts +2 -2
  388. package/lib/summary/summaryCollection.d.ts.map +1 -1
  389. package/lib/summary/summaryCollection.js +1 -1
  390. package/lib/summary/summaryCollection.js.map +1 -1
  391. package/lib/summary/summaryFormat.d.ts +6 -17
  392. package/lib/summary/summaryFormat.d.ts.map +1 -1
  393. package/lib/summary/summaryFormat.js +3 -3
  394. package/lib/summary/summaryFormat.js.map +1 -1
  395. package/lib/summary/summaryGenerator.d.ts +4 -3
  396. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  397. package/lib/summary/summaryGenerator.js +4 -4
  398. package/lib/summary/summaryGenerator.js.map +1 -1
  399. package/lib/summary/summaryManager.d.ts +1 -1
  400. package/lib/summary/summaryManager.d.ts.map +1 -1
  401. package/lib/summary/summaryManager.js +9 -8
  402. package/lib/summary/summaryManager.js.map +1 -1
  403. package/package.json +57 -65
  404. package/src/batchTracker.ts +4 -3
  405. package/src/blobManager.ts +100 -77
  406. package/src/channelCollection.ts +180 -165
  407. package/src/connectionTelemetry.ts +12 -12
  408. package/src/containerHandleContext.ts +3 -2
  409. package/src/containerRuntime.ts +481 -277
  410. package/src/dataStore.ts +9 -4
  411. package/src/dataStoreContext.ts +195 -93
  412. package/src/dataStoreContexts.ts +5 -2
  413. package/src/dataStoreRegistry.ts +3 -2
  414. package/src/deltaManagerSummarizerProxy.ts +1 -1
  415. package/src/deltaScheduler.ts +2 -1
  416. package/src/error.ts +2 -2
  417. package/src/gc/garbageCollection.ts +21 -20
  418. package/src/gc/gcConfigs.ts +15 -18
  419. package/src/gc/gcDefinitions.ts +6 -8
  420. package/src/gc/gcHelpers.ts +22 -5
  421. package/src/gc/gcSummaryStateTracker.ts +7 -5
  422. package/src/gc/gcTelemetry.ts +13 -7
  423. package/src/gc/gcUnreferencedStateTracker.ts +3 -2
  424. package/src/gc/index.ts +1 -0
  425. package/src/index.ts +22 -1
  426. package/src/messageTypes.ts +20 -6
  427. package/src/opLifecycle/README.md +89 -0
  428. package/src/opLifecycle/batchManager.ts +1 -0
  429. package/src/opLifecycle/definitions.ts +3 -21
  430. package/src/opLifecycle/index.ts +3 -9
  431. package/src/opLifecycle/opCompressor.ts +6 -5
  432. package/src/opLifecycle/opDecompressor.ts +90 -100
  433. package/src/opLifecycle/opGroupingManager.ts +12 -14
  434. package/src/opLifecycle/opSplitter.ts +76 -48
  435. package/src/opLifecycle/outbox.ts +30 -38
  436. package/src/opLifecycle/remoteMessageProcessor.ts +43 -55
  437. package/src/packageVersion.ts +1 -1
  438. package/src/pendingStateManager.ts +6 -6
  439. package/src/scheduleManager.ts +10 -8
  440. package/src/storageServiceWithAttachBlobs.ts +2 -2
  441. package/src/summary/documentSchema.ts +631 -0
  442. package/src/summary/index.ts +10 -1
  443. package/src/summary/orderedClientElection.ts +7 -7
  444. package/src/summary/runWhileConnectedCoordinator.ts +3 -2
  445. package/src/summary/runningSummarizer.ts +22 -20
  446. package/src/summary/summarizer.ts +17 -15
  447. package/src/summary/summarizerClientElection.ts +3 -2
  448. package/src/summary/summarizerHeuristics.ts +4 -2
  449. package/src/summary/summarizerNode/summarizerNode.ts +20 -18
  450. package/src/summary/summarizerNode/summarizerNodeUtils.ts +3 -2
  451. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +16 -8
  452. package/src/summary/summarizerTypes.ts +7 -3
  453. package/src/summary/summaryCollection.ts +3 -3
  454. package/src/summary/summaryFormat.ts +14 -26
  455. package/src/summary/summaryGenerator.ts +12 -15
  456. package/src/summary/summaryManager.ts +16 -13
  457. package/api-extractor-cjs.json +0 -8
  458. package/dist/container-runtime-alpha.d.ts +0 -1753
  459. package/dist/container-runtime-beta.d.ts +0 -268
  460. package/dist/container-runtime-public.d.ts +0 -268
  461. package/dist/container-runtime-untrimmed.d.ts +0 -1893
  462. package/lib/container-runtime-alpha.d.ts +0 -1753
  463. package/lib/container-runtime-beta.d.ts +0 -268
  464. package/lib/container-runtime-public.d.ts +0 -268
  465. package/lib/container-runtime-untrimmed.d.ts +0 -1893
  466. package/lib/test/batchTracker.spec.js +0 -88
  467. package/lib/test/batchTracker.spec.js.map +0 -1
  468. package/lib/test/blobManager.spec.js +0 -835
  469. package/lib/test/blobManager.spec.js.map +0 -1
  470. package/lib/test/channelCollection.spec.js +0 -141
  471. package/lib/test/channelCollection.spec.js.map +0 -1
  472. package/lib/test/containerRuntime.spec.js +0 -1748
  473. package/lib/test/containerRuntime.spec.js.map +0 -1
  474. package/lib/test/dataStoreContext.spec.js +0 -801
  475. package/lib/test/dataStoreContext.spec.js.map +0 -1
  476. package/lib/test/dataStoreCreation.spec.js +0 -312
  477. package/lib/test/dataStoreCreation.spec.js.map +0 -1
  478. package/lib/test/dataStoreRegistry.spec.js +0 -26
  479. package/lib/test/dataStoreRegistry.spec.js.map +0 -1
  480. package/lib/test/fuzz/fuzzUtils.js +0 -66
  481. package/lib/test/fuzz/fuzzUtils.js.map +0 -1
  482. package/lib/test/fuzz/summarizer.fuzz.spec.js +0 -31
  483. package/lib/test/fuzz/summarizer.fuzz.spec.js.map +0 -1
  484. package/lib/test/fuzz/summarizerFuzzMocks.js +0 -162
  485. package/lib/test/fuzz/summarizerFuzzMocks.js.map +0 -1
  486. package/lib/test/fuzz/summarizerFuzzSuite.js +0 -106
  487. package/lib/test/fuzz/summarizerFuzzSuite.js.map +0 -1
  488. package/lib/test/gc/garbageCollection.spec.js +0 -1465
  489. package/lib/test/gc/garbageCollection.spec.js.map +0 -1
  490. package/lib/test/gc/gcConfigs.spec.js +0 -690
  491. package/lib/test/gc/gcConfigs.spec.js.map +0 -1
  492. package/lib/test/gc/gcHelpers.spec.js +0 -110
  493. package/lib/test/gc/gcHelpers.spec.js.map +0 -1
  494. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +0 -68
  495. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +0 -1
  496. package/lib/test/gc/gcStats.spec.js +0 -391
  497. package/lib/test/gc/gcStats.spec.js.map +0 -1
  498. package/lib/test/gc/gcSummaryStateTracker.spec.js +0 -228
  499. package/lib/test/gc/gcSummaryStateTracker.spec.js.map +0 -1
  500. package/lib/test/gc/gcTelemetry.spec.js +0 -530
  501. package/lib/test/gc/gcTelemetry.spec.js.map +0 -1
  502. package/lib/test/gc/gcUnitTestHelpers.js +0 -29
  503. package/lib/test/gc/gcUnitTestHelpers.js.map +0 -1
  504. package/lib/test/gc/gcUnreferencedStateTracker.spec.js +0 -192
  505. package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +0 -1
  506. package/lib/test/getPendingBlobs.spec.js +0 -193
  507. package/lib/test/getPendingBlobs.spec.js.map +0 -1
  508. package/lib/test/hardwareStats.spec.js +0 -93
  509. package/lib/test/hardwareStats.spec.js.map +0 -1
  510. package/lib/test/index.js +0 -6
  511. package/lib/test/index.js.map +0 -1
  512. package/lib/test/opLifecycle/OpGroupingManager.spec.js +0 -225
  513. package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +0 -1
  514. package/lib/test/opLifecycle/batchManager.spec.js +0 -189
  515. package/lib/test/opLifecycle/batchManager.spec.js.map +0 -1
  516. package/lib/test/opLifecycle/opCompressor.spec.js +0 -74
  517. package/lib/test/opLifecycle/opCompressor.spec.js.map +0 -1
  518. package/lib/test/opLifecycle/opDecompressor.spec.js +0 -218
  519. package/lib/test/opLifecycle/opDecompressor.spec.js.map +0 -1
  520. package/lib/test/opLifecycle/opSplitter.spec.js +0 -272
  521. package/lib/test/opLifecycle/opSplitter.spec.js.map +0 -1
  522. package/lib/test/opLifecycle/outbox.spec.js +0 -675
  523. package/lib/test/opLifecycle/outbox.spec.js.map +0 -1
  524. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +0 -196
  525. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +0 -1
  526. package/lib/test/pendingStateManager.spec.js +0 -329
  527. package/lib/test/pendingStateManager.spec.js.map +0 -1
  528. package/lib/test/scheduleManager.spec.js +0 -270
  529. package/lib/test/scheduleManager.spec.js.map +0 -1
  530. package/lib/test/summarizerNode.spec.js +0 -326
  531. package/lib/test/summarizerNode.spec.js.map +0 -1
  532. package/lib/test/summarizerNodeWithGc.spec.js +0 -318
  533. package/lib/test/summarizerNodeWithGc.spec.js.map +0 -1
  534. package/lib/test/summary/orderedClientElection.spec.js +0 -535
  535. package/lib/test/summary/orderedClientElection.spec.js.map +0 -1
  536. package/lib/test/summary/runningSummarizer.spec.js +0 -1349
  537. package/lib/test/summary/runningSummarizer.spec.js.map +0 -1
  538. package/lib/test/summary/summarizer.spec.js +0 -29
  539. package/lib/test/summary/summarizer.spec.js.map +0 -1
  540. package/lib/test/summary/summarizerClientElection.spec.js +0 -436
  541. package/lib/test/summary/summarizerClientElection.spec.js.map +0 -1
  542. package/lib/test/summary/summarizerHeuristics.spec.js +0 -289
  543. package/lib/test/summary/summarizerHeuristics.spec.js.map +0 -1
  544. package/lib/test/summary/summaryCollection.spec.js +0 -200
  545. package/lib/test/summary/summaryCollection.spec.js.map +0 -1
  546. package/lib/test/summary/summaryManager.spec.js +0 -430
  547. package/lib/test/summary/summaryManager.spec.js.map +0 -1
  548. package/lib/test/summary/testQuorumClients.js +0 -34
  549. package/lib/test/summary/testQuorumClients.js.map +0 -1
  550. package/lib/test/throttler.spec.js +0 -175
  551. package/lib/test/throttler.spec.js.map +0 -1
  552. package/lib/test/types/validateContainerRuntimePrevious.generated.js +0 -180
  553. package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +0 -1
  554. /package/{dist → lib}/tsdoc-metadata.json +0 -0
@@ -1,436 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { strict as assert } from "assert";
6
- import { Deferred } from "@fluidframework/core-utils";
7
- import { TypedEventEmitter } from "@fluid-internal/client-utils";
8
- import { MessageType } from "@fluidframework/protocol-definitions";
9
- import { MockLogger } from "@fluidframework/telemetry-utils";
10
- import { OrderedClientCollection, OrderedClientElection, SummarizerClientElection, summarizerClientType, SummaryManager, } from "../../summary/index.js";
11
- import { TestQuorumClients } from "./testQuorumClients.js";
12
- describe("Summarizer Client Election", () => {
13
- const maxOps = 1000;
14
- const testQuorum = new TestQuorumClients();
15
- let currentSequenceNumber = 0;
16
- const testDeltaManager = {
17
- get lastSequenceNumber() {
18
- return currentSequenceNumber;
19
- },
20
- };
21
- const mockLogger = new MockLogger();
22
- let refreshSummarizerCallCount = 0;
23
- const summaryCollectionEmitter = new TypedEventEmitter();
24
- let election;
25
- let summaryManager;
26
- const summaryCollection = {
27
- opsSinceLastAck: 0,
28
- addOpListener: () => { },
29
- removeOpListener: () => { },
30
- };
31
- class TestConnectedState extends TypedEventEmitter {
32
- constructor() {
33
- super(...arguments);
34
- this.connected = false;
35
- }
36
- connect() {
37
- this.connected = true;
38
- this.clientId = election.electedParentId;
39
- this.emit("connected", this.clientId);
40
- }
41
- disconnect() {
42
- this.connected = false;
43
- this.emit("disconnected");
44
- }
45
- }
46
- class TestSummarizer extends TypedEventEmitter {
47
- notImplemented() {
48
- throw Error("not implemented");
49
- }
50
- constructor() {
51
- super();
52
- this.state = "notStarted";
53
- this.stopDeferred = new Deferred();
54
- this.runDeferred = new Deferred();
55
- this.summarizeOnDemand = () => this.notImplemented();
56
- this.enqueueSummarize = () => this.notImplemented();
57
- }
58
- async setSummarizer() {
59
- this.notImplemented();
60
- }
61
- get cancelled() {
62
- // Approximation, as ideally it should become cancelled immediately after stop() call
63
- return this.state !== "running";
64
- }
65
- close() { }
66
- stop(reason) {
67
- this.stopDeferred.resolve(reason);
68
- }
69
- async run(onBehalfOf) {
70
- this.onBehalfOf = onBehalfOf;
71
- this.state = "running";
72
- await Promise.all([this.stopDeferred.promise, this.runDeferred.promise]);
73
- this.state = "stopped";
74
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
75
- removeClient(this.clientId, 0);
76
- return "summarizerClientDisconnected";
77
- }
78
- get IFluidLoadable() {
79
- return this.notImplemented();
80
- }
81
- get handle() {
82
- return this.notImplemented();
83
- }
84
- }
85
- let connectedState;
86
- let summarizer;
87
- const flushPromises = async () => new Promise((resolve) => process.nextTick(resolve));
88
- function addClient(clientId, sequenceNumber, interactive = true, type) {
89
- if (sequenceNumber > currentSequenceNumber) {
90
- currentSequenceNumber = sequenceNumber;
91
- }
92
- const details = {
93
- type,
94
- capabilities: { interactive },
95
- };
96
- const c = { details };
97
- const client = {
98
- client: c,
99
- sequenceNumber,
100
- };
101
- testQuorum.addClient(clientId, client);
102
- }
103
- function removeClient(clientId, opCount = 1) {
104
- currentSequenceNumber += opCount;
105
- testQuorum.removeClient(clientId);
106
- }
107
- const requestSummarizer = async () => {
108
- summarizer = new TestSummarizer();
109
- const parentId = election.electedParentId;
110
- const clientId = `${parentId}-summarizer`;
111
- summarizer.clientId = clientId;
112
- addClient(clientId, currentSequenceNumber, false, summarizerClientType);
113
- return summarizer;
114
- };
115
- const throttler = {
116
- delayMs: 0,
117
- numAttempts: 0,
118
- getDelay() {
119
- return this.delayMs;
120
- },
121
- maxDelayMs: 0,
122
- delayWindowMs: 0,
123
- delayFn: () => 0,
124
- };
125
- function createElection(initialClients = [], initialState) {
126
- for (const [id, seq, int] of initialClients) {
127
- addClient(id, seq, int);
128
- }
129
- election = new SummarizerClientElection(mockLogger.toTelemetryLogger(), summaryCollectionEmitter, new OrderedClientElection(mockLogger.toTelemetryLogger(), new OrderedClientCollection(mockLogger, testDeltaManager, testQuorum), initialState ?? currentSequenceNumber, SummarizerClientElection.isClientEligible), maxOps);
130
- connectedState = new TestConnectedState();
131
- summaryManager = new SummaryManager(election, connectedState, summaryCollection, mockLogger, requestSummarizer, throttler, {
132
- initialDelayMs: 0,
133
- opsToBypassInitialDelay: 0,
134
- });
135
- summaryManager.start();
136
- election.on("electedSummarizerChanged", () => {
137
- connectedState.clientId = election.electedParentId;
138
- });
139
- election.on("shouldSummarizeStateChanged", () => refreshSummarizerCallCount++);
140
- }
141
- function defaultOp(opCount = 1) {
142
- currentSequenceNumber += opCount;
143
- summaryCollectionEmitter.emit("default", { sequenceNumber: currentSequenceNumber });
144
- }
145
- function summaryAck(opCount = 1) {
146
- currentSequenceNumber += opCount;
147
- summaryCollectionEmitter.emit(MessageType.SummaryAck, {
148
- sequenceNumber: currentSequenceNumber,
149
- });
150
- }
151
- function assertState(expectedId, expectedParentId, expectedSeq, message) {
152
- const { electedClientId, electedParentId, electionSequenceNumber } = election.serialize();
153
- assert.strictEqual(electedClientId, election.electedClientId, `Inconsistent clientId; ${message}`);
154
- assert.strictEqual(electedParentId, election.electedParentId, `Inconsistent parentId; ${message}`);
155
- assert.strictEqual(electedClientId, expectedId, `Invalid clientId; ${message}`);
156
- assert.strictEqual(electedParentId, expectedParentId, `Invalid parentId; ${message}`);
157
- assert.strictEqual(electionSequenceNumber, expectedSeq, `Invalid seq #; ${message}`);
158
- }
159
- afterEach(() => {
160
- mockLogger.events = [];
161
- testQuorum.reset();
162
- summaryCollectionEmitter.removeAllListeners();
163
- summarizer.removeAllListeners();
164
- election.removeAllListeners();
165
- currentSequenceNumber = 0;
166
- });
167
- describe("With initial state", () => {
168
- it("Should automatically elect oldest eligible client on op when undefined initial client", async () => {
169
- currentSequenceNumber = 678;
170
- createElection([
171
- ["s1", 1, false],
172
- ["a", 2, true],
173
- ["s2", 4, false],
174
- ["b", 7, true],
175
- ], {
176
- electedClientId: undefined,
177
- electedParentId: undefined,
178
- electionSequenceNumber: 432,
179
- });
180
- assertState(undefined, undefined, 432, "no elected client at first");
181
- defaultOp();
182
- assertState("a", "a", 679, "auto-elect first eligible client");
183
- connectedState.connect();
184
- await flushPromises();
185
- assertState("a-summarizer", "a", 679, "a's summarizer elected on connect");
186
- connectedState.disconnect();
187
- await flushPromises();
188
- assertState("a-summarizer", "a", 679, "summarizer still elected while completing work");
189
- summarizer.runDeferred.resolve();
190
- await flushPromises();
191
- assertState("a", "a", 679, "revert to parent election");
192
- });
193
- it("Should automatically elect oldest eligible client on op when not found initial client", async () => {
194
- currentSequenceNumber = 678;
195
- createElection([
196
- ["s1", 1, false],
197
- ["a", 2, true],
198
- ["s2", 4, false],
199
- ["b", 7, true],
200
- ], { electedClientId: "x", electedParentId: "x", electionSequenceNumber: 432 });
201
- assertState(undefined, undefined, 432, "no elected client at first");
202
- defaultOp();
203
- assertState("a", "a", 679, "auto-elect first eligible client");
204
- connectedState.connect();
205
- await flushPromises();
206
- assertState("a-summarizer", "a", 679, "a's summarizer elected on connect");
207
- connectedState.disconnect();
208
- await flushPromises();
209
- assertState("a-summarizer", "a", 679, "summarizer still elected while completing work");
210
- summarizer.runDeferred.resolve();
211
- await flushPromises();
212
- assertState("a", "a", 679, "revert to parent election");
213
- });
214
- it("Should already have elected next eligible client when ineligible initial client", () => {
215
- currentSequenceNumber = 678;
216
- createElection([
217
- ["s1", 1, false],
218
- ["a", 2, true],
219
- ["s2", 4, false],
220
- ["b", 7, true],
221
- ], { electedClientId: "s2", electedParentId: "s2", electionSequenceNumber: 432 });
222
- assertState("b", "b", 432, "auto-elect next eligible client");
223
- });
224
- it("Should remain unelected with empty quorum", () => {
225
- currentSequenceNumber = 678;
226
- createElection([], {
227
- electedClientId: undefined,
228
- electedParentId: undefined,
229
- electionSequenceNumber: 432,
230
- });
231
- assertState(undefined, undefined, 432, "no elected client at first");
232
- defaultOp();
233
- assertState(undefined, undefined, 432, "still no client to elect");
234
- });
235
- it("Should remain unelected with empty quorum and not found client", () => {
236
- currentSequenceNumber = 678;
237
- createElection([], {
238
- electedClientId: "x",
239
- electedParentId: "x",
240
- electionSequenceNumber: 432,
241
- });
242
- assertState(undefined, undefined, 432, "no client to elect");
243
- });
244
- it("Should reelect during add/remove clients", async () => {
245
- createElection([], {
246
- electedClientId: undefined,
247
- electedParentId: undefined,
248
- electionSequenceNumber: 12,
249
- });
250
- assertState(undefined, undefined, 12, "no clients, should initially be undefined");
251
- // Add non-interactive client, no effect
252
- addClient("s1", 1, false);
253
- assertState(undefined, undefined, 12, "only non-interactive client in quorum");
254
- // Add interactive client, should elect
255
- addClient("a", 17, true);
256
- assertState("a", "a", 17, "only one interactive client in quorum, should elect");
257
- connectedState.connect();
258
- await flushPromises();
259
- assertState("a-summarizer", "a", 17, "a's summarizer elected on connect");
260
- // Add more clients, no effect
261
- addClient("s2", 19, false);
262
- addClient("b", 41, true);
263
- assertState("a-summarizer", "a", 17, "additional younger clients should have no effect");
264
- // Remove elected client, should reelect
265
- removeClient("a", 400);
266
- connectedState.disconnect();
267
- assertState("a-summarizer", "b", 17, "summarizer still doing work");
268
- summarizer.runDeferred.resolve();
269
- await flushPromises();
270
- assertState("b", "b", 441, "elected client leaving should reelect next oldest client");
271
- connectedState.connect();
272
- await flushPromises();
273
- assertState("b-summarizer", "b", 441, "should elect new summarizer");
274
- });
275
- it("Should not reelect when client not summarizing", async () => {
276
- currentSequenceNumber = 4800;
277
- createElection([
278
- ["s1", 1, false],
279
- ["a", 2, true],
280
- ["s2", 4, false],
281
- ["b", 7, true],
282
- ], { electedClientId: "b", electedParentId: "b", electionSequenceNumber: 4000 });
283
- assertState("b", "b", 4000, "elected client based on initial state");
284
- connectedState.connect();
285
- await flushPromises();
286
- assertState("b-summarizer", "b", 4800, "should elect b's summarizer");
287
- // Should stay the same right up until max ops
288
- defaultOp(maxOps);
289
- assertState("b-summarizer", "b", 4800, "should not reelect <= max ops");
290
- // Should not elect another client at this point, so the parent will stay as "b"
291
- defaultOp();
292
- assertState("b-summarizer", "b", 4800, "b's summarizer still working");
293
- summarizer.runDeferred.resolve();
294
- await flushPromises();
295
- assertState("b-summarizer", "b", 4800, "should not reelect a summarizer as b is still in the quorum");
296
- // Should not trigger another reelection as the client is "unresponsive" but not out of the quorum.
297
- defaultOp(maxOps);
298
- assertState("b-summarizer", "b", 4800, "should not reelect <= max ops since baseline");
299
- defaultOp();
300
- summarizer.runDeferred.resolve();
301
- await flushPromises();
302
- assertState("b-summarizer", "b", 4800, "should not reelect again");
303
- // Only once the client is removed we will reelect.
304
- removeClient("b", 400);
305
- connectedState.disconnect();
306
- assertState("b-summarizer", "a", 4800, "summarizer still doing work");
307
- summarizer.runDeferred.resolve();
308
- await flushPromises();
309
- assertState("a", "a", 2 * maxOps + 2 + 4800 + 400, "elected client leaving should reelect next oldest client");
310
- });
311
- it("Should not reelect even when summary ack is found", () => {
312
- currentSequenceNumber = 4800;
313
- createElection([
314
- ["s1", 1, false],
315
- ["a", 2, true],
316
- ["s2", 4, false],
317
- ["b", 7, true],
318
- ], { electedClientId: "s2", electedParentId: "s2", electionSequenceNumber: 4000 });
319
- assertState("b", "b", 4000, "elected based on initial state");
320
- // Should stay the same right up until max ops
321
- defaultOp(maxOps - 800);
322
- assertState("b", "b", 4000, "should not reelect <= max ops");
323
- // Summary ack should only increment election seq #
324
- summaryAck();
325
- assertState("b", "b", maxOps + 4001, "should not reelect after summary ack");
326
- // Summary ack should prevent reelection.
327
- defaultOp(maxOps);
328
- assertState("b", "b", maxOps + 4001, "should not reelect <= max ops since summary ack");
329
- // Should not elect next client at this point as client election is disabled.
330
- defaultOp();
331
- assertState("b", "b", maxOps + 4001, "should not reelect even when > max ops since summary ack");
332
- });
333
- it("Should never reelect when disabled", () => {
334
- currentSequenceNumber = 4800;
335
- createElection([
336
- ["s1", 1, false],
337
- ["a", 2, true],
338
- ["s2", 4, false],
339
- ["b", 7, true],
340
- ], { electedClientId: "b", electedParentId: "b", electionSequenceNumber: 4000 });
341
- assertState("b", "b", 4000, "elected client based on initial state");
342
- // Should stay the same right up until max ops
343
- defaultOp(maxOps - 800);
344
- assertState("b", "b", 4000, "should not reelect <= max ops");
345
- // Should elect first client at this point if enabled
346
- defaultOp();
347
- assertState("b", "b", 4000, "would reelect > max ops, but not since disabled");
348
- // Trigger another reelection if it were to be enabled
349
- defaultOp(maxOps);
350
- assertState("b", "b", 4000, "should not reelect <= max ops since baseline");
351
- defaultOp();
352
- assertState("b", "b", 4000, "would reelect again, but not since disabled");
353
- });
354
- });
355
- describe("No initial state", () => {
356
- it("Should reelect during add/remove clients", () => {
357
- createElection();
358
- assertState(undefined, undefined, 0, "no clients, should initially be undefined");
359
- // Add non-interactive client, no effect
360
- addClient("s1", 1, false);
361
- assertState(undefined, undefined, 0, "only non-interactive client in quorum");
362
- // Add interactive client, should elect
363
- addClient("a", 2, true);
364
- assertState("a", "a", 2, "only one interactive client in quorum, should elect");
365
- // Add more clients, no effect
366
- addClient("s2", 3, false);
367
- addClient("b", 4, true);
368
- assertState("a", "a", 2, "additional younger clients should have no effect");
369
- // Remove elected client, should reelect
370
- removeClient("a", 4);
371
- assertState("b", "b", 8, "elected client leaving should reelect next oldest client");
372
- });
373
- it("Should not reelect when client not summarizing", () => {
374
- createElection([
375
- ["s1", 1, false],
376
- ["a", 2, true],
377
- ["s2", 4, false],
378
- ["b", 7, true],
379
- ]);
380
- assertState("a", "a", 7, "initially should be oldest interactive client");
381
- // Should stay the same right up until max ops
382
- defaultOp(maxOps);
383
- assertState("a", "a", 7, "should not reelect <= max ops");
384
- // Should not elect next client when reelect > max ops.
385
- defaultOp();
386
- assertState("a", "a", 7, "should not reelect > max ops");
387
- // Next election should be undefined, which resets to first client
388
- defaultOp(maxOps);
389
- assertState("a", "a", 7, "should not reelect <= max ops since baseline");
390
- defaultOp();
391
- assertState("a", "a", 7, "should not reelect back to oldest client as election is disabled.");
392
- });
393
- it("Should not reelect when summary ack is found", () => {
394
- createElection([
395
- ["s1", 1, false],
396
- ["a", 2, true],
397
- ["s2", 4, false],
398
- ["b", 7, true],
399
- ]);
400
- assertState("a", "a", 7, "initially should elect oldest interactive client");
401
- // Should stay the same right up until max ops
402
- defaultOp(maxOps);
403
- assertState("a", "a", 7, "should not reelect <= max ops");
404
- // Summary ack should only increment election seq #
405
- summaryAck();
406
- assertState("a", "a", maxOps + 8, "should not reelect after summary ack");
407
- // Summary ack should prevent reelection
408
- defaultOp(maxOps);
409
- assertState("a", "a", maxOps + 8, "should not reelect <= max ops since summary ack");
410
- // Should not elect next client at this point
411
- defaultOp();
412
- assertState("a", "a", maxOps + 8, "should not reelect > max ops since summary ack");
413
- });
414
- it("Should never reelect when disabled", () => {
415
- createElection([
416
- ["s1", 1, false],
417
- ["a", 2, true],
418
- ["s2", 4, false],
419
- ["b", 7, true],
420
- ], undefined);
421
- assertState("a", "a", 7, "initially should be oldest interactive client");
422
- // Should stay the same right up until max ops
423
- defaultOp(maxOps);
424
- assertState("a", "a", 7, "should not reelect <= max ops");
425
- // Should elect next client at this point
426
- defaultOp();
427
- assertState("a", "a", 7, "would reelect > max ops, but not since disabled");
428
- // Next election should be undefined, which resets to first client
429
- defaultOp(maxOps);
430
- assertState("a", "a", 7, "should not reelect <= max ops since baseline");
431
- defaultOp();
432
- assertState("a", "a", 7, "would reelect back to oldest client, but not since disabled");
433
- });
434
- });
435
- });
436
- //# sourceMappingURL=summarizerClientElection.spec.js.map
@@ -1 +0,0 @@
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"]}