@fluidframework/container-runtime 2.118.1 → 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 +68 -4
- package/README.md +53 -50
- package/{api-extractor.json → api-extractor/api-extractor-model.json} +1 -1
- package/api-report/container-runtime.legacy.alpha.api.md +3 -1
- package/api-report/container-runtime.legacy.beta.api.md +3 -1
- package/container-runtime.test-files.tar +0 -0
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +5 -1
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager/blobManager.d.ts +1 -1
- package/dist/blobManager/blobManager.d.ts.map +1 -1
- package/dist/blobManager/blobManager.js +264 -231
- package/dist/blobManager/blobManager.js.map +1 -1
- package/dist/blobManager/blobManagerSnapSum.d.ts.map +1 -1
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +70 -58
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.js +38 -20
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerCompatibility.d.ts +3 -3
- package/dist/containerCompatibility.d.ts.map +1 -1
- package/dist/containerCompatibility.js +36 -45
- package/dist/containerCompatibility.js.map +1 -1
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js +4 -0
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +4 -4
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +346 -223
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +9 -1
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +184 -127
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.js +43 -42
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.js +1 -0
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/deltaManagerProxies.js +5 -0
- package/dist/deltaManagerProxies.js.map +1 -1
- package/dist/deltaScheduler.js +104 -99
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/error.js +2 -1
- package/dist/error.js.map +1 -1
- package/dist/gc/garbageCollection.js +85 -55
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.js +2 -3
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcHelpers.js +12 -13
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcReferenceGraphAlgorithm.js +1 -2
- package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +8 -3
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.js +12 -5
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js +18 -1
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/inboundBatchAggregator.js +122 -117
- package/dist/inboundBatchAggregator.js.map +1 -1
- package/dist/metadata.d.ts.map +1 -1
- package/dist/metadata.js +3 -3
- package/dist/metadata.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js +11 -5
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/duplicateBatchDetector.js +18 -18
- package/dist/opLifecycle/duplicateBatchDetector.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +2 -2
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +2 -1
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.js +2 -1
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +10 -6
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +5 -3
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSerialization.d.ts +11 -1
- package/dist/opLifecycle/opSerialization.d.ts.map +1 -1
- package/dist/opLifecycle/opSerialization.js +22 -6
- package/dist/opLifecycle/opSerialization.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +17 -1
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +46 -9
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +17 -13
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +6 -3
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/opProperties.d.ts.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.js +54 -47
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/runCounter.js +10 -30
- package/dist/runCounter.js.map +1 -1
- package/dist/runtimeLayerCompatState.d.ts +1 -1
- package/dist/runtimeLayerCompatState.d.ts.map +1 -1
- package/dist/runtimeLayerCompatState.js +31 -11
- package/dist/runtimeLayerCompatState.js.map +1 -1
- package/dist/signalTelemetryProcessing.js +15 -17
- package/dist/signalTelemetryProcessing.js.map +1 -1
- package/dist/storageServiceWithAttachBlobs.js +2 -0
- package/dist/storageServiceWithAttachBlobs.js.map +1 -1
- package/dist/summary/documentSchema.d.ts.map +1 -1
- package/dist/summary/documentSchema.js +51 -13
- package/dist/summary/documentSchema.js.map +1 -1
- package/dist/summary/orderedClientElection.js +25 -17
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js +18 -7
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +22 -13
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +20 -6
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerUtils.d.ts.map +1 -1
- package/dist/summary/summarizerUtils.js +4 -3
- package/dist/summary/summarizerUtils.js.map +1 -1
- package/dist/summary/summaryCollection.js +23 -11
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.js +4 -2
- package/dist/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/summaryDelayLoadedModule/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/summaryDelayLoadedModule/runningSummarizer.js +65 -46
- package/dist/summary/summaryDelayLoadedModule/runningSummarizer.js.map +1 -1
- package/dist/summary/summaryDelayLoadedModule/summarizer.d.ts.map +1 -1
- package/dist/summary/summaryDelayLoadedModule/summarizer.js +15 -6
- package/dist/summary/summaryDelayLoadedModule/summarizer.js.map +1 -1
- package/dist/summary/summaryDelayLoadedModule/summarizerHeuristics.js +30 -25
- package/dist/summary/summaryDelayLoadedModule/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summaryDelayLoadedModule/summaryGenerator.js +9 -0
- package/dist/summary/summaryDelayLoadedModule/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryDelayLoadedModule/summaryResultBuilder.js +3 -5
- package/dist/summary/summaryDelayLoadedModule/summaryResultBuilder.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js +7 -7
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryHelpers.js +5 -5
- package/dist/summary/summaryHelpers.js.map +1 -1
- package/dist/summary/summaryManager.js +66 -54
- package/dist/summary/summaryManager.js.map +1 -1
- package/dist/throttler.d.ts.map +1 -1
- package/dist/throttler.js +4 -1
- package/dist/throttler.js.map +1 -1
- package/dist/versionMarks/inboundBatch.d.ts +8 -6
- package/dist/versionMarks/inboundBatch.d.ts.map +1 -1
- package/dist/versionMarks/inboundBatch.js +11 -7
- package/dist/versionMarks/inboundBatch.js.map +1 -1
- package/dist/versionMarks/versionMarkResolver.d.ts +30 -23
- package/dist/versionMarks/versionMarkResolver.d.ts.map +1 -1
- package/dist/versionMarks/versionMarkResolver.js +112 -63
- package/dist/versionMarks/versionMarkResolver.js.map +1 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +5 -1
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager/blobManager.d.ts +1 -1
- package/lib/blobManager/blobManager.d.ts.map +1 -1
- package/lib/blobManager/blobManager.js +264 -231
- package/lib/blobManager/blobManager.js.map +1 -1
- package/lib/blobManager/blobManagerSnapSum.d.ts.map +1 -1
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +65 -53
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.js +36 -18
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerCompatibility.d.ts +3 -3
- package/lib/containerCompatibility.d.ts.map +1 -1
- package/lib/containerCompatibility.js +33 -42
- package/lib/containerCompatibility.js.map +1 -1
- package/lib/containerHandleContext.d.ts.map +1 -1
- package/lib/containerHandleContext.js +4 -0
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +4 -4
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +341 -218
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +9 -1
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +182 -125
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.js +43 -42
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.js +1 -0
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/deltaManagerProxies.js +5 -0
- package/lib/deltaManagerProxies.js.map +1 -1
- package/lib/deltaScheduler.js +104 -99
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/error.js +2 -1
- package/lib/error.js.map +1 -1
- package/lib/gc/garbageCollection.js +85 -55
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +8 -3
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.js +12 -5
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js +18 -1
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/lib/inboundBatchAggregator.js +122 -117
- package/lib/inboundBatchAggregator.js.map +1 -1
- package/lib/legacy.d.ts +1 -1
- package/lib/legacyAlpha.d.ts +1 -1
- package/lib/metadata.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js +8 -2
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/duplicateBatchDetector.js +18 -18
- package/lib/opLifecycle/duplicateBatchDetector.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +2 -2
- 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.js +3 -2
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +10 -6
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +3 -1
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSerialization.d.ts +11 -1
- package/lib/opLifecycle/opSerialization.d.ts.map +1 -1
- package/lib/opLifecycle/opSerialization.js +16 -0
- package/lib/opLifecycle/opSerialization.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +17 -1
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +44 -7
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +14 -10
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +4 -1
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/opProperties.d.ts.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.js +52 -45
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/public.d.ts +1 -1
- package/lib/runCounter.js +10 -30
- package/lib/runCounter.js.map +1 -1
- package/lib/runtimeLayerCompatState.d.ts +1 -1
- package/lib/runtimeLayerCompatState.d.ts.map +1 -1
- package/lib/runtimeLayerCompatState.js +28 -8
- package/lib/runtimeLayerCompatState.js.map +1 -1
- package/lib/signalTelemetryProcessing.js +15 -17
- package/lib/signalTelemetryProcessing.js.map +1 -1
- package/lib/storageServiceWithAttachBlobs.js +2 -0
- package/lib/storageServiceWithAttachBlobs.js.map +1 -1
- package/lib/summary/documentSchema.d.ts.map +1 -1
- package/lib/summary/documentSchema.js +51 -13
- package/lib/summary/documentSchema.js.map +1 -1
- package/lib/summary/orderedClientElection.js +25 -17
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js +18 -7
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +22 -13
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +20 -6
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerUtils.d.ts.map +1 -1
- package/lib/summary/summarizerUtils.js +1 -0
- package/lib/summary/summarizerUtils.js.map +1 -1
- package/lib/summary/summaryCollection.js +23 -11
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.js +4 -2
- package/lib/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/summaryDelayLoadedModule/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/summaryDelayLoadedModule/runningSummarizer.js +65 -46
- package/lib/summary/summaryDelayLoadedModule/runningSummarizer.js.map +1 -1
- package/lib/summary/summaryDelayLoadedModule/summarizer.d.ts.map +1 -1
- package/lib/summary/summaryDelayLoadedModule/summarizer.js +15 -6
- package/lib/summary/summaryDelayLoadedModule/summarizer.js.map +1 -1
- package/lib/summary/summaryDelayLoadedModule/summarizerHeuristics.js +30 -25
- package/lib/summary/summaryDelayLoadedModule/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summaryDelayLoadedModule/summaryGenerator.js +9 -0
- package/lib/summary/summaryDelayLoadedModule/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryDelayLoadedModule/summaryResultBuilder.js +3 -5
- package/lib/summary/summaryDelayLoadedModule/summaryResultBuilder.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +66 -54
- package/lib/summary/summaryManager.js.map +1 -1
- package/lib/throttler.d.ts.map +1 -1
- package/lib/throttler.js +4 -1
- package/lib/throttler.js.map +1 -1
- package/lib/versionMarks/inboundBatch.d.ts +8 -6
- package/lib/versionMarks/inboundBatch.d.ts.map +1 -1
- package/lib/versionMarks/inboundBatch.js +10 -5
- package/lib/versionMarks/inboundBatch.js.map +1 -1
- package/lib/versionMarks/versionMarkResolver.d.ts +30 -23
- package/lib/versionMarks/versionMarkResolver.d.ts.map +1 -1
- package/lib/versionMarks/versionMarkResolver.js +112 -63
- package/lib/versionMarks/versionMarkResolver.js.map +1 -1
- package/package.json +60 -102
- package/src/containerCompatibility.ts +33 -42
- package/src/containerRuntime.ts +15 -12
- package/src/opLifecycle/index.ts +7 -1
- package/src/opLifecycle/opCompressor.ts +2 -2
- package/src/opLifecycle/opSerialization.ts +22 -1
- package/src/opLifecycle/opSplitter.ts +63 -6
- package/src/packageVersion.ts +1 -1
- package/src/runtimeLayerCompatState.ts +28 -21
- package/src/summary/documentSchema.ts +31 -6
- package/src/versionMarks/DEV.md +595 -157
- package/src/versionMarks/inboundBatch.ts +18 -8
- package/src/versionMarks/versionMarkResolver.ts +144 -75
- package/tsconfig.json +1 -1
- package/internal.d.ts +0 -11
- package/legacy/alpha.d.ts +0 -11
- package/legacy.d.ts +0 -11
- /package/api-extractor/{api-extractor.current.json → api-extractor-report.current.json} +0 -0
- /package/api-extractor/{api-extractor.legacy.json → api-extractor-report.legacy.json} +0 -0
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.
|
|
7
|
+
exports.dataStoreSupportRequirementsForRuntime = exports.runtimeCompatDetailsForDataStore = exports.loaderSupportRequirementsForRuntime = exports.runtimeCompatDetailsForLoader = exports.runtimeCoreCompatDetails = exports.disableStrictLoaderLayerCompatibilityCheckKey = void 0;
|
|
8
|
+
exports.validateLoaderCompatibility = validateLoaderCompatibility;
|
|
9
|
+
exports.validateDatastoreCompatibility = validateDatastoreCompatibility;
|
|
8
10
|
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
9
11
|
const internal_1 = require("@fluidframework/runtime-definitions/internal");
|
|
10
12
|
const internal_2 = require("@fluidframework/telemetry-utils/internal");
|
|
@@ -45,11 +47,12 @@ exports.runtimeCompatDetailsForLoader = {
|
|
|
45
47
|
exports.loaderSupportRequirementsForRuntime = {
|
|
46
48
|
/**
|
|
47
49
|
* Minimum generation that Loader must be at to be compatible with this Runtime. This is calculated
|
|
48
|
-
* based on the LayerCompatibilityPolicyWindowMonths.
|
|
49
|
-
* the Loader layer be compared to the Runtime layer for them to still be considered compatible.
|
|
50
|
+
* based on the LayerCompatibilityPolicyWindowMonths.NewRuntimeOldLoader value which defines how many months
|
|
51
|
+
* old can the Loader layer be compared to the Runtime layer for them to still be considered compatible.
|
|
50
52
|
* The minimum valid generation value is 0.
|
|
51
53
|
*/
|
|
52
|
-
minSupportedGeneration: Math.max(0, exports.runtimeCoreCompatDetails.generation -
|
|
54
|
+
minSupportedGeneration: Math.max(0, exports.runtimeCoreCompatDetails.generation -
|
|
55
|
+
client_utils_1.LayerCompatibilityPolicyWindowMonths.NewRuntimeOldLoader),
|
|
53
56
|
/**
|
|
54
57
|
* The features that the Loader must support to be compatible with Runtime.
|
|
55
58
|
*/
|
|
@@ -73,12 +76,12 @@ exports.runtimeCompatDetailsForDataStore = {
|
|
|
73
76
|
exports.dataStoreSupportRequirementsForRuntime = {
|
|
74
77
|
/**
|
|
75
78
|
* Minimum generation that DataStore must be at to be compatible with this Runtime. This is calculated
|
|
76
|
-
* based on the LayerCompatibilityPolicyWindowMonths.
|
|
77
|
-
* the DataStore layer be compared to the Runtime layer for them to still be considered compatible.
|
|
79
|
+
* based on the LayerCompatibilityPolicyWindowMonths.NewRuntimeOldDataStore value which defines how many months
|
|
80
|
+
* old can the DataStore layer be compared to the Runtime layer for them to still be considered compatible.
|
|
78
81
|
* The minimum valid generation value is 0.
|
|
79
82
|
*/
|
|
80
83
|
minSupportedGeneration: Math.max(0, exports.runtimeCoreCompatDetails.generation -
|
|
81
|
-
client_utils_1.LayerCompatibilityPolicyWindowMonths.
|
|
84
|
+
client_utils_1.LayerCompatibilityPolicyWindowMonths.NewRuntimeOldDataStore),
|
|
82
85
|
/**
|
|
83
86
|
* The features that the DataStore must support to be compatible with Runtime.
|
|
84
87
|
*/
|
|
@@ -94,15 +97,32 @@ function validateLoaderCompatibility(maybeLoaderCompatDetailsForRuntime, dispose
|
|
|
94
97
|
// since Loader can drift far from the Runtime causing issues.
|
|
95
98
|
// Can be disabled via config `disableStrictLoaderLayerCompatibilityCheckKey`.
|
|
96
99
|
const disableStrictLoaderLayerCompatibilityCheck = mc.config.getBoolean(exports.disableStrictLoaderLayerCompatibilityCheckKey);
|
|
97
|
-
(0, internal_2.validateLayerCompatibility)(
|
|
100
|
+
(0, internal_2.validateLayerCompatibility)(
|
|
101
|
+
/* validatingLayer */ {
|
|
102
|
+
layer: "runtime",
|
|
103
|
+
packageInfo: exports.runtimeCoreCompatDetails,
|
|
104
|
+
compatSupportRequirements: exports.loaderSupportRequirementsForRuntime,
|
|
105
|
+
},
|
|
106
|
+
/* targetLayer */ {
|
|
107
|
+
layer: "loader",
|
|
108
|
+
compatDetails: maybeLoaderCompatDetailsForRuntime,
|
|
109
|
+
strictCompatibilityCheck: disableStrictLoaderLayerCompatibilityCheck !== true,
|
|
110
|
+
}, { disposeFn, mc });
|
|
98
111
|
}
|
|
99
|
-
exports.validateLoaderCompatibility = validateLoaderCompatibility;
|
|
100
112
|
/**
|
|
101
113
|
* Validates that the DataStore layer is compatible with this Runtime.
|
|
102
114
|
* @internal
|
|
103
115
|
*/
|
|
104
116
|
function validateDatastoreCompatibility(maybeDataStoreCompatDetailsForRuntime, disposeFn, mc) {
|
|
105
|
-
(0, internal_2.validateLayerCompatibility)(
|
|
117
|
+
(0, internal_2.validateLayerCompatibility)(
|
|
118
|
+
/* validatingLayer */ {
|
|
119
|
+
layer: "runtime",
|
|
120
|
+
packageInfo: exports.runtimeCoreCompatDetails,
|
|
121
|
+
compatSupportRequirements: exports.dataStoreSupportRequirementsForRuntime,
|
|
122
|
+
},
|
|
123
|
+
/* targetLayer */ {
|
|
124
|
+
layer: "dataStore",
|
|
125
|
+
compatDetails: maybeDataStoreCompatDetailsForRuntime,
|
|
126
|
+
}, { disposeFn, mc });
|
|
106
127
|
}
|
|
107
|
-
exports.validateDatastoreCompatibility = validateDatastoreCompatibility;
|
|
108
128
|
//# sourceMappingURL=runtimeLayerCompatState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtimeLayerCompatState.js","sourceRoot":"","sources":["../src/runtimeLayerCompatState.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"runtimeLayerCompatState.js","sourceRoot":"","sources":["../src/runtimeLayerCompatState.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAiHH,kEA0BC;AAMD,wEAiBC;AAhKD,+DAKsC;AAEtC,2EAGsD;AACtD,uEAGkD;AAElD,2DAAiD;AAEjD;;GAEG;AACU,QAAA,6CAA6C,GACzD,mEAAmE,CAAC;AAErE;;;GAGG;AACU,QAAA,wBAAwB,GAAG;IACvC;;OAEG;IACH,UAAU,EAAV,8BAAU;IACV;;OAEG;IACH,UAAU,EAAV,yBAAU;CACD,CAAC;AAEX;;;GAGG;AACU,QAAA,6BAA6B,GAAwB;IACjE,GAAG,gCAAwB;IAC3B;;OAEG;IACH,iBAAiB,EAAE,IAAI,GAAG,EAAU;CACpC,CAAC;AAEF;;;GAGG;AACU,QAAA,mCAAmC,GAAoC;IACnF;;;;;OAKG;IACH,sBAAsB,EAAE,IAAI,CAAC,GAAG,CAC/B,CAAC,EACD,gCAAwB,CAAC,UAAU;QAClC,mDAAoC,CAAC,mBAAmB,CACzD;IACD;;OAEG;IACH,gBAAgB,EAAE,EAAE;CACpB,CAAC;AAEF;;;GAGG;AACU,QAAA,gCAAgC,GAAwB;IACpE,GAAG,gCAAwB;IAC3B;;OAEG;IACH,iBAAiB,EAAE,IAAI,GAAG,CAAS,CAAC,0CAA+B,EAAE,gCAAqB,CAAC,CAAC;CAC5F,CAAC;AAEF;;;GAGG;AACU,QAAA,sCAAsC,GAAoC;IACtF;;;;;OAKG;IACH,sBAAsB,EAAE,IAAI,CAAC,GAAG,CAC/B,CAAC,EACD,gCAAwB,CAAC,UAAU;QAClC,mDAAoC,CAAC,sBAAsB,CAC5D;IACD;;OAEG;IACH,gBAAgB,EAAE,EAAE;CACpB,CAAC;AAEF;;;GAGG;AACH,SAAgB,2BAA2B,CAC1C,kCAAmE,EACnE,SAAoD,EACpD,EAAqB;IAErB,uGAAuG;IACvG,wEAAwE;IACxE,8DAA8D;IAC9D,8EAA8E;IAC9E,MAAM,0CAA0C,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CACtE,qDAA6C,CAC7C,CAAC;IAEF,IAAA,qCAA0B;IACzB,qBAAqB,CAAC;QACrB,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,gCAAwB;QACrC,yBAAyB,EAAE,2CAAmC;KAC9D;IACD,iBAAiB,CAAC;QACjB,KAAK,EAAE,QAAQ;QACf,aAAa,EAAE,kCAAkC;QACjD,wBAAwB,EAAE,0CAA0C,KAAK,IAAI;KAC7E,EACD,EAAE,SAAS,EAAE,EAAE,EAAE,CACjB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,8BAA8B,CAC7C,qCAAsE,EACtE,SAAqB,EACrB,EAAqB;IAErB,IAAA,qCAA0B;IACzB,qBAAqB,CAAC;QACrB,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,gCAAwB;QACrC,yBAAyB,EAAE,8CAAsC;KACjE;IACD,iBAAiB,CAAC;QACjB,KAAK,EAAE,WAAW;QAClB,aAAa,EAAE,qCAAqC;KACpD,EACD,EAAE,SAAS,EAAE,EAAE,EAAE,CACjB,CAAC;AACH,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tgeneration,\n\tLayerCompatibilityPolicyWindowMonths,\n\ttype ILayerCompatDetails,\n\ttype ILayerCompatSupportRequirements,\n} from \"@fluid-internal/client-utils\";\nimport type { ICriticalContainerError } from \"@fluidframework/container-definitions\";\nimport {\n\tencodeHandlesInContainerRuntime,\n\tnotifiesReadOnlyState,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport {\n\tvalidateLayerCompatibility,\n\ttype MonitoringContext,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport { pkgVersion } from \"./packageVersion.js\";\n\n/**\n * The config key to disable strict loader layer compatibility check.\n */\nexport const disableStrictLoaderLayerCompatibilityCheckKey =\n\t\"Fluid.ContainerRuntime.DisableStrictLoaderLayerCompatibilityCheck\";\n\n/**\n * The core compatibility details of the Runtime layer that is the same across all layer boundaries.\n * @internal\n */\nexport const runtimeCoreCompatDetails = {\n\t/**\n\t * The package version of the Runtime layer.\n\t */\n\tpkgVersion,\n\t/**\n\t * The current generation of the Runtime layer.\n\t */\n\tgeneration,\n} as const;\n\n/**\n * Runtime's compatibility details that is exposed to the Loader layer.\n * @internal\n */\nexport const runtimeCompatDetailsForLoader: ILayerCompatDetails = {\n\t...runtimeCoreCompatDetails,\n\t/**\n\t * The features supported by the Runtime layer across the Runtime / Loader boundary.\n\t */\n\tsupportedFeatures: new Set<string>(),\n};\n\n/**\n * The requirements that the Loader layer must meet to be compatible with this Runtime.\n * @internal\n */\nexport const loaderSupportRequirementsForRuntime: ILayerCompatSupportRequirements = {\n\t/**\n\t * Minimum generation that Loader must be at to be compatible with this Runtime. This is calculated\n\t * based on the LayerCompatibilityPolicyWindowMonths.NewRuntimeOldLoader value which defines how many months\n\t * old can the Loader layer be compared to the Runtime layer for them to still be considered compatible.\n\t * The minimum valid generation value is 0.\n\t */\n\tminSupportedGeneration: Math.max(\n\t\t0,\n\t\truntimeCoreCompatDetails.generation -\n\t\t\tLayerCompatibilityPolicyWindowMonths.NewRuntimeOldLoader,\n\t),\n\t/**\n\t * The features that the Loader must support to be compatible with Runtime.\n\t */\n\trequiredFeatures: [],\n};\n\n/**\n * Runtime's compatibility details that is exposed to the DataStore layer.\n * @internal\n */\nexport const runtimeCompatDetailsForDataStore: ILayerCompatDetails = {\n\t...runtimeCoreCompatDetails,\n\t/**\n\t * The features supported by the Runtime layer across the Runtime / DataStore boundary.\n\t */\n\tsupportedFeatures: new Set<string>([encodeHandlesInContainerRuntime, notifiesReadOnlyState]),\n};\n\n/**\n * The requirements that the DataStore layer must meet to be compatible with this Runtime.\n * @internal\n */\nexport const dataStoreSupportRequirementsForRuntime: ILayerCompatSupportRequirements = {\n\t/**\n\t * Minimum generation that DataStore must be at to be compatible with this Runtime. This is calculated\n\t * based on the LayerCompatibilityPolicyWindowMonths.NewRuntimeOldDataStore value which defines how many months\n\t * old can the DataStore layer be compared to the Runtime layer for them to still be considered compatible.\n\t * The minimum valid generation value is 0.\n\t */\n\tminSupportedGeneration: Math.max(\n\t\t0,\n\t\truntimeCoreCompatDetails.generation -\n\t\t\tLayerCompatibilityPolicyWindowMonths.NewRuntimeOldDataStore,\n\t),\n\t/**\n\t * The features that the DataStore must support to be compatible with Runtime.\n\t */\n\trequiredFeatures: [],\n};\n\n/**\n * Validates that the Loader layer is compatible with this Runtime.\n * @internal\n */\nexport function validateLoaderCompatibility(\n\tmaybeLoaderCompatDetailsForRuntime: ILayerCompatDetails | undefined,\n\tdisposeFn: (error?: ICriticalContainerError) => void,\n\tmc: MonitoringContext,\n): void {\n\t// By default, use strictCompatibilityCheck here - If the Loader doesn't provide compatibility details,\n\t// assume it's a very old version and should be considered incompatible,\n\t// since Loader can drift far from the Runtime causing issues.\n\t// Can be disabled via config `disableStrictLoaderLayerCompatibilityCheckKey`.\n\tconst disableStrictLoaderLayerCompatibilityCheck = mc.config.getBoolean(\n\t\tdisableStrictLoaderLayerCompatibilityCheckKey,\n\t);\n\n\tvalidateLayerCompatibility(\n\t\t/* validatingLayer */ {\n\t\t\tlayer: \"runtime\",\n\t\t\tpackageInfo: runtimeCoreCompatDetails,\n\t\t\tcompatSupportRequirements: loaderSupportRequirementsForRuntime,\n\t\t},\n\t\t/* targetLayer */ {\n\t\t\tlayer: \"loader\",\n\t\t\tcompatDetails: maybeLoaderCompatDetailsForRuntime,\n\t\t\tstrictCompatibilityCheck: disableStrictLoaderLayerCompatibilityCheck !== true,\n\t\t},\n\t\t{ disposeFn, mc },\n\t);\n}\n\n/**\n * Validates that the DataStore layer is compatible with this Runtime.\n * @internal\n */\nexport function validateDatastoreCompatibility(\n\tmaybeDataStoreCompatDetailsForRuntime: ILayerCompatDetails | undefined,\n\tdisposeFn: () => void,\n\tmc: MonitoringContext,\n): void {\n\tvalidateLayerCompatibility(\n\t\t/* validatingLayer */ {\n\t\t\tlayer: \"runtime\",\n\t\t\tpackageInfo: runtimeCoreCompatDetails,\n\t\t\tcompatSupportRequirements: dataStoreSupportRequirementsForRuntime,\n\t\t},\n\t\t/* targetLayer */ {\n\t\t\tlayer: \"dataStore\",\n\t\t\tcompatDetails: maybeDataStoreCompatDetailsForRuntime,\n\t\t},\n\t\t{ disposeFn, mc },\n\t);\n}\n"]}
|
|
@@ -7,23 +7,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
exports.SignalTelemetryManager = void 0;
|
|
8
8
|
const defaultTelemetrySignalSampleCount = 100;
|
|
9
9
|
class SignalTelemetryManager {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
this.broadcastSignalSequenceNumber = 0;
|
|
26
|
-
}
|
|
10
|
+
signalTracking = {
|
|
11
|
+
totalSignalsSentInLatencyWindow: 0,
|
|
12
|
+
signalsLost: 0,
|
|
13
|
+
signalsOutOfOrder: 0,
|
|
14
|
+
signalsSentSinceLastLatencyMeasurement: 0,
|
|
15
|
+
signalTimestamp: 0,
|
|
16
|
+
roundTripSignalSequenceNumber: undefined,
|
|
17
|
+
trackingSignalSequenceNumber: undefined,
|
|
18
|
+
minimumTrackingSignalSequenceNumber: undefined,
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Identifier to track broadcast signals being submitted in order to
|
|
22
|
+
* allow collection of data around the roundtrip of signal messages.
|
|
23
|
+
*/
|
|
24
|
+
broadcastSignalSequenceNumber = 0;
|
|
27
25
|
/**
|
|
28
26
|
* Resets the signal tracking state in the {@link SignalTelemetryManager}.
|
|
29
27
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signalTelemetryProcessing.js","sourceRoot":"","sources":["../src/signalTelemetryProcessing.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 type { ISignalEnvelope } from \"@fluidframework/core-interfaces/internal\";\nimport type {\n\tTelemetryEventPropertyTypeExt,\n\tTelemetryLoggerExt,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nconst defaultTelemetrySignalSampleCount = 100;\n\n/**\n * Set of stats/values used to keep track of telemetry related to signals.\n */\ninterface ISignalTelemetryTracking {\n\t/**\n\t * Accumulates the total number of broadcast signals sent during the current signal latency measurement window.\n\t * This value represents the total number of signals sent since the latency measurement began and is used\n\t * logged in telemetry when the latency measurement completes.\n\t */\n\ttotalSignalsSentInLatencyWindow: number;\n\n\t/**\n\t * Counts the number of broadcast signals sent since the last latency measurement was initiated.\n\t * This counter increments with each broadcast signal sent. When a new latency measurement starts,\n\t * this counter is added to `totalSignalsSentInLatencyWindow` and then reset to zero.\n\t */\n\tsignalsSentSinceLastLatencyMeasurement: number;\n\n\t/**\n\t * Number of signals that were expected but not received.\n\t */\n\tsignalsLost: number;\n\n\t/**\n\t * Number of signals received out of order/non-sequentially.\n\t */\n\tsignalsOutOfOrder: number;\n\n\t/**\n\t * Timestamp before submitting the signal we will trace.\n\t */\n\tsignalTimestamp: number;\n\n\t/**\n\t * Signal we will trace for roundtrip latency.\n\t */\n\troundTripSignalSequenceNumber: number | undefined;\n\n\t/**\n\t * Next expected signal sequence number to be received.\n\t */\n\ttrackingSignalSequenceNumber: number | undefined;\n\n\t/**\n\t * Inclusive lower bound of signal monitoring window.\n\t * Used by the logic that checks if signals are received out of order.\n\t */\n\tminimumTrackingSignalSequenceNumber: number | undefined;\n}\n\nexport class SignalTelemetryManager {\n\tprivate readonly signalTracking: ISignalTelemetryTracking = {\n\t\ttotalSignalsSentInLatencyWindow: 0,\n\t\tsignalsLost: 0,\n\t\tsignalsOutOfOrder: 0,\n\t\tsignalsSentSinceLastLatencyMeasurement: 0,\n\t\tsignalTimestamp: 0,\n\t\troundTripSignalSequenceNumber: undefined,\n\t\ttrackingSignalSequenceNumber: undefined,\n\t\tminimumTrackingSignalSequenceNumber: undefined,\n\t};\n\n\t/**\n\t * Identifier to track broadcast signals being submitted in order to\n\t * allow collection of data around the roundtrip of signal messages.\n\t */\n\tprivate broadcastSignalSequenceNumber: number = 0;\n\n\t/**\n\t * Resets the signal tracking state in the {@link SignalTelemetryManager}.\n\t */\n\tpublic resetTracking(): void {\n\t\tthis.signalTracking.signalsLost = 0;\n\t\tthis.signalTracking.signalsOutOfOrder = 0;\n\t\tthis.signalTracking.signalTimestamp = 0;\n\t\tthis.signalTracking.signalsSentSinceLastLatencyMeasurement = 0;\n\t\tthis.signalTracking.totalSignalsSentInLatencyWindow = 0;\n\t\tthis.signalTracking.roundTripSignalSequenceNumber = undefined;\n\t\tthis.signalTracking.trackingSignalSequenceNumber = undefined;\n\t\tthis.signalTracking.minimumTrackingSignalSequenceNumber = undefined;\n\t}\n\n\t/**\n\t * Perform telemetry-related processing of incoming signals.\n\t * @param envelope - The signal envelope to process.\n\t * @param logger - The telemetry logger to use for emitting telemetry events.\n\t * @param consecutiveReconnects - The number of consecutive reconnects that have occurred. Only used for logging.\n\t */\n\tpublic trackReceivedSignal(\n\t\tenvelope: ISignalEnvelope,\n\t\tlogger: TelemetryLoggerExt,\n\t\tconsecutiveReconnects: number,\n\t): void {\n\t\tconst {\n\t\t\tclientBroadcastSignalSequenceNumber,\n\t\t\tcontents: envelopeContents,\n\t\t\taddress: envelopeAddress,\n\t\t} = envelope;\n\n\t\tif (clientBroadcastSignalSequenceNumber === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// If no tracking window has been set, nothing to do\n\t\tif (\n\t\t\tthis.signalTracking.trackingSignalSequenceNumber === undefined ||\n\t\t\tthis.signalTracking.minimumTrackingSignalSequenceNumber === undefined\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (\n\t\t\tclientBroadcastSignalSequenceNumber >= this.signalTracking.trackingSignalSequenceNumber\n\t\t) {\n\t\t\t// Calculate the number of signals lost and log the event.\n\t\t\tconst signalsLost =\n\t\t\t\tclientBroadcastSignalSequenceNumber - this.signalTracking.trackingSignalSequenceNumber;\n\t\t\tif (signalsLost > 0) {\n\t\t\t\tthis.signalTracking.signalsLost += signalsLost;\n\t\t\t\tlogger.sendErrorEvent({\n\t\t\t\t\teventName: \"SignalLost\",\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tsignalsLost, // Number of lost signals detected.\n\t\t\t\t\t\texpectedSequenceNumber: this.signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.\n\t\t\t\t\t\tclientBroadcastSignalSequenceNumber, // Actual signal sequence number received.\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Update the tracking signal sequence number to the next expected signal in the sequence.\n\t\t\tthis.signalTracking.trackingSignalSequenceNumber =\n\t\t\t\tclientBroadcastSignalSequenceNumber + 1;\n\t\t} else if (\n\t\t\t// Check if this is a signal in range of interest.\n\t\t\tclientBroadcastSignalSequenceNumber >=\n\t\t\tthis.signalTracking.minimumTrackingSignalSequenceNumber\n\t\t) {\n\t\t\tthis.signalTracking.signalsOutOfOrder++;\n\t\t\tconst details: TelemetryEventPropertyTypeExt = {\n\t\t\t\texpectedSequenceNumber: this.signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.\n\t\t\t\tclientBroadcastSignalSequenceNumber, // Sequence number of the out of order signal.\n\t\t\t};\n\t\t\t// Only log `contents.type` when address is for container to avoid chance that contents type is customer data.\n\t\t\tif (envelopeAddress === undefined) {\n\t\t\t\tdetails.contentsType = envelopeContents.type; // Type of signal that was received out of order.\n\t\t\t}\n\t\t\tlogger.sendTelemetryEvent({\n\t\t\t\teventName: \"SignalOutOfOrder\",\n\t\t\t\tdetails,\n\t\t\t});\n\t\t}\n\n\t\tif (\n\t\t\tthis.signalTracking.roundTripSignalSequenceNumber !== undefined &&\n\t\t\tclientBroadcastSignalSequenceNumber >= this.signalTracking.roundTripSignalSequenceNumber\n\t\t) {\n\t\t\tif (\n\t\t\t\tclientBroadcastSignalSequenceNumber ===\n\t\t\t\tthis.signalTracking.roundTripSignalSequenceNumber\n\t\t\t) {\n\t\t\t\t// Latency tracked signal has been received.\n\t\t\t\t// We now emit telemetry with the roundtrip duration of the tracked signal.\n\t\t\t\t// The telemetry event also includes metrics for broadcast signals (sent, lost, and out of order),\n\t\t\t\t// and these metrics are reset after emitting the event.\n\t\t\t\tconst duration = Date.now() - this.signalTracking.signalTimestamp;\n\t\t\t\tlogger.sendPerformanceEvent({\n\t\t\t\t\teventName: \"SignalLatency\",\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tduration, // Roundtrip duration of the tracked signal in milliseconds.\n\t\t\t\t\t\tsent: this.signalTracking.totalSignalsSentInLatencyWindow, // Signals sent since the last logged SignalLatency event.\n\t\t\t\t\t\tlost: this.signalTracking.signalsLost, // Signals lost since the last logged SignalLatency event.\n\t\t\t\t\t\toutOfOrder: this.signalTracking.signalsOutOfOrder, // Out of order signals since the last logged SignalLatency event.\n\t\t\t\t\t\treconnectCount: consecutiveReconnects, // Container reconnect count.\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tthis.signalTracking.signalsLost = 0;\n\t\t\t\tthis.signalTracking.signalsOutOfOrder = 0;\n\t\t\t\tthis.signalTracking.signalTimestamp = 0;\n\t\t\t\tthis.signalTracking.totalSignalsSentInLatencyWindow = 0;\n\t\t\t}\n\t\t\tthis.signalTracking.roundTripSignalSequenceNumber = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Updates tracking state for broadcast signals based on the provided signal envelope, and updates the\n\t * envelope with additional information that the signal needs to have stamped on it.\n\t * @remarks Do not call this for non-broadcast signals.\n\t * @param envelope - The signal envelope to process.\n\t */\n\tpublic applyTrackingToBroadcastSignalEnvelope(envelope: ISignalEnvelope): void {\n\t\tconst broadcastSignalSequenceNumber = ++this.broadcastSignalSequenceNumber;\n\n\t\t// Stamp with the broadcast signal sequence number.\n\t\tenvelope.clientBroadcastSignalSequenceNumber = broadcastSignalSequenceNumber;\n\n\t\tthis.signalTracking.signalsSentSinceLastLatencyMeasurement++;\n\n\t\t// If we don't have a signal monitoring window yet,\n\t\t// initialize tracking to expect the next signal sent by the connected client.\n\t\tif (\n\t\t\tthis.signalTracking.minimumTrackingSignalSequenceNumber === undefined ||\n\t\t\tthis.signalTracking.trackingSignalSequenceNumber === undefined\n\t\t) {\n\t\t\tthis.signalTracking.minimumTrackingSignalSequenceNumber = broadcastSignalSequenceNumber;\n\t\t\tthis.signalTracking.trackingSignalSequenceNumber = broadcastSignalSequenceNumber;\n\t\t}\n\n\t\t// Start tracking roundtrip for a new signal only if we are not tracking one already (and sampling logic is met)\n\t\tif (\n\t\t\tthis.signalTracking.roundTripSignalSequenceNumber === undefined &&\n\t\t\tbroadcastSignalSequenceNumber % defaultTelemetrySignalSampleCount === 1\n\t\t) {\n\t\t\tthis.signalTracking.signalTimestamp = Date.now();\n\t\t\tthis.signalTracking.roundTripSignalSequenceNumber = broadcastSignalSequenceNumber;\n\t\t\tthis.signalTracking.totalSignalsSentInLatencyWindow +=\n\t\t\t\tthis.signalTracking.signalsSentSinceLastLatencyMeasurement;\n\t\t\tthis.signalTracking.signalsSentSinceLastLatencyMeasurement = 0;\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"signalTelemetryProcessing.js","sourceRoot":"","sources":["../src/signalTelemetryProcessing.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 type { ISignalEnvelope } from \"@fluidframework/core-interfaces/internal\";\nimport type {\n\tTelemetryEventPropertyTypeExt,\n\tTelemetryLoggerExt,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nconst defaultTelemetrySignalSampleCount = 100;\n\n/**\n * Set of stats/values used to keep track of telemetry related to signals.\n */\ninterface ISignalTelemetryTracking {\n\t/**\n\t * Accumulates the total number of broadcast signals sent during the current signal latency measurement window.\n\t * This value represents the total number of signals sent since the latency measurement began and is used\n\t * logged in telemetry when the latency measurement completes.\n\t */\n\ttotalSignalsSentInLatencyWindow: number;\n\n\t/**\n\t * Counts the number of broadcast signals sent since the last latency measurement was initiated.\n\t * This counter increments with each broadcast signal sent. When a new latency measurement starts,\n\t * this counter is added to `totalSignalsSentInLatencyWindow` and then reset to zero.\n\t */\n\tsignalsSentSinceLastLatencyMeasurement: number;\n\n\t/**\n\t * Number of signals that were expected but not received.\n\t */\n\tsignalsLost: number;\n\n\t/**\n\t * Number of signals received out of order/non-sequentially.\n\t */\n\tsignalsOutOfOrder: number;\n\n\t/**\n\t * Timestamp before submitting the signal we will trace.\n\t */\n\tsignalTimestamp: number;\n\n\t/**\n\t * Signal we will trace for roundtrip latency.\n\t */\n\troundTripSignalSequenceNumber: number | undefined;\n\n\t/**\n\t * Next expected signal sequence number to be received.\n\t */\n\ttrackingSignalSequenceNumber: number | undefined;\n\n\t/**\n\t * Inclusive lower bound of signal monitoring window.\n\t * Used by the logic that checks if signals are received out of order.\n\t */\n\tminimumTrackingSignalSequenceNumber: number | undefined;\n}\n\nexport class SignalTelemetryManager {\n\tprivate readonly signalTracking: ISignalTelemetryTracking = {\n\t\ttotalSignalsSentInLatencyWindow: 0,\n\t\tsignalsLost: 0,\n\t\tsignalsOutOfOrder: 0,\n\t\tsignalsSentSinceLastLatencyMeasurement: 0,\n\t\tsignalTimestamp: 0,\n\t\troundTripSignalSequenceNumber: undefined,\n\t\ttrackingSignalSequenceNumber: undefined,\n\t\tminimumTrackingSignalSequenceNumber: undefined,\n\t};\n\n\t/**\n\t * Identifier to track broadcast signals being submitted in order to\n\t * allow collection of data around the roundtrip of signal messages.\n\t */\n\tprivate broadcastSignalSequenceNumber: number = 0;\n\n\t/**\n\t * Resets the signal tracking state in the {@link SignalTelemetryManager}.\n\t */\n\tpublic resetTracking(): void {\n\t\tthis.signalTracking.signalsLost = 0;\n\t\tthis.signalTracking.signalsOutOfOrder = 0;\n\t\tthis.signalTracking.signalTimestamp = 0;\n\t\tthis.signalTracking.signalsSentSinceLastLatencyMeasurement = 0;\n\t\tthis.signalTracking.totalSignalsSentInLatencyWindow = 0;\n\t\tthis.signalTracking.roundTripSignalSequenceNumber = undefined;\n\t\tthis.signalTracking.trackingSignalSequenceNumber = undefined;\n\t\tthis.signalTracking.minimumTrackingSignalSequenceNumber = undefined;\n\t}\n\n\t/**\n\t * Perform telemetry-related processing of incoming signals.\n\t * @param envelope - The signal envelope to process.\n\t * @param logger - The telemetry logger to use for emitting telemetry events.\n\t * @param consecutiveReconnects - The number of consecutive reconnects that have occurred. Only used for logging.\n\t */\n\tpublic trackReceivedSignal(\n\t\tenvelope: ISignalEnvelope,\n\t\tlogger: TelemetryLoggerExt,\n\t\tconsecutiveReconnects: number,\n\t): void {\n\t\tconst {\n\t\t\tclientBroadcastSignalSequenceNumber,\n\t\t\tcontents: envelopeContents,\n\t\t\taddress: envelopeAddress,\n\t\t} = envelope;\n\n\t\tif (clientBroadcastSignalSequenceNumber === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// If no tracking window has been set, nothing to do\n\t\tif (\n\t\t\tthis.signalTracking.trackingSignalSequenceNumber === undefined ||\n\t\t\tthis.signalTracking.minimumTrackingSignalSequenceNumber === undefined\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (\n\t\t\tclientBroadcastSignalSequenceNumber >= this.signalTracking.trackingSignalSequenceNumber\n\t\t) {\n\t\t\t// Calculate the number of signals lost and log the event.\n\t\t\tconst signalsLost =\n\t\t\t\tclientBroadcastSignalSequenceNumber - this.signalTracking.trackingSignalSequenceNumber;\n\t\t\tif (signalsLost > 0) {\n\t\t\t\tthis.signalTracking.signalsLost += signalsLost;\n\t\t\t\tlogger.sendErrorEvent({\n\t\t\t\t\teventName: \"SignalLost\",\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tsignalsLost, // Number of lost signals detected.\n\t\t\t\t\t\texpectedSequenceNumber: this.signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.\n\t\t\t\t\t\tclientBroadcastSignalSequenceNumber, // Actual signal sequence number received.\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Update the tracking signal sequence number to the next expected signal in the sequence.\n\t\t\tthis.signalTracking.trackingSignalSequenceNumber =\n\t\t\t\tclientBroadcastSignalSequenceNumber + 1;\n\t\t} else if (\n\t\t\t// Check if this is a signal in range of interest.\n\t\t\tclientBroadcastSignalSequenceNumber >=\n\t\t\tthis.signalTracking.minimumTrackingSignalSequenceNumber\n\t\t) {\n\t\t\tthis.signalTracking.signalsOutOfOrder++;\n\t\t\tconst details: TelemetryEventPropertyTypeExt = {\n\t\t\t\texpectedSequenceNumber: this.signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.\n\t\t\t\tclientBroadcastSignalSequenceNumber, // Sequence number of the out of order signal.\n\t\t\t};\n\t\t\t// Only log `contents.type` when address is for container to avoid chance that contents type is customer data.\n\t\t\tif (envelopeAddress === undefined) {\n\t\t\t\tdetails.contentsType = envelopeContents.type; // Type of signal that was received out of order.\n\t\t\t}\n\t\t\tlogger.sendTelemetryEvent({\n\t\t\t\teventName: \"SignalOutOfOrder\",\n\t\t\t\tdetails,\n\t\t\t});\n\t\t}\n\n\t\tif (\n\t\t\tthis.signalTracking.roundTripSignalSequenceNumber !== undefined &&\n\t\t\tclientBroadcastSignalSequenceNumber >= this.signalTracking.roundTripSignalSequenceNumber\n\t\t) {\n\t\t\tif (\n\t\t\t\tclientBroadcastSignalSequenceNumber ===\n\t\t\t\tthis.signalTracking.roundTripSignalSequenceNumber\n\t\t\t) {\n\t\t\t\t// Latency tracked signal has been received.\n\t\t\t\t// We now emit telemetry with the roundtrip duration of the tracked signal.\n\t\t\t\t// The telemetry event also includes metrics for broadcast signals (sent, lost, and out of order),\n\t\t\t\t// and these metrics are reset after emitting the event.\n\t\t\t\tconst duration = Date.now() - this.signalTracking.signalTimestamp;\n\t\t\t\tlogger.sendPerformanceEvent({\n\t\t\t\t\teventName: \"SignalLatency\",\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tduration, // Roundtrip duration of the tracked signal in milliseconds.\n\t\t\t\t\t\tsent: this.signalTracking.totalSignalsSentInLatencyWindow, // Signals sent since the last logged SignalLatency event.\n\t\t\t\t\t\tlost: this.signalTracking.signalsLost, // Signals lost since the last logged SignalLatency event.\n\t\t\t\t\t\toutOfOrder: this.signalTracking.signalsOutOfOrder, // Out of order signals since the last logged SignalLatency event.\n\t\t\t\t\t\treconnectCount: consecutiveReconnects, // Container reconnect count.\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tthis.signalTracking.signalsLost = 0;\n\t\t\t\tthis.signalTracking.signalsOutOfOrder = 0;\n\t\t\t\tthis.signalTracking.signalTimestamp = 0;\n\t\t\t\tthis.signalTracking.totalSignalsSentInLatencyWindow = 0;\n\t\t\t}\n\t\t\tthis.signalTracking.roundTripSignalSequenceNumber = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Updates tracking state for broadcast signals based on the provided signal envelope, and updates the\n\t * envelope with additional information that the signal needs to have stamped on it.\n\t * @remarks Do not call this for non-broadcast signals.\n\t * @param envelope - The signal envelope to process.\n\t */\n\tpublic applyTrackingToBroadcastSignalEnvelope(envelope: ISignalEnvelope): void {\n\t\tconst broadcastSignalSequenceNumber = ++this.broadcastSignalSequenceNumber;\n\n\t\t// Stamp with the broadcast signal sequence number.\n\t\tenvelope.clientBroadcastSignalSequenceNumber = broadcastSignalSequenceNumber;\n\n\t\tthis.signalTracking.signalsSentSinceLastLatencyMeasurement++;\n\n\t\t// If we don't have a signal monitoring window yet,\n\t\t// initialize tracking to expect the next signal sent by the connected client.\n\t\tif (\n\t\t\tthis.signalTracking.minimumTrackingSignalSequenceNumber === undefined ||\n\t\t\tthis.signalTracking.trackingSignalSequenceNumber === undefined\n\t\t) {\n\t\t\tthis.signalTracking.minimumTrackingSignalSequenceNumber = broadcastSignalSequenceNumber;\n\t\t\tthis.signalTracking.trackingSignalSequenceNumber = broadcastSignalSequenceNumber;\n\t\t}\n\n\t\t// Start tracking roundtrip for a new signal only if we are not tracking one already (and sampling logic is met)\n\t\tif (\n\t\t\tthis.signalTracking.roundTripSignalSequenceNumber === undefined &&\n\t\t\tbroadcastSignalSequenceNumber % defaultTelemetrySignalSampleCount === 1\n\t\t) {\n\t\t\tthis.signalTracking.signalTimestamp = Date.now();\n\t\t\tthis.signalTracking.roundTripSignalSequenceNumber = broadcastSignalSequenceNumber;\n\t\t\tthis.signalTracking.totalSignalsSentInLatencyWindow +=\n\t\t\t\tthis.signalTracking.signalsSentSinceLastLatencyMeasurement;\n\t\t\tthis.signalTracking.signalsSentSinceLastLatencyMeasurement = 0;\n\t\t}\n\t}\n}\n"]}
|
|
@@ -10,6 +10,8 @@ exports.StorageServiceWithAttachBlobs = void 0;
|
|
|
10
10
|
* attach message. We use this to avoid an unnecessary request to the storage service.
|
|
11
11
|
*/
|
|
12
12
|
class StorageServiceWithAttachBlobs {
|
|
13
|
+
internalStorageService;
|
|
14
|
+
attachBlobs;
|
|
13
15
|
constructor(internalStorageService, attachBlobs) {
|
|
14
16
|
this.internalStorageService = internalStorageService;
|
|
15
17
|
this.attachBlobs = attachBlobs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storageServiceWithAttachBlobs.js","sourceRoot":"","sources":["../src/storageServiceWithAttachBlobs.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH;;;GAGG;AACH,MAAa,6BAA6B;
|
|
1
|
+
{"version":3,"file":"storageServiceWithAttachBlobs.js","sourceRoot":"","sources":["../src/storageServiceWithAttachBlobs.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH;;;GAGG;AACH,MAAa,6BAA6B;IAEvB;IACA;IAFlB,YACkB,sBAA8C,EAC9C,WAAyC;QADzC,2BAAsB,GAAtB,sBAAsB,CAAwB;QAC9C,gBAAW,GAAX,WAAW,CAA8B;IACxD,CAAC;IAEG,KAAK,CAAC,QAAQ,CAAC,EAAU;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACb,CAAC;QAED,8FAA8F;QAC9F,0EAA0E;QAC1E,OAAO,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;CACD;AAhBD,sEAgBC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { IRuntimeStorageService } from \"@fluidframework/runtime-definitions/internal\";\n\n/**\n * IRuntimeStorageService proxy which intercepts requests if they can be satisfied by the blobs received in the\n * attach message. We use this to avoid an unnecessary request to the storage service.\n */\nexport class StorageServiceWithAttachBlobs implements IRuntimeStorageService {\n\tconstructor(\n\t\tprivate readonly internalStorageService: IRuntimeStorageService,\n\t\tprivate readonly attachBlobs: Map<string, ArrayBufferLike>,\n\t) {}\n\n\tpublic async readBlob(id: string): Promise<ArrayBufferLike> {\n\t\tconst blob = this.attachBlobs.get(id);\n\t\tif (blob !== undefined) {\n\t\t\treturn blob;\n\t\t}\n\n\t\t// Note that it is intentional not to cache the result of this readBlob - we'll trust the real\n\t\t// IRuntimeStorageService to cache appropriately, no need to double-cache.\n\t\treturn this.internalStorageService.readBlob(id);\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documentSchema.d.ts","sourceRoot":"","sources":["../../src/summary/documentSchema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAMnF;;;;;;GAMG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;AAEpF;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,eAAe;IAK/B;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAEjD;;;;OAIG;IACH,IAAI,CAAC,EAAE,mBAAmB,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IACnC;;;;;;;;;;;;;;OAcG;IACH,mBAAmB,EAAE,eAAe,CAAC;CACrC;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,oCAAoC,GAAG,eAAe,CAAC;AAEnE;;;;GAIG;AACH,MAAM,MAAM,oCAAoC,GAAG,sBAAsB,CAAC;AAE1E;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAuB;IAIvC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,wBAAwB,EAAE,IAAI,GAAG,SAAS,CAAC;IAE3C;;;;;;;;;OASG;IACH,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,WAAW,sBAAuB,SAAQ,QAAQ,CAAC,eAAe,CAAC;IAExE,OAAO,EAAE,OAAO,4BAA4B,CAAC;IAE7C,OAAO,EAAE;SACP,CAAC,IAAI,MAAM,uBAAuB,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,SAAS,OAAO,GAC9E,IAAI,GACJ,uBAAuB,CAAC,CAAC,CAAC;KAC7B,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"documentSchema.d.ts","sourceRoot":"","sources":["../../src/summary/documentSchema.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,7 @@ class TrueOrUndefinedMax extends TrueOrUndefined {
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
class MultiChoice {
|
|
42
|
+
choices;
|
|
42
43
|
constructor(choices) {
|
|
43
44
|
this.choices = choices;
|
|
44
45
|
}
|
|
@@ -182,8 +183,10 @@ function and(persistedSchema, providedSchema) {
|
|
|
182
183
|
runtime[key] = getRuntimeConfigHandler(key).and(persistedSchema.runtime[key], providedSchema.runtime[key]);
|
|
183
184
|
}
|
|
184
185
|
// We keep the persisted minVersionForCollab if present, even if the provided minVersionForCollab
|
|
185
|
-
// is higher.
|
|
186
|
-
const minVersionForCollab = persistedSchema.info
|
|
186
|
+
// is higher, after migrating historical 2.x prerelease values to their stable versions.
|
|
187
|
+
const minVersionForCollab = persistedSchema.info === undefined
|
|
188
|
+
? providedSchema.info.minVersionForCollab
|
|
189
|
+
: normalizePersistedMinVersionForCollab(persistedSchema.info.minVersionForCollab);
|
|
187
190
|
return {
|
|
188
191
|
version: exports.currentDocumentVersionSchema,
|
|
189
192
|
refSeq: persistedSchema.refSeq,
|
|
@@ -199,11 +202,14 @@ function or(persistedSchema, providedSchema) {
|
|
|
199
202
|
])) {
|
|
200
203
|
runtime[key] = getRuntimeConfigHandler(key).or(persistedSchema.runtime[key], providedSchema.runtime[key]);
|
|
201
204
|
}
|
|
202
|
-
// We take the greater of the persisted/provided minVersionForCollab
|
|
203
|
-
const
|
|
205
|
+
// We take the greater of the normalized persisted/provided minVersionForCollab.
|
|
206
|
+
const persistedMinVersionForCollab = persistedSchema.info === undefined
|
|
207
|
+
? undefined
|
|
208
|
+
: normalizePersistedMinVersionForCollab(persistedSchema.info.minVersionForCollab);
|
|
209
|
+
const minVersionForCollab = persistedMinVersionForCollab === undefined
|
|
204
210
|
? providedSchema.info.minVersionForCollab
|
|
205
|
-
: (0, semver_ts_1.gt)(
|
|
206
|
-
?
|
|
211
|
+
: (0, semver_ts_1.gt)(persistedMinVersionForCollab, providedSchema.info.minVersionForCollab)
|
|
212
|
+
? persistedMinVersionForCollab
|
|
207
213
|
: providedSchema.info.minVersionForCollab;
|
|
208
214
|
return {
|
|
209
215
|
version: exports.currentDocumentVersionSchema,
|
|
@@ -212,6 +218,22 @@ function or(persistedSchema, providedSchema) {
|
|
|
212
218
|
runtime,
|
|
213
219
|
};
|
|
214
220
|
}
|
|
221
|
+
/**
|
|
222
|
+
* Migrates 2.x prerelease values accepted by older clients to the corresponding stable version.
|
|
223
|
+
*
|
|
224
|
+
* @remarks
|
|
225
|
+
* This is monotonic under SemVer and can cross a compatibility checkpoint when the prerelease
|
|
226
|
+
* shares that checkpoint's major, minor, and patch. Client 3.0 no longer supports active
|
|
227
|
+
* prerelease collaborators, so the persisted requirement advances before format selection.
|
|
228
|
+
*/
|
|
229
|
+
function normalizePersistedMinVersionForCollab(minVersionForCollab) {
|
|
230
|
+
const parsed = (0, semver_ts_1.parse)(minVersionForCollab);
|
|
231
|
+
if (parsed?.major === 2 && parsed.prerelease.length > 0) {
|
|
232
|
+
// `parse` validates each numeric component before this template is constructed.
|
|
233
|
+
return `${parsed.major}.${parsed.minor}.${parsed.patch}`;
|
|
234
|
+
}
|
|
235
|
+
return minVersionForCollab;
|
|
236
|
+
}
|
|
215
237
|
/**
|
|
216
238
|
* Determines if two schemas are the "same".
|
|
217
239
|
* Schemas are considered **not** the same if a schema change op is required to make
|
|
@@ -313,6 +335,27 @@ function arrayToProp(arr) {
|
|
|
313
335
|
* @sealed
|
|
314
336
|
*/
|
|
315
337
|
class DocumentsSchemaController {
|
|
338
|
+
onSchemaChange;
|
|
339
|
+
disableSchemaUpgrade;
|
|
340
|
+
explicitSchemaControl;
|
|
341
|
+
/**
|
|
342
|
+
* Have we generated a DocumentSchemaChange op and we're waiting for the ack?
|
|
343
|
+
* This is used to ensure that we do not generate multiple schema change ops - this client should only ever send one (if any).
|
|
344
|
+
*/
|
|
345
|
+
opPending = false;
|
|
346
|
+
// schema coming from document metadata (snapshot we loaded from)
|
|
347
|
+
documentSchema;
|
|
348
|
+
// desired schema, based on feature gates / runtime options.
|
|
349
|
+
// This includes requests to enable to disable functionality
|
|
350
|
+
desiredSchema;
|
|
351
|
+
// OR() of document schema and desired schema. It enables all the features that are enabled in either of schemas.
|
|
352
|
+
futureSchema;
|
|
353
|
+
// Current schema this session operates with.
|
|
354
|
+
// 1) Legacy mode (explicitSchemaControl === false): this is same as desired schema - all options that were requested to be on are on, and all options requested to be off are off.
|
|
355
|
+
// 2) Non-legacy mode (explicitSchemaControl === true): this is AND() of document schema and desired schema. Only options that are enabled in both are enabled here.
|
|
356
|
+
// If there are any options that are not enabled in document schema, but are enabled in desired schema, then attempt to change schema
|
|
357
|
+
// (and enable such options) will be made through the session.
|
|
358
|
+
sessionSchema;
|
|
316
359
|
/**
|
|
317
360
|
* Constructs DocumentsSchemaController that controls current schema and processes around it, including changes in schema.
|
|
318
361
|
* @param existing - Is the document existing document, or a new doc.
|
|
@@ -326,11 +369,6 @@ class DocumentsSchemaController {
|
|
|
326
369
|
constructor(existing, snapshotSequenceNumber, documentMetadataSchema, features, onSchemaChange, info, logger, disableSchemaUpgrade) {
|
|
327
370
|
this.onSchemaChange = onSchemaChange;
|
|
328
371
|
this.disableSchemaUpgrade = disableSchemaUpgrade;
|
|
329
|
-
/**
|
|
330
|
-
* Have we generated a DocumentSchemaChange op and we're waiting for the ack?
|
|
331
|
-
* This is used to ensure that we do not generate multiple schema change ops - this client should only ever send one (if any).
|
|
332
|
-
*/
|
|
333
|
-
this.opPending = false;
|
|
334
372
|
// For simplicity, let's only support new schema features for explicit schema control mode
|
|
335
373
|
(0, internal_1.assert)(features.disallowedVersions.length === 0 || features.explicitSchemaControl, 0x949 /* not supported */);
|
|
336
374
|
// We check the document's metadata to see if there is a minVersionForCollab. If it's not an existing document or
|
|
@@ -373,7 +411,7 @@ class DocumentsSchemaController {
|
|
|
373
411
|
// Latter is important sure that's what will go into summary.
|
|
374
412
|
this.documentSchema = existing
|
|
375
413
|
? (documentMetadataSchema ??
|
|
376
|
-
|
|
414
|
+
{
|
|
377
415
|
version: exports.currentDocumentVersionSchema,
|
|
378
416
|
// see comment in summarizeDocumentSchema() on why it has to stay zero
|
|
379
417
|
refSeq: 0,
|
|
@@ -383,7 +421,7 @@ class DocumentsSchemaController {
|
|
|
383
421
|
runtime: {
|
|
384
422
|
explicitSchemaControl: boolToProp(!existing && features.explicitSchemaControl),
|
|
385
423
|
},
|
|
386
|
-
})
|
|
424
|
+
})
|
|
387
425
|
: this.desiredSchema;
|
|
388
426
|
checkRuntimeCompatibility(this.documentSchema, "document");
|
|
389
427
|
this.validateSeqNumber(this.documentSchema.refSeq, snapshotSequenceNumber, "summary");
|