@fluidframework/container-runtime 2.118.0 → 3.0.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/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
|
@@ -12,10 +12,15 @@ import { getEffectiveBatchId, type InboundMessageResult } from "../opLifecycle/i
|
|
|
12
12
|
*/
|
|
13
13
|
export interface InboundVersionMarkUpdate {
|
|
14
14
|
/**
|
|
15
|
-
* A completed batch to record via `processInboundBatch`: its id and its last op's sequence
|
|
16
|
-
* Undefined when no batch completed on this message (a piecemeal batch
|
|
15
|
+
* A completed batch to record via `processInboundBatch`: its id and its last op's sequence
|
|
16
|
+
* number and timestamp. Undefined when no batch completed on this message (a piecemeal batch
|
|
17
|
+
* still in progress).
|
|
17
18
|
*/
|
|
18
|
-
readonly sequenced?: {
|
|
19
|
+
readonly sequenced?: {
|
|
20
|
+
readonly batchId: string;
|
|
21
|
+
readonly sequenceNumber: number;
|
|
22
|
+
readonly timestamp: number;
|
|
23
|
+
};
|
|
19
24
|
/**
|
|
20
25
|
* The batch id to carry for a piecemeal batch still in progress, or undefined when none is pending.
|
|
21
26
|
* The caller stores this and passes it back on the next inbound result.
|
|
@@ -25,10 +30,10 @@ export interface InboundVersionMarkUpdate {
|
|
|
25
30
|
|
|
26
31
|
/**
|
|
27
32
|
* Maps an inbound batch result to the version-mark resolver update. A batch's resolved point is its last
|
|
28
|
-
* op's sequence number, so this reports `(batchId, sequenceNumber)` only once a
|
|
29
|
-
* both a batch delivered whole (`fullBatch`, incl. an empty grouped batch via
|
|
30
|
-
* and one delivered piecemeal (`batchStartingMessage` then `nextBatchMessage`
|
|
31
|
-
* batch id across the piecemeal messages via `carriedBatchId`.
|
|
33
|
+
* op's sequence number and timestamp, so this reports `(batchId, sequenceNumber, timestamp)` only once a
|
|
34
|
+
* batch completes. It handles both a batch delivered whole (`fullBatch`, incl. an empty grouped batch via
|
|
35
|
+
* the batch-start key message) and one delivered piecemeal (`batchStartingMessage` then `nextBatchMessage`
|
|
36
|
+
* with `batchEnd`), carrying the batch id across the piecemeal messages via `carriedBatchId`.
|
|
32
37
|
*
|
|
33
38
|
* @internal
|
|
34
39
|
*/
|
|
@@ -45,7 +50,11 @@ export function inboundVersionMarkUpdate(
|
|
|
45
50
|
inboundResult.messages[inboundResult.messages.length - 1] ??
|
|
46
51
|
inboundResult.batchStart.keyMessage;
|
|
47
52
|
return {
|
|
48
|
-
sequenced: {
|
|
53
|
+
sequenced: {
|
|
54
|
+
batchId,
|
|
55
|
+
sequenceNumber: lastMessage.sequenceNumber,
|
|
56
|
+
timestamp: lastMessage.timestamp,
|
|
57
|
+
},
|
|
49
58
|
carriedBatchId: undefined,
|
|
50
59
|
};
|
|
51
60
|
}
|
|
@@ -61,6 +70,7 @@ export function inboundVersionMarkUpdate(
|
|
|
61
70
|
sequenced: {
|
|
62
71
|
batchId: carriedBatchId,
|
|
63
72
|
sequenceNumber: inboundResult.nextMessage.sequenceNumber,
|
|
73
|
+
timestamp: inboundResult.nextMessage.timestamp,
|
|
64
74
|
},
|
|
65
75
|
carriedBatchId: undefined,
|
|
66
76
|
};
|
|
@@ -12,7 +12,6 @@ import { assert } from "@fluidframework/core-utils/internal";
|
|
|
12
12
|
import type { TelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal";
|
|
13
13
|
|
|
14
14
|
import type { InboundMessageResult } from "../opLifecycle/index.js";
|
|
15
|
-
import { asBatchMetadata } from "../metadata.js";
|
|
16
15
|
|
|
17
16
|
import { inboundVersionMarkUpdate } from "./inboundBatch.js";
|
|
18
17
|
|
|
@@ -31,12 +30,17 @@ export interface IHistoricalOpReader {
|
|
|
31
30
|
}
|
|
32
31
|
|
|
33
32
|
/**
|
|
34
|
-
* Result of resolving a pending batchId.
|
|
33
|
+
* Result of resolving a pending batchId. A resolved result includes the matched batch's last op server
|
|
34
|
+
* timestamp when available. The property is optional for compatibility with previously stored results.
|
|
35
35
|
*
|
|
36
36
|
* @legacy @beta
|
|
37
37
|
*/
|
|
38
38
|
export type ResolveResult =
|
|
39
|
-
| {
|
|
39
|
+
| {
|
|
40
|
+
readonly kind: "resolved";
|
|
41
|
+
readonly sequenceNumber: number;
|
|
42
|
+
readonly timestamp?: number;
|
|
43
|
+
}
|
|
40
44
|
| { readonly kind: "pending" }
|
|
41
45
|
| { readonly kind: "unresolvable" };
|
|
42
46
|
|
|
@@ -54,7 +58,11 @@ export type VersionMarkCapture =
|
|
|
54
58
|
readonly batchId: string;
|
|
55
59
|
readonly sequenceNumberLowerBound: number;
|
|
56
60
|
}
|
|
57
|
-
| {
|
|
61
|
+
| {
|
|
62
|
+
readonly kind: "resolved";
|
|
63
|
+
readonly sequenceNumber: number;
|
|
64
|
+
readonly timestamp?: number;
|
|
65
|
+
};
|
|
58
66
|
|
|
59
67
|
/**
|
|
60
68
|
* Runtime-owned resolver for app-stored version mark locators.
|
|
@@ -66,34 +74,40 @@ export interface IVersionMarkResolver {
|
|
|
66
74
|
* Captures a version mark at the current point. Seals the current outbound batch first (so a just-made
|
|
67
75
|
* local edit has a stable `batchId`, which is only assigned when a batch is flushed), then returns the
|
|
68
76
|
* mark data atomically: a `pending` capture (`batchId` + `sequenceNumberLowerBound`) when there is an
|
|
69
|
-
* unacked local batch, or a `resolved` capture (`sequenceNumber`
|
|
77
|
+
* unacked local batch, or a `resolved` capture (`sequenceNumber` + the last processed op's server
|
|
78
|
+
* `timestamp`) when there is no in-flight local work. The timestamp property is optional both for
|
|
79
|
+
* compatibility with previously stored captures and because it is `undefined` when neither a last
|
|
80
|
+
* processed message nor a last-summary message is available.
|
|
70
81
|
*
|
|
71
82
|
* @remarks Sealing the batch is a side effect (it submits the current batch), so capture at savepoint
|
|
72
83
|
* boundaries, not per keystroke.
|
|
73
84
|
*
|
|
74
|
-
* @returns The pending batch identity and
|
|
75
|
-
* when there is no pending local batch.
|
|
85
|
+
* @returns The pending batch identity and inclusive sequence number lower bound, or the current sequence
|
|
86
|
+
* number and corresponding op timestamp (when available) when there is no pending local batch.
|
|
76
87
|
*/
|
|
77
88
|
sealAndCaptureVersionMark(): VersionMarkCapture;
|
|
78
89
|
/**
|
|
79
90
|
* Resolves a pending mark's batchId to a global sequence number (`sequenceNumberLowerBound` is the
|
|
80
|
-
*
|
|
91
|
+
* inclusive lower bound for a history read). A `resolved` sequence number feeds the loader's
|
|
81
92
|
* `loadContainerToSequenceNumber`.
|
|
82
93
|
*
|
|
83
94
|
* @param batchId - The stable identity of the pending batch.
|
|
84
|
-
* @param sequenceNumberLowerBound - The
|
|
85
|
-
* @returns The resolved sequence number, or a result indicating that the batch
|
|
86
|
-
* no longer be resolved.
|
|
95
|
+
* @param sequenceNumberLowerBound - The inclusive lower bound for the historical op search.
|
|
96
|
+
* @returns The resolved sequence number and server timestamp, or a result indicating that the batch
|
|
97
|
+
* remains pending or can no longer be resolved.
|
|
87
98
|
*/
|
|
88
99
|
resolve(batchId: string, sequenceNumberLowerBound: number): Promise<ResolveResult>;
|
|
89
100
|
/**
|
|
90
|
-
* Subscribes to inbound batch sequencing: fires `(batchId, sequenceNumber)` per batch so any
|
|
91
|
-
* client can promote a matching pending mark. Returns an unsubscribe function.
|
|
101
|
+
* Subscribes to inbound batch sequencing: fires `(batchId, sequenceNumber, timestamp)` per batch so any
|
|
102
|
+
* connected client can promote a matching pending mark. Returns an unsubscribe function.
|
|
92
103
|
*
|
|
93
|
-
* @param listener - Called with the stable batch identity
|
|
104
|
+
* @param listener - Called with the stable batch identity, its final sequence number, and the final op's
|
|
105
|
+
* server timestamp.
|
|
94
106
|
* @returns A function that unsubscribes the listener.
|
|
95
107
|
*/
|
|
96
|
-
onBatchSequenced(
|
|
108
|
+
onBatchSequenced(
|
|
109
|
+
listener: (batchId: string, sequenceNumber: number, timestamp?: number) => void,
|
|
110
|
+
): () => void;
|
|
97
111
|
}
|
|
98
112
|
|
|
99
113
|
/**
|
|
@@ -101,6 +115,7 @@ export interface IVersionMarkResolver {
|
|
|
101
115
|
*/
|
|
102
116
|
export interface VersionMarkResolverRuntimeHooks {
|
|
103
117
|
readonly getCurrentSequenceNumber: () => number;
|
|
118
|
+
readonly getCurrentTimestamp: () => number | undefined;
|
|
104
119
|
readonly getCurrentMinimumSequenceNumber: () => number;
|
|
105
120
|
readonly getCurrentPendingBatchId: () => string | undefined;
|
|
106
121
|
/** Logs faults from app-supplied `onBatchSequenced` listeners (see {@link VersionMarkResolver.processInboundBatch}). */
|
|
@@ -134,9 +149,12 @@ export interface VersionMarkResolverRuntimeHooks {
|
|
|
134
149
|
* @internal
|
|
135
150
|
*/
|
|
136
151
|
export class VersionMarkResolver implements IVersionMarkResolver {
|
|
137
|
-
private readonly
|
|
152
|
+
private readonly resolvedBatchById = new Map<
|
|
153
|
+
string,
|
|
154
|
+
{ readonly sequenceNumber: number; readonly timestamp: number }
|
|
155
|
+
>();
|
|
138
156
|
private readonly batchListeners = new Set<
|
|
139
|
-
(batchId: string, sequenceNumber: number) => void
|
|
157
|
+
(batchId: string, sequenceNumber: number, timestamp: number) => void
|
|
140
158
|
>();
|
|
141
159
|
/**
|
|
142
160
|
* Sticky flag: false until the feature is first used this session (a pending capture or a listener).
|
|
@@ -156,60 +174,113 @@ export class VersionMarkResolver implements IVersionMarkResolver {
|
|
|
156
174
|
// Seal the current batch so a just-submitted local edit is flushed into the pending state with a
|
|
157
175
|
// stable batchId (which is only assigned at flush) before we read it.
|
|
158
176
|
this.hooks.flushPendingBatch();
|
|
159
|
-
const
|
|
177
|
+
const referenceSequenceNumber = this.hooks.getCurrentSequenceNumber();
|
|
160
178
|
const batchId = this.hooks.getCurrentPendingBatchId();
|
|
179
|
+
let result: VersionMarkCapture;
|
|
161
180
|
if (batchId === undefined) {
|
|
162
181
|
// No unacked local batch: the mark already points at a durable sequence number.
|
|
163
|
-
|
|
182
|
+
result = {
|
|
183
|
+
kind: "resolved",
|
|
184
|
+
sequenceNumber: referenceSequenceNumber,
|
|
185
|
+
timestamp: this.hooks.getCurrentTimestamp(),
|
|
186
|
+
};
|
|
187
|
+
} else {
|
|
188
|
+
// A pending mark needs its batch tracked so resolve() can promote it from the live map.
|
|
189
|
+
this.tracking = true;
|
|
190
|
+
// The pending batch is sequenced after the reference point, so its first possible sequence
|
|
191
|
+
// number is `referenceSequenceNumber + 1`. Store that as an inclusive lower bound so resolve()
|
|
192
|
+
// scans directly from it.
|
|
193
|
+
result = {
|
|
194
|
+
kind: "pending",
|
|
195
|
+
batchId,
|
|
196
|
+
sequenceNumberLowerBound: referenceSequenceNumber + 1,
|
|
197
|
+
};
|
|
164
198
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
return { kind: "pending", batchId, sequenceNumberLowerBound };
|
|
199
|
+
this.hooks.logger.sendTelemetryEvent({ eventName: "Capture", kind: result.kind });
|
|
200
|
+
return result;
|
|
168
201
|
}
|
|
169
202
|
|
|
170
203
|
public async resolve(
|
|
171
204
|
batchId: string,
|
|
172
205
|
sequenceNumberLowerBound: number,
|
|
173
206
|
): Promise<ResolveResult> {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
//
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
207
|
+
const startTime = Date.now();
|
|
208
|
+
// Track from here so inbound batches are recorded even without a prior capture/subscribe; otherwise
|
|
209
|
+
// a batch sequencing during the scan (or live, in the no-reader case) is skipped and unrecoverable.
|
|
210
|
+
this.tracking = true;
|
|
211
|
+
// Defaults cover the throw path (only the history scan can throw — e.g. an unpacker
|
|
212
|
+
// DataCorruptionError or the 0xd1c reader-contract assert): the Resolve event still fires via
|
|
213
|
+
// `finally`, with outcome "error".
|
|
214
|
+
let path: "session" | "history" | "noReader" = "history";
|
|
215
|
+
let outcome: ResolveResult["kind"] | "error" = "error";
|
|
216
|
+
let resolvedSequenceNumber: number | undefined;
|
|
217
|
+
try {
|
|
218
|
+
// Fast path: batch sequenced live this session.
|
|
219
|
+
const resolvedBatch = this.sessionResolutionFor(batchId);
|
|
220
|
+
if (resolvedBatch === undefined) {
|
|
221
|
+
const reader = this.hooks.getHistoricalOpReader?.();
|
|
222
|
+
if (reader === undefined) {
|
|
223
|
+
// No reader: the batch may still sequence live, so report pending.
|
|
224
|
+
path = "noReader";
|
|
225
|
+
outcome = "pending";
|
|
226
|
+
return { kind: "pending" };
|
|
227
|
+
}
|
|
228
|
+
// Otherwise scan history from the mark's reference point.
|
|
229
|
+
path = "history";
|
|
230
|
+
let result = await this.resolveFromHistory(reader, batchId, sequenceNumberLowerBound);
|
|
231
|
+
if (result.kind !== "resolved") {
|
|
232
|
+
// The batch may have sequenced live while the history scan was in progress. Prefer that
|
|
233
|
+
// authoritative in-session result over a stale history miss.
|
|
234
|
+
const liveResult = this.sessionResolutionFor(batchId);
|
|
235
|
+
if (liveResult !== undefined) {
|
|
236
|
+
path = "session";
|
|
237
|
+
result = { kind: "resolved", ...liveResult };
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
outcome = result.kind;
|
|
241
|
+
if (result.kind === "resolved") {
|
|
242
|
+
resolvedSequenceNumber = result.sequenceNumber;
|
|
243
|
+
}
|
|
244
|
+
return result;
|
|
245
|
+
}
|
|
246
|
+
path = "session";
|
|
247
|
+
outcome = "resolved";
|
|
248
|
+
resolvedSequenceNumber = resolvedBatch.sequenceNumber;
|
|
249
|
+
return { kind: "resolved", ...resolvedBatch };
|
|
250
|
+
} finally {
|
|
251
|
+
this.hooks.logger.sendTelemetryEvent({
|
|
252
|
+
eventName: "Resolve",
|
|
253
|
+
outcome,
|
|
254
|
+
path,
|
|
255
|
+
durationMs: Date.now() - startTime,
|
|
256
|
+
...(resolvedSequenceNumber === undefined
|
|
257
|
+
? {}
|
|
258
|
+
: { sequenceNumber: resolvedSequenceNumber }),
|
|
259
|
+
});
|
|
185
260
|
}
|
|
186
|
-
return this.resolveFromHistory(reader, batchId, sequenceNumberLowerBound);
|
|
187
261
|
}
|
|
188
262
|
|
|
189
263
|
/**
|
|
190
|
-
* Scans sequenced ops
|
|
264
|
+
* Scans sequenced ops from `sequenceNumberLowerBound` (inclusive) for `batchId`, returning its last op's
|
|
191
265
|
* sequence number when found and aborting the fetch once found or exhausted. Each op is routed through
|
|
192
266
|
* the same unpack pipeline the live inbound path uses (chunk reassembly, ungroup, decompress) and
|
|
193
|
-
* {@link inboundVersionMarkUpdate} derives its batch identity, so
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
* See DEV.md.
|
|
267
|
+
* {@link inboundVersionMarkUpdate} derives its batch identity, so virtualized batches resolve here too.
|
|
268
|
+
* The injected historical unpacker owns virtualization details, including tolerating a requested range
|
|
269
|
+
* that begins within an incomplete chunk stream. On a miss, {@link classifyMiss} distinguishes
|
|
270
|
+
* `pending` (not sequenced yet) from `unresolvable` (ops trimmed).
|
|
198
271
|
*/
|
|
199
272
|
private async resolveFromHistory(
|
|
200
273
|
reader: IHistoricalOpReader,
|
|
201
274
|
batchId: string,
|
|
202
275
|
sequenceNumberLowerBound: number,
|
|
203
276
|
): Promise<ResolveResult> {
|
|
204
|
-
const from = sequenceNumberLowerBound
|
|
277
|
+
const from = sequenceNumberLowerBound;
|
|
205
278
|
const unpack = this.hooks.createHistoricalOpUnpacker?.();
|
|
206
279
|
const abortController = new AbortController();
|
|
207
280
|
try {
|
|
208
281
|
const stream = await reader.fetchMessages(from, undefined, abortController.signal);
|
|
209
282
|
let firstScannedSequenceNumber: number | undefined;
|
|
210
283
|
let carriedBatchId: string | undefined;
|
|
211
|
-
// Mirrors the processor's batch-in-progress state so we can drop an orphan end marker (below).
|
|
212
|
-
let inBatch = false;
|
|
213
284
|
while (true) {
|
|
214
285
|
const result = await stream.read();
|
|
215
286
|
if (result.done) {
|
|
@@ -217,32 +288,21 @@ export class VersionMarkResolver implements IVersionMarkResolver {
|
|
|
217
288
|
}
|
|
218
289
|
for (const op of result.value) {
|
|
219
290
|
firstScannedSequenceNumber ??= op.sequenceNumber;
|
|
220
|
-
|
|
221
|
-
// The anchor (`sequenceNumberLowerBound + 1`) may land inside a batch whose start
|
|
222
|
-
// precedes the window; its orphan end marker would trip the processor's 0x9d5 assert.
|
|
223
|
-
// Drop the clipped tail. The target batch is fully in-window, so this can't skip it.
|
|
224
|
-
continue;
|
|
225
|
-
}
|
|
226
|
-
// undefined = a system op, or an incomplete chunk awaiting later fragments.
|
|
291
|
+
// undefined = a system op or virtualized input that has not produced a complete result.
|
|
227
292
|
const inboundResult = unpack?.(op);
|
|
228
293
|
if (inboundResult === undefined) {
|
|
229
294
|
continue;
|
|
230
295
|
}
|
|
231
|
-
// Track batch progress with the processor so the guard above skips only orphan ends.
|
|
232
|
-
if (inboundResult.type === "batchStartingMessage") {
|
|
233
|
-
inBatch = true;
|
|
234
|
-
} else if (
|
|
235
|
-
inboundResult.type === "nextBatchMessage" &&
|
|
236
|
-
inboundResult.batchEnd === true
|
|
237
|
-
) {
|
|
238
|
-
inBatch = false;
|
|
239
|
-
}
|
|
240
296
|
// Derive batch identity exactly as the live inbound path does, carrying the id across a
|
|
241
297
|
// piecemeal batch's messages.
|
|
242
298
|
const update = inboundVersionMarkUpdate(inboundResult, carriedBatchId);
|
|
243
299
|
carriedBatchId = update.carriedBatchId;
|
|
244
300
|
if (update.sequenced?.batchId === batchId) {
|
|
245
|
-
return {
|
|
301
|
+
return {
|
|
302
|
+
kind: "resolved",
|
|
303
|
+
sequenceNumber: update.sequenced.sequenceNumber,
|
|
304
|
+
timestamp: update.sequenced.timestamp,
|
|
305
|
+
};
|
|
246
306
|
}
|
|
247
307
|
}
|
|
248
308
|
}
|
|
@@ -269,7 +329,7 @@ export class VersionMarkResolver implements IVersionMarkResolver {
|
|
|
269
329
|
);
|
|
270
330
|
const tip = this.hooks.getCurrentSequenceNumber();
|
|
271
331
|
if (from > tip) {
|
|
272
|
-
// Nothing is sequenced at/after the mark's
|
|
332
|
+
// Nothing is sequenced at/after the mark's lower bound yet, so the batch cannot have landed.
|
|
273
333
|
return { kind: "pending" };
|
|
274
334
|
}
|
|
275
335
|
if (firstScannedSequenceNumber === undefined) {
|
|
@@ -279,15 +339,15 @@ export class VersionMarkResolver implements IVersionMarkResolver {
|
|
|
279
339
|
return { kind: "unresolvable" };
|
|
280
340
|
}
|
|
281
341
|
if (firstScannedSequenceNumber > from) {
|
|
282
|
-
// A trim gap at the anchor: the mark's ops (
|
|
342
|
+
// A trim gap at the anchor: the mark's ops (at/after its lower bound) are gone.
|
|
283
343
|
return { kind: "unresolvable" };
|
|
284
344
|
}
|
|
285
|
-
// Ops are present from the
|
|
345
|
+
// Ops are present from the lower bound and the batch is not among them: not yet sequenced.
|
|
286
346
|
return { kind: "pending" };
|
|
287
347
|
}
|
|
288
348
|
|
|
289
349
|
public onBatchSequenced(
|
|
290
|
-
listener: (batchId: string, sequenceNumber: number) => void,
|
|
350
|
+
listener: (batchId: string, sequenceNumber: number, timestamp?: number) => void,
|
|
291
351
|
): () => void {
|
|
292
352
|
// A subscriber wants live promotions, so start tracking inbound batches from here on.
|
|
293
353
|
this.tracking = true;
|
|
@@ -297,23 +357,32 @@ export class VersionMarkResolver implements IVersionMarkResolver {
|
|
|
297
357
|
};
|
|
298
358
|
}
|
|
299
359
|
|
|
300
|
-
/** The
|
|
301
|
-
private
|
|
302
|
-
|
|
360
|
+
/** The resolved point for a batch seen live this session, or undefined. */
|
|
361
|
+
private sessionResolutionFor(
|
|
362
|
+
batchId: string,
|
|
363
|
+
): { readonly sequenceNumber: number; readonly timestamp: number } | undefined {
|
|
364
|
+
return this.resolvedBatchById.get(batchId);
|
|
303
365
|
}
|
|
304
366
|
|
|
305
367
|
/** Records an inbound batch and notifies listeners so any client can promote matching pending marks. */
|
|
306
|
-
public processInboundBatch(
|
|
307
|
-
|
|
308
|
-
|
|
368
|
+
public processInboundBatch(
|
|
369
|
+
batchId: string,
|
|
370
|
+
sequenceNumber: number,
|
|
371
|
+
timestamp: number,
|
|
372
|
+
): void {
|
|
373
|
+
const existingResolution = this.resolvedBatchById.get(batchId);
|
|
374
|
+
if (existingResolution !== undefined) {
|
|
375
|
+
// NOTE: It's possible (but exceedingly rare) that this is a spurious duplicated batch,
|
|
376
|
+
// with a different sequence number/timestamp.
|
|
377
|
+
// Rather than asserting or overwriting, we let the earlier version mark stand, it is sufficient.
|
|
309
378
|
return;
|
|
310
379
|
}
|
|
311
380
|
|
|
312
|
-
this.
|
|
381
|
+
this.resolvedBatchById.set(batchId, { sequenceNumber, timestamp });
|
|
313
382
|
this.evictBelowMinimumSequenceNumber();
|
|
314
383
|
for (const listener of this.batchListeners) {
|
|
315
384
|
try {
|
|
316
|
-
listener(batchId, sequenceNumber);
|
|
385
|
+
listener(batchId, sequenceNumber, timestamp);
|
|
317
386
|
} catch (error) {
|
|
318
387
|
// Isolate each app listener (like the container's EventEmitterWithErrorHandling): one throw
|
|
319
388
|
// must not abort op processing or starve the rest. Log and continue rather than fault the
|
|
@@ -331,11 +400,11 @@ export class VersionMarkResolver implements IVersionMarkResolver {
|
|
|
331
400
|
*/
|
|
332
401
|
private evictBelowMinimumSequenceNumber(): void {
|
|
333
402
|
const minimumSequenceNumber = this.hooks.getCurrentMinimumSequenceNumber();
|
|
334
|
-
for (const [id,
|
|
335
|
-
if (sequenceNumber >= minimumSequenceNumber) {
|
|
403
|
+
for (const [id, resolution] of this.resolvedBatchById) {
|
|
404
|
+
if (resolution.sequenceNumber >= minimumSequenceNumber) {
|
|
336
405
|
break;
|
|
337
406
|
}
|
|
338
|
-
this.
|
|
407
|
+
this.resolvedBatchById.delete(id);
|
|
339
408
|
}
|
|
340
409
|
}
|
|
341
410
|
}
|
package/tsconfig.json
CHANGED
package/internal.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/*
|
|
7
|
-
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
8
|
-
* Generated by "flub generate entrypoints --outFileLegacyBeta legacy --outFileLegacyAlpha legacyAlpha --outDir ./lib --node10TypeCompat" in @fluid-tools/build-cli.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
export * from "./lib/index.js";
|
package/legacy/alpha.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/*
|
|
7
|
-
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
8
|
-
* Generated by "flub generate entrypoints --outFileLegacyBeta legacy --outFileLegacyAlpha legacyAlpha --outDir ./lib --node10TypeCompat" in @fluid-tools/build-cli.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
export * from "../lib/legacyAlpha.js";
|
package/legacy.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/*
|
|
7
|
-
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
8
|
-
* Generated by "flub generate entrypoints --outFileLegacyBeta legacy --outFileLegacyAlpha legacyAlpha --outDir ./lib --node10TypeCompat" in @fluid-tools/build-cli.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
export * from "./lib/legacy.js";
|
|
File without changes
|
|
File without changes
|