@fluidframework/container-runtime 2.0.0-rc.2.0.1 → 2.0.0-rc.3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/api-report/container-runtime.api.md +471 -52
- package/dist/batchTracker.d.ts +1 -1
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +4 -4
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +33 -30
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +82 -107
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +27 -22
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +189 -165
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +3 -3
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +17 -17
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js +2 -2
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +42 -39
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +425 -292
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +8 -8
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +58 -19
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +171 -114
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts +1 -0
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +12 -11
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.d.ts +5 -1
- package/dist/dataStoreRegistry.d.ts.map +1 -1
- package/dist/dataStoreRegistry.js +4 -4
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/dist/deltaManagerSummarizerProxy.js.map +1 -1
- package/dist/deltaScheduler.d.ts +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +6 -6
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/error.d.ts +1 -1
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +4 -4
- package/dist/error.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +3 -2
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +23 -23
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts +2 -2
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +4 -5
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +4 -5
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +5 -1
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +21 -12
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +2 -2
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +11 -11
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +2 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +11 -9
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js +6 -6
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/gc/index.d.ts +1 -1
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +2 -1
- package/dist/gc/index.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +91 -0
- package/dist/messageTypes.d.ts +11 -5
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js +4 -0
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +2 -20
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +3 -3
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +3 -1
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +5 -6
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +15 -4
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +62 -63
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +14 -16
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +12 -4
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +63 -53
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +2 -1
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +30 -29
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +36 -32
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts +1 -1
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +18 -18
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/public.d.ts +12 -0
- package/dist/scheduleManager.d.ts +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +28 -24
- package/dist/scheduleManager.js.map +1 -1
- package/dist/storageServiceWithAttachBlobs.d.ts +2 -2
- package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -1
- package/dist/storageServiceWithAttachBlobs.js +2 -2
- package/dist/storageServiceWithAttachBlobs.js.map +1 -1
- package/dist/summary/documentSchema.d.ts +209 -0
- package/dist/summary/documentSchema.d.ts.map +1 -0
- package/dist/summary/documentSchema.js +390 -0
- package/dist/summary/documentSchema.js.map +1 -0
- package/dist/summary/index.d.ts +2 -1
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +4 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +2 -2
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +12 -7
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js +3 -3
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +3 -3
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +16 -16
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +3 -2
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +13 -13
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts +2 -2
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.d.ts +1 -1
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
- package/dist/summary/summarizerHeuristics.js +2 -2
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +3 -2
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +28 -28
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +14 -14
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +5 -3
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +2 -2
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +7 -7
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +6 -17
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js +8 -8
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +4 -3
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +17 -17
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +1 -1
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +15 -14
- package/dist/summary/summaryManager.js.map +1 -1
- package/internal.d.ts +11 -0
- package/legacy.d.ts +11 -0
- package/lib/batchTracker.d.ts +1 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -2
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +33 -30
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +48 -73
- package/lib/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts +27 -22
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +132 -108
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +3 -3
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +3 -3
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerHandleContext.d.ts.map +1 -1
- package/lib/containerHandleContext.js +1 -1
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +42 -39
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +276 -141
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +3 -3
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +58 -19
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +110 -53
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts +1 -0
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +3 -2
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.d.ts +5 -1
- package/lib/dataStoreRegistry.d.ts.map +1 -1
- package/lib/dataStoreRegistry.js +1 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/lib/deltaManagerSummarizerProxy.js.map +1 -1
- package/lib/deltaScheduler.d.ts +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +1 -1
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/error.d.ts +1 -1
- package/lib/error.d.ts.map +1 -1
- package/lib/error.js +2 -2
- package/lib/error.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +3 -2
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +8 -8
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts +2 -2
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +4 -5
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +4 -5
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts +5 -1
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +10 -2
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts +2 -2
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +2 -2
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +2 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +4 -2
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js +2 -2
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/lib/gc/index.d.ts +1 -1
- package/lib/gc/index.d.ts.map +1 -1
- package/lib/gc/index.js +1 -1
- package/lib/gc/index.js.map +1 -1
- package/lib/index.d.ts +5 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -2
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +91 -0
- package/lib/messageTypes.d.ts +11 -5
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js +4 -0
- package/lib/messageTypes.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +2 -20
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +3 -3
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js +2 -2
- package/lib/opLifecycle/index.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +2 -3
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +15 -4
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +61 -62
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +9 -12
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +12 -4
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +47 -38
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +2 -1
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +19 -18
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +36 -32
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +1 -1
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +2 -2
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/public.d.ts +12 -0
- package/lib/scheduleManager.d.ts +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +7 -3
- package/lib/scheduleManager.js.map +1 -1
- package/lib/storageServiceWithAttachBlobs.d.ts +2 -2
- package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -1
- package/lib/storageServiceWithAttachBlobs.js +1 -1
- package/lib/storageServiceWithAttachBlobs.js.map +1 -1
- package/lib/summary/documentSchema.d.ts +209 -0
- package/lib/summary/documentSchema.d.ts.map +1 -0
- package/lib/summary/documentSchema.js +386 -0
- package/lib/summary/documentSchema.js.map +1 -0
- package/lib/summary/index.d.ts +2 -1
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js +1 -0
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +2 -2
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +7 -2
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +3 -3
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +3 -3
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +3 -2
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +3 -3
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts +2 -2
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.d.ts +1 -1
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
- package/lib/summary/summarizerHeuristics.js +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +3 -2
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +5 -5
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +5 -3
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +2 -2
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +1 -1
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +6 -17
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +3 -3
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +4 -3
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +4 -4
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +1 -1
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +9 -8
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +57 -65
- package/src/batchTracker.ts +4 -3
- package/src/blobManager.ts +100 -77
- package/src/channelCollection.ts +223 -167
- package/src/connectionTelemetry.ts +12 -12
- package/src/containerHandleContext.ts +3 -2
- package/src/containerRuntime.ts +481 -277
- package/src/dataStore.ts +9 -4
- package/src/dataStoreContext.ts +201 -97
- package/src/dataStoreContexts.ts +5 -2
- package/src/dataStoreRegistry.ts +3 -2
- package/src/deltaManagerSummarizerProxy.ts +1 -1
- package/src/deltaScheduler.ts +2 -1
- package/src/error.ts +2 -2
- package/src/gc/garbageCollection.ts +21 -20
- package/src/gc/gcConfigs.ts +15 -18
- package/src/gc/gcDefinitions.ts +6 -8
- package/src/gc/gcHelpers.ts +22 -5
- package/src/gc/gcSummaryStateTracker.ts +7 -5
- package/src/gc/gcTelemetry.ts +13 -7
- package/src/gc/gcUnreferencedStateTracker.ts +3 -2
- package/src/gc/index.ts +1 -0
- package/src/index.ts +22 -1
- package/src/messageTypes.ts +20 -6
- package/src/opLifecycle/README.md +89 -0
- package/src/opLifecycle/batchManager.ts +1 -0
- package/src/opLifecycle/definitions.ts +3 -21
- package/src/opLifecycle/index.ts +3 -9
- package/src/opLifecycle/opCompressor.ts +6 -5
- package/src/opLifecycle/opDecompressor.ts +90 -100
- package/src/opLifecycle/opGroupingManager.ts +12 -14
- package/src/opLifecycle/opSplitter.ts +76 -48
- package/src/opLifecycle/outbox.ts +30 -38
- package/src/opLifecycle/remoteMessageProcessor.ts +43 -55
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +6 -6
- package/src/scheduleManager.ts +10 -8
- package/src/storageServiceWithAttachBlobs.ts +2 -2
- package/src/summary/documentSchema.ts +631 -0
- package/src/summary/index.ts +10 -1
- package/src/summary/orderedClientElection.ts +7 -7
- package/src/summary/runWhileConnectedCoordinator.ts +3 -2
- package/src/summary/runningSummarizer.ts +22 -20
- package/src/summary/summarizer.ts +17 -15
- package/src/summary/summarizerClientElection.ts +3 -2
- package/src/summary/summarizerHeuristics.ts +4 -2
- package/src/summary/summarizerNode/summarizerNode.ts +20 -18
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +3 -2
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +16 -8
- package/src/summary/summarizerTypes.ts +7 -3
- package/src/summary/summaryCollection.ts +3 -3
- package/src/summary/summaryFormat.ts +14 -26
- package/src/summary/summaryGenerator.ts +12 -15
- package/src/summary/summaryManager.ts +16 -13
- package/api-extractor-cjs.json +0 -8
- package/dist/container-runtime-alpha.d.ts +0 -1753
- package/dist/container-runtime-beta.d.ts +0 -268
- package/dist/container-runtime-public.d.ts +0 -268
- package/dist/container-runtime-untrimmed.d.ts +0 -1893
- package/lib/container-runtime-alpha.d.ts +0 -1753
- package/lib/container-runtime-beta.d.ts +0 -268
- package/lib/container-runtime-public.d.ts +0 -268
- package/lib/container-runtime-untrimmed.d.ts +0 -1893
- package/lib/test/batchTracker.spec.js +0 -88
- package/lib/test/batchTracker.spec.js.map +0 -1
- package/lib/test/blobManager.spec.js +0 -835
- package/lib/test/blobManager.spec.js.map +0 -1
- package/lib/test/channelCollection.spec.js +0 -141
- package/lib/test/channelCollection.spec.js.map +0 -1
- package/lib/test/containerRuntime.spec.js +0 -1748
- package/lib/test/containerRuntime.spec.js.map +0 -1
- package/lib/test/dataStoreContext.spec.js +0 -801
- package/lib/test/dataStoreContext.spec.js.map +0 -1
- package/lib/test/dataStoreCreation.spec.js +0 -312
- package/lib/test/dataStoreCreation.spec.js.map +0 -1
- package/lib/test/dataStoreRegistry.spec.js +0 -26
- package/lib/test/dataStoreRegistry.spec.js.map +0 -1
- package/lib/test/fuzz/fuzzUtils.js +0 -66
- package/lib/test/fuzz/fuzzUtils.js.map +0 -1
- package/lib/test/fuzz/summarizer.fuzz.spec.js +0 -31
- package/lib/test/fuzz/summarizer.fuzz.spec.js.map +0 -1
- package/lib/test/fuzz/summarizerFuzzMocks.js +0 -162
- package/lib/test/fuzz/summarizerFuzzMocks.js.map +0 -1
- package/lib/test/fuzz/summarizerFuzzSuite.js +0 -106
- package/lib/test/fuzz/summarizerFuzzSuite.js.map +0 -1
- package/lib/test/gc/garbageCollection.spec.js +0 -1465
- package/lib/test/gc/garbageCollection.spec.js.map +0 -1
- package/lib/test/gc/gcConfigs.spec.js +0 -690
- package/lib/test/gc/gcConfigs.spec.js.map +0 -1
- package/lib/test/gc/gcHelpers.spec.js +0 -110
- package/lib/test/gc/gcHelpers.spec.js.map +0 -1
- package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +0 -68
- package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +0 -1
- package/lib/test/gc/gcStats.spec.js +0 -391
- package/lib/test/gc/gcStats.spec.js.map +0 -1
- package/lib/test/gc/gcSummaryStateTracker.spec.js +0 -228
- package/lib/test/gc/gcSummaryStateTracker.spec.js.map +0 -1
- package/lib/test/gc/gcTelemetry.spec.js +0 -530
- package/lib/test/gc/gcTelemetry.spec.js.map +0 -1
- package/lib/test/gc/gcUnitTestHelpers.js +0 -29
- package/lib/test/gc/gcUnitTestHelpers.js.map +0 -1
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js +0 -192
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +0 -1
- package/lib/test/getPendingBlobs.spec.js +0 -193
- package/lib/test/getPendingBlobs.spec.js.map +0 -1
- package/lib/test/hardwareStats.spec.js +0 -93
- package/lib/test/hardwareStats.spec.js.map +0 -1
- package/lib/test/index.js +0 -6
- package/lib/test/index.js.map +0 -1
- package/lib/test/opLifecycle/OpGroupingManager.spec.js +0 -225
- package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +0 -1
- package/lib/test/opLifecycle/batchManager.spec.js +0 -189
- package/lib/test/opLifecycle/batchManager.spec.js.map +0 -1
- package/lib/test/opLifecycle/opCompressor.spec.js +0 -74
- package/lib/test/opLifecycle/opCompressor.spec.js.map +0 -1
- package/lib/test/opLifecycle/opDecompressor.spec.js +0 -218
- package/lib/test/opLifecycle/opDecompressor.spec.js.map +0 -1
- package/lib/test/opLifecycle/opSplitter.spec.js +0 -272
- package/lib/test/opLifecycle/opSplitter.spec.js.map +0 -1
- package/lib/test/opLifecycle/outbox.spec.js +0 -675
- package/lib/test/opLifecycle/outbox.spec.js.map +0 -1
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +0 -196
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +0 -1
- package/lib/test/pendingStateManager.spec.js +0 -329
- package/lib/test/pendingStateManager.spec.js.map +0 -1
- package/lib/test/scheduleManager.spec.js +0 -270
- package/lib/test/scheduleManager.spec.js.map +0 -1
- package/lib/test/summarizerNode.spec.js +0 -326
- package/lib/test/summarizerNode.spec.js.map +0 -1
- package/lib/test/summarizerNodeWithGc.spec.js +0 -318
- package/lib/test/summarizerNodeWithGc.spec.js.map +0 -1
- package/lib/test/summary/orderedClientElection.spec.js +0 -535
- package/lib/test/summary/orderedClientElection.spec.js.map +0 -1
- package/lib/test/summary/runningSummarizer.spec.js +0 -1349
- package/lib/test/summary/runningSummarizer.spec.js.map +0 -1
- package/lib/test/summary/summarizer.spec.js +0 -29
- package/lib/test/summary/summarizer.spec.js.map +0 -1
- package/lib/test/summary/summarizerClientElection.spec.js +0 -436
- package/lib/test/summary/summarizerClientElection.spec.js.map +0 -1
- package/lib/test/summary/summarizerHeuristics.spec.js +0 -289
- package/lib/test/summary/summarizerHeuristics.spec.js.map +0 -1
- package/lib/test/summary/summaryCollection.spec.js +0 -200
- package/lib/test/summary/summaryCollection.spec.js.map +0 -1
- package/lib/test/summary/summaryManager.spec.js +0 -430
- package/lib/test/summary/summaryManager.spec.js.map +0 -1
- package/lib/test/summary/testQuorumClients.js +0 -34
- package/lib/test/summary/testQuorumClients.js.map +0 -1
- package/lib/test/throttler.spec.js +0 -175
- package/lib/test/throttler.spec.js.map +0 -1
- package/lib/test/types/validateContainerRuntimePrevious.generated.js +0 -180
- package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +0 -1
- /package/{dist → lib}/tsdoc-metadata.json +0 -0
|
@@ -1,329 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import assert from "assert";
|
|
6
|
-
import { ContainerErrorTypes, } from "@fluidframework/container-definitions";
|
|
7
|
-
import { MessageType } from "@fluidframework/protocol-definitions";
|
|
8
|
-
import { isILoggingError } from "@fluidframework/telemetry-utils";
|
|
9
|
-
import { PendingStateManager } from "../pendingStateManager.js";
|
|
10
|
-
import { BatchManager } from "../opLifecycle/index.js";
|
|
11
|
-
describe("Pending State Manager", () => {
|
|
12
|
-
describe("Rollback", () => {
|
|
13
|
-
let rollbackCalled;
|
|
14
|
-
let rollbackContent;
|
|
15
|
-
let rollbackShouldThrow;
|
|
16
|
-
let batchManager;
|
|
17
|
-
function getMessage(payload) {
|
|
18
|
-
return { contents: payload };
|
|
19
|
-
}
|
|
20
|
-
const rollBackCallback = (m) => {
|
|
21
|
-
rollbackCalled = true;
|
|
22
|
-
rollbackContent.push(m);
|
|
23
|
-
if (rollbackShouldThrow) {
|
|
24
|
-
throw new Error();
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
beforeEach(async () => {
|
|
28
|
-
rollbackCalled = false;
|
|
29
|
-
rollbackContent = [];
|
|
30
|
-
rollbackShouldThrow = false;
|
|
31
|
-
batchManager = new BatchManager({ hardLimit: 950 * 1024 });
|
|
32
|
-
});
|
|
33
|
-
it("should do nothing when rolling back empty pending stack", () => {
|
|
34
|
-
const checkpoint = batchManager.checkpoint();
|
|
35
|
-
checkpoint.rollback(rollBackCallback);
|
|
36
|
-
assert.strictEqual(rollbackCalled, false);
|
|
37
|
-
assert.strictEqual(batchManager.empty, true);
|
|
38
|
-
});
|
|
39
|
-
it("should do nothing when rolling back nothing", () => {
|
|
40
|
-
batchManager.push(getMessage("1"), /* reentrant */ false);
|
|
41
|
-
const checkpoint = batchManager.checkpoint();
|
|
42
|
-
checkpoint.rollback(rollBackCallback);
|
|
43
|
-
assert.strictEqual(rollbackCalled, false);
|
|
44
|
-
assert.strictEqual(batchManager.empty, false);
|
|
45
|
-
});
|
|
46
|
-
it("should succeed when rolling back entire pending stack", () => {
|
|
47
|
-
const checkpoint = batchManager.checkpoint();
|
|
48
|
-
batchManager.push(getMessage("11"), /* reentrant */ false);
|
|
49
|
-
batchManager.push(getMessage("22"), /* reentrant */ false);
|
|
50
|
-
batchManager.push(getMessage("33"), /* reentrant */ false);
|
|
51
|
-
checkpoint.rollback(rollBackCallback);
|
|
52
|
-
assert.strictEqual(rollbackCalled, true);
|
|
53
|
-
assert.strictEqual(rollbackContent.length, 3);
|
|
54
|
-
assert.strictEqual(rollbackContent[0].contents, "33");
|
|
55
|
-
assert.strictEqual(rollbackContent[1].contents, "22");
|
|
56
|
-
assert.strictEqual(rollbackContent[2].contents, "11");
|
|
57
|
-
assert.strictEqual(batchManager.empty, true);
|
|
58
|
-
});
|
|
59
|
-
it("should succeed when rolling back part of pending stack", () => {
|
|
60
|
-
batchManager.push(getMessage("11"), /* reentrant */ false);
|
|
61
|
-
const checkpoint = batchManager.checkpoint();
|
|
62
|
-
batchManager.push(getMessage("22"), /* reentrant */ false);
|
|
63
|
-
batchManager.push(getMessage("33"), /* reentrant */ false);
|
|
64
|
-
checkpoint.rollback(rollBackCallback);
|
|
65
|
-
assert.strictEqual(rollbackCalled, true);
|
|
66
|
-
assert.strictEqual(rollbackContent.length, 2);
|
|
67
|
-
assert.strictEqual(rollbackContent[0].contents, "33");
|
|
68
|
-
assert.strictEqual(rollbackContent[1].contents, "22");
|
|
69
|
-
assert.strictEqual(batchManager.empty, false);
|
|
70
|
-
});
|
|
71
|
-
it("should throw and close when rollback fails", () => {
|
|
72
|
-
rollbackShouldThrow = true;
|
|
73
|
-
const checkpoint = batchManager.checkpoint();
|
|
74
|
-
batchManager.push(getMessage("11"), /* reentrant */ false);
|
|
75
|
-
assert.throws(() => {
|
|
76
|
-
checkpoint.rollback(rollBackCallback);
|
|
77
|
-
});
|
|
78
|
-
assert.strictEqual(rollbackCalled, true);
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
describe("Op processing", () => {
|
|
82
|
-
let pendingStateManager;
|
|
83
|
-
let closeError;
|
|
84
|
-
const clientId = "clientId";
|
|
85
|
-
beforeEach(async () => {
|
|
86
|
-
closeError = undefined;
|
|
87
|
-
pendingStateManager = new PendingStateManager({
|
|
88
|
-
applyStashedOp: () => {
|
|
89
|
-
throw new Error();
|
|
90
|
-
},
|
|
91
|
-
clientId: () => "oldClientId",
|
|
92
|
-
close: (error) => (closeError = error),
|
|
93
|
-
connected: () => true,
|
|
94
|
-
reSubmit: () => { },
|
|
95
|
-
reSubmitBatch: () => { },
|
|
96
|
-
isActiveConnection: () => false,
|
|
97
|
-
isAttached: () => true,
|
|
98
|
-
}, undefined /* initialLocalState */, undefined /* logger */);
|
|
99
|
-
});
|
|
100
|
-
const submitBatch = (messages) => {
|
|
101
|
-
messages.forEach((message) => {
|
|
102
|
-
pendingStateManager.onSubmitMessage(JSON.stringify({ type: message.type, contents: message.contents }), message.referenceSequenceNumber, undefined, message.metadata);
|
|
103
|
-
});
|
|
104
|
-
};
|
|
105
|
-
const process = (messages) => messages.forEach((message) => {
|
|
106
|
-
pendingStateManager.processPendingLocalMessage(message);
|
|
107
|
-
});
|
|
108
|
-
it("proper batch is processed correctly", () => {
|
|
109
|
-
const messages = [
|
|
110
|
-
{
|
|
111
|
-
clientId,
|
|
112
|
-
type: MessageType.Operation,
|
|
113
|
-
clientSequenceNumber: 0,
|
|
114
|
-
referenceSequenceNumber: 0,
|
|
115
|
-
metadata: { batch: true },
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
clientId,
|
|
119
|
-
type: MessageType.Operation,
|
|
120
|
-
clientSequenceNumber: 1,
|
|
121
|
-
referenceSequenceNumber: 0,
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
clientId,
|
|
125
|
-
type: MessageType.Operation,
|
|
126
|
-
metadata: { batch: false },
|
|
127
|
-
clientSequenceNumber: 2,
|
|
128
|
-
referenceSequenceNumber: 0,
|
|
129
|
-
},
|
|
130
|
-
];
|
|
131
|
-
submitBatch(messages);
|
|
132
|
-
process(messages);
|
|
133
|
-
assert(closeError === undefined);
|
|
134
|
-
});
|
|
135
|
-
it("batch missing end message will call close", () => {
|
|
136
|
-
const messages = [
|
|
137
|
-
{
|
|
138
|
-
clientId,
|
|
139
|
-
type: MessageType.Operation,
|
|
140
|
-
clientSequenceNumber: 0,
|
|
141
|
-
referenceSequenceNumber: 0,
|
|
142
|
-
metadata: { batch: true },
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
clientId,
|
|
146
|
-
type: MessageType.Operation,
|
|
147
|
-
clientSequenceNumber: 1,
|
|
148
|
-
referenceSequenceNumber: 0,
|
|
149
|
-
},
|
|
150
|
-
];
|
|
151
|
-
submitBatch(messages);
|
|
152
|
-
process(messages);
|
|
153
|
-
assert(isILoggingError(closeError));
|
|
154
|
-
assert.strictEqual(closeError.errorType, ContainerErrorTypes.dataProcessingError);
|
|
155
|
-
assert.strictEqual(closeError.getTelemetryProperties().hasBatchStart, true);
|
|
156
|
-
assert.strictEqual(closeError.getTelemetryProperties().hasBatchEnd, false);
|
|
157
|
-
});
|
|
158
|
-
describe("processing out of sync messages will call close", () => {
|
|
159
|
-
it("messageTypes do not match", () => {
|
|
160
|
-
const messages = [
|
|
161
|
-
{
|
|
162
|
-
clientId,
|
|
163
|
-
type: MessageType.Operation,
|
|
164
|
-
clientSequenceNumber: 0,
|
|
165
|
-
referenceSequenceNumber: 0,
|
|
166
|
-
},
|
|
167
|
-
];
|
|
168
|
-
submitBatch(messages);
|
|
169
|
-
process(messages.map((message) => ({
|
|
170
|
-
...message,
|
|
171
|
-
type: "otherType",
|
|
172
|
-
})));
|
|
173
|
-
assert(isILoggingError(closeError));
|
|
174
|
-
assert.strictEqual(closeError.errorType, ContainerErrorTypes.dataProcessingError);
|
|
175
|
-
assert.strictEqual(closeError.getTelemetryProperties().expectedMessageType, MessageType.Operation);
|
|
176
|
-
});
|
|
177
|
-
it("only one message has undefined content", () => {
|
|
178
|
-
const messages = [
|
|
179
|
-
{
|
|
180
|
-
clientId,
|
|
181
|
-
type: MessageType.Operation,
|
|
182
|
-
clientSequenceNumber: 0,
|
|
183
|
-
referenceSequenceNumber: 0,
|
|
184
|
-
contents: {},
|
|
185
|
-
},
|
|
186
|
-
];
|
|
187
|
-
submitBatch(messages);
|
|
188
|
-
process(messages.map((message) => ({
|
|
189
|
-
...message,
|
|
190
|
-
contents: undefined,
|
|
191
|
-
})));
|
|
192
|
-
assert.strictEqual(closeError?.errorType, ContainerErrorTypes.dataProcessingError);
|
|
193
|
-
});
|
|
194
|
-
it("stringified message content does not match", () => {
|
|
195
|
-
const messages = [
|
|
196
|
-
{
|
|
197
|
-
clientId,
|
|
198
|
-
type: MessageType.Operation,
|
|
199
|
-
clientSequenceNumber: 0,
|
|
200
|
-
referenceSequenceNumber: 0,
|
|
201
|
-
contents: {},
|
|
202
|
-
},
|
|
203
|
-
];
|
|
204
|
-
submitBatch(messages);
|
|
205
|
-
process(messages.map((message) => ({
|
|
206
|
-
...message,
|
|
207
|
-
contents: { prop1: true },
|
|
208
|
-
})));
|
|
209
|
-
assert.strictEqual(closeError?.errorType, ContainerErrorTypes.dataProcessingError);
|
|
210
|
-
});
|
|
211
|
-
});
|
|
212
|
-
it("processing in sync messages will not call close", () => {
|
|
213
|
-
const messages = [
|
|
214
|
-
{
|
|
215
|
-
clientId,
|
|
216
|
-
type: MessageType.Operation,
|
|
217
|
-
clientSequenceNumber: 0,
|
|
218
|
-
referenceSequenceNumber: 0,
|
|
219
|
-
contents: { prop1: true },
|
|
220
|
-
},
|
|
221
|
-
];
|
|
222
|
-
submitBatch(messages);
|
|
223
|
-
process(messages.map((message) => ({
|
|
224
|
-
...message,
|
|
225
|
-
contents: { prop1: true },
|
|
226
|
-
})));
|
|
227
|
-
assert.strictEqual(closeError, undefined, "unexpected close");
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
describe("Local state processing", () => {
|
|
231
|
-
function createPendingStateManager(pendingStates) {
|
|
232
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
233
|
-
return new PendingStateManager({
|
|
234
|
-
applyStashedOp: async () => undefined,
|
|
235
|
-
clientId: () => undefined,
|
|
236
|
-
close: () => { },
|
|
237
|
-
connected: () => true,
|
|
238
|
-
reSubmit: () => { },
|
|
239
|
-
reSubmitBatch: () => { },
|
|
240
|
-
isActiveConnection: () => false,
|
|
241
|
-
isAttached: () => true,
|
|
242
|
-
}, { pendingStates }, undefined /* logger */);
|
|
243
|
-
}
|
|
244
|
-
describe("Constructor pendingStates", () => {
|
|
245
|
-
it("Empty local state", () => {
|
|
246
|
-
{
|
|
247
|
-
const pendingStateManager = createPendingStateManager(undefined);
|
|
248
|
-
assert.deepStrictEqual(pendingStateManager.initialMessages.toArray(), []);
|
|
249
|
-
}
|
|
250
|
-
{
|
|
251
|
-
const pendingStateManager = createPendingStateManager([]);
|
|
252
|
-
assert.deepStrictEqual(pendingStateManager.initialMessages.toArray(), []);
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
it("New format", () => {
|
|
256
|
-
const messages = [
|
|
257
|
-
{ type: "message", content: '{"type":"component"}' },
|
|
258
|
-
{
|
|
259
|
-
type: "message",
|
|
260
|
-
content: '{"type": "component", "contents": {"prop1": "value"}}',
|
|
261
|
-
},
|
|
262
|
-
];
|
|
263
|
-
const pendingStateManager = createPendingStateManager(messages);
|
|
264
|
-
assert.deepStrictEqual(pendingStateManager.initialMessages.toArray(), messages);
|
|
265
|
-
});
|
|
266
|
-
});
|
|
267
|
-
describe("Future op compat behavior", () => {
|
|
268
|
-
it("pending op roundtrip", async () => {
|
|
269
|
-
const pendingStateManager = createPendingStateManager([]);
|
|
270
|
-
const futureRuntimeMessage = {
|
|
271
|
-
type: "FROM_THE_FUTURE",
|
|
272
|
-
contents: "Hello",
|
|
273
|
-
compatDetails: { behavior: "FailToProcess" },
|
|
274
|
-
};
|
|
275
|
-
pendingStateManager.onSubmitMessage(JSON.stringify(futureRuntimeMessage), 0, undefined, undefined);
|
|
276
|
-
pendingStateManager.processPendingLocalMessage(futureRuntimeMessage);
|
|
277
|
-
});
|
|
278
|
-
});
|
|
279
|
-
});
|
|
280
|
-
describe("Pending messages state", () => {
|
|
281
|
-
const messages = [
|
|
282
|
-
{ type: "message", content: '{"type":"component"}' },
|
|
283
|
-
{
|
|
284
|
-
type: "message",
|
|
285
|
-
content: '{"type": "component", "contents": {"prop1": "value"}}',
|
|
286
|
-
},
|
|
287
|
-
];
|
|
288
|
-
function createPendingStateManager(pendingStates) {
|
|
289
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
290
|
-
return new PendingStateManager({
|
|
291
|
-
applyStashedOp: async () => undefined,
|
|
292
|
-
clientId: () => undefined,
|
|
293
|
-
close: () => { },
|
|
294
|
-
connected: () => true,
|
|
295
|
-
reSubmit: () => { },
|
|
296
|
-
reSubmitBatch: () => { },
|
|
297
|
-
isActiveConnection: () => false,
|
|
298
|
-
isAttached: () => true,
|
|
299
|
-
}, { pendingStates }, undefined /* logger */);
|
|
300
|
-
}
|
|
301
|
-
it("no pending or initial messages", () => {
|
|
302
|
-
const pendingStateManager = createPendingStateManager(undefined);
|
|
303
|
-
assert.strictEqual(pendingStateManager.hasPendingMessages(), false, "There shouldn't be pending messages");
|
|
304
|
-
assert.strictEqual(pendingStateManager.pendingMessagesCount, 0, "Pending messages count should be 0");
|
|
305
|
-
});
|
|
306
|
-
it("has pending messages but no initial messages", () => {
|
|
307
|
-
const pendingStateManager = createPendingStateManager(undefined);
|
|
308
|
-
for (const message of messages) {
|
|
309
|
-
pendingStateManager.onSubmitMessage(JSON.stringify(message.content), 0, undefined /* localOpMetadata */, undefined /* opMetadata */);
|
|
310
|
-
}
|
|
311
|
-
assert.strictEqual(pendingStateManager.hasPendingMessages(), true, "There should be pending messages");
|
|
312
|
-
assert.strictEqual(pendingStateManager.pendingMessagesCount, messages.length, "Pending messages count should be same as pending messages");
|
|
313
|
-
});
|
|
314
|
-
it("has initial messages but no pending messages", () => {
|
|
315
|
-
const pendingStateManager = createPendingStateManager(messages);
|
|
316
|
-
assert.strictEqual(pendingStateManager.hasPendingMessages(), true, "There should be initial messages");
|
|
317
|
-
assert.strictEqual(pendingStateManager.pendingMessagesCount, messages.length, "Pending messages count should be same as initial messages");
|
|
318
|
-
});
|
|
319
|
-
it("has both pending messages and initial messages", () => {
|
|
320
|
-
const pendingStateManager = createPendingStateManager(messages);
|
|
321
|
-
for (const message of messages) {
|
|
322
|
-
pendingStateManager.onSubmitMessage(JSON.stringify(message.content), 0, undefined /* localOpMetadata */, undefined /* opMetadata */);
|
|
323
|
-
}
|
|
324
|
-
assert.strictEqual(pendingStateManager.hasPendingMessages(), true, "There should be pending messages");
|
|
325
|
-
assert.strictEqual(pendingStateManager.pendingMessagesCount, messages.length * 2, "Pending messages count should be same as pending + initial messages");
|
|
326
|
-
});
|
|
327
|
-
});
|
|
328
|
-
});
|
|
329
|
-
//# sourceMappingURL=pendingStateManager.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pendingStateManager.spec.js","sourceRoot":"","sources":["../../src/test/pendingStateManager.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 assert from \"assert\";\nimport Deque from \"double-ended-queue\";\n\nimport {\n\tContainerErrorTypes,\n\tICriticalContainerError,\n} from \"@fluidframework/container-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { isILoggingError } from \"@fluidframework/telemetry-utils\";\n\nimport { IPendingMessage, PendingStateManager } from \"../pendingStateManager.js\";\nimport { BatchManager, BatchMessage } from \"../opLifecycle/index.js\";\nimport type {\n\tRecentlyAddedContainerRuntimeMessageDetails,\n\tUnknownContainerRuntimeMessage,\n} from \"../messageTypes.js\";\n\ntype PendingStateManager_WithPrivates = Omit<PendingStateManager, \"initialMessages\"> & {\n\tinitialMessages: Deque<IPendingMessage>;\n};\n\ndescribe(\"Pending State Manager\", () => {\n\tdescribe(\"Rollback\", () => {\n\t\tlet rollbackCalled;\n\t\tlet rollbackContent;\n\t\tlet rollbackShouldThrow;\n\t\tlet batchManager: BatchManager;\n\n\t\tfunction getMessage(payload: string) {\n\t\t\treturn { contents: payload } as any as BatchMessage;\n\t\t}\n\n\t\tconst rollBackCallback = (m: BatchMessage) => {\n\t\t\trollbackCalled = true;\n\t\t\trollbackContent.push(m);\n\t\t\tif (rollbackShouldThrow) {\n\t\t\t\tthrow new Error();\n\t\t\t}\n\t\t};\n\n\t\tbeforeEach(async () => {\n\t\t\trollbackCalled = false;\n\t\t\trollbackContent = [];\n\t\t\trollbackShouldThrow = false;\n\n\t\t\tbatchManager = new BatchManager({ hardLimit: 950 * 1024 });\n\t\t});\n\n\t\tit(\"should do nothing when rolling back empty pending stack\", () => {\n\t\t\tconst checkpoint = batchManager.checkpoint();\n\t\t\tcheckpoint.rollback(rollBackCallback);\n\n\t\t\tassert.strictEqual(rollbackCalled, false);\n\t\t\tassert.strictEqual(batchManager.empty, true);\n\t\t});\n\n\t\tit(\"should do nothing when rolling back nothing\", () => {\n\t\t\tbatchManager.push(getMessage(\"1\"), /* reentrant */ false);\n\t\t\tconst checkpoint = batchManager.checkpoint();\n\t\t\tcheckpoint.rollback(rollBackCallback);\n\n\t\t\tassert.strictEqual(rollbackCalled, false);\n\t\t\tassert.strictEqual(batchManager.empty, false);\n\t\t});\n\n\t\tit(\"should succeed when rolling back entire pending stack\", () => {\n\t\t\tconst checkpoint = batchManager.checkpoint();\n\t\t\tbatchManager.push(getMessage(\"11\"), /* reentrant */ false);\n\t\t\tbatchManager.push(getMessage(\"22\"), /* reentrant */ false);\n\t\t\tbatchManager.push(getMessage(\"33\"), /* reentrant */ false);\n\t\t\tcheckpoint.rollback(rollBackCallback);\n\n\t\t\tassert.strictEqual(rollbackCalled, true);\n\t\t\tassert.strictEqual(rollbackContent.length, 3);\n\t\t\tassert.strictEqual(rollbackContent[0].contents, \"33\");\n\t\t\tassert.strictEqual(rollbackContent[1].contents, \"22\");\n\t\t\tassert.strictEqual(rollbackContent[2].contents, \"11\");\n\t\t\tassert.strictEqual(batchManager.empty, true);\n\t\t});\n\n\t\tit(\"should succeed when rolling back part of pending stack\", () => {\n\t\t\tbatchManager.push(getMessage(\"11\"), /* reentrant */ false);\n\t\t\tconst checkpoint = batchManager.checkpoint();\n\t\t\tbatchManager.push(getMessage(\"22\"), /* reentrant */ false);\n\t\t\tbatchManager.push(getMessage(\"33\"), /* reentrant */ false);\n\t\t\tcheckpoint.rollback(rollBackCallback);\n\n\t\t\tassert.strictEqual(rollbackCalled, true);\n\t\t\tassert.strictEqual(rollbackContent.length, 2);\n\t\t\tassert.strictEqual(rollbackContent[0].contents, \"33\");\n\t\t\tassert.strictEqual(rollbackContent[1].contents, \"22\");\n\t\t\tassert.strictEqual(batchManager.empty, false);\n\t\t});\n\n\t\tit(\"should throw and close when rollback fails\", () => {\n\t\t\trollbackShouldThrow = true;\n\t\t\tconst checkpoint = batchManager.checkpoint();\n\t\t\tbatchManager.push(getMessage(\"11\"), /* reentrant */ false);\n\t\t\tassert.throws(() => {\n\t\t\t\tcheckpoint.rollback(rollBackCallback);\n\t\t\t});\n\n\t\t\tassert.strictEqual(rollbackCalled, true);\n\t\t});\n\t});\n\n\tdescribe(\"Op processing\", () => {\n\t\tlet pendingStateManager;\n\t\tlet closeError: ICriticalContainerError | undefined;\n\t\tconst clientId = \"clientId\";\n\n\t\tbeforeEach(async () => {\n\t\t\tcloseError = undefined;\n\t\t\tpendingStateManager = new PendingStateManager(\n\t\t\t\t{\n\t\t\t\t\tapplyStashedOp: () => {\n\t\t\t\t\t\tthrow new Error();\n\t\t\t\t\t},\n\t\t\t\t\tclientId: () => \"oldClientId\",\n\t\t\t\t\tclose: (error?: ICriticalContainerError) => (closeError = error),\n\t\t\t\t\tconnected: () => true,\n\t\t\t\t\treSubmit: () => {},\n\t\t\t\t\treSubmitBatch: () => {},\n\t\t\t\t\tisActiveConnection: () => false,\n\t\t\t\t\tisAttached: () => true,\n\t\t\t\t},\n\t\t\t\tundefined /* initialLocalState */,\n\t\t\t\tundefined /* logger */,\n\t\t\t);\n\t\t});\n\n\t\tconst submitBatch = (messages: Partial<ISequencedDocumentMessage>[]) => {\n\t\t\tmessages.forEach((message) => {\n\t\t\t\tpendingStateManager.onSubmitMessage(\n\t\t\t\t\tJSON.stringify({ type: message.type, contents: message.contents }),\n\t\t\t\t\tmessage.referenceSequenceNumber,\n\t\t\t\t\tundefined,\n\t\t\t\t\tmessage.metadata,\n\t\t\t\t);\n\t\t\t});\n\t\t};\n\n\t\tconst process = (messages: Partial<ISequencedDocumentMessage>[]) =>\n\t\t\tmessages.forEach((message) => {\n\t\t\t\tpendingStateManager.processPendingLocalMessage(message);\n\t\t\t});\n\n\t\tit(\"proper batch is processed correctly\", () => {\n\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\tmetadata: { batch: true },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tclientSequenceNumber: 1,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tmetadata: { batch: false },\n\t\t\t\t\tclientSequenceNumber: 2,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tsubmitBatch(messages);\n\t\t\tprocess(messages);\n\t\t\tassert(closeError === undefined);\n\t\t});\n\n\t\tit(\"batch missing end message will call close\", () => {\n\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\tmetadata: { batch: true },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tclientSequenceNumber: 1,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tsubmitBatch(messages);\n\t\t\tprocess(messages);\n\t\t\tassert(isILoggingError(closeError));\n\t\t\tassert.strictEqual(closeError.errorType, ContainerErrorTypes.dataProcessingError);\n\t\t\tassert.strictEqual(closeError.getTelemetryProperties().hasBatchStart, true);\n\t\t\tassert.strictEqual(closeError.getTelemetryProperties().hasBatchEnd, false);\n\t\t});\n\n\t\tdescribe(\"processing out of sync messages will call close\", () => {\n\t\t\tit(\"messageTypes do not match\", () => {\n\t\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsubmitBatch(messages);\n\t\t\t\tprocess(\n\t\t\t\t\tmessages.map((message) => ({\n\t\t\t\t\t\t...message,\n\t\t\t\t\t\ttype: \"otherType\",\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t\tassert(isILoggingError(closeError));\n\t\t\t\tassert.strictEqual(closeError.errorType, ContainerErrorTypes.dataProcessingError);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tcloseError.getTelemetryProperties().expectedMessageType,\n\t\t\t\t\tMessageType.Operation,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"only one message has undefined content\", () => {\n\t\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\t\tcontents: {},\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsubmitBatch(messages);\n\t\t\t\tprocess(\n\t\t\t\t\tmessages.map((message) => ({\n\t\t\t\t\t\t...message,\n\t\t\t\t\t\tcontents: undefined,\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(closeError?.errorType, ContainerErrorTypes.dataProcessingError);\n\t\t\t});\n\n\t\t\tit(\"stringified message content does not match\", () => {\n\t\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\t\tcontents: {},\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsubmitBatch(messages);\n\t\t\t\tprocess(\n\t\t\t\t\tmessages.map((message) => ({\n\t\t\t\t\t\t...message,\n\t\t\t\t\t\tcontents: { prop1: true },\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(closeError?.errorType, ContainerErrorTypes.dataProcessingError);\n\t\t\t});\n\t\t});\n\n\t\tit(\"processing in sync messages will not call close\", () => {\n\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\tcontents: { prop1: true },\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tsubmitBatch(messages);\n\t\t\tprocess(\n\t\t\t\tmessages.map((message) => ({\n\t\t\t\t\t...message,\n\t\t\t\t\tcontents: { prop1: true },\n\t\t\t\t})),\n\t\t\t);\n\t\t\tassert.strictEqual(closeError, undefined, \"unexpected close\");\n\t\t});\n\t});\n\n\tdescribe(\"Local state processing\", () => {\n\t\tfunction createPendingStateManager(pendingStates): PendingStateManager_WithPrivates {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\t\treturn new PendingStateManager(\n\t\t\t\t{\n\t\t\t\t\tapplyStashedOp: async () => undefined,\n\t\t\t\t\tclientId: () => undefined,\n\t\t\t\t\tclose: () => {},\n\t\t\t\t\tconnected: () => true,\n\t\t\t\t\treSubmit: () => {},\n\t\t\t\t\treSubmitBatch: () => {},\n\t\t\t\t\tisActiveConnection: () => false,\n\t\t\t\t\tisAttached: () => true,\n\t\t\t\t},\n\t\t\t\t{ pendingStates },\n\t\t\t\tundefined /* logger */,\n\t\t\t) as any;\n\t\t}\n\n\t\tdescribe(\"Constructor pendingStates\", () => {\n\t\t\tit(\"Empty local state\", () => {\n\t\t\t\t{\n\t\t\t\t\tconst pendingStateManager = createPendingStateManager(undefined);\n\t\t\t\t\tassert.deepStrictEqual(pendingStateManager.initialMessages.toArray(), []);\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tconst pendingStateManager = createPendingStateManager([]);\n\t\t\t\t\tassert.deepStrictEqual(pendingStateManager.initialMessages.toArray(), []);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"New format\", () => {\n\t\t\t\tconst messages = [\n\t\t\t\t\t{ type: \"message\", content: '{\"type\":\"component\"}' },\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"message\",\n\t\t\t\t\t\tcontent: '{\"type\": \"component\", \"contents\": {\"prop1\": \"value\"}}',\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t\tconst pendingStateManager = createPendingStateManager(messages);\n\t\t\t\tassert.deepStrictEqual(pendingStateManager.initialMessages.toArray(), messages);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Future op compat behavior\", () => {\n\t\t\tit(\"pending op roundtrip\", async () => {\n\t\t\t\tconst pendingStateManager = createPendingStateManager([]);\n\t\t\t\tconst futureRuntimeMessage: Pick<ISequencedDocumentMessage, \"type\" | \"contents\"> &\n\t\t\t\t\tRecentlyAddedContainerRuntimeMessageDetails = {\n\t\t\t\t\ttype: \"FROM_THE_FUTURE\",\n\t\t\t\t\tcontents: \"Hello\",\n\t\t\t\t\tcompatDetails: { behavior: \"FailToProcess\" },\n\t\t\t\t};\n\n\t\t\t\tpendingStateManager.onSubmitMessage(\n\t\t\t\t\tJSON.stringify(futureRuntimeMessage),\n\t\t\t\t\t0,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tpendingStateManager.processPendingLocalMessage(\n\t\t\t\t\tfutureRuntimeMessage as ISequencedDocumentMessage &\n\t\t\t\t\t\tUnknownContainerRuntimeMessage,\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"Pending messages state\", () => {\n\t\tconst messages = [\n\t\t\t{ type: \"message\", content: '{\"type\":\"component\"}' },\n\t\t\t{\n\t\t\t\ttype: \"message\",\n\t\t\t\tcontent: '{\"type\": \"component\", \"contents\": {\"prop1\": \"value\"}}',\n\t\t\t},\n\t\t];\n\n\t\tfunction createPendingStateManager(pendingStates): PendingStateManager_WithPrivates {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\t\treturn new PendingStateManager(\n\t\t\t\t{\n\t\t\t\t\tapplyStashedOp: async () => undefined,\n\t\t\t\t\tclientId: () => undefined,\n\t\t\t\t\tclose: () => {},\n\t\t\t\t\tconnected: () => true,\n\t\t\t\t\treSubmit: () => {},\n\t\t\t\t\treSubmitBatch: () => {},\n\t\t\t\t\tisActiveConnection: () => false,\n\t\t\t\t\tisAttached: () => true,\n\t\t\t\t},\n\t\t\t\t{ pendingStates },\n\t\t\t\tundefined /* logger */,\n\t\t\t) as any;\n\t\t}\n\n\t\tit(\"no pending or initial messages\", () => {\n\t\t\tconst pendingStateManager = createPendingStateManager(undefined);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.hasPendingMessages(),\n\t\t\t\tfalse,\n\t\t\t\t\"There shouldn't be pending messages\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.pendingMessagesCount,\n\t\t\t\t0,\n\t\t\t\t\"Pending messages count should be 0\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"has pending messages but no initial messages\", () => {\n\t\t\tconst pendingStateManager = createPendingStateManager(undefined);\n\t\t\tfor (const message of messages) {\n\t\t\t\tpendingStateManager.onSubmitMessage(\n\t\t\t\t\tJSON.stringify(message.content),\n\t\t\t\t\t0,\n\t\t\t\t\tundefined /* localOpMetadata */,\n\t\t\t\t\tundefined /* opMetadata */,\n\t\t\t\t);\n\t\t\t}\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.hasPendingMessages(),\n\t\t\t\ttrue,\n\t\t\t\t\"There should be pending messages\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.pendingMessagesCount,\n\t\t\t\tmessages.length,\n\t\t\t\t\"Pending messages count should be same as pending messages\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"has initial messages but no pending messages\", () => {\n\t\t\tconst pendingStateManager = createPendingStateManager(messages);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.hasPendingMessages(),\n\t\t\t\ttrue,\n\t\t\t\t\"There should be initial messages\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.pendingMessagesCount,\n\t\t\t\tmessages.length,\n\t\t\t\t\"Pending messages count should be same as initial messages\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"has both pending messages and initial messages\", () => {\n\t\t\tconst pendingStateManager = createPendingStateManager(messages);\n\t\t\tfor (const message of messages) {\n\t\t\t\tpendingStateManager.onSubmitMessage(\n\t\t\t\t\tJSON.stringify(message.content),\n\t\t\t\t\t0,\n\t\t\t\t\tundefined /* localOpMetadata */,\n\t\t\t\t\tundefined /* opMetadata */,\n\t\t\t\t);\n\t\t\t}\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.hasPendingMessages(),\n\t\t\t\ttrue,\n\t\t\t\t\"There should be pending messages\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.pendingMessagesCount,\n\t\t\t\tmessages.length * 2,\n\t\t\t\t\"Pending messages count should be same as pending + initial messages\",\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
|
|
@@ -1,270 +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 { EventEmitter } from "@fluid-internal/client-utils";
|
|
7
|
-
import { MessageType } from "@fluidframework/protocol-definitions";
|
|
8
|
-
import { MockDeltaManager } from "@fluidframework/test-runtime-utils";
|
|
9
|
-
import { createChildLogger } from "@fluidframework/telemetry-utils";
|
|
10
|
-
import { ScheduleManager } from "../scheduleManager.js";
|
|
11
|
-
describe("ScheduleManager", () => {
|
|
12
|
-
describe("Batch processing events", () => {
|
|
13
|
-
let batchBegin = 0;
|
|
14
|
-
let batchEnd = 0;
|
|
15
|
-
let sequenceNumber = 0;
|
|
16
|
-
let emitter;
|
|
17
|
-
let deltaManager;
|
|
18
|
-
let scheduleManager;
|
|
19
|
-
const testClientId = "test-client";
|
|
20
|
-
beforeEach(() => {
|
|
21
|
-
emitter = new EventEmitter();
|
|
22
|
-
deltaManager = new MockDeltaManager();
|
|
23
|
-
deltaManager.inbound.processCallback = (message) => {
|
|
24
|
-
scheduleManager.beforeOpProcessing(message);
|
|
25
|
-
scheduleManager.afterOpProcessing(undefined, message);
|
|
26
|
-
deltaManager.emit("op", message);
|
|
27
|
-
};
|
|
28
|
-
scheduleManager = new ScheduleManager(deltaManager, emitter, () => testClientId, createChildLogger({ namespace: "fluid:testScheduleManager" }));
|
|
29
|
-
emitter.on("batchBegin", () => {
|
|
30
|
-
// When we receive a "batchBegin" event, we should not have any outstanding
|
|
31
|
-
// events, i.e., batchBegin and batchEnd should be equal.
|
|
32
|
-
assert.strictEqual(batchBegin, batchEnd, "Received batchBegin before previous batchEnd");
|
|
33
|
-
batchBegin++;
|
|
34
|
-
});
|
|
35
|
-
emitter.on("batchEnd", () => {
|
|
36
|
-
batchEnd++;
|
|
37
|
-
// Every "batchEnd" event should correspond to a "batchBegin" event, i.e.,
|
|
38
|
-
// batchBegin and batchEnd should be equal.
|
|
39
|
-
assert.strictEqual(batchBegin, batchEnd, "Received batchEnd without corresponding batchBegin");
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
afterEach(() => {
|
|
43
|
-
batchBegin = 0;
|
|
44
|
-
batchEnd = 0;
|
|
45
|
-
sequenceNumber = 0;
|
|
46
|
-
});
|
|
47
|
-
/**
|
|
48
|
-
* Pushes single op to the inbound queue. Adds proper sequence numbers to them
|
|
49
|
-
*/
|
|
50
|
-
function pushOp(partialMessage) {
|
|
51
|
-
sequenceNumber++;
|
|
52
|
-
const message = { ...partialMessage, sequenceNumber };
|
|
53
|
-
deltaManager.inbound.push(message);
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* awaits until all ops that could be processed are processed.
|
|
57
|
-
*/
|
|
58
|
-
async function processOps() {
|
|
59
|
-
const inbound = deltaManager.inbound;
|
|
60
|
-
while (!inbound.paused && inbound.length > 0) {
|
|
61
|
-
await Promise.resolve();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
it("Single non-batch message", async () => {
|
|
65
|
-
const message = {
|
|
66
|
-
clientId: testClientId,
|
|
67
|
-
type: MessageType.Operation,
|
|
68
|
-
};
|
|
69
|
-
// Send a non-batch message.
|
|
70
|
-
pushOp(message);
|
|
71
|
-
await processOps();
|
|
72
|
-
assert.strictEqual(deltaManager.inbound.length, 0, "Did not process all ops");
|
|
73
|
-
assert.strictEqual(batchBegin, 1, "Did not receive correct batchBegin events");
|
|
74
|
-
assert.strictEqual(batchEnd, 1, "Did not receive correct batchEnd events");
|
|
75
|
-
});
|
|
76
|
-
it("Multiple non-batch messages", async () => {
|
|
77
|
-
const message = {
|
|
78
|
-
clientId: testClientId,
|
|
79
|
-
type: MessageType.Operation,
|
|
80
|
-
};
|
|
81
|
-
// Sent 5 non-batch messages.
|
|
82
|
-
pushOp(message);
|
|
83
|
-
pushOp(message);
|
|
84
|
-
pushOp(message);
|
|
85
|
-
pushOp(message);
|
|
86
|
-
pushOp(message);
|
|
87
|
-
await processOps();
|
|
88
|
-
assert.strictEqual(deltaManager.inbound.length, 0, "Did not process all ops");
|
|
89
|
-
assert.strictEqual(batchBegin, 5, "Did not receive correct batchBegin events");
|
|
90
|
-
assert.strictEqual(batchEnd, 5, "Did not receive correct batchEnd events");
|
|
91
|
-
});
|
|
92
|
-
it("Message with non batch-related metadata", async () => {
|
|
93
|
-
const message = {
|
|
94
|
-
clientId: testClientId,
|
|
95
|
-
type: MessageType.Operation,
|
|
96
|
-
metadata: { foo: 1 },
|
|
97
|
-
};
|
|
98
|
-
pushOp(message);
|
|
99
|
-
await processOps();
|
|
100
|
-
// We should have a "batchBegin" and a "batchEnd" event for the batch.
|
|
101
|
-
assert.strictEqual(deltaManager.inbound.length, 0, "Did not process all ops");
|
|
102
|
-
assert.strictEqual(batchBegin, 1, "Did not receive correct batchBegin event for the batch");
|
|
103
|
-
assert.strictEqual(batchEnd, 1, "Did not receive correct batchEnd event for the batch");
|
|
104
|
-
});
|
|
105
|
-
it("Messages in a single batch", async () => {
|
|
106
|
-
const batchBeginMessage = {
|
|
107
|
-
clientId: testClientId,
|
|
108
|
-
type: MessageType.Operation,
|
|
109
|
-
metadata: { batch: true },
|
|
110
|
-
};
|
|
111
|
-
const batchMessage = {
|
|
112
|
-
clientId: testClientId,
|
|
113
|
-
type: MessageType.Operation,
|
|
114
|
-
};
|
|
115
|
-
const batchEndMessage = {
|
|
116
|
-
clientId: testClientId,
|
|
117
|
-
type: MessageType.Operation,
|
|
118
|
-
metadata: { batch: false },
|
|
119
|
-
};
|
|
120
|
-
// Send a batch with 4 messages.
|
|
121
|
-
pushOp(batchBeginMessage);
|
|
122
|
-
pushOp(batchMessage);
|
|
123
|
-
pushOp(batchMessage);
|
|
124
|
-
await processOps();
|
|
125
|
-
assert.strictEqual(deltaManager.inbound.length, 3, "Some of partial batch ops were processed");
|
|
126
|
-
pushOp(batchEndMessage);
|
|
127
|
-
await processOps();
|
|
128
|
-
// We should have only received one "batchBegin" and one "batchEnd" event for the batch.
|
|
129
|
-
assert.strictEqual(deltaManager.inbound.length, 0, "Did not process all ops");
|
|
130
|
-
assert.strictEqual(batchBegin, 1, "Did not receive correct batchBegin event for the batch");
|
|
131
|
-
assert.strictEqual(batchEnd, 1, "Did not receive correct batchEnd event for the batch");
|
|
132
|
-
});
|
|
133
|
-
it("two batches", async () => {
|
|
134
|
-
const batchBeginMessage = {
|
|
135
|
-
clientId: testClientId,
|
|
136
|
-
type: MessageType.Operation,
|
|
137
|
-
metadata: { batch: true },
|
|
138
|
-
};
|
|
139
|
-
const batchMessage = {
|
|
140
|
-
clientId: testClientId,
|
|
141
|
-
type: MessageType.Operation,
|
|
142
|
-
};
|
|
143
|
-
const batchEndMessage = {
|
|
144
|
-
clientId: testClientId,
|
|
145
|
-
type: MessageType.Operation,
|
|
146
|
-
metadata: { batch: false },
|
|
147
|
-
};
|
|
148
|
-
// Pause to not allow ops to be processed while we accumulated them.
|
|
149
|
-
await deltaManager.inbound.pause();
|
|
150
|
-
// Send a batch with 4 messages.
|
|
151
|
-
pushOp(batchBeginMessage);
|
|
152
|
-
pushOp(batchMessage);
|
|
153
|
-
pushOp(batchMessage);
|
|
154
|
-
pushOp(batchEndMessage);
|
|
155
|
-
// Add incomplete batch
|
|
156
|
-
pushOp(batchBeginMessage);
|
|
157
|
-
pushOp(batchMessage);
|
|
158
|
-
pushOp(batchMessage);
|
|
159
|
-
assert.strictEqual(deltaManager.inbound.length, 7, "none of the batched ops are processed yet");
|
|
160
|
-
void deltaManager.inbound.resume();
|
|
161
|
-
await processOps();
|
|
162
|
-
assert.strictEqual(deltaManager.inbound.length, 3, "none of the second batch ops are processed yet");
|
|
163
|
-
assert.strictEqual(batchBegin, 1, "Did not receive correct batchBegin event for the batch");
|
|
164
|
-
assert.strictEqual(batchEnd, 1, "Did not receive correct batchEnd event for the batch");
|
|
165
|
-
// End the batch - all ops should be processed.
|
|
166
|
-
pushOp(batchEndMessage);
|
|
167
|
-
await processOps();
|
|
168
|
-
assert.strictEqual(deltaManager.inbound.length, 0, "processed all ops");
|
|
169
|
-
assert.strictEqual(batchBegin, 2, "Did not receive correct batchBegin event for the batch");
|
|
170
|
-
assert.strictEqual(batchEnd, 2, "Did not receive correct batchEnd event for the batch");
|
|
171
|
-
});
|
|
172
|
-
it("non-batched ops followed by batch", async () => {
|
|
173
|
-
const batchBeginMessage = {
|
|
174
|
-
clientId: testClientId,
|
|
175
|
-
type: MessageType.Operation,
|
|
176
|
-
metadata: { batch: true },
|
|
177
|
-
};
|
|
178
|
-
const batchMessage = {
|
|
179
|
-
clientId: testClientId,
|
|
180
|
-
type: MessageType.Operation,
|
|
181
|
-
};
|
|
182
|
-
const batchEndMessage = {
|
|
183
|
-
clientId: testClientId,
|
|
184
|
-
type: MessageType.Operation,
|
|
185
|
-
metadata: { batch: false },
|
|
186
|
-
};
|
|
187
|
-
// Pause to not allow ops to be processed while we accumulated them.
|
|
188
|
-
await deltaManager.inbound.pause();
|
|
189
|
-
// Send a batch with 2 messages.
|
|
190
|
-
pushOp(batchMessage);
|
|
191
|
-
pushOp(batchMessage);
|
|
192
|
-
// Add incomplete batch
|
|
193
|
-
pushOp(batchBeginMessage);
|
|
194
|
-
pushOp(batchMessage);
|
|
195
|
-
pushOp(batchMessage);
|
|
196
|
-
await processOps();
|
|
197
|
-
assert.strictEqual(deltaManager.inbound.length, 5, "none of the batched ops are processed yet");
|
|
198
|
-
void deltaManager.inbound.resume();
|
|
199
|
-
await processOps();
|
|
200
|
-
assert.strictEqual(deltaManager.inbound.length, 3, "none of the second batch ops are processed yet");
|
|
201
|
-
// End the batch - all ops should be processed.
|
|
202
|
-
pushOp(batchEndMessage);
|
|
203
|
-
await processOps();
|
|
204
|
-
assert.strictEqual(deltaManager.inbound.length, 0, "processed all ops");
|
|
205
|
-
assert.strictEqual(batchBegin, 3, "Did not receive correct batchBegin event for the batch");
|
|
206
|
-
assert.strictEqual(batchEnd, 3, "Did not receive correct batchEnd event for the batch");
|
|
207
|
-
});
|
|
208
|
-
function testWrongBatches() {
|
|
209
|
-
const clientId1 = "test-client-1";
|
|
210
|
-
const clientId2 = "test-client-2";
|
|
211
|
-
const batchBeginMessage = {
|
|
212
|
-
clientId: clientId1,
|
|
213
|
-
type: MessageType.Operation,
|
|
214
|
-
metadata: { batch: true },
|
|
215
|
-
};
|
|
216
|
-
const batchMessage = {
|
|
217
|
-
clientId: clientId1,
|
|
218
|
-
type: MessageType.Operation,
|
|
219
|
-
};
|
|
220
|
-
const messagesToFail = [
|
|
221
|
-
// System op from same client
|
|
222
|
-
{
|
|
223
|
-
clientId: clientId1,
|
|
224
|
-
type: MessageType.NoOp,
|
|
225
|
-
},
|
|
226
|
-
// Batch messages interleaved with a batch begin message from same client
|
|
227
|
-
batchBeginMessage,
|
|
228
|
-
// Send a message from another client. This should result in a a violation!
|
|
229
|
-
{
|
|
230
|
-
clientId: clientId2,
|
|
231
|
-
type: MessageType.Operation,
|
|
232
|
-
},
|
|
233
|
-
// Send a message from another client with non batch-related metadata. This should result
|
|
234
|
-
// in a "batchEnd" event for the previous batch since the client id changes. Also, we
|
|
235
|
-
// should get a "batchBegin" and a "batchEnd" event for the new client.
|
|
236
|
-
{
|
|
237
|
-
clientId: clientId2,
|
|
238
|
-
type: MessageType.Operation,
|
|
239
|
-
metadata: { foo: 1 },
|
|
240
|
-
},
|
|
241
|
-
// Send a batch from another client. This should result in a "batchEnd" event for the
|
|
242
|
-
// previous batch since the client id changes. Also, we should get one "batchBegin" and
|
|
243
|
-
// one "batchEnd" event for the batch from the new client.
|
|
244
|
-
{
|
|
245
|
-
clientId: clientId2,
|
|
246
|
-
type: MessageType.Operation,
|
|
247
|
-
metadata: { batch: true },
|
|
248
|
-
},
|
|
249
|
-
];
|
|
250
|
-
let counter = 0;
|
|
251
|
-
for (const messageToFail of messagesToFail) {
|
|
252
|
-
counter++;
|
|
253
|
-
it(`Partial batch messages, case ${counter}`, async () => {
|
|
254
|
-
// Send a batch with 3 messages from first client but don't send batch end message.
|
|
255
|
-
pushOp(batchBeginMessage);
|
|
256
|
-
pushOp(batchMessage);
|
|
257
|
-
pushOp(batchMessage);
|
|
258
|
-
await processOps();
|
|
259
|
-
assert.strictEqual(deltaManager.inbound.length, 3, "Some of partial batch ops were processed");
|
|
260
|
-
assert.throws(() => pushOp(messageToFail));
|
|
261
|
-
assert.strictEqual(deltaManager.inbound.length, 4, "Some of batch ops were processed");
|
|
262
|
-
assert.strictEqual(batchBegin, 0, "Did not receive correct batchBegin event for the batch");
|
|
263
|
-
assert.strictEqual(batchEnd, 0, "Did not receive correct batchBegin event for the batch");
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
testWrongBatches();
|
|
268
|
-
});
|
|
269
|
-
});
|
|
270
|
-
//# sourceMappingURL=scheduleManager.spec.js.map
|