@fluidframework/sequence 2.43.0-343119 → 2.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/api-report/sequence.legacy.alpha.api.md +2 -2
  3. package/dist/intervalCollection.d.ts +4 -9
  4. package/dist/intervalCollection.d.ts.map +1 -1
  5. package/dist/intervalCollection.js +96 -82
  6. package/dist/intervalCollection.js.map +1 -1
  7. package/dist/intervalCollectionMap.d.ts +1 -1
  8. package/dist/intervalCollectionMap.d.ts.map +1 -1
  9. package/dist/intervalCollectionMap.js +2 -2
  10. package/dist/intervalCollectionMap.js.map +1 -1
  11. package/dist/intervalCollectionMapInterfaces.d.ts +13 -6
  12. package/dist/intervalCollectionMapInterfaces.d.ts.map +1 -1
  13. package/dist/intervalCollectionMapInterfaces.js.map +1 -1
  14. package/dist/intervals/intervalUtils.d.ts +4 -3
  15. package/dist/intervals/intervalUtils.d.ts.map +1 -1
  16. package/dist/intervals/intervalUtils.js +16 -3
  17. package/dist/intervals/intervalUtils.js.map +1 -1
  18. package/dist/intervals/sequenceInterval.d.ts +21 -7
  19. package/dist/intervals/sequenceInterval.d.ts.map +1 -1
  20. package/dist/intervals/sequenceInterval.js +88 -16
  21. package/dist/intervals/sequenceInterval.js.map +1 -1
  22. package/dist/packageVersion.d.ts +1 -1
  23. package/dist/packageVersion.d.ts.map +1 -1
  24. package/dist/packageVersion.js +1 -1
  25. package/dist/packageVersion.js.map +1 -1
  26. package/dist/sequence.js +1 -1
  27. package/dist/sequence.js.map +1 -1
  28. package/lib/intervalCollection.d.ts +4 -9
  29. package/lib/intervalCollection.d.ts.map +1 -1
  30. package/lib/intervalCollection.js +98 -82
  31. package/lib/intervalCollection.js.map +1 -1
  32. package/lib/intervalCollectionMap.d.ts +1 -1
  33. package/lib/intervalCollectionMap.d.ts.map +1 -1
  34. package/lib/intervalCollectionMap.js +2 -2
  35. package/lib/intervalCollectionMap.js.map +1 -1
  36. package/lib/intervalCollectionMapInterfaces.d.ts +13 -6
  37. package/lib/intervalCollectionMapInterfaces.d.ts.map +1 -1
  38. package/lib/intervalCollectionMapInterfaces.js.map +1 -1
  39. package/lib/intervals/intervalUtils.d.ts +4 -3
  40. package/lib/intervals/intervalUtils.d.ts.map +1 -1
  41. package/lib/intervals/intervalUtils.js +15 -3
  42. package/lib/intervals/intervalUtils.js.map +1 -1
  43. package/lib/intervals/sequenceInterval.d.ts +21 -7
  44. package/lib/intervals/sequenceInterval.d.ts.map +1 -1
  45. package/lib/intervals/sequenceInterval.js +88 -16
  46. package/lib/intervals/sequenceInterval.js.map +1 -1
  47. package/lib/packageVersion.d.ts +1 -1
  48. package/lib/packageVersion.d.ts.map +1 -1
  49. package/lib/packageVersion.js +1 -1
  50. package/lib/packageVersion.js.map +1 -1
  51. package/lib/sequence.js +1 -1
  52. package/lib/sequence.js.map +1 -1
  53. package/package.json +18 -18
  54. package/src/intervalCollection.ts +122 -142
  55. package/src/intervalCollectionMap.ts +6 -2
  56. package/src/intervalCollectionMapInterfaces.ts +15 -5
  57. package/src/intervals/intervalUtils.ts +31 -3
  58. package/src/intervals/sequenceInterval.ts +135 -72
  59. package/src/packageVersion.ts +1 -1
  60. package/src/sequence.ts +1 -1
@@ -35,14 +35,13 @@ import {
35
35
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
36
36
  import { v4 as uuid } from "uuid";
37
37
 
38
- import { computeStickinessFromSide } from "../intervalCollection.js";
39
-
40
38
  import {
41
39
  // eslint-disable-next-line import/no-deprecated
42
40
  ISerializableInterval,
43
41
  ISerializedInterval,
44
42
  IntervalStickiness,
45
43
  IntervalType,
44
+ computeStickinessFromSide,
46
45
  endReferenceSlidingPreference,
47
46
  startReferenceSlidingPreference,
48
47
  type SerializedIntervalDelta,
@@ -180,7 +179,7 @@ export interface SequenceInterval extends ISerializableInterval {
180
179
  end: SequencePlace | undefined,
181
180
  op?: ISequencedDocumentMessage,
182
181
  localSeq?: number,
183
- useNewSlidingBehavior?: boolean,
182
+ canSlideToEndpoint?: boolean,
184
183
  ): SequenceInterval | undefined;
185
184
  /**
186
185
  * @returns whether this interval overlaps with `b`.
@@ -498,6 +497,38 @@ export class SequenceIntervalClass implements SequenceInterval, ISerializableInt
498
497
  return endPos > bstart && startPos < bend;
499
498
  }
500
499
 
500
+ public moveEndpointReferences(
501
+ rebased: Partial<Record<"start" | "end", { segment: ISegment; offset: number }>>,
502
+ ) {
503
+ if (rebased.start) {
504
+ const startRef = createPositionReferenceFromSegoff({
505
+ client: this.client,
506
+ segoff: rebased.start,
507
+ refType: this.start.refType,
508
+ slidingPreference: this.start.slidingPreference,
509
+ canSlideToEndpoint: this.start.canSlideToEndpoint,
510
+ });
511
+ if (this.start.properties) {
512
+ startRef.addProperties(this.start.properties);
513
+ }
514
+ this.start = startRef;
515
+ }
516
+
517
+ if (rebased.end) {
518
+ const endRef = createPositionReferenceFromSegoff({
519
+ client: this.client,
520
+ segoff: rebased.end,
521
+ refType: this.end.refType,
522
+ slidingPreference: this.end.slidingPreference,
523
+ canSlideToEndpoint: this.end.canSlideToEndpoint,
524
+ });
525
+ if (this.end.properties) {
526
+ endRef.addProperties(this.end.properties);
527
+ }
528
+ this.end = endRef;
529
+ }
530
+ }
531
+
501
532
  /**
502
533
  * {@inheritDoc IInterval.modify}
503
534
  */
@@ -507,17 +538,9 @@ export class SequenceIntervalClass implements SequenceInterval, ISerializableInt
507
538
  end: SequencePlace | undefined,
508
539
  op?: ISequencedDocumentMessage,
509
540
  localSeq?: number,
510
- useNewSlidingBehavior: boolean = false,
541
+ canSlideToEndpoint: boolean = false,
511
542
  ) {
512
543
  const { startSide, endSide, startPos, endPos } = endpointPosAndSide(start, end);
513
- const startSegment: ISegmentInternal | undefined = this.start.getSegment();
514
- const endSegment: ISegmentInternal | undefined = this.end.getSegment();
515
- const stickiness = computeStickinessFromSide(
516
- startPos ?? startSegment?.endpointType,
517
- startSide ?? this.startSide,
518
- endPos ?? endSegment?.endpointType,
519
- endSide ?? this.endSide,
520
- );
521
544
  const getRefType = (baseType: ReferenceType): ReferenceType => {
522
545
  let refType = baseType;
523
546
  if (op === undefined) {
@@ -529,17 +552,22 @@ export class SequenceIntervalClass implements SequenceInterval, ISerializableInt
529
552
 
530
553
  let startRef = this.start;
531
554
  if (startPos !== undefined) {
532
- startRef = createPositionReference(
533
- this.client,
555
+ const slidingPreference = startReferenceSlidingPreference(
534
556
  startPos,
535
- getRefType(this.start.refType),
557
+ startSide ?? Side.Before,
558
+ endPos,
559
+ endSide ?? Side.Before,
560
+ );
561
+ startRef = createPositionReference({
562
+ client: this.client,
563
+ pos: startPos,
564
+ refType: getRefType(this.start.refType),
536
565
  op,
537
- undefined,
538
566
  localSeq,
539
- startReferenceSlidingPreference(stickiness),
540
- startReferenceSlidingPreference(stickiness) === SlidingPreference.BACKWARD,
541
- useNewSlidingBehavior,
542
- );
567
+ slidingPreference,
568
+ canSlideToEndpoint:
569
+ canSlideToEndpoint && slidingPreference === SlidingPreference.BACKWARD,
570
+ });
543
571
  if (this.start.properties) {
544
572
  startRef.addProperties(this.start.properties);
545
573
  }
@@ -547,17 +575,22 @@ export class SequenceIntervalClass implements SequenceInterval, ISerializableInt
547
575
 
548
576
  let endRef = this.end;
549
577
  if (endPos !== undefined) {
550
- endRef = createPositionReference(
551
- this.client,
578
+ const slidingPreference = endReferenceSlidingPreference(
579
+ startPos,
580
+ startSide ?? Side.Before,
552
581
  endPos,
553
- getRefType(this.end.refType),
582
+ endSide ?? Side.Before,
583
+ );
584
+ endRef = createPositionReference({
585
+ client: this.client,
586
+ pos: endPos,
587
+ refType: getRefType(this.end.refType),
554
588
  op,
555
- undefined,
556
589
  localSeq,
557
- endReferenceSlidingPreference(stickiness),
558
- endReferenceSlidingPreference(stickiness) === SlidingPreference.FORWARD,
559
- useNewSlidingBehavior,
560
- );
590
+ slidingPreference,
591
+ canSlideToEndpoint:
592
+ canSlideToEndpoint && slidingPreference === SlidingPreference.FORWARD,
593
+ });
561
594
  if (this.end.properties) {
562
595
  endRef.addProperties(this.end.properties);
563
596
  }
@@ -587,17 +620,27 @@ export class SequenceIntervalClass implements SequenceInterval, ISerializableInt
587
620
  }
588
621
  }
589
622
 
590
- export function createPositionReferenceFromSegoff(
591
- client: Client,
592
- segoff: { segment: ISegment; offset: number } | undefined | "start" | "end",
593
- refType: ReferenceType,
594
- op?: ISequencedDocumentMessage,
595
- localSeq?: number,
596
- fromSnapshot?: boolean,
597
- slidingPreference?: SlidingPreference,
598
- canSlideToEndpoint?: boolean,
599
- rollback?: boolean,
600
- ): LocalReferencePosition {
623
+ export function createPositionReferenceFromSegoff({
624
+ client,
625
+ segoff,
626
+ refType,
627
+ op,
628
+ localSeq,
629
+ fromSnapshot,
630
+ slidingPreference,
631
+ canSlideToEndpoint,
632
+ rollback,
633
+ }: {
634
+ client: Client;
635
+ segoff: { segment: ISegment; offset: number } | undefined | "start" | "end";
636
+ refType: ReferenceType;
637
+ op?: ISequencedDocumentMessage;
638
+ localSeq?: number;
639
+ fromSnapshot?: boolean;
640
+ slidingPreference: SlidingPreference | undefined;
641
+ canSlideToEndpoint: boolean | undefined;
642
+ rollback?: boolean;
643
+ }): LocalReferencePosition {
601
644
  if (segoff === "start" || segoff === "end") {
602
645
  return client.createLocalReferencePosition(
603
646
  segoff,
@@ -639,18 +682,27 @@ export function createPositionReferenceFromSegoff(
639
682
  return createDetachedLocalReferencePosition(slidingPreference, refType);
640
683
  }
641
684
 
642
- function createPositionReference(
643
- client: Client,
644
- pos: number | "start" | "end",
645
- refType: ReferenceType,
646
- op?: ISequencedDocumentMessage,
647
- fromSnapshot?: boolean,
648
- localSeq?: number,
649
- slidingPreference?: SlidingPreference,
650
- exclusive: boolean = false,
651
- useNewSlidingBehavior: boolean = false,
652
- rollback?: boolean,
653
- ): LocalReferencePosition {
685
+ function createPositionReference({
686
+ client,
687
+ pos,
688
+ refType,
689
+ op,
690
+ fromSnapshot,
691
+ localSeq,
692
+ slidingPreference,
693
+ canSlideToEndpoint,
694
+ rollback,
695
+ }: {
696
+ client: Client;
697
+ pos: number | "start" | "end";
698
+ refType: ReferenceType;
699
+ op?: ISequencedDocumentMessage;
700
+ fromSnapshot?: boolean;
701
+ localSeq?: number;
702
+ slidingPreference: SlidingPreference;
703
+ canSlideToEndpoint: boolean;
704
+ rollback?: boolean;
705
+ }): LocalReferencePosition {
654
706
  let segoff;
655
707
 
656
708
  if (op) {
@@ -665,7 +717,7 @@ function createPositionReference(
665
717
  referenceSequenceNumber: op.referenceSequenceNumber,
666
718
  clientId: op.clientId,
667
719
  });
668
- segoff = getSlideToSegoff(segoff, slidingPreference, undefined, useNewSlidingBehavior);
720
+ segoff = getSlideToSegoff(segoff, slidingPreference, undefined, canSlideToEndpoint);
669
721
  }
670
722
  } else {
671
723
  assert(
@@ -678,7 +730,7 @@ function createPositionReference(
678
730
  : client.getContainingSegment(pos, undefined, localSeq);
679
731
  }
680
732
 
681
- return createPositionReferenceFromSegoff(
733
+ return createPositionReferenceFromSegoff({
682
734
  client,
683
735
  segoff,
684
736
  refType,
@@ -686,9 +738,9 @@ function createPositionReference(
686
738
  localSeq,
687
739
  fromSnapshot,
688
740
  slidingPreference,
689
- exclusive,
741
+ canSlideToEndpoint,
690
742
  rollback,
691
- );
743
+ });
692
744
  }
693
745
 
694
746
  export function createTransientInterval(
@@ -715,7 +767,7 @@ export function createSequenceInterval(
715
767
  intervalType: IntervalType,
716
768
  op?: ISequencedDocumentMessage,
717
769
  fromSnapshot?: boolean,
718
- useNewSlidingBehavior: boolean = false,
770
+ canSlideToEndpoint: boolean = false,
719
771
  props?: PropertySet,
720
772
  rollback?: boolean,
721
773
  ): SequenceIntervalClass {
@@ -730,7 +782,6 @@ export function createSequenceInterval(
730
782
  endSide !== undefined,
731
783
  0x794 /* start and end cannot be undefined because they were not passed in as undefined */,
732
784
  );
733
- const stickiness = computeStickinessFromSide(startPos, startSide, endPos, endSide);
734
785
  let beginRefType = ReferenceType.RangeBegin;
735
786
  let endRefType = ReferenceType.RangeEnd;
736
787
  if (intervalType === IntervalType.Transient) {
@@ -749,31 +800,43 @@ export function createSequenceInterval(
749
800
  }
750
801
  }
751
802
 
752
- const startLref = createPositionReference(
753
- client,
803
+ const stickiness = computeStickinessFromSide(startPos, startSide, endPos, endSide);
804
+
805
+ const startSlidingPreference = startReferenceSlidingPreference(
754
806
  startPos,
755
- beginRefType,
807
+ startSide,
808
+ endPos,
809
+ endSide,
810
+ );
811
+
812
+ const startLref = createPositionReference({
813
+ client,
814
+ pos: startPos,
815
+ refType: beginRefType,
756
816
  op,
757
817
  fromSnapshot,
758
- undefined,
759
- startReferenceSlidingPreference(stickiness),
760
- startReferenceSlidingPreference(stickiness) === SlidingPreference.BACKWARD,
761
- useNewSlidingBehavior,
818
+ slidingPreference: startSlidingPreference,
819
+ canSlideToEndpoint: canSlideToEndpoint && stickiness !== IntervalStickiness.NONE,
762
820
  rollback,
821
+ });
822
+
823
+ const endSlidingPreference = endReferenceSlidingPreference(
824
+ startPos,
825
+ startSide,
826
+ endPos,
827
+ endSide,
763
828
  );
764
829
 
765
- const endLref = createPositionReference(
830
+ const endLref = createPositionReference({
766
831
  client,
767
- endPos,
768
- endRefType,
832
+ pos: endPos,
833
+ refType: endRefType,
769
834
  op,
770
835
  fromSnapshot,
771
- undefined,
772
- endReferenceSlidingPreference(stickiness),
773
- endReferenceSlidingPreference(stickiness) === SlidingPreference.FORWARD,
774
- useNewSlidingBehavior,
836
+ slidingPreference: endSlidingPreference,
837
+ canSlideToEndpoint: canSlideToEndpoint && stickiness !== IntervalStickiness.NONE,
775
838
  rollback,
776
- );
839
+ });
777
840
 
778
841
  const rangeProp = {
779
842
  [reservedRangeLabelsKey]: [label],
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/sequence";
9
- export const pkgVersion = "2.43.0-343119";
9
+ export const pkgVersion = "2.43.0";
package/src/sequence.ts CHANGED
@@ -782,7 +782,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
782
782
  0x8bb /* Expected a recorded refSeq when resubmitting an op */,
783
783
  );
784
784
  this.useResubmitRefSeq(originalRefSeq, () => {
785
- if (!this.intervalCollections.tryResubmitMessage(content, localOpMetadata)) {
785
+ if (!this.intervalCollections.tryResubmitMessage(content, localOpMetadata, squash)) {
786
786
  this.submitSequenceMessage(
787
787
  this.client.regeneratePendingOp(content as IMergeTreeOp, localOpMetadata, squash),
788
788
  );