@fluidframework/container-runtime 1.4.0-121020 → 2.0.0-dev-rc.1.0.0.224419
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/.eslintrc.js +19 -29
- package/.mocharc.js +12 -0
- package/CHANGELOG.md +427 -0
- package/README.md +69 -0
- package/api-extractor-lint.json +4 -0
- package/api-extractor.json +2 -2
- package/api-report/container-runtime.api.md +863 -0
- package/dist/{batchTracker.js → batchTracker.cjs} +9 -8
- package/dist/batchTracker.cjs.map +1 -0
- package/dist/batchTracker.d.ts +6 -5
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/blobManager.cjs +704 -0
- package/dist/blobManager.cjs.map +1 -0
- package/dist/blobManager.d.ts +135 -39
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/connectionTelemetry.cjs +230 -0
- package/dist/connectionTelemetry.cjs.map +1 -0
- package/dist/connectionTelemetry.d.ts +2 -2
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/container-runtime-alpha.d.ts +1677 -0
- package/dist/container-runtime-beta.d.ts +250 -0
- package/dist/container-runtime-public.d.ts +250 -0
- package/dist/container-runtime-untrimmed.d.ts +1792 -0
- package/dist/{containerHandleContext.js → containerHandleContext.cjs} +4 -2
- package/dist/containerHandleContext.cjs.map +1 -0
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerRuntime.cjs +2531 -0
- package/dist/containerRuntime.cjs.map +1 -0
- package/dist/containerRuntime.d.ts +454 -256
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/{dataStore.js → dataStore.cjs} +54 -45
- package/dist/dataStore.cjs.map +1 -0
- package/dist/dataStore.d.ts +2 -2
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/{dataStoreContext.js → dataStoreContext.cjs} +343 -247
- package/dist/dataStoreContext.cjs.map +1 -0
- package/dist/dataStoreContext.d.ts +73 -41
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/{dataStoreContexts.js → dataStoreContexts.cjs} +19 -15
- package/dist/dataStoreContexts.cjs.map +1 -0
- package/dist/dataStoreContexts.d.ts +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/{dataStoreRegistry.js → dataStoreRegistry.cjs} +9 -4
- package/dist/dataStoreRegistry.cjs.map +1 -0
- package/dist/dataStoreRegistry.d.ts +3 -0
- package/dist/dataStoreRegistry.d.ts.map +1 -1
- package/dist/{dataStores.js → dataStores.cjs} +273 -124
- package/dist/dataStores.cjs.map +1 -0
- package/dist/dataStores.d.ts +53 -23
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/deltaManagerProxyBase.cjs +77 -0
- package/dist/deltaManagerProxyBase.cjs.map +1 -0
- package/dist/deltaManagerProxyBase.d.ts +35 -0
- package/dist/deltaManagerProxyBase.d.ts.map +1 -0
- package/dist/deltaManagerSummarizerProxy.cjs +42 -0
- package/dist/deltaManagerSummarizerProxy.cjs.map +1 -0
- package/dist/deltaManagerSummarizerProxy.d.ts +19 -0
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -0
- package/dist/{deltaScheduler.js → deltaScheduler.cjs} +25 -18
- package/dist/deltaScheduler.cjs.map +1 -0
- package/dist/deltaScheduler.d.ts +8 -6
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/error.cjs +21 -0
- package/dist/error.cjs.map +1 -0
- package/dist/error.d.ts +14 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/gc/garbageCollection.cjs +861 -0
- package/dist/gc/garbageCollection.cjs.map +1 -0
- package/dist/gc/garbageCollection.d.ts +224 -0
- package/dist/gc/garbageCollection.d.ts.map +1 -0
- package/dist/gc/gcConfigs.cjs +153 -0
- package/dist/gc/gcConfigs.cjs.map +1 -0
- package/dist/gc/gcConfigs.d.ts +23 -0
- package/dist/gc/gcConfigs.d.ts.map +1 -0
- package/dist/gc/gcDefinitions.cjs +96 -0
- package/dist/gc/gcDefinitions.cjs.map +1 -0
- package/dist/gc/gcDefinitions.d.ts +437 -0
- package/dist/gc/gcDefinitions.d.ts.map +1 -0
- package/dist/gc/gcHelpers.cjs +235 -0
- package/dist/gc/gcHelpers.cjs.map +1 -0
- package/dist/gc/gcHelpers.d.ts +71 -0
- package/dist/gc/gcHelpers.d.ts.map +1 -0
- package/dist/gc/gcReferenceGraphAlgorithm.cjs +49 -0
- package/dist/gc/gcReferenceGraphAlgorithm.cjs.map +1 -0
- package/dist/gc/gcReferenceGraphAlgorithm.d.ts +16 -0
- package/dist/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -0
- package/dist/{summarizerTypes.js → gc/gcSummaryDefinitions.cjs} +1 -6
- package/dist/gc/gcSummaryDefinitions.cjs.map +1 -0
- package/dist/gc/gcSummaryDefinitions.d.ts +52 -0
- package/dist/gc/gcSummaryDefinitions.d.ts.map +1 -0
- package/dist/gc/gcSummaryStateTracker.cjs +213 -0
- package/dist/gc/gcSummaryStateTracker.cjs.map +1 -0
- package/dist/gc/gcSummaryStateTracker.d.ts +94 -0
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -0
- package/dist/gc/gcTelemetry.cjs +298 -0
- package/dist/gc/gcTelemetry.cjs.map +1 -0
- package/dist/gc/gcTelemetry.d.ts +92 -0
- package/dist/gc/gcTelemetry.d.ts.map +1 -0
- package/dist/gc/gcUnreferencedStateTracker.cjs +118 -0
- package/dist/gc/gcUnreferencedStateTracker.cjs.map +1 -0
- package/dist/gc/gcUnreferencedStateTracker.d.ts +40 -0
- package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
- package/dist/gc/index.cjs +44 -0
- package/dist/gc/index.cjs.map +1 -0
- package/dist/gc/index.d.ts +13 -0
- package/dist/gc/index.d.ts.map +1 -0
- package/dist/index.cjs +47 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +19 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/messageTypes.cjs +37 -0
- package/dist/messageTypes.cjs.map +1 -0
- package/dist/messageTypes.d.ts +142 -0
- package/dist/messageTypes.d.ts.map +1 -0
- package/dist/metadata.cjs +7 -0
- package/dist/metadata.cjs.map +1 -0
- package/dist/metadata.d.ts +24 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/opLifecycle/batchManager.cjs +139 -0
- package/dist/opLifecycle/batchManager.cjs.map +1 -0
- package/dist/opLifecycle/batchManager.d.ts +48 -0
- package/dist/opLifecycle/batchManager.d.ts.map +1 -0
- package/dist/opLifecycle/definitions.cjs +7 -0
- package/dist/opLifecycle/definitions.cjs.map +1 -0
- package/dist/opLifecycle/definitions.d.ts +83 -0
- package/dist/opLifecycle/definitions.d.ts.map +1 -0
- package/dist/opLifecycle/index.cjs +26 -0
- package/dist/opLifecycle/index.cjs.map +1 -0
- package/dist/opLifecycle/index.d.ts +13 -0
- package/dist/opLifecycle/index.d.ts.map +1 -0
- package/dist/opLifecycle/opCompressor.cjs +84 -0
- package/dist/opLifecycle/opCompressor.cjs.map +1 -0
- package/dist/opLifecycle/opCompressor.d.ts +18 -0
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -0
- package/dist/opLifecycle/opDecompressor.cjs +132 -0
- package/dist/opLifecycle/opDecompressor.cjs.map +1 -0
- package/dist/opLifecycle/opDecompressor.d.ts +25 -0
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -0
- package/dist/opLifecycle/opGroupingManager.cjs +95 -0
- package/dist/opLifecycle/opGroupingManager.cjs.map +1 -0
- package/dist/opLifecycle/opGroupingManager.d.ts +22 -0
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -0
- package/dist/opLifecycle/opSplitter.cjs +202 -0
- package/dist/opLifecycle/opSplitter.cjs.map +1 -0
- package/dist/opLifecycle/opSplitter.d.ts +61 -0
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -0
- package/dist/opLifecycle/outbox.cjs +323 -0
- package/dist/opLifecycle/outbox.cjs.map +1 -0
- package/dist/opLifecycle/outbox.d.ts +104 -0
- package/dist/opLifecycle/outbox.d.ts.map +1 -0
- package/dist/opLifecycle/remoteMessageProcessor.cjs +136 -0
- package/dist/opLifecycle/remoteMessageProcessor.cjs.map +1 -0
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +47 -0
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -0
- package/dist/opProperties.cjs +17 -0
- package/dist/opProperties.cjs.map +1 -0
- package/dist/opProperties.d.ts +7 -0
- package/dist/opProperties.d.ts.map +1 -0
- package/dist/{packageVersion.js → packageVersion.cjs} +2 -2
- package/dist/packageVersion.cjs.map +1 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/pendingStateManager.cjs +282 -0
- package/dist/pendingStateManager.cjs.map +1 -0
- package/dist/pendingStateManager.d.ts +32 -69
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/scheduleManager.cjs +258 -0
- package/dist/scheduleManager.cjs.map +1 -0
- package/dist/scheduleManager.d.ts +31 -0
- package/dist/scheduleManager.d.ts.map +1 -0
- package/dist/storageServiceWithAttachBlobs.cjs +32 -0
- package/dist/storageServiceWithAttachBlobs.cjs.map +1 -0
- package/dist/storageServiceWithAttachBlobs.d.ts +17 -0
- package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -0
- package/dist/summary/index.cjs +51 -0
- package/dist/summary/index.cjs.map +1 -0
- package/dist/summary/index.d.ts +17 -0
- package/dist/summary/index.d.ts.map +1 -0
- package/dist/{orderedClientElection.js → summary/orderedClientElection.cjs} +100 -84
- package/dist/summary/orderedClientElection.cjs.map +1 -0
- package/{lib → dist/summary}/orderedClientElection.d.ts +41 -18
- package/dist/summary/orderedClientElection.d.ts.map +1 -0
- package/dist/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.cjs} +12 -10
- package/dist/summary/runWhileConnectedCoordinator.cjs.map +1 -0
- package/{lib → dist/summary}/runWhileConnectedCoordinator.d.ts +8 -2
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
- package/dist/summary/runningSummarizer.cjs +679 -0
- package/dist/summary/runningSummarizer.cjs.map +1 -0
- package/dist/summary/runningSummarizer.d.ts +128 -0
- package/dist/summary/runningSummarizer.d.ts.map +1 -0
- package/dist/summary/summarizer.cjs +263 -0
- package/dist/summary/summarizer.cjs.map +1 -0
- package/dist/{summarizer.d.ts → summary/summarizer.d.ts} +18 -33
- package/dist/summary/summarizer.d.ts.map +1 -0
- package/dist/{summarizerClientElection.js → summary/summarizerClientElection.cjs} +15 -46
- package/dist/summary/summarizerClientElection.cjs.map +1 -0
- package/{lib → dist/summary}/summarizerClientElection.d.ts +4 -4
- package/dist/summary/summarizerClientElection.d.ts.map +1 -0
- package/dist/summary/summarizerHeuristics.cjs +156 -0
- package/dist/summary/summarizerHeuristics.cjs.map +1 -0
- package/{lib → dist/summary}/summarizerHeuristics.d.ts +28 -6
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -0
- package/dist/summary/summarizerNode/index.cjs +12 -0
- package/dist/summary/summarizerNode/index.cjs.map +1 -0
- package/dist/summary/summarizerNode/index.d.ts +8 -0
- package/dist/summary/summarizerNode/index.d.ts.map +1 -0
- package/dist/summary/summarizerNode/summarizerNode.cjs +526 -0
- package/dist/summary/summarizerNode/summarizerNode.cjs.map +1 -0
- package/dist/summary/summarizerNode/summarizerNode.d.ts +167 -0
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -0
- package/dist/summary/summarizerNode/summarizerNodeUtils.cjs +130 -0
- package/dist/summary/summarizerNode/summarizerNodeUtils.cjs.map +1 -0
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +121 -0
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -0
- package/dist/summary/summarizerNode/summarizerNodeWithGc.cjs +375 -0
- package/dist/summary/summarizerNode/summarizerNodeWithGc.cjs.map +1 -0
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +153 -0
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
- package/dist/summary/summarizerTypes.cjs +7 -0
- package/dist/summary/summarizerTypes.cjs.map +1 -0
- package/{lib → dist/summary}/summarizerTypes.d.ts +233 -83
- package/dist/summary/summarizerTypes.d.ts.map +1 -0
- package/dist/{summaryCollection.js → summary/summaryCollection.cjs} +80 -49
- package/dist/summary/summaryCollection.cjs.map +1 -0
- package/dist/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +23 -5
- package/dist/summary/summaryCollection.d.ts.map +1 -0
- package/dist/{summaryFormat.js → summary/summaryFormat.cjs} +29 -26
- package/dist/summary/summaryFormat.cjs.map +1 -0
- package/{lib → dist/summary}/summaryFormat.d.ts +25 -30
- package/dist/summary/summaryFormat.d.ts.map +1 -0
- package/dist/{summaryGenerator.js → summary/summaryGenerator.cjs} +162 -74
- package/dist/summary/summaryGenerator.cjs.map +1 -0
- package/dist/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +53 -11
- package/dist/summary/summaryGenerator.d.ts.map +1 -0
- package/dist/{summaryManager.js → summary/summaryManager.cjs} +98 -55
- package/dist/summary/summaryManager.cjs.map +1 -0
- package/{lib → dist/summary}/summaryManager.d.ts +13 -11
- package/dist/summary/summaryManager.d.ts.map +1 -0
- package/dist/{throttler.js → throttler.cjs} +21 -21
- package/dist/throttler.cjs.map +1 -0
- package/dist/throttler.d.ts +2 -2
- package/dist/throttler.d.ts.map +1 -1
- package/dist/tsdoc-metadata.json +11 -0
- package/lib/{batchTracker.d.ts → batchTracker.d.mts} +6 -5
- package/lib/batchTracker.d.mts.map +1 -0
- package/lib/{batchTracker.js → batchTracker.mjs} +9 -8
- package/lib/batchTracker.mjs.map +1 -0
- package/lib/blobManager.d.mts +191 -0
- package/lib/blobManager.d.mts.map +1 -0
- package/lib/blobManager.mjs +699 -0
- package/lib/blobManager.mjs.map +1 -0
- package/lib/{connectionTelemetry.d.ts → connectionTelemetry.d.mts} +2 -2
- package/lib/connectionTelemetry.d.mts.map +1 -0
- package/lib/connectionTelemetry.mjs +226 -0
- package/lib/connectionTelemetry.mjs.map +1 -0
- package/lib/container-runtime-alpha.d.mts +1677 -0
- package/lib/container-runtime-beta.d.mts +250 -0
- package/lib/container-runtime-public.d.mts +250 -0
- package/lib/container-runtime-untrimmed.d.mts +1792 -0
- package/lib/{containerHandleContext.d.ts → containerHandleContext.d.mts} +1 -1
- package/lib/containerHandleContext.d.mts.map +1 -0
- package/lib/{containerHandleContext.js → containerHandleContext.mjs} +4 -2
- package/lib/containerHandleContext.mjs.map +1 -0
- package/lib/containerRuntime.d.mts +809 -0
- package/lib/containerRuntime.d.mts.map +1 -0
- package/lib/containerRuntime.mjs +2526 -0
- package/lib/containerRuntime.mjs.map +1 -0
- package/lib/{dataStore.d.ts → dataStore.d.mts} +4 -4
- package/lib/dataStore.d.mts.map +1 -0
- package/lib/{dataStore.js → dataStore.mjs} +52 -43
- package/lib/dataStore.mjs.map +1 -0
- package/lib/{dataStoreContext.d.ts → dataStoreContext.d.mts} +74 -42
- package/lib/dataStoreContext.d.mts.map +1 -0
- package/lib/{dataStoreContext.js → dataStoreContext.mjs} +309 -213
- package/lib/dataStoreContext.mjs.map +1 -0
- package/lib/{dataStoreContexts.d.ts → dataStoreContexts.d.mts} +2 -2
- package/lib/dataStoreContexts.d.mts.map +1 -0
- package/lib/{dataStoreContexts.js → dataStoreContexts.mjs} +12 -8
- package/lib/dataStoreContexts.mjs.map +1 -0
- package/lib/{dataStoreRegistry.d.ts → dataStoreRegistry.d.mts} +3 -0
- package/lib/dataStoreRegistry.d.mts.map +1 -0
- package/lib/{dataStoreRegistry.js → dataStoreRegistry.mjs} +7 -6
- package/lib/dataStoreRegistry.mjs.map +1 -0
- package/lib/{dataStores.d.ts → dataStores.d.mts} +56 -26
- package/lib/dataStores.d.mts.map +1 -0
- package/lib/{dataStores.js → dataStores.mjs} +254 -105
- package/lib/dataStores.mjs.map +1 -0
- package/lib/deltaManagerProxyBase.d.mts +35 -0
- package/lib/deltaManagerProxyBase.d.mts.map +1 -0
- package/lib/deltaManagerProxyBase.mjs +73 -0
- package/lib/deltaManagerProxyBase.mjs.map +1 -0
- package/lib/deltaManagerSummarizerProxy.d.mts +19 -0
- package/lib/deltaManagerSummarizerProxy.d.mts.map +1 -0
- package/lib/deltaManagerSummarizerProxy.mjs +38 -0
- package/lib/deltaManagerSummarizerProxy.mjs.map +1 -0
- package/lib/{deltaScheduler.d.ts → deltaScheduler.d.mts} +8 -6
- package/lib/deltaScheduler.d.mts.map +1 -0
- package/lib/{deltaScheduler.js → deltaScheduler.mjs} +22 -15
- package/lib/deltaScheduler.mjs.map +1 -0
- package/lib/error.d.mts +14 -0
- package/lib/error.d.mts.map +1 -0
- package/lib/error.mjs +17 -0
- package/lib/error.mjs.map +1 -0
- package/lib/gc/garbageCollection.d.mts +224 -0
- package/lib/gc/garbageCollection.d.mts.map +1 -0
- package/lib/gc/garbageCollection.mjs +857 -0
- package/lib/gc/garbageCollection.mjs.map +1 -0
- package/lib/gc/gcConfigs.d.mts +23 -0
- package/lib/gc/gcConfigs.d.mts.map +1 -0
- package/lib/gc/gcConfigs.mjs +149 -0
- package/lib/gc/gcConfigs.mjs.map +1 -0
- package/lib/gc/gcDefinitions.d.mts +437 -0
- package/lib/gc/gcDefinitions.d.mts.map +1 -0
- package/lib/gc/gcDefinitions.mjs +93 -0
- package/lib/gc/gcDefinitions.mjs.map +1 -0
- package/lib/gc/gcHelpers.d.mts +71 -0
- package/lib/gc/gcHelpers.d.mts.map +1 -0
- package/lib/gc/gcHelpers.mjs +222 -0
- package/lib/gc/gcHelpers.mjs.map +1 -0
- package/lib/gc/gcReferenceGraphAlgorithm.d.mts +16 -0
- package/lib/gc/gcReferenceGraphAlgorithm.d.mts.map +1 -0
- package/lib/gc/gcReferenceGraphAlgorithm.mjs +45 -0
- package/lib/gc/gcReferenceGraphAlgorithm.mjs.map +1 -0
- package/lib/gc/gcSummaryDefinitions.d.mts +52 -0
- package/lib/gc/gcSummaryDefinitions.d.mts.map +1 -0
- package/lib/gc/gcSummaryDefinitions.mjs +6 -0
- package/lib/gc/gcSummaryDefinitions.mjs.map +1 -0
- package/lib/gc/gcSummaryStateTracker.d.mts +94 -0
- package/lib/gc/gcSummaryStateTracker.d.mts.map +1 -0
- package/lib/gc/gcSummaryStateTracker.mjs +209 -0
- package/lib/gc/gcSummaryStateTracker.mjs.map +1 -0
- package/lib/gc/gcTelemetry.d.mts +92 -0
- package/lib/gc/gcTelemetry.d.mts.map +1 -0
- package/lib/gc/gcTelemetry.mjs +293 -0
- package/lib/gc/gcTelemetry.mjs.map +1 -0
- package/lib/gc/gcUnreferencedStateTracker.d.mts +40 -0
- package/lib/gc/gcUnreferencedStateTracker.d.mts.map +1 -0
- package/lib/gc/gcUnreferencedStateTracker.mjs +114 -0
- package/lib/gc/gcUnreferencedStateTracker.mjs.map +1 -0
- package/lib/gc/index.d.mts +13 -0
- package/lib/gc/index.d.mts.map +1 -0
- package/lib/gc/index.mjs +12 -0
- package/lib/gc/index.mjs.map +1 -0
- package/lib/index.d.mts +25 -0
- package/lib/index.d.mts.map +1 -0
- package/lib/index.mjs +24 -0
- package/lib/index.mjs.map +1 -0
- package/lib/messageTypes.d.mts +142 -0
- package/lib/messageTypes.d.mts.map +1 -0
- package/lib/messageTypes.mjs +34 -0
- package/lib/messageTypes.mjs.map +1 -0
- package/lib/metadata.d.mts +24 -0
- package/lib/metadata.d.mts.map +1 -0
- package/lib/metadata.mjs +6 -0
- package/lib/metadata.mjs.map +1 -0
- package/lib/opLifecycle/batchManager.d.mts +48 -0
- package/lib/opLifecycle/batchManager.d.mts.map +1 -0
- package/lib/opLifecycle/batchManager.mjs +133 -0
- package/lib/opLifecycle/batchManager.mjs.map +1 -0
- package/lib/opLifecycle/definitions.d.mts +83 -0
- package/lib/opLifecycle/definitions.d.mts.map +1 -0
- package/lib/opLifecycle/definitions.mjs +6 -0
- package/lib/opLifecycle/definitions.mjs.map +1 -0
- package/lib/opLifecycle/index.d.mts +13 -0
- package/lib/opLifecycle/index.d.mts.map +1 -0
- package/lib/opLifecycle/index.mjs +12 -0
- package/lib/opLifecycle/index.mjs.map +1 -0
- package/lib/opLifecycle/opCompressor.d.mts +18 -0
- package/lib/opLifecycle/opCompressor.d.mts.map +1 -0
- package/lib/opLifecycle/opCompressor.mjs +80 -0
- package/lib/opLifecycle/opCompressor.mjs.map +1 -0
- package/lib/opLifecycle/opDecompressor.d.mts +25 -0
- package/lib/opLifecycle/opDecompressor.d.mts.map +1 -0
- package/lib/opLifecycle/opDecompressor.mjs +128 -0
- package/lib/opLifecycle/opDecompressor.mjs.map +1 -0
- package/lib/opLifecycle/opGroupingManager.d.mts +22 -0
- package/lib/opLifecycle/opGroupingManager.d.mts.map +1 -0
- package/lib/opLifecycle/opGroupingManager.mjs +91 -0
- package/lib/opLifecycle/opGroupingManager.mjs.map +1 -0
- package/lib/opLifecycle/opSplitter.d.mts +61 -0
- package/lib/opLifecycle/opSplitter.d.mts.map +1 -0
- package/lib/opLifecycle/opSplitter.mjs +197 -0
- package/lib/opLifecycle/opSplitter.mjs.map +1 -0
- package/lib/opLifecycle/outbox.d.mts +104 -0
- package/lib/opLifecycle/outbox.d.mts.map +1 -0
- package/lib/opLifecycle/outbox.mjs +318 -0
- package/lib/opLifecycle/outbox.mjs.map +1 -0
- package/lib/opLifecycle/remoteMessageProcessor.d.mts +47 -0
- package/lib/opLifecycle/remoteMessageProcessor.d.mts.map +1 -0
- package/lib/opLifecycle/remoteMessageProcessor.mjs +131 -0
- package/lib/opLifecycle/remoteMessageProcessor.mjs.map +1 -0
- package/lib/opProperties.d.mts +7 -0
- package/lib/opProperties.d.mts.map +1 -0
- package/lib/opProperties.mjs +13 -0
- package/lib/opProperties.mjs.map +1 -0
- package/lib/{packageVersion.d.ts → packageVersion.d.mts} +1 -1
- package/lib/{packageVersion.d.ts.map → packageVersion.d.mts.map} +1 -1
- package/lib/{packageVersion.js → packageVersion.mjs} +2 -2
- package/lib/packageVersion.mjs.map +1 -0
- package/lib/{pendingStateManager.d.ts → pendingStateManager.d.mts} +32 -69
- package/lib/pendingStateManager.d.mts.map +1 -0
- package/lib/pendingStateManager.mjs +275 -0
- package/lib/pendingStateManager.mjs.map +1 -0
- package/lib/scheduleManager.d.mts +27 -0
- package/lib/scheduleManager.d.mts.map +1 -0
- package/lib/scheduleManager.mjs +254 -0
- package/lib/scheduleManager.mjs.map +1 -0
- package/lib/storageServiceWithAttachBlobs.d.mts +17 -0
- package/lib/storageServiceWithAttachBlobs.d.mts.map +1 -0
- package/lib/storageServiceWithAttachBlobs.mjs +28 -0
- package/lib/storageServiceWithAttachBlobs.mjs.map +1 -0
- package/lib/summary/index.d.mts +17 -0
- package/lib/summary/index.d.mts.map +1 -0
- package/lib/summary/index.mjs +16 -0
- package/lib/summary/index.mjs.map +1 -0
- package/{dist/orderedClientElection.d.ts → lib/summary/orderedClientElection.d.mts} +41 -22
- package/lib/summary/orderedClientElection.d.mts.map +1 -0
- package/lib/{orderedClientElection.js → summary/orderedClientElection.mjs} +95 -79
- package/lib/summary/orderedClientElection.mjs.map +1 -0
- package/{dist/runWhileConnectedCoordinator.d.ts → lib/summary/runWhileConnectedCoordinator.d.mts} +9 -3
- package/lib/summary/runWhileConnectedCoordinator.d.mts.map +1 -0
- package/lib/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.mjs} +12 -10
- package/lib/summary/runWhileConnectedCoordinator.mjs.map +1 -0
- package/lib/summary/runningSummarizer.d.mts +128 -0
- package/lib/summary/runningSummarizer.d.mts.map +1 -0
- package/lib/summary/runningSummarizer.mjs +675 -0
- package/lib/summary/runningSummarizer.mjs.map +1 -0
- package/lib/{summarizer.d.ts → summary/summarizer.d.mts} +20 -35
- package/lib/summary/summarizer.d.mts.map +1 -0
- package/lib/summary/summarizer.mjs +257 -0
- package/lib/summary/summarizer.mjs.map +1 -0
- package/{dist/summarizerClientElection.d.ts → lib/summary/summarizerClientElection.d.mts} +6 -6
- package/lib/summary/summarizerClientElection.d.mts.map +1 -0
- package/lib/{summarizerClientElection.js → summary/summarizerClientElection.mjs} +14 -45
- package/lib/summary/summarizerClientElection.mjs.map +1 -0
- package/{dist/summarizerHeuristics.d.ts → lib/summary/summarizerHeuristics.d.mts} +29 -7
- package/lib/summary/summarizerHeuristics.d.mts.map +1 -0
- package/lib/summary/summarizerHeuristics.mjs +151 -0
- package/lib/summary/summarizerHeuristics.mjs.map +1 -0
- package/lib/summary/summarizerNode/index.d.mts +8 -0
- package/lib/summary/summarizerNode/index.d.mts.map +1 -0
- package/lib/summary/summarizerNode/index.mjs +7 -0
- package/lib/summary/summarizerNode/index.mjs.map +1 -0
- package/lib/summary/summarizerNode/summarizerNode.d.mts +167 -0
- package/lib/summary/summarizerNode/summarizerNode.d.mts.map +1 -0
- package/lib/summary/summarizerNode/summarizerNode.mjs +521 -0
- package/lib/summary/summarizerNode/summarizerNode.mjs.map +1 -0
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.mts +121 -0
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.mts.map +1 -0
- package/lib/summary/summarizerNode/summarizerNodeUtils.mjs +123 -0
- package/lib/summary/summarizerNode/summarizerNodeUtils.mjs.map +1 -0
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.mts +153 -0
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.mts.map +1 -0
- package/lib/summary/summarizerNode/summarizerNodeWithGc.mjs +370 -0
- package/lib/summary/summarizerNode/summarizerNodeWithGc.mjs.map +1 -0
- package/{dist/summarizerTypes.d.ts → lib/summary/summarizerTypes.d.mts} +234 -84
- package/lib/summary/summarizerTypes.d.mts.map +1 -0
- package/lib/summary/summarizerTypes.mjs +6 -0
- package/lib/summary/summarizerTypes.mjs.map +1 -0
- package/lib/{summaryCollection.d.ts → summary/summaryCollection.d.mts} +23 -5
- package/lib/summary/summaryCollection.d.mts.map +1 -0
- package/lib/{summaryCollection.js → summary/summaryCollection.mjs} +76 -45
- package/lib/summary/summaryCollection.mjs.map +1 -0
- package/{dist/summaryFormat.d.ts → lib/summary/summaryFormat.d.mts} +25 -30
- package/lib/summary/summaryFormat.d.mts.map +1 -0
- package/lib/{summaryFormat.js → summary/summaryFormat.mjs} +30 -26
- package/lib/summary/summaryFormat.mjs.map +1 -0
- package/lib/summary/summaryGenerator.d.mts +127 -0
- package/lib/summary/summaryGenerator.d.mts.map +1 -0
- package/lib/{summaryGenerator.js → summary/summaryGenerator.mjs} +153 -67
- package/lib/summary/summaryGenerator.mjs.map +1 -0
- package/{dist/summaryManager.d.ts → lib/summary/summaryManager.d.mts} +15 -13
- package/lib/summary/summaryManager.d.mts.map +1 -0
- package/lib/{summaryManager.js → summary/summaryManager.mjs} +94 -51
- package/lib/summary/summaryManager.mjs.map +1 -0
- package/lib/{throttler.d.ts → throttler.d.mts} +2 -2
- package/lib/throttler.d.mts.map +1 -0
- package/lib/{throttler.js → throttler.mjs} +21 -21
- package/lib/throttler.mjs.map +1 -0
- package/package.json +173 -72
- package/prettier.config.cjs +8 -0
- package/src/batchTracker.ts +59 -54
- package/src/blobManager.ts +937 -294
- package/src/connectionTelemetry.ts +342 -252
- package/src/containerHandleContext.ts +27 -29
- package/src/containerRuntime.ts +3879 -3143
- package/src/dataStore.ts +170 -140
- package/src/dataStoreContext.ts +1166 -986
- package/src/dataStoreContexts.ts +176 -163
- package/src/dataStoreRegistry.ts +29 -21
- package/src/dataStores.ts +921 -678
- package/src/deltaManagerProxyBase.ts +111 -0
- package/src/deltaManagerSummarizerProxy.ts +49 -0
- package/src/deltaScheduler.ts +161 -156
- package/src/error.ts +21 -0
- package/src/gc/garbageCollection.md +106 -0
- package/src/gc/garbageCollection.ts +1153 -0
- package/src/gc/gcConfigs.ts +216 -0
- package/src/gc/gcDefinitions.ts +502 -0
- package/src/gc/gcHelpers.ts +284 -0
- package/src/gc/gcReferenceGraphAlgorithm.ts +52 -0
- package/src/gc/gcSummaryDefinitions.ts +54 -0
- package/src/gc/gcSummaryStateTracker.ts +299 -0
- package/src/gc/gcTelemetry.ts +423 -0
- package/src/gc/gcUnreferencedStateTracker.ts +153 -0
- package/src/gc/index.ts +59 -0
- package/src/index.ts +101 -74
- package/src/messageTypes.ts +238 -0
- package/src/metadata.ts +26 -0
- package/src/opLifecycle/README.md +321 -0
- package/src/opLifecycle/batchManager.ts +179 -0
- package/src/opLifecycle/definitions.ts +89 -0
- package/src/opLifecycle/index.ts +19 -0
- package/src/opLifecycle/opCompressor.ts +99 -0
- package/src/opLifecycle/opDecompressor.ts +190 -0
- package/src/opLifecycle/opGroupingManager.ts +133 -0
- package/src/opLifecycle/opSplitter.ts +279 -0
- package/src/opLifecycle/outbox.ts +471 -0
- package/src/opLifecycle/remoteMessageProcessor.ts +175 -0
- package/src/opProperties.ts +21 -0
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +396 -465
- package/src/scheduleManager.ts +358 -0
- package/src/storageServiceWithAttachBlobs.ts +38 -0
- package/src/summary/index.ts +109 -0
- package/src/summary/orderedClientElection.ts +571 -0
- package/src/summary/runWhileConnectedCoordinator.ts +117 -0
- package/src/summary/runningSummarizer.ts +920 -0
- package/src/summary/summarizer.ts +352 -0
- package/src/summary/summarizerClientElection.ts +140 -0
- package/src/summary/summarizerHeuristics.ts +227 -0
- package/src/summary/summarizerNode/index.ts +12 -0
- package/src/summary/summarizerNode/summarizerNode.ts +725 -0
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +206 -0
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +571 -0
- package/src/summary/summarizerTypes.ts +631 -0
- package/src/summary/summaryCollection.ts +474 -0
- package/src/summary/summaryFormat.ts +249 -0
- package/src/summary/summaryGenerator.ts +539 -0
- package/src/summary/summaryManager.ts +452 -0
- package/src/throttler.ts +131 -122
- package/tsc-multi.test.json +4 -0
- package/tsconfig.json +11 -13
- package/dist/batchTracker.js.map +0 -1
- package/dist/blobManager.js +0 -249
- package/dist/blobManager.js.map +0 -1
- package/dist/connectionTelemetry.js +0 -178
- package/dist/connectionTelemetry.js.map +0 -1
- package/dist/containerHandleContext.js.map +0 -1
- package/dist/containerRuntime.js +0 -2174
- package/dist/containerRuntime.js.map +0 -1
- package/dist/dataStore.js.map +0 -1
- package/dist/dataStoreContext.js.map +0 -1
- package/dist/dataStoreContexts.js.map +0 -1
- package/dist/dataStoreRegistry.js.map +0 -1
- package/dist/dataStores.js.map +0 -1
- package/dist/deltaScheduler.js.map +0 -1
- package/dist/garbageCollection.d.ts +0 -319
- package/dist/garbageCollection.d.ts.map +0 -1
- package/dist/garbageCollection.js +0 -993
- package/dist/garbageCollection.js.map +0 -1
- package/dist/index.js +0 -33
- package/dist/index.js.map +0 -1
- package/dist/opTelemetry.d.ts +0 -22
- package/dist/opTelemetry.d.ts.map +0 -1
- package/dist/opTelemetry.js +0 -60
- package/dist/opTelemetry.js.map +0 -1
- package/dist/orderedClientElection.d.ts.map +0 -1
- package/dist/orderedClientElection.js.map +0 -1
- package/dist/packageVersion.js.map +0 -1
- package/dist/pendingStateManager.js +0 -346
- package/dist/pendingStateManager.js.map +0 -1
- package/dist/runWhileConnectedCoordinator.d.ts.map +0 -1
- package/dist/runWhileConnectedCoordinator.js.map +0 -1
- package/dist/runningSummarizer.d.ts +0 -93
- package/dist/runningSummarizer.d.ts.map +0 -1
- package/dist/runningSummarizer.js +0 -384
- package/dist/runningSummarizer.js.map +0 -1
- package/dist/serializedSnapshotStorage.d.ts +0 -58
- package/dist/serializedSnapshotStorage.d.ts.map +0 -1
- package/dist/serializedSnapshotStorage.js +0 -108
- package/dist/serializedSnapshotStorage.js.map +0 -1
- package/dist/summarizer.d.ts.map +0 -1
- package/dist/summarizer.js +0 -348
- package/dist/summarizer.js.map +0 -1
- package/dist/summarizerClientElection.d.ts.map +0 -1
- package/dist/summarizerClientElection.js.map +0 -1
- package/dist/summarizerHandle.d.ts +0 -12
- package/dist/summarizerHandle.d.ts.map +0 -1
- package/dist/summarizerHandle.js +0 -22
- package/dist/summarizerHandle.js.map +0 -1
- package/dist/summarizerHeuristics.d.ts.map +0 -1
- package/dist/summarizerHeuristics.js +0 -84
- package/dist/summarizerHeuristics.js.map +0 -1
- package/dist/summarizerTypes.d.ts.map +0 -1
- package/dist/summarizerTypes.js.map +0 -1
- package/dist/summaryCollection.d.ts.map +0 -1
- package/dist/summaryCollection.js.map +0 -1
- package/dist/summaryFormat.d.ts.map +0 -1
- package/dist/summaryFormat.js.map +0 -1
- package/dist/summaryGenerator.d.ts.map +0 -1
- package/dist/summaryGenerator.js.map +0 -1
- package/dist/summaryManager.d.ts.map +0 -1
- package/dist/summaryManager.js.map +0 -1
- package/dist/throttler.js.map +0 -1
- package/garbageCollection.md +0 -41
- package/lib/batchTracker.d.ts.map +0 -1
- package/lib/batchTracker.js.map +0 -1
- package/lib/blobManager.d.ts +0 -95
- package/lib/blobManager.d.ts.map +0 -1
- package/lib/blobManager.js +0 -244
- package/lib/blobManager.js.map +0 -1
- package/lib/connectionTelemetry.d.ts.map +0 -1
- package/lib/connectionTelemetry.js +0 -174
- package/lib/connectionTelemetry.js.map +0 -1
- package/lib/containerHandleContext.d.ts.map +0 -1
- package/lib/containerHandleContext.js.map +0 -1
- package/lib/containerRuntime.d.ts +0 -615
- package/lib/containerRuntime.d.ts.map +0 -1
- package/lib/containerRuntime.js +0 -2166
- package/lib/containerRuntime.js.map +0 -1
- package/lib/dataStore.d.ts.map +0 -1
- package/lib/dataStore.js.map +0 -1
- package/lib/dataStoreContext.d.ts.map +0 -1
- package/lib/dataStoreContext.js.map +0 -1
- package/lib/dataStoreContexts.d.ts.map +0 -1
- package/lib/dataStoreContexts.js.map +0 -1
- package/lib/dataStoreRegistry.d.ts.map +0 -1
- package/lib/dataStoreRegistry.js.map +0 -1
- package/lib/dataStores.d.ts.map +0 -1
- package/lib/dataStores.js.map +0 -1
- package/lib/deltaScheduler.d.ts.map +0 -1
- package/lib/deltaScheduler.js.map +0 -1
- package/lib/garbageCollection.d.ts +0 -319
- package/lib/garbageCollection.d.ts.map +0 -1
- package/lib/garbageCollection.js +0 -989
- package/lib/garbageCollection.js.map +0 -1
- package/lib/index.d.ts +0 -14
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -13
- package/lib/index.js.map +0 -1
- package/lib/opTelemetry.d.ts +0 -22
- package/lib/opTelemetry.d.ts.map +0 -1
- package/lib/opTelemetry.js +0 -56
- package/lib/opTelemetry.js.map +0 -1
- package/lib/orderedClientElection.d.ts.map +0 -1
- package/lib/orderedClientElection.js.map +0 -1
- package/lib/packageVersion.js.map +0 -1
- package/lib/pendingStateManager.d.ts.map +0 -1
- package/lib/pendingStateManager.js +0 -339
- package/lib/pendingStateManager.js.map +0 -1
- package/lib/runWhileConnectedCoordinator.d.ts.map +0 -1
- package/lib/runWhileConnectedCoordinator.js.map +0 -1
- package/lib/runningSummarizer.d.ts +0 -93
- package/lib/runningSummarizer.d.ts.map +0 -1
- package/lib/runningSummarizer.js +0 -380
- package/lib/runningSummarizer.js.map +0 -1
- package/lib/serializedSnapshotStorage.d.ts +0 -58
- package/lib/serializedSnapshotStorage.d.ts.map +0 -1
- package/lib/serializedSnapshotStorage.js +0 -104
- package/lib/serializedSnapshotStorage.js.map +0 -1
- package/lib/summarizer.d.ts.map +0 -1
- package/lib/summarizer.js +0 -342
- package/lib/summarizer.js.map +0 -1
- package/lib/summarizerClientElection.d.ts.map +0 -1
- package/lib/summarizerClientElection.js.map +0 -1
- package/lib/summarizerHandle.d.ts +0 -12
- package/lib/summarizerHandle.d.ts.map +0 -1
- package/lib/summarizerHandle.js +0 -18
- package/lib/summarizerHandle.js.map +0 -1
- package/lib/summarizerHeuristics.d.ts.map +0 -1
- package/lib/summarizerHeuristics.js +0 -79
- package/lib/summarizerHeuristics.js.map +0 -1
- package/lib/summarizerTypes.d.ts.map +0 -1
- package/lib/summarizerTypes.js +0 -9
- package/lib/summarizerTypes.js.map +0 -1
- package/lib/summaryCollection.d.ts.map +0 -1
- package/lib/summaryCollection.js.map +0 -1
- package/lib/summaryFormat.d.ts.map +0 -1
- package/lib/summaryFormat.js.map +0 -1
- package/lib/summaryGenerator.d.ts +0 -85
- package/lib/summaryGenerator.d.ts.map +0 -1
- package/lib/summaryGenerator.js.map +0 -1
- package/lib/summaryManager.d.ts.map +0 -1
- package/lib/summaryManager.js.map +0 -1
- package/lib/throttler.d.ts.map +0 -1
- package/lib/throttler.js.map +0 -1
- package/src/garbageCollection.ts +0 -1434
- package/src/opTelemetry.ts +0 -71
- package/src/orderedClientElection.ts +0 -511
- package/src/runWhileConnectedCoordinator.ts +0 -106
- package/src/runningSummarizer.ts +0 -550
- package/src/serializedSnapshotStorage.ts +0 -146
- package/src/summarizer.ts +0 -438
- package/src/summarizerClientElection.ts +0 -161
- package/src/summarizerHandle.ts +0 -21
- package/src/summarizerHeuristics.ts +0 -108
- package/src/summarizerTypes.ts +0 -462
- package/src/summaryCollection.ts +0 -406
- package/src/summaryFormat.ts +0 -239
- package/src/summaryGenerator.ts +0 -427
- package/src/summaryManager.ts +0 -368
- package/tsconfig.esnext.json +0 -7
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
createChildMonitoringContext,
|
|
8
|
+
GenericError,
|
|
9
|
+
MonitoringContext,
|
|
10
|
+
UsageError,
|
|
11
|
+
} from "@fluidframework/telemetry-utils";
|
|
12
|
+
import { assert } from "@fluidframework/core-utils";
|
|
13
|
+
import { IBatchMessage, ICriticalContainerError } from "@fluidframework/container-definitions";
|
|
14
|
+
import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
15
|
+
import { ICompressionRuntimeOptions } from "../containerRuntime";
|
|
16
|
+
import { IPendingBatchMessage, PendingStateManager } from "../pendingStateManager";
|
|
17
|
+
import {
|
|
18
|
+
BatchManager,
|
|
19
|
+
BatchSequenceNumbers,
|
|
20
|
+
estimateSocketSize,
|
|
21
|
+
sequenceNumbersMatch,
|
|
22
|
+
} from "./batchManager";
|
|
23
|
+
import { BatchMessage, IBatch } from "./definitions";
|
|
24
|
+
import { OpCompressor } from "./opCompressor";
|
|
25
|
+
import { OpGroupingManager } from "./opGroupingManager";
|
|
26
|
+
import { OpSplitter } from "./opSplitter";
|
|
27
|
+
|
|
28
|
+
export interface IOutboxConfig {
|
|
29
|
+
readonly compressionOptions: ICompressionRuntimeOptions;
|
|
30
|
+
// The maximum size of a batch that we can send over the wire.
|
|
31
|
+
readonly maxBatchSizeInBytes: number;
|
|
32
|
+
readonly disablePartialFlush: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface IOutboxParameters {
|
|
36
|
+
readonly shouldSend: () => boolean;
|
|
37
|
+
readonly pendingStateManager: PendingStateManager;
|
|
38
|
+
readonly submitBatchFn:
|
|
39
|
+
| ((batch: IBatchMessage[], referenceSequenceNumber?: number) => number)
|
|
40
|
+
| undefined;
|
|
41
|
+
readonly legacySendBatchFn: (batch: IBatch) => void;
|
|
42
|
+
readonly config: IOutboxConfig;
|
|
43
|
+
readonly compressor: OpCompressor;
|
|
44
|
+
readonly splitter: OpSplitter;
|
|
45
|
+
readonly logger: ITelemetryBaseLogger;
|
|
46
|
+
readonly groupingManager: OpGroupingManager;
|
|
47
|
+
readonly getCurrentSequenceNumbers: () => BatchSequenceNumbers;
|
|
48
|
+
readonly reSubmit: (message: IPendingBatchMessage) => void;
|
|
49
|
+
readonly opReentrancy: () => boolean;
|
|
50
|
+
readonly closeContainer: (error?: ICriticalContainerError) => void;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Temporarily increase the stack limit while executing the provided action.
|
|
55
|
+
* If a negative value is provided for `length`, no stack frames will be collected.
|
|
56
|
+
* If Infinity is provided, all frames will be collected.
|
|
57
|
+
*
|
|
58
|
+
* ADO:4663 - add this to the common packages.
|
|
59
|
+
*
|
|
60
|
+
* @param action - action which returns an error
|
|
61
|
+
* @param length - number of stack frames to collect, 50 if unspecified.
|
|
62
|
+
* @returns the result of the action provided
|
|
63
|
+
*/
|
|
64
|
+
export function getLongStack<T>(action: () => T, length: number = 50): T {
|
|
65
|
+
const errorObj = Error as any;
|
|
66
|
+
if (
|
|
67
|
+
/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */
|
|
68
|
+
// ?? is not logically equivalent when the first clause returns false.
|
|
69
|
+
(
|
|
70
|
+
Object.getOwnPropertyDescriptor(errorObj, "stackTraceLimit") ||
|
|
71
|
+
Object.getOwnPropertyDescriptor(Object.getPrototypeOf(errorObj), "stackTraceLimit")
|
|
72
|
+
)?.writable !== true
|
|
73
|
+
/* eslint-enable @typescript-eslint/prefer-nullish-coalescing */
|
|
74
|
+
) {
|
|
75
|
+
return action();
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const originalStackTraceLimit = errorObj.stackTraceLimit;
|
|
79
|
+
try {
|
|
80
|
+
errorObj.stackTraceLimit = length;
|
|
81
|
+
return action();
|
|
82
|
+
} finally {
|
|
83
|
+
errorObj.stackTraceLimit = originalStackTraceLimit;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export class Outbox {
|
|
88
|
+
private readonly mc: MonitoringContext;
|
|
89
|
+
private readonly attachFlowBatch: BatchManager;
|
|
90
|
+
private readonly mainBatch: BatchManager;
|
|
91
|
+
private readonly blobAttachBatch: BatchManager;
|
|
92
|
+
private readonly idAllocationBatch: BatchManager;
|
|
93
|
+
private readonly defaultAttachFlowSoftLimitInBytes = 320 * 1024;
|
|
94
|
+
private batchRebasesToReport = 5;
|
|
95
|
+
private rebasing = false;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Track the number of ops which were detected to have a mismatched
|
|
99
|
+
* reference sequence number, in order to self-throttle the telemetry events.
|
|
100
|
+
*
|
|
101
|
+
* This should be removed as part of ADO:2322
|
|
102
|
+
*/
|
|
103
|
+
private readonly maxMismatchedOpsToReport = 3;
|
|
104
|
+
private mismatchedOpsReported = 0;
|
|
105
|
+
|
|
106
|
+
constructor(private readonly params: IOutboxParameters) {
|
|
107
|
+
this.mc = createChildMonitoringContext({ logger: params.logger, namespace: "Outbox" });
|
|
108
|
+
const isCompressionEnabled =
|
|
109
|
+
this.params.config.compressionOptions.minimumBatchSizeInBytes !==
|
|
110
|
+
Number.POSITIVE_INFINITY;
|
|
111
|
+
// We need to allow infinite size batches if we enable compression
|
|
112
|
+
const hardLimit = isCompressionEnabled ? Infinity : this.params.config.maxBatchSizeInBytes;
|
|
113
|
+
const softLimit = isCompressionEnabled ? Infinity : this.defaultAttachFlowSoftLimitInBytes;
|
|
114
|
+
|
|
115
|
+
this.attachFlowBatch = new BatchManager({ hardLimit, softLimit });
|
|
116
|
+
this.mainBatch = new BatchManager({ hardLimit });
|
|
117
|
+
this.blobAttachBatch = new BatchManager({ hardLimit });
|
|
118
|
+
this.idAllocationBatch = new BatchManager({ hardLimit });
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
public get messageCount(): number {
|
|
122
|
+
return this.attachFlowBatch.length + this.mainBatch.length + this.blobAttachBatch.length;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
public get isEmpty(): boolean {
|
|
126
|
+
return this.messageCount === 0;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* If we detect that the reference sequence number of the incoming message does not match
|
|
131
|
+
* what was already in the batch managers, this means that batching has been interrupted so
|
|
132
|
+
* we will flush the accumulated messages to account for that and create a new batch with the new
|
|
133
|
+
* message as the first message.
|
|
134
|
+
*/
|
|
135
|
+
private maybeFlushPartialBatch() {
|
|
136
|
+
const mainBatchSeqNums = this.mainBatch.sequenceNumbers;
|
|
137
|
+
const attachFlowBatchSeqNums = this.attachFlowBatch.sequenceNumbers;
|
|
138
|
+
const blobAttachSeqNums = this.blobAttachBatch.sequenceNumbers;
|
|
139
|
+
assert(
|
|
140
|
+
this.params.config.disablePartialFlush ||
|
|
141
|
+
(sequenceNumbersMatch(mainBatchSeqNums, attachFlowBatchSeqNums) &&
|
|
142
|
+
sequenceNumbersMatch(mainBatchSeqNums, blobAttachSeqNums)),
|
|
143
|
+
0x58d /* Reference sequence numbers from both batches must be in sync */,
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
const currentSequenceNumbers = this.params.getCurrentSequenceNumbers();
|
|
147
|
+
|
|
148
|
+
if (
|
|
149
|
+
sequenceNumbersMatch(mainBatchSeqNums, currentSequenceNumbers) &&
|
|
150
|
+
sequenceNumbersMatch(attachFlowBatchSeqNums, currentSequenceNumbers) &&
|
|
151
|
+
sequenceNumbersMatch(blobAttachSeqNums, currentSequenceNumbers)
|
|
152
|
+
) {
|
|
153
|
+
// The reference sequence numbers are stable, there is nothing to do
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (++this.mismatchedOpsReported <= this.maxMismatchedOpsToReport) {
|
|
158
|
+
this.mc.logger.sendTelemetryEvent(
|
|
159
|
+
{
|
|
160
|
+
category: this.params.config.disablePartialFlush ? "error" : "generic",
|
|
161
|
+
eventName: "ReferenceSequenceNumberMismatch",
|
|
162
|
+
mainReferenceSequenceNumber: mainBatchSeqNums.referenceSequenceNumber,
|
|
163
|
+
mainClientSequenceNumber: mainBatchSeqNums.clientSequenceNumber,
|
|
164
|
+
attachReferenceSequenceNumber: attachFlowBatchSeqNums.referenceSequenceNumber,
|
|
165
|
+
attachClientSequenceNumber: attachFlowBatchSeqNums.clientSequenceNumber,
|
|
166
|
+
blobAttachReferenceSequenceNumber: blobAttachSeqNums.referenceSequenceNumber,
|
|
167
|
+
blobAttachClientSequenceNumber: blobAttachSeqNums.clientSequenceNumber,
|
|
168
|
+
currentReferenceSequenceNumber: currentSequenceNumbers.referenceSequenceNumber,
|
|
169
|
+
currentClientSequenceNumber: currentSequenceNumbers.clientSequenceNumber,
|
|
170
|
+
},
|
|
171
|
+
getLongStack(() => new UsageError("Submission of an out of order message")),
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (!this.params.config.disablePartialFlush) {
|
|
176
|
+
this.flushAll();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public submit(message: BatchMessage) {
|
|
181
|
+
this.maybeFlushPartialBatch();
|
|
182
|
+
|
|
183
|
+
this.addMessageToBatchManager(this.mainBatch, message);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
public submitAttach(message: BatchMessage) {
|
|
187
|
+
this.maybeFlushPartialBatch();
|
|
188
|
+
|
|
189
|
+
if (
|
|
190
|
+
!this.attachFlowBatch.push(
|
|
191
|
+
message,
|
|
192
|
+
this.isContextReentrant(),
|
|
193
|
+
this.params.getCurrentSequenceNumbers().clientSequenceNumber,
|
|
194
|
+
)
|
|
195
|
+
) {
|
|
196
|
+
// BatchManager has two limits - soft limit & hard limit. Soft limit is only engaged
|
|
197
|
+
// when queue is not empty.
|
|
198
|
+
// Flush queue & retry. Failure on retry would mean - single message is bigger than hard limit
|
|
199
|
+
this.flushInternal(this.attachFlowBatch);
|
|
200
|
+
|
|
201
|
+
this.addMessageToBatchManager(this.attachFlowBatch, message);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// If compression is enabled, we will always successfully receive
|
|
205
|
+
// attach ops and compress then send them at the next JS turn, regardless
|
|
206
|
+
// of the overall size of the accumulated ops in the batch.
|
|
207
|
+
// However, it is more efficient to flush these ops faster, preferably
|
|
208
|
+
// after they reach a size which would benefit from compression.
|
|
209
|
+
if (
|
|
210
|
+
this.attachFlowBatch.contentSizeInBytes >=
|
|
211
|
+
this.params.config.compressionOptions.minimumBatchSizeInBytes
|
|
212
|
+
) {
|
|
213
|
+
this.flushInternal(this.attachFlowBatch);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
public submitBlobAttach(message: BatchMessage) {
|
|
218
|
+
this.maybeFlushPartialBatch();
|
|
219
|
+
|
|
220
|
+
this.addMessageToBatchManager(this.blobAttachBatch, message);
|
|
221
|
+
|
|
222
|
+
// If compression is enabled, we will always successfully receive
|
|
223
|
+
// blobAttach ops and compress then send them at the next JS turn, regardless
|
|
224
|
+
// of the overall size of the accumulated ops in the batch.
|
|
225
|
+
// However, it is more efficient to flush these ops faster, preferably
|
|
226
|
+
// after they reach a size which would benefit from compression.
|
|
227
|
+
if (
|
|
228
|
+
this.blobAttachBatch.contentSizeInBytes >=
|
|
229
|
+
this.params.config.compressionOptions.minimumBatchSizeInBytes
|
|
230
|
+
) {
|
|
231
|
+
this.flushInternal(this.blobAttachBatch);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
public submitIdAllocation(message: BatchMessage) {
|
|
236
|
+
this.maybeFlushPartialBatch();
|
|
237
|
+
|
|
238
|
+
if (
|
|
239
|
+
!this.idAllocationBatch.push(
|
|
240
|
+
message,
|
|
241
|
+
this.isContextReentrant(),
|
|
242
|
+
this.params.getCurrentSequenceNumbers().clientSequenceNumber,
|
|
243
|
+
)
|
|
244
|
+
) {
|
|
245
|
+
// BatchManager has two limits - soft limit & hard limit. Soft limit is only engaged
|
|
246
|
+
// when queue is not empty.
|
|
247
|
+
// Flush queue & retry. Failure on retry would mean - single message is bigger than hard limit
|
|
248
|
+
this.flushInternal(this.idAllocationBatch);
|
|
249
|
+
|
|
250
|
+
this.addMessageToBatchManager(this.idAllocationBatch, message);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// If compression is enabled, we will always successfully receive
|
|
254
|
+
// attach ops and compress then send them at the next JS turn, regardless
|
|
255
|
+
// of the overall size of the accumulated ops in the batch.
|
|
256
|
+
// However, it is more efficient to flush these ops faster, preferably
|
|
257
|
+
// after they reach a size which would benefit from compression.
|
|
258
|
+
if (
|
|
259
|
+
this.idAllocationBatch.contentSizeInBytes >=
|
|
260
|
+
this.params.config.compressionOptions.minimumBatchSizeInBytes
|
|
261
|
+
) {
|
|
262
|
+
this.flushInternal(this.idAllocationBatch);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
private addMessageToBatchManager(batchManager: BatchManager, message: BatchMessage) {
|
|
267
|
+
if (
|
|
268
|
+
!batchManager.push(
|
|
269
|
+
message,
|
|
270
|
+
this.isContextReentrant(),
|
|
271
|
+
this.params.getCurrentSequenceNumbers().clientSequenceNumber,
|
|
272
|
+
)
|
|
273
|
+
) {
|
|
274
|
+
throw new GenericError("BatchTooLarge", /* error */ undefined, {
|
|
275
|
+
opSize: message.contents?.length ?? 0,
|
|
276
|
+
batchSize: batchManager.contentSizeInBytes,
|
|
277
|
+
count: batchManager.length,
|
|
278
|
+
limit: batchManager.options.hardLimit,
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
public flush() {
|
|
284
|
+
if (this.isContextReentrant()) {
|
|
285
|
+
const error = new UsageError("Flushing is not supported inside DDS event handlers");
|
|
286
|
+
this.params.closeContainer(error);
|
|
287
|
+
throw error;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
this.flushAll();
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
private flushAll() {
|
|
294
|
+
this.flushInternal(this.idAllocationBatch);
|
|
295
|
+
this.flushInternal(this.attachFlowBatch);
|
|
296
|
+
this.flushInternal(this.blobAttachBatch, true /* disableGroupedBatching */);
|
|
297
|
+
this.flushInternal(this.mainBatch);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
private flushInternal(batchManager: BatchManager, disableGroupedBatching: boolean = false) {
|
|
301
|
+
if (batchManager.empty) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const rawBatch = batchManager.popBatch();
|
|
306
|
+
if (
|
|
307
|
+
rawBatch.hasReentrantOps === true &&
|
|
308
|
+
this.params.groupingManager.shouldGroup(rawBatch)
|
|
309
|
+
) {
|
|
310
|
+
assert(!this.rebasing, 0x6fa /* A rebased batch should never have reentrant ops */);
|
|
311
|
+
// If a batch contains reentrant ops (ops created as a result from processing another op)
|
|
312
|
+
// it needs to be rebased so that we can ensure consistent reference sequence numbers
|
|
313
|
+
// and eventual consistency at the DDS level.
|
|
314
|
+
this.rebase(rawBatch, batchManager);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const processedBatch = this.compressBatch(rawBatch, disableGroupedBatching);
|
|
319
|
+
this.sendBatch(processedBatch);
|
|
320
|
+
|
|
321
|
+
this.persistBatch(rawBatch.content);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Rebases a batch. All the ops in the batch are resubmitted to the runtime and
|
|
326
|
+
* they will end up back in the same batch manager they were flushed from and subsequently flushed.
|
|
327
|
+
*
|
|
328
|
+
* @param rawBatch - the batch to be rebased
|
|
329
|
+
*/
|
|
330
|
+
private rebase(rawBatch: IBatch, batchManager: BatchManager) {
|
|
331
|
+
assert(!this.rebasing, 0x6fb /* Reentrancy */);
|
|
332
|
+
|
|
333
|
+
this.rebasing = true;
|
|
334
|
+
for (const message of rawBatch.content) {
|
|
335
|
+
this.params.reSubmit({
|
|
336
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
337
|
+
content: message.contents!,
|
|
338
|
+
localOpMetadata: message.localOpMetadata,
|
|
339
|
+
opMetadata: message.metadata,
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if (this.batchRebasesToReport > 0) {
|
|
344
|
+
this.mc.logger.sendTelemetryEvent(
|
|
345
|
+
{
|
|
346
|
+
eventName: "BatchRebase",
|
|
347
|
+
length: rawBatch.content.length,
|
|
348
|
+
referenceSequenceNumber: rawBatch.referenceSequenceNumber,
|
|
349
|
+
},
|
|
350
|
+
new UsageError("BatchRebase"),
|
|
351
|
+
);
|
|
352
|
+
this.batchRebasesToReport--;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
this.flushInternal(batchManager);
|
|
356
|
+
this.rebasing = false;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
private isContextReentrant(): boolean {
|
|
360
|
+
return this.params.opReentrancy() && !this.rebasing;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
private compressBatch(batch: IBatch, disableGroupedBatching: boolean): IBatch {
|
|
364
|
+
if (
|
|
365
|
+
batch.content.length === 0 ||
|
|
366
|
+
this.params.config.compressionOptions === undefined ||
|
|
367
|
+
this.params.config.compressionOptions.minimumBatchSizeInBytes >
|
|
368
|
+
batch.contentSizeInBytes ||
|
|
369
|
+
this.params.submitBatchFn === undefined
|
|
370
|
+
) {
|
|
371
|
+
// Nothing to do if the batch is empty or if compression is disabled or not supported, or if we don't need to compress
|
|
372
|
+
return disableGroupedBatching ? batch : this.params.groupingManager.groupBatch(batch);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
const compressedBatch = this.params.compressor.compressBatch(
|
|
376
|
+
disableGroupedBatching ? batch : this.params.groupingManager.groupBatch(batch),
|
|
377
|
+
);
|
|
378
|
+
|
|
379
|
+
if (this.params.splitter.isBatchChunkingEnabled) {
|
|
380
|
+
return compressedBatch.contentSizeInBytes <= this.params.splitter.chunkSizeInBytes
|
|
381
|
+
? compressedBatch
|
|
382
|
+
: this.params.splitter.splitFirstBatchMessage(compressedBatch);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
if (compressedBatch.contentSizeInBytes >= this.params.config.maxBatchSizeInBytes) {
|
|
386
|
+
throw new GenericError("BatchTooLarge", /* error */ undefined, {
|
|
387
|
+
batchSize: batch.contentSizeInBytes,
|
|
388
|
+
compressedBatchSize: compressedBatch.contentSizeInBytes,
|
|
389
|
+
count: compressedBatch.content.length,
|
|
390
|
+
limit: this.params.config.maxBatchSizeInBytes,
|
|
391
|
+
chunkingEnabled: this.params.splitter.isBatchChunkingEnabled,
|
|
392
|
+
compressionOptions: JSON.stringify(this.params.config.compressionOptions),
|
|
393
|
+
socketSize: estimateSocketSize(batch),
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
return compressedBatch;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* Sends the batch object to the container context to be sent over the wire.
|
|
402
|
+
*
|
|
403
|
+
* @param batch - batch to be sent
|
|
404
|
+
*/
|
|
405
|
+
private sendBatch(batch: IBatch) {
|
|
406
|
+
const length = batch.content.length;
|
|
407
|
+
|
|
408
|
+
// Did we disconnect in the middle of turn-based batch?
|
|
409
|
+
// If so, do nothing, as pending state manager will resubmit it correctly on reconnect.
|
|
410
|
+
if (length === 0 || !this.params.shouldSend()) {
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
const socketSize = estimateSocketSize(batch);
|
|
415
|
+
if (socketSize >= this.params.config.maxBatchSizeInBytes) {
|
|
416
|
+
this.mc.logger.sendPerformanceEvent({
|
|
417
|
+
eventName: "LargeBatch",
|
|
418
|
+
length: batch.content.length,
|
|
419
|
+
sizeInBytes: batch.contentSizeInBytes,
|
|
420
|
+
socketSize,
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
if (this.params.submitBatchFn === undefined) {
|
|
425
|
+
// Legacy path - supporting old loader versions. Can be removed only when LTS moves above
|
|
426
|
+
// version that has support for batches (submitBatchFn)
|
|
427
|
+
assert(
|
|
428
|
+
batch.content[0].compression === undefined,
|
|
429
|
+
0x5a6 /* Compression should not have happened if the loader does not support it */,
|
|
430
|
+
);
|
|
431
|
+
|
|
432
|
+
this.params.legacySendBatchFn(batch);
|
|
433
|
+
} else {
|
|
434
|
+
assert(
|
|
435
|
+
batch.referenceSequenceNumber !== undefined,
|
|
436
|
+
0x58e /* Batch must not be empty */,
|
|
437
|
+
);
|
|
438
|
+
this.params.submitBatchFn(
|
|
439
|
+
batch.content.map((message) => ({
|
|
440
|
+
contents: message.contents,
|
|
441
|
+
metadata: message.metadata,
|
|
442
|
+
compression: message.compression,
|
|
443
|
+
referenceSequenceNumber: message.referenceSequenceNumber,
|
|
444
|
+
})),
|
|
445
|
+
batch.referenceSequenceNumber,
|
|
446
|
+
);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
private persistBatch(batch: BatchMessage[]) {
|
|
451
|
+
// Let the PendingStateManager know that a message was submitted.
|
|
452
|
+
// In future, need to shift toward keeping batch as a whole!
|
|
453
|
+
for (const message of batch) {
|
|
454
|
+
this.params.pendingStateManager.onSubmitMessage(
|
|
455
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
456
|
+
message.contents!,
|
|
457
|
+
message.referenceSequenceNumber,
|
|
458
|
+
message.localOpMetadata,
|
|
459
|
+
message.metadata,
|
|
460
|
+
);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
public checkpoint() {
|
|
465
|
+
return {
|
|
466
|
+
mainBatch: this.mainBatch.checkpoint(),
|
|
467
|
+
attachFlowBatch: this.attachFlowBatch.checkpoint(),
|
|
468
|
+
blobAttachBatch: this.blobAttachBatch.checkpoint(),
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { ISequencedDocumentMessage, MessageType } from "@fluidframework/protocol-definitions";
|
|
7
|
+
import {
|
|
8
|
+
ContainerMessageType,
|
|
9
|
+
type InboundContainerRuntimeMessage,
|
|
10
|
+
type InboundSequencedContainerRuntimeMessage,
|
|
11
|
+
type InboundSequencedContainerRuntimeMessageOrSystemMessage,
|
|
12
|
+
type InboundSequencedRecentlyAddedContainerRuntimeMessage,
|
|
13
|
+
} from "../messageTypes";
|
|
14
|
+
import { OpDecompressor } from "./opDecompressor";
|
|
15
|
+
import { OpGroupingManager } from "./opGroupingManager";
|
|
16
|
+
import { OpSplitter } from "./opSplitter";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Stateful class for processing incoming remote messages as the virtualization measures are unwrapped,
|
|
20
|
+
* potentially across numerous inbound ops.
|
|
21
|
+
*
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export class RemoteMessageProcessor {
|
|
25
|
+
constructor(
|
|
26
|
+
private readonly opSplitter: OpSplitter,
|
|
27
|
+
private readonly opDecompressor: OpDecompressor,
|
|
28
|
+
private readonly opGroupingManager: OpGroupingManager,
|
|
29
|
+
) {}
|
|
30
|
+
|
|
31
|
+
public get partialMessages(): ReadonlyMap<string, string[]> {
|
|
32
|
+
return this.opSplitter.chunks;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public clearPartialMessagesFor(clientId: string) {
|
|
36
|
+
this.opSplitter.clearPartialChunks(clientId);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Ungroups and Unchunks the runtime ops encapsulated by the single remoteMessage received over the wire
|
|
41
|
+
* @param remoteMessageCopy - A shallow copy of a message from another client, possibly virtualized
|
|
42
|
+
* (grouped, compressed, and/or chunked).
|
|
43
|
+
* Being a shallow copy, it's considered mutable, meaning no other Container or other parallel procedure
|
|
44
|
+
* depends on this object instance.
|
|
45
|
+
* Note remoteMessageCopy.contents (and other object props) MUST not be modified,
|
|
46
|
+
* but may be overwritten (as is the case with contents).
|
|
47
|
+
* @returns the unchunked, decompressed, ungrouped, unpacked SequencedContainerRuntimeMessages encapsulated in the remote message.
|
|
48
|
+
* For ops that weren't virtualized (e.g. System ops that the ContainerRuntime will ultimately ignore),
|
|
49
|
+
* a singleton array [remoteMessageCopy] is returned
|
|
50
|
+
*/
|
|
51
|
+
public process(
|
|
52
|
+
remoteMessageCopy: ISequencedDocumentMessage,
|
|
53
|
+
): InboundSequencedContainerRuntimeMessageOrSystemMessage[] {
|
|
54
|
+
const result: InboundSequencedContainerRuntimeMessageOrSystemMessage[] = [];
|
|
55
|
+
|
|
56
|
+
ensureContentsDeserialized(remoteMessageCopy);
|
|
57
|
+
|
|
58
|
+
// Ungroup before and after decompression for back-compat (cleanup tracked by AB#4371)
|
|
59
|
+
for (const ungroupedMessage of this.opGroupingManager.ungroupOp(remoteMessageCopy)) {
|
|
60
|
+
const message = this.opDecompressor.processMessage(ungroupedMessage).message;
|
|
61
|
+
|
|
62
|
+
for (let ungroupedMessage2 of this.opGroupingManager.ungroupOp(message)) {
|
|
63
|
+
// unpack and unchunk the ungrouped message in place
|
|
64
|
+
unpackRuntimeMessage(ungroupedMessage2);
|
|
65
|
+
const chunkProcessingResult =
|
|
66
|
+
this.opSplitter.processRemoteMessage(ungroupedMessage2);
|
|
67
|
+
ungroupedMessage2 = chunkProcessingResult.message;
|
|
68
|
+
|
|
69
|
+
if (chunkProcessingResult.state !== "Processed") {
|
|
70
|
+
// If the message is not chunked or if the splitter is still rebuilding the original message,
|
|
71
|
+
// there is no need to continue processing
|
|
72
|
+
result.push(
|
|
73
|
+
ungroupedMessage2 as InboundSequencedContainerRuntimeMessageOrSystemMessage,
|
|
74
|
+
);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Ungroup before and after decompression for back-compat (cleanup tracked by AB#4371)
|
|
79
|
+
for (const ungroupedMessageAfterChunking of this.opGroupingManager.ungroupOp(
|
|
80
|
+
ungroupedMessage2,
|
|
81
|
+
)) {
|
|
82
|
+
const decompressionAfterChunking = this.opDecompressor.processMessage(
|
|
83
|
+
ungroupedMessageAfterChunking,
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
for (const ungroupedMessageAfterChunking2 of this.opGroupingManager.ungroupOp(
|
|
87
|
+
decompressionAfterChunking.message,
|
|
88
|
+
)) {
|
|
89
|
+
if (decompressionAfterChunking.state === "Skipped") {
|
|
90
|
+
// After chunking, if the original message was not compressed,
|
|
91
|
+
// there is no need to continue processing
|
|
92
|
+
result.push(
|
|
93
|
+
ungroupedMessageAfterChunking2 as InboundSequencedContainerRuntimeMessageOrSystemMessage,
|
|
94
|
+
);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// The message needs to be unpacked after chunking + decompression
|
|
99
|
+
unpack(ungroupedMessageAfterChunking2);
|
|
100
|
+
result.push(ungroupedMessageAfterChunking2);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Takes an incoming message and if the contents is a string, JSON.parse's it in place */
|
|
111
|
+
function ensureContentsDeserialized(mutableMessage: ISequencedDocumentMessage): void {
|
|
112
|
+
// back-compat: ADO #1385: eventually should become unconditional, but only for runtime messages!
|
|
113
|
+
// System message may have no contents, or in some cases (mostly for back-compat) they may have actual objects.
|
|
114
|
+
// Old ops may contain empty string (I assume noops).
|
|
115
|
+
if (typeof mutableMessage.contents === "string" && mutableMessage.contents !== "") {
|
|
116
|
+
mutableMessage.contents = JSON.parse(mutableMessage.contents);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* For a given message, it moves the nested InboundContainerRuntimeMessage props one level up.
|
|
122
|
+
*
|
|
123
|
+
* The return type illustrates the assumption that the message param
|
|
124
|
+
* becomes a InboundSequencedContainerRuntimeMessage by the time the function returns
|
|
125
|
+
* (but there is no runtime validation of the 'type' or 'compatDetails' values).
|
|
126
|
+
*/
|
|
127
|
+
function unpack(
|
|
128
|
+
message: ISequencedDocumentMessage,
|
|
129
|
+
): asserts message is InboundSequencedContainerRuntimeMessage {
|
|
130
|
+
// We assume the contents is an InboundContainerRuntimeMessage (the message is "packed")
|
|
131
|
+
const contents = message.contents as InboundContainerRuntimeMessage;
|
|
132
|
+
|
|
133
|
+
// We're going to unpack message in-place (promoting those properties of contents up to message itself)
|
|
134
|
+
const messageUnpacked = message as InboundSequencedContainerRuntimeMessage;
|
|
135
|
+
|
|
136
|
+
messageUnpacked.type = contents.type;
|
|
137
|
+
messageUnpacked.contents = contents.contents;
|
|
138
|
+
if ("compatDetails" in contents) {
|
|
139
|
+
(messageUnpacked as InboundSequencedRecentlyAddedContainerRuntimeMessage).compatDetails =
|
|
140
|
+
contents.compatDetails;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Unpacks runtime messages.
|
|
146
|
+
*
|
|
147
|
+
* @remarks This API makes no promises regarding backward-compatibility. This is internal API.
|
|
148
|
+
* @param message - message (as it observed in storage / service)
|
|
149
|
+
* @returns whether the given message was unpacked
|
|
150
|
+
*
|
|
151
|
+
* @internal
|
|
152
|
+
*/
|
|
153
|
+
export function unpackRuntimeMessage(message: ISequencedDocumentMessage): boolean {
|
|
154
|
+
if (message.type !== MessageType.Operation) {
|
|
155
|
+
// Legacy format, but it's already "unpacked",
|
|
156
|
+
// i.e. message.type is actually ContainerMessageType.
|
|
157
|
+
// Or it's non-runtime message.
|
|
158
|
+
// Nothing to do in such case.
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// legacy op format?
|
|
163
|
+
// 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.
|
|
164
|
+
if (
|
|
165
|
+
(message.contents as { address?: unknown }).address !== undefined &&
|
|
166
|
+
(message.contents as { type?: unknown }).type === undefined
|
|
167
|
+
) {
|
|
168
|
+
message.type = ContainerMessageType.FluidDataStoreOp;
|
|
169
|
+
} else {
|
|
170
|
+
// new format
|
|
171
|
+
unpack(message);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
ISequencedDocumentMessage,
|
|
8
|
+
ISequencedDocumentSystemMessage,
|
|
9
|
+
} from "@fluidframework/protocol-definitions";
|
|
10
|
+
|
|
11
|
+
export const opSize = (op: ISequencedDocumentMessage): number => {
|
|
12
|
+
// Some messages may already have string contents,
|
|
13
|
+
// so stringifying them again will add inaccurate overhead.
|
|
14
|
+
const content =
|
|
15
|
+
typeof op.contents === "string" ? op.contents : JSON.stringify(op.contents) ?? "";
|
|
16
|
+
const data = opHasData(op) ? op.data : "";
|
|
17
|
+
return content.length + data.length;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const opHasData = (op: ISequencedDocumentMessage): op is ISequencedDocumentSystemMessage =>
|
|
21
|
+
(op as ISequencedDocumentSystemMessage).data !== undefined;
|
package/src/packageVersion.ts
CHANGED