@fluidframework/sequence 2.80.0 → 2.81.0-374083

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/IntervalCollectionValues.d.ts +1 -1
  2. package/dist/IntervalCollectionValues.d.ts.map +1 -1
  3. package/dist/IntervalCollectionValues.js.map +1 -1
  4. package/dist/intervalIndex/endpointInRangeIndex.d.ts +1 -1
  5. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  6. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
  7. package/dist/intervalIndex/endpointIndex.d.ts +1 -1
  8. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
  9. package/dist/intervalIndex/endpointIndex.js.map +1 -1
  10. package/dist/intervalIndex/idIntervalIndex.d.ts +2 -2
  11. package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  12. package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
  13. package/dist/intervalIndex/intervalIndex.d.ts +1 -1
  14. package/dist/intervalIndex/intervalIndex.d.ts.map +1 -1
  15. package/dist/intervalIndex/intervalIndex.js.map +1 -1
  16. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +1 -1
  17. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  18. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  19. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
  20. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  21. package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  22. package/dist/intervalIndex/startpointInRangeIndex.d.ts +1 -1
  23. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  24. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
  25. package/dist/packageVersion.d.ts +1 -1
  26. package/dist/packageVersion.d.ts.map +1 -1
  27. package/dist/packageVersion.js +1 -1
  28. package/dist/packageVersion.js.map +1 -1
  29. package/dist/sequence.d.ts +1 -1
  30. package/dist/sequence.d.ts.map +1 -1
  31. package/dist/sequence.js.map +1 -1
  32. package/dist/sharedSequence.d.ts.map +1 -1
  33. package/dist/sharedSequence.js +1 -0
  34. package/dist/sharedSequence.js.map +1 -1
  35. package/eslint.config.mts +7 -5
  36. package/lib/IntervalCollectionValues.d.ts +1 -1
  37. package/lib/IntervalCollectionValues.d.ts.map +1 -1
  38. package/lib/IntervalCollectionValues.js.map +1 -1
  39. package/lib/intervalIndex/endpointInRangeIndex.d.ts +1 -1
  40. package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  41. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
  42. package/lib/intervalIndex/endpointIndex.d.ts +1 -1
  43. package/lib/intervalIndex/endpointIndex.d.ts.map +1 -1
  44. package/lib/intervalIndex/endpointIndex.js.map +1 -1
  45. package/lib/intervalIndex/idIntervalIndex.d.ts +2 -2
  46. package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  47. package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
  48. package/lib/intervalIndex/intervalIndex.d.ts +1 -1
  49. package/lib/intervalIndex/intervalIndex.d.ts.map +1 -1
  50. package/lib/intervalIndex/intervalIndex.js.map +1 -1
  51. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +1 -1
  52. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  53. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  54. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
  55. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  56. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  57. package/lib/intervalIndex/startpointInRangeIndex.d.ts +1 -1
  58. package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  59. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
  60. package/lib/packageVersion.d.ts +1 -1
  61. package/lib/packageVersion.d.ts.map +1 -1
  62. package/lib/packageVersion.js +1 -1
  63. package/lib/packageVersion.js.map +1 -1
  64. package/lib/sequence.d.ts +1 -1
  65. package/lib/sequence.d.ts.map +1 -1
  66. package/lib/sequence.js.map +1 -1
  67. package/lib/sharedSequence.d.ts.map +1 -1
  68. package/lib/sharedSequence.js +1 -0
  69. package/lib/sharedSequence.js.map +1 -1
  70. package/package.json +21 -21
  71. package/src/IntervalCollectionValues.ts +1 -1
  72. package/src/intervalIndex/endpointInRangeIndex.ts +1 -1
  73. package/src/intervalIndex/endpointIndex.ts +1 -1
  74. package/src/intervalIndex/idIntervalIndex.ts +2 -2
  75. package/src/intervalIndex/intervalIndex.ts +1 -1
  76. package/src/intervalIndex/overlappingIntervalsIndex.ts +1 -1
  77. package/src/intervalIndex/sequenceIntervalIndexes.ts +1 -1
  78. package/src/intervalIndex/startpointInRangeIndex.ts +1 -1
  79. package/src/packageVersion.ts +1 -1
  80. package/src/sequence.ts +2 -2
  81. package/src/sharedSequence.ts +1 -0
  82. package/.eslintrc.cjs +0 -48
@@ -1 +1 @@
1
- {"version":3,"file":"sequence.js","sourceRoot":"","sources":["../src/sequence.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 { bufferToString } from \"@fluid-internal/client-utils\";\nimport { IEventThisPlaceHolder } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tClient,\n\tIJSONSegment,\n\tIMergeTreeAnnotateMsg,\n\tIMergeTreeDeltaOp,\n\t// eslint-disable-next-line import-x/no-deprecated\n\tIMergeTreeGroupMsg,\n\t// eslint-disable-next-line import-x/no-deprecated\n\tIMergeTreeObliterateMsg,\n\tIMergeTreeOp,\n\tIMergeTreeRemoveMsg,\n\tIRelativePosition,\n\tISegment,\n\tISegmentAction,\n\tLocalReferencePosition,\n\tMergeTreeDeltaType,\n\tMergeTreeRevertibleDriver,\n\tPropertySet,\n\tReferencePosition,\n\tReferenceType,\n\tSlidingPreference,\n\tcreateAnnotateRangeOp,\n\tcreateGroupOp,\n\tcreateInsertOp,\n\tcreateObliterateRangeOp,\n\tcreateRemoveRangeOp,\n\tmatchProperties,\n\ttype AdjustParams,\n\ttype InteriorSequencePlace,\n\ttype MapLike,\n} from \"@fluidframework/merge-tree/internal\";\nimport {\n\tISummaryTreeWithStats,\n\tITelemetryContext,\n\tIRuntimeMessageCollection,\n\tIRuntimeMessagesContent,\n\tISequencedMessageEnvelope,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport {\n\tObjectStoragePartition,\n\tSummaryTreeBuilder,\n} from \"@fluidframework/runtime-utils/internal\";\nimport {\n\tIFluidSerializer,\n\tISharedObjectEvents,\n\tSharedObject,\n\ttype ISharedObject,\n} from \"@fluidframework/shared-object-base/internal\";\nimport {\n\tLoggingError,\n\tcreateChildLogger,\n\tcreateConfigBasedOptionsProxy,\n\tloggerToMonitoringContext,\n} from \"@fluidframework/telemetry-utils/internal\";\nimport Deque from \"double-ended-queue\";\n\nimport { type ISequenceIntervalCollection } from \"./intervalCollection.js\";\nimport { IMapOperation, IntervalCollectionMap } from \"./intervalCollectionMap.js\";\nimport { type SequenceOptions } from \"./intervalCollectionMapInterfaces.js\";\nimport {\n\tSequenceDeltaEvent,\n\tSequenceDeltaEventClass,\n\tSequenceMaintenanceEvent,\n\tSequenceMaintenanceEventClass,\n} from \"./sequenceDeltaEvent.js\";\n\nconst snapshotFileName = \"header\";\nconst contentPath = \"content\";\n\n/**\n * Events emitted in response to changes to the sequence data.\n *\n * @remarks\n *\n * The following is the list of events emitted.\n *\n * ### \"sequenceDelta\"\n *\n * The sequenceDelta event is emitted when segments are inserted, annotated, or removed.\n *\n * #### Listener signature\n *\n * ```typescript\n * (event: SequenceDeltaEvent, target: IEventThisPlaceHolder) => void\n * ```\n * - `event` - Various information on the segments that were modified.\n *\n * - `target` - The sequence itself.\n *\n * ### \"maintenance\"\n *\n * The maintenance event is emitted when segments are modified during merge-tree maintenance.\n *\n * #### Listener signature\n *\n * ```typescript\n * (event: SequenceMaintenanceEvent, target: IEventThisPlaceHolder) => void\n * ```\n * - `event` - Various information on the segments that were modified.\n *\n * - `target` - The sequence itself.\n * @legacy @beta\n */\nexport interface ISharedSegmentSequenceEvents extends ISharedObjectEvents {\n\t(\n\t\tevent: \"createIntervalCollection\",\n\t\tlistener: (label: string, local: boolean, target: IEventThisPlaceHolder) => void,\n\t): void;\n\t(\n\t\tevent: \"sequenceDelta\",\n\t\tlistener: (event: SequenceDeltaEvent, target: IEventThisPlaceHolder) => void,\n\t): void;\n\t(\n\t\tevent: \"maintenance\",\n\t\tlistener: (event: SequenceMaintenanceEvent, target: IEventThisPlaceHolder) => void,\n\t): void;\n}\n\n/**\n * @legacy @beta\n */\nexport interface ISharedSegmentSequence<T extends ISegment>\n\textends ISharedObject<ISharedSegmentSequenceEvents>,\n\t\tMergeTreeRevertibleDriver {\n\t/**\n\t * Creates a `LocalReferencePosition` on this SharedString. If the refType does not include\n\t * ReferenceType.Transient, 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 */\n\tcreateLocalReferencePosition(\n\t\tsegment: T,\n\t\toffset: number,\n\t\trefType: ReferenceType,\n\t\tproperties: PropertySet | undefined,\n\t\tslidingPreference?: SlidingPreference,\n\t\tcanSlideToEndpoint?: boolean,\n\t): LocalReferencePosition;\n\n\t/**\n\t * Removes a `LocalReferencePosition` from this SharedString.\n\t */\n\tremoveLocalReferencePosition(\n\t\tlref: LocalReferencePosition,\n\t): LocalReferencePosition | undefined;\n\n\t/**\n\t * Returns the length of the current sequence for the client\n\t */\n\tgetLength(): number;\n\n\t/**\n\t * Returns the current position of a segment, and -1 if the segment\n\t * does not exist in this sequence\n\t * @param segment - The segment to get the position of\n\t */\n\tgetPosition(segment: ISegment): number;\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 `ReferenceType`. To handle this case specifically, one may wish\n\t * to look at the segment returned by `ReferencePosition.getSegment`.\n\t */\n\tlocalReferencePositionToPosition(lref: ReferencePosition): number;\n\n\t/**\n\t * Walk the underlying segments of the sequence.\n\t * The walked segments may extend beyond the range if the segments cross the\n\t * ranges start or end boundaries.\n\t *\n\t * Set split range to true to ensure only segments within the range are walked.\n\t *\n\t * @param handler - The function to handle each segment. Traversal ends if\n\t * this function returns true.\n\t * @param start - Optional. The start of range walk.\n\t * @param end - Optional. The end of range walk\n\t * @param accum - Optional. An object that will be passed to the handler for accumulation\n\t * @param splitRange - Optional. Splits boundary segments on the range boundaries. Defaults to false.\n\t */\n\twalkSegments<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\tstart?: number,\n\t\tend?: number,\n\t\taccum?: TClientData,\n\t\tsplitRange?: boolean,\n\t): void;\n\n\t/**\n\t * Inserts a segment directly before a `ReferencePosition`.\n\t * @param refPos - The reference position to insert the segment at\n\t * @param segment - The segment to insert\n\t */\n\tinsertAtReferencePosition(pos: ReferencePosition, segment: T): void;\n\n\t/**\n\t * Finds the segment information (i.e. segment + offset) corresponding to a character position in the SharedString.\n\t * If the position is past the end of the string, `segment` and `offset` on the returned object may be undefined.\n\t * @param pos - Character position (index) into the current local view of the SharedString.\n\t */\n\tgetContainingSegment(pos: number): {\n\t\tsegment: T | undefined;\n\t\toffset: number | undefined;\n\t};\n\n\tgetPropertiesAtPosition(pos: number): PropertySet | undefined;\n\n\t/**\n\t * @returns An iterable object that enumerates the IntervalCollection labels.\n\t *\n\t * @example\n\t *\n\t * ```typescript\n\t * const iter = this.getIntervalCollectionKeys();\n\t * for (key of iter)\n\t * const collection = this.getIntervalCollection(key);\n\t * ...\n\t * ```\n\t */\n\tgetIntervalCollectionLabels(): IterableIterator<string>;\n\n\t/**\n\t * Retrieves the interval collection keyed on `label`. If no such interval collection exists,\n\t * creates one.\n\t */\n\tgetIntervalCollection(label: string): ISequenceIntervalCollection;\n\n\t/**\n\t * Obliterate is similar to remove, but differs in that segments concurrently\n\t * inserted into an obliterated range will also be removed.\n\t * Inserts are considered concurrent to an obliterate iff the insert op's seq is after the obliterate op's refSeq\n\t * and the insert's refSeq is before the obliterates seq.\n\t * Inserts made by the client which most recently obliterated a range containing the insert position\n\t * are not considered concurrent to any obliteration (the last client to obliterate gets the right to insert).\n\t *\n\t * The endpoints can either be inclusive or exclusive.\n\t * Exclusive endpoints allow the obliterated range to \"grow\" to include adjacent concurrently inserted segments on that side.\n\t *\n\t * @param start - The start of the range to obliterate.\n\t * Inclusive if side is Before or a number is provided.\n\t * @param end - The end of the range to obliterate. Inclusive if side is After.\n\t * If a number is provided it is treated as exclusive,\n\t * but the endpoint does not expand in order to preserve existing behavior.\n\t *\n\t * @example Given the initial state `\"|ABC>\"`,\n\t * `obliterateRange({ pos: 0, side: Side.After }, { pos: 4, side: Side.Before })` obliterates `\"ABC\"`, leaving only `\"|>\"`.\n\t * `insertFromSpec(1, { text: \"AAA\"})` would insert `\"AAA\"` before |, resulting in `\"|AAA>\"`.\n\t * If another client does the same thing but inserts `\"BBB\"` and gets sequenced later, all clients will eventually see `|BBB>`.\n\t */\n\tobliterateRange(\n\t\tstart: number | InteriorSequencePlace,\n\t\tend: number | InteriorSequencePlace,\n\t): void;\n\n\t/**\n\t * @returns The most recent sequence number which has been acked by the server and processed by this\n\t * SharedSegmentSequence.\n\t */\n\tgetCurrentSeq(): number;\n\n\t/**\n\t * Annotates the range with the provided properties\n\t *\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 *\n\t */\n\tannotateRange(start: number, end: number, props: PropertySet): void;\n\n\t/**\n\t * Annotates a specified range within the sequence by applying the provided adjustments.\n\t *\n\t * @param start - The inclusive start position of the range to annotate. This is a zero-based index.\n\t * @param end - The exclusive end position of the range to annotate. This is a zero-based index.\n\t * @param adjust - A map-like object specifying the properties to adjust. Each key-value pair represents a property and its corresponding adjustment to be applied over the range.\n\t * An adjustment is defined by an object containing a `delta` to be added to the current property value, and optional `min` and `max` constraints to limit the adjusted value.\n\t *\n\t * @remarks\n\t * The range is defined by the start and end positions, where the start position is inclusive and the end position is exclusive.\n\t * The properties provided in the adjust parameter will be applied to the specified range. Each adjustment modifies the current value of the property by adding the specified `value`.\n\t * If the current value is not a number, the `delta` will be summed with 0 to compute the new value. The optional `min` and `max` constraints are applied after the adjustment to ensure the final value falls within the specified bounds.\n\t */\n\tannotateAdjustRange(start: number, end: number, adjust: MapLike<AdjustParams>): void;\n\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\tremoveRange(start: number, end: number): void;\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. The client ref seq must be above the minimum sequence number\n\t * or the return value will be undefined.\n\t * Generally this method is used in conjunction with signals which provide\n\t * point in time values for the below parameters, and is useful for things\n\t * like displaying user position. It should not be used with persisted values\n\t * as persisted values will quickly become invalid as the remoteClientRefSeq\n\t * moves below the minimum sequence number\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\tresolveRemoteClientPosition(\n\t\tremoteClientPosition: number,\n\t\tremoteClientRefSeq: number,\n\t\tremoteClientId: string,\n\t): number | undefined;\n\n\t// #region APIs we might want to remove\n\t/**\n\t * Initializes the object as a local, non-shared object. This object can become shared after\n\t * it is attached to the document.\n\t * @privateRemarks\n\t * TODO: determine if this API (from SharedObject) is needed by users of the encapsulated API, declarative API or both,\n\t * and handle exposing it in a consistent way for all SharedObjects if needed.\n\t */\n\tinitializeLocal(): void;\n\n\t/**\n\t * @deprecated The ability to create group ops will be removed in an upcoming\n\t * release, as group ops are redundant with the native batching capabilities\n\t * of the runtime\n\t */\n\t// eslint-disable-next-line import-x/no-deprecated\n\tgroupOperation(groupOp: IMergeTreeGroupMsg): void;\n\n\tgetRangeExtentsOfPosition(pos: number): {\n\t\tposStart: number | undefined;\n\t\tposAfterEnd: number | undefined;\n\t};\n\n\t/**\n\t * Inserts a segment\n\t * @param start - The position to insert the segment at\n\t * @param spec - The segment to inserts spec\n\t */\n\tinsertFromSpec(pos: number, spec: IJSONSegment): void;\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\tposFromRelativePos(relativePos: IRelativePosition): number;\n\n\t// #endregion\n}\n\n/**\n * @internal\n */\nexport abstract class SharedSegmentSequence<T extends ISegment>\n\textends SharedObject<ISharedSegmentSequenceEvents>\n\timplements ISharedSegmentSequence<T>\n{\n\t/**\n\t * This is a safeguard to avoid problematic reentrancy of local ops. This type of scenario occurs if the user of SharedString subscribes\n\t * to the `sequenceDelta` event and uses the callback for a local op to submit further local ops.\n\t * Historically (before 2.0.0-internal.6.1.0), doing so would result in eventual consistency issues or a corrupted document.\n\t * These issues were fixed in #16815 which makes such reentrancy no different from applying the ops in order but not from within the change events,\n\t * but there is still little test coverage for reentrant scenarios.\n\t * Additionally, applications submitting ops from inside change events need to take extreme care that their data models also support reentrancy.\n\t * Since this is likely not the case, by default SharedString throws when encountering reentrant ops.\n\t *\n\t * An application using SharedString which explicitly wants to opt in to allowing reentrancy anyway can set `sharedStringPreventReentrancy`\n\t * on the data store options to `false`.\n\t */\n\tprotected guardReentrancy: <TRet>(callback: () => TRet) => TRet;\n\n\tprivate static createOpsFromDelta(event: SequenceDeltaEvent): IMergeTreeDeltaOp[] {\n\t\tconst ops: IMergeTreeDeltaOp[] = [];\n\t\tfor (const r of event.ranges) {\n\t\t\tswitch (event.deltaOperation) {\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\t\tconst lastAnnotate = ops[ops.length - 1] as IMergeTreeAnnotateMsg;\n\t\t\t\t\tconst props: PropertySet = {};\n\t\t\t\t\tfor (const key of Object.keys(r.propertyDeltas)) {\n\t\t\t\t\t\tprops[key] = r.segment.properties?.[key] ?? null;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tlastAnnotate &&\n\t\t\t\t\t\tlastAnnotate.pos2 === r.position &&\n\t\t\t\t\t\tmatchProperties(lastAnnotate.props, props)\n\t\t\t\t\t) {\n\t\t\t\t\t\tlastAnnotate.pos2 += r.segment.cachedLength;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tops.push(\n\t\t\t\t\t\t\tcreateAnnotateRangeOp(r.position, r.position + r.segment.cachedLength, props),\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\n\t\t\t\tcase MergeTreeDeltaType.INSERT:\n\t\t\t\t\tops.push(createInsertOp(r.position, r.segment.clone().toJSONObject()));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\t\tconst lastRem = ops[ops.length - 1] as IMergeTreeRemoveMsg;\n\t\t\t\t\tif (lastRem?.pos1 === r.position) {\n\t\t\t\t\t\tassert(lastRem.pos2 !== undefined, 0x3ff /* pos2 should not be undefined here */);\n\t\t\t\t\t\tlastRem.pos2 += r.segment.cachedLength;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tops.push(createRemoveRangeOp(r.position, r.position + r.segment.cachedLength));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase MergeTreeDeltaType.OBLITERATE: {\n\t\t\t\t\t// eslint-disable-next-line import-x/no-deprecated\n\t\t\t\t\tconst lastRem = ops[ops.length - 1] as IMergeTreeObliterateMsg;\n\t\t\t\t\tif (lastRem?.pos1 === r.position) {\n\t\t\t\t\t\tassert(lastRem.pos2 !== undefined, 0x874 /* pos2 should not be undefined here */);\n\t\t\t\t\t\tlastRem.pos2 += r.segment.cachedLength;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tops.push(createObliterateRangeOp(r.position, r.position + r.segment.cachedLength));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t}\n\t\t}\n\t\treturn ops;\n\t}\n\n\t/**\n\t * Note: this field only provides a lower-bound on the reference sequence numbers for in-flight ops.\n\t * The exact reason isn't understood, but some e2e tests suggest that the runtime may sometimes process\n\t * incoming leave/join ops before putting an op that this DDS submits over the wire.\n\t *\n\t * E.g. SharedString submits an op while deltaManager has lastSequenceNumber = 10, but before the runtime\n\t * puts this op over the wire, it processes a client join/leave op with sequence number 11, so the referenceSequenceNumber\n\t * on the SharedString op is 11.\n\t *\n\t * The reference sequence numbers placed in this queue are also not accurate for stashed ops due to how the applyStashedOp\n\t * flow works at the runtime level. This is a legitimate bug, and AB#6602 tracks one way to fix it (stop reaching all the way\n\t * to deltaManager's lastSequenceNumber to obtain refSeq, instead leveraging some analogous notion on the container or datastore\n\t * runtime).\n\t */\n\tprivate readonly inFlightRefSeqs = new Deque<number>();\n\n\tprivate ongoingResubmitRefSeq: number | undefined;\n\n\t/**\n\t * Gets the reference sequence number (i.e. sequence number of the runtime's last processed op) for an op submitted\n\t * in the current context.\n\t *\n\t * This value can be optionally overridden using `useResubmitRefSeq`.\n\t * IntervalCollection's resubmit logic currently relies on preserving merge information from when the op was originally submitted,\n\t * even if the op is resubmitted more than once. Thus during resubmit, `inFlightRefSeqs` gets populated with the\n\t * original refSeq rather than the refSeq at the time of reconnection.\n\t *\n\t * @remarks In some not fully understood cases, the runtime may process incoming ops before putting an op that this\n\t * DDS submits over the wire. See `inFlightRefSeqs` for more details.\n\t */\n\tprivate get currentRefSeq() {\n\t\treturn this.ongoingResubmitRefSeq ?? this.deltaManager.lastSequenceNumber;\n\t}\n\n\tprotected client: Client;\n\tprivate messagesSinceMSNChange: ISequencedDocumentMessage[] = [];\n\tprivate readonly intervalCollections: IntervalCollectionMap;\n\tconstructor(\n\t\tdataStoreRuntime: IFluidDataStoreRuntime,\n\t\tpublic id: string,\n\t\tattributes: IChannelAttributes,\n\t\tpublic readonly segmentFromSpec: (spec: IJSONSegment) => ISegment,\n\t) {\n\t\tsuper(id, dataStoreRuntime, attributes, \"fluid_sequence_\");\n\n\t\tconst getMinInFlightRefSeq = () => this.inFlightRefSeqs.get(0);\n\t\tthis.guardReentrancy =\n\t\t\t(dataStoreRuntime.options.sharedStringPreventReentrancy ?? true)\n\t\t\t\t? ensureNoReentrancy\n\t\t\t\t: createReentrancyDetector((depth) => {\n\t\t\t\t\t\tif (totalReentrancyLogs > 0) {\n\t\t\t\t\t\t\ttotalReentrancyLogs--;\n\t\t\t\t\t\t\tthis.logger.sendTelemetryEvent(\n\t\t\t\t\t\t\t\t{ eventName: \"LocalOpReentry\", depth },\n\t\t\t\t\t\t\t\tnew LoggingError(reentrancyErrorMessage),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\tconst options = createConfigBasedOptionsProxy<SequenceOptions>(\n\t\t\tloggerToMonitoringContext(this.logger).config,\n\t\t\t\"Fluid.Sequence\",\n\t\t\t{\n\t\t\t\tmergeTreeEnableObliterate: (c, n) => c.getBoolean(n),\n\t\t\t\tmergeTreeEnableSidedObliterate: (c, n) => c.getBoolean(n),\n\t\t\t\tintervalStickinessEnabled: (c, n) => c.getBoolean(n),\n\t\t\t\tmergeTreeReferencesCanSlideToEndpoint: (c, n) => c.getBoolean(n),\n\t\t\t\tmergeTreeEnableAnnotateAdjust: (c, n) => c.getBoolean(n),\n\t\t\t},\n\t\t\tdataStoreRuntime.options,\n\t\t);\n\n\t\tthis.client = new Client(\n\t\t\tsegmentFromSpec,\n\t\t\tcreateChildLogger({\n\t\t\t\tlogger: this.logger,\n\t\t\t\tnamespace: \"SharedSegmentSequence.MergeTreeClient\",\n\t\t\t}),\n\t\t\toptions,\n\t\t\tgetMinInFlightRefSeq,\n\t\t);\n\n\t\tthis.client.prependListener(\"delta\", (opArgs, deltaArgs) => {\n\t\t\tconst event = new SequenceDeltaEventClass(opArgs, deltaArgs, this.client);\n\t\t\tif (event.isLocal && event.opArgs.rollback !== true) {\n\t\t\t\tthis.submitSequenceMessage(opArgs.op);\n\t\t\t}\n\t\t\tif (deltaArgs.deltaSegments.length > 0) {\n\t\t\t\tthis.emit(\"sequenceDelta\", event, this);\n\t\t\t}\n\t\t});\n\n\t\tthis.client.on(\"maintenance\", (args, opArgs) => {\n\t\t\tthis.emit(\n\t\t\t\t\"maintenance\",\n\t\t\t\tnew SequenceMaintenanceEventClass(opArgs, args, this.client),\n\t\t\t\tthis,\n\t\t\t);\n\t\t});\n\n\t\tthis.intervalCollections = new IntervalCollectionMap(\n\t\t\tthis.serializer,\n\t\t\tthis.handle,\n\t\t\t(op, localOpMetadata) => {\n\t\t\t\tif (!this.isAttached()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.inFlightRefSeqs.push(this.currentRefSeq);\n\t\t\t\tthis.submitLocalMessage(op, localOpMetadata);\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\tpublic removeRange(start: number, end: number): void {\n\t\tthis.guardReentrancy(() => this.client.removeRangeLocal(start, end));\n\t}\n\n\tpublic obliterateRange(\n\t\tstart: number | InteriorSequencePlace,\n\t\tend: number | InteriorSequencePlace,\n\t): void {\n\t\tthis.guardReentrancy(() => this.client.obliterateRangeLocal(start, end));\n\t}\n\n\t// eslint-disable-next-line import-x/no-deprecated\n\tpublic groupOperation(groupOp: IMergeTreeGroupMsg): void {\n\t\tthis.guardReentrancy(() => this.client.localTransaction(groupOp));\n\t}\n\n\tpublic getContainingSegment(pos: number): {\n\t\tsegment: T | undefined;\n\t\toffset: number | undefined;\n\t} {\n\t\treturn (\n\t\t\tthis.client.getContainingSegment<T>(pos) ?? { segment: undefined, offset: undefined }\n\t\t);\n\t}\n\n\tpublic getLength(): number {\n\t\treturn this.client.getLength();\n\t}\n\n\tpublic getPosition(segment: ISegment): number {\n\t\treturn this.client.getPosition(segment);\n\t}\n\n\tpublic annotateRange(start: number, end: number, props: PropertySet): void {\n\t\tthis.guardReentrancy(() => this.client.annotateRangeLocal(start, end, props));\n\t}\n\n\tpublic annotateAdjustRange(start: number, end: number, adjust: MapLike<AdjustParams>): void {\n\t\tthis.guardReentrancy(() => this.client.annotateAdjustRangeLocal(start, end, adjust));\n\t}\n\n\tpublic getPropertiesAtPosition(pos: number): PropertySet | undefined {\n\t\treturn this.client.getPropertiesAtPosition(pos);\n\t}\n\n\tpublic getRangeExtentsOfPosition(pos: number): {\n\t\tposStart: number | undefined;\n\t\tposAfterEnd: number | undefined;\n\t} {\n\t\treturn this.client.getRangeExtentsOfPosition(pos);\n\t}\n\n\tpublic createLocalReferencePosition(\n\t\tsegment: T,\n\t\toffset: number,\n\t\trefType: ReferenceType,\n\t\tproperties: PropertySet | undefined,\n\t\tslidingPreference?: SlidingPreference,\n\t\tcanSlideToEndpoint?: boolean,\n\t): LocalReferencePosition {\n\t\treturn this.client.createLocalReferencePosition(\n\t\t\tsegment,\n\t\t\toffset,\n\t\t\trefType,\n\t\t\tproperties,\n\t\t\tslidingPreference,\n\t\t\tcanSlideToEndpoint,\n\t\t);\n\t}\n\n\tpublic localReferencePositionToPosition(lref: ReferencePosition): number {\n\t\treturn this.client.localReferencePositionToPosition(lref);\n\t}\n\n\tpublic removeLocalReferencePosition(\n\t\tlref: LocalReferencePosition,\n\t): LocalReferencePosition | undefined {\n\t\treturn this.client.removeLocalReferencePosition(lref);\n\t}\n\n\tpublic resolveRemoteClientPosition(\n\t\tremoteClientPosition: number,\n\t\tremoteClientRefSeq: number,\n\t\tremoteClientId: string,\n\t): number | undefined {\n\t\treturn this.client.resolveRemoteClientPosition(\n\t\t\tremoteClientPosition,\n\t\t\tremoteClientRefSeq,\n\t\t\tremoteClientId,\n\t\t);\n\t}\n\n\tprivate submitSequenceMessage(message: IMergeTreeOp) {\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.inFlightRefSeqs.push(this.currentRefSeq);\n\n\t\tconst metadata = this.client.peekPendingSegmentGroups(\n\t\t\tmessage.type === MergeTreeDeltaType.GROUP ? message.ops.length : 1,\n\t\t);\n\n\t\tthis.submitLocalMessage(message, metadata);\n\t}\n\n\tpublic posFromRelativePos(relativePos: IRelativePosition): number {\n\t\treturn this.client.posFromRelativePos(relativePos);\n\t}\n\n\tpublic walkSegments<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\tstart?: number,\n\t\tend?: number,\n\t\taccum?: TClientData,\n\t\tsplitRange: boolean = false,\n\t): void {\n\t\tthis.client.walkSegments(handler, start, end, accum as TClientData, splitRange);\n\t}\n\n\tpublic getCurrentSeq(): number {\n\t\treturn this.client.getCurrentSeq();\n\t}\n\n\tpublic insertAtReferencePosition(pos: ReferencePosition, segment: T): void {\n\t\tthis.guardReentrancy(() => this.client.insertAtReferencePositionLocal(pos, segment));\n\t}\n\n\tpublic insertFromSpec(pos: number, spec: IJSONSegment): void {\n\t\tconst segment = this.segmentFromSpec(spec);\n\t\tthis.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));\n\t}\n\n\tpublic getIntervalCollection(label: string): ISequenceIntervalCollection {\n\t\treturn this.intervalCollections.get(label);\n\t}\n\n\tpublic getIntervalCollectionLabels(): IterableIterator<string> {\n\t\treturn this.intervalCollections.keys();\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.summarizeCore}\n\t */\n\tprotected summarizeCore(\n\t\tserializer: IFluidSerializer,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): ISummaryTreeWithStats {\n\t\tconst builder = new SummaryTreeBuilder();\n\n\t\t// conditionally write the interval collection blob\n\t\t// only if it has entries\n\t\tif (this.intervalCollections.size > 0) {\n\t\t\tbuilder.addBlob(snapshotFileName, this.intervalCollections.serialize(serializer));\n\t\t}\n\n\t\tbuilder.addWithStats(contentPath, this.summarizeMergeTree(serializer));\n\n\t\treturn builder.getSummaryTree();\n\t}\n\n\t/**\n\t * Runs serializer over the GC data for this SharedMatrix.\n\t * All the IFluidHandle's represent routes to other objects.\n\t */\n\tprotected processGCDataCore(serializer: IFluidSerializer) {\n\t\tif (this.intervalCollections.size > 0) {\n\t\t\tthis.intervalCollections.serialize(serializer);\n\t\t}\n\n\t\tthis.client.serializeGCData(this.handle, serializer);\n\t}\n\n\t/**\n\t * Replace the range specified from start to end with the provided segment\n\t * This is done by inserting the segment at the end of the range, followed\n\t * by removing the contents of the range\n\t * For a zero or reverse range (start \\>= end), insert at end do not remove anything\n\t * @param start - The start of the range to replace\n\t * @param end - The end of the range to replace\n\t * @param segment - The segment that will replace the range\n\t */\n\tprotected replaceRange(start: number, end: number, segment: ISegment): void {\n\t\t// Insert at the max end of the range when start > end, but still remove the range later\n\t\tconst insertIndex: number = Math.max(start, end);\n\n\t\t// Insert first, so local references can slide to the inserted seg if any\n\t\tconst insert = this.guardReentrancy(() =>\n\t\t\tthis.client.insertSegmentLocal(insertIndex, segment),\n\t\t);\n\n\t\tif (insert && start < end) {\n\t\t\tthis.removeRange(start, end);\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.onConnect}\n\t */\n\tprotected onConnect() {\n\t\t// Update merge tree collaboration information with new client ID and then resend pending ops\n\t\tthis.client.startOrUpdateCollaboration(this.runtime.clientId);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.onDisconnect}\n\t */\n\tprotected onDisconnect() {}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.reSubmitCore}\n\t */\n\tprotected reSubmitCore(content: any, localOpMetadata: unknown, squash: boolean = false) {\n\t\tconst originalRefSeq = this.inFlightRefSeqs.shift();\n\t\tassert(\n\t\t\toriginalRefSeq !== undefined,\n\t\t\t0x8bb /* Expected a recorded refSeq when resubmitting an op */,\n\t\t);\n\t\tthis.useResubmitRefSeq(originalRefSeq, () => {\n\t\t\tif (!this.intervalCollections.tryResubmitMessage(content, localOpMetadata, squash)) {\n\t\t\t\tthis.submitSequenceMessage(\n\t\t\t\t\tthis.client.regeneratePendingOp(content as IMergeTreeOp, localOpMetadata, squash),\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected reSubmitSquashed(content: unknown, localOpMetadata: unknown): void {\n\t\tthis.reSubmitCore(content, localOpMetadata, true);\n\t}\n\n\t/**\n\t * Revert an op\n\t */\n\tprotected rollback(content: any, localOpMetadata: unknown): void {\n\t\tconst originalRefSeq = this.inFlightRefSeqs.pop();\n\t\tassert(\n\t\t\toriginalRefSeq !== undefined,\n\t\t\t0xb7f /* Expected a recorded refSeq when rolling back an op */,\n\t\t);\n\n\t\tif (!this.intervalCollections.tryRollback(content, localOpMetadata)) {\n\t\t\tthis.client.rollback(content, localOpMetadata);\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService) {\n\t\tif (await storage.contains(snapshotFileName)) {\n\t\t\tconst blob = await storage.readBlob(snapshotFileName);\n\t\t\tconst header = bufferToString(blob, \"utf8\");\n\t\t\tthis.intervalCollections.populate(header);\n\t\t}\n\n\t\ttry {\n\t\t\t// this will load the header, and return a promise\n\t\t\t// that will resolve when the body is loaded\n\t\t\t// and the catchup ops are available.\n\t\t\tconst { catchupOpsP } = await this.client.load(\n\t\t\t\tthis.runtime,\n\t\t\t\tnew ObjectStoragePartition(storage, contentPath),\n\t\t\t\tthis.serializer,\n\t\t\t);\n\n\t\t\t// process the catch up ops, and finishing the loading process\n\t\t\t(await catchupOpsP).forEach((m) => {\n\t\t\t\tconst collabWindow = this.client.getCollabWindow();\n\t\t\t\tif (\n\t\t\t\t\tm.minimumSequenceNumber < collabWindow.minSeq ||\n\t\t\t\t\tm.referenceSequenceNumber < collabWindow.minSeq ||\n\t\t\t\t\tm.sequenceNumber <= collabWindow.minSeq ||\n\t\t\t\t\t// sequenceNumber could be the same if messages are part of a grouped batch\n\t\t\t\t\tm.sequenceNumber < collabWindow.currentSeq\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Invalid catchup operations in snapshot: ${JSON.stringify({\n\t\t\t\t\t\t\top: {\n\t\t\t\t\t\t\t\tseq: m.sequenceNumber,\n\t\t\t\t\t\t\t\tminSeq: m.minimumSequenceNumber,\n\t\t\t\t\t\t\t\trefSeq: m.referenceSequenceNumber,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcollabWindow: {\n\t\t\t\t\t\t\t\tseq: collabWindow.currentSeq,\n\t\t\t\t\t\t\t\tminSeq: collabWindow.minSeq,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.processMergeTreeMsg(m);\n\t\t\t});\n\n\t\t\t// Initialize the interval collections\n\t\t\tthis.initializeIntervalCollections();\n\t\t} catch (error) {\n\t\t\tthis.logger.sendErrorEvent({ eventName: \"SequenceLoadFailed\" }, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}\n\t */\n\tprotected processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {\n\t\tconst { envelope, local, messagesContent } = messagesCollection;\n\t\tfor (const messageContent of messagesContent) {\n\t\t\tthis.processMessage(envelope, messageContent, local);\n\t\t}\n\t}\n\n\tprivate processMessage(\n\t\tmessageEnvelope: ISequencedMessageEnvelope,\n\t\tmessageContent: IRuntimeMessagesContent,\n\t\tlocal: boolean,\n\t): void {\n\t\t// Reconstruct ISequencedDocumentMessage which is needed by merge tree client\n\t\tconst message: ISequencedDocumentMessage = {\n\t\t\t...messageEnvelope,\n\t\t\tcontents: messageContent.contents,\n\t\t\tclientSequenceNumber: messageContent.clientSequenceNumber,\n\t\t};\n\n\t\tif (local) {\n\t\t\tconst recordedRefSeq = this.inFlightRefSeqs.shift();\n\t\t\tassert(recordedRefSeq !== undefined, 0x8bc /* No pending recorded refSeq found */);\n\t\t\t// TODO: AB#7076: Some equivalent assert should be enabled. This fails some e2e stashed op tests because\n\t\t\t// the deltaManager may have seen more messages than the runtime has processed while amidst the stashed op\n\t\t\t// flow, so e.g. when `applyStashedOp` is called and the DDS is put in a state where it expects an ack for\n\t\t\t// one of its messages, the delta manager has actually already seen subsequent messages from collaborators\n\t\t\t// which the in-flight message is concurrent to.\n\t\t\t// See \"handles stashed ops created on top of sequenced local ops\" for one such test case.\n\t\t\t// assert(recordedRefSeq <= message.referenceSequenceNumber, \"RefSeq mismatch\");\n\t\t}\n\n\t\tassert(\n\t\t\tmessage.type === MessageType.Operation,\n\t\t\t0x073 /* \"Sequence message not operation\" */,\n\t\t);\n\n\t\tconst handled = this.intervalCollections.tryProcessMessage(\n\t\t\tmessage.contents as IMapOperation,\n\t\t\tlocal,\n\t\t\tmessage,\n\t\t\tmessageContent.localOpMetadata,\n\t\t);\n\n\t\tif (!handled) {\n\t\t\tthis.processMergeTreeMsg(message, local);\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.didAttach}\n\t */\n\tprotected didAttach() {\n\t\t// If we are not local, and we've attached we need to start generating and sending ops\n\t\t// so start collaboration and provide a default client id incase we are not connected\n\t\tif (this.isAttached()) {\n\t\t\tthis.client.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.initializeLocalCore}\n\t */\n\tprotected initializeLocalCore() {\n\t\tsuper.initializeLocalCore();\n\t\tthis.initializeIntervalCollections();\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}\n\t */\n\tprotected applyStashedOp(content: any): void {\n\t\tif (!this.intervalCollections.tryApplyStashedOp(content)) {\n\t\t\tthis.client.applyStashedOp(content);\n\t\t}\n\t}\n\n\tprivate summarizeMergeTree(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tconst minSeq = this.deltaManager.minimumSequenceNumber;\n\n\t\tthis.processMinSequenceNumberChanged(minSeq);\n\n\t\tthis.messagesSinceMSNChange.forEach((m) => {\n\t\t\tm.minimumSequenceNumber = minSeq;\n\t\t});\n\n\t\treturn this.client.summarize(\n\t\t\tthis.runtime,\n\t\t\tthis.handle,\n\t\t\tserializer,\n\t\t\tthis.messagesSinceMSNChange,\n\t\t);\n\t}\n\n\t/**\n\t *\n\t * @param message - Message with decoded and hydrated handles\n\t */\n\tprivate processMergeTreeMsg(message: ISequencedDocumentMessage, local?: boolean) {\n\t\tconst ops: IMergeTreeDeltaOp[] = [];\n\t\tfunction transformOps(event: SequenceDeltaEvent) {\n\t\t\tops.push(...SharedSegmentSequence.createOpsFromDelta(event));\n\t\t}\n\t\tconst needsTransformation = message.referenceSequenceNumber !== message.sequenceNumber - 1;\n\t\tlet stashMessage: Readonly<ISequencedDocumentMessage> = message;\n\t\tif (this.runtime.options.newMergeTreeSnapshotFormat !== true) {\n\t\t\tif (needsTransformation) {\n\t\t\t\tthis.on(\"sequenceDelta\", transformOps);\n\t\t\t}\n\t\t}\n\n\t\tthis.client.applyMsg(message, local);\n\n\t\tif (this.runtime.options.newMergeTreeSnapshotFormat !== true) {\n\t\t\tif (needsTransformation) {\n\t\t\t\tthis.removeListener(\"sequenceDelta\", transformOps);\n\t\t\t\t// shallow clone the message as we only overwrite top level properties,\n\t\t\t\t// like referenceSequenceNumber and content only\n\t\t\t\tstashMessage = {\n\t\t\t\t\t...message,\n\t\t\t\t\treferenceSequenceNumber: stashMessage.sequenceNumber - 1,\n\t\t\t\t\tcontents: ops.length !== 1 ? createGroupOp(...ops) : ops[0],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.messagesSinceMSNChange.push(stashMessage);\n\n\t\t\t// Do GC every once in a while...\n\t\t\tif (\n\t\t\t\tthis.messagesSinceMSNChange.length > 20 &&\n\t\t\t\tthis.messagesSinceMSNChange[20].sequenceNumber < message.minimumSequenceNumber\n\t\t\t) {\n\t\t\t\tthis.processMinSequenceNumberChanged(message.minimumSequenceNumber);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate processMinSequenceNumberChanged(minSeq: number) {\n\t\tlet index = 0;\n\t\tfor (; index < this.messagesSinceMSNChange.length; index++) {\n\t\t\tif (this.messagesSinceMSNChange[index].sequenceNumber > minSeq) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (index !== 0) {\n\t\t\tthis.messagesSinceMSNChange = this.messagesSinceMSNChange.slice(index);\n\t\t}\n\t}\n\n\tprivate initializeIntervalCollections() {\n\t\t// Listen and initialize new SharedIntervalCollections\n\t\tthis.intervalCollections.events.on(\n\t\t\t\"createIntervalCollection\",\n\t\t\t(key: string, local: boolean) => {\n\t\t\t\tconst intervalCollection = this.intervalCollections.get(key);\n\t\t\t\tif (!intervalCollection.attached) {\n\t\t\t\t\tintervalCollection.attachGraph(this.client, key);\n\t\t\t\t}\n\t\t\t\tthis.emit(\"createIntervalCollection\", key, local, this);\n\t\t\t},\n\t\t);\n\n\t\t// Initialize existing SharedIntervalCollections\n\t\tfor (const key of this.intervalCollections.keys()) {\n\t\t\tconst intervalCollection = this.intervalCollections.get(key);\n\t\t\tintervalCollection.attachGraph(this.client, key);\n\t\t}\n\t}\n\n\t/**\n\t * Overrides the \"currently applicable reference sequence number\" for the duration of the callback.\n\t * See remarks on `currentRefSeq` for more context.\n\t */\n\tprivate useResubmitRefSeq(refSeq: number, callback: () => void) {\n\t\tconst previousResubmitRefSeq = this.ongoingResubmitRefSeq;\n\t\tthis.ongoingResubmitRefSeq = refSeq;\n\t\ttry {\n\t\t\tcallback();\n\t\t} finally {\n\t\t\tthis.ongoingResubmitRefSeq = previousResubmitRefSeq;\n\t\t}\n\t}\n}\n\nfunction createReentrancyDetector(\n\tonReentrancy: (depth: number) => void,\n): <T>(callback: () => T) => T {\n\tlet depth = 0;\n\tfunction detectReentrancy<T>(callback: () => T): T {\n\t\tif (depth > 0) {\n\t\t\tonReentrancy(depth);\n\t\t}\n\t\tdepth++;\n\t\ttry {\n\t\t\treturn callback();\n\t\t} finally {\n\t\t\tdepth--;\n\t\t}\n\t}\n\n\treturn detectReentrancy;\n}\n\n/**\n * Apps which generate reentrant behavior may do so at a high frequency.\n * Logging even per-SharedSegmentSequence instance might be too noisy, and having a few logs from a session\n * is likely enough.\n */\nlet totalReentrancyLogs = 3;\n\n/**\n * Resets the reentrancy log counter. Test-only API.\n */\nexport function resetReentrancyLogCounter() {\n\ttotalReentrancyLogs = 3;\n}\n\nconst reentrancyErrorMessage = \"Reentrancy detected in sequence local ops\";\nconst ensureNoReentrancy = createReentrancyDetector(() => {\n\tthrow new LoggingError(reentrancyErrorMessage);\n});\n"]}
1
+ {"version":3,"file":"sequence.js","sourceRoot":"","sources":["../src/sequence.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 { bufferToString } from \"@fluid-internal/client-utils\";\nimport { IEventThisPlaceHolder } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tClient,\n\tIJSONSegment,\n\tIMergeTreeAnnotateMsg,\n\tIMergeTreeDeltaOp,\n\t// eslint-disable-next-line import-x/no-deprecated\n\tIMergeTreeGroupMsg,\n\t// eslint-disable-next-line import-x/no-deprecated\n\tIMergeTreeObliterateMsg,\n\tIMergeTreeOp,\n\tIMergeTreeRemoveMsg,\n\tIRelativePosition,\n\tISegment,\n\tISegmentAction,\n\tLocalReferencePosition,\n\tMergeTreeDeltaType,\n\tMergeTreeRevertibleDriver,\n\tPropertySet,\n\tReferencePosition,\n\tReferenceType,\n\tSlidingPreference,\n\tcreateAnnotateRangeOp,\n\tcreateGroupOp,\n\tcreateInsertOp,\n\tcreateObliterateRangeOp,\n\tcreateRemoveRangeOp,\n\tmatchProperties,\n\ttype AdjustParams,\n\ttype InteriorSequencePlace,\n\ttype MapLike,\n} from \"@fluidframework/merge-tree/internal\";\nimport {\n\tISummaryTreeWithStats,\n\tITelemetryContext,\n\tIRuntimeMessageCollection,\n\tIRuntimeMessagesContent,\n\tISequencedMessageEnvelope,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport {\n\tObjectStoragePartition,\n\tSummaryTreeBuilder,\n} from \"@fluidframework/runtime-utils/internal\";\nimport {\n\tIFluidSerializer,\n\tISharedObjectEvents,\n\tSharedObject,\n\ttype ISharedObject,\n} from \"@fluidframework/shared-object-base/internal\";\nimport {\n\tLoggingError,\n\tcreateChildLogger,\n\tcreateConfigBasedOptionsProxy,\n\tloggerToMonitoringContext,\n} from \"@fluidframework/telemetry-utils/internal\";\nimport Deque from \"double-ended-queue\";\n\nimport type { ISequenceIntervalCollection } from \"./intervalCollection.js\";\nimport { IMapOperation, IntervalCollectionMap } from \"./intervalCollectionMap.js\";\nimport type { SequenceOptions } from \"./intervalCollectionMapInterfaces.js\";\nimport {\n\tSequenceDeltaEvent,\n\tSequenceDeltaEventClass,\n\tSequenceMaintenanceEvent,\n\tSequenceMaintenanceEventClass,\n} from \"./sequenceDeltaEvent.js\";\n\nconst snapshotFileName = \"header\";\nconst contentPath = \"content\";\n\n/**\n * Events emitted in response to changes to the sequence data.\n *\n * @remarks\n *\n * The following is the list of events emitted.\n *\n * ### \"sequenceDelta\"\n *\n * The sequenceDelta event is emitted when segments are inserted, annotated, or removed.\n *\n * #### Listener signature\n *\n * ```typescript\n * (event: SequenceDeltaEvent, target: IEventThisPlaceHolder) => void\n * ```\n * - `event` - Various information on the segments that were modified.\n *\n * - `target` - The sequence itself.\n *\n * ### \"maintenance\"\n *\n * The maintenance event is emitted when segments are modified during merge-tree maintenance.\n *\n * #### Listener signature\n *\n * ```typescript\n * (event: SequenceMaintenanceEvent, target: IEventThisPlaceHolder) => void\n * ```\n * - `event` - Various information on the segments that were modified.\n *\n * - `target` - The sequence itself.\n * @legacy @beta\n */\nexport interface ISharedSegmentSequenceEvents extends ISharedObjectEvents {\n\t(\n\t\tevent: \"createIntervalCollection\",\n\t\tlistener: (label: string, local: boolean, target: IEventThisPlaceHolder) => void,\n\t): void;\n\t(\n\t\tevent: \"sequenceDelta\",\n\t\tlistener: (event: SequenceDeltaEvent, target: IEventThisPlaceHolder) => void,\n\t): void;\n\t(\n\t\tevent: \"maintenance\",\n\t\tlistener: (event: SequenceMaintenanceEvent, target: IEventThisPlaceHolder) => void,\n\t): void;\n}\n\n/**\n * @legacy @beta\n */\nexport interface ISharedSegmentSequence<T extends ISegment>\n\textends ISharedObject<ISharedSegmentSequenceEvents>,\n\t\tMergeTreeRevertibleDriver {\n\t/**\n\t * Creates a `LocalReferencePosition` on this SharedString. If the refType does not include\n\t * ReferenceType.Transient, 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 */\n\tcreateLocalReferencePosition(\n\t\tsegment: T,\n\t\toffset: number,\n\t\trefType: ReferenceType,\n\t\tproperties: PropertySet | undefined,\n\t\tslidingPreference?: SlidingPreference,\n\t\tcanSlideToEndpoint?: boolean,\n\t): LocalReferencePosition;\n\n\t/**\n\t * Removes a `LocalReferencePosition` from this SharedString.\n\t */\n\tremoveLocalReferencePosition(\n\t\tlref: LocalReferencePosition,\n\t): LocalReferencePosition | undefined;\n\n\t/**\n\t * Returns the length of the current sequence for the client\n\t */\n\tgetLength(): number;\n\n\t/**\n\t * Returns the current position of a segment, and -1 if the segment\n\t * does not exist in this sequence\n\t * @param segment - The segment to get the position of\n\t */\n\tgetPosition(segment: ISegment): number;\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 `ReferenceType`. To handle this case specifically, one may wish\n\t * to look at the segment returned by `ReferencePosition.getSegment`.\n\t */\n\tlocalReferencePositionToPosition(lref: ReferencePosition): number;\n\n\t/**\n\t * Walk the underlying segments of the sequence.\n\t * The walked segments may extend beyond the range if the segments cross the\n\t * ranges start or end boundaries.\n\t *\n\t * Set split range to true to ensure only segments within the range are walked.\n\t *\n\t * @param handler - The function to handle each segment. Traversal ends if\n\t * this function returns true.\n\t * @param start - Optional. The start of range walk.\n\t * @param end - Optional. The end of range walk\n\t * @param accum - Optional. An object that will be passed to the handler for accumulation\n\t * @param splitRange - Optional. Splits boundary segments on the range boundaries. Defaults to false.\n\t */\n\twalkSegments<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\tstart?: number,\n\t\tend?: number,\n\t\taccum?: TClientData,\n\t\tsplitRange?: boolean,\n\t): void;\n\n\t/**\n\t * Inserts a segment directly before a `ReferencePosition`.\n\t * @param refPos - The reference position to insert the segment at\n\t * @param segment - The segment to insert\n\t */\n\tinsertAtReferencePosition(pos: ReferencePosition, segment: T): void;\n\n\t/**\n\t * Finds the segment information (i.e. segment + offset) corresponding to a character position in the SharedString.\n\t * If the position is past the end of the string, `segment` and `offset` on the returned object may be undefined.\n\t * @param pos - Character position (index) into the current local view of the SharedString.\n\t */\n\tgetContainingSegment(pos: number): {\n\t\tsegment: T | undefined;\n\t\toffset: number | undefined;\n\t};\n\n\tgetPropertiesAtPosition(pos: number): PropertySet | undefined;\n\n\t/**\n\t * @returns An iterable object that enumerates the IntervalCollection labels.\n\t *\n\t * @example\n\t *\n\t * ```typescript\n\t * const iter = this.getIntervalCollectionKeys();\n\t * for (key of iter)\n\t * const collection = this.getIntervalCollection(key);\n\t * ...\n\t * ```\n\t */\n\tgetIntervalCollectionLabels(): IterableIterator<string>;\n\n\t/**\n\t * Retrieves the interval collection keyed on `label`. If no such interval collection exists,\n\t * creates one.\n\t */\n\tgetIntervalCollection(label: string): ISequenceIntervalCollection;\n\n\t/**\n\t * Obliterate is similar to remove, but differs in that segments concurrently\n\t * inserted into an obliterated range will also be removed.\n\t * Inserts are considered concurrent to an obliterate iff the insert op's seq is after the obliterate op's refSeq\n\t * and the insert's refSeq is before the obliterates seq.\n\t * Inserts made by the client which most recently obliterated a range containing the insert position\n\t * are not considered concurrent to any obliteration (the last client to obliterate gets the right to insert).\n\t *\n\t * The endpoints can either be inclusive or exclusive.\n\t * Exclusive endpoints allow the obliterated range to \"grow\" to include adjacent concurrently inserted segments on that side.\n\t *\n\t * @param start - The start of the range to obliterate.\n\t * Inclusive if side is Before or a number is provided.\n\t * @param end - The end of the range to obliterate. Inclusive if side is After.\n\t * If a number is provided it is treated as exclusive,\n\t * but the endpoint does not expand in order to preserve existing behavior.\n\t *\n\t * @example Given the initial state `\"|ABC>\"`,\n\t * `obliterateRange({ pos: 0, side: Side.After }, { pos: 4, side: Side.Before })` obliterates `\"ABC\"`, leaving only `\"|>\"`.\n\t * `insertFromSpec(1, { text: \"AAA\"})` would insert `\"AAA\"` before |, resulting in `\"|AAA>\"`.\n\t * If another client does the same thing but inserts `\"BBB\"` and gets sequenced later, all clients will eventually see `|BBB>`.\n\t */\n\tobliterateRange(\n\t\tstart: number | InteriorSequencePlace,\n\t\tend: number | InteriorSequencePlace,\n\t): void;\n\n\t/**\n\t * @returns The most recent sequence number which has been acked by the server and processed by this\n\t * SharedSegmentSequence.\n\t */\n\tgetCurrentSeq(): number;\n\n\t/**\n\t * Annotates the range with the provided properties\n\t *\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 *\n\t */\n\tannotateRange(start: number, end: number, props: PropertySet): void;\n\n\t/**\n\t * Annotates a specified range within the sequence by applying the provided adjustments.\n\t *\n\t * @param start - The inclusive start position of the range to annotate. This is a zero-based index.\n\t * @param end - The exclusive end position of the range to annotate. This is a zero-based index.\n\t * @param adjust - A map-like object specifying the properties to adjust. Each key-value pair represents a property and its corresponding adjustment to be applied over the range.\n\t * An adjustment is defined by an object containing a `delta` to be added to the current property value, and optional `min` and `max` constraints to limit the adjusted value.\n\t *\n\t * @remarks\n\t * The range is defined by the start and end positions, where the start position is inclusive and the end position is exclusive.\n\t * The properties provided in the adjust parameter will be applied to the specified range. Each adjustment modifies the current value of the property by adding the specified `value`.\n\t * If the current value is not a number, the `delta` will be summed with 0 to compute the new value. The optional `min` and `max` constraints are applied after the adjustment to ensure the final value falls within the specified bounds.\n\t */\n\tannotateAdjustRange(start: number, end: number, adjust: MapLike<AdjustParams>): void;\n\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\tremoveRange(start: number, end: number): void;\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. The client ref seq must be above the minimum sequence number\n\t * or the return value will be undefined.\n\t * Generally this method is used in conjunction with signals which provide\n\t * point in time values for the below parameters, and is useful for things\n\t * like displaying user position. It should not be used with persisted values\n\t * as persisted values will quickly become invalid as the remoteClientRefSeq\n\t * moves below the minimum sequence number\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\tresolveRemoteClientPosition(\n\t\tremoteClientPosition: number,\n\t\tremoteClientRefSeq: number,\n\t\tremoteClientId: string,\n\t): number | undefined;\n\n\t// #region APIs we might want to remove\n\t/**\n\t * Initializes the object as a local, non-shared object. This object can become shared after\n\t * it is attached to the document.\n\t * @privateRemarks\n\t * TODO: determine if this API (from SharedObject) is needed by users of the encapsulated API, declarative API or both,\n\t * and handle exposing it in a consistent way for all SharedObjects if needed.\n\t */\n\tinitializeLocal(): void;\n\n\t/**\n\t * @deprecated The ability to create group ops will be removed in an upcoming\n\t * release, as group ops are redundant with the native batching capabilities\n\t * of the runtime\n\t */\n\t// eslint-disable-next-line import-x/no-deprecated\n\tgroupOperation(groupOp: IMergeTreeGroupMsg): void;\n\n\tgetRangeExtentsOfPosition(pos: number): {\n\t\tposStart: number | undefined;\n\t\tposAfterEnd: number | undefined;\n\t};\n\n\t/**\n\t * Inserts a segment\n\t * @param start - The position to insert the segment at\n\t * @param spec - The segment to inserts spec\n\t */\n\tinsertFromSpec(pos: number, spec: IJSONSegment): void;\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\tposFromRelativePos(relativePos: IRelativePosition): number;\n\n\t// #endregion\n}\n\n/**\n * @internal\n */\nexport abstract class SharedSegmentSequence<T extends ISegment>\n\textends SharedObject<ISharedSegmentSequenceEvents>\n\timplements ISharedSegmentSequence<T>\n{\n\t/**\n\t * This is a safeguard to avoid problematic reentrancy of local ops. This type of scenario occurs if the user of SharedString subscribes\n\t * to the `sequenceDelta` event and uses the callback for a local op to submit further local ops.\n\t * Historically (before 2.0.0-internal.6.1.0), doing so would result in eventual consistency issues or a corrupted document.\n\t * These issues were fixed in #16815 which makes such reentrancy no different from applying the ops in order but not from within the change events,\n\t * but there is still little test coverage for reentrant scenarios.\n\t * Additionally, applications submitting ops from inside change events need to take extreme care that their data models also support reentrancy.\n\t * Since this is likely not the case, by default SharedString throws when encountering reentrant ops.\n\t *\n\t * An application using SharedString which explicitly wants to opt in to allowing reentrancy anyway can set `sharedStringPreventReentrancy`\n\t * on the data store options to `false`.\n\t */\n\tprotected guardReentrancy: <TRet>(callback: () => TRet) => TRet;\n\n\tprivate static createOpsFromDelta(event: SequenceDeltaEvent): IMergeTreeDeltaOp[] {\n\t\tconst ops: IMergeTreeDeltaOp[] = [];\n\t\tfor (const r of event.ranges) {\n\t\t\tswitch (event.deltaOperation) {\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\t\tconst lastAnnotate = ops[ops.length - 1] as IMergeTreeAnnotateMsg;\n\t\t\t\t\tconst props: PropertySet = {};\n\t\t\t\t\tfor (const key of Object.keys(r.propertyDeltas)) {\n\t\t\t\t\t\tprops[key] = r.segment.properties?.[key] ?? null;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tlastAnnotate &&\n\t\t\t\t\t\tlastAnnotate.pos2 === r.position &&\n\t\t\t\t\t\tmatchProperties(lastAnnotate.props, props)\n\t\t\t\t\t) {\n\t\t\t\t\t\tlastAnnotate.pos2 += r.segment.cachedLength;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tops.push(\n\t\t\t\t\t\t\tcreateAnnotateRangeOp(r.position, r.position + r.segment.cachedLength, props),\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\n\t\t\t\tcase MergeTreeDeltaType.INSERT:\n\t\t\t\t\tops.push(createInsertOp(r.position, r.segment.clone().toJSONObject()));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\t\tconst lastRem = ops[ops.length - 1] as IMergeTreeRemoveMsg;\n\t\t\t\t\tif (lastRem?.pos1 === r.position) {\n\t\t\t\t\t\tassert(lastRem.pos2 !== undefined, 0x3ff /* pos2 should not be undefined here */);\n\t\t\t\t\t\tlastRem.pos2 += r.segment.cachedLength;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tops.push(createRemoveRangeOp(r.position, r.position + r.segment.cachedLength));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase MergeTreeDeltaType.OBLITERATE: {\n\t\t\t\t\t// eslint-disable-next-line import-x/no-deprecated\n\t\t\t\t\tconst lastRem = ops[ops.length - 1] as IMergeTreeObliterateMsg;\n\t\t\t\t\tif (lastRem?.pos1 === r.position) {\n\t\t\t\t\t\tassert(lastRem.pos2 !== undefined, 0x874 /* pos2 should not be undefined here */);\n\t\t\t\t\t\tlastRem.pos2 += r.segment.cachedLength;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tops.push(createObliterateRangeOp(r.position, r.position + r.segment.cachedLength));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t}\n\t\t}\n\t\treturn ops;\n\t}\n\n\t/**\n\t * Note: this field only provides a lower-bound on the reference sequence numbers for in-flight ops.\n\t * The exact reason isn't understood, but some e2e tests suggest that the runtime may sometimes process\n\t * incoming leave/join ops before putting an op that this DDS submits over the wire.\n\t *\n\t * E.g. SharedString submits an op while deltaManager has lastSequenceNumber = 10, but before the runtime\n\t * puts this op over the wire, it processes a client join/leave op with sequence number 11, so the referenceSequenceNumber\n\t * on the SharedString op is 11.\n\t *\n\t * The reference sequence numbers placed in this queue are also not accurate for stashed ops due to how the applyStashedOp\n\t * flow works at the runtime level. This is a legitimate bug, and AB#6602 tracks one way to fix it (stop reaching all the way\n\t * to deltaManager's lastSequenceNumber to obtain refSeq, instead leveraging some analogous notion on the container or datastore\n\t * runtime).\n\t */\n\tprivate readonly inFlightRefSeqs = new Deque<number>();\n\n\tprivate ongoingResubmitRefSeq: number | undefined;\n\n\t/**\n\t * Gets the reference sequence number (i.e. sequence number of the runtime's last processed op) for an op submitted\n\t * in the current context.\n\t *\n\t * This value can be optionally overridden using `useResubmitRefSeq`.\n\t * IntervalCollection's resubmit logic currently relies on preserving merge information from when the op was originally submitted,\n\t * even if the op is resubmitted more than once. Thus during resubmit, `inFlightRefSeqs` gets populated with the\n\t * original refSeq rather than the refSeq at the time of reconnection.\n\t *\n\t * @remarks In some not fully understood cases, the runtime may process incoming ops before putting an op that this\n\t * DDS submits over the wire. See `inFlightRefSeqs` for more details.\n\t */\n\tprivate get currentRefSeq() {\n\t\treturn this.ongoingResubmitRefSeq ?? this.deltaManager.lastSequenceNumber;\n\t}\n\n\tprotected client: Client;\n\tprivate messagesSinceMSNChange: ISequencedDocumentMessage[] = [];\n\tprivate readonly intervalCollections: IntervalCollectionMap;\n\tconstructor(\n\t\tdataStoreRuntime: IFluidDataStoreRuntime,\n\t\tpublic id: string,\n\t\tattributes: IChannelAttributes,\n\t\tpublic readonly segmentFromSpec: (spec: IJSONSegment) => ISegment,\n\t) {\n\t\tsuper(id, dataStoreRuntime, attributes, \"fluid_sequence_\");\n\n\t\tconst getMinInFlightRefSeq = () => this.inFlightRefSeqs.get(0);\n\t\tthis.guardReentrancy =\n\t\t\t(dataStoreRuntime.options.sharedStringPreventReentrancy ?? true)\n\t\t\t\t? ensureNoReentrancy\n\t\t\t\t: createReentrancyDetector((depth) => {\n\t\t\t\t\t\tif (totalReentrancyLogs > 0) {\n\t\t\t\t\t\t\ttotalReentrancyLogs--;\n\t\t\t\t\t\t\tthis.logger.sendTelemetryEvent(\n\t\t\t\t\t\t\t\t{ eventName: \"LocalOpReentry\", depth },\n\t\t\t\t\t\t\t\tnew LoggingError(reentrancyErrorMessage),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\tconst options = createConfigBasedOptionsProxy<SequenceOptions>(\n\t\t\tloggerToMonitoringContext(this.logger).config,\n\t\t\t\"Fluid.Sequence\",\n\t\t\t{\n\t\t\t\tmergeTreeEnableObliterate: (c, n) => c.getBoolean(n),\n\t\t\t\tmergeTreeEnableSidedObliterate: (c, n) => c.getBoolean(n),\n\t\t\t\tintervalStickinessEnabled: (c, n) => c.getBoolean(n),\n\t\t\t\tmergeTreeReferencesCanSlideToEndpoint: (c, n) => c.getBoolean(n),\n\t\t\t\tmergeTreeEnableAnnotateAdjust: (c, n) => c.getBoolean(n),\n\t\t\t},\n\t\t\tdataStoreRuntime.options,\n\t\t);\n\n\t\tthis.client = new Client(\n\t\t\tsegmentFromSpec,\n\t\t\tcreateChildLogger({\n\t\t\t\tlogger: this.logger,\n\t\t\t\tnamespace: \"SharedSegmentSequence.MergeTreeClient\",\n\t\t\t}),\n\t\t\toptions,\n\t\t\tgetMinInFlightRefSeq,\n\t\t);\n\n\t\tthis.client.prependListener(\"delta\", (opArgs, deltaArgs) => {\n\t\t\tconst event = new SequenceDeltaEventClass(opArgs, deltaArgs, this.client);\n\t\t\tif (event.isLocal && event.opArgs.rollback !== true) {\n\t\t\t\tthis.submitSequenceMessage(opArgs.op);\n\t\t\t}\n\t\t\tif (deltaArgs.deltaSegments.length > 0) {\n\t\t\t\tthis.emit(\"sequenceDelta\", event, this);\n\t\t\t}\n\t\t});\n\n\t\tthis.client.on(\"maintenance\", (args, opArgs) => {\n\t\t\tthis.emit(\n\t\t\t\t\"maintenance\",\n\t\t\t\tnew SequenceMaintenanceEventClass(opArgs, args, this.client),\n\t\t\t\tthis,\n\t\t\t);\n\t\t});\n\n\t\tthis.intervalCollections = new IntervalCollectionMap(\n\t\t\tthis.serializer,\n\t\t\tthis.handle,\n\t\t\t(op, localOpMetadata) => {\n\t\t\t\tif (!this.isAttached()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.inFlightRefSeqs.push(this.currentRefSeq);\n\t\t\t\tthis.submitLocalMessage(op, localOpMetadata);\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\tpublic removeRange(start: number, end: number): void {\n\t\tthis.guardReentrancy(() => this.client.removeRangeLocal(start, end));\n\t}\n\n\tpublic obliterateRange(\n\t\tstart: number | InteriorSequencePlace,\n\t\tend: number | InteriorSequencePlace,\n\t): void {\n\t\tthis.guardReentrancy(() => this.client.obliterateRangeLocal(start, end));\n\t}\n\n\t// eslint-disable-next-line import-x/no-deprecated\n\tpublic groupOperation(groupOp: IMergeTreeGroupMsg): void {\n\t\tthis.guardReentrancy(() => this.client.localTransaction(groupOp));\n\t}\n\n\tpublic getContainingSegment(pos: number): {\n\t\tsegment: T | undefined;\n\t\toffset: number | undefined;\n\t} {\n\t\treturn (\n\t\t\tthis.client.getContainingSegment<T>(pos) ?? { segment: undefined, offset: undefined }\n\t\t);\n\t}\n\n\tpublic getLength(): number {\n\t\treturn this.client.getLength();\n\t}\n\n\tpublic getPosition(segment: ISegment): number {\n\t\treturn this.client.getPosition(segment);\n\t}\n\n\tpublic annotateRange(start: number, end: number, props: PropertySet): void {\n\t\tthis.guardReentrancy(() => this.client.annotateRangeLocal(start, end, props));\n\t}\n\n\tpublic annotateAdjustRange(start: number, end: number, adjust: MapLike<AdjustParams>): void {\n\t\tthis.guardReentrancy(() => this.client.annotateAdjustRangeLocal(start, end, adjust));\n\t}\n\n\tpublic getPropertiesAtPosition(pos: number): PropertySet | undefined {\n\t\treturn this.client.getPropertiesAtPosition(pos);\n\t}\n\n\tpublic getRangeExtentsOfPosition(pos: number): {\n\t\tposStart: number | undefined;\n\t\tposAfterEnd: number | undefined;\n\t} {\n\t\treturn this.client.getRangeExtentsOfPosition(pos);\n\t}\n\n\tpublic createLocalReferencePosition(\n\t\tsegment: T,\n\t\toffset: number,\n\t\trefType: ReferenceType,\n\t\tproperties: PropertySet | undefined,\n\t\tslidingPreference?: SlidingPreference,\n\t\tcanSlideToEndpoint?: boolean,\n\t): LocalReferencePosition {\n\t\treturn this.client.createLocalReferencePosition(\n\t\t\tsegment,\n\t\t\toffset,\n\t\t\trefType,\n\t\t\tproperties,\n\t\t\tslidingPreference,\n\t\t\tcanSlideToEndpoint,\n\t\t);\n\t}\n\n\tpublic localReferencePositionToPosition(lref: ReferencePosition): number {\n\t\treturn this.client.localReferencePositionToPosition(lref);\n\t}\n\n\tpublic removeLocalReferencePosition(\n\t\tlref: LocalReferencePosition,\n\t): LocalReferencePosition | undefined {\n\t\treturn this.client.removeLocalReferencePosition(lref);\n\t}\n\n\tpublic resolveRemoteClientPosition(\n\t\tremoteClientPosition: number,\n\t\tremoteClientRefSeq: number,\n\t\tremoteClientId: string,\n\t): number | undefined {\n\t\treturn this.client.resolveRemoteClientPosition(\n\t\t\tremoteClientPosition,\n\t\t\tremoteClientRefSeq,\n\t\t\tremoteClientId,\n\t\t);\n\t}\n\n\tprivate submitSequenceMessage(message: IMergeTreeOp) {\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.inFlightRefSeqs.push(this.currentRefSeq);\n\n\t\tconst metadata = this.client.peekPendingSegmentGroups(\n\t\t\tmessage.type === MergeTreeDeltaType.GROUP ? message.ops.length : 1,\n\t\t);\n\n\t\tthis.submitLocalMessage(message, metadata);\n\t}\n\n\tpublic posFromRelativePos(relativePos: IRelativePosition): number {\n\t\treturn this.client.posFromRelativePos(relativePos);\n\t}\n\n\tpublic walkSegments<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\tstart?: number,\n\t\tend?: number,\n\t\taccum?: TClientData,\n\t\tsplitRange: boolean = false,\n\t): void {\n\t\tthis.client.walkSegments(handler, start, end, accum as TClientData, splitRange);\n\t}\n\n\tpublic getCurrentSeq(): number {\n\t\treturn this.client.getCurrentSeq();\n\t}\n\n\tpublic insertAtReferencePosition(pos: ReferencePosition, segment: T): void {\n\t\tthis.guardReentrancy(() => this.client.insertAtReferencePositionLocal(pos, segment));\n\t}\n\n\tpublic insertFromSpec(pos: number, spec: IJSONSegment): void {\n\t\tconst segment = this.segmentFromSpec(spec);\n\t\tthis.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));\n\t}\n\n\tpublic getIntervalCollection(label: string): ISequenceIntervalCollection {\n\t\treturn this.intervalCollections.get(label);\n\t}\n\n\tpublic getIntervalCollectionLabels(): IterableIterator<string> {\n\t\treturn this.intervalCollections.keys();\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.summarizeCore}\n\t */\n\tprotected summarizeCore(\n\t\tserializer: IFluidSerializer,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): ISummaryTreeWithStats {\n\t\tconst builder = new SummaryTreeBuilder();\n\n\t\t// conditionally write the interval collection blob\n\t\t// only if it has entries\n\t\tif (this.intervalCollections.size > 0) {\n\t\t\tbuilder.addBlob(snapshotFileName, this.intervalCollections.serialize(serializer));\n\t\t}\n\n\t\tbuilder.addWithStats(contentPath, this.summarizeMergeTree(serializer));\n\n\t\treturn builder.getSummaryTree();\n\t}\n\n\t/**\n\t * Runs serializer over the GC data for this SharedMatrix.\n\t * All the IFluidHandle's represent routes to other objects.\n\t */\n\tprotected processGCDataCore(serializer: IFluidSerializer) {\n\t\tif (this.intervalCollections.size > 0) {\n\t\t\tthis.intervalCollections.serialize(serializer);\n\t\t}\n\n\t\tthis.client.serializeGCData(this.handle, serializer);\n\t}\n\n\t/**\n\t * Replace the range specified from start to end with the provided segment\n\t * This is done by inserting the segment at the end of the range, followed\n\t * by removing the contents of the range\n\t * For a zero or reverse range (start \\>= end), insert at end do not remove anything\n\t * @param start - The start of the range to replace\n\t * @param end - The end of the range to replace\n\t * @param segment - The segment that will replace the range\n\t */\n\tprotected replaceRange(start: number, end: number, segment: ISegment): void {\n\t\t// Insert at the max end of the range when start > end, but still remove the range later\n\t\tconst insertIndex: number = Math.max(start, end);\n\n\t\t// Insert first, so local references can slide to the inserted seg if any\n\t\tconst insert = this.guardReentrancy(() =>\n\t\t\tthis.client.insertSegmentLocal(insertIndex, segment),\n\t\t);\n\n\t\tif (insert && start < end) {\n\t\t\tthis.removeRange(start, end);\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.onConnect}\n\t */\n\tprotected onConnect() {\n\t\t// Update merge tree collaboration information with new client ID and then resend pending ops\n\t\tthis.client.startOrUpdateCollaboration(this.runtime.clientId);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.onDisconnect}\n\t */\n\tprotected onDisconnect() {}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.reSubmitCore}\n\t */\n\tprotected reSubmitCore(content: any, localOpMetadata: unknown, squash: boolean = false) {\n\t\tconst originalRefSeq = this.inFlightRefSeqs.shift();\n\t\tassert(\n\t\t\toriginalRefSeq !== undefined,\n\t\t\t0x8bb /* Expected a recorded refSeq when resubmitting an op */,\n\t\t);\n\t\tthis.useResubmitRefSeq(originalRefSeq, () => {\n\t\t\tif (!this.intervalCollections.tryResubmitMessage(content, localOpMetadata, squash)) {\n\t\t\t\tthis.submitSequenceMessage(\n\t\t\t\t\tthis.client.regeneratePendingOp(content as IMergeTreeOp, localOpMetadata, squash),\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected reSubmitSquashed(content: unknown, localOpMetadata: unknown): void {\n\t\tthis.reSubmitCore(content, localOpMetadata, true);\n\t}\n\n\t/**\n\t * Revert an op\n\t */\n\tprotected rollback(content: any, localOpMetadata: unknown): void {\n\t\tconst originalRefSeq = this.inFlightRefSeqs.pop();\n\t\tassert(\n\t\t\toriginalRefSeq !== undefined,\n\t\t\t0xb7f /* Expected a recorded refSeq when rolling back an op */,\n\t\t);\n\n\t\tif (!this.intervalCollections.tryRollback(content, localOpMetadata)) {\n\t\t\tthis.client.rollback(content, localOpMetadata);\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService) {\n\t\tif (await storage.contains(snapshotFileName)) {\n\t\t\tconst blob = await storage.readBlob(snapshotFileName);\n\t\t\tconst header = bufferToString(blob, \"utf8\");\n\t\t\tthis.intervalCollections.populate(header);\n\t\t}\n\n\t\ttry {\n\t\t\t// this will load the header, and return a promise\n\t\t\t// that will resolve when the body is loaded\n\t\t\t// and the catchup ops are available.\n\t\t\tconst { catchupOpsP } = await this.client.load(\n\t\t\t\tthis.runtime,\n\t\t\t\tnew ObjectStoragePartition(storage, contentPath),\n\t\t\t\tthis.serializer,\n\t\t\t);\n\n\t\t\t// process the catch up ops, and finishing the loading process\n\t\t\t(await catchupOpsP).forEach((m) => {\n\t\t\t\tconst collabWindow = this.client.getCollabWindow();\n\t\t\t\tif (\n\t\t\t\t\tm.minimumSequenceNumber < collabWindow.minSeq ||\n\t\t\t\t\tm.referenceSequenceNumber < collabWindow.minSeq ||\n\t\t\t\t\tm.sequenceNumber <= collabWindow.minSeq ||\n\t\t\t\t\t// sequenceNumber could be the same if messages are part of a grouped batch\n\t\t\t\t\tm.sequenceNumber < collabWindow.currentSeq\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Invalid catchup operations in snapshot: ${JSON.stringify({\n\t\t\t\t\t\t\top: {\n\t\t\t\t\t\t\t\tseq: m.sequenceNumber,\n\t\t\t\t\t\t\t\tminSeq: m.minimumSequenceNumber,\n\t\t\t\t\t\t\t\trefSeq: m.referenceSequenceNumber,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcollabWindow: {\n\t\t\t\t\t\t\t\tseq: collabWindow.currentSeq,\n\t\t\t\t\t\t\t\tminSeq: collabWindow.minSeq,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.processMergeTreeMsg(m);\n\t\t\t});\n\n\t\t\t// Initialize the interval collections\n\t\t\tthis.initializeIntervalCollections();\n\t\t} catch (error) {\n\t\t\tthis.logger.sendErrorEvent({ eventName: \"SequenceLoadFailed\" }, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}\n\t */\n\tprotected processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {\n\t\tconst { envelope, local, messagesContent } = messagesCollection;\n\t\tfor (const messageContent of messagesContent) {\n\t\t\tthis.processMessage(envelope, messageContent, local);\n\t\t}\n\t}\n\n\tprivate processMessage(\n\t\tmessageEnvelope: ISequencedMessageEnvelope,\n\t\tmessageContent: IRuntimeMessagesContent,\n\t\tlocal: boolean,\n\t): void {\n\t\t// Reconstruct ISequencedDocumentMessage which is needed by merge tree client\n\t\tconst message: ISequencedDocumentMessage = {\n\t\t\t...messageEnvelope,\n\t\t\tcontents: messageContent.contents,\n\t\t\tclientSequenceNumber: messageContent.clientSequenceNumber,\n\t\t};\n\n\t\tif (local) {\n\t\t\tconst recordedRefSeq = this.inFlightRefSeqs.shift();\n\t\t\tassert(recordedRefSeq !== undefined, 0x8bc /* No pending recorded refSeq found */);\n\t\t\t// TODO: AB#7076: Some equivalent assert should be enabled. This fails some e2e stashed op tests because\n\t\t\t// the deltaManager may have seen more messages than the runtime has processed while amidst the stashed op\n\t\t\t// flow, so e.g. when `applyStashedOp` is called and the DDS is put in a state where it expects an ack for\n\t\t\t// one of its messages, the delta manager has actually already seen subsequent messages from collaborators\n\t\t\t// which the in-flight message is concurrent to.\n\t\t\t// See \"handles stashed ops created on top of sequenced local ops\" for one such test case.\n\t\t\t// assert(recordedRefSeq <= message.referenceSequenceNumber, \"RefSeq mismatch\");\n\t\t}\n\n\t\tassert(\n\t\t\tmessage.type === MessageType.Operation,\n\t\t\t0x073 /* \"Sequence message not operation\" */,\n\t\t);\n\n\t\tconst handled = this.intervalCollections.tryProcessMessage(\n\t\t\tmessage.contents as IMapOperation,\n\t\t\tlocal,\n\t\t\tmessage,\n\t\t\tmessageContent.localOpMetadata,\n\t\t);\n\n\t\tif (!handled) {\n\t\t\tthis.processMergeTreeMsg(message, local);\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.didAttach}\n\t */\n\tprotected didAttach() {\n\t\t// If we are not local, and we've attached we need to start generating and sending ops\n\t\t// so start collaboration and provide a default client id incase we are not connected\n\t\tif (this.isAttached()) {\n\t\t\tthis.client.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.initializeLocalCore}\n\t */\n\tprotected initializeLocalCore() {\n\t\tsuper.initializeLocalCore();\n\t\tthis.initializeIntervalCollections();\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}\n\t */\n\tprotected applyStashedOp(content: any): void {\n\t\tif (!this.intervalCollections.tryApplyStashedOp(content)) {\n\t\t\tthis.client.applyStashedOp(content);\n\t\t}\n\t}\n\n\tprivate summarizeMergeTree(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tconst minSeq = this.deltaManager.minimumSequenceNumber;\n\n\t\tthis.processMinSequenceNumberChanged(minSeq);\n\n\t\tthis.messagesSinceMSNChange.forEach((m) => {\n\t\t\tm.minimumSequenceNumber = minSeq;\n\t\t});\n\n\t\treturn this.client.summarize(\n\t\t\tthis.runtime,\n\t\t\tthis.handle,\n\t\t\tserializer,\n\t\t\tthis.messagesSinceMSNChange,\n\t\t);\n\t}\n\n\t/**\n\t *\n\t * @param message - Message with decoded and hydrated handles\n\t */\n\tprivate processMergeTreeMsg(message: ISequencedDocumentMessage, local?: boolean) {\n\t\tconst ops: IMergeTreeDeltaOp[] = [];\n\t\tfunction transformOps(event: SequenceDeltaEvent) {\n\t\t\tops.push(...SharedSegmentSequence.createOpsFromDelta(event));\n\t\t}\n\t\tconst needsTransformation = message.referenceSequenceNumber !== message.sequenceNumber - 1;\n\t\tlet stashMessage: Readonly<ISequencedDocumentMessage> = message;\n\t\tif (this.runtime.options.newMergeTreeSnapshotFormat !== true) {\n\t\t\tif (needsTransformation) {\n\t\t\t\tthis.on(\"sequenceDelta\", transformOps);\n\t\t\t}\n\t\t}\n\n\t\tthis.client.applyMsg(message, local);\n\n\t\tif (this.runtime.options.newMergeTreeSnapshotFormat !== true) {\n\t\t\tif (needsTransformation) {\n\t\t\t\tthis.removeListener(\"sequenceDelta\", transformOps);\n\t\t\t\t// shallow clone the message as we only overwrite top level properties,\n\t\t\t\t// like referenceSequenceNumber and content only\n\t\t\t\tstashMessage = {\n\t\t\t\t\t...message,\n\t\t\t\t\treferenceSequenceNumber: stashMessage.sequenceNumber - 1,\n\t\t\t\t\tcontents: ops.length !== 1 ? createGroupOp(...ops) : ops[0],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.messagesSinceMSNChange.push(stashMessage);\n\n\t\t\t// Do GC every once in a while...\n\t\t\tif (\n\t\t\t\tthis.messagesSinceMSNChange.length > 20 &&\n\t\t\t\tthis.messagesSinceMSNChange[20].sequenceNumber < message.minimumSequenceNumber\n\t\t\t) {\n\t\t\t\tthis.processMinSequenceNumberChanged(message.minimumSequenceNumber);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate processMinSequenceNumberChanged(minSeq: number) {\n\t\tlet index = 0;\n\t\tfor (; index < this.messagesSinceMSNChange.length; index++) {\n\t\t\tif (this.messagesSinceMSNChange[index].sequenceNumber > minSeq) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (index !== 0) {\n\t\t\tthis.messagesSinceMSNChange = this.messagesSinceMSNChange.slice(index);\n\t\t}\n\t}\n\n\tprivate initializeIntervalCollections() {\n\t\t// Listen and initialize new SharedIntervalCollections\n\t\tthis.intervalCollections.events.on(\n\t\t\t\"createIntervalCollection\",\n\t\t\t(key: string, local: boolean) => {\n\t\t\t\tconst intervalCollection = this.intervalCollections.get(key);\n\t\t\t\tif (!intervalCollection.attached) {\n\t\t\t\t\tintervalCollection.attachGraph(this.client, key);\n\t\t\t\t}\n\t\t\t\tthis.emit(\"createIntervalCollection\", key, local, this);\n\t\t\t},\n\t\t);\n\n\t\t// Initialize existing SharedIntervalCollections\n\t\tfor (const key of this.intervalCollections.keys()) {\n\t\t\tconst intervalCollection = this.intervalCollections.get(key);\n\t\t\tintervalCollection.attachGraph(this.client, key);\n\t\t}\n\t}\n\n\t/**\n\t * Overrides the \"currently applicable reference sequence number\" for the duration of the callback.\n\t * See remarks on `currentRefSeq` for more context.\n\t */\n\tprivate useResubmitRefSeq(refSeq: number, callback: () => void) {\n\t\tconst previousResubmitRefSeq = this.ongoingResubmitRefSeq;\n\t\tthis.ongoingResubmitRefSeq = refSeq;\n\t\ttry {\n\t\t\tcallback();\n\t\t} finally {\n\t\t\tthis.ongoingResubmitRefSeq = previousResubmitRefSeq;\n\t\t}\n\t}\n}\n\nfunction createReentrancyDetector(\n\tonReentrancy: (depth: number) => void,\n): <T>(callback: () => T) => T {\n\tlet depth = 0;\n\tfunction detectReentrancy<T>(callback: () => T): T {\n\t\tif (depth > 0) {\n\t\t\tonReentrancy(depth);\n\t\t}\n\t\tdepth++;\n\t\ttry {\n\t\t\treturn callback();\n\t\t} finally {\n\t\t\tdepth--;\n\t\t}\n\t}\n\n\treturn detectReentrancy;\n}\n\n/**\n * Apps which generate reentrant behavior may do so at a high frequency.\n * Logging even per-SharedSegmentSequence instance might be too noisy, and having a few logs from a session\n * is likely enough.\n */\nlet totalReentrancyLogs = 3;\n\n/**\n * Resets the reentrancy log counter. Test-only API.\n */\nexport function resetReentrancyLogCounter() {\n\ttotalReentrancyLogs = 3;\n}\n\nconst reentrancyErrorMessage = \"Reentrancy detected in sequence local ops\";\nconst ensureNoReentrancy = createReentrancyDetector(() => {\n\tthrow new LoggingError(reentrancyErrorMessage);\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sharedSequence.d.ts","sourceRoot":"","sources":["../src/sharedSequence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,YAAY,EACZ,MAAM,gDAAgD,CAAC;AACxD,OAAO,EACN,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAItD;;;GAGG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,CAAE,SAAQ,YAAY;IACvD,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,qBAAa,WAAW,CAAC,CAAC,CAAE,SAAQ,WAAW;IAetC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE;IAdhC,gBAAuB,UAAU,EAAE,MAAM,CAAiB;WAC5C,EAAE,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,IAAI,WAAW,CAAC,GAAG,CAAC;WAGlD,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG;IAOzC,SAAgB,IAAI,SAA0B;gBAGtC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAC/B,KAAK,CAAC,EAAE,WAAW;IAMb,YAAY;IAMZ,KAAK,CAAC,KAAK,SAAI,EAAE,GAAG,CAAC,EAAE,MAAM;IAO7B,SAAS,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO;IAOrC,QAAQ;IAIR,MAAM,CAAC,OAAO,EAAE,QAAQ;IAWxB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAc7C,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM;CAS1C;AAED;;;GAGG;AACH,qBAAa,cAAc,CAAC,CAAC,CAAE,SAAQ,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAGnE,EAAE,EAAE,MAAM;gBADjB,QAAQ,EAAE,sBAAsB,EACzB,EAAE,EAAE,MAAM,EACjB,UAAU,EAAE,kBAAkB,EAC9B,aAAa,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,QAAQ;IAKhD;;;;OAIG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,WAAW;IAKxE;;;OAGG;IACI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAIxC;;OAEG;IACI,YAAY,IAAI,MAAM;IAI7B;;;;;OAKG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE;CAuC/D"}
1
+ {"version":3,"file":"sharedSequence.d.ts","sourceRoot":"","sources":["../src/sharedSequence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,YAAY,EACZ,MAAM,gDAAgD,CAAC;AACxD,OAAO,EACN,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAItD;;;GAGG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,CAAE,SAAQ,YAAY;IACvD,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,qBAAa,WAAW,CAAC,CAAC,CAAE,SAAQ,WAAW;IAetC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE;IAdhC,gBAAuB,UAAU,EAAE,MAAM,CAAiB;WAC5C,EAAE,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,IAAI,WAAW,CAAC,GAAG,CAAC;WAGlD,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG;IAOzC,SAAgB,IAAI,SAA0B;gBAGtC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAC/B,KAAK,CAAC,EAAE,WAAW;IAMb,YAAY;IAMZ,KAAK,CAAC,KAAK,SAAI,EAAE,GAAG,CAAC,EAAE,MAAM;IAO7B,SAAS,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO;IAOrC,QAAQ;IAIR,MAAM,CAAC,OAAO,EAAE,QAAQ;IAWxB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAc7C,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM;CAS1C;AAED;;;GAGG;AACH,qBAAa,cAAc,CAAC,CAAC,CAAE,SAAQ,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAGnE,EAAE,EAAE,MAAM;gBADjB,QAAQ,EAAE,sBAAsB,EACzB,EAAE,EAAE,MAAM,EACjB,UAAU,EAAE,kBAAkB,EAC9B,aAAa,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,QAAQ;IAKhD;;;;OAIG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,WAAW;IAKxE;;;OAGG;IACI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAIxC;;OAEG;IACI,YAAY,IAAI,MAAM;IAI7B;;;;;OAKG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE;CAwC/D"}
@@ -128,6 +128,7 @@ class SharedSequence extends sequence_js_1.SharedSegmentSequence {
128
128
  }
129
129
  this.walkSegments((segment) => {
130
130
  if (SubSequence.is(segment)) {
131
+ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy
131
132
  if (firstSegment === undefined) {
132
133
  firstSegment = segment;
133
134
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sharedSequence.js","sourceRoot":"","sources":["../src/sharedSequence.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 { assert } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tSerializable,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tBaseSegment,\n\tIJSONSegment,\n\tISegment,\n\tPropertySet,\n} from \"@fluidframework/merge-tree/internal\";\n\nimport { SharedSegmentSequence } from \"./sequence.js\";\n\nconst MaxRun = 128;\n\n/**\n * @deprecated IJSONRunSegment will be removed in a upcoming release. It has been moved to the fluid-experimental/sequence-deprecated package\n * @internal\n */\nexport interface IJSONRunSegment<T> extends IJSONSegment {\n\titems: Serializable<T>[];\n}\n\n/**\n * @deprecated SubSequence will be removed in a upcoming release. It has been moved to the fluid-experimental/sequence-deprecated package\n * @internal\n */\nexport class SubSequence<T> extends BaseSegment {\n\tpublic static readonly typeString: string = \"SubSequence\";\n\tpublic static is(segment: ISegment): segment is SubSequence<any> {\n\t\treturn segment.type === SubSequence.typeString;\n\t}\n\tpublic static fromJSONObject<U>(spec: any) {\n\t\tif (spec && typeof spec === \"object\" && \"items\" in spec) {\n\t\t\treturn new SubSequence<U>(spec.items, spec.props);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tpublic readonly type = SubSequence.typeString;\n\n\tconstructor(\n\t\tpublic items: Serializable<T>[],\n\t\tprops?: PropertySet,\n\t) {\n\t\tsuper(props);\n\t\tthis.cachedLength = items.length;\n\t}\n\n\tpublic toJSONObject() {\n\t\tconst obj: IJSONRunSegment<T> = { items: this.items };\n\t\tsuper.addSerializedProps(obj);\n\t\treturn obj;\n\t}\n\n\tpublic clone(start = 0, end?: number) {\n\t\tconst clonedItems = this.items.slice(start, end);\n\t\tconst b = new SubSequence(clonedItems);\n\t\tthis.cloneInto(b);\n\t\treturn b;\n\t}\n\n\tpublic canAppend(segment: ISegment): boolean {\n\t\treturn (\n\t\t\tSubSequence.is(segment) &&\n\t\t\t(this.cachedLength <= MaxRun || segment.cachedLength <= MaxRun)\n\t\t);\n\t}\n\n\tpublic toString() {\n\t\treturn this.items.toString();\n\t}\n\n\tpublic append(segment: ISegment) {\n\t\tassert(SubSequence.is(segment), 0x448 /* can only append to another run segment */);\n\t\tsuper.append(segment);\n\t\t// assert above checks that segment is a SubSequence but not that generic T matches.\n\t\t// Since SubSequence is already deprecated, assume that usage is generic T consistent\n\t\t// and just cast here to satisfy concat.\n\t\tthis.items = this.items.concat((segment as SubSequence<T>).items);\n\t}\n\n\t// TODO: retain removed items for undo\n\t// returns true if entire run removed\n\tpublic removeRange(start: number, end: number) {\n\t\tlet remnantItems: Serializable<T>[] = [];\n\t\tconst len = this.items.length;\n\t\tif (start > 0) {\n\t\t\tremnantItems = remnantItems.concat(this.items.slice(0, start));\n\t\t}\n\t\tif (end < len) {\n\t\t\tremnantItems = remnantItems.concat(this.items.slice(end));\n\t\t}\n\t\tthis.items = remnantItems;\n\t\tthis.cachedLength = this.items.length;\n\t\treturn this.items.length === 0;\n\t}\n\n\tprotected createSplitSegmentAt(pos: number) {\n\t\tif (pos > 0) {\n\t\t\tconst remainingItems = this.items.slice(pos);\n\t\t\tthis.items = this.items.slice(0, pos);\n\t\t\tthis.cachedLength = this.items.length;\n\t\t\tconst leafSegment = new SubSequence(remainingItems);\n\t\t\treturn leafSegment;\n\t\t}\n\t}\n}\n\n/**\n * @deprecated SharedSequence will be removed in a upcoming release. It has been moved to the fluid-experimental/sequence-deprecated package\n * @internal\n */\nexport class SharedSequence<T> extends SharedSegmentSequence<SubSequence<T>> {\n\tconstructor(\n\t\tdocument: IFluidDataStoreRuntime,\n\t\tpublic id: string,\n\t\tattributes: IChannelAttributes,\n\t\tspecToSegment: (spec: IJSONSegment) => ISegment,\n\t) {\n\t\tsuper(document, id, attributes, specToSegment);\n\t}\n\n\t/**\n\t * @param pos - The position to insert the items at.\n\t * @param items - The items to insert.\n\t * @param props - Optional. Properties to set on the inserted items.\n\t */\n\tpublic insert(pos: number, items: Serializable<T>[], props?: PropertySet) {\n\t\tconst segment = new SubSequence<T>(items, props);\n\t\tthis.client.insertSegmentLocal(pos, segment);\n\t}\n\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 remove(start: number, end: number) {\n\t\tthis.removeRange(start, end);\n\t}\n\n\t/**\n\t * Returns the total count of items in the sequence\n\t */\n\tpublic getItemCount(): number {\n\t\treturn this.getLength();\n\t}\n\n\t/**\n\t * Gets the items in the specified range\n\t *\n\t * @param start - The inclusive start of the range\n\t * @param end - The exclusive end of the range\n\t */\n\tpublic getItems(start: number, end?: number): Serializable<T>[] {\n\t\tconst items: Serializable<T>[] = [];\n\t\tlet firstSegment: ISegment | undefined;\n\n\t\t// Return if the range is incorrect.\n\t\tif (end !== undefined && end <= start) {\n\t\t\treturn items;\n\t\t}\n\n\t\tthis.walkSegments(\n\t\t\t(segment: ISegment) => {\n\t\t\t\tif (SubSequence.is(segment)) {\n\t\t\t\t\tif (firstSegment === undefined) {\n\t\t\t\t\t\tfirstSegment = segment;\n\t\t\t\t\t}\n\t\t\t\t\t// Condition above checks that segment is a SubSequence but not that\n\t\t\t\t\t// generic T matches. Since SubSequence is already deprecated, assume\n\t\t\t\t\t// that walk only has SubSequence<T> segments and just cast here.\n\t\t\t\t\titems.push(...(segment as SubSequence<T>).items);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tstart,\n\t\t\tend,\n\t\t);\n\n\t\t// The above call to walkSegments adds all the items in the walked\n\t\t// segments. However, we only want items beginning at |start| in\n\t\t// the first segment. Similarly, if |end| is passed in, we only\n\t\t// want items until |end| in the last segment. Remove the rest of\n\t\t// the items.\n\t\tif (firstSegment !== undefined) {\n\t\t\titems.splice(0, start - this.getPosition(firstSegment));\n\t\t}\n\t\tif (end !== undefined) {\n\t\t\titems.splice(end - start);\n\t\t}\n\t\treturn items;\n\t}\n}\n"]}
1
+ {"version":3,"file":"sharedSequence.js","sourceRoot":"","sources":["../src/sharedSequence.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 { assert } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tSerializable,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tBaseSegment,\n\tIJSONSegment,\n\tISegment,\n\tPropertySet,\n} from \"@fluidframework/merge-tree/internal\";\n\nimport { SharedSegmentSequence } from \"./sequence.js\";\n\nconst MaxRun = 128;\n\n/**\n * @deprecated IJSONRunSegment will be removed in a upcoming release. It has been moved to the fluid-experimental/sequence-deprecated package\n * @internal\n */\nexport interface IJSONRunSegment<T> extends IJSONSegment {\n\titems: Serializable<T>[];\n}\n\n/**\n * @deprecated SubSequence will be removed in a upcoming release. It has been moved to the fluid-experimental/sequence-deprecated package\n * @internal\n */\nexport class SubSequence<T> extends BaseSegment {\n\tpublic static readonly typeString: string = \"SubSequence\";\n\tpublic static is(segment: ISegment): segment is SubSequence<any> {\n\t\treturn segment.type === SubSequence.typeString;\n\t}\n\tpublic static fromJSONObject<U>(spec: any) {\n\t\tif (spec && typeof spec === \"object\" && \"items\" in spec) {\n\t\t\treturn new SubSequence<U>(spec.items, spec.props);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tpublic readonly type = SubSequence.typeString;\n\n\tconstructor(\n\t\tpublic items: Serializable<T>[],\n\t\tprops?: PropertySet,\n\t) {\n\t\tsuper(props);\n\t\tthis.cachedLength = items.length;\n\t}\n\n\tpublic toJSONObject() {\n\t\tconst obj: IJSONRunSegment<T> = { items: this.items };\n\t\tsuper.addSerializedProps(obj);\n\t\treturn obj;\n\t}\n\n\tpublic clone(start = 0, end?: number) {\n\t\tconst clonedItems = this.items.slice(start, end);\n\t\tconst b = new SubSequence(clonedItems);\n\t\tthis.cloneInto(b);\n\t\treturn b;\n\t}\n\n\tpublic canAppend(segment: ISegment): boolean {\n\t\treturn (\n\t\t\tSubSequence.is(segment) &&\n\t\t\t(this.cachedLength <= MaxRun || segment.cachedLength <= MaxRun)\n\t\t);\n\t}\n\n\tpublic toString() {\n\t\treturn this.items.toString();\n\t}\n\n\tpublic append(segment: ISegment) {\n\t\tassert(SubSequence.is(segment), 0x448 /* can only append to another run segment */);\n\t\tsuper.append(segment);\n\t\t// assert above checks that segment is a SubSequence but not that generic T matches.\n\t\t// Since SubSequence is already deprecated, assume that usage is generic T consistent\n\t\t// and just cast here to satisfy concat.\n\t\tthis.items = this.items.concat((segment as SubSequence<T>).items);\n\t}\n\n\t// TODO: retain removed items for undo\n\t// returns true if entire run removed\n\tpublic removeRange(start: number, end: number) {\n\t\tlet remnantItems: Serializable<T>[] = [];\n\t\tconst len = this.items.length;\n\t\tif (start > 0) {\n\t\t\tremnantItems = remnantItems.concat(this.items.slice(0, start));\n\t\t}\n\t\tif (end < len) {\n\t\t\tremnantItems = remnantItems.concat(this.items.slice(end));\n\t\t}\n\t\tthis.items = remnantItems;\n\t\tthis.cachedLength = this.items.length;\n\t\treturn this.items.length === 0;\n\t}\n\n\tprotected createSplitSegmentAt(pos: number) {\n\t\tif (pos > 0) {\n\t\t\tconst remainingItems = this.items.slice(pos);\n\t\t\tthis.items = this.items.slice(0, pos);\n\t\t\tthis.cachedLength = this.items.length;\n\t\t\tconst leafSegment = new SubSequence(remainingItems);\n\t\t\treturn leafSegment;\n\t\t}\n\t}\n}\n\n/**\n * @deprecated SharedSequence will be removed in a upcoming release. It has been moved to the fluid-experimental/sequence-deprecated package\n * @internal\n */\nexport class SharedSequence<T> extends SharedSegmentSequence<SubSequence<T>> {\n\tconstructor(\n\t\tdocument: IFluidDataStoreRuntime,\n\t\tpublic id: string,\n\t\tattributes: IChannelAttributes,\n\t\tspecToSegment: (spec: IJSONSegment) => ISegment,\n\t) {\n\t\tsuper(document, id, attributes, specToSegment);\n\t}\n\n\t/**\n\t * @param pos - The position to insert the items at.\n\t * @param items - The items to insert.\n\t * @param props - Optional. Properties to set on the inserted items.\n\t */\n\tpublic insert(pos: number, items: Serializable<T>[], props?: PropertySet) {\n\t\tconst segment = new SubSequence<T>(items, props);\n\t\tthis.client.insertSegmentLocal(pos, segment);\n\t}\n\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 remove(start: number, end: number) {\n\t\tthis.removeRange(start, end);\n\t}\n\n\t/**\n\t * Returns the total count of items in the sequence\n\t */\n\tpublic getItemCount(): number {\n\t\treturn this.getLength();\n\t}\n\n\t/**\n\t * Gets the items in the specified range\n\t *\n\t * @param start - The inclusive start of the range\n\t * @param end - The exclusive end of the range\n\t */\n\tpublic getItems(start: number, end?: number): Serializable<T>[] {\n\t\tconst items: Serializable<T>[] = [];\n\t\tlet firstSegment: ISegment | undefined;\n\n\t\t// Return if the range is incorrect.\n\t\tif (end !== undefined && end <= start) {\n\t\t\treturn items;\n\t\t}\n\n\t\tthis.walkSegments(\n\t\t\t(segment: ISegment) => {\n\t\t\t\tif (SubSequence.is(segment)) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\t\t\t\tif (firstSegment === undefined) {\n\t\t\t\t\t\tfirstSegment = segment;\n\t\t\t\t\t}\n\t\t\t\t\t// Condition above checks that segment is a SubSequence but not that\n\t\t\t\t\t// generic T matches. Since SubSequence is already deprecated, assume\n\t\t\t\t\t// that walk only has SubSequence<T> segments and just cast here.\n\t\t\t\t\titems.push(...(segment as SubSequence<T>).items);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tstart,\n\t\t\tend,\n\t\t);\n\n\t\t// The above call to walkSegments adds all the items in the walked\n\t\t// segments. However, we only want items beginning at |start| in\n\t\t// the first segment. Similarly, if |end| is passed in, we only\n\t\t// want items until |end| in the last segment. Remove the rest of\n\t\t// the items.\n\t\tif (firstSegment !== undefined) {\n\t\t\titems.splice(0, start - this.getPosition(firstSegment));\n\t\t}\n\t\tif (end !== undefined) {\n\t\t\titems.splice(end - start);\n\t\t}\n\t\treturn items;\n\t}\n}\n"]}
package/eslint.config.mts CHANGED
@@ -1,8 +1,8 @@
1
- /* eslint-disable */
2
- /**
3
- * GENERATED FILE - DO NOT EDIT DIRECTLY.
4
- * To regenerate: pnpm tsx scripts/generate-flat-eslint-configs.ts --typescript
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
5
4
  */
5
+
6
6
  import type { Linter } from "eslint";
7
7
  import { minimalDeprecated } from "../../../common/build/eslint-config-fluid/flat.mts";
8
8
 
@@ -10,9 +10,11 @@ const config: Linter.Config[] = [
10
10
  ...minimalDeprecated,
11
11
  {
12
12
  rules: {
13
+ "@fluid-internal/fluid/no-unchecked-record-access": "warn",
14
+ "@typescript-eslint/explicit-function-return-type": "warn",
13
15
  "@typescript-eslint/no-use-before-define": "off",
14
16
  "@typescript-eslint/strict-boolean-expressions": "off",
15
- "@fluid-internal/fluid/no-unchecked-record-access": "warn",
17
+ "prefer-arrow-callback": "off",
16
18
  },
17
19
  },
18
20
  ];
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { IFluidHandle } from "@fluidframework/core-interfaces";
6
6
  import { IFluidSerializer } from "@fluidframework/shared-object-base/internal";
7
- import { type IntervalCollection } from "./intervalCollection.js";
7
+ import type { IntervalCollection } from "./intervalCollection.js";
8
8
  import { ISerializableIntervalCollection } from "./intervalCollectionMapInterfaces.js";
9
9
  export declare function makeSerializable(localValue: IntervalCollection, serializer: IFluidSerializer, bind: IFluidHandle, version: "1" | "2"): ISerializableIntervalCollection;
10
10
  //# sourceMappingURL=IntervalCollectionValues.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IntervalCollectionValues.d.ts","sourceRoot":"","sources":["../src/IntervalCollectionValues.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAEN,gBAAgB,EAChB,MAAM,6CAA6C,CAAC;AAErD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AAEvF,wBAAgB,gBAAgB,CAC/B,UAAU,EAAE,kBAAkB,EAC9B,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,GAAG,GAAG,GAAG,GAChB,+BAA+B,CAQjC"}
1
+ {"version":3,"file":"IntervalCollectionValues.d.ts","sourceRoot":"","sources":["../src/IntervalCollectionValues.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAEN,gBAAgB,EAChB,MAAM,6CAA6C,CAAC;AAErD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AAEvF,wBAAgB,gBAAgB,CAC/B,UAAU,EAAE,kBAAkB,EAC9B,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,GAAG,GAAG,GAAG,GAChB,+BAA+B,CAQjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"IntervalCollectionValues.js","sourceRoot":"","sources":["../src/IntervalCollectionValues.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACN,gBAAgB,GAEhB,MAAM,6CAA6C,CAAC;AAKrD,MAAM,UAAU,gBAAgB,CAC/B,UAA8B,EAC9B,UAA4B,EAC5B,IAAkB,EAClB,OAAkB;IAElB,MAAM,eAAe,GAAG,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAE9D,MAAM,KAAK,GAAG,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAClE,OAAO;QACN,IAAI,EAAE,gCAAgC;QACtC,KAAK,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;KACjC,CAAC;AACH,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport {\n\tserializeHandles,\n\tIFluidSerializer,\n} from \"@fluidframework/shared-object-base/internal\";\n\nimport { type IntervalCollection } from \"./intervalCollection.js\";\nimport { ISerializableIntervalCollection } from \"./intervalCollectionMapInterfaces.js\";\n\nexport function makeSerializable(\n\tlocalValue: IntervalCollection,\n\tserializer: IFluidSerializer,\n\tbind: IFluidHandle,\n\tversion: \"1\" | \"2\",\n): ISerializableIntervalCollection {\n\tconst storedValueType = localValue.serializeInternal(version);\n\n\tconst value = serializeHandles(storedValueType, serializer, bind);\n\treturn {\n\t\ttype: \"sharedStringIntervalCollection\",\n\t\tvalue: value && JSON.parse(value),\n\t};\n}\n"]}
1
+ {"version":3,"file":"IntervalCollectionValues.js","sourceRoot":"","sources":["../src/IntervalCollectionValues.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACN,gBAAgB,GAEhB,MAAM,6CAA6C,CAAC;AAKrD,MAAM,UAAU,gBAAgB,CAC/B,UAA8B,EAC9B,UAA4B,EAC5B,IAAkB,EAClB,OAAkB;IAElB,MAAM,eAAe,GAAG,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAE9D,MAAM,KAAK,GAAG,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAClE,OAAO;QACN,IAAI,EAAE,gCAAgC;QACtC,KAAK,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;KACjC,CAAC;AACH,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport {\n\tserializeHandles,\n\tIFluidSerializer,\n} from \"@fluidframework/shared-object-base/internal\";\n\nimport type { IntervalCollection } from \"./intervalCollection.js\";\nimport { ISerializableIntervalCollection } from \"./intervalCollectionMapInterfaces.js\";\n\nexport function makeSerializable(\n\tlocalValue: IntervalCollection,\n\tserializer: IFluidSerializer,\n\tbind: IFluidHandle,\n\tversion: \"1\" | \"2\",\n): ISerializableIntervalCollection {\n\tconst storedValueType = localValue.serializeInternal(version);\n\n\tconst value = serializeHandles(storedValueType, serializer, bind);\n\treturn {\n\t\ttype: \"sharedStringIntervalCollection\",\n\t\tvalue: value && JSON.parse(value),\n\t};\n}\n"]}
@@ -5,7 +5,7 @@
5
5
  import { Client } from "@fluidframework/merge-tree/internal";
6
6
  import { SequenceInterval } from "../intervals/index.js";
7
7
  import { ISharedString } from "../sharedString.js";
8
- import { type SequenceIntervalIndex } from "./intervalIndex.js";
8
+ import type { SequenceIntervalIndex } from "./intervalIndex.js";
9
9
  /**
10
10
  * Collection of intervals.
11
11
  *
@@ -1 +1 @@
1
- {"version":3,"file":"endpointInRangeIndex.d.ts","sourceRoot":"","sources":["../../src/intervalIndex/endpointInRangeIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAgC,MAAM,qCAAqC,CAAC;AAE3F,OAAO,EAAE,gBAAgB,EAA2B,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAOhE;;;;;GAKG;AACH,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IACnE;;OAEG;IACH,gCAAgC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAAC;CACjF;AAED,qBAAa,oBAAqB,YAAW,qBAAqB;IAGrD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAED,MAAM,EAAE,MAAM;IA0BpC,GAAG,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIrC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIxC,gCAAgC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,EAAE;CAqBvF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACzC,YAAY,EAAE,aAAa,GACzB,qBAAqB,CAGvB"}
1
+ {"version":3,"file":"endpointInRangeIndex.d.ts","sourceRoot":"","sources":["../../src/intervalIndex/endpointInRangeIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAgC,MAAM,qCAAqC,CAAC;AAE3F,OAAO,EAAE,gBAAgB,EAA2B,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAOhE;;;;;GAKG;AACH,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IACnE;;OAEG;IACH,gCAAgC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAAC;CACjF;AAED,qBAAa,oBAAqB,YAAW,qBAAqB;IAGrD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAED,MAAM,EAAE,MAAM;IA0BpC,GAAG,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIrC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIxC,gCAAgC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,EAAE;CAqBvF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACzC,YAAY,EAAE,aAAa,GACzB,qBAAqB,CAGvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"endpointInRangeIndex.js","sourceRoot":"","sources":["../../src/intervalIndex/endpointInRangeIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAA0B,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAE3F,OAAO,EAAoB,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAIlF,OAAO,EAEN,oBAAoB,EACpB,YAAY,GACZ,MAAM,yBAAyB,CAAC;AAejC,MAAM,OAAO,oBAAoB;IAGhC,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QAC1C,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CACnC,CAAC,CAAmB,EAAE,CAAmB,EAAE,EAAE;YAC5C,MAAM,iBAAiB,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,iBAAiB,KAAK,CAAC,EAAE,CAAC;gBAC7B,OAAO,iBAAiB,CAAC;YAC1B,CAAC;YAED,MAAM,uBAAuB,GAAG,oBAAoB,CACnD,CAAmC,EACnC,CAAmC,CACnC,CAAC;YACF,IAAI,uBAAuB,KAAK,CAAC,EAAE,CAAC;gBACnC,OAAO,uBAAuB,CAAC;YAChC,CAAC;YAED,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;YAC9B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC5C,OAAO,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;YACD,OAAO,CAAC,CAAC;QACV,CAAC,CACD,CAAC;IACH,CAAC;IAEM,GAAG,CAAC,QAA0B;QACpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAEM,MAAM,CAAC,QAA0B;QACvC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAEM,gCAAgC,CAAC,KAAa,EAAE,GAAW;QACjE,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9D,OAAO,EAAE,CAAC;QACX,CAAC;QACD,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,MAAM,MAAM,GAAuD,CAAC,IAAI,EAAE,EAAE;YAC3E,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACb,CAAC,CAAC;QAEF,MAAM,sBAAsB,GAAG,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAElF,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAE5E,sDAAsD;QACrD,sBAAyD,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7E,oBAAuD,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAE3E,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,CAAC,CAAC;QAC1F,OAAO,OAAO,CAAC;IAChB,CAAC;CACD;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACzC,YAA2B;IAE3B,MAAM,MAAM,GAAI,YAA8C,CAAC,MAAM,CAAC;IACtE,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Client, PropertyAction, RedBlackTree } from \"@fluidframework/merge-tree/internal\";\n\nimport { SequenceInterval, createTransientInterval } from \"../intervals/index.js\";\nimport { ISharedString } from \"../sharedString.js\";\n\nimport { type SequenceIntervalIndex } from \"./intervalIndex.js\";\nimport {\n\tHasComparisonOverride,\n\tcompareOverrideables,\n\tforceCompare,\n} from \"./intervalIndexUtils.js\";\n\n/**\n * Collection of intervals.\n *\n * Provide additional APIs to support efficiently querying a collection of intervals whose endpoints fall within a specified range.\n * @internal\n */\nexport interface IEndpointInRangeIndex extends SequenceIntervalIndex {\n\t/**\n\t * @returns an array of all intervals contained in this collection whose endpoints locate in the range [start, end] (includes both ends)\n\t */\n\tfindIntervalsWithEndpointInRange(start: number, end: number): SequenceInterval[];\n}\n\nexport class EndpointInRangeIndex implements IEndpointInRangeIndex {\n\tprivate readonly intervalTree;\n\n\tconstructor(private readonly client: Client) {\n\t\tthis.intervalTree = new RedBlackTree<SequenceInterval, SequenceInterval>(\n\t\t\t(a: SequenceInterval, b: SequenceInterval) => {\n\t\t\t\tconst compareEndsResult = a.compareEnd(b);\n\t\t\t\tif (compareEndsResult !== 0) {\n\t\t\t\t\treturn compareEndsResult;\n\t\t\t\t}\n\n\t\t\t\tconst overrideablesComparison = compareOverrideables(\n\t\t\t\t\ta as Partial<HasComparisonOverride>,\n\t\t\t\t\tb as Partial<HasComparisonOverride>,\n\t\t\t\t);\n\t\t\t\tif (overrideablesComparison !== 0) {\n\t\t\t\t\treturn overrideablesComparison;\n\t\t\t\t}\n\n\t\t\t\tconst aId = a.getIntervalId();\n\t\t\t\tconst bId = b.getIntervalId();\n\t\t\t\tif (aId !== undefined && bId !== undefined) {\n\t\t\t\t\treturn aId.localeCompare(bId);\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic add(interval: SequenceInterval): void {\n\t\tthis.intervalTree.put(interval, interval);\n\t}\n\n\tpublic remove(interval: SequenceInterval): void {\n\t\tthis.intervalTree.remove(interval);\n\t}\n\n\tpublic findIntervalsWithEndpointInRange(start: number, end: number): SequenceInterval[] {\n\t\tif (start <= 0 || start > end || this.intervalTree.isEmpty()) {\n\t\t\treturn [];\n\t\t}\n\t\tconst results: SequenceInterval[] = [];\n\t\tconst action: PropertyAction<SequenceInterval, SequenceInterval> = (node) => {\n\t\t\tresults.push(node.data);\n\t\t\treturn true;\n\t\t};\n\n\t\tconst transientStartInterval = createTransientInterval(start, start, this.client);\n\n\t\tconst transientEndInterval = createTransientInterval(end, end, this.client);\n\n\t\t// Add comparison overrides to the transient intervals\n\t\t(transientStartInterval as Partial<HasComparisonOverride>)[forceCompare] = -1;\n\t\t(transientEndInterval as Partial<HasComparisonOverride>)[forceCompare] = 1;\n\n\t\tthis.intervalTree.mapRange(action, results, transientStartInterval, transientEndInterval);\n\t\treturn results;\n\t}\n}\n\n/**\n * @internal\n */\nexport function createEndpointInRangeIndex(\n\tsharedString: ISharedString,\n): IEndpointInRangeIndex {\n\tconst client = (sharedString as unknown as { client: Client }).client;\n\treturn new EndpointInRangeIndex(client);\n}\n"]}
1
+ {"version":3,"file":"endpointInRangeIndex.js","sourceRoot":"","sources":["../../src/intervalIndex/endpointInRangeIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAA0B,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAE3F,OAAO,EAAoB,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAIlF,OAAO,EAEN,oBAAoB,EACpB,YAAY,GACZ,MAAM,yBAAyB,CAAC;AAejC,MAAM,OAAO,oBAAoB;IAGhC,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QAC1C,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CACnC,CAAC,CAAmB,EAAE,CAAmB,EAAE,EAAE;YAC5C,MAAM,iBAAiB,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,iBAAiB,KAAK,CAAC,EAAE,CAAC;gBAC7B,OAAO,iBAAiB,CAAC;YAC1B,CAAC;YAED,MAAM,uBAAuB,GAAG,oBAAoB,CACnD,CAAmC,EACnC,CAAmC,CACnC,CAAC;YACF,IAAI,uBAAuB,KAAK,CAAC,EAAE,CAAC;gBACnC,OAAO,uBAAuB,CAAC;YAChC,CAAC;YAED,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;YAC9B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC5C,OAAO,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;YACD,OAAO,CAAC,CAAC;QACV,CAAC,CACD,CAAC;IACH,CAAC;IAEM,GAAG,CAAC,QAA0B;QACpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAEM,MAAM,CAAC,QAA0B;QACvC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAEM,gCAAgC,CAAC,KAAa,EAAE,GAAW;QACjE,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9D,OAAO,EAAE,CAAC;QACX,CAAC;QACD,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,MAAM,MAAM,GAAuD,CAAC,IAAI,EAAE,EAAE;YAC3E,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACb,CAAC,CAAC;QAEF,MAAM,sBAAsB,GAAG,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAElF,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAE5E,sDAAsD;QACrD,sBAAyD,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7E,oBAAuD,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAE3E,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,CAAC,CAAC;QAC1F,OAAO,OAAO,CAAC;IAChB,CAAC;CACD;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACzC,YAA2B;IAE3B,MAAM,MAAM,GAAI,YAA8C,CAAC,MAAM,CAAC;IACtE,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Client, PropertyAction, RedBlackTree } from \"@fluidframework/merge-tree/internal\";\n\nimport { SequenceInterval, createTransientInterval } from \"../intervals/index.js\";\nimport { ISharedString } from \"../sharedString.js\";\n\nimport type { SequenceIntervalIndex } from \"./intervalIndex.js\";\nimport {\n\tHasComparisonOverride,\n\tcompareOverrideables,\n\tforceCompare,\n} from \"./intervalIndexUtils.js\";\n\n/**\n * Collection of intervals.\n *\n * Provide additional APIs to support efficiently querying a collection of intervals whose endpoints fall within a specified range.\n * @internal\n */\nexport interface IEndpointInRangeIndex extends SequenceIntervalIndex {\n\t/**\n\t * @returns an array of all intervals contained in this collection whose endpoints locate in the range [start, end] (includes both ends)\n\t */\n\tfindIntervalsWithEndpointInRange(start: number, end: number): SequenceInterval[];\n}\n\nexport class EndpointInRangeIndex implements IEndpointInRangeIndex {\n\tprivate readonly intervalTree;\n\n\tconstructor(private readonly client: Client) {\n\t\tthis.intervalTree = new RedBlackTree<SequenceInterval, SequenceInterval>(\n\t\t\t(a: SequenceInterval, b: SequenceInterval) => {\n\t\t\t\tconst compareEndsResult = a.compareEnd(b);\n\t\t\t\tif (compareEndsResult !== 0) {\n\t\t\t\t\treturn compareEndsResult;\n\t\t\t\t}\n\n\t\t\t\tconst overrideablesComparison = compareOverrideables(\n\t\t\t\t\ta as Partial<HasComparisonOverride>,\n\t\t\t\t\tb as Partial<HasComparisonOverride>,\n\t\t\t\t);\n\t\t\t\tif (overrideablesComparison !== 0) {\n\t\t\t\t\treturn overrideablesComparison;\n\t\t\t\t}\n\n\t\t\t\tconst aId = a.getIntervalId();\n\t\t\t\tconst bId = b.getIntervalId();\n\t\t\t\tif (aId !== undefined && bId !== undefined) {\n\t\t\t\t\treturn aId.localeCompare(bId);\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic add(interval: SequenceInterval): void {\n\t\tthis.intervalTree.put(interval, interval);\n\t}\n\n\tpublic remove(interval: SequenceInterval): void {\n\t\tthis.intervalTree.remove(interval);\n\t}\n\n\tpublic findIntervalsWithEndpointInRange(start: number, end: number): SequenceInterval[] {\n\t\tif (start <= 0 || start > end || this.intervalTree.isEmpty()) {\n\t\t\treturn [];\n\t\t}\n\t\tconst results: SequenceInterval[] = [];\n\t\tconst action: PropertyAction<SequenceInterval, SequenceInterval> = (node) => {\n\t\t\tresults.push(node.data);\n\t\t\treturn true;\n\t\t};\n\n\t\tconst transientStartInterval = createTransientInterval(start, start, this.client);\n\n\t\tconst transientEndInterval = createTransientInterval(end, end, this.client);\n\n\t\t// Add comparison overrides to the transient intervals\n\t\t(transientStartInterval as Partial<HasComparisonOverride>)[forceCompare] = -1;\n\t\t(transientEndInterval as Partial<HasComparisonOverride>)[forceCompare] = 1;\n\n\t\tthis.intervalTree.mapRange(action, results, transientStartInterval, transientEndInterval);\n\t\treturn results;\n\t}\n}\n\n/**\n * @internal\n */\nexport function createEndpointInRangeIndex(\n\tsharedString: ISharedString,\n): IEndpointInRangeIndex {\n\tconst client = (sharedString as unknown as { client: Client }).client;\n\treturn new EndpointInRangeIndex(client);\n}\n"]}
@@ -5,7 +5,7 @@
5
5
  import { Client } from "@fluidframework/merge-tree/internal";
6
6
  import { SequenceInterval } from "../intervals/index.js";
7
7
  import { ISharedString } from "../sharedString.js";
8
- import { type SequenceIntervalIndex } from "./intervalIndex.js";
8
+ import type { SequenceIntervalIndex } from "./intervalIndex.js";
9
9
  /**
10
10
  * @internal
11
11
  */
@@ -1 +1 @@
1
- {"version":3,"file":"endpointIndex.d.ts","sourceRoot":"","sources":["../../src/intervalIndex/endpointIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAgB,MAAM,qCAAqC,CAAC;AAE3E,OAAO,EAA2B,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,qBAAqB;IAC5D;;;OAGG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;IAE5D;;;OAGG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;CACxD;AAED,qBAAa,aAAc,YAAW,cAAc;IAGvC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmD;gBAEtD,MAAM,EAAE,MAAM;IAMpC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAQ3D,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAQvD,GAAG,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIrC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;CAG/C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,aAAa,GAAG,cAAc,CAG/E"}
1
+ {"version":3,"file":"endpointIndex.d.ts","sourceRoot":"","sources":["../../src/intervalIndex/endpointIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAgB,MAAM,qCAAqC,CAAC;AAE3E,OAAO,EAA2B,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,qBAAqB;IAC5D;;;OAGG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;IAE5D;;;OAGG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;CACxD;AAED,qBAAa,aAAc,YAAW,cAAc;IAGvC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmD;gBAEtD,MAAM,EAAE,MAAM;IAMpC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAQ3D,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAQvD,GAAG,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIrC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;CAG/C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,aAAa,GAAG,cAAc,CAG/E"}
@@ -1 +1 @@
1
- {"version":3,"file":"endpointIndex.js","sourceRoot":"","sources":["../../src/intervalIndex/endpointIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAU,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAE3E,OAAO,EAAE,uBAAuB,EAAoB,MAAM,uBAAuB,CAAC;AAsBlF,MAAM,OAAO,aAAa;IAGzB,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QAC1C,IAAI,CAAC,eAAe,GAAG,IAAI,YAAY,CAAqC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACpF,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CACf,CAAC;IACH,CAAC;IAEM,gBAAgB,CAAC,GAAW;QAClC,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC7D,IAAI,MAAM,EAAE,CAAC;YACZ,OAAO,MAAM,CAAC,IAAI,CAAC;QACpB,CAAC;IACF,CAAC;IAEM,YAAY,CAAC,GAAW;QAC9B,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC5D,IAAI,MAAM,EAAE,CAAC;YACZ,OAAO,MAAM,CAAC,IAAI,CAAC;QACpB,CAAC;IACF,CAAC;IAEM,GAAG,CAAC,QAA0B;QACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAEM,MAAM,CAAC,QAA0B;QACvC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;CACD;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAA2B;IAC9D,MAAM,MAAM,GAAI,YAA8C,CAAC,MAAM,CAAC;IACtE,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Client, RedBlackTree } from \"@fluidframework/merge-tree/internal\";\n\nimport { createTransientInterval, SequenceInterval } from \"../intervals/index.js\";\nimport { ISharedString } from \"../sharedString.js\";\n\nimport { type SequenceIntervalIndex } from \"./intervalIndex.js\";\n\n/**\n * @internal\n */\nexport interface IEndpointIndex extends SequenceIntervalIndex {\n\t/**\n\t * @returns the previous interval based on the given position number.\n\t * If no such interval exists in this index, returns `undefined`\n\t */\n\tpreviousInterval(pos: number): SequenceInterval | undefined;\n\n\t/**\n\t * @returns the next interval based on the given position number.\n\t * If no such interval exists in this index, returns `undefined`\n\t */\n\tnextInterval(pos: number): SequenceInterval | undefined;\n}\n\nexport class EndpointIndex implements IEndpointIndex {\n\tprivate readonly endIntervalTree: RedBlackTree<SequenceInterval, SequenceInterval>;\n\n\tconstructor(private readonly client: Client) {\n\t\tthis.endIntervalTree = new RedBlackTree<SequenceInterval, SequenceInterval>((a, b) =>\n\t\t\ta.compareEnd(b),\n\t\t);\n\t}\n\n\tpublic previousInterval(pos: number): SequenceInterval | undefined {\n\t\tconst transientInterval = createTransientInterval(pos, pos, this.client);\n\t\tconst rbNode = this.endIntervalTree.floor(transientInterval);\n\t\tif (rbNode) {\n\t\t\treturn rbNode.data;\n\t\t}\n\t}\n\n\tpublic nextInterval(pos: number): SequenceInterval | undefined {\n\t\tconst transientInterval = createTransientInterval(pos, pos, this.client);\n\t\tconst rbNode = this.endIntervalTree.ceil(transientInterval);\n\t\tif (rbNode) {\n\t\t\treturn rbNode.data;\n\t\t}\n\t}\n\n\tpublic add(interval: SequenceInterval): void {\n\t\tthis.endIntervalTree.put(interval, interval);\n\t}\n\n\tpublic remove(interval: SequenceInterval): void {\n\t\tthis.endIntervalTree.remove(interval);\n\t}\n}\n\n/**\n * @internal\n */\nexport function createEndpointIndex(sharedString: ISharedString): IEndpointIndex {\n\tconst client = (sharedString as unknown as { client: Client }).client;\n\treturn new EndpointIndex(client);\n}\n"]}
1
+ {"version":3,"file":"endpointIndex.js","sourceRoot":"","sources":["../../src/intervalIndex/endpointIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAU,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAE3E,OAAO,EAAE,uBAAuB,EAAoB,MAAM,uBAAuB,CAAC;AAsBlF,MAAM,OAAO,aAAa;IAGzB,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QAC1C,IAAI,CAAC,eAAe,GAAG,IAAI,YAAY,CAAqC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACpF,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CACf,CAAC;IACH,CAAC;IAEM,gBAAgB,CAAC,GAAW;QAClC,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC7D,IAAI,MAAM,EAAE,CAAC;YACZ,OAAO,MAAM,CAAC,IAAI,CAAC;QACpB,CAAC;IACF,CAAC;IAEM,YAAY,CAAC,GAAW;QAC9B,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC5D,IAAI,MAAM,EAAE,CAAC;YACZ,OAAO,MAAM,CAAC,IAAI,CAAC;QACpB,CAAC;IACF,CAAC;IAEM,GAAG,CAAC,QAA0B;QACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAEM,MAAM,CAAC,QAA0B;QACvC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;CACD;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAA2B;IAC9D,MAAM,MAAM,GAAI,YAA8C,CAAC,MAAM,CAAC;IACtE,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Client, RedBlackTree } from \"@fluidframework/merge-tree/internal\";\n\nimport { createTransientInterval, SequenceInterval } from \"../intervals/index.js\";\nimport { ISharedString } from \"../sharedString.js\";\n\nimport type { SequenceIntervalIndex } from \"./intervalIndex.js\";\n\n/**\n * @internal\n */\nexport interface IEndpointIndex extends SequenceIntervalIndex {\n\t/**\n\t * @returns the previous interval based on the given position number.\n\t * If no such interval exists in this index, returns `undefined`\n\t */\n\tpreviousInterval(pos: number): SequenceInterval | undefined;\n\n\t/**\n\t * @returns the next interval based on the given position number.\n\t * If no such interval exists in this index, returns `undefined`\n\t */\n\tnextInterval(pos: number): SequenceInterval | undefined;\n}\n\nexport class EndpointIndex implements IEndpointIndex {\n\tprivate readonly endIntervalTree: RedBlackTree<SequenceInterval, SequenceInterval>;\n\n\tconstructor(private readonly client: Client) {\n\t\tthis.endIntervalTree = new RedBlackTree<SequenceInterval, SequenceInterval>((a, b) =>\n\t\t\ta.compareEnd(b),\n\t\t);\n\t}\n\n\tpublic previousInterval(pos: number): SequenceInterval | undefined {\n\t\tconst transientInterval = createTransientInterval(pos, pos, this.client);\n\t\tconst rbNode = this.endIntervalTree.floor(transientInterval);\n\t\tif (rbNode) {\n\t\t\treturn rbNode.data;\n\t\t}\n\t}\n\n\tpublic nextInterval(pos: number): SequenceInterval | undefined {\n\t\tconst transientInterval = createTransientInterval(pos, pos, this.client);\n\t\tconst rbNode = this.endIntervalTree.ceil(transientInterval);\n\t\tif (rbNode) {\n\t\t\treturn rbNode.data;\n\t\t}\n\t}\n\n\tpublic add(interval: SequenceInterval): void {\n\t\tthis.endIntervalTree.put(interval, interval);\n\t}\n\n\tpublic remove(interval: SequenceInterval): void {\n\t\tthis.endIntervalTree.remove(interval);\n\t}\n}\n\n/**\n * @internal\n */\nexport function createEndpointIndex(sharedString: ISharedString): IEndpointIndex {\n\tconst client = (sharedString as unknown as { client: Client }).client;\n\treturn new EndpointIndex(client);\n}\n"]}
@@ -2,8 +2,8 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { type SequenceIntervalClass } from "../intervals/index.js";
6
- import { type SequenceIntervalIndex } from "./intervalIndex.js";
5
+ import type { SequenceIntervalClass } from "../intervals/index.js";
6
+ import type { SequenceIntervalIndex } from "./intervalIndex.js";
7
7
  export interface IIdIntervalIndex extends SequenceIntervalIndex, Iterable<SequenceIntervalClass> {
8
8
  getIntervalById(id: string): SequenceIntervalClass | undefined;
9
9
  [Symbol.iterator](): Iterator<SequenceIntervalClass>;
@@ -1 +1 @@
1
- {"version":3,"file":"idIntervalIndex.d.ts","sourceRoot":"","sources":["../../src/intervalIndex/idIntervalIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,WAAW,gBAChB,SAAQ,qBAAqB,EAC5B,QAAQ,CAAC,qBAAqB,CAAC;IAChC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAAC;IAE/D,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,qBAAqB,CAAC,CAAC;CACrD;AA4BD,wBAAgB,qBAAqB,IAAI,gBAAgB,CAExD"}
1
+ {"version":3,"file":"idIntervalIndex.d.ts","sourceRoot":"","sources":["../../src/intervalIndex/idIntervalIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,WAAW,gBAChB,SAAQ,qBAAqB,EAC5B,QAAQ,CAAC,qBAAqB,CAAC;IAChC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAAC;IAE/D,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,qBAAqB,CAAC,CAAC;CACrD;AA4BD,wBAAgB,qBAAqB,IAAI,gBAAgB,CAExD"}
@@ -1 +1 @@
1
- {"version":3,"file":"idIntervalIndex.js","sourceRoot":"","sources":["../../src/intervalIndex/idIntervalIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAa7D,MAAM,eAAe;IAArB;QACkB,kBAAa,GAAG,IAAI,GAAG,EAAiC,CAAC;IAwB3E,CAAC;IAtBO,GAAG,CAAC,QAA+B;QACzC,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,CACL,EAAE,KAAK,SAAS,EAChB,KAAK,CAAC,+DAA+D,CACrE,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,QAA+B;QAC5C,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,CAAC,EAAE,KAAK,SAAS,EAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACvE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAEM,eAAe,CAAC,EAAU;QAChC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAEM,CAAC,MAAM,CAAC,QAAQ,CAAC;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;IACpC,CAAC;CACD;AAED,MAAM,UAAU,qBAAqB;IACpC,OAAO,IAAI,eAAe,EAAE,CAAC;AAC9B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nimport { type SequenceIntervalClass } from \"../intervals/index.js\";\n\nimport { type SequenceIntervalIndex } from \"./intervalIndex.js\";\n\nexport interface IIdIntervalIndex\n\textends SequenceIntervalIndex,\n\t\tIterable<SequenceIntervalClass> {\n\tgetIntervalById(id: string): SequenceIntervalClass | undefined;\n\n\t[Symbol.iterator](): Iterator<SequenceIntervalClass>;\n}\nclass IdIntervalIndex implements IIdIntervalIndex, Iterable<SequenceIntervalClass> {\n\tprivate readonly intervalIdMap = new Map<string, SequenceIntervalClass>();\n\n\tpublic add(interval: SequenceIntervalClass) {\n\t\tconst id = interval.getIntervalId();\n\t\tassert(\n\t\t\tid !== undefined,\n\t\t\t0x2c0 /* \"ID must be created before adding interval to collection\" */,\n\t\t);\n\t\tthis.intervalIdMap.set(id, interval);\n\t}\n\n\tpublic remove(interval: SequenceIntervalClass) {\n\t\tconst id = interval.getIntervalId();\n\t\tassert(id !== undefined, 0x311 /* expected id to exist on interval */);\n\t\tthis.intervalIdMap.delete(id);\n\t}\n\n\tpublic getIntervalById(id: string): SequenceIntervalClass | undefined {\n\t\treturn this.intervalIdMap.get(id);\n\t}\n\n\tpublic [Symbol.iterator](): IterableIterator<SequenceIntervalClass> {\n\t\treturn this.intervalIdMap.values();\n\t}\n}\n\nexport function createIdIntervalIndex(): IIdIntervalIndex {\n\treturn new IdIntervalIndex();\n}\n"]}
1
+ {"version":3,"file":"idIntervalIndex.js","sourceRoot":"","sources":["../../src/intervalIndex/idIntervalIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAa7D,MAAM,eAAe;IAArB;QACkB,kBAAa,GAAG,IAAI,GAAG,EAAiC,CAAC;IAwB3E,CAAC;IAtBO,GAAG,CAAC,QAA+B;QACzC,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,CACL,EAAE,KAAK,SAAS,EAChB,KAAK,CAAC,+DAA+D,CACrE,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,QAA+B;QAC5C,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,CAAC,EAAE,KAAK,SAAS,EAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACvE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAEM,eAAe,CAAC,EAAU;QAChC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAEM,CAAC,MAAM,CAAC,QAAQ,CAAC;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;IACpC,CAAC;CACD;AAED,MAAM,UAAU,qBAAqB;IACpC,OAAO,IAAI,eAAe,EAAE,CAAC;AAC9B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nimport type { SequenceIntervalClass } from \"../intervals/index.js\";\n\nimport type { SequenceIntervalIndex } from \"./intervalIndex.js\";\n\nexport interface IIdIntervalIndex\n\textends SequenceIntervalIndex,\n\t\tIterable<SequenceIntervalClass> {\n\tgetIntervalById(id: string): SequenceIntervalClass | undefined;\n\n\t[Symbol.iterator](): Iterator<SequenceIntervalClass>;\n}\nclass IdIntervalIndex implements IIdIntervalIndex, Iterable<SequenceIntervalClass> {\n\tprivate readonly intervalIdMap = new Map<string, SequenceIntervalClass>();\n\n\tpublic add(interval: SequenceIntervalClass) {\n\t\tconst id = interval.getIntervalId();\n\t\tassert(\n\t\t\tid !== undefined,\n\t\t\t0x2c0 /* \"ID must be created before adding interval to collection\" */,\n\t\t);\n\t\tthis.intervalIdMap.set(id, interval);\n\t}\n\n\tpublic remove(interval: SequenceIntervalClass) {\n\t\tconst id = interval.getIntervalId();\n\t\tassert(id !== undefined, 0x311 /* expected id to exist on interval */);\n\t\tthis.intervalIdMap.delete(id);\n\t}\n\n\tpublic getIntervalById(id: string): SequenceIntervalClass | undefined {\n\t\treturn this.intervalIdMap.get(id);\n\t}\n\n\tpublic [Symbol.iterator](): IterableIterator<SequenceIntervalClass> {\n\t\treturn this.intervalIdMap.values();\n\t}\n}\n\nexport function createIdIntervalIndex(): IIdIntervalIndex {\n\treturn new IdIntervalIndex();\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { type SequenceInterval } from "../intervals/index.js";
5
+ import type { SequenceInterval } from "../intervals/index.js";
6
6
  /**
7
7
  * Collection of intervals.
8
8
  *
@@ -1 +1 @@
1
- {"version":3,"file":"intervalIndex.d.ts","sourceRoot":"","sources":["../../src/intervalIndex/intervalIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;;;;;;;GASG;AACH,MAAM,WAAW,qBAAqB;IACrC;;;;OAIG;IACH,GAAG,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAEtC;;;;OAIG;IACH,MAAM,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACzC"}
1
+ {"version":3,"file":"intervalIndex.d.ts","sourceRoot":"","sources":["../../src/intervalIndex/intervalIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;;;;;;;GASG;AACH,MAAM,WAAW,qBAAqB;IACrC;;;;OAIG;IACH,GAAG,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAEtC;;;;OAIG;IACH,MAAM,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACzC"}
@@ -1 +1 @@
1
- {"version":3,"file":"intervalIndex.js","sourceRoot":"","sources":["../../src/intervalIndex/intervalIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { type SequenceInterval } from \"../intervals/index.js\";\n\n/**\n * Collection of intervals.\n *\n * Implementers of this interface will typically implement additional APIs to support efficiently querying a collection\n * of intervals in some manner, for example:\n * - \"find all intervals with start endpoint between these two points\"\n * - \"find all intervals which overlap this range\"\n * etc.\n * @legacy @beta\n */\nexport interface SequenceIntervalIndex {\n\t/**\n\t * Adds an interval to the index.\n\t * @remarks Application code should never need to invoke this method on their index for production scenarios:\n\t * Fluid handles adding and removing intervals from an index in response to sequence or interval changes.\n\t */\n\tadd(interval: SequenceInterval): void;\n\n\t/**\n\t * Removes an interval from the index.\n\t * @remarks Application code should never need to invoke this method on their index for production scenarios:\n\t * Fluid handles adding and removing intervals from an index in response to sequence or interval changes.\n\t */\n\tremove(interval: SequenceInterval): void;\n}\n"]}
1
+ {"version":3,"file":"intervalIndex.js","sourceRoot":"","sources":["../../src/intervalIndex/intervalIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { SequenceInterval } from \"../intervals/index.js\";\n\n/**\n * Collection of intervals.\n *\n * Implementers of this interface will typically implement additional APIs to support efficiently querying a collection\n * of intervals in some manner, for example:\n * - \"find all intervals with start endpoint between these two points\"\n * - \"find all intervals which overlap this range\"\n * etc.\n * @legacy @beta\n */\nexport interface SequenceIntervalIndex {\n\t/**\n\t * Adds an interval to the index.\n\t * @remarks Application code should never need to invoke this method on their index for production scenarios:\n\t * Fluid handles adding and removing intervals from an index in response to sequence or interval changes.\n\t */\n\tadd(interval: SequenceInterval): void;\n\n\t/**\n\t * Removes an interval from the index.\n\t * @remarks Application code should never need to invoke this method on their index for production scenarios:\n\t * Fluid handles adding and removing intervals from an index in response to sequence or interval changes.\n\t */\n\tremove(interval: SequenceInterval): void;\n}\n"]}
@@ -6,7 +6,7 @@ import { Client, SequencePlace } from "@fluidframework/merge-tree/internal";
6
6
  import { IntervalTree } from "../intervalTree.js";
7
7
  import { SequenceInterval, SequenceIntervalClass } from "../intervals/index.js";
8
8
  import { ISharedString } from "../sharedString.js";
9
- import { type SequenceIntervalIndex } from "./intervalIndex.js";
9
+ import type { SequenceIntervalIndex } from "./intervalIndex.js";
10
10
  /**
11
11
  * @legacy @beta
12
12
  */
@@ -1 +1 @@
1
- {"version":3,"file":"overlappingIntervalsIndex.d.ts","sourceRoot":"","sources":["../../src/intervalIndex/overlappingIntervalsIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,MAAM,EACN,aAAa,EAEb,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAgB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EACN,gBAAgB,EAChB,qBAAqB,EAErB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,kCAAmC,SAAQ,qBAAqB;IAChF;;;OAGG;IACH,wBAAwB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,GAAG,gBAAgB,EAAE,CAAC;IAEvF;;OAEG;IACH,sBAAsB,CACrB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,eAAe,EAAE,OAAO,EACxB,KAAK,CAAC,EAAE,aAAa,EACrB,GAAG,CAAC,EAAE,aAAa,GACjB,IAAI,CAAC;CACR;AAED,qBAAa,yBAA0B,YAAW,kCAAkC;IACnF,SAAS,CAAC,QAAQ,CAAC,YAAY,sCAA6C;IAC5E,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEtB,MAAM,EAAE,MAAM;IAInB,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI;IAI5C,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,OAAO;IAIpD,sBAAsB,CAC5B,OAAO,EAAE,gBAAgB,EAAE,EAC3B,eAAe,EAAE,OAAO,EACxB,KAAK,CAAC,EAAE,aAAa,EACrB,GAAG,CAAC,EAAE,aAAa,GACjB,IAAI;IA2EA,wBAAwB,CAC9B,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,aAAa,GAChB,gBAAgB,EAAE;IAmBd,MAAM,CAAC,QAAQ,EAAE,qBAAqB;IAItC,GAAG,CAAC,QAAQ,EAAE,qBAAqB;CAG1C;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAC9C,YAAY,EAAE,aAAa,GACzB,kCAAkC,CAGpC"}
1
+ {"version":3,"file":"overlappingIntervalsIndex.d.ts","sourceRoot":"","sources":["../../src/intervalIndex/overlappingIntervalsIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,MAAM,EACN,aAAa,EAEb,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAgB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EACN,gBAAgB,EAChB,qBAAqB,EAErB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,kCAAmC,SAAQ,qBAAqB;IAChF;;;OAGG;IACH,wBAAwB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,GAAG,gBAAgB,EAAE,CAAC;IAEvF;;OAEG;IACH,sBAAsB,CACrB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,eAAe,EAAE,OAAO,EACxB,KAAK,CAAC,EAAE,aAAa,EACrB,GAAG,CAAC,EAAE,aAAa,GACjB,IAAI,CAAC;CACR;AAED,qBAAa,yBAA0B,YAAW,kCAAkC;IACnF,SAAS,CAAC,QAAQ,CAAC,YAAY,sCAA6C;IAC5E,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEtB,MAAM,EAAE,MAAM;IAInB,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI;IAI5C,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,OAAO;IAIpD,sBAAsB,CAC5B,OAAO,EAAE,gBAAgB,EAAE,EAC3B,eAAe,EAAE,OAAO,EACxB,KAAK,CAAC,EAAE,aAAa,EACrB,GAAG,CAAC,EAAE,aAAa,GACjB,IAAI;IA2EA,wBAAwB,CAC9B,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,aAAa,GAChB,gBAAgB,EAAE;IAmBd,MAAM,CAAC,QAAQ,EAAE,qBAAqB;IAItC,GAAG,CAAC,QAAQ,EAAE,qBAAqB;CAG1C;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAC9C,YAAY,EAAE,aAAa,GACzB,kCAAkC,CAGpC"}