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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (554) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/api-report/container-runtime.api.md +471 -52
  3. package/dist/batchTracker.d.ts +1 -1
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js +4 -4
  6. package/dist/batchTracker.js.map +1 -1
  7. package/dist/blobManager.d.ts +33 -30
  8. package/dist/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager.js +82 -107
  10. package/dist/blobManager.js.map +1 -1
  11. package/dist/channelCollection.d.ts +27 -22
  12. package/dist/channelCollection.d.ts.map +1 -1
  13. package/dist/channelCollection.js +189 -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 +171 -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 +132 -108
  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 +110 -53
  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 +223 -167
  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 +201 -97
  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,535 +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 { MockLogger } from "@fluidframework/telemetry-utils";
7
- import { OrderedClientCollection, OrderedClientElection, } from "../../summary/index.js";
8
- import { TestQuorumClients } from "./testQuorumClients.js";
9
- describe("Ordered Client Collection", () => {
10
- let orderedClients;
11
- const mockLogger = new MockLogger();
12
- const testQuorum = new TestQuorumClients();
13
- let currentSequenceNumber = 0;
14
- const testDeltaManager = {
15
- get lastSequenceNumber() {
16
- return currentSequenceNumber;
17
- },
18
- };
19
- function addClient(clientId, sequenceNumber, interactive = true) {
20
- if (sequenceNumber > currentSequenceNumber) {
21
- currentSequenceNumber = sequenceNumber;
22
- }
23
- const details = { capabilities: { interactive } };
24
- const c = { details };
25
- const client = {
26
- client: c,
27
- sequenceNumber,
28
- };
29
- testQuorum.addClient(clientId, client);
30
- }
31
- function removeClient(clientId, opCount = 1) {
32
- currentSequenceNumber += opCount;
33
- testQuorum.removeClient(clientId);
34
- }
35
- function createOrderedClientCollection(initialClients = []) {
36
- for (const [id, seq, int] of initialClients) {
37
- addClient(id, seq, int);
38
- }
39
- orderedClients = new OrderedClientCollection(mockLogger, testDeltaManager, testQuorum);
40
- return orderedClients;
41
- }
42
- function assertCollectionState(expectedCount, message = "") {
43
- const prefix = message ? `${message} - ` : "";
44
- assert.strictEqual(orderedClients.count, expectedCount, `${prefix}Invalid client count: ${orderedClients.count} !== ${expectedCount}`);
45
- }
46
- function assertOrderedClientIds(...expectedIds) {
47
- const actualIds = orderedClients.getAllClients();
48
- assert.strictEqual(actualIds.length, expectedIds.length, `Unexpected count of ordered client ids: ${actualIds.length} !== ${expectedIds.length}`);
49
- for (let i = 0; i < actualIds.length; i++) {
50
- assert.strictEqual(actualIds[i].clientId, expectedIds[i], `Unexpected ordered client id at index ${i}: ${actualIds[i].clientId} !== ${expectedIds[i]}`);
51
- }
52
- }
53
- afterEach(() => {
54
- mockLogger.events = [];
55
- testQuorum.reset();
56
- currentSequenceNumber = 0;
57
- });
58
- describe("Initialize", () => {
59
- it("Should initialize with empty quorum", () => {
60
- createOrderedClientCollection();
61
- assertCollectionState(0);
62
- assertOrderedClientIds();
63
- });
64
- it("Should initialize with correct count", () => {
65
- createOrderedClientCollection([
66
- ["a", 1, true],
67
- ["b", 2, true],
68
- ["s", 5, false],
69
- ["c", 9, true],
70
- ]);
71
- assertCollectionState(4);
72
- assertOrderedClientIds("a", "b", "s", "c");
73
- });
74
- it("Should initialize in correct order", () => {
75
- createOrderedClientCollection([
76
- ["c", 9, true],
77
- ["b", 2, true],
78
- ["a", 1, true],
79
- ["s", 5, false],
80
- ]);
81
- assertCollectionState(4);
82
- assertOrderedClientIds("a", "b", "s", "c");
83
- });
84
- });
85
- describe("Ordered Client Election", () => {
86
- let election;
87
- let electionEventCount = 0;
88
- function createOrderedClientElection(initialClients = [], initialState) {
89
- createOrderedClientCollection(initialClients);
90
- if (initialState !== undefined &&
91
- initialState.electionSequenceNumber > currentSequenceNumber) {
92
- currentSequenceNumber = initialState.electionSequenceNumber;
93
- }
94
- election = new OrderedClientElection(mockLogger.toTelemetryLogger(), orderedClients, initialState ?? currentSequenceNumber, (c) => c.client.details.capabilities.interactive);
95
- election.on("election", () => electionEventCount++);
96
- return election;
97
- }
98
- function incrementElectedClient(sequenceNumber = currentSequenceNumber) {
99
- if (sequenceNumber > currentSequenceNumber) {
100
- currentSequenceNumber = sequenceNumber;
101
- }
102
- election.incrementElectedClient(sequenceNumber);
103
- }
104
- function resetElectedClient(sequenceNumber = currentSequenceNumber) {
105
- if (sequenceNumber > currentSequenceNumber) {
106
- currentSequenceNumber = sequenceNumber;
107
- }
108
- election.resetElectedClient(sequenceNumber);
109
- }
110
- function assertElectionState(expectedTotalCount, expectedEligibleCount, expectedElectedClientId, expectedElectionSequenceNumber, message = "") {
111
- assertCollectionState(expectedTotalCount, message);
112
- const prefix = message ? `${message} - ` : "";
113
- assert.strictEqual(election.eligibleCount, expectedEligibleCount, `${prefix}Invalid eligible count: ${election.eligibleCount} !== ${expectedEligibleCount}`);
114
- assert.strictEqual(election.electedClient?.clientId, expectedElectedClientId, `${prefix}Invalid elected client id: ${election.electedClient?.clientId} !== ${expectedElectedClientId}`);
115
- assert.strictEqual(election.electionSequenceNumber, expectedElectionSequenceNumber, `${prefix}Invalid election seq #: ${election.electionSequenceNumber} !== ${expectedElectionSequenceNumber}`);
116
- }
117
- function assertEvents(expectedElectionCount) {
118
- assert.strictEqual(electionEventCount, expectedElectionCount, `Unexpected election event count: ${electionEventCount} !== ${expectedElectionCount}`);
119
- }
120
- function assertOrderedEligibleClientIds(...expectedIds) {
121
- const actualIds = election.getAllEligibleClients();
122
- assert.strictEqual(actualIds.length, expectedIds.length, `Unexpected count of ordered eligible client ids: ${actualIds.length} !== ${expectedIds.length}`);
123
- for (let i = 0; i < actualIds.length; i++) {
124
- assert.strictEqual(actualIds[i].clientId, expectedIds[i], `Unexpected ordered eligible client id at index ${i}: ${actualIds[i].clientId} !== ${expectedIds[i]}`);
125
- }
126
- }
127
- afterEach(() => {
128
- electionEventCount = 0;
129
- });
130
- describe("Initialize", () => {
131
- const emptySerializedElection = {
132
- electedClientId: undefined,
133
- electedParentId: undefined,
134
- electionSequenceNumber: 101,
135
- };
136
- it("Should initialize with empty quorum", () => {
137
- createOrderedClientElection();
138
- assertElectionState(0, 0, undefined, 0);
139
- assertOrderedEligibleClientIds();
140
- });
141
- it("Should initialize with correct client counts and elected client", () => {
142
- createOrderedClientElection([
143
- ["a", 1, true],
144
- ["b", 2, true],
145
- ["s", 5, false],
146
- ["c", 9, true],
147
- ]);
148
- assertElectionState(4, 3, "a", 9);
149
- assertOrderedEligibleClientIds("a", "b", "c");
150
- });
151
- it("Should initialize with empty quorum at specific sequence number", () => {
152
- currentSequenceNumber = 99;
153
- createOrderedClientElection();
154
- assertElectionState(0, 0, undefined, 99);
155
- assertOrderedEligibleClientIds();
156
- });
157
- it("Should initialize with empty quorum and initial state", () => {
158
- createOrderedClientElection(undefined, emptySerializedElection);
159
- assertElectionState(0, 0, undefined, 101);
160
- assertOrderedEligibleClientIds();
161
- });
162
- it("Should log error with empty quorum and initially elected client", () => {
163
- const clientId = "x";
164
- createOrderedClientElection(undefined, emptySerializedElection);
165
- assertElectionState(0, 0, undefined, 101);
166
- mockLogger.matchEvents([{ eventName: "InitialElectedClientNotFound", clientId }]);
167
- assertOrderedEligibleClientIds();
168
- });
169
- it("Should initialize with correct client counts and elected client from initial state", () => {
170
- createOrderedClientElection([
171
- ["a", 1, true],
172
- ["b", 2, true],
173
- ["s", 5, false],
174
- ["c", 9, true],
175
- ], { electedClientId: "b", electedParentId: "b", electionSequenceNumber: 4321 });
176
- assertElectionState(4, 3, "b", 4321);
177
- assertOrderedEligibleClientIds("a", "b", "c");
178
- });
179
- it("Should log error and elect next eligible when initially elected client is ineligible", () => {
180
- createOrderedClientElection([
181
- ["a", 1, true],
182
- ["b", 2, true],
183
- ["s", 5, false],
184
- ["s2", 7, false],
185
- ["c", 9, true],
186
- ], { electedClientId: "s", electedParentId: "s", electionSequenceNumber: 4321 });
187
- assertElectionState(5, 3, "c", 4321);
188
- mockLogger.matchEvents([
189
- {
190
- eventName: "InitialElectedClientIneligible",
191
- clientId: "s",
192
- electedClientId: "c",
193
- },
194
- ]);
195
- assertOrderedEligibleClientIds("a", "b", "c");
196
- });
197
- it("Should log error and elect undefined when initially elected client is ineligible and last", () => {
198
- createOrderedClientElection([
199
- ["a", 1, true],
200
- ["b", 2, true],
201
- ["s", 5, false],
202
- ["s2", 7, false],
203
- ], { electedClientId: "s", electedParentId: "s", electionSequenceNumber: 4321 });
204
- assertElectionState(4, 2, undefined, 4321);
205
- mockLogger.matchEvents([
206
- {
207
- eventName: "InitialElectedClientIneligible",
208
- clientId: "s",
209
- electedClientId: undefined,
210
- },
211
- ]);
212
- assertOrderedEligibleClientIds("a", "b");
213
- });
214
- it("Should log error when initially elected client is not found", () => {
215
- createOrderedClientElection([
216
- ["a", 1, true],
217
- ["b", 2, true],
218
- ["s", 5, false],
219
- ["c", 9, true],
220
- ], { electedClientId: "x", electedParentId: "x", electionSequenceNumber: 4321 });
221
- assertElectionState(4, 3, undefined, 4321);
222
- mockLogger.matchEvents([
223
- { eventName: "InitialElectedClientNotFound", clientId: "x" },
224
- ]);
225
- assertOrderedEligibleClientIds("a", "b", "c");
226
- });
227
- });
228
- describe("Add Client", () => {
229
- it("Should add ineligible client without impacting eligible clients", () => {
230
- createOrderedClientElection([
231
- ["a", 1, true],
232
- ["b", 2, true],
233
- ["s", 5, false],
234
- ["c", 9, true],
235
- ]);
236
- addClient("n", 100, false);
237
- assertElectionState(5, 3, "a", 9);
238
- assertEvents(0);
239
- assertOrderedEligibleClientIds("a", "b", "c");
240
- });
241
- it("Should add ineligible client to empty quorum without impacting eligible clients", () => {
242
- createOrderedClientElection();
243
- addClient("n", 100, false);
244
- assertElectionState(1, 0, undefined, 0);
245
- assertEvents(0);
246
- assertOrderedEligibleClientIds();
247
- });
248
- it("Should add and elect eligible client to empty quorum", () => {
249
- createOrderedClientElection();
250
- addClient("n", 100);
251
- assertElectionState(1, 1, "n", 100);
252
- assertEvents(1);
253
- assertOrderedEligibleClientIds("n");
254
- });
255
- it("Should add eligible client to end", () => {
256
- createOrderedClientElection([
257
- ["a", 1, true],
258
- ["b", 2, true],
259
- ["s", 5, false],
260
- ["c", 9, true],
261
- ]);
262
- addClient("n", 100);
263
- assertElectionState(5, 4, "a", 9);
264
- assertEvents(0);
265
- assertOrderedEligibleClientIds("a", "b", "c", "n");
266
- });
267
- it("Should add eligible client to middle", () => {
268
- // Questionable test, since this shouldn't really happen.
269
- createOrderedClientElection([
270
- ["a", 1, true],
271
- ["b", 2, true],
272
- ["s", 5, false],
273
- ["c", 9, true],
274
- ]);
275
- addClient("n", 3);
276
- assertElectionState(5, 4, "a", 9);
277
- assertEvents(0);
278
- assertOrderedEligibleClientIds("a", "b", "n", "c");
279
- });
280
- it("Should add eligible client to front", () => {
281
- // Questionable test, since this shouldn't really happen.
282
- createOrderedClientElection([
283
- ["a", 1, true],
284
- ["b", 2, true],
285
- ["s", 5, false],
286
- ["c", 9, true],
287
- ]);
288
- addClient("n", 0);
289
- assertElectionState(5, 4, "a", 9);
290
- assertEvents(0);
291
- assertOrderedEligibleClientIds("n", "a", "b", "c");
292
- });
293
- });
294
- describe("Remove Client", () => {
295
- it("Should log error when removing a client from empty quorum", () => {
296
- createOrderedClientElection();
297
- const clientId = "x";
298
- removeClient(clientId);
299
- mockLogger.matchEvents([{ eventName: "ClientNotFound", clientId }]);
300
- assertElectionState(0, 0, undefined, 0);
301
- assertEvents(0);
302
- assertOrderedEligibleClientIds();
303
- });
304
- it("Should log error when removing a client that doesn't exist", () => {
305
- createOrderedClientElection([
306
- ["a", 1, true],
307
- ["b", 2, true],
308
- ["s", 5, false],
309
- ["c", 9, true],
310
- ]);
311
- const clientId = "x";
312
- removeClient(clientId);
313
- mockLogger.matchEvents([{ eventName: "ClientNotFound", clientId }]);
314
- assertElectionState(4, 3, "a", 9);
315
- assertEvents(0);
316
- assertOrderedEligibleClientIds("a", "b", "c");
317
- });
318
- it("Should remove ineligible client", () => {
319
- createOrderedClientElection([
320
- ["a", 1, true],
321
- ["b", 2, true],
322
- ["s", 5, false],
323
- ["c", 9, true],
324
- ]);
325
- removeClient("s", 5);
326
- assertElectionState(3, 3, "a", 9);
327
- assertEvents(0);
328
- assertOrderedEligibleClientIds("a", "b", "c");
329
- });
330
- it("Should remove other eligible client from end", () => {
331
- createOrderedClientElection([
332
- ["a", 1, true],
333
- ["b", 2, true],
334
- ["s", 5, false],
335
- ["c", 9, true],
336
- ]);
337
- removeClient("c", 5);
338
- assertElectionState(3, 2, "a", 9);
339
- assertEvents(0);
340
- assertOrderedEligibleClientIds("a", "b");
341
- });
342
- it("Should remove elected eligible client from end", () => {
343
- createOrderedClientElection([
344
- ["a", 1, true],
345
- ["b", 2, true],
346
- ["s", 5, false],
347
- ["c", 9, true],
348
- ]);
349
- incrementElectedClient(12); // elect b
350
- incrementElectedClient(19); // elect c
351
- assertElectionState(4, 3, "c", 19);
352
- assertEvents(2);
353
- removeClient("c", 5);
354
- assertElectionState(3, 2, "a", 24);
355
- assertEvents(3);
356
- assertOrderedEligibleClientIds("a", "b");
357
- });
358
- it("Should remove other eligible client from middle", () => {
359
- createOrderedClientElection([
360
- ["a", 1, true],
361
- ["b", 2, true],
362
- ["s", 5, false],
363
- ["c", 9, true],
364
- ]);
365
- removeClient("b", 5);
366
- assertElectionState(3, 2, "a", 9);
367
- assertEvents(0);
368
- assertOrderedEligibleClientIds("a", "c");
369
- });
370
- it("Should remove elected eligible client from middle", () => {
371
- createOrderedClientElection([
372
- ["a", 1, true],
373
- ["b", 2, true],
374
- ["s", 5, false],
375
- ["c", 9, true],
376
- ]);
377
- incrementElectedClient(12); // elect b
378
- assertElectionState(4, 3, "b", 12);
379
- assertEvents(1);
380
- removeClient("b", 5);
381
- assertElectionState(3, 2, "c", 17);
382
- assertEvents(2);
383
- assertOrderedEligibleClientIds("a", "c");
384
- });
385
- it("Should remove elected eligible client from front", () => {
386
- createOrderedClientElection([
387
- ["a", 1, true],
388
- ["b", 2, true],
389
- ["s", 5, false],
390
- ["c", 9, true],
391
- ]);
392
- removeClient("a", 5);
393
- assertElectionState(3, 2, "b", 14);
394
- assertEvents(1);
395
- assertOrderedEligibleClientIds("b", "c");
396
- });
397
- it("Should remove other eligible client from front", () => {
398
- createOrderedClientElection([
399
- ["a", 1, true],
400
- ["b", 2, true],
401
- ["s", 5, false],
402
- ["c", 9, true],
403
- ]);
404
- incrementElectedClient(12); // elect b
405
- assertElectionState(4, 3, "b", 12);
406
- assertEvents(1);
407
- removeClient("a", 5);
408
- assertElectionState(3, 2, "b", 12);
409
- assertEvents(1);
410
- assertOrderedEligibleClientIds("b", "c");
411
- });
412
- it("Should elect next client when ineligible client is elected, then elected client is removed", () => {
413
- createOrderedClientElection([
414
- ["a", 1, true],
415
- ["b", 2, true],
416
- ["s", 5, false],
417
- ["c", 9, true],
418
- ], { electedClientId: "s", electedParentId: "s", electionSequenceNumber: 4321 });
419
- removeClient("s", 1111);
420
- assertElectionState(3, 3, "c", 4321);
421
- removeClient("c", 1111);
422
- assertElectionState(2, 2, "a", 6543);
423
- assertEvents(1);
424
- });
425
- });
426
- describe("Increment elected client", () => {
427
- it("Should do nothing in empty quorum", () => {
428
- createOrderedClientElection();
429
- incrementElectedClient();
430
- assertElectionState(0, 0, undefined, 0);
431
- assertEvents(0);
432
- });
433
- it("Should go to next client from first", () => {
434
- createOrderedClientElection([
435
- ["a", 1, true],
436
- ["b", 2, true],
437
- ["s", 5, false],
438
- ["c", 9, true],
439
- ]);
440
- incrementElectedClient(12);
441
- assertElectionState(4, 3, "b", 12);
442
- assertEvents(1);
443
- });
444
- it("Should go to next client from middle", () => {
445
- createOrderedClientElection([
446
- ["a", 1, true],
447
- ["b", 2, true],
448
- ["s", 5, false],
449
- ["c", 9, true],
450
- ]);
451
- incrementElectedClient(12);
452
- incrementElectedClient(16);
453
- assertElectionState(4, 3, "c", 16);
454
- assertEvents(2);
455
- });
456
- it("Should increment to new nodes", () => {
457
- createOrderedClientElection([
458
- ["a", 1, true],
459
- ["b", 2, true],
460
- ["s", 5, false],
461
- ["c", 9, true],
462
- ]);
463
- incrementElectedClient(16);
464
- incrementElectedClient(27); // no-op
465
- addClient("d", 100);
466
- incrementElectedClient(100);
467
- addClient("e", 101);
468
- assertElectionState(6, 5, "d", 100);
469
- incrementElectedClient(111);
470
- assertElectionState(6, 5, "e", 111);
471
- addClient("f", 200);
472
- incrementElectedClient(205);
473
- assertElectionState(7, 6, "f", 205);
474
- incrementElectedClient(221);
475
- assertElectionState(7, 6, "a", 221);
476
- addClient("g", 229);
477
- assertElectionState(8, 7, "a", 221);
478
- });
479
- it("Should increment when ineligible client is elected", () => {
480
- createOrderedClientElection([
481
- ["a", 1, true],
482
- ["s", 2, false],
483
- ["b", 5, true],
484
- ["c", 9, true],
485
- ], { electedClientId: "s", electedParentId: "s", electionSequenceNumber: 4321 });
486
- assertElectionState(4, 3, "b", 4321);
487
- incrementElectedClient(7777);
488
- assertElectionState(4, 3, "c", 7777);
489
- assertEvents(1);
490
- });
491
- });
492
- describe("Reset elected client", () => {
493
- it("Should reset to first when not first", () => {
494
- createOrderedClientElection([
495
- ["a", 1, true],
496
- ["b", 2, true],
497
- ["s", 5, false],
498
- ["c", 9, true],
499
- ]);
500
- incrementElectedClient(12);
501
- incrementElectedClient(15);
502
- resetElectedClient(19);
503
- assertElectionState(4, 3, "a", 19);
504
- assertEvents(3);
505
- });
506
- it("Should reset to first when undefined at end", () => {
507
- createOrderedClientElection([
508
- ["a", 1, true],
509
- ["b", 2, true],
510
- ["s", 5, false],
511
- ["c", 9, true],
512
- ]);
513
- incrementElectedClient(12);
514
- incrementElectedClient(15);
515
- incrementElectedClient(19);
516
- resetElectedClient(31); // no-op
517
- assertElectionState(4, 3, "a", 19);
518
- assertEvents(3);
519
- });
520
- it("Should reset to first when ineligible client is elected", () => {
521
- createOrderedClientElection([
522
- ["a", 1, true],
523
- ["s", 2, false],
524
- ["b", 5, true],
525
- ["c", 9, true],
526
- ], { electedClientId: "s", electedParentId: "s", electionSequenceNumber: 4321 });
527
- assertElectionState(4, 3, "b", 4321);
528
- resetElectedClient(7777);
529
- assertElectionState(4, 3, "a", 7777);
530
- assertEvents(1);
531
- });
532
- });
533
- });
534
- });
535
- //# sourceMappingURL=orderedClientElection.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orderedClientElection.spec.js","sourceRoot":"","sources":["../../../src/test/summary/orderedClientElection.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 { ISequencedClient } from \"@fluidframework/protocol-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport {\n\tIOrderedClientCollection,\n\tIOrderedClientElection,\n\tISerializedElection,\n\tITrackedClient,\n\tOrderedClientCollection,\n\tOrderedClientElection,\n} from \"../../summary/index.js\";\nimport { TestQuorumClients } from \"./testQuorumClients.js\";\n\ndescribe(\"Ordered Client Collection\", () => {\n\tlet orderedClients: IOrderedClientCollection;\n\tconst mockLogger = new MockLogger();\n\tconst testQuorum = new TestQuorumClients();\n\n\tlet currentSequenceNumber: number = 0;\n\tconst testDeltaManager = {\n\t\tget lastSequenceNumber() {\n\t\t\treturn currentSequenceNumber;\n\t\t},\n\t};\n\n\tfunction addClient(clientId: string, sequenceNumber: number, interactive = true) {\n\t\tif (sequenceNumber > currentSequenceNumber) {\n\t\t\tcurrentSequenceNumber = sequenceNumber;\n\t\t}\n\t\tconst details: ISequencedClient[\"client\"][\"details\"] = { capabilities: { interactive } };\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\tfunction createOrderedClientCollection(\n\t\tinitialClients: [id: string, seq: number, int: boolean][] = [],\n\t): IOrderedClientCollection {\n\t\tfor (const [id, seq, int] of initialClients) {\n\t\t\taddClient(id, seq, int);\n\t\t}\n\t\torderedClients = new OrderedClientCollection(mockLogger, testDeltaManager, testQuorum);\n\t\treturn orderedClients;\n\t}\n\tfunction assertCollectionState(expectedCount: number, message = \"\") {\n\t\tconst prefix = message ? `${message} - ` : \"\";\n\t\tassert.strictEqual(\n\t\t\torderedClients.count,\n\t\t\texpectedCount,\n\t\t\t`${prefix}Invalid client count: ${orderedClients.count} !== ${expectedCount}`,\n\t\t);\n\t}\n\tfunction assertOrderedClientIds(...expectedIds: string[]) {\n\t\tconst actualIds = orderedClients.getAllClients();\n\t\tassert.strictEqual(\n\t\t\tactualIds.length,\n\t\t\texpectedIds.length,\n\t\t\t`Unexpected count of ordered client ids: ${actualIds.length} !== ${expectedIds.length}`,\n\t\t);\n\t\tfor (let i = 0; i < actualIds.length; i++) {\n\t\t\tassert.strictEqual(\n\t\t\t\tactualIds[i].clientId,\n\t\t\t\texpectedIds[i],\n\t\t\t\t`Unexpected ordered client id at index ${i}: ${actualIds[i].clientId} !== ${expectedIds[i]}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tafterEach(() => {\n\t\tmockLogger.events = [];\n\t\ttestQuorum.reset();\n\t\tcurrentSequenceNumber = 0;\n\t});\n\n\tdescribe(\"Initialize\", () => {\n\t\tit(\"Should initialize with empty quorum\", () => {\n\t\t\tcreateOrderedClientCollection();\n\t\t\tassertCollectionState(0);\n\t\t\tassertOrderedClientIds();\n\t\t});\n\n\t\tit(\"Should initialize with correct count\", () => {\n\t\t\tcreateOrderedClientCollection([\n\t\t\t\t[\"a\", 1, true],\n\t\t\t\t[\"b\", 2, true],\n\t\t\t\t[\"s\", 5, false],\n\t\t\t\t[\"c\", 9, true],\n\t\t\t]);\n\t\t\tassertCollectionState(4);\n\t\t\tassertOrderedClientIds(\"a\", \"b\", \"s\", \"c\");\n\t\t});\n\n\t\tit(\"Should initialize in correct order\", () => {\n\t\t\tcreateOrderedClientCollection([\n\t\t\t\t[\"c\", 9, true],\n\t\t\t\t[\"b\", 2, true],\n\t\t\t\t[\"a\", 1, true],\n\t\t\t\t[\"s\", 5, false],\n\t\t\t]);\n\t\t\tassertCollectionState(4);\n\t\t\tassertOrderedClientIds(\"a\", \"b\", \"s\", \"c\");\n\t\t});\n\t});\n\n\tdescribe(\"Ordered Client Election\", () => {\n\t\tlet election: IOrderedClientElection;\n\t\tlet electionEventCount = 0;\n\t\tfunction createOrderedClientElection(\n\t\t\tinitialClients: [id: string, seq: number, int: boolean][] = [],\n\t\t\tinitialState?: ISerializedElection,\n\t\t): IOrderedClientElection {\n\t\t\tcreateOrderedClientCollection(initialClients);\n\t\t\tif (\n\t\t\t\tinitialState !== undefined &&\n\t\t\t\tinitialState.electionSequenceNumber > currentSequenceNumber\n\t\t\t) {\n\t\t\t\tcurrentSequenceNumber = initialState.electionSequenceNumber;\n\t\t\t}\n\t\t\telection = new OrderedClientElection(\n\t\t\t\tmockLogger.toTelemetryLogger(),\n\t\t\t\torderedClients,\n\t\t\t\tinitialState ?? currentSequenceNumber,\n\t\t\t\t(c: ITrackedClient) => c.client.details.capabilities.interactive,\n\t\t\t);\n\t\t\telection.on(\"election\", () => electionEventCount++);\n\t\t\treturn election;\n\t\t}\n\t\tfunction incrementElectedClient(sequenceNumber = currentSequenceNumber) {\n\t\t\tif (sequenceNumber > currentSequenceNumber) {\n\t\t\t\tcurrentSequenceNumber = sequenceNumber;\n\t\t\t}\n\t\t\telection.incrementElectedClient(sequenceNumber);\n\t\t}\n\t\tfunction resetElectedClient(sequenceNumber = currentSequenceNumber) {\n\t\t\tif (sequenceNumber > currentSequenceNumber) {\n\t\t\t\tcurrentSequenceNumber = sequenceNumber;\n\t\t\t}\n\t\t\telection.resetElectedClient(sequenceNumber);\n\t\t}\n\t\tfunction assertElectionState(\n\t\t\texpectedTotalCount: number,\n\t\t\texpectedEligibleCount: number,\n\t\t\texpectedElectedClientId: string | undefined,\n\t\t\texpectedElectionSequenceNumber: number,\n\t\t\tmessage = \"\",\n\t\t) {\n\t\t\tassertCollectionState(expectedTotalCount, message);\n\t\t\tconst prefix = message ? `${message} - ` : \"\";\n\t\t\tassert.strictEqual(\n\t\t\t\telection.eligibleCount,\n\t\t\t\texpectedEligibleCount,\n\t\t\t\t`${prefix}Invalid eligible count: ${election.eligibleCount} !== ${expectedEligibleCount}`,\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\telection.electedClient?.clientId,\n\t\t\t\texpectedElectedClientId,\n\t\t\t\t`${prefix}Invalid elected client id: ${election.electedClient?.clientId} !== ${expectedElectedClientId}`,\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\telection.electionSequenceNumber,\n\t\t\t\texpectedElectionSequenceNumber,\n\t\t\t\t`${prefix}Invalid election seq #: ${election.electionSequenceNumber} !== ${expectedElectionSequenceNumber}`,\n\t\t\t);\n\t\t}\n\t\tfunction assertEvents(expectedElectionCount: number) {\n\t\t\tassert.strictEqual(\n\t\t\t\telectionEventCount,\n\t\t\t\texpectedElectionCount,\n\t\t\t\t`Unexpected election event count: ${electionEventCount} !== ${expectedElectionCount}`,\n\t\t\t);\n\t\t}\n\t\tfunction assertOrderedEligibleClientIds(...expectedIds: string[]) {\n\t\t\tconst actualIds = election.getAllEligibleClients();\n\t\t\tassert.strictEqual(\n\t\t\t\tactualIds.length,\n\t\t\t\texpectedIds.length,\n\t\t\t\t`Unexpected count of ordered eligible client ids: ${actualIds.length} !== ${expectedIds.length}`,\n\t\t\t);\n\t\t\tfor (let i = 0; i < actualIds.length; i++) {\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tactualIds[i].clientId,\n\t\t\t\t\texpectedIds[i],\n\t\t\t\t\t`Unexpected ordered eligible client id at index ${i}: ${actualIds[i].clientId} !== ${expectedIds[i]}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tafterEach(() => {\n\t\t\telectionEventCount = 0;\n\t\t});\n\n\t\tdescribe(\"Initialize\", () => {\n\t\t\tconst emptySerializedElection = {\n\t\t\t\telectedClientId: undefined,\n\t\t\t\telectedParentId: undefined,\n\t\t\t\telectionSequenceNumber: 101,\n\t\t\t};\n\n\t\t\tit(\"Should initialize with empty quorum\", () => {\n\t\t\t\tcreateOrderedClientElection();\n\t\t\t\tassertElectionState(0, 0, undefined, 0);\n\t\t\t\tassertOrderedEligibleClientIds();\n\t\t\t});\n\n\t\t\tit(\"Should initialize with correct client counts and elected client\", () => {\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\tassertElectionState(4, 3, \"a\", 9);\n\t\t\t\tassertOrderedEligibleClientIds(\"a\", \"b\", \"c\");\n\t\t\t});\n\n\t\t\tit(\"Should initialize with empty quorum at specific sequence number\", () => {\n\t\t\t\tcurrentSequenceNumber = 99;\n\t\t\t\tcreateOrderedClientElection();\n\t\t\t\tassertElectionState(0, 0, undefined, 99);\n\t\t\t\tassertOrderedEligibleClientIds();\n\t\t\t});\n\n\t\t\tit(\"Should initialize with empty quorum and initial state\", () => {\n\t\t\t\tcreateOrderedClientElection(undefined, emptySerializedElection);\n\t\t\t\tassertElectionState(0, 0, undefined, 101);\n\t\t\t\tassertOrderedEligibleClientIds();\n\t\t\t});\n\n\t\t\tit(\"Should log error with empty quorum and initially elected client\", () => {\n\t\t\t\tconst clientId = \"x\";\n\t\t\t\tcreateOrderedClientElection(undefined, emptySerializedElection);\n\t\t\t\tassertElectionState(0, 0, undefined, 101);\n\t\t\t\tmockLogger.matchEvents([{ eventName: \"InitialElectedClientNotFound\", clientId }]);\n\t\t\t\tassertOrderedEligibleClientIds();\n\t\t\t});\n\n\t\t\tit(\"Should initialize with correct client counts and elected client from initial state\", () => {\n\t\t\t\tcreateOrderedClientElection(\n\t\t\t\t\t[\n\t\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t\t],\n\t\t\t\t\t{ electedClientId: \"b\", electedParentId: \"b\", electionSequenceNumber: 4321 },\n\t\t\t\t);\n\t\t\t\tassertElectionState(4, 3, \"b\", 4321);\n\t\t\t\tassertOrderedEligibleClientIds(\"a\", \"b\", \"c\");\n\t\t\t});\n\n\t\t\tit(\"Should log error and elect next eligible when initially elected client is ineligible\", () => {\n\t\t\t\tcreateOrderedClientElection(\n\t\t\t\t\t[\n\t\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t\t[\"s2\", 7, false],\n\t\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t\t],\n\t\t\t\t\t{ electedClientId: \"s\", electedParentId: \"s\", electionSequenceNumber: 4321 },\n\t\t\t\t);\n\t\t\t\tassertElectionState(5, 3, \"c\", 4321);\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"InitialElectedClientIneligible\",\n\t\t\t\t\t\tclientId: \"s\",\n\t\t\t\t\t\telectedClientId: \"c\",\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t\tassertOrderedEligibleClientIds(\"a\", \"b\", \"c\");\n\t\t\t});\n\n\t\t\tit(\"Should log error and elect undefined when initially elected client is ineligible and last\", () => {\n\t\t\t\tcreateOrderedClientElection(\n\t\t\t\t\t[\n\t\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t\t[\"s2\", 7, false],\n\t\t\t\t\t],\n\t\t\t\t\t{ electedClientId: \"s\", electedParentId: \"s\", electionSequenceNumber: 4321 },\n\t\t\t\t);\n\t\t\t\tassertElectionState(4, 2, undefined, 4321);\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"InitialElectedClientIneligible\",\n\t\t\t\t\t\tclientId: \"s\",\n\t\t\t\t\t\telectedClientId: undefined,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t\tassertOrderedEligibleClientIds(\"a\", \"b\");\n\t\t\t});\n\n\t\t\tit(\"Should log error when initially elected client is not found\", () => {\n\t\t\t\tcreateOrderedClientElection(\n\t\t\t\t\t[\n\t\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t\t],\n\t\t\t\t\t{ electedClientId: \"x\", electedParentId: \"x\", electionSequenceNumber: 4321 },\n\t\t\t\t);\n\t\t\t\tassertElectionState(4, 3, undefined, 4321);\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"InitialElectedClientNotFound\", clientId: \"x\" },\n\t\t\t\t]);\n\t\t\t\tassertOrderedEligibleClientIds(\"a\", \"b\", \"c\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Add Client\", () => {\n\t\t\tit(\"Should add ineligible client without impacting eligible clients\", () => {\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\taddClient(\"n\", 100, false);\n\t\t\t\tassertElectionState(5, 3, \"a\", 9);\n\t\t\t\tassertEvents(0);\n\t\t\t\tassertOrderedEligibleClientIds(\"a\", \"b\", \"c\");\n\t\t\t});\n\n\t\t\tit(\"Should add ineligible client to empty quorum without impacting eligible clients\", () => {\n\t\t\t\tcreateOrderedClientElection();\n\t\t\t\taddClient(\"n\", 100, false);\n\t\t\t\tassertElectionState(1, 0, undefined, 0);\n\t\t\t\tassertEvents(0);\n\t\t\t\tassertOrderedEligibleClientIds();\n\t\t\t});\n\n\t\t\tit(\"Should add and elect eligible client to empty quorum\", () => {\n\t\t\t\tcreateOrderedClientElection();\n\t\t\t\taddClient(\"n\", 100);\n\t\t\t\tassertElectionState(1, 1, \"n\", 100);\n\t\t\t\tassertEvents(1);\n\t\t\t\tassertOrderedEligibleClientIds(\"n\");\n\t\t\t});\n\n\t\t\tit(\"Should add eligible client to end\", () => {\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\taddClient(\"n\", 100);\n\t\t\t\tassertElectionState(5, 4, \"a\", 9);\n\t\t\t\tassertEvents(0);\n\t\t\t\tassertOrderedEligibleClientIds(\"a\", \"b\", \"c\", \"n\");\n\t\t\t});\n\n\t\t\tit(\"Should add eligible client to middle\", () => {\n\t\t\t\t// Questionable test, since this shouldn't really happen.\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\taddClient(\"n\", 3);\n\t\t\t\tassertElectionState(5, 4, \"a\", 9);\n\t\t\t\tassertEvents(0);\n\t\t\t\tassertOrderedEligibleClientIds(\"a\", \"b\", \"n\", \"c\");\n\t\t\t});\n\n\t\t\tit(\"Should add eligible client to front\", () => {\n\t\t\t\t// Questionable test, since this shouldn't really happen.\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\taddClient(\"n\", 0);\n\t\t\t\tassertElectionState(5, 4, \"a\", 9);\n\t\t\t\tassertEvents(0);\n\t\t\t\tassertOrderedEligibleClientIds(\"n\", \"a\", \"b\", \"c\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Remove Client\", () => {\n\t\t\tit(\"Should log error when removing a client from empty quorum\", () => {\n\t\t\t\tcreateOrderedClientElection();\n\t\t\t\tconst clientId = \"x\";\n\t\t\t\tremoveClient(clientId);\n\t\t\t\tmockLogger.matchEvents([{ eventName: \"ClientNotFound\", clientId }]);\n\t\t\t\tassertElectionState(0, 0, undefined, 0);\n\t\t\t\tassertEvents(0);\n\t\t\t\tassertOrderedEligibleClientIds();\n\t\t\t});\n\n\t\t\tit(\"Should log error when removing a client that doesn't exist\", () => {\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\tconst clientId = \"x\";\n\t\t\t\tremoveClient(clientId);\n\t\t\t\tmockLogger.matchEvents([{ eventName: \"ClientNotFound\", clientId }]);\n\t\t\t\tassertElectionState(4, 3, \"a\", 9);\n\t\t\t\tassertEvents(0);\n\t\t\t\tassertOrderedEligibleClientIds(\"a\", \"b\", \"c\");\n\t\t\t});\n\n\t\t\tit(\"Should remove ineligible client\", () => {\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\tremoveClient(\"s\", 5);\n\t\t\t\tassertElectionState(3, 3, \"a\", 9);\n\t\t\t\tassertEvents(0);\n\t\t\t\tassertOrderedEligibleClientIds(\"a\", \"b\", \"c\");\n\t\t\t});\n\n\t\t\tit(\"Should remove other eligible client from end\", () => {\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\tremoveClient(\"c\", 5);\n\t\t\t\tassertElectionState(3, 2, \"a\", 9);\n\t\t\t\tassertEvents(0);\n\t\t\t\tassertOrderedEligibleClientIds(\"a\", \"b\");\n\t\t\t});\n\n\t\t\tit(\"Should remove elected eligible client from end\", () => {\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\tincrementElectedClient(12); // elect b\n\t\t\t\tincrementElectedClient(19); // elect c\n\t\t\t\tassertElectionState(4, 3, \"c\", 19);\n\t\t\t\tassertEvents(2);\n\t\t\t\tremoveClient(\"c\", 5);\n\t\t\t\tassertElectionState(3, 2, \"a\", 24);\n\t\t\t\tassertEvents(3);\n\t\t\t\tassertOrderedEligibleClientIds(\"a\", \"b\");\n\t\t\t});\n\n\t\t\tit(\"Should remove other eligible client from middle\", () => {\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\tremoveClient(\"b\", 5);\n\t\t\t\tassertElectionState(3, 2, \"a\", 9);\n\t\t\t\tassertEvents(0);\n\t\t\t\tassertOrderedEligibleClientIds(\"a\", \"c\");\n\t\t\t});\n\n\t\t\tit(\"Should remove elected eligible client from middle\", () => {\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\tincrementElectedClient(12); // elect b\n\t\t\t\tassertElectionState(4, 3, \"b\", 12);\n\t\t\t\tassertEvents(1);\n\t\t\t\tremoveClient(\"b\", 5);\n\t\t\t\tassertElectionState(3, 2, \"c\", 17);\n\t\t\t\tassertEvents(2);\n\t\t\t\tassertOrderedEligibleClientIds(\"a\", \"c\");\n\t\t\t});\n\n\t\t\tit(\"Should remove elected eligible client from front\", () => {\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\tremoveClient(\"a\", 5);\n\t\t\t\tassertElectionState(3, 2, \"b\", 14);\n\t\t\t\tassertEvents(1);\n\t\t\t\tassertOrderedEligibleClientIds(\"b\", \"c\");\n\t\t\t});\n\n\t\t\tit(\"Should remove other eligible client from front\", () => {\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\tincrementElectedClient(12); // elect b\n\t\t\t\tassertElectionState(4, 3, \"b\", 12);\n\t\t\t\tassertEvents(1);\n\t\t\t\tremoveClient(\"a\", 5);\n\t\t\t\tassertElectionState(3, 2, \"b\", 12);\n\t\t\t\tassertEvents(1);\n\t\t\t\tassertOrderedEligibleClientIds(\"b\", \"c\");\n\t\t\t});\n\n\t\t\tit(\"Should elect next client when ineligible client is elected, then elected client is removed\", () => {\n\t\t\t\tcreateOrderedClientElection(\n\t\t\t\t\t[\n\t\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t\t],\n\t\t\t\t\t{ electedClientId: \"s\", electedParentId: \"s\", electionSequenceNumber: 4321 },\n\t\t\t\t);\n\t\t\t\tremoveClient(\"s\", 1111);\n\t\t\t\tassertElectionState(3, 3, \"c\", 4321);\n\t\t\t\tremoveClient(\"c\", 1111);\n\t\t\t\tassertElectionState(2, 2, \"a\", 6543);\n\t\t\t\tassertEvents(1);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Increment elected client\", () => {\n\t\t\tit(\"Should do nothing in empty quorum\", () => {\n\t\t\t\tcreateOrderedClientElection();\n\t\t\t\tincrementElectedClient();\n\t\t\t\tassertElectionState(0, 0, undefined, 0);\n\t\t\t\tassertEvents(0);\n\t\t\t});\n\n\t\t\tit(\"Should go to next client from first\", () => {\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\tincrementElectedClient(12);\n\t\t\t\tassertElectionState(4, 3, \"b\", 12);\n\t\t\t\tassertEvents(1);\n\t\t\t});\n\n\t\t\tit(\"Should go to next client from middle\", () => {\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\tincrementElectedClient(12);\n\t\t\t\tincrementElectedClient(16);\n\t\t\t\tassertElectionState(4, 3, \"c\", 16);\n\t\t\t\tassertEvents(2);\n\t\t\t});\n\n\t\t\tit(\"Should increment to new nodes\", () => {\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\tincrementElectedClient(16);\n\t\t\t\tincrementElectedClient(27); // no-op\n\t\t\t\taddClient(\"d\", 100);\n\t\t\t\tincrementElectedClient(100);\n\t\t\t\taddClient(\"e\", 101);\n\t\t\t\tassertElectionState(6, 5, \"d\", 100);\n\t\t\t\tincrementElectedClient(111);\n\t\t\t\tassertElectionState(6, 5, \"e\", 111);\n\t\t\t\taddClient(\"f\", 200);\n\t\t\t\tincrementElectedClient(205);\n\t\t\t\tassertElectionState(7, 6, \"f\", 205);\n\t\t\t\tincrementElectedClient(221);\n\t\t\t\tassertElectionState(7, 6, \"a\", 221);\n\t\t\t\taddClient(\"g\", 229);\n\t\t\t\tassertElectionState(8, 7, \"a\", 221);\n\t\t\t});\n\n\t\t\tit(\"Should increment when ineligible client is elected\", () => {\n\t\t\t\tcreateOrderedClientElection(\n\t\t\t\t\t[\n\t\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t\t[\"s\", 2, false],\n\t\t\t\t\t\t[\"b\", 5, true],\n\t\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t\t],\n\t\t\t\t\t{ electedClientId: \"s\", electedParentId: \"s\", electionSequenceNumber: 4321 },\n\t\t\t\t);\n\t\t\t\tassertElectionState(4, 3, \"b\", 4321);\n\t\t\t\tincrementElectedClient(7777);\n\t\t\t\tassertElectionState(4, 3, \"c\", 7777);\n\t\t\t\tassertEvents(1);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Reset elected client\", () => {\n\t\t\tit(\"Should reset to first when not first\", () => {\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\tincrementElectedClient(12);\n\t\t\t\tincrementElectedClient(15);\n\t\t\t\tresetElectedClient(19);\n\t\t\t\tassertElectionState(4, 3, \"a\", 19);\n\t\t\t\tassertEvents(3);\n\t\t\t});\n\n\t\t\tit(\"Should reset to first when undefined at end\", () => {\n\t\t\t\tcreateOrderedClientElection([\n\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t[\"b\", 2, true],\n\t\t\t\t\t[\"s\", 5, false],\n\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t]);\n\t\t\t\tincrementElectedClient(12);\n\t\t\t\tincrementElectedClient(15);\n\t\t\t\tincrementElectedClient(19);\n\t\t\t\tresetElectedClient(31); // no-op\n\t\t\t\tassertElectionState(4, 3, \"a\", 19);\n\t\t\t\tassertEvents(3);\n\t\t\t});\n\n\t\t\tit(\"Should reset to first when ineligible client is elected\", () => {\n\t\t\t\tcreateOrderedClientElection(\n\t\t\t\t\t[\n\t\t\t\t\t\t[\"a\", 1, true],\n\t\t\t\t\t\t[\"s\", 2, false],\n\t\t\t\t\t\t[\"b\", 5, true],\n\t\t\t\t\t\t[\"c\", 9, true],\n\t\t\t\t\t],\n\t\t\t\t\t{ electedClientId: \"s\", electedParentId: \"s\", electionSequenceNumber: 4321 },\n\t\t\t\t);\n\t\t\t\tassertElectionState(4, 3, \"b\", 4321);\n\t\t\t\tresetElectedClient(7777);\n\t\t\t\tassertElectionState(4, 3, \"a\", 7777);\n\t\t\t\tassertEvents(1);\n\t\t\t});\n\t\t});\n\t});\n});\n"]}