@fluidframework/merge-tree 1.0.1 → 1.1.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.
@@ -80,9 +80,54 @@ To implement an operation which creates LocalReferences which will be have an ev
80
80
  3. Delete the old reference and create a new one with the returned values
81
81
  4. Remote clients, on receiving the op, call `Client.getContainingSegment` followed by `Client.getSlideToSegment`
82
82
  on the result. Call `Client.createLocalReferencePosition` with the result to create a `SlideOnRemove` reference.
83
+ 5. If there is a dependency on the comparison of reference positions (such as the index in IntervalCollections)
84
+ must listen to the `beforeSlide` and `afterSlide` events on `IReferencePositionEvents`. When slide occurs the
85
+ relative position of references may have changed.
83
86
 
84
87
  ### Implementation Notes
85
88
 
89
+ This is the state diagram for the implementation of Eventually Consistent References.
90
+
91
+ ```mermaid
92
+ flowchart LR
93
+ subgraph StayOnRemove
94
+ localCreate[Local Create Ref]
95
+ pendingRef(("Ref:StayOnRemove\nSegment:Pending|Normal"))
96
+ pendingRefPendingRemove((Ref:StayOnRemove\nSegment:Pending Remove))
97
+ pendingRefRemoved((Ref:StayOnRemove\nSegment:Removed))
98
+ localCreate-->pendingRef
99
+ pendingRef--local remove-->pendingRefPendingRemove
100
+ pendingRefPendingRemove--remote remove-->pendingRefRemoved
101
+ pendingRef--remote remove-->pendingRefRemoved
102
+ end
103
+
104
+ subgraph SlideOnRemove
105
+ remoteCreate[Remote Create Ref]
106
+ remoteChoice{Segment Removed?}
107
+ ref((Ref:SlideOnRemove\nSegment:Normal))
108
+ refPendingRemove((Ref:SlideOnRemove\nSegment:Pending Remove))
109
+
110
+ remoteCreate-->remoteChoice
111
+ remoteChoice--no-->ref
112
+ remoteChoice--locally-->refPendingRemove
113
+ ref--local remove-->refPendingRemove
114
+ end
115
+
116
+ slide{Slide To}
117
+ detached((Ref:Detached))
118
+
119
+ pendingRef--create ack-->ref
120
+ pendingRefPendingRemove--create ack-->refPendingRemove
121
+ pendingRefRemoved--create ack-->slide
122
+ remoteChoice--yes-->slide
123
+ ref--remote remove-->slide
124
+ refPendingRemove--remove ack-->slide
125
+ refPendingRemove--remote remove-->slide
126
+ slide--segment-->ref
127
+ slide--locally removed segment-->refPendingRemove
128
+ slide--no segment-->detached
129
+ ```
130
+
86
131
  This algorithm works because it ensures that slid reference slide to the same segment.
87
132
  The slide only happens when both the creation of the reference and removal of the segment have been acknowledged.
88
133
  When sliding we do not consider any local (unacknowledged) ops.
@@ -115,6 +160,33 @@ Slide on receiving the remote create.
115
160
  7. Local remove before remote create. Slide on receiving the create.
116
161
  8. Remote remove before local create. Slide on receiving the ack of the create.
117
162
 
163
+ ### Why Eventually Consistent References Can Not Have Stable Order
164
+
165
+ In an ideal system reference positions would have stable order. Specifically:
166
+
167
+ 1. If in any client state the position of a reference is less than the position of a specific item in the sequence,
168
+ then the position of that reference would always be less than or equal to the position of that item.
169
+ 2. If in any client state the position of reference A is less than the position of reference B,
170
+ then the position of reference A would always be less than or equal to the position of reference B.
171
+
172
+ Neither of these properties is true for SlideOnRemove references. This is a result of them sliding over local
173
+ only segments. This could change the relative positions of the sliding reference at items that are slide over,
174
+ as well as any references on those items. Note that these properties do hold for items and references
175
+ once the creation has been acknowledged (sequenced by the server).
176
+
177
+ Supporting stable order is not possible in the current system because:
178
+
179
+ 1. Removing a range may cause an multiple references that had been at different positions to all be at the same
180
+ position.
181
+ 2. To preserve stable ordering, an insert that conflicts with that remove would need to be after some of those
182
+ references and before others.
183
+ 3. Insertion position is specified as a numerical offset in the sequence, so can't specify where in the set
184
+ of references at a position to be inserted. (Technically there is enough information to do this within the
185
+ collab window. But that information is lost if reconnect/resubmit is required.)
186
+
187
+ Therefore implementing eventually consistent references with stable order would require adding additional
188
+ information to insert ops.
189
+
118
190
  ## Tests
119
191
 
120
192
  * `packages\dds\merge-tree\src\test\client.localReference.spec.ts`
package/dist/client.d.ts CHANGED
@@ -8,7 +8,7 @@ import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions"
8
8
  import { IFluidDataStoreRuntime, IChannelStorageService } from "@fluidframework/datastore-definitions";
9
9
  import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
10
10
  import { ITelemetryLogger } from "@fluidframework/common-definitions";
11
- import { LocalReference } from "./localReference";
11
+ import { LocalReference, LocalReferencePosition } from "./localReference";
12
12
  import { CollaborationWindow, ISegment, ISegmentAction, Marker, MergeTree, SegmentGroup } from "./mergeTree";
13
13
  import { MergeTreeDeltaCallback } from "./mergeTreeDeltaCallback";
14
14
  import { ICombiningOp, IJSONSegment, IMergeTreeAnnotateMsg, IMergeTreeDeltaOp, IMergeTreeGroupMsg, IMergeTreeInsertMsg, IMergeTreeRemoveMsg, IMergeTreeOp, IRelativePosition, ReferenceType } from "./ops";
@@ -109,9 +109,9 @@ export declare class Client {
109
109
  /**
110
110
  * @deprecated - use removeReferencePosition instead
111
111
  */
112
- removeLocalReference(lref: LocalReference): ReferencePosition | undefined;
113
- createLocalReferencePosition(segment: ISegment, offset: number, refType: ReferenceType, properties: PropertySet | undefined): ReferencePosition;
114
- removeLocalReferencePosition(lref: ReferencePosition): ReferencePosition | undefined;
112
+ removeLocalReference(lref: LocalReference): LocalReferencePosition | undefined;
113
+ createLocalReferencePosition(segment: ISegment, offset: number | undefined, refType: ReferenceType, properties: PropertySet | undefined): LocalReferencePosition;
114
+ removeLocalReferencePosition(lref: LocalReferencePosition): LocalReferencePosition | undefined;
115
115
  localReferencePositionToPosition(lref: ReferencePosition): number;
116
116
  /**
117
117
  * Given a position specified relative to a marker id, lookup the marker
@@ -178,6 +178,15 @@ export declare class Client {
178
178
  * @param localSeq - The localSeq to find the position of the segment at
179
179
  */
180
180
  protected findReconnectionPosition(segment: ISegment, localSeq: number): number;
181
+ /**
182
+ * Rebases a (local) position from the perspective `{ seq: seqNumberFrom, localSeq }` to the perspective
183
+ * of the current sequence number. This is desirable when rebasing operations for reconnection.
184
+ *
185
+ * If the position refers to a segment/offset that was removed by some operation between `seqNumberFrom` and
186
+ * the current sequence number, the returned position will align with the position of a reference given
187
+ * `SlideOnRemove` semantics.
188
+ */
189
+ rebasePosition(pos: number, seqNumberFrom: number, localSeq: number): number;
181
190
  private resetPendingDeltaToOps;
182
191
  private applyRemoteOp;
183
192
  applyStashedOp(op: IMergeTreeDeltaOp): SegmentGroup;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACvG,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAMtE,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EACH,mBAAmB,EAGnB,QAAQ,EACR,cAAc,EACd,MAAM,EACN,SAAS,EACT,YAAY,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAQlE,OAAO,EACH,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,EAEjB,aAAa,EAChB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAGH,4BAA4B,EAC/B,MAAM,SAAS,CAAC;AAMjB,qBAAa,MAAM;aAgCK,aAAa,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,QAAQ;aAC/C,MAAM,EAAE,gBAAgB;IAhCrC,UAAU,UAAS;IACnB,SAAS,SAAK;IACd,SAAS,SAAK;IACd,QAAQ,SAAK;IACb,eAAe,SAAK;IACpB,WAAW,SAAK;IAChB,QAAQ,SAAK;IACb,aAAa,SAAK;IAClB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAExC,IAAI,sBAAsB,IAAI,sBAAsB,GAAG,SAAS,CAAkD;IAClH,IAAI,sBAAsB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,SAAS,EAEtE;IAED,IAAI,4BAA4B,IAAI,4BAA4B,GAAG,SAAS,CAE3E;IAED,IAAI,4BAA4B,CAAC,QAAQ,EAAE,4BAA4B,GAAG,SAAS,EAElF;IAED,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAExC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoD;IACpF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAgB;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqC;gBAIlD,aAAa,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,QAAQ,EAC/C,MAAM,EAAE,gBAAgB,EACxC,OAAO,CAAC,EAAE,WAAW;IAKzB;;;;;;OAMG;IACI,wBAAwB,CAAC,KAAK,GAAE,MAAU;IAcjD;;;;;;OAMG;IACI,6BAA6B,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,WAAW,EAClB,iBAAiB,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,qBAAqB,GAAG,SAAS;IAmB9E;;;;;;OAMG;IACI,cAAc,CACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,WAAW,EAClB,WAAW,CAAC,EAAE,YAAY,GAAG,qBAAqB,GAAG,SAAS;IAUlE;;;;;;;OAOG;IACI,kBAAkB,CACrB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,YAAY,GAAG,SAAS,GAAG,qBAAqB,GAAG,SAAS;IAa7E;;;;;OAKG;IACI,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IASlD;;;OAGG;IACI,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,mBAAmB,GAAG,SAAS;IAW1F;;;OAGG;IACI,8BAA8B,CACjC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,QAAQ,GAClB,mBAAmB,GAAG,SAAS;IAiC3B,YAAY,CAAC,WAAW,EAAE,OAAO,EAAE,cAAc,CAAC,WAAW,CAAC,EACjE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI;IAChG,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,EAC7D,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI;IAYhF;;;;OAIG;IACI,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,0BAA0B,EAAE,gBAAgB,GAAG,IAAI;IAezF,eAAe,IAAI,mBAAmB;IAI7C;;;;OAIG;IACI,WAAW,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM;IAM7C;;OAEG;IACI,iBAAiB,CAAC,IAAI,EAAE,cAAc;IAI7C;;OAEG;IACI,oBAAoB,CAAC,IAAI,EAAE,cAAc;IAIzC,4BAA4B,CAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,GAAG,SAAS,GAC3G,sBAAsB;IAIlB,4BAA4B,CAAC,IAAI,EAAE,sBAAsB;IAIzD,gCAAgC,CAAC,IAAI,EAAE,iBAAiB;IAI/D;;;;OAIG;IACI,kBAAkB,CAAC,WAAW,EAAE,iBAAiB;IAIjD,eAAe,CAAC,EAAE,EAAE,MAAM;IAIjC;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA4B1B;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IA8B5B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAqCrB;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAiEvB;;;OAGG;IACF,OAAO,CAAC,+BAA+B;IAqBxC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,iBAAiB;IAoCzB,iBAAiB;IAOjB,qBAAqB,CAAC,YAAY,EAAE,MAAM;IAM1C,gBAAgB,CAAC,YAAY,EAAE,MAAM;IAGrC,eAAe,CAAC,aAAa,EAAE,MAAM;IAOrC,eAAe,CAAC,YAAY,EAAE,MAAM;IAKpC;;;;;;;;OAQG;IACH,SAAS,CAAC,wBAAwB,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM;IAkCtE;;;;;;;OAOG;IACI,cAAc,CACjB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACjB,MAAM;IA2CT,OAAO,CAAC,sBAAsB;IAmE9B,OAAO,CAAC,aAAa;IA6Bd,cAAc,CAAC,EAAE,EAAE,iBAAiB,GAAG,YAAY;IACnD,cAAc,CAAC,EAAE,EAAE,kBAAkB,GAAG,YAAY,EAAE;IACtD,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,YAAY,GAAG,YAAY,EAAE;IAyB/D,QAAQ,CAAC,GAAG,EAAE,yBAAyB,EAAE,KAAK,GAAE,OAAe;IAmB/D,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAUhD;;;;;;;OAOG;IACI,2BAA2B,CAC9B,oBAAoB,EAAE,MAAM,EAC5B,kBAAkB,EAAE,MAAM,EAC1B,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAQ/C;;;;;OAKG;IACI,mBAAmB,CACtB,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,YAAY,GAAG,YAAY,EAAE,GAC5C,YAAY;IA6BR,gBAAgB;IAIhB,SAAS,CACZ,OAAO,EAAE,sBAAsB,EAC/B,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,gBAAgB,EAC5B,WAAW,EAAE,yBAAyB,EAAE,GACzC,qBAAqB;IA+BX,IAAI,CACb,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,gBAAgB,GAC7B,OAAO,CAAC;QAAE,WAAW,EAAE,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAAC;KAAE,CAAC;IAMlE,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,aAAa;IAIvE,OAAO,CAAC,sBAAsB;IAQ9B,gBAAgB,CAAC,OAAO,EAAE,kBAAkB;IAqB5C,uBAAuB,CAAC,EAAE,EAAE,qBAAqB,EAAE,GAAG,EAAE,yBAAyB;IASjF,YAAY,CAAC,MAAM,EAAE,MAAM;IAe3B,oBAAoB,CAAC,CAAC,SAAS,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,yBAAyB;;;;IAKpF;;;;OAIG;IACH,iBAAiB,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;KAAE;;;;IAIxF,uBAAuB,CAAC,GAAG,EAAE,MAAM;IASnC,yBAAyB,CAAC,GAAG,EAAE,MAAM;;;;IAYrC,aAAa;IAGb,WAAW;IAIX,SAAS;IAET,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,SAAI,EAAE,UAAU,SAAI;IAsBvF,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,UAAO;;;;CAIjE"}
package/dist/client.js CHANGED
@@ -18,7 +18,6 @@ const snapshotlegacy_1 = require("./snapshotlegacy");
18
18
  const snapshotLoader_1 = require("./snapshotLoader");
19
19
  const textSegment_1 = require("./textSegment");
20
20
  const snapshotV1_1 = require("./snapshotV1");
21
- const referencePositions_1 = require("./referencePositions");
22
21
  function elapsedMicroseconds(trace) {
23
22
  return trace.trace().duration * 1000;
24
23
  }
@@ -225,11 +224,7 @@ class Client {
225
224
  return this.mergeTree.removeLocalReferencePosition(lref);
226
225
  }
227
226
  localReferencePositionToPosition(lref) {
228
- const segment = lref.getSegment();
229
- if (segment === undefined) {
230
- return referencePositions_1.DetachedReferencePosition;
231
- }
232
- return this.getPosition(segment) + lref.getOffset();
227
+ return this.mergeTree.referencePositionToLocalPosition(lref);
233
228
  }
234
229
  /**
235
230
  * Given a position specified relative to a marker id, lookup the marker
@@ -518,6 +513,47 @@ class Client {
518
513
  });
519
514
  return segmentPosition;
520
515
  }
516
+ /**
517
+ * Rebases a (local) position from the perspective `{ seq: seqNumberFrom, localSeq }` to the perspective
518
+ * of the current sequence number. This is desirable when rebasing operations for reconnection.
519
+ *
520
+ * If the position refers to a segment/offset that was removed by some operation between `seqNumberFrom` and
521
+ * the current sequence number, the returned position will align with the position of a reference given
522
+ * `SlideOnRemove` semantics.
523
+ */
524
+ rebasePosition(pos, seqNumberFrom, localSeq) {
525
+ (0, common_utils_1.assert)(localSeq <= this.mergeTree.collabWindow.localSeq, 0x300 /* localSeq greater than collab window */);
526
+ let segment;
527
+ let posAccumulated = 0;
528
+ let offset = pos;
529
+ const isInsertedInView = (seg) => (seg.seq !== undefined && seg.seq !== constants_1.UnassignedSequenceNumber && seg.seq <= seqNumberFrom)
530
+ || (seg.localSeq !== undefined && seg.localSeq <= localSeq);
531
+ const isRemovedFromView = ({ removedSeq, localRemovedSeq }) => (removedSeq !== undefined && removedSeq !== constants_1.UnassignedSequenceNumber && removedSeq <= seqNumberFrom)
532
+ || (localRemovedSeq !== undefined && localRemovedSeq <= localSeq);
533
+ this.mergeTree.walkAllSegments(this.mergeTree.root, (seg) => {
534
+ (0, common_utils_1.assert)(seg.seq !== undefined || seg.localSeq !== undefined, 0x301 /* Either seq or localSeq should be defined */);
535
+ segment = seg;
536
+ if (isInsertedInView(seg) && !isRemovedFromView(seg)) {
537
+ posAccumulated += seg.cachedLength;
538
+ if (offset >= seg.cachedLength) {
539
+ offset -= seg.cachedLength;
540
+ }
541
+ }
542
+ // Keep going while we've yet to reach the segment at the desired position
543
+ return posAccumulated <= pos;
544
+ });
545
+ (0, common_utils_1.assert)(segment !== undefined, 0x302 /* No segment found */);
546
+ const seqNumberTo = this.getCollabWindow().currentSeq;
547
+ if ((segment.removedSeq !== undefined &&
548
+ segment.removedSeq !== constants_1.UnassignedSequenceNumber &&
549
+ segment.removedSeq <= seqNumberTo)
550
+ || (segment.localRemovedSeq !== undefined && segment.localRemovedSeq <= localSeq)) {
551
+ // Segment that the position was in has been removed: null out offset.
552
+ offset = 0;
553
+ }
554
+ (0, common_utils_1.assert)(0 <= offset && offset < segment.cachedLength, 0x303 /* Invalid offset */);
555
+ return this.findReconnectionPosition(segment, localSeq) + offset;
556
+ }
521
557
  resetPendingDeltaToOps(resetOp, segmentGroup) {
522
558
  var _a, _b;
523
559
  (0, common_utils_1.assert)(!!segmentGroup, 0x033 /* "Segment group undefined" */);
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.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\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { IFluidDataStoreRuntime, IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert, Trace, unreachableCase } from \"@fluidframework/common-utils\";\nimport { LoggingError } from \"@fluidframework/telemetry-utils\";\nimport { IIntegerRange } from \"./base\";\nimport { RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber, UniversalSequenceNumber } from \"./constants\";\nimport { LocalReference, _validateReferenceType } from \"./localReference\";\nimport {\n CollaborationWindow,\n compareStrings,\n IConsensusInfo,\n ISegment,\n ISegmentAction,\n Marker,\n MergeTree,\n SegmentGroup,\n} from \"./mergeTree\";\nimport { MergeTreeDeltaCallback } from \"./mergeTreeDeltaCallback\";\nimport {\n createAnnotateMarkerOp,\n createAnnotateRangeOp,\n createGroupOp,\n createInsertSegmentOp,\n createRemoveRangeOp,\n} from \"./opBuilder\";\nimport {\n ICombiningOp,\n IJSONSegment,\n IMergeTreeAnnotateMsg,\n IMergeTreeDeltaOp,\n IMergeTreeGroupMsg,\n IMergeTreeInsertMsg,\n IMergeTreeRemoveMsg,\n IMergeTreeOp,\n IRelativePosition,\n MergeTreeDeltaType,\n ReferenceType,\n} from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\nimport { SnapshotLoader } from \"./snapshotLoader\";\nimport { MergeTreeTextHelper } from \"./textSegment\";\nimport { SnapshotV1 } from \"./snapshotV1\";\nimport { ReferencePosition, RangeStackMap, DetachedReferencePosition } from \"./referencePositions\";\nimport {\n IMergeTreeClientSequenceArgs,\n IMergeTreeDeltaOpArgs,\n MergeTreeMaintenanceCallback,\n} from \"./index\";\n\nfunction elapsedMicroseconds(trace: Trace) {\n return trace.trace().duration * 1000;\n}\n\nexport class Client {\n public measureOps = false;\n public accumTime = 0;\n public localTime = 0;\n public localOps = 0;\n public accumWindowTime = 0;\n public accumWindow = 0;\n public accumOps = 0;\n public maxWindowTime = 0;\n public longClientId: string | undefined;\n\n get mergeTreeDeltaCallback(): MergeTreeDeltaCallback | undefined { return this.mergeTree.mergeTreeDeltaCallback; }\n set mergeTreeDeltaCallback(callback: MergeTreeDeltaCallback | undefined) {\n this.mergeTree.mergeTreeDeltaCallback = callback;\n }\n\n get mergeTreeMaintenanceCallback(): MergeTreeMaintenanceCallback | undefined {\n return this.mergeTree.mergeTreeMaintenanceCallback;\n }\n\n set mergeTreeMaintenanceCallback(callback: MergeTreeMaintenanceCallback | undefined) {\n this.mergeTree.mergeTreeMaintenanceCallback = callback;\n }\n\n protected readonly mergeTree: MergeTree;\n\n private readonly clientNameToIds = new RedBlackTree<string, number>(compareStrings);\n private readonly shortClientIdMap: string[] = [];\n private readonly pendingConsensus = new Map<string, IConsensusInfo>();\n\n constructor(\n // Passing this callback would be unnecessary if Client were merged with SharedSegmentSequence\n public readonly specToSegment: (spec: IJSONSegment) => ISegment,\n public readonly logger: ITelemetryLogger,\n options?: PropertySet,\n ) {\n this.mergeTree = new MergeTree(options);\n }\n\n /**\n * The merge tree maintains a queue of segment groups for each local operation.\n * These segment groups track segments modified by an operation.\n * This method peeks the tail of that queue, and returns the segments groups there.\n * It is used to get the segment group(s) for the previous operations.\n * @param count - The number segment groups to get peek from the tail of the queue. Default 1.\n */\n public peekPendingSegmentGroups(count: number = 1) {\n if (count === 1) {\n return this.mergeTree.pendingSegments?.last();\n }\n let taken = 0;\n return this.mergeTree.pendingSegments?.some(() => {\n if (taken < count) {\n taken++;\n return true;\n }\n return false;\n }, true);\n }\n\n /**\n * Annotate a marker and call the callback on consensus.\n * @param marker - The marker to annotate\n * @param props - The properties to annotate the marker with\n * @param consensusCallback - The callback called when consensus is reached\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateMarkerNotifyConsensus(\n marker: Marker,\n props: PropertySet,\n consensusCallback: (m: Marker) => void): IMergeTreeAnnotateMsg | undefined {\n const combiningOp: ICombiningOp = {\n name: \"consensus\",\n };\n\n const annotateOp =\n this.annotateMarker(marker, props, combiningOp);\n\n if (annotateOp) {\n const consensusInfo: IConsensusInfo = {\n callback: consensusCallback,\n marker,\n };\n this.pendingConsensus.set(marker.getId()!, consensusInfo);\n return annotateOp;\n } else {\n return undefined;\n }\n }\n /**\n * Annotates the markers with the provided properties\n * @param marker - The marker to annotate\n * @param props - The properties to annotate the marker with\n * @param combiningOp - Optional. Specifies how to combine values for the property, such as \"incr\" for increment.\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateMarker(\n marker: Marker,\n props: PropertySet,\n combiningOp?: ICombiningOp): IMergeTreeAnnotateMsg | undefined {\n const annotateOp =\n createAnnotateMarkerOp(marker, props, combiningOp)!;\n\n if (this.applyAnnotateRangeOp({ op: annotateOp })) {\n return annotateOp;\n } else {\n return undefined;\n }\n }\n /**\n * Annotates the range with the provided properties\n * @param start - The inclusive start position of the range to annotate\n * @param end - The exclusive end position of the range to annotate\n * @param props - The properties to annotate the range with\n * @param combiningOp - Specifies how to combine values for the property, such as \"incr\" for increment.\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateRangeLocal(\n start: number,\n end: number,\n props: PropertySet,\n combiningOp: ICombiningOp | undefined): IMergeTreeAnnotateMsg | undefined {\n const annotateOp = createAnnotateRangeOp(\n start,\n end,\n props,\n combiningOp);\n\n if (this.applyAnnotateRangeOp({ op: annotateOp })) {\n return annotateOp;\n }\n return undefined;\n }\n\n /**\n * Removes the range\n *\n * @param start - The inclusive start of the range to remove\n * @param end - The exclusive end of the range to remove\n */\n public removeRangeLocal(start: number, end: number) {\n const removeOp = createRemoveRangeOp(start, end);\n\n if (this.applyRemoveRangeOp({ op: removeOp })) {\n return removeOp;\n }\n return undefined;\n }\n\n /**\n * @param pos - The position to insert the segment at\n * @param segment - The segment to insert\n */\n public insertSegmentLocal(pos: number, segment: ISegment): IMergeTreeInsertMsg | undefined {\n if (segment.cachedLength <= 0) {\n return undefined;\n }\n const insertOp = createInsertSegmentOp(pos, segment);\n if (this.applyInsertOp({ op: insertOp })) {\n return insertOp;\n }\n return undefined;\n }\n\n /**\n * @param refPos - The reference position to insert the segment at\n * @param segment - The segment to insert\n */\n public insertAtReferencePositionLocal(\n refPos: ReferencePosition,\n segment: ISegment,\n ): IMergeTreeInsertMsg | undefined {\n const pos = this.mergeTree.referencePositionToLocalPosition(\n refPos,\n this.getCurrentSeq(),\n this.getClientId());\n\n if (pos === LocalReference.DetachedPosition) {\n return undefined;\n }\n const op = createInsertSegmentOp(\n pos,\n segment);\n\n const opArgs = { op };\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.insertAtReferencePosition(\n refPos,\n segment,\n opArgs);\n\n this.completeAndLogOp(\n opArgs,\n this.getClientSequenceArgs(opArgs),\n { start: op.pos1 },\n traceStart);\n\n return op;\n }\n\n public walkSegments<TClientData>(handler: ISegmentAction<TClientData>,\n start: number | undefined, end: number | undefined, accum: TClientData, splitRange?: boolean): void;\n public walkSegments<undefined>(handler: ISegmentAction<undefined>,\n start?: number, end?: number, accum?: undefined, splitRange?: boolean): void;\n public walkSegments<TClientData>(\n handler: ISegmentAction<TClientData>,\n start: number | undefined, end: number | undefined, accum: TClientData, splitRange: boolean = false) {\n this.mergeTree.mapRange(\n {\n leaf: handler,\n },\n this.getCurrentSeq(), this.getClientId(),\n accum, start, end, splitRange);\n }\n\n /**\n * Serializes the data required for garbage collection. The IFluidHandles stored in all segments that haven't\n * been removed represent routes to other objects. We serialize the data in these segments using the passed in\n * serializer which keeps track of all serialized handles.\n */\n public serializeGCData(handle: IFluidHandle, handleCollectingSerializer: IFluidSerializer): void {\n this.mergeTree.walkAllSegments(\n this.mergeTree.root,\n (seg) => {\n // Only serialize segments that have not been removed.\n if (seg.removedSeq === undefined) {\n handleCollectingSerializer.stringify(\n seg.clone().toJSONObject(),\n handle);\n }\n return true;\n },\n );\n }\n\n public getCollabWindow(): CollaborationWindow {\n return this.mergeTree.getCollabWindow();\n }\n\n /**\n * Returns the current position of a segment, and -1 if the segment\n * does not exist in this merge tree\n * @param segment - The segment to get the position of\n */\n public getPosition(segment: ISegment): number {\n if (segment?.parent === undefined) {\n return -1;\n }\n return this.mergeTree.getPosition(segment, this.getCurrentSeq(), this.getClientId());\n }\n /**\n * @deprecated - use createReferencePosition instead\n */\n public addLocalReference(lref: LocalReference) {\n return this.mergeTree.addLocalReference(lref);\n }\n\n /**\n * @deprecated - use removeReferencePosition instead\n */\n public removeLocalReference(lref: LocalReference) {\n return this.removeLocalReferencePosition(lref);\n }\n\n public createLocalReferencePosition(\n segment: ISegment, offset: number, refType: ReferenceType, properties: PropertySet | undefined,\n ): ReferencePosition {\n return this.mergeTree.createLocalReferencePosition(segment, offset, refType, properties, this);\n }\n\n public removeLocalReferencePosition(lref: ReferencePosition) {\n return this.mergeTree.removeLocalReferencePosition(lref);\n }\n\n public localReferencePositionToPosition(lref: ReferencePosition) {\n const segment = lref.getSegment();\n if (segment === undefined) {\n return DetachedReferencePosition;\n }\n return this.getPosition(segment) + lref.getOffset();\n }\n\n /**\n * Given a position specified relative to a marker id, lookup the marker\n * and convert the position to a character position.\n * @param relativePos - Id of marker (may be indirect) and whether position is before or after marker.\n */\n public posFromRelativePos(relativePos: IRelativePosition) {\n return this.mergeTree.posFromRelativePos(relativePos);\n }\n\n public getMarkerFromId(id: string) {\n return this.mergeTree.getMarkerFromId(id);\n }\n\n /**\n * Performs the remove based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the remove was applied. False if it could not be.\n */\n private applyRemoveRangeOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.REMOVE, 0x02d /* \"Unexpected op type on range remove!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n if (!range) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.markRangeRemoved(\n range.start,\n range.end,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n false,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n * Performs the annotate based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the annotate was applied. False if it could not be.\n */\n private applyAnnotateRangeOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.ANNOTATE, 0x02e /* \"Unexpected op type on range annotate!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n\n if (!range) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.annotateRange(\n range.start,\n range.end,\n op.props,\n op.combiningOp,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n * Performs the insert based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the insert was applied. False if it could not be.\n */\n private applyInsertOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.INSERT, 0x02f /* \"Unexpected op type on range insert!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n\n if (!range) {\n return false;\n }\n\n let segments: ISegment[] | undefined;\n if (op.seg) {\n segments = [this.specToSegment(op.seg)];\n }\n\n if (!segments || segments.length === 0) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.insertSegments(\n range.start,\n segments,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n *\n * @param opArgs - The op args of the op to complete\n * @param clientArgs - The client args for the op\n * @param range - The range the op applied to\n * @param clockStart - Optional. The clock start if timing data should be updated.\n */\n private completeAndLogOp(\n opArgs: IMergeTreeDeltaOpArgs,\n clientArgs: IMergeTreeClientSequenceArgs,\n range: Partial<IIntegerRange>,\n traceStart?: Trace) {\n if (!opArgs.sequencedMessage) {\n if (traceStart) {\n this.localTime += elapsedMicroseconds(traceStart);\n this.localOps++;\n }\n } else {\n assert(this.mergeTree.getCollabWindow().currentSeq < clientArgs.sequenceNumber,\n 0x030 /* \"Incoming remote op sequence# <= local collabWindow's currentSequence#\" */);\n assert(this.mergeTree.getCollabWindow().minSeq <= opArgs.sequencedMessage.minimumSequenceNumber,\n 0x031 /* \"Incoming remote op minSequence# < local collabWindow's minSequence#\" */);\n if (traceStart) {\n this.accumTime += elapsedMicroseconds(traceStart);\n this.accumOps++;\n this.accumWindow += (this.getCurrentSeq() - this.getCollabWindow().minSeq);\n }\n }\n }\n\n /**\n * Returns a valid range for the op, or undefined\n * @param op - The op to generate the range for\n * @param clientArgs - The client args for the op\n */\n private getValidOpRange(\n op: IMergeTreeAnnotateMsg | IMergeTreeInsertMsg | IMergeTreeRemoveMsg,\n clientArgs: IMergeTreeClientSequenceArgs): IIntegerRange | undefined {\n let start: number | undefined = op.pos1;\n if (start === undefined && op.relativePos1) {\n start = this.mergeTree.posFromRelativePos(\n op.relativePos1,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId);\n }\n\n let end: number | undefined = op.pos2;\n if (end === undefined && op.relativePos2) {\n end = this.mergeTree.posFromRelativePos(\n op.relativePos2,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId);\n }\n\n // Validate if local op\n if (clientArgs.clientId === this.getClientId()) {\n const length = this.getLength();\n\n const invalidPositions: string[] = [];\n\n // Validate start position\n //\n if (start === undefined\n || start < 0\n || start > length\n || start === length && op.type !== MergeTreeDeltaType.INSERT) {\n invalidPositions.push(\"start\");\n }\n // Validate end if not insert, or insert has end\n //\n if (op.type !== MergeTreeDeltaType.INSERT || end !== undefined) {\n if (end === undefined || end <= start!) {\n invalidPositions.push(\"end\");\n }\n }\n\n if (invalidPositions.length > 0) {\n throw new LoggingError(\n \"RangeOutOfBounds\",\n {\n usageError: true,\n end,\n invalidPositions: invalidPositions.toString(),\n length,\n opPos1: op.pos1,\n opPos1Relative: op.relativePos1 !== undefined,\n opPos2: op.pos2,\n opPos2Relative: op.relativePos2 !== undefined,\n opType: op.type,\n start,\n },\n );\n }\n }\n\n // start and end are guaranteed to be non-null here, otherwise we throw above.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return { start, end } as IIntegerRange;\n }\n\n /**\n * Gets the client args from the op if remote, otherwise uses the local clients info\n * @param sequencedMessage - The sequencedMessage to get the client sequence args for\n */\n private getClientSequenceArgsForMessage(sequencedMessage: ISequencedDocumentMessage | undefined):\n IMergeTreeClientSequenceArgs {\n // If there this no sequenced message, then the op is local\n // and unacked, so use this clients sequenced args\n //\n if (!sequencedMessage) {\n const segWindow = this.getCollabWindow();\n return {\n clientId: segWindow.clientId,\n referenceSequenceNumber: segWindow.currentSeq,\n sequenceNumber: this.getLocalSequenceNumber(),\n };\n } else {\n return {\n clientId: this.getOrAddShortClientId(sequencedMessage.clientId),\n referenceSequenceNumber: sequencedMessage.referenceSequenceNumber,\n sequenceNumber: sequencedMessage.sequenceNumber,\n };\n }\n }\n\n /**\n * Gets the client args from the op if remote, otherwise uses the local clients info\n * @param opArgs - The op arg to get the client sequence args for\n */\n private getClientSequenceArgs(opArgs: IMergeTreeDeltaOpArgs): IMergeTreeClientSequenceArgs {\n return this.getClientSequenceArgsForMessage(opArgs.sequencedMessage);\n }\n\n private ackPendingSegment(opArgs: IMergeTreeDeltaOpArgs) {\n const ackOp = (deltaOpArgs: IMergeTreeDeltaOpArgs) => {\n let trace: Trace | undefined;\n if (this.measureOps) {\n trace = Trace.start();\n }\n\n this.mergeTree.ackPendingSegment(deltaOpArgs);\n if (deltaOpArgs.op.type === MergeTreeDeltaType.ANNOTATE) {\n if (deltaOpArgs.op.combiningOp && (deltaOpArgs.op.combiningOp.name === \"consensus\")) {\n this.updateConsensusProperty(deltaOpArgs.op, deltaOpArgs.sequencedMessage!);\n }\n }\n\n if (trace) {\n this.accumTime += elapsedMicroseconds(trace);\n this.accumOps++;\n this.accumWindow += (this.getCurrentSeq() - this.getCollabWindow().minSeq);\n }\n };\n\n if (opArgs.op.type === MergeTreeDeltaType.GROUP) {\n for (const memberOp of opArgs.op.ops) {\n ackOp({\n groupOp: opArgs.op,\n op: memberOp,\n sequencedMessage: opArgs.sequencedMessage,\n });\n }\n } else {\n ackOp(opArgs);\n }\n }\n\n // as functions are modified move them above the eslint-disabled waterline and lint them\n\n cloneFromSegments() {\n const clone = new Client(this.specToSegment, this.logger, this.mergeTree.options);\n const segments: ISegment[] = [];\n const newRoot = this.mergeTree.blockClone(this.mergeTree.root, segments);\n clone.mergeTree.root = newRoot;\n return clone;\n }\n getOrAddShortClientId(longClientId: string) {\n if (!this.clientNameToIds.get(longClientId)) {\n this.addLongClientId(longClientId);\n }\n return this.getShortClientId(longClientId);\n }\n getShortClientId(longClientId: string) {\n return this.clientNameToIds.get(longClientId)!.data;\n }\n getLongClientId(shortClientId: number) {\n if (shortClientId >= 0) {\n return this.shortClientIdMap[shortClientId];\n } else {\n return \"original\";\n }\n }\n addLongClientId(longClientId: string) {\n this.clientNameToIds.put(longClientId, this.shortClientIdMap.length);\n this.shortClientIdMap.push(longClientId);\n }\n\n /**\n * During reconnect, we must find the positions to pending segments\n * relative to other pending segments. This methods computes that\n * position relative to a localSeq. Pending segments above the localSeq\n * will be ignored.\n *\n * @param segment - The segment to find the position for\n * @param localSeq - The localSeq to find the position of the segment at\n */\n protected findReconnectionPosition(segment: ISegment, localSeq: number) {\n assert(localSeq <= this.mergeTree.collabWindow.localSeq, 0x032 /* \"localSeq greater than collab window\" */);\n let segmentPosition = 0;\n /*\n Walk the segments up to the current segment, and calculate it's\n position taking into account local segments that were modified,\n after the current segment.\n\n TODO: Consider embedding this information into the tree for\n more efficient look up of pending segment positions.\n */\n this.mergeTree.walkAllSegments(this.mergeTree.root, (seg) => {\n // If we've found the desired segment, terminate the walk and return 'segmentPosition'.\n if (seg === segment) {\n return false;\n }\n\n // Otherwise, advance segmentPosition if the segment has been inserted and not removed\n // with respect to the given 'localSeq'.\n //\n // Note that all ACKed / remote ops are applied and we only need concern ourself with\n // determining if locally pending ops fall before/after the given 'localSeq'.\n if ((seg.localSeq === undefined || seg.localSeq <= localSeq) // Is inserted\n && (seg.removedSeq === undefined || seg.localRemovedSeq! > localSeq) // Not removed\n ) {\n segmentPosition += seg.cachedLength;\n }\n\n return true;\n });\n\n return segmentPosition;\n }\n\n private resetPendingDeltaToOps(\n resetOp: IMergeTreeDeltaOp,\n segmentGroup: SegmentGroup): IMergeTreeDeltaOp[] {\n assert(!!segmentGroup, 0x033 /* \"Segment group undefined\" */);\n const NACKedSegmentGroup = this.mergeTree.pendingSegments?.dequeue();\n assert(segmentGroup === NACKedSegmentGroup,\n 0x034 /* \"Segment group not at head of merge tree pending queue\" */);\n\n const opList: IMergeTreeDeltaOp[] = [];\n // We need to sort the segments by ordinal, as the segments are not sorted in the segment group.\n // The reason they need them sorted, as they have the same local sequence number and which means\n // farther segments will take into account nearer segments when calculating their position.\n // By sorting we ensure the nearer segment will be applied and sequenced before the father segments\n // so their recalculated positions will be correct.\n for (const segment of segmentGroup.segments.sort((a, b) => a.ordinal < b.ordinal ? -1 : 1)) {\n const segmentSegGroup = segment.segmentGroups.dequeue();\n assert(segmentGroup === segmentSegGroup,\n 0x035 /* \"Segment group not at head of segment pending queue\" */);\n const segmentPosition = this.findReconnectionPosition(segment, segmentGroup.localSeq);\n let newOp: IMergeTreeDeltaOp | undefined;\n switch (resetOp.type) {\n case MergeTreeDeltaType.ANNOTATE:\n assert(segment.propertyManager?.hasPendingProperties() === true,\n 0x036 /* \"Segment has no pending properties\" */);\n // if the segment has been removed, there's no need to send the annotate op\n // unless the remove was local, in which case the annotate must have come\n // before the remove\n if (segment.removedSeq === undefined || segment.localRemovedSeq !== undefined) {\n newOp = createAnnotateRangeOp(\n segmentPosition,\n segmentPosition + segment.cachedLength,\n resetOp.props,\n resetOp.combiningOp);\n }\n break;\n\n case MergeTreeDeltaType.INSERT:\n assert(segment.seq === UnassignedSequenceNumber,\n 0x037 /* \"Segment already has assigned sequence number\" */);\n newOp = createInsertSegmentOp(\n segmentPosition,\n segment);\n break;\n\n case MergeTreeDeltaType.REMOVE:\n if (segment.localRemovedSeq !== undefined) {\n newOp = createRemoveRangeOp(\n segmentPosition,\n segmentPosition + segment.cachedLength);\n }\n break;\n\n default:\n throw new Error(`Invalid op type`);\n }\n\n if (newOp) {\n const newSegmentGroup: SegmentGroup = { segments: [], localSeq: segmentGroup.localSeq };\n segment.segmentGroups.enqueue(newSegmentGroup);\n this.mergeTree.pendingSegments!.enqueue(newSegmentGroup);\n opList.push(newOp);\n }\n }\n\n return opList;\n }\n\n private applyRemoteOp(opArgs: IMergeTreeDeltaOpArgs) {\n const op = opArgs.op;\n const msg = opArgs.sequencedMessage;\n this.getOrAddShortClientId(msg!.clientId);\n switch (op.type) {\n case MergeTreeDeltaType.INSERT:\n this.applyInsertOp(opArgs);\n break;\n case MergeTreeDeltaType.REMOVE:\n this.applyRemoveRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.ANNOTATE:\n this.applyAnnotateRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.GROUP: {\n for (const memberOp of op.ops) {\n this.applyRemoteOp({\n op: memberOp,\n groupOp: op,\n sequencedMessage: msg,\n });\n }\n break;\n }\n default:\n break;\n }\n }\n\n public applyStashedOp(op: IMergeTreeDeltaOp): SegmentGroup;\n public applyStashedOp(op: IMergeTreeGroupMsg): SegmentGroup[];\n public applyStashedOp(op: IMergeTreeOp): SegmentGroup | SegmentGroup[];\n public applyStashedOp(op: IMergeTreeOp): SegmentGroup | SegmentGroup[] {\n let metadata: SegmentGroup | SegmentGroup[] | undefined;\n switch (op.type) {\n case MergeTreeDeltaType.INSERT:\n this.applyInsertOp({ op });\n metadata = this.peekPendingSegmentGroups();\n break;\n case MergeTreeDeltaType.REMOVE:\n this.applyRemoveRangeOp({ op });\n metadata = this.peekPendingSegmentGroups();\n break;\n case MergeTreeDeltaType.ANNOTATE:\n this.applyAnnotateRangeOp({ op });\n metadata = this.peekPendingSegmentGroups();\n break;\n case MergeTreeDeltaType.GROUP:\n return op.ops.map((o) => this.applyStashedOp(o));\n default:\n unreachableCase(op, \"unrecognized op type\");\n }\n assert(!!metadata, 0x2db /* \"Applying op must generate a pending segment\" */);\n return metadata;\n }\n\n public applyMsg(msg: ISequencedDocumentMessage, local: boolean = false) {\n // Ensure client ID is registered\n this.getOrAddShortClientId(msg.clientId);\n // Apply if an operation message\n if (msg.type === MessageType.Operation) {\n const opArgs: IMergeTreeDeltaOpArgs = {\n op: msg.contents as IMergeTreeOp,\n sequencedMessage: msg,\n };\n if (opArgs.sequencedMessage?.clientId === this.longClientId || local) {\n this.ackPendingSegment(opArgs);\n } else {\n this.applyRemoteOp(opArgs);\n }\n }\n\n this.updateSeqNumbers(msg.minimumSequenceNumber, msg.sequenceNumber);\n }\n\n public updateSeqNumbers(min: number, seq: number) {\n const collabWindow = this.mergeTree.getCollabWindow();\n // Equal is fine here due to SharedSegmentSequence<>.snapshotContent() potentially updating with same #\n assert(collabWindow.currentSeq <= seq,\n 0x038 /* \"Incoming op sequence# < local collabWindow's currentSequence#\" */);\n collabWindow.currentSeq = seq;\n assert(min <= seq, 0x039 /* \"Incoming op sequence# < minSequence#\" */);\n this.updateMinSeq(min);\n }\n\n /**\n * Resolves a remote client's position against the local sequence\n * and returns the remote client's position relative to the local\n * sequence\n * @param remoteClientPosition - The remote client's position to resolve\n * @param remoteClientRefSeq - The reference sequence number of the remote client\n * @param remoteClientId - The client id of the remote client\n */\n public resolveRemoteClientPosition(\n remoteClientPosition: number,\n remoteClientRefSeq: number,\n remoteClientId: string): number | undefined {\n const shortRemoteClientId = this.getOrAddShortClientId(remoteClientId);\n return this.mergeTree.resolveRemoteClientPosition(\n remoteClientPosition,\n remoteClientRefSeq,\n shortRemoteClientId);\n }\n\n /**\n * Given an pending operation and segment group, regenerate the op, so it\n * can be resubmitted\n * @param resetOp - The op to reset\n * @param segmentGroup - The segment group associated with the op\n */\n public regeneratePendingOp(\n resetOp: IMergeTreeOp,\n segmentGroup: SegmentGroup | SegmentGroup[],\n ): IMergeTreeOp {\n const opList: IMergeTreeDeltaOp[] = [];\n if (resetOp.type === MergeTreeDeltaType.GROUP) {\n if (Array.isArray(segmentGroup)) {\n assert(resetOp.ops.length === segmentGroup.length,\n 0x03a /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */);\n\n for (let i = 0; i < resetOp.ops.length; i++) {\n opList.push(\n ...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i]));\n }\n } else {\n // A group op containing a single op will pass a direct reference to 'segmentGroup'\n // rather than an array of segment groups. (See 'peekPendingSegmentGroups()')\n assert(resetOp.ops.length === 1,\n 0x03b /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */);\n opList.push(...this.resetPendingDeltaToOps(resetOp.ops[0], segmentGroup));\n }\n } else {\n assert((resetOp.type as any) !== MergeTreeDeltaType.GROUP,\n 0x03c /* \"Reset op has 'group' delta type!\" */);\n assert(!Array.isArray(segmentGroup),\n 0x03d /* \"segmentGroup is array rather than singleton!\" */);\n opList.push(\n ...this.resetPendingDeltaToOps(resetOp, segmentGroup));\n }\n return opList.length === 1 ? opList[0] : createGroupOp(...opList);\n }\n\n public createTextHelper() {\n return new MergeTreeTextHelper(this.mergeTree);\n }\n\n public summarize(\n runtime: IFluidDataStoreRuntime,\n handle: IFluidHandle,\n serializer: IFluidSerializer,\n catchUpMsgs: ISequencedDocumentMessage[],\n ): ISummaryTreeWithStats {\n const deltaManager = runtime.deltaManager;\n const minSeq = deltaManager.minimumSequenceNumber;\n\n // Catch up to latest MSN, if we have not had a chance to do it.\n // Required for case where FluidDataStoreRuntime.attachChannel()\n // generates summary right after loading data store.\n\n this.updateSeqNumbers(minSeq, deltaManager.lastSequenceNumber);\n\n // One of the summaries (from SPO) I observed to have chunk.chunkSequenceNumber > minSeq!\n // Not sure why - need to catch it sooner\n assert(this.getCollabWindow().minSeq === minSeq,\n 0x03e /* \"minSeq mismatch between collab window and delta manager!\" */);\n\n // Must continue to support legacy\n // (See https://github.com/microsoft/FluidFramework/issues/84)\n if (this.mergeTree.options?.newMergeTreeSnapshotFormat === true) {\n assert(\n catchUpMsgs === undefined || catchUpMsgs.length === 0,\n 0x03f /* \"New format should not emit catchup ops\" */);\n const snap = new SnapshotV1(this.mergeTree, this.logger, (id) => this.getLongClientId(id));\n snap.extractSync();\n return snap.emit(serializer, handle);\n } else {\n const snap = new SnapshotLegacy(this.mergeTree, this.logger);\n snap.extractSync();\n return snap.emit(catchUpMsgs, serializer, handle);\n }\n }\n\n public async load(\n runtime: IFluidDataStoreRuntime,\n storage: IChannelStorageService,\n serializer: IFluidSerializer,\n ): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]>; }> {\n const loader = new SnapshotLoader(runtime, this, this.mergeTree, this.logger, serializer);\n\n return loader.initialize(storage);\n }\n\n getStackContext(startPos: number, rangeLabels: string[]): RangeStackMap {\n return this.mergeTree.getStackContext(startPos, this.getCollabWindow().clientId, rangeLabels);\n }\n\n private getLocalSequenceNumber() {\n const segWindow = this.getCollabWindow();\n if (segWindow.collaborating) {\n return UnassignedSequenceNumber;\n } else {\n return UniversalSequenceNumber;\n }\n }\n localTransaction(groupOp: IMergeTreeGroupMsg) {\n for (const op of groupOp.ops) {\n const opArgs: IMergeTreeDeltaOpArgs = {\n op,\n groupOp,\n };\n switch (op.type) {\n case MergeTreeDeltaType.INSERT:\n this.applyInsertOp(opArgs);\n break;\n case MergeTreeDeltaType.ANNOTATE:\n this.applyAnnotateRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.REMOVE:\n this.applyRemoveRangeOp(opArgs);\n break;\n default:\n break;\n }\n }\n }\n updateConsensusProperty(op: IMergeTreeAnnotateMsg, msg: ISequencedDocumentMessage) {\n const markerId = op.relativePos1!.id!;\n const consensusInfo = this.pendingConsensus.get(markerId);\n if (consensusInfo) {\n consensusInfo.marker.addProperties(op.props, op.combiningOp, msg.sequenceNumber);\n }\n this.mergeTree.addMinSeqListener(msg.sequenceNumber, () => consensusInfo!.callback(consensusInfo!.marker));\n }\n\n updateMinSeq(minSeq: number) {\n let trace: Trace | undefined;\n if (this.measureOps) {\n trace = Trace.start();\n }\n this.mergeTree.setMinSeq(minSeq);\n if (trace) {\n const elapsed = elapsedMicroseconds(trace);\n this.accumWindowTime += elapsed;\n if (elapsed > this.maxWindowTime) {\n this.maxWindowTime = elapsed;\n }\n }\n }\n\n getContainingSegment<T extends ISegment>(pos: number, op?: ISequencedDocumentMessage) {\n const args = this.getClientSequenceArgsForMessage(op);\n return this.mergeTree.getContainingSegment<T>(pos, args.referenceSequenceNumber, args.clientId);\n }\n\n /**\n * Returns the position to slide a reference to if a slide is required.\n * @param segoff - The segment and offset to slide from\n * @returns - segment and offset to slide the reference to\n */\n getSlideToSegment(segoff: { segment: ISegment | undefined; offset: number | undefined; }) {\n return this.mergeTree._getSlideToSegment(segoff);\n }\n\n getPropertiesAtPosition(pos: number) {\n let propertiesAtPosition: PropertySet | undefined;\n const segoff = this.getContainingSegment(pos);\n const seg = segoff.segment;\n if (seg) {\n propertiesAtPosition = seg.properties;\n }\n return propertiesAtPosition;\n }\n getRangeExtentsOfPosition(pos: number) {\n let posStart: number | undefined;\n let posAfterEnd: number | undefined;\n\n const segoff = this.getContainingSegment(pos);\n const seg = segoff.segment;\n if (seg) {\n posStart = this.getPosition(seg);\n posAfterEnd = posStart + seg.cachedLength;\n }\n return { posStart, posAfterEnd };\n }\n getCurrentSeq() {\n return this.getCollabWindow().currentSeq;\n }\n getClientId() {\n return this.getCollabWindow().clientId;\n }\n\n getLength() { return this.mergeTree.length; }\n\n startOrUpdateCollaboration(longClientId: string | undefined, minSeq = 0, currentSeq = 0) {\n // we should always have a client id if we are collaborating\n // if the client id is undefined we are likely bound to a detached\n // container, so we should keep going in local mode. once\n // the container attaches this will be called again on connect with the\n // client id\n if (longClientId !== undefined) {\n if (this.longClientId === undefined) {\n this.longClientId = longClientId;\n this.addLongClientId(this.longClientId);\n this.mergeTree.startCollaboration(\n this.getShortClientId(this.longClientId), minSeq, currentSeq);\n } else {\n const oldClientId = this.longClientId;\n const oldData = this.clientNameToIds.get(oldClientId)!.data;\n this.longClientId = longClientId;\n this.clientNameToIds.put(longClientId, oldData);\n this.shortClientIdMap[oldData] = longClientId;\n }\n }\n }\n\n findTile(startPos: number, tileLabel: string, preceding = true) {\n const clientId = this.getClientId();\n return this.mergeTree.findTile(startPos, clientId, tileLabel, preceding);\n }\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.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\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { IFluidDataStoreRuntime, IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert, Trace, unreachableCase } from \"@fluidframework/common-utils\";\nimport { LoggingError } from \"@fluidframework/telemetry-utils\";\nimport { IIntegerRange } from \"./base\";\nimport { RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber, UniversalSequenceNumber } from \"./constants\";\nimport { LocalReference, LocalReferencePosition } from \"./localReference\";\nimport {\n CollaborationWindow,\n compareStrings,\n IConsensusInfo,\n ISegment,\n ISegmentAction,\n Marker,\n MergeTree,\n SegmentGroup,\n} from \"./mergeTree\";\nimport { MergeTreeDeltaCallback } from \"./mergeTreeDeltaCallback\";\nimport {\n createAnnotateMarkerOp,\n createAnnotateRangeOp,\n createGroupOp,\n createInsertSegmentOp,\n createRemoveRangeOp,\n} from \"./opBuilder\";\nimport {\n ICombiningOp,\n IJSONSegment,\n IMergeTreeAnnotateMsg,\n IMergeTreeDeltaOp,\n IMergeTreeGroupMsg,\n IMergeTreeInsertMsg,\n IMergeTreeRemoveMsg,\n IMergeTreeOp,\n IRelativePosition,\n MergeTreeDeltaType,\n ReferenceType,\n} from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\nimport { SnapshotLoader } from \"./snapshotLoader\";\nimport { MergeTreeTextHelper } from \"./textSegment\";\nimport { SnapshotV1 } from \"./snapshotV1\";\nimport { ReferencePosition, RangeStackMap } from \"./referencePositions\";\nimport {\n IMergeTreeClientSequenceArgs,\n IMergeTreeDeltaOpArgs,\n MergeTreeMaintenanceCallback,\n} from \"./index\";\n\nfunction elapsedMicroseconds(trace: Trace) {\n return trace.trace().duration * 1000;\n}\n\nexport class Client {\n public measureOps = false;\n public accumTime = 0;\n public localTime = 0;\n public localOps = 0;\n public accumWindowTime = 0;\n public accumWindow = 0;\n public accumOps = 0;\n public maxWindowTime = 0;\n public longClientId: string | undefined;\n\n get mergeTreeDeltaCallback(): MergeTreeDeltaCallback | undefined { return this.mergeTree.mergeTreeDeltaCallback; }\n set mergeTreeDeltaCallback(callback: MergeTreeDeltaCallback | undefined) {\n this.mergeTree.mergeTreeDeltaCallback = callback;\n }\n\n get mergeTreeMaintenanceCallback(): MergeTreeMaintenanceCallback | undefined {\n return this.mergeTree.mergeTreeMaintenanceCallback;\n }\n\n set mergeTreeMaintenanceCallback(callback: MergeTreeMaintenanceCallback | undefined) {\n this.mergeTree.mergeTreeMaintenanceCallback = callback;\n }\n\n protected readonly mergeTree: MergeTree;\n\n private readonly clientNameToIds = new RedBlackTree<string, number>(compareStrings);\n private readonly shortClientIdMap: string[] = [];\n private readonly pendingConsensus = new Map<string, IConsensusInfo>();\n\n constructor(\n // Passing this callback would be unnecessary if Client were merged with SharedSegmentSequence\n public readonly specToSegment: (spec: IJSONSegment) => ISegment,\n public readonly logger: ITelemetryLogger,\n options?: PropertySet,\n ) {\n this.mergeTree = new MergeTree(options);\n }\n\n /**\n * The merge tree maintains a queue of segment groups for each local operation.\n * These segment groups track segments modified by an operation.\n * This method peeks the tail of that queue, and returns the segments groups there.\n * It is used to get the segment group(s) for the previous operations.\n * @param count - The number segment groups to get peek from the tail of the queue. Default 1.\n */\n public peekPendingSegmentGroups(count: number = 1) {\n if (count === 1) {\n return this.mergeTree.pendingSegments?.last();\n }\n let taken = 0;\n return this.mergeTree.pendingSegments?.some(() => {\n if (taken < count) {\n taken++;\n return true;\n }\n return false;\n }, true);\n }\n\n /**\n * Annotate a marker and call the callback on consensus.\n * @param marker - The marker to annotate\n * @param props - The properties to annotate the marker with\n * @param consensusCallback - The callback called when consensus is reached\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateMarkerNotifyConsensus(\n marker: Marker,\n props: PropertySet,\n consensusCallback: (m: Marker) => void): IMergeTreeAnnotateMsg | undefined {\n const combiningOp: ICombiningOp = {\n name: \"consensus\",\n };\n\n const annotateOp =\n this.annotateMarker(marker, props, combiningOp);\n\n if (annotateOp) {\n const consensusInfo: IConsensusInfo = {\n callback: consensusCallback,\n marker,\n };\n this.pendingConsensus.set(marker.getId()!, consensusInfo);\n return annotateOp;\n } else {\n return undefined;\n }\n }\n /**\n * Annotates the markers with the provided properties\n * @param marker - The marker to annotate\n * @param props - The properties to annotate the marker with\n * @param combiningOp - Optional. Specifies how to combine values for the property, such as \"incr\" for increment.\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateMarker(\n marker: Marker,\n props: PropertySet,\n combiningOp?: ICombiningOp): IMergeTreeAnnotateMsg | undefined {\n const annotateOp =\n createAnnotateMarkerOp(marker, props, combiningOp)!;\n\n if (this.applyAnnotateRangeOp({ op: annotateOp })) {\n return annotateOp;\n } else {\n return undefined;\n }\n }\n /**\n * Annotates the range with the provided properties\n * @param start - The inclusive start position of the range to annotate\n * @param end - The exclusive end position of the range to annotate\n * @param props - The properties to annotate the range with\n * @param combiningOp - Specifies how to combine values for the property, such as \"incr\" for increment.\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateRangeLocal(\n start: number,\n end: number,\n props: PropertySet,\n combiningOp: ICombiningOp | undefined): IMergeTreeAnnotateMsg | undefined {\n const annotateOp = createAnnotateRangeOp(\n start,\n end,\n props,\n combiningOp);\n\n if (this.applyAnnotateRangeOp({ op: annotateOp })) {\n return annotateOp;\n }\n return undefined;\n }\n\n /**\n * Removes the range\n *\n * @param start - The inclusive start of the range to remove\n * @param end - The exclusive end of the range to remove\n */\n public removeRangeLocal(start: number, end: number) {\n const removeOp = createRemoveRangeOp(start, end);\n\n if (this.applyRemoveRangeOp({ op: removeOp })) {\n return removeOp;\n }\n return undefined;\n }\n\n /**\n * @param pos - The position to insert the segment at\n * @param segment - The segment to insert\n */\n public insertSegmentLocal(pos: number, segment: ISegment): IMergeTreeInsertMsg | undefined {\n if (segment.cachedLength <= 0) {\n return undefined;\n }\n const insertOp = createInsertSegmentOp(pos, segment);\n if (this.applyInsertOp({ op: insertOp })) {\n return insertOp;\n }\n return undefined;\n }\n\n /**\n * @param refPos - The reference position to insert the segment at\n * @param segment - The segment to insert\n */\n public insertAtReferencePositionLocal(\n refPos: ReferencePosition,\n segment: ISegment,\n ): IMergeTreeInsertMsg | undefined {\n const pos = this.mergeTree.referencePositionToLocalPosition(\n refPos,\n this.getCurrentSeq(),\n this.getClientId());\n\n if (pos === LocalReference.DetachedPosition) {\n return undefined;\n }\n const op = createInsertSegmentOp(\n pos,\n segment);\n\n const opArgs = { op };\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.insertAtReferencePosition(\n refPos,\n segment,\n opArgs);\n\n this.completeAndLogOp(\n opArgs,\n this.getClientSequenceArgs(opArgs),\n { start: op.pos1 },\n traceStart);\n\n return op;\n }\n\n public walkSegments<TClientData>(handler: ISegmentAction<TClientData>,\n start: number | undefined, end: number | undefined, accum: TClientData, splitRange?: boolean): void;\n public walkSegments<undefined>(handler: ISegmentAction<undefined>,\n start?: number, end?: number, accum?: undefined, splitRange?: boolean): void;\n public walkSegments<TClientData>(\n handler: ISegmentAction<TClientData>,\n start: number | undefined, end: number | undefined, accum: TClientData, splitRange: boolean = false) {\n this.mergeTree.mapRange(\n {\n leaf: handler,\n },\n this.getCurrentSeq(), this.getClientId(),\n accum, start, end, splitRange);\n }\n\n /**\n * Serializes the data required for garbage collection. The IFluidHandles stored in all segments that haven't\n * been removed represent routes to other objects. We serialize the data in these segments using the passed in\n * serializer which keeps track of all serialized handles.\n */\n public serializeGCData(handle: IFluidHandle, handleCollectingSerializer: IFluidSerializer): void {\n this.mergeTree.walkAllSegments(\n this.mergeTree.root,\n (seg) => {\n // Only serialize segments that have not been removed.\n if (seg.removedSeq === undefined) {\n handleCollectingSerializer.stringify(\n seg.clone().toJSONObject(),\n handle);\n }\n return true;\n },\n );\n }\n\n public getCollabWindow(): CollaborationWindow {\n return this.mergeTree.getCollabWindow();\n }\n\n /**\n * Returns the current position of a segment, and -1 if the segment\n * does not exist in this merge tree\n * @param segment - The segment to get the position of\n */\n public getPosition(segment: ISegment): number {\n if (segment?.parent === undefined) {\n return -1;\n }\n return this.mergeTree.getPosition(segment, this.getCurrentSeq(), this.getClientId());\n }\n /**\n * @deprecated - use createReferencePosition instead\n */\n public addLocalReference(lref: LocalReference) {\n return this.mergeTree.addLocalReference(lref);\n }\n\n /**\n * @deprecated - use removeReferencePosition instead\n */\n public removeLocalReference(lref: LocalReference) {\n return this.removeLocalReferencePosition(lref);\n }\n\n public createLocalReferencePosition(\n segment: ISegment, offset: number | undefined, refType: ReferenceType, properties: PropertySet | undefined,\n ): LocalReferencePosition {\n return this.mergeTree.createLocalReferencePosition(segment, offset, refType, properties, this);\n }\n\n public removeLocalReferencePosition(lref: LocalReferencePosition) {\n return this.mergeTree.removeLocalReferencePosition(lref);\n }\n\n public localReferencePositionToPosition(lref: ReferencePosition) {\n return this.mergeTree.referencePositionToLocalPosition(lref);\n }\n\n /**\n * Given a position specified relative to a marker id, lookup the marker\n * and convert the position to a character position.\n * @param relativePos - Id of marker (may be indirect) and whether position is before or after marker.\n */\n public posFromRelativePos(relativePos: IRelativePosition) {\n return this.mergeTree.posFromRelativePos(relativePos);\n }\n\n public getMarkerFromId(id: string) {\n return this.mergeTree.getMarkerFromId(id);\n }\n\n /**\n * Performs the remove based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the remove was applied. False if it could not be.\n */\n private applyRemoveRangeOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.REMOVE, 0x02d /* \"Unexpected op type on range remove!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n if (!range) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.markRangeRemoved(\n range.start,\n range.end,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n false,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n * Performs the annotate based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the annotate was applied. False if it could not be.\n */\n private applyAnnotateRangeOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.ANNOTATE, 0x02e /* \"Unexpected op type on range annotate!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n\n if (!range) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.annotateRange(\n range.start,\n range.end,\n op.props,\n op.combiningOp,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n * Performs the insert based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the insert was applied. False if it could not be.\n */\n private applyInsertOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.INSERT, 0x02f /* \"Unexpected op type on range insert!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n\n if (!range) {\n return false;\n }\n\n let segments: ISegment[] | undefined;\n if (op.seg) {\n segments = [this.specToSegment(op.seg)];\n }\n\n if (!segments || segments.length === 0) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.insertSegments(\n range.start,\n segments,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n *\n * @param opArgs - The op args of the op to complete\n * @param clientArgs - The client args for the op\n * @param range - The range the op applied to\n * @param clockStart - Optional. The clock start if timing data should be updated.\n */\n private completeAndLogOp(\n opArgs: IMergeTreeDeltaOpArgs,\n clientArgs: IMergeTreeClientSequenceArgs,\n range: Partial<IIntegerRange>,\n traceStart?: Trace) {\n if (!opArgs.sequencedMessage) {\n if (traceStart) {\n this.localTime += elapsedMicroseconds(traceStart);\n this.localOps++;\n }\n } else {\n assert(this.mergeTree.getCollabWindow().currentSeq < clientArgs.sequenceNumber,\n 0x030 /* \"Incoming remote op sequence# <= local collabWindow's currentSequence#\" */);\n assert(this.mergeTree.getCollabWindow().minSeq <= opArgs.sequencedMessage.minimumSequenceNumber,\n 0x031 /* \"Incoming remote op minSequence# < local collabWindow's minSequence#\" */);\n if (traceStart) {\n this.accumTime += elapsedMicroseconds(traceStart);\n this.accumOps++;\n this.accumWindow += (this.getCurrentSeq() - this.getCollabWindow().minSeq);\n }\n }\n }\n\n /**\n * Returns a valid range for the op, or undefined\n * @param op - The op to generate the range for\n * @param clientArgs - The client args for the op\n */\n private getValidOpRange(\n op: IMergeTreeAnnotateMsg | IMergeTreeInsertMsg | IMergeTreeRemoveMsg,\n clientArgs: IMergeTreeClientSequenceArgs): IIntegerRange | undefined {\n let start: number | undefined = op.pos1;\n if (start === undefined && op.relativePos1) {\n start = this.mergeTree.posFromRelativePos(\n op.relativePos1,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId);\n }\n\n let end: number | undefined = op.pos2;\n if (end === undefined && op.relativePos2) {\n end = this.mergeTree.posFromRelativePos(\n op.relativePos2,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId);\n }\n\n // Validate if local op\n if (clientArgs.clientId === this.getClientId()) {\n const length = this.getLength();\n\n const invalidPositions: string[] = [];\n\n // Validate start position\n //\n if (start === undefined\n || start < 0\n || start > length\n || start === length && op.type !== MergeTreeDeltaType.INSERT) {\n invalidPositions.push(\"start\");\n }\n // Validate end if not insert, or insert has end\n //\n if (op.type !== MergeTreeDeltaType.INSERT || end !== undefined) {\n if (end === undefined || end <= start!) {\n invalidPositions.push(\"end\");\n }\n }\n\n if (invalidPositions.length > 0) {\n throw new LoggingError(\n \"RangeOutOfBounds\",\n {\n usageError: true,\n end,\n invalidPositions: invalidPositions.toString(),\n length,\n opPos1: op.pos1,\n opPos1Relative: op.relativePos1 !== undefined,\n opPos2: op.pos2,\n opPos2Relative: op.relativePos2 !== undefined,\n opType: op.type,\n start,\n },\n );\n }\n }\n\n // start and end are guaranteed to be non-null here, otherwise we throw above.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return { start, end } as IIntegerRange;\n }\n\n /**\n * Gets the client args from the op if remote, otherwise uses the local clients info\n * @param sequencedMessage - The sequencedMessage to get the client sequence args for\n */\n private getClientSequenceArgsForMessage(sequencedMessage: ISequencedDocumentMessage | undefined):\n IMergeTreeClientSequenceArgs {\n // If there this no sequenced message, then the op is local\n // and unacked, so use this clients sequenced args\n //\n if (!sequencedMessage) {\n const segWindow = this.getCollabWindow();\n return {\n clientId: segWindow.clientId,\n referenceSequenceNumber: segWindow.currentSeq,\n sequenceNumber: this.getLocalSequenceNumber(),\n };\n } else {\n return {\n clientId: this.getOrAddShortClientId(sequencedMessage.clientId),\n referenceSequenceNumber: sequencedMessage.referenceSequenceNumber,\n sequenceNumber: sequencedMessage.sequenceNumber,\n };\n }\n }\n\n /**\n * Gets the client args from the op if remote, otherwise uses the local clients info\n * @param opArgs - The op arg to get the client sequence args for\n */\n private getClientSequenceArgs(opArgs: IMergeTreeDeltaOpArgs): IMergeTreeClientSequenceArgs {\n return this.getClientSequenceArgsForMessage(opArgs.sequencedMessage);\n }\n\n private ackPendingSegment(opArgs: IMergeTreeDeltaOpArgs) {\n const ackOp = (deltaOpArgs: IMergeTreeDeltaOpArgs) => {\n let trace: Trace | undefined;\n if (this.measureOps) {\n trace = Trace.start();\n }\n\n this.mergeTree.ackPendingSegment(deltaOpArgs);\n if (deltaOpArgs.op.type === MergeTreeDeltaType.ANNOTATE) {\n if (deltaOpArgs.op.combiningOp && (deltaOpArgs.op.combiningOp.name === \"consensus\")) {\n this.updateConsensusProperty(deltaOpArgs.op, deltaOpArgs.sequencedMessage!);\n }\n }\n\n if (trace) {\n this.accumTime += elapsedMicroseconds(trace);\n this.accumOps++;\n this.accumWindow += (this.getCurrentSeq() - this.getCollabWindow().minSeq);\n }\n };\n\n if (opArgs.op.type === MergeTreeDeltaType.GROUP) {\n for (const memberOp of opArgs.op.ops) {\n ackOp({\n groupOp: opArgs.op,\n op: memberOp,\n sequencedMessage: opArgs.sequencedMessage,\n });\n }\n } else {\n ackOp(opArgs);\n }\n }\n\n // as functions are modified move them above the eslint-disabled waterline and lint them\n\n cloneFromSegments() {\n const clone = new Client(this.specToSegment, this.logger, this.mergeTree.options);\n const segments: ISegment[] = [];\n const newRoot = this.mergeTree.blockClone(this.mergeTree.root, segments);\n clone.mergeTree.root = newRoot;\n return clone;\n }\n getOrAddShortClientId(longClientId: string) {\n if (!this.clientNameToIds.get(longClientId)) {\n this.addLongClientId(longClientId);\n }\n return this.getShortClientId(longClientId);\n }\n getShortClientId(longClientId: string) {\n return this.clientNameToIds.get(longClientId)!.data;\n }\n getLongClientId(shortClientId: number) {\n if (shortClientId >= 0) {\n return this.shortClientIdMap[shortClientId];\n } else {\n return \"original\";\n }\n }\n addLongClientId(longClientId: string) {\n this.clientNameToIds.put(longClientId, this.shortClientIdMap.length);\n this.shortClientIdMap.push(longClientId);\n }\n\n /**\n * During reconnect, we must find the positions to pending segments\n * relative to other pending segments. This methods computes that\n * position relative to a localSeq. Pending segments above the localSeq\n * will be ignored.\n *\n * @param segment - The segment to find the position for\n * @param localSeq - The localSeq to find the position of the segment at\n */\n protected findReconnectionPosition(segment: ISegment, localSeq: number) {\n assert(localSeq <= this.mergeTree.collabWindow.localSeq, 0x032 /* \"localSeq greater than collab window\" */);\n let segmentPosition = 0;\n /*\n Walk the segments up to the current segment, and calculate it's\n position taking into account local segments that were modified,\n after the current segment.\n\n TODO: Consider embedding this information into the tree for\n more efficient look up of pending segment positions.\n */\n this.mergeTree.walkAllSegments(this.mergeTree.root, (seg) => {\n // If we've found the desired segment, terminate the walk and return 'segmentPosition'.\n if (seg === segment) {\n return false;\n }\n\n // Otherwise, advance segmentPosition if the segment has been inserted and not removed\n // with respect to the given 'localSeq'.\n //\n // Note that all ACKed / remote ops are applied and we only need concern ourself with\n // determining if locally pending ops fall before/after the given 'localSeq'.\n if ((seg.localSeq === undefined || seg.localSeq <= localSeq) // Is inserted\n && (seg.removedSeq === undefined || seg.localRemovedSeq! > localSeq) // Not removed\n ) {\n segmentPosition += seg.cachedLength;\n }\n\n return true;\n });\n\n return segmentPosition;\n }\n\n /**\n * Rebases a (local) position from the perspective `{ seq: seqNumberFrom, localSeq }` to the perspective\n * of the current sequence number. This is desirable when rebasing operations for reconnection.\n *\n * If the position refers to a segment/offset that was removed by some operation between `seqNumberFrom` and\n * the current sequence number, the returned position will align with the position of a reference given\n * `SlideOnRemove` semantics.\n */\n public rebasePosition(\n pos: number,\n seqNumberFrom: number,\n localSeq: number,\n ): number {\n assert(localSeq <= this.mergeTree.collabWindow.localSeq, 0x300 /* localSeq greater than collab window */);\n let segment: ISegment | undefined;\n let posAccumulated = 0;\n let offset = pos;\n const isInsertedInView = (seg: ISegment) =>\n (seg.seq !== undefined && seg.seq !== UnassignedSequenceNumber && seg.seq <= seqNumberFrom)\n || (seg.localSeq !== undefined && seg.localSeq <= localSeq);\n\n const isRemovedFromView = ({ removedSeq, localRemovedSeq }: ISegment) =>\n (removedSeq !== undefined && removedSeq !== UnassignedSequenceNumber && removedSeq <= seqNumberFrom)\n || (localRemovedSeq !== undefined && localRemovedSeq <= localSeq);\n\n this.mergeTree.walkAllSegments(this.mergeTree.root, (seg) => {\n assert(seg.seq !== undefined || seg.localSeq !== undefined,\n 0x301 /* Either seq or localSeq should be defined */);\n segment = seg;\n\n if (isInsertedInView(seg) && !isRemovedFromView(seg)) {\n posAccumulated += seg.cachedLength;\n if (offset >= seg.cachedLength) {\n offset -= seg.cachedLength;\n }\n }\n\n // Keep going while we've yet to reach the segment at the desired position\n return posAccumulated <= pos;\n });\n\n assert(segment !== undefined, 0x302 /* No segment found */);\n const seqNumberTo = this.getCollabWindow().currentSeq;\n if ((segment.removedSeq !== undefined &&\n segment.removedSeq !== UnassignedSequenceNumber &&\n segment.removedSeq <= seqNumberTo)\n || (segment.localRemovedSeq !== undefined && segment.localRemovedSeq <= localSeq)) {\n // Segment that the position was in has been removed: null out offset.\n offset = 0;\n }\n\n assert(0 <= offset && offset < segment.cachedLength, 0x303 /* Invalid offset */);\n return this.findReconnectionPosition(segment, localSeq) + offset;\n }\n\n private resetPendingDeltaToOps(\n resetOp: IMergeTreeDeltaOp,\n segmentGroup: SegmentGroup): IMergeTreeDeltaOp[] {\n assert(!!segmentGroup, 0x033 /* \"Segment group undefined\" */);\n const NACKedSegmentGroup = this.mergeTree.pendingSegments?.dequeue();\n assert(segmentGroup === NACKedSegmentGroup,\n 0x034 /* \"Segment group not at head of merge tree pending queue\" */);\n\n const opList: IMergeTreeDeltaOp[] = [];\n // We need to sort the segments by ordinal, as the segments are not sorted in the segment group.\n // The reason they need them sorted, as they have the same local sequence number and which means\n // farther segments will take into account nearer segments when calculating their position.\n // By sorting we ensure the nearer segment will be applied and sequenced before the father segments\n // so their recalculated positions will be correct.\n for (const segment of segmentGroup.segments.sort((a, b) => a.ordinal < b.ordinal ? -1 : 1)) {\n const segmentSegGroup = segment.segmentGroups.dequeue();\n assert(segmentGroup === segmentSegGroup,\n 0x035 /* \"Segment group not at head of segment pending queue\" */);\n const segmentPosition = this.findReconnectionPosition(segment, segmentGroup.localSeq);\n let newOp: IMergeTreeDeltaOp | undefined;\n switch (resetOp.type) {\n case MergeTreeDeltaType.ANNOTATE:\n assert(segment.propertyManager?.hasPendingProperties() === true,\n 0x036 /* \"Segment has no pending properties\" */);\n // if the segment has been removed, there's no need to send the annotate op\n // unless the remove was local, in which case the annotate must have come\n // before the remove\n if (segment.removedSeq === undefined || segment.localRemovedSeq !== undefined) {\n newOp = createAnnotateRangeOp(\n segmentPosition,\n segmentPosition + segment.cachedLength,\n resetOp.props,\n resetOp.combiningOp);\n }\n break;\n\n case MergeTreeDeltaType.INSERT:\n assert(segment.seq === UnassignedSequenceNumber,\n 0x037 /* \"Segment already has assigned sequence number\" */);\n newOp = createInsertSegmentOp(\n segmentPosition,\n segment);\n break;\n\n case MergeTreeDeltaType.REMOVE:\n if (segment.localRemovedSeq !== undefined) {\n newOp = createRemoveRangeOp(\n segmentPosition,\n segmentPosition + segment.cachedLength);\n }\n break;\n\n default:\n throw new Error(`Invalid op type`);\n }\n\n if (newOp) {\n const newSegmentGroup: SegmentGroup = { segments: [], localSeq: segmentGroup.localSeq };\n segment.segmentGroups.enqueue(newSegmentGroup);\n this.mergeTree.pendingSegments!.enqueue(newSegmentGroup);\n opList.push(newOp);\n }\n }\n\n return opList;\n }\n\n private applyRemoteOp(opArgs: IMergeTreeDeltaOpArgs) {\n const op = opArgs.op;\n const msg = opArgs.sequencedMessage;\n this.getOrAddShortClientId(msg!.clientId);\n switch (op.type) {\n case MergeTreeDeltaType.INSERT:\n this.applyInsertOp(opArgs);\n break;\n case MergeTreeDeltaType.REMOVE:\n this.applyRemoveRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.ANNOTATE:\n this.applyAnnotateRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.GROUP: {\n for (const memberOp of op.ops) {\n this.applyRemoteOp({\n op: memberOp,\n groupOp: op,\n sequencedMessage: msg,\n });\n }\n break;\n }\n default:\n break;\n }\n }\n\n public applyStashedOp(op: IMergeTreeDeltaOp): SegmentGroup;\n public applyStashedOp(op: IMergeTreeGroupMsg): SegmentGroup[];\n public applyStashedOp(op: IMergeTreeOp): SegmentGroup | SegmentGroup[];\n public applyStashedOp(op: IMergeTreeOp): SegmentGroup | SegmentGroup[] {\n let metadata: SegmentGroup | SegmentGroup[] | undefined;\n switch (op.type) {\n case MergeTreeDeltaType.INSERT:\n this.applyInsertOp({ op });\n metadata = this.peekPendingSegmentGroups();\n break;\n case MergeTreeDeltaType.REMOVE:\n this.applyRemoveRangeOp({ op });\n metadata = this.peekPendingSegmentGroups();\n break;\n case MergeTreeDeltaType.ANNOTATE:\n this.applyAnnotateRangeOp({ op });\n metadata = this.peekPendingSegmentGroups();\n break;\n case MergeTreeDeltaType.GROUP:\n return op.ops.map((o) => this.applyStashedOp(o));\n default:\n unreachableCase(op, \"unrecognized op type\");\n }\n assert(!!metadata, 0x2db /* \"Applying op must generate a pending segment\" */);\n return metadata;\n }\n\n public applyMsg(msg: ISequencedDocumentMessage, local: boolean = false) {\n // Ensure client ID is registered\n this.getOrAddShortClientId(msg.clientId);\n // Apply if an operation message\n if (msg.type === MessageType.Operation) {\n const opArgs: IMergeTreeDeltaOpArgs = {\n op: msg.contents as IMergeTreeOp,\n sequencedMessage: msg,\n };\n if (opArgs.sequencedMessage?.clientId === this.longClientId || local) {\n this.ackPendingSegment(opArgs);\n } else {\n this.applyRemoteOp(opArgs);\n }\n }\n\n this.updateSeqNumbers(msg.minimumSequenceNumber, msg.sequenceNumber);\n }\n\n public updateSeqNumbers(min: number, seq: number) {\n const collabWindow = this.mergeTree.getCollabWindow();\n // Equal is fine here due to SharedSegmentSequence<>.snapshotContent() potentially updating with same #\n assert(collabWindow.currentSeq <= seq,\n 0x038 /* \"Incoming op sequence# < local collabWindow's currentSequence#\" */);\n collabWindow.currentSeq = seq;\n assert(min <= seq, 0x039 /* \"Incoming op sequence# < minSequence#\" */);\n this.updateMinSeq(min);\n }\n\n /**\n * Resolves a remote client's position against the local sequence\n * and returns the remote client's position relative to the local\n * sequence\n * @param remoteClientPosition - The remote client's position to resolve\n * @param remoteClientRefSeq - The reference sequence number of the remote client\n * @param remoteClientId - The client id of the remote client\n */\n public resolveRemoteClientPosition(\n remoteClientPosition: number,\n remoteClientRefSeq: number,\n remoteClientId: string): number | undefined {\n const shortRemoteClientId = this.getOrAddShortClientId(remoteClientId);\n return this.mergeTree.resolveRemoteClientPosition(\n remoteClientPosition,\n remoteClientRefSeq,\n shortRemoteClientId);\n }\n\n /**\n * Given an pending operation and segment group, regenerate the op, so it\n * can be resubmitted\n * @param resetOp - The op to reset\n * @param segmentGroup - The segment group associated with the op\n */\n public regeneratePendingOp(\n resetOp: IMergeTreeOp,\n segmentGroup: SegmentGroup | SegmentGroup[],\n ): IMergeTreeOp {\n const opList: IMergeTreeDeltaOp[] = [];\n if (resetOp.type === MergeTreeDeltaType.GROUP) {\n if (Array.isArray(segmentGroup)) {\n assert(resetOp.ops.length === segmentGroup.length,\n 0x03a /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */);\n\n for (let i = 0; i < resetOp.ops.length; i++) {\n opList.push(\n ...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i]));\n }\n } else {\n // A group op containing a single op will pass a direct reference to 'segmentGroup'\n // rather than an array of segment groups. (See 'peekPendingSegmentGroups()')\n assert(resetOp.ops.length === 1,\n 0x03b /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */);\n opList.push(...this.resetPendingDeltaToOps(resetOp.ops[0], segmentGroup));\n }\n } else {\n assert((resetOp.type as any) !== MergeTreeDeltaType.GROUP,\n 0x03c /* \"Reset op has 'group' delta type!\" */);\n assert(!Array.isArray(segmentGroup),\n 0x03d /* \"segmentGroup is array rather than singleton!\" */);\n opList.push(\n ...this.resetPendingDeltaToOps(resetOp, segmentGroup));\n }\n return opList.length === 1 ? opList[0] : createGroupOp(...opList);\n }\n\n public createTextHelper() {\n return new MergeTreeTextHelper(this.mergeTree);\n }\n\n public summarize(\n runtime: IFluidDataStoreRuntime,\n handle: IFluidHandle,\n serializer: IFluidSerializer,\n catchUpMsgs: ISequencedDocumentMessage[],\n ): ISummaryTreeWithStats {\n const deltaManager = runtime.deltaManager;\n const minSeq = deltaManager.minimumSequenceNumber;\n\n // Catch up to latest MSN, if we have not had a chance to do it.\n // Required for case where FluidDataStoreRuntime.attachChannel()\n // generates summary right after loading data store.\n\n this.updateSeqNumbers(minSeq, deltaManager.lastSequenceNumber);\n\n // One of the summaries (from SPO) I observed to have chunk.chunkSequenceNumber > minSeq!\n // Not sure why - need to catch it sooner\n assert(this.getCollabWindow().minSeq === minSeq,\n 0x03e /* \"minSeq mismatch between collab window and delta manager!\" */);\n\n // Must continue to support legacy\n // (See https://github.com/microsoft/FluidFramework/issues/84)\n if (this.mergeTree.options?.newMergeTreeSnapshotFormat === true) {\n assert(\n catchUpMsgs === undefined || catchUpMsgs.length === 0,\n 0x03f /* \"New format should not emit catchup ops\" */);\n const snap = new SnapshotV1(this.mergeTree, this.logger, (id) => this.getLongClientId(id));\n snap.extractSync();\n return snap.emit(serializer, handle);\n } else {\n const snap = new SnapshotLegacy(this.mergeTree, this.logger);\n snap.extractSync();\n return snap.emit(catchUpMsgs, serializer, handle);\n }\n }\n\n public async load(\n runtime: IFluidDataStoreRuntime,\n storage: IChannelStorageService,\n serializer: IFluidSerializer,\n ): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]>; }> {\n const loader = new SnapshotLoader(runtime, this, this.mergeTree, this.logger, serializer);\n\n return loader.initialize(storage);\n }\n\n getStackContext(startPos: number, rangeLabels: string[]): RangeStackMap {\n return this.mergeTree.getStackContext(startPos, this.getCollabWindow().clientId, rangeLabels);\n }\n\n private getLocalSequenceNumber() {\n const segWindow = this.getCollabWindow();\n if (segWindow.collaborating) {\n return UnassignedSequenceNumber;\n } else {\n return UniversalSequenceNumber;\n }\n }\n localTransaction(groupOp: IMergeTreeGroupMsg) {\n for (const op of groupOp.ops) {\n const opArgs: IMergeTreeDeltaOpArgs = {\n op,\n groupOp,\n };\n switch (op.type) {\n case MergeTreeDeltaType.INSERT:\n this.applyInsertOp(opArgs);\n break;\n case MergeTreeDeltaType.ANNOTATE:\n this.applyAnnotateRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.REMOVE:\n this.applyRemoveRangeOp(opArgs);\n break;\n default:\n break;\n }\n }\n }\n updateConsensusProperty(op: IMergeTreeAnnotateMsg, msg: ISequencedDocumentMessage) {\n const markerId = op.relativePos1!.id!;\n const consensusInfo = this.pendingConsensus.get(markerId);\n if (consensusInfo) {\n consensusInfo.marker.addProperties(op.props, op.combiningOp, msg.sequenceNumber);\n }\n this.mergeTree.addMinSeqListener(msg.sequenceNumber, () => consensusInfo!.callback(consensusInfo!.marker));\n }\n\n updateMinSeq(minSeq: number) {\n let trace: Trace | undefined;\n if (this.measureOps) {\n trace = Trace.start();\n }\n this.mergeTree.setMinSeq(minSeq);\n if (trace) {\n const elapsed = elapsedMicroseconds(trace);\n this.accumWindowTime += elapsed;\n if (elapsed > this.maxWindowTime) {\n this.maxWindowTime = elapsed;\n }\n }\n }\n\n getContainingSegment<T extends ISegment>(pos: number, op?: ISequencedDocumentMessage) {\n const args = this.getClientSequenceArgsForMessage(op);\n return this.mergeTree.getContainingSegment<T>(pos, args.referenceSequenceNumber, args.clientId);\n }\n\n /**\n * Returns the position to slide a reference to if a slide is required.\n * @param segoff - The segment and offset to slide from\n * @returns - segment and offset to slide the reference to\n */\n getSlideToSegment(segoff: { segment: ISegment | undefined; offset: number | undefined; }) {\n return this.mergeTree._getSlideToSegment(segoff);\n }\n\n getPropertiesAtPosition(pos: number) {\n let propertiesAtPosition: PropertySet | undefined;\n const segoff = this.getContainingSegment(pos);\n const seg = segoff.segment;\n if (seg) {\n propertiesAtPosition = seg.properties;\n }\n return propertiesAtPosition;\n }\n getRangeExtentsOfPosition(pos: number) {\n let posStart: number | undefined;\n let posAfterEnd: number | undefined;\n\n const segoff = this.getContainingSegment(pos);\n const seg = segoff.segment;\n if (seg) {\n posStart = this.getPosition(seg);\n posAfterEnd = posStart + seg.cachedLength;\n }\n return { posStart, posAfterEnd };\n }\n getCurrentSeq() {\n return this.getCollabWindow().currentSeq;\n }\n getClientId() {\n return this.getCollabWindow().clientId;\n }\n\n getLength() { return this.mergeTree.length; }\n\n startOrUpdateCollaboration(longClientId: string | undefined, minSeq = 0, currentSeq = 0) {\n // we should always have a client id if we are collaborating\n // if the client id is undefined we are likely bound to a detached\n // container, so we should keep going in local mode. once\n // the container attaches this will be called again on connect with the\n // client id\n if (longClientId !== undefined) {\n if (this.longClientId === undefined) {\n this.longClientId = longClientId;\n this.addLongClientId(this.longClientId);\n this.mergeTree.startCollaboration(\n this.getShortClientId(this.longClientId), minSeq, currentSeq);\n } else {\n const oldClientId = this.longClientId;\n const oldData = this.clientNameToIds.get(oldClientId)!.data;\n this.longClientId = longClientId;\n this.clientNameToIds.put(longClientId, oldData);\n this.shortClientIdMap[oldData] = longClientId;\n }\n }\n }\n\n findTile(startPos: number, tileLabel: string, preceding = true) {\n const clientId = this.getClientId();\n return this.mergeTree.findTile(startPos, clientId, tileLabel, preceding);\n }\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -6,7 +6,7 @@ export * from "./base";
6
6
  export * from "./client";
7
7
  export * from "./collections";
8
8
  export * from "./constants";
9
- export { LocalReference, LocalReferenceCollection } from "./localReference";
9
+ export { LocalReference, LocalReferencePosition, LocalReferenceCollection } from "./localReference";
10
10
  export * from "./mergeTree";
11
11
  export * from "./mergeTreeDeltaCallback";
12
12
  export * from "./mergeTreeTracking";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACpG,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;AAEH,yCAAuB;AACvB,2CAAyB;AACzB,gDAA8B;AAC9B,8CAA4B;AAC5B,mDAA4E;AAAnE,gHAAA,cAAc,OAAA;AAAE,0HAAA,wBAAwB,OAAA;AACjD,8CAA4B;AAC5B,2DAAyC;AACzC,sDAAoC;AACpC,8CAA4B;AAC5B,wCAAsB;AACtB,+CAA6B;AAC7B,2DAAyC;AACzC,6DAA2C;AAC3C,mDAAiC;AACjC,qDAAmC;AACnC,gDAA8B;AAC9B,uDAAqC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport * from \"./base\";\nexport * from \"./client\";\nexport * from \"./collections\";\nexport * from \"./constants\";\nexport { LocalReference, LocalReferenceCollection } from \"./localReference\";\nexport * from \"./mergeTree\";\nexport * from \"./mergeTreeDeltaCallback\";\nexport * from \"./mergeTreeTracking\";\nexport * from \"./opBuilder\";\nexport * from \"./ops\";\nexport * from \"./properties\";\nexport * from \"./segmentGroupCollection\";\nexport * from \"./segmentPropertiesManager\";\nexport * from \"./snapshotlegacy\";\nexport * from \"./sortedSegmentSet\";\nexport * from \"./textSegment\";\nexport * from \"./referencePositions\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;AAEH,yCAAuB;AACvB,2CAAyB;AACzB,gDAA8B;AAC9B,8CAA4B;AAC5B,mDAAoG;AAA3F,gHAAA,cAAc,OAAA;AAA0B,0HAAA,wBAAwB,OAAA;AACzE,8CAA4B;AAC5B,2DAAyC;AACzC,sDAAoC;AACpC,8CAA4B;AAC5B,wCAAsB;AACtB,+CAA6B;AAC7B,2DAAyC;AACzC,6DAA2C;AAC3C,mDAAiC;AACjC,qDAAmC;AACnC,gDAA8B;AAC9B,uDAAqC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport * from \"./base\";\nexport * from \"./client\";\nexport * from \"./collections\";\nexport * from \"./constants\";\nexport { LocalReference, LocalReferencePosition, LocalReferenceCollection } from \"./localReference\";\nexport * from \"./mergeTree\";\nexport * from \"./mergeTreeDeltaCallback\";\nexport * from \"./mergeTreeTracking\";\nexport * from \"./opBuilder\";\nexport * from \"./ops\";\nexport * from \"./properties\";\nexport * from \"./segmentGroupCollection\";\nexport * from \"./segmentPropertiesManager\";\nexport * from \"./snapshotlegacy\";\nexport * from \"./sortedSegmentSet\";\nexport * from \"./textSegment\";\nexport * from \"./referencePositions\";\n"]}
@@ -12,10 +12,13 @@ import { ReferencePosition } from "./referencePositions";
12
12
  * @internal
13
13
  */
14
14
  export declare function _validateReferenceType(refType: ReferenceType): void;
15
+ export interface LocalReferencePosition extends ReferencePosition {
16
+ callbacks?: Partial<Record<"beforeSlide" | "afterSlide", () => void>>;
17
+ }
15
18
  /**
16
- * @deprecated - Use ReferencePosition
19
+ * @deprecated - Use LocalReferencePosition
17
20
  */
18
- export declare class LocalReference implements ReferencePosition {
21
+ export declare class LocalReference implements LocalReferencePosition {
19
22
  private readonly client;
20
23
  /**
21
24
  * @deprecated - use getOffset
@@ -35,6 +38,7 @@ export declare class LocalReference implements ReferencePosition {
35
38
  * @deprecated - use getSegment
36
39
  */
37
40
  segment: ISegment | undefined;
41
+ callbacks?: Partial<Record<"beforeSlide" | "afterSlide", () => void>> | undefined;
38
42
  /**
39
43
  * @deprecated - use createReferencePosition
40
44
  */
@@ -141,7 +145,7 @@ export declare class LocalReferenceCollection {
141
145
  *
142
146
  * @internal - this method should only be called by mergeTree
143
147
  */
144
- createLocalRef(offset: number, refType: ReferenceType, properties: PropertySet | undefined, client: Client): ReferencePosition;
148
+ createLocalRef(offset: number | undefined, refType: ReferenceType, properties: PropertySet | undefined, client: Client): ReferencePosition;
145
149
  /**
146
150
  *
147
151
  * @internal - this method should only be called by mergeTree