@fluidframework/container-runtime 2.0.0-dev-rc.2.0.0.245554 → 2.0.0-dev-rc.3.0.0.250606
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api-report/container-runtime.api.md +81 -27
- package/dist/batchTracker.d.ts +1 -1
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +2 -2
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +3 -3
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +3 -3
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +6 -5
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +57 -19
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +2 -2
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +3 -3
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/container-runtime-alpha.d.ts +205 -12
- package/dist/container-runtime-beta.d.ts +16 -3
- package/dist/container-runtime-public.d.ts +16 -3
- package/dist/container-runtime-untrimmed.d.ts +207 -26
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +32 -26
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +235 -133
- 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 +2 -2
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +4 -4
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +18 -18
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.d.ts +4 -0
- package/dist/dataStoreRegistry.d.ts.map +1 -1
- package/dist/dataStoreRegistry.js +2 -2
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/deltaScheduler.d.ts +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +1 -1
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +1 -1
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +1 -1
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts +1 -1
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +1 -1
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- 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/definitions.d.ts +1 -19
- 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 +2 -3
- 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 +60 -61
- 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 +9 -11
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +11 -3
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +48 -38
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +18 -17
- 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.map +1 -1
- package/dist/scheduleManager.d.ts +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +6 -2
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/documentSchema.d.ts +178 -0
- package/dist/summary/documentSchema.d.ts.map +1 -0
- package/dist/summary/documentSchema.js +345 -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 +7 -2
- 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.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +2 -2
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +2 -2
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +2 -2
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +2 -2
- 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.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +2 -2
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +3 -3
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +3 -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 +1 -1
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +5 -16
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +2 -2
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +2 -2
- 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 +2 -2
- package/dist/summary/summaryManager.js.map +1 -1
- 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 +3 -3
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +5 -5
- package/lib/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts +6 -5
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +59 -21
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +2 -2
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +3 -3
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/container-runtime-alpha.d.ts +205 -12
- package/lib/container-runtime-beta.d.ts +16 -3
- package/lib/container-runtime-public.d.ts +16 -3
- package/lib/container-runtime-untrimmed.d.ts +207 -26
- package/lib/containerHandleContext.d.ts.map +1 -1
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +32 -26
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +197 -95
- 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 +2 -2
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +4 -4
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +3 -3
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.d.ts +4 -0
- package/lib/dataStoreRegistry.d.ts.map +1 -1
- package/lib/dataStoreRegistry.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/gc/garbageCollection.d.ts +1 -1
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +3 -3
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts +1 -1
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +1 -1
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +1 -1
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +1 -1
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +1 -1
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- 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/definitions.d.ts +1 -19
- 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 +60 -61
- 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 +7 -10
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +11 -3
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +46 -37
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +18 -17
- 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.map +1 -1
- package/lib/scheduleManager.d.ts +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +6 -2
- package/lib/scheduleManager.js.map +1 -1
- package/lib/summary/documentSchema.d.ts +178 -0
- package/lib/summary/documentSchema.d.ts.map +1 -0
- package/lib/summary/documentSchema.js +341 -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.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +2 -2
- 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 +2 -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.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +2 -2
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +4 -4
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +3 -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 +5 -16
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +1 -1
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +2 -2
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +3 -3
- 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 +2 -2
- package/lib/summary/summaryManager.js.map +1 -1
- package/lib/test/blobManager.spec.js +3 -3
- package/lib/test/blobManager.spec.js.map +1 -1
- package/lib/test/containerRuntime.spec.js +6 -4
- package/lib/test/containerRuntime.spec.js.map +1 -1
- package/lib/test/dataStoreContext.spec.js +4 -4
- package/lib/test/dataStoreContext.spec.js.map +1 -1
- package/lib/test/dataStoreCreation.spec.js +1 -1
- package/lib/test/dataStoreCreation.spec.js.map +1 -1
- package/lib/test/dataStoreRegistry.spec.js.map +1 -1
- package/lib/test/documentSchema.spec.js +282 -0
- package/lib/test/documentSchema.spec.js.map +1 -0
- package/lib/test/fuzz/fuzzUtils.js +11 -7
- package/lib/test/fuzz/fuzzUtils.js.map +1 -1
- package/lib/test/fuzz/summarizer.fuzz.spec.js +9 -7
- package/lib/test/fuzz/summarizer.fuzz.spec.js.map +1 -1
- package/lib/test/fuzz/summarizerFuzzMocks.js +43 -25
- package/lib/test/fuzz/summarizerFuzzMocks.js.map +1 -1
- package/lib/test/fuzz/summarizerFuzzSuite.js +7 -4
- package/lib/test/fuzz/summarizerFuzzSuite.js.map +1 -1
- package/lib/test/gc/garbageCollection.spec.js +5 -5
- package/lib/test/gc/garbageCollection.spec.js.map +1 -1
- package/lib/test/gc/gcConfigs.spec.js +2 -2
- package/lib/test/gc/gcConfigs.spec.js.map +1 -1
- package/lib/test/gc/gcHelpers.spec.js.map +1 -1
- package/lib/test/gc/gcStats.spec.js +2 -2
- package/lib/test/gc/gcStats.spec.js.map +1 -1
- package/lib/test/gc/gcSummaryStateTracker.spec.js +1 -1
- package/lib/test/gc/gcSummaryStateTracker.spec.js.map +1 -1
- package/lib/test/gc/gcTelemetry.spec.js +3 -3
- package/lib/test/gc/gcTelemetry.spec.js.map +1 -1
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js +1 -1
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +1 -1
- package/lib/test/getPendingBlobs.spec.js +1 -1
- package/lib/test/getPendingBlobs.spec.js.map +1 -1
- package/lib/test/hardwareStats.spec.js +1 -1
- package/lib/test/hardwareStats.spec.js.map +1 -1
- package/lib/test/opLifecycle/OpGroupingManager.spec.js +95 -118
- package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +1 -1
- package/lib/test/opLifecycle/batchManager.spec.js +1 -1
- package/lib/test/opLifecycle/batchManager.spec.js.map +1 -1
- package/lib/test/opLifecycle/opCompressor.spec.js +0 -1
- package/lib/test/opLifecycle/opCompressor.spec.js.map +1 -1
- package/lib/test/opLifecycle/opDecompressor.spec.js +60 -55
- package/lib/test/opLifecycle/opDecompressor.spec.js.map +1 -1
- package/lib/test/opLifecycle/opSplitter.spec.js +56 -41
- package/lib/test/opLifecycle/opSplitter.spec.js.map +1 -1
- package/lib/test/opLifecycle/outbox.spec.js +118 -10
- package/lib/test/opLifecycle/outbox.spec.js.map +1 -1
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +115 -91
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +1 -1
- package/lib/test/pendingStateManager.spec.js +1 -1
- package/lib/test/pendingStateManager.spec.js.map +1 -1
- package/lib/test/scheduleManager.spec.js +1 -1
- package/lib/test/scheduleManager.spec.js.map +1 -1
- package/lib/test/summarizerNode.spec.js +1 -1
- package/lib/test/summarizerNode.spec.js.map +1 -1
- package/lib/test/summarizerNodeWithGc.spec.js +1 -1
- package/lib/test/summarizerNodeWithGc.spec.js.map +1 -1
- package/lib/test/summary/runningSummarizer.spec.js +4 -4
- package/lib/test/summary/runningSummarizer.spec.js.map +1 -1
- package/lib/test/summary/summarizer.spec.js.map +1 -1
- package/lib/test/summary/summarizerClientElection.spec.js +2 -2
- package/lib/test/summary/summarizerClientElection.spec.js.map +1 -1
- package/lib/test/summary/summarizerHeuristics.spec.js +1 -1
- package/lib/test/summary/summarizerHeuristics.spec.js.map +1 -1
- package/lib/test/summary/summaryCollection.spec.js +1 -1
- package/lib/test/summary/summaryCollection.spec.js.map +1 -1
- package/lib/test/summary/summaryManager.spec.js +3 -3
- package/lib/test/summary/summaryManager.spec.js.map +1 -1
- package/lib/test/throttler.spec.js +1 -1
- package/lib/test/throttler.spec.js.map +1 -1
- package/lib/test/types/validateContainerRuntimePrevious.generated.js +6 -4
- package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +1 -1
- package/package.json +35 -21
- package/src/batchTracker.ts +3 -3
- package/src/blobManager.ts +15 -15
- package/src/channelCollection.ts +90 -44
- package/src/connectionTelemetry.ts +10 -10
- package/src/containerHandleContext.ts +1 -1
- package/src/containerRuntime.ts +375 -213
- package/src/dataStore.ts +2 -2
- package/src/dataStoreContext.ts +19 -19
- package/src/dataStoreContexts.ts +2 -2
- package/src/dataStoreRegistry.ts +2 -1
- package/src/deltaScheduler.ts +1 -1
- package/src/gc/garbageCollection.ts +12 -12
- package/src/gc/gcConfigs.ts +11 -11
- package/src/gc/gcDefinitions.ts +2 -2
- package/src/gc/gcHelpers.ts +2 -2
- package/src/gc/gcSummaryStateTracker.ts +4 -4
- package/src/gc/gcTelemetry.ts +6 -6
- package/src/index.ts +8 -1
- package/src/messageTypes.ts +18 -5
- package/src/opLifecycle/README.md +89 -0
- package/src/opLifecycle/definitions.ts +1 -20
- package/src/opLifecycle/index.ts +3 -9
- package/src/opLifecycle/opCompressor.ts +4 -5
- package/src/opLifecycle/opDecompressor.ts +83 -100
- package/src/opLifecycle/opGroupingManager.ts +9 -12
- package/src/opLifecycle/opSplitter.ts +73 -47
- package/src/opLifecycle/outbox.ts +26 -37
- package/src/opLifecycle/remoteMessageProcessor.ts +41 -55
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +2 -2
- package/src/scheduleManager.ts +8 -7
- package/src/summary/documentSchema.ts +553 -0
- package/src/summary/index.ts +10 -1
- package/src/summary/orderedClientElection.ts +7 -5
- package/src/summary/runWhileConnectedCoordinator.ts +1 -1
- package/src/summary/runningSummarizer.ts +19 -19
- package/src/summary/summarizer.ts +14 -14
- package/src/summary/summarizerClientElection.ts +2 -2
- package/src/summary/summarizerHeuristics.ts +2 -2
- package/src/summary/summarizerNode/summarizerNode.ts +15 -15
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +1 -1
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +4 -4
- package/src/summary/summarizerTypes.ts +3 -3
- package/src/summary/summaryCollection.ts +3 -3
- package/src/summary/summaryFormat.ts +8 -19
- package/src/summary/summaryGenerator.ts +10 -10
- package/src/summary/summaryManager.ts +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summaryManager.spec.js","sourceRoot":"","sources":["../../../src/test/summary/summaryManager.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport sinon from \"sinon\";\nimport { Deferred } from \"@fluidframework/core-utils\";\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { IFluidHandle, IFluidLoadable } from \"@fluidframework/core-interfaces\";\nimport {\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tMessageType,\n} from \"@fluidframework/protocol-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { MockDeltaManager } from \"@fluidframework/test-runtime-utils\";\nimport { IDeltaManager } from \"@fluidframework/container-definitions\";\nimport { DefaultSummaryConfiguration } from \"../../containerRuntime.js\";\nimport {\n\tIConnectedEvents,\n\tIConnectedState,\n\tISummaryManagerConfig,\n\tSummaryManager,\n\tSummaryManagerState,\n\tSummarizer,\n\tISummarizer,\n\tISummarizerEvents,\n\tSummarizerStopReason,\n\tISummarizerClientElection,\n\tISummarizerClientElectionEvents,\n\tRunningSummarizer,\n\tSummarizeHeuristicData,\n\tSummaryCollection,\n\tISummaryOpMessage,\n\tneverCancelledSummaryToken,\n\tISummarizerRuntime,\n} from \"../../summary/index.js\";\n\nclass MockRuntime {\n\tconstructor(\n\t\tpublic readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t) {}\n\tpublic on(\n\t\t_event: \"op\",\n\t\t_listener: (op: ISequencedDocumentMessage, runtimeMessage?: boolean) => void,\n\t) {\n\t\treturn this;\n\t}\n\n\tpublic off(\n\t\t_event: \"op\",\n\t\t_listener: (op: ISequencedDocumentMessage, runtimeMessage?: boolean) => void,\n\t) {\n\t\treturn this;\n\t}\n}\n\ndescribe(\"Summary Manager\", () => {\n\tlet clock: sinon.SinonFakeTimers;\n\tbefore(() => {\n\t\tclock = sinon.useFakeTimers();\n\t});\n\tafter(() => clock.restore());\n\tconst flushPromises = async () => new Promise((resolve) => process.nextTick(resolve));\n\tconst thisClientId = \"this\";\n\tconst mockLogger = new MockLogger();\n\tconst mockDeltaManager = new MockDeltaManager();\n\tconst mockRuntime = new MockRuntime(mockDeltaManager);\n\tlet summaryManager: SummaryManager;\n\tlet runningSummarizer: RunningSummarizer;\n\t// let runCount: number;\n\tconst summarizerClientId = \"test\";\n\n\t// Fake objects\n\tconst summaryCollection = new SummaryCollection(\n\t\tmockDeltaManager,\n\t\tmockLogger.toTelemetryLogger(),\n\t);\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\tconst summaryOp: ISummaryOpMessage = {\n\t\tclientId: \"clientId\",\n\t\tclientSequenceNumber: 5,\n\t\tminimumSequenceNumber: 5,\n\t\treferenceSequenceNumber: 5,\n\t\tsequenceNumber: 6,\n\t\ttimestamp: 6,\n\t\ttype: MessageType.Summarize,\n\t\tcontents: {\n\t\t\thandle: \"OpHandle\",\n\t\t\thead: \"head\",\n\t\t\tmessage: \"message\",\n\t\t\tparents: [\"parents\"],\n\t\t},\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 = thisClientId;\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\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t}\n\t\tpublic async setSummarizer(): Promise<Summarizer> {\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\trunningSummarizer = await RunningSummarizer.start(\n\t\t\t\tmockLogger,\n\t\t\t\tsummaryCollection.createWatcher(summarizerClientId),\n\t\t\t\t{\n\t\t\t\t\t...DefaultSummaryConfiguration,\n\t\t\t\t\t...{\n\t\t\t\t\t\tinitialSummarizerDelayMs: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// submitSummaryCallback\n\t\t\t\tasync (options) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstage: \"base\",\n\t\t\t\t\t\tminimumSequenceNumber: 0,\n\t\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\t\terror: undefined,\n\t\t\t\t\t} as const;\n\t\t\t\t},\n\t\t\t\tasync (options) => {},\n\t\t\t\tnew SummarizeHeuristicData(0, { refSequenceNumber: 0, summaryTime: Date.now() }),\n\t\t\t\tsummaryCollection,\n\t\t\t\tneverCancelledSummaryToken,\n\t\t\t\t// stopSummarizerCallback\n\t\t\t\t(reason) => {},\n\t\t\t\tmockRuntime as any as ISummarizerRuntime,\n\t\t\t);\n\t\t\tawait Promise.all([this.stopDeferred.promise, this.runDeferred.promise]);\n\t\t\tawait runningSummarizer.waitStop(true);\n\t\t\tthis.state = \"stopped\";\n\t\t\treturn \"summarizerClientDisconnected\";\n\t\t}\n\n\t\tpublic readonly summarizeOnDemand: ISummarizer[\"summarizeOnDemand\"] = () =>\n\t\t\tthis.notImplemented();\n\t\tpublic readonly enqueueSummarize: ISummarizer[\"enqueueSummarize\"] = () =>\n\t\t\tthis.notImplemented();\n\t\tpublic get IFluidLoadable(): IFluidLoadable {\n\t\t\treturn this.notImplemented();\n\t\t}\n\t\tpublic get handle(): IFluidHandle {\n\t\t\treturn this.notImplemented();\n\t\t}\n\t}\n\n\tclass TestSummarizerClientElection\n\t\textends TypedEventEmitter<ISummarizerClientElectionEvents>\n\t\timplements ISummarizerClientElection\n\t{\n\t\tpublic electedClientId: string | undefined;\n\t\tpublic get electedParentId() {\n\t\t\treturn this.electedClientId;\n\t\t}\n\n\t\tpublic electClient(clientId: string | undefined) {\n\t\t\tthis.electedClientId = clientId;\n\t\t\tthis.emit(\"electedSummarizerChanged\");\n\t\t}\n\t}\n\n\tlet clientElection: TestSummarizerClientElection;\n\tlet connectedState: TestConnectedState;\n\tlet summarizer: TestSummarizer;\n\tlet requestCalls = 0;\n\tlet requestDeferred = new Deferred<void>();\n\n\t/**\n\t * Mocks the request Summarizer function by incrementing a call counter.\n\t * The requestDeferred object must be resolved outside of this function\n\t * by calling completeSummarizerRequest() before this function will complete.\n\t * This is used to simulate delaying the request call for testing the\n\t * SummaryManager state machine timings.\n\t */\n\tconst requestSummarizer = async (): Promise<ISummarizer> => {\n\t\tsummarizer = new TestSummarizer();\n\t\trequestCalls++;\n\t\trequestDeferred = new Deferred();\n\t\tawait requestDeferred.promise;\n\t\treturn summarizer;\n\t};\n\n\t/** Completes the pending request Summarizer call. */\n\tconst completeSummarizerRequest = () => requestDeferred.resolve();\n\n\tfunction createSummaryManager({\n\t\tconnected = false,\n\t\t...config\n\t}: Readonly<Partial<{ connected?: boolean } & ISummaryManagerConfig>> = {}) {\n\t\tconnectedState = new TestConnectedState();\n\t\tif (connected) {\n\t\t\tconnectedState.connect();\n\t\t}\n\t\tclientElection = new TestSummarizerClientElection();\n\t\tsummaryManager = new SummaryManager(\n\t\t\tclientElection,\n\t\t\tconnectedState,\n\t\t\tsummaryCollection,\n\t\t\tmockLogger,\n\t\t\trequestSummarizer,\n\t\t\tthrottler,\n\t\t\tconfig,\n\t\t);\n\t\tsummaryManager.start();\n\t}\n\n\tfunction assertState(expectedState: SummaryManagerState, message: string) {\n\t\tassert.strictEqual(summaryManager.currentState, expectedState, message);\n\t}\n\n\tfunction assertRequests(count: number, message?: string) {\n\t\tconst prefix = message ? `${message} - ` : \"\";\n\t\tassert.strictEqual(requestCalls, count, `${prefix}Unexpected request count`);\n\t}\n\n\tafterEach(() => {\n\t\tclientElection.removeAllListeners();\n\t\tsummarizer.removeAllListeners();\n\t\tconnectedState.removeAllListeners();\n\t\tthrottler.delayMs = 0;\n\t\tmockDeltaManager.lastSequenceNumber = 0;\n\t\trequestCalls = 0;\n\t\tclock.reset();\n\t});\n\n\tit(\"Should become summarizer if connected, then elected; stop summarizer after disconnect\", async () => {\n\t\tcreateSummaryManager({ opsToBypassInitialDelay: 0 });\n\t\tassertState(SummaryManagerState.Off, \"should start off\");\n\t\tconnectedState.connect();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"connected but not yet elected\");\n\t\tclientElection.electClient(\"other\");\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"connected but other client elected\");\n\t\tclientElection.electClient(thisClientId);\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"should request summarizer\");\n\t\tassertRequests(1, \"should have requested summarizer\");\n\t\tcompleteSummarizerRequest();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\tconnectedState.disconnect();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Stopping, \"should be stopping after disconnect\");\n\t\tsummarizer.runDeferred.resolve();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"should be off after summarizer finishes running\");\n\t\tassertRequests(1, \"should not have requested summarizer again\");\n\t});\n\n\tit(\"Should become summarizer if elected, then connected; stop summarizer after unelected\", async () => {\n\t\tcreateSummaryManager({ opsToBypassInitialDelay: 0, initialDelayMs: 0 });\n\t\tassertState(SummaryManagerState.Off, \"should start off\");\n\t\tclientElection.electClient(thisClientId);\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"elected but not yet connected\");\n\t\tconnectedState.connect();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"should request summarizer\");\n\t\tassertRequests(1, \"should have requested summarizer\");\n\t\tcompleteSummarizerRequest();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\tclientElection.electClient(\"other\");\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Stopping, \"should be stopping after other client elected\");\n\t\tsummarizer.runDeferred.resolve();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"should be off after summarizer finishes running\");\n\t\tassertRequests(1, \"should not have requested summarizer again\");\n\t});\n\n\tit(\"Should restart if summarizer closes itself\", async () => {\n\t\tcreateSummaryManager({ opsToBypassInitialDelay: 0 });\n\t\tassertState(SummaryManagerState.Off, \"should start off\");\n\t\tconnectedState.connect();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"connected but not yet elected\");\n\t\tclientElection.electClient(thisClientId);\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"should request summarizer\");\n\t\tassertRequests(1, \"should have requested summarizer\");\n\t\tcompleteSummarizerRequest();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\tsummarizer.stop(); // Simulate summarizer stopping itself\n\t\tsummarizer.runDeferred.resolve();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"should restart itself\");\n\t\tassertRequests(2, \"should have requested a new summarizer\");\n\t\tcompleteSummarizerRequest();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"should be running new summarizer\");\n\t});\n\n\tdescribe(\"Start Summarizer Delay\", () => {\n\t\tit(\"Should wait for initial delay before first start\", async () => {\n\t\t\tmockDeltaManager.lastSequenceNumber = 999; // 999 < 1000, so do not bypass\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 2000,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Starting, \"should enter starting state immediately\");\n\t\t\tclock.tick(1999);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"should not have requested summarizer yet\");\n\t\t\tclock.tick(1);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer after initial delay\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\tit(\"Should bypass initial delay if enough ops have already passed\", async () => {\n\t\t\tmockDeltaManager.lastSequenceNumber = 1000; // seq >= opsToBypass, so bypass\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 2000,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"should enter starting state immediately\");\n\t\t\tassertRequests(1, \"should request summarizer immediately, bypassing initial delay\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\t// This test attempts to validate a case where summarizer client does not wait\n\t\t// initial delay if there are enough unsummarized ops.\n\t\t// The way it was implemented (and tested here) is that it only worked if given\n\t\t// client was selected to be a summarizer in the past, then got disconnected and later\n\t\t// again was elected a summarizer and at that moment we had enough ops to cut short wait.\n\t\t// If we want to cut short such wait, we should do it properly by listening for incoming ops\n\t\t// and cut wait short based on op count when a single op triggers overflow, i.e.\n\t\t// make it work in main scenario, not some corner case that does not matter.\n\t\t// Issue #7273 tracks making appropriate product and test change and re-enable the test.\n\t\tit(\"Should bypass initial delay if enough ops pass later\", async () => {\n\t\t\tmockDeltaManager.lastSequenceNumber = 500;\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 2000,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Starting, \"should enter starting state immediately\");\n\t\t\tclock.tick(1999);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"should not have requested summarizer yet\");\n\t\t\tmockDeltaManager.lastSequenceNumber = 999; // seq < opsToBypass. No bypass.\n\t\t\tmockDeltaManager.emit(\"op\", summaryOp);\n\t\t\tclientElection.electClient(thisClientId); // force trigger refresh\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"still should not have requested summarizer yet\");\n\t\t\tmockDeltaManager.lastSequenceNumber = 1000; // Bypass now\n\t\t\tmockDeltaManager.emit(\"op\", summaryOp);\n\t\t\tclientElection.electClient(thisClientId); // force trigger refresh\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer, bypassing initial delay\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\tit(\"Should bypass initial delay if enough ops pass and summarize if disconnected\", async () => {\n\t\t\tmockDeltaManager.lastSequenceNumber = 1001; // seq > opsToBypass\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 0,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tconnectedState.disconnect(); // To enforce stopReasonCanRunLastSummary == true.\n\t\t\tawait flushPromises();\n\t\t\tmockDeltaManager.emit(\"op\", summaryOp);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer and run the last summary.\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\tit(\"Should create last summary when summarizer created without delay, then disconnected\", async () => {\n\t\t\tthrottler.delayMs = 0;\n\t\t\tcreateSummaryManager({\n\t\t\t\topsToBypassInitialDelay: 0,\n\t\t\t\tconnected: false,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Off, \"not connected\");\n\t\t\tmockDeltaManager.lastSequenceNumber = 10001;\n\t\t\tconnectedState.connect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"Summarizer should be starting\");\n\t\t\tassertRequests(1, \"Should begin without delay\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"Should be running\");\n\t\t\tconnectedState.disconnect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Stopping, \"Should be stopping\");\n\t\t});\n\n\t\tit(\"Should wait for throttler delay before starting summarizer\", async () => {\n\t\t\tthrottler.delayMs = 100;\n\t\t\tcreateSummaryManager({\n\t\t\t\topsToBypassInitialDelay: 0,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Starting, \"should enter starting state immediately\");\n\t\t\tclock.tick(99);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"should not have requested summarizer yet\");\n\t\t\tclock.tick(1);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer after throttler delay\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\tit(\"Should wait for longer delay (initial) before starting summarizer\", async () => {\n\t\t\tthrottler.delayMs = 100;\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 2000,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Starting, \"should enter starting state immediately\");\n\t\t\tclock.tick(1999);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"should not have requested summarizer yet\");\n\t\t\tclock.tick(1);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer after both delays\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\tit(\"Should wait for longer delay (throttler) before starting summarizer\", async () => {\n\t\t\tthrottler.delayMs = 100;\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 50,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Starting, \"should enter starting state immediately\");\n\t\t\tclock.tick(99);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"should not have requested summarizer yet\");\n\t\t\tclock.tick(1);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer after both delays\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"summaryManager.spec.js","sourceRoot":"","sources":["../../../src/test/summary/summaryManager.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { IDeltaManager } from \"@fluidframework/container-definitions\";\nimport { IFluidHandle, IFluidLoadable } from \"@fluidframework/core-interfaces\";\nimport { Deferred } from \"@fluidframework/core-utils\";\nimport {\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tMessageType,\n} from \"@fluidframework/protocol-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { MockDeltaManager } from \"@fluidframework/test-runtime-utils\";\nimport sinon from \"sinon\";\nimport { DefaultSummaryConfiguration } from \"../../containerRuntime.js\";\nimport {\n\tIConnectedEvents,\n\tIConnectedState,\n\tISummarizer,\n\tISummarizerClientElection,\n\tISummarizerClientElectionEvents,\n\tISummarizerEvents,\n\tISummarizerRuntime,\n\tISummaryManagerConfig,\n\tISummaryOpMessage,\n\tRunningSummarizer,\n\tSummarizeHeuristicData,\n\tSummarizer,\n\tSummarizerStopReason,\n\tSummaryCollection,\n\tSummaryManager,\n\tSummaryManagerState,\n\tneverCancelledSummaryToken,\n} from \"../../summary/index.js\";\n\nclass MockRuntime {\n\tconstructor(\n\t\tpublic readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t) {}\n\tpublic on(\n\t\t_event: \"op\",\n\t\t_listener: (op: ISequencedDocumentMessage, runtimeMessage?: boolean) => void,\n\t) {\n\t\treturn this;\n\t}\n\n\tpublic off(\n\t\t_event: \"op\",\n\t\t_listener: (op: ISequencedDocumentMessage, runtimeMessage?: boolean) => void,\n\t) {\n\t\treturn this;\n\t}\n}\n\ndescribe(\"Summary Manager\", () => {\n\tlet clock: sinon.SinonFakeTimers;\n\tbefore(() => {\n\t\tclock = sinon.useFakeTimers();\n\t});\n\tafter(() => clock.restore());\n\tconst flushPromises = async () => new Promise((resolve) => process.nextTick(resolve));\n\tconst thisClientId = \"this\";\n\tconst mockLogger = new MockLogger();\n\tconst mockDeltaManager = new MockDeltaManager();\n\tconst mockRuntime = new MockRuntime(mockDeltaManager);\n\tlet summaryManager: SummaryManager;\n\tlet runningSummarizer: RunningSummarizer;\n\t// let runCount: number;\n\tconst summarizerClientId = \"test\";\n\n\t// Fake objects\n\tconst summaryCollection = new SummaryCollection(\n\t\tmockDeltaManager,\n\t\tmockLogger.toTelemetryLogger(),\n\t);\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\tconst summaryOp: ISummaryOpMessage = {\n\t\tclientId: \"clientId\",\n\t\tclientSequenceNumber: 5,\n\t\tminimumSequenceNumber: 5,\n\t\treferenceSequenceNumber: 5,\n\t\tsequenceNumber: 6,\n\t\ttimestamp: 6,\n\t\ttype: MessageType.Summarize,\n\t\tcontents: {\n\t\t\thandle: \"OpHandle\",\n\t\t\thead: \"head\",\n\t\t\tmessage: \"message\",\n\t\t\tparents: [\"parents\"],\n\t\t},\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 = thisClientId;\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\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t}\n\t\tpublic async setSummarizer(): Promise<Summarizer> {\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\trunningSummarizer = await RunningSummarizer.start(\n\t\t\t\tmockLogger,\n\t\t\t\tsummaryCollection.createWatcher(summarizerClientId),\n\t\t\t\t{\n\t\t\t\t\t...DefaultSummaryConfiguration,\n\t\t\t\t\t...{\n\t\t\t\t\t\tinitialSummarizerDelayMs: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// submitSummaryCallback\n\t\t\t\tasync (options) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstage: \"base\",\n\t\t\t\t\t\tminimumSequenceNumber: 0,\n\t\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\t\terror: undefined,\n\t\t\t\t\t} as const;\n\t\t\t\t},\n\t\t\t\tasync (options) => {},\n\t\t\t\tnew SummarizeHeuristicData(0, { refSequenceNumber: 0, summaryTime: Date.now() }),\n\t\t\t\tsummaryCollection,\n\t\t\t\tneverCancelledSummaryToken,\n\t\t\t\t// stopSummarizerCallback\n\t\t\t\t(reason) => {},\n\t\t\t\tmockRuntime as any as ISummarizerRuntime,\n\t\t\t);\n\t\t\tawait Promise.all([this.stopDeferred.promise, this.runDeferred.promise]);\n\t\t\tawait runningSummarizer.waitStop(true);\n\t\t\tthis.state = \"stopped\";\n\t\t\treturn \"summarizerClientDisconnected\";\n\t\t}\n\n\t\tpublic readonly summarizeOnDemand: ISummarizer[\"summarizeOnDemand\"] = () =>\n\t\t\tthis.notImplemented();\n\t\tpublic readonly enqueueSummarize: ISummarizer[\"enqueueSummarize\"] = () =>\n\t\t\tthis.notImplemented();\n\t\tpublic get IFluidLoadable(): IFluidLoadable {\n\t\t\treturn this.notImplemented();\n\t\t}\n\t\tpublic get handle(): IFluidHandle {\n\t\t\treturn this.notImplemented();\n\t\t}\n\t}\n\n\tclass TestSummarizerClientElection\n\t\textends TypedEventEmitter<ISummarizerClientElectionEvents>\n\t\timplements ISummarizerClientElection\n\t{\n\t\tpublic electedClientId: string | undefined;\n\t\tpublic get electedParentId() {\n\t\t\treturn this.electedClientId;\n\t\t}\n\n\t\tpublic electClient(clientId: string | undefined) {\n\t\t\tthis.electedClientId = clientId;\n\t\t\tthis.emit(\"electedSummarizerChanged\");\n\t\t}\n\t}\n\n\tlet clientElection: TestSummarizerClientElection;\n\tlet connectedState: TestConnectedState;\n\tlet summarizer: TestSummarizer;\n\tlet requestCalls = 0;\n\tlet requestDeferred = new Deferred<void>();\n\n\t/**\n\t * Mocks the request Summarizer function by incrementing a call counter.\n\t * The requestDeferred object must be resolved outside of this function\n\t * by calling completeSummarizerRequest() before this function will complete.\n\t * This is used to simulate delaying the request call for testing the\n\t * SummaryManager state machine timings.\n\t */\n\tconst requestSummarizer = async (): Promise<ISummarizer> => {\n\t\tsummarizer = new TestSummarizer();\n\t\trequestCalls++;\n\t\trequestDeferred = new Deferred();\n\t\tawait requestDeferred.promise;\n\t\treturn summarizer;\n\t};\n\n\t/** Completes the pending request Summarizer call. */\n\tconst completeSummarizerRequest = () => requestDeferred.resolve();\n\n\tfunction createSummaryManager({\n\t\tconnected = false,\n\t\t...config\n\t}: Readonly<Partial<{ connected?: boolean } & ISummaryManagerConfig>> = {}) {\n\t\tconnectedState = new TestConnectedState();\n\t\tif (connected) {\n\t\t\tconnectedState.connect();\n\t\t}\n\t\tclientElection = new TestSummarizerClientElection();\n\t\tsummaryManager = new SummaryManager(\n\t\t\tclientElection,\n\t\t\tconnectedState,\n\t\t\tsummaryCollection,\n\t\t\tmockLogger,\n\t\t\trequestSummarizer,\n\t\t\tthrottler,\n\t\t\tconfig,\n\t\t);\n\t\tsummaryManager.start();\n\t}\n\n\tfunction assertState(expectedState: SummaryManagerState, message: string) {\n\t\tassert.strictEqual(summaryManager.currentState, expectedState, message);\n\t}\n\n\tfunction assertRequests(count: number, message?: string) {\n\t\tconst prefix = message ? `${message} - ` : \"\";\n\t\tassert.strictEqual(requestCalls, count, `${prefix}Unexpected request count`);\n\t}\n\n\tafterEach(() => {\n\t\tclientElection.removeAllListeners();\n\t\tsummarizer.removeAllListeners();\n\t\tconnectedState.removeAllListeners();\n\t\tthrottler.delayMs = 0;\n\t\tmockDeltaManager.lastSequenceNumber = 0;\n\t\trequestCalls = 0;\n\t\tclock.reset();\n\t});\n\n\tit(\"Should become summarizer if connected, then elected; stop summarizer after disconnect\", async () => {\n\t\tcreateSummaryManager({ opsToBypassInitialDelay: 0 });\n\t\tassertState(SummaryManagerState.Off, \"should start off\");\n\t\tconnectedState.connect();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"connected but not yet elected\");\n\t\tclientElection.electClient(\"other\");\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"connected but other client elected\");\n\t\tclientElection.electClient(thisClientId);\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"should request summarizer\");\n\t\tassertRequests(1, \"should have requested summarizer\");\n\t\tcompleteSummarizerRequest();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\tconnectedState.disconnect();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Stopping, \"should be stopping after disconnect\");\n\t\tsummarizer.runDeferred.resolve();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"should be off after summarizer finishes running\");\n\t\tassertRequests(1, \"should not have requested summarizer again\");\n\t});\n\n\tit(\"Should become summarizer if elected, then connected; stop summarizer after unelected\", async () => {\n\t\tcreateSummaryManager({ opsToBypassInitialDelay: 0, initialDelayMs: 0 });\n\t\tassertState(SummaryManagerState.Off, \"should start off\");\n\t\tclientElection.electClient(thisClientId);\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"elected but not yet connected\");\n\t\tconnectedState.connect();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"should request summarizer\");\n\t\tassertRequests(1, \"should have requested summarizer\");\n\t\tcompleteSummarizerRequest();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\tclientElection.electClient(\"other\");\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Stopping, \"should be stopping after other client elected\");\n\t\tsummarizer.runDeferred.resolve();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"should be off after summarizer finishes running\");\n\t\tassertRequests(1, \"should not have requested summarizer again\");\n\t});\n\n\tit(\"Should restart if summarizer closes itself\", async () => {\n\t\tcreateSummaryManager({ opsToBypassInitialDelay: 0 });\n\t\tassertState(SummaryManagerState.Off, \"should start off\");\n\t\tconnectedState.connect();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"connected but not yet elected\");\n\t\tclientElection.electClient(thisClientId);\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"should request summarizer\");\n\t\tassertRequests(1, \"should have requested summarizer\");\n\t\tcompleteSummarizerRequest();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\tsummarizer.stop(); // Simulate summarizer stopping itself\n\t\tsummarizer.runDeferred.resolve();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"should restart itself\");\n\t\tassertRequests(2, \"should have requested a new summarizer\");\n\t\tcompleteSummarizerRequest();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"should be running new summarizer\");\n\t});\n\n\tdescribe(\"Start Summarizer Delay\", () => {\n\t\tit(\"Should wait for initial delay before first start\", async () => {\n\t\t\tmockDeltaManager.lastSequenceNumber = 999; // 999 < 1000, so do not bypass\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 2000,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Starting, \"should enter starting state immediately\");\n\t\t\tclock.tick(1999);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"should not have requested summarizer yet\");\n\t\t\tclock.tick(1);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer after initial delay\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\tit(\"Should bypass initial delay if enough ops have already passed\", async () => {\n\t\t\tmockDeltaManager.lastSequenceNumber = 1000; // seq >= opsToBypass, so bypass\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 2000,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"should enter starting state immediately\");\n\t\t\tassertRequests(1, \"should request summarizer immediately, bypassing initial delay\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\t// This test attempts to validate a case where summarizer client does not wait\n\t\t// initial delay if there are enough unsummarized ops.\n\t\t// The way it was implemented (and tested here) is that it only worked if given\n\t\t// client was selected to be a summarizer in the past, then got disconnected and later\n\t\t// again was elected a summarizer and at that moment we had enough ops to cut short wait.\n\t\t// If we want to cut short such wait, we should do it properly by listening for incoming ops\n\t\t// and cut wait short based on op count when a single op triggers overflow, i.e.\n\t\t// make it work in main scenario, not some corner case that does not matter.\n\t\t// Issue #7273 tracks making appropriate product and test change and re-enable the test.\n\t\tit(\"Should bypass initial delay if enough ops pass later\", async () => {\n\t\t\tmockDeltaManager.lastSequenceNumber = 500;\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 2000,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Starting, \"should enter starting state immediately\");\n\t\t\tclock.tick(1999);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"should not have requested summarizer yet\");\n\t\t\tmockDeltaManager.lastSequenceNumber = 999; // seq < opsToBypass. No bypass.\n\t\t\tmockDeltaManager.emit(\"op\", summaryOp);\n\t\t\tclientElection.electClient(thisClientId); // force trigger refresh\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"still should not have requested summarizer yet\");\n\t\t\tmockDeltaManager.lastSequenceNumber = 1000; // Bypass now\n\t\t\tmockDeltaManager.emit(\"op\", summaryOp);\n\t\t\tclientElection.electClient(thisClientId); // force trigger refresh\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer, bypassing initial delay\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\tit(\"Should bypass initial delay if enough ops pass and summarize if disconnected\", async () => {\n\t\t\tmockDeltaManager.lastSequenceNumber = 1001; // seq > opsToBypass\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 0,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tconnectedState.disconnect(); // To enforce stopReasonCanRunLastSummary == true.\n\t\t\tawait flushPromises();\n\t\t\tmockDeltaManager.emit(\"op\", summaryOp);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer and run the last summary.\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\tit(\"Should create last summary when summarizer created without delay, then disconnected\", async () => {\n\t\t\tthrottler.delayMs = 0;\n\t\t\tcreateSummaryManager({\n\t\t\t\topsToBypassInitialDelay: 0,\n\t\t\t\tconnected: false,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Off, \"not connected\");\n\t\t\tmockDeltaManager.lastSequenceNumber = 10001;\n\t\t\tconnectedState.connect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"Summarizer should be starting\");\n\t\t\tassertRequests(1, \"Should begin without delay\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"Should be running\");\n\t\t\tconnectedState.disconnect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Stopping, \"Should be stopping\");\n\t\t});\n\n\t\tit(\"Should wait for throttler delay before starting summarizer\", async () => {\n\t\t\tthrottler.delayMs = 100;\n\t\t\tcreateSummaryManager({\n\t\t\t\topsToBypassInitialDelay: 0,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Starting, \"should enter starting state immediately\");\n\t\t\tclock.tick(99);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"should not have requested summarizer yet\");\n\t\t\tclock.tick(1);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer after throttler delay\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\tit(\"Should wait for longer delay (initial) before starting summarizer\", async () => {\n\t\t\tthrottler.delayMs = 100;\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 2000,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Starting, \"should enter starting state immediately\");\n\t\t\tclock.tick(1999);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"should not have requested summarizer yet\");\n\t\t\tclock.tick(1);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer after both delays\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\tit(\"Should wait for longer delay (throttler) before starting summarizer\", async () => {\n\t\t\tthrottler.delayMs = 100;\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 50,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Starting, \"should enter starting state immediately\");\n\t\t\tclock.tick(99);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"should not have requested summarizer yet\");\n\t\t\tclock.tick(1);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer after both delays\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\t});\n});\n"]}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { strict as assert } from "assert";
|
|
6
6
|
import sinon from "sinon";
|
|
7
|
-
import { formExponentialFn, formExponentialFnWithAttemptOffset, formLinearFn,
|
|
7
|
+
import { Throttler, formExponentialFn, formExponentialFnWithAttemptOffset, formLinearFn, } from "../throttler.js";
|
|
8
8
|
describe("Throttler", () => {
|
|
9
9
|
let throttler;
|
|
10
10
|
let clock;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"throttler.spec.js","sourceRoot":"","sources":["../../src/test/throttler.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 */\nimport { strict as assert } from \"assert\";\nimport sinon from \"sinon\";\nimport {\n\tformExponentialFn,\n\tformExponentialFnWithAttemptOffset,\n\tformLinearFn,\n\tThrottler,\n} from \"../throttler.js\";\n\ndescribe(\"Throttler\", () => {\n\tlet throttler: Throttler;\n\tlet clock: sinon.SinonFakeTimers;\n\tbefore(() => {\n\t\tclock = sinon.useFakeTimers();\n\t});\n\tafter(() => clock.restore());\n\tafterEach(() => clock.reset());\n\n\tfunction assertAscending(array: readonly number[]) {\n\t\tif (array.length < 1) {\n\t\t\treturn;\n\t\t}\n\t\tlet prev = array[0];\n\t\tfor (const item of array) {\n\t\t\tassert(item >= prev, \"out of order\");\n\t\t\tprev = item;\n\t\t}\n\t}\n\n\tfunction getDelayAndTick(): number {\n\t\tconst delay = throttler.getDelay();\n\t\tclock.tick(delay);\n\t\tassert.strictEqual(\n\t\t\tthrottler.latestAttemptTime,\n\t\t\tDate.now(),\n\t\t\t\"getDelayAndTick should yield latestAttemptTime === now\",\n\t\t);\n\t\tassertAscending(throttler.getAttempts());\n\t\treturn delay;\n\t}\n\n\tfunction runTests({\n\t\tmessage,\n\t\tdelayWindowMs,\n\t\tmaxDelayMs,\n\t\tdelayFn,\n\t\texpectedDelays,\n\t}: {\n\t\tmessage: string;\n\t\tdelayWindowMs: number;\n\t\tmaxDelayMs: number;\n\t\tdelayFn: (numAttempts: number) => number;\n\t\texpectedDelays: number[];\n\t}) {\n\t\tdescribe(message, () => {\n\t\t\tbeforeEach(() => {\n\t\t\t\tthrottler = new Throttler(delayWindowMs, maxDelayMs, delayFn);\n\t\t\t});\n\t\t\tconst expectedMaxAttempts = expectedDelays.length;\n\t\t\tconst expectedDelayAt = (attempt: number) =>\n\t\t\t\tattempt >= expectedMaxAttempts ? maxDelayMs : expectedDelays[attempt];\n\n\t\t\tit(\"Should initially have zero delay\", () => {\n\t\t\t\tassert.strictEqual(throttler.getDelay(), 0);\n\t\t\t});\n\n\t\t\tit(\"Should increase as expected with instant failures\", () => {\n\t\t\t\tfor (const expectedDelay of expectedDelays.concat([\n\t\t\t\t\tmaxDelayMs,\n\t\t\t\t\tmaxDelayMs,\n\t\t\t\t\tmaxDelayMs,\n\t\t\t\t\tmaxDelayMs,\n\t\t\t\t])) {\n\t\t\t\t\tassert.strictEqual(getDelayAndTick(), expectedDelay);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"Should remain zero delay with long pauses between getDelay calls\", () => {\n\t\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\t\tassert.strictEqual(getDelayAndTick(), 0, `iteration ${i}`);\n\t\t\t\t\tclock.tick(delayWindowMs);\n\t\t\t\t}\n\t\t\t\tassert.strictEqual(getDelayAndTick(), 0);\n\n\t\t\t\t// This time barely keep it in the window, giving a delay.\n\t\t\t\tclock.tick(delayWindowMs - 1);\n\t\t\t\tassert.strictEqual(getDelayAndTick(), expectedDelayAt(1));\n\t\t\t});\n\n\t\t\tit(\"Should not increase with long pauses between getDelay calls\", () => {\n\t\t\t\tconst oneThirdTicks = Math.floor(delayWindowMs / 3);\n\t\t\t\tconst remainingTicks = delayWindowMs - 2 * oneThirdTicks;\n\n\t\t\t\t// Accumulate some attempts first.\n\t\t\t\tassert.strictEqual(getDelayAndTick(), 0);\n\t\t\t\tclock.tick(oneThirdTicks);\n\t\t\t\tassert.strictEqual(getDelayAndTick(), expectedDelayAt(1));\n\t\t\t\tclock.tick(oneThirdTicks);\n\t\t\t\tassert.strictEqual(getDelayAndTick(), expectedDelayAt(2));\n\t\t\t\tclock.tick(remainingTicks);\n\n\t\t\t\t// Loop through attempts periodically dropping off.\n\t\t\t\tfor (let i = 0; i < 100; i++) {\n\t\t\t\t\tassert.strictEqual(getDelayAndTick(), expectedDelays[2], `iteration ${i}`);\n\t\t\t\t\tclock.tick(i % 3 === 2 ? remainingTicks : oneThirdTicks);\n\t\t\t\t}\n\t\t\t\tassert.strictEqual(getDelayAndTick(), expectedDelayAt(2));\n\n\t\t\t\t// This time fail instantly, giving a later delay.\n\t\t\t\tassert.strictEqual(getDelayAndTick(), expectedDelayAt(3));\n\t\t\t});\n\n\t\t\tit(\"Should stop increasing number of attempts after max\", () => {\n\t\t\t\tfor (let i = 0; i < expectedMaxAttempts; i++) {\n\t\t\t\t\tgetDelayAndTick();\n\t\t\t\t\tassert.strictEqual(throttler.numAttempts, i + 1, `loop 1; iteration ${i}`);\n\t\t\t\t}\n\t\t\t\tfor (let i = 0; i < 100; i++) {\n\t\t\t\t\tgetDelayAndTick();\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tthrottler.numAttempts,\n\t\t\t\t\t\texpectedMaxAttempts,\n\t\t\t\t\t\t`loop 2; iteration ${i}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"State should be corrected if delay is bypassed\", () => {\n\t\t\t\t// First 2 attempts are allowed to be instant.\n\t\t\t\tassert.strictEqual(getDelayAndTick(), 0);\n\t\t\t\tassert.strictEqual(throttler.getDelay(), expectedDelayAt(1));\n\n\t\t\t\t// This attempt is too soon, since we have not delayed 20ms.\n\t\t\t\tassert.strictEqual(getDelayAndTick(), expectedDelayAt(2));\n\t\t\t});\n\t\t});\n\t}\n\n\trunTests({\n\t\tmessage: \"Exponential Delay\",\n\t\t// 60 second delay window. We ignore attempts that are more\n\t\t// than 60 seconds ago. We are always subtracting the actual\n\t\t// delay time for this window.\n\t\tdelayWindowMs: 60 * 1000,\n\t\t// 30 second maximum delay. After delays reach this length,\n\t\t// subsequent attempts will also use the max delay, unless\n\t\t// enough extra time passes between attempts for some of the\n\t\t// previous start times to drop off out of the window.\n\t\tmaxDelayMs: 30 * 1000,\n\t\t// Exponential delay: [prev x 2 + 20] (0ms, 20ms, 60ms, 140ms, etc)\n\t\t// Equivalent reduction with G = 1, F = 0:\n\t\t/** f(n) = C x (B^n - G) + F = C x B^n + (F - C x G) = C x B^n - C */\n\t\tdelayFn: formExponentialFn({ coefficient: 20, offset: -20 }),\n\t\texpectedDelays: [0, 20, 60, 140, 300, 620, 1260, 2540, 5100, 10220, 20460],\n\t});\n\n\trunTests({\n\t\tmessage: \"Exponential Delay with attempt offset\",\n\t\t// 60 second delay window. We ignore attempts that are more\n\t\t// than 60 seconds ago. We are always subtracting the actual\n\t\t// delay time for this window.\n\t\tdelayWindowMs: 60 * 1000,\n\t\t// 30 second maximum delay. After delays reach this length,\n\t\t// subsequent attempts will also use the max delay, unless\n\t\t// enough extra time passes between attempts for some of the\n\t\t// previous start times to drop off out of the window.\n\t\tmaxDelayMs: 30 * 1000,\n\t\t// Exponential delay: [0, 20, then prev x 2] (0ms, 20ms, 40ms, 80ms, etc)\n\t\t// # | calculation | delay | cumulative delay\n\t\t// ---|-------------------------------|-----------|-----------------\n\t\t// 1 | SPECIAL CASE: 0 = 0 x 20 = | 0 ms | 0 ms\n\t\t// 2 | 2^( 1 - 1) x 20 = 1 x 20 = | 20 ms | 20 ms\n\t\t// 3 | 2^( 2 - 1) x 20 = 2 x 20 = | 40 ms | 60 ms\n\t\t// 4 | 2^( 3 - 1) x 20 = 4 x 20 = | 80 ms | 140 ms\n\t\t// 5 | 2^( 4 - 1) x 20 = 8 x 20 = | 160 ms | 300 ms\n\t\t// 6 | 2^( 5 - 1) x 20 = 16 x 20 = | 320 ms | 620 ms\n\t\t// 7 | 2^( 6 - 1) x 20 = 32 x 20 = | 640 ms | 1,260 ms\n\t\t// 8 | 2^( 7 - 1) x 20 = 64 x 20 = | 1,280 ms | 2,540 ms\n\t\t// 9 | 2^( 8 - 1) x 20 = 128 x 20 = | 2,560 ms | 5,100 ms\n\t\t// 10 | 2^( 9 - 1) x 20 = 256 x 20 = | 5,120 ms | 10,220 ms\n\t\t// 11 | 2^(10 - 1) x 20 = 512 x 20 = | 10,240 ms | 20,460 ms\n\t\t// 12 | 2^(11 - 1) x 20 = 1024 x 20 = | 20,480 ms | 40,940 ms\n\t\t// 13 | 2^(12 - 1) x 20 = 2048 x 20 = | 30,000 ms | 70,940 ms (MAX)\n\t\t// 14 | 2^(13 - 1) x 20 = 5096 x 20 = | 30,000 ms |100,940 ms (MAX)\n\t\tdelayFn: formExponentialFnWithAttemptOffset(-1, {\n\t\t\tcoefficient: 20,\n\t\t\tinitialDelay: 0,\n\t\t}),\n\t\texpectedDelays: [0, 20, 40, 80, 160, 320, 640, 1280, 2560, 5120, 10240, 20480],\n\t});\n\n\trunTests({\n\t\tmessage: \"Linear Delay\",\n\t\t// 60 ms delay window. We ignore attempts that are more\n\t\t// than 60 ms ago. We are always subtracting the actual\n\t\t// delay time for this window.\n\t\tdelayWindowMs: 60,\n\t\t// 30 ms maximum delay. After delays reach this length,\n\t\t// subsequent attempts will also use the max delay, unless\n\t\t// enough extra time passes between attempts for some of the\n\t\t// previous start times to drop off out of the window.\n\t\tmaxDelayMs: 30,\n\t\t// Linear delay: (0ms, 10ms, 20ms, 30ms, etc)\n\t\t// # | calculation | delay | cumulative delay\n\t\t// ---|-------------|-------|-----------------\n\t\t// 1 | 10 x 0 = | 0 ms | 0 ms\n\t\t// 2 | 10 x 1 = | 10 ms | 10 ms\n\t\t// 3 | 10 x 2 = | 20 ms | 30 ms\n\t\t// 4 | 10 x 3 = | 30 ms | 60 ms (MAX)\n\t\t// 5 | 10 x 4 = | 30 ms | 90 ms (MAX)\n\t\tdelayFn: formLinearFn({ coefficient: 10 }),\n\t\texpectedDelays: [0, 10, 20],\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"throttler.spec.js","sourceRoot":"","sources":["../../src/test/throttler.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACN,SAAS,EACT,iBAAiB,EACjB,kCAAkC,EAClC,YAAY,GACZ,MAAM,iBAAiB,CAAC;AAEzB,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IAC1B,IAAI,SAAoB,CAAC;IACzB,IAAI,KAA4B,CAAC;IACjC,MAAM,CAAC,GAAG,EAAE;QACX,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7B,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAE/B,SAAS,eAAe,CAAC,KAAwB;QAChD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACrB,OAAO;SACP;QACD,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACzB,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,cAAc,CAAC,CAAC;YACrC,IAAI,GAAG,IAAI,CAAC;SACZ;IACF,CAAC;IAED,SAAS,eAAe;QACvB,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,iBAAiB,EAC3B,IAAI,CAAC,GAAG,EAAE,EACV,wDAAwD,CACxD,CAAC;QACF,eAAe,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QACzC,OAAO,KAAK,CAAC;IACd,CAAC;IAED,SAAS,QAAQ,CAAC,EACjB,OAAO,EACP,aAAa,EACb,UAAU,EACV,OAAO,EACP,cAAc,GAOd;QACA,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,UAAU,CAAC,GAAG,EAAE;gBACf,SAAS,GAAG,IAAI,SAAS,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;YACH,MAAM,mBAAmB,GAAG,cAAc,CAAC,MAAM,CAAC;YAClD,MAAM,eAAe,GAAG,CAAC,OAAe,EAAE,EAAE,CAC3C,OAAO,IAAI,mBAAmB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAEvE,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;gBAC3C,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;gBAC5D,KAAK,MAAM,aAAa,IAAI,cAAc,CAAC,MAAM,CAAC;oBACjD,UAAU;oBACV,UAAU;oBACV,UAAU;oBACV,UAAU;iBACV,CAAC,EAAE;oBACH,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,aAAa,CAAC,CAAC;iBACrD;YACF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;gBAC3E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC3B,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC;oBAC3D,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;iBAC1B;gBACD,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;gBAEzC,0DAA0D;gBAC1D,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;gBAC9B,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;gBACtE,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;gBACpD,MAAM,cAAc,GAAG,aAAa,GAAG,CAAC,GAAG,aAAa,CAAC;gBAEzD,kCAAkC;gBAClC,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC1B,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1D,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC1B,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1D,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAE3B,mDAAmD;gBACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;oBAC7B,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC;oBAC3E,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;iBACzD;gBACD,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE1D,kDAAkD;gBAClD,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;gBAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mBAAmB,EAAE,CAAC,EAAE,EAAE;oBAC7C,eAAe,EAAE,CAAC;oBAClB,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,qBAAqB,CAAC,EAAE,CAAC,CAAC;iBAC3E;gBACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;oBAC7B,eAAe,EAAE,CAAC;oBAClB,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,WAAW,EACrB,mBAAmB,EACnB,qBAAqB,CAAC,EAAE,CACxB,CAAC;iBACF;YACF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;gBACzD,8CAA8C;gBAC9C,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;gBACzC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE7D,4DAA4D;gBAC5D,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC;QACR,OAAO,EAAE,mBAAmB;QAC5B,2DAA2D;QAC3D,4DAA4D;QAC5D,8BAA8B;QAC9B,aAAa,EAAE,EAAE,GAAG,IAAI;QACxB,2DAA2D;QAC3D,0DAA0D;QAC1D,4DAA4D;QAC5D,sDAAsD;QACtD,UAAU,EAAE,EAAE,GAAG,IAAI;QACrB,mEAAmE;QACnE,0CAA0C;QAC1C,qEAAqE;QACrE,OAAO,EAAE,iBAAiB,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5D,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;KAC1E,CAAC,CAAC;IAEH,QAAQ,CAAC;QACR,OAAO,EAAE,uCAAuC;QAChD,2DAA2D;QAC3D,4DAA4D;QAC5D,8BAA8B;QAC9B,aAAa,EAAE,EAAE,GAAG,IAAI;QACxB,2DAA2D;QAC3D,0DAA0D;QAC1D,4DAA4D;QAC5D,sDAAsD;QACtD,UAAU,EAAE,EAAE,GAAG,IAAI;QACrB,yEAAyE;QACzE,oEAAoE;QACpE,oEAAoE;QACpE,6DAA6D;QAC7D,6DAA6D;QAC7D,6DAA6D;QAC7D,6DAA6D;QAC7D,6DAA6D;QAC7D,6DAA6D;QAC7D,6DAA6D;QAC7D,6DAA6D;QAC7D,6DAA6D;QAC7D,6DAA6D;QAC7D,6DAA6D;QAC7D,6DAA6D;QAC7D,mEAAmE;QACnE,mEAAmE;QACnE,OAAO,EAAE,kCAAkC,CAAC,CAAC,CAAC,EAAE;YAC/C,WAAW,EAAE,EAAE;YACf,YAAY,EAAE,CAAC;SACf,CAAC;QACF,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;KAC9E,CAAC,CAAC;IAEH,QAAQ,CAAC;QACR,OAAO,EAAE,cAAc;QACvB,uDAAuD;QACvD,uDAAuD;QACvD,8BAA8B;QAC9B,aAAa,EAAE,EAAE;QACjB,uDAAuD;QACvD,0DAA0D;QAC1D,4DAA4D;QAC5D,sDAAsD;QACtD,UAAU,EAAE,EAAE;QACd,6CAA6C;QAC7C,8CAA8C;QAC9C,8CAA8C;QAC9C,mCAAmC;QACnC,mCAAmC;QACnC,mCAAmC;QACnC,yCAAyC;QACzC,yCAAyC;QACzC,OAAO,EAAE,YAAY,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QAC1C,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;KAC3B,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 sinon from \"sinon\";\nimport {\n\tThrottler,\n\tformExponentialFn,\n\tformExponentialFnWithAttemptOffset,\n\tformLinearFn,\n} from \"../throttler.js\";\n\ndescribe(\"Throttler\", () => {\n\tlet throttler: Throttler;\n\tlet clock: sinon.SinonFakeTimers;\n\tbefore(() => {\n\t\tclock = sinon.useFakeTimers();\n\t});\n\tafter(() => clock.restore());\n\tafterEach(() => clock.reset());\n\n\tfunction assertAscending(array: readonly number[]) {\n\t\tif (array.length < 1) {\n\t\t\treturn;\n\t\t}\n\t\tlet prev = array[0];\n\t\tfor (const item of array) {\n\t\t\tassert(item >= prev, \"out of order\");\n\t\t\tprev = item;\n\t\t}\n\t}\n\n\tfunction getDelayAndTick(): number {\n\t\tconst delay = throttler.getDelay();\n\t\tclock.tick(delay);\n\t\tassert.strictEqual(\n\t\t\tthrottler.latestAttemptTime,\n\t\t\tDate.now(),\n\t\t\t\"getDelayAndTick should yield latestAttemptTime === now\",\n\t\t);\n\t\tassertAscending(throttler.getAttempts());\n\t\treturn delay;\n\t}\n\n\tfunction runTests({\n\t\tmessage,\n\t\tdelayWindowMs,\n\t\tmaxDelayMs,\n\t\tdelayFn,\n\t\texpectedDelays,\n\t}: {\n\t\tmessage: string;\n\t\tdelayWindowMs: number;\n\t\tmaxDelayMs: number;\n\t\tdelayFn: (numAttempts: number) => number;\n\t\texpectedDelays: number[];\n\t}) {\n\t\tdescribe(message, () => {\n\t\t\tbeforeEach(() => {\n\t\t\t\tthrottler = new Throttler(delayWindowMs, maxDelayMs, delayFn);\n\t\t\t});\n\t\t\tconst expectedMaxAttempts = expectedDelays.length;\n\t\t\tconst expectedDelayAt = (attempt: number) =>\n\t\t\t\tattempt >= expectedMaxAttempts ? maxDelayMs : expectedDelays[attempt];\n\n\t\t\tit(\"Should initially have zero delay\", () => {\n\t\t\t\tassert.strictEqual(throttler.getDelay(), 0);\n\t\t\t});\n\n\t\t\tit(\"Should increase as expected with instant failures\", () => {\n\t\t\t\tfor (const expectedDelay of expectedDelays.concat([\n\t\t\t\t\tmaxDelayMs,\n\t\t\t\t\tmaxDelayMs,\n\t\t\t\t\tmaxDelayMs,\n\t\t\t\t\tmaxDelayMs,\n\t\t\t\t])) {\n\t\t\t\t\tassert.strictEqual(getDelayAndTick(), expectedDelay);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"Should remain zero delay with long pauses between getDelay calls\", () => {\n\t\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\t\tassert.strictEqual(getDelayAndTick(), 0, `iteration ${i}`);\n\t\t\t\t\tclock.tick(delayWindowMs);\n\t\t\t\t}\n\t\t\t\tassert.strictEqual(getDelayAndTick(), 0);\n\n\t\t\t\t// This time barely keep it in the window, giving a delay.\n\t\t\t\tclock.tick(delayWindowMs - 1);\n\t\t\t\tassert.strictEqual(getDelayAndTick(), expectedDelayAt(1));\n\t\t\t});\n\n\t\t\tit(\"Should not increase with long pauses between getDelay calls\", () => {\n\t\t\t\tconst oneThirdTicks = Math.floor(delayWindowMs / 3);\n\t\t\t\tconst remainingTicks = delayWindowMs - 2 * oneThirdTicks;\n\n\t\t\t\t// Accumulate some attempts first.\n\t\t\t\tassert.strictEqual(getDelayAndTick(), 0);\n\t\t\t\tclock.tick(oneThirdTicks);\n\t\t\t\tassert.strictEqual(getDelayAndTick(), expectedDelayAt(1));\n\t\t\t\tclock.tick(oneThirdTicks);\n\t\t\t\tassert.strictEqual(getDelayAndTick(), expectedDelayAt(2));\n\t\t\t\tclock.tick(remainingTicks);\n\n\t\t\t\t// Loop through attempts periodically dropping off.\n\t\t\t\tfor (let i = 0; i < 100; i++) {\n\t\t\t\t\tassert.strictEqual(getDelayAndTick(), expectedDelays[2], `iteration ${i}`);\n\t\t\t\t\tclock.tick(i % 3 === 2 ? remainingTicks : oneThirdTicks);\n\t\t\t\t}\n\t\t\t\tassert.strictEqual(getDelayAndTick(), expectedDelayAt(2));\n\n\t\t\t\t// This time fail instantly, giving a later delay.\n\t\t\t\tassert.strictEqual(getDelayAndTick(), expectedDelayAt(3));\n\t\t\t});\n\n\t\t\tit(\"Should stop increasing number of attempts after max\", () => {\n\t\t\t\tfor (let i = 0; i < expectedMaxAttempts; i++) {\n\t\t\t\t\tgetDelayAndTick();\n\t\t\t\t\tassert.strictEqual(throttler.numAttempts, i + 1, `loop 1; iteration ${i}`);\n\t\t\t\t}\n\t\t\t\tfor (let i = 0; i < 100; i++) {\n\t\t\t\t\tgetDelayAndTick();\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tthrottler.numAttempts,\n\t\t\t\t\t\texpectedMaxAttempts,\n\t\t\t\t\t\t`loop 2; iteration ${i}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"State should be corrected if delay is bypassed\", () => {\n\t\t\t\t// First 2 attempts are allowed to be instant.\n\t\t\t\tassert.strictEqual(getDelayAndTick(), 0);\n\t\t\t\tassert.strictEqual(throttler.getDelay(), expectedDelayAt(1));\n\n\t\t\t\t// This attempt is too soon, since we have not delayed 20ms.\n\t\t\t\tassert.strictEqual(getDelayAndTick(), expectedDelayAt(2));\n\t\t\t});\n\t\t});\n\t}\n\n\trunTests({\n\t\tmessage: \"Exponential Delay\",\n\t\t// 60 second delay window. We ignore attempts that are more\n\t\t// than 60 seconds ago. We are always subtracting the actual\n\t\t// delay time for this window.\n\t\tdelayWindowMs: 60 * 1000,\n\t\t// 30 second maximum delay. After delays reach this length,\n\t\t// subsequent attempts will also use the max delay, unless\n\t\t// enough extra time passes between attempts for some of the\n\t\t// previous start times to drop off out of the window.\n\t\tmaxDelayMs: 30 * 1000,\n\t\t// Exponential delay: [prev x 2 + 20] (0ms, 20ms, 60ms, 140ms, etc)\n\t\t// Equivalent reduction with G = 1, F = 0:\n\t\t/** f(n) = C x (B^n - G) + F = C x B^n + (F - C x G) = C x B^n - C */\n\t\tdelayFn: formExponentialFn({ coefficient: 20, offset: -20 }),\n\t\texpectedDelays: [0, 20, 60, 140, 300, 620, 1260, 2540, 5100, 10220, 20460],\n\t});\n\n\trunTests({\n\t\tmessage: \"Exponential Delay with attempt offset\",\n\t\t// 60 second delay window. We ignore attempts that are more\n\t\t// than 60 seconds ago. We are always subtracting the actual\n\t\t// delay time for this window.\n\t\tdelayWindowMs: 60 * 1000,\n\t\t// 30 second maximum delay. After delays reach this length,\n\t\t// subsequent attempts will also use the max delay, unless\n\t\t// enough extra time passes between attempts for some of the\n\t\t// previous start times to drop off out of the window.\n\t\tmaxDelayMs: 30 * 1000,\n\t\t// Exponential delay: [0, 20, then prev x 2] (0ms, 20ms, 40ms, 80ms, etc)\n\t\t// # | calculation | delay | cumulative delay\n\t\t// ---|-------------------------------|-----------|-----------------\n\t\t// 1 | SPECIAL CASE: 0 = 0 x 20 = | 0 ms | 0 ms\n\t\t// 2 | 2^( 1 - 1) x 20 = 1 x 20 = | 20 ms | 20 ms\n\t\t// 3 | 2^( 2 - 1) x 20 = 2 x 20 = | 40 ms | 60 ms\n\t\t// 4 | 2^( 3 - 1) x 20 = 4 x 20 = | 80 ms | 140 ms\n\t\t// 5 | 2^( 4 - 1) x 20 = 8 x 20 = | 160 ms | 300 ms\n\t\t// 6 | 2^( 5 - 1) x 20 = 16 x 20 = | 320 ms | 620 ms\n\t\t// 7 | 2^( 6 - 1) x 20 = 32 x 20 = | 640 ms | 1,260 ms\n\t\t// 8 | 2^( 7 - 1) x 20 = 64 x 20 = | 1,280 ms | 2,540 ms\n\t\t// 9 | 2^( 8 - 1) x 20 = 128 x 20 = | 2,560 ms | 5,100 ms\n\t\t// 10 | 2^( 9 - 1) x 20 = 256 x 20 = | 5,120 ms | 10,220 ms\n\t\t// 11 | 2^(10 - 1) x 20 = 512 x 20 = | 10,240 ms | 20,460 ms\n\t\t// 12 | 2^(11 - 1) x 20 = 1024 x 20 = | 20,480 ms | 40,940 ms\n\t\t// 13 | 2^(12 - 1) x 20 = 2048 x 20 = | 30,000 ms | 70,940 ms (MAX)\n\t\t// 14 | 2^(13 - 1) x 20 = 5096 x 20 = | 30,000 ms |100,940 ms (MAX)\n\t\tdelayFn: formExponentialFnWithAttemptOffset(-1, {\n\t\t\tcoefficient: 20,\n\t\t\tinitialDelay: 0,\n\t\t}),\n\t\texpectedDelays: [0, 20, 40, 80, 160, 320, 640, 1280, 2560, 5120, 10240, 20480],\n\t});\n\n\trunTests({\n\t\tmessage: \"Linear Delay\",\n\t\t// 60 ms delay window. We ignore attempts that are more\n\t\t// than 60 ms ago. We are always subtracting the actual\n\t\t// delay time for this window.\n\t\tdelayWindowMs: 60,\n\t\t// 30 ms maximum delay. After delays reach this length,\n\t\t// subsequent attempts will also use the max delay, unless\n\t\t// enough extra time passes between attempts for some of the\n\t\t// previous start times to drop off out of the window.\n\t\tmaxDelayMs: 30,\n\t\t// Linear delay: (0ms, 10ms, 20ms, 30ms, etc)\n\t\t// # | calculation | delay | cumulative delay\n\t\t// ---|-------------|-------|-----------------\n\t\t// 1 | 10 x 0 = | 0 ms | 0 ms\n\t\t// 2 | 10 x 1 = | 10 ms | 10 ms\n\t\t// 3 | 10 x 2 = | 20 ms | 30 ms\n\t\t// 4 | 10 x 3 = | 30 ms | 60 ms (MAX)\n\t\t// 5 | 10 x 4 = | 30 ms | 90 ms (MAX)\n\t\tdelayFn: formLinearFn({ coefficient: 10 }),\n\t\texpectedDelays: [0, 10, 20],\n\t});\n});\n"]}
|
|
@@ -45,7 +45,9 @@ use_old_InterfaceDeclaration_ICancellableSummarizerController(get_current_Interf
|
|
|
45
45
|
use_current_InterfaceDeclaration_ICancellationToken(get_old_InterfaceDeclaration_ICancellationToken());
|
|
46
46
|
use_old_InterfaceDeclaration_ICancellationToken(get_current_InterfaceDeclaration_ICancellationToken());
|
|
47
47
|
use_current_InterfaceDeclaration_IChunkedOp(get_old_InterfaceDeclaration_IChunkedOp());
|
|
48
|
-
use_old_InterfaceDeclaration_IChunkedOp(
|
|
48
|
+
use_old_InterfaceDeclaration_IChunkedOp(
|
|
49
|
+
// @ts-expect-error compatibility expected to be broken
|
|
50
|
+
get_current_InterfaceDeclaration_IChunkedOp());
|
|
49
51
|
use_current_InterfaceDeclaration_IClientSummaryWatcher(get_old_InterfaceDeclaration_IClientSummaryWatcher());
|
|
50
52
|
use_old_InterfaceDeclaration_IClientSummaryWatcher(get_current_InterfaceDeclaration_IClientSummaryWatcher());
|
|
51
53
|
use_current_InterfaceDeclaration_ICompressionRuntimeOptions(get_old_InterfaceDeclaration_ICompressionRuntimeOptions());
|
|
@@ -55,7 +57,9 @@ use_old_InterfaceDeclaration_IConnectableRuntime(get_current_InterfaceDeclaratio
|
|
|
55
57
|
use_current_InterfaceDeclaration_IContainerRuntimeMessageCompatDetails(get_old_InterfaceDeclaration_IContainerRuntimeMessageCompatDetails());
|
|
56
58
|
use_old_InterfaceDeclaration_IContainerRuntimeMessageCompatDetails(get_current_InterfaceDeclaration_IContainerRuntimeMessageCompatDetails());
|
|
57
59
|
use_current_InterfaceDeclaration_IContainerRuntimeMetadata(get_old_InterfaceDeclaration_IContainerRuntimeMetadata());
|
|
58
|
-
use_old_InterfaceDeclaration_IContainerRuntimeMetadata(
|
|
60
|
+
use_old_InterfaceDeclaration_IContainerRuntimeMetadata(
|
|
61
|
+
// @ts-expect-error compatibility expected to be broken
|
|
62
|
+
get_current_InterfaceDeclaration_IContainerRuntimeMetadata());
|
|
59
63
|
use_current_InterfaceDeclaration_IContainerRuntimeOptions(
|
|
60
64
|
// @ts-expect-error compatibility expected to be broken
|
|
61
65
|
get_old_InterfaceDeclaration_IContainerRuntimeOptions());
|
|
@@ -150,8 +154,6 @@ use_current_InterfaceDeclaration_RecentlyAddedContainerRuntimeMessageDetails(get
|
|
|
150
154
|
use_old_InterfaceDeclaration_RecentlyAddedContainerRuntimeMessageDetails(get_current_InterfaceDeclaration_RecentlyAddedContainerRuntimeMessageDetails());
|
|
151
155
|
use_current_EnumDeclaration_RuntimeHeaders(get_old_EnumDeclaration_RuntimeHeaders());
|
|
152
156
|
use_old_EnumDeclaration_RuntimeHeaders(get_current_EnumDeclaration_RuntimeHeaders());
|
|
153
|
-
use_current_EnumDeclaration_RuntimeMessage(get_old_EnumDeclaration_RuntimeMessage());
|
|
154
|
-
use_old_EnumDeclaration_RuntimeMessage(get_current_EnumDeclaration_RuntimeMessage());
|
|
155
157
|
use_current_InterfaceDeclaration_SubmitSummaryFailureData(get_old_InterfaceDeclaration_SubmitSummaryFailureData());
|
|
156
158
|
use_old_InterfaceDeclaration_SubmitSummaryFailureData(get_current_InterfaceDeclaration_SubmitSummaryFailureData());
|
|
157
159
|
use_current_TypeAliasDeclaration_SubmitSummaryResult(get_old_TypeAliasDeclaration_SubmitSummaryResult());
|