@fluidframework/sequence 2.0.0-dev-rc.1.0.0.228517 → 2.0.0-dev-rc.2.0.0.245554
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{.eslintrc.js → .eslintrc.cjs} +4 -1
- package/{.mocharc.js → .mocharc.cjs} +1 -1
- package/CHANGELOG.md +8 -0
- package/README.md +2 -2
- package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
- package/api-extractor.json +1 -1
- package/api-report/sequence.api.md +15 -27
- package/dist/{localValues.d.ts → IntervalCollectionValues.d.ts} +13 -12
- package/dist/IntervalCollectionValues.d.ts.map +1 -0
- package/dist/{localValues.js → IntervalCollectionValues.js} +4 -4
- package/dist/IntervalCollectionValues.js.map +1 -0
- package/dist/index.d.ts +11 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -42
- package/dist/index.js.map +1 -1
- package/dist/intervalCollection.d.ts +28 -22
- package/dist/intervalCollection.d.ts.map +1 -1
- package/dist/intervalCollection.js +59 -110
- package/dist/intervalCollection.js.map +1 -1
- package/dist/{defaultMap.d.ts → intervalCollectionMap.d.ts} +18 -57
- package/dist/intervalCollectionMap.d.ts.map +1 -0
- package/dist/{defaultMap.js → intervalCollectionMap.js} +77 -129
- package/dist/intervalCollectionMap.js.map +1 -0
- package/{lib/defaultMapInterfaces.d.mts → dist/intervalCollectionMapInterfaces.d.ts} +16 -22
- package/dist/intervalCollectionMapInterfaces.d.ts.map +1 -0
- package/dist/{defaultMapInterfaces.js → intervalCollectionMapInterfaces.js} +1 -1
- package/dist/intervalCollectionMapInterfaces.js.map +1 -0
- package/dist/intervalIndex/endpointInRangeIndex.d.ts +3 -3
- package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.js +8 -8
- package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
- package/dist/intervalIndex/endpointIndex.d.ts +3 -3
- package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
- package/dist/intervalIndex/endpointIndex.js +4 -4
- package/dist/intervalIndex/endpointIndex.js.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.d.ts +2 -2
- package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.js +2 -2
- package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
- package/dist/intervalIndex/index.d.ts +8 -8
- package/dist/intervalIndex/index.d.ts.map +1 -1
- package/dist/intervalIndex/index.js +16 -16
- package/dist/intervalIndex/index.js.map +1 -1
- package/dist/intervalIndex/intervalIndex.d.ts +1 -1
- package/dist/intervalIndex/intervalIndex.d.ts.map +1 -1
- package/dist/intervalIndex/intervalIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +7 -10
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.js +12 -13
- package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +2 -2
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +7 -7
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +2 -2
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.d.ts +3 -3
- package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.js +8 -8
- package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
- package/dist/intervalTree.d.ts +1 -1
- package/dist/intervalTree.d.ts.map +1 -1
- package/dist/intervalTree.js.map +1 -1
- package/dist/intervals/index.d.ts +3 -3
- package/dist/intervals/index.d.ts.map +1 -1
- package/dist/intervals/index.js +16 -16
- package/dist/intervals/index.js.map +1 -1
- package/dist/intervals/interval.d.ts +2 -2
- package/dist/intervals/interval.d.ts.map +1 -1
- package/dist/intervals/interval.js +2 -2
- package/dist/intervals/interval.js.map +1 -1
- package/dist/intervals/intervalUtils.d.ts +3 -3
- package/dist/intervals/intervalUtils.d.ts.map +1 -1
- package/dist/intervals/intervalUtils.js +1 -1
- package/dist/intervals/intervalUtils.js.map +1 -1
- package/dist/intervals/sequenceInterval.d.ts +2 -2
- package/dist/intervals/sequenceInterval.d.ts.map +1 -1
- package/dist/intervals/sequenceInterval.js +22 -23
- package/dist/intervals/sequenceInterval.js.map +1 -1
- package/dist/package.json +3 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/revertibles.d.ts +12 -12
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +26 -26
- package/dist/revertibles.js.map +1 -1
- package/dist/sequence-alpha.d.ts +172 -13
- package/dist/sequence-beta.d.ts +2 -0
- package/dist/sequence-public.d.ts +2 -0
- package/dist/sequence-untrimmed.d.ts +73 -14
- package/dist/sequence.d.ts +48 -5
- package/dist/sequence.d.ts.map +1 -1
- package/dist/sequence.js +103 -29
- package/dist/sequence.js.map +1 -1
- package/dist/sequenceFactory.d.ts +4 -1
- package/dist/sequenceFactory.d.ts.map +1 -1
- package/dist/sequenceFactory.js +8 -5
- package/dist/sequenceFactory.js.map +1 -1
- package/dist/sharedIntervalCollection.d.ts +2 -2
- package/dist/sharedIntervalCollection.d.ts.map +1 -1
- package/dist/sharedIntervalCollection.js +5 -5
- package/dist/sharedIntervalCollection.js.map +1 -1
- package/dist/sharedSequence.d.ts +1 -1
- package/dist/sharedSequence.d.ts.map +1 -1
- package/dist/sharedSequence.js +2 -2
- package/dist/sharedSequence.js.map +1 -1
- package/dist/sharedString.d.ts +2 -2
- package/dist/sharedString.d.ts.map +1 -1
- package/dist/sharedString.js +6 -6
- package/dist/sharedString.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/{localValues.d.mts → IntervalCollectionValues.d.ts} +13 -12
- package/lib/IntervalCollectionValues.d.ts.map +1 -0
- package/lib/{localValues.mjs → IntervalCollectionValues.js} +2 -2
- package/lib/IntervalCollectionValues.js.map +1 -0
- package/lib/{index.d.mts → index.d.ts} +24 -12
- package/lib/index.d.ts.map +1 -0
- package/lib/{index.mjs → index.js} +11 -11
- package/lib/index.js.map +1 -0
- package/lib/{intervalCollection.d.mts → intervalCollection.d.ts} +29 -23
- package/lib/intervalCollection.d.ts.map +1 -0
- package/lib/{intervalCollection.mjs → intervalCollection.js} +23 -74
- package/lib/intervalCollection.js.map +1 -0
- package/lib/{defaultMap.d.mts → intervalCollectionMap.d.ts} +18 -57
- package/lib/intervalCollectionMap.d.ts.map +1 -0
- package/lib/{defaultMap.mjs → intervalCollectionMap.js} +75 -127
- package/lib/intervalCollectionMap.js.map +1 -0
- package/{dist/defaultMapInterfaces.d.ts → lib/intervalCollectionMapInterfaces.d.ts} +16 -22
- package/lib/intervalCollectionMapInterfaces.d.ts.map +1 -0
- package/lib/{intervalIndex/sequenceIntervalIndexes.mjs → intervalCollectionMapInterfaces.js} +1 -1
- package/lib/intervalCollectionMapInterfaces.js.map +1 -0
- package/lib/intervalIndex/{endpointInRangeIndex.d.mts → endpointInRangeIndex.d.ts} +4 -4
- package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -0
- package/lib/intervalIndex/{endpointInRangeIndex.mjs → endpointInRangeIndex.js} +3 -3
- package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -0
- package/lib/intervalIndex/{endpointIndex.d.mts → endpointIndex.d.ts} +4 -4
- package/lib/intervalIndex/endpointIndex.d.ts.map +1 -0
- package/lib/intervalIndex/{endpointIndex.mjs → endpointIndex.js} +2 -2
- package/lib/intervalIndex/endpointIndex.js.map +1 -0
- package/lib/intervalIndex/{idIntervalIndex.d.mts → idIntervalIndex.d.ts} +3 -3
- package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -0
- package/lib/intervalIndex/{idIntervalIndex.mjs → idIntervalIndex.js} +2 -2
- package/lib/intervalIndex/idIntervalIndex.js.map +1 -0
- package/lib/intervalIndex/{index.d.mts → index.d.ts} +9 -9
- package/lib/intervalIndex/index.d.ts.map +1 -0
- package/lib/intervalIndex/{index.mjs → index.js} +7 -7
- package/lib/intervalIndex/index.js.map +1 -0
- package/lib/intervalIndex/{intervalIndex.d.mts → intervalIndex.d.ts} +2 -2
- package/lib/intervalIndex/intervalIndex.d.ts.map +1 -0
- package/lib/intervalIndex/{intervalIndex.mjs → intervalIndex.js} +1 -1
- package/lib/intervalIndex/intervalIndex.js.map +1 -0
- package/lib/intervalIndex/{intervalIndexUtils.d.mts → intervalIndexUtils.d.ts} +1 -1
- package/lib/intervalIndex/intervalIndexUtils.d.ts.map +1 -0
- package/lib/intervalIndex/{intervalIndexUtils.mjs → intervalIndexUtils.js} +1 -1
- package/lib/intervalIndex/intervalIndexUtils.js.map +1 -0
- package/lib/intervalIndex/{overlappingIntervalsIndex.d.mts → overlappingIntervalsIndex.d.ts} +8 -11
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
- package/lib/intervalIndex/{overlappingIntervalsIndex.mjs → overlappingIntervalsIndex.js} +8 -9
- package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
- package/lib/intervalIndex/{overlappingSequenceIntervalsIndex.d.mts → overlappingSequenceIntervalsIndex.d.ts} +3 -3
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
- package/lib/intervalIndex/{overlappingSequenceIntervalsIndex.mjs → overlappingSequenceIntervalsIndex.js} +3 -3
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
- package/lib/intervalIndex/{sequenceIntervalIndexes.d.mts → sequenceIntervalIndexes.d.ts} +3 -3
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
- package/lib/{defaultMapInterfaces.mjs → intervalIndex/sequenceIntervalIndexes.js} +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
- package/lib/intervalIndex/{startpointInRangeIndex.d.mts → startpointInRangeIndex.d.ts} +4 -4
- package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -0
- package/lib/intervalIndex/{startpointInRangeIndex.mjs → startpointInRangeIndex.js} +3 -3
- package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -0
- package/lib/{intervalTree.d.mts → intervalTree.d.ts} +2 -2
- package/lib/intervalTree.d.ts.map +1 -0
- package/lib/{intervalTree.mjs → intervalTree.js} +1 -1
- package/lib/intervalTree.js.map +1 -0
- package/lib/intervals/{index.d.mts → index.d.ts} +4 -4
- package/lib/intervals/index.d.ts.map +1 -0
- package/lib/intervals/{index.mjs → index.js} +4 -4
- package/lib/intervals/index.js.map +1 -0
- package/lib/intervals/{interval.d.mts → interval.d.ts} +3 -3
- package/lib/intervals/{interval.d.mts.map → interval.d.ts.map} +1 -1
- package/lib/intervals/{interval.mjs → interval.js} +2 -2
- package/lib/intervals/interval.js.map +1 -0
- package/lib/intervals/{intervalUtils.d.mts → intervalUtils.d.ts} +4 -4
- package/lib/intervals/intervalUtils.d.ts.map +1 -0
- package/lib/intervals/{intervalUtils.mjs → intervalUtils.js} +3 -2
- package/lib/intervals/intervalUtils.js.map +1 -0
- package/lib/intervals/{sequenceInterval.d.mts → sequenceInterval.d.ts} +3 -3
- package/lib/intervals/sequenceInterval.d.ts.map +1 -0
- package/lib/intervals/{sequenceInterval.mjs → sequenceInterval.js} +5 -4
- package/lib/intervals/{sequenceInterval.mjs.map → sequenceInterval.js.map} +1 -1
- package/lib/{packageVersion.d.mts → packageVersion.d.ts} +2 -2
- package/lib/packageVersion.d.ts.map +1 -0
- package/lib/{packageVersion.mjs → packageVersion.js} +2 -2
- package/lib/packageVersion.js.map +1 -0
- package/lib/{revertibles.d.mts → revertibles.d.ts} +13 -13
- package/lib/revertibles.d.ts.map +1 -0
- package/lib/{revertibles.mjs → revertibles.js} +11 -10
- package/lib/revertibles.js.map +1 -0
- package/lib/{sequence-alpha.d.mts → sequence-alpha.d.ts} +185 -13
- package/lib/{sequence-beta.d.mts → sequence-beta.d.ts} +15 -0
- package/lib/{sequence-public.d.mts → sequence-public.d.ts} +15 -0
- package/lib/{sequence-untrimmed.d.mts → sequence-untrimmed.d.ts} +86 -14
- package/lib/{sequence.d.mts → sequence.d.ts} +49 -6
- package/lib/sequence.d.ts.map +1 -0
- package/lib/{sequence.mjs → sequence.js} +100 -29
- package/lib/sequence.js.map +1 -0
- package/lib/{sequenceDeltaEvent.d.mts → sequenceDeltaEvent.d.ts} +1 -1
- package/lib/sequenceDeltaEvent.d.ts.map +1 -0
- package/lib/{sequenceDeltaEvent.mjs → sequenceDeltaEvent.js} +1 -1
- package/lib/sequenceDeltaEvent.js.map +1 -0
- package/lib/{sequenceFactory.d.mts → sequenceFactory.d.ts} +5 -2
- package/lib/sequenceFactory.d.ts.map +1 -0
- package/lib/{sequenceFactory.mjs → sequenceFactory.js} +6 -3
- package/lib/sequenceFactory.js.map +1 -0
- package/lib/{sharedIntervalCollection.d.mts → sharedIntervalCollection.d.ts} +3 -3
- package/lib/sharedIntervalCollection.d.ts.map +1 -0
- package/lib/{sharedIntervalCollection.mjs → sharedIntervalCollection.js} +5 -5
- package/lib/sharedIntervalCollection.js.map +1 -0
- package/lib/{sharedSequence.d.mts → sharedSequence.d.ts} +2 -2
- package/lib/sharedSequence.d.ts.map +1 -0
- package/lib/{sharedSequence.mjs → sharedSequence.js} +2 -2
- package/lib/sharedSequence.js.map +1 -0
- package/lib/{sharedString.d.mts → sharedString.d.ts} +3 -3
- package/lib/sharedString.d.ts.map +1 -0
- package/lib/{sharedString.mjs → sharedString.js} +3 -3
- package/lib/sharedString.js.map +1 -0
- package/lib/test/collections.intervalTree.js +73 -0
- package/lib/test/collections.intervalTree.js.map +1 -0
- package/lib/test/createSnapshotFiles.js +15 -0
- package/lib/test/createSnapshotFiles.js.map +1 -0
- package/lib/test/dirname.cjs +16 -0
- package/lib/test/dirname.cjs.map +1 -0
- package/lib/test/endpointInRangeIndex.spec.js +182 -0
- package/lib/test/endpointInRangeIndex.spec.js.map +1 -0
- package/lib/test/fuzz/fuzzUtils.js +362 -0
- package/lib/test/fuzz/fuzzUtils.js.map +1 -0
- package/lib/test/fuzz/intervalCollection.fuzz.spec.js +87 -0
- package/lib/test/fuzz/intervalCollection.fuzz.spec.js.map +1 -0
- package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js +128 -0
- package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js.map +1 -0
- package/lib/test/fuzz/sharedString.fuzz.spec.js +91 -0
- package/lib/test/fuzz/sharedString.fuzz.spec.js.map +1 -0
- package/lib/test/generateSharedStrings.js +138 -0
- package/lib/test/generateSharedStrings.js.map +1 -0
- package/lib/test/intervalCollection.detached.spec.js +126 -0
- package/lib/test/intervalCollection.detached.spec.js.map +1 -0
- package/lib/test/intervalCollection.events.spec.js +491 -0
- package/lib/test/intervalCollection.events.spec.js.map +1 -0
- package/lib/test/intervalCollection.perf.spec.js +88 -0
- package/lib/test/intervalCollection.perf.spec.js.map +1 -0
- package/lib/test/intervalCollection.snapshot.spec.js +171 -0
- package/lib/test/intervalCollection.snapshot.spec.js.map +1 -0
- package/lib/test/intervalCollection.spec.js +1660 -0
- package/lib/test/intervalCollection.spec.js.map +1 -0
- package/lib/test/intervalIndexTestUtils.js +49 -0
- package/lib/test/intervalIndexTestUtils.js.map +1 -0
- package/lib/test/intervalRebasing.spec.js +589 -0
- package/lib/test/intervalRebasing.spec.js.map +1 -0
- package/lib/test/intervalStashedOps.spec.js +142 -0
- package/lib/test/intervalStashedOps.spec.js.map +1 -0
- package/lib/test/intervalTestUtils.js +81 -0
- package/lib/test/intervalTestUtils.js.map +1 -0
- package/lib/test/marshalling.spec.js +55 -0
- package/lib/test/marshalling.spec.js.map +1 -0
- package/lib/test/memory/sharedSequence.spec.js +82 -0
- package/lib/test/memory/sharedSequence.spec.js.map +1 -0
- package/lib/test/memory/sharedString.spec.js +134 -0
- package/lib/test/memory/sharedString.spec.js.map +1 -0
- package/lib/test/overlappingSequenceIntervalsIndex.spec.js +348 -0
- package/lib/test/overlappingSequenceIntervalsIndex.spec.js.map +1 -0
- package/lib/test/partialLoad.spec.js +211 -0
- package/lib/test/partialLoad.spec.js.map +1 -0
- package/lib/test/rebasing.spec.js +81 -0
- package/lib/test/rebasing.spec.js.map +1 -0
- package/lib/test/reentrancy.spec.js +174 -0
- package/lib/test/reentrancy.spec.js.map +1 -0
- package/lib/test/revertibles.spec.js +971 -0
- package/lib/test/revertibles.spec.js.map +1 -0
- package/lib/test/sequenceDeltaEvent.spec.js +2144 -0
- package/lib/test/sequenceDeltaEvent.spec.js.map +1 -0
- package/lib/test/sharedIntervalCollection.spec.js +159 -0
- package/lib/test/sharedIntervalCollection.spec.js.map +1 -0
- package/lib/test/sharedString.spec.js +532 -0
- package/lib/test/sharedString.spec.js.map +1 -0
- package/lib/test/snapshotEmptyProps.spec.js +45 -0
- package/lib/test/snapshotEmptyProps.spec.js.map +1 -0
- package/lib/test/snapshotVersion.spec.js +149 -0
- package/lib/test/snapshotVersion.spec.js.map +1 -0
- package/lib/test/startpointInRangeIndex.spec.js +182 -0
- package/lib/test/startpointInRangeIndex.spec.js.map +1 -0
- package/lib/test/subSequence.spec.js +92 -0
- package/lib/test/subSequence.spec.js.map +1 -0
- package/lib/test/types/validateSequencePrevious.generated.js +162 -0
- package/lib/test/types/validateSequencePrevious.generated.js.map +1 -0
- package/lib/test/v1IntervalCollectionHelpers.js +93 -0
- package/lib/test/v1IntervalCollectionHelpers.js.map +1 -0
- package/package.json +66 -60
- package/src/{localValues.ts → IntervalCollectionValues.ts} +23 -17
- package/src/index.ts +15 -11
- package/src/intervalCollection.ts +73 -106
- package/src/{defaultMap.ts → intervalCollectionMap.ts} +120 -211
- package/src/{defaultMapInterfaces.ts → intervalCollectionMapInterfaces.ts} +24 -23
- package/src/intervalIndex/endpointInRangeIndex.ts +4 -4
- package/src/intervalIndex/endpointIndex.ts +3 -3
- package/src/intervalIndex/idIntervalIndex.ts +3 -4
- package/src/intervalIndex/index.ts +8 -8
- package/src/intervalIndex/intervalIndex.ts +1 -1
- package/src/intervalIndex/overlappingIntervalsIndex.ts +10 -11
- package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +4 -4
- package/src/intervalIndex/sequenceIntervalIndexes.ts +2 -2
- package/src/intervalIndex/startpointInRangeIndex.ts +4 -4
- package/src/intervalTree.ts +1 -1
- package/src/intervals/index.ts +3 -3
- package/src/intervals/interval.ts +2 -4
- package/src/intervals/intervalUtils.ts +3 -3
- package/src/intervals/sequenceInterval.ts +3 -4
- package/src/packageVersion.ts +1 -1
- package/src/revertibles.ts +13 -13
- package/src/sequence.ts +128 -50
- package/src/sequenceFactory.ts +5 -2
- package/src/sharedIntervalCollection.ts +7 -11
- package/src/sharedSequence.ts +1 -1
- package/src/sharedString.ts +2 -2
- package/tsconfig.cjs.json +7 -0
- package/tsconfig.json +2 -5
- package/dist/defaultMap.d.ts.map +0 -1
- package/dist/defaultMap.js.map +0 -1
- package/dist/defaultMapInterfaces.d.ts.map +0 -1
- package/dist/defaultMapInterfaces.js.map +0 -1
- package/dist/localValues.d.ts.map +0 -1
- package/dist/localValues.js.map +0 -1
- package/lib/defaultMap.d.mts.map +0 -1
- package/lib/defaultMap.mjs.map +0 -1
- package/lib/defaultMapInterfaces.d.mts.map +0 -1
- package/lib/defaultMapInterfaces.mjs.map +0 -1
- package/lib/index.d.mts.map +0 -1
- package/lib/index.mjs.map +0 -1
- package/lib/intervalCollection.d.mts.map +0 -1
- package/lib/intervalCollection.mjs.map +0 -1
- package/lib/intervalIndex/endpointInRangeIndex.d.mts.map +0 -1
- package/lib/intervalIndex/endpointInRangeIndex.mjs.map +0 -1
- package/lib/intervalIndex/endpointIndex.d.mts.map +0 -1
- package/lib/intervalIndex/endpointIndex.mjs.map +0 -1
- package/lib/intervalIndex/idIntervalIndex.d.mts.map +0 -1
- package/lib/intervalIndex/idIntervalIndex.mjs.map +0 -1
- package/lib/intervalIndex/index.d.mts.map +0 -1
- package/lib/intervalIndex/index.mjs.map +0 -1
- package/lib/intervalIndex/intervalIndex.d.mts.map +0 -1
- package/lib/intervalIndex/intervalIndex.mjs.map +0 -1
- package/lib/intervalIndex/intervalIndexUtils.d.mts.map +0 -1
- package/lib/intervalIndex/intervalIndexUtils.mjs.map +0 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.d.mts.map +0 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.mjs.map +0 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.mts.map +0 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.mjs.map +0 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.d.mts.map +0 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.mjs.map +0 -1
- package/lib/intervalIndex/startpointInRangeIndex.d.mts.map +0 -1
- package/lib/intervalIndex/startpointInRangeIndex.mjs.map +0 -1
- package/lib/intervalTree.d.mts.map +0 -1
- package/lib/intervalTree.mjs.map +0 -1
- package/lib/intervals/index.d.mts.map +0 -1
- package/lib/intervals/index.mjs.map +0 -1
- package/lib/intervals/interval.mjs.map +0 -1
- package/lib/intervals/intervalUtils.d.mts.map +0 -1
- package/lib/intervals/intervalUtils.mjs.map +0 -1
- package/lib/intervals/sequenceInterval.d.mts.map +0 -1
- package/lib/localValues.d.mts.map +0 -1
- package/lib/localValues.mjs.map +0 -1
- package/lib/packageVersion.d.mts.map +0 -1
- package/lib/packageVersion.mjs.map +0 -1
- package/lib/revertibles.d.mts.map +0 -1
- package/lib/revertibles.mjs.map +0 -1
- package/lib/sequence.d.mts.map +0 -1
- package/lib/sequence.mjs.map +0 -1
- package/lib/sequenceDeltaEvent.d.mts.map +0 -1
- package/lib/sequenceDeltaEvent.mjs.map +0 -1
- package/lib/sequenceFactory.d.mts.map +0 -1
- package/lib/sequenceFactory.mjs.map +0 -1
- package/lib/sharedIntervalCollection.d.mts.map +0 -1
- package/lib/sharedIntervalCollection.mjs.map +0 -1
- package/lib/sharedSequence.d.mts.map +0 -1
- package/lib/sharedSequence.mjs.map +0 -1
- package/lib/sharedString.d.mts.map +0 -1
- package/lib/sharedString.mjs.map +0 -1
|
@@ -3,23 +3,23 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
export { IntervalIndex } from "./intervalIndex";
|
|
7
|
-
export { IIdIntervalIndex, createIdIntervalIndex } from "./idIntervalIndex";
|
|
8
|
-
export { IEndpointIndex, createEndpointIndex, EndpointIndex } from "./endpointIndex";
|
|
6
|
+
export { IntervalIndex } from "./intervalIndex.js";
|
|
7
|
+
export { IIdIntervalIndex, createIdIntervalIndex } from "./idIntervalIndex.js";
|
|
8
|
+
export { IEndpointIndex, createEndpointIndex, EndpointIndex } from "./endpointIndex.js";
|
|
9
9
|
export {
|
|
10
10
|
IEndpointInRangeIndex,
|
|
11
11
|
createEndpointInRangeIndex,
|
|
12
12
|
EndpointInRangeIndex,
|
|
13
|
-
} from "./endpointInRangeIndex";
|
|
13
|
+
} from "./endpointInRangeIndex.js";
|
|
14
14
|
export {
|
|
15
15
|
IStartpointInRangeIndex,
|
|
16
16
|
createStartpointInRangeIndex,
|
|
17
17
|
StartpointInRangeIndex,
|
|
18
|
-
} from "./startpointInRangeIndex";
|
|
19
|
-
export { SequenceIntervalIndexes } from "./sequenceIntervalIndexes";
|
|
18
|
+
} from "./startpointInRangeIndex.js";
|
|
19
|
+
export { SequenceIntervalIndexes } from "./sequenceIntervalIndexes.js";
|
|
20
20
|
export {
|
|
21
21
|
IOverlappingIntervalsIndex,
|
|
22
22
|
createOverlappingIntervalsIndex,
|
|
23
23
|
OverlappingIntervalsIndex,
|
|
24
|
-
} from "./overlappingIntervalsIndex";
|
|
25
|
-
export { createOverlappingSequenceIntervalsIndex } from "./overlappingSequenceIntervalsIndex";
|
|
24
|
+
} from "./overlappingIntervalsIndex.js";
|
|
25
|
+
export { createOverlappingSequenceIntervalsIndex } from "./overlappingSequenceIntervalsIndex.js";
|
|
@@ -11,14 +11,14 @@ import {
|
|
|
11
11
|
ISerializableInterval,
|
|
12
12
|
sequenceIntervalHelpers,
|
|
13
13
|
SequenceInterval,
|
|
14
|
-
} from "../intervals";
|
|
15
|
-
import { IntervalNode, IntervalTree } from "../intervalTree";
|
|
16
|
-
import { SharedString } from "../sharedString";
|
|
17
|
-
import { SequencePlace, endpointPosAndSide } from "../intervalCollection";
|
|
18
|
-
import { IntervalIndex } from "./intervalIndex";
|
|
14
|
+
} from "../intervals/index.js";
|
|
15
|
+
import { IntervalNode, IntervalTree } from "../intervalTree.js";
|
|
16
|
+
import { SharedString } from "../sharedString.js";
|
|
17
|
+
import { SequencePlace, endpointPosAndSide } from "../intervalCollection.js";
|
|
18
|
+
import { IntervalIndex } from "./intervalIndex.js";
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
|
-
* @
|
|
21
|
+
* @alpha
|
|
22
22
|
*/
|
|
23
23
|
export interface IOverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
24
24
|
extends IntervalIndex<TInterval> {
|
|
@@ -39,9 +39,6 @@ export interface IOverlappingIntervalsIndex<TInterval extends ISerializableInter
|
|
|
39
39
|
): void;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
/**
|
|
43
|
-
* @public
|
|
44
|
-
*/
|
|
45
42
|
export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
46
43
|
implements IOverlappingIntervalsIndex<TInterval>
|
|
47
44
|
{
|
|
@@ -150,7 +147,9 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
|
150
147
|
if (
|
|
151
148
|
startPos === undefined ||
|
|
152
149
|
endPos === undefined ||
|
|
153
|
-
endPos < startPos ||
|
|
150
|
+
(typeof startPos === "number" && typeof endPos === "number" && endPos < startPos) ||
|
|
151
|
+
(startPos === "end" && endPos !== "end") ||
|
|
152
|
+
(startPos !== "start" && endPos === "start") ||
|
|
154
153
|
this.intervalTree.intervals.isEmpty()
|
|
155
154
|
) {
|
|
156
155
|
return [];
|
|
@@ -177,7 +176,7 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
|
177
176
|
}
|
|
178
177
|
|
|
179
178
|
/**
|
|
180
|
-
* @
|
|
179
|
+
* @alpha
|
|
181
180
|
*/
|
|
182
181
|
export function createOverlappingIntervalsIndex(
|
|
183
182
|
sharedString: SharedString,
|
|
@@ -16,10 +16,10 @@ import {
|
|
|
16
16
|
IntervalType,
|
|
17
17
|
SequenceInterval,
|
|
18
18
|
createPositionReferenceFromSegoff,
|
|
19
|
-
} from "../intervals";
|
|
20
|
-
import { SharedString } from "../sharedString";
|
|
21
|
-
import { SequenceIntervalIndexes } from "./sequenceIntervalIndexes";
|
|
22
|
-
import { OverlappingIntervalsIndex } from "./overlappingIntervalsIndex";
|
|
19
|
+
} from "../intervals/index.js";
|
|
20
|
+
import { SharedString } from "../sharedString.js";
|
|
21
|
+
import { SequenceIntervalIndexes } from "./sequenceIntervalIndexes.js";
|
|
22
|
+
import { OverlappingIntervalsIndex } from "./overlappingIntervalsIndex.js";
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
* @public
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { ISegment } from "@fluidframework/merge-tree";
|
|
7
|
-
import { SequenceInterval } from "../intervals";
|
|
8
|
-
import { IOverlappingIntervalsIndex } from "./overlappingIntervalsIndex";
|
|
7
|
+
import { SequenceInterval } from "../intervals/index.js";
|
|
8
|
+
import { IOverlappingIntervalsIndex } from "./overlappingIntervalsIndex.js";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* This namespace contains specialiazations of indexes which support spatial queries
|
|
@@ -11,10 +11,10 @@ import {
|
|
|
11
11
|
IntervalType,
|
|
12
12
|
SequenceInterval,
|
|
13
13
|
sequenceIntervalHelpers,
|
|
14
|
-
} from "../intervals";
|
|
15
|
-
import { SharedString } from "../sharedString";
|
|
16
|
-
import { IntervalIndex } from "./intervalIndex";
|
|
17
|
-
import { HasComparisonOverride, compareOverrideables, forceCompare } from "./intervalIndexUtils";
|
|
14
|
+
} from "../intervals/index.js";
|
|
15
|
+
import { SharedString } from "../sharedString.js";
|
|
16
|
+
import { IntervalIndex } from "./intervalIndex.js";
|
|
17
|
+
import { HasComparisonOverride, compareOverrideables, forceCompare } from "./intervalIndexUtils.js";
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* Collection of intervals.
|
package/src/intervalTree.ts
CHANGED
package/src/intervals/index.ts
CHANGED
|
@@ -16,11 +16,11 @@ export {
|
|
|
16
16
|
CompressedSerializedInterval,
|
|
17
17
|
endReferenceSlidingPreference,
|
|
18
18
|
startReferenceSlidingPreference,
|
|
19
|
-
} from "./intervalUtils";
|
|
20
|
-
export { Interval, createInterval, intervalHelpers } from "./interval";
|
|
19
|
+
} from "./intervalUtils.js";
|
|
20
|
+
export { Interval, createInterval, intervalHelpers } from "./interval.js";
|
|
21
21
|
export {
|
|
22
22
|
SequenceInterval,
|
|
23
23
|
createSequenceInterval,
|
|
24
24
|
createPositionReferenceFromSegoff,
|
|
25
25
|
sequenceIntervalHelpers,
|
|
26
|
-
} from "./sequenceInterval";
|
|
26
|
+
} from "./sequenceInterval.js";
|
|
@@ -13,10 +13,8 @@ import {
|
|
|
13
13
|
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
14
14
|
import { assert } from "@fluidframework/core-utils";
|
|
15
15
|
import { UsageError } from "@fluidframework/telemetry-utils";
|
|
16
|
-
import { SequencePlace } from "../intervalCollection";
|
|
17
|
-
import { IIntervalHelpers, ISerializableInterval, ISerializedInterval } from "./intervalUtils";
|
|
18
|
-
|
|
19
|
-
const reservedIntervalIdKey = "intervalId";
|
|
16
|
+
import { SequencePlace, reservedIntervalIdKey } from "../intervalCollection.js";
|
|
17
|
+
import { IIntervalHelpers, ISerializableInterval, ISerializedInterval } from "./intervalUtils.js";
|
|
20
18
|
|
|
21
19
|
/**
|
|
22
20
|
* Serializable interval whose endpoints are plain-old numbers.
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
SlidingPreference,
|
|
13
13
|
} from "@fluidframework/merge-tree";
|
|
14
14
|
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
15
|
-
import { SequencePlace, Side } from "../intervalCollection";
|
|
15
|
+
import { SequencePlace, Side } from "../intervalCollection.js";
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* Basic interval abstraction
|
|
@@ -81,7 +81,7 @@ export type IntervalDeltaOpType = (typeof IntervalDeltaOpType)[keyof typeof Inte
|
|
|
81
81
|
|
|
82
82
|
/**
|
|
83
83
|
* Values are used in revertibles.
|
|
84
|
-
* @
|
|
84
|
+
* @alpha
|
|
85
85
|
*/
|
|
86
86
|
export const IntervalOpType = {
|
|
87
87
|
...IntervalDeltaOpType,
|
|
@@ -89,7 +89,7 @@ export const IntervalOpType = {
|
|
|
89
89
|
POSITION_REMOVE: "positionRemove",
|
|
90
90
|
} as const;
|
|
91
91
|
/**
|
|
92
|
-
* @
|
|
92
|
+
* @alpha
|
|
93
93
|
*/
|
|
94
94
|
export type IntervalOpType = (typeof IntervalOpType)[keyof typeof IntervalOpType];
|
|
95
95
|
|
|
@@ -31,8 +31,9 @@ import {
|
|
|
31
31
|
Side,
|
|
32
32
|
computeStickinessFromSide,
|
|
33
33
|
endpointPosAndSide,
|
|
34
|
+
reservedIntervalIdKey,
|
|
34
35
|
sidesFromStickiness,
|
|
35
|
-
} from "../intervalCollection";
|
|
36
|
+
} from "../intervalCollection.js";
|
|
36
37
|
import {
|
|
37
38
|
IIntervalHelpers,
|
|
38
39
|
ISerializableInterval,
|
|
@@ -41,9 +42,7 @@ import {
|
|
|
41
42
|
IntervalType,
|
|
42
43
|
endReferenceSlidingPreference,
|
|
43
44
|
startReferenceSlidingPreference,
|
|
44
|
-
} from "./intervalUtils";
|
|
45
|
-
|
|
46
|
-
const reservedIntervalIdKey = "intervalId";
|
|
45
|
+
} from "./intervalUtils.js";
|
|
47
46
|
|
|
48
47
|
function compareSides(sideA: Side, sideB: Side): number {
|
|
49
48
|
if (sideA === sideB) {
|
package/src/packageVersion.ts
CHANGED
package/src/revertibles.ts
CHANGED
|
@@ -23,14 +23,14 @@ import {
|
|
|
23
23
|
getSlideToSegoff,
|
|
24
24
|
SlidingPreference,
|
|
25
25
|
} from "@fluidframework/merge-tree";
|
|
26
|
-
import { InteriorSequencePlace, Side } from "./intervalCollection";
|
|
27
|
-
import { IntervalOpType, SequenceInterval } from "./intervals";
|
|
28
|
-
import { SharedString, SharedStringSegment } from "./sharedString";
|
|
29
|
-
import { ISequenceDeltaRange, SequenceDeltaEvent } from "./sequenceDeltaEvent";
|
|
26
|
+
import { InteriorSequencePlace, Side } from "./intervalCollection.js";
|
|
27
|
+
import { IntervalOpType, SequenceInterval } from "./intervals/index.js";
|
|
28
|
+
import { SharedString, SharedStringSegment } from "./sharedString.js";
|
|
29
|
+
import { ISequenceDeltaRange, SequenceDeltaEvent } from "./sequenceDeltaEvent.js";
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
32
|
* Data for undoing edits on SharedStrings and Intervals.
|
|
33
|
-
* @
|
|
33
|
+
* @alpha
|
|
34
34
|
*/
|
|
35
35
|
export type SharedStringRevertible = MergeTreeDeltaRevertible | IntervalRevertible;
|
|
36
36
|
|
|
@@ -38,7 +38,7 @@ const idMap = new Map<string, string>();
|
|
|
38
38
|
|
|
39
39
|
/**
|
|
40
40
|
* Data for undoing edits affecting Intervals.
|
|
41
|
-
* @
|
|
41
|
+
* @alpha
|
|
42
42
|
*/
|
|
43
43
|
export type IntervalRevertible =
|
|
44
44
|
| {
|
|
@@ -92,7 +92,7 @@ function getUpdatedId(intervalId: string): string {
|
|
|
92
92
|
|
|
93
93
|
/**
|
|
94
94
|
* Create revertibles for adding an interval
|
|
95
|
-
* @
|
|
95
|
+
* @alpha
|
|
96
96
|
*/
|
|
97
97
|
export function appendAddIntervalToRevertibles(
|
|
98
98
|
interval: SequenceInterval,
|
|
@@ -108,7 +108,7 @@ export function appendAddIntervalToRevertibles(
|
|
|
108
108
|
|
|
109
109
|
/**
|
|
110
110
|
* Create revertibles for deleting an interval
|
|
111
|
-
* @
|
|
111
|
+
* @alpha
|
|
112
112
|
*/
|
|
113
113
|
export function appendDeleteIntervalToRevertibles(
|
|
114
114
|
string: SharedString,
|
|
@@ -160,7 +160,7 @@ export function appendDeleteIntervalToRevertibles(
|
|
|
160
160
|
|
|
161
161
|
/**
|
|
162
162
|
* Create revertibles for moving endpoints of an interval
|
|
163
|
-
* @
|
|
163
|
+
* @alpha
|
|
164
164
|
*/
|
|
165
165
|
export function appendChangeIntervalToRevertibles(
|
|
166
166
|
string: SharedString,
|
|
@@ -210,7 +210,7 @@ export function appendChangeIntervalToRevertibles(
|
|
|
210
210
|
|
|
211
211
|
/**
|
|
212
212
|
* Create revertibles for changing properties of an interval
|
|
213
|
-
* @
|
|
213
|
+
* @alpha
|
|
214
214
|
*/
|
|
215
215
|
export function appendIntervalPropertyChangedToRevertibles(
|
|
216
216
|
interval: SequenceInterval,
|
|
@@ -270,7 +270,7 @@ function addIfRevertibleRef(
|
|
|
270
270
|
/**
|
|
271
271
|
* Create revertibles for SharedStringDeltas, handling indirectly modified intervals
|
|
272
272
|
* (e.g. reverting remove of a range that contains an interval will move the interval back)
|
|
273
|
-
* @
|
|
273
|
+
* @alpha
|
|
274
274
|
*/
|
|
275
275
|
export function appendSharedStringDeltaToRevertibles(
|
|
276
276
|
string: SharedString,
|
|
@@ -363,7 +363,7 @@ export function appendSharedStringDeltaToRevertibles(
|
|
|
363
363
|
|
|
364
364
|
/**
|
|
365
365
|
* Clean up resources held by revertibles that are no longer needed.
|
|
366
|
-
* @
|
|
366
|
+
* @alpha
|
|
367
367
|
*/
|
|
368
368
|
export function discardSharedStringRevertibles(
|
|
369
369
|
sharedString: SharedString,
|
|
@@ -654,7 +654,7 @@ function revertLocalSequenceRemove(
|
|
|
654
654
|
|
|
655
655
|
/**
|
|
656
656
|
* Invoke revertibles to reverse prior edits
|
|
657
|
-
* @
|
|
657
|
+
* @alpha
|
|
658
658
|
*/
|
|
659
659
|
export function revertSharedStringRevertibles(
|
|
660
660
|
sharedString: SharedString,
|
package/src/sequence.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
import Deque from "double-ended-queue";
|
|
6
7
|
import { assert, Deferred } from "@fluidframework/core-utils";
|
|
7
8
|
import { bufferToString } from "@fluid-internal/client-utils";
|
|
8
9
|
import { LoggingError, createChildLogger } from "@fluidframework/telemetry-utils";
|
|
@@ -44,23 +45,17 @@ import {
|
|
|
44
45
|
import { ObjectStoragePartition, SummaryTreeBuilder } from "@fluidframework/runtime-utils";
|
|
45
46
|
import {
|
|
46
47
|
IFluidSerializer,
|
|
47
|
-
makeHandlesSerializable,
|
|
48
|
-
parseHandles,
|
|
49
48
|
SharedObject,
|
|
50
49
|
ISharedObjectEvents,
|
|
51
50
|
} from "@fluidframework/shared-object-base";
|
|
52
51
|
import { IEventThisPlaceHolder } from "@fluidframework/core-interfaces";
|
|
53
52
|
import { ISummaryTreeWithStats, ITelemetryContext } from "@fluidframework/runtime-definitions";
|
|
54
|
-
import {
|
|
55
|
-
import { IMapMessageLocalMetadata, IValueChanged } from "./
|
|
56
|
-
import { SequenceInterval } from "./intervals";
|
|
57
|
-
import {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
SequenceIntervalCollectionValueType,
|
|
61
|
-
} from "./intervalCollection";
|
|
62
|
-
import { SequenceDeltaEvent, SequenceMaintenanceEvent } from "./sequenceDeltaEvent";
|
|
63
|
-
import { ISharedIntervalCollection } from "./sharedIntervalCollection";
|
|
53
|
+
import { IntervalCollectionMap, IMapOperation } from "./intervalCollectionMap.js";
|
|
54
|
+
import { IMapMessageLocalMetadata, IValueChanged } from "./intervalCollectionMapInterfaces.js";
|
|
55
|
+
import { SequenceInterval } from "./intervals/index.js";
|
|
56
|
+
import { IIntervalCollection, SequenceIntervalCollectionValueType } from "./intervalCollection.js";
|
|
57
|
+
import { SequenceDeltaEvent, SequenceMaintenanceEvent } from "./sequenceDeltaEvent.js";
|
|
58
|
+
import { ISharedIntervalCollection } from "./sharedIntervalCollection.js";
|
|
64
59
|
|
|
65
60
|
const snapshotFileName = "header";
|
|
66
61
|
const contentPath = "content";
|
|
@@ -212,6 +207,40 @@ export abstract class SharedSegmentSequence<T extends ISegment>
|
|
|
212
207
|
return ops;
|
|
213
208
|
}
|
|
214
209
|
|
|
210
|
+
/**
|
|
211
|
+
* Note: this field only provides a lower-bound on the reference sequence numbers for in-flight ops.
|
|
212
|
+
* The exact reason isn't understood, but some e2e tests suggest that the runtime may sometimes process
|
|
213
|
+
* incoming leave/join ops before putting an op that this DDS submits over the wire.
|
|
214
|
+
*
|
|
215
|
+
* E.g. SharedString submits an op while deltaManager has lastSequenceNumber = 10, but before the runtime
|
|
216
|
+
* puts this op over the wire, it processes a client join/leave op with sequence number 11, so the referenceSequenceNumber
|
|
217
|
+
* on the SharedString op is 11.
|
|
218
|
+
*
|
|
219
|
+
* The reference sequence numbers placed in this queue are also not accurate for stashed ops due to how the applyStashedOp
|
|
220
|
+
* flow works at the runtime level. This is a legitimate bug, and AB#6602 tracks one way to fix it (stop reaching all the way
|
|
221
|
+
* to deltaManager's lastSequenceNumber to obtain refSeq, instead leveraging some analogous notion on the container or datastore
|
|
222
|
+
* runtime).
|
|
223
|
+
*/
|
|
224
|
+
private readonly inFlightRefSeqs = new Deque<number>();
|
|
225
|
+
|
|
226
|
+
private ongoingResubmitRefSeq: number | undefined;
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Gets the reference sequence number (i.e. sequence number of the runtime's last processed op) for an op submitted
|
|
230
|
+
* in the current context.
|
|
231
|
+
*
|
|
232
|
+
* This value can be optionally overridden using `useResubmitRefSeq`.
|
|
233
|
+
* IntervalCollection's resubmit logic currently relies on preserving merge information from when the op was originally submitted,
|
|
234
|
+
* even if the op is resubmitted more than once. Thus during resubmit, `inFlightRefSeqs` gets populated with the
|
|
235
|
+
* original refSeq rather than the refSeq at the time of reconnection.
|
|
236
|
+
*
|
|
237
|
+
* @remarks - In some not fully understood cases, the runtime may process incoming ops before putting an op that this
|
|
238
|
+
* DDS submits over the wire. See `inFlightRefSeqs` for more details.
|
|
239
|
+
*/
|
|
240
|
+
private get currentRefSeq() {
|
|
241
|
+
return this.ongoingResubmitRefSeq ?? this.runtime.deltaManager.lastSequenceNumber;
|
|
242
|
+
}
|
|
243
|
+
|
|
215
244
|
// eslint-disable-next-line import/no-deprecated
|
|
216
245
|
protected client: Client;
|
|
217
246
|
/** `Deferred` that triggers once the object is loaded */
|
|
@@ -224,7 +253,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
|
|
|
224
253
|
private readonly loadedDeferredIncomingOps: ISequencedDocumentMessage[] = [];
|
|
225
254
|
|
|
226
255
|
private messagesSinceMSNChange: ISequencedDocumentMessage[] = [];
|
|
227
|
-
private readonly intervalCollections:
|
|
256
|
+
private readonly intervalCollections: IntervalCollectionMap<SequenceInterval>;
|
|
228
257
|
constructor(
|
|
229
258
|
private readonly dataStoreRuntime: IFluidDataStoreRuntime,
|
|
230
259
|
public id: string,
|
|
@@ -233,6 +262,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
|
|
|
233
262
|
) {
|
|
234
263
|
super(id, dataStoreRuntime, attributes, "fluid_sequence_");
|
|
235
264
|
|
|
265
|
+
const getMinInFlightRefSeq = () => this.inFlightRefSeqs.get(0);
|
|
236
266
|
this.guardReentrancy =
|
|
237
267
|
dataStoreRuntime.options.sharedStringPreventReentrancy ?? true
|
|
238
268
|
? ensureNoReentrancy
|
|
@@ -258,11 +288,12 @@ export abstract class SharedSegmentSequence<T extends ISegment>
|
|
|
258
288
|
namespace: "SharedSegmentSequence.MergeTreeClient",
|
|
259
289
|
}),
|
|
260
290
|
dataStoreRuntime.options,
|
|
291
|
+
getMinInFlightRefSeq,
|
|
261
292
|
);
|
|
262
293
|
|
|
263
294
|
this.client.prependListener("delta", (opArgs, deltaArgs) => {
|
|
264
295
|
const event = new SequenceDeltaEvent(opArgs, deltaArgs, this.client);
|
|
265
|
-
if (
|
|
296
|
+
if (event.isLocal) {
|
|
266
297
|
this.submitSequenceMessage(opArgs.op);
|
|
267
298
|
}
|
|
268
299
|
this.emit("sequenceDelta", event, this);
|
|
@@ -272,10 +303,17 @@ export abstract class SharedSegmentSequence<T extends ISegment>
|
|
|
272
303
|
this.emit("maintenance", new SequenceMaintenanceEvent(opArgs, args, this.client), this);
|
|
273
304
|
});
|
|
274
305
|
|
|
275
|
-
this.intervalCollections = new
|
|
306
|
+
this.intervalCollections = new IntervalCollectionMap(
|
|
276
307
|
this.serializer,
|
|
277
308
|
this.handle,
|
|
278
|
-
(op, localOpMetadata) =>
|
|
309
|
+
(op, localOpMetadata) => {
|
|
310
|
+
if (!this.isAttached()) {
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
this.inFlightRefSeqs.push(this.currentRefSeq);
|
|
315
|
+
this.submitLocalMessage(op, localOpMetadata);
|
|
316
|
+
},
|
|
279
317
|
new SequenceIntervalCollectionValueType(),
|
|
280
318
|
dataStoreRuntime.options,
|
|
281
319
|
);
|
|
@@ -385,6 +423,11 @@ export abstract class SharedSegmentSequence<T extends ISegment>
|
|
|
385
423
|
|
|
386
424
|
/**
|
|
387
425
|
* Resolves a `ReferencePosition` into a character position using this client's perspective.
|
|
426
|
+
*
|
|
427
|
+
* Reference positions that point to a character that has been removed will
|
|
428
|
+
* always return the position of the nearest non-removed character, regardless
|
|
429
|
+
* of `ReferenceType`. To handle this case specifically, one may wish
|
|
430
|
+
* to look at the segment returned by `ReferencePosition.getSegment`.
|
|
388
431
|
*/
|
|
389
432
|
public localReferencePositionToPosition(lref: ReferencePosition): number {
|
|
390
433
|
return this.client.localReferencePositionToPosition(lref);
|
|
@@ -427,7 +470,9 @@ export abstract class SharedSegmentSequence<T extends ISegment>
|
|
|
427
470
|
if (!this.isAttached()) {
|
|
428
471
|
return;
|
|
429
472
|
}
|
|
430
|
-
|
|
473
|
+
|
|
474
|
+
this.inFlightRefSeqs.push(this.currentRefSeq);
|
|
475
|
+
|
|
431
476
|
const metadata = this.client.peekPendingSegmentGroups(
|
|
432
477
|
message.type === MergeTreeDeltaType.GROUP ? message.ops.length : 1,
|
|
433
478
|
);
|
|
@@ -436,9 +481,9 @@ export abstract class SharedSegmentSequence<T extends ISegment>
|
|
|
436
481
|
// local ops until loading is complete, and then
|
|
437
482
|
// they will be present
|
|
438
483
|
if (!this.loadedDeferred.isCompleted) {
|
|
439
|
-
this.loadedDeferredOutgoingOps.push(metadata ? [
|
|
484
|
+
this.loadedDeferredOutgoingOps.push(metadata ? [message, metadata] : (message as any));
|
|
440
485
|
} else {
|
|
441
|
-
this.submitLocalMessage(
|
|
486
|
+
this.submitLocalMessage(message, metadata);
|
|
442
487
|
}
|
|
443
488
|
}
|
|
444
489
|
|
|
@@ -571,11 +616,12 @@ export abstract class SharedSegmentSequence<T extends ISegment>
|
|
|
571
616
|
const insertIndex: number = Math.max(start, end);
|
|
572
617
|
|
|
573
618
|
// Insert first, so local references can slide to the inserted seg if any
|
|
574
|
-
const insert = this.
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
619
|
+
const insert = this.guardReentrancy(() =>
|
|
620
|
+
this.client.insertSegmentLocal(insertIndex, segment),
|
|
621
|
+
);
|
|
622
|
+
|
|
623
|
+
if (insert && start < end) {
|
|
624
|
+
this.removeRange(start, end);
|
|
579
625
|
}
|
|
580
626
|
}
|
|
581
627
|
|
|
@@ -596,19 +642,26 @@ export abstract class SharedSegmentSequence<T extends ISegment>
|
|
|
596
642
|
* {@inheritDoc @fluidframework/shared-object-base#SharedObject.reSubmitCore}
|
|
597
643
|
*/
|
|
598
644
|
protected reSubmitCore(content: any, localOpMetadata: unknown) {
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
) {
|
|
605
|
-
|
|
606
|
-
this.
|
|
607
|
-
content
|
|
608
|
-
localOpMetadata as
|
|
609
|
-
)
|
|
610
|
-
)
|
|
611
|
-
|
|
645
|
+
const originalRefSeq = this.inFlightRefSeqs.shift();
|
|
646
|
+
assert(
|
|
647
|
+
originalRefSeq !== undefined,
|
|
648
|
+
0x8bb /* Expected a recorded refSeq when resubmitting an op */,
|
|
649
|
+
);
|
|
650
|
+
this.useResubmitRefSeq(originalRefSeq, () => {
|
|
651
|
+
if (
|
|
652
|
+
!this.intervalCollections.tryResubmitMessage(
|
|
653
|
+
content,
|
|
654
|
+
localOpMetadata as IMapMessageLocalMetadata,
|
|
655
|
+
)
|
|
656
|
+
) {
|
|
657
|
+
this.submitSequenceMessage(
|
|
658
|
+
this.client.regeneratePendingOp(
|
|
659
|
+
content as IMergeTreeOp,
|
|
660
|
+
localOpMetadata as SegmentGroup | SegmentGroup[],
|
|
661
|
+
),
|
|
662
|
+
);
|
|
663
|
+
}
|
|
664
|
+
});
|
|
612
665
|
}
|
|
613
666
|
|
|
614
667
|
/**
|
|
@@ -665,7 +718,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
|
|
|
665
718
|
.catch((error) => {
|
|
666
719
|
this.loadFinished(error);
|
|
667
720
|
});
|
|
668
|
-
if (this.dataStoreRuntime.options
|
|
721
|
+
if (this.dataStoreRuntime.options.sequenceInitializeFromHeaderOnly !== true) {
|
|
669
722
|
// if we not doing partial load, await the catch up ops,
|
|
670
723
|
// and the finalization of the load
|
|
671
724
|
await loadCatchUpOps;
|
|
@@ -683,6 +736,18 @@ export abstract class SharedSegmentSequence<T extends ISegment>
|
|
|
683
736
|
local: boolean,
|
|
684
737
|
localOpMetadata: unknown,
|
|
685
738
|
) {
|
|
739
|
+
if (local) {
|
|
740
|
+
const recordedRefSeq = this.inFlightRefSeqs.shift();
|
|
741
|
+
assert(recordedRefSeq !== undefined, 0x8bc /* No pending recorded refSeq found */);
|
|
742
|
+
// TODO: AB#7076: Some equivalent assert should be enabled. This fails some e2e stashed op tests because
|
|
743
|
+
// the deltaManager may have seen more messages than the runtime has processed while amidst the stashed op
|
|
744
|
+
// flow, so e.g. when `applyStashedOp` is called and the DDS is put in a state where it expects an ack for
|
|
745
|
+
// one of its messages, the delta manager has actually already seen subsequent messages from collaborators
|
|
746
|
+
// which the in-flight message is concurrent to.
|
|
747
|
+
// See "handles stashed ops created on top of sequenced local ops" for one such test case.
|
|
748
|
+
// assert(recordedRefSeq <= message.referenceSequenceNumber, "RefSeq mismatch");
|
|
749
|
+
}
|
|
750
|
+
|
|
686
751
|
// if loading isn't complete, we need to cache all
|
|
687
752
|
// incoming ops to be applied after loading is complete
|
|
688
753
|
if (this.deferIncomingOps) {
|
|
@@ -729,13 +794,10 @@ export abstract class SharedSegmentSequence<T extends ISegment>
|
|
|
729
794
|
/**
|
|
730
795
|
* {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}
|
|
731
796
|
*/
|
|
732
|
-
protected applyStashedOp(content: any):
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
this.client.applyStashedOp(parsedContent);
|
|
737
|
-
assert(!!metadata, 0x87d /* Metadata is undefined */);
|
|
738
|
-
return metadata;
|
|
797
|
+
protected applyStashedOp(content: any): void {
|
|
798
|
+
if (!this.intervalCollections.tryApplyStashedOp(content)) {
|
|
799
|
+
this.client.applyStashedOp(content);
|
|
800
|
+
}
|
|
739
801
|
}
|
|
740
802
|
|
|
741
803
|
private summarizeMergeTree(serializer: IFluidSerializer): ISummaryTreeWithStats {
|
|
@@ -760,16 +822,18 @@ export abstract class SharedSegmentSequence<T extends ISegment>
|
|
|
760
822
|
);
|
|
761
823
|
}
|
|
762
824
|
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
825
|
+
/**
|
|
826
|
+
*
|
|
827
|
+
* @param message - Message with decoded and hydrated handles
|
|
828
|
+
*/
|
|
829
|
+
private processMergeTreeMsg(message: ISequencedDocumentMessage, local?: boolean) {
|
|
766
830
|
const ops: IMergeTreeDeltaOp[] = [];
|
|
767
831
|
function transformOps(event: SequenceDeltaEvent) {
|
|
768
832
|
ops.push(...SharedSegmentSequence.createOpsFromDelta(event));
|
|
769
833
|
}
|
|
770
834
|
const needsTransformation = message.referenceSequenceNumber !== message.sequenceNumber - 1;
|
|
771
835
|
let stashMessage: Readonly<ISequencedDocumentMessage> = message;
|
|
772
|
-
if (this.runtime.options
|
|
836
|
+
if (this.runtime.options.newMergeTreeSnapshotFormat !== true) {
|
|
773
837
|
if (needsTransformation) {
|
|
774
838
|
this.on("sequenceDelta", transformOps);
|
|
775
839
|
}
|
|
@@ -777,7 +841,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
|
|
|
777
841
|
|
|
778
842
|
this.client.applyMsg(message, local);
|
|
779
843
|
|
|
780
|
-
if (this.runtime.options
|
|
844
|
+
if (this.runtime.options.newMergeTreeSnapshotFormat !== true) {
|
|
781
845
|
if (needsTransformation) {
|
|
782
846
|
this.removeListener("sequenceDelta", transformOps);
|
|
783
847
|
// shallow clone the message as we only overwrite top level properties,
|
|
@@ -866,6 +930,20 @@ export abstract class SharedSegmentSequence<T extends ISegment>
|
|
|
866
930
|
intervalCollection.attachGraph(this.client, key);
|
|
867
931
|
}
|
|
868
932
|
}
|
|
933
|
+
|
|
934
|
+
/**
|
|
935
|
+
* Overrides the "currently applicable reference sequence number" for the duration of the callback.
|
|
936
|
+
* See remarks on `currentRefSeq` for more context.
|
|
937
|
+
*/
|
|
938
|
+
private useResubmitRefSeq(refSeq: number, callback: () => void) {
|
|
939
|
+
const previousResubmitRefSeq = this.ongoingResubmitRefSeq;
|
|
940
|
+
this.ongoingResubmitRefSeq = refSeq;
|
|
941
|
+
try {
|
|
942
|
+
callback();
|
|
943
|
+
} finally {
|
|
944
|
+
this.ongoingResubmitRefSeq = previousResubmitRefSeq;
|
|
945
|
+
}
|
|
946
|
+
}
|
|
869
947
|
}
|
|
870
948
|
|
|
871
949
|
function createReentrancyDetector(
|
package/src/sequenceFactory.ts
CHANGED
|
@@ -10,8 +10,8 @@ import {
|
|
|
10
10
|
IChannelFactory,
|
|
11
11
|
} from "@fluidframework/datastore-definitions";
|
|
12
12
|
import { Marker, TextSegment } from "@fluidframework/merge-tree";
|
|
13
|
-
import { pkgVersion } from "./packageVersion";
|
|
14
|
-
import { SharedString, SharedStringSegment } from "./sharedString";
|
|
13
|
+
import { pkgVersion } from "./packageVersion.js";
|
|
14
|
+
import { SharedString, SharedStringSegment } from "./sharedString.js";
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* @alpha
|
|
@@ -63,6 +63,9 @@ export class SharedStringFactory implements IChannelFactory {
|
|
|
63
63
|
return sharedString;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
+
/**
|
|
67
|
+
* {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.create}
|
|
68
|
+
*/
|
|
66
69
|
public create(document: IFluidDataStoreRuntime, id: string): SharedString {
|
|
67
70
|
const sharedString = new SharedString(document, id, this.attributes);
|
|
68
71
|
sharedString.initializeLocal();
|