@fluidframework/container-runtime 2.0.0-internal.3.0.2 → 2.0.0-internal.3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +19 -19
- package/.mocharc.js +2 -2
- package/api-extractor.json +2 -2
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +2 -1
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +15 -2
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +109 -37
- package/dist/blobManager.js.map +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +11 -9
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js +3 -1
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +23 -11
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +225 -132
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +11 -9
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +27 -13
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +95 -56
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +7 -3
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.d.ts.map +1 -1
- package/dist/dataStoreRegistry.js +3 -1
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/dataStores.d.ts +28 -4
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +122 -44
- package/dist/dataStores.js.map +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +8 -3
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/{garbageCollection.d.ts → gc/garbageCollection.d.ts} +27 -203
- package/dist/gc/garbageCollection.d.ts.map +1 -0
- package/dist/{garbageCollection.js → gc/garbageCollection.js} +210 -400
- package/dist/gc/garbageCollection.js.map +1 -0
- package/dist/gc/gcDefinitions.d.ts +189 -0
- package/dist/gc/gcDefinitions.d.ts.map +1 -0
- package/dist/{garbageCollectionConstants.js → gc/gcDefinitions.js} +27 -2
- package/dist/gc/gcDefinitions.js.map +1 -0
- package/dist/gc/gcHelpers.d.ts +30 -0
- package/dist/gc/gcHelpers.d.ts.map +1 -0
- package/dist/gc/gcHelpers.js +65 -0
- package/dist/gc/gcHelpers.js.map +1 -0
- package/dist/gc/gcSummaryStateTracker.d.ts +86 -0
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -0
- package/dist/gc/gcSummaryStateTracker.js +246 -0
- package/dist/gc/gcSummaryStateTracker.js.map +1 -0
- package/{lib → dist/gc}/gcSweepReadyUsageDetection.d.ts +5 -5
- package/dist/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
- package/dist/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +15 -11
- package/dist/gc/gcSweepReadyUsageDetection.js.map +1 -0
- package/dist/gc/gcUnreferencedStateTracker.d.ts +34 -0
- package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
- package/dist/gc/gcUnreferencedStateTracker.js +94 -0
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -0
- package/dist/gc/index.d.ts +11 -0
- package/dist/gc/index.d.ts.map +1 -0
- package/dist/gc/index.js +40 -0
- package/dist/gc/index.js.map +1 -0
- package/dist/index.d.ts +2 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -9
- package/dist/index.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts +2 -13
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js +19 -41
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +4 -0
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +1 -0
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +5 -2
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +1 -1
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +24 -13
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +19 -3
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +78 -45
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/opProperties.d.ts.map +1 -1
- package/dist/opProperties.js +1 -3
- package/dist/opProperties.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts +8 -2
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +21 -13
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +3 -2
- package/dist/scheduleManager.js.map +1 -1
- package/dist/serializedSnapshotStorage.d.ts +2 -2
- package/dist/serializedSnapshotStorage.d.ts.map +1 -1
- package/dist/serializedSnapshotStorage.js +5 -3
- package/dist/serializedSnapshotStorage.js.map +1 -1
- package/dist/summary/index.d.ts +17 -0
- package/dist/summary/index.d.ts.map +1 -0
- package/dist/summary/index.js +47 -0
- package/dist/summary/index.js.map +1 -0
- package/dist/summary/orderedClientElection.d.ts.map +1 -0
- package/dist/{orderedClientElection.js → summary/orderedClientElection.js} +10 -4
- package/dist/summary/orderedClientElection.js.map +1 -0
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -0
- package/{lib → dist/summary}/runningSummarizer.d.ts +19 -18
- package/dist/summary/runningSummarizer.d.ts.map +1 -0
- package/dist/{runningSummarizer.js → summary/runningSummarizer.js} +191 -76
- package/dist/summary/runningSummarizer.js.map +1 -0
- package/dist/{summarizer.d.ts → summary/summarizer.d.ts} +4 -6
- package/dist/summary/summarizer.d.ts.map +1 -0
- package/dist/{summarizer.js → summary/summarizer.js} +31 -71
- package/dist/summary/summarizer.js.map +1 -0
- package/dist/summary/summarizerClientElection.d.ts.map +1 -0
- package/dist/summary/summarizerClientElection.js.map +1 -0
- package/dist/summary/summarizerHandle.d.ts.map +1 -0
- package/dist/summary/summarizerHandle.js.map +1 -0
- package/{lib → dist/summary}/summarizerHeuristics.d.ts +1 -1
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -0
- package/dist/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +6 -9
- package/dist/summary/summarizerHeuristics.js.map +1 -0
- package/{lib → dist/summary}/summarizerTypes.d.ts +22 -22
- package/dist/summary/summarizerTypes.d.ts.map +1 -0
- package/dist/summary/summarizerTypes.js.map +1 -0
- package/dist/summary/summaryCollection.d.ts.map +1 -0
- package/dist/{summaryCollection.js → summary/summaryCollection.js} +18 -8
- package/dist/summary/summaryCollection.js.map +1 -0
- package/{lib → dist/summary}/summaryFormat.d.ts +1 -40
- package/dist/summary/summaryFormat.d.ts.map +1 -0
- package/dist/{summaryFormat.js → summary/summaryFormat.js} +19 -20
- package/dist/summary/summaryFormat.js.map +1 -0
- package/dist/summary/summaryGenerator.d.ts.map +1 -0
- package/dist/{summaryGenerator.js → summary/summaryGenerator.js} +33 -15
- package/dist/summary/summaryGenerator.js.map +1 -0
- package/dist/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
- package/dist/summary/summaryManager.d.ts.map +1 -0
- package/dist/{summaryManager.js → summary/summaryManager.js} +21 -9
- package/dist/summary/summaryManager.js.map +1 -0
- package/dist/throttler.d.ts +2 -2
- package/dist/throttler.d.ts.map +1 -1
- package/dist/throttler.js +4 -4
- package/dist/throttler.js.map +1 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -1
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +15 -2
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +109 -37
- package/lib/blobManager.js.map +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +11 -9
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerHandleContext.d.ts.map +1 -1
- package/lib/containerHandleContext.js +3 -1
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +23 -11
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +201 -108
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +11 -9
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +27 -13
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +84 -45
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +7 -3
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.d.ts.map +1 -1
- package/lib/dataStoreRegistry.js +3 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/dataStores.d.ts +28 -4
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +120 -42
- package/lib/dataStores.js.map +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +9 -4
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/{garbageCollection.d.ts → gc/garbageCollection.d.ts} +27 -203
- package/lib/gc/garbageCollection.d.ts.map +1 -0
- package/lib/{garbageCollection.js → gc/garbageCollection.js} +190 -379
- package/lib/gc/garbageCollection.js.map +1 -0
- package/lib/gc/gcDefinitions.d.ts +189 -0
- package/lib/gc/gcDefinitions.d.ts.map +1 -0
- package/lib/{garbageCollectionConstants.js → gc/gcDefinitions.js} +26 -1
- package/lib/gc/gcDefinitions.js.map +1 -0
- package/lib/gc/gcHelpers.d.ts +30 -0
- package/lib/gc/gcHelpers.d.ts.map +1 -0
- package/lib/gc/gcHelpers.js +58 -0
- package/lib/gc/gcHelpers.js.map +1 -0
- package/lib/gc/gcSummaryStateTracker.d.ts +86 -0
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -0
- package/lib/gc/gcSummaryStateTracker.js +242 -0
- package/lib/gc/gcSummaryStateTracker.js.map +1 -0
- package/{dist → lib/gc}/gcSweepReadyUsageDetection.d.ts +5 -5
- package/lib/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
- package/lib/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +15 -11
- package/lib/gc/gcSweepReadyUsageDetection.js.map +1 -0
- package/lib/gc/gcUnreferencedStateTracker.d.ts +34 -0
- package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
- package/lib/gc/gcUnreferencedStateTracker.js +90 -0
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -0
- package/lib/gc/index.d.ts +11 -0
- package/lib/gc/index.d.ts.map +1 -0
- package/lib/gc/index.js +11 -0
- package/lib/gc/index.js.map +1 -0
- package/lib/index.d.ts +2 -5
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -4
- package/lib/index.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts +2 -13
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js +19 -41
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +4 -0
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +1 -0
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +5 -2
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +1 -1
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +25 -14
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +19 -3
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +79 -46
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/opProperties.d.ts.map +1 -1
- package/lib/opProperties.js +1 -3
- package/lib/opProperties.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +8 -2
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +21 -13
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +3 -2
- package/lib/scheduleManager.js.map +1 -1
- package/lib/serializedSnapshotStorage.d.ts +2 -2
- package/lib/serializedSnapshotStorage.d.ts.map +1 -1
- package/lib/serializedSnapshotStorage.js +5 -3
- package/lib/serializedSnapshotStorage.js.map +1 -1
- package/lib/summary/index.d.ts +17 -0
- package/lib/summary/index.d.ts.map +1 -0
- package/lib/summary/index.js +16 -0
- package/lib/summary/index.js.map +1 -0
- package/lib/summary/orderedClientElection.d.ts.map +1 -0
- package/lib/{orderedClientElection.js → summary/orderedClientElection.js} +10 -4
- package/lib/summary/orderedClientElection.js.map +1 -0
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -0
- package/{dist → lib/summary}/runningSummarizer.d.ts +19 -18
- package/lib/summary/runningSummarizer.d.ts.map +1 -0
- package/lib/{runningSummarizer.js → summary/runningSummarizer.js} +193 -78
- package/lib/summary/runningSummarizer.js.map +1 -0
- package/lib/{summarizer.d.ts → summary/summarizer.d.ts} +4 -6
- package/lib/summary/summarizer.d.ts.map +1 -0
- package/lib/{summarizer.js → summary/summarizer.js} +33 -73
- package/lib/summary/summarizer.js.map +1 -0
- package/lib/summary/summarizerClientElection.d.ts.map +1 -0
- package/lib/summary/summarizerClientElection.js.map +1 -0
- package/lib/summary/summarizerHandle.d.ts.map +1 -0
- package/lib/summary/summarizerHandle.js.map +1 -0
- package/{dist → lib/summary}/summarizerHeuristics.d.ts +1 -1
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -0
- package/lib/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +6 -9
- package/lib/summary/summarizerHeuristics.js.map +1 -0
- package/{dist → lib/summary}/summarizerTypes.d.ts +22 -22
- package/lib/summary/summarizerTypes.d.ts.map +1 -0
- package/lib/summary/summarizerTypes.js.map +1 -0
- package/lib/summary/summaryCollection.d.ts.map +1 -0
- package/lib/{summaryCollection.js → summary/summaryCollection.js} +18 -8
- package/lib/summary/summaryCollection.js.map +1 -0
- package/{dist → lib/summary}/summaryFormat.d.ts +1 -40
- package/lib/summary/summaryFormat.d.ts.map +1 -0
- package/lib/{summaryFormat.js → summary/summaryFormat.js} +20 -20
- package/lib/summary/summaryFormat.js.map +1 -0
- package/lib/summary/summaryGenerator.d.ts.map +1 -0
- package/lib/{summaryGenerator.js → summary/summaryGenerator.js} +33 -15
- package/lib/summary/summaryGenerator.js.map +1 -0
- package/lib/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
- package/lib/summary/summaryManager.d.ts.map +1 -0
- package/lib/{summaryManager.js → summary/summaryManager.js} +21 -9
- package/lib/summary/summaryManager.js.map +1 -0
- package/lib/throttler.d.ts +2 -2
- package/lib/throttler.d.ts.map +1 -1
- package/lib/throttler.js +4 -4
- package/lib/throttler.js.map +1 -1
- package/package.json +60 -51
- package/prettier.config.cjs +1 -1
- package/src/batchTracker.ts +54 -49
- package/src/blobManager.ts +825 -674
- package/src/connectionTelemetry.ts +280 -249
- package/src/containerHandleContext.ts +27 -29
- package/src/containerRuntime.ts +3249 -2978
- package/src/dataStore.ts +172 -159
- package/src/dataStoreContext.ts +1141 -1057
- package/src/dataStoreContexts.ts +178 -161
- package/src/dataStoreRegistry.ts +25 -20
- package/src/dataStores.ts +880 -731
- package/src/deltaScheduler.ts +158 -150
- package/{garbageCollection.md → src/gc/garbageCollection.md} +16 -3
- package/src/gc/garbageCollection.ts +1506 -0
- package/src/gc/gcDefinitions.ts +244 -0
- package/src/gc/gcHelpers.ts +86 -0
- package/src/gc/gcSummaryStateTracker.ts +339 -0
- package/src/gc/gcSweepReadyUsageDetection.ts +145 -0
- package/src/gc/gcUnreferencedStateTracker.ts +114 -0
- package/src/gc/index.ts +40 -0
- package/src/index.ts +67 -70
- package/src/opLifecycle/README.md +152 -0
- package/src/opLifecycle/batchManager.ts +101 -144
- package/src/opLifecycle/definitions.ts +33 -29
- package/src/opLifecycle/index.ts +5 -5
- package/src/opLifecycle/opCompressor.ts +55 -53
- package/src/opLifecycle/opDecompressor.ts +100 -81
- package/src/opLifecycle/opSplitter.ts +233 -188
- package/src/opLifecycle/outbox.ts +251 -195
- package/src/opLifecycle/remoteMessageProcessor.ts +62 -62
- package/src/opProperties.ts +11 -9
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +396 -338
- package/src/scheduleManager.ts +299 -269
- package/src/serializedSnapshotStorage.ts +126 -112
- package/src/summary/index.ts +99 -0
- package/src/summary/orderedClientElection.ts +564 -0
- package/src/summary/runWhileConnectedCoordinator.ts +113 -0
- package/src/summary/runningSummarizer.ts +788 -0
- package/src/summary/summarizer.ts +386 -0
- package/src/summary/summarizerClientElection.ts +139 -0
- package/src/{summarizerHandle.ts → summary/summarizerHandle.ts} +11 -9
- package/src/summary/summarizerHeuristics.ts +219 -0
- package/src/summary/summarizerTypes.ts +521 -0
- package/src/summary/summaryCollection.ts +450 -0
- package/src/summary/summaryFormat.ts +226 -0
- package/src/summary/summaryGenerator.ts +505 -0
- package/src/summary/summaryManager.ts +423 -0
- package/src/throttler.ts +131 -122
- package/tsconfig.esnext.json +6 -6
- package/tsconfig.json +9 -13
- package/dist/garbageCollection.d.ts.map +0 -1
- package/dist/garbageCollection.js.map +0 -1
- package/dist/garbageCollectionConstants.d.ts +0 -25
- package/dist/garbageCollectionConstants.d.ts.map +0 -1
- package/dist/garbageCollectionConstants.js.map +0 -1
- package/dist/garbageCollectionTombstoneUtils.d.ts +0 -14
- package/dist/garbageCollectionTombstoneUtils.d.ts.map +0 -1
- package/dist/garbageCollectionTombstoneUtils.js +0 -23
- package/dist/garbageCollectionTombstoneUtils.js.map +0 -1
- package/dist/gcSweepReadyUsageDetection.d.ts.map +0 -1
- package/dist/gcSweepReadyUsageDetection.js.map +0 -1
- package/dist/orderedClientElection.d.ts.map +0 -1
- package/dist/orderedClientElection.js.map +0 -1
- package/dist/runWhileConnectedCoordinator.d.ts.map +0 -1
- package/dist/runWhileConnectedCoordinator.js.map +0 -1
- package/dist/runningSummarizer.d.ts.map +0 -1
- package/dist/runningSummarizer.js.map +0 -1
- package/dist/summarizer.d.ts.map +0 -1
- 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.map +0 -1
- package/dist/summarizerHandle.js.map +0 -1
- package/dist/summarizerHeuristics.d.ts.map +0 -1
- 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/lib/garbageCollection.d.ts.map +0 -1
- package/lib/garbageCollection.js.map +0 -1
- package/lib/garbageCollectionConstants.d.ts +0 -25
- package/lib/garbageCollectionConstants.d.ts.map +0 -1
- package/lib/garbageCollectionConstants.js.map +0 -1
- package/lib/garbageCollectionTombstoneUtils.d.ts +0 -14
- package/lib/garbageCollectionTombstoneUtils.d.ts.map +0 -1
- package/lib/garbageCollectionTombstoneUtils.js +0 -19
- package/lib/garbageCollectionTombstoneUtils.js.map +0 -1
- package/lib/gcSweepReadyUsageDetection.d.ts.map +0 -1
- package/lib/gcSweepReadyUsageDetection.js.map +0 -1
- package/lib/orderedClientElection.d.ts.map +0 -1
- package/lib/orderedClientElection.js.map +0 -1
- package/lib/runWhileConnectedCoordinator.d.ts.map +0 -1
- package/lib/runWhileConnectedCoordinator.js.map +0 -1
- package/lib/runningSummarizer.d.ts.map +0 -1
- package/lib/runningSummarizer.js.map +0 -1
- package/lib/summarizer.d.ts.map +0 -1
- 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.map +0 -1
- package/lib/summarizerHandle.js.map +0 -1
- package/lib/summarizerHeuristics.d.ts.map +0 -1
- package/lib/summarizerHeuristics.js.map +0 -1
- package/lib/summarizerTypes.d.ts.map +0 -1
- 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.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/src/garbageCollection.ts +0 -1800
- package/src/garbageCollectionConstants.ts +0 -41
- package/src/garbageCollectionTombstoneUtils.ts +0 -28
- package/src/gcSweepReadyUsageDetection.ts +0 -139
- package/src/orderedClientElection.ts +0 -532
- package/src/runWhileConnectedCoordinator.ts +0 -106
- package/src/runningSummarizer.ts +0 -610
- package/src/summarizer.ts +0 -421
- package/src/summarizerClientElection.ts +0 -132
- package/src/summarizerHeuristics.ts +0 -222
- package/src/summarizerTypes.ts +0 -507
- package/src/summaryCollection.ts +0 -421
- package/src/summaryFormat.ts +0 -256
- package/src/summaryGenerator.ts +0 -450
- package/src/summaryManager.ts +0 -394
- /package/dist/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
- /package/dist/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +0 -0
- /package/dist/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +0 -0
- /package/dist/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +0 -0
- /package/dist/{summarizerClientElection.js → summary/summarizerClientElection.js} +0 -0
- /package/dist/{summarizerHandle.d.ts → summary/summarizerHandle.d.ts} +0 -0
- /package/dist/{summarizerHandle.js → summary/summarizerHandle.js} +0 -0
- /package/dist/{summarizerTypes.js → summary/summarizerTypes.js} +0 -0
- /package/dist/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
- /package/dist/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +0 -0
- /package/lib/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
- /package/lib/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +0 -0
- /package/lib/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +0 -0
- /package/lib/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +0 -0
- /package/lib/{summarizerClientElection.js → summary/summarizerClientElection.js} +0 -0
- /package/lib/{summarizerHandle.d.ts → summary/summarizerHandle.d.ts} +0 -0
- /package/lib/{summarizerHandle.js → summary/summarizerHandle.js} +0 -0
- /package/lib/{summarizerTypes.js → summary/summarizerTypes.js} +0 -0
- /package/lib/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
- /package/lib/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +0 -0
package/src/summaryCollection.ts
DELETED
|
@@ -1,421 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { IDisposable, IEvent, ITelemetryLogger } from "@fluidframework/common-definitions";
|
|
7
|
-
import { Deferred, assert, TypedEventEmitter } from "@fluidframework/common-utils";
|
|
8
|
-
import { IDeltaManager } from "@fluidframework/container-definitions";
|
|
9
|
-
import {
|
|
10
|
-
IDocumentMessage,
|
|
11
|
-
ISequencedDocumentMessage,
|
|
12
|
-
ISummaryAck,
|
|
13
|
-
ISummaryContent,
|
|
14
|
-
ISummaryNack,
|
|
15
|
-
MessageType,
|
|
16
|
-
} from "@fluidframework/protocol-definitions";
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Interface for summary op messages with typed contents.
|
|
20
|
-
*/
|
|
21
|
-
export interface ISummaryOpMessage extends ISequencedDocumentMessage {
|
|
22
|
-
type: MessageType.Summarize;
|
|
23
|
-
contents: ISummaryContent;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Interface for summary ack messages with typed contents.
|
|
28
|
-
*/
|
|
29
|
-
export interface ISummaryAckMessage extends ISequencedDocumentMessage {
|
|
30
|
-
type: MessageType.SummaryAck;
|
|
31
|
-
contents: ISummaryAck;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Interface for summary nack messages with typed contents.
|
|
36
|
-
*/
|
|
37
|
-
export interface ISummaryNackMessage extends ISequencedDocumentMessage {
|
|
38
|
-
type: MessageType.SummaryNack;
|
|
39
|
-
contents: ISummaryNack;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* A single summary which can be tracked as it goes through its life cycle.
|
|
44
|
-
* The life cycle is: Local to Broadcast to Acked/Nacked.
|
|
45
|
-
*/
|
|
46
|
-
export interface ISummary {
|
|
47
|
-
readonly clientId: string;
|
|
48
|
-
readonly clientSequenceNumber: number;
|
|
49
|
-
waitBroadcast(): Promise<ISummaryOpMessage>;
|
|
50
|
-
waitAckNack(): Promise<ISummaryAckMessage | ISummaryNackMessage>;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* A single summary which has already been acked by the server.
|
|
55
|
-
*/
|
|
56
|
-
export interface IAckedSummary {
|
|
57
|
-
readonly summaryOp: ISummaryOpMessage;
|
|
58
|
-
readonly summaryAck: ISummaryAckMessage;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
enum SummaryState {
|
|
62
|
-
Local = 0,
|
|
63
|
-
Broadcast = 1,
|
|
64
|
-
Acked = 2,
|
|
65
|
-
Nacked = -1,
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
class Summary implements ISummary {
|
|
69
|
-
public static createLocal(clientId: string, clientSequenceNumber: number) {
|
|
70
|
-
return new Summary(clientId, clientSequenceNumber);
|
|
71
|
-
}
|
|
72
|
-
public static createFromOp(op: ISummaryOpMessage) {
|
|
73
|
-
const summary = new Summary(op.clientId, op.clientSequenceNumber);
|
|
74
|
-
summary.broadcast(op);
|
|
75
|
-
return summary;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
private state = SummaryState.Local;
|
|
79
|
-
|
|
80
|
-
private _summaryOp?: ISummaryOpMessage;
|
|
81
|
-
private _summaryAckNack?: ISummaryAckMessage | ISummaryNackMessage;
|
|
82
|
-
|
|
83
|
-
private readonly defSummaryOp = new Deferred<void>();
|
|
84
|
-
private readonly defSummaryAck = new Deferred<void>();
|
|
85
|
-
|
|
86
|
-
public get summaryOp() { return this._summaryOp; }
|
|
87
|
-
public get summaryAckNack() { return this._summaryAckNack; }
|
|
88
|
-
|
|
89
|
-
private constructor(
|
|
90
|
-
public readonly clientId: string,
|
|
91
|
-
public readonly clientSequenceNumber: number) { }
|
|
92
|
-
|
|
93
|
-
public hasBeenAcked(): this is IAckedSummary {
|
|
94
|
-
return this.state === SummaryState.Acked;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
public broadcast(op: ISummaryOpMessage) {
|
|
98
|
-
assert(this.state === SummaryState.Local, 0x175 /* "Can only broadcast if summarizer starts in local state" */);
|
|
99
|
-
this._summaryOp = op;
|
|
100
|
-
this.defSummaryOp.resolve();
|
|
101
|
-
this.state = SummaryState.Broadcast;
|
|
102
|
-
return true;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
public ackNack(op: ISummaryAckMessage | ISummaryNackMessage) {
|
|
106
|
-
assert(this.state === SummaryState.Broadcast,
|
|
107
|
-
0x176 /* "Can only ack/nack if summarizer is in broadcasting state" */);
|
|
108
|
-
this._summaryAckNack = op;
|
|
109
|
-
this.defSummaryAck.resolve();
|
|
110
|
-
this.state = op.type === MessageType.SummaryAck ? SummaryState.Acked : SummaryState.Nacked;
|
|
111
|
-
return true;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
public async waitBroadcast(): Promise<ISummaryOpMessage> {
|
|
115
|
-
await this.defSummaryOp.promise;
|
|
116
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
117
|
-
return this._summaryOp!;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
public async waitAckNack(): Promise<ISummaryAckMessage | ISummaryNackMessage> {
|
|
121
|
-
await this.defSummaryAck.promise;
|
|
122
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
123
|
-
return this._summaryAckNack!;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Watches summaries created by a specific client.
|
|
129
|
-
*/
|
|
130
|
-
export interface IClientSummaryWatcher extends IDisposable {
|
|
131
|
-
watchSummary(clientSequenceNumber: number): ISummary;
|
|
132
|
-
waitFlushed(): Promise<IAckedSummary | undefined>;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* This class watches summaries created by a specific client.
|
|
137
|
-
* It should be created and managed from a SummaryCollection.
|
|
138
|
-
*/
|
|
139
|
-
class ClientSummaryWatcher implements IClientSummaryWatcher {
|
|
140
|
-
// key: clientSeqNum
|
|
141
|
-
private readonly localSummaries = new Map<number, Summary>();
|
|
142
|
-
private _disposed = false;
|
|
143
|
-
|
|
144
|
-
public get disposed() { return this._disposed; }
|
|
145
|
-
|
|
146
|
-
public constructor(
|
|
147
|
-
public readonly clientId: string,
|
|
148
|
-
private readonly summaryCollection: SummaryCollection,
|
|
149
|
-
) { }
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Watches for a specific sent summary op.
|
|
153
|
-
* @param clientSequenceNumber - client sequence number of sent summary op
|
|
154
|
-
*/
|
|
155
|
-
public watchSummary(clientSequenceNumber: number): ISummary {
|
|
156
|
-
let summary = this.localSummaries.get(clientSequenceNumber);
|
|
157
|
-
if (!summary) {
|
|
158
|
-
summary = Summary.createLocal(this.clientId, clientSequenceNumber);
|
|
159
|
-
this.localSummaries.set(summary.clientSequenceNumber, summary);
|
|
160
|
-
}
|
|
161
|
-
return summary;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Waits until all of the pending summaries in the underlying SummaryCollection
|
|
166
|
-
* are acked/nacked.
|
|
167
|
-
*/
|
|
168
|
-
// eslint-disable-next-line @typescript-eslint/promise-function-async
|
|
169
|
-
public waitFlushed() {
|
|
170
|
-
return this.summaryCollection.waitFlushed();
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Gets a watched summary or returns undefined if not watched.
|
|
175
|
-
* @param clientSequenceNumber - client sequence number of sent summary op
|
|
176
|
-
*/
|
|
177
|
-
public tryGetSummary(clientSequenceNumber: number) {
|
|
178
|
-
return this.localSummaries.get(clientSequenceNumber);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Starts watching a summary made by this client.
|
|
183
|
-
* @param summary - summary to start watching
|
|
184
|
-
*/
|
|
185
|
-
public setSummary(summary: Summary) {
|
|
186
|
-
this.localSummaries.set(summary.clientSequenceNumber, summary);
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
public dispose() {
|
|
190
|
-
this.summaryCollection.removeWatcher(this.clientId);
|
|
191
|
-
this._disposed = true;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
export type OpActionEventName = MessageType.Summarize | MessageType.SummaryAck | MessageType.SummaryNack | "default";
|
|
196
|
-
export type OpActionEventListener = (op: ISequencedDocumentMessage) => void;
|
|
197
|
-
export interface ISummaryCollectionOpEvents extends IEvent {
|
|
198
|
-
(event: OpActionEventName, listener: OpActionEventListener);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Data structure that looks at the op stream to track summaries as they
|
|
203
|
-
* are broadcast, acked and nacked.
|
|
204
|
-
* It provides functionality for watching specific summaries.
|
|
205
|
-
*/
|
|
206
|
-
export class SummaryCollection extends TypedEventEmitter<ISummaryCollectionOpEvents> {
|
|
207
|
-
// key: clientId
|
|
208
|
-
private readonly summaryWatchers = new Map<string, ClientSummaryWatcher>();
|
|
209
|
-
// key: summarySeqNum
|
|
210
|
-
private readonly pendingSummaries = new Map<number, Summary>();
|
|
211
|
-
private refreshWaitNextAck = new Deferred<void>();
|
|
212
|
-
|
|
213
|
-
private lastSummaryTimestamp: number | undefined;
|
|
214
|
-
private maxAckWaitTime: number | undefined;
|
|
215
|
-
private pendingAckTimerTimeoutCallback: (() => void) | undefined;
|
|
216
|
-
private lastAck: IAckedSummary | undefined;
|
|
217
|
-
|
|
218
|
-
public get latestAck(): IAckedSummary | undefined { return this.lastAck; }
|
|
219
|
-
|
|
220
|
-
public emit(event: OpActionEventName, ...args: Parameters<OpActionEventListener>): boolean {
|
|
221
|
-
return super.emit(event, ...args);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
public get opsSinceLastAck() {
|
|
225
|
-
return this.deltaManager.lastSequenceNumber -
|
|
226
|
-
(this.lastAck?.summaryAck.sequenceNumber ?? this.deltaManager.initialSequenceNumber);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
public addOpListener(listener: () => void) {
|
|
230
|
-
this.deltaManager.on("op", listener);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
public removeOpListener(listener: () => void) {
|
|
234
|
-
this.deltaManager.off("op", listener);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
public constructor(
|
|
238
|
-
private readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,
|
|
239
|
-
private readonly logger: ITelemetryLogger,
|
|
240
|
-
) {
|
|
241
|
-
super();
|
|
242
|
-
this.deltaManager.on("op", (op) => this.handleOp(op));
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Creates and returns a summary watcher for a specific client.
|
|
247
|
-
* This will allow for local sent summaries to be better tracked.
|
|
248
|
-
* @param clientId - client id for watcher
|
|
249
|
-
*/
|
|
250
|
-
public createWatcher(clientId: string): IClientSummaryWatcher {
|
|
251
|
-
const watcher = new ClientSummaryWatcher(clientId, this);
|
|
252
|
-
this.summaryWatchers.set(clientId, watcher);
|
|
253
|
-
return watcher;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
public removeWatcher(clientId: string) {
|
|
257
|
-
this.summaryWatchers.delete(clientId);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
public setPendingAckTimerTimeoutCallback(maxAckWaitTime: number, timeoutCallback: () => void) {
|
|
261
|
-
this.maxAckWaitTime = maxAckWaitTime;
|
|
262
|
-
this.pendingAckTimerTimeoutCallback = timeoutCallback;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
public unsetPendingAckTimerTimeoutCallback() {
|
|
266
|
-
this.maxAckWaitTime = undefined;
|
|
267
|
-
this.pendingAckTimerTimeoutCallback = undefined;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Returns a promise that resolves once all pending summary ops
|
|
272
|
-
* have been acked or nacked.
|
|
273
|
-
*/
|
|
274
|
-
public async waitFlushed(): Promise<IAckedSummary | undefined> {
|
|
275
|
-
while (this.pendingSummaries.size > 0) {
|
|
276
|
-
// eslint-disable-next-line @typescript-eslint/promise-function-async
|
|
277
|
-
const promises = Array.from(this.pendingSummaries, ([, summary]) => summary.waitAckNack());
|
|
278
|
-
await Promise.all(promises);
|
|
279
|
-
}
|
|
280
|
-
return this.lastAck;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
/**
|
|
284
|
-
* Returns a promise that resolves once a summary is acked that has a reference
|
|
285
|
-
* sequence number greater than or equal to the passed in sequence number.
|
|
286
|
-
* @param referenceSequenceNumber - reference sequence number to wait for
|
|
287
|
-
* @returns The latest acked summary
|
|
288
|
-
*/
|
|
289
|
-
public async waitSummaryAck(referenceSequenceNumber: number): Promise<IAckedSummary> {
|
|
290
|
-
while (!this.lastAck || this.lastAck.summaryOp.referenceSequenceNumber < referenceSequenceNumber) {
|
|
291
|
-
await this.refreshWaitNextAck.promise;
|
|
292
|
-
}
|
|
293
|
-
return this.lastAck;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
private parseContent(op: ISequencedDocumentMessage) {
|
|
297
|
-
// back-compat: ADO #1385: Make this unconditional in the future,
|
|
298
|
-
// when Container.processRemoteMessage stops parsing contents. That said, we should move to
|
|
299
|
-
// listen for "op" events from ContainerRuntime, and parsing may not be required at all if
|
|
300
|
-
// ContainerRuntime.process() would parse it for all types of ops.
|
|
301
|
-
// Can make either of those changes only when LTS moves to a version that has no content
|
|
302
|
-
// parsing in loader layer!
|
|
303
|
-
if (typeof op.contents === "string") {
|
|
304
|
-
op.contents = JSON.parse(op.contents);
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* Handler for ops; only handles ops relating to summaries.
|
|
310
|
-
* @param op - op message to handle
|
|
311
|
-
*/
|
|
312
|
-
private handleOp(opArg: ISequencedDocumentMessage) {
|
|
313
|
-
const op = { ...opArg };
|
|
314
|
-
|
|
315
|
-
switch (op.type) {
|
|
316
|
-
case MessageType.Summarize:
|
|
317
|
-
this.parseContent(op);
|
|
318
|
-
return this.handleSummaryOp(op as ISummaryOpMessage);
|
|
319
|
-
case MessageType.SummaryAck:
|
|
320
|
-
case MessageType.SummaryNack:
|
|
321
|
-
// Old files (prior to PR #10077) may not contain this info
|
|
322
|
-
// back-compat: ADO #1385: remove cast when ISequencedDocumentMessage changes are propagated
|
|
323
|
-
if ((op as any).data !== undefined) {
|
|
324
|
-
op.contents = JSON.parse((op as any).data);
|
|
325
|
-
} else {
|
|
326
|
-
this.parseContent(op);
|
|
327
|
-
}
|
|
328
|
-
return op.type === MessageType.SummaryAck
|
|
329
|
-
? this.handleSummaryAck(op as ISummaryAckMessage)
|
|
330
|
-
: this.handleSummaryNack(op as ISummaryNackMessage);
|
|
331
|
-
default: {
|
|
332
|
-
// If the difference between timestamp of current op and last summary op is greater than
|
|
333
|
-
// the maxAckWaitTime, then we need to inform summarizer to not wait and summarize
|
|
334
|
-
// immediately as we have already waited for maxAckWaitTime.
|
|
335
|
-
const lastOpTimestamp = op.timestamp;
|
|
336
|
-
if (this.lastSummaryTimestamp !== undefined &&
|
|
337
|
-
this.maxAckWaitTime !== undefined &&
|
|
338
|
-
lastOpTimestamp - this.lastSummaryTimestamp >= this.maxAckWaitTime
|
|
339
|
-
) {
|
|
340
|
-
this.pendingAckTimerTimeoutCallback?.();
|
|
341
|
-
}
|
|
342
|
-
this.emit("default", op);
|
|
343
|
-
|
|
344
|
-
return;
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
private handleSummaryOp(op: ISummaryOpMessage) {
|
|
350
|
-
let summary: Summary | undefined;
|
|
351
|
-
|
|
352
|
-
// Check if summary already being watched, broadcast if so
|
|
353
|
-
const watcher = this.summaryWatchers.get(op.clientId);
|
|
354
|
-
if (watcher) {
|
|
355
|
-
summary = watcher.tryGetSummary(op.clientSequenceNumber);
|
|
356
|
-
if (summary) {
|
|
357
|
-
summary.broadcast(op);
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
// If not watched, create from op
|
|
362
|
-
if (!summary) {
|
|
363
|
-
summary = Summary.createFromOp(op);
|
|
364
|
-
if (watcher) {
|
|
365
|
-
watcher.setSummary(summary);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
this.pendingSummaries.set(op.sequenceNumber, summary);
|
|
369
|
-
this.lastSummaryTimestamp = op.timestamp;
|
|
370
|
-
this.emit(MessageType.Summarize, op);
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
private handleSummaryAck(op: ISummaryAckMessage) {
|
|
374
|
-
const seq = op.contents.summaryProposal.summarySequenceNumber;
|
|
375
|
-
const summary = this.pendingSummaries.get(seq);
|
|
376
|
-
if (!summary || summary.summaryOp === undefined) {
|
|
377
|
-
// Summary ack without an op should be rare. We could fetch the
|
|
378
|
-
// reference sequence number from the snapshot, but instead we
|
|
379
|
-
// will not emit this ack. It should be the case that the summary
|
|
380
|
-
// op that this ack is for is earlier than this file was loaded
|
|
381
|
-
// from. i.e. initialSequenceNumber > summarySequenceNumber.
|
|
382
|
-
// We really don't care about it for now, since it is older than
|
|
383
|
-
// the one we loaded from.
|
|
384
|
-
if (seq > this.deltaManager.initialSequenceNumber) {
|
|
385
|
-
// Potential causes for it to be later than our initialSequenceNumber
|
|
386
|
-
// are that the summaryOp was nacked then acked, double-acked, or
|
|
387
|
-
// the summarySequenceNumber is incorrect.
|
|
388
|
-
this.logger.sendTelemetryEvent({
|
|
389
|
-
eventName: "SummaryAckWithoutOp",
|
|
390
|
-
sequenceNumber: op.sequenceNumber, // summary ack seq #
|
|
391
|
-
summarySequenceNumber: seq, // missing summary seq #
|
|
392
|
-
initialSequenceNumber: this.deltaManager.initialSequenceNumber,
|
|
393
|
-
});
|
|
394
|
-
}
|
|
395
|
-
return;
|
|
396
|
-
}
|
|
397
|
-
summary.ackNack(op);
|
|
398
|
-
this.pendingSummaries.delete(seq);
|
|
399
|
-
|
|
400
|
-
// Track latest ack
|
|
401
|
-
if (!this.lastAck || seq > this.lastAck.summaryAck.contents.summaryProposal.summarySequenceNumber) {
|
|
402
|
-
this.lastAck = {
|
|
403
|
-
summaryOp: summary.summaryOp,
|
|
404
|
-
summaryAck: op,
|
|
405
|
-
};
|
|
406
|
-
this.refreshWaitNextAck.resolve();
|
|
407
|
-
this.refreshWaitNextAck = new Deferred<void>();
|
|
408
|
-
this.emit(MessageType.SummaryAck, op);
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
private handleSummaryNack(op: ISummaryNackMessage) {
|
|
413
|
-
const seq = op.contents.summaryProposal.summarySequenceNumber;
|
|
414
|
-
const summary = this.pendingSummaries.get(seq);
|
|
415
|
-
if (summary) {
|
|
416
|
-
summary.ackNack(op);
|
|
417
|
-
this.pendingSummaries.delete(seq);
|
|
418
|
-
this.emit(MessageType.SummaryNack, op);
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
}
|
package/src/summaryFormat.ts
DELETED
|
@@ -1,256 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { assert } from "@fluidframework/common-utils";
|
|
7
|
-
import { IDocumentStorageService } from "@fluidframework/driver-definitions";
|
|
8
|
-
import { readAndParse } from "@fluidframework/driver-utils";
|
|
9
|
-
import { ISequencedDocumentMessage, ISnapshotTree, SummaryType } from "@fluidframework/protocol-definitions";
|
|
10
|
-
import { channelsTreeName, gcTreeKey, ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
|
|
11
|
-
|
|
12
|
-
type OmitAttributesVersions<T> = Omit<T, "snapshotFormatVersion" | "summaryFormatVersion">;
|
|
13
|
-
interface IFluidDataStoreAttributes0 {
|
|
14
|
-
readonly snapshotFormatVersion?: undefined;
|
|
15
|
-
readonly summaryFormatVersion?: undefined;
|
|
16
|
-
pkg: string;
|
|
17
|
-
/**
|
|
18
|
-
* This tells whether a data store is root. Root data stores are never collected.
|
|
19
|
-
* Non-root data stores may be collected if they are not used. If this is not present, default it to
|
|
20
|
-
* true. This will ensure that older data stores are incorrectly collected.
|
|
21
|
-
*/
|
|
22
|
-
readonly isRootDataStore?: boolean;
|
|
23
|
-
}
|
|
24
|
-
interface IFluidDataStoreAttributes1 extends OmitAttributesVersions<IFluidDataStoreAttributes0> {
|
|
25
|
-
readonly snapshotFormatVersion: "0.1";
|
|
26
|
-
readonly summaryFormatVersion?: undefined;
|
|
27
|
-
}
|
|
28
|
-
interface IFluidDataStoreAttributes2 extends OmitAttributesVersions<IFluidDataStoreAttributes1> {
|
|
29
|
-
/** Switch from snapshotFormatVersion to summaryFormatVersion */
|
|
30
|
-
readonly snapshotFormatVersion?: undefined;
|
|
31
|
-
readonly summaryFormatVersion: 2;
|
|
32
|
-
/**
|
|
33
|
-
* True if channels are not isolated in .channels subtrees, otherwise isolated.
|
|
34
|
-
* This is required in both datastore attributes as well as the root container,
|
|
35
|
-
* because reused summary handles may cause different format versions in each
|
|
36
|
-
* datastore subtree within the summary.
|
|
37
|
-
*/
|
|
38
|
-
readonly disableIsolatedChannels?: true;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Added IFluidDataStoreAttributes similar to IChannelAttributes which will tell the attributes of a
|
|
42
|
-
* store like the package, snapshotFormatVersion to take different decisions based on a particular
|
|
43
|
-
* snapshotFormatVersion.
|
|
44
|
-
*/
|
|
45
|
-
export type ReadFluidDataStoreAttributes =
|
|
46
|
-
| IFluidDataStoreAttributes0
|
|
47
|
-
| IFluidDataStoreAttributes1
|
|
48
|
-
| IFluidDataStoreAttributes2;
|
|
49
|
-
export type WriteFluidDataStoreAttributes = IFluidDataStoreAttributes1 | IFluidDataStoreAttributes2;
|
|
50
|
-
|
|
51
|
-
export function getAttributesFormatVersion(attributes: ReadFluidDataStoreAttributes): number {
|
|
52
|
-
if (attributes.summaryFormatVersion) {
|
|
53
|
-
/**
|
|
54
|
-
* Version 2+: Introduces .channels trees for isolation of
|
|
55
|
-
* channel trees from data store objects.
|
|
56
|
-
*/
|
|
57
|
-
return attributes.summaryFormatVersion;
|
|
58
|
-
} else if (attributes.snapshotFormatVersion === "0.1") {
|
|
59
|
-
/**
|
|
60
|
-
* Version 1: from this version the pkg within the data store
|
|
61
|
-
* attributes blob is a JSON array rather than a string.
|
|
62
|
-
*/
|
|
63
|
-
return 1;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Version 0: format version is missing from summary.
|
|
67
|
-
* This indicates it is an older version.
|
|
68
|
-
*/
|
|
69
|
-
return 0;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export function hasIsolatedChannels(attributes: ReadFluidDataStoreAttributes): boolean {
|
|
73
|
-
return !!attributes.summaryFormatVersion && !attributes.disableIsolatedChannels;
|
|
74
|
-
}
|
|
75
|
-
export interface IContainerRuntimeMetadata extends ICreateContainerMetadata, IGCMetadata {
|
|
76
|
-
readonly summaryFormatVersion: 1;
|
|
77
|
-
/** The last message processed at the time of summary. Only primitive property types are added to the summary. */
|
|
78
|
-
readonly message: ISummaryMetadataMessage | undefined;
|
|
79
|
-
/** True if channels are not isolated in .channels subtrees, otherwise isolated. */
|
|
80
|
-
readonly disableIsolatedChannels?: true;
|
|
81
|
-
/** The summary number for a container's summary. Incremented on summaries throughout its lifetime. */
|
|
82
|
-
readonly summaryNumber?: number;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export interface ICreateContainerMetadata {
|
|
86
|
-
/** Runtime version of the container when it was first created */
|
|
87
|
-
createContainerRuntimeVersion?: string;
|
|
88
|
-
/** Timestamp of the container when it was first created */
|
|
89
|
-
createContainerTimestamp?: number;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/** @see IGCMetadata.gcFeatureMatrix */
|
|
93
|
-
export interface GCFeatureMatrix {
|
|
94
|
-
/**
|
|
95
|
-
* The Tombstone Generation value in effect when this file was created.
|
|
96
|
-
* Gives a way for an app to disqualify old files from GC Tombstone enforcement
|
|
97
|
-
* Provided via Container Runtime Options
|
|
98
|
-
*/
|
|
99
|
-
tombstoneGeneration?: number;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
export type GCVersion = number;
|
|
103
|
-
export interface IGCMetadata {
|
|
104
|
-
/**
|
|
105
|
-
* The version of the GC code that was run to generate the GC data that is written in the summary.
|
|
106
|
-
* If the persisted value doesn't match the current value in the code, saved GC data will be discarded and regenerated from scratch.
|
|
107
|
-
* Also, used to determine whether GC is enabled for this container or not:
|
|
108
|
-
* - A value of 0 or undefined means GC is disabled.
|
|
109
|
-
* - A value greater than 0 means GC is enabled.
|
|
110
|
-
*/
|
|
111
|
-
readonly gcFeature?: GCVersion;
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Numerical indication of feature support as of file creation time, used to determine feature availability over time.
|
|
115
|
-
* This info may come from multiple sources (FF code, config service, app via Container Runtime Options),
|
|
116
|
-
* and pertains to aspects of the document that may be fixed for its lifetime.
|
|
117
|
-
*
|
|
118
|
-
* For each dimension, if the persisted value is less than the currently provided value,
|
|
119
|
-
* then this file does not support the corresponding feature as currently implemented.
|
|
120
|
-
*/
|
|
121
|
-
readonly gcFeatureMatrix?: GCFeatureMatrix;
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Tells whether the GC sweep phase is enabled for this container.
|
|
125
|
-
* - True means sweep phase is enabled.
|
|
126
|
-
* - False means sweep phase is disabled. If GC is disabled as per gcFeature, sweep is also disabled.
|
|
127
|
-
*/
|
|
128
|
-
readonly sweepEnabled?: boolean;
|
|
129
|
-
/** If this is present, the session for this container will expire after this time and the container will close */
|
|
130
|
-
readonly sessionExpiryTimeoutMs?: number;
|
|
131
|
-
/** How long to wait after an object is unreferenced before deleting it via GC Sweep */
|
|
132
|
-
readonly sweepTimeoutMs?: number;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/** The properties of an ISequencedDocumentMessage to be stored in the metadata blob in summary. */
|
|
136
|
-
export type ISummaryMetadataMessage = Pick<ISequencedDocumentMessage,
|
|
137
|
-
| "clientId"
|
|
138
|
-
| "clientSequenceNumber"
|
|
139
|
-
| "minimumSequenceNumber"
|
|
140
|
-
| "referenceSequenceNumber"
|
|
141
|
-
| "sequenceNumber"
|
|
142
|
-
| "timestamp"
|
|
143
|
-
| "type">;
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Extracts the properties from an ISequencedDocumentMessage as defined by ISummaryMetadataMessage. This message is
|
|
147
|
-
* added to the metadata blob in summary.
|
|
148
|
-
*/
|
|
149
|
-
export const extractSummaryMetadataMessage = (
|
|
150
|
-
message?: ISequencedDocumentMessage,
|
|
151
|
-
): ISummaryMetadataMessage | undefined => message === undefined ? undefined : {
|
|
152
|
-
clientId: message.clientId,
|
|
153
|
-
clientSequenceNumber: message.clientSequenceNumber,
|
|
154
|
-
minimumSequenceNumber: message.minimumSequenceNumber,
|
|
155
|
-
referenceSequenceNumber: message.referenceSequenceNumber,
|
|
156
|
-
sequenceNumber: message.sequenceNumber,
|
|
157
|
-
timestamp: message.timestamp,
|
|
158
|
-
type: message.type,
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
export function getMetadataFormatVersion(metadata?: IContainerRuntimeMetadata): number {
|
|
162
|
-
/**
|
|
163
|
-
* Version 2+: Introduces runtime sequence number for data verification.
|
|
164
|
-
*
|
|
165
|
-
* Version 1+: Introduces .metadata blob and .channels trees for isolation of
|
|
166
|
-
* data store trees from container-level objects.
|
|
167
|
-
* Also introduces enableGC option stored in the summary.
|
|
168
|
-
*
|
|
169
|
-
* Version 0: metadata blob missing; format version is missing from summary.
|
|
170
|
-
* This indicates it is an older version.
|
|
171
|
-
*/
|
|
172
|
-
return metadata?.summaryFormatVersion ?? 0;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
export const aliasBlobName = ".aliases";
|
|
176
|
-
export const metadataBlobName = ".metadata";
|
|
177
|
-
export const chunksBlobName = ".chunks";
|
|
178
|
-
export const electedSummarizerBlobName = ".electedSummarizer";
|
|
179
|
-
export const blobsTreeName = ".blobs";
|
|
180
|
-
|
|
181
|
-
export function rootHasIsolatedChannels(metadata?: IContainerRuntimeMetadata): boolean {
|
|
182
|
-
return !!metadata && !metadata.disableIsolatedChannels;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
export function getGCVersion(metadata?: IGCMetadata): GCVersion {
|
|
186
|
-
if (!metadata) {
|
|
187
|
-
// Force to 0/disallowed in prior versions
|
|
188
|
-
return 0;
|
|
189
|
-
}
|
|
190
|
-
return metadata.gcFeature ?? 0;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
export const protocolTreeName = ".protocol";
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* List of tree IDs at the container level which are reserved.
|
|
197
|
-
* This is for older versions of summaries that do not yet have an
|
|
198
|
-
* isolated data stores namespace. Without the namespace, this must
|
|
199
|
-
* be used to prevent name collisions with data store IDs.
|
|
200
|
-
*/
|
|
201
|
-
export const nonDataStorePaths = [protocolTreeName, ".logTail", ".serviceProtocol", blobsTreeName, gcTreeKey];
|
|
202
|
-
|
|
203
|
-
export const dataStoreAttributesBlobName = ".component";
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* Modifies summary tree and stats to put tree under .channels tree.
|
|
207
|
-
*
|
|
208
|
-
* @param summarizeResult - Summary tree and stats to modify
|
|
209
|
-
*
|
|
210
|
-
* @example
|
|
211
|
-
* Converts from:
|
|
212
|
-
* ```typescript
|
|
213
|
-
* {
|
|
214
|
-
* type: SummaryType.Tree,
|
|
215
|
-
* tree: { a: {...}, b: {...}, c: {...} },
|
|
216
|
-
* }
|
|
217
|
-
* ```
|
|
218
|
-
*
|
|
219
|
-
* to:
|
|
220
|
-
*
|
|
221
|
-
* ```typescript
|
|
222
|
-
* {
|
|
223
|
-
* type: SummaryType.Tree,
|
|
224
|
-
* tree: {
|
|
225
|
-
* ".channels": {
|
|
226
|
-
* type: SummaryType.Tree,
|
|
227
|
-
* tree: { a: {...}, b: {...}, c: {...} }
|
|
228
|
-
* },
|
|
229
|
-
* },
|
|
230
|
-
* }
|
|
231
|
-
* ```
|
|
232
|
-
* And adds +1 to treeNodeCount in stats.
|
|
233
|
-
*/
|
|
234
|
-
export function wrapSummaryInChannelsTree(summarizeResult: ISummaryTreeWithStats): void {
|
|
235
|
-
summarizeResult.summary = {
|
|
236
|
-
type: SummaryType.Tree,
|
|
237
|
-
tree: { [channelsTreeName]: summarizeResult.summary },
|
|
238
|
-
};
|
|
239
|
-
summarizeResult.stats.treeNodeCount++;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
export async function getFluidDataStoreAttributes(
|
|
243
|
-
storage: IDocumentStorageService,
|
|
244
|
-
snapshot: ISnapshotTree,
|
|
245
|
-
): Promise<ReadFluidDataStoreAttributes> {
|
|
246
|
-
const attributes = await readAndParse<ReadFluidDataStoreAttributes>(
|
|
247
|
-
storage, snapshot.blobs[dataStoreAttributesBlobName]);
|
|
248
|
-
// Use the snapshotFormatVersion to determine how the pkg is encoded in the snapshot.
|
|
249
|
-
// For snapshotFormatVersion = "0.1" (1) or above, pkg is jsonified, otherwise it is just a string.
|
|
250
|
-
// However the feature of loading a detached container from snapshot, is added when the
|
|
251
|
-
// snapshotFormatVersion is at least "0.1" (1), so we don't expect it to be anything else.
|
|
252
|
-
const formatVersion = getAttributesFormatVersion(attributes);
|
|
253
|
-
assert(formatVersion > 0,
|
|
254
|
-
0x1d5 /* Invalid snapshot format version */);
|
|
255
|
-
return attributes;
|
|
256
|
-
}
|