@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
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { decompress } from "lz4js";
|
|
7
|
-
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
8
|
-
import { assert } from "@fluidframework/core-utils";
|
|
9
6
|
import { IsoBuffer, Uint8ArrayToString } from "@fluid-internal/client-utils";
|
|
10
|
-
import { createChildLogger } from "@fluidframework/telemetry-utils";
|
|
11
7
|
import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
8
|
+
import { assert } from "@fluidframework/core-utils/internal";
|
|
9
|
+
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
10
|
+
import { createChildLogger } from "@fluidframework/telemetry-utils/internal";
|
|
11
|
+
import { decompress } from "lz4js";
|
|
12
|
+
|
|
12
13
|
import { CompressionAlgorithms } from "../containerRuntime.js";
|
|
13
14
|
import { IBatchMetadata } from "../metadata.js";
|
|
14
|
-
import { IMessageProcessingResult } from "./definitions.js";
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* Compression makes assumptions about the shape of message contents. This interface codifies those assumptions, but does not validate them.
|
|
@@ -38,100 +38,7 @@ export class OpDecompressor {
|
|
|
38
38
|
this.logger = createChildLogger({ logger, namespace: "OpDecompressor" });
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
public
|
|
42
|
-
assert(
|
|
43
|
-
message.compression === undefined || message.compression === CompressionAlgorithms.lz4,
|
|
44
|
-
0x511 /* Only lz4 compression is supported */,
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
if (
|
|
48
|
-
(message.metadata as IBatchMetadata | undefined)?.batch === true &&
|
|
49
|
-
this.isCompressed(message)
|
|
50
|
-
) {
|
|
51
|
-
// Beginning of a compressed batch
|
|
52
|
-
assert(this.activeBatch === false, 0x4b8 /* shouldn't have multiple active batches */);
|
|
53
|
-
this.activeBatch = true;
|
|
54
|
-
|
|
55
|
-
const contents = IsoBuffer.from(
|
|
56
|
-
(message.contents as IPackedContentsContents).packedContents,
|
|
57
|
-
"base64",
|
|
58
|
-
);
|
|
59
|
-
const decompressedMessage = decompress(contents);
|
|
60
|
-
const intoString = Uint8ArrayToString(decompressedMessage);
|
|
61
|
-
const asObj = JSON.parse(intoString);
|
|
62
|
-
this.rootMessageContents = asObj;
|
|
63
|
-
|
|
64
|
-
return {
|
|
65
|
-
message: newMessage(message, this.rootMessageContents[this.processedCount++]),
|
|
66
|
-
state: "Accepted",
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (
|
|
71
|
-
this.rootMessageContents !== undefined &&
|
|
72
|
-
(message.metadata as IBatchMetadata | undefined)?.batch === undefined &&
|
|
73
|
-
this.activeBatch
|
|
74
|
-
) {
|
|
75
|
-
assert(message.contents === undefined, 0x512 /* Expecting empty message */);
|
|
76
|
-
|
|
77
|
-
// Continuation of compressed batch
|
|
78
|
-
return {
|
|
79
|
-
message: newMessage(message, this.rootMessageContents[this.processedCount++]),
|
|
80
|
-
state: "Accepted",
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (
|
|
85
|
-
this.rootMessageContents !== undefined &&
|
|
86
|
-
(message.metadata as IBatchMetadata | undefined)?.batch === false
|
|
87
|
-
) {
|
|
88
|
-
// End of compressed batch
|
|
89
|
-
const returnMessage = newMessage(
|
|
90
|
-
message,
|
|
91
|
-
this.rootMessageContents[this.processedCount++],
|
|
92
|
-
);
|
|
93
|
-
|
|
94
|
-
this.activeBatch = false;
|
|
95
|
-
this.rootMessageContents = undefined;
|
|
96
|
-
this.processedCount = 0;
|
|
97
|
-
|
|
98
|
-
return {
|
|
99
|
-
message: returnMessage,
|
|
100
|
-
state: "Processed",
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (
|
|
105
|
-
(message.metadata as IBatchMetadata | undefined)?.batch === undefined &&
|
|
106
|
-
this.isCompressed(message)
|
|
107
|
-
) {
|
|
108
|
-
// Single compressed message
|
|
109
|
-
assert(
|
|
110
|
-
this.activeBatch === false,
|
|
111
|
-
0x4ba /* shouldn't receive compressed message in middle of a batch */,
|
|
112
|
-
);
|
|
113
|
-
|
|
114
|
-
const contents = IsoBuffer.from(
|
|
115
|
-
(message.contents as IPackedContentsContents).packedContents,
|
|
116
|
-
"base64",
|
|
117
|
-
);
|
|
118
|
-
const decompressedMessage = decompress(contents);
|
|
119
|
-
const intoString = new TextDecoder().decode(decompressedMessage);
|
|
120
|
-
const asObj = JSON.parse(intoString);
|
|
121
|
-
|
|
122
|
-
return {
|
|
123
|
-
message: newMessage(message, asObj[0]),
|
|
124
|
-
state: "Processed",
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
return {
|
|
129
|
-
message,
|
|
130
|
-
state: "Skipped",
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
private isCompressed(message: ISequencedDocumentMessage) {
|
|
41
|
+
public isCompressedMessage(message: ISequencedDocumentMessage): boolean {
|
|
135
42
|
if (message.compression === CompressionAlgorithms.lz4) {
|
|
136
43
|
return true;
|
|
137
44
|
}
|
|
@@ -174,6 +81,86 @@ export class OpDecompressor {
|
|
|
174
81
|
|
|
175
82
|
return false;
|
|
176
83
|
}
|
|
84
|
+
|
|
85
|
+
public get currentlyUnrolling() {
|
|
86
|
+
return this.activeBatch;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Is the decompressed and stored batch only comprised of a single message */
|
|
90
|
+
private isSingleMessageBatch = false;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Decompress the given compressed message and store it to be subsequently unrolled.
|
|
94
|
+
* The stored message will be of type `any[]` where each element represents a message's `contents`
|
|
95
|
+
*/
|
|
96
|
+
public decompressAndStore(message: ISequencedDocumentMessage): void {
|
|
97
|
+
assert(
|
|
98
|
+
message.compression === undefined || message.compression === CompressionAlgorithms.lz4,
|
|
99
|
+
0x511 /* Only lz4 compression is supported */,
|
|
100
|
+
);
|
|
101
|
+
assert(
|
|
102
|
+
this.isCompressedMessage(message),
|
|
103
|
+
0x940 /* provided message should be compressed */,
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
assert(this.activeBatch === false, 0x4b8 /* shouldn't have multiple active batches */);
|
|
107
|
+
this.activeBatch = true;
|
|
108
|
+
|
|
109
|
+
const batchMetadata = (message.metadata as IBatchMetadata | undefined)?.batch;
|
|
110
|
+
if (batchMetadata === undefined) {
|
|
111
|
+
this.isSingleMessageBatch = true;
|
|
112
|
+
} else {
|
|
113
|
+
assert(batchMetadata === true, 0x941 /* invalid batch metadata */);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const contents = IsoBuffer.from(
|
|
117
|
+
(message.contents as IPackedContentsContents).packedContents,
|
|
118
|
+
"base64",
|
|
119
|
+
);
|
|
120
|
+
const decompressedMessage = decompress(contents);
|
|
121
|
+
const intoString = Uint8ArrayToString(decompressedMessage);
|
|
122
|
+
const asObj = JSON.parse(intoString);
|
|
123
|
+
this.rootMessageContents = asObj;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Unroll the next message from the decompressed content provided to {@link decompressAndStore}
|
|
128
|
+
* @returns the unrolled `ISequencedDocumentMessage`
|
|
129
|
+
*/
|
|
130
|
+
public unroll(message: ISequencedDocumentMessage): ISequencedDocumentMessage {
|
|
131
|
+
assert(this.currentlyUnrolling, 0x942 /* not currently unrolling */);
|
|
132
|
+
assert(this.rootMessageContents !== undefined, 0x943 /* missing rootMessageContents */);
|
|
133
|
+
assert(
|
|
134
|
+
this.rootMessageContents.length > this.processedCount,
|
|
135
|
+
0x944 /* no more content to unroll */,
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
const batchMetadata = (message.metadata as IBatchMetadata | undefined)?.batch;
|
|
139
|
+
|
|
140
|
+
if (batchMetadata === false || this.isSingleMessageBatch) {
|
|
141
|
+
// End of compressed batch
|
|
142
|
+
const returnMessage = newMessage(
|
|
143
|
+
message,
|
|
144
|
+
this.rootMessageContents[this.processedCount],
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
this.activeBatch = false;
|
|
148
|
+
this.isSingleMessageBatch = false;
|
|
149
|
+
this.rootMessageContents = undefined;
|
|
150
|
+
this.processedCount = 0;
|
|
151
|
+
|
|
152
|
+
return returnMessage;
|
|
153
|
+
} else if (batchMetadata === true) {
|
|
154
|
+
// Start of compressed batch
|
|
155
|
+
return newMessage(message, this.rootMessageContents[this.processedCount++]);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
assert(batchMetadata === undefined, 0x945 /* invalid batch metadata */);
|
|
159
|
+
assert(message.contents === undefined, 0x512 /* Expecting empty message */);
|
|
160
|
+
|
|
161
|
+
// Continuation of compressed batch
|
|
162
|
+
return newMessage(message, this.rootMessageContents[this.processedCount++]);
|
|
163
|
+
}
|
|
177
164
|
}
|
|
178
165
|
|
|
179
166
|
// We should not be mutating the input message nor its metadata
|
|
@@ -186,5 +173,8 @@ const newMessage = (
|
|
|
186
173
|
compression: undefined,
|
|
187
174
|
// TODO: It should already be the case that we're not modifying any metadata, not clear if/why this shallow clone should be required.
|
|
188
175
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
|
|
189
|
-
metadata:
|
|
176
|
+
metadata:
|
|
177
|
+
originalMessage.metadata === undefined
|
|
178
|
+
? undefined
|
|
179
|
+
: { ...(originalMessage.metadata as any) },
|
|
190
180
|
});
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { assert } from "@fluidframework/core-utils";
|
|
7
|
-
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
8
|
-
import { createChildLogger } from "@fluidframework/telemetry-utils";
|
|
9
6
|
import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
10
|
-
import {
|
|
7
|
+
import { assert } from "@fluidframework/core-utils/internal";
|
|
8
|
+
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
9
|
+
import { createChildLogger } from "@fluidframework/telemetry-utils/internal";
|
|
10
|
+
|
|
11
11
|
import { IBatch } from "./definitions.js";
|
|
12
12
|
|
|
13
13
|
/**
|
|
@@ -28,6 +28,10 @@ function isGroupContents(opContents: any): opContents is IGroupedBatchMessageCon
|
|
|
28
28
|
return opContents?.type === OpGroupingManager.groupedBatchOp;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
export function isGroupedBatch(op: ISequencedDocumentMessage): boolean {
|
|
32
|
+
return isGroupContents(op.contents);
|
|
33
|
+
}
|
|
34
|
+
|
|
31
35
|
export interface OpGroupingManagerConfig {
|
|
32
36
|
readonly groupedBatchingEnabled: boolean;
|
|
33
37
|
readonly opCountThreshold: number;
|
|
@@ -46,9 +50,7 @@ export class OpGroupingManager {
|
|
|
46
50
|
}
|
|
47
51
|
|
|
48
52
|
public groupBatch(batch: IBatch): IBatch {
|
|
49
|
-
|
|
50
|
-
return batch;
|
|
51
|
-
}
|
|
53
|
+
assert(this.shouldGroup(batch), 0x946 /* cannot group the provided batch */);
|
|
52
54
|
|
|
53
55
|
if (batch.content.length >= 1000) {
|
|
54
56
|
this.logger.sendTelemetryEvent({
|
|
@@ -84,11 +86,9 @@ export class OpGroupingManager {
|
|
|
84
86
|
...batch,
|
|
85
87
|
content: [
|
|
86
88
|
{
|
|
87
|
-
localOpMetadata: undefined,
|
|
88
89
|
metadata: undefined,
|
|
89
90
|
referenceSequenceNumber: batch.content[0].referenceSequenceNumber,
|
|
90
91
|
contents: serializedContent,
|
|
91
|
-
type: OpGroupingManager.groupedBatchOp as ContainerMessageType,
|
|
92
92
|
},
|
|
93
93
|
],
|
|
94
94
|
};
|
|
@@ -96,13 +96,11 @@ export class OpGroupingManager {
|
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
public ungroupOp(op: ISequencedDocumentMessage): ISequencedDocumentMessage[] {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
99
|
+
assert(isGroupContents(op.contents), 0x947 /* can only ungroup a grouped batch */);
|
|
100
|
+
const contents: IGroupedBatchMessageContents = op.contents;
|
|
102
101
|
|
|
103
|
-
const messages = op.contents.contents;
|
|
104
102
|
let fakeCsn = 1;
|
|
105
|
-
return
|
|
103
|
+
return contents.contents.map((subMessage) => ({
|
|
106
104
|
...op,
|
|
107
105
|
clientSequenceNumber: fakeCsn++,
|
|
108
106
|
contents: subMessage.contents,
|
|
@@ -3,18 +3,33 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
import { IBatchMessage } from "@fluidframework/container-definitions/internal";
|
|
7
|
+
import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
8
|
+
import { assert } from "@fluidframework/core-utils/internal";
|
|
9
|
+
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
6
10
|
import {
|
|
7
|
-
createChildLogger,
|
|
8
11
|
DataCorruptionError,
|
|
12
|
+
createChildLogger,
|
|
9
13
|
extractSafePropertiesFromMessage,
|
|
10
|
-
} from "@fluidframework/telemetry-utils";
|
|
11
|
-
|
|
12
|
-
import { IBatchMessage } from "@fluidframework/container-definitions";
|
|
13
|
-
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
14
|
-
import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
14
|
+
} from "@fluidframework/telemetry-utils/internal";
|
|
15
|
+
|
|
15
16
|
import { ContainerMessageType, ContainerRuntimeChunkedOpMessage } from "../messageTypes.js";
|
|
17
|
+
|
|
16
18
|
import { estimateSocketSize } from "./batchManager.js";
|
|
17
|
-
import { BatchMessage, IBatch, IChunkedOp
|
|
19
|
+
import { BatchMessage, IBatch, IChunkedOp } from "./definitions.js";
|
|
20
|
+
|
|
21
|
+
export function isChunkedMessage(message: ISequencedDocumentMessage): boolean {
|
|
22
|
+
return isChunkedContents(message.contents);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface IChunkedContents {
|
|
26
|
+
type: typeof ContainerMessageType.ChunkedOp;
|
|
27
|
+
contents: IChunkedOp;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function isChunkedContents(contents: any): contents is IChunkedContents {
|
|
31
|
+
return contents?.type === ContainerMessageType.ChunkedOp;
|
|
32
|
+
}
|
|
18
33
|
|
|
19
34
|
/**
|
|
20
35
|
* Responsible for creating and reconstructing chunked messages.
|
|
@@ -45,44 +60,6 @@ export class OpSplitter {
|
|
|
45
60
|
return this.chunkMap;
|
|
46
61
|
}
|
|
47
62
|
|
|
48
|
-
public processRemoteMessage(message: ISequencedDocumentMessage): IMessageProcessingResult {
|
|
49
|
-
if (message.type !== ContainerMessageType.ChunkedOp) {
|
|
50
|
-
return {
|
|
51
|
-
message,
|
|
52
|
-
state: "Skipped",
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// TODO: Verify whether this should be able to handle server-generated ops (with null clientId)
|
|
57
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
|
|
58
|
-
const clientId = message.clientId as string;
|
|
59
|
-
const chunkedContent = message.contents as IChunkedOp;
|
|
60
|
-
this.addChunk(clientId, chunkedContent, message);
|
|
61
|
-
|
|
62
|
-
if (chunkedContent.chunkId < chunkedContent.totalChunks) {
|
|
63
|
-
// We are processing the op in chunks but haven't reached
|
|
64
|
-
// the last chunk yet in order to reconstruct the original op
|
|
65
|
-
return {
|
|
66
|
-
message,
|
|
67
|
-
state: "Accepted",
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
72
|
-
const serializedContent = this.chunkMap.get(clientId)!.join("");
|
|
73
|
-
this.clearPartialChunks(clientId);
|
|
74
|
-
|
|
75
|
-
const newMessage = { ...message };
|
|
76
|
-
newMessage.contents = serializedContent === "" ? undefined : JSON.parse(serializedContent);
|
|
77
|
-
newMessage.type = chunkedContent.originalType;
|
|
78
|
-
newMessage.metadata = chunkedContent.originalMetadata;
|
|
79
|
-
newMessage.compression = chunkedContent.originalCompression;
|
|
80
|
-
return {
|
|
81
|
-
message: newMessage,
|
|
82
|
-
state: "Processed",
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
|
|
86
63
|
public clearPartialChunks(clientId: string) {
|
|
87
64
|
if (this.chunkMap.has(clientId)) {
|
|
88
65
|
this.chunkMap.delete(clientId);
|
|
@@ -203,8 +180,53 @@ export class OpSplitter {
|
|
|
203
180
|
referenceSequenceNumber: batch.referenceSequenceNumber,
|
|
204
181
|
};
|
|
205
182
|
}
|
|
183
|
+
|
|
184
|
+
public processChunk(message: ISequencedDocumentMessage): ProcessChunkResult {
|
|
185
|
+
assert(isChunkedContents(message.contents), 0x948 /* message not of type ChunkedOp */);
|
|
186
|
+
const contents: IChunkedContents = message.contents;
|
|
187
|
+
|
|
188
|
+
// TODO: Verify whether this should be able to handle server-generated ops (with null clientId)
|
|
189
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
|
|
190
|
+
const clientId = message.clientId as string;
|
|
191
|
+
const chunkedContent = contents.contents;
|
|
192
|
+
this.addChunk(clientId, chunkedContent, message);
|
|
193
|
+
|
|
194
|
+
if (chunkedContent.chunkId < chunkedContent.totalChunks) {
|
|
195
|
+
// We are processing the op in chunks but haven't reached
|
|
196
|
+
// the last chunk yet in order to reconstruct the original op
|
|
197
|
+
return {
|
|
198
|
+
isFinalChunk: false,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
203
|
+
const serializedContent = this.chunkMap.get(clientId)!.join("");
|
|
204
|
+
this.clearPartialChunks(clientId);
|
|
205
|
+
|
|
206
|
+
const newMessage = { ...message };
|
|
207
|
+
newMessage.contents = serializedContent === "" ? undefined : JSON.parse(serializedContent);
|
|
208
|
+
// back-compat with 1.x builds
|
|
209
|
+
// This is only required / present for non-compressed, chunked ops
|
|
210
|
+
// For compressed ops, we have op grouping enabled, and type of each op is preserved within compressed content.
|
|
211
|
+
newMessage.type = (chunkedContent as any).originalType;
|
|
212
|
+
newMessage.metadata = chunkedContent.originalMetadata;
|
|
213
|
+
newMessage.compression = chunkedContent.originalCompression;
|
|
214
|
+
return {
|
|
215
|
+
message: newMessage,
|
|
216
|
+
isFinalChunk: true,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
206
219
|
}
|
|
207
220
|
|
|
221
|
+
type ProcessChunkResult =
|
|
222
|
+
| {
|
|
223
|
+
readonly isFinalChunk: false;
|
|
224
|
+
}
|
|
225
|
+
| {
|
|
226
|
+
readonly isFinalChunk: true;
|
|
227
|
+
readonly message: ISequencedDocumentMessage;
|
|
228
|
+
};
|
|
229
|
+
|
|
208
230
|
const chunkToBatchMessage = (
|
|
209
231
|
chunk: IChunkedOp,
|
|
210
232
|
referenceSequenceNumber: number,
|
|
@@ -216,9 +238,7 @@ const chunkToBatchMessage = (
|
|
|
216
238
|
};
|
|
217
239
|
return {
|
|
218
240
|
contents: JSON.stringify(payload),
|
|
219
|
-
type: payload.type,
|
|
220
241
|
metadata,
|
|
221
|
-
localOpMetadata: undefined,
|
|
222
242
|
referenceSequenceNumber,
|
|
223
243
|
};
|
|
224
244
|
};
|
|
@@ -253,7 +273,6 @@ export const splitOp = (
|
|
|
253
273
|
const chunk: IChunkedOp = {
|
|
254
274
|
chunkId,
|
|
255
275
|
contents: op.contents.substr(offset, chunkSizeInBytes),
|
|
256
|
-
originalType: op.type,
|
|
257
276
|
totalChunks: chunkCount,
|
|
258
277
|
};
|
|
259
278
|
|
|
@@ -263,6 +282,15 @@ export const splitOp = (
|
|
|
263
282
|
// last chunk, therefore it is the only one that needs it.
|
|
264
283
|
chunk.originalMetadata = op.metadata;
|
|
265
284
|
chunk.originalCompression = op.compression;
|
|
285
|
+
|
|
286
|
+
// back-compat with 1.x builds
|
|
287
|
+
// 2.x builds only do chunking for compressed ops.
|
|
288
|
+
// originalType is no longer used in such cases, as each op preserves its type within compressed payload.
|
|
289
|
+
// But, if 1.x builds see this op, and there is no type on the message, then it will ignore this message silently.
|
|
290
|
+
// This is really bad, as we will crash on later ops and it's very hard to debug these cases.
|
|
291
|
+
// If we put some known type here, then we will crash on it (as 1.x does not understand compression, and thus will not
|
|
292
|
+
// find info on the op like address of the channel to deliver the op)
|
|
293
|
+
(chunk as any).originalType = "component";
|
|
266
294
|
}
|
|
267
295
|
|
|
268
296
|
chunks.push(chunk);
|
|
@@ -3,18 +3,20 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
import { ICriticalContainerError } from "@fluidframework/container-definitions";
|
|
7
|
+
import { IBatchMessage } from "@fluidframework/container-definitions/internal";
|
|
8
|
+
import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
9
|
+
import { assert } from "@fluidframework/core-utils/internal";
|
|
6
10
|
import {
|
|
7
|
-
createChildMonitoringContext,
|
|
8
11
|
GenericError,
|
|
9
12
|
MonitoringContext,
|
|
10
13
|
UsageError,
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
14
|
+
createChildMonitoringContext,
|
|
15
|
+
} from "@fluidframework/telemetry-utils/internal";
|
|
16
|
+
|
|
15
17
|
import { ICompressionRuntimeOptions } from "../containerRuntime.js";
|
|
16
18
|
import { IPendingBatchMessage, PendingStateManager } from "../pendingStateManager.js";
|
|
17
|
-
|
|
19
|
+
|
|
18
20
|
import {
|
|
19
21
|
BatchManager,
|
|
20
22
|
BatchSequenceNumbers,
|
|
@@ -120,7 +122,12 @@ export class Outbox {
|
|
|
120
122
|
}
|
|
121
123
|
|
|
122
124
|
public get messageCount(): number {
|
|
123
|
-
return
|
|
125
|
+
return (
|
|
126
|
+
this.attachFlowBatch.length +
|
|
127
|
+
this.mainBatch.length +
|
|
128
|
+
this.blobAttachBatch.length +
|
|
129
|
+
this.idAllocationBatch.length
|
|
130
|
+
);
|
|
124
131
|
}
|
|
125
132
|
|
|
126
133
|
public get isEmpty(): boolean {
|
|
@@ -182,20 +189,12 @@ export class Outbox {
|
|
|
182
189
|
}
|
|
183
190
|
|
|
184
191
|
public submit(message: BatchMessage) {
|
|
185
|
-
assert(
|
|
186
|
-
message.type !== ContainerMessageType.IdAllocation,
|
|
187
|
-
0x8f8 /* Allocation message submitted to mainBatch. */,
|
|
188
|
-
);
|
|
189
192
|
this.maybeFlushPartialBatch();
|
|
190
193
|
|
|
191
194
|
this.addMessageToBatchManager(this.mainBatch, message);
|
|
192
195
|
}
|
|
193
196
|
|
|
194
197
|
public submitAttach(message: BatchMessage) {
|
|
195
|
-
assert(
|
|
196
|
-
message.type === ContainerMessageType.Attach,
|
|
197
|
-
0x8f9 /* Non attach message submitted to attachFlowBatch. */,
|
|
198
|
-
);
|
|
199
198
|
this.maybeFlushPartialBatch();
|
|
200
199
|
|
|
201
200
|
if (
|
|
@@ -227,10 +226,6 @@ export class Outbox {
|
|
|
227
226
|
}
|
|
228
227
|
|
|
229
228
|
public submitBlobAttach(message: BatchMessage) {
|
|
230
|
-
assert(
|
|
231
|
-
message.type === ContainerMessageType.BlobAttach,
|
|
232
|
-
0x8fa /* Non blobAttach message submitted to blobAttachBatch. */,
|
|
233
|
-
);
|
|
234
229
|
this.maybeFlushPartialBatch();
|
|
235
230
|
|
|
236
231
|
this.addMessageToBatchManager(this.blobAttachBatch, message);
|
|
@@ -249,10 +244,6 @@ export class Outbox {
|
|
|
249
244
|
}
|
|
250
245
|
|
|
251
246
|
public submitIdAllocation(message: BatchMessage) {
|
|
252
|
-
assert(
|
|
253
|
-
message.type === ContainerMessageType.IdAllocation,
|
|
254
|
-
0x8fb /* Non allocation message submitted to idAllocationBatch. */,
|
|
255
|
-
);
|
|
256
247
|
this.maybeFlushPartialBatch();
|
|
257
248
|
|
|
258
249
|
if (
|
|
@@ -323,10 +314,9 @@ export class Outbox {
|
|
|
323
314
|
}
|
|
324
315
|
|
|
325
316
|
const rawBatch = batchManager.popBatch();
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
) {
|
|
317
|
+
const shouldGroup =
|
|
318
|
+
!disableGroupedBatching && this.params.groupingManager.shouldGroup(rawBatch);
|
|
319
|
+
if (rawBatch.hasReentrantOps === true && shouldGroup) {
|
|
330
320
|
assert(!this.rebasing, 0x6fa /* A rebased batch should never have reentrant ops */);
|
|
331
321
|
// If a batch contains reentrant ops (ops created as a result from processing another op)
|
|
332
322
|
// it needs to be rebased so that we can ensure consistent reference sequence numbers
|
|
@@ -335,8 +325,15 @@ export class Outbox {
|
|
|
335
325
|
return;
|
|
336
326
|
}
|
|
337
327
|
|
|
338
|
-
|
|
339
|
-
|
|
328
|
+
// Did we disconnect?
|
|
329
|
+
// If so, do nothing, as pending state manager will resubmit it correctly on reconnect.
|
|
330
|
+
// Because flush() is a task that executes async (on clean stack), we can get here in disconnected state.
|
|
331
|
+
if (this.params.shouldSend()) {
|
|
332
|
+
const processedBatch = this.compressBatch(
|
|
333
|
+
shouldGroup ? this.params.groupingManager.groupBatch(rawBatch) : rawBatch,
|
|
334
|
+
);
|
|
335
|
+
this.sendBatch(processedBatch);
|
|
336
|
+
}
|
|
340
337
|
|
|
341
338
|
this.persistBatch(rawBatch.content);
|
|
342
339
|
}
|
|
@@ -380,7 +377,7 @@ export class Outbox {
|
|
|
380
377
|
return this.params.opReentrancy() && !this.rebasing;
|
|
381
378
|
}
|
|
382
379
|
|
|
383
|
-
private compressBatch(batch: IBatch
|
|
380
|
+
private compressBatch(batch: IBatch): IBatch {
|
|
384
381
|
if (
|
|
385
382
|
batch.content.length === 0 ||
|
|
386
383
|
this.params.config.compressionOptions === undefined ||
|
|
@@ -389,12 +386,10 @@ export class Outbox {
|
|
|
389
386
|
this.params.submitBatchFn === undefined
|
|
390
387
|
) {
|
|
391
388
|
// Nothing to do if the batch is empty or if compression is disabled or not supported, or if we don't need to compress
|
|
392
|
-
return
|
|
389
|
+
return batch;
|
|
393
390
|
}
|
|
394
391
|
|
|
395
|
-
const compressedBatch = this.params.compressor.compressBatch(
|
|
396
|
-
disableGroupedBatching ? batch : this.params.groupingManager.groupBatch(batch),
|
|
397
|
-
);
|
|
392
|
+
const compressedBatch = this.params.compressor.compressBatch(batch);
|
|
398
393
|
|
|
399
394
|
if (this.params.splitter.isBatchChunkingEnabled) {
|
|
400
395
|
return compressedBatch.contentSizeInBytes <= this.params.splitter.chunkSizeInBytes
|
|
@@ -424,10 +419,7 @@ export class Outbox {
|
|
|
424
419
|
*/
|
|
425
420
|
private sendBatch(batch: IBatch) {
|
|
426
421
|
const length = batch.content.length;
|
|
427
|
-
|
|
428
|
-
// Did we disconnect in the middle of turn-based batch?
|
|
429
|
-
// If so, do nothing, as pending state manager will resubmit it correctly on reconnect.
|
|
430
|
-
if (length === 0 || !this.params.shouldSend()) {
|
|
422
|
+
if (length === 0) {
|
|
431
423
|
return;
|
|
432
424
|
}
|
|
433
425
|
|