@fluidframework/sequence 2.0.0-dev.5.3.2.178189 → 2.0.0-dev.6.4.0.191457
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 +114 -0
- package/README.md +4 -3
- package/dist/defaultMap.d.ts +1 -1
- package/dist/defaultMap.d.ts.map +1 -1
- package/dist/defaultMap.js +9 -10
- package/dist/defaultMap.js.map +1 -1
- package/dist/defaultMapInterfaces.d.ts +1 -1
- package/dist/defaultMapInterfaces.d.ts.map +1 -1
- package/dist/defaultMapInterfaces.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -9
- package/dist/index.js.map +1 -1
- package/dist/intervalCollection.d.ts +11 -424
- package/dist/intervalCollection.d.ts.map +1 -1
- package/dist/intervalCollection.js +74 -815
- package/dist/intervalCollection.js.map +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.d.ts +20 -0
- package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -0
- package/dist/intervalIndex/endpointInRangeIndex.js +60 -0
- package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -0
- package/dist/intervalIndex/endpointIndex.d.ts +21 -0
- package/dist/intervalIndex/endpointIndex.d.ts.map +1 -0
- package/dist/intervalIndex/endpointIndex.js +42 -0
- package/dist/intervalIndex/endpointIndex.js.map +1 -0
- package/dist/intervalIndex/idIntervalIndex.d.ts +12 -0
- package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -0
- package/dist/intervalIndex/idIntervalIndex.js +41 -0
- package/dist/intervalIndex/idIntervalIndex.js.map +1 -0
- package/dist/intervalIndex/index.d.ts +5 -0
- package/dist/intervalIndex/index.d.ts.map +1 -1
- package/dist/intervalIndex/index.js +9 -1
- package/dist/intervalIndex/index.js.map +1 -1
- package/dist/intervalIndex/intervalIndex.d.ts +29 -0
- package/dist/intervalIndex/intervalIndex.d.ts.map +1 -0
- package/dist/intervalIndex/intervalIndex.js +7 -0
- package/dist/intervalIndex/intervalIndex.js.map +1 -0
- package/dist/intervalIndex/intervalIndexUtils.d.ts +17 -0
- package/dist/intervalIndex/intervalIndexUtils.d.ts.map +1 -0
- package/dist/intervalIndex/intervalIndexUtils.js +22 -0
- package/dist/intervalIndex/intervalIndexUtils.js.map +1 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +2 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.js +3 -3
- package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +5 -5
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.d.ts +20 -0
- package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -0
- package/dist/intervalIndex/startpointInRangeIndex.js +62 -0
- package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -0
- package/dist/intervalTree.d.ts +2 -56
- package/dist/intervalTree.d.ts.map +1 -1
- package/dist/intervalTree.js +2 -11
- package/dist/intervalTree.js.map +1 -1
- package/dist/intervals/index.d.ts +8 -0
- package/dist/intervals/index.d.ts.map +1 -0
- package/dist/intervals/index.js +23 -0
- package/dist/intervals/index.js.map +1 -0
- package/dist/intervals/interval.d.ts +88 -0
- package/dist/intervals/interval.d.ts.map +1 -0
- package/dist/intervals/interval.js +180 -0
- package/dist/intervals/interval.js.map +1 -0
- package/dist/intervals/intervalUtils.d.ts +200 -0
- package/dist/intervals/intervalUtils.d.ts.map +1 -0
- package/dist/intervals/intervalUtils.js +79 -0
- package/dist/intervals/intervalUtils.js.map +1 -0
- package/dist/intervals/sequenceInterval.d.ts +132 -0
- package/dist/intervals/sequenceInterval.d.ts.map +1 -0
- package/dist/intervals/sequenceInterval.js +313 -0
- package/dist/intervals/sequenceInterval.js.map +1 -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 +1 -1
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +45 -52
- package/dist/revertibles.js.map +1 -1
- package/dist/sequence.d.ts +33 -4
- package/dist/sequence.d.ts.map +1 -1
- package/dist/sequence.js +91 -47
- package/dist/sequence.js.map +1 -1
- package/dist/sequenceDeltaEvent.d.ts +8 -3
- package/dist/sequenceDeltaEvent.d.ts.map +1 -1
- package/dist/sequenceDeltaEvent.js +3 -4
- package/dist/sequenceDeltaEvent.js.map +1 -1
- package/dist/sharedIntervalCollection.d.ts +2 -1
- package/dist/sharedIntervalCollection.d.ts.map +1 -1
- package/dist/sharedIntervalCollection.js +2 -2
- package/dist/sharedIntervalCollection.js.map +1 -1
- package/dist/sharedSequence.d.ts +9 -0
- package/dist/sharedSequence.d.ts.map +1 -1
- package/dist/sharedSequence.js +9 -6
- package/dist/sharedSequence.js.map +1 -1
- package/dist/sharedString.d.ts.map +1 -1
- package/dist/sharedString.js +9 -29
- package/dist/sharedString.js.map +1 -1
- package/lib/defaultMap.d.ts +1 -1
- package/lib/defaultMap.d.ts.map +1 -1
- package/lib/defaultMap.js +5 -6
- package/lib/defaultMap.js.map +1 -1
- package/lib/defaultMapInterfaces.d.ts +1 -1
- package/lib/defaultMapInterfaces.d.ts.map +1 -1
- package/lib/defaultMapInterfaces.js.map +1 -1
- package/lib/index.d.ts +3 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -2
- package/lib/index.js.map +1 -1
- package/lib/intervalCollection.d.ts +11 -424
- package/lib/intervalCollection.d.ts.map +1 -1
- package/lib/intervalCollection.js +43 -776
- package/lib/intervalCollection.js.map +1 -1
- package/lib/intervalIndex/endpointInRangeIndex.d.ts +20 -0
- package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -0
- package/lib/intervalIndex/endpointInRangeIndex.js +56 -0
- package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -0
- package/lib/intervalIndex/endpointIndex.d.ts +21 -0
- package/lib/intervalIndex/endpointIndex.d.ts.map +1 -0
- package/lib/intervalIndex/endpointIndex.js +38 -0
- package/lib/intervalIndex/endpointIndex.js.map +1 -0
- package/lib/intervalIndex/idIntervalIndex.d.ts +12 -0
- package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -0
- package/lib/intervalIndex/idIntervalIndex.js +37 -0
- package/lib/intervalIndex/idIntervalIndex.js.map +1 -0
- package/lib/intervalIndex/index.d.ts +5 -0
- package/lib/intervalIndex/index.d.ts.map +1 -1
- package/lib/intervalIndex/index.js +4 -0
- package/lib/intervalIndex/index.js.map +1 -1
- package/lib/intervalIndex/intervalIndex.d.ts +29 -0
- package/lib/intervalIndex/intervalIndex.d.ts.map +1 -0
- package/lib/intervalIndex/intervalIndex.js +6 -0
- package/lib/intervalIndex/intervalIndex.js.map +1 -0
- package/lib/intervalIndex/intervalIndexUtils.d.ts +17 -0
- package/lib/intervalIndex/intervalIndexUtils.d.ts.map +1 -0
- package/lib/intervalIndex/intervalIndexUtils.js +18 -0
- package/lib/intervalIndex/intervalIndexUtils.js.map +1 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +2 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.js +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
- package/lib/intervalIndex/startpointInRangeIndex.d.ts +20 -0
- package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -0
- package/lib/intervalIndex/startpointInRangeIndex.js +58 -0
- package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -0
- package/lib/intervalTree.d.ts +2 -56
- package/lib/intervalTree.d.ts.map +1 -1
- package/lib/intervalTree.js +2 -11
- package/lib/intervalTree.js.map +1 -1
- package/lib/intervals/index.d.ts +8 -0
- package/lib/intervals/index.d.ts.map +1 -0
- package/lib/intervals/index.js +8 -0
- package/lib/intervals/index.js.map +1 -0
- package/lib/intervals/interval.d.ts +88 -0
- package/lib/intervals/interval.d.ts.map +1 -0
- package/lib/intervals/interval.js +175 -0
- package/lib/intervals/interval.js.map +1 -0
- package/lib/intervals/intervalUtils.d.ts +200 -0
- package/lib/intervals/intervalUtils.d.ts.map +1 -0
- package/lib/intervals/intervalUtils.js +74 -0
- package/lib/intervals/intervalUtils.js.map +1 -0
- package/lib/intervals/sequenceInterval.d.ts +132 -0
- package/lib/intervals/sequenceInterval.d.ts.map +1 -0
- package/lib/intervals/sequenceInterval.js +305 -0
- package/lib/intervals/sequenceInterval.js.map +1 -0
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/revertibles.d.ts +1 -1
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +28 -35
- package/lib/revertibles.js.map +1 -1
- package/lib/sequence.d.ts +33 -4
- package/lib/sequence.d.ts.map +1 -1
- package/lib/sequence.js +86 -41
- package/lib/sequence.js.map +1 -1
- package/lib/sequenceDeltaEvent.d.ts +8 -3
- package/lib/sequenceDeltaEvent.d.ts.map +1 -1
- package/lib/sequenceDeltaEvent.js +2 -3
- package/lib/sequenceDeltaEvent.js.map +1 -1
- package/lib/sharedIntervalCollection.d.ts +2 -1
- package/lib/sharedIntervalCollection.d.ts.map +1 -1
- package/lib/sharedIntervalCollection.js +1 -1
- package/lib/sharedIntervalCollection.js.map +1 -1
- package/lib/sharedSequence.d.ts +9 -0
- package/lib/sharedSequence.d.ts.map +1 -1
- package/lib/sharedSequence.js +8 -5
- package/lib/sharedSequence.js.map +1 -1
- package/lib/sharedString.d.ts.map +1 -1
- package/lib/sharedString.js +9 -29
- package/lib/sharedString.js.map +1 -1
- package/package.json +29 -32
- package/src/defaultMap.ts +2 -1
- package/src/defaultMapInterfaces.ts +1 -1
- package/src/index.ts +18 -12
- package/src/intervalCollection.ts +42 -1225
- package/src/intervalIndex/endpointInRangeIndex.ts +104 -0
- package/src/intervalIndex/endpointIndex.ts +78 -0
- package/src/intervalIndex/idIntervalIndex.ts +58 -0
- package/src/intervalIndex/index.ts +5 -0
- package/src/intervalIndex/intervalIndex.ts +31 -0
- package/src/intervalIndex/intervalIndexUtils.ts +27 -0
- package/src/intervalIndex/overlappingIntervalsIndex.ts +2 -6
- package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +1 -1
- package/src/intervalIndex/sequenceIntervalIndexes.ts +1 -1
- package/src/intervalIndex/startpointInRangeIndex.ts +109 -0
- package/src/intervalTree.ts +3 -75
- package/src/intervals/index.ts +25 -0
- package/src/intervals/interval.ts +230 -0
- package/src/intervals/intervalUtils.ts +256 -0
- package/src/intervals/sequenceInterval.ts +494 -0
- package/src/packageVersion.ts +1 -1
- package/src/revertibles.ts +24 -13
- package/src/sequence.ts +100 -35
- package/src/sequenceDeltaEvent.ts +12 -4
- package/src/sharedIntervalCollection.ts +2 -3
- package/src/sharedSequence.ts +11 -5
- package/src/sharedString.ts +8 -25
package/dist/revertibles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revertibles.js","sourceRoot":"","sources":["../src/revertibles.ts"],"names":[],"mappings":";AAAA;;;GAGG;AACH,+BAA+B;;;;;;;;;;;;;;AAE/B,+DAAuE;AACvE,2DAcoC;AACpC,6DAAwE;AAcxE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;AAqDxC,SAAS,wBAAwB,CAAC,QAA0B;IAC3D,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;IACzC,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,YAAY,CAAC,UAAkB;;IACvC,OAAO,MAAA,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,mCAAI,UAAU,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,SAAgB,8BAA8B,CAC7C,QAA0B,EAC1B,WAAqC;IAErC,WAAW,CAAC,IAAI,CAAC;QAChB,KAAK,EAAE,mCAAc,CAAC,GAAG;QACzB,QAAQ;KACR,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC;AACpB,CAAC;AAVD,wEAUC;AAED;;;GAGG;AACH,SAAgB,iCAAiC,CAChD,MAAoB,EACpB,QAA0B,EAC1B,WAAqC;IAErC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAyB,CAAC;IACpE,MAAM,SAAS,GACd,QAAQ,CAAC,UAAU,KAAK,SAAS;QAChC,CAAC,CAAC,0BAAa,CAAC,aAAa,GAAG,0BAAa,CAAC,UAAU;QACxD,CAAC,CAAC,0BAAa,CAAC,YAAY,GAAG,0BAAa,CAAC,UAAU,CAAC;IAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAyB,CAAC;IAChE,MAAM,OAAO,GACZ,MAAM,CAAC,UAAU,KAAK,SAAS;QAC9B,CAAC,CAAC,0BAAa,CAAC,aAAa,GAAG,0BAAa,CAAC,QAAQ;QACtD,CAAC,CAAC,0BAAa,CAAC,YAAY,GAAG,0BAAa,CAAC,QAAQ,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,4BAA4B,CACnD,QAAQ,EACR,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,EAC1B,SAAS,EACT,SAAS,EACT,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAChC,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,4BAA4B,CACjD,MAAM,EACN,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,EACxB,OAAO,EACP,SAAS,EACT,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAC9B,CAAC;IACF,MAAM,UAAU,GAAG;QAClB,KAAK,EAAE,mCAAc,CAAC,MAAM;QAC5B,QAAQ;QACR,KAAK,EAAE,QAAQ;QACf,GAAG,EAAE,MAAM;KACX,CAAC;IACF,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAC/C,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAC7C,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE7B,OAAO,WAAW,CAAC;AACpB,CAAC;AAxCD,8EAwCC;AAED;;;GAGG;AACH,SAAgB,iCAAiC,CAChD,MAAoB,EACpB,WAA6B,EAC7B,gBAAkC,EAClC,WAAqC;IAErC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,UAAU,EAAyB,CAAC;IAC5E,6EAA6E;IAC7E,kFAAkF;IAClF,iFAAiF;IACjF,MAAM,SAAS,GACd,QAAQ,CAAC,UAAU,KAAK,SAAS;QAChC,CAAC,CAAC,0BAAa,CAAC,aAAa,GAAG,0BAAa,CAAC,UAAU;QACxD,CAAC,CAAC,0BAAa,CAAC,YAAY,GAAG,0BAAa,CAAC,UAAU,CAAC;IAC1D,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAyB,CAAC;IACxE,MAAM,OAAO,GACZ,MAAM,CAAC,UAAU,KAAK,SAAS;QAC9B,CAAC,CAAC,0BAAa,CAAC,aAAa,GAAG,0BAAa,CAAC,QAAQ;QACtD,CAAC,CAAC,0BAAa,CAAC,YAAY,GAAG,0BAAa,CAAC,QAAQ,CAAC;IACxD,MAAM,YAAY,GAAG,MAAM,CAAC,4BAA4B,CACvD,QAAQ,EACR,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,EAClC,SAAS,EACT,SAAS,EACT,gBAAgB,CAAC,KAAK,CAAC,iBAAiB,CACxC,CAAC;IACF,MAAM,UAAU,GAAG,MAAM,CAAC,4BAA4B,CACrD,MAAM,EACN,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,EAChC,OAAO,EACP,SAAS,EACT,gBAAgB,CAAC,GAAG,CAAC,iBAAiB,CACtC,CAAC;IACF,MAAM,UAAU,GAAG;QAClB,KAAK,EAAE,mCAAc,CAAC,MAAM;QAC5B,QAAQ,EAAE,WAAW;QACrB,KAAK,EAAE,YAAY;QACnB,GAAG,EAAE,UAAU;KACf,CAAC;IACF,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAC/C,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAC7C,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE7B,OAAO,WAAW,CAAC;AACpB,CAAC;AA5CD,8EA4CC;AAED;;;GAGG;AACH,SAAgB,0CAA0C,CACzD,QAA0B,EAC1B,MAAmB,EACnB,WAAqC;IAErC,WAAW,CAAC,IAAI,CAAC;QAChB,KAAK,EAAE,mCAAc,CAAC,gBAAgB;QACtC,QAAQ;QACR,cAAc,EAAE,MAAM;KACtB,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC;AACpB,CAAC;AAZD,gGAYC;AAED,SAAS,qBAAqB,CAC7B,GAA2B,EAC3B,cAAsB,EACtB,cAAgE,EAChE,YAA8D;;IAE9D,IAAI,IAAA,gCAAmB,EAAC,GAAG,CAAC,OAAO,EAAE,0BAAa,CAAC,UAAU,CAAC,EAAE;QAC/D,MAAM,QAAQ,GAAG,MAAA,GAAG,CAAC,UAAU,0CAAE,QAAQ,CAAC;QAC1C,IAAI,QAAQ,IAAI,QAAQ,YAAY,qCAAgB,EAAE;YACrD,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YACvF,OAAO,IAAI,CAAC;SACZ;KACD;SAAM,IAAI,IAAA,gCAAmB,EAAC,GAAG,CAAC,OAAO,EAAE,0BAAa,CAAC,QAAQ,CAAC,EAAE;QACpE,MAAM,QAAQ,GAAG,MAAA,GAAG,CAAC,UAAU,0CAAE,QAAQ,CAAC;QAC1C,IAAI,QAAQ,IAAI,QAAQ,YAAY,qCAAgB,EAAE;YACrD,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YACnF,OAAO,IAAI,CAAC;SACZ;KACD;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CAC1B,GAA2B,EAC3B,cAAsB,EACtB,cAIG;;IAEH,MAAM,UAAU,GAAG,MAAA,GAAG,CAAC,UAAU,0CAAE,UAAU,CAAC;IAC9C,IAAI,UAAU,EAAE;QACf,cAAc,CAAC,IAAI,CAAC;YACnB,UAAU;YACV,MAAM,EAAE,cAAc,GAAG,GAAG,CAAC,SAAS,EAAE;YACxC,OAAO,EAAE,IAAA,gCAAmB,EAAC,GAAG,CAAC,OAAO,EAAE,0BAAa,CAAC,UAAU,CAAC;SACnE,CAAC,CAAC;KACH;AACF,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,oCAAoC,CACnD,MAAoB,EACpB,KAAyB,EACzB,WAAqC;IAErC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;QAC9B,OAAO;KACP;IACD,IAAI,KAAK,CAAC,cAAc,KAAK,+BAAkB,CAAC,MAAM,EAAE;QACvD,MAAM,cAAc,GAAqD,EAAE,CAAC;QAC5E,MAAM,YAAY,GAAqD,EAAE,CAAC;QAC1E,MAAM,cAAc,GAId,EAAE,CAAC;QACT,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,0CAA0C;QAC1C,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,MAAM,EAAE;YACtC,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC;YAC1C,IAAI,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,QAAQ,KAAK,CAAC,CAAC,EAAE;gBACrD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;oBACvB,qBAAqB,CAAC,GAAG,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;oBACzE,kBAAkB,CAAC,GAAG,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;iBACxD;aACD;YACD,cAAc,IAAI,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC;SAClD;QAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;YACtF,MAAM,iBAAiB,GAA+B,EAAE,CAAC;YACzD,IAAA,8CAAiC,EAAC,KAAK,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;YACtE,IAAA,qBAAM,EACL,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAC9B,KAAK,CAAC,gDAAgD,CACtD,CAAC;YAEF,MAAM,UAAU,GAA2D;gBAC1E,KAAK,EAAE,mCAAc,CAAC,eAAe;gBACrC,SAAS,EAAE,EAAE;gBACb,cAAc;gBACd,mBAAmB,EAAE,iBAAiB,CAAC,CAAC,CAAC;aACzC,CAAC;YAEF,wFAAwF;YACxF,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;gBAC/C,+CAA+C;gBAC/C,MAAM,gBAAgB,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;oBACvD,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC;gBAClC,CAAC,CAAC,CAAC;gBACH,IAAI,SAA6B,CAAC;gBAClC,IAAI,gBAAgB,KAAK,CAAC,CAAC,EAAE;oBAC5B,SAAS,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC;oBAClD,YAAY,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;iBACzC;gBAED,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC;oBACzB,UAAU,EAAE,QAAQ,CAAC,aAAa,EAAE;oBACpC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC;oBAClD,WAAW,EAAE,MAAM;oBACnB,SAAS;iBACT,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,0EAA0E;YAC1E,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;gBAC7C,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC;oBACzB,UAAU,EAAE,QAAQ,CAAC,aAAa,EAAE;oBACpC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC;oBAClD,SAAS,EAAE,MAAM;iBACjB,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7B,OAAO;SACP;KACD;IAED,yFAAyF;IACzF,MAAM,oBAAoB,GAA+B,EAAE,CAAC;IAC5D,uDAAuD;IACvD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,IAAA,uCAA0B,EAAC,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE;QAC9F,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAA8B,CAAC,CAAC;KACzE;IACD,IAAA,8CAAiC,EAAC,KAAK,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACzE,WAAW,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,CAAC;AAC3C,CAAC;AAvFD,oFAuFC;AAED;;;GAGG;AACH,SAAgB,8BAA8B,CAC7C,YAA0B,EAC1B,WAAqC;IAErC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACzB,IAAI,IAAA,uCAA0B,EAAC,CAAC,CAAC,EAAE;YAClC,IAAA,4CAA+B,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACrC;aAAM,IAAI,CAAC,CAAC,KAAK,KAAK,mCAAc,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,KAAK,mCAAc,CAAC,MAAM,EAAE;YAClF,YAAY,CAAC,4BAA4B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACnD,YAAY,CAAC,4BAA4B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SACjD;IACF,CAAC,CAAC,CAAC;AACJ,CAAC;AAZD,wEAYC;AAED,SAAS,gBAAgB,CAAC,MAAoB,EAAE,IAA4B,EAAE,GAAW;IACxF,MAAM,KAAK,GAAG,IAAA,6BAAgB,EAC7B,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EACjD,IAAI,CAAC,iBAAiB,CACtB,CAAC;IACF,OAAO,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,MAAK,SAAS;QAClC,KAAK,CAAC,MAAM,KAAK,SAAS;QAC1B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACtC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM;QAClD,CAAC,CAAC,GAAG,CAAC;AACR,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,GAAW,EAAE,MAAoB;IACrE,OAAO,CACN,KAAK,IAAI,CAAC;QACV,KAAK,GAAG,MAAM,CAAC,SAAS,EAAE;QAC1B,GAAG,IAAI,CAAC;QACR,GAAG,GAAG,MAAM,CAAC,SAAS,EAAE;QACxB,KAAK,IAAI,GAAG,CACZ,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACtB,MAAoB,EACpB,UAAsD;IAEtD,MAAM,EAAE,GAAG,wBAAwB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,iBAAiB,CACzB,MAAoB,EACpB,UAAyD;IAEzD,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,MAAM,CAAC,gCAAgC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACxE,MAAM,GAAG,GAAG,MAAM,CAAC,gCAAgC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;IAC9C,8FAA8F;IAC9F,MAAM,KAA2B,UAAU,CAAC,QAAQ,CAAC,UAAU,EAAzD,EAAE,UAAU,OAA6C,EAAxC,KAAK,cAAtB,cAAwB,CAAiC,CAAC;IAChE,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,WAAW,EAAE,MAAM,CAAC;QAAE,OAAO;IAC9D,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAEpE,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC9B,IAAI,UAAU,KAAK,KAAK,EAAE;YACzB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC;SAChD;IACF,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;IAE3C,MAAM,CAAC,4BAA4B,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,4BAA4B,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,iBAAiB,CACzB,MAAoB,EACpB,UAAyD;IAEzD,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,EAAE,GAAG,wBAAwB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,MAAM,CAAC,gCAAgC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACxE,MAAM,GAAG,GAAG,MAAM,CAAC,gCAAgC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAClE,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,WAAW,EAAE,MAAM,CAAC;QAAE,OAAO;IAC9D,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IAElD,MAAM,CAAC,4BAA4B,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,4BAA4B,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,0BAA0B,CAClC,MAAoB,EACpB,UAAmE;IAEnE,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,EAAE,GAAG,wBAAwB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,CAAC;IAC3C,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,WAAW,CAAC,MAA0B,EAAE,cAA8B;IAC9E,IAAI,MAAM,KAAK,SAAS,EAAE;QACzB,OAAO,SAAS,CAAC;KACjB;IAED,IAAI,iBAAiB,GAAG,MAAM,CAAC;IAC/B,KAAK,MAAM,SAAS,IAAI,cAAc,CAAC,KAAK,EAAE;QAC7C,IAAI,iBAAiB,GAAG,SAAS,CAAC,MAAM,EAAE;YACzC,oCAAoC;YACpC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,MAAM,EAAE;gBACrC,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,GAAG,iBAAiB,EAAE;oBACnD,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;iBAC7D;gBACD,iBAAiB,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;aAChD;SACD;QACD,iBAAiB,IAAI,SAAS,CAAC,MAAM,CAAC;KACtC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,mBAAmB,CAC3B,MAA0B,EAC1B,cAA8B,EAC9B,YAA0B;IAE1B,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAChD,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;AAC3F,CAAC;AAOD,MAAM,cAAe,SAAQ,sBAA4B;IAC9C,MAAM,CAAC,IAAe;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACvC,CAAC;CACD;AAED,SAAS,yBAAyB,CACjC,YAA0B,EAC1B,UAAkE;IAElE,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAC5C,MAAM,YAAY,GAAG,CAAC,KAAyB,EAAE,EAAE;QAClD,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YAC5B,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC9B,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;YACtC,CAAC,CAAC,CAAC;YACH,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;SAC7D;IACF,CAAC,CAAC;IACF,YAAY,CAAC,EAAE,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IAC/C,IAAA,4CAA+B,EAAC,YAAY,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAChF,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IAEhD,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;QAC7C,MAAM,kBAAkB,GAAG,YAAY,CAAC,qBAAqB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAClF,MAAM,UAAU,GAAG,YAAY,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAChE,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC3B,MAAM,QAAQ,GAAG,mBAAmB,CACnC,YAAY,CAAC,WAAW,EACxB,cAAc,EACd,YAAY,CACZ,CAAC;YACF,MAAM,MAAM,GAAG,mBAAmB,CACjC,YAAY,CAAC,SAAS,EACtB,cAAc,EACd,YAAY,CACZ,CAAC;YACF,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE;gBACnD,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;aACxD;SACD;IACF,CAAC,CAAC,CAAC;IAEH,oEAAoE;IACpE,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE;QACnD,IAAA,qBAAM,EACL,aAAa,CAAC,UAAU,CAAC,KAAK,KAAK,mCAAc,CAAC,MAAM;YACvD,aAAa,CAAC,UAAU,CAAC,KAAK,KAAK,mCAAc,CAAC,MAAM,EACzD,KAAK,CAAC,wCAAwC,CAC9C,CAAC;QACF,MAAM,GAAG,GAAG,WAAW,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC9D,IAAI,GAAG,KAAK,SAAS,EAAE;YACtB,IAAI,aAAa,CAAC,OAAO,EAAE;gBAC1B,YAAY,CAAC,4BAA4B,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAC1E,MAAM,MAAM,GAAG,YAAY,CAAC,4BAA4B,CACvD,GAAG,CAAC,OAA8B,EAClC,GAAG,CAAC,MAAM,EACV,0BAAa,CAAC,YAAY,GAAG,0BAAa,CAAC,UAAU,EACrD,EAAE,UAAU,EAAE,aAAa,CAAC,UAAU,EAAE,CACxC,CAAC;gBACF,aAAa,CAAC,UAAU,CAAC,KAAK,GAAG,MAAM,CAAC;aACxC;iBAAM;gBACN,YAAY,CAAC,4BAA4B,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACxE,MAAM,MAAM,GAAG,YAAY,CAAC,4BAA4B,CACvD,GAAG,CAAC,OAA8B,EAClC,GAAG,CAAC,MAAM,EACV,0BAAa,CAAC,YAAY,GAAG,0BAAa,CAAC,QAAQ,EACnD,EAAE,UAAU,EAAE,aAAa,CAAC,UAAU,EAAE,CACxC,CAAC;gBACF,aAAa,CAAC,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC;aACtC;SACD;IACF,CAAC,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,6BAA6B,CAC5C,YAA0B,EAC1B,WAAqC;IAErC,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;QAC9B,oEAAoE;QACpE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAG,CAAC;QAC7B,IAAI,OAAO,IAAI,CAAC,EAAE;YACjB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YACtB,QAAQ,KAAK,EAAE;gBACd,KAAK,mCAAc,CAAC,GAAG;oBACtB,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;oBAChC,MAAM;gBACP,KAAK,mCAAc,CAAC,MAAM;oBACzB,iBAAiB,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;oBACnC,MAAM;gBACP,KAAK,mCAAc,CAAC,MAAM;oBACzB,iBAAiB,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;oBACnC,MAAM;gBACP,KAAK,mCAAc,CAAC,gBAAgB;oBACnC,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;oBAC5C,MAAM;gBACP,KAAK,mCAAc,CAAC,eAAe;oBAClC,yBAAyB,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;oBAC3C,MAAM;gBACP;oBACC,IAAA,8BAAe,EAAC,KAAK,CAAC,CAAC;aACxB;SACD;aAAM;YACN,IAAA,4CAA+B,EAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SACnD;KACD;AACF,CAAC;AAhCD,sEAgCC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n/* eslint-disable no-bitwise */\n\nimport { assert, unreachableCase } from \"@fluidframework/common-utils\";\nimport {\n\tappendToMergeTreeDeltaRevertibles,\n\tdiscardMergeTreeDeltaRevertible,\n\tisMergeTreeDeltaRevertible,\n\tLocalReferencePosition,\n\tMergeTreeDeltaOperationType,\n\tMergeTreeDeltaRevertible,\n\tMergeTreeDeltaType,\n\tPropertySet,\n\tReferenceType,\n\trefTypeIncludesFlag,\n\trevertMergeTreeDeltaRevertibles,\n\tSortedSet,\n\tgetSlideToSegoff,\n} from \"@fluidframework/merge-tree\";\nimport { IntervalOpType, SequenceInterval } from \"./intervalCollection\";\nimport { SharedString, SharedStringSegment } from \"./sharedString\";\nimport { ISequenceDeltaRange, SequenceDeltaEvent } from \"./sequenceDeltaEvent\";\n\n/**\n * Data for undoing edits on SharedStrings and Intervals.\n *\n * Revertibles are new and require the option mergeTreeUseNewLengthCalculations to\n * be set as true on the underlying merge tree in order to function correctly.\n *\n * @alpha\n */\nexport type SharedStringRevertible = MergeTreeDeltaRevertible | IntervalRevertible;\n\nconst idMap = new Map<string, string>();\n\ntype IntervalOpType = typeof IntervalOpType[keyof typeof IntervalOpType];\n\n/**\n * Data for undoing edits affecting Intervals.\n *\n * Revertibles are new and require the option mergeTreeUseNewLengthCalculations to\n * be set as true on the underlying merge tree in order to function correctly.\n *\n * @alpha\n */\nexport type IntervalRevertible =\n\t| {\n\t\t\tevent: typeof IntervalOpType.CHANGE;\n\t\t\tinterval: SequenceInterval;\n\t\t\tstart: LocalReferencePosition;\n\t\t\tend: LocalReferencePosition;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.ADD;\n\t\t\tinterval: SequenceInterval;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.DELETE;\n\t\t\tinterval: SequenceInterval;\n\t\t\tstart: LocalReferencePosition;\n\t\t\tend: LocalReferencePosition;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.PROPERTY_CHANGED;\n\t\t\tinterval: SequenceInterval;\n\t\t\tpropertyDeltas: PropertySet;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.POSITION_REMOVE;\n\t\t\tintervals: {\n\t\t\t\tintervalId: string;\n\t\t\t\tlabel: string;\n\t\t\t\tstartOffset?: number; // interval start index within a removed range\n\t\t\t\tendOffset?: number; // interval end index within a removed range\n\t\t\t}[];\n\t\t\t// local refs used by IntervalOpType.CHANGE and DELETE revertibles\n\t\t\trevertibleRefs: {\n\t\t\t\trevertible: IntervalRevertible;\n\t\t\t\toffset: number;\n\t\t\t\tisStart: boolean;\n\t\t\t}[];\n\t\t\tmergeTreeRevertible: MergeTreeDeltaRevertible;\n\t };\n\ntype TypedRevertible<T extends IntervalRevertible[\"event\"]> = IntervalRevertible & { event: T };\n\nfunction getUpdatedIdFromInterval(interval: SequenceInterval): string {\n\tconst maybeId = interval.getIntervalId();\n\treturn getUpdatedId(maybeId);\n}\n\nfunction getUpdatedId(intervalId: string): string {\n\treturn idMap.get(intervalId) ?? intervalId;\n}\n\n/**\n * Create revertibles for adding an interval\n * @alpha\n */\nexport function appendAddIntervalToRevertibles(\n\tinterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.push({\n\t\tevent: IntervalOpType.ADD,\n\t\tinterval,\n\t});\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for deleting an interval\n * @alpha\n */\nexport function appendDeleteIntervalToRevertibles(\n\tstring: SharedString,\n\tinterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\tconst startSeg = interval.start.getSegment() as SharedStringSegment;\n\tconst startType =\n\t\tstartSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeBegin\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeBegin;\n\tconst endSeg = interval.end.getSegment() as SharedStringSegment;\n\tconst endType =\n\t\tendSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeEnd\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeEnd;\n\tconst startRef = string.createLocalReferencePosition(\n\t\tstartSeg,\n\t\tinterval.start.getOffset(),\n\t\tstartType,\n\t\tundefined,\n\t\tinterval.start.slidingPreference,\n\t);\n\tconst endRef = string.createLocalReferencePosition(\n\t\tendSeg,\n\t\tinterval.end.getOffset(),\n\t\tendType,\n\t\tundefined,\n\t\tinterval.end.slidingPreference,\n\t);\n\tconst revertible = {\n\t\tevent: IntervalOpType.DELETE,\n\t\tinterval,\n\t\tstart: startRef,\n\t\tend: endRef,\n\t};\n\trevertible.start.addProperties({ revertible });\n\trevertible.end.addProperties({ revertible });\n\trevertibles.push(revertible);\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for moving endpoints of an interval\n * @alpha\n */\nexport function appendChangeIntervalToRevertibles(\n\tstring: SharedString,\n\tnewInterval: SequenceInterval,\n\tpreviousInterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\tconst startSeg = previousInterval.start.getSegment() as SharedStringSegment;\n\t// This logic is needed because the ReferenceType StayOnRemove cannot be used\n\t// on removed segments. This works for revertibles because the old position of the\n\t// interval within the removed segment is handled by the remove range revertible.\n\tconst startType =\n\t\tstartSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeBegin\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeBegin;\n\tconst endSeg = previousInterval.end.getSegment() as SharedStringSegment;\n\tconst endType =\n\t\tendSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeEnd\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeEnd;\n\tconst prevStartRef = string.createLocalReferencePosition(\n\t\tstartSeg,\n\t\tpreviousInterval.start.getOffset(),\n\t\tstartType,\n\t\tundefined,\n\t\tpreviousInterval.start.slidingPreference,\n\t);\n\tconst prevEndRef = string.createLocalReferencePosition(\n\t\tendSeg,\n\t\tpreviousInterval.end.getOffset(),\n\t\tendType,\n\t\tundefined,\n\t\tpreviousInterval.end.slidingPreference,\n\t);\n\tconst revertible = {\n\t\tevent: IntervalOpType.CHANGE,\n\t\tinterval: newInterval,\n\t\tstart: prevStartRef,\n\t\tend: prevEndRef,\n\t};\n\trevertible.start.addProperties({ revertible });\n\trevertible.end.addProperties({ revertible });\n\trevertibles.push(revertible);\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for changing properties of an interval\n * @alpha\n */\nexport function appendIntervalPropertyChangedToRevertibles(\n\tinterval: SequenceInterval,\n\tdeltas: PropertySet,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.push({\n\t\tevent: IntervalOpType.PROPERTY_CHANGED,\n\t\tinterval,\n\t\tpropertyDeltas: deltas,\n\t});\n\n\treturn revertibles;\n}\n\nfunction addIfIntervalEndpoint(\n\tref: LocalReferencePosition,\n\tsegmentLengths: number,\n\tstartIntervals: { offset: number; interval: SequenceInterval }[],\n\tendIntervals: { offset: number; interval: SequenceInterval }[],\n) {\n\tif (refTypeIncludesFlag(ref.refType, ReferenceType.RangeBegin)) {\n\t\tconst interval = ref.properties?.interval;\n\t\tif (interval && interval instanceof SequenceInterval) {\n\t\t\tstartIntervals.push({ offset: segmentLengths + interval.start.getOffset(), interval });\n\t\t\treturn true;\n\t\t}\n\t} else if (refTypeIncludesFlag(ref.refType, ReferenceType.RangeEnd)) {\n\t\tconst interval = ref.properties?.interval;\n\t\tif (interval && interval instanceof SequenceInterval) {\n\t\t\tendIntervals.push({ offset: segmentLengths + interval.end.getOffset(), interval });\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction addIfRevertibleRef(\n\tref: LocalReferencePosition,\n\tsegmentLengths: number,\n\trevertibleRefs: {\n\t\trevertible: IntervalRevertible;\n\t\toffset: number;\n\t\tisStart: boolean;\n\t}[],\n) {\n\tconst revertible = ref.properties?.revertible;\n\tif (revertible) {\n\t\trevertibleRefs.push({\n\t\t\trevertible,\n\t\t\toffset: segmentLengths + ref.getOffset(),\n\t\t\tisStart: refTypeIncludesFlag(ref.refType, ReferenceType.RangeBegin),\n\t\t});\n\t}\n}\n\n/**\n * Create revertibles for SharedStringDeltas, handling indirectly modified intervals\n * (e.g. reverting remove of a range that contains an interval will move the interval back)\n *\n * Revertibles are new and require the option mergeTreeUseNewLengthCalculations to\n * be set as true on the underlying merge tree in order to function correctly.\n *\n * @alpha\n */\nexport function appendSharedStringDeltaToRevertibles(\n\tstring: SharedString,\n\tdelta: SequenceDeltaEvent,\n\trevertibles: SharedStringRevertible[],\n) {\n\tif (delta.ranges.length === 0) {\n\t\treturn;\n\t}\n\tif (delta.deltaOperation === MergeTreeDeltaType.REMOVE) {\n\t\tconst startIntervals: { offset: number; interval: SequenceInterval }[] = [];\n\t\tconst endIntervals: { offset: number; interval: SequenceInterval }[] = [];\n\t\tconst revertibleRefs: {\n\t\t\trevertible: IntervalRevertible;\n\t\t\toffset: number;\n\t\t\tisStart: boolean;\n\t\t}[] = [];\n\t\tlet segmentLengths = 0;\n\n\t\t// find interval endpoints in each segment\n\t\tfor (const deltaRange of delta.ranges) {\n\t\t\tconst refs = deltaRange.segment.localRefs;\n\t\t\tif (refs !== undefined && deltaRange.position !== -1) {\n\t\t\t\tfor (const ref of refs) {\n\t\t\t\t\taddIfIntervalEndpoint(ref, segmentLengths, startIntervals, endIntervals);\n\t\t\t\t\taddIfRevertibleRef(ref, segmentLengths, revertibleRefs);\n\t\t\t\t}\n\t\t\t}\n\t\t\tsegmentLengths += deltaRange.segment.cachedLength;\n\t\t}\n\n\t\tif (startIntervals.length > 0 || endIntervals.length > 0 || revertibleRefs.length > 0) {\n\t\t\tconst removeRevertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tappendToMergeTreeDeltaRevertibles(delta.deltaArgs, removeRevertibles);\n\t\t\tassert(\n\t\t\t\tremoveRevertibles.length === 1,\n\t\t\t\t0x6c4 /* Remove revertible should be a single delta */,\n\t\t\t);\n\n\t\t\tconst revertible: TypedRevertible<typeof IntervalOpType.POSITION_REMOVE> = {\n\t\t\t\tevent: IntervalOpType.POSITION_REMOVE,\n\t\t\t\tintervals: [],\n\t\t\t\trevertibleRefs,\n\t\t\t\tmergeTreeRevertible: removeRevertibles[0],\n\t\t\t};\n\n\t\t\t// add an interval for each startInterval, accounting for any corresponding endIntervals\n\t\t\tstartIntervals.forEach(({ interval, offset }) => {\n\t\t\t\t// find any corresponding end for this interval\n\t\t\t\tconst endIntervalIndex = endIntervals.findIndex((end) => {\n\t\t\t\t\treturn end.interval === interval;\n\t\t\t\t});\n\t\t\t\tlet endOffset: number | undefined;\n\t\t\t\tif (endIntervalIndex !== -1) {\n\t\t\t\t\tendOffset = endIntervals[endIntervalIndex].offset;\n\t\t\t\t\tendIntervals.splice(endIntervalIndex, 1);\n\t\t\t\t}\n\n\t\t\t\trevertible.intervals.push({\n\t\t\t\t\tintervalId: interval.getIntervalId(),\n\t\t\t\t\tlabel: interval.properties.referenceRangeLabels[0],\n\t\t\t\t\tstartOffset: offset,\n\t\t\t\t\tendOffset,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// add any remaining endIntervals that aren't matched with a startInterval\n\t\t\tendIntervals.forEach(({ interval, offset }) => {\n\t\t\t\trevertible.intervals.push({\n\t\t\t\t\tintervalId: interval.getIntervalId(),\n\t\t\t\t\tlabel: interval.properties.referenceRangeLabels[0],\n\t\t\t\t\tendOffset: offset,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\trevertibles.push(revertible);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Handle any merge tree delta that is not REMOVE or is REMOVE with no interval endpoints\n\tconst mergeTreeRevertibles: MergeTreeDeltaRevertible[] = [];\n\t// Allow merging MergeTreeDeltaRevertible with previous\n\tif (revertibles.length > 0 && isMergeTreeDeltaRevertible(revertibles[revertibles.length - 1])) {\n\t\tmergeTreeRevertibles.push(revertibles.pop() as MergeTreeDeltaRevertible);\n\t}\n\tappendToMergeTreeDeltaRevertibles(delta.deltaArgs, mergeTreeRevertibles);\n\trevertibles.push(...mergeTreeRevertibles);\n}\n\n/**\n * Clean up resources held by revertibles that are no longer needed.\n * @alpha\n */\nexport function discardSharedStringRevertibles(\n\tsharedString: SharedString,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.forEach((r) => {\n\t\tif (isMergeTreeDeltaRevertible(r)) {\n\t\t\tdiscardMergeTreeDeltaRevertible([r]);\n\t\t} else if (r.event === IntervalOpType.CHANGE || r.event === IntervalOpType.DELETE) {\n\t\t\tsharedString.removeLocalReferencePosition(r.start);\n\t\t\tsharedString.removeLocalReferencePosition(r.end);\n\t\t}\n\t});\n}\n\nfunction getSlidePosition(string: SharedString, lref: LocalReferencePosition, pos: number): number {\n\tconst slide = getSlideToSegoff(\n\t\t{ segment: lref.getSegment(), offset: undefined },\n\t\tlref.slidingPreference,\n\t);\n\treturn slide?.segment !== undefined &&\n\t\tslide.offset !== undefined &&\n\t\tstring.getPosition(slide.segment) !== -1 &&\n\t\t(pos < 0 || pos >= string.getLength())\n\t\t? string.getPosition(slide.segment) + slide.offset\n\t\t: pos;\n}\n\nfunction isValidRange(start: number, end: number, string: SharedString) {\n\treturn (\n\t\tstart >= 0 &&\n\t\tstart < string.getLength() &&\n\t\tend >= 0 &&\n\t\tend < string.getLength() &&\n\t\tstart <= end\n\t);\n}\n\nfunction revertLocalAdd(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.ADD>,\n) {\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tstring.getIntervalCollection(label).removeIntervalById(id);\n}\n\nfunction revertLocalDelete(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.DELETE>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst collection = string.getIntervalCollection(label);\n\tconst start = string.localReferencePositionToPosition(revertible.start);\n\tconst startSlidePos = getSlidePosition(string, revertible.start, start);\n\tconst end = string.localReferencePositionToPosition(revertible.end);\n\tconst endSlidePos = getSlidePosition(string, revertible.end, end);\n\tconst type = revertible.interval.intervalType;\n\t// reusing the id causes eventual consistency bugs, so it is removed here and recreated in add\n\tconst { intervalId, ...props } = revertible.interval.properties;\n\tif (!isValidRange(startSlidePos, endSlidePos, string)) return;\n\tconst int = collection.add(startSlidePos, endSlidePos, type, props);\n\n\tidMap.forEach((newId, oldId) => {\n\t\tif (intervalId === newId) {\n\t\t\tidMap.set(oldId, getUpdatedIdFromInterval(int));\n\t\t}\n\t});\n\tidMap.set(intervalId, int.getIntervalId());\n\n\tstring.removeLocalReferencePosition(revertible.start);\n\tstring.removeLocalReferencePosition(revertible.end);\n}\n\nfunction revertLocalChange(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.CHANGE>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst collection = string.getIntervalCollection(label);\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst start = string.localReferencePositionToPosition(revertible.start);\n\tconst startSlidePos = getSlidePosition(string, revertible.start, start);\n\tconst end = string.localReferencePositionToPosition(revertible.end);\n\tconst endSlidePos = getSlidePosition(string, revertible.end, end);\n\tif (!isValidRange(startSlidePos, endSlidePos, string)) return;\n\tcollection.change(id, startSlidePos, endSlidePos);\n\n\tstring.removeLocalReferencePosition(revertible.start);\n\tstring.removeLocalReferencePosition(revertible.end);\n}\n\nfunction revertLocalPropertyChanged(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.PROPERTY_CHANGED>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst newProps = revertible.propertyDeltas;\n\tstring.getIntervalCollection(label).changeProperties(id, newProps);\n}\n\nfunction newPosition(offset: number | undefined, restoredRanges: SortedRangeSet) {\n\tif (offset === undefined) {\n\t\treturn undefined;\n\t}\n\n\tlet offsetFromSegment = offset;\n\tfor (const rangeInfo of restoredRanges.items) {\n\t\tif (offsetFromSegment < rangeInfo.length) {\n\t\t\t// find the segment inside the range\n\t\t\tfor (const range of rangeInfo.ranges) {\n\t\t\t\tif (range.segment.cachedLength > offsetFromSegment) {\n\t\t\t\t\treturn { segment: range.segment, offset: offsetFromSegment };\n\t\t\t\t}\n\t\t\t\toffsetFromSegment -= range.segment.cachedLength;\n\t\t\t}\n\t\t}\n\t\toffsetFromSegment -= rangeInfo.length;\n\t}\n\n\treturn undefined;\n}\n\nfunction newEndpointPosition(\n\toffset: number | undefined,\n\trestoredRanges: SortedRangeSet,\n\tsharedString: SharedString,\n) {\n\tconst pos = newPosition(offset, restoredRanges);\n\treturn pos === undefined ? undefined : sharedString.getPosition(pos.segment) + pos.offset;\n}\n\ninterface RangeInfo {\n\tranges: readonly Readonly<ISequenceDeltaRange<MergeTreeDeltaOperationType>>[];\n\tlength: number;\n}\n\nclass SortedRangeSet extends SortedSet<RangeInfo, string> {\n\tprotected getKey(item: RangeInfo): string {\n\t\treturn item.ranges[0].segment.ordinal;\n\t}\n}\n\nfunction revertLocalSequenceRemove(\n\tsharedString: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.POSITION_REMOVE>,\n) {\n\tconst restoredRanges = new SortedRangeSet();\n\tconst saveSegments = (event: SequenceDeltaEvent) => {\n\t\tif (event.ranges.length > 0) {\n\t\t\tlet length = 0;\n\t\t\tevent.ranges.forEach((range) => {\n\t\t\t\tlength += range.segment.cachedLength;\n\t\t\t});\n\t\t\trestoredRanges.addOrUpdate({ ranges: event.ranges, length });\n\t\t}\n\t};\n\tsharedString.on(\"sequenceDelta\", saveSegments);\n\trevertMergeTreeDeltaRevertibles(sharedString, [revertible.mergeTreeRevertible]);\n\tsharedString.off(\"sequenceDelta\", saveSegments);\n\n\trevertible.intervals.forEach((intervalInfo) => {\n\t\tconst intervalCollection = sharedString.getIntervalCollection(intervalInfo.label);\n\t\tconst intervalId = getUpdatedId(intervalInfo.intervalId);\n\t\tconst interval = intervalCollection.getIntervalById(intervalId);\n\t\tif (interval !== undefined) {\n\t\t\tconst newStart = newEndpointPosition(\n\t\t\t\tintervalInfo.startOffset,\n\t\t\t\trestoredRanges,\n\t\t\t\tsharedString,\n\t\t\t);\n\t\t\tconst newEnd = newEndpointPosition(\n\t\t\t\tintervalInfo.endOffset,\n\t\t\t\trestoredRanges,\n\t\t\t\tsharedString,\n\t\t\t);\n\t\t\tif (newStart !== undefined || newEnd !== undefined) {\n\t\t\t\tintervalCollection.change(intervalId, newStart, newEnd);\n\t\t\t}\n\t\t}\n\t});\n\n\t// fix up the local references used by delete and change revertibles\n\trevertible.revertibleRefs.forEach((revertibleRef) => {\n\t\tassert(\n\t\t\trevertibleRef.revertible.event === IntervalOpType.CHANGE ||\n\t\t\t\trevertibleRef.revertible.event === IntervalOpType.DELETE,\n\t\t\t0x6c5 /* revertible is not delete or change */,\n\t\t);\n\t\tconst pos = newPosition(revertibleRef.offset, restoredRanges);\n\t\tif (pos !== undefined) {\n\t\t\tif (revertibleRef.isStart) {\n\t\t\t\tsharedString.removeLocalReferencePosition(revertibleRef.revertible.start);\n\t\t\t\tconst newRef = sharedString.createLocalReferencePosition(\n\t\t\t\t\tpos.segment as SharedStringSegment,\n\t\t\t\t\tpos.offset,\n\t\t\t\t\tReferenceType.StayOnRemove | ReferenceType.RangeBegin,\n\t\t\t\t\t{ revertible: revertibleRef.revertible },\n\t\t\t\t);\n\t\t\t\trevertibleRef.revertible.start = newRef;\n\t\t\t} else {\n\t\t\t\tsharedString.removeLocalReferencePosition(revertibleRef.revertible.end);\n\t\t\t\tconst newRef = sharedString.createLocalReferencePosition(\n\t\t\t\t\tpos.segment as SharedStringSegment,\n\t\t\t\t\tpos.offset,\n\t\t\t\t\tReferenceType.StayOnRemove | ReferenceType.RangeEnd,\n\t\t\t\t\t{ revertible: revertibleRef.revertible },\n\t\t\t\t);\n\t\t\t\trevertibleRef.revertible.end = newRef;\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Invoke revertibles to reverse prior edits\n *\n * Revertibles are new and require the option mergeTreeUseNewLengthCalculations to\n * be set as true on the underlying merge tree in order to function correctly.\n *\n * @alpha\n */\nexport function revertSharedStringRevertibles(\n\tsharedString: SharedString,\n\trevertibles: SharedStringRevertible[],\n) {\n\twhile (revertibles.length > 0) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst r = revertibles.pop()!;\n\t\tif (\"event\" in r) {\n\t\t\tconst event = r.event;\n\t\t\tswitch (event) {\n\t\t\t\tcase IntervalOpType.ADD:\n\t\t\t\t\trevertLocalAdd(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.DELETE:\n\t\t\t\t\trevertLocalDelete(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.CHANGE:\n\t\t\t\t\trevertLocalChange(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.PROPERTY_CHANGED:\n\t\t\t\t\trevertLocalPropertyChanged(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.POSITION_REMOVE:\n\t\t\t\t\trevertLocalSequenceRemove(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(event);\n\t\t\t}\n\t\t} else {\n\t\t\trevertMergeTreeDeltaRevertibles(sharedString, [r]);\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"revertibles.js","sourceRoot":"","sources":["../src/revertibles.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n/* eslint-disable no-bitwise */\n\nimport { assert, unreachableCase } from \"@fluidframework/core-utils\";\nimport {\n\tappendToMergeTreeDeltaRevertibles,\n\tdiscardMergeTreeDeltaRevertible,\n\tisMergeTreeDeltaRevertible,\n\tLocalReferencePosition,\n\tMergeTreeDeltaOperationType,\n\tMergeTreeDeltaRevertible,\n\tMergeTreeDeltaType,\n\tPropertySet,\n\tReferenceType,\n\trefTypeIncludesFlag,\n\trevertMergeTreeDeltaRevertibles,\n\tSortedSet,\n\tgetSlideToSegoff,\n} from \"@fluidframework/merge-tree\";\nimport { IntervalOpType, SequenceInterval } from \"./intervals\";\nimport { SharedString, SharedStringSegment } from \"./sharedString\";\nimport { ISequenceDeltaRange, SequenceDeltaEvent } from \"./sequenceDeltaEvent\";\n\n/**\n * Data for undoing edits on SharedStrings and Intervals.\n *\n * Revertibles are new and require the option mergeTreeUseNewLengthCalculations to\n * be set as true on the underlying merge tree in order to function correctly.\n *\n * @alpha\n */\nexport type SharedStringRevertible = MergeTreeDeltaRevertible | IntervalRevertible;\n\nconst idMap = new Map<string, string>();\n\ntype IntervalOpType = typeof IntervalOpType[keyof typeof IntervalOpType];\n\n/**\n * Data for undoing edits affecting Intervals.\n *\n * Revertibles are new and require the option mergeTreeUseNewLengthCalculations to\n * be set as true on the underlying merge tree in order to function correctly.\n *\n * @alpha\n */\nexport type IntervalRevertible =\n\t| {\n\t\t\tevent: typeof IntervalOpType.CHANGE;\n\t\t\tinterval: SequenceInterval;\n\t\t\tstart: LocalReferencePosition;\n\t\t\tend: LocalReferencePosition;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.ADD;\n\t\t\tinterval: SequenceInterval;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.DELETE;\n\t\t\tinterval: SequenceInterval;\n\t\t\tstart: LocalReferencePosition;\n\t\t\tend: LocalReferencePosition;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.PROPERTY_CHANGED;\n\t\t\tinterval: SequenceInterval;\n\t\t\tpropertyDeltas: PropertySet;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.POSITION_REMOVE;\n\t\t\tintervals: {\n\t\t\t\tintervalId: string;\n\t\t\t\tlabel: string;\n\t\t\t\tstartOffset?: number; // interval start index within a removed range\n\t\t\t\tendOffset?: number; // interval end index within a removed range\n\t\t\t}[];\n\t\t\t// local refs used by IntervalOpType.CHANGE and DELETE revertibles\n\t\t\trevertibleRefs: {\n\t\t\t\trevertible: IntervalRevertible;\n\t\t\t\toffset: number;\n\t\t\t\tisStart: boolean;\n\t\t\t}[];\n\t\t\tmergeTreeRevertible: MergeTreeDeltaRevertible;\n\t };\n\ntype TypedRevertible<T extends IntervalRevertible[\"event\"]> = IntervalRevertible & { event: T };\n\nfunction getUpdatedIdFromInterval(interval: SequenceInterval): string {\n\tconst maybeId = interval.getIntervalId();\n\treturn getUpdatedId(maybeId);\n}\n\nfunction getUpdatedId(intervalId: string): string {\n\treturn idMap.get(intervalId) ?? intervalId;\n}\n\n/**\n * Create revertibles for adding an interval\n * @alpha\n */\nexport function appendAddIntervalToRevertibles(\n\tinterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.push({\n\t\tevent: IntervalOpType.ADD,\n\t\tinterval,\n\t});\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for deleting an interval\n * @alpha\n */\nexport function appendDeleteIntervalToRevertibles(\n\tstring: SharedString,\n\tinterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\tconst startSeg = interval.start.getSegment() as SharedStringSegment;\n\tconst startType =\n\t\tstartSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeBegin\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeBegin;\n\tconst endSeg = interval.end.getSegment() as SharedStringSegment;\n\tconst endType =\n\t\tendSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeEnd\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeEnd;\n\tconst startRef = string.createLocalReferencePosition(\n\t\tstartSeg,\n\t\tinterval.start.getOffset(),\n\t\tstartType,\n\t\tundefined,\n\t\tinterval.start.slidingPreference,\n\t);\n\tconst endRef = string.createLocalReferencePosition(\n\t\tendSeg,\n\t\tinterval.end.getOffset(),\n\t\tendType,\n\t\tundefined,\n\t\tinterval.end.slidingPreference,\n\t);\n\tconst revertible = {\n\t\tevent: IntervalOpType.DELETE,\n\t\tinterval,\n\t\tstart: startRef,\n\t\tend: endRef,\n\t};\n\trevertible.start.addProperties({ revertible });\n\trevertible.end.addProperties({ revertible });\n\trevertibles.push(revertible);\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for moving endpoints of an interval\n * @alpha\n */\nexport function appendChangeIntervalToRevertibles(\n\tstring: SharedString,\n\tnewInterval: SequenceInterval,\n\tpreviousInterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\tconst startSeg = previousInterval.start.getSegment() as SharedStringSegment;\n\t// This logic is needed because the ReferenceType StayOnRemove cannot be used\n\t// on removed segments. This works for revertibles because the old position of the\n\t// interval within the removed segment is handled by the remove range revertible.\n\tconst startType =\n\t\tstartSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeBegin\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeBegin;\n\tconst endSeg = previousInterval.end.getSegment() as SharedStringSegment;\n\tconst endType =\n\t\tendSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeEnd\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeEnd;\n\tconst prevStartRef = string.createLocalReferencePosition(\n\t\tstartSeg,\n\t\tpreviousInterval.start.getOffset(),\n\t\tstartType,\n\t\tundefined,\n\t\tpreviousInterval.start.slidingPreference,\n\t);\n\tconst prevEndRef = string.createLocalReferencePosition(\n\t\tendSeg,\n\t\tpreviousInterval.end.getOffset(),\n\t\tendType,\n\t\tundefined,\n\t\tpreviousInterval.end.slidingPreference,\n\t);\n\tconst revertible = {\n\t\tevent: IntervalOpType.CHANGE,\n\t\tinterval: newInterval,\n\t\tstart: prevStartRef,\n\t\tend: prevEndRef,\n\t};\n\trevertible.start.addProperties({ revertible });\n\trevertible.end.addProperties({ revertible });\n\trevertibles.push(revertible);\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for changing properties of an interval\n * @alpha\n */\nexport function appendIntervalPropertyChangedToRevertibles(\n\tinterval: SequenceInterval,\n\tdeltas: PropertySet,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.push({\n\t\tevent: IntervalOpType.PROPERTY_CHANGED,\n\t\tinterval,\n\t\tpropertyDeltas: deltas,\n\t});\n\n\treturn revertibles;\n}\n\nfunction addIfIntervalEndpoint(\n\tref: LocalReferencePosition,\n\tsegmentLengths: number,\n\tstartIntervals: { offset: number; interval: SequenceInterval }[],\n\tendIntervals: { offset: number; interval: SequenceInterval }[],\n) {\n\tif (refTypeIncludesFlag(ref.refType, ReferenceType.RangeBegin)) {\n\t\tconst interval = ref.properties?.interval;\n\t\tif (interval && interval instanceof SequenceInterval) {\n\t\t\tstartIntervals.push({ offset: segmentLengths + interval.start.getOffset(), interval });\n\t\t\treturn true;\n\t\t}\n\t} else if (refTypeIncludesFlag(ref.refType, ReferenceType.RangeEnd)) {\n\t\tconst interval = ref.properties?.interval;\n\t\tif (interval && interval instanceof SequenceInterval) {\n\t\t\tendIntervals.push({ offset: segmentLengths + interval.end.getOffset(), interval });\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction addIfRevertibleRef(\n\tref: LocalReferencePosition,\n\tsegmentLengths: number,\n\trevertibleRefs: {\n\t\trevertible: IntervalRevertible;\n\t\toffset: number;\n\t\tisStart: boolean;\n\t}[],\n) {\n\tconst revertible = ref.properties?.revertible;\n\tif (revertible) {\n\t\trevertibleRefs.push({\n\t\t\trevertible,\n\t\t\toffset: segmentLengths + ref.getOffset(),\n\t\t\tisStart: refTypeIncludesFlag(ref.refType, ReferenceType.RangeBegin),\n\t\t});\n\t}\n}\n\n/**\n * Create revertibles for SharedStringDeltas, handling indirectly modified intervals\n * (e.g. reverting remove of a range that contains an interval will move the interval back)\n *\n * Revertibles are new and require the option mergeTreeUseNewLengthCalculations to\n * be set as true on the underlying merge tree in order to function correctly.\n *\n * @alpha\n */\nexport function appendSharedStringDeltaToRevertibles(\n\tstring: SharedString,\n\tdelta: SequenceDeltaEvent,\n\trevertibles: SharedStringRevertible[],\n) {\n\tif (delta.ranges.length === 0) {\n\t\treturn;\n\t}\n\tif (delta.deltaOperation === MergeTreeDeltaType.REMOVE) {\n\t\tconst startIntervals: { offset: number; interval: SequenceInterval }[] = [];\n\t\tconst endIntervals: { offset: number; interval: SequenceInterval }[] = [];\n\t\tconst revertibleRefs: {\n\t\t\trevertible: IntervalRevertible;\n\t\t\toffset: number;\n\t\t\tisStart: boolean;\n\t\t}[] = [];\n\t\tlet segmentLengths = 0;\n\n\t\t// find interval endpoints in each segment\n\t\tfor (const deltaRange of delta.ranges) {\n\t\t\tconst refs = deltaRange.segment.localRefs;\n\t\t\tif (refs !== undefined && deltaRange.position !== -1) {\n\t\t\t\tfor (const ref of refs) {\n\t\t\t\t\taddIfIntervalEndpoint(ref, segmentLengths, startIntervals, endIntervals);\n\t\t\t\t\taddIfRevertibleRef(ref, segmentLengths, revertibleRefs);\n\t\t\t\t}\n\t\t\t}\n\t\t\tsegmentLengths += deltaRange.segment.cachedLength;\n\t\t}\n\n\t\tif (startIntervals.length > 0 || endIntervals.length > 0 || revertibleRefs.length > 0) {\n\t\t\tconst removeRevertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tappendToMergeTreeDeltaRevertibles(delta.deltaArgs, removeRevertibles);\n\t\t\tassert(\n\t\t\t\tremoveRevertibles.length === 1,\n\t\t\t\t0x6c4 /* Remove revertible should be a single delta */,\n\t\t\t);\n\n\t\t\tconst revertible: TypedRevertible<typeof IntervalOpType.POSITION_REMOVE> = {\n\t\t\t\tevent: IntervalOpType.POSITION_REMOVE,\n\t\t\t\tintervals: [],\n\t\t\t\trevertibleRefs,\n\t\t\t\tmergeTreeRevertible: removeRevertibles[0],\n\t\t\t};\n\n\t\t\t// add an interval for each startInterval, accounting for any corresponding endIntervals\n\t\t\tstartIntervals.forEach(({ interval, offset }) => {\n\t\t\t\t// find any corresponding end for this interval\n\t\t\t\tconst endIntervalIndex = endIntervals.findIndex((end) => {\n\t\t\t\t\treturn end.interval === interval;\n\t\t\t\t});\n\t\t\t\tlet endOffset: number | undefined;\n\t\t\t\tif (endIntervalIndex !== -1) {\n\t\t\t\t\tendOffset = endIntervals[endIntervalIndex].offset;\n\t\t\t\t\tendIntervals.splice(endIntervalIndex, 1);\n\t\t\t\t}\n\n\t\t\t\trevertible.intervals.push({\n\t\t\t\t\tintervalId: interval.getIntervalId(),\n\t\t\t\t\tlabel: interval.properties.referenceRangeLabels[0],\n\t\t\t\t\tstartOffset: offset,\n\t\t\t\t\tendOffset,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// add any remaining endIntervals that aren't matched with a startInterval\n\t\t\tendIntervals.forEach(({ interval, offset }) => {\n\t\t\t\trevertible.intervals.push({\n\t\t\t\t\tintervalId: interval.getIntervalId(),\n\t\t\t\t\tlabel: interval.properties.referenceRangeLabels[0],\n\t\t\t\t\tendOffset: offset,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\trevertibles.push(revertible);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Handle any merge tree delta that is not REMOVE or is REMOVE with no interval endpoints\n\tconst mergeTreeRevertibles: MergeTreeDeltaRevertible[] = [];\n\t// Allow merging MergeTreeDeltaRevertible with previous\n\tif (revertibles.length > 0 && isMergeTreeDeltaRevertible(revertibles[revertibles.length - 1])) {\n\t\tmergeTreeRevertibles.push(revertibles.pop() as MergeTreeDeltaRevertible);\n\t}\n\tappendToMergeTreeDeltaRevertibles(delta.deltaArgs, mergeTreeRevertibles);\n\trevertibles.push(...mergeTreeRevertibles);\n}\n\n/**\n * Clean up resources held by revertibles that are no longer needed.\n * @alpha\n */\nexport function discardSharedStringRevertibles(\n\tsharedString: SharedString,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.forEach((r) => {\n\t\tif (isMergeTreeDeltaRevertible(r)) {\n\t\t\tdiscardMergeTreeDeltaRevertible([r]);\n\t\t} else if (r.event === IntervalOpType.CHANGE || r.event === IntervalOpType.DELETE) {\n\t\t\tsharedString.removeLocalReferencePosition(r.start);\n\t\t\tsharedString.removeLocalReferencePosition(r.end);\n\t\t}\n\t});\n}\n\nfunction getSlidePosition(string: SharedString, lref: LocalReferencePosition, pos: number): number {\n\tconst slide = getSlideToSegoff(\n\t\t{ segment: lref.getSegment(), offset: undefined },\n\t\tlref.slidingPreference,\n\t);\n\treturn slide?.segment !== undefined &&\n\t\tslide.offset !== undefined &&\n\t\tstring.getPosition(slide.segment) !== -1 &&\n\t\t(pos < 0 || pos >= string.getLength())\n\t\t? string.getPosition(slide.segment) + slide.offset\n\t\t: pos;\n}\n\nfunction isValidRange(start: number, end: number, string: SharedString) {\n\treturn (\n\t\tstart >= 0 &&\n\t\tstart < string.getLength() &&\n\t\tend >= 0 &&\n\t\tend < string.getLength() &&\n\t\tstart <= end\n\t);\n}\n\nfunction revertLocalAdd(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.ADD>,\n) {\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tstring.getIntervalCollection(label).removeIntervalById(id);\n}\n\nfunction revertLocalDelete(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.DELETE>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst collection = string.getIntervalCollection(label);\n\tconst start = string.localReferencePositionToPosition(revertible.start);\n\tconst startSlidePos = getSlidePosition(string, revertible.start, start);\n\tconst end = string.localReferencePositionToPosition(revertible.end);\n\tconst endSlidePos = getSlidePosition(string, revertible.end, end);\n\tconst type = revertible.interval.intervalType;\n\t// reusing the id causes eventual consistency bugs, so it is removed here and recreated in add\n\tconst { intervalId, ...props } = revertible.interval.properties;\n\tif (isValidRange(startSlidePos, endSlidePos, string)) {\n\t\tconst int = collection.add(startSlidePos, endSlidePos, type, props);\n\n\t\tidMap.forEach((newId, oldId) => {\n\t\t\tif (intervalId === newId) {\n\t\t\t\tidMap.set(oldId, getUpdatedIdFromInterval(int));\n\t\t\t}\n\t\t});\n\t\tidMap.set(intervalId, int.getIntervalId());\n\t}\n\n\tstring.removeLocalReferencePosition(revertible.start);\n\tstring.removeLocalReferencePosition(revertible.end);\n}\n\nfunction revertLocalChange(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.CHANGE>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst collection = string.getIntervalCollection(label);\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst start = string.localReferencePositionToPosition(revertible.start);\n\tconst startSlidePos = getSlidePosition(string, revertible.start, start);\n\tconst end = string.localReferencePositionToPosition(revertible.end);\n\tconst endSlidePos = getSlidePosition(string, revertible.end, end);\n\tif (isValidRange(startSlidePos, endSlidePos, string)) {\n\t\tcollection.change(id, startSlidePos, endSlidePos);\n\t}\n\n\tstring.removeLocalReferencePosition(revertible.start);\n\tstring.removeLocalReferencePosition(revertible.end);\n}\n\nfunction revertLocalPropertyChanged(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.PROPERTY_CHANGED>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst newProps = revertible.propertyDeltas;\n\tstring.getIntervalCollection(label).changeProperties(id, newProps);\n}\n\nfunction newPosition(offset: number | undefined, restoredRanges: SortedRangeSet) {\n\tif (offset === undefined) {\n\t\treturn undefined;\n\t}\n\n\tlet offsetFromSegment = offset;\n\tfor (const rangeInfo of restoredRanges.items) {\n\t\tif (offsetFromSegment < rangeInfo.length) {\n\t\t\t// find the segment inside the range\n\t\t\tfor (const range of rangeInfo.ranges) {\n\t\t\t\tif (range.segment.cachedLength > offsetFromSegment) {\n\t\t\t\t\treturn { segment: range.segment, offset: offsetFromSegment };\n\t\t\t\t}\n\t\t\t\toffsetFromSegment -= range.segment.cachedLength;\n\t\t\t}\n\t\t}\n\t\toffsetFromSegment -= rangeInfo.length;\n\t}\n\n\treturn undefined;\n}\n\nfunction newEndpointPosition(\n\toffset: number | undefined,\n\trestoredRanges: SortedRangeSet,\n\tsharedString: SharedString,\n) {\n\tconst pos = newPosition(offset, restoredRanges);\n\treturn pos === undefined ? undefined : sharedString.getPosition(pos.segment) + pos.offset;\n}\n\ninterface RangeInfo {\n\tranges: readonly Readonly<ISequenceDeltaRange<MergeTreeDeltaOperationType>>[];\n\tlength: number;\n}\n\nclass SortedRangeSet extends SortedSet<RangeInfo, string> {\n\tprotected getKey(item: RangeInfo): string {\n\t\treturn item.ranges[0].segment.ordinal;\n\t}\n}\n\nfunction revertLocalSequenceRemove(\n\tsharedString: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.POSITION_REMOVE>,\n) {\n\tconst restoredRanges = new SortedRangeSet();\n\tconst saveSegments = (event: SequenceDeltaEvent) => {\n\t\tif (event.ranges.length > 0) {\n\t\t\tlet length = 0;\n\t\t\tevent.ranges.forEach((range) => {\n\t\t\t\tlength += range.segment.cachedLength;\n\t\t\t});\n\t\t\trestoredRanges.addOrUpdate({ ranges: event.ranges, length });\n\t\t}\n\t};\n\tsharedString.on(\"sequenceDelta\", saveSegments);\n\trevertMergeTreeDeltaRevertibles(sharedString, [revertible.mergeTreeRevertible]);\n\tsharedString.off(\"sequenceDelta\", saveSegments);\n\n\trevertible.intervals.forEach((intervalInfo) => {\n\t\tconst intervalCollection = sharedString.getIntervalCollection(intervalInfo.label);\n\t\tconst intervalId = getUpdatedId(intervalInfo.intervalId);\n\t\tconst interval = intervalCollection.getIntervalById(intervalId);\n\t\tif (interval !== undefined) {\n\t\t\tconst newStart = newEndpointPosition(\n\t\t\t\tintervalInfo.startOffset,\n\t\t\t\trestoredRanges,\n\t\t\t\tsharedString,\n\t\t\t);\n\t\t\tconst newEnd = newEndpointPosition(\n\t\t\t\tintervalInfo.endOffset,\n\t\t\t\trestoredRanges,\n\t\t\t\tsharedString,\n\t\t\t);\n\t\t\t// only move interval if start <= end\n\t\t\tif (\n\t\t\t\t(newStart === undefined &&\n\t\t\t\t\tnewEnd !== undefined &&\n\t\t\t\t\tsharedString.localReferencePositionToPosition(interval.start) <= newEnd) ||\n\t\t\t\t(newEnd === undefined &&\n\t\t\t\t\tnewStart !== undefined &&\n\t\t\t\t\tsharedString.localReferencePositionToPosition(interval.end) >= newStart) ||\n\t\t\t\t(newStart !== undefined && newEnd !== undefined && newStart <= newEnd)\n\t\t\t) {\n\t\t\t\tintervalCollection.change(intervalId, newStart, newEnd);\n\t\t\t}\n\t\t}\n\t});\n\n\t// fix up the local references used by delete and change revertibles\n\trevertible.revertibleRefs.forEach((revertibleRef) => {\n\t\tassert(\n\t\t\trevertibleRef.revertible.event === IntervalOpType.CHANGE ||\n\t\t\t\trevertibleRef.revertible.event === IntervalOpType.DELETE,\n\t\t\t0x6c5 /* revertible is not delete or change */,\n\t\t);\n\t\tconst pos = newPosition(revertibleRef.offset, restoredRanges);\n\t\tif (pos !== undefined) {\n\t\t\tif (revertibleRef.isStart) {\n\t\t\t\tsharedString.removeLocalReferencePosition(revertibleRef.revertible.start);\n\t\t\t\tconst newRef = sharedString.createLocalReferencePosition(\n\t\t\t\t\tpos.segment as SharedStringSegment,\n\t\t\t\t\tpos.offset,\n\t\t\t\t\tReferenceType.StayOnRemove | ReferenceType.RangeBegin,\n\t\t\t\t\t{ revertible: revertibleRef.revertible },\n\t\t\t\t);\n\t\t\t\trevertibleRef.revertible.start = newRef;\n\t\t\t} else {\n\t\t\t\tsharedString.removeLocalReferencePosition(revertibleRef.revertible.end);\n\t\t\t\tconst newRef = sharedString.createLocalReferencePosition(\n\t\t\t\t\tpos.segment as SharedStringSegment,\n\t\t\t\t\tpos.offset,\n\t\t\t\t\tReferenceType.StayOnRemove | ReferenceType.RangeEnd,\n\t\t\t\t\t{ revertible: revertibleRef.revertible },\n\t\t\t\t);\n\t\t\t\trevertibleRef.revertible.end = newRef;\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Invoke revertibles to reverse prior edits\n *\n * Revertibles are new and require the option mergeTreeUseNewLengthCalculations to\n * be set as true on the underlying merge tree in order to function correctly.\n *\n * @alpha\n */\nexport function revertSharedStringRevertibles(\n\tsharedString: SharedString,\n\trevertibles: SharedStringRevertible[],\n) {\n\twhile (revertibles.length > 0) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst r = revertibles.pop()!;\n\t\tif (\"event\" in r) {\n\t\t\tconst event = r.event;\n\t\t\tswitch (event) {\n\t\t\t\tcase IntervalOpType.ADD:\n\t\t\t\t\trevertLocalAdd(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.DELETE:\n\t\t\t\t\trevertLocalDelete(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.CHANGE:\n\t\t\t\t\trevertLocalChange(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.PROPERTY_CHANGED:\n\t\t\t\t\trevertLocalPropertyChanged(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.POSITION_REMOVE:\n\t\t\t\t\trevertLocalSequenceRemove(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(event);\n\t\t\t}\n\t\t} else {\n\t\t\trevertMergeTreeDeltaRevertibles(sharedString, [r]);\n\t\t}\n\t}\n}\n"]}
|
package/dist/sequence.d.ts
CHANGED
|
@@ -2,14 +2,15 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { Deferred } from "@fluidframework/
|
|
5
|
+
import { Deferred } from "@fluidframework/core-utils";
|
|
6
6
|
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
7
7
|
import { IChannelAttributes, IFluidDataStoreRuntime, IChannelStorageService } from "@fluidframework/datastore-definitions";
|
|
8
8
|
import { Client, ICombiningOp, IJSONSegment, IMergeTreeGroupMsg, IMergeTreeOp, IMergeTreeRemoveMsg, IRelativePosition, ISegment, ISegmentAction, LocalReferencePosition, PropertySet, RangeStackMap, ReferencePosition, ReferenceType, MergeTreeRevertibleDriver, SlidingPreference } from "@fluidframework/merge-tree";
|
|
9
9
|
import { IFluidSerializer, SharedObject, ISharedObjectEvents, SummarySerializer } from "@fluidframework/shared-object-base";
|
|
10
|
-
import { IEventThisPlaceHolder } from "@fluidframework/
|
|
10
|
+
import { IEventThisPlaceHolder } from "@fluidframework/core-interfaces";
|
|
11
11
|
import { ISummaryTreeWithStats, ITelemetryContext } from "@fluidframework/runtime-definitions";
|
|
12
|
-
import {
|
|
12
|
+
import { SequenceInterval } from "./intervals";
|
|
13
|
+
import { IIntervalCollection } from "./intervalCollection";
|
|
13
14
|
import { SequenceDeltaEvent, SequenceMaintenanceEvent } from "./sequenceDeltaEvent";
|
|
14
15
|
import { ISharedIntervalCollection } from "./sharedIntervalCollection";
|
|
15
16
|
/**
|
|
@@ -55,6 +56,20 @@ export declare abstract class SharedSegmentSequence<T extends ISegment> extends
|
|
|
55
56
|
id: string;
|
|
56
57
|
readonly segmentFromSpec: (spec: IJSONSegment) => ISegment;
|
|
57
58
|
get loaded(): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* This is a safeguard to avoid problematic reentrancy of local ops. This type of scenario occurs if the user of SharedString subscribes
|
|
61
|
+
* to the `sequenceDelta` event and uses the callback for a local op to submit further local ops.
|
|
62
|
+
* Historically (before 2.0.0-internal.6.1.0), doing so would result in eventual consistency issues or a corrupted document.
|
|
63
|
+
* These issues were fixed in #16815 which makes such reentrancy no different from applying the ops in order but not from within the change events,
|
|
64
|
+
* but there is still little test coverage for reentrant scenarios.
|
|
65
|
+
* Additionally, applications submitting ops from inside change events need to take extreme care that their data models also support reentrancy.
|
|
66
|
+
* Since this is likely not the case, by default SharedString throws when encountering reentrant ops.
|
|
67
|
+
*
|
|
68
|
+
* An application using SharedString which explicitly wants to opt in to allowing reentrancy anyway can set `sharedStringPreventReentrancy`
|
|
69
|
+
* on the data store options to `false`.
|
|
70
|
+
* @internal
|
|
71
|
+
*/
|
|
72
|
+
protected guardReentrancy: <TRet>(callback: () => TRet) => TRet;
|
|
58
73
|
private static createOpsFromDelta;
|
|
59
74
|
protected client: Client;
|
|
60
75
|
/** `Deferred` that triggers once the object is loaded */
|
|
@@ -70,6 +85,9 @@ export declare abstract class SharedSegmentSequence<T extends ISegment> extends
|
|
|
70
85
|
* @param end - The exclusive end of the range to remove
|
|
71
86
|
*/
|
|
72
87
|
removeRange(start: number, end: number): IMergeTreeRemoveMsg;
|
|
88
|
+
/**
|
|
89
|
+
* @deprecated - The ability to create group ops will be removed in an upcoming release, as group ops are redundant with the native batching capabilities of the runtime
|
|
90
|
+
*/
|
|
73
91
|
groupOperation(groupOp: IMergeTreeGroupMsg): void;
|
|
74
92
|
/**
|
|
75
93
|
* Finds the segment information (i.e. segment + offset) corresponding to a character position in the SharedString.
|
|
@@ -137,6 +155,9 @@ export declare abstract class SharedSegmentSequence<T extends ISegment> extends
|
|
|
137
155
|
* @param remoteClientId - The client id of the remote client
|
|
138
156
|
*/
|
|
139
157
|
resolveRemoteClientPosition(remoteClientPosition: number, remoteClientRefSeq: number, remoteClientId: string): number | undefined;
|
|
158
|
+
/**
|
|
159
|
+
* @deprecated - This method will no longer be public in an upcoming release as it is not safe to use outside of this class
|
|
160
|
+
*/
|
|
140
161
|
submitSequenceMessage(message: IMergeTreeOp): void;
|
|
141
162
|
/**
|
|
142
163
|
* Given a position specified relative to a marker id, lookup the marker
|
|
@@ -158,9 +179,12 @@ export declare abstract class SharedSegmentSequence<T extends ISegment> extends
|
|
|
158
179
|
* @param splitRange - Optional. Splits boundary segments on the range boundaries
|
|
159
180
|
*/
|
|
160
181
|
walkSegments<TClientData>(handler: ISegmentAction<TClientData>, start?: number, end?: number, accum?: TClientData, splitRange?: boolean): void;
|
|
182
|
+
/**
|
|
183
|
+
* @deprecated - this functionality is no longer supported and will be removed
|
|
184
|
+
*/
|
|
161
185
|
getStackContext(startPos: number, rangeLabels: string[]): RangeStackMap;
|
|
162
186
|
/**
|
|
163
|
-
* @returns
|
|
187
|
+
* @returns The most recent sequence number which has been acked by the server and processed by this
|
|
164
188
|
* SharedSegmentSequence.
|
|
165
189
|
*/
|
|
166
190
|
getCurrentSeq(): number;
|
|
@@ -185,6 +209,7 @@ export declare abstract class SharedSegmentSequence<T extends ISegment> extends
|
|
|
185
209
|
* @returns An iterable object that enumerates the IntervalCollection labels.
|
|
186
210
|
*
|
|
187
211
|
* @example
|
|
212
|
+
*
|
|
188
213
|
* ```typescript
|
|
189
214
|
* const iter = this.getIntervalCollectionKeys();
|
|
190
215
|
* for (key of iter)
|
|
@@ -250,4 +275,8 @@ export declare abstract class SharedSegmentSequence<T extends ISegment> extends
|
|
|
250
275
|
private loadFinished;
|
|
251
276
|
private initializeIntervalCollections;
|
|
252
277
|
}
|
|
278
|
+
/**
|
|
279
|
+
* Resets the reentrancy log counter. Test-only API.
|
|
280
|
+
*/
|
|
281
|
+
export declare function resetReentrancyLogCounter(): void;
|
|
253
282
|
//# sourceMappingURL=sequence.d.ts.map
|
package/dist/sequence.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../src/sequence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../src/sequence.ts"],"names":[],"mappings":"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"}
|
package/dist/sequence.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SharedSegmentSequence = void 0;
|
|
3
|
+
exports.resetReentrancyLogCounter = exports.SharedSegmentSequence = void 0;
|
|
4
4
|
/*!
|
|
5
5
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
6
6
|
* Licensed under the MIT License.
|
|
7
7
|
*/
|
|
8
|
-
const
|
|
8
|
+
const core_utils_1 = require("@fluidframework/core-utils");
|
|
9
|
+
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
9
10
|
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
10
11
|
const protocol_definitions_1 = require("@fluidframework/protocol-definitions");
|
|
11
12
|
const merge_tree_1 = require("@fluidframework/merge-tree");
|
|
@@ -23,19 +24,35 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
23
24
|
this.id = id;
|
|
24
25
|
this.segmentFromSpec = segmentFromSpec;
|
|
25
26
|
/** `Deferred` that triggers once the object is loaded */
|
|
26
|
-
this.loadedDeferred = new
|
|
27
|
+
this.loadedDeferred = new core_utils_1.Deferred();
|
|
27
28
|
// cache out going ops created when partial loading
|
|
28
29
|
this.loadedDeferredOutgoingOps = [];
|
|
29
30
|
// cache incoming ops that arrive when partial loading
|
|
30
31
|
this.deferIncomingOps = true;
|
|
31
32
|
this.loadedDeferredIncomingOps = [];
|
|
32
33
|
this.messagesSinceMSNChange = [];
|
|
34
|
+
this.guardReentrancy =
|
|
35
|
+
dataStoreRuntime.options.sharedStringPreventReentrancy ?? true
|
|
36
|
+
? ensureNoReentrancy
|
|
37
|
+
: createReentrancyDetector((depth) => {
|
|
38
|
+
if (totalReentrancyLogs > 0) {
|
|
39
|
+
totalReentrancyLogs--;
|
|
40
|
+
this.logger.sendTelemetryEvent({ eventName: "LocalOpReentry", depth }, new telemetry_utils_1.LoggingError(reentrancyErrorMessage));
|
|
41
|
+
}
|
|
42
|
+
});
|
|
33
43
|
this.loadedDeferred.promise.catch((error) => {
|
|
34
44
|
this.logger.sendErrorEvent({ eventName: "SequenceLoadFailed" }, error);
|
|
35
45
|
});
|
|
36
|
-
this.client = new merge_tree_1.Client(segmentFromSpec,
|
|
37
|
-
|
|
38
|
-
|
|
46
|
+
this.client = new merge_tree_1.Client(segmentFromSpec, (0, telemetry_utils_1.createChildLogger)({
|
|
47
|
+
logger: this.logger,
|
|
48
|
+
namespace: "SharedSegmentSequence.MergeTreeClient",
|
|
49
|
+
}), dataStoreRuntime.options);
|
|
50
|
+
this.client.prependListener("delta", (opArgs, deltaArgs) => {
|
|
51
|
+
const event = new sequenceDeltaEvent_1.SequenceDeltaEvent(opArgs, deltaArgs, this.client);
|
|
52
|
+
if (opArgs.stashed !== true && event.isLocal) {
|
|
53
|
+
this.submitSequenceMessage(opArgs.op);
|
|
54
|
+
}
|
|
55
|
+
this.emit("sequenceDelta", event, this);
|
|
39
56
|
});
|
|
40
57
|
this.client.on("maintenance", (args, opArgs) => {
|
|
41
58
|
this.emit("maintenance", new sequenceDeltaEvent_1.SequenceMaintenanceEvent(opArgs, args, this.client), this);
|
|
@@ -46,7 +63,6 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
46
63
|
return this.loadedDeferred.promise;
|
|
47
64
|
}
|
|
48
65
|
static createOpsFromDelta(event) {
|
|
49
|
-
var _a, _b;
|
|
50
66
|
const ops = [];
|
|
51
67
|
for (const r of event.ranges) {
|
|
52
68
|
switch (event.deltaOperation) {
|
|
@@ -54,7 +70,7 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
54
70
|
const lastAnnotate = ops[ops.length - 1];
|
|
55
71
|
const props = {};
|
|
56
72
|
for (const key of Object.keys(r.propertyDeltas)) {
|
|
57
|
-
props[key] =
|
|
73
|
+
props[key] = r.segment.properties?.[key] ?? null;
|
|
58
74
|
}
|
|
59
75
|
if (lastAnnotate &&
|
|
60
76
|
lastAnnotate.pos2 === r.position &&
|
|
@@ -71,8 +87,8 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
71
87
|
break;
|
|
72
88
|
case merge_tree_1.MergeTreeDeltaType.REMOVE: {
|
|
73
89
|
const lastRem = ops[ops.length - 1];
|
|
74
|
-
if (
|
|
75
|
-
(0,
|
|
90
|
+
if (lastRem?.pos1 === r.position) {
|
|
91
|
+
(0, core_utils_1.assert)(lastRem.pos2 !== undefined, 0x3ff /* pos2 should not be undefined here */);
|
|
76
92
|
lastRem.pos2 += r.segment.cachedLength;
|
|
77
93
|
}
|
|
78
94
|
else {
|
|
@@ -90,13 +106,13 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
90
106
|
* @param end - The exclusive end of the range to remove
|
|
91
107
|
*/
|
|
92
108
|
removeRange(start, end) {
|
|
93
|
-
|
|
94
|
-
this.submitSequenceMessage(removeOp);
|
|
95
|
-
return removeOp;
|
|
109
|
+
return this.guardReentrancy(() => this.client.removeRangeLocal(start, end));
|
|
96
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* @deprecated - The ability to create group ops will be removed in an upcoming release, as group ops are redundant with the native batching capabilities of the runtime
|
|
113
|
+
*/
|
|
97
114
|
groupOperation(groupOp) {
|
|
98
|
-
this.client.localTransaction(groupOp);
|
|
99
|
-
this.submitSequenceMessage(groupOp);
|
|
115
|
+
this.guardReentrancy(() => this.client.localTransaction(groupOp));
|
|
100
116
|
}
|
|
101
117
|
/**
|
|
102
118
|
* Finds the segment information (i.e. segment + offset) corresponding to a character position in the SharedString.
|
|
@@ -130,10 +146,7 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
130
146
|
*
|
|
131
147
|
*/
|
|
132
148
|
annotateRange(start, end, props, combiningOp) {
|
|
133
|
-
|
|
134
|
-
if (annotateOp) {
|
|
135
|
-
this.submitSequenceMessage(annotateOp);
|
|
136
|
-
}
|
|
149
|
+
this.guardReentrancy(() => this.client.annotateRangeLocal(start, end, props, combiningOp));
|
|
137
150
|
}
|
|
138
151
|
getPropertiesAtPosition(pos) {
|
|
139
152
|
return this.client.getPropertiesAtPosition(pos);
|
|
@@ -181,6 +194,9 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
181
194
|
resolveRemoteClientPosition(remoteClientPosition, remoteClientRefSeq, remoteClientId) {
|
|
182
195
|
return this.client.resolveRemoteClientPosition(remoteClientPosition, remoteClientRefSeq, remoteClientId);
|
|
183
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* @deprecated - This method will no longer be public in an upcoming release as it is not safe to use outside of this class
|
|
199
|
+
*/
|
|
184
200
|
submitSequenceMessage(message) {
|
|
185
201
|
if (!this.isAttached()) {
|
|
186
202
|
return;
|
|
@@ -221,11 +237,14 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
221
237
|
walkSegments(handler, start, end, accum, splitRange = false) {
|
|
222
238
|
this.client.walkSegments(handler, start, end, accum, splitRange);
|
|
223
239
|
}
|
|
240
|
+
/**
|
|
241
|
+
* @deprecated - this functionality is no longer supported and will be removed
|
|
242
|
+
*/
|
|
224
243
|
getStackContext(startPos, rangeLabels) {
|
|
225
244
|
return this.client.getStackContext(startPos, rangeLabels);
|
|
226
245
|
}
|
|
227
246
|
/**
|
|
228
|
-
* @returns
|
|
247
|
+
* @returns The most recent sequence number which has been acked by the server and processed by this
|
|
229
248
|
* SharedSegmentSequence.
|
|
230
249
|
*/
|
|
231
250
|
getCurrentSeq() {
|
|
@@ -237,10 +256,7 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
237
256
|
* @param segment - The segment to insert
|
|
238
257
|
*/
|
|
239
258
|
insertAtReferencePosition(pos, segment) {
|
|
240
|
-
|
|
241
|
-
if (insertOp) {
|
|
242
|
-
this.submitSequenceMessage(insertOp);
|
|
243
|
-
}
|
|
259
|
+
this.guardReentrancy(() => this.client.insertAtReferencePositionLocal(pos, segment));
|
|
244
260
|
}
|
|
245
261
|
/**
|
|
246
262
|
* Inserts a segment
|
|
@@ -249,10 +265,7 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
249
265
|
*/
|
|
250
266
|
insertFromSpec(pos, spec) {
|
|
251
267
|
const segment = this.segmentFromSpec(spec);
|
|
252
|
-
|
|
253
|
-
if (insertOp) {
|
|
254
|
-
this.submitSequenceMessage(insertOp);
|
|
255
|
-
}
|
|
268
|
+
this.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));
|
|
256
269
|
}
|
|
257
270
|
/**
|
|
258
271
|
* Retrieves the interval collection keyed on `label`. If no such interval collection exists,
|
|
@@ -265,6 +278,7 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
265
278
|
* @returns An iterable object that enumerates the IntervalCollection labels.
|
|
266
279
|
*
|
|
267
280
|
* @example
|
|
281
|
+
*
|
|
268
282
|
* ```typescript
|
|
269
283
|
* const iter = this.getIntervalCollectionKeys();
|
|
270
284
|
* for (key of iter)
|
|
@@ -314,12 +328,7 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
314
328
|
const insert = this.client.insertSegmentLocal(insertIndex, segment);
|
|
315
329
|
if (insert) {
|
|
316
330
|
if (start < end) {
|
|
317
|
-
|
|
318
|
-
const op = remove ? (0, merge_tree_1.createGroupOp)(insert, remove) : insert;
|
|
319
|
-
this.submitSequenceMessage(op);
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
this.submitSequenceMessage(insert);
|
|
331
|
+
this.client.removeRangeLocal(start, end);
|
|
323
332
|
}
|
|
324
333
|
}
|
|
325
334
|
}
|
|
@@ -346,10 +355,9 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
346
355
|
* {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}
|
|
347
356
|
*/
|
|
348
357
|
async loadCore(storage) {
|
|
349
|
-
var _a;
|
|
350
358
|
if (await storage.contains(snapshotFileName)) {
|
|
351
359
|
const blob = await storage.readBlob(snapshotFileName);
|
|
352
|
-
const header = (0,
|
|
360
|
+
const header = (0, client_utils_1.bufferToString)(blob, "utf8");
|
|
353
361
|
this.intervalCollections.populate(header);
|
|
354
362
|
}
|
|
355
363
|
try {
|
|
@@ -386,7 +394,7 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
386
394
|
.catch((error) => {
|
|
387
395
|
this.loadFinished(error);
|
|
388
396
|
});
|
|
389
|
-
if (
|
|
397
|
+
if (this.dataStoreRuntime.options?.sequenceInitializeFromHeaderOnly !== true) {
|
|
390
398
|
// if we not doing partial load, await the catch up ops,
|
|
391
399
|
// and the finalization of the load
|
|
392
400
|
await loadCatchUpOps;
|
|
@@ -403,11 +411,11 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
403
411
|
// if loading isn't complete, we need to cache all
|
|
404
412
|
// incoming ops to be applied after loading is complete
|
|
405
413
|
if (this.deferIncomingOps) {
|
|
406
|
-
(0,
|
|
414
|
+
(0, core_utils_1.assert)(!local, 0x072 /* "Unexpected local op when loading not finished" */);
|
|
407
415
|
this.loadedDeferredIncomingOps.push(message);
|
|
408
416
|
}
|
|
409
417
|
else {
|
|
410
|
-
(0,
|
|
418
|
+
(0, core_utils_1.assert)(message.type === protocol_definitions_1.MessageType.Operation, 0x073 /* "Sequence message not operation" */);
|
|
411
419
|
const handled = this.intervalCollections.tryProcessMessage(message.contents, local, message, localOpMetadata);
|
|
412
420
|
if (!handled) {
|
|
413
421
|
this.processMergeTreeMsg(message, local);
|
|
@@ -418,11 +426,10 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
418
426
|
* {@inheritDoc @fluidframework/shared-object-base#SharedObject.didAttach}
|
|
419
427
|
*/
|
|
420
428
|
didAttach() {
|
|
421
|
-
var _a;
|
|
422
429
|
// If we are not local, and we've attached we need to start generating and sending ops
|
|
423
430
|
// so start collaboration and provide a default client id incase we are not connected
|
|
424
431
|
if (this.isAttached()) {
|
|
425
|
-
this.client.startOrUpdateCollaboration(
|
|
432
|
+
this.client.startOrUpdateCollaboration(this.runtime.clientId ?? "attached");
|
|
426
433
|
}
|
|
427
434
|
}
|
|
428
435
|
/**
|
|
@@ -440,7 +447,7 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
440
447
|
}
|
|
441
448
|
summarizeMergeTree(serializer) {
|
|
442
449
|
// Are we fully loaded? If not, things will go south
|
|
443
|
-
(0,
|
|
450
|
+
(0, core_utils_1.assert)(this.loadedDeferred.isCompleted, 0x074 /* "Snapshot called when not fully loaded" */);
|
|
444
451
|
const minSeq = this.runtime.deltaManager.minimumSequenceNumber;
|
|
445
452
|
this.processMinSequenceNumberChanged(minSeq);
|
|
446
453
|
this.messagesSinceMSNChange.forEach((m) => {
|
|
@@ -449,7 +456,6 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
449
456
|
return this.client.summarize(this.runtime, this.handle, serializer, this.messagesSinceMSNChange);
|
|
450
457
|
}
|
|
451
458
|
processMergeTreeMsg(rawMessage, local) {
|
|
452
|
-
var _a, _b;
|
|
453
459
|
const message = (0, shared_object_base_1.parseHandles)(rawMessage, this.serializer);
|
|
454
460
|
const ops = [];
|
|
455
461
|
function transformOps(event) {
|
|
@@ -457,18 +463,23 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
457
463
|
}
|
|
458
464
|
const needsTransformation = message.referenceSequenceNumber !== message.sequenceNumber - 1;
|
|
459
465
|
let stashMessage = message;
|
|
460
|
-
if (
|
|
466
|
+
if (this.runtime.options?.newMergeTreeSnapshotFormat !== true) {
|
|
461
467
|
if (needsTransformation) {
|
|
462
468
|
this.on("sequenceDelta", transformOps);
|
|
463
469
|
}
|
|
464
470
|
}
|
|
465
471
|
this.client.applyMsg(message, local);
|
|
466
|
-
if (
|
|
472
|
+
if (this.runtime.options?.newMergeTreeSnapshotFormat !== true) {
|
|
467
473
|
if (needsTransformation) {
|
|
468
474
|
this.removeListener("sequenceDelta", transformOps);
|
|
469
475
|
// shallow clone the message as we only overwrite top level properties,
|
|
470
476
|
// like referenceSequenceNumber and content only
|
|
471
|
-
stashMessage =
|
|
477
|
+
stashMessage = {
|
|
478
|
+
...message,
|
|
479
|
+
referenceSequenceNumber: stashMessage.sequenceNumber - 1,
|
|
480
|
+
// eslint-disable-next-line import/no-deprecated
|
|
481
|
+
contents: ops.length !== 1 ? (0, merge_tree_1.createGroupOp)(...ops) : ops[0],
|
|
482
|
+
};
|
|
472
483
|
}
|
|
473
484
|
this.messagesSinceMSNChange.push(stashMessage);
|
|
474
485
|
// Do GC every once in a while...
|
|
@@ -523,7 +534,7 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
523
534
|
if (!intervalCollection.attached) {
|
|
524
535
|
intervalCollection.attachGraph(this.client, key);
|
|
525
536
|
}
|
|
526
|
-
(0,
|
|
537
|
+
(0, core_utils_1.assert)(previousValue === undefined, 0x2c1 /* "Creating an interval collection that already exists?" */);
|
|
527
538
|
this.emit("createIntervalCollection", key, local, this);
|
|
528
539
|
});
|
|
529
540
|
// Initialize existing SharedIntervalCollections
|
|
@@ -534,4 +545,37 @@ class SharedSegmentSequence extends shared_object_base_1.SharedObject {
|
|
|
534
545
|
}
|
|
535
546
|
}
|
|
536
547
|
exports.SharedSegmentSequence = SharedSegmentSequence;
|
|
548
|
+
function createReentrancyDetector(onReentrancy) {
|
|
549
|
+
let depth = 0;
|
|
550
|
+
function detectReentrancy(callback) {
|
|
551
|
+
if (depth > 0) {
|
|
552
|
+
onReentrancy(depth);
|
|
553
|
+
}
|
|
554
|
+
depth++;
|
|
555
|
+
try {
|
|
556
|
+
return callback();
|
|
557
|
+
}
|
|
558
|
+
finally {
|
|
559
|
+
depth--;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
return detectReentrancy;
|
|
563
|
+
}
|
|
564
|
+
/**
|
|
565
|
+
* Apps which generate reentrant behavior may do so at a high frequency.
|
|
566
|
+
* Logging even per-SharedSegmentSequence instance might be too noisy, and having a few logs from a session
|
|
567
|
+
* is likely enough.
|
|
568
|
+
*/
|
|
569
|
+
let totalReentrancyLogs = 3;
|
|
570
|
+
/**
|
|
571
|
+
* Resets the reentrancy log counter. Test-only API.
|
|
572
|
+
*/
|
|
573
|
+
function resetReentrancyLogCounter() {
|
|
574
|
+
totalReentrancyLogs = 3;
|
|
575
|
+
}
|
|
576
|
+
exports.resetReentrancyLogCounter = resetReentrancyLogCounter;
|
|
577
|
+
const reentrancyErrorMessage = "Reentrancy detected in sequence local ops";
|
|
578
|
+
const ensureNoReentrancy = createReentrancyDetector(() => {
|
|
579
|
+
throw new telemetry_utils_1.LoggingError(reentrancyErrorMessage);
|
|
580
|
+
});
|
|
537
581
|
//# sourceMappingURL=sequence.js.map
|