@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.
- package/CHANGELOG.md +23 -0
- package/api-report/container-runtime.api.md +471 -52
- package/dist/batchTracker.d.ts +1 -1
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +4 -4
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +33 -30
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +82 -107
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +27 -22
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +189 -165
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +3 -3
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +17 -17
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js +2 -2
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +42 -39
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +425 -292
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +8 -8
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +58 -19
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +171 -114
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts +1 -0
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +12 -11
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.d.ts +5 -1
- package/dist/dataStoreRegistry.d.ts.map +1 -1
- package/dist/dataStoreRegistry.js +4 -4
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/dist/deltaManagerSummarizerProxy.js.map +1 -1
- package/dist/deltaScheduler.d.ts +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +6 -6
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/error.d.ts +1 -1
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +4 -4
- package/dist/error.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +3 -2
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +23 -23
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts +2 -2
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +4 -5
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +4 -5
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +5 -1
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +21 -12
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +2 -2
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +11 -11
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +2 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +11 -9
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js +6 -6
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/gc/index.d.ts +1 -1
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +2 -1
- package/dist/gc/index.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +91 -0
- package/dist/messageTypes.d.ts +11 -5
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js +4 -0
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +2 -20
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +3 -3
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +3 -1
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +5 -6
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +15 -4
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +62 -63
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +14 -16
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +12 -4
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +63 -53
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +2 -1
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +30 -29
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +36 -32
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts +1 -1
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +18 -18
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/public.d.ts +12 -0
- package/dist/scheduleManager.d.ts +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +28 -24
- package/dist/scheduleManager.js.map +1 -1
- package/dist/storageServiceWithAttachBlobs.d.ts +2 -2
- package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -1
- package/dist/storageServiceWithAttachBlobs.js +2 -2
- package/dist/storageServiceWithAttachBlobs.js.map +1 -1
- package/dist/summary/documentSchema.d.ts +209 -0
- package/dist/summary/documentSchema.d.ts.map +1 -0
- package/dist/summary/documentSchema.js +390 -0
- package/dist/summary/documentSchema.js.map +1 -0
- package/dist/summary/index.d.ts +2 -1
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +4 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +2 -2
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +12 -7
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js +3 -3
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +3 -3
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +16 -16
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +3 -2
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +13 -13
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts +2 -2
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.d.ts +1 -1
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
- package/dist/summary/summarizerHeuristics.js +2 -2
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +3 -2
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +28 -28
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +14 -14
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +5 -3
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +2 -2
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +7 -7
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +6 -17
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js +8 -8
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +4 -3
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +17 -17
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +1 -1
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +15 -14
- package/dist/summary/summaryManager.js.map +1 -1
- package/internal.d.ts +11 -0
- package/legacy.d.ts +11 -0
- package/lib/batchTracker.d.ts +1 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -2
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +33 -30
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +48 -73
- package/lib/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts +27 -22
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +132 -108
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +3 -3
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +3 -3
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerHandleContext.d.ts.map +1 -1
- package/lib/containerHandleContext.js +1 -1
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +42 -39
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +276 -141
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +3 -3
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +58 -19
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +110 -53
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts +1 -0
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +3 -2
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.d.ts +5 -1
- package/lib/dataStoreRegistry.d.ts.map +1 -1
- package/lib/dataStoreRegistry.js +1 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/lib/deltaManagerSummarizerProxy.js.map +1 -1
- package/lib/deltaScheduler.d.ts +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +1 -1
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/error.d.ts +1 -1
- package/lib/error.d.ts.map +1 -1
- package/lib/error.js +2 -2
- package/lib/error.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +3 -2
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +8 -8
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts +2 -2
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +4 -5
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +4 -5
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts +5 -1
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +10 -2
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts +2 -2
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +2 -2
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +2 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +4 -2
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js +2 -2
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/lib/gc/index.d.ts +1 -1
- package/lib/gc/index.d.ts.map +1 -1
- package/lib/gc/index.js +1 -1
- package/lib/gc/index.js.map +1 -1
- package/lib/index.d.ts +5 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -2
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +91 -0
- package/lib/messageTypes.d.ts +11 -5
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js +4 -0
- package/lib/messageTypes.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +2 -20
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +3 -3
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js +2 -2
- package/lib/opLifecycle/index.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +2 -3
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +15 -4
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +61 -62
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +9 -12
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +12 -4
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +47 -38
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +2 -1
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +19 -18
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +36 -32
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +1 -1
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +2 -2
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/public.d.ts +12 -0
- package/lib/scheduleManager.d.ts +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +7 -3
- package/lib/scheduleManager.js.map +1 -1
- package/lib/storageServiceWithAttachBlobs.d.ts +2 -2
- package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -1
- package/lib/storageServiceWithAttachBlobs.js +1 -1
- package/lib/storageServiceWithAttachBlobs.js.map +1 -1
- package/lib/summary/documentSchema.d.ts +209 -0
- package/lib/summary/documentSchema.d.ts.map +1 -0
- package/lib/summary/documentSchema.js +386 -0
- package/lib/summary/documentSchema.js.map +1 -0
- package/lib/summary/index.d.ts +2 -1
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js +1 -0
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +2 -2
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +7 -2
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +3 -3
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +3 -3
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +3 -2
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +3 -3
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts +2 -2
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.d.ts +1 -1
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
- package/lib/summary/summarizerHeuristics.js +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +3 -2
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +5 -5
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +5 -3
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +2 -2
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +1 -1
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +6 -17
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +3 -3
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +4 -3
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +4 -4
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +1 -1
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +9 -8
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +57 -65
- package/src/batchTracker.ts +4 -3
- package/src/blobManager.ts +100 -77
- package/src/channelCollection.ts +223 -167
- package/src/connectionTelemetry.ts +12 -12
- package/src/containerHandleContext.ts +3 -2
- package/src/containerRuntime.ts +481 -277
- package/src/dataStore.ts +9 -4
- package/src/dataStoreContext.ts +201 -97
- package/src/dataStoreContexts.ts +5 -2
- package/src/dataStoreRegistry.ts +3 -2
- package/src/deltaManagerSummarizerProxy.ts +1 -1
- package/src/deltaScheduler.ts +2 -1
- package/src/error.ts +2 -2
- package/src/gc/garbageCollection.ts +21 -20
- package/src/gc/gcConfigs.ts +15 -18
- package/src/gc/gcDefinitions.ts +6 -8
- package/src/gc/gcHelpers.ts +22 -5
- package/src/gc/gcSummaryStateTracker.ts +7 -5
- package/src/gc/gcTelemetry.ts +13 -7
- package/src/gc/gcUnreferencedStateTracker.ts +3 -2
- package/src/gc/index.ts +1 -0
- package/src/index.ts +22 -1
- package/src/messageTypes.ts +20 -6
- package/src/opLifecycle/README.md +89 -0
- package/src/opLifecycle/batchManager.ts +1 -0
- package/src/opLifecycle/definitions.ts +3 -21
- package/src/opLifecycle/index.ts +3 -9
- package/src/opLifecycle/opCompressor.ts +6 -5
- package/src/opLifecycle/opDecompressor.ts +90 -100
- package/src/opLifecycle/opGroupingManager.ts +12 -14
- package/src/opLifecycle/opSplitter.ts +76 -48
- package/src/opLifecycle/outbox.ts +30 -38
- package/src/opLifecycle/remoteMessageProcessor.ts +43 -55
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +6 -6
- package/src/scheduleManager.ts +10 -8
- package/src/storageServiceWithAttachBlobs.ts +2 -2
- package/src/summary/documentSchema.ts +631 -0
- package/src/summary/index.ts +10 -1
- package/src/summary/orderedClientElection.ts +7 -7
- package/src/summary/runWhileConnectedCoordinator.ts +3 -2
- package/src/summary/runningSummarizer.ts +22 -20
- package/src/summary/summarizer.ts +17 -15
- package/src/summary/summarizerClientElection.ts +3 -2
- package/src/summary/summarizerHeuristics.ts +4 -2
- package/src/summary/summarizerNode/summarizerNode.ts +20 -18
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +3 -2
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +16 -8
- package/src/summary/summarizerTypes.ts +7 -3
- package/src/summary/summaryCollection.ts +3 -3
- package/src/summary/summaryFormat.ts +14 -26
- package/src/summary/summaryGenerator.ts +12 -15
- package/src/summary/summaryManager.ts +16 -13
- package/api-extractor-cjs.json +0 -8
- package/dist/container-runtime-alpha.d.ts +0 -1753
- package/dist/container-runtime-beta.d.ts +0 -268
- package/dist/container-runtime-public.d.ts +0 -268
- package/dist/container-runtime-untrimmed.d.ts +0 -1893
- package/lib/container-runtime-alpha.d.ts +0 -1753
- package/lib/container-runtime-beta.d.ts +0 -268
- package/lib/container-runtime-public.d.ts +0 -268
- package/lib/container-runtime-untrimmed.d.ts +0 -1893
- package/lib/test/batchTracker.spec.js +0 -88
- package/lib/test/batchTracker.spec.js.map +0 -1
- package/lib/test/blobManager.spec.js +0 -835
- package/lib/test/blobManager.spec.js.map +0 -1
- package/lib/test/channelCollection.spec.js +0 -141
- package/lib/test/channelCollection.spec.js.map +0 -1
- package/lib/test/containerRuntime.spec.js +0 -1748
- package/lib/test/containerRuntime.spec.js.map +0 -1
- package/lib/test/dataStoreContext.spec.js +0 -801
- package/lib/test/dataStoreContext.spec.js.map +0 -1
- package/lib/test/dataStoreCreation.spec.js +0 -312
- package/lib/test/dataStoreCreation.spec.js.map +0 -1
- package/lib/test/dataStoreRegistry.spec.js +0 -26
- package/lib/test/dataStoreRegistry.spec.js.map +0 -1
- package/lib/test/fuzz/fuzzUtils.js +0 -66
- package/lib/test/fuzz/fuzzUtils.js.map +0 -1
- package/lib/test/fuzz/summarizer.fuzz.spec.js +0 -31
- package/lib/test/fuzz/summarizer.fuzz.spec.js.map +0 -1
- package/lib/test/fuzz/summarizerFuzzMocks.js +0 -162
- package/lib/test/fuzz/summarizerFuzzMocks.js.map +0 -1
- package/lib/test/fuzz/summarizerFuzzSuite.js +0 -106
- package/lib/test/fuzz/summarizerFuzzSuite.js.map +0 -1
- package/lib/test/gc/garbageCollection.spec.js +0 -1465
- package/lib/test/gc/garbageCollection.spec.js.map +0 -1
- package/lib/test/gc/gcConfigs.spec.js +0 -690
- package/lib/test/gc/gcConfigs.spec.js.map +0 -1
- package/lib/test/gc/gcHelpers.spec.js +0 -110
- package/lib/test/gc/gcHelpers.spec.js.map +0 -1
- package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +0 -68
- package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +0 -1
- package/lib/test/gc/gcStats.spec.js +0 -391
- package/lib/test/gc/gcStats.spec.js.map +0 -1
- package/lib/test/gc/gcSummaryStateTracker.spec.js +0 -228
- package/lib/test/gc/gcSummaryStateTracker.spec.js.map +0 -1
- package/lib/test/gc/gcTelemetry.spec.js +0 -530
- package/lib/test/gc/gcTelemetry.spec.js.map +0 -1
- package/lib/test/gc/gcUnitTestHelpers.js +0 -29
- package/lib/test/gc/gcUnitTestHelpers.js.map +0 -1
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js +0 -192
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +0 -1
- package/lib/test/getPendingBlobs.spec.js +0 -193
- package/lib/test/getPendingBlobs.spec.js.map +0 -1
- package/lib/test/hardwareStats.spec.js +0 -93
- package/lib/test/hardwareStats.spec.js.map +0 -1
- package/lib/test/index.js +0 -6
- package/lib/test/index.js.map +0 -1
- package/lib/test/opLifecycle/OpGroupingManager.spec.js +0 -225
- package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +0 -1
- package/lib/test/opLifecycle/batchManager.spec.js +0 -189
- package/lib/test/opLifecycle/batchManager.spec.js.map +0 -1
- package/lib/test/opLifecycle/opCompressor.spec.js +0 -74
- package/lib/test/opLifecycle/opCompressor.spec.js.map +0 -1
- package/lib/test/opLifecycle/opDecompressor.spec.js +0 -218
- package/lib/test/opLifecycle/opDecompressor.spec.js.map +0 -1
- package/lib/test/opLifecycle/opSplitter.spec.js +0 -272
- package/lib/test/opLifecycle/opSplitter.spec.js.map +0 -1
- package/lib/test/opLifecycle/outbox.spec.js +0 -675
- package/lib/test/opLifecycle/outbox.spec.js.map +0 -1
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +0 -196
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +0 -1
- package/lib/test/pendingStateManager.spec.js +0 -329
- package/lib/test/pendingStateManager.spec.js.map +0 -1
- package/lib/test/scheduleManager.spec.js +0 -270
- package/lib/test/scheduleManager.spec.js.map +0 -1
- package/lib/test/summarizerNode.spec.js +0 -326
- package/lib/test/summarizerNode.spec.js.map +0 -1
- package/lib/test/summarizerNodeWithGc.spec.js +0 -318
- package/lib/test/summarizerNodeWithGc.spec.js.map +0 -1
- package/lib/test/summary/orderedClientElection.spec.js +0 -535
- package/lib/test/summary/orderedClientElection.spec.js.map +0 -1
- package/lib/test/summary/runningSummarizer.spec.js +0 -1349
- package/lib/test/summary/runningSummarizer.spec.js.map +0 -1
- package/lib/test/summary/summarizer.spec.js +0 -29
- package/lib/test/summary/summarizer.spec.js.map +0 -1
- package/lib/test/summary/summarizerClientElection.spec.js +0 -436
- package/lib/test/summary/summarizerClientElection.spec.js.map +0 -1
- package/lib/test/summary/summarizerHeuristics.spec.js +0 -289
- package/lib/test/summary/summarizerHeuristics.spec.js.map +0 -1
- package/lib/test/summary/summaryCollection.spec.js +0 -200
- package/lib/test/summary/summaryCollection.spec.js.map +0 -1
- package/lib/test/summary/summaryManager.spec.js +0 -430
- package/lib/test/summary/summaryManager.spec.js.map +0 -1
- package/lib/test/summary/testQuorumClients.js +0 -34
- package/lib/test/summary/testQuorumClients.js.map +0 -1
- package/lib/test/throttler.spec.js +0 -175
- package/lib/test/throttler.spec.js.map +0 -1
- package/lib/test/types/validateContainerRuntimePrevious.generated.js +0 -180
- package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +0 -1
- /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":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAoB,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAEN,uBAAuB,EACvB,qBAAqB,EAErB,wBAAwB,EACxB,oBAAoB,EAGpB,cAAc,GAId,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAC3C,IAAI,qBAAqB,GAAW,CAAC,CAAC;IACtC,MAAM,gBAAgB,GAAG;QACxB,IAAI,kBAAkB;YACrB,OAAO,qBAAqB,CAAC;QAC9B,CAAC;KACD,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IACpC,IAAI,0BAA0B,GAAG,CAAC,CAAC;IACnC,MAAM,wBAAwB,GAAG,IAAI,iBAAiB,EAA8B,CAAC;IACrF,IAAI,QAAkC,CAAC;IACvC,IAAI,cAA8B,CAAC;IAEnC,MAAM,iBAAiB,GAAG;QACzB,eAAe,EAAE,CAAC;QAClB,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;QACvB,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;KAC1B,CAAC;IAEF,MAAM,kBACL,SAAQ,iBAAmC;QAD5C;;YAIQ,cAAS,GAAG,KAAK,CAAC;QAa1B,CAAC;QAVO,OAAO;YACb,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;QAEM,UAAU;YAChB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3B,CAAC;KACD;IAED,MAAM,cAAe,SAAQ,iBAAoC;QACxD,cAAc;YACrB,MAAM,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAChC,CAAC;QAOD;YACC,KAAK,EAAE,CAAC;YANF,UAAK,GAAyC,YAAY,CAAC;YAClD,iBAAY,GAAG,IAAI,QAAQ,EAAsB,CAAC;YAClD,gBAAW,GAAG,IAAI,QAAQ,EAAQ,CAAC;YA2BnC,sBAAiB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YAChD,qBAAgB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAvB/D,CAAC;QACM,KAAK,CAAC,aAAa;YACzB,IAAI,CAAC,cAAc,EAAE,CAAC;QACvB,CAAC;QACD,IAAW,SAAS;YACnB,qFAAqF;YACrF,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC;QACjC,CAAC;QACM,KAAK,KAAI,CAAC;QACV,IAAI,CAAC,MAAe;YAC1B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QACM,KAAK,CAAC,GAAG,CAAC,UAAkB;YAClC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,oEAAoE;YACpE,YAAY,CAAC,IAAI,CAAC,QAAS,EAAE,CAAC,CAAC,CAAC;YAChC,OAAO,8BAA8B,CAAC;QACvC,CAAC;QAID,IAAW,cAAc;YACxB,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;QAC9B,CAAC;QACD,IAAW,MAAM;YAChB,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;QAC9B,CAAC;KACD;IAED,IAAI,cAAkC,CAAC;IACvC,IAAI,UAA0B,CAAC;IAE/B,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtF,SAAS,SAAS,CACjB,QAAgB,EAChB,cAAsB,EACtB,WAAW,GAAG,IAAI,EAClB,IAAa;QAEb,IAAI,cAAc,GAAG,qBAAqB,EAAE;YAC3C,qBAAqB,GAAG,cAAc,CAAC;SACvC;QACD,MAAM,OAAO,GAA0C;YACtD,IAAI;YACJ,YAAY,EAAE,EAAE,WAAW,EAAE;SAC7B,CAAC;QACF,MAAM,CAAC,GAAwC,EAAE,OAAO,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAqB;YAChC,MAAM,EAAE,CAA+B;YACvC,cAAc;SACd,CAAC;QACF,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IACD,SAAS,YAAY,CAAC,QAAgB,EAAE,OAAO,GAAG,CAAC;QAClD,qBAAqB,IAAI,OAAO,CAAC;QACjC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,iBAAiB,GAAG,KAAK,IAA0B,EAAE;QAC1D,UAAU,GAAG,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC;QAC1C,MAAM,QAAQ,GAAG,GAAG,QAAQ,aAAa,CAAC;QAC1C,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC/B,SAAS,CAAC,QAAQ,EAAE,qBAAqB,EAAE,KAAK,EAAE,oBAAoB,CAAC,CAAC;QACxE,OAAO,UAAU,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG;QACjB,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,CAAC;QACd,QAAQ;YACP,OAAO,IAAI,CAAC,OAAO,CAAC;QACrB,CAAC;QACD,UAAU,EAAE,CAAC;QACb,aAAa,EAAE,CAAC;QAChB,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;KAChB,CAAC;IAEF,SAAS,cAAc,CACtB,iBAA4D,EAAE,EAC9D,YAAkC;QAElC,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,cAAc,EAAE;YAC5C,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;SACxB;QACD,QAAQ,GAAG,IAAI,wBAAwB,CACtC,UAAU,CAAC,iBAAiB,EAAE,EAC9B,wBAAwB,EACxB,IAAI,qBAAqB,CACxB,UAAU,CAAC,iBAAiB,EAAE,EAC9B,IAAI,uBAAuB,CAAC,UAAU,EAAE,gBAAgB,EAAE,UAAU,CAAC,EACrE,YAAY,IAAI,qBAAqB,EACrC,wBAAwB,CAAC,gBAAgB,CACzC,EACD,MAAM,CACN,CAAC;QACF,cAAc,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAC1C,cAAc,GAAG,IAAI,cAAc,CAClC,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT;YACC,cAAc,EAAE,CAAC;YACjB,uBAAuB,EAAE,CAAC;SAC1B,CACD,CAAC;QACF,cAAc,CAAC,KAAK,EAAE,CAAC;QACvB,QAAQ,CAAC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAC5C,cAAc,CAAC,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC;QACpD,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE,CAAC,0BAA0B,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,SAAS,SAAS,CAAC,OAAO,GAAG,CAAC;QAC7B,qBAAqB,IAAI,OAAO,CAAC;QACjC,wBAAwB,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,cAAc,EAAE,qBAAqB,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,SAAS,UAAU,CAAC,OAAO,GAAG,CAAC;QAC9B,qBAAqB,IAAI,OAAO,CAAC;QACjC,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;YACrD,cAAc,EAAE,qBAAqB;SACrC,CAAC,CAAC;IACJ,CAAC;IAED,SAAS,WAAW,CACnB,UAA8B,EAC9B,gBAAoC,EACpC,WAAmB,EACnB,OAAe;QAEf,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,sBAAsB,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC1F,MAAM,CAAC,WAAW,CACjB,eAAe,EACf,QAAQ,CAAC,eAAe,EACxB,0BAA0B,OAAO,EAAE,CACnC,CAAC;QACF,MAAM,CAAC,WAAW,CACjB,eAAe,EACf,QAAQ,CAAC,eAAe,EACxB,0BAA0B,OAAO,EAAE,CACnC,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,UAAU,EAAE,qBAAqB,OAAO,EAAE,CAAC,CAAC;QAChF,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,gBAAgB,EAAE,qBAAqB,OAAO,EAAE,CAAC,CAAC;QACtF,MAAM,CAAC,WAAW,CAAC,sBAAsB,EAAE,WAAW,EAAE,kBAAkB,OAAO,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,SAAS,CAAC,GAAG,EAAE;QACd,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC;QACvB,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,wBAAwB,CAAC,kBAAkB,EAAE,CAAC;QAC9C,UAAU,CAAC,kBAAkB,EAAE,CAAC;QAChC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAC9B,qBAAqB,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;YACtG,qBAAqB,GAAG,GAAG,CAAC;YAC5B,cAAc,CACb;gBACC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;gBACd,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;aACd,EACD;gBACC,eAAe,EAAE,SAAS;gBAC1B,eAAe,EAAE,SAAS;gBAC1B,sBAAsB,EAAE,GAAG;aAC3B,CACD,CAAC;YACF,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,4BAA4B,CAAC,CAAC;YACrE,SAAS,EAAE,CAAC;YACZ,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,kCAAkC,CAAC,CAAC;YAC/D,cAAc,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,aAAa,EAAE,CAAC;YACtB,WAAW,CAAC,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,mCAAmC,CAAC,CAAC;YAC3E,cAAc,CAAC,UAAU,EAAE,CAAC;YAC5B,MAAM,aAAa,EAAE,CAAC;YACtB,WAAW,CAAC,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,gDAAgD,CAAC,CAAC;YACxF,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,aAAa,EAAE,CAAC;YACtB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,2BAA2B,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;YACtG,qBAAqB,GAAG,GAAG,CAAC;YAC5B,cAAc,CACb;gBACC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;gBACd,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;aACd,EACD,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,sBAAsB,EAAE,GAAG,EAAE,CAC3E,CAAC;YACF,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,4BAA4B,CAAC,CAAC;YACrE,SAAS,EAAE,CAAC;YACZ,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,kCAAkC,CAAC,CAAC;YAC/D,cAAc,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,aAAa,EAAE,CAAC;YACtB,WAAW,CAAC,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,mCAAmC,CAAC,CAAC;YAC3E,cAAc,CAAC,UAAU,EAAE,CAAC;YAC5B,MAAM,aAAa,EAAE,CAAC;YACtB,WAAW,CAAC,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,gDAAgD,CAAC,CAAC;YACxF,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,aAAa,EAAE,CAAC;YACtB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,2BAA2B,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;YAC1F,qBAAqB,GAAG,GAAG,CAAC;YAC5B,cAAc,CACb;gBACC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;gBACd,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;aACd,EACD,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,sBAAsB,EAAE,GAAG,EAAE,CAC7E,CAAC;YACF,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,iCAAiC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACpD,qBAAqB,GAAG,GAAG,CAAC;YAC5B,cAAc,CAAC,EAAE,EAAE;gBAClB,eAAe,EAAE,SAAS;gBAC1B,eAAe,EAAE,SAAS;gBAC1B,sBAAsB,EAAE,GAAG;aAC3B,CAAC,CAAC;YACH,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,4BAA4B,CAAC,CAAC;YACrE,SAAS,EAAE,CAAC;YACZ,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,0BAA0B,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACzE,qBAAqB,GAAG,GAAG,CAAC;YAC5B,cAAc,CAAC,EAAE,EAAE;gBAClB,eAAe,EAAE,GAAG;gBACpB,eAAe,EAAE,GAAG;gBACpB,sBAAsB,EAAE,GAAG;aAC3B,CAAC,CAAC;YACH,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACzD,cAAc,CAAC,EAAE,EAAE;gBAClB,eAAe,EAAE,SAAS;gBAC1B,eAAe,EAAE,SAAS;gBAC1B,sBAAsB,EAAE,EAAE;aAC1B,CAAC,CAAC;YACH,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,2CAA2C,CAAC,CAAC;YAEnF,wCAAwC;YACxC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1B,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,uCAAuC,CAAC,CAAC;YAE/E,uCAAuC;YACvC,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;YACzB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,qDAAqD,CAAC,CAAC;YACjF,cAAc,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,aAAa,EAAE,CAAC;YACtB,WAAW,CAAC,cAAc,EAAE,GAAG,EAAE,EAAE,EAAE,mCAAmC,CAAC,CAAC;YAE1E,8BAA8B;YAC9B,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;YAC3B,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;YACzB,WAAW,CACV,cAAc,EACd,GAAG,EACH,EAAE,EACF,kDAAkD,CAClD,CAAC;YAEF,wCAAwC;YACxC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvB,cAAc,CAAC,UAAU,EAAE,CAAC;YAC5B,WAAW,CAAC,cAAc,EAAE,GAAG,EAAE,EAAE,EAAE,6BAA6B,CAAC,CAAC;YACpE,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,aAAa,EAAE,CAAC;YACtB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,0DAA0D,CAAC,CAAC;YACvF,cAAc,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,aAAa,EAAE,CAAC;YACtB,WAAW,CAAC,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,6BAA6B,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC/D,qBAAqB,GAAG,IAAI,CAAC;YAC7B,cAAc,CACb;gBACC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;gBACd,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;aACd,EACD,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAC5E,CAAC;YACF,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,uCAAuC,CAAC,CAAC;YACrE,cAAc,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,aAAa,EAAE,CAAC;YACtB,WAAW,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,6BAA6B,CAAC,CAAC;YAEtE,8CAA8C;YAC9C,SAAS,CAAC,MAAM,CAAC,CAAC;YAClB,WAAW,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,+BAA+B,CAAC,CAAC;YAExE,iFAAiF;YACjF,SAAS,EAAE,CAAC;YACZ,WAAW,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,8BAA8B,CAAC,CAAC;YACvE,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,aAAa,EAAE,CAAC;YACtB,WAAW,CACV,cAAc,EACd,GAAG,EACH,IAAI,EACJ,6DAA6D,CAC7D,CAAC;YAEF,mGAAmG;YACnG,SAAS,CAAC,MAAM,CAAC,CAAC;YAClB,WAAW,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,8CAA8C,CAAC,CAAC;YACvF,SAAS,EAAE,CAAC;YACZ,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,aAAa,EAAE,CAAC;YACtB,WAAW,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,0BAA0B,CAAC,CAAC;YAEnE,mDAAmD;YACnD,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvB,cAAc,CAAC,UAAU,EAAE,CAAC;YAC5B,WAAW,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,6BAA6B,CAAC,CAAC;YACtE,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,aAAa,EAAE,CAAC;YACtB,WAAW,CACV,GAAG,EACH,GAAG,EACH,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,EAC3B,0DAA0D,CAC1D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC5D,qBAAqB,GAAG,IAAI,CAAC;YAC7B,cAAc,CACb;gBACC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;gBACd,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;aACd,EACD,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAC9E,CAAC;YACF,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,gCAAgC,CAAC,CAAC;YAE9D,8CAA8C;YAC9C,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;YACxB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,+BAA+B,CAAC,CAAC;YAE7D,mDAAmD;YACnD,UAAU,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,sCAAsC,CAAC,CAAC;YAE7E,yCAAyC;YACzC,SAAS,CAAC,MAAM,CAAC,CAAC;YAClB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,iDAAiD,CAAC,CAAC;YAExF,6EAA6E;YAC7E,SAAS,EAAE,CAAC;YACZ,WAAW,CACV,GAAG,EACH,GAAG,EACH,MAAM,GAAG,IAAI,EACb,0DAA0D,CAC1D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC7C,qBAAqB,GAAG,IAAI,CAAC;YAC7B,cAAc,CACb;gBACC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;gBACd,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;aACd,EACD,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAC5E,CAAC;YACF,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,uCAAuC,CAAC,CAAC;YAErE,8CAA8C;YAC9C,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;YACxB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,+BAA+B,CAAC,CAAC;YAE7D,qDAAqD;YACrD,SAAS,EAAE,CAAC;YACZ,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,iDAAiD,CAAC,CAAC;YAE/E,sDAAsD;YACtD,SAAS,CAAC,MAAM,CAAC,CAAC;YAClB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,8CAA8C,CAAC,CAAC;YAC5E,SAAS,EAAE,CAAC;YACZ,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,6CAA6C,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YACnD,cAAc,EAAE,CAAC;YACjB,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,2CAA2C,CAAC,CAAC;YAElF,wCAAwC;YACxC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1B,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,uCAAuC,CAAC,CAAC;YAE9E,uCAAuC;YACvC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YACxB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,qDAAqD,CAAC,CAAC;YAEhF,8BAA8B;YAC9B,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1B,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YACxB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,kDAAkD,CAAC,CAAC;YAE7E,wCAAwC;YACxC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,0DAA0D,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACzD,cAAc,CAAC;gBACd,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;gBACd,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;aACd,CAAC,CAAC;YACH,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,+CAA+C,CAAC,CAAC;YAE1E,8CAA8C;YAC9C,SAAS,CAAC,MAAM,CAAC,CAAC;YAClB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,+BAA+B,CAAC,CAAC;YAE1D,uDAAuD;YACvD,SAAS,EAAE,CAAC;YACZ,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,8BAA8B,CAAC,CAAC;YAEzD,kEAAkE;YAClE,SAAS,CAAC,MAAM,CAAC,CAAC;YAClB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,8CAA8C,CAAC,CAAC;YACzE,SAAS,EAAE,CAAC;YACZ,WAAW,CACV,GAAG,EACH,GAAG,EACH,CAAC,EACD,mEAAmE,CACnE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACvD,cAAc,CAAC;gBACd,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;gBACd,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;aACd,CAAC,CAAC;YACH,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,kDAAkD,CAAC,CAAC;YAE7E,8CAA8C;YAC9C,SAAS,CAAC,MAAM,CAAC,CAAC;YAClB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,+BAA+B,CAAC,CAAC;YAE1D,mDAAmD;YACnD,UAAU,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,sCAAsC,CAAC,CAAC;YAE1E,wCAAwC;YACxC,SAAS,CAAC,MAAM,CAAC,CAAC;YAClB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,iDAAiD,CAAC,CAAC;YAErF,6CAA6C;YAC7C,SAAS,EAAE,CAAC;YACZ,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,gDAAgD,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC7C,cAAc,CACb;gBACC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;gBACd,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;gBAChB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;aACd,EACD,SAAS,CACT,CAAC;YACF,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,+CAA+C,CAAC,CAAC;YAE1E,8CAA8C;YAC9C,SAAS,CAAC,MAAM,CAAC,CAAC;YAClB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,+BAA+B,CAAC,CAAC;YAE1D,yCAAyC;YACzC,SAAS,EAAE,CAAC;YACZ,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,iDAAiD,CAAC,CAAC;YAE5E,kEAAkE;YAClE,SAAS,CAAC,MAAM,CAAC,CAAC;YAClB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,8CAA8C,CAAC,CAAC;YACzE,SAAS,EAAE,CAAC;YACZ,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,6DAA6D,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { 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"]}
|