@fluidframework/container-runtime 2.0.0-dev.5.2.0.169897 → 2.0.0-dev.6.4.0.191258
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 +147 -0
- package/README.md +4 -3
- package/dist/batchTracker.d.ts +3 -2
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +6 -5
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +15 -18
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +212 -171
- package/dist/blobManager.js.map +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +33 -17
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +172 -35
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +722 -425
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +15 -7
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +4 -4
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +87 -90
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +10 -10
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.js +2 -2
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/dataStores.d.ts +23 -7
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +125 -82
- package/dist/dataStores.js.map +1 -1
- package/dist/deltaManagerProxyBase.d.ts +35 -0
- package/dist/deltaManagerProxyBase.d.ts.map +1 -0
- package/dist/deltaManagerProxyBase.js +77 -0
- package/dist/deltaManagerProxyBase.js.map +1 -0
- package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/dist/deltaManagerSummarizerProxy.js +4 -2
- package/dist/deltaManagerSummarizerProxy.js.map +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +10 -10
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/error.d.ts +14 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +21 -0
- package/dist/error.js.map +1 -0
- package/dist/gc/garbageCollection.d.ts +10 -9
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +65 -56
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +18 -14
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +17 -5
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js +14 -15
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +0 -8
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +11 -24
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +4 -7
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +19 -58
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +45 -35
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js +4 -4
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/gc/index.d.ts +2 -2
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +3 -5
- package/dist/gc/index.js.map +1 -1
- package/dist/id-compressor/appendOnlySortedMap.d.ts +8 -30
- package/dist/id-compressor/appendOnlySortedMap.d.ts.map +1 -1
- package/dist/id-compressor/appendOnlySortedMap.js +26 -68
- package/dist/id-compressor/appendOnlySortedMap.js.map +1 -1
- package/dist/id-compressor/finalSpace.d.ts +29 -0
- package/dist/id-compressor/finalSpace.d.ts.map +1 -0
- package/dist/id-compressor/finalSpace.js +62 -0
- package/dist/id-compressor/finalSpace.js.map +1 -0
- package/dist/id-compressor/idCompressor.d.ts +25 -250
- package/dist/id-compressor/idCompressor.d.ts.map +1 -1
- package/dist/id-compressor/idCompressor.js +390 -1153
- package/dist/id-compressor/idCompressor.js.map +1 -1
- package/dist/id-compressor/identifiers.d.ts +32 -0
- package/dist/id-compressor/identifiers.d.ts.map +1 -0
- package/dist/id-compressor/identifiers.js +15 -0
- package/dist/id-compressor/identifiers.js.map +1 -0
- package/dist/id-compressor/index.d.ts +5 -6
- package/dist/id-compressor/index.d.ts.map +1 -1
- package/dist/id-compressor/index.js +20 -26
- package/dist/id-compressor/index.js.map +1 -1
- package/dist/id-compressor/persistanceUtilities.d.ts +22 -0
- package/dist/id-compressor/persistanceUtilities.d.ts.map +1 -0
- package/dist/id-compressor/persistanceUtilities.js +43 -0
- package/dist/id-compressor/persistanceUtilities.js.map +1 -0
- package/dist/id-compressor/sessionSpaceNormalizer.d.ts +46 -0
- package/dist/id-compressor/sessionSpaceNormalizer.d.ts.map +1 -0
- package/dist/id-compressor/sessionSpaceNormalizer.js +80 -0
- package/dist/id-compressor/sessionSpaceNormalizer.js.map +1 -0
- package/dist/id-compressor/sessions.d.ts +115 -0
- package/dist/id-compressor/sessions.d.ts.map +1 -0
- package/dist/id-compressor/sessions.js +305 -0
- package/dist/id-compressor/sessions.js.map +1 -0
- package/dist/id-compressor/utilities.d.ts +49 -0
- package/dist/id-compressor/utilities.d.ts.map +1 -0
- package/dist/id-compressor/utilities.js +166 -0
- package/dist/id-compressor/utilities.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/metadata.d.ts +18 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +7 -0
- package/dist/metadata.js.map +1 -0
- package/dist/opLifecycle/batchManager.d.ts +2 -1
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js +15 -7
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +11 -0
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +1 -1
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +2 -1
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts +2 -2
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +12 -7
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +2 -2
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +30 -21
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +19 -13
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +2 -2
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +24 -19
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +39 -6
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +138 -61
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +6 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +22 -8
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/opProperties.js +1 -2
- package/dist/opProperties.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 +25 -10
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +101 -64
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +43 -33
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/index.d.ts +4 -4
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +3 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +3 -3
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +26 -27
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js +3 -3
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +31 -10
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +271 -139
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +8 -7
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +79 -78
- 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 +7 -11
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.js +10 -14
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/index.d.ts +1 -1
- package/dist/summary/summarizerNode/index.d.ts.map +1 -1
- package/dist/summary/summarizerNode/index.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +40 -23
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +144 -149
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +25 -29
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +2 -4
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +21 -16
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +74 -123
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +44 -24
- 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 +16 -13
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +4 -0
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js +8 -5
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +21 -6
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +117 -54
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +8 -7
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +38 -28
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/batchTracker.d.ts +3 -2
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +5 -4
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +15 -18
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +187 -146
- package/lib/blobManager.js.map +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +23 -7
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +172 -35
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +678 -380
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +13 -5
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +4 -4
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +49 -52
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts +1 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +3 -3
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.js +1 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/dataStores.d.ts +23 -7
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +107 -64
- package/lib/dataStores.js.map +1 -1
- package/lib/deltaManagerProxyBase.d.ts +35 -0
- package/lib/deltaManagerProxyBase.d.ts.map +1 -0
- package/lib/deltaManagerProxyBase.js +73 -0
- package/lib/deltaManagerProxyBase.js.map +1 -0
- package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/lib/deltaManagerSummarizerProxy.js +3 -1
- package/lib/deltaManagerSummarizerProxy.js.map +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +7 -7
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/error.d.ts +14 -0
- package/lib/error.d.ts.map +1 -0
- package/lib/error.js +17 -0
- package/lib/error.js.map +1 -0
- package/lib/gc/garbageCollection.d.ts +10 -9
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +61 -52
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +16 -12
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +17 -5
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js +13 -14
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts +0 -8
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +5 -17
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts +4 -7
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +20 -59
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +46 -36
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/lib/gc/index.d.ts +2 -2
- package/lib/gc/index.d.ts.map +1 -1
- package/lib/gc/index.js +2 -2
- package/lib/gc/index.js.map +1 -1
- package/lib/id-compressor/appendOnlySortedMap.d.ts +8 -30
- package/lib/id-compressor/appendOnlySortedMap.d.ts.map +1 -1
- package/lib/id-compressor/appendOnlySortedMap.js +25 -66
- package/lib/id-compressor/appendOnlySortedMap.js.map +1 -1
- package/lib/id-compressor/finalSpace.d.ts +29 -0
- package/lib/id-compressor/finalSpace.d.ts.map +1 -0
- package/lib/id-compressor/finalSpace.js +58 -0
- package/lib/id-compressor/finalSpace.js.map +1 -0
- package/lib/id-compressor/idCompressor.d.ts +25 -250
- package/lib/id-compressor/idCompressor.d.ts.map +1 -1
- package/lib/id-compressor/idCompressor.js +385 -1142
- package/lib/id-compressor/idCompressor.js.map +1 -1
- package/lib/id-compressor/identifiers.d.ts +32 -0
- package/lib/id-compressor/identifiers.d.ts.map +1 -0
- package/lib/id-compressor/identifiers.js +11 -0
- package/lib/id-compressor/identifiers.js.map +1 -0
- package/lib/id-compressor/index.d.ts +5 -6
- package/lib/id-compressor/index.d.ts.map +1 -1
- package/lib/id-compressor/index.js +5 -6
- package/lib/id-compressor/index.js.map +1 -1
- package/lib/id-compressor/persistanceUtilities.d.ts +22 -0
- package/lib/id-compressor/persistanceUtilities.d.ts.map +1 -0
- package/lib/id-compressor/persistanceUtilities.js +34 -0
- package/lib/id-compressor/persistanceUtilities.js.map +1 -0
- package/lib/id-compressor/sessionSpaceNormalizer.d.ts +46 -0
- package/lib/id-compressor/sessionSpaceNormalizer.d.ts.map +1 -0
- package/lib/id-compressor/sessionSpaceNormalizer.js +76 -0
- package/lib/id-compressor/sessionSpaceNormalizer.js.map +1 -0
- package/lib/id-compressor/sessions.d.ts +115 -0
- package/lib/id-compressor/sessions.d.ts.map +1 -0
- package/lib/id-compressor/sessions.js +290 -0
- package/lib/id-compressor/sessions.js.map +1 -0
- package/lib/id-compressor/utilities.d.ts +49 -0
- package/lib/id-compressor/utilities.d.ts.map +1 -0
- package/lib/id-compressor/utilities.js +148 -0
- package/lib/id-compressor/utilities.js.map +1 -0
- package/lib/index.d.ts +3 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/metadata.d.ts +18 -0
- package/lib/metadata.d.ts.map +1 -0
- package/lib/metadata.js +6 -0
- package/lib/metadata.js.map +1 -0
- package/lib/opLifecycle/batchManager.d.ts +2 -1
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js +15 -7
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +11 -0
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +1 -1
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js +1 -1
- package/lib/opLifecycle/index.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts +2 -2
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +10 -5
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +2 -2
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +22 -13
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +17 -11
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +2 -2
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +15 -10
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +39 -6
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +132 -56
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +6 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +23 -9
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/opProperties.js +1 -2
- package/lib/opProperties.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 +25 -10
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +90 -53
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +25 -15
- package/lib/scheduleManager.js.map +1 -1
- package/lib/summary/index.d.ts +4 -4
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js +2 -2
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +3 -3
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +21 -22
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +31 -10
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +265 -133
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +8 -7
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +75 -74
- 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 +6 -10
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.js +9 -13
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/index.d.ts +1 -1
- package/lib/summary/summarizerNode/index.d.ts.map +1 -1
- package/lib/summary/summarizerNode/index.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +40 -23
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +132 -137
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +25 -29
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +2 -4
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +21 -16
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +70 -119
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +44 -24
- 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 +9 -6
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +4 -0
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +7 -4
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +21 -6
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +109 -47
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +8 -7
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +35 -25
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +30 -32
- package/src/batchTracker.ts +7 -5
- package/src/blobManager.ts +235 -172
- package/src/connectionTelemetry.ts +19 -5
- package/src/containerRuntime.ts +853 -431
- package/src/dataStore.ts +12 -4
- package/src/dataStoreContext.ts +49 -46
- package/src/dataStoreContexts.ts +4 -4
- package/src/dataStoreRegistry.ts +1 -1
- package/src/dataStores.ts +119 -80
- package/src/deltaManagerProxyBase.ts +111 -0
- package/src/deltaManagerSummarizerProxy.ts +4 -1
- package/src/deltaScheduler.ts +7 -11
- package/src/error.ts +18 -0
- package/src/gc/garbageCollection.md +53 -5
- package/src/gc/garbageCollection.ts +58 -51
- package/src/gc/gcConfigs.ts +4 -2
- package/src/gc/gcDefinitions.ts +17 -21
- package/src/gc/gcEarlyAdoption.md +145 -0
- package/src/gc/gcHelpers.ts +1 -12
- package/src/gc/gcSummaryStateTracker.ts +19 -65
- package/src/gc/gcTelemetry.ts +15 -13
- package/src/gc/gcUnreferencedStateTracker.ts +1 -1
- package/src/gc/index.ts +2 -4
- package/src/id-compressor/appendOnlySortedMap.ts +26 -87
- package/src/id-compressor/finalSpace.ts +67 -0
- package/src/id-compressor/idCompressor.ts +458 -1682
- package/src/id-compressor/identifiers.ts +42 -0
- package/src/id-compressor/index.ts +11 -20
- package/src/id-compressor/persistanceUtilities.ts +58 -0
- package/src/id-compressor/sessionSpaceNormalizer.ts +83 -0
- package/src/id-compressor/sessions.ts +405 -0
- package/src/id-compressor/utilities.ts +187 -0
- package/src/index.ts +9 -2
- package/src/metadata.ts +19 -0
- package/src/opLifecycle/README.md +20 -0
- package/src/opLifecycle/batchManager.ts +9 -1
- package/src/opLifecycle/definitions.ts +11 -0
- package/src/opLifecycle/index.ts +1 -1
- package/src/opLifecycle/opCompressor.ts +6 -5
- package/src/opLifecycle/opDecompressor.ts +47 -17
- package/src/opLifecycle/opGroupingManager.ts +18 -8
- package/src/opLifecycle/opSplitter.ts +10 -7
- package/src/opLifecycle/outbox.ts +177 -72
- package/src/opLifecycle/remoteMessageProcessor.ts +32 -9
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +123 -78
- package/src/scheduleManager.ts +22 -11
- package/src/summary/index.ts +7 -4
- package/src/summary/orderedClientElection.ts +10 -6
- package/src/summary/runWhileConnectedCoordinator.ts +1 -1
- package/src/summary/runningSummarizer.ts +291 -163
- package/src/summary/summarizer.ts +27 -16
- package/src/summary/summarizerClientElection.ts +2 -2
- package/src/summary/summarizerHeuristics.ts +1 -1
- package/src/summary/summarizerNode/index.ts +2 -2
- package/src/summary/summarizerNode/summarizerNode.ts +142 -184
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +27 -35
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +72 -148
- package/src/summary/summarizerTypes.ts +49 -24
- package/src/summary/summaryCollection.ts +9 -4
- package/src/summary/summaryFormat.ts +9 -2
- package/src/summary/summaryGenerator.ts +72 -49
- package/src/summary/summaryManager.ts +44 -16
- package/dist/id-compressor/idRange.d.ts +0 -11
- package/dist/id-compressor/idRange.d.ts.map +0 -1
- package/dist/id-compressor/idRange.js +0 -29
- package/dist/id-compressor/idRange.js.map +0 -1
- package/dist/id-compressor/numericUuid.d.ts +0 -59
- package/dist/id-compressor/numericUuid.d.ts.map +0 -1
- package/dist/id-compressor/numericUuid.js +0 -325
- package/dist/id-compressor/numericUuid.js.map +0 -1
- package/dist/id-compressor/sessionIdNormalizer.d.ts +0 -138
- package/dist/id-compressor/sessionIdNormalizer.d.ts.map +0 -1
- package/dist/id-compressor/sessionIdNormalizer.js +0 -488
- package/dist/id-compressor/sessionIdNormalizer.js.map +0 -1
- package/dist/id-compressor/utils.d.ts +0 -57
- package/dist/id-compressor/utils.d.ts.map +0 -1
- package/dist/id-compressor/utils.js +0 -90
- package/dist/id-compressor/utils.js.map +0 -1
- package/dist/id-compressor/uuidUtilities.d.ts +0 -30
- package/dist/id-compressor/uuidUtilities.d.ts.map +0 -1
- package/dist/id-compressor/uuidUtilities.js +0 -106
- package/dist/id-compressor/uuidUtilities.js.map +0 -1
- package/lib/id-compressor/idRange.d.ts +0 -11
- package/lib/id-compressor/idRange.d.ts.map +0 -1
- package/lib/id-compressor/idRange.js +0 -25
- package/lib/id-compressor/idRange.js.map +0 -1
- package/lib/id-compressor/numericUuid.d.ts +0 -59
- package/lib/id-compressor/numericUuid.d.ts.map +0 -1
- package/lib/id-compressor/numericUuid.js +0 -315
- package/lib/id-compressor/numericUuid.js.map +0 -1
- package/lib/id-compressor/sessionIdNormalizer.d.ts +0 -138
- package/lib/id-compressor/sessionIdNormalizer.d.ts.map +0 -1
- package/lib/id-compressor/sessionIdNormalizer.js +0 -484
- package/lib/id-compressor/sessionIdNormalizer.js.map +0 -1
- package/lib/id-compressor/utils.d.ts +0 -57
- package/lib/id-compressor/utils.d.ts.map +0 -1
- package/lib/id-compressor/utils.js +0 -79
- package/lib/id-compressor/utils.js.map +0 -1
- package/lib/id-compressor/uuidUtilities.d.ts +0 -30
- package/lib/id-compressor/uuidUtilities.d.ts.map +0 -1
- package/lib/id-compressor/uuidUtilities.js +0 -98
- package/lib/id-compressor/uuidUtilities.js.map +0 -1
- package/src/id-compressor/idRange.ts +0 -35
- package/src/id-compressor/numericUuid.ts +0 -383
- package/src/id-compressor/sessionIdNormalizer.ts +0 -609
- package/src/id-compressor/utils.ts +0 -114
- package/src/id-compressor/uuidUtilities.ts +0 -123
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remoteMessageProcessor.d.ts","sourceRoot":"","sources":["../../src/opLifecycle/remoteMessageProcessor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"remoteMessageProcessor.d.ts","sourceRoot":"","sources":["../../src/opLifecycle/remoteMessageProcessor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAM9F,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,qBAAa,sBAAsB;IAEjC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBAFjB,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,iBAAiB;IAGtD,IAAW,eAAe,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAE1D;IAEM,uBAAuB,CAAC,QAAQ,EAAE,MAAM;IAI/C;;;;OAIG;IACI,OAAO,CAAC,aAAa,EAAE,yBAAyB,GAAG,yBAAyB,EAAE;CAiDrF;AAsCD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAsBhF"}
|
|
@@ -19,12 +19,18 @@ class RemoteMessageProcessor {
|
|
|
19
19
|
clearPartialMessagesFor(clientId) {
|
|
20
20
|
this.opSplitter.clearPartialChunks(clientId);
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Ungroups and Unchunks the runtime ops encapsulated by the single remoteMessage received over the wire
|
|
24
|
+
* @param remoteMessage - A message from another client, likely a chunked/grouped op
|
|
25
|
+
* @returns the ungrouped, unchunked, unpacked SequencedContainerRuntimeMessage encapsulated in the remote message
|
|
26
|
+
*/
|
|
22
27
|
process(remoteMessage) {
|
|
23
28
|
const result = [];
|
|
24
29
|
// Ungroup before and after decompression for back-compat (cleanup tracked by AB#4371)
|
|
25
30
|
for (const ungroupedMessage of this.opGroupingManager.ungroupOp(copy(remoteMessage))) {
|
|
26
31
|
const message = this.opDecompressor.processMessage(ungroupedMessage).message;
|
|
27
32
|
for (let ungroupedMessage2 of this.opGroupingManager.ungroupOp(message)) {
|
|
33
|
+
// unpack and unchunk the ungrouped message in place
|
|
28
34
|
unpackRuntimeMessage(ungroupedMessage2);
|
|
29
35
|
const chunkProcessingResult = this.opSplitter.processRemoteMessage(ungroupedMessage2);
|
|
30
36
|
ungroupedMessage2 = chunkProcessingResult.message;
|
|
@@ -60,7 +66,7 @@ const copy = (remoteMessage) => {
|
|
|
60
66
|
// There might be multiple container instances receiving same message
|
|
61
67
|
// We do not need to make deep copy, as each layer will just replace message.content itself,
|
|
62
68
|
// but would not modify contents details
|
|
63
|
-
const message =
|
|
69
|
+
const message = { ...remoteMessage };
|
|
64
70
|
// back-compat: ADO #1385: eventually should become unconditional, but only for runtime messages!
|
|
65
71
|
// System message may have no contents, or in some cases (mostly for back-compat) they may have actual objects.
|
|
66
72
|
// Old ops may contain empty string (I assume noops).
|
|
@@ -70,20 +76,26 @@ const copy = (remoteMessage) => {
|
|
|
70
76
|
return message;
|
|
71
77
|
};
|
|
72
78
|
/**
|
|
73
|
-
* For a given message, it moves the nested
|
|
79
|
+
* For a given message, it moves the nested ContainerRuntimeMessage props one level up.
|
|
74
80
|
*
|
|
81
|
+
* The return type illustrates the assumption that the message param
|
|
82
|
+
* becomes a ContainerRuntimeMessage by the time the function returns
|
|
83
|
+
* (but there is no runtime validation of the 'type' or 'compatDetails' values)
|
|
75
84
|
*/
|
|
76
|
-
|
|
85
|
+
function unpack(message) {
|
|
77
86
|
const innerContents = message.contents;
|
|
78
|
-
message
|
|
79
|
-
|
|
80
|
-
|
|
87
|
+
// We're going to turn message into a SequencedContainerRuntimeMessage in-place
|
|
88
|
+
const sequencedContainerRuntimeMessage = message;
|
|
89
|
+
sequencedContainerRuntimeMessage.type = innerContents.type;
|
|
90
|
+
sequencedContainerRuntimeMessage.contents = innerContents.contents;
|
|
91
|
+
sequencedContainerRuntimeMessage.compatDetails = innerContents.compatDetails;
|
|
92
|
+
}
|
|
81
93
|
/**
|
|
82
94
|
* Unpacks runtime messages.
|
|
83
95
|
*
|
|
84
96
|
* @remarks This API makes no promises regarding backward-compatibility. This is internal API.
|
|
85
97
|
* @param message - message (as it observed in storage / service)
|
|
86
|
-
* @returns
|
|
98
|
+
* @returns whether the given message was unpacked
|
|
87
99
|
*
|
|
88
100
|
* @internal
|
|
89
101
|
*/
|
|
@@ -96,7 +108,9 @@ function unpackRuntimeMessage(message) {
|
|
|
96
108
|
return false;
|
|
97
109
|
}
|
|
98
110
|
// legacy op format?
|
|
99
|
-
if
|
|
111
|
+
// TODO: Unsure if this is a real format we should be concerned with. There doesn't appear to be anything prepared to handle the address member.
|
|
112
|
+
if (message.contents.address !== undefined &&
|
|
113
|
+
message.contents.type === undefined) {
|
|
100
114
|
message.type = containerRuntime_1.ContainerMessageType.FluidDataStoreOp;
|
|
101
115
|
}
|
|
102
116
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remoteMessageProcessor.js","sourceRoot":"","sources":["../../src/opLifecycle/remoteMessageProcessor.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+EAA8F;AAC9F,
|
|
1
|
+
{"version":3,"file":"remoteMessageProcessor.js","sourceRoot":"","sources":["../../src/opLifecycle/remoteMessageProcessor.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 { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n\tContainerMessageType,\n\tContainerRuntimeMessage,\n\tSequencedContainerRuntimeMessage,\n} from \"../containerRuntime\";\nimport { OpDecompressor } from \"./opDecompressor\";\nimport { OpGroupingManager } from \"./opGroupingManager\";\nimport { OpSplitter } from \"./opSplitter\";\n\nexport class RemoteMessageProcessor {\n\tconstructor(\n\t\tprivate readonly opSplitter: OpSplitter,\n\t\tprivate readonly opDecompressor: OpDecompressor,\n\t\tprivate readonly opGroupingManager: OpGroupingManager,\n\t) {}\n\n\tpublic get partialMessages(): ReadonlyMap<string, string[]> {\n\t\treturn this.opSplitter.chunks;\n\t}\n\n\tpublic clearPartialMessagesFor(clientId: string) {\n\t\tthis.opSplitter.clearPartialChunks(clientId);\n\t}\n\n\t/**\n\t * Ungroups and Unchunks the runtime ops encapsulated by the single remoteMessage received over the wire\n\t * @param remoteMessage - A message from another client, likely a chunked/grouped op\n\t * @returns the ungrouped, unchunked, unpacked SequencedContainerRuntimeMessage encapsulated in the remote message\n\t */\n\tpublic process(remoteMessage: ISequencedDocumentMessage): ISequencedDocumentMessage[] {\n\t\tconst result: ISequencedDocumentMessage[] = [];\n\n\t\t// Ungroup before and after decompression for back-compat (cleanup tracked by AB#4371)\n\t\tfor (const ungroupedMessage of this.opGroupingManager.ungroupOp(copy(remoteMessage))) {\n\t\t\tconst message = this.opDecompressor.processMessage(ungroupedMessage).message;\n\n\t\t\tfor (let ungroupedMessage2 of this.opGroupingManager.ungroupOp(message)) {\n\t\t\t\t// unpack and unchunk the ungrouped message in place\n\t\t\t\tunpackRuntimeMessage(ungroupedMessage2);\n\t\t\t\tconst chunkProcessingResult =\n\t\t\t\t\tthis.opSplitter.processRemoteMessage(ungroupedMessage2);\n\t\t\t\tungroupedMessage2 = chunkProcessingResult.message;\n\n\t\t\t\tif (chunkProcessingResult.state !== \"Processed\") {\n\t\t\t\t\t// If the message is not chunked or if the splitter is still rebuilding the original message,\n\t\t\t\t\t// there is no need to continue processing\n\t\t\t\t\tresult.push(ungroupedMessage2);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Ungroup before and after decompression for back-compat (cleanup tracked by AB#4371)\n\t\t\t\tfor (const ungroupedMessageAfterChunking of this.opGroupingManager.ungroupOp(\n\t\t\t\t\tungroupedMessage2,\n\t\t\t\t)) {\n\t\t\t\t\tconst decompressionAfterChunking = this.opDecompressor.processMessage(\n\t\t\t\t\t\tungroupedMessageAfterChunking,\n\t\t\t\t\t);\n\n\t\t\t\t\tfor (const ungroupedMessageAfterChunking2 of this.opGroupingManager.ungroupOp(\n\t\t\t\t\t\tdecompressionAfterChunking.message,\n\t\t\t\t\t)) {\n\t\t\t\t\t\tif (decompressionAfterChunking.state === \"Skipped\") {\n\t\t\t\t\t\t\t// After chunking, if the original message was not compressed,\n\t\t\t\t\t\t\t// there is no need to continue processing\n\t\t\t\t\t\t\tresult.push(ungroupedMessageAfterChunking2);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// The message needs to be unpacked after chunking + decompression\n\t\t\t\t\t\tunpack(ungroupedMessageAfterChunking2);\n\t\t\t\t\t\tresult.push(ungroupedMessageAfterChunking2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n}\n\nconst copy = (remoteMessage: ISequencedDocumentMessage): ISequencedDocumentMessage => {\n\t// Do shallow copy of message, as the processing flow will modify it.\n\t// There might be multiple container instances receiving same message\n\t// We do not need to make deep copy, as each layer will just replace message.content itself,\n\t// but would not modify contents details\n\tconst message = { ...remoteMessage };\n\n\t// back-compat: ADO #1385: eventually should become unconditional, but only for runtime messages!\n\t// System message may have no contents, or in some cases (mostly for back-compat) they may have actual objects.\n\t// Old ops may contain empty string (I assume noops).\n\tif (typeof message.contents === \"string\" && message.contents !== \"\") {\n\t\tmessage.contents = JSON.parse(message.contents);\n\t}\n\n\treturn message;\n};\n\n/**\n * For a given message, it moves the nested ContainerRuntimeMessage props one level up.\n *\n * The return type illustrates the assumption that the message param\n * becomes a ContainerRuntimeMessage by the time the function returns\n * (but there is no runtime validation of the 'type' or 'compatDetails' values)\n */\nfunction unpack(\n\tmessage: ISequencedDocumentMessage,\n): asserts message is SequencedContainerRuntimeMessage {\n\tconst innerContents = message.contents as ContainerRuntimeMessage;\n\n\t// We're going to turn message into a SequencedContainerRuntimeMessage in-place\n\tconst sequencedContainerRuntimeMessage = message as SequencedContainerRuntimeMessage;\n\tsequencedContainerRuntimeMessage.type = innerContents.type;\n\tsequencedContainerRuntimeMessage.contents = innerContents.contents;\n\tsequencedContainerRuntimeMessage.compatDetails = innerContents.compatDetails;\n}\n\n/**\n * Unpacks runtime messages.\n *\n * @remarks This API makes no promises regarding backward-compatibility. This is internal API.\n * @param message - message (as it observed in storage / service)\n * @returns whether the given message was unpacked\n *\n * @internal\n */\nexport function unpackRuntimeMessage(message: ISequencedDocumentMessage): boolean {\n\tif (message.type !== MessageType.Operation) {\n\t\t// Legacy format, but it's already \"unpacked\",\n\t\t// i.e. message.type is actually ContainerMessageType.\n\t\t// Or it's non-runtime message.\n\t\t// Nothing to do in such case.\n\t\treturn false;\n\t}\n\n\t// legacy op format?\n\t// TODO: Unsure if this is a real format we should be concerned with. There doesn't appear to be anything prepared to handle the address member.\n\tif (\n\t\t(message.contents as { address?: unknown }).address !== undefined &&\n\t\t(message.contents as { type?: unknown }).type === undefined\n\t) {\n\t\tmessage.type = ContainerMessageType.FluidDataStoreOp;\n\t} else {\n\t\t// new format\n\t\tunpack(message);\n\t}\n\n\treturn true;\n}\n"]}
|
package/dist/opProperties.js
CHANGED
|
@@ -6,10 +6,9 @@
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.opSize = void 0;
|
|
8
8
|
const opSize = (op) => {
|
|
9
|
-
var _a;
|
|
10
9
|
// Some messages may already have string contents,
|
|
11
10
|
// so stringifying them again will add inaccurate overhead.
|
|
12
|
-
const content = typeof op.contents === "string" ? op.contents :
|
|
11
|
+
const content = typeof op.contents === "string" ? op.contents : JSON.stringify(op.contents) ?? "";
|
|
13
12
|
const data = opHasData(op) ? op.data : "";
|
|
14
13
|
return content.length + data.length;
|
|
15
14
|
};
|
package/dist/opProperties.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opProperties.js","sourceRoot":"","sources":["../src/opProperties.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAOI,MAAM,MAAM,GAAG,CAAC,EAA6B,EAAU,EAAE
|
|
1
|
+
{"version":3,"file":"opProperties.js","sourceRoot":"","sources":["../src/opProperties.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAOI,MAAM,MAAM,GAAG,CAAC,EAA6B,EAAU,EAAE;IAC/D,kDAAkD;IAClD,2DAA2D;IAC3D,MAAM,OAAO,GACZ,OAAO,EAAE,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnF,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,OAAO,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AACrC,CAAC,CAAC;AAPW,QAAA,MAAM,UAOjB;AAEF,MAAM,SAAS,GAAG,CAAC,EAA6B,EAAyC,EAAE,CACzF,EAAsC,CAAC,IAAI,KAAK,SAAS,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tISequencedDocumentMessage,\n\tISequencedDocumentSystemMessage,\n} from \"@fluidframework/protocol-definitions\";\n\nexport const opSize = (op: ISequencedDocumentMessage): number => {\n\t// Some messages may already have string contents,\n\t// so stringifying them again will add inaccurate overhead.\n\tconst content =\n\t\ttypeof op.contents === \"string\" ? op.contents : JSON.stringify(op.contents) ?? \"\";\n\tconst data = opHasData(op) ? op.data : \"\";\n\treturn content.length + data.length;\n};\n\nconst opHasData = (op: ISequencedDocumentMessage): op is ISequencedDocumentSystemMessage =>\n\t(op as ISequencedDocumentSystemMessage).data !== undefined;\n"]}
|
package/dist/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/container-runtime";
|
|
8
|
-
export declare const pkgVersion = "2.0.0-dev.
|
|
8
|
+
export declare const pkgVersion = "2.0.0-dev.6.4.0.191258";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/dist/packageVersion.js
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.pkgVersion = exports.pkgName = void 0;
|
|
10
10
|
exports.pkgName = "@fluidframework/container-runtime";
|
|
11
|
-
exports.pkgVersion = "2.0.0-dev.
|
|
11
|
+
exports.pkgVersion = "2.0.0-dev.6.4.0.191258";
|
|
12
12
|
//# sourceMappingURL=packageVersion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,mCAAmC,CAAC;AAC9C,QAAA,UAAU,GAAG,wBAAwB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/container-runtime\";\nexport const pkgVersion = \"2.0.0-dev.
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,mCAAmC,CAAC;AAC9C,QAAA,UAAU,GAAG,wBAAwB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/container-runtime\";\nexport const pkgVersion = \"2.0.0-dev.6.4.0.191258\";\n"]}
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { IDisposable } from "@fluidframework/
|
|
5
|
+
import { IDisposable } from "@fluidframework/core-interfaces";
|
|
6
6
|
import { ICriticalContainerError } from "@fluidframework/container-definitions";
|
|
7
|
-
import {
|
|
8
|
-
import { ContainerMessageType } from "./containerRuntime";
|
|
7
|
+
import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
|
|
8
|
+
import { ContainerMessageType, SequencedContainerRuntimeMessage } from "./containerRuntime";
|
|
9
9
|
/**
|
|
10
|
-
* ! TODO: Remove this interface in "2.0.0-internal.7.0.0" once we only read IPendingMessageNew
|
|
10
|
+
* ! TODO: Remove this interface in "2.0.0-internal.7.0.0" once we only read IPendingMessageNew (AB#4763)
|
|
11
11
|
*/
|
|
12
12
|
export interface IPendingMessageOld {
|
|
13
13
|
type: "message";
|
|
@@ -31,7 +31,7 @@ export interface IPendingMessageNew {
|
|
|
31
31
|
opMetadata: Record<string, unknown> | undefined;
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
* ! TODO: Remove this type in "2.0.0-internal.7.0.0"
|
|
34
|
+
* ! TODO: Remove this type in "2.0.0-internal.7.0.0" (AB#4763)
|
|
35
35
|
*/
|
|
36
36
|
export declare type IPendingState = IPendingMessageOld | IPendingMessageNew;
|
|
37
37
|
export interface IPendingLocalState {
|
|
@@ -40,13 +40,19 @@ export interface IPendingLocalState {
|
|
|
40
40
|
*/
|
|
41
41
|
pendingStates: IPendingState[];
|
|
42
42
|
}
|
|
43
|
+
export interface IPendingBatchMessage {
|
|
44
|
+
content: string;
|
|
45
|
+
localOpMetadata: unknown;
|
|
46
|
+
opMetadata: Record<string, unknown> | undefined;
|
|
47
|
+
}
|
|
43
48
|
export interface IRuntimeStateHandler {
|
|
44
49
|
connected(): boolean;
|
|
45
50
|
clientId(): string | undefined;
|
|
46
51
|
close(error?: ICriticalContainerError): void;
|
|
47
52
|
applyStashedOp(content: string): Promise<unknown>;
|
|
48
|
-
reSubmit(
|
|
49
|
-
|
|
53
|
+
reSubmit(message: IPendingBatchMessage): void;
|
|
54
|
+
reSubmitBatch(batch: IPendingBatchMessage[]): void;
|
|
55
|
+
isActiveConnection: () => boolean;
|
|
50
56
|
}
|
|
51
57
|
/**
|
|
52
58
|
* PendingStateManager is responsible for maintaining the messages that have not been sent or have not yet been
|
|
@@ -59,20 +65,29 @@ export interface IRuntimeStateHandler {
|
|
|
59
65
|
*/
|
|
60
66
|
export declare class PendingStateManager implements IDisposable {
|
|
61
67
|
private readonly stateHandler;
|
|
68
|
+
private readonly logger;
|
|
62
69
|
private readonly pendingMessages;
|
|
63
70
|
private readonly initialMessages;
|
|
71
|
+
/**
|
|
72
|
+
* Sequenced local ops that are saved when stashing since pending ops may depend on them
|
|
73
|
+
*/
|
|
74
|
+
private savedOps;
|
|
64
75
|
private readonly disposeOnce;
|
|
65
|
-
get pendingMessagesCount(): number;
|
|
66
76
|
private isProcessingBatch;
|
|
67
77
|
private pendingBatchBeginMessage;
|
|
68
78
|
private clientId;
|
|
79
|
+
/**
|
|
80
|
+
* The pending messages count. Includes `pendingMessages` and `initialMessages` to keep in sync with
|
|
81
|
+
* 'hasPendingMessages'.
|
|
82
|
+
*/
|
|
83
|
+
get pendingMessagesCount(): number;
|
|
69
84
|
/**
|
|
70
85
|
* Called to check if there are any pending messages in the pending message queue.
|
|
71
86
|
* @returns A boolean indicating whether there are messages or not.
|
|
72
87
|
*/
|
|
73
88
|
hasPendingMessages(): boolean;
|
|
74
89
|
getLocalState(): IPendingLocalState | undefined;
|
|
75
|
-
constructor(stateHandler: IRuntimeStateHandler, initialLocalState: IPendingLocalState | undefined);
|
|
90
|
+
constructor(stateHandler: IRuntimeStateHandler, initialLocalState: IPendingLocalState | undefined, logger: ITelemetryLoggerExt | undefined);
|
|
76
91
|
get disposed(): boolean;
|
|
77
92
|
readonly dispose: () => void;
|
|
78
93
|
/**
|
|
@@ -93,7 +108,7 @@ export declare class PendingStateManager implements IDisposable {
|
|
|
93
108
|
* the batch information was preserved for batch messages.
|
|
94
109
|
* @param message - The message that got ack'd and needs to be processed.
|
|
95
110
|
*/
|
|
96
|
-
processPendingLocalMessage(message:
|
|
111
|
+
processPendingLocalMessage(message: SequencedContainerRuntimeMessage): unknown;
|
|
97
112
|
/**
|
|
98
113
|
* This message could be the first message in batch. If so, set batch state marking the beginning of a batch.
|
|
99
114
|
* @param message - The message that is being processed.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pendingStateManager.d.ts","sourceRoot":"","sources":["../src/pendingStateManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"pendingStateManager.d.ts","sourceRoot":"","sources":["../src/pendingStateManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,9 +8,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
8
8
|
};
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.PendingStateManager = void 0;
|
|
11
|
-
const common_utils_1 = require("@fluidframework/common-utils");
|
|
12
|
-
const container_utils_1 = require("@fluidframework/container-utils");
|
|
13
11
|
const double_ended_queue_1 = __importDefault(require("double-ended-queue"));
|
|
12
|
+
const core_utils_1 = require("@fluidframework/core-utils");
|
|
13
|
+
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
14
14
|
const containerRuntime_1 = require("./containerRuntime");
|
|
15
15
|
const packageVersion_1 = require("./packageVersion");
|
|
16
16
|
/**
|
|
@@ -23,11 +23,16 @@ const packageVersion_1 = require("./packageVersion");
|
|
|
23
23
|
* It verifies that all the ops are acked, are received in the right order and batch information is correct.
|
|
24
24
|
*/
|
|
25
25
|
class PendingStateManager {
|
|
26
|
-
constructor(stateHandler, initialLocalState) {
|
|
26
|
+
constructor(stateHandler, initialLocalState, logger) {
|
|
27
27
|
this.stateHandler = stateHandler;
|
|
28
|
+
this.logger = logger;
|
|
28
29
|
this.pendingMessages = new double_ended_queue_1.default();
|
|
29
30
|
this.initialMessages = new double_ended_queue_1.default();
|
|
30
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Sequenced local ops that are saved when stashing since pending ops may depend on them
|
|
33
|
+
*/
|
|
34
|
+
this.savedOps = [];
|
|
35
|
+
this.disposeOnce = new core_utils_1.Lazy(() => {
|
|
31
36
|
this.initialMessages.clear();
|
|
32
37
|
this.pendingMessages.clear();
|
|
33
38
|
});
|
|
@@ -36,9 +41,9 @@ class PendingStateManager {
|
|
|
36
41
|
this.dispose = () => this.disposeOnce.value;
|
|
37
42
|
/**
|
|
38
43
|
* Convert old local state format to the new format (IPendingMessageOld to IPendingMessageNew)
|
|
39
|
-
* ! TODO: Remove this conversion in "2.0.0-internal.7.0.0"
|
|
44
|
+
* ! TODO: Remove this conversion in "2.0.0-internal.7.0.0" (AB#4763)
|
|
40
45
|
*/
|
|
41
|
-
if (initialLocalState
|
|
46
|
+
if (initialLocalState?.pendingStates) {
|
|
42
47
|
for (const initialState of initialLocalState.pendingStates) {
|
|
43
48
|
let messageContent = initialState.content;
|
|
44
49
|
if (initialState.messageType !== undefined &&
|
|
@@ -50,36 +55,43 @@ class PendingStateManager {
|
|
|
50
55
|
});
|
|
51
56
|
}
|
|
52
57
|
// Note: this object may contain "messageType" prop, but it should not be easily accesible due to interface being used
|
|
53
|
-
this.initialMessages.push(
|
|
58
|
+
this.initialMessages.push({
|
|
59
|
+
...initialState,
|
|
60
|
+
content: messageContent,
|
|
61
|
+
});
|
|
54
62
|
}
|
|
55
63
|
}
|
|
56
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* The pending messages count. Includes `pendingMessages` and `initialMessages` to keep in sync with
|
|
67
|
+
* 'hasPendingMessages'.
|
|
68
|
+
*/
|
|
57
69
|
get pendingMessagesCount() {
|
|
58
|
-
return this.pendingMessages.length;
|
|
70
|
+
return this.pendingMessages.length + this.initialMessages.length;
|
|
59
71
|
}
|
|
60
72
|
/**
|
|
61
73
|
* Called to check if there are any pending messages in the pending message queue.
|
|
62
74
|
* @returns A boolean indicating whether there are messages or not.
|
|
63
75
|
*/
|
|
64
76
|
hasPendingMessages() {
|
|
65
|
-
return
|
|
77
|
+
return this.pendingMessagesCount !== 0;
|
|
66
78
|
}
|
|
67
79
|
getLocalState() {
|
|
68
|
-
(0,
|
|
80
|
+
(0, core_utils_1.assert)(this.initialMessages.isEmpty(), 0x2e9 /* "Must call getLocalState() after applying initial states" */);
|
|
69
81
|
if (!this.pendingMessages.isEmpty()) {
|
|
70
82
|
return {
|
|
71
|
-
pendingStates: this.pendingMessages.toArray().map((message) => {
|
|
72
|
-
|
|
73
|
-
const
|
|
83
|
+
pendingStates: [...this.savedOps, ...this.pendingMessages.toArray()].map((message) => {
|
|
84
|
+
let content = message.content;
|
|
85
|
+
const parsedContent = JSON.parse(content);
|
|
74
86
|
// IdAllocations need their localOpMetadata stashed in the contents
|
|
75
87
|
// of the op to correctly resume the session when processing stashed ops
|
|
76
|
-
if (
|
|
77
|
-
|
|
88
|
+
if (parsedContent.type === containerRuntime_1.ContainerMessageType.IdAllocation) {
|
|
89
|
+
parsedContent.contents.stashedState = message.localOpMetadata;
|
|
90
|
+
content = JSON.stringify(parsedContent);
|
|
78
91
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
localOpMetadata: undefined });
|
|
92
|
+
// delete localOpMetadata since it may not be serializable
|
|
93
|
+
// and will be regenerated by applyStashedOp()
|
|
94
|
+
return { ...message, content, localOpMetadata: undefined };
|
|
83
95
|
}),
|
|
84
96
|
};
|
|
85
97
|
}
|
|
@@ -122,9 +134,14 @@ class PendingStateManager {
|
|
|
122
134
|
throw new Error("loaded from snapshot too recent to apply stashed ops");
|
|
123
135
|
}
|
|
124
136
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
137
|
+
try {
|
|
138
|
+
// applyStashedOp will cause the DDS to behave as if it has sent the op but not actually send it
|
|
139
|
+
const localOpMetadata = await this.stateHandler.applyStashedOp(nextMessage.content);
|
|
140
|
+
nextMessage.localOpMetadata = localOpMetadata;
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
throw telemetry_utils_1.DataProcessingError.wrapIfUnrecognized(error, "applyStashedOp", nextMessage);
|
|
144
|
+
}
|
|
128
145
|
// then we push onto pendingMessages which will cause PendingStateManager to resubmit when we connect
|
|
129
146
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
130
147
|
this.pendingMessages.push(this.initialMessages.shift());
|
|
@@ -140,12 +157,16 @@ class PendingStateManager {
|
|
|
140
157
|
this.maybeProcessBatchBegin(message);
|
|
141
158
|
// Get the next message from the pending queue. Verify a message exists.
|
|
142
159
|
const pendingMessage = this.pendingMessages.peekFront();
|
|
143
|
-
(0,
|
|
160
|
+
(0, core_utils_1.assert)(pendingMessage !== undefined, 0x169 /* "No pending message found for this remote message" */);
|
|
161
|
+
this.savedOps.push(pendingMessage);
|
|
144
162
|
this.pendingMessages.shift();
|
|
145
|
-
|
|
146
|
-
//
|
|
163
|
+
// IMPORTANT: Order matters here, this must match the order of the properties used
|
|
164
|
+
// when submitting the message.
|
|
165
|
+
const { type, contents, compatDetails } = message;
|
|
166
|
+
const messageContent = JSON.stringify({ type, contents, compatDetails });
|
|
167
|
+
// Stringified content should match
|
|
147
168
|
if (pendingMessage.content !== messageContent) {
|
|
148
|
-
this.stateHandler.close(
|
|
169
|
+
this.stateHandler.close(telemetry_utils_1.DataProcessingError.create("pending local message content mismatch", "unexpectedAckReceived", message, {
|
|
149
170
|
expectedMessageType: JSON.parse(pendingMessage.content).type,
|
|
150
171
|
}));
|
|
151
172
|
return;
|
|
@@ -159,11 +180,10 @@ class PendingStateManager {
|
|
|
159
180
|
* @param message - The message that is being processed.
|
|
160
181
|
*/
|
|
161
182
|
maybeProcessBatchBegin(message) {
|
|
162
|
-
var _a;
|
|
163
183
|
// This message is the first in a batch if the "batch" property on the metadata is set to true
|
|
164
|
-
if (
|
|
184
|
+
if (message.metadata?.batch) {
|
|
165
185
|
// We should not already be processing a batch and there should be no pending batch begin message.
|
|
166
|
-
(0,
|
|
186
|
+
(0, core_utils_1.assert)(!this.isProcessingBatch && this.pendingBatchBeginMessage === undefined, 0x16b /* "The pending batch state indicates we are already processing a batch" */);
|
|
167
187
|
// Set the pending batch state indicating we have started processing a batch.
|
|
168
188
|
this.pendingBatchBeginMessage = message;
|
|
169
189
|
this.isProcessingBatch = true;
|
|
@@ -174,27 +194,28 @@ class PendingStateManager {
|
|
|
174
194
|
* @param message - The message that is being processed.
|
|
175
195
|
*/
|
|
176
196
|
maybeProcessBatchEnd(message) {
|
|
177
|
-
var _a, _b;
|
|
178
197
|
if (!this.isProcessingBatch) {
|
|
179
198
|
return;
|
|
180
199
|
}
|
|
181
200
|
// There should be a pending batch begin message.
|
|
182
|
-
(0,
|
|
183
|
-
const batchEndMetadata =
|
|
201
|
+
(0, core_utils_1.assert)(this.pendingBatchBeginMessage !== undefined, 0x16d /* "There is no pending batch begin message" */);
|
|
202
|
+
const batchEndMetadata = message.metadata?.batch;
|
|
184
203
|
if (this.pendingMessages.isEmpty() || batchEndMetadata === false) {
|
|
185
204
|
// Get the batch begin metadata from the first message in the batch.
|
|
186
|
-
const batchBeginMetadata =
|
|
205
|
+
const batchBeginMetadata = this.pendingBatchBeginMessage.metadata?.batch;
|
|
187
206
|
// There could be just a single message in the batch. If so, it should not have any batch metadata. If there
|
|
188
207
|
// are multiple messages in the batch, verify that we got the correct batch begin and end metadata.
|
|
189
208
|
if (this.pendingBatchBeginMessage === message) {
|
|
190
|
-
(0,
|
|
209
|
+
(0, core_utils_1.assert)(batchBeginMetadata === undefined, 0x16e /* "Batch with single message should not have batch metadata" */);
|
|
191
210
|
}
|
|
192
211
|
else {
|
|
193
212
|
if (batchBeginMetadata !== true || batchEndMetadata !== false) {
|
|
194
|
-
this.stateHandler.close(
|
|
213
|
+
this.stateHandler.close(telemetry_utils_1.DataProcessingError.create("Pending batch inconsistency", // Formerly known as asserts 0x16f and 0x170
|
|
195
214
|
"processPendingLocalMessage", message, {
|
|
196
215
|
runtimeVersion: packageVersion_1.pkgVersion,
|
|
197
|
-
batchClientId: this.pendingBatchBeginMessage.clientId
|
|
216
|
+
batchClientId: this.pendingBatchBeginMessage.clientId === null
|
|
217
|
+
? "null"
|
|
218
|
+
: this.pendingBatchBeginMessage.clientId,
|
|
198
219
|
clientId: this.stateHandler.clientId(),
|
|
199
220
|
hasBatchStart: batchBeginMetadata === true,
|
|
200
221
|
hasBatchEnd: batchEndMetadata === false,
|
|
@@ -213,51 +234,67 @@ class PendingStateManager {
|
|
|
213
234
|
* states in its queue. This includes triggering resubmission of unacked ops.
|
|
214
235
|
*/
|
|
215
236
|
replayPendingStates() {
|
|
216
|
-
|
|
217
|
-
(0, common_utils_1.assert)(this.stateHandler.connected(), 0x172 /* "The connection state is not consistent with the runtime" */);
|
|
237
|
+
(0, core_utils_1.assert)(this.stateHandler.connected(), 0x172 /* "The connection state is not consistent with the runtime" */);
|
|
218
238
|
// This assert suggests we are about to send same ops twice, which will result in data loss.
|
|
219
|
-
(0,
|
|
239
|
+
(0, core_utils_1.assert)(this.clientId !== this.stateHandler.clientId(), 0x173 /* "replayPendingStates called twice for same clientId!" */);
|
|
220
240
|
this.clientId = this.stateHandler.clientId();
|
|
221
|
-
(0,
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
241
|
+
(0, core_utils_1.assert)(this.initialMessages.isEmpty(), 0x174 /* "initial states should be empty before replaying pending" */);
|
|
242
|
+
const initialPendingMessagesCount = this.pendingMessages.length;
|
|
243
|
+
let remainingPendingMessagesCount = this.pendingMessages.length;
|
|
226
244
|
// Process exactly `pendingMessagesCount` items in the queue as it represents the number of messages that were
|
|
227
245
|
// pending when we connected. This is important because the `reSubmitFn` might add more items in the queue
|
|
228
246
|
// which must not be replayed.
|
|
229
|
-
while (
|
|
247
|
+
while (remainingPendingMessagesCount > 0) {
|
|
230
248
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
231
249
|
let pendingMessage = this.pendingMessages.shift();
|
|
232
|
-
|
|
233
|
-
(0,
|
|
250
|
+
remainingPendingMessagesCount--;
|
|
251
|
+
(0, core_utils_1.assert)(pendingMessage.opMetadata?.batch !== false, 0x41b /* We cannot process batches in chunks */);
|
|
234
252
|
/**
|
|
235
253
|
* We want to ensure grouped messages get processed in a batch.
|
|
236
254
|
* Note: It is not possible for the PendingStateManager to receive a partially acked batch. It will
|
|
237
255
|
* either receive the whole batch ack or nothing at all.
|
|
238
256
|
*/
|
|
239
|
-
if (
|
|
240
|
-
(0,
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
pendingMessage = this.pendingMessages.shift();
|
|
252
|
-
pendingMessagesCount--;
|
|
253
|
-
(0, common_utils_1.assert)(((_b = pendingMessage.opMetadata) === null || _b === void 0 ? void 0 : _b.batch) !== true, 0x556 /* Batch start needs a corresponding batch end */);
|
|
257
|
+
if (pendingMessage.opMetadata?.batch) {
|
|
258
|
+
(0, core_utils_1.assert)(remainingPendingMessagesCount > 0, 0x554 /* Last pending message cannot be a batch begin */);
|
|
259
|
+
const batch = [];
|
|
260
|
+
// check is >= because batch end may be last pending message
|
|
261
|
+
while (remainingPendingMessagesCount >= 0) {
|
|
262
|
+
batch.push({
|
|
263
|
+
content: pendingMessage.content,
|
|
264
|
+
localOpMetadata: pendingMessage.localOpMetadata,
|
|
265
|
+
opMetadata: pendingMessage.opMetadata,
|
|
266
|
+
});
|
|
267
|
+
if (pendingMessage.opMetadata?.batch === false) {
|
|
268
|
+
break;
|
|
254
269
|
}
|
|
255
|
-
|
|
270
|
+
(0, core_utils_1.assert)(remainingPendingMessagesCount > 0, 0x555 /* No batch end found */);
|
|
271
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
272
|
+
pendingMessage = this.pendingMessages.shift();
|
|
273
|
+
remainingPendingMessagesCount--;
|
|
274
|
+
(0, core_utils_1.assert)(pendingMessage.opMetadata?.batch !== true, 0x556 /* Batch start needs a corresponding batch end */);
|
|
275
|
+
}
|
|
276
|
+
this.stateHandler.reSubmitBatch(batch);
|
|
256
277
|
}
|
|
257
278
|
else {
|
|
258
|
-
this.stateHandler.reSubmit(
|
|
279
|
+
this.stateHandler.reSubmit({
|
|
280
|
+
content: pendingMessage.content,
|
|
281
|
+
localOpMetadata: pendingMessage.localOpMetadata,
|
|
282
|
+
opMetadata: pendingMessage.opMetadata,
|
|
283
|
+
});
|
|
259
284
|
}
|
|
260
285
|
}
|
|
286
|
+
// pending ops should no longer depend on previous sequenced local ops after resubmit
|
|
287
|
+
this.savedOps = [];
|
|
288
|
+
// We replayPendingStates on read connections too - we expect these to get nack'd though, and to then reconnect
|
|
289
|
+
// on a write connection and replay again. This filters out the replay that happens on the read connection so
|
|
290
|
+
// we only see the replays on write connections (that have a chance to go through).
|
|
291
|
+
if (this.stateHandler.isActiveConnection()) {
|
|
292
|
+
this.logger?.sendTelemetryEvent({
|
|
293
|
+
eventName: "PendingStatesReplayed",
|
|
294
|
+
count: initialPendingMessagesCount,
|
|
295
|
+
clientId: this.stateHandler.clientId(),
|
|
296
|
+
});
|
|
297
|
+
}
|
|
261
298
|
}
|
|
262
299
|
}
|
|
263
300
|
exports.PendingStateManager = PendingStateManager;
|