@fluidframework/merge-tree 0.53.0 → 0.54.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.
@@ -1 +1 @@
1
- {"version":3,"file":"mergeTree.js","sourceRoot":"","sources":["../src/mergeTree.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/* eslint-disable @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-shadow, max-len, no-bitwise */\n\nimport { assert, Trace } from \"@fluidframework/common-utils\";\nimport { IIntegerRange } from \"./base\";\nimport {\n Comparer,\n Heap,\n List,\n ListMakeHead,\n Stack,\n} from \"./collections\";\nimport {\n LocalClientId,\n NonCollabClient,\n TreeMaintenanceSequenceNumber,\n UnassignedSequenceNumber,\n UniversalSequenceNumber,\n} from \"./constants\";\nimport { LocalReference, LocalReferenceCollection } from \"./localReference\";\nimport {\n IMergeTreeDeltaOpArgs,\n IMergeTreeSegmentDelta,\n MergeTreeDeltaCallback,\n MergeTreeMaintenanceCallback,\n MergeTreeMaintenanceType,\n} from \"./mergeTreeDeltaCallback\";\nimport { TrackingGroupCollection } from \"./mergeTreeTracking\";\nimport {\n ICombiningOp,\n IJSONSegment,\n IMarkerDef,\n IRelativePosition,\n MergeTreeDeltaType,\n ReferenceType,\n} from \"./ops\";\nimport { PartialSequenceLengths } from \"./partialLengths\";\nimport {\n clone,\n createMap,\n extend,\n extendIfUndefined,\n MapLike,\n matchProperties,\n PropertySet,\n} from \"./properties\";\nimport { SegmentGroupCollection } from \"./segmentGroupCollection\";\nimport { PropertiesManager } from \"./segmentPropertiesManager\";\n\nexport interface ReferencePosition {\n properties?: PropertySet;\n refType: ReferenceType;\n // True if this reference is a segment.\n isLeaf(): boolean;\n getSegment(): ISegment | undefined;\n getOffset(): number;\n addProperties(newProps: PropertySet, op?: ICombiningOp): void;\n hasTileLabels(): boolean;\n hasRangeLabels(): boolean;\n hasTileLabel(label: string): boolean;\n hasRangeLabel(label: string): boolean;\n getTileLabels(): string[] | undefined;\n getRangeLabels(): string[] | undefined;\n}\n\nexport type RangeStackMap = MapLike<Stack<ReferencePosition>>;\n\nexport interface IMergeNodeCommon {\n parent?: IMergeBlock;\n /**\n * The length of the contents of the node.\n */\n cachedLength: number;\n index: number;\n ordinal: string;\n isLeaf(): this is ISegment;\n}\n\nexport type IMergeNode = IMergeBlock | ISegment;\n\n// Node with segments as children\nexport interface IMergeBlock extends IMergeNodeCommon {\n needsScour?: boolean;\n childCount: number;\n children: IMergeNode[];\n partialLengths?: PartialSequenceLengths;\n hierBlock(): IHierBlock | undefined;\n assignChild(child: IMergeNode, index: number, updateOrdinal?: boolean): void;\n setOrdinal(child: IMergeNode, index: number): void;\n}\n\nexport interface IHierBlock extends IMergeBlock {\n hierToString(indentCount: number): string;\n addNodeReferences(mergeTree: MergeTree, node: IMergeNode): void;\n rightmostTiles: MapLike<ReferencePosition>;\n leftmostTiles: MapLike<ReferencePosition>;\n rangeStacks: RangeStackMap;\n}\n\nexport interface IRemovalInfo {\n removedSeq?: number;\n removedClientId?: number;\n removedClientOverlap?: number[];\n}\n\n/**\n * A segment representing a portion of the merge tree.\n */\nexport interface ISegment extends IMergeNodeCommon, IRemovalInfo {\n readonly type: string;\n readonly segmentGroups: SegmentGroupCollection;\n readonly trackingCollection: TrackingGroupCollection;\n propertyManager?: PropertiesManager;\n localSeq?: number;\n localRemovedSeq?: number;\n seq?: number; // If not present assumed to be previous to window min\n clientId: number;\n localRefs?: LocalReferenceCollection;\n properties?: PropertySet;\n addProperties(\n newProps: PropertySet,\n op?: ICombiningOp,\n seq?: number,\n collabWindow?: CollaborationWindow,\n ): PropertySet | undefined;\n clone(): ISegment;\n canAppend(segment: ISegment): boolean;\n append(segment: ISegment): void;\n splitAt(pos: number): ISegment | undefined;\n toJSONObject(): any;\n /**\n * Acks the current segment against the segment group, op, and merge tree.\n *\n * Throws error if the segment state doesn't match segment group or op.\n * E.g. Segment group not first is pending queue.\n * Inserted segment does not have unassigned sequence number.\n *\n * Returns true if the op modifies the segment, otherwise false.\n * The only current false case is overlapping remove, where a segment is removed\n * by a previously sequenced operation before the current operation is acked.\n */\n ack(segmentGroup: SegmentGroup, opArgs: IMergeTreeDeltaOpArgs, mergeTree: MergeTree): boolean;\n}\n\nexport interface IMarkerModifiedAction {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (marker: Marker): void;\n}\n\nexport interface ISegmentAction<TClientData> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number,\n end: number, accum: TClientData): boolean;\n}\n\nexport interface ISegmentChanges {\n next?: ISegment;\n replaceCurrent?: ISegment;\n}\n\nexport interface BlockAction<TClientData> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (block: IMergeBlock, pos: number, refSeq: number, clientId: number, start: number | undefined, end: number | undefined,\n accum: TClientData): boolean;\n}\n\nexport interface NodeAction<TClientData> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (node: IMergeNode, pos: number, refSeq: number, clientId: number, start: number | undefined, end: number | undefined,\n clientData: TClientData): boolean;\n}\n\nexport interface IncrementalSegmentAction<TContext> {\n (segment: ISegment, state: IncrementalMapState<TContext>);\n}\n\nexport interface IncrementalBlockAction<TContext> {\n (state: IncrementalMapState<TContext>);\n}\n\nexport interface BlockUpdateActions {\n child: (block: IMergeBlock, index: number) => void;\n}\n\nexport interface InsertContext {\n candidateSegment?: ISegment;\n prepareEvents?: boolean;\n structureChange?: boolean;\n leaf: (segment: ISegment | undefined, pos: number, ic: InsertContext) => ISegmentChanges;\n continuePredicate?: (continueFromBlock: IMergeBlock) => boolean;\n}\n\nexport interface SegmentActions<TClientData> {\n leaf?: ISegmentAction<TClientData>;\n shift?: NodeAction<TClientData>;\n contains?: NodeAction<TClientData>;\n pre?: BlockAction<TClientData>;\n post?: BlockAction<TClientData>;\n}\n\nexport interface IncrementalSegmentActions<TContext> {\n leaf: IncrementalSegmentAction<TContext>;\n pre?: IncrementalBlockAction<TContext>;\n post?: IncrementalBlockAction<TContext>;\n}\n\nexport interface SearchResult {\n text: string;\n pos: number;\n}\n\nexport interface MergeTreeStats {\n maxHeight: number;\n nodeCount: number;\n leafCount: number;\n removedLeafCount: number;\n liveCount: number;\n histo: number[];\n windowTime?: number;\n packTime?: number;\n ordTime?: number;\n maxOrdTime?: number;\n}\n\nexport interface SegmentGroup {\n segments: ISegment[];\n localSeq: number;\n}\n\nexport class MergeNode implements IMergeNodeCommon {\n index: number = 0;\n ordinal: string = \"\";\n parent?: IMergeBlock;\n cachedLength: number = 0;\n\n isLeaf() {\n return false;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction addTile(tile: ReferencePosition, tiles: object) {\n const tileLabels = tile.getTileLabels();\n if (tileLabels) {\n for (const tileLabel of tileLabels) {\n tiles[tileLabel] = tile;\n }\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction addTileIfNotPresent(tile: ReferencePosition, tiles: object) {\n const tileLabels = tile.getTileLabels();\n if (tileLabels) {\n for (const tileLabel of tileLabels) {\n if (tiles[tileLabel] === undefined) {\n tiles[tileLabel] = tile;\n }\n }\n }\n}\n\nfunction applyStackDelta(currentStackMap: RangeStackMap, deltaStackMap: RangeStackMap) {\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const label in deltaStackMap) {\n const deltaStack = deltaStackMap[label];\n if (!deltaStack.empty()) {\n let currentStack = currentStackMap[label];\n if (currentStack === undefined) {\n currentStack = new Stack<ReferencePosition>();\n currentStackMap[label] = currentStack;\n }\n for (const delta of deltaStack.items) {\n applyRangeReference(currentStack, delta);\n }\n }\n }\n}\n\nfunction applyRangeReference(stack: Stack<ReferencePosition>, delta: ReferencePosition) {\n if (delta.refType & ReferenceType.NestBegin) {\n stack.push(delta);\n return true;\n } else {\n // Assume delta is end reference\n const top = stack.top();\n // TODO: match end with begin\n if (top && (top.refType & ReferenceType.NestBegin)) {\n stack.pop();\n } else {\n stack.push(delta);\n }\n return false;\n }\n}\n\nfunction addNodeReferences(\n mergeTree: MergeTree, node: IMergeNode,\n rightmostTiles: MapLike<ReferencePosition>,\n leftmostTiles: MapLike<ReferencePosition>, rangeStacks: RangeStackMap) {\n function updateRangeInfo(label: string, refPos: ReferencePosition) {\n let stack = rangeStacks[label];\n if (stack === undefined) {\n stack = new Stack<ReferencePosition>();\n rangeStacks[label] = stack;\n }\n applyRangeReference(stack, refPos);\n }\n if (node.isLeaf()) {\n const segment = node;\n if (mergeTree.localNetLength(segment) ?? 0 > 0) {\n if (Marker.is(segment)) {\n const markerId = segment.getId();\n // Also in insertMarker but need for reload segs case\n // can add option for this only from reload segs\n if (markerId) {\n mergeTree.mapIdToSegment(markerId, segment);\n }\n if (segment.refType & ReferenceType.Tile) {\n addTile(segment, rightmostTiles);\n addTileIfNotPresent(segment, leftmostTiles);\n }\n if (segment.refType & (ReferenceType.NestBegin | ReferenceType.NestEnd)) {\n const rangeLabels = segment.getRangeLabels();\n if (rangeLabels) {\n for (const label of segment.getRangeLabels()!) {\n updateRangeInfo(label, segment);\n }\n }\n }\n } else {\n const baseSegment = node as BaseSegment;\n if (baseSegment.localRefs && (baseSegment.localRefs.hierRefCount !== undefined) &&\n (baseSegment.localRefs.hierRefCount > 0)) {\n for (const lref of baseSegment.localRefs) {\n if (lref.refType & ReferenceType.Tile) {\n addTile(lref, rightmostTiles);\n addTileIfNotPresent(lref, leftmostTiles);\n }\n if (lref.refType & (ReferenceType.NestBegin | ReferenceType.NestEnd)) {\n for (const label of lref.getRangeLabels()!) {\n updateRangeInfo(label, lref);\n }\n }\n }\n }\n }\n }\n } else {\n const block = <IHierBlock>node;\n applyStackDelta(rangeStacks, block.rangeStacks);\n extend(rightmostTiles, block.rightmostTiles);\n extendIfUndefined(leftmostTiles, block.leftmostTiles);\n }\n}\n\nexport function ordinalToArray(ord: string) {\n const a: number[] = [];\n if (ord) {\n for (let i = 0, len = ord.length; i < len; i++) {\n a.push(ord.charCodeAt(i));\n }\n }\n return a;\n}\n\n// Note that the actual branching factor of the MergeTree is `MaxNodesInBlock - 1`. This is because\n// the MergeTree always inserts first, then checks for overflow and splits if the child count equals\n// `MaxNodesInBlock`. (i.e., `MaxNodesInBlock` contains 1 extra slot for temporary storage to\n// facilitate splits.)\nexport const MaxNodesInBlock = 8;\n\nexport class MergeBlock extends MergeNode implements IMergeBlock {\n static traceOrdinals = false;\n children: IMergeNode[];\n constructor(public childCount: number) {\n super();\n this.children = new Array<IMergeNode>(MaxNodesInBlock);\n }\n\n hierBlock(): HierMergeBlock | undefined {\n return undefined;\n }\n\n setOrdinal(child: IMergeNode, index: number) {\n let childCount = this.childCount;\n if (childCount === 8) {\n childCount = 7;\n }\n assert((childCount >= 1) && (childCount <= 7), 0x040 /* \"Child count is not within [1,7] range!\" */);\n let localOrdinal: number;\n const ordinalWidth = 1 << (MaxNodesInBlock - (childCount + 1));\n if (index === 0) {\n localOrdinal = ordinalWidth - 1;\n } else {\n const prevOrd = this.children[index - 1].ordinal;\n const prevOrdCode = prevOrd.charCodeAt(prevOrd.length - 1);\n localOrdinal = prevOrdCode + ordinalWidth;\n }\n child.ordinal = this.ordinal + String.fromCharCode(localOrdinal);\n if (MergeBlock.traceOrdinals) {\n console.log(`so: prnt chld prev ${ordinalToArray(this.ordinal)} ${ordinalToArray(child.ordinal)} ${(index > 0) ? ordinalToArray(this.children[index - 1].ordinal) : \"NA\"}`);\n }\n assert(child.ordinal.length === (this.ordinal.length + 1), 0x041 /* \"Unexpected child ordinal length!\" */);\n if (index > 0) {\n assert(child.ordinal > this.children[index - 1].ordinal, 0x042 /* \"Child ordinal <= previous sibling ordinal!\" */);\n // console.log(`${ordinalToArray(this.ordinal)} ${ordinalToArray(child.ordinal)} ${ordinalToArray(this.children[index - 1].ordinal)}`);\n // console.log(`ord width ${ordinalWidth}`);\n }\n }\n\n assignChild(child: IMergeNode, index: number, updateOrdinal = true) {\n child.parent = this;\n child.index = index;\n if (updateOrdinal) {\n this.setOrdinal(child, index);\n }\n this.children[index] = child;\n }\n}\n\nclass HierMergeBlock extends MergeBlock implements IMergeBlock {\n rightmostTiles: MapLike<ReferencePosition>;\n leftmostTiles: MapLike<ReferencePosition>;\n rangeStacks: MapLike<Stack<ReferencePosition>>;\n\n constructor(childCount: number) {\n super(childCount);\n this.rightmostTiles = createMap<ReferencePosition>();\n this.leftmostTiles = createMap<ReferencePosition>();\n this.rangeStacks = createMap<Stack<ReferencePosition>>();\n }\n\n addNodeReferences(mergeTree: MergeTree, node: IMergeNode) {\n addNodeReferences(mergeTree, node, this.rightmostTiles, this.leftmostTiles,\n this.rangeStacks);\n }\n\n hierBlock() {\n return this;\n }\n\n hierToString(indentCount: number) {\n let strbuf = \"\";\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const key in this.rangeStacks) {\n const stack = this.rangeStacks[key];\n strbuf += internedSpaces(indentCount);\n strbuf += `${key}: `;\n for (const item of stack.items) {\n strbuf += `${item.toString()} `;\n }\n strbuf += \"\\n\";\n }\n return strbuf;\n }\n}\n\nfunction nodeTotalLength(mergeTree: MergeTree, node: IMergeNode) {\n if (!node.isLeaf()) {\n return node.cachedLength;\n }\n return mergeTree.localNetLength(node);\n}\n\nexport abstract class BaseSegment extends MergeNode implements ISegment {\n constructor() {\n super();\n }\n public clientId: number = LocalClientId;\n public seq: number = UniversalSequenceNumber;\n removedSeq?: number;\n removedClientId?: number;\n removedClientOverlap?: number[];\n readonly segmentGroups: SegmentGroupCollection = new SegmentGroupCollection(this);\n readonly trackingCollection: TrackingGroupCollection = new TrackingGroupCollection(this);\n propertyManager?: PropertiesManager;\n properties?: PropertySet;\n localRefs?: LocalReferenceCollection;\n abstract readonly type: string;\n localSeq?: number;\n localRemovedSeq?: number;\n\n addProperties(newProps: PropertySet, op?: ICombiningOp, seq?: number, collabWindow?: CollaborationWindow) {\n if (!this.propertyManager) {\n this.propertyManager = new PropertiesManager();\n }\n if (!this.properties) {\n this.properties = createMap<any>();\n }\n return this.propertyManager.addProperties(this.properties, newProps, op, seq, collabWindow && collabWindow.collaborating);\n }\n\n hasProperty(key: string): boolean {\n return !!this.properties && (this.properties[key] !== undefined);\n }\n\n isLeaf() {\n return true;\n }\n\n cloneInto(b: ISegment) {\n b.clientId = this.clientId;\n // TODO: deep clone properties\n b.properties = clone(this.properties);\n b.removedClientId = this.removedClientId;\n // TODO: copy removed client overlap and branch removal info\n b.removedSeq = this.removedSeq;\n b.seq = this.seq;\n }\n\n canAppend(segment: ISegment): boolean {\n return false;\n }\n\n addSerializedProps(jseg: IJSONSegment) {\n if (this.properties) {\n jseg.props = this.properties;\n }\n }\n\n abstract toJSONObject(): any;\n\n public ack(segmentGroup: SegmentGroup, opArgs: IMergeTreeDeltaOpArgs, mergeTree: MergeTree): boolean {\n const currentSegmentGroup = this.segmentGroups.dequeue();\n assert(currentSegmentGroup === segmentGroup, 0x043 /* \"On ack, unexpected segmentGroup!\" */);\n switch (opArgs.op.type) {\n case MergeTreeDeltaType.ANNOTATE:\n assert(!!this.propertyManager, 0x044 /* \"On annotate ack, missing segment property manager!\" */);\n this.propertyManager.ackPendingProperties(opArgs.op);\n return true;\n\n case MergeTreeDeltaType.INSERT:\n assert(this.seq === UnassignedSequenceNumber, 0x045 /* \"On insert, seq number already assigned!\" */);\n this.seq = opArgs.sequencedMessage!.sequenceNumber;\n this.localSeq = undefined;\n return true;\n\n case MergeTreeDeltaType.REMOVE:\n const removalInfo = mergeTree.getRemovalInfo(this);\n assert(!!removalInfo, 0x046 /* \"On remove ack, missing removal info!\" */);\n assert(!!removalInfo.removedSeq, 0x047 /* \"On remove ack, missing removed sequence number!\" */);\n this.localRemovedSeq = undefined;\n if (removalInfo.removedSeq === UnassignedSequenceNumber) {\n removalInfo.removedSeq = opArgs.sequencedMessage!.sequenceNumber;\n return true;\n }\n if (MergeTree.diagOverlappingRemove) {\n console.log(`grump @seq ${opArgs.sequencedMessage!.sequenceNumber} ` +\n `cli ${glc(mergeTree, mergeTree.collabWindow.clientId)} ` +\n `from ${removalInfo.removedSeq} text ${mergeTree.toString()}`);\n }\n return false;\n\n default:\n throw new Error(`${opArgs.op.type} is in unrecognized operation type`);\n }\n }\n\n public splitAt(pos: number): ISegment | undefined {\n if (pos > 0) {\n const leafSegment = this.createSplitSegmentAt(pos);\n if (leafSegment) {\n this.copyPropertiesTo(leafSegment);\n leafSegment.parent = this.parent;\n\n // Give the leaf a temporary yet valid ordinal.\n // when this segment is put in the tree, it will get it's real ordinal,\n // but this ordinal meets all the necessary invariants for now.\n leafSegment.ordinal = this.ordinal + String.fromCharCode(0);\n\n leafSegment.removedClientId = this.removedClientId;\n leafSegment.removedSeq = this.removedSeq;\n leafSegment.localRemovedSeq = this.localRemovedSeq;\n leafSegment.seq = this.seq;\n leafSegment.localSeq = this.localSeq;\n leafSegment.clientId = this.clientId;\n if (this.removedClientOverlap) {\n leafSegment.removedClientOverlap = [...this.removedClientOverlap];\n }\n this.segmentGroups.copyTo(leafSegment);\n this.trackingCollection.copyTo(leafSegment);\n if (this.localRefs) {\n this.localRefs.split(pos, leafSegment);\n }\n }\n return leafSegment;\n }\n }\n\n private copyPropertiesTo(other: ISegment) {\n if (this.propertyManager) {\n if (this.properties) {\n other.propertyManager = new PropertiesManager();\n other.properties = this.propertyManager.copyTo(this.properties, other.properties, other.propertyManager);\n }\n }\n }\n\n abstract clone(): ISegment;\n abstract append(segment: ISegment): void;\n protected abstract createSplitSegmentAt(pos: number): BaseSegment | undefined;\n}\n\nexport const reservedTileLabelsKey = \"referenceTileLabels\";\nexport const reservedRangeLabelsKey = \"referenceRangeLabels\";\nexport const reservedMarkerIdKey = \"markerId\";\nexport const reservedMarkerSimpleTypeKey = \"markerSimpleType\";\n\nexport const refGetTileLabels = (refPos: ReferencePosition) => (refPos.refType & ReferenceType.Tile) &&\n refPos.properties ? refPos.properties[reservedTileLabelsKey] as string[] : undefined;\n\nexport const refGetRangeLabels = (refPos: ReferencePosition) => (refPos.refType & (ReferenceType.NestBegin | ReferenceType.NestEnd)) &&\n refPos.properties ? refPos.properties[reservedRangeLabelsKey] as string[] : undefined;\n\nexport function refHasTileLabel(refPos: ReferencePosition, label: string) {\n const tileLabels = refPos.getTileLabels();\n if (tileLabels) {\n for (const refLabel of tileLabels) {\n if (label === refLabel) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function refHasRangeLabel(refPos: ReferencePosition, label: string) {\n const rangeLabels = refPos.getRangeLabels();\n if (rangeLabels) {\n for (const refLabel of rangeLabels) {\n if (label === refLabel) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport interface IJSONMarkerSegment extends IJSONSegment {\n marker: IMarkerDef;\n}\n\nexport class Marker extends BaseSegment implements ReferencePosition {\n public static readonly type = \"Marker\";\n public static is(segment: ISegment): segment is Marker {\n return segment.type === Marker.type;\n }\n public readonly type = Marker.type;\n\n public static make(\n refType: ReferenceType, props?: PropertySet) {\n const marker = new Marker(refType);\n if (props) {\n marker.addProperties(props);\n }\n return marker;\n }\n\n constructor(public refType: ReferenceType) {\n super();\n this.cachedLength = 1;\n }\n\n toJSONObject() {\n const obj: IJSONMarkerSegment = { marker: { refType: this.refType } };\n super.addSerializedProps(obj);\n return obj;\n }\n\n static fromJSONObject(spec: any) {\n if (spec && typeof spec === \"object\" && \"marker\" in spec) {\n return Marker.make(\n spec.marker.refType,\n spec.props as PropertySet);\n }\n return undefined;\n }\n\n clone() {\n const b = Marker.make(this.refType, this.properties);\n this.cloneInto(b);\n return b;\n }\n\n getSegment() {\n return this;\n }\n\n getOffset() {\n return 0;\n }\n\n hasSimpleType(simpleTypeName: string) {\n return !!this.properties &&\n this.properties[reservedMarkerSimpleTypeKey] === simpleTypeName;\n }\n\n getProperties() {\n return this.properties;\n }\n\n getId(): string | undefined {\n if (this.properties && this.properties[reservedMarkerIdKey]) {\n return this.properties[reservedMarkerIdKey] as string;\n }\n }\n\n hasTileLabels() {\n return !!this.getTileLabels();\n }\n\n hasRangeLabels() {\n return !!this.getRangeLabels();\n }\n\n hasTileLabel(label: string): boolean {\n return refHasTileLabel(this, label);\n }\n\n hasRangeLabel(label: string): boolean {\n return refHasRangeLabel(this, label);\n }\n\n getTileLabels(): string[] | undefined {\n return refGetTileLabels(this);\n }\n\n getRangeLabels(): string[] | undefined {\n return refGetRangeLabels(this);\n }\n\n toString() {\n let bbuf = \"\";\n if (this.refType & ReferenceType.Tile) {\n bbuf += \"Tile\";\n }\n if (this.refType & ReferenceType.NestBegin) {\n if (bbuf.length > 0) {\n bbuf += \"; \";\n }\n bbuf += \"RangeBegin\";\n }\n if (this.refType & ReferenceType.NestEnd) {\n if (bbuf.length > 0) {\n bbuf += \"; \";\n }\n bbuf += \"RangeEnd\";\n }\n let lbuf = \"\";\n const id = this.getId();\n if (id) {\n bbuf += ` (${id}) `;\n }\n const tileLabels = this.getTileLabels();\n if (tileLabels) {\n lbuf += \"tile -- \";\n for (let i = 0, len = tileLabels.length; i < len; i++) {\n const tileLabel = tileLabels[i];\n if (i > 0) {\n lbuf += \"; \";\n }\n lbuf += tileLabel;\n }\n }\n const rangeLabels = this.getRangeLabels();\n if (rangeLabels) {\n let rangeKind = \"begin\";\n if (this.refType & ReferenceType.NestEnd) {\n rangeKind = \"end\";\n }\n if (tileLabels) {\n lbuf += \" \";\n }\n lbuf += `range ${rangeKind} -- `;\n const labels = rangeLabels;\n for (let i = 0, len = labels.length; i < len; i++) {\n const rangeLabel = labels[i];\n if (i > 0) {\n lbuf += \"; \";\n }\n lbuf += rangeLabel;\n }\n }\n let pbuf = \"\";\n if (this.properties) {\n pbuf += JSON.stringify(this.properties, (key, value) => {\n // Avoid circular reference when stringifying makers containing handles.\n // (Substitute a debug string instead.)\n const handle = !!value && value.IFluidHandle;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return handle\n ? `#Handle(${handle.routeContext.path}/${handle.path})`\n : value;\n });\n }\n return `M ${bbuf}: ${lbuf} ${pbuf}`;\n }\n\n protected createSplitSegmentAt(pos: number) {\n return undefined;\n }\n\n canAppend(segment: ISegment): boolean {\n return false;\n }\n\n append() { throw new Error(\"Can not append to marker\"); }\n}\n\nexport enum IncrementalExecOp {\n Go,\n Stop,\n Yield,\n}\n\nexport class IncrementalMapState<TContext> {\n op = IncrementalExecOp.Go;\n constructor(\n public block: IMergeBlock,\n public actions: IncrementalSegmentActions<TContext>,\n public pos: number,\n public refSeq: number,\n public clientId: number,\n public context: TContext,\n public start: number,\n public end: number,\n public childIndex = 0,\n ) {\n }\n}\n\nexport class CollaborationWindow {\n clientId = LocalClientId;\n collaborating = false;\n // Lowest-numbered segment in window; no client can reference a state before this one\n minSeq = 0;\n // Highest-numbered segment in window and current\n // reference segment for this client\n currentSeq = 0;\n\n localSeq = 0;\n\n loadFrom(a: CollaborationWindow) {\n this.clientId = a.clientId;\n this.collaborating = a.collaborating;\n this.minSeq = a.minSeq;\n this.currentSeq = a.currentSeq;\n }\n}\n\nexport const compareNumbers = (a: number, b: number) => a - b;\n\nexport const compareStrings = (a: string, b: string) => a.localeCompare(b);\n\nexport function clock() {\n return Trace.start();\n}\n\nexport function elapsedMicroseconds(trace: Trace) {\n return trace.trace().duration * 1000;\n}\n\nconst indentStrings = [\"\", \" \", \" \"];\nexport function internedSpaces(n: number) {\n if (indentStrings[n] === undefined) {\n indentStrings[n] = \"\";\n for (let i = 0; i < n; i++) {\n indentStrings[n] += \" \";\n }\n }\n return indentStrings[n];\n}\n\nexport interface IConsensusInfo {\n marker: Marker;\n callback: (m: Marker) => void;\n}\n\nexport interface ClientSeq {\n refSeq: number;\n clientId: string;\n}\n\nexport const clientSeqComparer: Comparer<ClientSeq> = {\n min: { refSeq: -1, clientId: \"\" },\n compare: (a, b) => a.refSeq - b.refSeq,\n};\n\nexport interface LRUSegment {\n segment?: ISegment;\n maxSeq: number;\n}\n\nconst LRUSegmentComparer: Comparer<LRUSegment> = {\n min: { maxSeq: -2 },\n compare: (a, b) => a.maxSeq - b.maxSeq,\n};\n\nexport function glc(mergeTree: MergeTree, id: number) {\n if (mergeTree.getLongClientId) {\n return mergeTree.getLongClientId(id);\n } else {\n return id.toString();\n }\n}\n\nexport interface SegmentAccumulator {\n segments: ISegment[];\n}\n\ninterface IReferenceSearchInfo {\n mergeTree: MergeTree;\n tileLabel: string;\n posPrecedesTile?: boolean;\n tile?: ReferencePosition;\n}\n\ninterface IMarkerSearchRangeInfo {\n mergeTree: MergeTree;\n rangeLabels: string[];\n stacks: RangeStackMap;\n}\n\nfunction applyLeafRangeMarker(marker: Marker, searchInfo: IMarkerSearchRangeInfo) {\n for (const rangeLabel of searchInfo.rangeLabels) {\n if (marker.hasRangeLabel(rangeLabel)) {\n let currentStack = searchInfo.stacks[rangeLabel];\n if (currentStack === undefined) {\n currentStack = new Stack<Marker>();\n searchInfo.stacks[rangeLabel] = currentStack;\n }\n applyRangeReference(currentStack, marker);\n }\n }\n}\nfunction recordRangeLeaf(\n segment: ISegment, segpos: number,\n refSeq: number, clientId: number, start: number | undefined, end: number | undefined,\n searchInfo: IMarkerSearchRangeInfo) {\n if (Marker.is(segment)) {\n if (segment.refType &\n (ReferenceType.NestBegin | ReferenceType.NestEnd)) {\n applyLeafRangeMarker(segment, searchInfo);\n }\n }\n return false;\n}\n\nfunction rangeShift(\n node: IMergeNode, segpos: number, refSeq: number, clientId: number,\n offset: number | undefined, end: number | undefined, searchInfo: IMarkerSearchRangeInfo) {\n if (node.isLeaf()) {\n const seg = node;\n if ((searchInfo.mergeTree.localNetLength(seg) ?? 0 > 0) && Marker.is(seg)) {\n if (seg.refType &\n (ReferenceType.NestBegin | ReferenceType.NestEnd)) {\n applyLeafRangeMarker(seg, searchInfo);\n }\n }\n } else {\n const block = <IHierBlock>node;\n applyStackDelta(searchInfo.stacks, block.rangeStacks);\n }\n return true;\n}\n\nfunction recordTileStart(\n segment: ISegment,\n segpos: number,\n refSeq: number,\n clientId: number,\n start: number,\n end: number,\n searchInfo: IReferenceSearchInfo) {\n if (Marker.is(segment)) {\n if (segment.hasTileLabel(searchInfo.tileLabel)) {\n searchInfo.tile = segment;\n }\n }\n return false;\n}\n\nfunction tileShift(\n node: IMergeNode, segpos: number, refSeq: number, clientId: number,\n offset: number | undefined, end: number | undefined, searchInfo: IReferenceSearchInfo) {\n if (node.isLeaf()) {\n const seg = node;\n if ((searchInfo.mergeTree.localNetLength(seg) > 0) && Marker.is(seg)) {\n if (seg.hasTileLabel(searchInfo.tileLabel)) {\n searchInfo.tile = seg;\n }\n }\n } else {\n const block = <IHierBlock>node;\n let marker: Marker;\n if (searchInfo.posPrecedesTile) {\n marker = <Marker>block.rightmostTiles[searchInfo.tileLabel];\n } else {\n marker = <Marker>block.leftmostTiles[searchInfo.tileLabel];\n }\n if (marker !== undefined) {\n searchInfo.tile = marker;\n }\n }\n return true;\n}\n\nexport interface MinListener {\n minRequired: number;\n onMinGE(minSeq: number): void;\n}\n\nconst minListenerComparer: Comparer<MinListener> = {\n min: { minRequired: Number.MIN_VALUE, onMinGE: () => { assert(false, 0x048 /* \"onMinGE()\" */); } },\n compare: (a, b) => a.minRequired - b.minRequired,\n};\n\nexport type LocalReferenceMapper = (id: string) => LocalReference;\n\n// Represents a sequence of text segments\nexport class MergeTree {\n // Maximum length of text segment to be considered to be merged with other segment.\n // Maximum segment length is at least 2x of it (not taking into account initial segment creation).\n // The bigger it is, the more expensive it is to break segment into sub-segments (on edits)\n // The smaller it is, the more segments we have in snapshots (and in memory) - it's more expensive to load snapshots.\n // Small number also makes ReplayTool produce false positives (\"same\" snapshots have slightly different binary representations).\n // More measurements needs to be done, but it's very likely the right spot is somewhere between 1K-2K mark.\n // That said, we also break segments on newline and there are very few segments that are longer than 256 because of it.\n // must be an even number\n static TextSegmentGranularity = 256;\n\n static zamboniSegmentsMaxCount = 2;\n static options = {\n incrementalUpdate: true,\n insertAfterRemovedSegs: true,\n measureOrdinalTime: true,\n measureWindowTime: true,\n zamboniSegments: true,\n };\n static traceAppend = false;\n static traceZRemove = false;\n static traceOrdinals = false;\n static traceGatherText = false;\n static diagInsertTie = false;\n static skipLeftShift = true;\n static diagOverlappingRemove = false;\n static traceTraversal = false;\n static traceIncrTraversal = false;\n static initBlockUpdateActions: BlockUpdateActions;\n static theUnfinishedNode = <IMergeBlock>{ childCount: -1 };\n // WARNING:\n // Setting blockUpdateMarkers to false will result in eventual consistency issues\n // for property updates on markers when loading from snapshots\n static readonly blockUpdateMarkers = true;\n\n windowTime = 0;\n packTime = 0;\n ordTime = 0;\n maxOrdTime = 0;\n\n root: IMergeBlock;\n blockUpdateActions: BlockUpdateActions;\n collabWindow = new CollaborationWindow();\n pendingSegments: List<SegmentGroup> | undefined;\n segmentsToScour: Heap<LRUSegment> | undefined;\n // TODO: change this to ES6 map; add remove on segment remove\n // for now assume only markers have ids and so point directly at the Segment\n // if we need to have pointers to non-markers, we can change to point at local refs\n idToSegment = createMap<ISegment>();\n minSeqListeners: Heap<MinListener> | undefined;\n // For diagnostics\n getLongClientId?: (id: number) => string;\n mergeTreeDeltaCallback?: MergeTreeDeltaCallback;\n mergeTreeMaintenanceCallback?: MergeTreeMaintenanceCallback;\n\n // TODO: make and use interface describing options\n constructor(public options?: PropertySet) {\n this.blockUpdateActions = MergeTree.initBlockUpdateActions;\n this.root = this.makeBlock(0);\n }\n\n private makeBlock(childCount: number) {\n let block: MergeBlock;\n if (MergeTree.blockUpdateMarkers) {\n block = new HierMergeBlock(childCount);\n } else {\n block = new MergeBlock(childCount);\n }\n block.ordinal = \"\";\n return block;\n }\n\n clone() {\n const b = new MergeTree(this.options);\n // For now assume that b will not collaborate\n b.root = b.blockClone(this.root);\n }\n\n blockClone(block: IMergeBlock, segments?: ISegment[]) {\n const bBlock = this.makeBlock(block.childCount);\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (child.isLeaf()) {\n const segment = this.segmentClone(child);\n bBlock.assignChild(segment, i);\n if (segments) {\n segments.push(segment);\n }\n } else {\n bBlock.assignChild(this.blockClone(child, segments), i);\n }\n }\n this.nodeUpdateLengthNewStructure(bBlock);\n this.nodeUpdateOrdinals(bBlock);\n return bBlock;\n }\n\n private segmentClone(segment: ISegment) {\n const b = segment.clone();\n return b;\n }\n\n localNetLength(segment: ISegment) {\n const removalInfo = this.getRemovalInfo(segment);\n if (removalInfo.removedSeq !== undefined) {\n return 0;\n } else {\n return segment.cachedLength;\n }\n }\n\n // TODO: remove id when segment removed\n mapIdToSegment(id: string, segment: ISegment) {\n this.idToSegment[id] = segment;\n }\n\n private addNode(block: IMergeBlock, node: IMergeNode) {\n const index = block.childCount++;\n block.assignChild(node, index, false);\n return index;\n }\n\n reloadFromSegments(segments: ISegment[]) {\n // This code assumes that a later call to `startCollaboration()` will initialize partial lengths.\n assert(!this.collabWindow.collaborating, 0x049 /* \"Trying to reload from segments while collaborating!\" */);\n\n const maxChildren = MaxNodesInBlock - 1;\n const measureReloadTime = false;\n\n // Starting with the leaf segments, recursively builds the B-Tree layer by layer from the bottom up.\n const buildMergeBlock = (nodes: IMergeNode[]) => {\n const blockCount = Math.ceil(nodes.length / maxChildren); // Compute # blocks require for this level of B-Tree\n const blocks: IMergeBlock[] = new Array(blockCount); // Pre-alloc array to collect nodes\n\n // For each block in this level of the B-Tree...\n for (let nodeIndex = 0, blockIndex = 0; // Start with the first block and first node\n blockIndex < blockCount; // If we have more blocks, we also have more nodes to insert\n blockIndex++ // Advance to next block in this layer.\n ) {\n const block = blocks[blockIndex] = this.makeBlock(0);\n\n // For each child of the current block, insert a node (while we have nodes left)\n // and update the block's info.\n for (let childIndex = 0;\n childIndex < maxChildren && nodeIndex < nodes.length; // While we still have children & nodes left\n childIndex++ , nodeIndex++ // Advance to next child & node\n ) {\n // Insert the next node into the current block\n this.addNode(block, nodes[nodeIndex]);\n }\n\n // Calculate this block's info. Previously this was inlined into the above loop as a micro-optimization,\n // but it turns out to be negligible in practice since `reloadFromSegments()` is only invoked for the\n // snapshot header. The bulk of the segments in long documents are inserted via `insertSegments()`.\n this.blockUpdate(block);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return blocks.length === 1 // If there is only one block at this layer...\n ? blocks[0] // ...then we're done. Return the root.\n : buildMergeBlock(blocks); // ...otherwise recursively build the next layer above blocks.\n };\n\n let clockStart: Trace | undefined;\n if (measureReloadTime) {\n clockStart = clock();\n }\n if (segments.length > 0) {\n this.root = buildMergeBlock(segments);\n this.nodeUpdateOrdinals(this.root);\n } else {\n this.root = this.makeBlock(0);\n }\n\n if (clockStart) {\n console.log(`reload time ${elapsedMicroseconds(clockStart)}`);\n }\n }\n\n // For now assume min starts at zero\n startCollaboration(localClientId: number, minSeq: number, currentSeq: number) {\n this.collabWindow.clientId = localClientId;\n this.collabWindow.minSeq = minSeq;\n this.collabWindow.collaborating = true;\n this.collabWindow.currentSeq = currentSeq;\n this.segmentsToScour = new Heap<LRUSegment>([], LRUSegmentComparer);\n this.pendingSegments = ListMakeHead<SegmentGroup>();\n const measureFullCollab = false;\n let clockStart: Trace | undefined;\n if (measureFullCollab) {\n clockStart = clock();\n }\n this.nodeUpdateLengthNewStructure(this.root, true);\n if (clockStart) {\n console.log(`update partial lengths at start ${elapsedMicroseconds(clockStart)}`);\n }\n }\n\n private addToLRUSet(segment: ISegment, seq: number) {\n // If the parent node has not yet been marked for scour (i.e., needsScour is not false or undefined),\n // add the segment and mark the mark the node now.\n\n // TODO: 'seq' may be less than the current sequence number when inserting pre-ACKed\n // segments from a snapshot. We currently skip these for now.\n if (segment.parent!.needsScour !== true && seq > this.collabWindow.currentSeq) {\n segment.parent!.needsScour = true;\n this.segmentsToScour!.add({ segment, maxSeq: seq });\n }\n }\n\n private underflow(node: IMergeBlock) {\n return node.childCount < (MaxNodesInBlock / 2);\n }\n\n private scourNode(node: IMergeBlock, holdNodes: IMergeNode[]) {\n let prevSegment: ISegment | undefined;\n for (let k = 0; k < node.childCount; k++) {\n const childNode = node.children[k];\n if (childNode.isLeaf()) {\n const segment = childNode;\n if (segment.segmentGroups.empty) {\n if (segment.removedSeq !== undefined) {\n if (segment.removedSeq > this.collabWindow.minSeq) {\n holdNodes.push(segment);\n } else if (!segment.trackingCollection.empty) {\n holdNodes.push(segment);\n } else {\n if (MergeTree.traceZRemove) {\n // eslint-disable-next-line @typescript-eslint/dot-notation\n console.log(`${this.getLongClientId!(this.collabWindow.clientId)}: Zremove ${segment[\"text\"]}; cli ${this.getLongClientId!(segment.clientId)}`);\n }\n\n // Notify maintenance event observers that the segment is being unlinked from the MergeTree.\n if (this.mergeTreeMaintenanceCallback) {\n this.mergeTreeMaintenanceCallback({\n operation: MergeTreeMaintenanceType.UNLINK,\n deltaSegments: [{ segment }],\n },\n undefined);\n }\n\n segment.parent = undefined;\n }\n prevSegment = undefined;\n } else {\n if (segment.seq! <= this.collabWindow.minSeq) {\n const canAppend = prevSegment\n && prevSegment.canAppend(segment)\n && matchProperties(prevSegment.properties, segment.properties)\n && prevSegment.trackingCollection.matches(segment.trackingCollection)\n && this.localNetLength(segment) > 0;\n\n if (canAppend) {\n if (MergeTree.traceAppend) {\n // eslint-disable-next-line @typescript-eslint/dot-notation\n console.log(`${this.getLongClientId!(this.collabWindow.clientId)}: append ${prevSegment![\"text\"]} + ${segment[\"text\"]}; cli ${this.getLongClientId!(prevSegment!.clientId)} + cli ${this.getLongClientId!(segment.clientId)}`);\n }\n prevSegment!.append(segment);\n if (this.mergeTreeMaintenanceCallback) {\n this.mergeTreeMaintenanceCallback({\n operation: MergeTreeMaintenanceType.APPEND,\n deltaSegments: [{ segment: prevSegment! }, { segment }],\n },\n undefined);\n }\n segment.parent = undefined;\n segment.trackingCollection.trackingGroups.forEach((tg) => tg.unlink(segment));\n } else {\n holdNodes.push(segment);\n if (this.localNetLength(segment) > 0) {\n prevSegment = segment;\n } else {\n prevSegment = undefined;\n }\n }\n } else {\n holdNodes.push(segment);\n prevSegment = undefined;\n }\n }\n } else {\n holdNodes.push(segment);\n prevSegment = undefined;\n }\n } else {\n holdNodes.push(childNode);\n prevSegment = undefined;\n }\n }\n }\n\n // Interior node with all node children\n private packParent(parent: IMergeBlock) {\n const children = parent.children;\n let childIndex: number;\n let childBlock: IMergeBlock;\n const holdNodes: IMergeNode[] = [];\n for (childIndex = 0; childIndex < parent.childCount; childIndex++) {\n // Debug assert not isLeaf()\n childBlock = <IMergeBlock>children[childIndex];\n this.scourNode(childBlock, holdNodes);\n // Will replace this block with a packed block\n childBlock.parent = undefined;\n }\n const totalNodeCount = holdNodes.length;\n const halfCount = MaxNodesInBlock / 2;\n let childCount = Math.min(MaxNodesInBlock - 1, Math.floor(totalNodeCount / halfCount));\n if (childCount < 1) {\n childCount = 1;\n }\n const baseCount = Math.floor(totalNodeCount / childCount);\n let extraCount = totalNodeCount % childCount;\n const packedBlocks = new Array<IMergeBlock>(MaxNodesInBlock);\n let readCount = 0;\n for (let nodeIndex = 0; nodeIndex < childCount; nodeIndex++) {\n let nodeCount = baseCount;\n if (extraCount > 0) {\n nodeCount++;\n extraCount--;\n }\n const packedBlock = this.makeBlock(nodeCount);\n for (let packedNodeIndex = 0; packedNodeIndex < nodeCount; packedNodeIndex++) {\n const nodeToPack = holdNodes[readCount++];\n packedBlock.assignChild(nodeToPack, packedNodeIndex, false);\n }\n packedBlock.parent = parent;\n packedBlocks[nodeIndex] = packedBlock;\n this.nodeUpdateLengthNewStructure(packedBlock);\n }\n if (readCount !== totalNodeCount) {\n console.log(`total count ${totalNodeCount} readCount ${readCount}`);\n }\n parent.children = packedBlocks;\n for (let j = 0; j < childCount; j++) {\n parent.assignChild(packedBlocks[j], j, false);\n }\n parent.childCount = childCount;\n if (this.underflow(parent) && (parent.parent)) {\n this.packParent(parent.parent);\n } else {\n this.nodeUpdateOrdinals(parent);\n this.blockUpdatePathLengths(parent, UnassignedSequenceNumber, -1, true);\n }\n }\n\n private zamboniSegments(zamboniSegmentsMaxCount = MergeTree.zamboniSegmentsMaxCount) {\n if (!this.collabWindow.collaborating) {\n return;\n }\n let clockStart;\n if (MergeTree.options.measureWindowTime) {\n clockStart = clock();\n }\n\n for (let i = 0; i < zamboniSegmentsMaxCount; i++) {\n let segmentToScour = this.segmentsToScour!.peek();\n if (!segmentToScour || segmentToScour.maxSeq > this.collabWindow.minSeq) {\n break;\n }\n segmentToScour = this.segmentsToScour!.get();\n // Only skip scouring if needs scour is explicitly false, not true or undefined\n if (segmentToScour.segment!.parent && segmentToScour.segment!.parent.needsScour !== false) {\n const block = segmentToScour.segment!.parent;\n const childrenCopy: IMergeNode[] = [];\n // console.log(`scouring from ${segmentToScour.segment.seq}`);\n this.scourNode(block, childrenCopy);\n // This will avoid the cost of re-scouring nodes\n // that have recently been scoured\n block.needsScour = false;\n\n const newChildCount = childrenCopy.length;\n\n if (newChildCount < block.childCount) {\n block.childCount = newChildCount;\n block.children = childrenCopy;\n for (let j = 0; j < newChildCount; j++) {\n block.assignChild(childrenCopy[j], j, false);\n }\n\n if (this.underflow(block) && block.parent) {\n // nodeUpdatePathLengths(node, UnassignedSequenceNumber, -1, true);\n let packClockStart;\n if (MergeTree.options.measureWindowTime) {\n packClockStart = clock();\n }\n this.packParent(block.parent);\n\n if (MergeTree.options.measureWindowTime) {\n this.packTime += elapsedMicroseconds(packClockStart);\n }\n } else {\n this.nodeUpdateOrdinals(block);\n this.blockUpdatePathLengths(block, UnassignedSequenceNumber, -1, true);\n }\n }\n }\n }\n\n if (MergeTree.options.measureWindowTime) {\n this.windowTime += elapsedMicroseconds(clockStart);\n }\n }\n\n getCollabWindow() {\n return this.collabWindow;\n }\n\n getStats() {\n const nodeGetStats = (block: IMergeBlock): MergeTreeStats => {\n const stats: MergeTreeStats = { maxHeight: 0, nodeCount: 0, leafCount: 0, removedLeafCount: 0, liveCount: 0, histo: [] };\n for (let k = 0; k < MaxNodesInBlock; k++) {\n stats.histo[k] = 0;\n }\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n let height = 1;\n if (!child.isLeaf()) {\n const childStats = nodeGetStats(child);\n height = 1 + childStats.maxHeight;\n stats.nodeCount += childStats.nodeCount;\n stats.leafCount += childStats.leafCount;\n stats.removedLeafCount += childStats.removedLeafCount;\n stats.liveCount += childStats.liveCount;\n for (let i = 0; i < MaxNodesInBlock; i++) {\n stats.histo[i] += childStats.histo[i];\n }\n } else {\n stats.leafCount++;\n const segment = child;\n if (segment.removedSeq !== undefined) {\n stats.removedLeafCount++;\n }\n }\n if (height > stats.maxHeight) {\n stats.maxHeight = height;\n }\n }\n stats.histo[block.childCount]++;\n stats.nodeCount++;\n stats.liveCount += block.childCount;\n return stats;\n };\n const rootStats = nodeGetStats(this.root);\n if (MergeTree.options.measureWindowTime) {\n rootStats.windowTime = this.windowTime;\n rootStats.packTime = this.packTime;\n rootStats.ordTime = this.ordTime;\n rootStats.maxOrdTime = this.maxOrdTime;\n }\n return rootStats;\n }\n\n findHistorialPosition(pos: number, fromSeq: number, toSeq: number, clientId: number) {\n return this.findHistorialPositionFromClient(pos, fromSeq, toSeq, clientId);\n }\n\n findHistorialPositionFromClient(pos: number, fromSeq: number, toSeq: number, clientId: number) {\n assert(fromSeq < toSeq, 0x04a /* \"Invalid range for historical position search!\" */);\n if (pos < this.getLength(fromSeq, clientId)) {\n assert(toSeq <= this.collabWindow.currentSeq,\n 0x04b /* \"Out-of-bounds end sequence number for historical position search!\" */);\n const segoff = this.getContainingSegment(pos, fromSeq, clientId);\n assert(segoff.segment !== undefined,\n 0x04c /* \"Containing segment for historical position search is undefined!\" */);\n const toPos = this.getPosition(segoff.segment, toSeq, clientId);\n const ret = toPos + segoff.offset!;\n assert(ret !== undefined,\n 0x04d /* \"Return value for historical position search is undefined!\" */);\n return ret;\n } else {\n return pos;\n }\n }\n\n findHistorialRangeFromClient(rangeStart: number, rangeEnd: number, fromSeq: number, toSeq: number, clientId: number) {\n const ranges: IIntegerRange[] = [];\n const recordRange = (\n segment: ISegment,\n pos: number,\n refSeq: number,\n clientId: number,\n segStart: number,\n segEnd: number) => {\n let _segStart = segStart;\n let _segEnd = segEnd;\n if (this.nodeLength(segment, toSeq, clientId) ?? 0 > 0) {\n const position = this.getPosition(segment, toSeq, clientId);\n if (_segStart < 0) {\n _segStart = 0;\n }\n if (_segEnd > segment.cachedLength) {\n _segEnd = segment.cachedLength;\n }\n ranges.push({ start: position + _segStart, end: position + _segEnd });\n }\n return true;\n };\n this.mapRange({ leaf: recordRange }, fromSeq, clientId, undefined, rangeStart, rangeEnd);\n return ranges;\n }\n\n findHistorialRange(rangeStart: number, rangeEnd: number, fromSeq: number, toSeq: number, clientId: number) {\n return this.findHistorialRangeFromClient(rangeStart, rangeEnd, fromSeq, toSeq, clientId);\n }\n\n getLength(refSeq: number, clientId: number) {\n return this.blockLength(this.root, refSeq, clientId);\n }\n\n /**\n * Returns the current length of the MergeTree for the local client.\n */\n public get length() { return this.root.cachedLength; }\n\n getPosition(node: MergeNode, refSeq: number, clientId: number) {\n let totalOffset = 0;\n let parent = node.parent;\n let prevParent: IMergeBlock | undefined;\n while (parent) {\n const children = parent.children;\n for (let childIndex = 0; childIndex < parent.childCount; childIndex++) {\n const child = children[childIndex];\n if ((prevParent && (child === prevParent)) || (child === node)) {\n break;\n }\n totalOffset += this.nodeLength(child, refSeq, clientId) ?? 0;\n }\n prevParent = parent;\n parent = parent.parent;\n }\n return totalOffset;\n }\n\n cloneSegments(refSeq: number, clientId: number, start = 0, end?: number) {\n let _end = end;\n const gatherSegment = (\n segment: ISegment, pos: number, refSeq: number, clientId: number, start: number,\n end: number, accumSegments: SegmentAccumulator) => {\n accumSegments.segments.push(segment.clone());\n return true;\n };\n\n if (_end === undefined) {\n _end = this.blockLength(this.root, refSeq, clientId);\n }\n const accum: SegmentAccumulator = {\n segments: [],\n };\n this.mapRange<SegmentAccumulator>({ leaf: gatherSegment }, refSeq, clientId, accum, start, _end);\n return accum.segments;\n }\n\n getContainingSegment<T extends ISegment>(pos: number, refSeq: number, clientId: number) {\n let segment: T | undefined;\n let offset: number | undefined;\n\n const leaf = (leafSeg: ISegment, segpos: number, refSeq: number, clientId: number, start: number) => {\n segment = leafSeg as T;\n offset = start;\n return false;\n };\n this.searchBlock(this.root, pos, 0, refSeq, clientId, { leaf }, undefined);\n return { segment, offset };\n }\n\n private blockLength(node: IMergeBlock, refSeq: number, clientId: number) {\n if ((this.collabWindow.collaborating) && (clientId !== this.collabWindow.clientId)) {\n return node.partialLengths!.getPartialLength(refSeq, clientId);\n } else {\n return node.cachedLength;\n }\n }\n\n getRemovalInfo(segment: ISegment) {\n return segment as IRemovalInfo;\n }\n\n private nodeLength(node: IMergeNode, refSeq: number, clientId: number) {\n if ((!this.collabWindow.collaborating) || (this.collabWindow.clientId === clientId)) {\n // Local client sees all segments, even when collaborating\n if (!node.isLeaf()) {\n return node.cachedLength;\n } else {\n return this.localNetLength(node);\n }\n } else {\n // Sequence number within window\n if (!node.isLeaf()) {\n return node.partialLengths!.getPartialLength(refSeq, clientId);\n } else {\n const segment = node;\n const removalInfo = this.getRemovalInfo(segment);\n\n if(removalInfo.removedSeq !== undefined\n && removalInfo.removedSeq !== UnassignedSequenceNumber\n && removalInfo.removedSeq <= refSeq) {\n // this segment is a tombstone eligible for zamboni\n // so should never be considered, as it may not exist\n // on other clients\n return undefined;\n }\n if (((segment.clientId === clientId) ||\n ((segment.seq !== UnassignedSequenceNumber) && (segment.seq! <= refSeq)))) {\n // Segment happened by reference sequence number or segment from requesting client\n if (removalInfo.removedSeq !== undefined) {\n if ((removalInfo.removedClientId === clientId) ||\n (removalInfo.removedClientOverlap && (removalInfo.removedClientOverlap.includes(clientId)))) {\n return 0;\n } else {\n return segment.cachedLength;\n }\n } else {\n return segment.cachedLength;\n }\n } else {\n // the segment was inserted and removed before the\n // this context, so it will never exist for this\n // context\n if(removalInfo.removedSeq !== undefined\n && removalInfo.removedSeq !== UnassignedSequenceNumber) {\n return undefined;\n }\n // Segment invisible to client at reference sequence number/branch id/client id of op\n return 0;\n }\n }\n }\n }\n\n addMinSeqListener(minRequired: number, onMinGE: (minSeq: number) => void) {\n if (!this.minSeqListeners) {\n this.minSeqListeners = new Heap<MinListener>([],\n minListenerComparer);\n }\n this.minSeqListeners.add({ minRequired, onMinGE });\n }\n\n private notifyMinSeqListeners() {\n if (this.minSeqListeners) {\n while ((this.minSeqListeners.count() > 0) &&\n (this.minSeqListeners.peek().minRequired <= this.collabWindow.minSeq)) {\n const minListener = this.minSeqListeners.get()!;\n minListener.onMinGE(this.collabWindow.minSeq);\n }\n }\n }\n\n setMinSeq(minSeq: number) {\n assert(minSeq <= this.collabWindow.currentSeq, 0x04e /* \"Trying to set minSeq above currentSeq of collab window!\" */);\n\n // Only move forward\n assert(this.collabWindow.minSeq <= minSeq, 0x04f /* \"minSeq of collab window > target minSeq!\" */);\n\n if (minSeq > this.collabWindow.minSeq) {\n this.collabWindow.minSeq = minSeq;\n if (MergeTree.options.zamboniSegments) {\n this.zamboniSegments();\n }\n this.notifyMinSeqListeners();\n }\n }\n\n public referencePositionToLocalPosition(\n refPos: ReferencePosition,\n refSeq = this.collabWindow.currentSeq,\n clientId = this.collabWindow.clientId) {\n const seg = refPos.getSegment();\n if (seg && seg.parent) {\n const offset = !seg.removedSeq ? refPos.getOffset() : 0;\n return offset + this.getPosition(seg, refSeq, clientId);\n }\n return LocalReference.DetachedPosition;\n }\n\n getStackContext(startPos: number, clientId: number, rangeLabels: string[]) {\n const searchInfo: IMarkerSearchRangeInfo = {\n mergeTree: this,\n stacks: createMap<Stack<Marker>>(),\n rangeLabels,\n };\n\n this.search(startPos, UniversalSequenceNumber, clientId,\n { leaf: recordRangeLeaf, shift: rangeShift }, searchInfo);\n return searchInfo.stacks;\n }\n\n // TODO: filter function\n findTile(startPos: number, clientId: number, tileLabel: string, posPrecedesTile = true) {\n const searchInfo: IReferenceSearchInfo = {\n mergeTree: this,\n posPrecedesTile,\n tileLabel,\n };\n\n if (posPrecedesTile) {\n this.search(startPos, UniversalSequenceNumber, clientId,\n { leaf: recordTileStart, shift: tileShift }, searchInfo);\n } else {\n this.backwardSearch(startPos, UniversalSequenceNumber, clientId,\n { leaf: recordTileStart, shift: tileShift }, searchInfo);\n }\n\n if (searchInfo.tile) {\n let pos: number;\n if (searchInfo.tile.isLeaf()) {\n const marker = <Marker>searchInfo.tile;\n pos = this.getPosition(marker, UniversalSequenceNumber, clientId);\n } else {\n const localRef = <LocalReference>searchInfo.tile;\n pos = localRef.toPosition();\n }\n return { tile: searchInfo.tile, pos };\n }\n }\n\n private search<TClientData>(\n pos: number, refSeq: number, clientId: number,\n actions: SegmentActions<TClientData> | undefined, clientData: TClientData): ISegment | undefined {\n return this.searchBlock(this.root, pos, 0, refSeq, clientId, actions, clientData);\n }\n\n private searchBlock<TClientData>(\n block: IMergeBlock, pos: number, segpos: number, refSeq: number, clientId: number,\n actions: SegmentActions<TClientData> | undefined, clientData: TClientData): ISegment | undefined {\n let _pos = pos;\n let _segpos = segpos;\n const children = block.children;\n if (actions && actions.pre) {\n actions.pre(block, _segpos, refSeq, clientId, undefined, undefined, clientData);\n }\n const contains = actions && actions.contains;\n for (let childIndex = 0; childIndex < block.childCount; childIndex++) {\n const child = children[childIndex];\n const len = this.nodeLength(child, refSeq, clientId) ?? 0;\n if (((!contains) && (_pos < len)) || (contains && contains(child, _pos, refSeq, clientId, undefined, undefined, clientData))) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n return this.searchBlock(child, _pos, _segpos, refSeq, clientId, actions, clientData);\n } else {\n if (actions && actions.leaf) {\n actions.leaf(child, _segpos, refSeq, clientId, _pos, -1, clientData);\n }\n return child;\n }\n } else {\n if (actions && actions.shift) {\n actions.shift(child, _segpos, refSeq, clientId, _pos, undefined, clientData);\n }\n _pos -= len;\n _segpos += len;\n }\n }\n if (actions && actions.post) {\n actions.post(block, _segpos, refSeq, clientId, undefined, undefined, clientData);\n }\n }\n\n private backwardSearch<TClientData>(\n pos: number, refSeq: number, clientId: number,\n actions: SegmentActions<TClientData> | undefined, clientData: TClientData): ISegment | undefined {\n const len = this.getLength(refSeq, clientId);\n if (pos > len) {\n return undefined;\n }\n return this.backwardSearchBlock(this.root, pos, len, refSeq, clientId, actions, clientData);\n }\n\n private backwardSearchBlock<TClientData>(\n block: IMergeBlock, pos: number, segEnd: number, refSeq: number, clientId: number,\n actions: SegmentActions<TClientData> | undefined, clientData: TClientData): ISegment | undefined {\n let _segEnd = segEnd;\n const children = block.children;\n if (actions && actions.pre) {\n actions.pre(block, _segEnd, refSeq, clientId, undefined, undefined, clientData);\n }\n const contains = actions && actions.contains;\n for (let childIndex = block.childCount - 1; childIndex >= 0; childIndex--) {\n const child = children[childIndex];\n const len = this.nodeLength(child, refSeq, clientId) ?? 0;\n const segpos = _segEnd - len;\n if (((!contains) && (pos >= segpos)) ||\n (contains && contains(child, pos, refSeq, clientId, undefined, undefined, clientData))) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n return this.backwardSearchBlock(child, pos, _segEnd, refSeq, clientId, actions, clientData);\n } else {\n if (actions && actions.leaf) {\n actions.leaf(child, segpos, refSeq, clientId, pos, -1, clientData);\n }\n return child;\n }\n } else {\n if (actions && actions.shift) {\n actions.shift(child, segpos, refSeq, clientId, pos, undefined, clientData);\n }\n _segEnd = segpos;\n }\n }\n if (actions && actions.post) {\n actions.post(block, _segEnd, refSeq, clientId, undefined, undefined, clientData);\n }\n }\n\n private updateRoot(splitNode: IMergeBlock | undefined) {\n if (splitNode !== undefined) {\n const newRoot = this.makeBlock(2);\n newRoot.assignChild(this.root, 0, false);\n newRoot.assignChild(splitNode, 1, false);\n this.root = newRoot;\n this.nodeUpdateOrdinals(this.root);\n this.nodeUpdateLengthNewStructure(this.root);\n }\n }\n\n /**\n * Assign sequence number to existing segment; update partial lengths to reflect the change\n * @param seq - sequence number given by server to pending segment\n */\n ackPendingSegment(opArgs: IMergeTreeDeltaOpArgs, verboseOps = false) {\n const seq = opArgs.sequencedMessage!.sequenceNumber;\n const pendingSegmentGroup = this.pendingSegments!.dequeue();\n const nodesToUpdate: IMergeBlock[] = [];\n let overwrite = false;\n if (pendingSegmentGroup !== undefined) {\n if (verboseOps) {\n console.log(`segment group has ${pendingSegmentGroup.segments.length} segments`);\n }\n\n const deltaSegments: IMergeTreeSegmentDelta[] = [];\n pendingSegmentGroup.segments.map((pendingSegment) => {\n overwrite = !pendingSegment.ack(pendingSegmentGroup, opArgs, this) || overwrite;\n if (MergeTree.options.zamboniSegments) {\n this.addToLRUSet(pendingSegment, seq);\n }\n if (!nodesToUpdate.includes(pendingSegment.parent!)) {\n nodesToUpdate.push(pendingSegment.parent!);\n }\n deltaSegments.push({\n segment:pendingSegment,\n });\n });\n if(this.mergeTreeMaintenanceCallback) {\n this.mergeTreeMaintenanceCallback(\n {\n deltaSegments,\n operation: MergeTreeMaintenanceType.ACKNOWLEDGED,\n },\n opArgs,\n );\n }\n const clientId = this.collabWindow.clientId;\n for (const node of nodesToUpdate) {\n this.blockUpdatePathLengths(node, seq, clientId, overwrite);\n // NodeUpdatePathLengths(node, seq, clientId, true);\n }\n }\n if (MergeTree.options.zamboniSegments) {\n this.zamboniSegments();\n }\n }\n\n private addToPendingList(segment: ISegment, segmentGroup?: SegmentGroup, localSeq?: number) {\n let _segmentGroup = segmentGroup;\n if (_segmentGroup === undefined) {\n // TODO: review the cast\n _segmentGroup = { segments: [], localSeq } as SegmentGroup;\n this.pendingSegments!.enqueue(_segmentGroup);\n }\n segment.segmentGroups.enqueue(_segmentGroup);\n return _segmentGroup;\n }\n\n // TODO: error checking\n getMarkerFromId(id: string) {\n return this.idToSegment[id];\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 * @param refseq - The reference sequence number at which to compute the position.\n * @param clientId - The client id with which to compute the position.\n */\n posFromRelativePos(\n relativePos: IRelativePosition,\n refseq = this.collabWindow.currentSeq,\n clientId = this.collabWindow.clientId) {\n let pos = -1;\n let marker: Marker | undefined;\n if (relativePos.id) {\n marker = this.getMarkerFromId(relativePos.id) as Marker;\n }\n if (marker) {\n pos = this.getPosition(marker, refseq, clientId);\n if (!relativePos.before) {\n pos += marker.cachedLength;\n if (relativePos.offset !== undefined) {\n pos += relativePos.offset;\n }\n } else {\n if (relativePos.offset !== undefined) {\n pos -= relativePos.offset;\n }\n }\n }\n return pos;\n }\n\n public insertSegments(\n pos: number,\n segments: ISegment[],\n refSeq: number,\n clientId: number,\n seq: number,\n opArgs: IMergeTreeDeltaOpArgs | undefined,\n ) {\n // const tt = MergeTree.traceTraversal;\n // MergeTree.traceTraversal = true;\n this.ensureIntervalBoundary(pos, refSeq, clientId);\n\n if (MergeTree.traceOrdinals) {\n this.ordinalIntegrity();\n }\n const localSeq = seq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n\n this.blockInsert(pos, refSeq, clientId, seq, localSeq, segments);\n\n // opArgs == undefined => loading snapshot or test code\n if (this.mergeTreeDeltaCallback && opArgs !== undefined) {\n this.mergeTreeDeltaCallback(\n opArgs,\n {\n operation: MergeTreeDeltaType.INSERT,\n deltaSegments: segments.map((segment) => ({ segment })),\n });\n }\n\n // MergeTree.traceTraversal = tt;\n if (MergeTree.traceOrdinals) {\n this.ordinalIntegrity();\n }\n if (this.collabWindow.collaborating && MergeTree.options.zamboniSegments &&\n (seq !== UnassignedSequenceNumber)) {\n this.zamboniSegments();\n }\n }\n\n public insertAtReferencePosition(referencePosition: ReferencePosition, insertSegment: ISegment, opArgs: IMergeTreeDeltaOpArgs): void {\n if (insertSegment.cachedLength === 0) {\n return;\n }\n if (insertSegment.parent\n || insertSegment.removedSeq\n || insertSegment.seq !== UniversalSequenceNumber) {\n throw new Error(\"Cannot insert segment that has already been inserted.\");\n }\n\n const rebalanceTree = (segment: ISegment) => {\n // Blocks should never be left full\n // if the inserts makes the block full\n // then we need to walk up the chain of parents\n // and split the blocks until we find a block with\n // room\n let block = segment.parent;\n let ordinalUpdateNode: IMergeBlock | undefined = block;\n while (block !== undefined) {\n if (block.childCount >= MaxNodesInBlock) {\n const splitNode = this.split(block);\n if (block === this.root) {\n this.updateRoot(splitNode);\n // Update root already updates all it's children ordinals\n ordinalUpdateNode = undefined;\n } else {\n this.insertChildNode(block.parent!, splitNode, block.index + 1);\n ordinalUpdateNode = splitNode.parent;\n this.blockUpdateLength(block.parent!, UnassignedSequenceNumber, clientId);\n }\n } else {\n this.blockUpdateLength(block, UnassignedSequenceNumber, clientId);\n }\n block = block.parent;\n }\n // Only update ordinals once, for all children,\n // on the path\n if (ordinalUpdateNode) {\n this.nodeUpdateOrdinals(ordinalUpdateNode);\n }\n };\n\n const clientId = this.collabWindow.clientId;\n const refSegment = referencePosition.getSegment()!;\n const refOffset = referencePosition.getOffset();\n const refSegLen = this.nodeLength(refSegment, this.collabWindow.currentSeq, clientId);\n let startSeg = refSegment;\n // if the change isn't at a boundary, we need to split the segment\n if (refOffset !== 0 && refSegLen !== undefined && refSegLen !== 0) {\n const splitSeg = this.splitLeafSegment(refSegment, refOffset);\n assert(!!splitSeg.next, 0x050 /* \"Next segment changes are undefined!\" */);\n this.insertChildNode(refSegment.parent!, splitSeg.next, refSegment.index + 1);\n rebalanceTree(splitSeg.next);\n startSeg = splitSeg.next;\n }\n // walk back from the segment, to see if there is a previous tie break seg\n this.leftExcursion(startSeg, (backSeg) => {\n if (!backSeg.isLeaf()) {\n return true;\n }\n const backLen = this.nodeLength(backSeg, this.collabWindow.currentSeq, clientId);\n // ignore removed segments\n if(backLen === undefined) {\n return true;\n }\n // Find the nearest 0 length seg we can insert over, as all other inserts\n // go near to far\n if (backLen === 0) {\n if (this.breakTie(0, backSeg, UnassignedSequenceNumber)) {\n startSeg = backSeg;\n }\n return true;\n }\n return false;\n });\n\n if (this.collabWindow.collaborating) {\n insertSegment.localSeq = ++this.collabWindow.localSeq;\n insertSegment.seq = UnassignedSequenceNumber;\n } else {\n insertSegment.seq = UniversalSequenceNumber;\n }\n\n insertSegment.clientId = clientId;\n\n if (Marker.is(insertSegment)) {\n const markerId = insertSegment.getId();\n if (markerId) {\n this.mapIdToSegment(markerId, insertSegment);\n }\n }\n\n this.insertChildNode(startSeg.parent!, insertSegment, startSeg.index);\n\n rebalanceTree(insertSegment);\n\n if (this.mergeTreeDeltaCallback) {\n this.mergeTreeDeltaCallback(\n opArgs,\n {\n deltaSegments: [{ segment: insertSegment }],\n operation: MergeTreeDeltaType.INSERT,\n });\n }\n\n if (this.collabWindow.collaborating) {\n this.addToPendingList(insertSegment, undefined, insertSegment.localSeq);\n }\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: number): number | undefined {\n const segmentInfo = this.getContainingSegment(\n remoteClientPosition,\n remoteClientRefSeq,\n remoteClientId);\n\n const segwindow = this.getCollabWindow();\n\n if (segmentInfo && segmentInfo.segment) {\n const segmentPosition = this.getPosition(segmentInfo.segment, segwindow.currentSeq, segwindow.clientId);\n\n return segmentPosition + segmentInfo.offset!;\n } else {\n if (remoteClientPosition === this.getLength(remoteClientRefSeq, remoteClientId)) {\n return this.getLength(segwindow.currentSeq, segwindow.clientId);\n }\n }\n }\n\n private insertChildNode(block: IMergeBlock, child: IMergeNode, childIndex: number) {\n assert(block.childCount < MaxNodesInBlock, 0x051 /* \"Too many children on merge block!\" */);\n\n for (let i = block.childCount; i > childIndex; i--) {\n block.children[i] = block.children[i - 1];\n block.children[i].index = i;\n }\n\n block.childCount++;\n block.assignChild(child, childIndex, false);\n }\n\n private blockInsert<T extends ISegment>(pos: number, refSeq: number, clientId: number, seq: number, localSeq: number | undefined, newSegments: T[]) {\n let segIsLocal = false;\n const checkSegmentIsLocal = (segment: ISegment, pos: number, refSeq: number, clientId: number) => {\n if (segment.seq === UnassignedSequenceNumber) {\n if (MergeTree.diagInsertTie) {\n console.log(`@cli ${glc(this, this.collabWindow.clientId)}: promoting continue due to seq ${segment.seq} text ${segment.toString()} ref ${refSeq}`);\n }\n segIsLocal = true;\n }\n // Only need to look at first segment that follows finished node\n return false;\n };\n\n const continueFrom = (node: IMergeBlock) => {\n segIsLocal = false;\n this.rightExcursion(node, checkSegmentIsLocal);\n if (MergeTree.diagInsertTie && segIsLocal) {\n console.log(`@cli ${glc(this, this.collabWindow.clientId)}: attempting continue with seq ${seq} ref ${refSeq} `);\n }\n return segIsLocal;\n };\n\n let segmentGroup: SegmentGroup;\n const saveIfLocal = (locSegment: ISegment) => {\n // Save segment so can assign sequence number when acked by server\n if (this.collabWindow.collaborating) {\n if ((locSegment.seq === UnassignedSequenceNumber) &&\n (clientId === this.collabWindow.clientId)) {\n segmentGroup = this.addToPendingList(locSegment, segmentGroup, localSeq);\n }\n // LocSegment.seq === 0 when coming from SharedSegmentSequence.loadBody()\n // In all other cases this has to be true (checked by addToLRUSet):\n // locSegment.seq > this.collabWindow.currentSeq\n else if ((locSegment.seq! > this.collabWindow.minSeq) &&\n MergeTree.options.zamboniSegments) {\n this.addToLRUSet(locSegment, locSegment.seq!);\n }\n }\n };\n const onLeaf = (segment: ISegment | undefined, pos: number, context: InsertContext) => {\n const segmentChanges: ISegmentChanges = {};\n if (segment) {\n // Insert before segment\n segmentChanges.replaceCurrent = context.candidateSegment;\n segmentChanges.next = segment;\n } else {\n segmentChanges.next = context.candidateSegment;\n }\n return segmentChanges;\n };\n\n // TODO: build tree from segs and insert all at once\n let insertPos = pos;\n for (const newSegment of newSegments) {\n segIsLocal = false;\n if (newSegment.cachedLength > 0) {\n newSegment.seq = seq;\n newSegment.localSeq = localSeq;\n newSegment.clientId = clientId;\n if (Marker.is(newSegment)) {\n const markerId = newSegment.getId();\n if (markerId) {\n this.mapIdToSegment(markerId, newSegment);\n }\n }\n\n const splitNode = this.insertingWalk(this.root, insertPos, refSeq, clientId, seq,\n { leaf: onLeaf, candidateSegment: newSegment, continuePredicate: continueFrom });\n\n if (newSegment.parent === undefined) {\n throw new Error(`MergeTree insert failed: ${JSON.stringify({\n currentSeq: this.collabWindow.currentSeq,\n minSeq: this.collabWindow.minSeq,\n segSeq: newSegment.seq,\n })}`);\n }\n\n this.updateRoot(splitNode);\n saveIfLocal(newSegment);\n\n insertPos += newSegment.cachedLength;\n }\n }\n }\n private readonly splitLeafSegment = (segment: ISegment | undefined, pos: number): ISegmentChanges => {\n if (!(pos > 0 && segment)) {\n return {};\n }\n\n const next = segment.splitAt(pos)!;\n if (this.mergeTreeMaintenanceCallback) {\n this.mergeTreeMaintenanceCallback({\n operation: MergeTreeMaintenanceType.SPLIT,\n deltaSegments: [{ segment }, { segment: next }],\n },\n undefined);\n }\n\n return { next };\n };\n\n private ensureIntervalBoundary(pos: number, refSeq: number, clientId: number) {\n const splitNode = this.insertingWalk(this.root, pos, refSeq, clientId, TreeMaintenanceSequenceNumber,\n { leaf: this.splitLeafSegment });\n this.updateRoot(splitNode);\n }\n\n // Assume called only when pos == len\n private breakTie(pos: number, node: IMergeNode, seq: number) {\n if (node.isLeaf()) {\n if (pos === 0) {\n // normalize the seq numbers\n // if the new seg is local (UnassignedSequenceNumber) give it the highest possible\n // seq for comparision, as it will get a seq higher than any other seq once sequences\n // if the current seg is local (UnassignedSequenceNumber) give it the second highest\n // possible seq, as the highest is reserved for the previous.\n const newSeq = seq === UnassignedSequenceNumber ? Number.MAX_SAFE_INTEGER : seq;\n const segSeq = node.seq === UnassignedSequenceNumber ? Number.MAX_SAFE_INTEGER - 1 : node.seq ?? 0;\n return newSeq > segSeq;\n }\n return false;\n } else {\n return true;\n }\n }\n\n // Visit segments starting from node's left siblings, then up to node's parent\n private leftExcursion(node: IMergeNode, leafAction: ISegmentAction<undefined>) {\n let go = true;\n let startNode = node;\n let parent = startNode.parent;\n while (parent) {\n const children = parent.children;\n let childIndex: number;\n let node: IMergeNode;\n let matchedStart = false;\n for (childIndex = parent.childCount - 1; childIndex >= 0; childIndex--) {\n node = children[childIndex];\n if (matchedStart) {\n if (!node.isLeaf()) {\n const childBlock = node;\n go = this.nodeMapReverse(childBlock, leafAction, 0, UniversalSequenceNumber,\n this.collabWindow.clientId);\n } else {\n go = leafAction(node, 0, UniversalSequenceNumber, this.collabWindow.clientId, 0, 0, undefined);\n }\n if (!go) {\n return;\n }\n } else {\n matchedStart = (startNode === node);\n }\n }\n startNode = parent;\n parent = parent.parent;\n }\n }\n\n // Visit segments starting from node's right siblings, then up to node's parent\n private rightExcursion(node: IMergeNode, leafAction: ISegmentAction<undefined>) {\n const actions = { leaf: leafAction };\n let go = true;\n let startNode = node;\n let parent = startNode.parent;\n while (parent) {\n const children = parent.children;\n let childIndex: number;\n let node: IMergeNode;\n let matchedStart = false;\n for (childIndex = 0; childIndex < parent.childCount; childIndex++) {\n node = children[childIndex];\n if (matchedStart) {\n if (!node.isLeaf()) {\n const childBlock = node;\n go = this.nodeMap(childBlock, actions, 0, UniversalSequenceNumber, this.collabWindow.clientId,\n undefined);\n } else {\n go = leafAction(node, 0, UniversalSequenceNumber, this.collabWindow.clientId, 0, 0, undefined);\n }\n if (!go) {\n return;\n }\n } else {\n matchedStart = (startNode === node);\n }\n }\n startNode = parent;\n parent = parent.parent;\n }\n }\n\n private insertingWalk(\n block: IMergeBlock, pos: number, refSeq: number, clientId: number, seq: number,\n context: InsertContext) {\n let _pos = pos;\n const children = block.children;\n let childIndex: number;\n let child: IMergeNode;\n let newNode: IMergeNode | undefined;\n let fromSplit: IMergeBlock | undefined;\n let found = false;\n for (childIndex = 0; childIndex < block.childCount; childIndex++) {\n child = children[childIndex];\n const len = this.nodeLength(child, refSeq, clientId);\n if(len === undefined) {\n // if the seg len in undefined, the segment\n // will be removed, so should just be skipped for now\n continue;\n }\n if (MergeTree.traceTraversal) {\n let segInfo: string;\n if ((!child.isLeaf()) && this.collabWindow.collaborating) {\n segInfo = `minLength: ${child.partialLengths!.minLength}`;\n } else {\n const segment = <ISegment>child;\n segInfo = `cli: ${glc(this, segment.clientId)} seq: ${segment.seq} text: ${segment.toString()}`;\n if (segment.removedSeq !== undefined) {\n segInfo += ` rcli: ${glc(this, segment.removedClientId!)} rseq: ${segment.removedSeq}`;\n }\n }\n console.log(`@tcli: ${glc(this, this.collabWindow.clientId)} len: ${len} pos: ${_pos} ${segInfo}`);\n }\n\n if ((_pos < len) || ((_pos === len) && this.breakTie(_pos, child, seq))) {\n // Found entry containing pos\n found = true;\n if (!child.isLeaf()) {\n const childBlock = child;\n // Internal node\n const splitNode = this.insertingWalk(childBlock, _pos, refSeq, clientId,\n seq, context);\n if (splitNode === undefined) {\n if (context.structureChange) {\n this.nodeUpdateLengthNewStructure(block);\n } else {\n this.blockUpdateLength(block, seq, clientId);\n }\n return undefined;\n } else if (splitNode === MergeTree.theUnfinishedNode) {\n if (MergeTree.traceTraversal) {\n console.log(`@cli ${glc(this, this.collabWindow.clientId)} unfinished bus pos ${_pos} len ${len}`);\n }\n _pos -= len; // Act as if shifted segment\n continue;\n } else {\n newNode = splitNode;\n fromSplit = splitNode;\n childIndex++; // Insert after\n }\n } else {\n if (MergeTree.traceTraversal) {\n console.log(`@tcli: ${glc(this, this.collabWindow.clientId)}: leaf action`);\n }\n const segment = child;\n const segmentChanges = context.leaf(segment, _pos, context);\n if (segmentChanges.replaceCurrent) {\n if (MergeTree.traceOrdinals) {\n console.log(`assign from leaf with block ord ${ordinalToArray(block.ordinal)}`);\n }\n block.assignChild(segmentChanges.replaceCurrent, childIndex, false);\n segmentChanges.replaceCurrent.ordinal = child.ordinal;\n }\n if (segmentChanges.next) {\n newNode = segmentChanges.next;\n childIndex++; // Insert after\n } else {\n // No change\n if (context.structureChange) {\n this.nodeUpdateLengthNewStructure(block);\n }\n return undefined;\n }\n }\n break;\n } else {\n _pos -= len;\n }\n }\n if (MergeTree.traceTraversal) {\n if ((!found) && (_pos > 0)) {\n console.log(`inserting walk fell through pos ${_pos} len: ${this.blockLength(this.root, refSeq, clientId)}`);\n }\n }\n if (!newNode) {\n if (_pos === 0) {\n if ((seq !== UnassignedSequenceNumber) && context.continuePredicate &&\n context.continuePredicate(block)) {\n return MergeTree.theUnfinishedNode;\n } else {\n if (MergeTree.traceTraversal) {\n console.log(`@tcli: ${glc(this, this.collabWindow.clientId)}: leaf action pos 0`);\n }\n const segmentChanges = context.leaf(undefined, _pos, context);\n newNode = segmentChanges.next;\n // Assert segmentChanges.replaceCurrent === undefined\n }\n }\n }\n if (newNode) {\n for (let i = block.childCount; i > childIndex; i--) {\n block.children[i] = block.children[i - 1];\n block.children[i].index = i;\n }\n block.assignChild(newNode, childIndex, false);\n block.childCount++;\n block.setOrdinal(newNode, childIndex);\n if (block.childCount < MaxNodesInBlock) {\n if (fromSplit) {\n if (MergeTree.traceOrdinals) {\n console.log(`split ord ${ordinalToArray(fromSplit.ordinal)}`);\n }\n this.nodeUpdateOrdinals(fromSplit);\n }\n if (context.structureChange) {\n this.nodeUpdateLengthNewStructure(block);\n } else {\n this.blockUpdateLength(block, seq, clientId);\n }\n return undefined;\n } else {\n // Don't update ordinals because higher block will do it\n return this.split(block);\n }\n } else {\n return undefined;\n }\n }\n\n private split(node: IMergeBlock) {\n const halfCount = MaxNodesInBlock / 2;\n const newNode = this.makeBlock(halfCount);\n node.childCount = halfCount;\n // Update ordinals to reflect lowered child count\n this.nodeUpdateOrdinals(node);\n for (let i = 0; i < halfCount; i++) {\n newNode.assignChild(node.children[halfCount + i], i, false);\n node.children[halfCount + i] = undefined!;\n }\n this.nodeUpdateLengthNewStructure(node);\n this.nodeUpdateLengthNewStructure(newNode);\n return newNode;\n }\n\n private ordinalIntegrity() {\n console.log(\"chk ordnls\");\n this.nodeOrdinalIntegrity(this.root);\n }\n\n private nodeOrdinalIntegrity(block: IMergeBlock) {\n const olen = block.ordinal.length;\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (child.ordinal) {\n if (olen !== (child.ordinal.length - 1)) {\n console.log(\"node integrity issue\");\n }\n if (i > 0) {\n if (child.ordinal <= block.children[i - 1].ordinal) {\n console.log(\"node sib integrity issue\");\n console.log(`??: prnt chld prev ${ordinalToArray(block.ordinal)} ${ordinalToArray(child.ordinal)} ${(i > 0) ? ordinalToArray(block.children[i - 1].ordinal) : \"NA\"}`);\n }\n }\n if (!child.isLeaf()) {\n this.nodeOrdinalIntegrity(child);\n }\n } else {\n console.log(`node child ordinal not set ${i}`);\n console.log(`??: prnt ${ordinalToArray(block.ordinal)}`);\n }\n }\n }\n\n private nodeUpdateOrdinals(block: IMergeBlock) {\n if (MergeTree.traceOrdinals) {\n console.log(`update ordinals for children of node with ordinal ${ordinalToArray(block.ordinal)}`);\n }\n let clockStart: Trace | undefined;\n if (MergeTree.options.measureOrdinalTime) {\n clockStart = clock();\n }\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n block.setOrdinal(child, i);\n if (!child.isLeaf()) {\n this.nodeUpdateOrdinals(child);\n }\n }\n if (clockStart) {\n const elapsed = elapsedMicroseconds(clockStart);\n if (elapsed > this.maxOrdTime) {\n this.maxOrdTime = elapsed;\n }\n this.ordTime += elapsed;\n }\n }\n\n private addOverlappingClient(removalInfo: IRemovalInfo, clientId: number) {\n if (!removalInfo.removedClientOverlap) {\n removalInfo.removedClientOverlap = <number[]>[];\n }\n if (MergeTree.diagOverlappingRemove) {\n console.log(`added cli ${glc(this, clientId)} to rseq: ${removalInfo.removedSeq}`);\n }\n removalInfo.removedClientOverlap.push(clientId);\n }\n\n /**\n * Annotate a range with 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 - Optional. Specifies how to combine values for the property, such as \"incr\" for increment.\n * @param refSeq - The reference sequence number to use to apply the annotate\n * @param clientId - The id of the client making the annotate\n * @param seq - The sequence number of the annotate operation\n * @param opArgs - The op args for the annotate op. this is passed to the merge tree callback if there is one\n */\n annotateRange(\n start: number, end: number, props: PropertySet, combiningOp: ICombiningOp | undefined, refSeq: number,\n clientId: number, seq: number, opArgs: IMergeTreeDeltaOpArgs) {\n this.ensureIntervalBoundary(start, refSeq, clientId);\n this.ensureIntervalBoundary(end, refSeq, clientId);\n const deltaSegments: IMergeTreeSegmentDelta[] = [];\n const localSeq = seq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n let segmentGroup: SegmentGroup | undefined;\n\n const annotateSegment = (segment: ISegment) => {\n const propertyDeltas = segment.addProperties(props, combiningOp, seq, this.collabWindow);\n deltaSegments.push({ segment, propertyDeltas });\n if (this.collabWindow.collaborating) {\n if (seq === UnassignedSequenceNumber) {\n segmentGroup = this.addToPendingList(segment, segmentGroup, localSeq);\n } else {\n if (MergeTree.options.zamboniSegments) {\n this.addToLRUSet(segment, seq);\n }\n }\n }\n return true;\n };\n\n this.mapRange({ leaf: annotateSegment }, refSeq, clientId, undefined, start, end);\n\n // OpArgs == undefined => test code\n if (this.mergeTreeDeltaCallback) {\n this.mergeTreeDeltaCallback(\n opArgs,\n {\n operation: MergeTreeDeltaType.ANNOTATE,\n deltaSegments,\n });\n }\n if (this.collabWindow.collaborating && (seq !== UnassignedSequenceNumber)) {\n if (MergeTree.options.zamboniSegments) {\n this.zamboniSegments();\n }\n }\n }\n\n markRangeRemoved(start: number, end: number, refSeq: number, clientId: number, seq: number, overwrite = false, opArgs: IMergeTreeDeltaOpArgs) {\n let _overwrite = overwrite;\n this.ensureIntervalBoundary(start, refSeq, clientId);\n this.ensureIntervalBoundary(end, refSeq, clientId);\n let segmentGroup: SegmentGroup;\n const removedSegments: IMergeTreeSegmentDelta[] = [];\n const savedLocalRefs: LocalReferenceCollection[] = [];\n const localSeq = seq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n const markRemoved = (segment: ISegment, pos: number, start: number, end: number) => {\n const removalInfo = this.getRemovalInfo(segment);\n if (removalInfo.removedSeq !== undefined) {\n if (MergeTree.diagOverlappingRemove) {\n console.log(`yump @seq ${seq} cli ${glc(this, this.collabWindow.clientId)}: overlaps deleted segment ${removalInfo.removedSeq} text '${segment.toString()}'`);\n }\n _overwrite = true;\n if (removalInfo.removedSeq === UnassignedSequenceNumber) {\n // replace because comes later\n removalInfo.removedClientId = clientId;\n removalInfo.removedSeq = seq;\n segment.localRemovedSeq = undefined;\n } else {\n // Do not replace earlier sequence number for remove\n this.addOverlappingClient(removalInfo, clientId);\n }\n } else {\n removalInfo.removedClientId = clientId;\n removalInfo.removedSeq = seq;\n segment.localRemovedSeq = localSeq;\n\n removedSegments.push({ segment });\n if (segment.localRefs && !segment.localRefs.empty) {\n savedLocalRefs.push(segment.localRefs);\n }\n segment.localRefs = undefined;\n }\n\n // Save segment so can assign removed sequence number when acked by server\n if (this.collabWindow.collaborating) {\n // Use removal information\n const removalInfo = this.getRemovalInfo(segment);\n if ((removalInfo.removedSeq === UnassignedSequenceNumber) && (clientId === this.collabWindow.clientId)) {\n segmentGroup = this.addToPendingList(segment, segmentGroup, localSeq);\n } else {\n if (MergeTree.options.zamboniSegments) {\n this.addToLRUSet(segment, seq);\n }\n }\n // console.log(`saved local removed seg with text: ${textSegment.text}`);\n }\n return true;\n };\n const afterMarkRemoved = (node: IMergeBlock, pos: number, start: number, end: number) => {\n if (_overwrite) {\n this.nodeUpdateLengthNewStructure(node);\n } else {\n this.blockUpdateLength(node, seq, clientId);\n }\n return true;\n };\n // MergeTree.traceTraversal = true;\n this.mapRange({ leaf: markRemoved, post: afterMarkRemoved }, refSeq, clientId, undefined, start, end);\n if (savedLocalRefs.length > 0) {\n const length = this.getLength(refSeq, clientId);\n let refSegment: ISegment | undefined;\n if (start < length) {\n const afterSegOff = this.getContainingSegment(start, refSeq, clientId);\n refSegment = afterSegOff.segment;\n assert(!!refSegment, 0x052 /* \"Missing reference segment!\" */);\n if (!refSegment.localRefs) {\n refSegment.localRefs = new LocalReferenceCollection(refSegment);\n }\n refSegment.localRefs.addBeforeTombstones(...savedLocalRefs);\n } else if (length > 0) {\n const beforeSegOff = this.getContainingSegment(length - 1, refSeq, clientId);\n refSegment = beforeSegOff.segment;\n assert(!!refSegment, 0x053 /* \"Missing reference segment!\" */);\n if (!refSegment.localRefs) {\n refSegment.localRefs = new LocalReferenceCollection(refSegment);\n }\n refSegment.localRefs.addAfterTombstones(...savedLocalRefs);\n } else {\n // TODO: The tree is empty, so there isn't anywhere to put these\n // they should be preserved somehow\n for (const refsCollection of savedLocalRefs) {\n refsCollection.clear();\n }\n }\n\n if (refSegment) {\n this.blockUpdatePathLengths(refSegment.parent, TreeMaintenanceSequenceNumber,\n LocalClientId);\n }\n }\n\n // opArgs == undefined => test code\n if (this.mergeTreeDeltaCallback) {\n this.mergeTreeDeltaCallback(\n opArgs,\n {\n operation: MergeTreeDeltaType.REMOVE,\n deltaSegments: removedSegments,\n });\n }\n if (this.collabWindow.collaborating && (seq !== UnassignedSequenceNumber)) {\n if (MergeTree.options.zamboniSegments) {\n this.zamboniSegments();\n }\n }\n // MergeTree.traceTraversal = false;\n }\n\n private nodeUpdateLengthNewStructure(node: IMergeBlock, recur = false) {\n this.blockUpdate(node);\n if (this.collabWindow.collaborating) {\n node.partialLengths = PartialSequenceLengths.combine(this, node, this.collabWindow, recur);\n }\n }\n\n removeLocalReference(segment: ISegment, lref: LocalReference) {\n if (segment.localRefs) {\n const removedRef = segment.localRefs.removeLocalRef(lref);\n if (removedRef) {\n this.blockUpdatePathLengths(segment.parent, TreeMaintenanceSequenceNumber,\n LocalClientId);\n }\n }\n }\n\n addLocalReference(lref: LocalReference) {\n const segment = lref.segment!;\n let localRefs = segment.localRefs;\n if (!localRefs) {\n localRefs = new LocalReferenceCollection(segment);\n segment.localRefs = localRefs;\n }\n localRefs.addLocalRef(lref);\n this.blockUpdatePathLengths(segment.parent, TreeMaintenanceSequenceNumber,\n LocalClientId);\n }\n\n private blockUpdate(block: IMergeBlock) {\n let len = 0;\n const hierBlock = block.hierBlock();\n if (hierBlock) {\n hierBlock.rightmostTiles = createMap<Marker>();\n hierBlock.leftmostTiles = createMap<Marker>();\n hierBlock.rangeStacks = {};\n }\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n len += nodeTotalLength(this, child) ?? 0;\n if (hierBlock) {\n hierBlock.addNodeReferences(this, child);\n }\n if (this.blockUpdateActions) {\n this.blockUpdateActions.child(block, i);\n }\n }\n block.cachedLength = len;\n }\n\n private blockUpdatePathLengths(startBlock: IMergeBlock | undefined, seq: number, clientId: number, newStructure = false) {\n let block: IMergeBlock | undefined = startBlock;\n while (block !== undefined) {\n if (newStructure) {\n this.nodeUpdateLengthNewStructure(block);\n } else {\n this.blockUpdateLength(block, seq, clientId);\n }\n block = block.parent;\n }\n }\n\n private blockUpdateLength(node: IMergeBlock, seq: number, clientId: number) {\n this.blockUpdate(node);\n if (this.collabWindow.collaborating && (seq !== UnassignedSequenceNumber) && (seq !== TreeMaintenanceSequenceNumber)) {\n if (node.partialLengths !== undefined && MergeTree.options.incrementalUpdate && clientId !== NonCollabClient) {\n node.partialLengths.update(this, node, seq, clientId, this.collabWindow);\n } else {\n node.partialLengths = PartialSequenceLengths.combine(this, node, this.collabWindow);\n }\n }\n }\n\n map<TClientData>(actions: SegmentActions<TClientData>, refSeq: number, clientId: number, accum: TClientData) {\n // TODO: optimize to avoid comparisons\n this.nodeMap(this.root, actions, 0, refSeq, clientId, accum);\n }\n\n mapRange<TClientData>(actions: SegmentActions<TClientData>, refSeq: number, clientId: number, accum: TClientData, start?: number, end?: number, splitRange: boolean = false) {\n if (splitRange) {\n if (start) {\n this.ensureIntervalBoundary(start, refSeq, clientId);\n }\n if (end) {\n this.ensureIntervalBoundary(end, refSeq, clientId);\n }\n }\n this.nodeMap(this.root, actions, 0, refSeq, clientId, accum, start, end);\n }\n\n nodeToString(block: IMergeBlock, strbuf: string, indentCount = 0) {\n let _strbuf = strbuf;\n _strbuf += internedSpaces(indentCount);\n _strbuf += `Node (len ${block.cachedLength}) p len (${block.parent ? block.parent.cachedLength : 0}) ord ${ordinalToArray(block.ordinal)} with ${block.childCount} segs:\\n`;\n if (MergeTree.blockUpdateMarkers) {\n _strbuf += internedSpaces(indentCount);\n _strbuf += (<IHierBlock>block).hierToString(indentCount);\n }\n if (this.collabWindow.collaborating) {\n _strbuf += internedSpaces(indentCount);\n _strbuf += `${block.partialLengths!.toString((id) => glc(this, id), indentCount)}\\n`;\n }\n const children = block.children;\n for (let childIndex = 0; childIndex < block.childCount; childIndex++) {\n const child = children[childIndex];\n if (!child.isLeaf()) {\n _strbuf = this.nodeToString(child, _strbuf, indentCount + 4);\n } else {\n const segment = child;\n _strbuf += internedSpaces(indentCount + 4);\n _strbuf += `cli: ${glc(this, segment.clientId)} seq: ${segment.seq} ord: ${ordinalToArray(segment.ordinal)}`;\n const removalInfo = this.getRemovalInfo(segment);\n if (removalInfo.removedSeq !== undefined) {\n _strbuf += ` rcli: ${glc(this, removalInfo.removedClientId!)} rseq: ${removalInfo.removedSeq}`;\n }\n _strbuf += \"\\n\";\n _strbuf += internedSpaces(indentCount + 4);\n _strbuf += segment.toString();\n _strbuf += \"\\n\";\n }\n }\n return _strbuf;\n }\n\n toString() {\n return this.nodeToString(this.root, \"\", 0);\n }\n\n public incrementalBlockMap<TContext>(stateStack: Stack<IncrementalMapState<TContext>>) {\n while (!stateStack.empty()) {\n // We already check the stack is not empty\n const state = stateStack.top()!;\n if (state.op !== IncrementalExecOp.Go) {\n return;\n }\n if (state.childIndex === 0) {\n if (state.start === undefined) {\n state.start = 0;\n }\n if (state.end === undefined) {\n state.end = this.blockLength(state.block, state.refSeq, state.clientId);\n }\n\n if (state.actions.pre) {\n state.actions.pre(state);\n }\n }\n if ((state.op === IncrementalExecOp.Go) && (state.childIndex < state.block.childCount)) {\n const child = state.block.children[state.childIndex];\n const len = this.nodeLength(child, state.refSeq, state.clientId) ?? 0;\n if (MergeTree.traceIncrTraversal) {\n if (child.isLeaf()) {\n // eslint-disable-next-line @typescript-eslint/dot-notation\n console.log(`considering (r ${state.refSeq} c ${glc(this, state.clientId)}) seg with text ${child[\"text\"]} len ${len} seq ${child.seq} rseq ${child.removedSeq} cli ${glc(this, child.clientId)}`);\n }\n }\n if ((len > 0) && (state.start < len) && (state.end > 0)) {\n if (!child.isLeaf()) {\n const childState = new IncrementalMapState(child, state.actions, state.pos,\n state.refSeq, state.clientId, state.context, state.start, state.end, 0);\n stateStack.push(childState);\n } else {\n if (MergeTree.traceIncrTraversal) {\n // eslint-disable-next-line @typescript-eslint/dot-notation\n console.log(`action on seg with text ${child[\"text\"]}`);\n }\n state.actions.leaf(child, state);\n }\n }\n state.pos += len;\n state.start -= len;\n state.end -= len;\n state.childIndex++;\n } else {\n if (state.childIndex === state.block.childCount) {\n if ((state.op === IncrementalExecOp.Go) && state.actions.post) {\n state.actions.post(state);\n }\n stateStack.pop();\n }\n }\n }\n }\n\n private nodeMap<TClientData>(\n node: IMergeBlock, actions: SegmentActions<TClientData>, pos: number, refSeq: number,\n clientId: number, accum: TClientData, start?: number, end?: number) {\n let _start = start;\n let _end = end;\n let _pos = pos;\n if (_start === undefined) {\n _start = 0;\n }\n if (_end === undefined) {\n _end = this.blockLength(node, refSeq, clientId);\n }\n let go = true;\n if (actions.pre) {\n go = actions.pre(node, _pos, refSeq, clientId, _start, _end, accum);\n if (!go) {\n // Cancel this node but not entire traversal\n return true;\n }\n }\n const children = node.children;\n for (let childIndex = 0; childIndex < node.childCount; childIndex++) {\n const child = children[childIndex];\n const len = this.nodeLength(child, refSeq, clientId) ?? 0;\n if (MergeTree.traceTraversal) {\n let segInfo: string;\n if ((!child.isLeaf()) && this.collabWindow.collaborating) {\n segInfo = `minLength: ${child.partialLengths!.minLength}`;\n } else {\n const segment = <ISegment>child;\n segInfo = `cli: ${glc(this, segment.clientId)} seq: ${segment.seq} text: '${segment.toString()}'`;\n if (segment.removedSeq !== undefined) {\n segInfo += ` rcli: ${glc(this, segment.removedClientId!)} rseq: ${segment.removedSeq}`;\n }\n }\n console.log(`@tcli ${glc(this, this.collabWindow.clientId)}: map len: ${len} start: ${_start} end: ${_end} ${segInfo}`);\n }\n if (go && (_end > 0) && (len > 0) && (_start < len)) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n if (go) {\n go = this.nodeMap(child, actions, _pos, refSeq, clientId, accum, _start, _end);\n }\n } else {\n if (MergeTree.traceTraversal) {\n console.log(`@tcli ${glc(this, this.collabWindow.clientId)}: map leaf action`);\n }\n if (actions.leaf) {\n go = actions.leaf(child, _pos, refSeq, clientId, _start, _end, accum);\n }\n }\n }\n if (!go) {\n break;\n }\n if (actions.shift) {\n actions.shift(child, _pos, refSeq, clientId, _start, _end, accum);\n }\n _pos += len;\n _start -= len;\n _end -= len;\n }\n if (go && actions.post) {\n go = actions.post(node, _pos, refSeq, clientId, _start, _end, accum);\n }\n\n return go;\n }\n\n // Invokes the leaf action for all segments. Note that *all* segments are visited\n // regardless of if they would be visible to the current `clientId` and `refSeq`.\n walkAllSegments<TClientData>(\n block: IMergeBlock,\n action: (segment: ISegment, accum?: TClientData) => boolean,\n accum?: TClientData,\n ): boolean {\n let go = true;\n const children = block.children;\n for (let childIndex = 0; go && childIndex < block.childCount; childIndex++) {\n const child = children[childIndex];\n go = child.isLeaf()\n ? action(child, accum)\n : this.walkAllSegments(child, action, accum);\n }\n return go;\n }\n\n // Straight call every segment; goes until leaf action returns false\n private nodeMapReverse(\n block: IMergeBlock, leafAction: ISegmentAction<undefined>, pos: number, refSeq: number,\n clientId: number) {\n let go = true;\n const children = block.children;\n for (let childIndex = block.childCount - 1; childIndex >= 0; childIndex--) {\n const child = children[childIndex];\n if (go) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n if (go) {\n go = this.nodeMapReverse(child, leafAction, pos, refSeq, clientId);\n }\n } else {\n go = leafAction(child, pos, refSeq, clientId, 0, 0, undefined);\n }\n }\n if (!go) {\n break;\n }\n }\n return go;\n }\n}\n"]}
1
+ {"version":3,"file":"mergeTree.js","sourceRoot":"","sources":["../src/mergeTree.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/* eslint-disable @typescript-eslint/consistent-type-assertions */\n/* eslint-disable @typescript-eslint/no-shadow */\n/* eslint-disable no-bitwise */\n\nimport { assert, Trace } from \"@fluidframework/common-utils\";\nimport { IIntegerRange } from \"./base\";\nimport {\n Comparer,\n Heap,\n List,\n ListMakeHead,\n Stack,\n} from \"./collections\";\nimport {\n LocalClientId,\n NonCollabClient,\n TreeMaintenanceSequenceNumber,\n UnassignedSequenceNumber,\n UniversalSequenceNumber,\n} from \"./constants\";\nimport { LocalReference, LocalReferenceCollection } from \"./localReference\";\nimport {\n IMergeTreeDeltaOpArgs,\n IMergeTreeSegmentDelta,\n MergeTreeDeltaCallback,\n MergeTreeMaintenanceCallback,\n MergeTreeMaintenanceType,\n} from \"./mergeTreeDeltaCallback\";\nimport { TrackingGroupCollection } from \"./mergeTreeTracking\";\nimport {\n ICombiningOp,\n IJSONSegment,\n IMarkerDef,\n IRelativePosition,\n MergeTreeDeltaType,\n ReferenceType,\n} from \"./ops\";\nimport { PartialSequenceLengths } from \"./partialLengths\";\nimport {\n clone,\n createMap,\n extend,\n extendIfUndefined,\n MapLike,\n matchProperties,\n PropertySet,\n} from \"./properties\";\nimport { SegmentGroupCollection } from \"./segmentGroupCollection\";\nimport { PropertiesManager } from \"./segmentPropertiesManager\";\n\nexport interface ReferencePosition {\n properties?: PropertySet;\n refType: ReferenceType;\n // True if this reference is a segment.\n isLeaf(): boolean;\n getSegment(): ISegment | undefined;\n getOffset(): number;\n addProperties(newProps: PropertySet, op?: ICombiningOp): void;\n hasTileLabels(): boolean;\n hasRangeLabels(): boolean;\n hasTileLabel(label: string): boolean;\n hasRangeLabel(label: string): boolean;\n getTileLabels(): string[] | undefined;\n getRangeLabels(): string[] | undefined;\n}\n\nexport type RangeStackMap = MapLike<Stack<ReferencePosition>>;\n\nexport interface IMergeNodeCommon {\n parent?: IMergeBlock;\n /**\n * The length of the contents of the node.\n */\n cachedLength: number;\n index: number;\n ordinal: string;\n isLeaf(): this is ISegment;\n}\n\nexport type IMergeNode = IMergeBlock | ISegment;\n\n// Node with segments as children\nexport interface IMergeBlock extends IMergeNodeCommon {\n needsScour?: boolean;\n childCount: number;\n children: IMergeNode[];\n partialLengths?: PartialSequenceLengths;\n hierBlock(): IHierBlock | undefined;\n assignChild(child: IMergeNode, index: number, updateOrdinal?: boolean): void;\n setOrdinal(child: IMergeNode, index: number): void;\n}\n\nexport interface IHierBlock extends IMergeBlock {\n hierToString(indentCount: number): string;\n addNodeReferences(mergeTree: MergeTree, node: IMergeNode): void;\n rightmostTiles: MapLike<ReferencePosition>;\n leftmostTiles: MapLike<ReferencePosition>;\n rangeStacks: RangeStackMap;\n}\n\nexport interface IRemovalInfo {\n removedSeq?: number;\n removedClientId?: number;\n removedClientOverlap?: number[];\n}\n\n/**\n * A segment representing a portion of the merge tree.\n */\nexport interface ISegment extends IMergeNodeCommon, IRemovalInfo {\n readonly type: string;\n readonly segmentGroups: SegmentGroupCollection;\n readonly trackingCollection: TrackingGroupCollection;\n propertyManager?: PropertiesManager;\n localSeq?: number;\n localRemovedSeq?: number;\n seq?: number; // If not present assumed to be previous to window min\n clientId: number;\n localRefs?: LocalReferenceCollection;\n properties?: PropertySet;\n addProperties(\n newProps: PropertySet,\n op?: ICombiningOp,\n seq?: number,\n collabWindow?: CollaborationWindow,\n ): PropertySet | undefined;\n clone(): ISegment;\n canAppend(segment: ISegment): boolean;\n append(segment: ISegment): void;\n splitAt(pos: number): ISegment | undefined;\n toJSONObject(): any;\n /**\n * Acks the current segment against the segment group, op, and merge tree.\n *\n * Throws error if the segment state doesn't match segment group or op.\n * E.g. Segment group not first is pending queue.\n * Inserted segment does not have unassigned sequence number.\n *\n * Returns true if the op modifies the segment, otherwise false.\n * The only current false case is overlapping remove, where a segment is removed\n * by a previously sequenced operation before the current operation is acked.\n */\n ack(segmentGroup: SegmentGroup, opArgs: IMergeTreeDeltaOpArgs, mergeTree: MergeTree): boolean;\n}\n\nexport interface IMarkerModifiedAction {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (marker: Marker): void;\n}\n\nexport interface ISegmentAction<TClientData> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number,\n end: number, accum: TClientData): boolean;\n}\n\nexport interface ISegmentChanges {\n next?: ISegment;\n replaceCurrent?: ISegment;\n}\n\nexport interface BlockAction<TClientData> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (\n block: IMergeBlock,\n pos: number,\n refSeq: number,\n clientId: number,\n start: number | undefined,\n end: number | undefined,\n accum: TClientData,\n ): boolean;\n}\n\nexport interface NodeAction<TClientData> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (\n node: IMergeNode,\n pos: number,\n refSeq: number,\n clientId: number,\n start: number | undefined,\n end: number | undefined,\n clientData: TClientData,\n ): boolean;\n}\n\nexport interface IncrementalSegmentAction<TContext> {\n (segment: ISegment, state: IncrementalMapState<TContext>);\n}\n\nexport interface IncrementalBlockAction<TContext> {\n (state: IncrementalMapState<TContext>);\n}\n\nexport interface BlockUpdateActions {\n child: (block: IMergeBlock, index: number) => void;\n}\n\nexport interface InsertContext {\n candidateSegment?: ISegment;\n prepareEvents?: boolean;\n structureChange?: boolean;\n leaf: (segment: ISegment | undefined, pos: number, ic: InsertContext) => ISegmentChanges;\n continuePredicate?: (continueFromBlock: IMergeBlock) => boolean;\n}\n\nexport interface SegmentActions<TClientData> {\n leaf?: ISegmentAction<TClientData>;\n shift?: NodeAction<TClientData>;\n contains?: NodeAction<TClientData>;\n pre?: BlockAction<TClientData>;\n post?: BlockAction<TClientData>;\n}\n\nexport interface IncrementalSegmentActions<TContext> {\n leaf: IncrementalSegmentAction<TContext>;\n pre?: IncrementalBlockAction<TContext>;\n post?: IncrementalBlockAction<TContext>;\n}\n\nexport interface SearchResult {\n text: string;\n pos: number;\n}\n\nexport interface MergeTreeStats {\n maxHeight: number;\n nodeCount: number;\n leafCount: number;\n removedLeafCount: number;\n liveCount: number;\n histo: number[];\n windowTime?: number;\n packTime?: number;\n ordTime?: number;\n maxOrdTime?: number;\n}\n\nexport interface SegmentGroup {\n segments: ISegment[];\n localSeq: number;\n}\n\nexport class MergeNode implements IMergeNodeCommon {\n index: number = 0;\n ordinal: string = \"\";\n parent?: IMergeBlock;\n cachedLength: number = 0;\n\n isLeaf() {\n return false;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction addTile(tile: ReferencePosition, tiles: object) {\n const tileLabels = tile.getTileLabels();\n if (tileLabels) {\n for (const tileLabel of tileLabels) {\n tiles[tileLabel] = tile;\n }\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction addTileIfNotPresent(tile: ReferencePosition, tiles: object) {\n const tileLabels = tile.getTileLabels();\n if (tileLabels) {\n for (const tileLabel of tileLabels) {\n if (tiles[tileLabel] === undefined) {\n tiles[tileLabel] = tile;\n }\n }\n }\n}\n\nfunction applyStackDelta(currentStackMap: RangeStackMap, deltaStackMap: RangeStackMap) {\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const label in deltaStackMap) {\n const deltaStack = deltaStackMap[label];\n if (!deltaStack.empty()) {\n let currentStack = currentStackMap[label];\n if (currentStack === undefined) {\n currentStack = new Stack<ReferencePosition>();\n currentStackMap[label] = currentStack;\n }\n for (const delta of deltaStack.items) {\n applyRangeReference(currentStack, delta);\n }\n }\n }\n}\n\nfunction applyRangeReference(stack: Stack<ReferencePosition>, delta: ReferencePosition) {\n if (delta.refType & ReferenceType.NestBegin) {\n stack.push(delta);\n return true;\n } else {\n // Assume delta is end reference\n const top = stack.top();\n // TODO: match end with begin\n if (top && (top.refType & ReferenceType.NestBegin)) {\n stack.pop();\n } else {\n stack.push(delta);\n }\n return false;\n }\n}\n\nfunction addNodeReferences(\n mergeTree: MergeTree, node: IMergeNode,\n rightmostTiles: MapLike<ReferencePosition>,\n leftmostTiles: MapLike<ReferencePosition>, rangeStacks: RangeStackMap) {\n function updateRangeInfo(label: string, refPos: ReferencePosition) {\n let stack = rangeStacks[label];\n if (stack === undefined) {\n stack = new Stack<ReferencePosition>();\n rangeStacks[label] = stack;\n }\n applyRangeReference(stack, refPos);\n }\n if (node.isLeaf()) {\n const segment = node;\n if (mergeTree.localNetLength(segment) ?? 0 > 0) {\n if (Marker.is(segment)) {\n const markerId = segment.getId();\n // Also in insertMarker but need for reload segs case\n // can add option for this only from reload segs\n if (markerId) {\n mergeTree.mapIdToSegment(markerId, segment);\n }\n if (segment.refType & ReferenceType.Tile) {\n addTile(segment, rightmostTiles);\n addTileIfNotPresent(segment, leftmostTiles);\n }\n if (segment.refType & (ReferenceType.NestBegin | ReferenceType.NestEnd)) {\n const rangeLabels = segment.getRangeLabels();\n if (rangeLabels) {\n for (const label of segment.getRangeLabels()!) {\n updateRangeInfo(label, segment);\n }\n }\n }\n } else {\n const baseSegment = node as BaseSegment;\n if (baseSegment.localRefs && (baseSegment.localRefs.hierRefCount !== undefined) &&\n (baseSegment.localRefs.hierRefCount > 0)) {\n for (const lref of baseSegment.localRefs) {\n if (lref.refType & ReferenceType.Tile) {\n addTile(lref, rightmostTiles);\n addTileIfNotPresent(lref, leftmostTiles);\n }\n if (lref.refType & (ReferenceType.NestBegin | ReferenceType.NestEnd)) {\n for (const label of lref.getRangeLabels()!) {\n updateRangeInfo(label, lref);\n }\n }\n }\n }\n }\n }\n } else {\n const block = <IHierBlock>node;\n applyStackDelta(rangeStacks, block.rangeStacks);\n extend(rightmostTiles, block.rightmostTiles);\n extendIfUndefined(leftmostTiles, block.leftmostTiles);\n }\n}\n\nexport function ordinalToArray(ord: string) {\n const a: number[] = [];\n if (ord) {\n for (let i = 0, len = ord.length; i < len; i++) {\n a.push(ord.charCodeAt(i));\n }\n }\n return a;\n}\n\n// Note that the actual branching factor of the MergeTree is `MaxNodesInBlock - 1`. This is because\n// the MergeTree always inserts first, then checks for overflow and splits if the child count equals\n// `MaxNodesInBlock`. (i.e., `MaxNodesInBlock` contains 1 extra slot for temporary storage to\n// facilitate splits.)\nexport const MaxNodesInBlock = 8;\nconst traceOrdinals = false;\n\nexport class MergeBlock extends MergeNode implements IMergeBlock {\n public children: IMergeNode[];\n public constructor(public childCount: number) {\n super();\n this.children = new Array<IMergeNode>(MaxNodesInBlock);\n }\n\n public hierBlock(): HierMergeBlock | undefined {\n return undefined;\n }\n\n public setOrdinal(child: IMergeNode, index: number) {\n let childCount = this.childCount;\n if (childCount === 8) {\n childCount = 7;\n }\n assert((childCount >= 1) && (childCount <= 7), 0x040 /* \"Child count is not within [1,7] range!\" */);\n let localOrdinal: number;\n const ordinalWidth = 1 << (MaxNodesInBlock - (childCount + 1));\n if (index === 0) {\n localOrdinal = ordinalWidth - 1;\n } else {\n const prevOrd = this.children[index - 1].ordinal;\n const prevOrdCode = prevOrd.charCodeAt(prevOrd.length - 1);\n localOrdinal = prevOrdCode + ordinalWidth;\n }\n child.ordinal = this.ordinal + String.fromCharCode(localOrdinal);\n if (traceOrdinals) {\n // eslint-disable-next-line max-len\n console.log(`so: prnt chld prev ${ordinalToArray(this.ordinal)} ${ordinalToArray(child.ordinal)} ${(index > 0) ? ordinalToArray(this.children[index - 1].ordinal) : \"NA\"}`);\n }\n assert(child.ordinal.length === (this.ordinal.length + 1), 0x041 /* \"Unexpected child ordinal length!\" */);\n if (index > 0) {\n assert(\n child.ordinal > this.children[index - 1].ordinal,\n 0x042, /* \"Child ordinal <= previous sibling ordinal!\" */\n );\n // eslint-disable-next-line max-len\n // console.log(`${ordinalToArray(this.ordinal)} ${ordinalToArray(child.ordinal)} ${ordinalToArray(this.children[index - 1].ordinal)}`);\n // console.log(`ord width ${ordinalWidth}`);\n }\n }\n\n public assignChild(child: IMergeNode, index: number, updateOrdinal = true) {\n child.parent = this;\n child.index = index;\n if (updateOrdinal) {\n this.setOrdinal(child, index);\n }\n this.children[index] = child;\n }\n}\n\nclass HierMergeBlock extends MergeBlock implements IMergeBlock {\n public rightmostTiles: MapLike<ReferencePosition>;\n public leftmostTiles: MapLike<ReferencePosition>;\n public rangeStacks: MapLike<Stack<ReferencePosition>>;\n\n constructor(childCount: number) {\n super(childCount);\n this.rightmostTiles = createMap<ReferencePosition>();\n this.leftmostTiles = createMap<ReferencePosition>();\n this.rangeStacks = createMap<Stack<ReferencePosition>>();\n }\n\n public addNodeReferences(mergeTree: MergeTree, node: IMergeNode) {\n addNodeReferences(mergeTree, node, this.rightmostTiles, this.leftmostTiles,\n this.rangeStacks);\n }\n\n public hierBlock() {\n return this;\n }\n\n public hierToString(indentCount: number) {\n let strbuf = \"\";\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const key in this.rangeStacks) {\n const stack = this.rangeStacks[key];\n strbuf += internedSpaces(indentCount);\n strbuf += `${key}: `;\n for (const item of stack.items) {\n strbuf += `${item.toString()} `;\n }\n strbuf += \"\\n\";\n }\n return strbuf;\n }\n}\n\nfunction nodeTotalLength(mergeTree: MergeTree, node: IMergeNode) {\n if (!node.isLeaf()) {\n return node.cachedLength;\n }\n return mergeTree.localNetLength(node);\n}\n\nexport abstract class BaseSegment extends MergeNode implements ISegment {\n public clientId: number = LocalClientId;\n public seq: number = UniversalSequenceNumber;\n public removedSeq?: number;\n public removedClientId?: number;\n public removedClientOverlap?: number[];\n public readonly segmentGroups: SegmentGroupCollection = new SegmentGroupCollection(this);\n public readonly trackingCollection: TrackingGroupCollection = new TrackingGroupCollection(this);\n public propertyManager?: PropertiesManager;\n public properties?: PropertySet;\n public localRefs?: LocalReferenceCollection;\n public abstract readonly type: string;\n public localSeq?: number;\n public localRemovedSeq?: number;\n\n public addProperties(newProps: PropertySet, op?: ICombiningOp, seq?: number, collabWindow?: CollaborationWindow) {\n if (!this.propertyManager) {\n this.propertyManager = new PropertiesManager();\n }\n if (!this.properties) {\n this.properties = createMap<any>();\n }\n return this.propertyManager.addProperties(\n this.properties,\n newProps,\n op,\n seq,\n collabWindow && collabWindow.collaborating,\n );\n }\n\n public hasProperty(key: string): boolean {\n return !!this.properties && (this.properties[key] !== undefined);\n }\n\n public isLeaf() {\n return true;\n }\n\n protected cloneInto(b: ISegment) {\n b.clientId = this.clientId;\n // TODO: deep clone properties\n b.properties = clone(this.properties);\n b.removedClientId = this.removedClientId;\n // TODO: copy removed client overlap and branch removal info\n b.removedSeq = this.removedSeq;\n b.seq = this.seq;\n }\n\n public canAppend(segment: ISegment): boolean {\n return false;\n }\n\n protected addSerializedProps(jseg: IJSONSegment) {\n if (this.properties) {\n jseg.props = this.properties;\n }\n }\n\n public abstract toJSONObject(): any;\n\n public ack(segmentGroup: SegmentGroup, opArgs: IMergeTreeDeltaOpArgs, mergeTree: MergeTree): boolean {\n const currentSegmentGroup = this.segmentGroups.dequeue();\n assert(currentSegmentGroup === segmentGroup, 0x043 /* \"On ack, unexpected segmentGroup!\" */);\n switch (opArgs.op.type) {\n case MergeTreeDeltaType.ANNOTATE:\n assert(!!this.propertyManager, 0x044 /* \"On annotate ack, missing segment property manager!\" */);\n this.propertyManager.ackPendingProperties(opArgs.op);\n return true;\n\n case MergeTreeDeltaType.INSERT:\n assert(this.seq === UnassignedSequenceNumber, 0x045 /* \"On insert, seq number already assigned!\" */);\n this.seq = opArgs.sequencedMessage!.sequenceNumber;\n this.localSeq = undefined;\n return true;\n\n case MergeTreeDeltaType.REMOVE:\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const removalInfo: IRemovalInfo = this;\n assert(!!removalInfo, 0x046 /* \"On remove ack, missing removal info!\" */);\n assert(!!removalInfo.removedSeq, 0x047 /* \"On remove ack, missing removed sequence number!\" */);\n this.localRemovedSeq = undefined;\n if (removalInfo.removedSeq === UnassignedSequenceNumber) {\n removalInfo.removedSeq = opArgs.sequencedMessage!.sequenceNumber;\n return true;\n }\n if (MergeTree.diagOverlappingRemove) {\n console.log(`grump @seq ${opArgs.sequencedMessage!.sequenceNumber} ` +\n `cli ${glc(mergeTree, mergeTree.collabWindow.clientId)} ` +\n `from ${removalInfo.removedSeq} text ${mergeTree.toString()}`);\n }\n return false;\n\n default:\n throw new Error(`${opArgs.op.type} is in unrecognized operation type`);\n }\n }\n\n public splitAt(pos: number): ISegment | undefined {\n if (pos > 0) {\n const leafSegment = this.createSplitSegmentAt(pos);\n if (leafSegment) {\n this.copyPropertiesTo(leafSegment);\n leafSegment.parent = this.parent;\n\n // Give the leaf a temporary yet valid ordinal.\n // when this segment is put in the tree, it will get it's real ordinal,\n // but this ordinal meets all the necessary invariants for now.\n leafSegment.ordinal = this.ordinal + String.fromCharCode(0);\n\n leafSegment.removedClientId = this.removedClientId;\n leafSegment.removedSeq = this.removedSeq;\n leafSegment.localRemovedSeq = this.localRemovedSeq;\n leafSegment.seq = this.seq;\n leafSegment.localSeq = this.localSeq;\n leafSegment.clientId = this.clientId;\n if (this.removedClientOverlap) {\n leafSegment.removedClientOverlap = [...this.removedClientOverlap];\n }\n this.segmentGroups.copyTo(leafSegment);\n this.trackingCollection.copyTo(leafSegment);\n if (this.localRefs) {\n this.localRefs.split(pos, leafSegment);\n }\n }\n return leafSegment;\n }\n }\n\n private copyPropertiesTo(other: ISegment) {\n if (this.propertyManager) {\n if (this.properties) {\n other.propertyManager = new PropertiesManager();\n other.properties = this.propertyManager.copyTo(\n this.properties,\n other.properties,\n other.propertyManager,\n );\n }\n }\n }\n\n public abstract clone(): ISegment;\n public abstract append(segment: ISegment): void;\n protected abstract createSplitSegmentAt(pos: number): BaseSegment | undefined;\n}\n\nexport const reservedTileLabelsKey = \"referenceTileLabels\";\nexport const reservedRangeLabelsKey = \"referenceRangeLabels\";\nexport const reservedMarkerIdKey = \"markerId\";\nexport const reservedMarkerSimpleTypeKey = \"markerSimpleType\";\n\nexport const refGetTileLabels = (refPos: ReferencePosition) =>\n (refPos.refType & ReferenceType.Tile)\n && refPos.properties ? refPos.properties[reservedTileLabelsKey] as string[] : undefined;\n\nexport const refGetRangeLabels = (refPos: ReferencePosition) =>\n (refPos.refType & (ReferenceType.NestBegin | ReferenceType.NestEnd))\n && refPos.properties ? refPos.properties[reservedRangeLabelsKey] as string[] : undefined;\n\nexport function refHasTileLabel(refPos: ReferencePosition, label: string) {\n const tileLabels = refPos.getTileLabels();\n if (tileLabels) {\n for (const refLabel of tileLabels) {\n if (label === refLabel) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function refHasRangeLabel(refPos: ReferencePosition, label: string) {\n const rangeLabels = refPos.getRangeLabels();\n if (rangeLabels) {\n for (const refLabel of rangeLabels) {\n if (label === refLabel) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport interface IJSONMarkerSegment extends IJSONSegment {\n marker: IMarkerDef;\n}\n\nexport class Marker extends BaseSegment implements ReferencePosition {\n public static readonly type = \"Marker\";\n public static is(segment: ISegment): segment is Marker {\n return segment.type === Marker.type;\n }\n public readonly type = Marker.type;\n\n public static make(\n refType: ReferenceType, props?: PropertySet) {\n const marker = new Marker(refType);\n if (props) {\n marker.addProperties(props);\n }\n return marker;\n }\n\n constructor(public refType: ReferenceType) {\n super();\n this.cachedLength = 1;\n }\n\n toJSONObject() {\n const obj: IJSONMarkerSegment = { marker: { refType: this.refType } };\n super.addSerializedProps(obj);\n return obj;\n }\n\n static fromJSONObject(spec: any) {\n if (spec && typeof spec === \"object\" && \"marker\" in spec) {\n return Marker.make(\n spec.marker.refType,\n spec.props as PropertySet);\n }\n return undefined;\n }\n\n clone() {\n const b = Marker.make(this.refType, this.properties);\n this.cloneInto(b);\n return b;\n }\n\n getSegment() {\n return this;\n }\n\n getOffset() {\n return 0;\n }\n\n hasSimpleType(simpleTypeName: string) {\n return !!this.properties &&\n this.properties[reservedMarkerSimpleTypeKey] === simpleTypeName;\n }\n\n getProperties() {\n return this.properties;\n }\n\n getId(): string | undefined {\n if (this.properties && this.properties[reservedMarkerIdKey]) {\n return this.properties[reservedMarkerIdKey] as string;\n }\n }\n\n hasTileLabels() {\n return !!this.getTileLabels();\n }\n\n hasRangeLabels() {\n return !!this.getRangeLabels();\n }\n\n hasTileLabel(label: string): boolean {\n return refHasTileLabel(this, label);\n }\n\n hasRangeLabel(label: string): boolean {\n return refHasRangeLabel(this, label);\n }\n\n getTileLabels(): string[] | undefined {\n return refGetTileLabels(this);\n }\n\n getRangeLabels(): string[] | undefined {\n return refGetRangeLabels(this);\n }\n\n toString() {\n let bbuf = \"\";\n if (this.refType & ReferenceType.Tile) {\n bbuf += \"Tile\";\n }\n if (this.refType & ReferenceType.NestBegin) {\n if (bbuf.length > 0) {\n bbuf += \"; \";\n }\n bbuf += \"RangeBegin\";\n }\n if (this.refType & ReferenceType.NestEnd) {\n if (bbuf.length > 0) {\n bbuf += \"; \";\n }\n bbuf += \"RangeEnd\";\n }\n let lbuf = \"\";\n const id = this.getId();\n if (id) {\n bbuf += ` (${id}) `;\n }\n const tileLabels = this.getTileLabels();\n if (tileLabels) {\n lbuf += \"tile -- \";\n for (let i = 0, len = tileLabels.length; i < len; i++) {\n const tileLabel = tileLabels[i];\n if (i > 0) {\n lbuf += \"; \";\n }\n lbuf += tileLabel;\n }\n }\n const rangeLabels = this.getRangeLabels();\n if (rangeLabels) {\n let rangeKind = \"begin\";\n if (this.refType & ReferenceType.NestEnd) {\n rangeKind = \"end\";\n }\n if (tileLabels) {\n lbuf += \" \";\n }\n lbuf += `range ${rangeKind} -- `;\n const labels = rangeLabels;\n for (let i = 0, len = labels.length; i < len; i++) {\n const rangeLabel = labels[i];\n if (i > 0) {\n lbuf += \"; \";\n }\n lbuf += rangeLabel;\n }\n }\n let pbuf = \"\";\n if (this.properties) {\n pbuf += JSON.stringify(this.properties, (key, value) => {\n // Avoid circular reference when stringifying makers containing handles.\n // (Substitute a debug string instead.)\n const handle = !!value && value.IFluidHandle;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return handle\n ? `#Handle(${handle.routeContext.path}/${handle.path})`\n : value;\n });\n }\n return `M ${bbuf}: ${lbuf} ${pbuf}`;\n }\n\n protected createSplitSegmentAt(pos: number) {\n return undefined;\n }\n\n canAppend(segment: ISegment): boolean {\n return false;\n }\n\n append() { throw new Error(\"Can not append to marker\"); }\n}\n\nexport enum IncrementalExecOp {\n Go,\n Stop,\n Yield,\n}\n\nexport class IncrementalMapState<TContext> {\n op = IncrementalExecOp.Go;\n constructor(\n public block: IMergeBlock,\n public actions: IncrementalSegmentActions<TContext>,\n public pos: number,\n public refSeq: number,\n public clientId: number,\n public context: TContext,\n public start: number,\n public end: number,\n public childIndex = 0,\n ) {\n }\n}\n\nexport class CollaborationWindow {\n clientId = LocalClientId;\n collaborating = false;\n // Lowest-numbered segment in window; no client can reference a state before this one\n minSeq = 0;\n // Highest-numbered segment in window and current\n // reference segment for this client\n currentSeq = 0;\n\n localSeq = 0;\n\n loadFrom(a: CollaborationWindow) {\n this.clientId = a.clientId;\n this.collaborating = a.collaborating;\n this.minSeq = a.minSeq;\n this.currentSeq = a.currentSeq;\n }\n}\n\nexport const compareNumbers = (a: number, b: number) => a - b;\n\nexport const compareStrings = (a: string, b: string) => a.localeCompare(b);\n\nexport function clock() {\n return Trace.start();\n}\n\nexport function elapsedMicroseconds(trace: Trace) {\n return trace.trace().duration * 1000;\n}\n\nconst indentStrings = [\"\", \" \", \" \"];\nexport function internedSpaces(n: number) {\n if (indentStrings[n] === undefined) {\n indentStrings[n] = \"\";\n for (let i = 0; i < n; i++) {\n indentStrings[n] += \" \";\n }\n }\n return indentStrings[n];\n}\n\nexport interface IConsensusInfo {\n marker: Marker;\n callback: (m: Marker) => void;\n}\n\nexport interface ClientSeq {\n refSeq: number;\n clientId: string;\n}\n\nexport const clientSeqComparer: Comparer<ClientSeq> = {\n min: { refSeq: -1, clientId: \"\" },\n compare: (a, b) => a.refSeq - b.refSeq,\n};\n\nexport interface LRUSegment {\n segment?: ISegment;\n maxSeq: number;\n}\n\nconst LRUSegmentComparer: Comparer<LRUSegment> = {\n min: { maxSeq: -2 },\n compare: (a, b) => a.maxSeq - b.maxSeq,\n};\n\nexport function glc(mergeTree: MergeTree, id: number) {\n if (mergeTree.getLongClientId) {\n return mergeTree.getLongClientId(id);\n } else {\n return id.toString();\n }\n}\n\nexport interface SegmentAccumulator {\n segments: ISegment[];\n}\n\ninterface IReferenceSearchInfo {\n mergeTree: MergeTree;\n tileLabel: string;\n posPrecedesTile?: boolean;\n tile?: ReferencePosition;\n}\n\ninterface IMarkerSearchRangeInfo {\n mergeTree: MergeTree;\n rangeLabels: string[];\n stacks: RangeStackMap;\n}\n\nfunction applyLeafRangeMarker(marker: Marker, searchInfo: IMarkerSearchRangeInfo) {\n for (const rangeLabel of searchInfo.rangeLabels) {\n if (marker.hasRangeLabel(rangeLabel)) {\n let currentStack = searchInfo.stacks[rangeLabel];\n if (currentStack === undefined) {\n currentStack = new Stack<Marker>();\n searchInfo.stacks[rangeLabel] = currentStack;\n }\n applyRangeReference(currentStack, marker);\n }\n }\n}\nfunction recordRangeLeaf(\n segment: ISegment, segpos: number,\n refSeq: number, clientId: number, start: number | undefined, end: number | undefined,\n searchInfo: IMarkerSearchRangeInfo) {\n if (Marker.is(segment)) {\n if (segment.refType &\n (ReferenceType.NestBegin | ReferenceType.NestEnd)) {\n applyLeafRangeMarker(segment, searchInfo);\n }\n }\n return false;\n}\n\nfunction rangeShift(\n node: IMergeNode, segpos: number, refSeq: number, clientId: number,\n offset: number | undefined, end: number | undefined, searchInfo: IMarkerSearchRangeInfo) {\n if (node.isLeaf()) {\n const seg = node;\n if ((searchInfo.mergeTree.localNetLength(seg) ?? 0 > 0) && Marker.is(seg)) {\n if (seg.refType &\n (ReferenceType.NestBegin | ReferenceType.NestEnd)) {\n applyLeafRangeMarker(seg, searchInfo);\n }\n }\n } else {\n const block = <IHierBlock>node;\n applyStackDelta(searchInfo.stacks, block.rangeStacks);\n }\n return true;\n}\n\nfunction recordTileStart(\n segment: ISegment,\n segpos: number,\n refSeq: number,\n clientId: number,\n start: number,\n end: number,\n searchInfo: IReferenceSearchInfo) {\n if (Marker.is(segment)) {\n if (segment.hasTileLabel(searchInfo.tileLabel)) {\n searchInfo.tile = segment;\n }\n }\n return false;\n}\n\nfunction tileShift(\n node: IMergeNode, segpos: number, refSeq: number, clientId: number,\n offset: number | undefined, end: number | undefined, searchInfo: IReferenceSearchInfo) {\n if (node.isLeaf()) {\n const seg = node;\n if ((searchInfo.mergeTree.localNetLength(seg) > 0) && Marker.is(seg)) {\n if (seg.hasTileLabel(searchInfo.tileLabel)) {\n searchInfo.tile = seg;\n }\n }\n } else {\n const block = <IHierBlock>node;\n let marker: Marker;\n if (searchInfo.posPrecedesTile) {\n marker = <Marker>block.rightmostTiles[searchInfo.tileLabel];\n } else {\n marker = <Marker>block.leftmostTiles[searchInfo.tileLabel];\n }\n if (marker !== undefined) {\n searchInfo.tile = marker;\n }\n }\n return true;\n}\n\nexport interface MinListener {\n minRequired: number;\n onMinGE(minSeq: number): void;\n}\n\nconst minListenerComparer: Comparer<MinListener> = {\n min: { minRequired: Number.MIN_VALUE, onMinGE: () => { assert(false, 0x048 /* \"onMinGE()\" */); } },\n compare: (a, b) => a.minRequired - b.minRequired,\n};\n\nexport type LocalReferenceMapper = (id: string) => LocalReference;\n\n// Represents a sequence of text segments\nexport class MergeTree {\n private static readonly zamboniSegmentsMaxCount = 2;\n public static readonly options = {\n incrementalUpdate: true,\n insertAfterRemovedSegs: true,\n measureOrdinalTime: true,\n measureWindowTime: true,\n zamboniSegments: true,\n };\n private static readonly traceAppend = false;\n private static readonly traceZRemove = false;\n private static readonly traceOrdinals = false;\n public static readonly traceGatherText = false;\n private static readonly diagInsertTie = false;\n public static readonly diagOverlappingRemove = false;\n private static readonly traceTraversal = false;\n private static readonly traceIncrTraversal = false;\n private static readonly initBlockUpdateActions: BlockUpdateActions;\n private static readonly theUnfinishedNode = <IMergeBlock>{ childCount: -1 };\n // WARNING:\n // Setting blockUpdateMarkers to false will result in eventual consistency issues\n // for property updates on markers when loading from snapshots\n private static readonly blockUpdateMarkers = true;\n\n private windowTime = 0;\n private packTime = 0;\n private ordTime = 0;\n private maxOrdTime = 0;\n\n root: IMergeBlock;\n private readonly blockUpdateActions: BlockUpdateActions = MergeTree.initBlockUpdateActions;\n public readonly collabWindow = new CollaborationWindow();\n public pendingSegments: List<SegmentGroup> | undefined;\n private segmentsToScour: Heap<LRUSegment> | undefined;\n // TODO: add remove on segment remove\n // for now assume only markers have ids and so point directly at the Segment\n // if we need to have pointers to non-markers, we can change to point at local refs\n private readonly idToSegment = new Map<string, ISegment>();\n private minSeqListeners: Heap<MinListener> | undefined;\n // For diagnostics\n public getLongClientId?: (id: number) => string;\n public mergeTreeDeltaCallback?: MergeTreeDeltaCallback;\n public mergeTreeMaintenanceCallback?: MergeTreeMaintenanceCallback;\n\n // TODO: make and use interface describing options\n public constructor(public options?: PropertySet) {\n this.root = this.makeBlock(0);\n }\n\n private makeBlock(childCount: number) {\n let block: MergeBlock;\n if (MergeTree.blockUpdateMarkers) {\n block = new HierMergeBlock(childCount);\n } else {\n block = new MergeBlock(childCount);\n }\n block.ordinal = \"\";\n return block;\n }\n\n public clone() {\n const b = new MergeTree(this.options);\n // For now assume that b will not collaborate\n b.root = b.blockClone(this.root);\n }\n\n public blockClone(block: IMergeBlock, segments?: ISegment[]) {\n const bBlock = this.makeBlock(block.childCount);\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (child.isLeaf()) {\n const segment = this.segmentClone(child);\n bBlock.assignChild(segment, i);\n if (segments) {\n segments.push(segment);\n }\n } else {\n bBlock.assignChild(this.blockClone(child, segments), i);\n }\n }\n this.nodeUpdateLengthNewStructure(bBlock);\n this.nodeUpdateOrdinals(bBlock);\n return bBlock;\n }\n\n private segmentClone(segment: ISegment) {\n const b = segment.clone();\n return b;\n }\n\n public localNetLength(segment: ISegment) {\n const removalInfo: IRemovalInfo = segment;\n if (removalInfo.removedSeq !== undefined) {\n return 0;\n } else {\n return segment.cachedLength;\n }\n }\n\n // TODO: remove id when segment removed\n public mapIdToSegment(id: string, segment: ISegment) {\n this.idToSegment.set(id, segment);\n }\n\n private addNode(block: IMergeBlock, node: IMergeNode) {\n const index = block.childCount++;\n block.assignChild(node, index, false);\n return index;\n }\n\n /* eslint-disable max-len */\n public reloadFromSegments(segments: ISegment[]) {\n // This code assumes that a later call to `startCollaboration()` will initialize partial lengths.\n assert(!this.collabWindow.collaborating, 0x049 /* \"Trying to reload from segments while collaborating!\" */);\n\n const maxChildren = MaxNodesInBlock - 1;\n const measureReloadTime = false;\n\n // Starting with the leaf segments, recursively builds the B-Tree layer by layer from the bottom up.\n const buildMergeBlock = (nodes: IMergeNode[]) => {\n const blockCount = Math.ceil(nodes.length / maxChildren); // Compute # blocks require for this level of B-Tree\n const blocks: IMergeBlock[] = new Array(blockCount); // Pre-alloc array to collect nodes\n\n // For each block in this level of the B-Tree...\n for (let nodeIndex = 0, blockIndex = 0; // Start with the first block and first node\n blockIndex < blockCount; // If we have more blocks, we also have more nodes to insert\n blockIndex++ // Advance to next block in this layer.\n ) {\n const block = blocks[blockIndex] = this.makeBlock(0);\n\n // For each child of the current block, insert a node (while we have nodes left)\n // and update the block's info.\n for (let childIndex = 0;\n childIndex < maxChildren && nodeIndex < nodes.length; // While we still have children & nodes left\n childIndex++ , nodeIndex++ // Advance to next child & node\n ) {\n // Insert the next node into the current block\n this.addNode(block, nodes[nodeIndex]);\n }\n\n // Calculate this block's info. Previously this was inlined into the above loop as a micro-optimization,\n // but it turns out to be negligible in practice since `reloadFromSegments()` is only invoked for the\n // snapshot header. The bulk of the segments in long documents are inserted via `insertSegments()`.\n this.blockUpdate(block);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return blocks.length === 1 // If there is only one block at this layer...\n ? blocks[0] // ...then we're done. Return the root.\n : buildMergeBlock(blocks); // ...otherwise recursively build the next layer above blocks.\n };\n\n let clockStart: Trace | undefined;\n if (measureReloadTime) {\n clockStart = clock();\n }\n if (segments.length > 0) {\n this.root = buildMergeBlock(segments);\n this.nodeUpdateOrdinals(this.root);\n } else {\n this.root = this.makeBlock(0);\n }\n\n if (clockStart) {\n console.log(`reload time ${elapsedMicroseconds(clockStart)}`);\n }\n }\n /* eslint-enable max-len */\n\n // For now assume min starts at zero\n public startCollaboration(localClientId: number, minSeq: number, currentSeq: number) {\n this.collabWindow.clientId = localClientId;\n this.collabWindow.minSeq = minSeq;\n this.collabWindow.collaborating = true;\n this.collabWindow.currentSeq = currentSeq;\n this.segmentsToScour = new Heap<LRUSegment>([], LRUSegmentComparer);\n this.pendingSegments = ListMakeHead<SegmentGroup>();\n const measureFullCollab = false;\n let clockStart: Trace | undefined;\n if (measureFullCollab) {\n clockStart = clock();\n }\n this.nodeUpdateLengthNewStructure(this.root, true);\n if (clockStart) {\n console.log(`update partial lengths at start ${elapsedMicroseconds(clockStart)}`);\n }\n }\n\n private addToLRUSet(segment: ISegment, seq: number) {\n // If the parent node has not yet been marked for scour (i.e., needsScour is not false or undefined),\n // add the segment and mark the mark the node now.\n\n // TODO: 'seq' may be less than the current sequence number when inserting pre-ACKed\n // segments from a snapshot. We currently skip these for now.\n if (segment.parent!.needsScour !== true && seq > this.collabWindow.currentSeq) {\n segment.parent!.needsScour = true;\n this.segmentsToScour!.add({ segment, maxSeq: seq });\n }\n }\n\n private underflow(node: IMergeBlock) {\n return node.childCount < (MaxNodesInBlock / 2);\n }\n\n private scourNode(node: IMergeBlock, holdNodes: IMergeNode[]) {\n let prevSegment: ISegment | undefined;\n for (let k = 0; k < node.childCount; k++) {\n const childNode = node.children[k];\n if (childNode.isLeaf()) {\n const segment = childNode;\n if (segment.segmentGroups.empty) {\n if (segment.removedSeq !== undefined) {\n if (segment.removedSeq > this.collabWindow.minSeq) {\n holdNodes.push(segment);\n } else if (!segment.trackingCollection.empty) {\n holdNodes.push(segment);\n } else {\n if (MergeTree.traceZRemove) {\n // eslint-disable-next-line @typescript-eslint/dot-notation, max-len\n console.log(`${this.getLongClientId!(this.collabWindow.clientId)}: Zremove ${segment[\"text\"]}; cli ${this.getLongClientId!(segment.clientId)}`);\n }\n\n // Notify maintenance event observers that the segment is being unlinked from the MergeTree\n if (this.mergeTreeMaintenanceCallback) {\n this.mergeTreeMaintenanceCallback({\n operation: MergeTreeMaintenanceType.UNLINK,\n deltaSegments: [{ segment }],\n },\n undefined);\n }\n\n segment.parent = undefined;\n }\n prevSegment = undefined;\n } else {\n if (segment.seq! <= this.collabWindow.minSeq) {\n const canAppend = prevSegment\n && prevSegment.canAppend(segment)\n && matchProperties(prevSegment.properties, segment.properties)\n && prevSegment.trackingCollection.matches(segment.trackingCollection)\n && this.localNetLength(segment) > 0;\n\n if (canAppend) {\n if (MergeTree.traceAppend) {\n // eslint-disable-next-line @typescript-eslint/dot-notation, max-len\n console.log(`${this.getLongClientId!(this.collabWindow.clientId)}: append ${prevSegment![\"text\"]} + ${segment[\"text\"]}; cli ${this.getLongClientId!(prevSegment!.clientId)} + cli ${this.getLongClientId!(segment.clientId)}`);\n }\n prevSegment!.append(segment);\n if (this.mergeTreeMaintenanceCallback) {\n this.mergeTreeMaintenanceCallback({\n operation: MergeTreeMaintenanceType.APPEND,\n deltaSegments: [{ segment: prevSegment! }, { segment }],\n },\n undefined);\n }\n segment.parent = undefined;\n segment.trackingCollection.trackingGroups.forEach((tg) => tg.unlink(segment));\n } else {\n holdNodes.push(segment);\n if (this.localNetLength(segment) > 0) {\n prevSegment = segment;\n } else {\n prevSegment = undefined;\n }\n }\n } else {\n holdNodes.push(segment);\n prevSegment = undefined;\n }\n }\n } else {\n holdNodes.push(segment);\n prevSegment = undefined;\n }\n } else {\n holdNodes.push(childNode);\n prevSegment = undefined;\n }\n }\n }\n\n // Interior node with all node children\n private packParent(parent: IMergeBlock) {\n const children = parent.children;\n let childIndex: number;\n let childBlock: IMergeBlock;\n const holdNodes: IMergeNode[] = [];\n for (childIndex = 0; childIndex < parent.childCount; childIndex++) {\n // Debug assert not isLeaf()\n childBlock = <IMergeBlock>children[childIndex];\n this.scourNode(childBlock, holdNodes);\n // Will replace this block with a packed block\n childBlock.parent = undefined;\n }\n const totalNodeCount = holdNodes.length;\n const halfCount = MaxNodesInBlock / 2;\n let childCount = Math.min(MaxNodesInBlock - 1, Math.floor(totalNodeCount / halfCount));\n if (childCount < 1) {\n childCount = 1;\n }\n const baseCount = Math.floor(totalNodeCount / childCount);\n let extraCount = totalNodeCount % childCount;\n const packedBlocks = new Array<IMergeBlock>(MaxNodesInBlock);\n let readCount = 0;\n for (let nodeIndex = 0; nodeIndex < childCount; nodeIndex++) {\n let nodeCount = baseCount;\n if (extraCount > 0) {\n nodeCount++;\n extraCount--;\n }\n const packedBlock = this.makeBlock(nodeCount);\n for (let packedNodeIndex = 0; packedNodeIndex < nodeCount; packedNodeIndex++) {\n const nodeToPack = holdNodes[readCount++];\n packedBlock.assignChild(nodeToPack, packedNodeIndex, false);\n }\n packedBlock.parent = parent;\n packedBlocks[nodeIndex] = packedBlock;\n this.nodeUpdateLengthNewStructure(packedBlock);\n }\n if (readCount !== totalNodeCount) {\n console.log(`total count ${totalNodeCount} readCount ${readCount}`);\n }\n parent.children = packedBlocks;\n for (let j = 0; j < childCount; j++) {\n parent.assignChild(packedBlocks[j], j, false);\n }\n parent.childCount = childCount;\n if (this.underflow(parent) && (parent.parent)) {\n this.packParent(parent.parent);\n } else {\n this.nodeUpdateOrdinals(parent);\n this.blockUpdatePathLengths(parent, UnassignedSequenceNumber, -1, true);\n }\n }\n\n private zamboniSegments(zamboniSegmentsMaxCount = MergeTree.zamboniSegmentsMaxCount) {\n if (!this.collabWindow.collaborating) {\n return;\n }\n let clockStart;\n if (MergeTree.options.measureWindowTime) {\n clockStart = clock();\n }\n\n for (let i = 0; i < zamboniSegmentsMaxCount; i++) {\n let segmentToScour = this.segmentsToScour!.peek();\n if (!segmentToScour || segmentToScour.maxSeq > this.collabWindow.minSeq) {\n break;\n }\n segmentToScour = this.segmentsToScour!.get();\n // Only skip scouring if needs scour is explicitly false, not true or undefined\n if (segmentToScour.segment!.parent && segmentToScour.segment!.parent.needsScour !== false) {\n const block = segmentToScour.segment!.parent;\n const childrenCopy: IMergeNode[] = [];\n // console.log(`scouring from ${segmentToScour.segment.seq}`);\n this.scourNode(block, childrenCopy);\n // This will avoid the cost of re-scouring nodes\n // that have recently been scoured\n block.needsScour = false;\n\n const newChildCount = childrenCopy.length;\n\n if (newChildCount < block.childCount) {\n block.childCount = newChildCount;\n block.children = childrenCopy;\n for (let j = 0; j < newChildCount; j++) {\n block.assignChild(childrenCopy[j], j, false);\n }\n\n if (this.underflow(block) && block.parent) {\n // nodeUpdatePathLengths(node, UnassignedSequenceNumber, -1, true);\n let packClockStart;\n if (MergeTree.options.measureWindowTime) {\n packClockStart = clock();\n }\n this.packParent(block.parent);\n\n if (MergeTree.options.measureWindowTime) {\n this.packTime += elapsedMicroseconds(packClockStart);\n }\n } else {\n this.nodeUpdateOrdinals(block);\n this.blockUpdatePathLengths(block, UnassignedSequenceNumber, -1, true);\n }\n }\n }\n }\n\n if (MergeTree.options.measureWindowTime) {\n this.windowTime += elapsedMicroseconds(clockStart);\n }\n }\n\n public getCollabWindow() {\n return this.collabWindow;\n }\n\n public getStats() {\n const nodeGetStats = (block: IMergeBlock): MergeTreeStats => {\n const stats: MergeTreeStats = {\n maxHeight: 0,\n nodeCount: 0,\n leafCount: 0,\n removedLeafCount: 0,\n liveCount: 0,\n histo: [],\n };\n for (let k = 0; k < MaxNodesInBlock; k++) {\n stats.histo[k] = 0;\n }\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n let height = 1;\n if (!child.isLeaf()) {\n const childStats = nodeGetStats(child);\n height = 1 + childStats.maxHeight;\n stats.nodeCount += childStats.nodeCount;\n stats.leafCount += childStats.leafCount;\n stats.removedLeafCount += childStats.removedLeafCount;\n stats.liveCount += childStats.liveCount;\n for (let i = 0; i < MaxNodesInBlock; i++) {\n stats.histo[i] += childStats.histo[i];\n }\n } else {\n stats.leafCount++;\n const segment = child;\n if (segment.removedSeq !== undefined) {\n stats.removedLeafCount++;\n }\n }\n if (height > stats.maxHeight) {\n stats.maxHeight = height;\n }\n }\n stats.histo[block.childCount]++;\n stats.nodeCount++;\n stats.liveCount += block.childCount;\n return stats;\n };\n const rootStats = nodeGetStats(this.root);\n if (MergeTree.options.measureWindowTime) {\n rootStats.windowTime = this.windowTime;\n rootStats.packTime = this.packTime;\n rootStats.ordTime = this.ordTime;\n rootStats.maxOrdTime = this.maxOrdTime;\n }\n return rootStats;\n }\n\n public findHistorialPosition(pos: number, fromSeq: number, toSeq: number, clientId: number) {\n return this.findHistorialPositionFromClient(pos, fromSeq, toSeq, clientId);\n }\n\n private findHistorialPositionFromClient(pos: number, fromSeq: number, toSeq: number, clientId: number) {\n assert(fromSeq < toSeq, 0x04a /* \"Invalid range for historical position search!\" */);\n if (pos < this.getLength(fromSeq, clientId)) {\n assert(toSeq <= this.collabWindow.currentSeq,\n 0x04b /* \"Out-of-bounds end sequence number for historical position search!\" */);\n const segoff = this.getContainingSegment(pos, fromSeq, clientId);\n assert(segoff.segment !== undefined,\n 0x04c /* \"Containing segment for historical position search is undefined!\" */);\n const toPos = this.getPosition(segoff.segment, toSeq, clientId);\n const ret = toPos + segoff.offset!;\n assert(ret !== undefined,\n 0x04d /* \"Return value for historical position search is undefined!\" */);\n return ret;\n } else {\n return pos;\n }\n }\n\n public findHistorialRangeFromClient(\n rangeStart: number,\n rangeEnd: number,\n fromSeq: number,\n toSeq: number,\n clientId: number,\n ) {\n const ranges: IIntegerRange[] = [];\n const recordRange = (\n segment: ISegment,\n pos: number,\n refSeq: number,\n clientId: number,\n segStart: number,\n segEnd: number) => {\n let _segStart = segStart;\n let _segEnd = segEnd;\n if (this.nodeLength(segment, toSeq, clientId) ?? 0 > 0) {\n const position = this.getPosition(segment, toSeq, clientId);\n if (_segStart < 0) {\n _segStart = 0;\n }\n if (_segEnd > segment.cachedLength) {\n _segEnd = segment.cachedLength;\n }\n ranges.push({ start: position + _segStart, end: position + _segEnd });\n }\n return true;\n };\n this.mapRange({ leaf: recordRange }, fromSeq, clientId, undefined, rangeStart, rangeEnd);\n return ranges;\n }\n\n public findHistorialRange(rangeStart: number, rangeEnd: number, fromSeq: number, toSeq: number, clientId: number) {\n return this.findHistorialRangeFromClient(rangeStart, rangeEnd, fromSeq, toSeq, clientId);\n }\n\n public getLength(refSeq: number, clientId: number) {\n return this.blockLength(this.root, refSeq, clientId);\n }\n\n /**\n * Returns the current length of the MergeTree for the local client.\n */\n public get length() { return this.root.cachedLength; }\n\n public getPosition(node: MergeNode, refSeq: number, clientId: number) {\n let totalOffset = 0;\n let parent = node.parent;\n let prevParent: IMergeBlock | undefined;\n while (parent) {\n const children = parent.children;\n for (let childIndex = 0; childIndex < parent.childCount; childIndex++) {\n const child = children[childIndex];\n if ((prevParent && (child === prevParent)) || (child === node)) {\n break;\n }\n totalOffset += this.nodeLength(child, refSeq, clientId) ?? 0;\n }\n prevParent = parent;\n parent = parent.parent;\n }\n return totalOffset;\n }\n\n public getContainingSegment<T extends ISegment>(pos: number, refSeq: number, clientId: number) {\n let segment: T | undefined;\n let offset: number | undefined;\n\n const leaf = (leafSeg: ISegment, segpos: number, refSeq: number, clientId: number, start: number) => {\n segment = leafSeg as T;\n offset = start;\n return false;\n };\n this.searchBlock(this.root, pos, 0, refSeq, clientId, { leaf }, undefined);\n return { segment, offset };\n }\n\n private blockLength(node: IMergeBlock, refSeq: number, clientId: number) {\n if ((this.collabWindow.collaborating) && (clientId !== this.collabWindow.clientId)) {\n return node.partialLengths!.getPartialLength(refSeq, clientId);\n } else {\n return node.cachedLength;\n }\n }\n\n private nodeLength(node: IMergeNode, refSeq: number, clientId: number) {\n if ((!this.collabWindow.collaborating) || (this.collabWindow.clientId === clientId)) {\n // Local client sees all segments, even when collaborating\n if (!node.isLeaf()) {\n return node.cachedLength;\n } else {\n return this.localNetLength(node);\n }\n } else {\n // Sequence number within window\n if (!node.isLeaf()) {\n return node.partialLengths!.getPartialLength(refSeq, clientId);\n } else {\n const segment = node;\n const removalInfo: IRemovalInfo = segment;\n\n if(removalInfo.removedSeq !== undefined\n && removalInfo.removedSeq !== UnassignedSequenceNumber\n && removalInfo.removedSeq <= refSeq) {\n // this segment is a tombstone eligible for zamboni\n // so should never be considered, as it may not exist\n // on other clients\n return undefined;\n }\n if (((segment.clientId === clientId) ||\n ((segment.seq !== UnassignedSequenceNumber) && (segment.seq! <= refSeq)))) {\n // Segment happened by reference sequence number or segment from requesting client\n if (removalInfo.removedSeq !== undefined) {\n if (\n removalInfo.removedClientId === clientId\n || (removalInfo.removedClientOverlap\n && removalInfo.removedClientOverlap.includes(clientId))\n ) {\n return 0;\n } else {\n return segment.cachedLength;\n }\n } else {\n return segment.cachedLength;\n }\n } else {\n // the segment was inserted and removed before the\n // this context, so it will never exist for this\n // context\n if(removalInfo.removedSeq !== undefined\n && removalInfo.removedSeq !== UnassignedSequenceNumber) {\n return undefined;\n }\n // Segment invisible to client at reference sequence number/branch id/client id of op\n return 0;\n }\n }\n }\n }\n\n public addMinSeqListener(minRequired: number, onMinGE: (minSeq: number) => void) {\n if (!this.minSeqListeners) {\n this.minSeqListeners = new Heap<MinListener>([],\n minListenerComparer);\n }\n this.minSeqListeners.add({ minRequired, onMinGE });\n }\n\n private notifyMinSeqListeners() {\n if (this.minSeqListeners) {\n while ((this.minSeqListeners.count() > 0) &&\n (this.minSeqListeners.peek().minRequired <= this.collabWindow.minSeq)) {\n const minListener = this.minSeqListeners.get()!;\n minListener.onMinGE(this.collabWindow.minSeq);\n }\n }\n }\n\n public setMinSeq(minSeq: number) {\n assert(\n minSeq <= this.collabWindow.currentSeq,\n 0x04e, /* \"Trying to set minSeq above currentSeq of collab window!\" */\n );\n\n // Only move forward\n assert(this.collabWindow.minSeq <= minSeq, 0x04f /* \"minSeq of collab window > target minSeq!\" */);\n\n if (minSeq > this.collabWindow.minSeq) {\n this.collabWindow.minSeq = minSeq;\n if (MergeTree.options.zamboniSegments) {\n this.zamboniSegments();\n }\n this.notifyMinSeqListeners();\n }\n }\n\n public referencePositionToLocalPosition(\n refPos: ReferencePosition,\n refSeq = this.collabWindow.currentSeq,\n clientId = this.collabWindow.clientId) {\n const seg = refPos.getSegment();\n if (seg && seg.parent) {\n const offset = !seg.removedSeq ? refPos.getOffset() : 0;\n return offset + this.getPosition(seg, refSeq, clientId);\n }\n return LocalReference.DetachedPosition;\n }\n\n public getStackContext(startPos: number, clientId: number, rangeLabels: string[]) {\n const searchInfo: IMarkerSearchRangeInfo = {\n mergeTree: this,\n stacks: createMap<Stack<Marker>>(),\n rangeLabels,\n };\n\n this.search(startPos, UniversalSequenceNumber, clientId,\n { leaf: recordRangeLeaf, shift: rangeShift }, searchInfo);\n return searchInfo.stacks;\n }\n\n // TODO: filter function\n public findTile(startPos: number, clientId: number, tileLabel: string, posPrecedesTile = true) {\n const searchInfo: IReferenceSearchInfo = {\n mergeTree: this,\n posPrecedesTile,\n tileLabel,\n };\n\n if (posPrecedesTile) {\n this.search(startPos, UniversalSequenceNumber, clientId,\n { leaf: recordTileStart, shift: tileShift }, searchInfo);\n } else {\n this.backwardSearch(startPos, UniversalSequenceNumber, clientId,\n { leaf: recordTileStart, shift: tileShift }, searchInfo);\n }\n\n if (searchInfo.tile) {\n let pos: number;\n if (searchInfo.tile.isLeaf()) {\n const marker = <Marker>searchInfo.tile;\n pos = this.getPosition(marker, UniversalSequenceNumber, clientId);\n } else {\n const localRef = <LocalReference>searchInfo.tile;\n pos = localRef.toPosition();\n }\n return { tile: searchInfo.tile, pos };\n }\n }\n\n private search<TClientData>(\n pos: number, refSeq: number, clientId: number,\n actions: SegmentActions<TClientData> | undefined, clientData: TClientData): ISegment | undefined {\n return this.searchBlock(this.root, pos, 0, refSeq, clientId, actions, clientData);\n }\n\n private searchBlock<TClientData>(\n block: IMergeBlock, pos: number, segpos: number, refSeq: number, clientId: number,\n actions: SegmentActions<TClientData> | undefined, clientData: TClientData): ISegment | undefined {\n let _pos = pos;\n let _segpos = segpos;\n const children = block.children;\n if (actions && actions.pre) {\n actions.pre(block, _segpos, refSeq, clientId, undefined, undefined, clientData);\n }\n const contains = actions && actions.contains;\n for (let childIndex = 0; childIndex < block.childCount; childIndex++) {\n const child = children[childIndex];\n const len = this.nodeLength(child, refSeq, clientId) ?? 0;\n if (\n (!contains && _pos < len)\n || (contains && contains(child, _pos, refSeq, clientId, undefined, undefined, clientData))\n ) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n return this.searchBlock(child, _pos, _segpos, refSeq, clientId, actions, clientData);\n } else {\n if (actions && actions.leaf) {\n actions.leaf(child, _segpos, refSeq, clientId, _pos, -1, clientData);\n }\n return child;\n }\n } else {\n if (actions && actions.shift) {\n actions.shift(child, _segpos, refSeq, clientId, _pos, undefined, clientData);\n }\n _pos -= len;\n _segpos += len;\n }\n }\n if (actions && actions.post) {\n actions.post(block, _segpos, refSeq, clientId, undefined, undefined, clientData);\n }\n }\n\n private backwardSearch<TClientData>(\n pos: number, refSeq: number, clientId: number,\n actions: SegmentActions<TClientData> | undefined, clientData: TClientData): ISegment | undefined {\n const len = this.getLength(refSeq, clientId);\n if (pos > len) {\n return undefined;\n }\n return this.backwardSearchBlock(this.root, pos, len, refSeq, clientId, actions, clientData);\n }\n\n private backwardSearchBlock<TClientData>(\n block: IMergeBlock, pos: number, segEnd: number, refSeq: number, clientId: number,\n actions: SegmentActions<TClientData> | undefined, clientData: TClientData): ISegment | undefined {\n let _segEnd = segEnd;\n const children = block.children;\n if (actions && actions.pre) {\n actions.pre(block, _segEnd, refSeq, clientId, undefined, undefined, clientData);\n }\n const contains = actions && actions.contains;\n for (let childIndex = block.childCount - 1; childIndex >= 0; childIndex--) {\n const child = children[childIndex];\n const len = this.nodeLength(child, refSeq, clientId) ?? 0;\n const segpos = _segEnd - len;\n if (((!contains) && (pos >= segpos)) ||\n (contains && contains(child, pos, refSeq, clientId, undefined, undefined, clientData))) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n return this.backwardSearchBlock(child, pos, _segEnd, refSeq, clientId, actions, clientData);\n } else {\n if (actions && actions.leaf) {\n actions.leaf(child, segpos, refSeq, clientId, pos, -1, clientData);\n }\n return child;\n }\n } else {\n if (actions && actions.shift) {\n actions.shift(child, segpos, refSeq, clientId, pos, undefined, clientData);\n }\n _segEnd = segpos;\n }\n }\n if (actions && actions.post) {\n actions.post(block, _segEnd, refSeq, clientId, undefined, undefined, clientData);\n }\n }\n\n private updateRoot(splitNode: IMergeBlock | undefined) {\n if (splitNode !== undefined) {\n const newRoot = this.makeBlock(2);\n newRoot.assignChild(this.root, 0, false);\n newRoot.assignChild(splitNode, 1, false);\n this.root = newRoot;\n this.nodeUpdateOrdinals(this.root);\n this.nodeUpdateLengthNewStructure(this.root);\n }\n }\n\n /**\n * Assign sequence number to existing segment; update partial lengths to reflect the change\n * @param seq - sequence number given by server to pending segment\n */\n public ackPendingSegment(opArgs: IMergeTreeDeltaOpArgs, verboseOps = false) {\n const seq = opArgs.sequencedMessage!.sequenceNumber;\n const pendingSegmentGroup = this.pendingSegments!.dequeue();\n const nodesToUpdate: IMergeBlock[] = [];\n let overwrite = false;\n if (pendingSegmentGroup !== undefined) {\n if (verboseOps) {\n console.log(`segment group has ${pendingSegmentGroup.segments.length} segments`);\n }\n\n const deltaSegments: IMergeTreeSegmentDelta[] = [];\n pendingSegmentGroup.segments.map((pendingSegment) => {\n overwrite = !pendingSegment.ack(pendingSegmentGroup, opArgs, this) || overwrite;\n if (MergeTree.options.zamboniSegments) {\n this.addToLRUSet(pendingSegment, seq);\n }\n if (!nodesToUpdate.includes(pendingSegment.parent!)) {\n nodesToUpdate.push(pendingSegment.parent!);\n }\n deltaSegments.push({\n segment:pendingSegment,\n });\n });\n if(this.mergeTreeMaintenanceCallback) {\n this.mergeTreeMaintenanceCallback(\n {\n deltaSegments,\n operation: MergeTreeMaintenanceType.ACKNOWLEDGED,\n },\n opArgs,\n );\n }\n const clientId = this.collabWindow.clientId;\n for (const node of nodesToUpdate) {\n this.blockUpdatePathLengths(node, seq, clientId, overwrite);\n // NodeUpdatePathLengths(node, seq, clientId, true);\n }\n }\n if (MergeTree.options.zamboniSegments) {\n this.zamboniSegments();\n }\n }\n\n private addToPendingList(segment: ISegment, segmentGroup?: SegmentGroup, localSeq?: number) {\n let _segmentGroup = segmentGroup;\n if (_segmentGroup === undefined) {\n // TODO: review the cast\n _segmentGroup = { segments: [], localSeq } as SegmentGroup;\n this.pendingSegments!.enqueue(_segmentGroup);\n }\n segment.segmentGroups.enqueue(_segmentGroup);\n return _segmentGroup;\n }\n\n // TODO: error checking\n public getMarkerFromId(id: string) {\n return this.idToSegment.get(id);\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 * @param refseq - The reference sequence number at which to compute the position.\n * @param clientId - The client id with which to compute the position.\n */\n public posFromRelativePos(\n relativePos: IRelativePosition,\n refseq = this.collabWindow.currentSeq,\n clientId = this.collabWindow.clientId) {\n let pos = -1;\n let marker: Marker | undefined;\n if (relativePos.id) {\n marker = this.getMarkerFromId(relativePos.id) as Marker;\n }\n if (marker) {\n pos = this.getPosition(marker, refseq, clientId);\n if (!relativePos.before) {\n pos += marker.cachedLength;\n if (relativePos.offset !== undefined) {\n pos += relativePos.offset;\n }\n } else {\n if (relativePos.offset !== undefined) {\n pos -= relativePos.offset;\n }\n }\n }\n return pos;\n }\n\n public insertSegments(\n pos: number,\n segments: ISegment[],\n refSeq: number,\n clientId: number,\n seq: number,\n opArgs: IMergeTreeDeltaOpArgs | undefined,\n ) {\n // const tt = MergeTree.traceTraversal;\n // MergeTree.traceTraversal = true;\n this.ensureIntervalBoundary(pos, refSeq, clientId);\n\n if (MergeTree.traceOrdinals) {\n this.ordinalIntegrity();\n }\n const localSeq = seq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n\n this.blockInsert(pos, refSeq, clientId, seq, localSeq, segments);\n\n // opArgs == undefined => loading snapshot or test code\n if (this.mergeTreeDeltaCallback && opArgs !== undefined) {\n this.mergeTreeDeltaCallback(\n opArgs,\n {\n operation: MergeTreeDeltaType.INSERT,\n deltaSegments: segments.map((segment) => ({ segment })),\n });\n }\n\n // MergeTree.traceTraversal = tt;\n if (MergeTree.traceOrdinals) {\n this.ordinalIntegrity();\n }\n if (this.collabWindow.collaborating && MergeTree.options.zamboniSegments &&\n (seq !== UnassignedSequenceNumber)) {\n this.zamboniSegments();\n }\n }\n\n public insertAtReferencePosition(\n referencePosition: ReferencePosition,\n insertSegment: ISegment,\n opArgs: IMergeTreeDeltaOpArgs,\n ): void {\n if (insertSegment.cachedLength === 0) {\n return;\n }\n if (insertSegment.parent\n || insertSegment.removedSeq\n || insertSegment.seq !== UniversalSequenceNumber) {\n throw new Error(\"Cannot insert segment that has already been inserted.\");\n }\n\n const rebalanceTree = (segment: ISegment) => {\n // Blocks should never be left full\n // if the inserts makes the block full\n // then we need to walk up the chain of parents\n // and split the blocks until we find a block with\n // room\n let block = segment.parent;\n let ordinalUpdateNode: IMergeBlock | undefined = block;\n while (block !== undefined) {\n if (block.childCount >= MaxNodesInBlock) {\n const splitNode = this.split(block);\n if (block === this.root) {\n this.updateRoot(splitNode);\n // Update root already updates all it's children ordinals\n ordinalUpdateNode = undefined;\n } else {\n this.insertChildNode(block.parent!, splitNode, block.index + 1);\n ordinalUpdateNode = splitNode.parent;\n this.blockUpdateLength(block.parent!, UnassignedSequenceNumber, clientId);\n }\n } else {\n this.blockUpdateLength(block, UnassignedSequenceNumber, clientId);\n }\n block = block.parent;\n }\n // Only update ordinals once, for all children,\n // on the path\n if (ordinalUpdateNode) {\n this.nodeUpdateOrdinals(ordinalUpdateNode);\n }\n };\n\n const clientId = this.collabWindow.clientId;\n const refSegment = referencePosition.getSegment()!;\n const refOffset = referencePosition.getOffset();\n const refSegLen = this.nodeLength(refSegment, this.collabWindow.currentSeq, clientId);\n let startSeg = refSegment;\n // if the change isn't at a boundary, we need to split the segment\n if (refOffset !== 0 && refSegLen !== undefined && refSegLen !== 0) {\n const splitSeg = this.splitLeafSegment(refSegment, refOffset);\n assert(!!splitSeg.next, 0x050 /* \"Next segment changes are undefined!\" */);\n this.insertChildNode(refSegment.parent!, splitSeg.next, refSegment.index + 1);\n rebalanceTree(splitSeg.next);\n startSeg = splitSeg.next;\n }\n // walk back from the segment, to see if there is a previous tie break seg\n this.leftExcursion(startSeg, (backSeg) => {\n if (!backSeg.isLeaf()) {\n return true;\n }\n const backLen = this.nodeLength(backSeg, this.collabWindow.currentSeq, clientId);\n // ignore removed segments\n if(backLen === undefined) {\n return true;\n }\n // Find the nearest 0 length seg we can insert over, as all other inserts\n // go near to far\n if (backLen === 0) {\n if (this.breakTie(0, backSeg, UnassignedSequenceNumber)) {\n startSeg = backSeg;\n }\n return true;\n }\n return false;\n });\n\n if (this.collabWindow.collaborating) {\n insertSegment.localSeq = ++this.collabWindow.localSeq;\n insertSegment.seq = UnassignedSequenceNumber;\n } else {\n insertSegment.seq = UniversalSequenceNumber;\n }\n\n insertSegment.clientId = clientId;\n\n if (Marker.is(insertSegment)) {\n const markerId = insertSegment.getId();\n if (markerId) {\n this.mapIdToSegment(markerId, insertSegment);\n }\n }\n\n this.insertChildNode(startSeg.parent!, insertSegment, startSeg.index);\n\n rebalanceTree(insertSegment);\n\n if (this.mergeTreeDeltaCallback) {\n this.mergeTreeDeltaCallback(\n opArgs,\n {\n deltaSegments: [{ segment: insertSegment }],\n operation: MergeTreeDeltaType.INSERT,\n });\n }\n\n if (this.collabWindow.collaborating) {\n this.addToPendingList(insertSegment, undefined, insertSegment.localSeq);\n }\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: number): number | undefined {\n const segmentInfo = this.getContainingSegment(\n remoteClientPosition,\n remoteClientRefSeq,\n remoteClientId);\n\n const segwindow = this.getCollabWindow();\n\n if (segmentInfo && segmentInfo.segment) {\n const segmentPosition = this.getPosition(segmentInfo.segment, segwindow.currentSeq, segwindow.clientId);\n\n return segmentPosition + segmentInfo.offset!;\n } else {\n if (remoteClientPosition === this.getLength(remoteClientRefSeq, remoteClientId)) {\n return this.getLength(segwindow.currentSeq, segwindow.clientId);\n }\n }\n }\n\n private insertChildNode(block: IMergeBlock, child: IMergeNode, childIndex: number) {\n assert(block.childCount < MaxNodesInBlock, 0x051 /* \"Too many children on merge block!\" */);\n\n for (let i = block.childCount; i > childIndex; i--) {\n block.children[i] = block.children[i - 1];\n block.children[i].index = i;\n }\n\n block.childCount++;\n block.assignChild(child, childIndex, false);\n }\n\n private blockInsert<T extends ISegment>(\n pos: number,\n refSeq: number,\n clientId: number,\n seq: number,\n localSeq: number | undefined,\n newSegments: T[],\n ) {\n let segIsLocal = false;\n const checkSegmentIsLocal = (segment: ISegment, pos: number, refSeq: number, clientId: number) => {\n if (segment.seq === UnassignedSequenceNumber) {\n if (MergeTree.diagInsertTie) {\n // eslint-disable-next-line max-len\n console.log(`@cli ${glc(this, this.collabWindow.clientId)}: promoting continue due to seq ${segment.seq} text ${segment.toString()} ref ${refSeq}`);\n }\n segIsLocal = true;\n }\n // Only need to look at first segment that follows finished node\n return false;\n };\n\n const continueFrom = (node: IMergeBlock) => {\n segIsLocal = false;\n this.rightExcursion(node, checkSegmentIsLocal);\n if (MergeTree.diagInsertTie && segIsLocal) {\n // eslint-disable-next-line max-len\n console.log(`@cli ${glc(this, this.collabWindow.clientId)}: attempting continue with seq ${seq} ref ${refSeq} `);\n }\n return segIsLocal;\n };\n\n let segmentGroup: SegmentGroup;\n const saveIfLocal = (locSegment: ISegment) => {\n // Save segment so can assign sequence number when acked by server\n if (this.collabWindow.collaborating) {\n if ((locSegment.seq === UnassignedSequenceNumber) &&\n (clientId === this.collabWindow.clientId)) {\n segmentGroup = this.addToPendingList(locSegment, segmentGroup, localSeq);\n }\n // LocSegment.seq === 0 when coming from SharedSegmentSequence.loadBody()\n // In all other cases this has to be true (checked by addToLRUSet):\n // locSegment.seq > this.collabWindow.currentSeq\n else if ((locSegment.seq! > this.collabWindow.minSeq) &&\n MergeTree.options.zamboniSegments) {\n this.addToLRUSet(locSegment, locSegment.seq!);\n }\n }\n };\n const onLeaf = (segment: ISegment | undefined, pos: number, context: InsertContext) => {\n const segmentChanges: ISegmentChanges = {};\n if (segment) {\n // Insert before segment\n segmentChanges.replaceCurrent = context.candidateSegment;\n segmentChanges.next = segment;\n } else {\n segmentChanges.next = context.candidateSegment;\n }\n return segmentChanges;\n };\n\n // TODO: build tree from segs and insert all at once\n let insertPos = pos;\n for (const newSegment of newSegments) {\n segIsLocal = false;\n if (newSegment.cachedLength > 0) {\n newSegment.seq = seq;\n newSegment.localSeq = localSeq;\n newSegment.clientId = clientId;\n if (Marker.is(newSegment)) {\n const markerId = newSegment.getId();\n if (markerId) {\n this.mapIdToSegment(markerId, newSegment);\n }\n }\n\n const splitNode = this.insertingWalk(this.root, insertPos, refSeq, clientId, seq,\n { leaf: onLeaf, candidateSegment: newSegment, continuePredicate: continueFrom });\n\n if (newSegment.parent === undefined) {\n throw new Error(`MergeTree insert failed: ${JSON.stringify({\n currentSeq: this.collabWindow.currentSeq,\n minSeq: this.collabWindow.minSeq,\n segSeq: newSegment.seq,\n })}`);\n }\n\n this.updateRoot(splitNode);\n saveIfLocal(newSegment);\n\n insertPos += newSegment.cachedLength;\n }\n }\n }\n private readonly splitLeafSegment = (segment: ISegment | undefined, pos: number): ISegmentChanges => {\n if (!(pos > 0 && segment)) {\n return {};\n }\n\n const next = segment.splitAt(pos)!;\n if (this.mergeTreeMaintenanceCallback) {\n this.mergeTreeMaintenanceCallback({\n operation: MergeTreeMaintenanceType.SPLIT,\n deltaSegments: [{ segment }, { segment: next }],\n },\n undefined);\n }\n\n return { next };\n };\n\n private ensureIntervalBoundary(pos: number, refSeq: number, clientId: number) {\n const splitNode = this.insertingWalk(this.root, pos, refSeq, clientId, TreeMaintenanceSequenceNumber,\n { leaf: this.splitLeafSegment });\n this.updateRoot(splitNode);\n }\n\n // Assume called only when pos == len\n private breakTie(pos: number, node: IMergeNode, seq: number) {\n if (node.isLeaf()) {\n if (pos === 0) {\n // normalize the seq numbers\n // if the new seg is local (UnassignedSequenceNumber) give it the highest possible\n // seq for comparision, as it will get a seq higher than any other seq once sequences\n // if the current seg is local (UnassignedSequenceNumber) give it the second highest\n // possible seq, as the highest is reserved for the previous.\n const newSeq = seq === UnassignedSequenceNumber ? Number.MAX_SAFE_INTEGER : seq;\n const segSeq = node.seq === UnassignedSequenceNumber ? Number.MAX_SAFE_INTEGER - 1 : node.seq ?? 0;\n return newSeq > segSeq;\n }\n return false;\n } else {\n return true;\n }\n }\n\n // Visit segments starting from node's left siblings, then up to node's parent\n private leftExcursion(node: IMergeNode, leafAction: ISegmentAction<undefined>) {\n let go = true;\n let startNode = node;\n let parent = startNode.parent;\n while (parent) {\n const children = parent.children;\n let childIndex: number;\n let node: IMergeNode;\n let matchedStart = false;\n for (childIndex = parent.childCount - 1; childIndex >= 0; childIndex--) {\n node = children[childIndex];\n if (matchedStart) {\n if (!node.isLeaf()) {\n const childBlock = node;\n go = this.nodeMapReverse(childBlock, leafAction, 0, UniversalSequenceNumber,\n this.collabWindow.clientId);\n } else {\n go = leafAction(node, 0, UniversalSequenceNumber, this.collabWindow.clientId, 0, 0, undefined);\n }\n if (!go) {\n return;\n }\n } else {\n matchedStart = (startNode === node);\n }\n }\n startNode = parent;\n parent = parent.parent;\n }\n }\n\n // Visit segments starting from node's right siblings, then up to node's parent\n private rightExcursion(node: IMergeNode, leafAction: ISegmentAction<undefined>) {\n const actions = { leaf: leafAction };\n let go = true;\n let startNode = node;\n let parent = startNode.parent;\n while (parent) {\n const children = parent.children;\n let childIndex: number;\n let node: IMergeNode;\n let matchedStart = false;\n for (childIndex = 0; childIndex < parent.childCount; childIndex++) {\n node = children[childIndex];\n if (matchedStart) {\n if (!node.isLeaf()) {\n const childBlock = node;\n go = this.nodeMap(childBlock, actions, 0, UniversalSequenceNumber, this.collabWindow.clientId,\n undefined);\n } else {\n go = leafAction(node, 0, UniversalSequenceNumber, this.collabWindow.clientId, 0, 0, undefined);\n }\n if (!go) {\n return;\n }\n } else {\n matchedStart = (startNode === node);\n }\n }\n startNode = parent;\n parent = parent.parent;\n }\n }\n\n private insertingWalk(\n block: IMergeBlock, pos: number, refSeq: number, clientId: number, seq: number,\n context: InsertContext) {\n let _pos = pos;\n const children = block.children;\n let childIndex: number;\n let child: IMergeNode;\n let newNode: IMergeNode | undefined;\n let fromSplit: IMergeBlock | undefined;\n let found = false;\n for (childIndex = 0; childIndex < block.childCount; childIndex++) {\n child = children[childIndex];\n const len = this.nodeLength(child, refSeq, clientId);\n if(len === undefined) {\n // if the seg len in undefined, the segment\n // will be removed, so should just be skipped for now\n continue;\n }\n if (MergeTree.traceTraversal) {\n let segInfo: string;\n if ((!child.isLeaf()) && this.collabWindow.collaborating) {\n segInfo = `minLength: ${child.partialLengths!.minLength}`;\n } else {\n const segment = <ISegment>child;\n segInfo = `cli: ${glc(this, segment.clientId)} seq: ${segment.seq} text: ${segment.toString()}`;\n if (segment.removedSeq !== undefined) {\n segInfo += ` rcli: ${glc(this, segment.removedClientId!)} rseq: ${segment.removedSeq}`;\n }\n }\n console.log(`@tcli: ${glc(this, this.collabWindow.clientId)} len: ${len} pos: ${_pos} ${segInfo}`);\n }\n\n if ((_pos < len) || ((_pos === len) && this.breakTie(_pos, child, seq))) {\n // Found entry containing pos\n found = true;\n if (!child.isLeaf()) {\n const childBlock = child;\n // Internal node\n const splitNode = this.insertingWalk(childBlock, _pos, refSeq, clientId,\n seq, context);\n if (splitNode === undefined) {\n if (context.structureChange) {\n this.nodeUpdateLengthNewStructure(block);\n } else {\n this.blockUpdateLength(block, seq, clientId);\n }\n return undefined;\n } else if (splitNode === MergeTree.theUnfinishedNode) {\n if (MergeTree.traceTraversal) {\n // eslint-disable-next-line max-len\n console.log(`@cli ${glc(this, this.collabWindow.clientId)} unfinished bus pos ${_pos} len ${len}`);\n }\n _pos -= len; // Act as if shifted segment\n continue;\n } else {\n newNode = splitNode;\n fromSplit = splitNode;\n childIndex++; // Insert after\n }\n } else {\n if (MergeTree.traceTraversal) {\n console.log(`@tcli: ${glc(this, this.collabWindow.clientId)}: leaf action`);\n }\n const segment = child;\n const segmentChanges = context.leaf(segment, _pos, context);\n if (segmentChanges.replaceCurrent) {\n if (MergeTree.traceOrdinals) {\n console.log(`assign from leaf with block ord ${ordinalToArray(block.ordinal)}`);\n }\n block.assignChild(segmentChanges.replaceCurrent, childIndex, false);\n segmentChanges.replaceCurrent.ordinal = child.ordinal;\n }\n if (segmentChanges.next) {\n newNode = segmentChanges.next;\n childIndex++; // Insert after\n } else {\n // No change\n if (context.structureChange) {\n this.nodeUpdateLengthNewStructure(block);\n }\n return undefined;\n }\n }\n break;\n } else {\n _pos -= len;\n }\n }\n if (MergeTree.traceTraversal) {\n if ((!found) && (_pos > 0)) {\n // eslint-disable-next-line max-len\n console.log(`inserting walk fell through pos ${_pos} len: ${this.blockLength(this.root, refSeq, clientId)}`);\n }\n }\n if (!newNode) {\n if (_pos === 0) {\n if ((seq !== UnassignedSequenceNumber) && context.continuePredicate &&\n context.continuePredicate(block)) {\n return MergeTree.theUnfinishedNode;\n } else {\n if (MergeTree.traceTraversal) {\n console.log(`@tcli: ${glc(this, this.collabWindow.clientId)}: leaf action pos 0`);\n }\n const segmentChanges = context.leaf(undefined, _pos, context);\n newNode = segmentChanges.next;\n // Assert segmentChanges.replaceCurrent === undefined\n }\n }\n }\n if (newNode) {\n for (let i = block.childCount; i > childIndex; i--) {\n block.children[i] = block.children[i - 1];\n block.children[i].index = i;\n }\n block.assignChild(newNode, childIndex, false);\n block.childCount++;\n block.setOrdinal(newNode, childIndex);\n if (block.childCount < MaxNodesInBlock) {\n if (fromSplit) {\n if (MergeTree.traceOrdinals) {\n console.log(`split ord ${ordinalToArray(fromSplit.ordinal)}`);\n }\n this.nodeUpdateOrdinals(fromSplit);\n }\n if (context.structureChange) {\n this.nodeUpdateLengthNewStructure(block);\n } else {\n this.blockUpdateLength(block, seq, clientId);\n }\n return undefined;\n } else {\n // Don't update ordinals because higher block will do it\n return this.split(block);\n }\n } else {\n return undefined;\n }\n }\n\n private split(node: IMergeBlock) {\n const halfCount = MaxNodesInBlock / 2;\n const newNode = this.makeBlock(halfCount);\n node.childCount = halfCount;\n // Update ordinals to reflect lowered child count\n this.nodeUpdateOrdinals(node);\n for (let i = 0; i < halfCount; i++) {\n newNode.assignChild(node.children[halfCount + i], i, false);\n node.children[halfCount + i] = undefined!;\n }\n this.nodeUpdateLengthNewStructure(node);\n this.nodeUpdateLengthNewStructure(newNode);\n return newNode;\n }\n\n private ordinalIntegrity() {\n console.log(\"chk ordnls\");\n this.nodeOrdinalIntegrity(this.root);\n }\n\n private nodeOrdinalIntegrity(block: IMergeBlock) {\n const olen = block.ordinal.length;\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (child.ordinal) {\n if (olen !== (child.ordinal.length - 1)) {\n console.log(\"node integrity issue\");\n }\n if (i > 0) {\n if (child.ordinal <= block.children[i - 1].ordinal) {\n console.log(\"node sib integrity issue\");\n // eslint-disable-next-line max-len\n console.log(`??: prnt chld prev ${ordinalToArray(block.ordinal)} ${ordinalToArray(child.ordinal)} ${(i > 0) ? ordinalToArray(block.children[i - 1].ordinal) : \"NA\"}`);\n }\n }\n if (!child.isLeaf()) {\n this.nodeOrdinalIntegrity(child);\n }\n } else {\n console.log(`node child ordinal not set ${i}`);\n console.log(`??: prnt ${ordinalToArray(block.ordinal)}`);\n }\n }\n }\n\n private nodeUpdateOrdinals(block: IMergeBlock) {\n if (MergeTree.traceOrdinals) {\n console.log(`update ordinals for children of node with ordinal ${ordinalToArray(block.ordinal)}`);\n }\n let clockStart: Trace | undefined;\n if (MergeTree.options.measureOrdinalTime) {\n clockStart = clock();\n }\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n block.setOrdinal(child, i);\n if (!child.isLeaf()) {\n this.nodeUpdateOrdinals(child);\n }\n }\n if (clockStart) {\n const elapsed = elapsedMicroseconds(clockStart);\n if (elapsed > this.maxOrdTime) {\n this.maxOrdTime = elapsed;\n }\n this.ordTime += elapsed;\n }\n }\n\n private addOverlappingClient(removalInfo: IRemovalInfo, clientId: number) {\n if (!removalInfo.removedClientOverlap) {\n removalInfo.removedClientOverlap = <number[]>[];\n }\n if (MergeTree.diagOverlappingRemove) {\n console.log(`added cli ${glc(this, clientId)} to rseq: ${removalInfo.removedSeq}`);\n }\n removalInfo.removedClientOverlap.push(clientId);\n }\n\n /**\n * Annotate a range with 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 - Optional. Specifies how to combine values for the property, such as \"incr\" for increment.\n * @param refSeq - The reference sequence number to use to apply the annotate\n * @param clientId - The id of the client making the annotate\n * @param seq - The sequence number of the annotate operation\n * @param opArgs - The op args for the annotate op. this is passed to the merge tree callback if there is one\n */\n public annotateRange(\n start: number, end: number, props: PropertySet, combiningOp: ICombiningOp | undefined, refSeq: number,\n clientId: number, seq: number, opArgs: IMergeTreeDeltaOpArgs) {\n this.ensureIntervalBoundary(start, refSeq, clientId);\n this.ensureIntervalBoundary(end, refSeq, clientId);\n const deltaSegments: IMergeTreeSegmentDelta[] = [];\n const localSeq = seq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n let segmentGroup: SegmentGroup | undefined;\n\n const annotateSegment = (segment: ISegment) => {\n const propertyDeltas = segment.addProperties(props, combiningOp, seq, this.collabWindow);\n deltaSegments.push({ segment, propertyDeltas });\n if (this.collabWindow.collaborating) {\n if (seq === UnassignedSequenceNumber) {\n segmentGroup = this.addToPendingList(segment, segmentGroup, localSeq);\n } else {\n if (MergeTree.options.zamboniSegments) {\n this.addToLRUSet(segment, seq);\n }\n }\n }\n return true;\n };\n\n this.mapRange({ leaf: annotateSegment }, refSeq, clientId, undefined, start, end);\n\n // OpArgs == undefined => test code\n if (this.mergeTreeDeltaCallback) {\n this.mergeTreeDeltaCallback(\n opArgs,\n {\n operation: MergeTreeDeltaType.ANNOTATE,\n deltaSegments,\n });\n }\n if (this.collabWindow.collaborating && (seq !== UnassignedSequenceNumber)) {\n if (MergeTree.options.zamboniSegments) {\n this.zamboniSegments();\n }\n }\n }\n\n public markRangeRemoved(\n start: number,\n end: number,\n refSeq: number,\n clientId: number,\n seq: number,\n overwrite = false,\n opArgs: IMergeTreeDeltaOpArgs,\n ) {\n let _overwrite = overwrite;\n this.ensureIntervalBoundary(start, refSeq, clientId);\n this.ensureIntervalBoundary(end, refSeq, clientId);\n let segmentGroup: SegmentGroup;\n const removedSegments: IMergeTreeSegmentDelta[] = [];\n const savedLocalRefs: LocalReferenceCollection[] = [];\n const localSeq = seq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n const markRemoved = (segment: ISegment, pos: number, start: number, end: number) => {\n const removalInfo: IRemovalInfo = segment;\n if (removalInfo.removedSeq !== undefined) {\n if (MergeTree.diagOverlappingRemove) {\n // eslint-disable-next-line max-len\n console.log(`yump @seq ${seq} cli ${glc(this, this.collabWindow.clientId)}: overlaps deleted segment ${removalInfo.removedSeq} text '${segment.toString()}'`);\n }\n _overwrite = true;\n if (removalInfo.removedSeq === UnassignedSequenceNumber) {\n // replace because comes later\n removalInfo.removedClientId = clientId;\n removalInfo.removedSeq = seq;\n segment.localRemovedSeq = undefined;\n } else {\n // Do not replace earlier sequence number for remove\n this.addOverlappingClient(removalInfo, clientId);\n }\n } else {\n removalInfo.removedClientId = clientId;\n removalInfo.removedSeq = seq;\n segment.localRemovedSeq = localSeq;\n\n removedSegments.push({ segment });\n if (segment.localRefs && !segment.localRefs.empty) {\n savedLocalRefs.push(segment.localRefs);\n }\n segment.localRefs = undefined;\n }\n\n // Save segment so can assign removed sequence number when acked by server\n if (this.collabWindow.collaborating) {\n // Use removal information\n const removalInfo: IRemovalInfo = segment;\n if (removalInfo.removedSeq === UnassignedSequenceNumber && clientId === this.collabWindow.clientId) {\n segmentGroup = this.addToPendingList(segment, segmentGroup, localSeq);\n } else {\n if (MergeTree.options.zamboniSegments) {\n this.addToLRUSet(segment, seq);\n }\n }\n // console.log(`saved local removed seg with text: ${textSegment.text}`);\n }\n return true;\n };\n const afterMarkRemoved = (node: IMergeBlock, pos: number, start: number, end: number) => {\n if (_overwrite) {\n this.nodeUpdateLengthNewStructure(node);\n } else {\n this.blockUpdateLength(node, seq, clientId);\n }\n return true;\n };\n // MergeTree.traceTraversal = true;\n this.mapRange({ leaf: markRemoved, post: afterMarkRemoved }, refSeq, clientId, undefined, start, end);\n if (savedLocalRefs.length > 0) {\n const length = this.getLength(refSeq, clientId);\n let refSegment: ISegment | undefined;\n if (start < length) {\n const afterSegOff = this.getContainingSegment(start, refSeq, clientId);\n refSegment = afterSegOff.segment;\n assert(!!refSegment, 0x052 /* \"Missing reference segment!\" */);\n if (!refSegment.localRefs) {\n refSegment.localRefs = new LocalReferenceCollection(refSegment);\n }\n refSegment.localRefs.addBeforeTombstones(...savedLocalRefs);\n } else if (length > 0) {\n const beforeSegOff = this.getContainingSegment(length - 1, refSeq, clientId);\n refSegment = beforeSegOff.segment;\n assert(!!refSegment, 0x053 /* \"Missing reference segment!\" */);\n if (!refSegment.localRefs) {\n refSegment.localRefs = new LocalReferenceCollection(refSegment);\n }\n refSegment.localRefs.addAfterTombstones(...savedLocalRefs);\n } else {\n // TODO: The tree is empty, so there isn't anywhere to put these\n // they should be preserved somehow\n for (const refsCollection of savedLocalRefs) {\n refsCollection.clear();\n }\n }\n\n if (refSegment) {\n this.blockUpdatePathLengths(refSegment.parent, TreeMaintenanceSequenceNumber,\n LocalClientId);\n }\n }\n\n // opArgs == undefined => test code\n if (this.mergeTreeDeltaCallback) {\n this.mergeTreeDeltaCallback(\n opArgs,\n {\n operation: MergeTreeDeltaType.REMOVE,\n deltaSegments: removedSegments,\n });\n }\n if (this.collabWindow.collaborating && (seq !== UnassignedSequenceNumber)) {\n if (MergeTree.options.zamboniSegments) {\n this.zamboniSegments();\n }\n }\n // MergeTree.traceTraversal = false;\n }\n\n private nodeUpdateLengthNewStructure(node: IMergeBlock, recur = false) {\n this.blockUpdate(node);\n if (this.collabWindow.collaborating) {\n node.partialLengths = PartialSequenceLengths.combine(this, node, this.collabWindow, recur);\n }\n }\n\n public removeLocalReference(segment: ISegment, lref: LocalReference) {\n if (segment.localRefs) {\n const removedRef = segment.localRefs.removeLocalRef(lref);\n if (removedRef) {\n this.blockUpdatePathLengths(segment.parent, TreeMaintenanceSequenceNumber,\n LocalClientId);\n }\n }\n }\n\n public addLocalReference(lref: LocalReference) {\n const segment = lref.segment!;\n let localRefs = segment.localRefs;\n if (!localRefs) {\n localRefs = new LocalReferenceCollection(segment);\n segment.localRefs = localRefs;\n }\n localRefs.addLocalRef(lref);\n this.blockUpdatePathLengths(segment.parent, TreeMaintenanceSequenceNumber,\n LocalClientId);\n }\n\n private blockUpdate(block: IMergeBlock) {\n let len = 0;\n const hierBlock = block.hierBlock();\n if (hierBlock) {\n hierBlock.rightmostTiles = createMap<Marker>();\n hierBlock.leftmostTiles = createMap<Marker>();\n hierBlock.rangeStacks = {};\n }\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n len += nodeTotalLength(this, child) ?? 0;\n if (hierBlock) {\n hierBlock.addNodeReferences(this, child);\n }\n if (this.blockUpdateActions) {\n this.blockUpdateActions.child(block, i);\n }\n }\n block.cachedLength = len;\n }\n\n private blockUpdatePathLengths(\n startBlock: IMergeBlock | undefined,\n seq: number,\n clientId: number,\n newStructure = false,\n ) {\n let block: IMergeBlock | undefined = startBlock;\n while (block !== undefined) {\n if (newStructure) {\n this.nodeUpdateLengthNewStructure(block);\n } else {\n this.blockUpdateLength(block, seq, clientId);\n }\n block = block.parent;\n }\n }\n\n private blockUpdateLength(node: IMergeBlock, seq: number, clientId: number) {\n this.blockUpdate(node);\n if (\n this.collabWindow.collaborating\n && seq !== UnassignedSequenceNumber\n && seq !== TreeMaintenanceSequenceNumber\n ) {\n if (\n node.partialLengths !== undefined\n && MergeTree.options.incrementalUpdate\n && clientId !== NonCollabClient\n ) {\n node.partialLengths.update(this, node, seq, clientId, this.collabWindow);\n } else {\n node.partialLengths = PartialSequenceLengths.combine(this, node, this.collabWindow);\n }\n }\n }\n\n public map<TClientData>(\n actions: SegmentActions<TClientData>,\n refSeq: number,\n clientId: number,\n accum: TClientData,\n ) {\n // TODO: optimize to avoid comparisons\n this.nodeMap(this.root, actions, 0, refSeq, clientId, accum);\n }\n\n public mapRange<TClientData>(\n actions: SegmentActions<TClientData>,\n refSeq: number,\n clientId: number,\n accum: TClientData,\n start?: number,\n end?: number,\n splitRange: boolean = false,\n ) {\n if (splitRange) {\n if (start) {\n this.ensureIntervalBoundary(start, refSeq, clientId);\n }\n if (end) {\n this.ensureIntervalBoundary(end, refSeq, clientId);\n }\n }\n this.nodeMap(this.root, actions, 0, refSeq, clientId, accum, start, end);\n }\n\n public nodeToString(block: IMergeBlock, strbuf: string, indentCount = 0) {\n let _strbuf = strbuf;\n _strbuf += internedSpaces(indentCount);\n // eslint-disable-next-line max-len\n _strbuf += `Node (len ${block.cachedLength}) p len (${block.parent ? block.parent.cachedLength : 0}) ord ${ordinalToArray(block.ordinal)} with ${block.childCount} segs:\\n`;\n if (MergeTree.blockUpdateMarkers) {\n _strbuf += internedSpaces(indentCount);\n _strbuf += (<IHierBlock>block).hierToString(indentCount);\n }\n if (this.collabWindow.collaborating) {\n _strbuf += internedSpaces(indentCount);\n _strbuf += `${block.partialLengths!.toString((id) => glc(this, id), indentCount)}\\n`;\n }\n const children = block.children;\n for (let childIndex = 0; childIndex < block.childCount; childIndex++) {\n const child = children[childIndex];\n if (!child.isLeaf()) {\n _strbuf = this.nodeToString(child, _strbuf, indentCount + 4);\n } else {\n const segment = child;\n _strbuf += internedSpaces(indentCount + 4);\n // eslint-disable-next-line max-len\n _strbuf += `cli: ${glc(this, segment.clientId)} seq: ${segment.seq} ord: ${ordinalToArray(segment.ordinal)}`;\n const removalInfo: IRemovalInfo = segment;\n if (removalInfo.removedSeq !== undefined) {\n _strbuf += ` rcli: ${glc(this, removalInfo.removedClientId!)} rseq: ${removalInfo.removedSeq}`;\n }\n _strbuf += \"\\n\";\n _strbuf += internedSpaces(indentCount + 4);\n _strbuf += segment.toString();\n _strbuf += \"\\n\";\n }\n }\n return _strbuf;\n }\n\n public toString() {\n return this.nodeToString(this.root, \"\", 0);\n }\n\n public incrementalBlockMap<TContext>(stateStack: Stack<IncrementalMapState<TContext>>) {\n while (!stateStack.empty()) {\n // We already check the stack is not empty\n const state = stateStack.top()!;\n if (state.op !== IncrementalExecOp.Go) {\n return;\n }\n if (state.childIndex === 0) {\n if (state.start === undefined) {\n state.start = 0;\n }\n if (state.end === undefined) {\n state.end = this.blockLength(state.block, state.refSeq, state.clientId);\n }\n\n if (state.actions.pre) {\n state.actions.pre(state);\n }\n }\n if ((state.op === IncrementalExecOp.Go) && (state.childIndex < state.block.childCount)) {\n const child = state.block.children[state.childIndex];\n const len = this.nodeLength(child, state.refSeq, state.clientId) ?? 0;\n if (MergeTree.traceIncrTraversal) {\n if (child.isLeaf()) {\n // eslint-disable-next-line @typescript-eslint/dot-notation, max-len\n console.log(`considering (r ${state.refSeq} c ${glc(this, state.clientId)}) seg with text ${child[\"text\"]} len ${len} seq ${child.seq} rseq ${child.removedSeq} cli ${glc(this, child.clientId)}`);\n }\n }\n if ((len > 0) && (state.start < len) && (state.end > 0)) {\n if (!child.isLeaf()) {\n const childState = new IncrementalMapState(child, state.actions, state.pos,\n state.refSeq, state.clientId, state.context, state.start, state.end, 0);\n stateStack.push(childState);\n } else {\n if (MergeTree.traceIncrTraversal) {\n // eslint-disable-next-line @typescript-eslint/dot-notation\n console.log(`action on seg with text ${child[\"text\"]}`);\n }\n state.actions.leaf(child, state);\n }\n }\n state.pos += len;\n state.start -= len;\n state.end -= len;\n state.childIndex++;\n } else {\n if (state.childIndex === state.block.childCount) {\n if ((state.op === IncrementalExecOp.Go) && state.actions.post) {\n state.actions.post(state);\n }\n stateStack.pop();\n }\n }\n }\n }\n\n private nodeMap<TClientData>(\n node: IMergeBlock, actions: SegmentActions<TClientData>, pos: number, refSeq: number,\n clientId: number, accum: TClientData, start?: number, end?: number) {\n let _start = start;\n let _end = end;\n let _pos = pos;\n if (_start === undefined) {\n _start = 0;\n }\n if (_end === undefined) {\n _end = this.blockLength(node, refSeq, clientId);\n }\n let go = true;\n if (actions.pre) {\n go = actions.pre(node, _pos, refSeq, clientId, _start, _end, accum);\n if (!go) {\n // Cancel this node but not entire traversal\n return true;\n }\n }\n const children = node.children;\n for (let childIndex = 0; childIndex < node.childCount; childIndex++) {\n const child = children[childIndex];\n const len = this.nodeLength(child, refSeq, clientId) ?? 0;\n if (MergeTree.traceTraversal) {\n let segInfo: string;\n if ((!child.isLeaf()) && this.collabWindow.collaborating) {\n segInfo = `minLength: ${child.partialLengths!.minLength}`;\n } else {\n const segment = <ISegment>child;\n segInfo = `cli: ${glc(this, segment.clientId)} seq: ${segment.seq} text: '${segment.toString()}'`;\n if (segment.removedSeq !== undefined) {\n segInfo += ` rcli: ${glc(this, segment.removedClientId!)} rseq: ${segment.removedSeq}`;\n }\n }\n // eslint-disable-next-line max-len\n console.log(`@tcli ${glc(this, this.collabWindow.clientId)}: map len: ${len} start: ${_start} end: ${_end} ${segInfo}`);\n }\n if (go && (_end > 0) && (len > 0) && (_start < len)) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n if (go) {\n go = this.nodeMap(child, actions, _pos, refSeq, clientId, accum, _start, _end);\n }\n } else {\n if (MergeTree.traceTraversal) {\n console.log(`@tcli ${glc(this, this.collabWindow.clientId)}: map leaf action`);\n }\n if (actions.leaf) {\n go = actions.leaf(child, _pos, refSeq, clientId, _start, _end, accum);\n }\n }\n }\n if (!go) {\n break;\n }\n if (actions.shift) {\n actions.shift(child, _pos, refSeq, clientId, _start, _end, accum);\n }\n _pos += len;\n _start -= len;\n _end -= len;\n }\n if (go && actions.post) {\n go = actions.post(node, _pos, refSeq, clientId, _start, _end, accum);\n }\n\n return go;\n }\n\n // Invokes the leaf action for all segments. Note that *all* segments are visited\n // regardless of if they would be visible to the current `clientId` and `refSeq`.\n public walkAllSegments<TClientData>(\n block: IMergeBlock,\n action: (segment: ISegment, accum?: TClientData) => boolean,\n accum?: TClientData,\n ): boolean {\n let go = true;\n const children = block.children;\n for (let childIndex = 0; go && childIndex < block.childCount; childIndex++) {\n const child = children[childIndex];\n go = child.isLeaf()\n ? action(child, accum)\n : this.walkAllSegments(child, action, accum);\n }\n return go;\n }\n\n // Straight call every segment; goes until leaf action returns false\n private nodeMapReverse(\n block: IMergeBlock, leafAction: ISegmentAction<undefined>, pos: number, refSeq: number,\n clientId: number) {\n let go = true;\n const children = block.children;\n for (let childIndex = block.childCount - 1; childIndex >= 0; childIndex--) {\n const child = children[childIndex];\n if (go) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n if (go) {\n go = this.nodeMapReverse(child, leafAction, pos, refSeq, clientId);\n }\n } else {\n go = leafAction(child, pos, refSeq, clientId, 0, 0, undefined);\n }\n }\n if (!go) {\n break;\n }\n }\n return go;\n }\n}\n"]}