@fluidframework/merge-tree 0.59.4002 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/.eslintrc.js +1 -1
  2. package/README.md +1 -1
  3. package/REFERENCEPOSITIONS.md +127 -0
  4. package/dist/client.d.ts +17 -0
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/client.js +47 -41
  7. package/dist/client.js.map +1 -1
  8. package/dist/collections.d.ts +5 -4
  9. package/dist/collections.d.ts.map +1 -1
  10. package/dist/collections.js +17 -18
  11. package/dist/collections.js.map +1 -1
  12. package/dist/index.d.ts +1 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +4 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/localReference.d.ts +4 -0
  17. package/dist/localReference.d.ts.map +1 -1
  18. package/dist/localReference.js +24 -3
  19. package/dist/localReference.js.map +1 -1
  20. package/dist/mergeTree.d.ts +20 -0
  21. package/dist/mergeTree.d.ts.map +1 -1
  22. package/dist/mergeTree.js +139 -48
  23. package/dist/mergeTree.js.map +1 -1
  24. package/dist/mergeTreeDeltaCallback.d.ts +8 -10
  25. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  26. package/dist/mergeTreeDeltaCallback.js +6 -10
  27. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  28. package/dist/opBuilder.js +6 -5
  29. package/dist/opBuilder.js.map +1 -1
  30. package/dist/ops.d.ts +12 -10
  31. package/dist/ops.d.ts.map +1 -1
  32. package/dist/ops.js +7 -7
  33. package/dist/ops.js.map +1 -1
  34. package/dist/referencePositions.d.ts +1 -1
  35. package/dist/referencePositions.d.ts.map +1 -1
  36. package/dist/referencePositions.js +3 -2
  37. package/dist/referencePositions.js.map +1 -1
  38. package/lib/client.d.ts +17 -0
  39. package/lib/client.d.ts.map +1 -1
  40. package/lib/client.js +47 -41
  41. package/lib/client.js.map +1 -1
  42. package/lib/collections.d.ts +5 -4
  43. package/lib/collections.d.ts.map +1 -1
  44. package/lib/collections.js +17 -18
  45. package/lib/collections.js.map +1 -1
  46. package/lib/index.d.ts +1 -1
  47. package/lib/index.d.ts.map +1 -1
  48. package/lib/index.js +1 -1
  49. package/lib/index.js.map +1 -1
  50. package/lib/localReference.d.ts +4 -0
  51. package/lib/localReference.d.ts.map +1 -1
  52. package/lib/localReference.js +22 -2
  53. package/lib/localReference.js.map +1 -1
  54. package/lib/mergeTree.d.ts +20 -0
  55. package/lib/mergeTree.d.ts.map +1 -1
  56. package/lib/mergeTree.js +140 -49
  57. package/lib/mergeTree.js.map +1 -1
  58. package/lib/mergeTreeDeltaCallback.d.ts +8 -10
  59. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
  60. package/lib/mergeTreeDeltaCallback.js +6 -10
  61. package/lib/mergeTreeDeltaCallback.js.map +1 -1
  62. package/lib/opBuilder.js +6 -5
  63. package/lib/opBuilder.js.map +1 -1
  64. package/lib/ops.d.ts +12 -10
  65. package/lib/ops.d.ts.map +1 -1
  66. package/lib/ops.js +7 -7
  67. package/lib/ops.js.map +1 -1
  68. package/lib/referencePositions.d.ts +1 -1
  69. package/lib/referencePositions.d.ts.map +1 -1
  70. package/lib/referencePositions.js +3 -2
  71. package/lib/referencePositions.js.map +1 -1
  72. package/package.json +69 -74
  73. package/src/client.ts +27 -18
  74. package/src/collections.ts +5 -4
  75. package/src/index.ts +1 -1
  76. package/src/localReference.ts +24 -2
  77. package/src/mergeTree.ts +133 -39
  78. package/src/mergeTreeDeltaCallback.ts +8 -10
  79. package/src/ops.ts +13 -10
  80. package/src/referencePositions.ts +3 -2
package/lib/client.js CHANGED
@@ -10,6 +10,7 @@ import { UnassignedSequenceNumber, UniversalSequenceNumber } from "./constants";
10
10
  import { LocalReference } from "./localReference";
11
11
  import { compareStrings, MergeTree, } from "./mergeTree";
12
12
  import { createAnnotateMarkerOp, createAnnotateRangeOp, createGroupOp, createInsertSegmentOp, createRemoveRangeOp, } from "./opBuilder";
13
+ import { MergeTreeDeltaType, } from "./ops";
13
14
  import { SnapshotLegacy } from "./snapshotlegacy";
14
15
  import { SnapshotLoader } from "./snapshotLoader";
15
16
  import { MergeTreeTextHelper } from "./textSegment";
@@ -244,7 +245,7 @@ export class Client {
244
245
  * @returns True if the remove was applied. False if it could not be.
245
246
  */
246
247
  applyRemoveRangeOp(opArgs) {
247
- assert(opArgs.op.type === 1 /* REMOVE */, 0x02d /* "Unexpected op type on range remove!" */);
248
+ assert(opArgs.op.type === MergeTreeDeltaType.REMOVE, 0x02d /* "Unexpected op type on range remove!" */);
248
249
  const op = opArgs.op;
249
250
  const clientArgs = this.getClientSequenceArgs(opArgs);
250
251
  const range = this.getValidOpRange(op, clientArgs);
@@ -265,7 +266,7 @@ export class Client {
265
266
  * @returns True if the annotate was applied. False if it could not be.
266
267
  */
267
268
  applyAnnotateRangeOp(opArgs) {
268
- assert(opArgs.op.type === 2 /* ANNOTATE */, 0x02e /* "Unexpected op type on range annotate!" */);
269
+ assert(opArgs.op.type === MergeTreeDeltaType.ANNOTATE, 0x02e /* "Unexpected op type on range annotate!" */);
269
270
  const op = opArgs.op;
270
271
  const clientArgs = this.getClientSequenceArgs(opArgs);
271
272
  const range = this.getValidOpRange(op, clientArgs);
@@ -286,7 +287,7 @@ export class Client {
286
287
  * @returns True if the insert was applied. False if it could not be.
287
288
  */
288
289
  applyInsertOp(opArgs) {
289
- assert(opArgs.op.type === 0 /* INSERT */, 0x02f /* "Unexpected op type on range insert!" */);
290
+ assert(opArgs.op.type === MergeTreeDeltaType.INSERT, 0x02f /* "Unexpected op type on range insert!" */);
290
291
  const op = opArgs.op;
291
292
  const clientArgs = this.getClientSequenceArgs(opArgs);
292
293
  const range = this.getValidOpRange(op, clientArgs);
@@ -355,12 +356,12 @@ export class Client {
355
356
  if (start === undefined
356
357
  || start < 0
357
358
  || start > length
358
- || start === length && op.type !== 0 /* INSERT */) {
359
+ || start === length && op.type !== MergeTreeDeltaType.INSERT) {
359
360
  invalidPositions.push("start");
360
361
  }
361
362
  // Validate end if not insert, or insert has end
362
363
  //
363
- if (op.type !== 0 /* INSERT */ || end !== undefined) {
364
+ if (op.type !== MergeTreeDeltaType.INSERT || end !== undefined) {
364
365
  if (end === undefined || end <= start) {
365
366
  invalidPositions.push("end");
366
367
  }
@@ -386,13 +387,13 @@ export class Client {
386
387
  }
387
388
  /**
388
389
  * Gets the client args from the op if remote, otherwise uses the local clients info
389
- * @param opArgs - The op arg to get the client sequence args for
390
+ * @param sequencedMessage - The sequencedMessage to get the client sequence args for
390
391
  */
391
- getClientSequenceArgs(opArgs) {
392
+ getClientSequenceArgsForMessage(sequencedMessage) {
392
393
  // If there this no sequenced message, then the op is local
393
394
  // and unacked, so use this clients sequenced args
394
395
  //
395
- if (!opArgs.sequencedMessage) {
396
+ if (!sequencedMessage) {
396
397
  const segWindow = this.getCollabWindow();
397
398
  return {
398
399
  clientId: segWindow.clientId,
@@ -402,12 +403,19 @@ export class Client {
402
403
  }
403
404
  else {
404
405
  return {
405
- clientId: this.getShortClientId(opArgs.sequencedMessage.clientId),
406
- referenceSequenceNumber: opArgs.sequencedMessage.referenceSequenceNumber,
407
- sequenceNumber: opArgs.sequencedMessage.sequenceNumber,
406
+ clientId: this.getOrAddShortClientId(sequencedMessage.clientId),
407
+ referenceSequenceNumber: sequencedMessage.referenceSequenceNumber,
408
+ sequenceNumber: sequencedMessage.sequenceNumber,
408
409
  };
409
410
  }
410
411
  }
412
+ /**
413
+ * Gets the client args from the op if remote, otherwise uses the local clients info
414
+ * @param opArgs - The op arg to get the client sequence args for
415
+ */
416
+ getClientSequenceArgs(opArgs) {
417
+ return this.getClientSequenceArgsForMessage(opArgs.sequencedMessage);
418
+ }
411
419
  ackPendingSegment(opArgs) {
412
420
  const ackOp = (deltaOpArgs) => {
413
421
  let trace;
@@ -415,7 +423,7 @@ export class Client {
415
423
  trace = Trace.start();
416
424
  }
417
425
  this.mergeTree.ackPendingSegment(deltaOpArgs);
418
- if (deltaOpArgs.op.type === 2 /* ANNOTATE */) {
426
+ if (deltaOpArgs.op.type === MergeTreeDeltaType.ANNOTATE) {
419
427
  if (deltaOpArgs.op.combiningOp && (deltaOpArgs.op.combiningOp.name === "consensus")) {
420
428
  this.updateConsensusProperty(deltaOpArgs.op, deltaOpArgs.sequencedMessage);
421
429
  }
@@ -426,7 +434,7 @@ export class Client {
426
434
  this.accumWindow += (this.getCurrentSeq() - this.getCollabWindow().minSeq);
427
435
  }
428
436
  };
429
- if (opArgs.op.type === 3 /* GROUP */) {
437
+ if (opArgs.op.type === MergeTreeDeltaType.GROUP) {
430
438
  for (const memberOp of opArgs.op.ops) {
431
439
  ackOp({
432
440
  groupOp: opArgs.op,
@@ -524,7 +532,7 @@ export class Client {
524
532
  const segmentPosition = this.findReconnectionPosition(segment, segmentGroup.localSeq);
525
533
  let newOp;
526
534
  switch (resetOp.type) {
527
- case 2 /* ANNOTATE */:
535
+ case MergeTreeDeltaType.ANNOTATE:
528
536
  assert(((_b = segment.propertyManager) === null || _b === void 0 ? void 0 : _b.hasPendingProperties()) === true, 0x036 /* "Segment has no pending properties" */);
529
537
  // if the segment has been removed, there's no need to send the annotate op
530
538
  // unless the remove was local, in which case the annotate must have come
@@ -533,11 +541,11 @@ export class Client {
533
541
  newOp = createAnnotateRangeOp(segmentPosition, segmentPosition + segment.cachedLength, resetOp.props, resetOp.combiningOp);
534
542
  }
535
543
  break;
536
- case 0 /* INSERT */:
544
+ case MergeTreeDeltaType.INSERT:
537
545
  assert(segment.seq === UnassignedSequenceNumber, 0x037 /* "Segment already has assigned sequence number" */);
538
546
  newOp = createInsertSegmentOp(segmentPosition, segment);
539
547
  break;
540
- case 1 /* REMOVE */:
548
+ case MergeTreeDeltaType.REMOVE:
541
549
  if (segment.localRemovedSeq !== undefined) {
542
550
  newOp = createRemoveRangeOp(segmentPosition, segmentPosition + segment.cachedLength);
543
551
  }
@@ -559,16 +567,16 @@ export class Client {
559
567
  const msg = opArgs.sequencedMessage;
560
568
  this.getOrAddShortClientId(msg.clientId);
561
569
  switch (op.type) {
562
- case 0 /* INSERT */:
570
+ case MergeTreeDeltaType.INSERT:
563
571
  this.applyInsertOp(opArgs);
564
572
  break;
565
- case 1 /* REMOVE */:
573
+ case MergeTreeDeltaType.REMOVE:
566
574
  this.applyRemoveRangeOp(opArgs);
567
575
  break;
568
- case 2 /* ANNOTATE */:
576
+ case MergeTreeDeltaType.ANNOTATE:
569
577
  this.applyAnnotateRangeOp(opArgs);
570
578
  break;
571
- case 3 /* GROUP */: {
579
+ case MergeTreeDeltaType.GROUP: {
572
580
  for (const memberOp of op.ops) {
573
581
  this.applyRemoteOp({
574
582
  op: memberOp,
@@ -585,19 +593,19 @@ export class Client {
585
593
  applyStashedOp(op) {
586
594
  let metadata;
587
595
  switch (op.type) {
588
- case 0 /* INSERT */:
596
+ case MergeTreeDeltaType.INSERT:
589
597
  this.applyInsertOp({ op });
590
598
  metadata = this.peekPendingSegmentGroups();
591
599
  break;
592
- case 1 /* REMOVE */:
600
+ case MergeTreeDeltaType.REMOVE:
593
601
  this.applyRemoveRangeOp({ op });
594
602
  metadata = this.peekPendingSegmentGroups();
595
603
  break;
596
- case 2 /* ANNOTATE */:
604
+ case MergeTreeDeltaType.ANNOTATE:
597
605
  this.applyAnnotateRangeOp({ op });
598
606
  metadata = this.peekPendingSegmentGroups();
599
607
  break;
600
- case 3 /* GROUP */:
608
+ case MergeTreeDeltaType.GROUP:
601
609
  return op.ops.map((o) => this.applyStashedOp(o));
602
610
  default:
603
611
  unreachableCase(op, "unrecognized op type");
@@ -652,7 +660,7 @@ export class Client {
652
660
  */
653
661
  regeneratePendingOp(resetOp, segmentGroup) {
654
662
  const opList = [];
655
- if (resetOp.type === 3 /* GROUP */) {
663
+ if (resetOp.type === MergeTreeDeltaType.GROUP) {
656
664
  if (Array.isArray(segmentGroup)) {
657
665
  assert(resetOp.ops.length === segmentGroup.length, 0x03a /* "Number of ops in 'resetOp' must match the number of segment groups provided." */);
658
666
  for (let i = 0; i < resetOp.ops.length; i++) {
@@ -667,7 +675,7 @@ export class Client {
667
675
  }
668
676
  }
669
677
  else {
670
- assert(resetOp.type !== 3 /* GROUP */, 0x03c /* "Reset op has 'group' delta type!" */);
678
+ assert(resetOp.type !== MergeTreeDeltaType.GROUP, 0x03c /* "Reset op has 'group' delta type!" */);
671
679
  assert(!Array.isArray(segmentGroup), 0x03d /* "segmentGroup is array rather than singleton!" */);
672
680
  opList.push(...this.resetPendingDeltaToOps(resetOp, segmentGroup));
673
681
  }
@@ -724,13 +732,13 @@ export class Client {
724
732
  groupOp,
725
733
  };
726
734
  switch (op.type) {
727
- case 0 /* INSERT */:
735
+ case MergeTreeDeltaType.INSERT:
728
736
  this.applyInsertOp(opArgs);
729
737
  break;
730
- case 2 /* ANNOTATE */:
738
+ case MergeTreeDeltaType.ANNOTATE:
731
739
  this.applyAnnotateRangeOp(opArgs);
732
740
  break;
733
- case 1 /* REMOVE */:
741
+ case MergeTreeDeltaType.REMOVE:
734
742
  this.applyRemoveRangeOp(opArgs);
735
743
  break;
736
744
  default:
@@ -761,18 +769,16 @@ export class Client {
761
769
  }
762
770
  }
763
771
  getContainingSegment(pos, op) {
764
- let seq;
765
- let clientId;
766
- if (op) {
767
- clientId = this.getOrAddShortClientId(op.clientId);
768
- seq = op.referenceSequenceNumber;
769
- }
770
- else {
771
- const segWindow = this.mergeTree.getCollabWindow();
772
- seq = segWindow.currentSeq;
773
- clientId = segWindow.clientId;
774
- }
775
- return this.mergeTree.getContainingSegment(pos, seq, clientId);
772
+ const args = this.getClientSequenceArgsForMessage(op);
773
+ return this.mergeTree.getContainingSegment(pos, args.referenceSequenceNumber, args.clientId);
774
+ }
775
+ /**
776
+ * Returns the position to slide a reference to if a slide is required.
777
+ * @param segoff - The segment and offset to slide from
778
+ * @returns - segment and offset to slide the reference to
779
+ */
780
+ getSlideToSegment(segoff) {
781
+ return this.mergeTree._getSlideToSegment(segoff);
776
782
  }
777
783
  getPropertiesAtPosition(pos) {
778
784
  let propertiesAtPosition;
package/lib/client.js.map CHANGED
@@ -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 } 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 opArgs - The op arg to get the client sequence args for\n */\n private getClientSequenceArgs(opArgs: IMergeTreeDeltaOpArgs): 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 (!opArgs.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.getShortClientId(opArgs.sequencedMessage.clientId),\n referenceSequenceNumber: opArgs.sequencedMessage.referenceSequenceNumber,\n sequenceNumber: opArgs.sequencedMessage.sequenceNumber,\n };\n }\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 let seq: number;\n let clientId: number;\n if (op) {\n clientId = this.getOrAddShortClientId(op.clientId);\n seq = op.referenceSequenceNumber;\n } else {\n const segWindow = this.mergeTree.getCollabWindow();\n seq = segWindow.currentSeq;\n clientId = segWindow.clientId;\n }\n return this.mergeTree.getContainingSegment<T>(pos, seq, clientId);\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, _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"]}
@@ -51,10 +51,11 @@ export declare class Heap<T> {
51
51
  private fixup;
52
52
  private fixDown;
53
53
  }
54
- export declare const enum RBColor {
55
- RED = 0,
56
- BLACK = 1
57
- }
54
+ export declare const RBColor: {
55
+ readonly RED: 0;
56
+ readonly BLACK: 1;
57
+ };
58
+ export declare type RBColor = typeof RBColor[keyof typeof RBColor];
58
59
  export interface RBNode<TKey, TData> {
59
60
  key: TKey;
60
61
  data: TData;
@@ -1 +1 @@
1
- {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EACH,cAAc,EACd,aAAa,EACb,WAAW,EACX,cAAc,EACd,gBAAgB,EACnB,MAAM,QAAQ,CAAC;AAEhB,qBAAa,KAAK,CAAC,CAAC;IACT,KAAK,EAAE,CAAC,EAAE,CAAM;IAChB,IAAI,CAAC,GAAG,EAAE,CAAC;IAIX,KAAK;IAIL,GAAG,IAAI,CAAC,GAAG,SAAS;IAIpB,GAAG,IAAI,CAAC,GAAG,SAAS;CAG9B;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAUtE;AAMD,wBAAgB,YAAY,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAEzC;AAED,qBAAa,IAAI,CAAC,CAAC;IAII,MAAM,EAAE,OAAO;IAAS,IAAI,EAAE,CAAC,GAAG,SAAS;IAHvD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;gBAEF,MAAM,EAAE,OAAO,EAAS,IAAI,EAAE,CAAC,GAAG,SAAS;IAKvD,KAAK,IAAI,IAAI;IAOpB,OAAO,CAAC,GAAG;IASJ,OAAO,IAAI,CAAC,GAAG,SAAS;IAQxB,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAIzB,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAO7C,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE;IAkB9D,KAAK,IAAI,MAAM;IAWf,KAAK,IAAI,CAAC,GAAG,SAAS;IAMtB,IAAI,IAAI,CAAC,GAAG,SAAS;IAMrB,KAAK,IAAI,OAAO;IAIvB;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAInB,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAUtB,CAAC,MAAM,CAAC,QAAQ,CAAC;CAmB3B;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC;IACvB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;IAC5B,GAAG,EAAE,CAAC,CAAC;CACV;AAED,qBAAa,IAAI,CAAC,CAAC;IAKY,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAJ5C,OAAO,CAAC,CAAC,CAAM;IACR,KAAK;gBAGA,CAAC,EAAE,CAAC,EAAE,EAAS,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAMrC,IAAI;IAIJ,GAAG;IAQH,GAAG,CAAC,CAAC,EAAE,CAAC;IAMf,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,OAAO;CAiBlB;AAED,eAAO,MAAM,OAAO;;;CAGV,CAAC;AACX,oBAAY,OAAO,GAAG,OAAO,OAAO,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;AAE3D,MAAM,WAAW,MAAM,CAAC,IAAI,EAAE,KAAK;IAC/B,GAAG,EAAE,IAAI,CAAC;IACV,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe,CAAC,IAAI,EAAE,KAAK;IACxC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,UAAU,CAAC,IAAI,EAAE,KAAK;IACnC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC;IAC3E,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC;CACxE;AAED,MAAM,WAAW,aAAa,CAAC,IAAI,EAAE,KAAK;IACtC,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC;IAC3C,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC;IACzC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC;IAC1C,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,YAAY,CAAC,IAAI,EAAE,KAAK,CAAE,YAAW,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC;IAIvE,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;IAJzB,OAAO,CAAC,IAAI,CAAkC;gBAGzB,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,EAC9B,GAAG,CAAC,0CAA8B;IAGvD,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,QAAQ;IAGT,IAAI;IAGJ,OAAO;IAGP,GAAG,CAAC,GAAG,EAAE,IAAI;IAKpB,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,QAAQ;IAIT,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;IAQzD,OAAO,CAAC,UAAU;IAkBX,uBAAuB,CAC1B,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,MAAM,EAChD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI,EAC7C,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,EAC3C,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO;IAIhD,OAAO,CAAC,2BAA2B;IAqB5B,wBAAwB,CAC3B,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,MAAM,EAChD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI,EAC7C,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,EAC3C,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO;IAIhD,OAAO,CAAC,4BAA4B;IAqB7B,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC;IAWzE,OAAO,CAAC,OAAO;IA+Cf,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,aAAa;IAad,MAAM,CAAC,GAAG,EAAE,IAAI;IAWhB,cAAc,CAAC,GAAG,EAAE,IAAI;IAW/B,OAAO,CAAC,UAAU;IAmCX,KAAK,CAAC,GAAG,EAAE,IAAI;IAMtB,OAAO,CAAC,SAAS;IAkBV,IAAI,CAAC,GAAG,EAAE,IAAI;IAMrB,OAAO,CAAC,QAAQ;IAkBT,GAAG;IAMV,OAAO,CAAC,OAAO;IAQR,GAAG;IAMV,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,OAAO;IAmBR,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI;IAI9F,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM;IAK/D,IAAI;IAaX;;;;OAIG;IACI,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC;IAIxC,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC;IAIvD,OAAO,CAAC,QAAQ;IA4BhB,OAAO,CAAC,gBAAgB;IA4BxB,OAAO,CAAC,OAAO;CAiClB;AAED,MAAM,WAAW,qBAAqB;IAClC,MAAM,EAAE,SAAS,CAAC;CACrB;AAED,eAAO,MAAM,oBAAoB,UAAW,aAAa,WAAoC,CAAC;AAE9F,MAAM,WAAW,SAAS;IACtB,KAAK,IAAI,SAAS,CAAC;IACnB,OAAO,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC9B,YAAY,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACnC,UAAU,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACjC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,yBAAyB,GAAG,SAAS,GAAG,SAAS,CAAC;IACzG,QAAQ,CAAC,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAChC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAClC;AAGD,oBAAY,YAAY,CAAC,CAAC,SAAS,SAAS,IAAI,MAAM,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;AACjF,oBAAY,wBAAwB,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,KAAK,SAAS,CAAC;AAE5F,qBAAa,YAAY,CAAC,CAAC,SAAS,SAAS,CAAE,YAAW,eAAe,CAAC,CAAC,EAAE,qBAAqB,CAAC,EAC/F,UAAU,CAAC,CAAC,EAAE,qBAAqB,CAAC;IAC7B,SAAS,yCAAsE;IAE/E,MAAM,CAAC,CAAC,EAAE,CAAC;IAIX,cAAc,CAAC,CAAC,EAAE,CAAC;IAInB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAahD,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI;IAWtB,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO;IAU9B,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI;IAY9B,KAAK,CAAC,CAAC,EAAE,CAAC;IAIV,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,CAAC;IAInD,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,CAAC;IAIzD,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;CActC;AAED,MAAM,WAAW,SAAS,CAAC,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC;CACV;AAED,MAAM,WAAW,OAAO,CAAC,CAAC;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,CAAC;CACX;AAMD,MAAM,WAAW,UAAU,CAAC,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,CAAC,CAAC;CACV;AAED,qBAAa,GAAG,CAAC,CAAC;IACd,OAAO,CAAC,CAAC,CAAK;IACd,OAAO,CAAC,IAAI,CAAyB;IAE9B,IAAI;IAIX,OAAO,CAAC,QAAQ;IAIT,GAAG,CAAC,GAAG,EAAE,MAAM;IAQtB,OAAO,CAAC,OAAO;IAcR,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAO9B,OAAO,CAAC,OAAO;IAkBR,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAI;IAOpC,cAAc,CAAC,IAAI,EAAE,MAAM;IAalC,OAAO,CAAC,OAAO;IAYf,OAAO,CAAC,OAAO;IAaR,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI;IAIrC,eAAe,CAAC,IAAI,EAAE,MAAM;IAanC,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,aAAa;CAkCxB"}