@fluidframework/container-runtime 2.0.0-rc.2.0.2 → 2.0.0-rc.3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/api-report/container-runtime.api.md +471 -52
- package/dist/batchTracker.d.ts +1 -1
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +4 -4
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +33 -30
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +82 -107
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +27 -22
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +155 -165
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +3 -3
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +17 -17
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js +2 -2
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +42 -39
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +425 -292
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +8 -8
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +58 -19
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +169 -114
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts +1 -0
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +12 -11
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.d.ts +5 -1
- package/dist/dataStoreRegistry.d.ts.map +1 -1
- package/dist/dataStoreRegistry.js +4 -4
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/dist/deltaManagerSummarizerProxy.js.map +1 -1
- package/dist/deltaScheduler.d.ts +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +6 -6
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/error.d.ts +1 -1
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +4 -4
- package/dist/error.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +3 -2
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +23 -23
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts +2 -2
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +4 -5
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +4 -5
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +5 -1
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +21 -12
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +2 -2
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +11 -11
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +2 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +11 -9
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js +6 -6
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/gc/index.d.ts +1 -1
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +2 -1
- package/dist/gc/index.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +91 -0
- package/dist/messageTypes.d.ts +11 -5
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js +4 -0
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +2 -20
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +3 -3
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +3 -1
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +5 -6
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +15 -4
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +62 -63
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +14 -16
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +12 -4
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +63 -53
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +2 -1
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +30 -29
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +36 -32
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts +1 -1
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +18 -18
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/public.d.ts +12 -0
- package/dist/scheduleManager.d.ts +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +28 -24
- package/dist/scheduleManager.js.map +1 -1
- package/dist/storageServiceWithAttachBlobs.d.ts +2 -2
- package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -1
- package/dist/storageServiceWithAttachBlobs.js +2 -2
- package/dist/storageServiceWithAttachBlobs.js.map +1 -1
- package/dist/summary/documentSchema.d.ts +209 -0
- package/dist/summary/documentSchema.d.ts.map +1 -0
- package/dist/summary/documentSchema.js +390 -0
- package/dist/summary/documentSchema.js.map +1 -0
- package/dist/summary/index.d.ts +2 -1
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +4 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +2 -2
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +12 -7
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js +3 -3
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +3 -3
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +16 -16
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +3 -2
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +13 -13
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts +2 -2
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.d.ts +1 -1
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
- package/dist/summary/summarizerHeuristics.js +2 -2
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +3 -2
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +28 -28
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +14 -14
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +5 -3
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +2 -2
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +7 -7
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +6 -17
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js +8 -8
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +4 -3
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +17 -17
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +1 -1
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +15 -14
- package/dist/summary/summaryManager.js.map +1 -1
- package/internal.d.ts +11 -0
- package/legacy.d.ts +11 -0
- package/lib/batchTracker.d.ts +1 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -2
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +33 -30
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +48 -73
- package/lib/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts +27 -22
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +96 -106
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +3 -3
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +3 -3
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerHandleContext.d.ts.map +1 -1
- package/lib/containerHandleContext.js +1 -1
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +42 -39
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +276 -141
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +3 -3
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +58 -19
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +107 -52
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts +1 -0
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +3 -2
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.d.ts +5 -1
- package/lib/dataStoreRegistry.d.ts.map +1 -1
- package/lib/dataStoreRegistry.js +1 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/lib/deltaManagerSummarizerProxy.js.map +1 -1
- package/lib/deltaScheduler.d.ts +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +1 -1
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/error.d.ts +1 -1
- package/lib/error.d.ts.map +1 -1
- package/lib/error.js +2 -2
- package/lib/error.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +3 -2
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +8 -8
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts +2 -2
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +4 -5
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +4 -5
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts +5 -1
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +10 -2
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts +2 -2
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +2 -2
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +2 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +4 -2
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js +2 -2
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/lib/gc/index.d.ts +1 -1
- package/lib/gc/index.d.ts.map +1 -1
- package/lib/gc/index.js +1 -1
- package/lib/gc/index.js.map +1 -1
- package/lib/index.d.ts +5 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -2
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +91 -0
- package/lib/messageTypes.d.ts +11 -5
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js +4 -0
- package/lib/messageTypes.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +2 -20
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +3 -3
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js +2 -2
- package/lib/opLifecycle/index.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +2 -3
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +15 -4
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +61 -62
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +9 -12
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +12 -4
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +47 -38
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +2 -1
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +19 -18
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +36 -32
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +1 -1
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +2 -2
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/public.d.ts +12 -0
- package/lib/scheduleManager.d.ts +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +7 -3
- package/lib/scheduleManager.js.map +1 -1
- package/lib/storageServiceWithAttachBlobs.d.ts +2 -2
- package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -1
- package/lib/storageServiceWithAttachBlobs.js +1 -1
- package/lib/storageServiceWithAttachBlobs.js.map +1 -1
- package/lib/summary/documentSchema.d.ts +209 -0
- package/lib/summary/documentSchema.d.ts.map +1 -0
- package/lib/summary/documentSchema.js +386 -0
- package/lib/summary/documentSchema.js.map +1 -0
- package/lib/summary/index.d.ts +2 -1
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js +1 -0
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +2 -2
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +7 -2
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +3 -3
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +3 -3
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +3 -2
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +3 -3
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts +2 -2
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.d.ts +1 -1
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
- package/lib/summary/summarizerHeuristics.js +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +3 -2
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +5 -5
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +5 -3
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +2 -2
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +1 -1
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +6 -17
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +3 -3
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +4 -3
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +4 -4
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +1 -1
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +9 -8
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +57 -65
- package/src/batchTracker.ts +4 -3
- package/src/blobManager.ts +100 -77
- package/src/channelCollection.ts +180 -165
- package/src/connectionTelemetry.ts +12 -12
- package/src/containerHandleContext.ts +3 -2
- package/src/containerRuntime.ts +481 -277
- package/src/dataStore.ts +9 -4
- package/src/dataStoreContext.ts +195 -93
- package/src/dataStoreContexts.ts +5 -2
- package/src/dataStoreRegistry.ts +3 -2
- package/src/deltaManagerSummarizerProxy.ts +1 -1
- package/src/deltaScheduler.ts +2 -1
- package/src/error.ts +2 -2
- package/src/gc/garbageCollection.ts +21 -20
- package/src/gc/gcConfigs.ts +15 -18
- package/src/gc/gcDefinitions.ts +6 -8
- package/src/gc/gcHelpers.ts +22 -5
- package/src/gc/gcSummaryStateTracker.ts +7 -5
- package/src/gc/gcTelemetry.ts +13 -7
- package/src/gc/gcUnreferencedStateTracker.ts +3 -2
- package/src/gc/index.ts +1 -0
- package/src/index.ts +22 -1
- package/src/messageTypes.ts +20 -6
- package/src/opLifecycle/README.md +89 -0
- package/src/opLifecycle/batchManager.ts +1 -0
- package/src/opLifecycle/definitions.ts +3 -21
- package/src/opLifecycle/index.ts +3 -9
- package/src/opLifecycle/opCompressor.ts +6 -5
- package/src/opLifecycle/opDecompressor.ts +90 -100
- package/src/opLifecycle/opGroupingManager.ts +12 -14
- package/src/opLifecycle/opSplitter.ts +76 -48
- package/src/opLifecycle/outbox.ts +30 -38
- package/src/opLifecycle/remoteMessageProcessor.ts +43 -55
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +6 -6
- package/src/scheduleManager.ts +10 -8
- package/src/storageServiceWithAttachBlobs.ts +2 -2
- package/src/summary/documentSchema.ts +631 -0
- package/src/summary/index.ts +10 -1
- package/src/summary/orderedClientElection.ts +7 -7
- package/src/summary/runWhileConnectedCoordinator.ts +3 -2
- package/src/summary/runningSummarizer.ts +22 -20
- package/src/summary/summarizer.ts +17 -15
- package/src/summary/summarizerClientElection.ts +3 -2
- package/src/summary/summarizerHeuristics.ts +4 -2
- package/src/summary/summarizerNode/summarizerNode.ts +20 -18
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +3 -2
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +16 -8
- package/src/summary/summarizerTypes.ts +7 -3
- package/src/summary/summaryCollection.ts +3 -3
- package/src/summary/summaryFormat.ts +14 -26
- package/src/summary/summaryGenerator.ts +12 -15
- package/src/summary/summaryManager.ts +16 -13
- package/api-extractor-cjs.json +0 -8
- package/dist/container-runtime-alpha.d.ts +0 -1753
- package/dist/container-runtime-beta.d.ts +0 -268
- package/dist/container-runtime-public.d.ts +0 -268
- package/dist/container-runtime-untrimmed.d.ts +0 -1893
- package/lib/container-runtime-alpha.d.ts +0 -1753
- package/lib/container-runtime-beta.d.ts +0 -268
- package/lib/container-runtime-public.d.ts +0 -268
- package/lib/container-runtime-untrimmed.d.ts +0 -1893
- package/lib/test/batchTracker.spec.js +0 -88
- package/lib/test/batchTracker.spec.js.map +0 -1
- package/lib/test/blobManager.spec.js +0 -835
- package/lib/test/blobManager.spec.js.map +0 -1
- package/lib/test/channelCollection.spec.js +0 -141
- package/lib/test/channelCollection.spec.js.map +0 -1
- package/lib/test/containerRuntime.spec.js +0 -1748
- package/lib/test/containerRuntime.spec.js.map +0 -1
- package/lib/test/dataStoreContext.spec.js +0 -801
- package/lib/test/dataStoreContext.spec.js.map +0 -1
- package/lib/test/dataStoreCreation.spec.js +0 -312
- package/lib/test/dataStoreCreation.spec.js.map +0 -1
- package/lib/test/dataStoreRegistry.spec.js +0 -26
- package/lib/test/dataStoreRegistry.spec.js.map +0 -1
- package/lib/test/fuzz/fuzzUtils.js +0 -66
- package/lib/test/fuzz/fuzzUtils.js.map +0 -1
- package/lib/test/fuzz/summarizer.fuzz.spec.js +0 -31
- package/lib/test/fuzz/summarizer.fuzz.spec.js.map +0 -1
- package/lib/test/fuzz/summarizerFuzzMocks.js +0 -162
- package/lib/test/fuzz/summarizerFuzzMocks.js.map +0 -1
- package/lib/test/fuzz/summarizerFuzzSuite.js +0 -106
- package/lib/test/fuzz/summarizerFuzzSuite.js.map +0 -1
- package/lib/test/gc/garbageCollection.spec.js +0 -1465
- package/lib/test/gc/garbageCollection.spec.js.map +0 -1
- package/lib/test/gc/gcConfigs.spec.js +0 -690
- package/lib/test/gc/gcConfigs.spec.js.map +0 -1
- package/lib/test/gc/gcHelpers.spec.js +0 -110
- package/lib/test/gc/gcHelpers.spec.js.map +0 -1
- package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +0 -68
- package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +0 -1
- package/lib/test/gc/gcStats.spec.js +0 -391
- package/lib/test/gc/gcStats.spec.js.map +0 -1
- package/lib/test/gc/gcSummaryStateTracker.spec.js +0 -228
- package/lib/test/gc/gcSummaryStateTracker.spec.js.map +0 -1
- package/lib/test/gc/gcTelemetry.spec.js +0 -530
- package/lib/test/gc/gcTelemetry.spec.js.map +0 -1
- package/lib/test/gc/gcUnitTestHelpers.js +0 -29
- package/lib/test/gc/gcUnitTestHelpers.js.map +0 -1
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js +0 -192
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +0 -1
- package/lib/test/getPendingBlobs.spec.js +0 -193
- package/lib/test/getPendingBlobs.spec.js.map +0 -1
- package/lib/test/hardwareStats.spec.js +0 -93
- package/lib/test/hardwareStats.spec.js.map +0 -1
- package/lib/test/index.js +0 -6
- package/lib/test/index.js.map +0 -1
- package/lib/test/opLifecycle/OpGroupingManager.spec.js +0 -225
- package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +0 -1
- package/lib/test/opLifecycle/batchManager.spec.js +0 -189
- package/lib/test/opLifecycle/batchManager.spec.js.map +0 -1
- package/lib/test/opLifecycle/opCompressor.spec.js +0 -74
- package/lib/test/opLifecycle/opCompressor.spec.js.map +0 -1
- package/lib/test/opLifecycle/opDecompressor.spec.js +0 -218
- package/lib/test/opLifecycle/opDecompressor.spec.js.map +0 -1
- package/lib/test/opLifecycle/opSplitter.spec.js +0 -272
- package/lib/test/opLifecycle/opSplitter.spec.js.map +0 -1
- package/lib/test/opLifecycle/outbox.spec.js +0 -675
- package/lib/test/opLifecycle/outbox.spec.js.map +0 -1
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +0 -196
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +0 -1
- package/lib/test/pendingStateManager.spec.js +0 -329
- package/lib/test/pendingStateManager.spec.js.map +0 -1
- package/lib/test/scheduleManager.spec.js +0 -270
- package/lib/test/scheduleManager.spec.js.map +0 -1
- package/lib/test/summarizerNode.spec.js +0 -326
- package/lib/test/summarizerNode.spec.js.map +0 -1
- package/lib/test/summarizerNodeWithGc.spec.js +0 -318
- package/lib/test/summarizerNodeWithGc.spec.js.map +0 -1
- package/lib/test/summary/orderedClientElection.spec.js +0 -535
- package/lib/test/summary/orderedClientElection.spec.js.map +0 -1
- package/lib/test/summary/runningSummarizer.spec.js +0 -1349
- package/lib/test/summary/runningSummarizer.spec.js.map +0 -1
- package/lib/test/summary/summarizer.spec.js +0 -29
- package/lib/test/summary/summarizer.spec.js.map +0 -1
- package/lib/test/summary/summarizerClientElection.spec.js +0 -436
- package/lib/test/summary/summarizerClientElection.spec.js.map +0 -1
- package/lib/test/summary/summarizerHeuristics.spec.js +0 -289
- package/lib/test/summary/summarizerHeuristics.spec.js.map +0 -1
- package/lib/test/summary/summaryCollection.spec.js +0 -200
- package/lib/test/summary/summaryCollection.spec.js.map +0 -1
- package/lib/test/summary/summaryManager.spec.js +0 -430
- package/lib/test/summary/summaryManager.spec.js.map +0 -1
- package/lib/test/summary/testQuorumClients.js +0 -34
- package/lib/test/summary/testQuorumClients.js.map +0 -1
- package/lib/test/throttler.spec.js +0 -175
- package/lib/test/throttler.spec.js.map +0 -1
- package/lib/test/types/validateContainerRuntimePrevious.generated.js +0 -180
- package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +0 -1
- /package/{dist → lib}/tsdoc-metadata.json +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"blobManager.spec.js","sourceRoot":"","sources":["../../src/test/blobManager.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { v4 as uuid } from \"uuid\";\n\nimport { Deferred } from \"@fluidframework/core-utils\";\nimport {\n\tbufferToString,\n\tgitHashFile,\n\tIsoBuffer,\n\tTypedEventEmitter,\n} from \"@fluid-internal/client-utils\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { IContainerRuntimeEvents } from \"@fluidframework/container-runtime-definitions\";\nimport {\n\tConfigTypes,\n\tIConfigProviderBase,\n\tIErrorBase,\n\tIFluidHandle,\n} from \"@fluidframework/core-interfaces\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport {\n\tIClientDetails,\n\tISequencedDocumentMessage,\n\tSummaryType,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tmixinMonitoringContext,\n\tMonitoringContext,\n\tcreateChildLogger,\n\tLoggingError,\n} from \"@fluidframework/telemetry-utils\";\nimport { BlobManager, IBlobManagerLoadInfo, IBlobManagerRuntime } from \"../blobManager.js\";\n\nconst MIN_TTL = 24 * 60 * 60; // same as ODSP\nabstract class BaseMockBlobStorage\n\timplements Pick<IDocumentStorageService, \"readBlob\" | \"createBlob\">\n{\n\tpublic blobs: Map<string, ArrayBufferLike> = new Map();\n\tpublic abstract createBlob(blob: ArrayBufferLike);\n\tpublic async readBlob(id: string) {\n\t\tconst blob = this.blobs.get(id);\n\t\tassert(!!blob);\n\t\treturn blob;\n\t}\n}\n\nclass DedupeStorage extends BaseMockBlobStorage {\n\tpublic minTTL: number = MIN_TTL;\n\n\tpublic async createBlob(blob: ArrayBufferLike) {\n\t\tconst s = bufferToString(blob, \"base64\");\n\t\tconst id = await gitHashFile(IsoBuffer.from(s, \"base64\"));\n\t\tthis.blobs.set(id, blob);\n\t\treturn { id, minTTLInSeconds: this.minTTL };\n\t}\n}\n\nclass NonDedupeStorage extends BaseMockBlobStorage {\n\tpublic async createBlob(blob: ArrayBufferLike) {\n\t\tconst id = this.blobs.size.toString();\n\t\tthis.blobs.set(id, blob);\n\t\treturn { id, minTTLInSeconds: MIN_TTL };\n\t}\n}\n\nexport class MockRuntime\n\textends TypedEventEmitter<IContainerRuntimeEvents>\n\timplements IBlobManagerRuntime\n{\n\tpublic readonly clientDetails: IClientDetails = { capabilities: { interactive: true } };\n\tconstructor(\n\t\tpublic mc: MonitoringContext,\n\t\tsnapshot: IBlobManagerLoadInfo = {},\n\t\tattached = false,\n\t\tstashed: any[] = [[], {}],\n\t) {\n\t\tsuper();\n\t\tthis.attachState = attached ? AttachState.Attached : AttachState.Detached;\n\t\tthis.ops = stashed[0];\n\t\tthis.blobManager = new BlobManager(\n\t\t\tundefined as any, // routeContext\n\t\t\tsnapshot,\n\t\t\t() => this.getStorage(),\n\t\t\t(localId: string, blobId?: string) => this.sendBlobAttachOp(localId, blobId),\n\t\t\t() => undefined,\n\t\t\t(blobPath: string) => this.isBlobDeleted(blobPath),\n\t\t\tthis,\n\t\t\tstashed[1],\n\t\t\t() => (this.closed = true),\n\t\t);\n\t}\n\n\tpublic get storage() {\n\t\treturn (this.attachState === AttachState.Detached\n\t\t\t? this.detachedStorage\n\t\t\t: this.attachedStorage) as unknown as IDocumentStorageService;\n\t}\n\n\tprivate processing = false;\n\tpublic unprocessedBlobs = new Set();\n\n\tpublic getStorage() {\n\t\treturn {\n\t\t\tcreateBlob: async (blob) => {\n\t\t\t\tif (this.processing) {\n\t\t\t\t\treturn this.storage.createBlob(blob);\n\t\t\t\t}\n\t\t\t\tconst P = this.processBlobsP.promise.then(async () => {\n\t\t\t\t\tif (!this.connected && this.attachState === AttachState.Attached) {\n\t\t\t\t\t\tthis.unprocessedBlobs.delete(blob);\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"fake error due to having no connection to storage service\",\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.unprocessedBlobs.delete(blob);\n\t\t\t\t\t\treturn this.storage.createBlob(blob);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tthis.unprocessedBlobs.add(blob);\n\t\t\t\tthis.emit(\"blob\");\n\t\t\t\tthis.blobPs.push(P);\n\t\t\t\treturn P;\n\t\t\t},\n\t\t\treadBlob: async (id) => this.storage.readBlob(id),\n\t\t} as unknown as IDocumentStorageService;\n\t}\n\n\tpublic sendBlobAttachOp(localId: string, blobId?: string) {\n\t\tthis.ops.push({ metadata: { localId, blobId } });\n\t}\n\n\tpublic async createBlob(\n\t\tblob: ArrayBufferLike,\n\t\tsignal?: AbortSignal,\n\t): Promise<IFluidHandle<ArrayBufferLike>> {\n\t\tconst P = this.blobManager.createBlob(blob, signal);\n\t\tthis.handlePs.push(P);\n\t\treturn P;\n\t}\n\n\tpublic async getBlob(blobHandle: IFluidHandle<ArrayBufferLike>) {\n\t\tconst pathParts = blobHandle.absolutePath.split(\"/\");\n\t\tconst blobId = pathParts[2];\n\t\treturn this.blobManager.getBlob(blobId);\n\t}\n\n\tpublic async getPendingLocalState() {\n\t\tconst pendingBlobs = await this.blobManager.attachAndGetPendingBlobs();\n\t\treturn [[...this.ops], pendingBlobs];\n\t}\n\n\tpublic blobManager: BlobManager;\n\tpublic connected = false;\n\tpublic closed = false;\n\tpublic attachState: AttachState;\n\tpublic attachedStorage = new DedupeStorage();\n\tpublic detachedStorage = new NonDedupeStorage();\n\tpublic logger = this.mc.logger;\n\n\tprivate ops: any[] = [];\n\tprivate processBlobsP = new Deferred<void>();\n\tprivate blobPs: Promise<any>[] = [];\n\tprivate handlePs: Promise<any>[] = [];\n\tprivate readonly deletedBlobs: string[] = [];\n\n\tpublic processOps() {\n\t\tassert(this.connected || this.ops.length === 0);\n\t\tthis.ops.forEach((op) => this.blobManager.processBlobAttachOp(op, true));\n\t\tthis.ops = [];\n\t}\n\n\tpublic async processBlobs(\n\t\tresolve: boolean,\n\t\tcanRetry: boolean = false,\n\t\tretryAfterSeconds?: number,\n\t) {\n\t\tconst blobPs = this.blobPs;\n\t\tthis.blobPs = [];\n\t\tif (resolve) {\n\t\t\tthis.processBlobsP.resolve();\n\t\t} else {\n\t\t\tthis.processBlobsP.reject(\n\t\t\t\tnew LoggingError(\"fake driver error\", { canRetry, retryAfterSeconds }),\n\t\t\t);\n\t\t}\n\t\tthis.processBlobsP = new Deferred<void>();\n\t\tawait Promise.allSettled(blobPs).catch(() => {});\n\t}\n\n\tpublic async processHandles() {\n\t\tconst handlePs = this.handlePs;\n\t\tthis.handlePs = [];\n\t\tconst handles: IFluidHandle<ArrayBufferLike>[] = await Promise.all(handlePs);\n\t\thandles.forEach((handle) => handle.attachGraph());\n\t}\n\n\tpublic async processAll() {\n\t\twhile (this.blobPs.length + this.handlePs.length + this.ops.length > 0) {\n\t\t\tconst p1 = this.processBlobs(true);\n\t\t\tconst p2 = this.processHandles();\n\t\t\tthis.processOps();\n\t\t\tawait Promise.race([p1, p2]);\n\t\t\tthis.processOps();\n\t\t\tawait Promise.all([p1, p2]);\n\t\t}\n\t}\n\n\tpublic async attach() {\n\t\tif (this.detachedStorage.blobs.size > 0) {\n\t\t\tconst table = new Map();\n\t\t\tfor (const [detachedId, blob] of this.detachedStorage.blobs) {\n\t\t\t\tconst { id } = await this.attachedStorage.createBlob(blob);\n\t\t\t\ttable.set(detachedId, id);\n\t\t\t}\n\t\t\tthis.detachedStorage.blobs.clear();\n\t\t\tthis.blobManager.setRedirectTable(table);\n\t\t}\n\t\tconst summary = validateSummary(this);\n\t\tthis.attachState = AttachState.Attached;\n\t\tthis.emit(\"attached\");\n\t\treturn summary;\n\t}\n\n\tpublic async connect(delay = 0, processStashedWithRetry?: boolean) {\n\t\tassert(!this.connected);\n\t\tawait new Promise<void>((resolve) => setTimeout(resolve, delay));\n\t\tthis.connected = true;\n\t\tthis.emit(\"connected\", \"client ID\");\n\t\tawait this.processStashed(processStashedWithRetry);\n\t\tconst ops = this.ops;\n\t\tthis.ops = [];\n\t\tops.forEach((op) => this.blobManager.reSubmit(op.metadata));\n\t}\n\n\tpublic async processStashed(processStashedWithRetry?: boolean) {\n\t\tconst uploadP = this.blobManager.processStashedChanges();\n\t\tthis.processing = true;\n\t\tif (processStashedWithRetry) {\n\t\t\tawait this.processBlobs(false, false, 0);\n\t\t\t// wait till next retry\n\t\t\tawait new Promise<void>((resolve) => setTimeout(resolve, 1));\n\t\t\t// try again successfully\n\t\t\tawait this.processBlobs(true);\n\t\t} else {\n\t\t\tawait this.processBlobs(true);\n\t\t}\n\t\tawait uploadP;\n\t\tthis.processing = false;\n\t}\n\n\tpublic disconnect() {\n\t\tassert(this.connected);\n\t\tthis.connected = false;\n\t\tthis.emit(\"disconnected\");\n\t}\n\n\tpublic async remoteUpload(blob: ArrayBufferLike) {\n\t\tconst response = await this.storage.createBlob(blob);\n\t\tconst op = { metadata: { localId: uuid(), blobId: response.id } };\n\t\tthis.blobManager.processBlobAttachOp(op as ISequencedDocumentMessage, false);\n\t\treturn op;\n\t}\n\n\tpublic deleteBlob(blobHandle: IFluidHandle<ArrayBufferLike>) {\n\t\tthis.deletedBlobs.push(blobHandle.absolutePath);\n\t}\n\n\tpublic isBlobDeleted(blobPath: string): boolean {\n\t\treturn this.deletedBlobs.includes(blobPath);\n\t}\n}\n\nexport const validateSummary = (runtime: MockRuntime) => {\n\tconst summary = runtime.blobManager.summarize();\n\tconst ids: any[] = [];\n\tlet redirectTable;\n\tfor (const [key, attachment] of Object.entries(summary.summary.tree)) {\n\t\tif (attachment.type === SummaryType.Attachment) {\n\t\t\tids.push(attachment.id);\n\t\t} else {\n\t\t\tassert.strictEqual(key, (BlobManager as any).redirectTableBlobName);\n\t\t\tassert(attachment.type === SummaryType.Blob);\n\t\t\tassert(typeof attachment.content === \"string\");\n\t\t\tredirectTable = new Map(JSON.parse(attachment.content));\n\t\t}\n\t}\n\treturn { ids, redirectTable };\n};\n\ndescribe(\"BlobManager\", () => {\n\tconst handlePs: Promise<IFluidHandle<ArrayBufferLike>>[] = [];\n\tlet runtime: MockRuntime;\n\tlet createBlob: (blob: ArrayBufferLike, signal?: AbortSignal) => Promise<void>;\n\tlet waitForBlob: (blob: ArrayBufferLike) => Promise<void>;\n\tlet mc: MonitoringContext;\n\tlet injectedSettings: Record<string, ConfigTypes> = {};\n\n\tbeforeEach(() => {\n\t\tconst configProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => ({\n\t\t\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n\t\t});\n\t\tmc = mixinMonitoringContext(createChildLogger(), configProvider(injectedSettings));\n\t\truntime = new MockRuntime(mc);\n\t\thandlePs.length = 0;\n\n\t\t// ensures this blob will be processed next time runtime.processBlobs() is called\n\t\twaitForBlob = async (blob) => {\n\t\t\tif (!runtime.unprocessedBlobs.has(blob)) {\n\t\t\t\tawait new Promise<void>((resolve) =>\n\t\t\t\t\truntime.on(\"blob\", () => {\n\t\t\t\t\t\tif (!runtime.unprocessedBlobs.has(blob)) {\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\n\t\t// create blob and await the handle after the test\n\t\tcreateBlob = async (blob: ArrayBufferLike, signal?: AbortSignal) => {\n\t\t\tconst handleP = runtime.createBlob(blob, signal);\n\t\t\thandlePs.push(handleP);\n\t\t\tawait waitForBlob(blob);\n\t\t};\n\n\t\tconst onNoPendingBlobs = () => {\n\t\t\tassert((runtime.blobManager as any).pendingBlobs.size === 0);\n\t\t};\n\n\t\truntime.blobManager.on(\"noPendingBlobs\", () => onNoPendingBlobs());\n\t});\n\n\tafterEach(async () => {\n\t\tassert((runtime.blobManager as any).pendingBlobs.size === 0);\n\t\tinjectedSettings = {};\n\t});\n\n\tit(\"empty snapshot\", () => {\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\t});\n\n\tit(\"non empty snapshot\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processAll();\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 1);\n\t\tassert.strictEqual(summaryData.redirectTable.size, 1);\n\t});\n\n\tit(\"hasPendingBlobs\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\n\t\tassert.strictEqual(runtime.blobManager.hasPendingBlobs, false);\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait createBlob(IsoBuffer.from(\"blob2\", \"utf8\"));\n\t\tassert.strictEqual(runtime.blobManager.hasPendingBlobs, true);\n\t\tawait runtime.processAll();\n\t\tassert.strictEqual(runtime.blobManager.hasPendingBlobs, false);\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 2);\n\t\tassert.strictEqual(summaryData.redirectTable.size, 2);\n\t});\n\n\tit(\"NoPendingBlobs count\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\tlet count = 0;\n\t\truntime.blobManager.on(\"noPendingBlobs\", () => count++);\n\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processAll();\n\t\tassert.strictEqual(count, 1);\n\t\tawait createBlob(IsoBuffer.from(\"blob2\", \"utf8\"));\n\t\tawait createBlob(IsoBuffer.from(\"blob3\", \"utf8\"));\n\t\tawait runtime.processAll();\n\t\tassert.strictEqual(count, 2);\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 3);\n\t\tassert.strictEqual(summaryData.redirectTable.size, 3);\n\t});\n\n\tit(\"detached snapshot\", async () => {\n\t\tassert.strictEqual(runtime.blobManager.hasPendingBlobs, false);\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processAll();\n\t\tassert.strictEqual(runtime.blobManager.hasPendingBlobs, true);\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 1);\n\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\t});\n\n\tit(\"detached->attached snapshot\", async () => {\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processAll();\n\t\tassert.strictEqual(runtime.blobManager.hasPendingBlobs, true);\n\t\tawait runtime.attach();\n\t\tassert.strictEqual(runtime.blobManager.hasPendingBlobs, false);\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 1);\n\t\tassert.strictEqual(summaryData.redirectTable.size, 1);\n\t});\n\n\tit(\"uploads while disconnected\", async () => {\n\t\tawait runtime.attach();\n\t\tconst handleP = runtime.createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.connect();\n\t\tawait runtime.processAll();\n\t\tawait assert.doesNotReject(handleP);\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 1);\n\t\tassert.strictEqual(summaryData.redirectTable.size, 1);\n\t});\n\n\tit(\"close container if blob expired\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\truntime.attachedStorage.minTTL = 0.001; // force expired TTL being less than connection time (50ms)\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processBlobs(true);\n\t\truntime.disconnect();\n\t\tawait new Promise<void>((resolve) => setTimeout(resolve, 50));\n\t\tawait runtime.connect();\n\t\tassert.strictEqual(runtime.closed, true);\n\t\tawait runtime.processAll();\n\t});\n\n\tit(\"completes after disconnection while upload pending\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\n\t\tconst handleP = runtime.createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\truntime.disconnect();\n\t\tawait runtime.connect(10); // adding some delay to reconnection\n\t\tawait runtime.processAll();\n\t\tawait assert.doesNotReject(handleP);\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 1);\n\t\tassert.strictEqual(summaryData.redirectTable.size, 1);\n\t});\n\n\tit(\"upload fails gracefully\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\n\t\tconst handleP = runtime.createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processBlobs(false);\n\t\truntime.processOps();\n\t\ttry {\n\t\t\tawait handleP;\n\t\t\tassert.fail(\"should fail\");\n\t\t} catch (error: any) {\n\t\t\tassert.strictEqual(error.message, \"fake driver error\");\n\t\t}\n\t\tawait assert.rejects(handleP);\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\t});\n\n\tit.skip(\"upload fails and retries for retriable errors\", async () => {\n\t\t// Needs to use some sort of fake timer or write test in a different way as it is waiting\n\t\t// for actual time which is causing timeouts.\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\tconst handleP = runtime.createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processBlobs(false, true, 0);\n\t\t// wait till next retry\n\t\tawait new Promise<void>((resolve) => setTimeout(resolve, 1));\n\t\t// try again successfully\n\t\tawait runtime.processBlobs(true);\n\t\truntime.processOps();\n\t\tawait runtime.processHandles();\n\t\tassert(handleP);\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 1);\n\t\tassert.strictEqual(summaryData.redirectTable.size, 1);\n\t});\n\n\tit(\"completes after disconnection while op in flight\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processBlobs(true);\n\n\t\truntime.disconnect();\n\t\tawait runtime.connect();\n\t\tawait runtime.processAll();\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 1);\n\t\tassert.strictEqual(summaryData.redirectTable.size, 2);\n\t});\n\n\tit(\"multiple disconnect/connects\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\n\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\tconst handleP = runtime.createBlob(blob);\n\t\truntime.disconnect();\n\t\tawait runtime.connect(10);\n\n\t\tconst blob2 = IsoBuffer.from(\"blob2\", \"utf8\");\n\t\tconst handleP2 = runtime.createBlob(blob2);\n\t\truntime.disconnect();\n\n\t\tawait runtime.connect(10);\n\t\tawait runtime.processAll();\n\t\tawait assert.doesNotReject(handleP);\n\t\tawait assert.doesNotReject(handleP2);\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 2);\n\t\tassert.strictEqual(summaryData.redirectTable.size, 2);\n\t});\n\n\tit(\"handles deduped IDs\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\truntime.disconnect();\n\t\tawait runtime.connect();\n\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processBlobs(true);\n\n\t\truntime.disconnect();\n\t\tawait runtime.connect();\n\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processAll();\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 1);\n\t\tassert.strictEqual(summaryData.redirectTable.size, 6);\n\t});\n\n\tit(\"handles deduped IDs in detached\", async () => {\n\t\truntime.detachedStorage = new DedupeStorage();\n\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processAll();\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 1);\n\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\t});\n\n\tit(\"handles deduped IDs in detached->attached\", async () => {\n\t\truntime.detachedStorage = new DedupeStorage();\n\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processAll();\n\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\n\t\truntime.disconnect();\n\t\tawait runtime.connect();\n\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\n\t\tawait runtime.processAll();\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 1);\n\t\tassert.strictEqual(summaryData.redirectTable.size, 4);\n\t});\n\n\tit(\"can load from summary\", async () => {\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processAll();\n\n\t\tawait runtime.attach();\n\t\tconst handle = runtime.createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.connect();\n\n\t\tawait runtime.processAll();\n\t\tawait assert.doesNotReject(handle);\n\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processAll();\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 1);\n\t\tassert.strictEqual(summaryData.redirectTable.size, 3);\n\n\t\tconst runtime2 = new MockRuntime(mc, summaryData, true);\n\t\tconst summaryData2 = validateSummary(runtime2);\n\t\tassert.strictEqual(summaryData2.ids.length, 1);\n\t\tassert.strictEqual(summaryData2.redirectTable.size, 3);\n\t});\n\n\tit(\"handles duplicate remote upload\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.remoteUpload(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processAll();\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 1);\n\t\tassert.strictEqual(summaryData.redirectTable.size, 2);\n\t});\n\n\tit(\"handles duplicate remote upload between upload and op\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processBlobs(true);\n\t\tawait runtime.remoteUpload(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processAll();\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 1);\n\t\tassert.strictEqual(summaryData.redirectTable.size, 2);\n\t});\n\n\tit(\"handles duplicate remote upload with local ID\", async () => {\n\t\tawait runtime.attach();\n\n\t\tawait createBlob(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.connect();\n\t\tawait runtime.processBlobs(true);\n\t\tawait runtime.remoteUpload(IsoBuffer.from(\"blob\", \"utf8\"));\n\t\tawait runtime.processAll();\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 1);\n\t\tassert.strictEqual(summaryData.redirectTable.size, 2);\n\t});\n\n\tit(\"includes blob IDs in summary while attaching\", async () => {\n\t\tawait createBlob(IsoBuffer.from(\"blob1\", \"utf8\"));\n\t\tawait createBlob(IsoBuffer.from(\"blob2\", \"utf8\"));\n\t\tawait createBlob(IsoBuffer.from(\"blob3\", \"utf8\"));\n\t\tawait runtime.processAll();\n\n\t\t// While attaching with blobs, Container takes a summary while still in \"Detached\"\n\t\t// state. BlobManager should know to include the list of attached blob\n\t\t// IDs since this summary will be used to create the document\n\t\tconst summaryData = await runtime.attach();\n\t\tassert.strictEqual(summaryData?.ids.length, 3);\n\t\tassert.strictEqual(summaryData?.redirectTable.size, 3);\n\t});\n\n\tit(\"all blobs attached\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\tassert.strictEqual(runtime.blobManager.allBlobsAttached, true);\n\t\tawait createBlob(IsoBuffer.from(\"blob1\", \"utf8\"));\n\t\tassert.strictEqual(runtime.blobManager.allBlobsAttached, false);\n\t\tawait runtime.processBlobs(true);\n\t\tassert.strictEqual(runtime.blobManager.allBlobsAttached, false);\n\t\tawait runtime.processAll();\n\t\tassert.strictEqual(runtime.blobManager.allBlobsAttached, true);\n\t\tawait createBlob(IsoBuffer.from(\"blob1\", \"utf8\"));\n\t\tawait createBlob(IsoBuffer.from(\"blob2\", \"utf8\"));\n\t\tawait createBlob(IsoBuffer.from(\"blob3\", \"utf8\"));\n\t\tassert.strictEqual(runtime.blobManager.allBlobsAttached, false);\n\t\tawait runtime.processAll();\n\t\tassert.strictEqual(runtime.blobManager.allBlobsAttached, true);\n\t});\n\n\tdescribe(\"Abort Signal\", () => {\n\t\tit(\"abort before upload\", async () => {\n\t\t\tawait runtime.attach();\n\t\t\tawait runtime.connect();\n\t\t\tconst ac = new AbortController();\n\t\t\tac.abort(\"abort test\");\n\t\t\ttry {\n\t\t\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\t\t\tawait runtime.createBlob(blob, ac.signal);\n\t\t\t\tassert.fail(\"Should not succeed\");\n\t\t\t} catch (error: any) {\n\t\t\t\tassert.strictEqual(error.status, undefined);\n\t\t\t\tassert.strictEqual(error.uploadTime, undefined);\n\t\t\t\tassert.strictEqual(error.acked, undefined);\n\t\t\t\tassert.strictEqual(error.message, \"uploadBlob aborted\");\n\t\t\t}\n\t\t\tconst summaryData = validateSummary(runtime);\n\t\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\t\t});\n\n\t\tit(\"abort while upload\", async () => {\n\t\t\tawait runtime.attach();\n\t\t\tawait runtime.connect();\n\t\t\tconst ac = new AbortController();\n\t\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\t\tconst handleP = runtime.createBlob(blob, ac.signal);\n\t\t\tac.abort(\"abort test\");\n\t\t\tassert.strictEqual(runtime.unprocessedBlobs.size, 1);\n\t\t\tawait runtime.processBlobs(true);\n\t\t\ttry {\n\t\t\t\tawait handleP;\n\t\t\t\tassert.fail(\"Should not succeed\");\n\t\t\t} catch (error: any) {\n\t\t\t\tassert.strictEqual(error.uploadTime, undefined);\n\t\t\t\tassert.strictEqual(error.acked, false);\n\t\t\t\tassert.strictEqual(error.message, \"uploadBlob aborted\");\n\t\t\t}\n\t\t\tassert(handleP);\n\t\t\tawait assert.rejects(handleP);\n\t\t\tconst summaryData = validateSummary(runtime);\n\t\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\t\t});\n\n\t\tit(\"abort while failed upload\", async () => {\n\t\t\tawait runtime.attach();\n\t\t\tawait runtime.connect();\n\t\t\tconst ac = new AbortController();\n\t\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\t\tconst handleP = runtime.createBlob(blob, ac.signal);\n\t\t\tconst handleP2 = runtime.createBlob(IsoBuffer.from(\"blob2\", \"utf8\"));\n\t\t\tac.abort(\"abort test\");\n\t\t\tassert.strictEqual(runtime.unprocessedBlobs.size, 2);\n\t\t\tawait runtime.processBlobs(false);\n\t\t\ttry {\n\t\t\t\tawait handleP;\n\t\t\t\tassert.fail(\"Should not succeed\");\n\t\t\t} catch (error: any) {\n\t\t\t\tassert.strictEqual(error.message, \"uploadBlob aborted\");\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait handleP2;\n\t\t\t\tassert.fail(\"Should not succeed\");\n\t\t\t} catch (error: any) {\n\t\t\t\tassert.strictEqual(error.message, \"fake driver error\");\n\t\t\t}\n\t\t\tawait assert.rejects(handleP);\n\t\t\tawait assert.rejects(handleP2);\n\t\t\tconst summaryData = validateSummary(runtime);\n\t\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\t\t});\n\n\t\tit(\"abort while disconnected\", async () => {\n\t\t\tawait runtime.attach();\n\t\t\tawait runtime.connect();\n\t\t\tconst ac = new AbortController();\n\t\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\t\tconst handleP = runtime.createBlob(blob, ac.signal);\n\t\t\truntime.disconnect();\n\t\t\tac.abort();\n\t\t\tawait runtime.processBlobs(true);\n\t\t\ttry {\n\t\t\t\tawait handleP;\n\t\t\t\tassert.fail(\"Should not succeed\");\n\t\t\t} catch (error: any) {\n\t\t\t\tassert.strictEqual(error.message, \"uploadBlob aborted\");\n\t\t\t}\n\t\t\tawait assert.rejects(handleP);\n\t\t\tconst summaryData = validateSummary(runtime);\n\t\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\t\t});\n\n\t\tit(\"abort after blob suceeds\", async () => {\n\t\t\tawait runtime.attach();\n\t\t\tawait runtime.connect();\n\t\t\tconst ac = new AbortController();\n\t\t\tlet handleP;\n\t\t\ttry {\n\t\t\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\t\t\thandleP = runtime.createBlob(blob, ac.signal);\n\t\t\t\tawait runtime.processAll();\n\t\t\t\tac.abort();\n\t\t\t} catch (error: any) {\n\t\t\t\tassert.fail(\"abort after processing should not throw\");\n\t\t\t}\n\t\t\tassert(handleP);\n\t\t\tawait assert.doesNotReject(handleP);\n\t\t\tconst summaryData = validateSummary(runtime);\n\t\t\tassert.strictEqual(summaryData.ids.length, 1);\n\t\t\tassert.strictEqual(summaryData.redirectTable.size, 1);\n\t\t});\n\n\t\tit(\"abort while waiting for op\", async () => {\n\t\t\tawait runtime.attach();\n\t\t\tawait runtime.connect();\n\t\t\tconst ac = new AbortController();\n\t\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\t\tconst handleP = runtime.createBlob(blob, ac.signal);\n\t\t\tconst p1 = runtime.processBlobs(true);\n\t\t\tconst p2 = runtime.processHandles();\n\t\t\t// finish upload\n\t\t\tawait Promise.race([p1, p2]);\n\t\t\tac.abort();\n\t\t\truntime.processOps();\n\t\t\ttry {\n\t\t\t\t// finish op\n\t\t\t\tawait handleP;\n\t\t\t\tassert.fail(\"Should not succeed\");\n\t\t\t} catch (error: any) {\n\t\t\t\tassert.strictEqual(error.message, \"uploadBlob aborted\");\n\t\t\t\tassert.ok(error.uploadTime);\n\t\t\t\tassert.strictEqual(error.acked, false);\n\t\t\t}\n\t\t\tawait assert.rejects(handleP);\n\t\t\tconst summaryData = validateSummary(runtime);\n\t\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\t\t});\n\n\t\tit(\"resubmit on aborted pending op\", async () => {\n\t\t\tawait runtime.attach();\n\t\t\tawait runtime.connect();\n\t\t\tconst ac = new AbortController();\n\t\t\tlet handleP;\n\t\t\ttry {\n\t\t\t\thandleP = runtime.createBlob(IsoBuffer.from(\"blob\", \"utf8\"), ac.signal);\n\t\t\t\tconst p1 = runtime.processBlobs(true);\n\t\t\t\tconst p2 = runtime.processHandles();\n\t\t\t\t// finish upload\n\t\t\t\tawait Promise.race([p1, p2]);\n\t\t\t\truntime.disconnect();\n\t\t\t\tac.abort();\n\t\t\t\tawait handleP;\n\t\t\t\tassert.fail(\"Should not succeed\");\n\t\t\t} catch (error: any) {\n\t\t\t\tassert.strictEqual(error.message, \"uploadBlob aborted\");\n\t\t\t\tassert.ok(error.uploadTime);\n\t\t\t\tassert.strictEqual(error.acked, false);\n\t\t\t}\n\t\t\tawait runtime.connect();\n\t\t\truntime.processOps();\n\t\t\tawait assert.rejects(handleP);\n\t\t\tconst summaryData = validateSummary(runtime);\n\t\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\t\t});\n\t});\n\n\tdescribe(\"Garbage Collection\", () => {\n\t\tlet redirectTable: Map<string, string | undefined>;\n\n\t\t/** Creates a blob with the given content and returns its local and storage id. */\n\t\tasync function createBlobAndGetIds(content: string) {\n\t\t\t// For a given blob's GC node id, returns the blob id.\n\t\t\tconst getBlobIdFromGCNodeId = (gcNodeId: string) => {\n\t\t\t\tconst pathParts = gcNodeId.split(\"/\");\n\t\t\t\tassert(\n\t\t\t\t\tpathParts.length === 3 && pathParts[1] === BlobManager.basePath,\n\t\t\t\t\t\"Invalid blob node path\",\n\t\t\t\t);\n\t\t\t\treturn pathParts[2];\n\t\t\t};\n\n\t\t\t// For a given blob's id, returns the GC node id.\n\t\t\tconst getGCNodeIdFromBlobId = (blobId: string) => {\n\t\t\t\treturn `/${BlobManager.basePath}/${blobId}`;\n\t\t\t};\n\n\t\t\tconst blobContents = IsoBuffer.from(content, \"utf8\");\n\t\t\tconst handleP = runtime.createBlob(blobContents);\n\t\t\tawait runtime.processAll();\n\n\t\t\tconst blobHandle = await handleP;\n\t\t\tconst localId = getBlobIdFromGCNodeId(blobHandle.absolutePath);\n\t\t\tassert(redirectTable.has(localId), \"blob not found in redirect table\");\n\t\t\tconst storageId = redirectTable.get(localId);\n\t\t\tassert(storageId !== undefined, \"storage id not found in redirect table\");\n\t\t\treturn {\n\t\t\t\tlocalId,\n\t\t\t\tlocalGCNodeId: getGCNodeIdFromBlobId(localId),\n\t\t\t\tstorageId,\n\t\t\t\tstorageGCNodeId: getGCNodeIdFromBlobId(storageId),\n\t\t\t};\n\t\t}\n\n\t\tbeforeEach(() => {\n\t\t\tredirectTable = (runtime.blobManager as any).redirectTable;\n\t\t});\n\n\t\tit(\"fetching deleted blob fails\", async () => {\n\t\t\tawait runtime.attach();\n\t\t\tawait runtime.connect();\n\t\t\tconst blob1Contents = IsoBuffer.from(\"blob1\", \"utf8\");\n\t\t\tconst blob2Contents = IsoBuffer.from(\"blob2\", \"utf8\");\n\t\t\tconst handle1P = runtime.createBlob(blob1Contents);\n\t\t\tconst handle2P = runtime.createBlob(blob2Contents);\n\t\t\tawait runtime.processAll();\n\n\t\t\tconst blob1Handle = await handle1P;\n\t\t\tconst blob2Handle = await handle2P;\n\n\t\t\t// Validate that the blobs can be retrieved.\n\t\t\tassert.strictEqual(await runtime.getBlob(blob1Handle), blob1Contents);\n\t\t\tassert.strictEqual(await runtime.getBlob(blob2Handle), blob2Contents);\n\n\t\t\t// Delete blob1. Retrieving it should result in an error.\n\t\t\truntime.deleteBlob(blob1Handle);\n\t\t\tawait assert.rejects(\n\t\t\t\tasync () => runtime.getBlob(blob1Handle),\n\t\t\t\t(error: IErrorBase & { code: number | undefined }) => {\n\t\t\t\t\tconst blob1Id = blob1Handle.absolutePath.split(\"/\")[2];\n\t\t\t\t\tconst correctErrorType = error.code === 404;\n\t\t\t\t\tconst correctErrorMessage = error.message === `Blob was deleted: ${blob1Id}`;\n\t\t\t\t\treturn correctErrorType && correctErrorMessage;\n\t\t\t\t},\n\t\t\t\t\"Deleted blob2 fetch should have failed\",\n\t\t\t);\n\n\t\t\t// Delete blob2. Retrieving it should result in an error.\n\t\t\truntime.deleteBlob(blob2Handle);\n\t\t\tawait assert.rejects(\n\t\t\t\tasync () => runtime.getBlob(blob2Handle),\n\t\t\t\t(error: IErrorBase & { code: number | undefined }) => {\n\t\t\t\t\tconst blob2Id = blob2Handle.absolutePath.split(\"/\")[2];\n\t\t\t\t\tconst correctErrorType = error.code === 404;\n\t\t\t\t\tconst correctErrorMessage = error.message === `Blob was deleted: ${blob2Id}`;\n\t\t\t\t\treturn correctErrorType && correctErrorMessage;\n\t\t\t\t},\n\t\t\t\t\"Deleted blob2 fetch should have failed\",\n\t\t\t);\n\t\t});\n\n\t\t// Support for this config has been removed.\n\t\tconst legacyKey_disableAttachmentBlobSweep =\n\t\t\t\"Fluid.GarbageCollection.DisableAttachmentBlobSweep\";\n\t\t[true, undefined].forEach((disableAttachmentBlobsSweep) =>\n\t\t\tit(`deletes unused blobs regardless of DisableAttachmentBlobsSweep setting [DisableAttachmentBlobsSweep=${disableAttachmentBlobsSweep}]`, async () => {\n\t\t\t\tinjectedSettings[legacyKey_disableAttachmentBlobSweep] =\n\t\t\t\t\tdisableAttachmentBlobsSweep;\n\n\t\t\t\tawait runtime.attach();\n\t\t\t\tawait runtime.connect();\n\n\t\t\t\tconst blob1 = await createBlobAndGetIds(\"blob1\");\n\t\t\t\tconst blob2 = await createBlobAndGetIds(\"blob2\");\n\n\t\t\t\t// Delete blob1's local id. The local id and the storage id should both be deleted from the redirect table\n\t\t\t\t// since the blob only had one reference.\n\t\t\t\truntime.blobManager.deleteSweepReadyNodes([blob1.localGCNodeId]);\n\t\t\t\tassert(!redirectTable.has(blob1.localId));\n\t\t\t\tassert(!redirectTable.has(blob1.storageId));\n\n\t\t\t\t// Delete blob2's local id. The local id and the storage id should both be deleted from the redirect table\n\t\t\t\t// since the blob only had one reference.\n\t\t\t\truntime.blobManager.deleteSweepReadyNodes([blob2.localGCNodeId]);\n\t\t\t\tassert(!redirectTable.has(blob2.localId));\n\t\t\t\tassert(!redirectTable.has(blob2.storageId));\n\t\t\t}),\n\t\t);\n\n\t\tit(\"deletes unused de-duped blobs\", async () => {\n\t\t\tawait runtime.attach();\n\t\t\tawait runtime.connect();\n\n\t\t\t// Create 2 blobs with the same content. They should get de-duped.\n\t\t\tconst blob1 = await createBlobAndGetIds(\"blob1\");\n\t\t\tconst blob1Duplicate = await createBlobAndGetIds(\"blob1\");\n\t\t\tassert(blob1.storageId === blob1Duplicate.storageId, \"blob1 not de-duped\");\n\n\t\t\t// Create another 2 blobs with the same content. They should get de-duped.\n\t\t\tconst blob2 = await createBlobAndGetIds(\"blob2\");\n\t\t\tconst blob2Duplicate = await createBlobAndGetIds(\"blob2\");\n\t\t\tassert(blob2.storageId === blob2Duplicate.storageId, \"blob2 not de-duped\");\n\n\t\t\t// Delete blob1's local id. The local id should both be deleted from the redirect table but the storage id\n\t\t\t// should not because the blob has another referenced from the de-duped blob.\n\t\t\truntime.blobManager.deleteSweepReadyNodes([blob1.localGCNodeId]);\n\t\t\tassert(!redirectTable.has(blob1.localId), \"blob1 localId should have been deleted\");\n\t\t\tassert(\n\t\t\t\tredirectTable.has(blob1.storageId),\n\t\t\t\t\"blob1 storageId should not have been deleted\",\n\t\t\t);\n\t\t\t// Delete blob1's de-duped local id. The local id and the storage id should both be deleted from the redirect table\n\t\t\t// since all the references for the blob are now deleted.\n\t\t\truntime.blobManager.deleteSweepReadyNodes([blob1Duplicate.localGCNodeId]);\n\t\t\tassert(\n\t\t\t\t!redirectTable.has(blob1Duplicate.localId),\n\t\t\t\t\"blob1Duplicate localId should have been deleted\",\n\t\t\t);\n\t\t\tassert(!redirectTable.has(blob1.storageId), \"blob1 storageId should have been deleted\");\n\n\t\t\t// Delete blob2's local id. The local id should both be deleted from the redirect table but the storage id\n\t\t\t// should not because the blob has another referenced from the de-duped blob.\n\t\t\truntime.blobManager.deleteSweepReadyNodes([blob2.localGCNodeId]);\n\t\t\tassert(!redirectTable.has(blob2.localId), \"blob2 localId should have been deleted\");\n\t\t\tassert(\n\t\t\t\tredirectTable.has(blob2.storageId),\n\t\t\t\t\"blob2 storageId should not have been deleted\",\n\t\t\t);\n\t\t\t// Delete blob2's de-duped local id. The local id and the storage id should both be deleted from the redirect table\n\t\t\t// since all the references for the blob are now deleted.\n\t\t\truntime.blobManager.deleteSweepReadyNodes([blob2Duplicate.localGCNodeId]);\n\t\t\tassert(\n\t\t\t\t!redirectTable.has(blob2Duplicate.localId),\n\t\t\t\t\"blob2Duplicate localId should have been deleted\",\n\t\t\t);\n\t\t\tassert(!redirectTable.has(blob2.storageId), \"blob2 storageId should have been deleted\");\n\t\t});\n\t});\n});\n"]}
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { strict as assert } from "assert";
|
|
6
|
-
import { channelsTreeName } from "@fluidframework/runtime-definitions";
|
|
7
|
-
import { detectOutboundReferences, getSummaryForDatastores } from "../channelCollection.js";
|
|
8
|
-
import { nonDataStorePaths } from "../summary/index.js";
|
|
9
|
-
describe("Runtime", () => {
|
|
10
|
-
describe("Container Runtime", () => {
|
|
11
|
-
describe("getSummaryForDatastores", () => {
|
|
12
|
-
const enabledMetadata = {
|
|
13
|
-
summaryFormatVersion: 1,
|
|
14
|
-
message: undefined,
|
|
15
|
-
};
|
|
16
|
-
const disabledMetadata = {
|
|
17
|
-
summaryFormatVersion: 1,
|
|
18
|
-
disableIsolatedChannels: true,
|
|
19
|
-
message: undefined,
|
|
20
|
-
};
|
|
21
|
-
const emptyTree = (id) => ({
|
|
22
|
-
id,
|
|
23
|
-
blobs: {},
|
|
24
|
-
trees: {},
|
|
25
|
-
});
|
|
26
|
-
const testSnapshot = {
|
|
27
|
-
id: "root-id",
|
|
28
|
-
blobs: {},
|
|
29
|
-
trees: {
|
|
30
|
-
[channelsTreeName]: {
|
|
31
|
-
id: "channels-id",
|
|
32
|
-
blobs: {},
|
|
33
|
-
trees: {
|
|
34
|
-
[nonDataStorePaths[0]]: emptyTree("lower-non-datastore-1"),
|
|
35
|
-
"some-datastore": emptyTree("lower-datastore-1"),
|
|
36
|
-
[nonDataStorePaths[1]]: emptyTree("lower-non-datastore-2"),
|
|
37
|
-
"another-datastore": emptyTree("lower-datastore-2"),
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
[nonDataStorePaths[0]]: emptyTree("top-non-datastore-1"),
|
|
41
|
-
"some-datastore": emptyTree("top-datastore-1"),
|
|
42
|
-
[nonDataStorePaths[1]]: emptyTree("top-non-datastore-2"),
|
|
43
|
-
"another-datastore": emptyTree("top-datastore-2"),
|
|
44
|
-
},
|
|
45
|
-
};
|
|
46
|
-
it("Should return undefined for undefined snapshots", () => {
|
|
47
|
-
let snapshot = getSummaryForDatastores(undefined, undefined);
|
|
48
|
-
assert(snapshot === undefined);
|
|
49
|
-
snapshot = getSummaryForDatastores(undefined, enabledMetadata);
|
|
50
|
-
assert(snapshot === undefined);
|
|
51
|
-
snapshot = getSummaryForDatastores(undefined, disabledMetadata);
|
|
52
|
-
assert(snapshot === undefined);
|
|
53
|
-
snapshot = getSummaryForDatastores(null, undefined);
|
|
54
|
-
assert(snapshot === undefined);
|
|
55
|
-
snapshot = getSummaryForDatastores(null, enabledMetadata);
|
|
56
|
-
assert(snapshot === undefined);
|
|
57
|
-
snapshot = getSummaryForDatastores(null, disabledMetadata);
|
|
58
|
-
assert(snapshot === undefined);
|
|
59
|
-
});
|
|
60
|
-
it("Should strip out non-datastore paths for versions < 1", () => {
|
|
61
|
-
const snapshot = getSummaryForDatastores(testSnapshot, undefined);
|
|
62
|
-
assert(snapshot, "Snapshot should be defined");
|
|
63
|
-
assert.strictEqual(snapshot.id, "root-id", "Should be top-level");
|
|
64
|
-
assert.strictEqual(Object.keys(snapshot.trees).length, 3, "Should have 3 datastores");
|
|
65
|
-
assert.strictEqual(snapshot.trees[channelsTreeName]?.id, "channels-id", "Should have channels tree as datastore");
|
|
66
|
-
assert.strictEqual(snapshot.trees["some-datastore"]?.id, "top-datastore-1", "Should have top datastore 1");
|
|
67
|
-
assert.strictEqual(snapshot.trees["another-datastore"]?.id, "top-datastore-2", "Should have top datastore 2");
|
|
68
|
-
});
|
|
69
|
-
it("Should strip out non-datastore paths for disabled isolated channels", () => {
|
|
70
|
-
const snapshot = getSummaryForDatastores(testSnapshot, disabledMetadata);
|
|
71
|
-
assert(snapshot, "Snapshot should be defined");
|
|
72
|
-
assert.strictEqual(snapshot.id, "root-id", "Should be top-level");
|
|
73
|
-
assert.strictEqual(Object.keys(snapshot.trees).length, 3, "Should have 3 datastores");
|
|
74
|
-
assert.strictEqual(snapshot.trees[channelsTreeName]?.id, "channels-id", "Should have channels tree as datastore");
|
|
75
|
-
assert.strictEqual(snapshot.trees["some-datastore"]?.id, "top-datastore-1", "Should have top datastore 1");
|
|
76
|
-
assert.strictEqual(snapshot.trees["another-datastore"]?.id, "top-datastore-2", "Should have top datastore 2");
|
|
77
|
-
});
|
|
78
|
-
it("Should give channels subtree for version 1", () => {
|
|
79
|
-
const snapshot = getSummaryForDatastores(testSnapshot, enabledMetadata);
|
|
80
|
-
assert(snapshot, "Snapshot should be defined");
|
|
81
|
-
assert.strictEqual(snapshot.id, "channels-id", "Should be lower-level");
|
|
82
|
-
assert.strictEqual(Object.keys(snapshot.trees).length, 4, "Should have 4 datastores");
|
|
83
|
-
// Put in variable to avoid type-narrowing bug
|
|
84
|
-
const nonDataStore1 = snapshot.trees[nonDataStorePaths[0]];
|
|
85
|
-
assert.strictEqual(nonDataStore1?.id, "lower-non-datastore-1", "Should have lower non-datastore 1");
|
|
86
|
-
assert.strictEqual(snapshot.trees[nonDataStorePaths[1]]?.id, "lower-non-datastore-2", "Should have lower non-datastore 2");
|
|
87
|
-
assert.strictEqual(snapshot.trees["some-datastore"]?.id, "lower-datastore-1", "Should have lower datastore 1");
|
|
88
|
-
assert.strictEqual(snapshot.trees["another-datastore"]?.id, "lower-datastore-2", "Should have lower datastore 2");
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
describe("detectOutboundReferences", () => {
|
|
92
|
-
it("Can find handles", () => {
|
|
93
|
-
const outboundReferences = [];
|
|
94
|
-
detectOutboundReferences({
|
|
95
|
-
address: "dataStore1",
|
|
96
|
-
contents: {
|
|
97
|
-
address: "dds1",
|
|
98
|
-
someHandle: {
|
|
99
|
-
type: "__fluid_handle__",
|
|
100
|
-
url: "routeA",
|
|
101
|
-
},
|
|
102
|
-
nested: {
|
|
103
|
-
anotherHandle: {
|
|
104
|
-
type: "__fluid_handle__",
|
|
105
|
-
url: "routeB",
|
|
106
|
-
},
|
|
107
|
-
address: "ignored",
|
|
108
|
-
},
|
|
109
|
-
array: [
|
|
110
|
-
{
|
|
111
|
-
type: "__fluid_handle__",
|
|
112
|
-
url: "routeC",
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
type: "__fluid_handle__",
|
|
116
|
-
url: "routeD",
|
|
117
|
-
},
|
|
118
|
-
],
|
|
119
|
-
deadEnd: null,
|
|
120
|
-
number: 1,
|
|
121
|
-
nothing: undefined,
|
|
122
|
-
},
|
|
123
|
-
}, (from, to) => {
|
|
124
|
-
outboundReferences.push([from, to]);
|
|
125
|
-
});
|
|
126
|
-
assert.deepEqual(outboundReferences, [
|
|
127
|
-
["/dataStore1/dds1", "routeA"],
|
|
128
|
-
["/dataStore1/dds1", "routeB"],
|
|
129
|
-
["/dataStore1/dds1", "routeC"],
|
|
130
|
-
["/dataStore1/dds1", "routeD"],
|
|
131
|
-
], "Should find both handles");
|
|
132
|
-
});
|
|
133
|
-
it("null contents", () => {
|
|
134
|
-
detectOutboundReferences({ address: "foo", contents: null }, () => {
|
|
135
|
-
assert.fail("Should not be called");
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
//# sourceMappingURL=channelCollection.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"channelCollection.spec.js","sourceRoot":"","sources":["../../src/test/channelCollection.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport { channelsTreeName } from \"@fluidframework/runtime-definitions\";\nimport { detectOutboundReferences, getSummaryForDatastores } from \"../channelCollection.js\";\nimport { IContainerRuntimeMetadata, nonDataStorePaths } from \"../summary/index.js\";\n\ndescribe(\"Runtime\", () => {\n\tdescribe(\"Container Runtime\", () => {\n\t\tdescribe(\"getSummaryForDatastores\", () => {\n\t\t\tconst enabledMetadata: IContainerRuntimeMetadata = {\n\t\t\t\tsummaryFormatVersion: 1,\n\t\t\t\tmessage: undefined,\n\t\t\t};\n\t\t\tconst disabledMetadata: IContainerRuntimeMetadata = {\n\t\t\t\tsummaryFormatVersion: 1,\n\t\t\t\tdisableIsolatedChannels: true,\n\t\t\t\tmessage: undefined,\n\t\t\t};\n\n\t\t\tconst emptyTree = (id: string): ISnapshotTree => ({\n\t\t\t\tid,\n\t\t\t\tblobs: {},\n\t\t\t\ttrees: {},\n\t\t\t});\n\t\t\tconst testSnapshot: ISnapshotTree = {\n\t\t\t\tid: \"root-id\",\n\t\t\t\tblobs: {},\n\t\t\t\ttrees: {\n\t\t\t\t\t[channelsTreeName]: {\n\t\t\t\t\t\tid: \"channels-id\",\n\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t[nonDataStorePaths[0]]: emptyTree(\"lower-non-datastore-1\"),\n\t\t\t\t\t\t\t\"some-datastore\": emptyTree(\"lower-datastore-1\"),\n\t\t\t\t\t\t\t[nonDataStorePaths[1]]: emptyTree(\"lower-non-datastore-2\"),\n\t\t\t\t\t\t\t\"another-datastore\": emptyTree(\"lower-datastore-2\"),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[nonDataStorePaths[0]]: emptyTree(\"top-non-datastore-1\"),\n\t\t\t\t\t\"some-datastore\": emptyTree(\"top-datastore-1\"),\n\t\t\t\t\t[nonDataStorePaths[1]]: emptyTree(\"top-non-datastore-2\"),\n\t\t\t\t\t\"another-datastore\": emptyTree(\"top-datastore-2\"),\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tit(\"Should return undefined for undefined snapshots\", () => {\n\t\t\t\tlet snapshot = getSummaryForDatastores(undefined, undefined);\n\t\t\t\tassert(snapshot === undefined);\n\t\t\t\tsnapshot = getSummaryForDatastores(undefined, enabledMetadata);\n\t\t\t\tassert(snapshot === undefined);\n\t\t\t\tsnapshot = getSummaryForDatastores(undefined, disabledMetadata);\n\t\t\t\tassert(snapshot === undefined);\n\t\t\t\tsnapshot = getSummaryForDatastores(null as any, undefined);\n\t\t\t\tassert(snapshot === undefined);\n\t\t\t\tsnapshot = getSummaryForDatastores(null as any, enabledMetadata);\n\t\t\t\tassert(snapshot === undefined);\n\t\t\t\tsnapshot = getSummaryForDatastores(null as any, disabledMetadata);\n\t\t\t\tassert(snapshot === undefined);\n\t\t\t});\n\n\t\t\tit(\"Should strip out non-datastore paths for versions < 1\", () => {\n\t\t\t\tconst snapshot = getSummaryForDatastores(testSnapshot, undefined);\n\t\t\t\tassert(snapshot, \"Snapshot should be defined\");\n\t\t\t\tassert.strictEqual(snapshot.id, \"root-id\", \"Should be top-level\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tObject.keys(snapshot.trees).length,\n\t\t\t\t\t3,\n\t\t\t\t\t\"Should have 3 datastores\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsnapshot.trees[channelsTreeName]?.id,\n\t\t\t\t\t\"channels-id\",\n\t\t\t\t\t\"Should have channels tree as datastore\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsnapshot.trees[\"some-datastore\"]?.id,\n\t\t\t\t\t\"top-datastore-1\",\n\t\t\t\t\t\"Should have top datastore 1\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsnapshot.trees[\"another-datastore\"]?.id,\n\t\t\t\t\t\"top-datastore-2\",\n\t\t\t\t\t\"Should have top datastore 2\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Should strip out non-datastore paths for disabled isolated channels\", () => {\n\t\t\t\tconst snapshot = getSummaryForDatastores(testSnapshot, disabledMetadata);\n\t\t\t\tassert(snapshot, \"Snapshot should be defined\");\n\t\t\t\tassert.strictEqual(snapshot.id, \"root-id\", \"Should be top-level\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tObject.keys(snapshot.trees).length,\n\t\t\t\t\t3,\n\t\t\t\t\t\"Should have 3 datastores\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsnapshot.trees[channelsTreeName]?.id,\n\t\t\t\t\t\"channels-id\",\n\t\t\t\t\t\"Should have channels tree as datastore\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsnapshot.trees[\"some-datastore\"]?.id,\n\t\t\t\t\t\"top-datastore-1\",\n\t\t\t\t\t\"Should have top datastore 1\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsnapshot.trees[\"another-datastore\"]?.id,\n\t\t\t\t\t\"top-datastore-2\",\n\t\t\t\t\t\"Should have top datastore 2\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Should give channels subtree for version 1\", () => {\n\t\t\t\tconst snapshot = getSummaryForDatastores(testSnapshot, enabledMetadata);\n\t\t\t\tassert(snapshot, \"Snapshot should be defined\");\n\t\t\t\tassert.strictEqual(snapshot.id, \"channels-id\", \"Should be lower-level\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tObject.keys(snapshot.trees).length,\n\t\t\t\t\t4,\n\t\t\t\t\t\"Should have 4 datastores\",\n\t\t\t\t);\n\t\t\t\t// Put in variable to avoid type-narrowing bug\n\t\t\t\tconst nonDataStore1 = snapshot.trees[nonDataStorePaths[0]];\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tnonDataStore1?.id,\n\t\t\t\t\t\"lower-non-datastore-1\",\n\t\t\t\t\t\"Should have lower non-datastore 1\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsnapshot.trees[nonDataStorePaths[1]]?.id,\n\t\t\t\t\t\"lower-non-datastore-2\",\n\t\t\t\t\t\"Should have lower non-datastore 2\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsnapshot.trees[\"some-datastore\"]?.id,\n\t\t\t\t\t\"lower-datastore-1\",\n\t\t\t\t\t\"Should have lower datastore 1\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsnapshot.trees[\"another-datastore\"]?.id,\n\t\t\t\t\t\"lower-datastore-2\",\n\t\t\t\t\t\"Should have lower datastore 2\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t\tdescribe(\"detectOutboundReferences\", () => {\n\t\t\tit(\"Can find handles\", () => {\n\t\t\t\tconst outboundReferences: [string, string][] = [];\n\t\t\t\tdetectOutboundReferences(\n\t\t\t\t\t{\n\t\t\t\t\t\taddress: \"dataStore1\",\n\t\t\t\t\t\tcontents: {\n\t\t\t\t\t\t\taddress: \"dds1\",\n\t\t\t\t\t\t\tsomeHandle: {\n\t\t\t\t\t\t\t\ttype: \"__fluid_handle__\",\n\t\t\t\t\t\t\t\turl: \"routeA\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnested: {\n\t\t\t\t\t\t\t\tanotherHandle: {\n\t\t\t\t\t\t\t\t\ttype: \"__fluid_handle__\",\n\t\t\t\t\t\t\t\t\turl: \"routeB\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\taddress: \"ignored\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tarray: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"__fluid_handle__\",\n\t\t\t\t\t\t\t\t\turl: \"routeC\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"__fluid_handle__\",\n\t\t\t\t\t\t\t\t\turl: \"routeD\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdeadEnd: null,\n\t\t\t\t\t\t\tnumber: 1,\n\t\t\t\t\t\t\tnothing: undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t(from, to) => {\n\t\t\t\t\t\toutboundReferences.push([from, to]);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\toutboundReferences,\n\t\t\t\t\t[\n\t\t\t\t\t\t[\"/dataStore1/dds1\", \"routeA\"],\n\t\t\t\t\t\t[\"/dataStore1/dds1\", \"routeB\"],\n\t\t\t\t\t\t[\"/dataStore1/dds1\", \"routeC\"],\n\t\t\t\t\t\t[\"/dataStore1/dds1\", \"routeD\"],\n\t\t\t\t\t],\n\t\t\t\t\t\"Should find both handles\",\n\t\t\t\t);\n\t\t\t});\n\t\t\tit(\"null contents\", () => {\n\t\t\t\tdetectOutboundReferences({ address: \"foo\", contents: null }, () => {\n\t\t\t\t\tassert.fail(\"Should not be called\");\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
|