@fluidframework/container-runtime 1.4.0-115997 → 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 -6
- 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 -257
- 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 -34
- 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 -6
- 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 -36
- 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 +174 -73
- package/prettier.config.cjs +8 -0
- package/src/batchTracker.ts +60 -55
- 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 -616
- 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
|
@@ -2,70 +2,31 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { BlobTreeEntry } from "@fluidframework/
|
|
9
|
-
import { channelsTreeName,
|
|
5
|
+
import { AttachState, } from "@fluidframework/container-definitions";
|
|
6
|
+
import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
7
|
+
import { assert, Deferred, LazyPromise } from "@fluidframework/core-utils";
|
|
8
|
+
import { BlobTreeEntry, readAndParse } from "@fluidframework/driver-utils";
|
|
9
|
+
import { channelsTreeName, VisibilityState, } from "@fluidframework/runtime-definitions";
|
|
10
10
|
import { addBlobToSummary, convertSummaryTreeToITree } from "@fluidframework/runtime-utils";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
function createAttributes(pkg, isRootDataStore
|
|
11
|
+
import { createChildMonitoringContext, DataCorruptionError, DataProcessingError, extractSafePropertiesFromMessage, generateStack, LoggingError, tagCodeArtifacts, ThresholdCounter, } from "@fluidframework/telemetry-utils";
|
|
12
|
+
import { dataStoreAttributesBlobName, hasIsolatedChannels, wrapSummaryInChannelsTree, getAttributesFormatVersion, getFluidDataStoreAttributes, summarizerClientType, } from "./summary/index.mjs";
|
|
13
|
+
import { sendGCUnexpectedUsageEvent } from "./gc/index.mjs";
|
|
14
|
+
function createAttributes(pkg, isRootDataStore) {
|
|
15
15
|
const stringifiedPkg = JSON.stringify(pkg);
|
|
16
|
-
return
|
|
17
|
-
pkg: stringifiedPkg,
|
|
18
|
-
snapshotFormatVersion: "0.1",
|
|
19
|
-
isRootDataStore,
|
|
20
|
-
} : {
|
|
16
|
+
return {
|
|
21
17
|
pkg: stringifiedPkg,
|
|
22
18
|
summaryFormatVersion: 2,
|
|
23
19
|
isRootDataStore,
|
|
24
20
|
};
|
|
25
21
|
}
|
|
26
|
-
export function createAttributesBlob(pkg, isRootDataStore
|
|
27
|
-
const attributes = createAttributes(pkg, isRootDataStore
|
|
22
|
+
export function createAttributesBlob(pkg, isRootDataStore) {
|
|
23
|
+
const attributes = createAttributes(pkg, isRootDataStore);
|
|
28
24
|
return new BlobTreeEntry(dataStoreAttributesBlobName, JSON.stringify(attributes));
|
|
29
25
|
}
|
|
30
26
|
/**
|
|
31
27
|
* Represents the context for the store. This context is passed to the store runtime.
|
|
32
28
|
*/
|
|
33
29
|
export class FluidDataStoreContext extends TypedEventEmitter {
|
|
34
|
-
constructor(props, existing, bindState, isLocalDataStore, makeLocallyVisibleFn) {
|
|
35
|
-
super();
|
|
36
|
-
this.existing = existing;
|
|
37
|
-
this.bindState = bindState;
|
|
38
|
-
this.isLocalDataStore = isLocalDataStore;
|
|
39
|
-
this.makeLocallyVisibleFn = makeLocallyVisibleFn;
|
|
40
|
-
this._disposed = false;
|
|
41
|
-
this.detachedRuntimeCreation = false;
|
|
42
|
-
this.loaded = false;
|
|
43
|
-
this.pending = [];
|
|
44
|
-
this._isInMemoryRoot = false;
|
|
45
|
-
this._containerRuntime = props.runtime;
|
|
46
|
-
this.id = props.id;
|
|
47
|
-
this.storage = props.storage;
|
|
48
|
-
this.scope = props.scope;
|
|
49
|
-
this.writeGCDataAtRoot = props.writeGCDataAtRoot;
|
|
50
|
-
this.disableIsolatedChannels = props.disableIsolatedChannels;
|
|
51
|
-
this.pkg = props.pkg;
|
|
52
|
-
// URIs use slashes as delimiters. Handles use URIs.
|
|
53
|
-
// Thus having slashes in types almost guarantees trouble down the road!
|
|
54
|
-
assert(!this.id.includes("/"), 0x13a /* Data store ID contains slash */);
|
|
55
|
-
this._attachState = this.containerRuntime.attachState !== AttachState.Detached && this.existing ?
|
|
56
|
-
this.containerRuntime.attachState : AttachState.Detached;
|
|
57
|
-
this.bindToContext = () => {
|
|
58
|
-
assert(this.bindState === BindState.NotBound, 0x13b /* "datastore context is already in bound state" */);
|
|
59
|
-
this.bindState = BindState.Binding;
|
|
60
|
-
assert(this.channel !== undefined, 0x13c /* "undefined channel on datastore context" */);
|
|
61
|
-
this.makeLocallyVisible();
|
|
62
|
-
this.bindState = BindState.Bound;
|
|
63
|
-
};
|
|
64
|
-
const thisSummarizeInternal = async (fullTree, trackState, telemetryContext) => this.summarizeInternal(fullTree, trackState, telemetryContext);
|
|
65
|
-
this.summarizerNode = props.createSummarizerNodeFn(thisSummarizeInternal, async (fullGC) => this.getGCDataInternal(fullGC), async () => this.getBaseGCDetails());
|
|
66
|
-
this.subLogger = ChildLogger.create(this.logger, "FluidDataStoreContext");
|
|
67
|
-
this.thresholdOpsCounter = new ThresholdCounter(FluidDataStoreContext.pendingOpsCountThreshold, this.subLogger);
|
|
68
|
-
}
|
|
69
30
|
get packagePath() {
|
|
70
31
|
assert(this.pkg !== undefined, 0x139 /* "Undefined package path" */);
|
|
71
32
|
return this.pkg;
|
|
@@ -94,13 +55,24 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
94
55
|
get containerRuntime() {
|
|
95
56
|
return this._containerRuntime;
|
|
96
57
|
}
|
|
58
|
+
ensureNoDataModelChanges(callback) {
|
|
59
|
+
return this._containerRuntime.ensureNoDataModelChanges(callback);
|
|
60
|
+
}
|
|
97
61
|
get isLoaded() {
|
|
98
62
|
return this.loaded;
|
|
99
63
|
}
|
|
100
64
|
get baseSnapshot() {
|
|
101
65
|
return this._baseSnapshot;
|
|
102
66
|
}
|
|
103
|
-
get
|
|
67
|
+
get idCompressor() {
|
|
68
|
+
return this._containerRuntime.idCompressor;
|
|
69
|
+
}
|
|
70
|
+
get disposed() {
|
|
71
|
+
return this._disposed;
|
|
72
|
+
}
|
|
73
|
+
get tombstoned() {
|
|
74
|
+
return this._tombstoned;
|
|
75
|
+
}
|
|
104
76
|
get attachState() {
|
|
105
77
|
return this._attachState;
|
|
106
78
|
}
|
|
@@ -126,6 +98,55 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
126
98
|
isInMemoryRoot() {
|
|
127
99
|
return this._isInMemoryRoot;
|
|
128
100
|
}
|
|
101
|
+
constructor(props, existing, isLocalDataStore, makeLocallyVisibleFn) {
|
|
102
|
+
super();
|
|
103
|
+
this.existing = existing;
|
|
104
|
+
this.isLocalDataStore = isLocalDataStore;
|
|
105
|
+
this.makeLocallyVisibleFn = makeLocallyVisibleFn;
|
|
106
|
+
this._disposed = false;
|
|
107
|
+
/**
|
|
108
|
+
* Tombstone is a temporary feature that prevents a data store from sending / receiving ops, signals and from
|
|
109
|
+
* loading.
|
|
110
|
+
*/
|
|
111
|
+
this._tombstoned = false;
|
|
112
|
+
/** If true, this means that this data store context and its children have been removed from the runtime */
|
|
113
|
+
this.deleted = false;
|
|
114
|
+
this.detachedRuntimeCreation = false;
|
|
115
|
+
this.loaded = false;
|
|
116
|
+
this.pending = [];
|
|
117
|
+
this._isInMemoryRoot = false;
|
|
118
|
+
this._containerRuntime = props.runtime;
|
|
119
|
+
this.id = props.id;
|
|
120
|
+
this.storage = props.storage;
|
|
121
|
+
this.scope = props.scope;
|
|
122
|
+
this.pkg = props.pkg;
|
|
123
|
+
// URIs use slashes as delimiters. Handles use URIs.
|
|
124
|
+
// Thus having slashes in types almost guarantees trouble down the road!
|
|
125
|
+
assert(!this.id.includes("/"), 0x13a /* Data store ID contains slash */);
|
|
126
|
+
this._attachState =
|
|
127
|
+
this.containerRuntime.attachState !== AttachState.Detached && this.existing
|
|
128
|
+
? this.containerRuntime.attachState
|
|
129
|
+
: AttachState.Detached;
|
|
130
|
+
const thisSummarizeInternal = async (fullTree, trackState, telemetryContext) => this.summarizeInternal(fullTree, trackState, telemetryContext);
|
|
131
|
+
this.summarizerNode = props.createSummarizerNodeFn(thisSummarizeInternal, async (fullGC) => this.getGCDataInternal(fullGC));
|
|
132
|
+
this.mc = createChildMonitoringContext({
|
|
133
|
+
logger: this.logger,
|
|
134
|
+
namespace: "FluidDataStoreContext",
|
|
135
|
+
properties: {
|
|
136
|
+
all: tagCodeArtifacts({
|
|
137
|
+
fluidDataStoreId: this.id,
|
|
138
|
+
// The package name is a getter because `this.pkg` may not be initialized during construction.
|
|
139
|
+
// For data stores loaded from summary, it is initialized during data store realization.
|
|
140
|
+
fullPackageName: () => this.pkg?.join("/"),
|
|
141
|
+
}),
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
this.thresholdOpsCounter = new ThresholdCounter(FluidDataStoreContext.pendingOpsCountThreshold, this.mc.logger);
|
|
145
|
+
this.throwOnTombstoneUsage = this._containerRuntime.gcThrowOnTombstoneUsage;
|
|
146
|
+
// By default, a data store can log maximum 10 local changes telemetry in summarizer.
|
|
147
|
+
this.localChangesTelemetryCount =
|
|
148
|
+
this.mc.config.getNumber("Fluid.Telemetry.LocalChangesTelemetryCount") ?? 10;
|
|
149
|
+
}
|
|
129
150
|
dispose() {
|
|
130
151
|
if (this._disposed) {
|
|
131
152
|
return;
|
|
@@ -134,24 +155,45 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
134
155
|
// Dispose any pending runtime after it gets fulfilled
|
|
135
156
|
// Errors are logged where this.channelDeferred is consumed/generated (realizeCore(), bindRuntime())
|
|
136
157
|
if (this.channelDeferred) {
|
|
137
|
-
this.channelDeferred.promise
|
|
158
|
+
this.channelDeferred.promise
|
|
159
|
+
.then((runtime) => {
|
|
138
160
|
runtime.dispose();
|
|
139
|
-
})
|
|
161
|
+
})
|
|
162
|
+
.catch((error) => { });
|
|
140
163
|
}
|
|
141
164
|
}
|
|
142
|
-
|
|
143
|
-
|
|
165
|
+
/**
|
|
166
|
+
* When delete is called, that means that the data store is permanently removed from the runtime, and will not show up in future summaries
|
|
167
|
+
* This function is called to prevent ops from being generated from this data store once it has been deleted. Furthermore, this data store
|
|
168
|
+
* should not receive any ops/signals.
|
|
169
|
+
*/
|
|
170
|
+
delete() {
|
|
171
|
+
this.deleted = true;
|
|
172
|
+
}
|
|
173
|
+
setTombstone(tombstone) {
|
|
174
|
+
if (this.tombstoned === tombstone) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
this._tombstoned = tombstone;
|
|
178
|
+
}
|
|
179
|
+
rejectDeferredRealize(reason, failedPkgPath, fullPackageName) {
|
|
180
|
+
throw new LoggingError(reason, tagCodeArtifacts({
|
|
181
|
+
failedPkgPath,
|
|
182
|
+
packagePath: fullPackageName?.join("/"),
|
|
183
|
+
}));
|
|
144
184
|
}
|
|
145
185
|
async realize() {
|
|
146
186
|
assert(!this.detachedRuntimeCreation, 0x13d /* "Detached runtime creation on realize()" */);
|
|
147
187
|
if (!this.channelDeferred) {
|
|
148
188
|
this.channelDeferred = new Deferred();
|
|
149
189
|
this.realizeCore(this.existing).catch((error) => {
|
|
150
|
-
var _a;
|
|
151
190
|
const errorWrapped = DataProcessingError.wrapIfUnrecognized(error, "realizeFluidDataStoreContext");
|
|
152
|
-
errorWrapped.addTelemetryProperties({
|
|
153
|
-
|
|
154
|
-
|
|
191
|
+
errorWrapped.addTelemetryProperties(tagCodeArtifacts({
|
|
192
|
+
fullPackageName: this.pkg?.join("/"),
|
|
193
|
+
fluidDataStoreId: this.id,
|
|
194
|
+
}));
|
|
195
|
+
this.channelDeferred?.reject(errorWrapped);
|
|
196
|
+
this.mc.logger.sendErrorEvent({ eventName: "RealizeError" }, errorWrapped);
|
|
155
197
|
});
|
|
156
198
|
}
|
|
157
199
|
return this.channelDeferred.promise;
|
|
@@ -166,18 +208,18 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
166
208
|
let lastPkg;
|
|
167
209
|
for (const pkg of packages) {
|
|
168
210
|
if (!registry) {
|
|
169
|
-
this.rejectDeferredRealize("No registry for package", lastPkg);
|
|
211
|
+
this.rejectDeferredRealize("No registry for package", lastPkg, packages);
|
|
170
212
|
}
|
|
171
213
|
lastPkg = pkg;
|
|
172
214
|
entry = await registry.get(pkg);
|
|
173
215
|
if (!entry) {
|
|
174
|
-
this.rejectDeferredRealize("Registry does not contain entry for the package", pkg);
|
|
216
|
+
this.rejectDeferredRealize("Registry does not contain entry for the package", pkg, packages);
|
|
175
217
|
}
|
|
176
218
|
registry = entry.IFluidDataStoreRegistry;
|
|
177
219
|
}
|
|
178
|
-
const factory = entry
|
|
220
|
+
const factory = entry?.IFluidDataStoreFactory;
|
|
179
221
|
if (factory === undefined) {
|
|
180
|
-
this.rejectDeferredRealize("Can't find factory for package", lastPkg);
|
|
222
|
+
this.rejectDeferredRealize("Can't find factory for package", lastPkg, packages);
|
|
181
223
|
}
|
|
182
224
|
return { factory, registry };
|
|
183
225
|
}
|
|
@@ -194,15 +236,21 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
194
236
|
const channel = await factory.instantiateDataStore(this, existing);
|
|
195
237
|
assert(channel !== undefined, 0x140 /* "undefined channel on datastore context" */);
|
|
196
238
|
this.bindRuntime(channel);
|
|
239
|
+
// This data store may have been disposed before the channel is created during realization. If so,
|
|
240
|
+
// dispose the channel now.
|
|
241
|
+
if (this.disposed) {
|
|
242
|
+
channel.dispose();
|
|
243
|
+
}
|
|
197
244
|
}
|
|
198
245
|
/**
|
|
199
246
|
* Notifies this object about changes in the connection state.
|
|
200
247
|
* @param value - New connection state.
|
|
201
|
-
* @param clientId - ID of the client.
|
|
202
|
-
*
|
|
248
|
+
* @param clientId - ID of the client. Its old ID when in disconnected state and
|
|
249
|
+
* its new client ID when we are connecting or connected.
|
|
203
250
|
*/
|
|
204
251
|
setConnectionState(connected, clientId) {
|
|
205
|
-
this
|
|
252
|
+
// ConnectionState should not fail in tombstone mode as this is internally run
|
|
253
|
+
this.verifyNotClosed("setConnectionState", false /* checkTombstone */);
|
|
206
254
|
// Connection events are ignored if the store is not yet loaded
|
|
207
255
|
if (!this.loaded) {
|
|
208
256
|
return;
|
|
@@ -212,13 +260,22 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
212
260
|
this.channel.setConnectionState(connected, clientId);
|
|
213
261
|
}
|
|
214
262
|
process(messageArg, local, localOpMetadata) {
|
|
215
|
-
|
|
216
|
-
|
|
263
|
+
const safeTelemetryProps = extractSafePropertiesFromMessage(messageArg);
|
|
264
|
+
// On op process, tombstone error is logged in garbage collector. So, set "checkTombstone" to false when calling
|
|
265
|
+
// "verifyNotClosed" which logs tombstone errors. Throw error if tombstoned and throwing on load is configured.
|
|
266
|
+
this.verifyNotClosed("process", false /* checkTombstone */, safeTelemetryProps);
|
|
267
|
+
if (this.tombstoned && this.throwOnTombstoneUsage) {
|
|
268
|
+
throw new DataCorruptionError("Context is tombstoned! Call site [process]", safeTelemetryProps);
|
|
269
|
+
}
|
|
217
270
|
const innerContents = messageArg.contents;
|
|
218
|
-
const message =
|
|
271
|
+
const message = {
|
|
272
|
+
...messageArg,
|
|
273
|
+
type: innerContents.type,
|
|
274
|
+
contents: innerContents.content,
|
|
275
|
+
};
|
|
219
276
|
this.summarizerNode.recordChange(message);
|
|
220
277
|
if (this.loaded) {
|
|
221
|
-
return
|
|
278
|
+
return this.channel?.process(message, local, localOpMetadata);
|
|
222
279
|
}
|
|
223
280
|
else {
|
|
224
281
|
assert(!local, 0x142 /* "local store channel is not loaded" */);
|
|
@@ -228,13 +285,12 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
228
285
|
}
|
|
229
286
|
}
|
|
230
287
|
processSignal(message, local) {
|
|
231
|
-
|
|
232
|
-
this.verifyNotClosed();
|
|
288
|
+
this.verifyNotClosed("processSignal");
|
|
233
289
|
// Signals are ignored if the store is not yet loaded
|
|
234
290
|
if (!this.loaded) {
|
|
235
291
|
return;
|
|
236
292
|
}
|
|
237
|
-
|
|
293
|
+
this.channel?.processSignal(message, local);
|
|
238
294
|
}
|
|
239
295
|
getQuorum() {
|
|
240
296
|
return this._containerRuntime.getQuorum();
|
|
@@ -255,28 +311,25 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
255
311
|
await this.realize();
|
|
256
312
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
257
313
|
const summarizeResult = await this.channel.summarize(fullTree, trackState, telemetryContext);
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
wrapSummaryInChannelsTree(summarizeResult);
|
|
262
|
-
pathPartsForChildren = [channelsTreeName];
|
|
263
|
-
}
|
|
314
|
+
// Wrap dds summaries in .channels subtree.
|
|
315
|
+
wrapSummaryInChannelsTree(summarizeResult);
|
|
316
|
+
const pathPartsForChildren = [channelsTreeName];
|
|
264
317
|
// Add data store's attributes to the summary.
|
|
265
318
|
const { pkg } = await this.getInitialSnapshotDetails();
|
|
266
319
|
const isRoot = await this.isRoot();
|
|
267
|
-
const attributes = createAttributes(pkg, isRoot
|
|
320
|
+
const attributes = createAttributes(pkg, isRoot);
|
|
268
321
|
addBlobToSummary(summarizeResult, dataStoreAttributesBlobName, JSON.stringify(attributes));
|
|
269
|
-
// Add GC data to the summary if it's not written at the root.
|
|
270
|
-
if (!this.writeGCDataAtRoot) {
|
|
271
|
-
addBlobToSummary(summarizeResult, gcBlobKey, JSON.stringify(this.summarizerNode.getGCSummaryDetails()));
|
|
272
|
-
}
|
|
273
322
|
// If we are not referenced, mark the summary tree as unreferenced. Also, update unreferenced blob
|
|
274
323
|
// size in the summary stats with the blobs size of this data store.
|
|
275
324
|
if (!this.summarizerNode.isReferenced()) {
|
|
276
325
|
summarizeResult.summary.unreferenced = true;
|
|
277
326
|
summarizeResult.stats.unreferencedBlobSize = summarizeResult.stats.totalBlobSize;
|
|
278
327
|
}
|
|
279
|
-
return
|
|
328
|
+
return {
|
|
329
|
+
...summarizeResult,
|
|
330
|
+
id: this.id,
|
|
331
|
+
pathPartsForChildren,
|
|
332
|
+
};
|
|
280
333
|
}
|
|
281
334
|
/**
|
|
282
335
|
* Returns the data used for garbage collection. This includes a list of GC nodes that represent this data store
|
|
@@ -301,27 +354,29 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
301
354
|
}
|
|
302
355
|
/**
|
|
303
356
|
* After GC has run, called to notify the data store of routes used in it. These are used for the following:
|
|
357
|
+
*
|
|
304
358
|
* 1. To identify if this data store is being referenced in the document or not.
|
|
359
|
+
*
|
|
305
360
|
* 2. To determine if it needs to re-summarize in case used routes changed since last summary.
|
|
361
|
+
*
|
|
306
362
|
* 3. These are added to the summary generated by the data store.
|
|
307
|
-
*
|
|
308
|
-
*
|
|
363
|
+
*
|
|
364
|
+
* 4. To notify child contexts of their used routes. This is done immediately if the data store is loaded.
|
|
365
|
+
* Else, it is done when realizing the data store.
|
|
366
|
+
*
|
|
309
367
|
* 5. To update the timestamp when this data store or any children are marked as unreferenced.
|
|
368
|
+
*
|
|
310
369
|
* @param usedRoutes - The routes that are used in this data store.
|
|
311
|
-
* @param gcTimestamp - The time when GC was run that generated these used routes. If any node becomes unreferenced
|
|
312
|
-
* as part of this GC run, this should be used to update the time when it happens.
|
|
313
370
|
*/
|
|
314
|
-
updateUsedRoutes(usedRoutes
|
|
371
|
+
updateUsedRoutes(usedRoutes) {
|
|
315
372
|
// Update the used routes in this data store's summarizer node.
|
|
316
|
-
this.summarizerNode.updateUsedRoutes(usedRoutes
|
|
373
|
+
this.summarizerNode.updateUsedRoutes(usedRoutes);
|
|
317
374
|
/**
|
|
318
|
-
*
|
|
319
|
-
*
|
|
320
|
-
*
|
|
321
|
-
* child's reference state changes, the gcTimestamp has to be used to update its unreferencedTimestamp. Since
|
|
322
|
-
* it will result in a change in this data store's used routes, it will be realized to regenerate its summary.
|
|
375
|
+
* Store the used routes to update the channel if the data store is not loaded yet. If the used routes changed
|
|
376
|
+
* since the previous run, the data store will be loaded during summarize since the used state changed. So, it's
|
|
377
|
+
* safe to only store the last used routes.
|
|
323
378
|
*/
|
|
324
|
-
this.
|
|
379
|
+
this.lastUsedRoutes = usedRoutes;
|
|
325
380
|
// If we are loaded, call the channel so it can update the used routes of the child contexts.
|
|
326
381
|
// If we are not loaded, we will update this when we are realized.
|
|
327
382
|
if (this.loaded) {
|
|
@@ -346,13 +401,15 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
346
401
|
updateChannelUsedRoutes() {
|
|
347
402
|
assert(this.loaded, 0x144 /* "Channel should be loaded when updating used routes" */);
|
|
348
403
|
assert(this.channel !== undefined, 0x145 /* "Channel should be present when data store is loaded" */);
|
|
349
|
-
// If there is no
|
|
350
|
-
if (this.
|
|
404
|
+
// If there is no lastUsedRoutes, GC has not run up until this point.
|
|
405
|
+
if (this.lastUsedRoutes === undefined) {
|
|
351
406
|
return;
|
|
352
407
|
}
|
|
353
408
|
// Remove the route to this data store, if it exists.
|
|
354
|
-
const usedChannelRoutes = this.
|
|
355
|
-
|
|
409
|
+
const usedChannelRoutes = this.lastUsedRoutes.filter((id) => {
|
|
410
|
+
return id !== "/" && id !== "";
|
|
411
|
+
});
|
|
412
|
+
this.channel.updateUsedRoutes(usedChannelRoutes);
|
|
356
413
|
}
|
|
357
414
|
/**
|
|
358
415
|
* @deprecated 0.18.Should call request on the runtime directly
|
|
@@ -362,12 +419,14 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
362
419
|
return runtime.request(request);
|
|
363
420
|
}
|
|
364
421
|
submitMessage(type, content, localOpMetadata) {
|
|
365
|
-
this.verifyNotClosed();
|
|
422
|
+
this.verifyNotClosed("submitMessage");
|
|
366
423
|
assert(!!this.channel, 0x146 /* "Channel must exist when submitting message" */);
|
|
367
424
|
const fluidDataStoreContent = {
|
|
368
425
|
content,
|
|
369
426
|
type,
|
|
370
427
|
};
|
|
428
|
+
// Summarizer clients should not submit messages.
|
|
429
|
+
this.identifyLocalChangeInSummarizer("DataStoreMessageSubmittedInSummarizer", type);
|
|
371
430
|
this._containerRuntime.submitDataStoreOp(this.id, fluidDataStoreContent, localOpMetadata);
|
|
372
431
|
}
|
|
373
432
|
/**
|
|
@@ -380,7 +439,7 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
380
439
|
*
|
|
381
440
|
*/
|
|
382
441
|
setChannelDirty(address) {
|
|
383
|
-
this.verifyNotClosed();
|
|
442
|
+
this.verifyNotClosed("setChannelDirty");
|
|
384
443
|
// Get the latest sequence number.
|
|
385
444
|
const latestSequenceNumber = this.deltaManager.lastSequenceNumber;
|
|
386
445
|
this.summarizerNode.invalidate(latestSequenceNumber);
|
|
@@ -389,10 +448,16 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
389
448
|
channelSummarizerNode.invalidate(latestSequenceNumber); // TODO: lazy load problem?
|
|
390
449
|
}
|
|
391
450
|
}
|
|
392
|
-
|
|
393
|
-
|
|
451
|
+
/**
|
|
452
|
+
* Submits the signal to be sent to other clients.
|
|
453
|
+
* @param type - Type of the signal.
|
|
454
|
+
* @param content - Content of the signal.
|
|
455
|
+
* @param targetClientId - When specified, the signal is only sent to the provided client id.
|
|
456
|
+
*/
|
|
457
|
+
submitSignal(type, content, targetClientId) {
|
|
458
|
+
this.verifyNotClosed("submitSignal");
|
|
394
459
|
assert(!!this.channel, 0x147 /* "Channel must exist on submitting signal" */);
|
|
395
|
-
return this._containerRuntime.submitDataStoreSignal(this.id, type, content);
|
|
460
|
+
return this._containerRuntime.submitDataStoreSignal(this.id, type, content, targetClientId);
|
|
396
461
|
}
|
|
397
462
|
/**
|
|
398
463
|
* This is called by the data store channel when it becomes locally visible indicating that it is ready to become
|
|
@@ -400,10 +465,10 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
400
465
|
*/
|
|
401
466
|
makeLocallyVisible() {
|
|
402
467
|
assert(this.channel !== undefined, 0x2cf /* "undefined channel on datastore context" */);
|
|
468
|
+
assert(this.channel.visibilityState === VisibilityState.LocallyVisible, 0x590 /* Channel must be locally visible */);
|
|
403
469
|
this.makeLocallyVisibleFn();
|
|
404
470
|
}
|
|
405
471
|
bindRuntime(channel) {
|
|
406
|
-
var _a;
|
|
407
472
|
if (this.channel) {
|
|
408
473
|
throw new Error("Runtime already bound");
|
|
409
474
|
}
|
|
@@ -437,8 +502,10 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
437
502
|
this.channelDeferred.resolve(this.channel);
|
|
438
503
|
}
|
|
439
504
|
catch (error) {
|
|
440
|
-
|
|
441
|
-
this.logger.sendErrorEvent({
|
|
505
|
+
this.channelDeferred?.reject(error);
|
|
506
|
+
this.mc.logger.sendErrorEvent({
|
|
507
|
+
eventName: "BindRuntimeError",
|
|
508
|
+
}, error);
|
|
442
509
|
}
|
|
443
510
|
}
|
|
444
511
|
async getAbsoluteUrl(relativeUrl) {
|
|
@@ -448,13 +515,19 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
448
515
|
return this._containerRuntime.getAbsoluteUrl(relativeUrl);
|
|
449
516
|
}
|
|
450
517
|
/**
|
|
451
|
-
* @deprecated
|
|
518
|
+
* @deprecated Sets the datastore as root, for aliasing purposes: #7948
|
|
452
519
|
* This method should not be used outside of the aliasing context.
|
|
453
520
|
* It will be removed, as the source of truth for this flag will be the aliasing blob.
|
|
454
521
|
*/
|
|
455
522
|
setInMemoryRoot() {
|
|
456
523
|
this._isInMemoryRoot = true;
|
|
457
524
|
}
|
|
525
|
+
/**
|
|
526
|
+
* @deprecated The functionality to get base GC details has been moved to summarizer node.
|
|
527
|
+
*/
|
|
528
|
+
async getBaseGCDetails() {
|
|
529
|
+
return {};
|
|
530
|
+
}
|
|
458
531
|
reSubmit(contents, localOpMetadata) {
|
|
459
532
|
assert(!!this.channel, 0x14b /* "Channel must exist when resubmitting ops" */);
|
|
460
533
|
const innerContents = contents;
|
|
@@ -475,62 +548,86 @@ export class FluidDataStoreContext extends TypedEventEmitter {
|
|
|
475
548
|
await this.realize();
|
|
476
549
|
}
|
|
477
550
|
assert(!!this.channel, 0x14c /* "Channel must exist when rebasing ops" */);
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
}
|
|
481
|
-
|
|
551
|
+
return this.channel.applyStashedOp(contents);
|
|
552
|
+
}
|
|
553
|
+
verifyNotClosed(callSite, checkTombstone = true, safeTelemetryProps = {}) {
|
|
554
|
+
if (this.deleted) {
|
|
555
|
+
const messageString = `Context is deleted! Call site [${callSite}]`;
|
|
556
|
+
const error = new DataCorruptionError(messageString, safeTelemetryProps);
|
|
557
|
+
this.mc.logger.sendErrorEvent({
|
|
558
|
+
eventName: "GC_Deleted_DataStore_Changed",
|
|
559
|
+
callSite,
|
|
560
|
+
}, error);
|
|
561
|
+
throw error;
|
|
562
|
+
}
|
|
482
563
|
if (this._disposed) {
|
|
483
|
-
throw new Error(
|
|
564
|
+
throw new Error(`Context is closed! Call site [${callSite}]`);
|
|
565
|
+
}
|
|
566
|
+
if (checkTombstone && this.tombstoned) {
|
|
567
|
+
const messageString = `Context is tombstoned! Call site [${callSite}]`;
|
|
568
|
+
const error = new DataCorruptionError(messageString, safeTelemetryProps);
|
|
569
|
+
sendGCUnexpectedUsageEvent(this.mc, {
|
|
570
|
+
eventName: "GC_Tombstone_DataStore_Changed",
|
|
571
|
+
category: this.throwOnTombstoneUsage ? "error" : "generic",
|
|
572
|
+
gcTombstoneEnforcementAllowed: this._containerRuntime.gcTombstoneEnforcementAllowed,
|
|
573
|
+
callSite,
|
|
574
|
+
}, this.pkg, error);
|
|
575
|
+
if (this.throwOnTombstoneUsage) {
|
|
576
|
+
throw error;
|
|
577
|
+
}
|
|
484
578
|
}
|
|
485
579
|
}
|
|
580
|
+
/**
|
|
581
|
+
* Summarizer client should not have local changes. These changes can become part of the summary and can break
|
|
582
|
+
* eventual consistency. For example, the next summary (say at ref seq# 100) may contain these changes whereas
|
|
583
|
+
* other clients that are up-to-date till seq# 100 may not have them yet.
|
|
584
|
+
*/
|
|
585
|
+
identifyLocalChangeInSummarizer(eventName, type) {
|
|
586
|
+
if (this.clientDetails.type !== summarizerClientType ||
|
|
587
|
+
this.localChangesTelemetryCount <= 0) {
|
|
588
|
+
return;
|
|
589
|
+
}
|
|
590
|
+
// Log a telemetry if there are local changes in the summarizer. This will give us data on how often
|
|
591
|
+
// this is happening and which data stores do this. The eventual goal is to disallow local changes
|
|
592
|
+
// in the summarizer and the data will help us plan this.
|
|
593
|
+
this.mc.logger.sendTelemetryEvent({
|
|
594
|
+
eventName,
|
|
595
|
+
type,
|
|
596
|
+
isSummaryInProgress: this.summarizerNode.isSummaryInProgress?.(),
|
|
597
|
+
stack: generateStack(),
|
|
598
|
+
});
|
|
599
|
+
this.localChangesTelemetryCount--;
|
|
600
|
+
}
|
|
486
601
|
getCreateChildSummarizerNodeFn(id, createParam) {
|
|
487
|
-
return (summarizeInternal, getGCDataFn
|
|
602
|
+
return (summarizeInternal, getGCDataFn) => this.summarizerNode.createChild(summarizeInternal, id, createParam,
|
|
488
603
|
// DDS will not create failure summaries
|
|
489
|
-
{ throwOnFailure: true }, getGCDataFn
|
|
604
|
+
{ throwOnFailure: true }, getGCDataFn);
|
|
490
605
|
}
|
|
491
|
-
async uploadBlob(blob) {
|
|
492
|
-
return this.containerRuntime.uploadBlob(blob);
|
|
606
|
+
async uploadBlob(blob, signal) {
|
|
607
|
+
return this.containerRuntime.uploadBlob(blob, signal);
|
|
493
608
|
}
|
|
494
609
|
}
|
|
495
610
|
FluidDataStoreContext.pendingOpsCountThreshold = 1000;
|
|
496
611
|
export class RemoteFluidDataStoreContext extends FluidDataStoreContext {
|
|
497
612
|
constructor(props) {
|
|
498
|
-
super(props, true /* existing */,
|
|
613
|
+
super(props, true /* existing */, false /* isLocalDataStore */, () => {
|
|
499
614
|
throw new Error("Already attached");
|
|
500
615
|
});
|
|
501
616
|
this.initialSnapshotDetailsP = new LazyPromise(async () => {
|
|
502
|
-
|
|
503
|
-
let tree;
|
|
617
|
+
let tree = this.initSnapshotValue;
|
|
504
618
|
let isRootDataStore = true;
|
|
505
|
-
if (typeof this.initSnapshotValue === "string") {
|
|
506
|
-
const commit = (await this.storage.getVersions(this.initSnapshotValue, 1))[0];
|
|
507
|
-
tree = (_a = await this.storage.getSnapshotTree(commit)) !== null && _a !== void 0 ? _a : undefined;
|
|
508
|
-
}
|
|
509
|
-
else {
|
|
510
|
-
tree = this.initSnapshotValue;
|
|
511
|
-
}
|
|
512
|
-
const localReadAndParse = async (id) => readAndParse(this.storage, id);
|
|
513
|
-
if (tree) {
|
|
514
|
-
const loadedSummary = await this.summarizerNode.loadBaseSummary(tree, localReadAndParse);
|
|
515
|
-
tree = loadedSummary.baseSummary;
|
|
516
|
-
// Prepend outstanding ops to pending queue of ops to process.
|
|
517
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
518
|
-
this.pending = loadedSummary.outstandingOps.concat(this.pending);
|
|
519
|
-
}
|
|
520
619
|
if (!!tree && tree.blobs[dataStoreAttributesBlobName] !== undefined) {
|
|
521
620
|
// Need to get through snapshot and use that to populate extraBlobs
|
|
522
|
-
const attributes = await
|
|
621
|
+
const attributes = await readAndParse(this.storage, tree.blobs[dataStoreAttributesBlobName]);
|
|
523
622
|
let pkgFromSnapshot;
|
|
524
623
|
// Use the snapshotFormatVersion to determine how the pkg is encoded in the snapshot.
|
|
525
624
|
// For snapshotFormatVersion = "0.1" (1) or above, pkg is jsonified, otherwise it is just a string.
|
|
526
625
|
const formatVersion = getAttributesFormatVersion(attributes);
|
|
527
626
|
if (formatVersion < 1) {
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
pkgFromSnapshot = [attributes.pkg];
|
|
533
|
-
}
|
|
627
|
+
pkgFromSnapshot =
|
|
628
|
+
attributes.pkg.startsWith('["') && attributes.pkg.endsWith('"]')
|
|
629
|
+
? JSON.parse(attributes.pkg)
|
|
630
|
+
: [attributes.pkg];
|
|
534
631
|
}
|
|
535
632
|
else {
|
|
536
633
|
pkgFromSnapshot = JSON.parse(attributes.pkg);
|
|
@@ -541,7 +638,7 @@ export class RemoteFluidDataStoreContext extends FluidDataStoreContext {
|
|
|
541
638
|
* data stores in older documents are not garbage collected incorrectly. This may lead to additional
|
|
542
639
|
* roots in the document but they won't break.
|
|
543
640
|
*/
|
|
544
|
-
isRootDataStore =
|
|
641
|
+
isRootDataStore = attributes.isRootDataStore ?? true;
|
|
545
642
|
if (hasIsolatedChannels(attributes)) {
|
|
546
643
|
tree = tree.trees[channelsTreeName];
|
|
547
644
|
assert(tree !== undefined, 0x1fe /* "isolated channels subtree should exist in remote datastore snapshot" */);
|
|
@@ -555,23 +652,13 @@ export class RemoteFluidDataStoreContext extends FluidDataStoreContext {
|
|
|
555
652
|
};
|
|
556
653
|
});
|
|
557
654
|
this.initSnapshotValue = props.snapshotTree;
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
});
|
|
655
|
+
if (props.snapshotTree !== undefined) {
|
|
656
|
+
this.summarizerNode.updateBaseSummaryState(props.snapshotTree);
|
|
657
|
+
}
|
|
562
658
|
}
|
|
563
659
|
async getInitialSnapshotDetails() {
|
|
564
660
|
return this.initialSnapshotDetailsP;
|
|
565
661
|
}
|
|
566
|
-
/**
|
|
567
|
-
* @deprecated - Renamed to getBaseGCDetails.
|
|
568
|
-
*/
|
|
569
|
-
async getInitialGCSummaryDetails() {
|
|
570
|
-
return this.getBaseGCDetails();
|
|
571
|
-
}
|
|
572
|
-
async getBaseGCDetails() {
|
|
573
|
-
return this.baseGCDetailsP;
|
|
574
|
-
}
|
|
575
662
|
generateAttachMessage() {
|
|
576
663
|
throw new Error("Cannot attach remote store");
|
|
577
664
|
}
|
|
@@ -581,7 +668,39 @@ export class RemoteFluidDataStoreContext extends FluidDataStoreContext {
|
|
|
581
668
|
*/
|
|
582
669
|
export class LocalFluidDataStoreContextBase extends FluidDataStoreContext {
|
|
583
670
|
constructor(props) {
|
|
584
|
-
super(props, props.snapshotTree !== undefined ? true : false /* existing */,
|
|
671
|
+
super(props, props.snapshotTree !== undefined ? true : false /* existing */, true /* isLocalDataStore */, props.makeLocallyVisibleFn);
|
|
672
|
+
this.initialSnapshotDetailsP = new LazyPromise(async () => {
|
|
673
|
+
let snapshot = this.snapshotTree;
|
|
674
|
+
let attributes;
|
|
675
|
+
let isRootDataStore = false;
|
|
676
|
+
if (snapshot !== undefined) {
|
|
677
|
+
// Get the dataStore attributes.
|
|
678
|
+
// Note: storage can be undefined in special case while detached.
|
|
679
|
+
attributes = await getFluidDataStoreAttributes(this.storage, snapshot);
|
|
680
|
+
if (hasIsolatedChannels(attributes)) {
|
|
681
|
+
snapshot = snapshot.trees[channelsTreeName];
|
|
682
|
+
assert(snapshot !== undefined, 0x1ff /* "isolated channels subtree should exist in local datastore snapshot" */);
|
|
683
|
+
}
|
|
684
|
+
if (this.pkg === undefined) {
|
|
685
|
+
this.pkg = JSON.parse(attributes.pkg);
|
|
686
|
+
// If there is no isRootDataStore in the attributes blob, set it to true. This ensures that data
|
|
687
|
+
// stores in older documents are not garbage collected incorrectly. This may lead to additional
|
|
688
|
+
// roots in the document but they won't break.
|
|
689
|
+
if (attributes.isRootDataStore ?? true) {
|
|
690
|
+
isRootDataStore = true;
|
|
691
|
+
this.setInMemoryRoot();
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
assert(this.pkg !== undefined, 0x152 /* "pkg should be available in local data store" */);
|
|
696
|
+
return {
|
|
697
|
+
pkg: this.pkg,
|
|
698
|
+
isRootDataStore,
|
|
699
|
+
snapshot,
|
|
700
|
+
};
|
|
701
|
+
});
|
|
702
|
+
// Summarizer client should not create local data stores.
|
|
703
|
+
this.identifyLocalChangeInSummarizer("DataStoreCreatedInSummarizer");
|
|
585
704
|
this.snapshotTree = props.snapshotTree;
|
|
586
705
|
if (props.isRootDataStore === true) {
|
|
587
706
|
this.setInMemoryRoot();
|
|
@@ -603,12 +722,10 @@ export class LocalFluidDataStoreContextBase extends FluidDataStoreContext {
|
|
|
603
722
|
assert(this.channel !== undefined, 0x14f /* "There should be a channel when generating attach message" */);
|
|
604
723
|
assert(this.pkg !== undefined, 0x150 /* "pkg should be available in local data store context" */);
|
|
605
724
|
const summarizeResult = this.channel.getAttachSummary();
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
wrapSummaryInChannelsTree(summarizeResult);
|
|
609
|
-
}
|
|
725
|
+
// Wrap dds summaries in .channels subtree.
|
|
726
|
+
wrapSummaryInChannelsTree(summarizeResult);
|
|
610
727
|
// Add data store's attributes to the summary.
|
|
611
|
-
const attributes = createAttributes(this.pkg, this.isInMemoryRoot()
|
|
728
|
+
const attributes = createAttributes(this.pkg, this.isInMemoryRoot());
|
|
612
729
|
addBlobToSummary(summarizeResult, dataStoreAttributesBlobName, JSON.stringify(attributes));
|
|
613
730
|
// Attach message needs the summary in ITree format. Convert the ISummaryTree into an ITree.
|
|
614
731
|
const snapshot = convertSummaryTreeToITree(summarizeResult.summary);
|
|
@@ -620,46 +737,24 @@ export class LocalFluidDataStoreContextBase extends FluidDataStoreContext {
|
|
|
620
737
|
return message;
|
|
621
738
|
}
|
|
622
739
|
async getInitialSnapshotDetails() {
|
|
623
|
-
|
|
624
|
-
let snapshot = this.snapshotTree;
|
|
625
|
-
let attributes;
|
|
626
|
-
let isRootDataStore = false;
|
|
627
|
-
if (snapshot !== undefined) {
|
|
628
|
-
// Get the dataStore attributes.
|
|
629
|
-
// Note: storage can be undefined in special case while detached.
|
|
630
|
-
attributes = await getFluidDataStoreAttributes(this.storage, snapshot);
|
|
631
|
-
if (hasIsolatedChannels(attributes)) {
|
|
632
|
-
snapshot = snapshot.trees[channelsTreeName];
|
|
633
|
-
assert(snapshot !== undefined, 0x1ff /* "isolated channels subtree should exist in local datastore snapshot" */);
|
|
634
|
-
}
|
|
635
|
-
if (this.pkg === undefined) {
|
|
636
|
-
this.pkg = JSON.parse(attributes.pkg);
|
|
637
|
-
// If there is no isRootDataStore in the attributes blob, set it to true. This ensures that data
|
|
638
|
-
// stores in older documents are not garbage collected incorrectly. This may lead to additional
|
|
639
|
-
// roots in the document but they won't break.
|
|
640
|
-
if ((_a = attributes.isRootDataStore) !== null && _a !== void 0 ? _a : true) {
|
|
641
|
-
isRootDataStore = true;
|
|
642
|
-
this.setInMemoryRoot();
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
assert(this.pkg !== undefined, 0x152 /* "pkg should be available in local data store" */);
|
|
647
|
-
return {
|
|
648
|
-
pkg: this.pkg,
|
|
649
|
-
isRootDataStore,
|
|
650
|
-
snapshot,
|
|
651
|
-
};
|
|
740
|
+
return this.initialSnapshotDetailsP;
|
|
652
741
|
}
|
|
653
742
|
/**
|
|
654
|
-
*
|
|
743
|
+
* A context should only be marked as deleted when its a remote context.
|
|
744
|
+
* Session Expiry at the runtime level should have closed the container creating the local data store context
|
|
745
|
+
* before delete is even possible. Session Expiry is at 30 days, and sweep is done 36+ days later from the time
|
|
746
|
+
* it was unreferenced. Thus the sweeping container should have loaded from a snapshot and thus creating a remote
|
|
747
|
+
* context.
|
|
655
748
|
*/
|
|
656
|
-
|
|
657
|
-
//
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
749
|
+
delete() {
|
|
750
|
+
// TODO: GC:Validation - potentially prevent this from happening or asserting. Maybe throw here.
|
|
751
|
+
sendGCUnexpectedUsageEvent(this.mc, {
|
|
752
|
+
eventName: "GC_Deleted_DataStore_Unexpected_Delete",
|
|
753
|
+
message: "Unexpected deletion of a local data store context",
|
|
754
|
+
category: "error",
|
|
755
|
+
gcTombstoneEnforcementAllowed: undefined,
|
|
756
|
+
}, this.pkg);
|
|
757
|
+
super.delete();
|
|
663
758
|
}
|
|
664
759
|
}
|
|
665
760
|
/**
|
|
@@ -686,24 +781,25 @@ export class LocalDetachedFluidDataStoreContext extends LocalFluidDataStoreConte
|
|
|
686
781
|
}
|
|
687
782
|
async attachRuntime(registry, dataStoreChannel) {
|
|
688
783
|
assert(this.detachedRuntimeCreation, 0x154 /* "runtime creation is already attached" */);
|
|
784
|
+
this.detachedRuntimeCreation = false;
|
|
689
785
|
assert(this.channelDeferred === undefined, 0x155 /* "channel deferral is already set" */);
|
|
786
|
+
this.channelDeferred = new Deferred();
|
|
690
787
|
const factory = registry.IFluidDataStoreFactory;
|
|
691
788
|
const entry = await this.factoryFromPackagePath(this.pkg);
|
|
692
789
|
assert(entry.factory === factory, 0x156 /* "Unexpected factory for package path" */);
|
|
693
790
|
assert(this.registry === undefined, 0x157 /* "datastore registry already attached" */);
|
|
694
791
|
this.registry = entry.registry;
|
|
695
|
-
this.detachedRuntimeCreation = false;
|
|
696
|
-
this.channelDeferred = new Deferred();
|
|
697
792
|
super.bindRuntime(dataStoreChannel);
|
|
793
|
+
// Load the handle to the data store's entryPoint to make sure that for a detached data store, the entryPoint
|
|
794
|
+
// initialization function is called before the data store gets attached and potentially connected to the
|
|
795
|
+
// delta stream, so it gets a chance to do things while the data store is still "purely local".
|
|
796
|
+
// This preserves the behavior from before we introduced entryPoints, where the instantiateDataStore method
|
|
797
|
+
// of data store factories tends to construct the data object (at least kick off an async method that returns
|
|
798
|
+
// it); that code moved to the entryPoint initialization function, so we want to ensure it still executes
|
|
799
|
+
// before the data store is attached.
|
|
800
|
+
await dataStoreChannel.entryPoint.get();
|
|
698
801
|
if (await this.isRoot()) {
|
|
699
|
-
|
|
700
|
-
// For older versions, we still have to call bindToContext.
|
|
701
|
-
if (dataStoreChannel.makeVisibleAndAttachGraph !== undefined) {
|
|
702
|
-
dataStoreChannel.makeVisibleAndAttachGraph();
|
|
703
|
-
}
|
|
704
|
-
else {
|
|
705
|
-
dataStoreChannel.bindToContext();
|
|
706
|
-
}
|
|
802
|
+
dataStoreChannel.makeVisibleAndAttachGraph();
|
|
707
803
|
}
|
|
708
804
|
}
|
|
709
805
|
async getInitialSnapshotDetails() {
|
|
@@ -713,4 +809,4 @@ export class LocalDetachedFluidDataStoreContext extends LocalFluidDataStoreConte
|
|
|
713
809
|
return super.getInitialSnapshotDetails();
|
|
714
810
|
}
|
|
715
811
|
}
|
|
716
|
-
//# sourceMappingURL=dataStoreContext.
|
|
812
|
+
//# sourceMappingURL=dataStoreContext.mjs.map
|