@fluidframework/merge-tree 2.71.0 → 2.73.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -26
- package/dist/client.js +3 -3
- package/dist/client.js.map +1 -1
- package/dist/mergeTreeDeltaCallback.js.map +1 -1
- package/dist/opBuilder.js +2 -2
- package/dist/opBuilder.js.map +1 -1
- package/dist/test/client.walkSegments.spec.js +15 -0
- package/dist/test/client.walkSegments.spec.js.map +1 -1
- package/lib/client.js +3 -3
- package/lib/client.js.map +1 -1
- package/lib/mergeTreeDeltaCallback.js.map +1 -1
- package/lib/opBuilder.js +2 -2
- package/lib/opBuilder.js.map +1 -1
- package/lib/test/client.walkSegments.spec.js +15 -0
- package/lib/test/client.walkSegments.spec.js.map +1 -1
- package/package.json +19 -19
- package/src/client.ts +7 -7
- package/src/mergeTreeDeltaCallback.ts +2 -2
- package/src/opBuilder.ts +4 -4
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport type { IEventThisPlaceHolder, IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport {\n\tassert,\n\tunreachableCase,\n\tisObject,\n\ttype DoublyLinkedList,\n} from \"@fluidframework/core-utils/internal\";\nimport type {\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tMessageType,\n\ttype ISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport type { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions/internal\";\nimport { toDeltaManagerInternal } from \"@fluidframework/runtime-utils/internal\";\nimport type { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport {\n\ttype ITelemetryLoggerExt,\n\tLoggingError,\n\tUsageError,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport { MergeTreeTextHelper, type IMergeTreeTextHelper } from \"./MergeTreeTextHelper.js\";\nimport { RedBlackTree } from \"./collections/index.js\";\nimport { NonCollabClient, SquashClient, UniversalSequenceNumber } from \"./constants.js\";\nimport { type LocalReferencePosition, SlidingPreference } from \"./localReference.js\";\nimport {\n\tMergeTree,\n\terrorIfOptionNotTrue,\n\tgetSlideToSegoff,\n\tisRemovedAndAcked,\n\ttype IMergeTreeOptionsInternal,\n} from \"./mergeTree.js\";\nimport type {\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeDeltaOpArgs,\n\tIMergeTreeMaintenanceCallbackArgs,\n} from \"./mergeTreeDeltaCallback.js\";\nimport { walkAllChildSegments } from \"./mergeTreeNodeWalk.js\";\nimport {\n\ttype CollaborationWindow,\n\ttype ISegment,\n\ttype ISegmentAction,\n\ttype ISegmentPrivate,\n\ttype Marker,\n\ttype SegmentGroup,\n\tcompareStrings,\n\tisSegmentLeaf,\n\ttype ISegmentInternal,\n\ttype ISegmentLeaf,\n\ttype ObliterateInfo,\n} from \"./mergeTreeNodes.js\";\nimport {\n\tcreateAdjustRangeOp,\n\tcreateAnnotateMarkerOp,\n\tcreateAnnotateRangeOp,\n\tcreateGroupOp,\n\tcreateInsertSegmentOp,\n\tcreateObliterateRangeOp,\n\tcreateObliterateRangeOpSided,\n\tcreateRemoveRangeOp,\n} from \"./opBuilder.js\";\nimport {\n\ttype IJSONSegment,\n\ttype IMergeTreeAnnotateMsg,\n\ttype IMergeTreeDeltaOp,\n\t// eslint-disable-next-line import/no-deprecated\n\ttype IMergeTreeGroupMsg,\n\ttype IMergeTreeInsertMsg,\n\t// eslint-disable-next-line import/no-deprecated\n\ttype IMergeTreeObliterateMsg,\n\ttype IMergeTreeOp,\n\ttype IMergeTreeRemoveMsg,\n\ttype IRelativePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\ttype AdjustParams,\n\ttype IMergeTreeAnnotateAdjustMsg,\n\ttype IMergeTreeObliterateSidedMsg,\n} from \"./ops.js\";\nimport {\n\tcreateLocalReconnectingPerspective,\n\tLocalReconnectingPerspective,\n\tPriorPerspective,\n\ttype Perspective,\n} from \"./perspective.js\";\nimport type { PropertySet, MapLike } from \"./properties.js\";\nimport { DetachedReferencePosition, type ReferencePosition } from \"./referencePositions.js\";\nimport {\n\tisInserted,\n\tisRemoved,\n\toverwriteInfo,\n\ttoRemovalInfo,\n\ttype IHasInsertionInfo,\n\ttype IHasRemovalInfo,\n} from \"./segmentInfos.js\";\nimport { Side, type InteriorSequencePlace } from \"./sequencePlace.js\";\nimport { SnapshotLoader } from \"./snapshotLoader.js\";\nimport { SnapshotV1 } from \"./snapshotV1.js\";\nimport { SnapshotLegacy } from \"./snapshotlegacy.js\";\nimport type { OperationStamp } from \"./stamps.js\";\nimport * as opstampUtils from \"./stamps.js\";\n\ntype IMergeTreeDeltaRemoteOpArgs = Omit<IMergeTreeDeltaOpArgs, \"sequencedMessage\"> &\n\tRequired<Pick<IMergeTreeDeltaOpArgs, \"sequencedMessage\">>;\n\ninterface RebasedObliterateEndpoint {\n\tsegment: ISegmentLeaf;\n\toffset: number;\n\tside: Side;\n}\n\n/**\n * A range [start, end)\n * @internal\n */\nexport interface IIntegerRange {\n\tstart: number;\n\tend: number;\n}\n\n/**\n * Emitted before this client's merge-tree normalizes its segments on reconnect, potentially\n * ordering them. Useful for DDS-like consumers built atop the merge-tree to compute any information\n * they need for rebasing their ops on reconnection.\n * @internal\n */\nexport interface IClientEvents {\n\t(\n\t\tevent: \"normalize\",\n\t\tlistener: (squash: boolean, target: IEventThisPlaceHolder) => void,\n\t): void;\n\t(\n\t\tevent: \"delta\",\n\t\tlistener: (\n\t\t\topArgs: IMergeTreeDeltaOpArgs,\n\t\t\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n\t(\n\t\tevent: \"maintenance\",\n\t\tlistener: (\n\t\t\targs: IMergeTreeMaintenanceCallbackArgs,\n\t\t\tdeltaArgs: IMergeTreeDeltaOpArgs | undefined,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n}\n\nconst UNBOUND_SEGMENT_ERROR = \"The provided segment is not bound to this DDS.\";\n\n/**\n * This class encapsulates a merge-tree, and provides a local client specific view over it and\n * the capability to modify it as the local client. Additionally it provides\n * binding for processing remote ops on the encapsulated merge tree, and projects local and remote events\n * caused by all modification to the underlying merge-tree.\n *\n * @internal\n */\nexport class Client extends TypedEventEmitter<IClientEvents> {\n\tpublic longClientId: string | undefined;\n\n\tprivate readonly _mergeTree: MergeTree;\n\n\tprivate readonly clientNameToIds = new RedBlackTree<string, number>(compareStrings);\n\tprivate readonly shortClientIdMap: string[] = [];\n\n\t/**\n\t * @param specToSegment - Rehydrates a segment from its JSON representation\n\t * @param logger - Telemetry logger for diagnostics\n\t * @param options - Options for this client. See {@link IMergeTreeOptions} for details.\n\t * @param getMinInFlightRefSeq - Upon applying a message (see {@link Client.applyMsg}), client purges collab-window information which\n\t * is no longer necessary based on that message's minimum sequence number.\n\t * However, if the user of this client has in-flight messages which refer to positions in this Client,\n\t * they may wish to preserve additional merge information.\n\t * The effective minimum sequence number will be the minimum of the message's minimumSequenceNumber and the result of this function.\n\t * If this function returns undefined, the message's minimumSequenceNumber will be used.\n\t *\n\t * @privateRemarks\n\t * - Passing specToSegment would be unnecessary if Client were merged with SharedSegmentSequence\n\t * - AB#6866 tracks a more unified approach to collab window min seq handling.\n\t */\n\tconstructor(\n\t\tpublic readonly specToSegment: (spec: IJSONSegment) => ISegment,\n\t\tpublic readonly logger: ITelemetryLoggerExt,\n\t\toptions?: IMergeTreeOptionsInternal & PropertySet,\n\t\tprivate readonly getMinInFlightRefSeq: () => number | undefined = (): undefined =>\n\t\t\tundefined,\n\t) {\n\t\tsuper();\n\t\tthis._mergeTree = new MergeTree(options);\n\t\tthis._mergeTree.mergeTreeDeltaCallback = (opArgs, deltaArgs): void => {\n\t\t\tthis.emit(\"delta\", opArgs, deltaArgs, this);\n\t\t};\n\t\tthis._mergeTree.mergeTreeMaintenanceCallback = (args, opArgs): void => {\n\t\t\tthis.emit(\"maintenance\", args, opArgs, this);\n\t\t};\n\n\t\tif (options?.attribution?.track) {\n\t\t\tconst policy = this._mergeTree?.attributionPolicy;\n\t\t\tif (policy === undefined) {\n\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\"Attribution policy must be provided when attribution tracking is requested.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tpolicy.attach(this);\n\t\t}\n\t}\n\n\tpublic get endOfTree(): ISegmentInternal {\n\t\treturn this._mergeTree.endOfTree;\n\t}\n\tpublic get startOfTree(): ISegmentInternal {\n\t\treturn this._mergeTree.startOfTree;\n\t}\n\n\t/**\n\t * The merge tree maintains a queue of segment groups for each local operation.\n\t * These segment groups track segments modified by an operation.\n\t * This method peeks the tail of that queue, and returns the segments groups there.\n\t * It is used to get the segment group(s) for the previous operations.\n\t * @param count - The number segment groups to get peek from the tail of the queue. Default 1.\n\t */\n\n\tpublic peekPendingSegmentGroups(count: number = 1): unknown {\n\t\tconst pending = this._mergeTree.pendingSegments;\n\t\tlet node = pending?.last;\n\t\tif (count === 1 || pending === undefined) {\n\t\t\treturn node?.data;\n\t\t}\n\n\t\tconst taken: SegmentGroup[] = Array.from({ length: Math.min(count, pending.length) });\n\t\tfor (let i = taken.length - 1; i >= 0; i--) {\n\t\t\ttaken[i] = node!.data;\n\t\t\tnode = node!.prev;\n\t\t}\n\t\treturn taken;\n\t}\n\n\t/**\n\t * Annotates the markers with the provided properties\n\t * @param marker - The marker to annotate\n\t * @param props - The properties to annotate the marker with\n\t * @returns The annotate op if valid, otherwise undefined\n\t */\n\tpublic annotateMarker(\n\t\tmarker: Marker,\n\t\tprops: PropertySet,\n\t): IMergeTreeAnnotateMsg | undefined {\n\t\tconst annotateOp = createAnnotateMarkerOp(marker, props)!;\n\t\tthis.applyAnnotateRangeOp({ op: annotateOp });\n\t\treturn annotateOp;\n\t}\n\n\t/**\n\t * Annotates the range with the provided properties\n\t * @param start - The inclusive start position of the range to annotate\n\t * @param end - The exclusive end position of the range to annotate\n\t * @param props - The properties to annotate the range with\n\t * @returns The annotate op if valid, otherwise undefined\n\t */\n\tpublic annotateRangeLocal(\n\t\tstart: number,\n\t\tend: number,\n\t\tprops: PropertySet,\n\t): IMergeTreeAnnotateMsg | undefined {\n\t\tconst annotateOp = createAnnotateRangeOp(start, end, props);\n\t\tthis.applyAnnotateRangeOp({ op: annotateOp });\n\t\treturn annotateOp;\n\t}\n\n\t/**\n\t * adjusts a value\n\t */\n\tpublic annotateAdjustRangeLocal(\n\t\tstart: number,\n\t\tend: number,\n\t\tadjust: MapLike<AdjustParams>,\n\t): IMergeTreeAnnotateAdjustMsg {\n\t\tconst annotateOp = createAdjustRangeOp(start, end, adjust);\n\n\t\tfor (const [key, value] of Object.entries(adjust)) {\n\t\t\tif (value.min !== undefined && value.max !== undefined && value.min > value.max) {\n\t\t\t\tthrow new UsageError(`min is greater than max for ${key}`);\n\t\t\t}\n\t\t}\n\n\t\tthis.applyAnnotateRangeOp({ op: annotateOp });\n\t\treturn annotateOp;\n\t}\n\n\t/**\n\t * Removes the range\n\t *\n\t * @param start - The inclusive start of the range to remove\n\t * @param end - The exclusive end of the range to remove\n\t */\n\tpublic removeRangeLocal(start: number, end: number): IMergeTreeRemoveMsg {\n\t\tconst removeOp = createRemoveRangeOp(start, end);\n\t\tthis.applyRemoveRangeOp({ op: removeOp });\n\t\treturn removeOp;\n\t}\n\n\t/**\n\t * Obliterates the range. This is similar to removing the range, but also\n\t * includes any concurrently inserted content.\n\t *\n\t * @param start - The start of the range to obliterate. Inclusive is side is Before (default).\n\t * @param end - The end of the range to obliterate. Exclusive is side is After\n\t * (default is to be after the last included character, but number index is exclusive).\n\t */\n\tpublic obliterateRangeLocal(\n\t\tstart: number | InteriorSequencePlace,\n\t\tend: number | InteriorSequencePlace,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t): IMergeTreeObliterateMsg | IMergeTreeObliterateSidedMsg {\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tlet obliterateOp: IMergeTreeObliterateMsg | IMergeTreeObliterateSidedMsg;\n\t\tif (this._mergeTree.options?.mergeTreeEnableSidedObliterate) {\n\t\t\tobliterateOp = createObliterateRangeOpSided(start, end);\n\t\t} else {\n\t\t\tassert(\n\t\t\t\ttypeof start === \"number\" && typeof end === \"number\",\n\t\t\t\t0xa42 /* Start and end must be numbers if mergeTreeEnableSidedObliterate is not enabled. */,\n\t\t\t);\n\t\t\tobliterateOp = createObliterateRangeOp(start, end);\n\t\t}\n\t\tthis.applyObliterateRangeOp({ op: obliterateOp });\n\t\treturn obliterateOp;\n\t}\n\n\t/**\n\t * Create and insert a segment at the specified position.\n\t * @param pos - The position to insert the segment at\n\t * @param segment - The segment to insert\n\t */\n\tpublic insertSegmentLocal(pos: number, segment: ISegment): IMergeTreeInsertMsg | undefined {\n\t\tif (segment.cachedLength <= 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst insertOp = createInsertSegmentOp(pos, segment);\n\t\tthis.applyInsertOp({ op: insertOp });\n\t\treturn insertOp;\n\t}\n\n\t/**\n\t * Create and insert a segment at the specified reference position.\n\t * @param refPos - The reference position to insert the segment at\n\t * @param segment - The segment to insert\n\t */\n\tpublic insertAtReferencePositionLocal(\n\t\trefPos: ReferencePosition,\n\t\tsegment: ISegment,\n\t): IMergeTreeInsertMsg | undefined {\n\t\tconst pos = this._mergeTree.referencePositionToLocalPosition(\n\t\t\trefPos,\n\t\t\tthis.getCurrentSeq(),\n\t\t\tthis.getClientId(),\n\t\t);\n\n\t\tif (pos === DetachedReferencePosition) {\n\t\t\tthrow new UsageError(\"Cannot insert at detached local reference.\");\n\t\t}\n\t\treturn this.insertSegmentLocal(pos, segment);\n\t}\n\n\tpublic walkSegments<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\tstart: number | undefined,\n\t\tend: number | undefined,\n\t\taccum: TClientData,\n\t\tsplitRange?: boolean,\n\t\tperspective?: Pick<ISequencedDocumentMessage, \"clientId\" | \"referenceSequenceNumber\">,\n\t): void;\n\tpublic walkSegments(\n\t\thandler: ISegmentAction<undefined>,\n\t\tstart?: number,\n\t\tend?: number,\n\t\taccum?: undefined,\n\t\tsplitRange?: boolean,\n\t\tperspective?: Pick<ISequencedDocumentMessage, \"clientId\" | \"referenceSequenceNumber\">,\n\t): void;\n\tpublic walkSegments<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\tstart: number | undefined,\n\t\tend: number | undefined,\n\t\taccum: TClientData,\n\t\tsplitRange: boolean = false,\n\t\tperspective?: Pick<ISequencedDocumentMessage, \"clientId\" | \"referenceSequenceNumber\">,\n\t): void {\n\t\tthis._mergeTree.mapRange(\n\t\t\thandler,\n\t\t\tperspective === undefined\n\t\t\t\t? this.getCollabWindow().localPerspective\n\t\t\t\t: this.getOperationPerspective(perspective),\n\t\t\taccum,\n\t\t\tstart,\n\t\t\tend,\n\t\t\tsplitRange,\n\t\t);\n\t}\n\n\tprotected walkAllSegments<TClientData>(\n\t\taction: (segment: ISegment, accum?: TClientData) => boolean,\n\t\taccum?: TClientData,\n\t): boolean {\n\t\treturn walkAllChildSegments(\n\t\t\tthis._mergeTree.root,\n\t\t\taccum === undefined ? action : (seg): boolean => action(seg, accum),\n\t\t);\n\t}\n\n\t/**\n\t * Serializes the data required for garbage collection. The IFluidHandles stored in all segments that haven't\n\t * been removed represent routes to other objects. We serialize the data in these segments using the passed in\n\t * serializer which keeps track of all serialized handles.\n\t */\n\tpublic serializeGCData(\n\t\thandle: IFluidHandle,\n\t\thandleCollectingSerializer: IFluidSerializer,\n\t): void {\n\t\tlet localInserts = 0;\n\t\tlet localRemoves = 0;\n\t\tlet localObliterates = 0;\n\t\twalkAllChildSegments(this._mergeTree.root, (seg: ISegmentPrivate) => {\n\t\t\tif (isInserted(seg) && opstampUtils.isLocal(seg.insert)) {\n\t\t\t\tlocalInserts++;\n\t\t\t}\n\t\t\tif (isRemoved(seg) && opstampUtils.isLocal(seg.removes[seg.removes.length - 1])) {\n\t\t\t\tif (seg.removes[seg.removes.length - 1].type === \"setRemove\") {\n\t\t\t\t\tlocalRemoves++;\n\t\t\t\t} else {\n\t\t\t\t\tlocalObliterates++;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Only serialize segments that have not been removed.\n\t\t\tif (!isRemoved(seg)) {\n\t\t\t\thandleCollectingSerializer.stringify(seg.clone().toJSONObject(), handle);\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t\tif (localInserts > 0 || localRemoves > 0) {\n\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\teventName: \"LocalEditsInProcessGCData\",\n\t\t\t\tlocalInserts,\n\t\t\t\tlocalRemoves,\n\t\t\t\tlocalObliterates,\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic getCollabWindow(): CollaborationWindow {\n\t\treturn this._mergeTree.collabWindow;\n\t}\n\n\t/**\n\t * Returns the current position of a segment, and -1 if the segment\n\t * does not exist in this merge tree\n\t * @param segment - The segment to get the position of\n\t */\n\tpublic getPosition(segment: ISegment | undefined, localSeq?: number): number {\n\t\tif (!isSegmentLeaf(segment)) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tconst perspective =\n\t\t\tlocalSeq === undefined\n\t\t\t\t? this._mergeTree.localPerspective\n\t\t\t\t: new LocalReconnectingPerspective(this.getCurrentSeq(), this.getClientId(), localSeq);\n\t\treturn this._mergeTree.getPosition(segment, perspective);\n\t}\n\n\t/**\n\t * Creates a `LocalReferencePosition` on this client. If the refType does not include ReferenceType.Transient,\n\t * the returned reference will be added to the localRefs on the provided segment.\n\t * @param segment - Segment to add the local reference on\n\t * @param offset - Offset on the segment at which to place the local reference\n\t * @param refType - ReferenceType for the created local reference\n\t * @param properties - PropertySet to place on the created local reference\n\t * @param canSlideToEndpoint - Whether or not the created local reference can\n\t * slide onto one of the special endpoint segments denoting the position\n\t * before the start of or after the end of the tree\n\t */\n\tpublic createLocalReferencePosition(\n\t\tsegment: ISegment | \"start\" | \"end\",\n\t\toffset: number | undefined,\n\t\trefType: ReferenceType,\n\t\tproperties: PropertySet | undefined,\n\t\tslidingPreference?: SlidingPreference,\n\t\tcanSlideToEndpoint?: boolean,\n\t): LocalReferencePosition {\n\t\tif (!isSegmentLeaf(segment) && typeof segment !== \"string\") {\n\t\t\tthrow new UsageError(UNBOUND_SEGMENT_ERROR);\n\t\t}\n\t\treturn this._mergeTree.createLocalReferencePosition(\n\t\t\tsegment,\n\t\t\toffset ?? 0,\n\t\t\trefType,\n\t\t\tproperties,\n\t\t\tslidingPreference,\n\t\t\tcanSlideToEndpoint,\n\t\t);\n\t}\n\n\t/**\n\t * Removes a `LocalReferencePosition` from this client.\n\t */\n\tpublic removeLocalReferencePosition(\n\t\tlref: LocalReferencePosition,\n\t): LocalReferencePosition | undefined {\n\t\treturn this._mergeTree.removeLocalReferencePosition(lref);\n\t}\n\n\t/**\n\t * Resolves a `ReferencePosition` into a character position using this client's perspective.\n\t *\n\t * Reference positions that point to a character that has been removed will\n\t * always return the position of the nearest non-removed character, regardless\n\t * of {@link ReferenceType}. To handle this case specifically, one may wish\n\t * to look at the segment returned by {@link ReferencePosition.getSegment}.\n\t */\n\tpublic localReferencePositionToPosition(lref: ReferencePosition): number {\n\t\treturn this._mergeTree.referencePositionToLocalPosition(lref);\n\t}\n\n\t/**\n\t * Given a position specified relative to a marker id, lookup the marker\n\t * and convert the position to a character position.\n\t * @param relativePos - Id of marker (may be indirect) and whether position is before or after marker.\n\t */\n\tpublic posFromRelativePos(relativePos: IRelativePosition): number {\n\t\treturn this._mergeTree.posFromRelativePos(relativePos, this._mergeTree.localPerspective);\n\t}\n\n\tpublic getMarkerFromId(id: string): ISegment | undefined {\n\t\treturn this._mergeTree.getMarkerFromId(id);\n\t}\n\n\t/**\n\t * Revert an op\n\t */\n\tpublic rollback(op: unknown, localOpMetadata: unknown): void {\n\t\tthis._mergeTree.rollback(op as IMergeTreeDeltaOp, localOpMetadata as SegmentGroup);\n\t}\n\n\tprivate applyObliterateRangeOp(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tconst { op, sequencedMessage } = opArgs;\n\t\tassert(\n\t\t\top.type === MergeTreeDeltaType.OBLITERATE ||\n\t\t\t\top.type === MergeTreeDeltaType.OBLITERATE_SIDED,\n\t\t\t0x866 /* Unexpected op type on range obliterate! */,\n\t\t);\n\t\tconst perspective = this.getOperationPerspective(sequencedMessage);\n\t\tconst stamp = this.getOperationStamp(sequencedMessage);\n\n\t\tif (this._mergeTree.options?.mergeTreeEnableSidedObliterate) {\n\t\t\tconst { start, end } = this.getValidSidedRange(op, perspective);\n\t\t\tthis._mergeTree.obliterateRange(start, end, perspective, stamp, opArgs);\n\t\t} else {\n\t\t\tassert(\n\t\t\t\top.type === MergeTreeDeltaType.OBLITERATE,\n\t\t\t\t0xa43 /* Unexpected sided obliterate while mergeTreeEnableSidedObliterate is disabled */,\n\t\t\t);\n\t\t\tconst { start, end } = this.getValidOpRange(op, perspective);\n\t\t\tthis._mergeTree.obliterateRange(start, end, perspective, stamp, opArgs);\n\t\t}\n\t}\n\n\tprivate getOperationPerspective(\n\t\tsequencedMessage:\n\t\t\t| Pick<ISequencedDocumentMessage, \"clientId\" | \"referenceSequenceNumber\">\n\t\t\t| undefined,\n\t): Perspective {\n\t\tif (!sequencedMessage) {\n\t\t\treturn this._mergeTree.localPerspective;\n\t\t}\n\n\t\tconst clientId = this.getOrAddShortClientIdFromMessage(sequencedMessage);\n\t\tconst { referenceSequenceNumber: refSeq } = sequencedMessage;\n\t\treturn new PriorPerspective(refSeq, clientId);\n\t}\n\n\t/**\n\t * Returns the operation stamp to apply for a change, minting a new one local one if necessary.\n\t */\n\tprivate getOperationStamp(\n\t\tsequencedMessage: ISequencedDocumentMessage | undefined,\n\t): OperationStamp {\n\t\tif (!sequencedMessage) {\n\t\t\treturn this.getCollabWindow().mintNextLocalOperationStamp();\n\t\t}\n\n\t\tconst { sequenceNumber: seq } = sequencedMessage;\n\t\tconst clientId = this.getOrAddShortClientIdFromMessage(sequencedMessage);\n\t\treturn {\n\t\t\tseq,\n\t\t\tclientId,\n\t\t};\n\t}\n\n\t/**\n\t * Performs the remove based on the provided op\n\t * @param opArgs - The ops args for the op\n\t */\n\tprivate applyRemoveRangeOp(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tconst { op, sequencedMessage } = opArgs;\n\t\tassert(\n\t\t\top.type === MergeTreeDeltaType.REMOVE,\n\t\t\t0x02d /* \"Unexpected op type on range remove!\" */,\n\t\t);\n\t\tconst perspective = this.getOperationPerspective(sequencedMessage);\n\t\tconst stamp = this.getOperationStamp(sequencedMessage);\n\t\tconst range = this.getValidOpRange(op, perspective);\n\n\t\tthis._mergeTree.markRangeRemoved(range.start, range.end, perspective, stamp, opArgs);\n\t}\n\n\t/**\n\t * Performs the annotate based on the provided op\n\t * @param opArgs - The ops args for the op\n\t */\n\tprivate applyAnnotateRangeOp(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tconst { op, sequencedMessage } = opArgs;\n\t\tassert(\n\t\t\top.type === MergeTreeDeltaType.ANNOTATE,\n\t\t\t0x02e /* \"Unexpected op type on range annotate!\" */,\n\t\t);\n\t\tconst perspective = this.getOperationPerspective(sequencedMessage);\n\t\tconst stamp = this.getOperationStamp(sequencedMessage);\n\t\tconst range = this.getValidOpRange(op, perspective);\n\n\t\tthis._mergeTree.annotateRange(range.start, range.end, op, perspective, stamp, opArgs);\n\t}\n\n\t/**\n\t * Performs the insert based on the provided op\n\t * @param opArgs - The ops args for the op\n\t * @returns True if the insert was applied. False if it could not be.\n\t */\n\tprivate applyInsertOp(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tconst { op, sequencedMessage } = opArgs;\n\t\tassert(\n\t\t\top.type === MergeTreeDeltaType.INSERT,\n\t\t\t0x02f /* \"Unexpected op type on range insert!\" */,\n\t\t);\n\t\tconst perspective = this.getOperationPerspective(sequencedMessage);\n\t\tconst stamp = this.getOperationStamp(sequencedMessage);\n\t\tconst range = this.getValidOpRange(op, perspective);\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\tconst segments = [this.specToSegment(op.seg)];\n\n\t\tthis._mergeTree.insertSegments(range.start, segments, perspective, stamp, opArgs);\n\t}\n\n\t/**\n\t * Returns a valid range for the op, or throws if the range is invalid\n\t * @param op - The op to generate the range for\n\t * @param clientArgs - The client args for the op\n\t * @throws LoggingError if the range is invalid\n\t */\n\tprivate getValidSidedRange(\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\top: IMergeTreeObliterateSidedMsg | IMergeTreeObliterateMsg,\n\t\tperspective: Perspective,\n\t): {\n\t\tstart: InteriorSequencePlace;\n\t\tend: InteriorSequencePlace;\n\t} {\n\t\tconst invalidPositions: string[] = [];\n\t\tlet start: InteriorSequencePlace | undefined;\n\t\tlet end: InteriorSequencePlace | undefined;\n\t\tif (op.pos1 === undefined) {\n\t\t\tinvalidPositions.push(\"start\");\n\t\t} else {\n\t\t\tstart =\n\t\t\t\ttypeof op.pos1 === \"object\"\n\t\t\t\t\t? { pos: op.pos1.pos, side: op.pos1.before ? Side.Before : Side.After }\n\t\t\t\t\t: { pos: op.pos1, side: Side.Before };\n\t\t}\n\t\tif (op.pos2 === undefined) {\n\t\t\tinvalidPositions.push(\"end\");\n\t\t} else {\n\t\t\tend =\n\t\t\t\ttypeof op.pos2 === \"object\"\n\t\t\t\t\t? { pos: op.pos2.pos, side: op.pos2.before ? Side.Before : Side.After }\n\t\t\t\t\t: { pos: op.pos2 - 1, side: Side.After };\n\t\t}\n\n\t\t// Validate if local op\n\t\tif (perspective.clientId === this.getClientId()) {\n\t\t\tconst length = this._mergeTree.getLength(this._mergeTree.localPerspective);\n\t\t\tif (start !== undefined && (start.pos >= length || start.pos < 0)) {\n\t\t\t\t// start out of bounds\n\t\t\t\tinvalidPositions.push(\"start\");\n\t\t\t}\n\t\t\tif (end !== undefined && (end.pos >= length || end.pos < 0)) {\n\t\t\t\tinvalidPositions.push(\"end\");\n\t\t\t}\n\t\t\tif (\n\t\t\t\tstart !== undefined &&\n\t\t\t\tend !== undefined &&\n\t\t\t\t(start.pos > end.pos ||\n\t\t\t\t\t(start.pos === end.pos && start.side !== end.side && start.side === Side.After))\n\t\t\t) {\n\t\t\t\t// end is before start\n\t\t\t\tinvalidPositions.push(\"inverted\");\n\t\t\t}\n\t\t\tif (invalidPositions.length > 0) {\n\t\t\t\tthrow new LoggingError(\"InvalidRange\", {\n\t\t\t\t\tusageError: true,\n\t\t\t\t\tinvalidPositions: invalidPositions.toString(),\n\t\t\t\t\tlength,\n\t\t\t\t\topType: op.type,\n\t\t\t\t\topPos1Relative: op.relativePos1 !== undefined,\n\t\t\t\t\topPos2Relative: op.relativePos2 !== undefined,\n\t\t\t\t\topPos1: JSON.stringify(op.pos1),\n\t\t\t\t\topPos2: JSON.stringify(op.pos2),\n\t\t\t\t\tstart: JSON.stringify(start),\n\t\t\t\t\tend: JSON.stringify(end),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tassert(\n\t\t\tstart !== undefined && end !== undefined,\n\t\t\t0xa44 /* Missing start or end of range */,\n\t\t);\n\t\treturn { start, end };\n\t}\n\n\t/**\n\t * Returns a valid range for the op, or undefined\n\t * @param op - The op to generate the range for\n\t * @param clientArgs - The client args for the op\n\t */\n\tprivate getValidOpRange(\n\t\top:\n\t\t\t| IMergeTreeAnnotateMsg\n\t\t\t| IMergeTreeAnnotateAdjustMsg\n\t\t\t| IMergeTreeInsertMsg\n\t\t\t| IMergeTreeRemoveMsg\n\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t| IMergeTreeObliterateMsg,\n\t\tperspective: Perspective,\n\t): IIntegerRange {\n\t\tlet start: number | undefined = op.pos1;\n\t\tif (start === undefined && op.relativePos1) {\n\t\t\tstart = this._mergeTree.posFromRelativePos(op.relativePos1, perspective);\n\t\t}\n\n\t\tlet end: number | undefined = op.pos2;\n\t\tif (end === undefined && op.relativePos2) {\n\t\t\tend = this._mergeTree.posFromRelativePos(op.relativePos2, perspective);\n\t\t}\n\n\t\t// Validate if local op\n\t\tif (perspective.clientId === this.getClientId()) {\n\t\t\tconst length = this.getLength();\n\n\t\t\tconst invalidPositions: string[] = [];\n\n\t\t\t// Validate start position\n\t\t\t//\n\t\t\tif (\n\t\t\t\tstart === undefined ||\n\t\t\t\tstart < 0 ||\n\t\t\t\tstart > length ||\n\t\t\t\t(start === length && op.type !== MergeTreeDeltaType.INSERT)\n\t\t\t) {\n\t\t\t\tinvalidPositions.push(\"start\");\n\t\t\t}\n\t\t\t// Validate end if not insert, or insert has end\n\t\t\tif (\n\t\t\t\t(op.type !== MergeTreeDeltaType.INSERT || end !== undefined) &&\n\t\t\t\t(end === undefined || end <= start!)\n\t\t\t) {\n\t\t\t\tinvalidPositions.push(\"end\");\n\t\t\t}\n\n\t\t\tif (op.type === MergeTreeDeltaType.OBLITERATE && end !== undefined && end > length) {\n\t\t\t\tinvalidPositions.push(\"end\");\n\t\t\t}\n\n\t\t\tif (invalidPositions.length > 0) {\n\t\t\t\tthrow new LoggingError(\"RangeOutOfBounds\", {\n\t\t\t\t\tusageError: true,\n\t\t\t\t\tend,\n\t\t\t\t\tinvalidPositions: invalidPositions.toString(),\n\t\t\t\t\tlength,\n\t\t\t\t\topPos1: op.pos1,\n\t\t\t\t\topPos1Relative: op.relativePos1 !== undefined,\n\t\t\t\t\topPos2: op.pos2,\n\t\t\t\t\topPos2Relative: op.relativePos2 !== undefined,\n\t\t\t\t\topType: op.type,\n\t\t\t\t\tstart,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// start and end are guaranteed to be non-null here, otherwise we throw above.\n\t\treturn { start: start!, end: end! };\n\t}\n\n\tprivate ackPendingSegment(opArgs: IMergeTreeDeltaRemoteOpArgs): void {\n\t\tif (opArgs.op.type === MergeTreeDeltaType.GROUP) {\n\t\t\tfor (const memberOp of opArgs.op.ops) {\n\t\t\t\tthis._mergeTree.ackOp({\n\t\t\t\t\tgroupOp: opArgs.op,\n\t\t\t\t\top: memberOp,\n\t\t\t\t\tsequencedMessage: opArgs.sequencedMessage,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tthis._mergeTree.ackOp(opArgs);\n\t\t}\n\t}\n\n\tgetOrAddShortClientId(longClientId: string): number {\n\t\tif (!this.clientNameToIds.get(longClientId)) {\n\t\t\tthis.addLongClientId(longClientId);\n\t\t}\n\t\treturn this.getShortClientId(longClientId);\n\t}\n\n\tprotected getShortClientId(longClientId: string): number {\n\t\treturn this.clientNameToIds.get(longClientId)!.data;\n\t}\n\n\tgetLongClientId(shortClientId: number): string {\n\t\treturn shortClientId >= 0 ? this.shortClientIdMap[shortClientId] : \"original\";\n\t}\n\n\taddLongClientId(longClientId: string): void {\n\t\tthis.clientNameToIds.put(longClientId, this.shortClientIdMap.length);\n\t\tthis.shortClientIdMap.push(longClientId);\n\t}\n\n\tprivate getOrAddShortClientIdFromMessage(\n\t\tmsg: Pick<ISequencedDocumentMessage, \"clientId\">,\n\t): number {\n\t\treturn this.getOrAddShortClientId(msg.clientId ?? \"server\");\n\t}\n\n\t/**\n\t * During reconnect, we must find the positions to pending segments\n\t * relative to other pending segments. This methods computes that\n\t * position relative to a localSeq. Pending segments above the localSeq\n\t * will be ignored.\n\t *\n\t * @param segment - The segment to find the position for\n\t * @param localSeq - The localSeq to find the position of the segment at\n\t */\n\tpublic findReconnectionPosition(segment: ISegment, localSeq: number): number {\n\t\tassert(\n\t\t\tlocalSeq <= this._mergeTree.collabWindow.localSeq,\n\t\t\t0x032 /* \"localSeq greater than collab window\" */,\n\t\t);\n\t\tconst { currentSeq, clientId } = this.getCollabWindow();\n\t\tif (!isSegmentLeaf(segment)) {\n\t\t\tthrow new UsageError(UNBOUND_SEGMENT_ERROR);\n\t\t}\n\t\tconst perspective = new LocalReconnectingPerspective(currentSeq, clientId, localSeq);\n\t\treturn this._mergeTree.getPosition(segment, perspective);\n\t}\n\n\t/**\n\t * Rebases a sided local reference to the best fitting position in the current tree.\n\t */\n\tprivate rebaseSidedLocalReference(\n\t\tref: LocalReferencePosition,\n\t\tside: Side,\n\t\treconnectingPerspective: Perspective,\n\t\tslidePreference: SlidingPreference,\n\t): RebasedObliterateEndpoint {\n\t\tconst oldSegment = ref.getSegment();\n\t\tconst oldOffset = ref.getOffset();\n\t\tassert(\n\t\t\toldSegment !== undefined && oldOffset !== undefined,\n\t\t\t0xb61 /* Invalid old reference */,\n\t\t);\n\t\tconst canSlideToEndpoint = true;\n\t\t// Destructuring segment + offset is convenient and segment is reassigned\n\n\t\tconst segOff = getSlideToSegoff(\n\t\t\t{ segment: oldSegment, offset: oldOffset },\n\t\t\tslidePreference,\n\t\t\treconnectingPerspective,\n\t\t\tcanSlideToEndpoint,\n\t\t);\n\n\t\tconst { segment: newSegment, offset: newOffset } = segOff ?? {\n\t\t\tsegment:\n\t\t\t\tslidePreference === SlidingPreference.FORWARD\n\t\t\t\t\t? this._mergeTree.endOfTree\n\t\t\t\t\t: this._mergeTree.startOfTree,\n\t\t\toffset: 0,\n\t\t};\n\n\t\tassert(\n\t\t\tisSegmentLeaf(newSegment) && newOffset !== undefined,\n\t\t\t0xb62 /* Invalid new segment on rebase */,\n\t\t);\n\n\t\tconst newSide: Side =\n\t\t\tnewSegment === oldSegment\n\t\t\t\t? side\n\t\t\t\t: // If the reference slid to a new position, the closest fit to the original position will be independent of\n\t\t\t\t\t// the original side and \"in the direction of where the reference was\".\n\t\t\t\t\tslidePreference === SlidingPreference.FORWARD\n\t\t\t\t\t? Side.Before\n\t\t\t\t\t: Side.After;\n\n\t\treturn { segment: newSegment, offset: newOffset, side: newSide };\n\t}\n\n\tprivate computeNewObliterateEndpoints(\n\t\tobliterateInfo: ObliterateInfo,\n\t\tsquash: boolean,\n\t): {\n\t\tstart: RebasedObliterateEndpoint;\n\t\tend: RebasedObliterateEndpoint;\n\t} {\n\t\tconst { currentSeq, clientId } = this.getCollabWindow();\n\t\tconst reconnectingPerspective = createLocalReconnectingPerspective(\n\t\t\tcurrentSeq,\n\t\t\tclientId,\n\t\t\tobliterateInfo.stamp.localSeq! - 1,\n\t\t\tsquash,\n\t\t);\n\n\t\tconst newStart = this.rebaseSidedLocalReference(\n\t\t\tobliterateInfo.start,\n\t\t\tobliterateInfo.startSide,\n\t\t\treconnectingPerspective,\n\t\t\tSlidingPreference.FORWARD,\n\t\t);\n\t\tconst newEnd = this.rebaseSidedLocalReference(\n\t\t\tobliterateInfo.end,\n\t\t\tobliterateInfo.endSide,\n\t\t\treconnectingPerspective,\n\t\t\tSlidingPreference.BACKWARD,\n\t\t);\n\n\t\treturn {\n\t\t\tstart: newStart,\n\t\t\tend: newEnd,\n\t\t};\n\t}\n\n\tprivate resetPendingDeltaToOps(\n\t\tresetOp: IMergeTreeDeltaOp,\n\n\t\tsegmentGroup: SegmentGroup,\n\t\tsquash: boolean,\n\t): IMergeTreeDeltaOp[] {\n\t\tassert(!!segmentGroup, 0x033 /* \"Segment group undefined\" */);\n\t\tconst NACKedSegmentGroup = this.pendingRebase?.shift()?.data;\n\t\tassert(\n\t\t\tsegmentGroup === NACKedSegmentGroup,\n\t\t\t0x034 /* \"Segment group not at head of pending rebase queue\" */,\n\t\t);\n\t\tassert(\n\t\t\tsegmentGroup.localSeq !== undefined,\n\t\t\t0x867 /* expected segment group localSeq to be defined */,\n\t\t);\n\t\tif (this.pendingRebase?.empty) {\n\t\t\tthis.pendingRebase = undefined;\n\t\t}\n\n\t\tif (\n\t\t\tresetOp.type === MergeTreeDeltaType.OBLITERATE ||\n\t\t\tresetOp.type === MergeTreeDeltaType.OBLITERATE_SIDED\n\t\t) {\n\t\t\terrorIfOptionNotTrue(this._mergeTree.options, \"mergeTreeEnableObliterateReconnect\");\n\n\t\t\t// sliceRemove reconnect logic is characteristically different from other ops (which can only apply to segments they originally saw).\n\t\t\t// This is because the ranges that other ops apply to can be broken up by concurrent insertions, so even though setRemoves are originally\n\t\t\t// applied to a contiguous set of segments, at resubmission time they may no longer be.\n\t\t\t// On the other hand, the closest analog to a `sliceRemove` that we can submit is obtained by resolving the \"closest\" start and end points\n\t\t\t// for that slice, updating the local obliterate metadata to reflect that slice, and submitting a single op.\n\n\t\t\tconst obliterateInfo: ObliterateInfo | undefined = segmentGroup.obliterateInfo;\n\t\t\tassert(\n\t\t\t\tobliterateInfo !== undefined,\n\t\t\t\t0xb63 /* Resubmitting obliterate op without obliterate info in segment group */,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tobliterateInfo.stamp.localSeq === segmentGroup.localSeq,\n\t\t\t\t0xb64 /* Local seq mismatch */,\n\t\t\t);\n\n\t\t\tconst cachedNewPositions = this.cachedObliterateRebases.get(\n\t\t\t\tobliterateInfo.stamp.localSeq,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tcachedNewPositions !== undefined,\n\t\t\t\t0xb65 /* didn't compute new positions for obliterate on reconnect early enough */,\n\t\t\t);\n\t\t\tconst {\n\t\t\t\tstart: { segment: newStartSegment, offset: newStartOffset, side: newStartSide },\n\t\t\t\tend: { segment: newEndSegment, offset: newEndOffset, side: newEndSide },\n\t\t\t} = cachedNewPositions;\n\n\t\t\tconst { currentSeq, clientId } = this.getCollabWindow();\n\n\t\t\tif (newEndSegment.ordinal < newStartSegment.ordinal) {\n\t\t\t\tfor (const segment of segmentGroup.segments) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tisRemovedAndAcked(segment),\n\t\t\t\t\t\t0xb66 /* On reconnect, obliterate applied to new segments even though original ones were not removed. */,\n\t\t\t\t\t);\n\t\t\t\t\tconst lastRemove = segment.removes[segment.removes.length - 1];\n\t\t\t\t\tassert(\n\t\t\t\t\t\t(lastRemove.type === \"sliceRemove\" &&\n\t\t\t\t\t\t\tlastRemove.localSeq === segmentGroup.localSeq) ||\n\t\t\t\t\t\t\topstampUtils.isSquashedOp(lastRemove),\n\t\t\t\t\t\t0xbad /* Last remove should be the obliterate that is being resubmitted. */,\n\t\t\t\t\t);\n\n\t\t\t\t\t// The original obliterate affected this segment, but it has since been removed.\n\t\t\t\t\t// This can happen when a concurrent obliterate also removed the segment, as well as when the segment was\n\t\t\t\t\t// only locally inserted and its insertion was squashed upon reconnecting.\n\t\t\t\t\t// In the concurrent removal case (where we didn't avoid sending the segment's insertion in the first place due\n\t\t\t\t\t// to squashing), we adjust the metadata on that segment to reflect the fact that this obliterate no longer removes it.\n\t\t\t\t\tif (!opstampUtils.isSquashedOp(lastRemove)) {\n\t\t\t\t\t\tsegment.removes.pop();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis._mergeTree.rebaseObliterateTo(obliterateInfo, undefined);\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tassert(\n\t\t\t\tobliterateInfo.tiebreakTrackingGroup !== undefined,\n\t\t\t\t0xb68 /* Tiebreak tracking group missing */,\n\t\t\t);\n\n\t\t\tconst newObliterate: ObliterateInfo = {\n\t\t\t\t// Recreate the start position using the perspective that other clients will see.\n\t\t\t\t// This may not be at the same position as the original reference, since the segment the original reference was on could have been removed.\n\t\t\t\tstart: this._mergeTree.createLocalReferencePosition(\n\t\t\t\t\tnewStartSegment,\n\t\t\t\t\tnewStartOffset,\n\t\t\t\t\tReferenceType.StayOnRemove,\n\t\t\t\t\tundefined,\n\t\t\t\t),\n\t\t\t\tstartSide: newStartSide,\n\t\t\t\tend: this._mergeTree.createLocalReferencePosition(\n\t\t\t\t\tnewEndSegment,\n\t\t\t\t\tnewEndOffset,\n\t\t\t\t\tReferenceType.StayOnRemove,\n\t\t\t\t\tundefined,\n\t\t\t\t),\n\t\t\t\tendSide: newEndSide,\n\t\t\t\trefSeq: currentSeq,\n\t\t\t\t// We reuse the localSeq from the original obliterate.\n\t\t\t\tstamp: obliterateInfo.stamp,\n\t\t\t\tsegmentGroup: undefined,\n\t\t\t\ttiebreakTrackingGroup: obliterateInfo.tiebreakTrackingGroup,\n\t\t\t};\n\t\t\tnewObliterate.start.addProperties({ obliterate: newObliterate });\n\t\t\tnewObliterate.end.addProperties({ obliterate: newObliterate });\n\t\t\tnewObliterate.segmentGroup = {\n\t\t\t\tsegments: [],\n\t\t\t\tlocalSeq: segmentGroup.localSeq,\n\t\t\t\trefSeq: this.getCollabWindow().currentSeq,\n\t\t\t\tobliterateInfo: newObliterate,\n\t\t\t};\n\n\t\t\tfor (const segment of segmentGroup.segments) {\n\t\t\t\tassert(\n\t\t\t\t\tsegment.segmentGroups?.remove(segmentGroup) === true,\n\t\t\t\t\t0x035 /* \"Segment group not in segment pending queue\" */,\n\t\t\t\t);\n\t\t\t\tif (\n\t\t\t\t\t!isRemovedAndAcked(segment) &&\n\t\t\t\t\t((segment.ordinal > newStartSegment.ordinal &&\n\t\t\t\t\t\tsegment.ordinal < newEndSegment.ordinal) ||\n\t\t\t\t\t\t(segment === newStartSegment && newStartSide === Side.Before) ||\n\t\t\t\t\t\t(segment === newEndSegment && newEndSide === Side.After))\n\t\t\t\t) {\n\t\t\t\t\tsegment.segmentGroups.enqueue(newObliterate.segmentGroup);\n\t\t\t\t} else {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tisRemovedAndAcked(segment),\n\t\t\t\t\t\t0xb69 /* On reconnect, obliterate applied to new segments even though original ones were not removed. */,\n\t\t\t\t\t);\n\t\t\t\t\tconst lastRemove = segment.removes[segment.removes.length - 1];\n\t\t\t\t\tassert(\n\t\t\t\t\t\t(lastRemove.type === \"sliceRemove\" &&\n\t\t\t\t\t\t\tlastRemove.localSeq === segmentGroup.localSeq) ||\n\t\t\t\t\t\t\topstampUtils.isSquashedOp(lastRemove),\n\t\t\t\t\t\t0xbae /* Last remove should be the obliterate that is being resubmitted. */,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (!opstampUtils.isSquashedOp(lastRemove)) {\n\t\t\t\t\t\t// The original obliterate affected this segment, but it has since been removed and it's impossible to apply the\n\t\t\t\t\t\t// local obliterate so that is so. We adjust the metadata on that segment now.\n\t\t\t\t\t\tsegment.removes.pop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._mergeTree.rebaseObliterateTo(obliterateInfo, newObliterate);\n\t\t\tthis._mergeTree.pendingSegments.push(newObliterate.segmentGroup);\n\n\t\t\tconst reconnectingPerspective = new LocalReconnectingPerspective(\n\t\t\t\tcurrentSeq,\n\t\t\t\tclientId,\n\t\t\t\tobliterateInfo.stamp.localSeq - 1,\n\t\t\t);\n\n\t\t\tconst newStartPos =\n\t\t\t\tthis._mergeTree.getPosition(newStartSegment, reconnectingPerspective) + newStartOffset;\n\t\t\tconst newEndPos =\n\t\t\t\tthis._mergeTree.getPosition(newEndSegment, reconnectingPerspective) + newEndOffset;\n\t\t\tif (resetOp.type === MergeTreeDeltaType.OBLITERATE) {\n\t\t\t\tassert(\n\t\t\t\t\tnewStartSide === Side.Before && newEndSide === Side.After,\n\t\t\t\t\t0xb6b /* Non-sided obliterate should have start side before and end side after */,\n\t\t\t\t);\n\t\t\t\t// Use a non-sided obliterate op if the original op was non-sided. Some combinations of feature flags disallow sided obliterate ops\n\t\t\t\t// but allow non-sided ones, and if we convert a non-sided op to a sided one on reconnect, we may cause errors.\n\t\t\t\treturn [\n\t\t\t\t\tcreateObliterateRangeOp(\n\t\t\t\t\t\tnewStartPos,\n\t\t\t\t\t\tnewEndPos +\n\t\t\t\t\t\t\t1 /* to make the end exclusive, see corresponding -1 in `createObliterateRangeOpSided` on converting non-sided to sided. */,\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t}\n\t\t\treturn [\n\t\t\t\tcreateObliterateRangeOpSided(\n\t\t\t\t\t{\n\t\t\t\t\t\tpos: newStartPos,\n\t\t\t\t\t\tside: newStartSide,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tpos: newEndPos,\n\t\t\t\t\t\tside: newEndSide,\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t];\n\t\t}\n\n\t\tconst opList: IMergeTreeDeltaOp[] = [];\n\t\t// We need to sort the segments by ordinal, as the segments are not sorted in the segment group.\n\t\t// The reason they need them sorted, as they have the same local sequence number and which means\n\t\t// farther segments will take into account nearer segments when calculating their position.\n\t\t// By sorting we ensure the nearer segment will be applied and sequenced before the farther segments\n\t\t// so their recalculated positions will be correct.\n\t\tfor (const segment of segmentGroup.segments.sort((a, b) =>\n\t\t\ta.ordinal < b.ordinal ? -1 : 1,\n\t\t)) {\n\t\t\tassert(\n\t\t\t\tsegment.segmentGroups?.remove(segmentGroup) === true,\n\t\t\t\t0xb6c /* Segment group not in segment pending queue */,\n\t\t\t);\n\t\t\tconst segmentPosition = this.findReconnectionPosition(segment, segmentGroup.localSeq);\n\t\t\tlet newOp: IMergeTreeDeltaOp | undefined;\n\t\t\tswitch (resetOp.type) {\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsegment.propertyManager?.hasPendingProperties(resetOp.props ?? resetOp.adjust) ===\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t0x036 /* \"Segment has no pending properties\" */,\n\t\t\t\t\t);\n\t\t\t\t\t// if the segment has been removed or obliterated, there's no need to send the annotate op\n\t\t\t\t\t// unless the remove was local, in which case the annotate must have come\n\t\t\t\t\t// before the remove\n\t\t\t\t\tif (!isRemovedAndAcked(segment)) {\n\t\t\t\t\t\tnewOp =\n\t\t\t\t\t\t\tresetOp.props === undefined\n\t\t\t\t\t\t\t\t? createAdjustRangeOp(\n\t\t\t\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t\t\t\t\tresetOp.adjust,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: createAnnotateRangeOp(\n\t\t\t\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t\t\t\t\tresetOp.props,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\t\tif (isInserted(segment) && opstampUtils.isSquashedOp(segment.insert)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tassert(\n\t\t\t\t\t\tisInserted(segment) && opstampUtils.isLocal(segment.insert),\n\t\t\t\t\t\t0x037 /* \"Segment already has assigned sequence number\" */,\n\t\t\t\t\t);\n\t\t\t\t\tconst removeInfo = toRemovalInfo(segment);\n\n\t\t\t\t\tconst unusedStamp: OperationStamp = { seq: 0, clientId: 0 };\n\t\t\t\t\tif (removeInfo !== undefined && squash) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tremoveInfo.removes.length === 1 ||\n\t\t\t\t\t\t\t\topstampUtils.isAcked(removeInfo.removes[removeInfo.removes.length - 2]),\n\t\t\t\t\t\t\t0xbaf /* Expected only one local remove */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.squashInsertion(segment);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (removeInfo !== undefined && opstampUtils.isAcked(removeInfo.removes[0])) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tremoveInfo.removes[0].type === \"sliceRemove\",\n\t\t\t\t\t\t\t0xb5c /* Remove on insertion must be caused by obliterate. */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\terrorIfOptionNotTrue(\n\t\t\t\t\t\t\tthis._mergeTree.options,\n\t\t\t\t\t\t\t\"mergeTreeEnableObliterateReconnect\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// the segment was remotely obliterated, so is considered removed\n\t\t\t\t\t\t// we set the seq to the universal seq and remove the local seq,\n\t\t\t\t\t\t// so its length is not considered for subsequent local changes\n\t\t\t\t\t\t// this allows us to not send the op as even the local client will ignore the segment\n\t\t\t\t\t\toverwriteInfo<IHasInsertionInfo>(segment, {\n\t\t\t\t\t\t\tinsert: {\n\t\t\t\t\t\t\t\ttype: \"insert\",\n\t\t\t\t\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\t\t\t\t\tlocalSeq: undefined,\n\t\t\t\t\t\t\t\tclientId: NonCollabClient,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis._mergeTree.blockUpdatePathLengths(segment.parent, unusedStamp, true);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst segInsertOp: ISegment = segment.clone();\n\t\t\t\t\tconst opProps =\n\t\t\t\t\t\tisObject(resetOp.seg) && \"props\" in resetOp.seg && isObject(resetOp.seg.props)\n\t\t\t\t\t\t\t? { ...resetOp.seg.props }\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tsegInsertOp.properties = opProps;\n\t\t\t\t\tnewOp = createInsertSegmentOp(segmentPosition, segInsertOp);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\t\t// Only bother resubmitting if nobody else has removed it in the meantime.\n\t\t\t\t\t// When that happens, the first removal will have been acked.\n\t\t\t\t\tif (isRemoved(segment) && opstampUtils.isLocal(segment.removes[0])) {\n\t\t\t\t\t\tnewOp = createRemoveRangeOp(\n\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tthrow new Error(`Invalid op type`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (newOp) {\n\t\t\t\tconst newSegmentGroup: SegmentGroup = {\n\t\t\t\t\tsegments: [],\n\t\t\t\t\tlocalSeq: segmentGroup.localSeq,\n\t\t\t\t\trefSeq: this.getCollabWindow().currentSeq,\n\t\t\t\t\tpreviousProps: segmentGroup.previousProps?.slice(0),\n\t\t\t\t};\n\n\t\t\t\tsegment.segmentGroups.enqueue(newSegmentGroup);\n\n\t\t\t\tthis._mergeTree.pendingSegments.push(newSegmentGroup);\n\n\t\t\t\topList.push(newOp);\n\t\t\t}\n\t\t}\n\n\t\treturn opList;\n\t}\n\n\tprivate applyRemoteOp(opArgs: IMergeTreeDeltaRemoteOpArgs): void {\n\t\tconst op = opArgs.op;\n\t\tconst msg = opArgs.sequencedMessage;\n\t\tthis.getOrAddShortClientIdFromMessage(msg);\n\t\tswitch (op.type) {\n\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\tthis.applyInsertOp(opArgs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\tthis.applyRemoveRangeOp(opArgs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\tthis.applyAnnotateRangeOp(opArgs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.OBLITERATE:\n\t\t\tcase MergeTreeDeltaType.OBLITERATE_SIDED: {\n\t\t\t\tthis.applyObliterateRangeOp(opArgs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.GROUP: {\n\t\t\t\tfor (const memberOp of op.ops) {\n\t\t\t\t\tthis.applyRemoteOp({\n\t\t\t\t\t\top: memberOp,\n\t\t\t\t\t\tgroupOp: op,\n\t\t\t\t\t\tsequencedMessage: msg,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic applyStashedOp(op: IMergeTreeOp): void {\n\t\tswitch (op.type) {\n\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\tthis.applyInsertOp({ op });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\tthis.applyRemoveRangeOp({ op });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\tthis.applyAnnotateRangeOp({ op });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.OBLITERATE_SIDED:\n\t\t\tcase MergeTreeDeltaType.OBLITERATE: {\n\t\t\t\tthis.applyObliterateRangeOp({ op });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.GROUP: {\n\t\t\t\top.ops.map((o) => this.applyStashedOp(o));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(op, \"unrecognized op type\");\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic applyMsg(msg: ISequencedDocumentMessage, local: boolean = false): void {\n\t\t// Ensure client ID is registered\n\t\tthis.getOrAddShortClientIdFromMessage(msg);\n\t\t// Apply if an operation message\n\t\tif (msg.type === MessageType.Operation) {\n\t\t\tconst opArgs: IMergeTreeDeltaRemoteOpArgs = {\n\t\t\t\top: msg.contents as IMergeTreeOp,\n\t\t\t\tsequencedMessage: msg,\n\t\t\t};\n\t\t\tif (opArgs.sequencedMessage?.clientId === this.longClientId || local) {\n\t\t\t\tthis.ackPendingSegment(opArgs);\n\t\t\t} else {\n\t\t\t\tthis.applyRemoteOp(opArgs);\n\t\t\t}\n\t\t}\n\n\t\tconst min = Math.min(\n\t\t\tthis.getMinInFlightRefSeq() ?? Number.POSITIVE_INFINITY,\n\t\t\tmsg.minimumSequenceNumber,\n\t\t);\n\t\tthis.updateSeqNumbers(min, msg.sequenceNumber);\n\t}\n\n\tprivate updateSeqNumbers(min: number, seq: number): void {\n\t\tconst collabWindow = this.getCollabWindow();\n\t\t// Equal is fine here due to SharedSegmentSequence<>.snapshotContent() potentially updating with same #\n\t\tassert(\n\t\t\tcollabWindow.currentSeq <= seq,\n\t\t\t0x038 /* \"Incoming op sequence# < local collabWindow's currentSequence#\" */,\n\t\t);\n\t\tcollabWindow.currentSeq = seq;\n\t\tassert(min <= seq, 0x039 /* \"Incoming op sequence# < minSequence#\" */);\n\t\tthis.updateMinSeq(min);\n\t}\n\n\t/**\n\t * Resolves a remote client's position against the local sequence\n\t * and returns the remote client's position relative to the local\n\t * sequence\n\t * @param remoteClientPosition - The remote client's position to resolve\n\t * @param remoteClientRefSeq - The reference sequence number of the remote client\n\t * @param remoteClientId - The client id of the remote client\n\t */\n\tpublic resolveRemoteClientPosition(\n\t\tremoteClientPosition: number,\n\t\tremoteClientRefSeq: number,\n\t\tremoteClientId: string,\n\t): number | undefined {\n\t\tconst shortRemoteClientId = this.getOrAddShortClientId(remoteClientId);\n\t\treturn this._mergeTree.resolveRemoteClientPosition(\n\t\t\tremoteClientPosition,\n\t\t\tremoteClientRefSeq,\n\t\t\tshortRemoteClientId,\n\t\t);\n\t}\n\n\tprivate lastNormalization: undefined | { refSeq: number; localRefSeq: number };\n\n\tprivate pendingRebase: DoublyLinkedList<SegmentGroup> | undefined;\n\n\tprivate readonly cachedObliterateRebases: Map<\n\t\tnumber, // obliterateInfo.stamp.localSeq\n\t\t{ start: RebasedObliterateEndpoint; end: RebasedObliterateEndpoint }\n\t> = new Map();\n\n\tprivate squashInsertion(segment: ISegmentLeaf): void {\n\t\toverwriteInfo<IHasInsertionInfo & IHasRemovalInfo>(segment, {\n\t\t\tinsert: {\n\t\t\t\ttype: \"insert\",\n\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\tlocalSeq: undefined,\n\t\t\t\tclientId: SquashClient,\n\t\t\t},\n\t\t\tremoves: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"setRemove\",\n\t\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\t\tlocalSeq: undefined,\n\t\t\t\t\tclientId: SquashClient,\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\n\t\tthis._mergeTree.blockUpdatePathLengths(segment.parent, { seq: 0, clientId: 0 }, true);\n\t}\n\n\t/**\n\t * Given a pending operation and segment group, regenerate the op, so it\n\t * can be resubmitted\n\t * @param resetOp - The op to reset\n\t * @param segmentGroup - The segment group associated with the op\n\t * @param squash - whether intermediate states should be squashed. See `IDeltaHandler.reSubmit`'s squash parameter\n\t * documentation for more details.\n\t */\n\tpublic regeneratePendingOp(\n\t\tresetOp: IMergeTreeOp,\n\t\tlocalOpMetadata: unknown,\n\t\tsquash: boolean,\n\t): IMergeTreeOp {\n\t\tconst segmentGroup = localOpMetadata as SegmentGroup | SegmentGroup[];\n\t\tif (this.pendingRebase === undefined || this.pendingRebase.empty) {\n\t\t\tlet firstGroup: SegmentGroup;\n\t\t\tif (Array.isArray(segmentGroup)) {\n\t\t\t\tif (segmentGroup.length === 0) {\n\t\t\t\t\t// sometimes we rebase to an empty op\n\n\t\t\t\t\treturn createGroupOp();\n\t\t\t\t}\n\t\t\t\tfirstGroup = segmentGroup[0];\n\t\t\t} else {\n\t\t\t\tfirstGroup = segmentGroup;\n\t\t\t}\n\t\t\tconst firstGroupNode = this._mergeTree.pendingSegments.find(\n\t\t\t\t(node) => node.data === firstGroup,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tfirstGroupNode !== undefined,\n\t\t\t\t0x70e /* segment group must exist in pending list */,\n\t\t\t);\n\t\t\tthis.pendingRebase = this._mergeTree.pendingSegments.splice(firstGroupNode);\n\t\t}\n\n\t\tconst collabWindow = this.getCollabWindow();\n\t\tif (\n\t\t\tthis.lastNormalization === undefined ||\n\t\t\tcollabWindow.currentSeq !== this.lastNormalization.refSeq ||\n\t\t\tcollabWindow.localSeq !== this.lastNormalization.localRefSeq\n\t\t) {\n\t\t\tconst allPendingSegments = [...this._mergeTree.pendingSegments, ...this.pendingRebase];\n\t\t\t// Compute obliterate endpoint destinations before segments are normalized.\n\t\t\t// Segment normalization can affect what should be the semantically correct segments for the endpoints to be placed on.\n\t\t\tthis.cachedObliterateRebases.clear();\n\t\t\tfor (const group of allPendingSegments) {\n\t\t\t\tconst { obliterateInfo } = group.data;\n\t\t\t\tif (obliterateInfo !== undefined) {\n\t\t\t\t\tconst { start, end } = this.computeNewObliterateEndpoints(obliterateInfo, squash);\n\t\t\t\t\tconst { localSeq } = obliterateInfo.stamp;\n\t\t\t\t\tassert(localSeq !== undefined, 0xb6d /* Local seq must be defined */);\n\t\t\t\t\tthis.cachedObliterateRebases.set(localSeq, { start, end });\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.emit(\"normalize\", squash, this);\n\n\t\t\tthis._mergeTree.normalizeSegmentsOnRebase();\n\t\t\tthis.lastNormalization = {\n\t\t\t\trefSeq: collabWindow.currentSeq,\n\t\t\t\tlocalRefSeq: collabWindow.localSeq,\n\t\t\t};\n\t\t}\n\n\t\tconst opList: IMergeTreeDeltaOp[] = [];\n\t\tif (resetOp.type === MergeTreeDeltaType.GROUP) {\n\t\t\tif (Array.isArray(segmentGroup)) {\n\t\t\t\tassert(\n\t\t\t\t\tresetOp.ops.length === segmentGroup.length,\n\t\t\t\t\t0x03a /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */,\n\t\t\t\t);\n\n\t\t\t\tfor (let i = 0; i < resetOp.ops.length; i++) {\n\t\t\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i], squash));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// A group op containing a single op will pass a direct reference to 'segmentGroup'\n\t\t\t\t// rather than an array of segment groups. (See 'peekPendingSegmentGroups()')\n\t\t\t\tassert(\n\t\t\t\t\tresetOp.ops.length === 1,\n\t\t\t\t\t0x03b /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */,\n\t\t\t\t);\n\t\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp.ops[0], segmentGroup, squash));\n\t\t\t}\n\t\t} else {\n\t\t\tassert(\n\t\t\t\t(resetOp.type as unknown) !== MergeTreeDeltaType.GROUP,\n\t\t\t\t0x03c /* \"Reset op has 'group' delta type!\" */,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!Array.isArray(segmentGroup),\n\t\t\t\t0x03d /* \"segmentGroup is array rather than singleton!\" */,\n\t\t\t);\n\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp, segmentGroup, squash));\n\t\t}\n\n\t\treturn opList.length === 1 ? opList[0] : createGroupOp(...opList);\n\t}\n\n\tpublic createTextHelper(): IMergeTreeTextHelper {\n\t\treturn new MergeTreeTextHelper(this._mergeTree);\n\t}\n\n\tpublic summarize(\n\t\truntime: IFluidDataStoreRuntime,\n\t\thandle: IFluidHandle,\n\t\tserializer: IFluidSerializer,\n\t\tcatchUpMsgs: ISequencedDocumentMessage[],\n\t): ISummaryTreeWithStats {\n\t\tconst deltaManager = toDeltaManagerInternal(runtime.deltaManager);\n\t\tconst minSeq = deltaManager.minimumSequenceNumber;\n\n\t\t// Catch up to latest MSN, if we have not had a chance to do it.\n\t\t// Required for case where FluidDataStoreRuntime.attachChannel()\n\t\t// generates summary right after loading data store.\n\n\t\tthis.updateSeqNumbers(minSeq, deltaManager.lastSequenceNumber);\n\n\t\t// One of the summaries (from SPO) I observed to have chunk.chunkSequenceNumber > minSeq!\n\t\t// Not sure why - need to catch it sooner\n\t\tassert(\n\t\t\tthis.getCollabWindow().minSeq === minSeq,\n\t\t\t0x03e /* \"minSeq mismatch between collab window and delta manager!\" */,\n\t\t);\n\n\t\t// Must continue to support legacy\n\t\t// (See https://github.com/microsoft/FluidFramework/issues/84)\n\t\tif (this._mergeTree.options?.newMergeTreeSnapshotFormat === true) {\n\t\t\tassert(\n\t\t\t\tcatchUpMsgs === undefined || catchUpMsgs.length === 0,\n\t\t\t\t0x03f /* \"New format should not emit catchup ops\" */,\n\t\t\t);\n\t\t\tconst snap = new SnapshotV1(this._mergeTree, this.logger, (id) =>\n\t\t\t\tthis.getLongClientId(id),\n\t\t\t);\n\t\t\tsnap.extractSync();\n\t\t\treturn snap.emit(serializer, handle);\n\t\t} else {\n\t\t\tconst snap = new SnapshotLegacy(this._mergeTree, this.logger);\n\t\t\tsnap.extractSync();\n\t\t\treturn snap.emit(catchUpMsgs, serializer, handle);\n\t\t}\n\t}\n\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tstorage: IChannelStorageService,\n\t\tserializer: IFluidSerializer,\n\t): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]> }> {\n\t\tconst loader = new SnapshotLoader(runtime, this, this._mergeTree, this.logger, serializer);\n\n\t\treturn loader.initialize(storage);\n\t}\n\n\t// eslint-disable-next-line import/no-deprecated\n\tlocalTransaction(groupOp: IMergeTreeGroupMsg): void {\n\t\tfor (const op of groupOp.ops) {\n\t\t\tconst opArgs: IMergeTreeDeltaOpArgs = {\n\t\t\t\top,\n\t\t\t\tgroupOp,\n\t\t\t};\n\t\t\tswitch (op.type) {\n\t\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\t\tthis.applyInsertOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\t\tthis.applyAnnotateRangeOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\t\tthis.applyRemoveRangeOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MergeTreeDeltaType.OBLITERATE_SIDED:\n\t\t\t\tcase MergeTreeDeltaType.OBLITERATE: {\n\t\t\t\t\tthis.applyObliterateRangeOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateMinSeq(minSeq: number): void {\n\t\tthis._mergeTree.setMinSeq(minSeq);\n\t}\n\n\tgetContainingSegment<T extends ISegment>(\n\t\tpos: number,\n\t\tsequenceArgs?: Pick<ISequencedDocumentMessage, \"referenceSequenceNumber\" | \"clientId\">,\n\t\tlocalSeq?: number,\n\t):\n\t\t| {\n\t\t\t\tsegment: T;\n\t\t\t\toffset: number;\n\t\t }\n\t\t| undefined {\n\t\tlet perspective: Perspective;\n\t\tconst clientId =\n\t\t\tsequenceArgs === undefined\n\t\t\t\t? this.getClientId()\n\t\t\t\t: this.getOrAddShortClientIdFromMessage(sequenceArgs);\n\t\tconst refSeq = sequenceArgs?.referenceSequenceNumber ?? this.getCollabWindow().currentSeq;\n\t\tif (localSeq !== undefined) {\n\t\t\tperspective = new LocalReconnectingPerspective(refSeq, clientId, localSeq);\n\t\t} else if (sequenceArgs === undefined) {\n\t\t\tperspective = this._mergeTree.localPerspective;\n\t\t} else {\n\t\t\tperspective = new PriorPerspective(refSeq, clientId);\n\t\t}\n\n\t\treturn this._mergeTree.getContainingSegment(pos, perspective) as\n\t\t\t| {\n\t\t\t\t\tsegment: T;\n\t\t\t\t\toffset: number;\n\t\t\t }\n\t\t\t| undefined;\n\t}\n\n\tgetPropertiesAtPosition(pos: number): PropertySet | undefined {\n\t\tconst segoff = this.getContainingSegment(pos);\n\t\treturn segoff?.segment?.properties;\n\t}\n\n\tgetRangeExtentsOfPosition(pos: number): {\n\t\tposStart: number | undefined;\n\t\tposAfterEnd: number | undefined;\n\t} {\n\t\tlet posStart: number | undefined;\n\t\tlet posAfterEnd: number | undefined;\n\n\t\tconst segoff = this.getContainingSegment(pos);\n\t\tconst seg = segoff?.segment;\n\t\tif (seg) {\n\t\t\tposStart = this.getPosition(seg);\n\t\t\tposAfterEnd = posStart + seg.cachedLength;\n\t\t}\n\t\treturn { posStart, posAfterEnd };\n\t}\n\n\tgetCurrentSeq(): number {\n\t\treturn this.getCollabWindow().currentSeq;\n\t}\n\n\tgetClientId(): number {\n\t\treturn this.getCollabWindow().clientId;\n\t}\n\n\tgetLength(): number {\n\t\treturn this._mergeTree.length ?? 0;\n\t}\n\n\tstartOrUpdateCollaboration(\n\t\tlongClientId: string | undefined,\n\t\tminSeq = 0,\n\t\tcurrentSeq = 0,\n\t): void {\n\t\t// we should always have a client id if we are collaborating\n\t\t// if the client id is undefined we are likely bound to a detached\n\t\t// container, so we should keep going in local mode. once\n\t\t// the container attaches this will be called again on connect with the\n\t\t// client id\n\t\tif (longClientId !== undefined) {\n\t\t\tif (this.longClientId === undefined) {\n\t\t\t\tthis.longClientId = longClientId;\n\t\t\t\tthis.addLongClientId(this.longClientId);\n\t\t\t\tthis._mergeTree.startCollaboration(\n\t\t\t\t\tthis.getShortClientId(this.longClientId),\n\t\t\t\t\tminSeq,\n\t\t\t\t\tcurrentSeq,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst oldClientId = this.longClientId;\n\t\t\t\tconst oldData = this.clientNameToIds.get(oldClientId)!.data;\n\t\t\t\tthis.longClientId = longClientId;\n\t\t\t\tthis.clientNameToIds.put(longClientId, oldData);\n\t\t\t\tthis.shortClientIdMap[oldData] = longClientId;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Searches a string for the nearest marker in either direction to a given start position.\n\t * The search will include the start position, so markers at the start position are valid\n\t * results of the search. Makes use of block-accelerated search functions for log(n) complexity.\n\t *\n\t * @param startPos - Position at which to start the search\n\t * @param markerLabel - Label of the marker to search for\n\t * @param forwards - Whether the desired marker comes before (false) or after (true) `startPos`\n\t */\n\tsearchForMarker(startPos: number, markerLabel: string, forwards = true): Marker | undefined {\n\t\treturn this._mergeTree.searchForMarker(startPos, markerLabel, forwards);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport type { IEventThisPlaceHolder, IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport {\n\tassert,\n\tunreachableCase,\n\tisObject,\n\ttype DoublyLinkedList,\n} from \"@fluidframework/core-utils/internal\";\nimport type {\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tMessageType,\n\ttype ISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport type { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions/internal\";\nimport { toDeltaManagerInternal } from \"@fluidframework/runtime-utils/internal\";\nimport type { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport {\n\ttype ITelemetryLoggerExt,\n\tLoggingError,\n\tUsageError,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport { MergeTreeTextHelper, type IMergeTreeTextHelper } from \"./MergeTreeTextHelper.js\";\nimport { RedBlackTree } from \"./collections/index.js\";\nimport { NonCollabClient, SquashClient, UniversalSequenceNumber } from \"./constants.js\";\nimport { type LocalReferencePosition, SlidingPreference } from \"./localReference.js\";\nimport {\n\tMergeTree,\n\terrorIfOptionNotTrue,\n\tgetSlideToSegoff,\n\tisRemovedAndAcked,\n\ttype IMergeTreeOptionsInternal,\n} from \"./mergeTree.js\";\nimport type {\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeDeltaOpArgs,\n\tIMergeTreeMaintenanceCallbackArgs,\n} from \"./mergeTreeDeltaCallback.js\";\nimport { walkAllChildSegments } from \"./mergeTreeNodeWalk.js\";\nimport {\n\ttype CollaborationWindow,\n\ttype ISegment,\n\ttype ISegmentAction,\n\ttype ISegmentPrivate,\n\ttype Marker,\n\ttype SegmentGroup,\n\tcompareStrings,\n\tisSegmentLeaf,\n\ttype ISegmentInternal,\n\ttype ISegmentLeaf,\n\ttype ObliterateInfo,\n} from \"./mergeTreeNodes.js\";\nimport {\n\tcreateAdjustRangeOp,\n\tcreateAnnotateMarkerOp,\n\tcreateAnnotateRangeOp,\n\tcreateGroupOp,\n\tcreateInsertSegmentOp,\n\tcreateObliterateRangeOp,\n\tcreateObliterateRangeOpSided,\n\tcreateRemoveRangeOp,\n} from \"./opBuilder.js\";\nimport {\n\ttype IJSONSegment,\n\ttype IMergeTreeAnnotateMsg,\n\ttype IMergeTreeDeltaOp,\n\t// eslint-disable-next-line import-x/no-deprecated\n\ttype IMergeTreeGroupMsg,\n\ttype IMergeTreeInsertMsg,\n\t// eslint-disable-next-line import-x/no-deprecated\n\ttype IMergeTreeObliterateMsg,\n\ttype IMergeTreeOp,\n\ttype IMergeTreeRemoveMsg,\n\ttype IRelativePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\ttype AdjustParams,\n\ttype IMergeTreeAnnotateAdjustMsg,\n\ttype IMergeTreeObliterateSidedMsg,\n} from \"./ops.js\";\nimport {\n\tcreateLocalReconnectingPerspective,\n\tLocalReconnectingPerspective,\n\tPriorPerspective,\n\ttype Perspective,\n} from \"./perspective.js\";\nimport type { PropertySet, MapLike } from \"./properties.js\";\nimport { DetachedReferencePosition, type ReferencePosition } from \"./referencePositions.js\";\nimport {\n\tisInserted,\n\tisRemoved,\n\toverwriteInfo,\n\ttoRemovalInfo,\n\ttype IHasInsertionInfo,\n\ttype IHasRemovalInfo,\n} from \"./segmentInfos.js\";\nimport { Side, type InteriorSequencePlace } from \"./sequencePlace.js\";\nimport { SnapshotLoader } from \"./snapshotLoader.js\";\nimport { SnapshotV1 } from \"./snapshotV1.js\";\nimport { SnapshotLegacy } from \"./snapshotlegacy.js\";\nimport type { OperationStamp } from \"./stamps.js\";\nimport * as opstampUtils from \"./stamps.js\";\n\ntype IMergeTreeDeltaRemoteOpArgs = Omit<IMergeTreeDeltaOpArgs, \"sequencedMessage\"> &\n\tRequired<Pick<IMergeTreeDeltaOpArgs, \"sequencedMessage\">>;\n\ninterface RebasedObliterateEndpoint {\n\tsegment: ISegmentLeaf;\n\toffset: number;\n\tside: Side;\n}\n\n/**\n * A range [start, end)\n * @internal\n */\nexport interface IIntegerRange {\n\tstart: number;\n\tend: number;\n}\n\n/**\n * Emitted before this client's merge-tree normalizes its segments on reconnect, potentially\n * ordering them. Useful for DDS-like consumers built atop the merge-tree to compute any information\n * they need for rebasing their ops on reconnection.\n * @internal\n */\nexport interface IClientEvents {\n\t(\n\t\tevent: \"normalize\",\n\t\tlistener: (squash: boolean, target: IEventThisPlaceHolder) => void,\n\t): void;\n\t(\n\t\tevent: \"delta\",\n\t\tlistener: (\n\t\t\topArgs: IMergeTreeDeltaOpArgs,\n\t\t\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n\t(\n\t\tevent: \"maintenance\",\n\t\tlistener: (\n\t\t\targs: IMergeTreeMaintenanceCallbackArgs,\n\t\t\tdeltaArgs: IMergeTreeDeltaOpArgs | undefined,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n}\n\nconst UNBOUND_SEGMENT_ERROR = \"The provided segment is not bound to this DDS.\";\n\n/**\n * This class encapsulates a merge-tree, and provides a local client specific view over it and\n * the capability to modify it as the local client. Additionally it provides\n * binding for processing remote ops on the encapsulated merge tree, and projects local and remote events\n * caused by all modification to the underlying merge-tree.\n *\n * @internal\n */\nexport class Client extends TypedEventEmitter<IClientEvents> {\n\tpublic longClientId: string | undefined;\n\n\tprivate readonly _mergeTree: MergeTree;\n\n\tprivate readonly clientNameToIds = new RedBlackTree<string, number>(compareStrings);\n\tprivate readonly shortClientIdMap: string[] = [];\n\n\t/**\n\t * @param specToSegment - Rehydrates a segment from its JSON representation\n\t * @param logger - Telemetry logger for diagnostics\n\t * @param options - Options for this client. See {@link IMergeTreeOptions} for details.\n\t * @param getMinInFlightRefSeq - Upon applying a message (see {@link Client.applyMsg}), client purges collab-window information which\n\t * is no longer necessary based on that message's minimum sequence number.\n\t * However, if the user of this client has in-flight messages which refer to positions in this Client,\n\t * they may wish to preserve additional merge information.\n\t * The effective minimum sequence number will be the minimum of the message's minimumSequenceNumber and the result of this function.\n\t * If this function returns undefined, the message's minimumSequenceNumber will be used.\n\t *\n\t * @privateRemarks\n\t * - Passing specToSegment would be unnecessary if Client were merged with SharedSegmentSequence\n\t * - AB#6866 tracks a more unified approach to collab window min seq handling.\n\t */\n\tconstructor(\n\t\tpublic readonly specToSegment: (spec: IJSONSegment) => ISegment,\n\t\tpublic readonly logger: ITelemetryLoggerExt,\n\t\toptions?: IMergeTreeOptionsInternal & PropertySet,\n\t\tprivate readonly getMinInFlightRefSeq: () => number | undefined = (): undefined =>\n\t\t\tundefined,\n\t) {\n\t\tsuper();\n\t\tthis._mergeTree = new MergeTree(options);\n\t\tthis._mergeTree.mergeTreeDeltaCallback = (opArgs, deltaArgs): void => {\n\t\t\tthis.emit(\"delta\", opArgs, deltaArgs, this);\n\t\t};\n\t\tthis._mergeTree.mergeTreeMaintenanceCallback = (args, opArgs): void => {\n\t\t\tthis.emit(\"maintenance\", args, opArgs, this);\n\t\t};\n\n\t\tif (options?.attribution?.track) {\n\t\t\tconst policy = this._mergeTree?.attributionPolicy;\n\t\t\tif (policy === undefined) {\n\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\"Attribution policy must be provided when attribution tracking is requested.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tpolicy.attach(this);\n\t\t}\n\t}\n\n\tpublic get endOfTree(): ISegmentInternal {\n\t\treturn this._mergeTree.endOfTree;\n\t}\n\tpublic get startOfTree(): ISegmentInternal {\n\t\treturn this._mergeTree.startOfTree;\n\t}\n\n\t/**\n\t * The merge tree maintains a queue of segment groups for each local operation.\n\t * These segment groups track segments modified by an operation.\n\t * This method peeks the tail of that queue, and returns the segments groups there.\n\t * It is used to get the segment group(s) for the previous operations.\n\t * @param count - The number segment groups to get peek from the tail of the queue. Default 1.\n\t */\n\n\tpublic peekPendingSegmentGroups(count: number = 1): unknown {\n\t\tconst pending = this._mergeTree.pendingSegments;\n\t\tlet node = pending?.last;\n\t\tif (count === 1 || pending === undefined) {\n\t\t\treturn node?.data;\n\t\t}\n\n\t\tconst taken: SegmentGroup[] = Array.from({ length: Math.min(count, pending.length) });\n\t\tfor (let i = taken.length - 1; i >= 0; i--) {\n\t\t\ttaken[i] = node!.data;\n\t\t\tnode = node!.prev;\n\t\t}\n\t\treturn taken;\n\t}\n\n\t/**\n\t * Annotates the markers with the provided properties\n\t * @param marker - The marker to annotate\n\t * @param props - The properties to annotate the marker with\n\t * @returns The annotate op if valid, otherwise undefined\n\t */\n\tpublic annotateMarker(\n\t\tmarker: Marker,\n\t\tprops: PropertySet,\n\t): IMergeTreeAnnotateMsg | undefined {\n\t\tconst annotateOp = createAnnotateMarkerOp(marker, props)!;\n\t\tthis.applyAnnotateRangeOp({ op: annotateOp });\n\t\treturn annotateOp;\n\t}\n\n\t/**\n\t * Annotates the range with the provided properties\n\t * @param start - The inclusive start position of the range to annotate\n\t * @param end - The exclusive end position of the range to annotate\n\t * @param props - The properties to annotate the range with\n\t * @returns The annotate op if valid, otherwise undefined\n\t */\n\tpublic annotateRangeLocal(\n\t\tstart: number,\n\t\tend: number,\n\t\tprops: PropertySet,\n\t): IMergeTreeAnnotateMsg | undefined {\n\t\tconst annotateOp = createAnnotateRangeOp(start, end, props);\n\t\tthis.applyAnnotateRangeOp({ op: annotateOp });\n\t\treturn annotateOp;\n\t}\n\n\t/**\n\t * adjusts a value\n\t */\n\tpublic annotateAdjustRangeLocal(\n\t\tstart: number,\n\t\tend: number,\n\t\tadjust: MapLike<AdjustParams>,\n\t): IMergeTreeAnnotateAdjustMsg {\n\t\tconst annotateOp = createAdjustRangeOp(start, end, adjust);\n\n\t\tfor (const [key, value] of Object.entries(adjust)) {\n\t\t\tif (value.min !== undefined && value.max !== undefined && value.min > value.max) {\n\t\t\t\tthrow new UsageError(`min is greater than max for ${key}`);\n\t\t\t}\n\t\t}\n\n\t\tthis.applyAnnotateRangeOp({ op: annotateOp });\n\t\treturn annotateOp;\n\t}\n\n\t/**\n\t * Removes the range\n\t *\n\t * @param start - The inclusive start of the range to remove\n\t * @param end - The exclusive end of the range to remove\n\t */\n\tpublic removeRangeLocal(start: number, end: number): IMergeTreeRemoveMsg {\n\t\tconst removeOp = createRemoveRangeOp(start, end);\n\t\tthis.applyRemoveRangeOp({ op: removeOp });\n\t\treturn removeOp;\n\t}\n\n\t/**\n\t * Obliterates the range. This is similar to removing the range, but also\n\t * includes any concurrently inserted content.\n\t *\n\t * @param start - The start of the range to obliterate. Inclusive is side is Before (default).\n\t * @param end - The end of the range to obliterate. Exclusive is side is After\n\t * (default is to be after the last included character, but number index is exclusive).\n\t */\n\tpublic obliterateRangeLocal(\n\t\tstart: number | InteriorSequencePlace,\n\t\tend: number | InteriorSequencePlace,\n\t\t// eslint-disable-next-line import-x/no-deprecated\n\t): IMergeTreeObliterateMsg | IMergeTreeObliterateSidedMsg {\n\t\t// eslint-disable-next-line import-x/no-deprecated\n\t\tlet obliterateOp: IMergeTreeObliterateMsg | IMergeTreeObliterateSidedMsg;\n\t\tif (this._mergeTree.options?.mergeTreeEnableSidedObliterate) {\n\t\t\tobliterateOp = createObliterateRangeOpSided(start, end);\n\t\t} else {\n\t\t\tassert(\n\t\t\t\ttypeof start === \"number\" && typeof end === \"number\",\n\t\t\t\t0xa42 /* Start and end must be numbers if mergeTreeEnableSidedObliterate is not enabled. */,\n\t\t\t);\n\t\t\tobliterateOp = createObliterateRangeOp(start, end);\n\t\t}\n\t\tthis.applyObliterateRangeOp({ op: obliterateOp });\n\t\treturn obliterateOp;\n\t}\n\n\t/**\n\t * Create and insert a segment at the specified position.\n\t * @param pos - The position to insert the segment at\n\t * @param segment - The segment to insert\n\t */\n\tpublic insertSegmentLocal(pos: number, segment: ISegment): IMergeTreeInsertMsg | undefined {\n\t\tif (segment.cachedLength <= 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst insertOp = createInsertSegmentOp(pos, segment);\n\t\tthis.applyInsertOp({ op: insertOp });\n\t\treturn insertOp;\n\t}\n\n\t/**\n\t * Create and insert a segment at the specified reference position.\n\t * @param refPos - The reference position to insert the segment at\n\t * @param segment - The segment to insert\n\t */\n\tpublic insertAtReferencePositionLocal(\n\t\trefPos: ReferencePosition,\n\t\tsegment: ISegment,\n\t): IMergeTreeInsertMsg | undefined {\n\t\tconst pos = this._mergeTree.referencePositionToLocalPosition(\n\t\t\trefPos,\n\t\t\tthis.getCurrentSeq(),\n\t\t\tthis.getClientId(),\n\t\t);\n\n\t\tif (pos === DetachedReferencePosition) {\n\t\t\tthrow new UsageError(\"Cannot insert at detached local reference.\");\n\t\t}\n\t\treturn this.insertSegmentLocal(pos, segment);\n\t}\n\n\tpublic walkSegments<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\tstart: number | undefined,\n\t\tend: number | undefined,\n\t\taccum: TClientData,\n\t\tsplitRange?: boolean,\n\t\tperspective?: Pick<ISequencedDocumentMessage, \"clientId\" | \"referenceSequenceNumber\">,\n\t): void;\n\tpublic walkSegments(\n\t\thandler: ISegmentAction<undefined>,\n\t\tstart?: number,\n\t\tend?: number,\n\t\taccum?: undefined,\n\t\tsplitRange?: boolean,\n\t\tperspective?: Pick<ISequencedDocumentMessage, \"clientId\" | \"referenceSequenceNumber\">,\n\t): void;\n\tpublic walkSegments<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\tstart: number | undefined,\n\t\tend: number | undefined,\n\t\taccum: TClientData,\n\t\tsplitRange: boolean = false,\n\t\tperspective?: Pick<ISequencedDocumentMessage, \"clientId\" | \"referenceSequenceNumber\">,\n\t): void {\n\t\tthis._mergeTree.mapRange(\n\t\t\thandler,\n\t\t\tperspective === undefined\n\t\t\t\t? this.getCollabWindow().localPerspective\n\t\t\t\t: this.getOperationPerspective(perspective),\n\t\t\taccum,\n\t\t\tstart,\n\t\t\tend,\n\t\t\tsplitRange,\n\t\t);\n\t}\n\n\tprotected walkAllSegments<TClientData>(\n\t\taction: (segment: ISegment, accum?: TClientData) => boolean,\n\t\taccum?: TClientData,\n\t): boolean {\n\t\treturn walkAllChildSegments(\n\t\t\tthis._mergeTree.root,\n\t\t\taccum === undefined ? action : (seg): boolean => action(seg, accum),\n\t\t);\n\t}\n\n\t/**\n\t * Serializes the data required for garbage collection. The IFluidHandles stored in all segments that haven't\n\t * been removed represent routes to other objects. We serialize the data in these segments using the passed in\n\t * serializer which keeps track of all serialized handles.\n\t */\n\tpublic serializeGCData(\n\t\thandle: IFluidHandle,\n\t\thandleCollectingSerializer: IFluidSerializer,\n\t): void {\n\t\tlet localInserts = 0;\n\t\tlet localRemoves = 0;\n\t\tlet localObliterates = 0;\n\t\twalkAllChildSegments(this._mergeTree.root, (seg: ISegmentPrivate) => {\n\t\t\tif (isInserted(seg) && opstampUtils.isLocal(seg.insert)) {\n\t\t\t\tlocalInserts++;\n\t\t\t}\n\t\t\tif (isRemoved(seg) && opstampUtils.isLocal(seg.removes[seg.removes.length - 1])) {\n\t\t\t\tif (seg.removes[seg.removes.length - 1].type === \"setRemove\") {\n\t\t\t\t\tlocalRemoves++;\n\t\t\t\t} else {\n\t\t\t\t\tlocalObliterates++;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Only serialize segments that have not been removed.\n\t\t\tif (!isRemoved(seg)) {\n\t\t\t\thandleCollectingSerializer.stringify(seg.clone().toJSONObject(), handle);\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t\tif (localInserts > 0 || localRemoves > 0) {\n\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\teventName: \"LocalEditsInProcessGCData\",\n\t\t\t\tlocalInserts,\n\t\t\t\tlocalRemoves,\n\t\t\t\tlocalObliterates,\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic getCollabWindow(): CollaborationWindow {\n\t\treturn this._mergeTree.collabWindow;\n\t}\n\n\t/**\n\t * Returns the current position of a segment, and -1 if the segment\n\t * does not exist in this merge tree\n\t * @param segment - The segment to get the position of\n\t */\n\tpublic getPosition(segment: ISegment | undefined, localSeq?: number): number {\n\t\tif (!isSegmentLeaf(segment)) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tconst perspective =\n\t\t\tlocalSeq === undefined\n\t\t\t\t? this._mergeTree.localPerspective\n\t\t\t\t: new LocalReconnectingPerspective(this.getCurrentSeq(), this.getClientId(), localSeq);\n\t\treturn this._mergeTree.getPosition(segment, perspective);\n\t}\n\n\t/**\n\t * Creates a `LocalReferencePosition` on this client. If the refType does not include ReferenceType.Transient,\n\t * the returned reference will be added to the localRefs on the provided segment.\n\t * @param segment - Segment to add the local reference on\n\t * @param offset - Offset on the segment at which to place the local reference\n\t * @param refType - ReferenceType for the created local reference\n\t * @param properties - PropertySet to place on the created local reference\n\t * @param canSlideToEndpoint - Whether or not the created local reference can\n\t * slide onto one of the special endpoint segments denoting the position\n\t * before the start of or after the end of the tree\n\t */\n\tpublic createLocalReferencePosition(\n\t\tsegment: ISegment | \"start\" | \"end\",\n\t\toffset: number | undefined,\n\t\trefType: ReferenceType,\n\t\tproperties: PropertySet | undefined,\n\t\tslidingPreference?: SlidingPreference,\n\t\tcanSlideToEndpoint?: boolean,\n\t): LocalReferencePosition {\n\t\tif (!isSegmentLeaf(segment) && typeof segment !== \"string\") {\n\t\t\tthrow new UsageError(UNBOUND_SEGMENT_ERROR);\n\t\t}\n\t\treturn this._mergeTree.createLocalReferencePosition(\n\t\t\tsegment,\n\t\t\toffset ?? 0,\n\t\t\trefType,\n\t\t\tproperties,\n\t\t\tslidingPreference,\n\t\t\tcanSlideToEndpoint,\n\t\t);\n\t}\n\n\t/**\n\t * Removes a `LocalReferencePosition` from this client.\n\t */\n\tpublic removeLocalReferencePosition(\n\t\tlref: LocalReferencePosition,\n\t): LocalReferencePosition | undefined {\n\t\treturn this._mergeTree.removeLocalReferencePosition(lref);\n\t}\n\n\t/**\n\t * Resolves a `ReferencePosition` into a character position using this client's perspective.\n\t *\n\t * Reference positions that point to a character that has been removed will\n\t * always return the position of the nearest non-removed character, regardless\n\t * of {@link ReferenceType}. To handle this case specifically, one may wish\n\t * to look at the segment returned by {@link ReferencePosition.getSegment}.\n\t */\n\tpublic localReferencePositionToPosition(lref: ReferencePosition): number {\n\t\treturn this._mergeTree.referencePositionToLocalPosition(lref);\n\t}\n\n\t/**\n\t * Given a position specified relative to a marker id, lookup the marker\n\t * and convert the position to a character position.\n\t * @param relativePos - Id of marker (may be indirect) and whether position is before or after marker.\n\t */\n\tpublic posFromRelativePos(relativePos: IRelativePosition): number {\n\t\treturn this._mergeTree.posFromRelativePos(relativePos, this._mergeTree.localPerspective);\n\t}\n\n\tpublic getMarkerFromId(id: string): ISegment | undefined {\n\t\treturn this._mergeTree.getMarkerFromId(id);\n\t}\n\n\t/**\n\t * Revert an op\n\t */\n\tpublic rollback(op: unknown, localOpMetadata: unknown): void {\n\t\tthis._mergeTree.rollback(op as IMergeTreeDeltaOp, localOpMetadata as SegmentGroup);\n\t}\n\n\tprivate applyObliterateRangeOp(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tconst { op, sequencedMessage } = opArgs;\n\t\tassert(\n\t\t\top.type === MergeTreeDeltaType.OBLITERATE ||\n\t\t\t\top.type === MergeTreeDeltaType.OBLITERATE_SIDED,\n\t\t\t0x866 /* Unexpected op type on range obliterate! */,\n\t\t);\n\t\tconst perspective = this.getOperationPerspective(sequencedMessage);\n\t\tconst stamp = this.getOperationStamp(sequencedMessage);\n\n\t\tif (this._mergeTree.options?.mergeTreeEnableSidedObliterate) {\n\t\t\tconst { start, end } = this.getValidSidedRange(op, perspective);\n\t\t\tthis._mergeTree.obliterateRange(start, end, perspective, stamp, opArgs);\n\t\t} else {\n\t\t\tassert(\n\t\t\t\top.type === MergeTreeDeltaType.OBLITERATE,\n\t\t\t\t0xa43 /* Unexpected sided obliterate while mergeTreeEnableSidedObliterate is disabled */,\n\t\t\t);\n\t\t\tconst { start, end } = this.getValidOpRange(op, perspective);\n\t\t\tthis._mergeTree.obliterateRange(start, end, perspective, stamp, opArgs);\n\t\t}\n\t}\n\n\tprivate getOperationPerspective(\n\t\tsequencedMessage:\n\t\t\t| Pick<ISequencedDocumentMessage, \"clientId\" | \"referenceSequenceNumber\">\n\t\t\t| undefined,\n\t): Perspective {\n\t\tif (!sequencedMessage) {\n\t\t\treturn this._mergeTree.localPerspective;\n\t\t}\n\n\t\tconst clientId = this.getOrAddShortClientIdFromMessage(sequencedMessage);\n\t\tconst { referenceSequenceNumber: refSeq } = sequencedMessage;\n\t\treturn new PriorPerspective(refSeq, clientId);\n\t}\n\n\t/**\n\t * Returns the operation stamp to apply for a change, minting a new one local one if necessary.\n\t */\n\tprivate getOperationStamp(\n\t\tsequencedMessage: ISequencedDocumentMessage | undefined,\n\t): OperationStamp {\n\t\tif (!sequencedMessage) {\n\t\t\treturn this.getCollabWindow().mintNextLocalOperationStamp();\n\t\t}\n\n\t\tconst { sequenceNumber: seq } = sequencedMessage;\n\t\tconst clientId = this.getOrAddShortClientIdFromMessage(sequencedMessage);\n\t\treturn {\n\t\t\tseq,\n\t\t\tclientId,\n\t\t};\n\t}\n\n\t/**\n\t * Performs the remove based on the provided op\n\t * @param opArgs - The ops args for the op\n\t */\n\tprivate applyRemoveRangeOp(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tconst { op, sequencedMessage } = opArgs;\n\t\tassert(\n\t\t\top.type === MergeTreeDeltaType.REMOVE,\n\t\t\t0x02d /* \"Unexpected op type on range remove!\" */,\n\t\t);\n\t\tconst perspective = this.getOperationPerspective(sequencedMessage);\n\t\tconst stamp = this.getOperationStamp(sequencedMessage);\n\t\tconst range = this.getValidOpRange(op, perspective);\n\n\t\tthis._mergeTree.markRangeRemoved(range.start, range.end, perspective, stamp, opArgs);\n\t}\n\n\t/**\n\t * Performs the annotate based on the provided op\n\t * @param opArgs - The ops args for the op\n\t */\n\tprivate applyAnnotateRangeOp(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tconst { op, sequencedMessage } = opArgs;\n\t\tassert(\n\t\t\top.type === MergeTreeDeltaType.ANNOTATE,\n\t\t\t0x02e /* \"Unexpected op type on range annotate!\" */,\n\t\t);\n\t\tconst perspective = this.getOperationPerspective(sequencedMessage);\n\t\tconst stamp = this.getOperationStamp(sequencedMessage);\n\t\tconst range = this.getValidOpRange(op, perspective);\n\n\t\tthis._mergeTree.annotateRange(range.start, range.end, op, perspective, stamp, opArgs);\n\t}\n\n\t/**\n\t * Performs the insert based on the provided op\n\t * @param opArgs - The ops args for the op\n\t * @returns True if the insert was applied. False if it could not be.\n\t */\n\tprivate applyInsertOp(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tconst { op, sequencedMessage } = opArgs;\n\t\tassert(\n\t\t\top.type === MergeTreeDeltaType.INSERT,\n\t\t\t0x02f /* \"Unexpected op type on range insert!\" */,\n\t\t);\n\t\tconst perspective = this.getOperationPerspective(sequencedMessage);\n\t\tconst stamp = this.getOperationStamp(sequencedMessage);\n\t\tconst range = this.getValidOpRange(op, perspective);\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\tconst segments = [this.specToSegment(op.seg)];\n\n\t\tthis._mergeTree.insertSegments(range.start, segments, perspective, stamp, opArgs);\n\t}\n\n\t/**\n\t * Returns a valid range for the op, or throws if the range is invalid\n\t * @param op - The op to generate the range for\n\t * @param clientArgs - The client args for the op\n\t * @throws LoggingError if the range is invalid\n\t */\n\tprivate getValidSidedRange(\n\t\t// eslint-disable-next-line import-x/no-deprecated\n\t\top: IMergeTreeObliterateSidedMsg | IMergeTreeObliterateMsg,\n\t\tperspective: Perspective,\n\t): {\n\t\tstart: InteriorSequencePlace;\n\t\tend: InteriorSequencePlace;\n\t} {\n\t\tconst invalidPositions: string[] = [];\n\t\tlet start: InteriorSequencePlace | undefined;\n\t\tlet end: InteriorSequencePlace | undefined;\n\t\tif (op.pos1 === undefined) {\n\t\t\tinvalidPositions.push(\"start\");\n\t\t} else {\n\t\t\tstart =\n\t\t\t\ttypeof op.pos1 === \"object\"\n\t\t\t\t\t? { pos: op.pos1.pos, side: op.pos1.before ? Side.Before : Side.After }\n\t\t\t\t\t: { pos: op.pos1, side: Side.Before };\n\t\t}\n\t\tif (op.pos2 === undefined) {\n\t\t\tinvalidPositions.push(\"end\");\n\t\t} else {\n\t\t\tend =\n\t\t\t\ttypeof op.pos2 === \"object\"\n\t\t\t\t\t? { pos: op.pos2.pos, side: op.pos2.before ? Side.Before : Side.After }\n\t\t\t\t\t: { pos: op.pos2 - 1, side: Side.After };\n\t\t}\n\n\t\t// Validate if local op\n\t\tif (perspective.clientId === this.getClientId()) {\n\t\t\tconst length = this._mergeTree.getLength(this._mergeTree.localPerspective);\n\t\t\tif (start !== undefined && (start.pos >= length || start.pos < 0)) {\n\t\t\t\t// start out of bounds\n\t\t\t\tinvalidPositions.push(\"start\");\n\t\t\t}\n\t\t\tif (end !== undefined && (end.pos >= length || end.pos < 0)) {\n\t\t\t\tinvalidPositions.push(\"end\");\n\t\t\t}\n\t\t\tif (\n\t\t\t\tstart !== undefined &&\n\t\t\t\tend !== undefined &&\n\t\t\t\t(start.pos > end.pos ||\n\t\t\t\t\t(start.pos === end.pos && start.side !== end.side && start.side === Side.After))\n\t\t\t) {\n\t\t\t\t// end is before start\n\t\t\t\tinvalidPositions.push(\"inverted\");\n\t\t\t}\n\t\t\tif (invalidPositions.length > 0) {\n\t\t\t\tthrow new LoggingError(\"InvalidRange\", {\n\t\t\t\t\tusageError: true,\n\t\t\t\t\tinvalidPositions: invalidPositions.toString(),\n\t\t\t\t\tlength,\n\t\t\t\t\topType: op.type,\n\t\t\t\t\topPos1Relative: op.relativePos1 !== undefined,\n\t\t\t\t\topPos2Relative: op.relativePos2 !== undefined,\n\t\t\t\t\topPos1: JSON.stringify(op.pos1),\n\t\t\t\t\topPos2: JSON.stringify(op.pos2),\n\t\t\t\t\tstart: JSON.stringify(start),\n\t\t\t\t\tend: JSON.stringify(end),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tassert(\n\t\t\tstart !== undefined && end !== undefined,\n\t\t\t0xa44 /* Missing start or end of range */,\n\t\t);\n\t\treturn { start, end };\n\t}\n\n\t/**\n\t * Returns a valid range for the op, or undefined\n\t * @param op - The op to generate the range for\n\t * @param clientArgs - The client args for the op\n\t */\n\tprivate getValidOpRange(\n\t\top:\n\t\t\t| IMergeTreeAnnotateMsg\n\t\t\t| IMergeTreeAnnotateAdjustMsg\n\t\t\t| IMergeTreeInsertMsg\n\t\t\t| IMergeTreeRemoveMsg\n\t\t\t// eslint-disable-next-line import-x/no-deprecated\n\t\t\t| IMergeTreeObliterateMsg,\n\t\tperspective: Perspective,\n\t): IIntegerRange {\n\t\tlet start: number | undefined = op.pos1;\n\t\tif (start === undefined && op.relativePos1) {\n\t\t\tstart = this._mergeTree.posFromRelativePos(op.relativePos1, perspective);\n\t\t}\n\n\t\tlet end: number | undefined = op.pos2;\n\t\tif (end === undefined && op.relativePos2) {\n\t\t\tend = this._mergeTree.posFromRelativePos(op.relativePos2, perspective);\n\t\t}\n\n\t\t// Validate if local op\n\t\tif (perspective.clientId === this.getClientId()) {\n\t\t\tconst length = this.getLength();\n\n\t\t\tconst invalidPositions: string[] = [];\n\n\t\t\t// Validate start position\n\t\t\t//\n\t\t\tif (\n\t\t\t\tstart === undefined ||\n\t\t\t\tstart < 0 ||\n\t\t\t\tstart > length ||\n\t\t\t\t(start === length && op.type !== MergeTreeDeltaType.INSERT)\n\t\t\t) {\n\t\t\t\tinvalidPositions.push(\"start\");\n\t\t\t}\n\t\t\t// Validate end if not insert, or insert has end\n\t\t\tif (\n\t\t\t\t(op.type !== MergeTreeDeltaType.INSERT || end !== undefined) &&\n\t\t\t\t(end === undefined || end <= start!)\n\t\t\t) {\n\t\t\t\tinvalidPositions.push(\"end\");\n\t\t\t}\n\n\t\t\tif (op.type === MergeTreeDeltaType.OBLITERATE && end !== undefined && end > length) {\n\t\t\t\tinvalidPositions.push(\"end\");\n\t\t\t}\n\n\t\t\tif (invalidPositions.length > 0) {\n\t\t\t\tthrow new LoggingError(\"RangeOutOfBounds\", {\n\t\t\t\t\tusageError: true,\n\t\t\t\t\tend,\n\t\t\t\t\tinvalidPositions: invalidPositions.toString(),\n\t\t\t\t\tlength,\n\t\t\t\t\topPos1: op.pos1,\n\t\t\t\t\topPos1Relative: op.relativePos1 !== undefined,\n\t\t\t\t\topPos2: op.pos2,\n\t\t\t\t\topPos2Relative: op.relativePos2 !== undefined,\n\t\t\t\t\topType: op.type,\n\t\t\t\t\tstart,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// start and end are guaranteed to be non-null here, otherwise we throw above.\n\t\treturn { start: start!, end: end! };\n\t}\n\n\tprivate ackPendingSegment(opArgs: IMergeTreeDeltaRemoteOpArgs): void {\n\t\tif (opArgs.op.type === MergeTreeDeltaType.GROUP) {\n\t\t\tfor (const memberOp of opArgs.op.ops) {\n\t\t\t\tthis._mergeTree.ackOp({\n\t\t\t\t\tgroupOp: opArgs.op,\n\t\t\t\t\top: memberOp,\n\t\t\t\t\tsequencedMessage: opArgs.sequencedMessage,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tthis._mergeTree.ackOp(opArgs);\n\t\t}\n\t}\n\n\tgetOrAddShortClientId(longClientId: string): number {\n\t\tif (!this.clientNameToIds.get(longClientId)) {\n\t\t\tthis.addLongClientId(longClientId);\n\t\t}\n\t\treturn this.getShortClientId(longClientId);\n\t}\n\n\tprotected getShortClientId(longClientId: string): number {\n\t\treturn this.clientNameToIds.get(longClientId)!.data;\n\t}\n\n\tgetLongClientId(shortClientId: number): string {\n\t\treturn shortClientId >= 0 ? this.shortClientIdMap[shortClientId] : \"original\";\n\t}\n\n\taddLongClientId(longClientId: string): void {\n\t\tthis.clientNameToIds.put(longClientId, this.shortClientIdMap.length);\n\t\tthis.shortClientIdMap.push(longClientId);\n\t}\n\n\tprivate getOrAddShortClientIdFromMessage(\n\t\tmsg: Pick<ISequencedDocumentMessage, \"clientId\">,\n\t): number {\n\t\treturn this.getOrAddShortClientId(msg.clientId ?? \"server\");\n\t}\n\n\t/**\n\t * During reconnect, we must find the positions to pending segments\n\t * relative to other pending segments. This methods computes that\n\t * position relative to a localSeq. Pending segments above the localSeq\n\t * will be ignored.\n\t *\n\t * @param segment - The segment to find the position for\n\t * @param localSeq - The localSeq to find the position of the segment at\n\t */\n\tpublic findReconnectionPosition(segment: ISegment, localSeq: number): number {\n\t\tassert(\n\t\t\tlocalSeq <= this._mergeTree.collabWindow.localSeq,\n\t\t\t0x032 /* \"localSeq greater than collab window\" */,\n\t\t);\n\t\tconst { currentSeq, clientId } = this.getCollabWindow();\n\t\tif (!isSegmentLeaf(segment)) {\n\t\t\tthrow new UsageError(UNBOUND_SEGMENT_ERROR);\n\t\t}\n\t\tconst perspective = new LocalReconnectingPerspective(currentSeq, clientId, localSeq);\n\t\treturn this._mergeTree.getPosition(segment, perspective);\n\t}\n\n\t/**\n\t * Rebases a sided local reference to the best fitting position in the current tree.\n\t */\n\tprivate rebaseSidedLocalReference(\n\t\tref: LocalReferencePosition,\n\t\tside: Side,\n\t\treconnectingPerspective: Perspective,\n\t\tslidePreference: SlidingPreference,\n\t): RebasedObliterateEndpoint {\n\t\tconst oldSegment = ref.getSegment();\n\t\tconst oldOffset = ref.getOffset();\n\t\tassert(\n\t\t\toldSegment !== undefined && oldOffset !== undefined,\n\t\t\t0xb61 /* Invalid old reference */,\n\t\t);\n\t\tconst canSlideToEndpoint = true;\n\t\t// Destructuring segment + offset is convenient and segment is reassigned\n\n\t\tconst segOff = getSlideToSegoff(\n\t\t\t{ segment: oldSegment, offset: oldOffset },\n\t\t\tslidePreference,\n\t\t\treconnectingPerspective,\n\t\t\tcanSlideToEndpoint,\n\t\t);\n\n\t\tconst { segment: newSegment, offset: newOffset } = segOff ?? {\n\t\t\tsegment:\n\t\t\t\tslidePreference === SlidingPreference.FORWARD\n\t\t\t\t\t? this._mergeTree.endOfTree\n\t\t\t\t\t: this._mergeTree.startOfTree,\n\t\t\toffset: 0,\n\t\t};\n\n\t\tassert(\n\t\t\tisSegmentLeaf(newSegment) && newOffset !== undefined,\n\t\t\t0xb62 /* Invalid new segment on rebase */,\n\t\t);\n\n\t\tconst newSide: Side =\n\t\t\tnewSegment === oldSegment\n\t\t\t\t? side\n\t\t\t\t: // If the reference slid to a new position, the closest fit to the original position will be independent of\n\t\t\t\t\t// the original side and \"in the direction of where the reference was\".\n\t\t\t\t\tslidePreference === SlidingPreference.FORWARD\n\t\t\t\t\t? Side.Before\n\t\t\t\t\t: Side.After;\n\n\t\treturn { segment: newSegment, offset: newOffset, side: newSide };\n\t}\n\n\tprivate computeNewObliterateEndpoints(\n\t\tobliterateInfo: ObliterateInfo,\n\t\tsquash: boolean,\n\t): {\n\t\tstart: RebasedObliterateEndpoint;\n\t\tend: RebasedObliterateEndpoint;\n\t} {\n\t\tconst { currentSeq, clientId } = this.getCollabWindow();\n\t\tconst reconnectingPerspective = createLocalReconnectingPerspective(\n\t\t\tcurrentSeq,\n\t\t\tclientId,\n\t\t\tobliterateInfo.stamp.localSeq! - 1,\n\t\t\tsquash,\n\t\t);\n\n\t\tconst newStart = this.rebaseSidedLocalReference(\n\t\t\tobliterateInfo.start,\n\t\t\tobliterateInfo.startSide,\n\t\t\treconnectingPerspective,\n\t\t\tSlidingPreference.FORWARD,\n\t\t);\n\t\tconst newEnd = this.rebaseSidedLocalReference(\n\t\t\tobliterateInfo.end,\n\t\t\tobliterateInfo.endSide,\n\t\t\treconnectingPerspective,\n\t\t\tSlidingPreference.BACKWARD,\n\t\t);\n\n\t\treturn {\n\t\t\tstart: newStart,\n\t\t\tend: newEnd,\n\t\t};\n\t}\n\n\tprivate resetPendingDeltaToOps(\n\t\tresetOp: IMergeTreeDeltaOp,\n\n\t\tsegmentGroup: SegmentGroup,\n\t\tsquash: boolean,\n\t): IMergeTreeDeltaOp[] {\n\t\tassert(!!segmentGroup, 0x033 /* \"Segment group undefined\" */);\n\t\tconst NACKedSegmentGroup = this.pendingRebase?.shift()?.data;\n\t\tassert(\n\t\t\tsegmentGroup === NACKedSegmentGroup,\n\t\t\t0x034 /* \"Segment group not at head of pending rebase queue\" */,\n\t\t);\n\t\tassert(\n\t\t\tsegmentGroup.localSeq !== undefined,\n\t\t\t0x867 /* expected segment group localSeq to be defined */,\n\t\t);\n\t\tif (this.pendingRebase?.empty) {\n\t\t\tthis.pendingRebase = undefined;\n\t\t}\n\n\t\tif (\n\t\t\tresetOp.type === MergeTreeDeltaType.OBLITERATE ||\n\t\t\tresetOp.type === MergeTreeDeltaType.OBLITERATE_SIDED\n\t\t) {\n\t\t\terrorIfOptionNotTrue(this._mergeTree.options, \"mergeTreeEnableObliterateReconnect\");\n\n\t\t\t// sliceRemove reconnect logic is characteristically different from other ops (which can only apply to segments they originally saw).\n\t\t\t// This is because the ranges that other ops apply to can be broken up by concurrent insertions, so even though setRemoves are originally\n\t\t\t// applied to a contiguous set of segments, at resubmission time they may no longer be.\n\t\t\t// On the other hand, the closest analog to a `sliceRemove` that we can submit is obtained by resolving the \"closest\" start and end points\n\t\t\t// for that slice, updating the local obliterate metadata to reflect that slice, and submitting a single op.\n\n\t\t\tconst obliterateInfo: ObliterateInfo | undefined = segmentGroup.obliterateInfo;\n\t\t\tassert(\n\t\t\t\tobliterateInfo !== undefined,\n\t\t\t\t0xb63 /* Resubmitting obliterate op without obliterate info in segment group */,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tobliterateInfo.stamp.localSeq === segmentGroup.localSeq,\n\t\t\t\t0xb64 /* Local seq mismatch */,\n\t\t\t);\n\n\t\t\tconst cachedNewPositions = this.cachedObliterateRebases.get(\n\t\t\t\tobliterateInfo.stamp.localSeq,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tcachedNewPositions !== undefined,\n\t\t\t\t0xb65 /* didn't compute new positions for obliterate on reconnect early enough */,\n\t\t\t);\n\t\t\tconst {\n\t\t\t\tstart: { segment: newStartSegment, offset: newStartOffset, side: newStartSide },\n\t\t\t\tend: { segment: newEndSegment, offset: newEndOffset, side: newEndSide },\n\t\t\t} = cachedNewPositions;\n\n\t\t\tconst { currentSeq, clientId } = this.getCollabWindow();\n\n\t\t\tif (newEndSegment.ordinal < newStartSegment.ordinal) {\n\t\t\t\tfor (const segment of segmentGroup.segments) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tisRemovedAndAcked(segment),\n\t\t\t\t\t\t0xb66 /* On reconnect, obliterate applied to new segments even though original ones were not removed. */,\n\t\t\t\t\t);\n\t\t\t\t\tconst lastRemove = segment.removes[segment.removes.length - 1];\n\t\t\t\t\tassert(\n\t\t\t\t\t\t(lastRemove.type === \"sliceRemove\" &&\n\t\t\t\t\t\t\tlastRemove.localSeq === segmentGroup.localSeq) ||\n\t\t\t\t\t\t\topstampUtils.isSquashedOp(lastRemove),\n\t\t\t\t\t\t0xbad /* Last remove should be the obliterate that is being resubmitted. */,\n\t\t\t\t\t);\n\n\t\t\t\t\t// The original obliterate affected this segment, but it has since been removed.\n\t\t\t\t\t// This can happen when a concurrent obliterate also removed the segment, as well as when the segment was\n\t\t\t\t\t// only locally inserted and its insertion was squashed upon reconnecting.\n\t\t\t\t\t// In the concurrent removal case (where we didn't avoid sending the segment's insertion in the first place due\n\t\t\t\t\t// to squashing), we adjust the metadata on that segment to reflect the fact that this obliterate no longer removes it.\n\t\t\t\t\tif (!opstampUtils.isSquashedOp(lastRemove)) {\n\t\t\t\t\t\tsegment.removes.pop();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis._mergeTree.rebaseObliterateTo(obliterateInfo, undefined);\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tassert(\n\t\t\t\tobliterateInfo.tiebreakTrackingGroup !== undefined,\n\t\t\t\t0xb68 /* Tiebreak tracking group missing */,\n\t\t\t);\n\n\t\t\tconst newObliterate: ObliterateInfo = {\n\t\t\t\t// Recreate the start position using the perspective that other clients will see.\n\t\t\t\t// This may not be at the same position as the original reference, since the segment the original reference was on could have been removed.\n\t\t\t\tstart: this._mergeTree.createLocalReferencePosition(\n\t\t\t\t\tnewStartSegment,\n\t\t\t\t\tnewStartOffset,\n\t\t\t\t\tReferenceType.StayOnRemove,\n\t\t\t\t\tundefined,\n\t\t\t\t),\n\t\t\t\tstartSide: newStartSide,\n\t\t\t\tend: this._mergeTree.createLocalReferencePosition(\n\t\t\t\t\tnewEndSegment,\n\t\t\t\t\tnewEndOffset,\n\t\t\t\t\tReferenceType.StayOnRemove,\n\t\t\t\t\tundefined,\n\t\t\t\t),\n\t\t\t\tendSide: newEndSide,\n\t\t\t\trefSeq: currentSeq,\n\t\t\t\t// We reuse the localSeq from the original obliterate.\n\t\t\t\tstamp: obliterateInfo.stamp,\n\t\t\t\tsegmentGroup: undefined,\n\t\t\t\ttiebreakTrackingGroup: obliterateInfo.tiebreakTrackingGroup,\n\t\t\t};\n\t\t\tnewObliterate.start.addProperties({ obliterate: newObliterate });\n\t\t\tnewObliterate.end.addProperties({ obliterate: newObliterate });\n\t\t\tnewObliterate.segmentGroup = {\n\t\t\t\tsegments: [],\n\t\t\t\tlocalSeq: segmentGroup.localSeq,\n\t\t\t\trefSeq: this.getCollabWindow().currentSeq,\n\t\t\t\tobliterateInfo: newObliterate,\n\t\t\t};\n\n\t\t\tfor (const segment of segmentGroup.segments) {\n\t\t\t\tassert(\n\t\t\t\t\tsegment.segmentGroups?.remove(segmentGroup) === true,\n\t\t\t\t\t0x035 /* \"Segment group not in segment pending queue\" */,\n\t\t\t\t);\n\t\t\t\tif (\n\t\t\t\t\t!isRemovedAndAcked(segment) &&\n\t\t\t\t\t((segment.ordinal > newStartSegment.ordinal &&\n\t\t\t\t\t\tsegment.ordinal < newEndSegment.ordinal) ||\n\t\t\t\t\t\t(segment === newStartSegment && newStartSide === Side.Before) ||\n\t\t\t\t\t\t(segment === newEndSegment && newEndSide === Side.After))\n\t\t\t\t) {\n\t\t\t\t\tsegment.segmentGroups.enqueue(newObliterate.segmentGroup);\n\t\t\t\t} else {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tisRemovedAndAcked(segment),\n\t\t\t\t\t\t0xb69 /* On reconnect, obliterate applied to new segments even though original ones were not removed. */,\n\t\t\t\t\t);\n\t\t\t\t\tconst lastRemove = segment.removes[segment.removes.length - 1];\n\t\t\t\t\tassert(\n\t\t\t\t\t\t(lastRemove.type === \"sliceRemove\" &&\n\t\t\t\t\t\t\tlastRemove.localSeq === segmentGroup.localSeq) ||\n\t\t\t\t\t\t\topstampUtils.isSquashedOp(lastRemove),\n\t\t\t\t\t\t0xbae /* Last remove should be the obliterate that is being resubmitted. */,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (!opstampUtils.isSquashedOp(lastRemove)) {\n\t\t\t\t\t\t// The original obliterate affected this segment, but it has since been removed and it's impossible to apply the\n\t\t\t\t\t\t// local obliterate so that is so. We adjust the metadata on that segment now.\n\t\t\t\t\t\tsegment.removes.pop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._mergeTree.rebaseObliterateTo(obliterateInfo, newObliterate);\n\t\t\tthis._mergeTree.pendingSegments.push(newObliterate.segmentGroup);\n\n\t\t\tconst reconnectingPerspective = new LocalReconnectingPerspective(\n\t\t\t\tcurrentSeq,\n\t\t\t\tclientId,\n\t\t\t\tobliterateInfo.stamp.localSeq - 1,\n\t\t\t);\n\n\t\t\tconst newStartPos =\n\t\t\t\tthis._mergeTree.getPosition(newStartSegment, reconnectingPerspective) + newStartOffset;\n\t\t\tconst newEndPos =\n\t\t\t\tthis._mergeTree.getPosition(newEndSegment, reconnectingPerspective) + newEndOffset;\n\t\t\tif (resetOp.type === MergeTreeDeltaType.OBLITERATE) {\n\t\t\t\tassert(\n\t\t\t\t\tnewStartSide === Side.Before && newEndSide === Side.After,\n\t\t\t\t\t0xb6b /* Non-sided obliterate should have start side before and end side after */,\n\t\t\t\t);\n\t\t\t\t// Use a non-sided obliterate op if the original op was non-sided. Some combinations of feature flags disallow sided obliterate ops\n\t\t\t\t// but allow non-sided ones, and if we convert a non-sided op to a sided one on reconnect, we may cause errors.\n\t\t\t\treturn [\n\t\t\t\t\tcreateObliterateRangeOp(\n\t\t\t\t\t\tnewStartPos,\n\t\t\t\t\t\tnewEndPos +\n\t\t\t\t\t\t\t1 /* to make the end exclusive, see corresponding -1 in `createObliterateRangeOpSided` on converting non-sided to sided. */,\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t}\n\t\t\treturn [\n\t\t\t\tcreateObliterateRangeOpSided(\n\t\t\t\t\t{\n\t\t\t\t\t\tpos: newStartPos,\n\t\t\t\t\t\tside: newStartSide,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tpos: newEndPos,\n\t\t\t\t\t\tside: newEndSide,\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t];\n\t\t}\n\n\t\tconst opList: IMergeTreeDeltaOp[] = [];\n\t\t// We need to sort the segments by ordinal, as the segments are not sorted in the segment group.\n\t\t// The reason they need them sorted, as they have the same local sequence number and which means\n\t\t// farther segments will take into account nearer segments when calculating their position.\n\t\t// By sorting we ensure the nearer segment will be applied and sequenced before the farther segments\n\t\t// so their recalculated positions will be correct.\n\t\tfor (const segment of segmentGroup.segments.sort((a, b) =>\n\t\t\ta.ordinal < b.ordinal ? -1 : 1,\n\t\t)) {\n\t\t\tassert(\n\t\t\t\tsegment.segmentGroups?.remove(segmentGroup) === true,\n\t\t\t\t0xb6c /* Segment group not in segment pending queue */,\n\t\t\t);\n\t\t\tconst segmentPosition = this.findReconnectionPosition(segment, segmentGroup.localSeq);\n\t\t\tlet newOp: IMergeTreeDeltaOp | undefined;\n\t\t\tswitch (resetOp.type) {\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsegment.propertyManager?.hasPendingProperties(resetOp.props ?? resetOp.adjust) ===\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t0x036 /* \"Segment has no pending properties\" */,\n\t\t\t\t\t);\n\t\t\t\t\t// if the segment has been removed or obliterated, there's no need to send the annotate op\n\t\t\t\t\t// unless the remove was local, in which case the annotate must have come\n\t\t\t\t\t// before the remove\n\t\t\t\t\tif (!isRemovedAndAcked(segment)) {\n\t\t\t\t\t\tnewOp =\n\t\t\t\t\t\t\tresetOp.props === undefined\n\t\t\t\t\t\t\t\t? createAdjustRangeOp(\n\t\t\t\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t\t\t\t\tresetOp.adjust,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: createAnnotateRangeOp(\n\t\t\t\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t\t\t\t\tresetOp.props,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\t\tif (isInserted(segment) && opstampUtils.isSquashedOp(segment.insert)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tassert(\n\t\t\t\t\t\tisInserted(segment) && opstampUtils.isLocal(segment.insert),\n\t\t\t\t\t\t0x037 /* \"Segment already has assigned sequence number\" */,\n\t\t\t\t\t);\n\t\t\t\t\tconst removeInfo = toRemovalInfo(segment);\n\n\t\t\t\t\tconst unusedStamp: OperationStamp = { seq: 0, clientId: 0 };\n\t\t\t\t\tif (removeInfo !== undefined && squash) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tremoveInfo.removes.length === 1 ||\n\t\t\t\t\t\t\t\topstampUtils.isAcked(removeInfo.removes[removeInfo.removes.length - 2]),\n\t\t\t\t\t\t\t0xbaf /* Expected only one local remove */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.squashInsertion(segment);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (removeInfo !== undefined && opstampUtils.isAcked(removeInfo.removes[0])) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tremoveInfo.removes[0].type === \"sliceRemove\",\n\t\t\t\t\t\t\t0xb5c /* Remove on insertion must be caused by obliterate. */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\terrorIfOptionNotTrue(\n\t\t\t\t\t\t\tthis._mergeTree.options,\n\t\t\t\t\t\t\t\"mergeTreeEnableObliterateReconnect\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// the segment was remotely obliterated, so is considered removed\n\t\t\t\t\t\t// we set the seq to the universal seq and remove the local seq,\n\t\t\t\t\t\t// so its length is not considered for subsequent local changes\n\t\t\t\t\t\t// this allows us to not send the op as even the local client will ignore the segment\n\t\t\t\t\t\toverwriteInfo<IHasInsertionInfo>(segment, {\n\t\t\t\t\t\t\tinsert: {\n\t\t\t\t\t\t\t\ttype: \"insert\",\n\t\t\t\t\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\t\t\t\t\tlocalSeq: undefined,\n\t\t\t\t\t\t\t\tclientId: NonCollabClient,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis._mergeTree.blockUpdatePathLengths(segment.parent, unusedStamp, true);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst segInsertOp: ISegment = segment.clone();\n\t\t\t\t\tconst opProps =\n\t\t\t\t\t\tisObject(resetOp.seg) && \"props\" in resetOp.seg && isObject(resetOp.seg.props)\n\t\t\t\t\t\t\t? { ...resetOp.seg.props }\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tsegInsertOp.properties = opProps;\n\t\t\t\t\tnewOp = createInsertSegmentOp(segmentPosition, segInsertOp);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\t\t// Only bother resubmitting if nobody else has removed it in the meantime.\n\t\t\t\t\t// When that happens, the first removal will have been acked.\n\t\t\t\t\tif (isRemoved(segment) && opstampUtils.isLocal(segment.removes[0])) {\n\t\t\t\t\t\tnewOp = createRemoveRangeOp(\n\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tthrow new Error(`Invalid op type`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (newOp) {\n\t\t\t\tconst newSegmentGroup: SegmentGroup = {\n\t\t\t\t\tsegments: [],\n\t\t\t\t\tlocalSeq: segmentGroup.localSeq,\n\t\t\t\t\trefSeq: this.getCollabWindow().currentSeq,\n\t\t\t\t\tpreviousProps: segmentGroup.previousProps?.slice(0),\n\t\t\t\t};\n\n\t\t\t\tsegment.segmentGroups.enqueue(newSegmentGroup);\n\n\t\t\t\tthis._mergeTree.pendingSegments.push(newSegmentGroup);\n\n\t\t\t\topList.push(newOp);\n\t\t\t}\n\t\t}\n\n\t\treturn opList;\n\t}\n\n\tprivate applyRemoteOp(opArgs: IMergeTreeDeltaRemoteOpArgs): void {\n\t\tconst op = opArgs.op;\n\t\tconst msg = opArgs.sequencedMessage;\n\t\tthis.getOrAddShortClientIdFromMessage(msg);\n\t\tswitch (op.type) {\n\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\tthis.applyInsertOp(opArgs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\tthis.applyRemoveRangeOp(opArgs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\tthis.applyAnnotateRangeOp(opArgs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.OBLITERATE:\n\t\t\tcase MergeTreeDeltaType.OBLITERATE_SIDED: {\n\t\t\t\tthis.applyObliterateRangeOp(opArgs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.GROUP: {\n\t\t\t\tfor (const memberOp of op.ops) {\n\t\t\t\t\tthis.applyRemoteOp({\n\t\t\t\t\t\top: memberOp,\n\t\t\t\t\t\tgroupOp: op,\n\t\t\t\t\t\tsequencedMessage: msg,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic applyStashedOp(op: IMergeTreeOp): void {\n\t\tswitch (op.type) {\n\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\tthis.applyInsertOp({ op });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\tthis.applyRemoveRangeOp({ op });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\tthis.applyAnnotateRangeOp({ op });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.OBLITERATE_SIDED:\n\t\t\tcase MergeTreeDeltaType.OBLITERATE: {\n\t\t\t\tthis.applyObliterateRangeOp({ op });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.GROUP: {\n\t\t\t\top.ops.map((o) => this.applyStashedOp(o));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(op, \"unrecognized op type\");\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic applyMsg(msg: ISequencedDocumentMessage, local: boolean = false): void {\n\t\t// Ensure client ID is registered\n\t\tthis.getOrAddShortClientIdFromMessage(msg);\n\t\t// Apply if an operation message\n\t\tif (msg.type === MessageType.Operation) {\n\t\t\tconst opArgs: IMergeTreeDeltaRemoteOpArgs = {\n\t\t\t\top: msg.contents as IMergeTreeOp,\n\t\t\t\tsequencedMessage: msg,\n\t\t\t};\n\t\t\tif (opArgs.sequencedMessage?.clientId === this.longClientId || local) {\n\t\t\t\tthis.ackPendingSegment(opArgs);\n\t\t\t} else {\n\t\t\t\tthis.applyRemoteOp(opArgs);\n\t\t\t}\n\t\t}\n\n\t\tconst min = Math.min(\n\t\t\tthis.getMinInFlightRefSeq() ?? Number.POSITIVE_INFINITY,\n\t\t\tmsg.minimumSequenceNumber,\n\t\t);\n\t\tthis.updateSeqNumbers(min, msg.sequenceNumber);\n\t}\n\n\tprivate updateSeqNumbers(min: number, seq: number): void {\n\t\tconst collabWindow = this.getCollabWindow();\n\t\t// Equal is fine here due to SharedSegmentSequence<>.snapshotContent() potentially updating with same #\n\t\tassert(\n\t\t\tcollabWindow.currentSeq <= seq,\n\t\t\t0x038 /* \"Incoming op sequence# < local collabWindow's currentSequence#\" */,\n\t\t);\n\t\tcollabWindow.currentSeq = seq;\n\t\tassert(min <= seq, 0x039 /* \"Incoming op sequence# < minSequence#\" */);\n\t\tthis.updateMinSeq(min);\n\t}\n\n\t/**\n\t * Resolves a remote client's position against the local sequence\n\t * and returns the remote client's position relative to the local\n\t * sequence\n\t * @param remoteClientPosition - The remote client's position to resolve\n\t * @param remoteClientRefSeq - The reference sequence number of the remote client\n\t * @param remoteClientId - The client id of the remote client\n\t */\n\tpublic resolveRemoteClientPosition(\n\t\tremoteClientPosition: number,\n\t\tremoteClientRefSeq: number,\n\t\tremoteClientId: string,\n\t): number | undefined {\n\t\tconst shortRemoteClientId = this.getOrAddShortClientId(remoteClientId);\n\t\treturn this._mergeTree.resolveRemoteClientPosition(\n\t\t\tremoteClientPosition,\n\t\t\tremoteClientRefSeq,\n\t\t\tshortRemoteClientId,\n\t\t);\n\t}\n\n\tprivate lastNormalization: undefined | { refSeq: number; localRefSeq: number };\n\n\tprivate pendingRebase: DoublyLinkedList<SegmentGroup> | undefined;\n\n\tprivate readonly cachedObliterateRebases: Map<\n\t\tnumber, // obliterateInfo.stamp.localSeq\n\t\t{ start: RebasedObliterateEndpoint; end: RebasedObliterateEndpoint }\n\t> = new Map();\n\n\tprivate squashInsertion(segment: ISegmentLeaf): void {\n\t\toverwriteInfo<IHasInsertionInfo & IHasRemovalInfo>(segment, {\n\t\t\tinsert: {\n\t\t\t\ttype: \"insert\",\n\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\tlocalSeq: undefined,\n\t\t\t\tclientId: SquashClient,\n\t\t\t},\n\t\t\tremoves: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"setRemove\",\n\t\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\t\tlocalSeq: undefined,\n\t\t\t\t\tclientId: SquashClient,\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\n\t\tthis._mergeTree.blockUpdatePathLengths(segment.parent, { seq: 0, clientId: 0 }, true);\n\t}\n\n\t/**\n\t * Given a pending operation and segment group, regenerate the op, so it\n\t * can be resubmitted\n\t * @param resetOp - The op to reset\n\t * @param segmentGroup - The segment group associated with the op\n\t * @param squash - whether intermediate states should be squashed. See `IDeltaHandler.reSubmit`'s squash parameter\n\t * documentation for more details.\n\t */\n\tpublic regeneratePendingOp(\n\t\tresetOp: IMergeTreeOp,\n\t\tlocalOpMetadata: unknown,\n\t\tsquash: boolean,\n\t): IMergeTreeOp {\n\t\tconst segmentGroup = localOpMetadata as SegmentGroup | SegmentGroup[];\n\t\tif (this.pendingRebase === undefined || this.pendingRebase.empty) {\n\t\t\tlet firstGroup: SegmentGroup;\n\t\t\tif (Array.isArray(segmentGroup)) {\n\t\t\t\tif (segmentGroup.length === 0) {\n\t\t\t\t\t// sometimes we rebase to an empty op\n\n\t\t\t\t\treturn createGroupOp();\n\t\t\t\t}\n\t\t\t\tfirstGroup = segmentGroup[0];\n\t\t\t} else {\n\t\t\t\tfirstGroup = segmentGroup;\n\t\t\t}\n\t\t\tconst firstGroupNode = this._mergeTree.pendingSegments.find(\n\t\t\t\t(node) => node.data === firstGroup,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tfirstGroupNode !== undefined,\n\t\t\t\t0x70e /* segment group must exist in pending list */,\n\t\t\t);\n\t\t\tthis.pendingRebase = this._mergeTree.pendingSegments.splice(firstGroupNode);\n\t\t}\n\n\t\tconst collabWindow = this.getCollabWindow();\n\t\tif (\n\t\t\tthis.lastNormalization === undefined ||\n\t\t\tcollabWindow.currentSeq !== this.lastNormalization.refSeq ||\n\t\t\tcollabWindow.localSeq !== this.lastNormalization.localRefSeq\n\t\t) {\n\t\t\tconst allPendingSegments = [...this._mergeTree.pendingSegments, ...this.pendingRebase];\n\t\t\t// Compute obliterate endpoint destinations before segments are normalized.\n\t\t\t// Segment normalization can affect what should be the semantically correct segments for the endpoints to be placed on.\n\t\t\tthis.cachedObliterateRebases.clear();\n\t\t\tfor (const group of allPendingSegments) {\n\t\t\t\tconst { obliterateInfo } = group.data;\n\t\t\t\tif (obliterateInfo !== undefined) {\n\t\t\t\t\tconst { start, end } = this.computeNewObliterateEndpoints(obliterateInfo, squash);\n\t\t\t\t\tconst { localSeq } = obliterateInfo.stamp;\n\t\t\t\t\tassert(localSeq !== undefined, 0xb6d /* Local seq must be defined */);\n\t\t\t\t\tthis.cachedObliterateRebases.set(localSeq, { start, end });\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.emit(\"normalize\", squash, this);\n\n\t\t\tthis._mergeTree.normalizeSegmentsOnRebase();\n\t\t\tthis.lastNormalization = {\n\t\t\t\trefSeq: collabWindow.currentSeq,\n\t\t\t\tlocalRefSeq: collabWindow.localSeq,\n\t\t\t};\n\t\t}\n\n\t\tconst opList: IMergeTreeDeltaOp[] = [];\n\t\tif (resetOp.type === MergeTreeDeltaType.GROUP) {\n\t\t\tif (Array.isArray(segmentGroup)) {\n\t\t\t\tassert(\n\t\t\t\t\tresetOp.ops.length === segmentGroup.length,\n\t\t\t\t\t0x03a /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */,\n\t\t\t\t);\n\n\t\t\t\tfor (let i = 0; i < resetOp.ops.length; i++) {\n\t\t\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i], squash));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// A group op containing a single op will pass a direct reference to 'segmentGroup'\n\t\t\t\t// rather than an array of segment groups. (See 'peekPendingSegmentGroups()')\n\t\t\t\tassert(\n\t\t\t\t\tresetOp.ops.length === 1,\n\t\t\t\t\t0x03b /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */,\n\t\t\t\t);\n\t\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp.ops[0], segmentGroup, squash));\n\t\t\t}\n\t\t} else {\n\t\t\tassert(\n\t\t\t\t(resetOp.type as unknown) !== MergeTreeDeltaType.GROUP,\n\t\t\t\t0x03c /* \"Reset op has 'group' delta type!\" */,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!Array.isArray(segmentGroup),\n\t\t\t\t0x03d /* \"segmentGroup is array rather than singleton!\" */,\n\t\t\t);\n\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp, segmentGroup, squash));\n\t\t}\n\n\t\treturn opList.length === 1 ? opList[0] : createGroupOp(...opList);\n\t}\n\n\tpublic createTextHelper(): IMergeTreeTextHelper {\n\t\treturn new MergeTreeTextHelper(this._mergeTree);\n\t}\n\n\tpublic summarize(\n\t\truntime: IFluidDataStoreRuntime,\n\t\thandle: IFluidHandle,\n\t\tserializer: IFluidSerializer,\n\t\tcatchUpMsgs: ISequencedDocumentMessage[],\n\t): ISummaryTreeWithStats {\n\t\tconst deltaManager = toDeltaManagerInternal(runtime.deltaManager);\n\t\tconst minSeq = deltaManager.minimumSequenceNumber;\n\n\t\t// Catch up to latest MSN, if we have not had a chance to do it.\n\t\t// Required for case where FluidDataStoreRuntime.attachChannel()\n\t\t// generates summary right after loading data store.\n\n\t\tthis.updateSeqNumbers(minSeq, deltaManager.lastSequenceNumber);\n\n\t\t// One of the summaries (from SPO) I observed to have chunk.chunkSequenceNumber > minSeq!\n\t\t// Not sure why - need to catch it sooner\n\t\tassert(\n\t\t\tthis.getCollabWindow().minSeq === minSeq,\n\t\t\t0x03e /* \"minSeq mismatch between collab window and delta manager!\" */,\n\t\t);\n\n\t\t// Must continue to support legacy\n\t\t// (See https://github.com/microsoft/FluidFramework/issues/84)\n\t\tif (this._mergeTree.options?.newMergeTreeSnapshotFormat === true) {\n\t\t\tassert(\n\t\t\t\tcatchUpMsgs === undefined || catchUpMsgs.length === 0,\n\t\t\t\t0x03f /* \"New format should not emit catchup ops\" */,\n\t\t\t);\n\t\t\tconst snap = new SnapshotV1(this._mergeTree, this.logger, (id) =>\n\t\t\t\tthis.getLongClientId(id),\n\t\t\t);\n\t\t\tsnap.extractSync();\n\t\t\treturn snap.emit(serializer, handle);\n\t\t} else {\n\t\t\tconst snap = new SnapshotLegacy(this._mergeTree, this.logger);\n\t\t\tsnap.extractSync();\n\t\t\treturn snap.emit(catchUpMsgs, serializer, handle);\n\t\t}\n\t}\n\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tstorage: IChannelStorageService,\n\t\tserializer: IFluidSerializer,\n\t): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]> }> {\n\t\tconst loader = new SnapshotLoader(runtime, this, this._mergeTree, this.logger, serializer);\n\n\t\treturn loader.initialize(storage);\n\t}\n\n\t// eslint-disable-next-line import-x/no-deprecated\n\tlocalTransaction(groupOp: IMergeTreeGroupMsg): void {\n\t\tfor (const op of groupOp.ops) {\n\t\t\tconst opArgs: IMergeTreeDeltaOpArgs = {\n\t\t\t\top,\n\t\t\t\tgroupOp,\n\t\t\t};\n\t\t\tswitch (op.type) {\n\t\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\t\tthis.applyInsertOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\t\tthis.applyAnnotateRangeOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\t\tthis.applyRemoveRangeOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MergeTreeDeltaType.OBLITERATE_SIDED:\n\t\t\t\tcase MergeTreeDeltaType.OBLITERATE: {\n\t\t\t\t\tthis.applyObliterateRangeOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateMinSeq(minSeq: number): void {\n\t\tthis._mergeTree.setMinSeq(minSeq);\n\t}\n\n\tgetContainingSegment<T extends ISegment>(\n\t\tpos: number,\n\t\tsequenceArgs?: Pick<ISequencedDocumentMessage, \"referenceSequenceNumber\" | \"clientId\">,\n\t\tlocalSeq?: number,\n\t):\n\t\t| {\n\t\t\t\tsegment: T;\n\t\t\t\toffset: number;\n\t\t }\n\t\t| undefined {\n\t\tlet perspective: Perspective;\n\t\tconst clientId =\n\t\t\tsequenceArgs === undefined\n\t\t\t\t? this.getClientId()\n\t\t\t\t: this.getOrAddShortClientIdFromMessage(sequenceArgs);\n\t\tconst refSeq = sequenceArgs?.referenceSequenceNumber ?? this.getCollabWindow().currentSeq;\n\t\tif (localSeq !== undefined) {\n\t\t\tperspective = new LocalReconnectingPerspective(refSeq, clientId, localSeq);\n\t\t} else if (sequenceArgs === undefined) {\n\t\t\tperspective = this._mergeTree.localPerspective;\n\t\t} else {\n\t\t\tperspective = new PriorPerspective(refSeq, clientId);\n\t\t}\n\n\t\treturn this._mergeTree.getContainingSegment(pos, perspective) as\n\t\t\t| {\n\t\t\t\t\tsegment: T;\n\t\t\t\t\toffset: number;\n\t\t\t }\n\t\t\t| undefined;\n\t}\n\n\tgetPropertiesAtPosition(pos: number): PropertySet | undefined {\n\t\tconst segoff = this.getContainingSegment(pos);\n\t\treturn segoff?.segment?.properties;\n\t}\n\n\tgetRangeExtentsOfPosition(pos: number): {\n\t\tposStart: number | undefined;\n\t\tposAfterEnd: number | undefined;\n\t} {\n\t\tlet posStart: number | undefined;\n\t\tlet posAfterEnd: number | undefined;\n\n\t\tconst segoff = this.getContainingSegment(pos);\n\t\tconst seg = segoff?.segment;\n\t\tif (seg) {\n\t\t\tposStart = this.getPosition(seg);\n\t\t\tposAfterEnd = posStart + seg.cachedLength;\n\t\t}\n\t\treturn { posStart, posAfterEnd };\n\t}\n\n\tgetCurrentSeq(): number {\n\t\treturn this.getCollabWindow().currentSeq;\n\t}\n\n\tgetClientId(): number {\n\t\treturn this.getCollabWindow().clientId;\n\t}\n\n\tgetLength(): number {\n\t\treturn this._mergeTree.length ?? 0;\n\t}\n\n\tstartOrUpdateCollaboration(\n\t\tlongClientId: string | undefined,\n\t\tminSeq = 0,\n\t\tcurrentSeq = 0,\n\t): void {\n\t\t// we should always have a client id if we are collaborating\n\t\t// if the client id is undefined we are likely bound to a detached\n\t\t// container, so we should keep going in local mode. once\n\t\t// the container attaches this will be called again on connect with the\n\t\t// client id\n\t\tif (longClientId !== undefined) {\n\t\t\tif (this.longClientId === undefined) {\n\t\t\t\tthis.longClientId = longClientId;\n\t\t\t\tthis.addLongClientId(this.longClientId);\n\t\t\t\tthis._mergeTree.startCollaboration(\n\t\t\t\t\tthis.getShortClientId(this.longClientId),\n\t\t\t\t\tminSeq,\n\t\t\t\t\tcurrentSeq,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst oldClientId = this.longClientId;\n\t\t\t\tconst oldData = this.clientNameToIds.get(oldClientId)!.data;\n\t\t\t\tthis.longClientId = longClientId;\n\t\t\t\tthis.clientNameToIds.put(longClientId, oldData);\n\t\t\t\tthis.shortClientIdMap[oldData] = longClientId;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Searches a string for the nearest marker in either direction to a given start position.\n\t * The search will include the start position, so markers at the start position are valid\n\t * results of the search. Makes use of block-accelerated search functions for log(n) complexity.\n\t *\n\t * @param startPos - Position at which to start the search\n\t * @param markerLabel - Label of the marker to search for\n\t * @param forwards - Whether the desired marker comes before (false) or after (true) `startPos`\n\t */\n\tsearchForMarker(startPos: number, markerLabel: string, forwards = true): Marker | undefined {\n\t\treturn this._mergeTree.searchForMarker(startPos, markerLabel, forwards);\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeTreeDeltaCallback.js","sourceRoot":"","sources":["../src/mergeTreeDeltaCallback.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAkBH;;;;;;GAMG;AACU,QAAA,wBAAwB,GAAG;IACvC;;;;;;OAMG;IACH,MAAM,EAAE,CAAC,CAAC;IACV;;;OAGG;IACH,KAAK,EAAE,CAAC,CAAC;IACT;;;;;OAKG;IACH,MAAM,EAAE,CAAC,CAAC;IACV;;;OAGG;IACH,YAAY,EAAE,CAAC,CAAC;CACP,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type { ISegment } from \"./mergeTreeNodes.js\";\n// eslint-disable-next-line import/no-deprecated\nimport type { IMergeTreeGroupMsg, IMergeTreeOp, MergeTreeDeltaType } from \"./ops.js\";\nimport type { PropertySet } from \"./properties.js\";\n\n/**\n * @legacy @beta\n */\nexport type MergeTreeDeltaOperationType =\n\t| typeof MergeTreeDeltaType.ANNOTATE\n\t| typeof MergeTreeDeltaType.INSERT\n\t| typeof MergeTreeDeltaType.REMOVE\n\t| typeof MergeTreeDeltaType.OBLITERATE;\n\n/**\n * Enum-like constant defining the types of \"maintenance\" events on a merge tree.\n * Maintenance events correspond to structural segment changes or acks of pending segments.\n *\n * Note: these values are assigned negative integers to avoid clashing with `MergeTreeDeltaType`.\n * @legacy @beta\n */\nexport const MergeTreeMaintenanceType = {\n\t/**\n\t * Notification that a segment \"append\" has occurred, i.e. two adjacent segments have been merged.\n\t * BEWARE: `deltaSegments` on the corresponding event will contain both the merged segment and the latter\n\t * segment, pre-merge.\n\t * For example, if the merge tree originally had two adjacent segments [A][B] and called A.append(B) to get\n\t * segment [AB], `deltaSegments` would contain [AB] and [B].\n\t */\n\tAPPEND: -1,\n\t/**\n\t * Notification that a segment has been split in two.\n\t * `deltaSegments` on the corresponding event will contain the resulting two segments.\n\t */\n\tSPLIT: -2,\n\t/**\n\t * Notification that a segment has been unlinked (i.e. removed) from the MergeTree.\n\t * This occurs on leaf segments during Zamboni when the segment's tracking collection is empty\n\t * (e.g., not being tracked for undo/redo).\n\t * It also occurs on internal merge tree segments when re-packing children to maintain tree balancing invariants.\n\t */\n\tUNLINK: -3,\n\t/**\n\t * Notification that a local change has been acknowledged by the server.\n\t * This means that it has made the round trip to the server and has had a sequence number assigned.\n\t */\n\tACKNOWLEDGED: -4,\n} as const;\n/**\n * @legacy @beta\n */\nexport type MergeTreeMaintenanceType =\n\t(typeof MergeTreeMaintenanceType)[keyof typeof MergeTreeMaintenanceType];\n\n/**\n * @legacy @beta\n */\nexport type MergeTreeDeltaOperationTypes =\n\t| MergeTreeDeltaOperationType\n\t| MergeTreeMaintenanceType;\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeDeltaCallbackArgs<\n\tTOperationType extends MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationType,\n> {\n\t/**\n\t * The type of operation that affected segments in the merge-tree.\n\t * The affected segments can be accessed via {@link IMergeTreeDeltaCallbackArgs.deltaSegments|deltaSegments}.\n\t *\n\t * See {@link MergeTreeDeltaOperationType} and {@link (MergeTreeMaintenanceType:type)} for possible values.\n\t */\n\treadonly operation: TOperationType;\n\n\t/**\n\t * A list of deltas describing actions taken on segments.\n\t *\n\t * Deltas are not guaranteed to be in any particular order.\n\t */\n\treadonly deltaSegments: IMergeTreeSegmentDelta[];\n}\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeSegmentDelta {\n\t/**\n\t * The segment this delta affected.\n\t */\n\tsegment: ISegment;\n\n\t/**\n\t * A property set containing changes to properties on this segment.\n\t *\n\t * @remarks Deleting a property is represented using `null` as the value.\n\t * @example\n\t *\n\t * An annotation change which deleted the property \"foo\" and set \"bar\" to 5 would be represented as:\n\t * `{ foo: null, bar: 5 }`.\n\t */\n\tpropertyDeltas?: PropertySet;\n}\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeDeltaOpArgs {\n\t/**\n\t * The group op which contains the operation\n\t * if there operation is part of a group op.\n\t */\n\t// eslint-disable-next-line import/no-deprecated\n\treadonly groupOp?: IMergeTreeGroupMsg;\n\n\t/**\n\t * The {@link IMergeTreeOp} corresponding to the delta.\n\t *\n\t * @remarks This is useful for determining the type of change (see {@link (MergeTreeDeltaType:type)}).\n\t */\n\treadonly op: IMergeTreeOp;\n\n\t/**\n\t * The {@link @fluidframework/protocol-definitions#ISequencedDocumentMessage} corresponding to this acknowledged change.\n\t *\n\t * This field is omitted for deltas corresponding to unacknowledged changes.\n\t */\n\treadonly sequencedMessage?: ISequencedDocumentMessage;\n\n\t/**\n\t * Set to true if this delta is being performed as part of a rollback of unsent local changes.\n\t */\n\treadonly rollback?: true;\n}\n\n/**\n * @internal\n */\nexport type MergeTreeDeltaCallback = (\n\topArgs: IMergeTreeDeltaOpArgs,\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n) => void;\n\n/**\n * @legacy @beta\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-empty-interface\nexport interface IMergeTreeMaintenanceCallbackArgs\n\textends IMergeTreeDeltaCallbackArgs<MergeTreeMaintenanceType> {}\n\n/**\n * @internal\n */\nexport type MergeTreeMaintenanceCallback = (\n\tMaintenanceArgs: IMergeTreeMaintenanceCallbackArgs,\n\topArgs: IMergeTreeDeltaOpArgs | undefined,\n) => void;\n"]}
|
|
1
|
+
{"version":3,"file":"mergeTreeDeltaCallback.js","sourceRoot":"","sources":["../src/mergeTreeDeltaCallback.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAkBH;;;;;;GAMG;AACU,QAAA,wBAAwB,GAAG;IACvC;;;;;;OAMG;IACH,MAAM,EAAE,CAAC,CAAC;IACV;;;OAGG;IACH,KAAK,EAAE,CAAC,CAAC;IACT;;;;;OAKG;IACH,MAAM,EAAE,CAAC,CAAC;IACV;;;OAGG;IACH,YAAY,EAAE,CAAC,CAAC;CACP,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type { ISegment } from \"./mergeTreeNodes.js\";\n// eslint-disable-next-line import-x/no-deprecated\nimport type { IMergeTreeGroupMsg, IMergeTreeOp, MergeTreeDeltaType } from \"./ops.js\";\nimport type { PropertySet } from \"./properties.js\";\n\n/**\n * @legacy @beta\n */\nexport type MergeTreeDeltaOperationType =\n\t| typeof MergeTreeDeltaType.ANNOTATE\n\t| typeof MergeTreeDeltaType.INSERT\n\t| typeof MergeTreeDeltaType.REMOVE\n\t| typeof MergeTreeDeltaType.OBLITERATE;\n\n/**\n * Enum-like constant defining the types of \"maintenance\" events on a merge tree.\n * Maintenance events correspond to structural segment changes or acks of pending segments.\n *\n * Note: these values are assigned negative integers to avoid clashing with `MergeTreeDeltaType`.\n * @legacy @beta\n */\nexport const MergeTreeMaintenanceType = {\n\t/**\n\t * Notification that a segment \"append\" has occurred, i.e. two adjacent segments have been merged.\n\t * BEWARE: `deltaSegments` on the corresponding event will contain both the merged segment and the latter\n\t * segment, pre-merge.\n\t * For example, if the merge tree originally had two adjacent segments [A][B] and called A.append(B) to get\n\t * segment [AB], `deltaSegments` would contain [AB] and [B].\n\t */\n\tAPPEND: -1,\n\t/**\n\t * Notification that a segment has been split in two.\n\t * `deltaSegments` on the corresponding event will contain the resulting two segments.\n\t */\n\tSPLIT: -2,\n\t/**\n\t * Notification that a segment has been unlinked (i.e. removed) from the MergeTree.\n\t * This occurs on leaf segments during Zamboni when the segment's tracking collection is empty\n\t * (e.g., not being tracked for undo/redo).\n\t * It also occurs on internal merge tree segments when re-packing children to maintain tree balancing invariants.\n\t */\n\tUNLINK: -3,\n\t/**\n\t * Notification that a local change has been acknowledged by the server.\n\t * This means that it has made the round trip to the server and has had a sequence number assigned.\n\t */\n\tACKNOWLEDGED: -4,\n} as const;\n/**\n * @legacy @beta\n */\nexport type MergeTreeMaintenanceType =\n\t(typeof MergeTreeMaintenanceType)[keyof typeof MergeTreeMaintenanceType];\n\n/**\n * @legacy @beta\n */\nexport type MergeTreeDeltaOperationTypes =\n\t| MergeTreeDeltaOperationType\n\t| MergeTreeMaintenanceType;\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeDeltaCallbackArgs<\n\tTOperationType extends MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationType,\n> {\n\t/**\n\t * The type of operation that affected segments in the merge-tree.\n\t * The affected segments can be accessed via {@link IMergeTreeDeltaCallbackArgs.deltaSegments|deltaSegments}.\n\t *\n\t * See {@link MergeTreeDeltaOperationType} and {@link (MergeTreeMaintenanceType:type)} for possible values.\n\t */\n\treadonly operation: TOperationType;\n\n\t/**\n\t * A list of deltas describing actions taken on segments.\n\t *\n\t * Deltas are not guaranteed to be in any particular order.\n\t */\n\treadonly deltaSegments: IMergeTreeSegmentDelta[];\n}\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeSegmentDelta {\n\t/**\n\t * The segment this delta affected.\n\t */\n\tsegment: ISegment;\n\n\t/**\n\t * A property set containing changes to properties on this segment.\n\t *\n\t * @remarks Deleting a property is represented using `null` as the value.\n\t * @example\n\t *\n\t * An annotation change which deleted the property \"foo\" and set \"bar\" to 5 would be represented as:\n\t * `{ foo: null, bar: 5 }`.\n\t */\n\tpropertyDeltas?: PropertySet;\n}\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeDeltaOpArgs {\n\t/**\n\t * The group op which contains the operation\n\t * if there operation is part of a group op.\n\t */\n\t// eslint-disable-next-line import-x/no-deprecated\n\treadonly groupOp?: IMergeTreeGroupMsg;\n\n\t/**\n\t * The {@link IMergeTreeOp} corresponding to the delta.\n\t *\n\t * @remarks This is useful for determining the type of change (see {@link (MergeTreeDeltaType:type)}).\n\t */\n\treadonly op: IMergeTreeOp;\n\n\t/**\n\t * The {@link @fluidframework/protocol-definitions#ISequencedDocumentMessage} corresponding to this acknowledged change.\n\t *\n\t * This field is omitted for deltas corresponding to unacknowledged changes.\n\t */\n\treadonly sequencedMessage?: ISequencedDocumentMessage;\n\n\t/**\n\t * Set to true if this delta is being performed as part of a rollback of unsent local changes.\n\t */\n\treadonly rollback?: true;\n}\n\n/**\n * @internal\n */\nexport type MergeTreeDeltaCallback = (\n\topArgs: IMergeTreeDeltaOpArgs,\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n) => void;\n\n/**\n * @legacy @beta\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-empty-interface\nexport interface IMergeTreeMaintenanceCallbackArgs\n\textends IMergeTreeDeltaCallbackArgs<MergeTreeMaintenanceType> {}\n\n/**\n * @internal\n */\nexport type MergeTreeMaintenanceCallback = (\n\tMaintenanceArgs: IMergeTreeMaintenanceCallbackArgs,\n\topArgs: IMergeTreeDeltaOpArgs | undefined,\n) => void;\n"]}
|
package/dist/opBuilder.js
CHANGED
|
@@ -88,7 +88,7 @@ exports.createRemoveRangeOp = createRemoveRangeOp;
|
|
|
88
88
|
*
|
|
89
89
|
* @internal
|
|
90
90
|
*/
|
|
91
|
-
// eslint-disable-next-line import/no-deprecated
|
|
91
|
+
// eslint-disable-next-line import-x/no-deprecated
|
|
92
92
|
function createObliterateRangeOp(start, end) {
|
|
93
93
|
return {
|
|
94
94
|
pos1: start,
|
|
@@ -156,7 +156,7 @@ exports.createInsertOp = createInsertOp;
|
|
|
156
156
|
*
|
|
157
157
|
* @internal
|
|
158
158
|
*/
|
|
159
|
-
// eslint-disable-next-line import/no-deprecated
|
|
159
|
+
// eslint-disable-next-line import-x/no-deprecated
|
|
160
160
|
function createGroupOp(...ops) {
|
|
161
161
|
return {
|
|
162
162
|
ops,
|
package/dist/opBuilder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opBuilder.js","sourceRoot":"","sources":["../src/opBuilder.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,qCAakB;AAElB,yDAA8E;AAE9E;;;;;;;GAOG;AACH,SAAgB,sBAAsB,CACrC,MAAc,EACd,KAAkB;IAElB,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,EAAE,CAAC;QACT,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,OAAO;QACN,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE;QACnB,YAAY,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QAClC,YAAY,EAAE,EAAE,EAAE,EAAE;QACpB,IAAI,EAAE,2BAAkB,CAAC,QAAQ;KACjC,CAAC;AACH,CAAC;AAfD,wDAeC;AAED;;;;;;;;GAQG;AACH,SAAgB,qBAAqB,CACpC,KAAa,EACb,GAAW,EACX,KAAkB;IAElB,OAAO;QACN,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE;QACnB,IAAI,EAAE,2BAAkB,CAAC,QAAQ;KACjC,CAAC;AACH,CAAC;AAXD,sDAWC;AAED;;;;;;;;GAQG;AACH,SAAgB,mBAAmB,CAClC,KAAa,EACb,GAAW,EACX,MAA6B;IAE7B,OAAO;QACN,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE;QACrB,IAAI,EAAE,2BAAkB,CAAC,QAAQ;KACjC,CAAC;AACH,CAAC;AAXD,kDAWC;AAED;;;;;;;GAOG;AACH,SAAgB,mBAAmB,CAAC,KAAa,EAAE,GAAW;IAC7D,OAAO;QACN,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,GAAG;QACT,IAAI,EAAE,2BAAkB,CAAC,MAAM;KAC/B,CAAC;AACH,CAAC;AAND,kDAMC;AAED;;;;;;;GAOG;AACH,
|
|
1
|
+
{"version":3,"file":"opBuilder.js","sourceRoot":"","sources":["../src/opBuilder.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\nimport type { ISegment, Marker } from \"./mergeTreeNodes.js\";\nimport {\n\ttype IMergeTreeAnnotateMsg,\n\ttype IMergeTreeDeltaOp,\n\t// eslint-disable-next-line import-x/no-deprecated\n\ttype IMergeTreeGroupMsg,\n\ttype IMergeTreeInsertMsg,\n\t// eslint-disable-next-line import-x/no-deprecated\n\ttype IMergeTreeObliterateMsg,\n\ttype IMergeTreeRemoveMsg,\n\tMergeTreeDeltaType,\n\ttype AdjustParams,\n\ttype IMergeTreeAnnotateAdjustMsg,\n\ttype IMergeTreeObliterateSidedMsg,\n} from \"./ops.js\";\nimport type { PropertySet, MapLike } from \"./properties.js\";\nimport { normalizePlace, Side, type SequencePlace } from \"./sequencePlace.js\";\n\n/**\n * Creates the op for annotating the markers with the provided properties\n * @param marker - The marker to annotate\n * @param props - The properties to annotate the marker with\n * @returns The annotate op\n *\n * @internal\n */\nexport function createAnnotateMarkerOp(\n\tmarker: Marker,\n\tprops: PropertySet,\n): IMergeTreeAnnotateMsg | undefined {\n\tconst id = marker.getId();\n\tif (!id) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tprops: { ...props },\n\t\trelativePos1: { id, before: true },\n\t\trelativePos2: { id },\n\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t};\n}\n\n/**\n * Creates the op for annotating the range with the provided properties\n * @param start - The inclusive start position of the range to annotate\n * @param end - The exclusive end position of the range to annotate\n * @param props - The properties to annotate the range with\n * @returns The annotate op\n *\n * @internal\n */\nexport function createAnnotateRangeOp(\n\tstart: number,\n\tend: number,\n\tprops: PropertySet,\n): IMergeTreeAnnotateMsg {\n\treturn {\n\t\tpos1: start,\n\t\tpos2: end,\n\t\tprops: { ...props },\n\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t};\n}\n\n/**\n * Creates the op for annotating the range with the provided properties\n * @param start - The inclusive start position of the range to annotate\n * @param end - The exclusive end position of the range to annotate\n * @param props - The properties to annotate the range with\n * @returns The annotate op\n *\n * @internal\n */\nexport function createAdjustRangeOp(\n\tstart: number,\n\tend: number,\n\tadjust: MapLike<AdjustParams>,\n): IMergeTreeAnnotateAdjustMsg {\n\treturn {\n\t\tpos1: start,\n\t\tpos2: end,\n\t\tadjust: { ...adjust },\n\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t};\n}\n\n/**\n * Creates the op to remove a range\n *\n * @param start - The inclusive start of the range to remove\n * @param end - The exclusive end of the range to remove\n *\n * @internal\n */\nexport function createRemoveRangeOp(start: number, end: number): IMergeTreeRemoveMsg {\n\treturn {\n\t\tpos1: start,\n\t\tpos2: end,\n\t\ttype: MergeTreeDeltaType.REMOVE,\n\t};\n}\n\n/**\n * Creates the op to obliterate a range\n *\n * @param start - The inclusive start of the range to obliterate\n * @param end - The exclusive end of the range to obliterate\n *\n * @internal\n */\n// eslint-disable-next-line import-x/no-deprecated\nexport function createObliterateRangeOp(start: number, end: number): IMergeTreeObliterateMsg {\n\treturn {\n\t\tpos1: start,\n\t\tpos2: end,\n\t\ttype: MergeTreeDeltaType.OBLITERATE,\n\t};\n}\n\n/**\n * Creates the op to obliterate a range\n *\n * @param start - The start of the range to obliterate.\n * If a number is provided, the range will start before that index.\n * @param end - The end of the range to obliterate.\n * If a number is provided, the range will end after that index -1.\n * This preserves the previous behavior of not expanding obliteration ranges at the endpoints\n * for uses which predate the availability of endpoint expansion.\n *\n * @internal\n */\nexport function createObliterateRangeOpSided(\n\tstart: SequencePlace,\n\tend: SequencePlace,\n): IMergeTreeObliterateSidedMsg {\n\tconst startPlace = normalizePlace(start);\n\t// If a number is provided, default to after the previous index.\n\t// This preserves the behavior of obliterate prior to the introduction of endpoint expansion.\n\tconst endPlace =\n\t\ttypeof end === \"number\"\n\t\t\t? { pos: end - 1, side: Side.After } // default to inclusive bounds\n\t\t\t: normalizePlace(end);\n\treturn {\n\t\ttype: MergeTreeDeltaType.OBLITERATE_SIDED,\n\t\tpos1: { pos: startPlace.pos, before: startPlace.side === Side.Before },\n\t\tpos2: { pos: endPlace.pos, before: endPlace.side === Side.Before },\n\t};\n}\n\n/**\n * Creates an op for inserting a segment at the specified position.\n *\n * @param pos - The position to insert the segment at\n * @param segment - The segment to insert\n *\n * @internal\n */\nexport function createInsertSegmentOp(pos: number, segment: ISegment): IMergeTreeInsertMsg {\n\treturn createInsertOp(pos, segment.toJSONObject());\n}\n\n/**\n * Creates the op for inserting a segment from its JSON representation at\n * the specified position.\n *\n * @internal\n */\nexport function createInsertOp(pos: number, segSpec: unknown): IMergeTreeInsertMsg {\n\treturn {\n\t\tpos1: pos,\n\t\tseg: segSpec,\n\t\ttype: MergeTreeDeltaType.INSERT,\n\t};\n}\n\n/**\n * Creates a group op from the provided ops.\n *\n * @param ops - The ops to group\n *\n * @internal\n */\n// eslint-disable-next-line import-x/no-deprecated\nexport function createGroupOp(...ops: IMergeTreeDeltaOp[]): IMergeTreeGroupMsg {\n\treturn {\n\t\tops,\n\t\ttype: MergeTreeDeltaType.GROUP,\n\t};\n}\n"]}
|
|
@@ -50,5 +50,20 @@ describe("client.applyMsg", () => {
|
|
|
50
50
|
node_assert_1.strict.equal(segCount, 2);
|
|
51
51
|
node_assert_1.strict.equal(segLen, 4);
|
|
52
52
|
});
|
|
53
|
+
it("Walk single multi-character segment", () => {
|
|
54
|
+
client.removeRangeLocal(0, client.getLength());
|
|
55
|
+
client.insertTextLocal(0, "Blocker");
|
|
56
|
+
client.annotateRangeLocal(0, 7, { bold: true });
|
|
57
|
+
let segCount = 0;
|
|
58
|
+
const segLengths = [];
|
|
59
|
+
client.walkSegments((s) => {
|
|
60
|
+
segCount++;
|
|
61
|
+
segLengths.push(s.cachedLength);
|
|
62
|
+
return true;
|
|
63
|
+
}, 0, client.getLength(), undefined, true);
|
|
64
|
+
node_assert_1.strict.equal(segCount, 1, `Expected one segment, saw ${segCount} segments`);
|
|
65
|
+
node_assert_1.strict.equal(segLengths.length, 1, `Expected one segment length, saw ${segLengths.length} lengths`);
|
|
66
|
+
node_assert_1.strict.equal(segLengths[0], 7, `Expected segment length 7, saw ${segLengths[0]}`);
|
|
67
|
+
});
|
|
53
68
|
});
|
|
54
69
|
//# sourceMappingURL=client.walkSegments.spec.js.map
|