@fluidframework/container-runtime 2.0.0-rc.2.0.2 → 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 +155 -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 +169 -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 +96 -106
- 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 +107 -52
- 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 +180 -165
- 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 +195 -93
- 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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scheduleManager.spec.js","sourceRoot":"","sources":["../../src/test/scheduleManager.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 { EventEmitter } from \"@fluid-internal/client-utils\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { MockDeltaManager } from \"@fluidframework/test-runtime-utils\";\nimport { createChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { ScheduleManager } from \"../scheduleManager.js\";\n\ndescribe(\"ScheduleManager\", () => {\n\tdescribe(\"Batch processing events\", () => {\n\t\tlet batchBegin: number = 0;\n\t\tlet batchEnd: number = 0;\n\t\tlet sequenceNumber: number = 0;\n\t\tlet emitter: EventEmitter;\n\t\tlet deltaManager: MockDeltaManager;\n\t\tlet scheduleManager: ScheduleManager;\n\t\tconst testClientId = \"test-client\";\n\n\t\tbeforeEach(() => {\n\t\t\temitter = new EventEmitter();\n\t\t\tdeltaManager = new MockDeltaManager();\n\t\t\tdeltaManager.inbound.processCallback = (message: ISequencedDocumentMessage) => {\n\t\t\t\tscheduleManager.beforeOpProcessing(message);\n\t\t\t\tscheduleManager.afterOpProcessing(undefined, message);\n\t\t\t\tdeltaManager.emit(\"op\", message);\n\t\t\t};\n\t\t\tscheduleManager = new ScheduleManager(\n\t\t\t\tdeltaManager,\n\t\t\t\temitter,\n\t\t\t\t() => testClientId,\n\t\t\t\tcreateChildLogger({ namespace: \"fluid:testScheduleManager\" }),\n\t\t\t);\n\n\t\t\temitter.on(\"batchBegin\", () => {\n\t\t\t\t// When we receive a \"batchBegin\" event, we should not have any outstanding\n\t\t\t\t// events, i.e., batchBegin and batchEnd should be equal.\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tbatchBegin,\n\t\t\t\t\tbatchEnd,\n\t\t\t\t\t\"Received batchBegin before previous batchEnd\",\n\t\t\t\t);\n\t\t\t\tbatchBegin++;\n\t\t\t});\n\n\t\t\temitter.on(\"batchEnd\", () => {\n\t\t\t\tbatchEnd++;\n\t\t\t\t// Every \"batchEnd\" event should correspond to a \"batchBegin\" event, i.e.,\n\t\t\t\t// batchBegin and batchEnd should be equal.\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tbatchBegin,\n\t\t\t\t\tbatchEnd,\n\t\t\t\t\t\"Received batchEnd without corresponding batchBegin\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tafterEach(() => {\n\t\t\tbatchBegin = 0;\n\t\t\tbatchEnd = 0;\n\t\t\tsequenceNumber = 0;\n\t\t});\n\n\t\t/**\n\t\t * Pushes single op to the inbound queue. Adds proper sequence numbers to them\n\t\t */\n\t\tfunction pushOp(partialMessage: Partial<ISequencedDocumentMessage>) {\n\t\t\tsequenceNumber++;\n\t\t\tconst message = { ...partialMessage, sequenceNumber };\n\t\t\tdeltaManager.inbound.push(message as ISequencedDocumentMessage);\n\t\t}\n\n\t\t/**\n\t\t * awaits until all ops that could be processed are processed.\n\t\t */\n\t\tasync function processOps() {\n\t\t\tconst inbound = deltaManager.inbound;\n\t\t\twhile (!inbound.paused && inbound.length > 0) {\n\t\t\t\tawait Promise.resolve();\n\t\t\t}\n\t\t}\n\n\t\tit(\"Single non-batch message\", async () => {\n\t\t\tconst message: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\t// Send a non-batch message.\n\t\t\tpushOp(message);\n\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"Did not process all ops\");\n\t\t\tassert.strictEqual(batchBegin, 1, \"Did not receive correct batchBegin events\");\n\t\t\tassert.strictEqual(batchEnd, 1, \"Did not receive correct batchEnd events\");\n\t\t});\n\n\t\tit(\"Multiple non-batch messages\", async () => {\n\t\t\tconst message: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\t// Sent 5 non-batch messages.\n\t\t\tpushOp(message);\n\t\t\tpushOp(message);\n\t\t\tpushOp(message);\n\t\t\tpushOp(message);\n\t\t\tpushOp(message);\n\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"Did not process all ops\");\n\t\t\tassert.strictEqual(batchBegin, 5, \"Did not receive correct batchBegin events\");\n\t\t\tassert.strictEqual(batchEnd, 5, \"Did not receive correct batchEnd events\");\n\t\t});\n\n\t\tit(\"Message with non batch-related metadata\", async () => {\n\t\t\tconst message: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { foo: 1 },\n\t\t\t};\n\n\t\t\tpushOp(message);\n\t\t\tawait processOps();\n\n\t\t\t// We should have a \"batchBegin\" and a \"batchEnd\" event for the batch.\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"Did not process all ops\");\n\t\t\tassert.strictEqual(\n\t\t\t\tbatchBegin,\n\t\t\t\t1,\n\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t);\n\t\t\tassert.strictEqual(batchEnd, 1, \"Did not receive correct batchEnd event for the batch\");\n\t\t});\n\n\t\tit(\"Messages in a single batch\", async () => {\n\t\t\tconst batchBeginMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: true },\n\t\t\t};\n\n\t\t\tconst batchMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\tconst batchEndMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: false },\n\t\t\t};\n\n\t\t\t// Send a batch with 4 messages.\n\t\t\tpushOp(batchBeginMessage);\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchMessage);\n\n\t\t\tawait processOps();\n\t\t\tassert.strictEqual(\n\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t3,\n\t\t\t\t\"Some of partial batch ops were processed\",\n\t\t\t);\n\n\t\t\tpushOp(batchEndMessage);\n\t\t\tawait processOps();\n\n\t\t\t// We should have only received one \"batchBegin\" and one \"batchEnd\" event for the batch.\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"Did not process all ops\");\n\t\t\tassert.strictEqual(\n\t\t\t\tbatchBegin,\n\t\t\t\t1,\n\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t);\n\t\t\tassert.strictEqual(batchEnd, 1, \"Did not receive correct batchEnd event for the batch\");\n\t\t});\n\n\t\tit(\"two batches\", async () => {\n\t\t\tconst batchBeginMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: true },\n\t\t\t};\n\n\t\t\tconst batchMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\tconst batchEndMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: false },\n\t\t\t};\n\n\t\t\t// Pause to not allow ops to be processed while we accumulated them.\n\t\t\tawait deltaManager.inbound.pause();\n\n\t\t\t// Send a batch with 4 messages.\n\t\t\tpushOp(batchBeginMessage);\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchEndMessage);\n\n\t\t\t// Add incomplete batch\n\t\t\tpushOp(batchBeginMessage);\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchMessage);\n\n\t\t\tassert.strictEqual(\n\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t7,\n\t\t\t\t\"none of the batched ops are processed yet\",\n\t\t\t);\n\n\t\t\tvoid deltaManager.inbound.resume();\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(\n\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t3,\n\t\t\t\t\"none of the second batch ops are processed yet\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tbatchBegin,\n\t\t\t\t1,\n\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t);\n\t\t\tassert.strictEqual(batchEnd, 1, \"Did not receive correct batchEnd event for the batch\");\n\n\t\t\t// End the batch - all ops should be processed.\n\t\t\tpushOp(batchEndMessage);\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"processed all ops\");\n\t\t\tassert.strictEqual(\n\t\t\t\tbatchBegin,\n\t\t\t\t2,\n\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t);\n\t\t\tassert.strictEqual(batchEnd, 2, \"Did not receive correct batchEnd event for the batch\");\n\t\t});\n\n\t\tit(\"non-batched ops followed by batch\", async () => {\n\t\t\tconst batchBeginMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: true },\n\t\t\t};\n\n\t\t\tconst batchMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\tconst batchEndMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: false },\n\t\t\t};\n\n\t\t\t// Pause to not allow ops to be processed while we accumulated them.\n\t\t\tawait deltaManager.inbound.pause();\n\n\t\t\t// Send a batch with 2 messages.\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchMessage);\n\n\t\t\t// Add incomplete batch\n\t\t\tpushOp(batchBeginMessage);\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchMessage);\n\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(\n\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t5,\n\t\t\t\t\"none of the batched ops are processed yet\",\n\t\t\t);\n\n\t\t\tvoid deltaManager.inbound.resume();\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(\n\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t3,\n\t\t\t\t\"none of the second batch ops are processed yet\",\n\t\t\t);\n\n\t\t\t// End the batch - all ops should be processed.\n\t\t\tpushOp(batchEndMessage);\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"processed all ops\");\n\t\t\tassert.strictEqual(\n\t\t\t\tbatchBegin,\n\t\t\t\t3,\n\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t);\n\t\t\tassert.strictEqual(batchEnd, 3, \"Did not receive correct batchEnd event for the batch\");\n\t\t});\n\n\t\tfunction testWrongBatches() {\n\t\t\tconst clientId1: string = \"test-client-1\";\n\t\t\tconst clientId2: string = \"test-client-2\";\n\n\t\t\tconst batchBeginMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: clientId1,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: true },\n\t\t\t};\n\n\t\t\tconst batchMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: clientId1,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\tconst messagesToFail: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t// System op from same client\n\t\t\t\t{\n\t\t\t\t\tclientId: clientId1,\n\t\t\t\t\ttype: MessageType.NoOp,\n\t\t\t\t},\n\n\t\t\t\t// Batch messages interleaved with a batch begin message from same client\n\t\t\t\tbatchBeginMessage,\n\n\t\t\t\t// Send a message from another client. This should result in a a violation!\n\t\t\t\t{\n\t\t\t\t\tclientId: clientId2,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t},\n\n\t\t\t\t// Send a message from another client with non batch-related metadata. This should result\n\t\t\t\t// in a \"batchEnd\" event for the previous batch since the client id changes. Also, we\n\t\t\t\t// should get a \"batchBegin\" and a \"batchEnd\" event for the new client.\n\t\t\t\t{\n\t\t\t\t\tclientId: clientId2,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tmetadata: { foo: 1 },\n\t\t\t\t},\n\n\t\t\t\t// Send a batch from another client. This should result in a \"batchEnd\" event for the\n\t\t\t\t// previous batch since the client id changes. Also, we should get one \"batchBegin\" and\n\t\t\t\t// one \"batchEnd\" event for the batch from the new client.\n\t\t\t\t{\n\t\t\t\t\tclientId: clientId2,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tmetadata: { batch: true },\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tlet counter = 0;\n\t\t\tfor (const messageToFail of messagesToFail) {\n\t\t\t\tcounter++;\n\t\t\t\tit(`Partial batch messages, case ${counter}`, async () => {\n\t\t\t\t\t// Send a batch with 3 messages from first client but don't send batch end message.\n\t\t\t\t\tpushOp(batchBeginMessage);\n\t\t\t\t\tpushOp(batchMessage);\n\t\t\t\t\tpushOp(batchMessage);\n\n\t\t\t\t\tawait processOps();\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t\t\t3,\n\t\t\t\t\t\t\"Some of partial batch ops were processed\",\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.throws(() => pushOp(messageToFail));\n\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t\t\t4,\n\t\t\t\t\t\t\"Some of batch ops were processed\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbatchBegin,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbatchEnd,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\ttestWrongBatches();\n\t});\n});\n"]}
|
|
@@ -1,326 +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 { SummaryType, } from "@fluidframework/protocol-definitions";
|
|
7
|
-
import { channelsTreeName, CreateSummarizerNodeSource, } from "@fluidframework/runtime-definitions";
|
|
8
|
-
import { mergeStats } from "@fluidframework/runtime-utils";
|
|
9
|
-
import { TelemetryDataTag, createChildLogger } from "@fluidframework/telemetry-utils";
|
|
10
|
-
import { createRootSummarizerNode } from "../summary/index.js";
|
|
11
|
-
describe("Runtime", () => {
|
|
12
|
-
describe("Summarization", () => {
|
|
13
|
-
describe("Summarizer Node", () => {
|
|
14
|
-
const names = ["root", "mid", "leaf"];
|
|
15
|
-
const ids = ["rootId", "midId", "leafId"];
|
|
16
|
-
let rootNode;
|
|
17
|
-
let midNode;
|
|
18
|
-
let leafNode;
|
|
19
|
-
const logger = createChildLogger();
|
|
20
|
-
let summarizeCalls = [0, 0, 0];
|
|
21
|
-
function assertSummarizeCalls(...expected) {
|
|
22
|
-
for (let i = 0; i < expected.length; i++) {
|
|
23
|
-
assert(expected[i] === summarizeCalls[i], `unexpected ${names[i]} summarize call count: ${expected[i]} !== ${summarizeCalls[i]}`);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
const getSummarizeInternalFn = (depth) => async (fullTree) => {
|
|
27
|
-
summarizeCalls[depth]++;
|
|
28
|
-
return {
|
|
29
|
-
id: ids[depth],
|
|
30
|
-
pathPartsForChildren: undefined,
|
|
31
|
-
stats: mergeStats(),
|
|
32
|
-
summary: { type: SummaryType.Tree, tree: {} },
|
|
33
|
-
};
|
|
34
|
-
};
|
|
35
|
-
function createRoot({ changeSeq = 1, refSeq, ...config } = {}) {
|
|
36
|
-
rootNode = createRootSummarizerNode(logger, getSummarizeInternalFn(0), changeSeq, refSeq, config);
|
|
37
|
-
}
|
|
38
|
-
function createMid(createParam, config) {
|
|
39
|
-
midNode = rootNode.createChild(getSummarizeInternalFn(1), ids[1], createParam, config);
|
|
40
|
-
}
|
|
41
|
-
function createLeaf(createParam, config) {
|
|
42
|
-
leafNode = midNode?.createChild(getSummarizeInternalFn(2), ids[2], createParam, config);
|
|
43
|
-
}
|
|
44
|
-
function expectThrow(fn, failMsg, errMsg, ...expectedErrors) {
|
|
45
|
-
try {
|
|
46
|
-
fn();
|
|
47
|
-
throw Error(`${failMsg}: Expected to fail`);
|
|
48
|
-
}
|
|
49
|
-
catch (error) {
|
|
50
|
-
assert(expectedErrors.some((e) => e === error.message), errMsg);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
async function expectReject(fn, failMsg, errMsg, ...expectedErrors) {
|
|
54
|
-
try {
|
|
55
|
-
await fn();
|
|
56
|
-
throw Error(`${failMsg}: Expected to reject`);
|
|
57
|
-
}
|
|
58
|
-
catch (error) {
|
|
59
|
-
assert(expectedErrors.some((e) => e === error.message), errMsg);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
const summaryRefSeq = 123;
|
|
63
|
-
const fakeOp = (sequenceNumber) =>
|
|
64
|
-
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
65
|
-
({ sequenceNumber });
|
|
66
|
-
const emptySnapshot = { blobs: {}, trees: {} };
|
|
67
|
-
const protocolTree = {
|
|
68
|
-
blobs: { attributes: "protocolAttributes" },
|
|
69
|
-
trees: {},
|
|
70
|
-
};
|
|
71
|
-
const coreSnapshot = {
|
|
72
|
-
blobs: {},
|
|
73
|
-
trees: {
|
|
74
|
-
[ids[1]]: {
|
|
75
|
-
blobs: {},
|
|
76
|
-
trees: {
|
|
77
|
-
[ids[2]]: emptySnapshot,
|
|
78
|
-
},
|
|
79
|
-
},
|
|
80
|
-
},
|
|
81
|
-
};
|
|
82
|
-
const simpleSnapshot = {
|
|
83
|
-
blobs: {},
|
|
84
|
-
trees: {
|
|
85
|
-
...coreSnapshot.trees,
|
|
86
|
-
".protocol": protocolTree,
|
|
87
|
-
},
|
|
88
|
-
};
|
|
89
|
-
const channelsSnapshot = {
|
|
90
|
-
blobs: {},
|
|
91
|
-
trees: {
|
|
92
|
-
[channelsTreeName]: coreSnapshot,
|
|
93
|
-
".protocol": protocolTree,
|
|
94
|
-
},
|
|
95
|
-
};
|
|
96
|
-
beforeEach(() => {
|
|
97
|
-
summarizeCalls = [0, 0, 0];
|
|
98
|
-
});
|
|
99
|
-
describe("Create Child", () => {
|
|
100
|
-
it("Should fail to create child with same id", () => {
|
|
101
|
-
createRoot();
|
|
102
|
-
createMid({ type: CreateSummarizerNodeSource.Local });
|
|
103
|
-
expectThrow(() => createMid({ type: CreateSummarizerNodeSource.Local }), "create child", "child node with same id already exists", "0x1ab");
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
describe("Load Base Summary", () => {
|
|
107
|
-
it("Load base summary should do nothing for simple snapshot", async () => {
|
|
108
|
-
createRoot({ refSeq: 1 });
|
|
109
|
-
rootNode.updateBaseSummaryState(simpleSnapshot);
|
|
110
|
-
const latestSummary = rootNode.latestSummary;
|
|
111
|
-
assert(latestSummary !== undefined, "latest summary should exist");
|
|
112
|
-
assert.strictEqual(latestSummary.additionalPath?.path, undefined, "should not have any path parts for children");
|
|
113
|
-
});
|
|
114
|
-
it("Load base summary should strip channels subtree", async () => {
|
|
115
|
-
createRoot({ refSeq: 1 });
|
|
116
|
-
rootNode.updateBaseSummaryState(channelsSnapshot);
|
|
117
|
-
const latestSummary = rootNode.latestSummary;
|
|
118
|
-
assert(latestSummary !== undefined, "latest summary should exist");
|
|
119
|
-
assert.strictEqual(latestSummary.additionalPath?.path, channelsTreeName, "should have channels path for children");
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
describe("Start Summary", () => {
|
|
123
|
-
it("Should fail startSummary if previous attempt is not completed/cleared", () => {
|
|
124
|
-
createRoot();
|
|
125
|
-
rootNode.startSummary(11, logger, 0);
|
|
126
|
-
expectThrow(() => rootNode.startSummary(12, logger, 0), "start summary", "wip referenceSequenceNumber and logger are still set", "0x19f", "0x1a0");
|
|
127
|
-
});
|
|
128
|
-
it("Should succeed startSummary if previous attempt is completed", async () => {
|
|
129
|
-
createRoot();
|
|
130
|
-
rootNode.startSummary(11, logger, 0);
|
|
131
|
-
await rootNode.summarize(false);
|
|
132
|
-
rootNode.completeSummary("test-handle", true /* validateSummary */);
|
|
133
|
-
rootNode.startSummary(12, logger, 0); // This is 0 since we did not "ack" the latest summary
|
|
134
|
-
});
|
|
135
|
-
it("Should succeed startSummary if previous attempt is cleared", () => {
|
|
136
|
-
createRoot();
|
|
137
|
-
rootNode.startSummary(11, logger, 0);
|
|
138
|
-
rootNode.clearSummary();
|
|
139
|
-
rootNode.startSummary(12, logger, 0); // This is 0 since we did not "ack" the latest summary
|
|
140
|
-
});
|
|
141
|
-
it("Should succeed startSummary with the right sequence number", async () => {
|
|
142
|
-
createRoot();
|
|
143
|
-
rootNode.startSummary(11, logger, 0);
|
|
144
|
-
await rootNode.summarize(false);
|
|
145
|
-
rootNode.completeSummary("test-handle", true /* validateSummary */);
|
|
146
|
-
// Refreshing should be necessary for startSummary to occur
|
|
147
|
-
await rootNode.refreshLatestSummary("test-handle", 11);
|
|
148
|
-
const result = rootNode.startSummary(12, logger, 11);
|
|
149
|
-
assert.strictEqual(result.invalidNodes, 0, "startSummary have succeeded");
|
|
150
|
-
});
|
|
151
|
-
it("Should fail startSummary when missing refresh", async () => {
|
|
152
|
-
createRoot();
|
|
153
|
-
// Need one latest summary
|
|
154
|
-
rootNode.startSummary(11, logger, 0);
|
|
155
|
-
await rootNode.summarize(false);
|
|
156
|
-
rootNode.completeSummary("test-handle", true /* validateSummary */);
|
|
157
|
-
await rootNode.refreshLatestSummary("test-handle", 11);
|
|
158
|
-
// Summary with missing refresh
|
|
159
|
-
rootNode.startSummary(12, logger, 11);
|
|
160
|
-
await rootNode.summarize(false);
|
|
161
|
-
rootNode.completeSummary("test-handle", true /* validateSummary */);
|
|
162
|
-
// Failing to refresh the root node should generate failing summaries
|
|
163
|
-
const result = rootNode.startSummary(21, logger, 12);
|
|
164
|
-
assert.strictEqual(result.invalidNodes, 1, "startSummary fails due to no refresh");
|
|
165
|
-
assert.deepEqual(result.mismatchNumbers, new Set(["12-11"]), "startSummary should have mismatched numbers");
|
|
166
|
-
});
|
|
167
|
-
it("Should fail startSummary with the wrong sequence number", async () => {
|
|
168
|
-
createRoot();
|
|
169
|
-
rootNode.startSummary(11, logger, 0);
|
|
170
|
-
await rootNode.summarize(false);
|
|
171
|
-
rootNode.completeSummary("test-handle", true /* validateSummary */);
|
|
172
|
-
await rootNode.refreshLatestSummary("test-handle", 11);
|
|
173
|
-
const result = rootNode.startSummary(12, logger, 0); // 0 is wrong here (so we can get invalid results)
|
|
174
|
-
assert.strictEqual(result.invalidNodes, 1, "expected failure wrong ref seq");
|
|
175
|
-
assert.deepEqual(result.mismatchNumbers, new Set(["0-11"]), "startSummary have succeeded");
|
|
176
|
-
});
|
|
177
|
-
});
|
|
178
|
-
describe("Validate Summary", () => {
|
|
179
|
-
it("summary validation should fail if summarize not called on root node", () => {
|
|
180
|
-
createRoot();
|
|
181
|
-
rootNode.startSummary(11, logger, 0);
|
|
182
|
-
// Validate summary fails by calling validateSummary.
|
|
183
|
-
const expectedResult = {
|
|
184
|
-
success: false,
|
|
185
|
-
reason: "NodeDidNotSummarize",
|
|
186
|
-
id: {
|
|
187
|
-
tag: TelemetryDataTag.CodeArtifact,
|
|
188
|
-
value: "",
|
|
189
|
-
},
|
|
190
|
-
retryAfterSeconds: 1,
|
|
191
|
-
};
|
|
192
|
-
const result = rootNode.validateSummary();
|
|
193
|
-
assert.deepStrictEqual(result, expectedResult, "validate summary should have failed at the root node");
|
|
194
|
-
// Validate summary fails by calling completeSummary.
|
|
195
|
-
assert.throws(() => rootNode.completeSummary("test-handle", true /* validateSummary */), (error) => {
|
|
196
|
-
const correctErrorMessage = error.message === "NodeDidNotSummarize";
|
|
197
|
-
const correctErrorId = error.id.value === "";
|
|
198
|
-
return correctErrorMessage && correctErrorId;
|
|
199
|
-
}, "Complete summary should have failed at the root node");
|
|
200
|
-
});
|
|
201
|
-
it("summary validation should fail if summarize not called on child node", async () => {
|
|
202
|
-
createRoot();
|
|
203
|
-
createMid({ type: CreateSummarizerNodeSource.Local });
|
|
204
|
-
createLeaf({ type: CreateSummarizerNodeSource.Local });
|
|
205
|
-
rootNode.startSummary(11, logger, 0);
|
|
206
|
-
await rootNode.summarize(false);
|
|
207
|
-
await leafNode?.summarize(false);
|
|
208
|
-
const midNodeId = `/${ids[1]}`;
|
|
209
|
-
// Validate summary fails by calling validateSummary.
|
|
210
|
-
const expectedResult = {
|
|
211
|
-
success: false,
|
|
212
|
-
reason: "NodeDidNotSummarize",
|
|
213
|
-
id: {
|
|
214
|
-
tag: TelemetryDataTag.CodeArtifact,
|
|
215
|
-
value: midNodeId,
|
|
216
|
-
},
|
|
217
|
-
retryAfterSeconds: 1,
|
|
218
|
-
};
|
|
219
|
-
const result = rootNode.validateSummary();
|
|
220
|
-
assert.deepStrictEqual(result, expectedResult, "validate summary should have failed at the mid node");
|
|
221
|
-
assert.throws(() => rootNode.completeSummary("test-handle", true /* validateSummary */), (error) => {
|
|
222
|
-
const correctErrorMessage = error.message === "NodeDidNotSummarize";
|
|
223
|
-
const correctErrorId = error.id.value === midNodeId;
|
|
224
|
-
return correctErrorMessage && correctErrorId;
|
|
225
|
-
}, "Complete summary should have failed at the mid node");
|
|
226
|
-
});
|
|
227
|
-
it("summary validation should fail if summarize not called on leaf node", async () => {
|
|
228
|
-
createRoot();
|
|
229
|
-
createMid({ type: CreateSummarizerNodeSource.Local });
|
|
230
|
-
createLeaf({ type: CreateSummarizerNodeSource.Local });
|
|
231
|
-
rootNode.startSummary(11, logger, 0);
|
|
232
|
-
await rootNode.summarize(false);
|
|
233
|
-
await midNode?.summarize(false);
|
|
234
|
-
const leafNodeId = `/${ids[1]}/${ids[2]}`;
|
|
235
|
-
// Validate summary fails by calling validateSummary.
|
|
236
|
-
const expectedResult = {
|
|
237
|
-
success: false,
|
|
238
|
-
reason: "NodeDidNotSummarize",
|
|
239
|
-
id: {
|
|
240
|
-
tag: TelemetryDataTag.CodeArtifact,
|
|
241
|
-
value: leafNodeId,
|
|
242
|
-
},
|
|
243
|
-
retryAfterSeconds: 1,
|
|
244
|
-
};
|
|
245
|
-
const result = rootNode.validateSummary();
|
|
246
|
-
assert.deepStrictEqual(result, expectedResult, "validate summary should have failed at the leaf node");
|
|
247
|
-
// Validate summary fails by calling completeSummary.
|
|
248
|
-
assert.throws(() => rootNode.completeSummary("test-handle", true /* validateSummary */), (error) => {
|
|
249
|
-
const correctErrorMessage = error.message === "NodeDidNotSummarize";
|
|
250
|
-
const correctErrorId = error.id.value === leafNodeId;
|
|
251
|
-
return correctErrorMessage && correctErrorId;
|
|
252
|
-
}, "Complete summary should have failed at the leaf node");
|
|
253
|
-
});
|
|
254
|
-
});
|
|
255
|
-
describe("Summarize", () => {
|
|
256
|
-
it("Should fail summarize if startSummary is not called", async () => {
|
|
257
|
-
createRoot();
|
|
258
|
-
await expectReject(async () => rootNode.summarize(false), "summarize", "no wip referenceSequenceNumber or logger", "0x1a1", "0x1a2");
|
|
259
|
-
assertSummarizeCalls(0, 0, 0);
|
|
260
|
-
});
|
|
261
|
-
it("Should call summarize internal with later op", async () => {
|
|
262
|
-
createRoot({ refSeq: 11 });
|
|
263
|
-
rootNode.recordChange(fakeOp(12));
|
|
264
|
-
rootNode.startSummary(99, logger, 11);
|
|
265
|
-
const result = await rootNode.summarize(false);
|
|
266
|
-
assertSummarizeCalls(1, 0, 0);
|
|
267
|
-
assert(result.summary.type === SummaryType.Tree, "should be tree");
|
|
268
|
-
});
|
|
269
|
-
it("Should call summarize internal with later invalidate", async () => {
|
|
270
|
-
createRoot({ refSeq: 11 });
|
|
271
|
-
rootNode.invalidate(12);
|
|
272
|
-
rootNode.startSummary(99, logger, 11);
|
|
273
|
-
const result = await rootNode.summarize(false);
|
|
274
|
-
assertSummarizeCalls(1, 0, 0);
|
|
275
|
-
assert(result.summary.type === SummaryType.Tree, "should be tree");
|
|
276
|
-
});
|
|
277
|
-
it("Should not call summarize internal and instead use handle", async () => {
|
|
278
|
-
createRoot({ refSeq: 11 });
|
|
279
|
-
rootNode.recordChange(fakeOp(11));
|
|
280
|
-
rootNode.startSummary(99, logger, 11);
|
|
281
|
-
const result = await rootNode.summarize(false);
|
|
282
|
-
assertSummarizeCalls(0, 0, 0);
|
|
283
|
-
assert(result.summary.type === SummaryType.Handle, "should be handle");
|
|
284
|
-
});
|
|
285
|
-
it("Should call summarize internal always when fullTree true", async () => {
|
|
286
|
-
createRoot({ refSeq: 11 });
|
|
287
|
-
rootNode.recordChange(fakeOp(10));
|
|
288
|
-
rootNode.startSummary(99, logger, 11);
|
|
289
|
-
const result = await rootNode.summarize(true);
|
|
290
|
-
assertSummarizeCalls(1, 0, 0);
|
|
291
|
-
assert(result.summary.type === SummaryType.Tree, "should be tree");
|
|
292
|
-
});
|
|
293
|
-
});
|
|
294
|
-
describe("Refresh Latest Summary", () => {
|
|
295
|
-
it("Should not refresh latest if already passed ref seq number", async () => {
|
|
296
|
-
createRoot({ refSeq: summaryRefSeq });
|
|
297
|
-
const result = await rootNode.refreshLatestSummary("test-handle", summaryRefSeq);
|
|
298
|
-
assert(!result.isSummaryTracked, "we already got this summary");
|
|
299
|
-
});
|
|
300
|
-
it("Should refresh from pending", async () => {
|
|
301
|
-
createRoot();
|
|
302
|
-
const proposalHandle = "test-handle";
|
|
303
|
-
rootNode.startSummary(10, logger, 0);
|
|
304
|
-
await rootNode.summarize(false);
|
|
305
|
-
rootNode.completeSummary(proposalHandle, true /* validateSummary */);
|
|
306
|
-
const result = await rootNode.refreshLatestSummary(proposalHandle, summaryRefSeq);
|
|
307
|
-
assert(result.isSummaryTracked, "should be tracked");
|
|
308
|
-
assert(result.isSummaryNewer === true, "should be newer");
|
|
309
|
-
});
|
|
310
|
-
it("should fail refresh when summary is in progress", async () => {
|
|
311
|
-
createRoot();
|
|
312
|
-
const proposalHandle = "test-handle";
|
|
313
|
-
const referenceSeqNum = 10;
|
|
314
|
-
rootNode.startSummary(referenceSeqNum, logger, 0);
|
|
315
|
-
await rootNode.summarize(false);
|
|
316
|
-
await assert.rejects(async () => rootNode.refreshLatestSummary(proposalHandle, summaryRefSeq), (error) => {
|
|
317
|
-
const correctErrorMessage = error.message === "UnexpectedRefreshDuringSummarize";
|
|
318
|
-
const correctInProgressRefSeq = error.inProgressSummaryRefSeq === referenceSeqNum;
|
|
319
|
-
return correctErrorMessage && correctInProgressRefSeq;
|
|
320
|
-
}, "Refresh should fail if called when summary is in progress");
|
|
321
|
-
});
|
|
322
|
-
});
|
|
323
|
-
});
|
|
324
|
-
});
|
|
325
|
-
});
|
|
326
|
-
//# sourceMappingURL=summarizerNode.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"summarizerNode.spec.js","sourceRoot":"","sources":["../../src/test/summarizerNode.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\";\n\nimport { ILoggingError } from \"@fluidframework/core-interfaces\";\nimport {\n\tISequencedDocumentMessage,\n\tISnapshotTree,\n\tSummaryType,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tchannelsTreeName,\n\tCreateChildSummarizerNodeParam,\n\tCreateSummarizerNodeSource,\n\tISummarizerNode,\n\tISummarizerNodeConfig,\n} from \"@fluidframework/runtime-definitions\";\nimport { mergeStats } from \"@fluidframework/runtime-utils\";\nimport { TelemetryDataTag, createChildLogger } from \"@fluidframework/telemetry-utils\";\n\nimport { createRootSummarizerNode, IRootSummarizerNode } from \"../summary/index.js\";\n// eslint-disable-next-line import/no-internal-modules\nimport { SummarizerNode } from \"../summary/summarizerNode/summarizerNode.js\";\n// eslint-disable-next-line import/no-internal-modules\nimport { ValidateSummaryResult } from \"../summary/summarizerNode/index.js\";\n\ndescribe(\"Runtime\", () => {\n\tdescribe(\"Summarization\", () => {\n\t\tdescribe(\"Summarizer Node\", () => {\n\t\t\tconst names = [\"root\", \"mid\", \"leaf\"] as const;\n\t\t\tconst ids = [\"rootId\", \"midId\", \"leafId\"] as const;\n\t\t\tlet rootNode: IRootSummarizerNode;\n\t\t\tlet midNode: ISummarizerNode | undefined;\n\t\t\tlet leafNode: ISummarizerNode | undefined;\n\n\t\t\tconst logger = createChildLogger();\n\t\t\tlet summarizeCalls = [0, 0, 0];\n\t\t\tfunction assertSummarizeCalls(...expected: [root: number, mid: number, leaf: number]) {\n\t\t\t\tfor (let i = 0; i < expected.length; i++) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\texpected[i] === summarizeCalls[i],\n\t\t\t\t\t\t`unexpected ${names[i]} summarize call count: ${expected[i]} !== ${summarizeCalls[i]}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst getSummarizeInternalFn = (depth: 0 | 1 | 2) => async (fullTree: boolean) => {\n\t\t\t\tsummarizeCalls[depth]++;\n\t\t\t\treturn {\n\t\t\t\t\tid: ids[depth],\n\t\t\t\t\tpathPartsForChildren: undefined, // extra path parts between nodes\n\t\t\t\t\tstats: mergeStats(),\n\t\t\t\t\tsummary: { type: SummaryType.Tree, tree: {} } as const,\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tfunction createRoot({\n\t\t\t\tchangeSeq = 1,\n\t\t\t\trefSeq,\n\t\t\t\t...config\n\t\t\t}: Partial<\n\t\t\t\tISummarizerNodeConfig & {\n\t\t\t\t\tchangeSeq: number;\n\t\t\t\t\trefSeq: number;\n\t\t\t\t}\n\t\t\t> = {}) {\n\t\t\t\trootNode = createRootSummarizerNode(\n\t\t\t\t\tlogger,\n\t\t\t\t\tgetSummarizeInternalFn(0),\n\t\t\t\t\tchangeSeq,\n\t\t\t\t\trefSeq,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfunction createMid(\n\t\t\t\tcreateParam: CreateChildSummarizerNodeParam,\n\t\t\t\tconfig?: ISummarizerNodeConfig,\n\t\t\t) {\n\t\t\t\tmidNode = rootNode.createChild(\n\t\t\t\t\tgetSummarizeInternalFn(1),\n\t\t\t\t\tids[1],\n\t\t\t\t\tcreateParam,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfunction createLeaf(\n\t\t\t\tcreateParam: CreateChildSummarizerNodeParam,\n\t\t\t\tconfig?: ISummarizerNodeConfig,\n\t\t\t) {\n\t\t\t\tleafNode = midNode?.createChild(\n\t\t\t\t\tgetSummarizeInternalFn(2),\n\t\t\t\t\tids[2],\n\t\t\t\t\tcreateParam,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfunction expectThrow(\n\t\t\t\tfn: () => unknown,\n\t\t\t\tfailMsg: string,\n\t\t\t\terrMsg: string,\n\t\t\t\t...expectedErrors: string[]\n\t\t\t): void {\n\t\t\t\ttry {\n\t\t\t\t\tfn();\n\t\t\t\t\tthrow Error(`${failMsg}: Expected to fail`);\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\texpectedErrors.some((e) => e === (error as ILoggingError).message),\n\t\t\t\t\t\terrMsg,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tasync function expectReject(\n\t\t\t\tfn: () => Promise<unknown>,\n\t\t\t\tfailMsg: string,\n\t\t\t\terrMsg: string,\n\t\t\t\t...expectedErrors: string[]\n\t\t\t): Promise<void> {\n\t\t\t\ttry {\n\t\t\t\t\tawait fn();\n\t\t\t\t\tthrow Error(`${failMsg}: Expected to reject`);\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\texpectedErrors.some((e) => e === (error as ILoggingError).message),\n\t\t\t\t\t\terrMsg,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst summaryRefSeq = 123;\n\t\t\tconst fakeOp = (sequenceNumber: number): ISequencedDocumentMessage =>\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t({ sequenceNumber }) as ISequencedDocumentMessage;\n\n\t\t\tconst emptySnapshot: ISnapshotTree = { blobs: {}, trees: {} };\n\t\t\tconst protocolTree: ISnapshotTree = {\n\t\t\t\tblobs: { attributes: \"protocolAttributes\" },\n\t\t\t\ttrees: {},\n\t\t\t};\n\t\t\tconst coreSnapshot: ISnapshotTree = {\n\t\t\t\tblobs: {},\n\t\t\t\ttrees: {\n\t\t\t\t\t[ids[1]]: {\n\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t[ids[2]]: emptySnapshot,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst simpleSnapshot: ISnapshotTree = {\n\t\t\t\tblobs: {},\n\t\t\t\ttrees: {\n\t\t\t\t\t...coreSnapshot.trees,\n\t\t\t\t\t\".protocol\": protocolTree,\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst channelsSnapshot: ISnapshotTree = {\n\t\t\t\tblobs: {},\n\t\t\t\ttrees: {\n\t\t\t\t\t[channelsTreeName]: coreSnapshot,\n\t\t\t\t\t\".protocol\": protocolTree,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tbeforeEach(() => {\n\t\t\t\tsummarizeCalls = [0, 0, 0];\n\t\t\t});\n\n\t\t\tdescribe(\"Create Child\", () => {\n\t\t\t\tit(\"Should fail to create child with same id\", () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tcreateMid({ type: CreateSummarizerNodeSource.Local });\n\t\t\t\t\texpectThrow(\n\t\t\t\t\t\t() => createMid({ type: CreateSummarizerNodeSource.Local }),\n\t\t\t\t\t\t\"create child\",\n\t\t\t\t\t\t\"child node with same id already exists\",\n\t\t\t\t\t\t\"0x1ab\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Load Base Summary\", () => {\n\t\t\t\tit(\"Load base summary should do nothing for simple snapshot\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 1 });\n\t\t\t\t\trootNode.updateBaseSummaryState(simpleSnapshot);\n\n\t\t\t\t\tconst latestSummary = (rootNode as SummarizerNode).latestSummary;\n\t\t\t\t\tassert(latestSummary !== undefined, \"latest summary should exist\");\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tlatestSummary.additionalPath?.path,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\"should not have any path parts for children\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Load base summary should strip channels subtree\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 1 });\n\t\t\t\t\trootNode.updateBaseSummaryState(channelsSnapshot);\n\n\t\t\t\t\tconst latestSummary = (rootNode as SummarizerNode).latestSummary;\n\t\t\t\t\tassert(latestSummary !== undefined, \"latest summary should exist\");\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tlatestSummary.additionalPath?.path,\n\t\t\t\t\t\tchannelsTreeName,\n\t\t\t\t\t\t\"should have channels path for children\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Start Summary\", () => {\n\t\t\t\tit(\"Should fail startSummary if previous attempt is not completed/cleared\", () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\texpectThrow(\n\t\t\t\t\t\t() => rootNode.startSummary(12, logger, 0),\n\t\t\t\t\t\t\"start summary\",\n\t\t\t\t\t\t\"wip referenceSequenceNumber and logger are still set\",\n\t\t\t\t\t\t\"0x19f\",\n\t\t\t\t\t\t\"0x1a0\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should succeed startSummary if previous attempt is completed\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(\"test-handle\", true /* validateSummary */);\n\t\t\t\t\trootNode.startSummary(12, logger, 0); // This is 0 since we did not \"ack\" the latest summary\n\t\t\t\t});\n\n\t\t\t\tit(\"Should succeed startSummary if previous attempt is cleared\", () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\trootNode.clearSummary();\n\t\t\t\t\trootNode.startSummary(12, logger, 0); // This is 0 since we did not \"ack\" the latest summary\n\t\t\t\t});\n\n\t\t\t\tit(\"Should succeed startSummary with the right sequence number\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(\"test-handle\", true /* validateSummary */);\n\t\t\t\t\t// Refreshing should be necessary for startSummary to occur\n\t\t\t\t\tawait rootNode.refreshLatestSummary(\"test-handle\", 11);\n\t\t\t\t\tconst result = rootNode.startSummary(12, logger, 11);\n\t\t\t\t\tassert.strictEqual(result.invalidNodes, 0, \"startSummary have succeeded\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should fail startSummary when missing refresh\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\t// Need one latest summary\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(\"test-handle\", true /* validateSummary */);\n\t\t\t\t\tawait rootNode.refreshLatestSummary(\"test-handle\", 11);\n\n\t\t\t\t\t// Summary with missing refresh\n\t\t\t\t\trootNode.startSummary(12, logger, 11);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(\"test-handle\", true /* validateSummary */);\n\n\t\t\t\t\t// Failing to refresh the root node should generate failing summaries\n\t\t\t\t\tconst result = rootNode.startSummary(21, logger, 12);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tresult.invalidNodes,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t\"startSummary fails due to no refresh\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.deepEqual(\n\t\t\t\t\t\tresult.mismatchNumbers,\n\t\t\t\t\t\tnew Set([\"12-11\"]),\n\t\t\t\t\t\t\"startSummary should have mismatched numbers\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should fail startSummary with the wrong sequence number\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(\"test-handle\", true /* validateSummary */);\n\t\t\t\t\tawait rootNode.refreshLatestSummary(\"test-handle\", 11);\n\t\t\t\t\tconst result = rootNode.startSummary(12, logger, 0); // 0 is wrong here (so we can get invalid results)\n\t\t\t\t\tassert.strictEqual(result.invalidNodes, 1, \"expected failure wrong ref seq\");\n\t\t\t\t\tassert.deepEqual(\n\t\t\t\t\t\tresult.mismatchNumbers,\n\t\t\t\t\t\tnew Set([\"0-11\"]),\n\t\t\t\t\t\t\"startSummary have succeeded\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Validate Summary\", () => {\n\t\t\t\tit(\"summary validation should fail if summarize not called on root node\", () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\n\t\t\t\t\t// Validate summary fails by calling validateSummary.\n\t\t\t\t\tconst expectedResult: ValidateSummaryResult = {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\treason: \"NodeDidNotSummarize\",\n\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\t\t\tvalue: \"\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tretryAfterSeconds: 1,\n\t\t\t\t\t};\n\t\t\t\t\tconst result = rootNode.validateSummary();\n\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\texpectedResult,\n\t\t\t\t\t\t\"validate summary should have failed at the root node\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Validate summary fails by calling completeSummary.\n\t\t\t\t\tassert.throws(\n\t\t\t\t\t\t() => rootNode.completeSummary(\"test-handle\", true /* validateSummary */),\n\t\t\t\t\t\t(error: any) => {\n\t\t\t\t\t\t\tconst correctErrorMessage = error.message === \"NodeDidNotSummarize\";\n\t\t\t\t\t\t\tconst correctErrorId = error.id.value === \"\";\n\t\t\t\t\t\t\treturn correctErrorMessage && correctErrorId;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Complete summary should have failed at the root node\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"summary validation should fail if summarize not called on child node\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tcreateMid({ type: CreateSummarizerNodeSource.Local });\n\t\t\t\t\tcreateLeaf({ type: CreateSummarizerNodeSource.Local });\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\tawait leafNode?.summarize(false);\n\t\t\t\t\tconst midNodeId = `/${ids[1]}`;\n\n\t\t\t\t\t// Validate summary fails by calling validateSummary.\n\t\t\t\t\tconst expectedResult: ValidateSummaryResult = {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\treason: \"NodeDidNotSummarize\",\n\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\t\t\tvalue: midNodeId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tretryAfterSeconds: 1,\n\t\t\t\t\t};\n\t\t\t\t\tconst result = rootNode.validateSummary();\n\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\texpectedResult,\n\t\t\t\t\t\t\"validate summary should have failed at the mid node\",\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.throws(\n\t\t\t\t\t\t() => rootNode.completeSummary(\"test-handle\", true /* validateSummary */),\n\t\t\t\t\t\t(error: any) => {\n\t\t\t\t\t\t\tconst correctErrorMessage = error.message === \"NodeDidNotSummarize\";\n\t\t\t\t\t\t\tconst correctErrorId = error.id.value === midNodeId;\n\t\t\t\t\t\t\treturn correctErrorMessage && correctErrorId;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Complete summary should have failed at the mid node\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"summary validation should fail if summarize not called on leaf node\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tcreateMid({ type: CreateSummarizerNodeSource.Local });\n\t\t\t\t\tcreateLeaf({ type: CreateSummarizerNodeSource.Local });\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\tawait midNode?.summarize(false);\n\t\t\t\t\tconst leafNodeId = `/${ids[1]}/${ids[2]}`;\n\n\t\t\t\t\t// Validate summary fails by calling validateSummary.\n\t\t\t\t\tconst expectedResult: ValidateSummaryResult = {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\treason: \"NodeDidNotSummarize\",\n\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\t\t\tvalue: leafNodeId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tretryAfterSeconds: 1,\n\t\t\t\t\t};\n\t\t\t\t\tconst result = rootNode.validateSummary();\n\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\texpectedResult,\n\t\t\t\t\t\t\"validate summary should have failed at the leaf node\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Validate summary fails by calling completeSummary.\n\t\t\t\t\tassert.throws(\n\t\t\t\t\t\t() => rootNode.completeSummary(\"test-handle\", true /* validateSummary */),\n\t\t\t\t\t\t(error: any) => {\n\t\t\t\t\t\t\tconst correctErrorMessage = error.message === \"NodeDidNotSummarize\";\n\t\t\t\t\t\t\tconst correctErrorId = error.id.value === leafNodeId;\n\t\t\t\t\t\t\treturn correctErrorMessage && correctErrorId;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Complete summary should have failed at the leaf node\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Summarize\", () => {\n\t\t\t\tit(\"Should fail summarize if startSummary is not called\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tawait expectReject(\n\t\t\t\t\t\tasync () => rootNode.summarize(false),\n\t\t\t\t\t\t\"summarize\",\n\t\t\t\t\t\t\"no wip referenceSequenceNumber or logger\",\n\t\t\t\t\t\t\"0x1a1\",\n\t\t\t\t\t\t\"0x1a2\",\n\t\t\t\t\t);\n\t\t\t\t\tassertSummarizeCalls(0, 0, 0);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should call summarize internal with later op\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 11 });\n\t\t\t\t\trootNode.recordChange(fakeOp(12));\n\t\t\t\t\trootNode.startSummary(99, logger, 11);\n\t\t\t\t\tconst result = await rootNode.summarize(false);\n\t\t\t\t\tassertSummarizeCalls(1, 0, 0);\n\t\t\t\t\tassert(result.summary.type === SummaryType.Tree, \"should be tree\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should call summarize internal with later invalidate\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 11 });\n\t\t\t\t\trootNode.invalidate(12);\n\t\t\t\t\trootNode.startSummary(99, logger, 11);\n\t\t\t\t\tconst result = await rootNode.summarize(false);\n\t\t\t\t\tassertSummarizeCalls(1, 0, 0);\n\t\t\t\t\tassert(result.summary.type === SummaryType.Tree, \"should be tree\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should not call summarize internal and instead use handle\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 11 });\n\t\t\t\t\trootNode.recordChange(fakeOp(11));\n\t\t\t\t\trootNode.startSummary(99, logger, 11);\n\t\t\t\t\tconst result = await rootNode.summarize(false);\n\t\t\t\t\tassertSummarizeCalls(0, 0, 0);\n\t\t\t\t\tassert(result.summary.type === SummaryType.Handle, \"should be handle\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should call summarize internal always when fullTree true\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 11 });\n\t\t\t\t\trootNode.recordChange(fakeOp(10));\n\t\t\t\t\trootNode.startSummary(99, logger, 11);\n\t\t\t\t\tconst result = await rootNode.summarize(true);\n\t\t\t\t\tassertSummarizeCalls(1, 0, 0);\n\t\t\t\t\tassert(result.summary.type === SummaryType.Tree, \"should be tree\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Refresh Latest Summary\", () => {\n\t\t\t\tit(\"Should not refresh latest if already passed ref seq number\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: summaryRefSeq });\n\t\t\t\t\tconst result = await rootNode.refreshLatestSummary(\n\t\t\t\t\t\t\"test-handle\",\n\t\t\t\t\t\tsummaryRefSeq,\n\t\t\t\t\t);\n\t\t\t\t\tassert(!result.isSummaryTracked, \"we already got this summary\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should refresh from pending\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tconst proposalHandle = \"test-handle\";\n\n\t\t\t\t\trootNode.startSummary(10, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(proposalHandle, true /* validateSummary */);\n\n\t\t\t\t\tconst result = await rootNode.refreshLatestSummary(\n\t\t\t\t\t\tproposalHandle,\n\t\t\t\t\t\tsummaryRefSeq,\n\t\t\t\t\t);\n\t\t\t\t\tassert(result.isSummaryTracked, \"should be tracked\");\n\t\t\t\t\tassert(result.isSummaryNewer === true, \"should be newer\");\n\t\t\t\t});\n\n\t\t\t\tit(\"should fail refresh when summary is in progress\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tconst proposalHandle = \"test-handle\";\n\n\t\t\t\t\tconst referenceSeqNum = 10;\n\t\t\t\t\trootNode.startSummary(referenceSeqNum, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\tawait assert.rejects(\n\t\t\t\t\t\tasync () => rootNode.refreshLatestSummary(proposalHandle, summaryRefSeq),\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\terror: ILoggingError & { inProgressSummaryRefSeq: number | undefined },\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst correctErrorMessage =\n\t\t\t\t\t\t\t\terror.message === \"UnexpectedRefreshDuringSummarize\";\n\t\t\t\t\t\t\tconst correctInProgressRefSeq =\n\t\t\t\t\t\t\t\terror.inProgressSummaryRefSeq === referenceSeqNum;\n\t\t\t\t\t\t\treturn correctErrorMessage && correctInProgressRefSeq;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Refresh should fail if called when summary is in progress\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
|