@fluidframework/sequence 0.58.2002 → 0.59.1000

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 (43) hide show
  1. package/README.md +3 -3
  2. package/dist/intervalCollection.d.ts +1 -1
  3. package/dist/intervalCollection.d.ts.map +1 -1
  4. package/dist/intervalCollection.js +34 -16
  5. package/dist/intervalCollection.js.map +1 -1
  6. package/dist/mapKernel.d.ts +8 -1
  7. package/dist/mapKernel.d.ts.map +1 -1
  8. package/dist/mapKernel.js +27 -16
  9. package/dist/mapKernel.js.map +1 -1
  10. package/dist/mapKernelInterfaces.d.ts +1 -1
  11. package/dist/mapKernelInterfaces.d.ts.map +1 -1
  12. package/dist/mapKernelInterfaces.js.map +1 -1
  13. package/dist/packageVersion.d.ts +1 -1
  14. package/dist/packageVersion.js +1 -1
  15. package/dist/packageVersion.js.map +1 -1
  16. package/dist/sequence.d.ts +10 -0
  17. package/dist/sequence.d.ts.map +1 -1
  18. package/dist/sequence.js +14 -1
  19. package/dist/sequence.js.map +1 -1
  20. package/lib/intervalCollection.d.ts +1 -1
  21. package/lib/intervalCollection.d.ts.map +1 -1
  22. package/lib/intervalCollection.js +35 -17
  23. package/lib/intervalCollection.js.map +1 -1
  24. package/lib/mapKernel.d.ts +8 -1
  25. package/lib/mapKernel.d.ts.map +1 -1
  26. package/lib/mapKernel.js +27 -16
  27. package/lib/mapKernel.js.map +1 -1
  28. package/lib/mapKernelInterfaces.d.ts +1 -1
  29. package/lib/mapKernelInterfaces.d.ts.map +1 -1
  30. package/lib/mapKernelInterfaces.js.map +1 -1
  31. package/lib/packageVersion.d.ts +1 -1
  32. package/lib/packageVersion.js +1 -1
  33. package/lib/packageVersion.js.map +1 -1
  34. package/lib/sequence.d.ts +10 -0
  35. package/lib/sequence.d.ts.map +1 -1
  36. package/lib/sequence.js +14 -1
  37. package/lib/sequence.js.map +1 -1
  38. package/package.json +21 -15
  39. package/src/intervalCollection.ts +29 -19
  40. package/src/mapKernel.ts +39 -21
  41. package/src/mapKernelInterfaces.ts +1 -1
  42. package/src/packageVersion.ts +1 -1
  43. package/src/sequence.ts +17 -1
@@ -1 +1 @@
1
- {"version":3,"file":"intervalCollection.js","sourceRoot":"","sources":["../src/intervalCollection.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable no-bitwise */\n\nimport { TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport { IEvent } from \"@fluidframework/common-definitions\";\nimport {\n addProperties,\n Client,\n ConflictAction,\n createMap,\n ICombiningOp,\n IInterval,\n IntervalConflictResolver,\n IntervalNode,\n IntervalTree,\n LocalReference,\n MergeTreeDeltaType,\n PropertiesManager,\n PropertySet,\n RedBlackTree,\n ReferenceType,\n reservedRangeLabelsKey,\n UnassignedSequenceNumber,\n} from \"@fluidframework/merge-tree\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { v4 as uuid } from \"uuid\";\nimport { IValueFactory, IValueOpEmitter, IValueOperation, IValueType } from \"./mapKernelInterfaces\";\n\nconst reservedIntervalIdKey = \"intervalId\";\n\nexport enum IntervalType {\n Simple = 0x0,\n Nest = 0x1,\n SlideOnRemove = 0x2,\n Transient = 0x4,\n}\n\nexport interface ISerializedInterval {\n sequenceNumber: number;\n start: number;\n end: number;\n intervalType: IntervalType;\n properties?: PropertySet;\n}\n\nexport interface ISerializableInterval extends IInterval {\n properties: PropertySet;\n propertyManager: PropertiesManager;\n serialize(client: Client): ISerializedInterval;\n addProperties(props: PropertySet, collaborating?: boolean, seq?: number):\n PropertySet | undefined;\n getIntervalId(): string | undefined;\n}\n\nexport interface IIntervalHelpers<TInterval extends ISerializableInterval> {\n compareEnds(a: TInterval, b: TInterval): number;\n create(label: string, start: number, end: number,\n client: Client, intervalType?: IntervalType, op?: ISequencedDocumentMessage): TInterval;\n}\n\nexport class Interval implements ISerializableInterval {\n public properties: PropertySet;\n public auxProps: PropertySet[];\n public propertyManager: PropertiesManager;\n constructor(\n public start: number,\n public end: number,\n props?: PropertySet) {\n if (props) {\n this.addProperties(props);\n }\n }\n\n public getIntervalId(): string | undefined {\n const id = this.properties?.[reservedIntervalIdKey];\n if (id === undefined) {\n return undefined;\n }\n return `${id}`;\n }\n\n public getAdditionalPropertySets() {\n return this.auxProps;\n }\n\n public addPropertySet(props: PropertySet) {\n if (this.auxProps === undefined) {\n this.auxProps = [];\n }\n this.auxProps.push(props);\n }\n\n public serialize(client: Client) {\n let seq = 0;\n if (client) {\n seq = client.getCurrentSeq();\n }\n\n const serializedInterval: ISerializedInterval = {\n end: this.end,\n intervalType: 0,\n sequenceNumber: seq,\n start: this.start,\n };\n if (this.properties) {\n serializedInterval.properties = this.properties;\n }\n return serializedInterval;\n }\n\n public clone() {\n return new Interval(this.start, this.end, this.properties);\n }\n\n public compare(b: Interval) {\n const startResult = this.compareStart(b);\n if (startResult === 0) {\n const endResult = this.compareEnd(b);\n if (endResult === 0) {\n const thisId = this.getIntervalId();\n if (thisId) {\n const bId = b.getIntervalId();\n if (bId) {\n return thisId > bId ? 1 : thisId < bId ? -1 : 0;\n }\n return 0;\n }\n return 0;\n }\n else {\n return endResult;\n }\n } else {\n return startResult;\n }\n }\n\n public compareStart(b: Interval) {\n return this.start - b.start;\n }\n\n public compareEnd(b: Interval) {\n return this.end - b.end;\n }\n\n public overlaps(b: Interval) {\n const result = (this.start < b.end) &&\n (this.end >= b.start);\n return result;\n }\n\n public union(b: Interval) {\n return new Interval(Math.min(this.start, b.start),\n Math.max(this.end, b.end), this.properties);\n }\n\n public getProperties() {\n return this.properties;\n }\n\n public addProperties(\n newProps: PropertySet,\n collaborating: boolean = false,\n seq?: number,\n op?: ICombiningOp,\n ): PropertySet | undefined {\n if (newProps) {\n if (!this.propertyManager) {\n this.propertyManager = new PropertiesManager();\n }\n if (!this.properties) {\n this.properties = createMap<any>();\n }\n return this.propertyManager.addProperties(this.properties, newProps, op, seq, collaborating);\n }\n }\n\n public modify(label: string, start: number, end: number, op?: ISequencedDocumentMessage) {\n const startPos = start ?? this.start;\n const endPos = end ?? this.end;\n if (this.start === startPos && this.end === endPos) {\n // Return undefined to indicate that no change is necessary.\n return;\n }\n return new Interval(startPos, endPos, this.properties);\n }\n}\n\nexport class SequenceInterval implements ISerializableInterval {\n public properties: PropertySet;\n public propertyManager: PropertiesManager;\n\n constructor(\n public start: LocalReference,\n public end: LocalReference,\n public intervalType: IntervalType,\n props?: PropertySet) {\n if (props) {\n this.addProperties(props);\n }\n }\n\n public serialize(client: Client) {\n const startPosition = this.start.toPosition();\n const endPosition = this.end.toPosition();\n const serializedInterval: ISerializedInterval = {\n end: endPosition,\n intervalType: this.intervalType,\n sequenceNumber: client.getCurrentSeq(),\n start: startPosition,\n };\n if (this.properties) {\n serializedInterval.properties = this.properties;\n }\n return serializedInterval;\n }\n\n public clone() {\n return new SequenceInterval(this.start, this.end, this.intervalType, this.properties);\n }\n\n public compare(b: SequenceInterval) {\n const startResult = this.compareStart(b);\n if (startResult === 0) {\n const endResult = this.compareEnd(b);\n if (endResult === 0) {\n const thisId = this.getIntervalId();\n if (thisId) {\n const bId = b.getIntervalId();\n if (bId) {\n return thisId > bId ? 1 : thisId < bId ? -1 : 0;\n }\n return 0;\n }\n return 0;\n }\n else {\n return endResult;\n }\n } else {\n return startResult;\n }\n }\n\n public compareStart(b: SequenceInterval) {\n return this.start.compare(b.start);\n }\n\n public compareEnd(b: SequenceInterval) {\n return this.end.compare(b.end);\n }\n\n public overlaps(b: SequenceInterval) {\n const result = (this.start.compare(b.end) < 0) &&\n (this.end.compare(b.start) >= 0);\n return result;\n }\n\n public getIntervalId(): string | undefined {\n const id = this.properties?.[reservedIntervalIdKey];\n if (id === undefined) {\n return undefined;\n }\n return `${id}`;\n }\n\n public union(b: SequenceInterval) {\n return new SequenceInterval(this.start.min(b.start),\n this.end.max(b.end), this.intervalType);\n }\n\n public addProperties(\n newProps: PropertySet,\n collab: boolean = false,\n seq?: number,\n op?: ICombiningOp,\n ): PropertySet | undefined {\n if (!this.propertyManager) {\n this.propertyManager = new PropertiesManager();\n }\n if (!this.properties) {\n this.properties = createMap<any>();\n }\n return this.propertyManager.addProperties(this.properties, newProps, op, seq, collab);\n }\n\n public overlapsPos(bstart: number, bend: number) {\n const startPos = this.start.toPosition();\n const endPos = this.start.toPosition();\n return (endPos > bstart) && (startPos < bend);\n }\n\n public modify(label: string, start: number, end: number, op?: ISequencedDocumentMessage) {\n const startPos = start ?? this.start.toPosition();\n const endPos = end ?? this.end.toPosition();\n\n if (this.start.toPosition() === startPos && this.end.toPosition() === endPos) {\n // Return undefined to indicate that no change is necessary.\n return;\n }\n\n const newInterval =\n createSequenceInterval(label, startPos, endPos, this.start.getClient(), this.intervalType, op);\n if (this.properties) {\n newInterval.addProperties(this.properties);\n }\n return newInterval;\n }\n}\n\nfunction createPositionReference(\n client: Client,\n pos: number,\n refType: ReferenceType,\n op?: ISequencedDocumentMessage): LocalReference {\n const segoff = client.getContainingSegment(pos, op);\n if (segoff && segoff.segment) {\n const lref = new LocalReference(client, segoff.segment, segoff.offset, refType);\n if (refType !== ReferenceType.Transient) {\n client.addLocalReference(lref);\n }\n return lref;\n }\n return new LocalReference(client, undefined);\n}\n\nfunction createSequenceInterval(\n label: string,\n start: number,\n end: number,\n client: Client,\n intervalType: IntervalType,\n op?: ISequencedDocumentMessage): SequenceInterval {\n let beginRefType = ReferenceType.RangeBegin;\n let endRefType = ReferenceType.RangeEnd;\n if (intervalType === IntervalType.Nest) {\n beginRefType = ReferenceType.NestBegin;\n endRefType = ReferenceType.NestEnd;\n } else if (intervalType === IntervalType.Transient) {\n beginRefType = ReferenceType.Transient;\n endRefType = ReferenceType.Transient;\n }\n\n // TODO: Should SlideOnRemove be the default behavior?\n if (intervalType & IntervalType.SlideOnRemove) {\n beginRefType |= ReferenceType.SlideOnRemove;\n endRefType |= ReferenceType.SlideOnRemove;\n }\n\n const startLref = createPositionReference(client, start, beginRefType, op);\n const endLref = createPositionReference(client, end, endRefType, op);\n if (startLref && endLref) {\n startLref.pairedRef = endLref;\n endLref.pairedRef = startLref;\n const rangeProp = {\n [reservedRangeLabelsKey]: [label],\n };\n startLref.addProperties(rangeProp);\n endLref.addProperties(rangeProp);\n\n const ival = new SequenceInterval(startLref, endLref, intervalType, rangeProp);\n return ival;\n }\n}\n\nexport function defaultIntervalConflictResolver(a: Interval, b: Interval) {\n a.addPropertySet(b.properties);\n return a;\n}\n\nexport function createIntervalIndex(conflict?: IntervalConflictResolver<Interval>) {\n const helpers: IIntervalHelpers<Interval> = {\n compareEnds: compareIntervalEnds,\n create: createInterval,\n };\n const lc = new LocalIntervalCollection<Interval>(undefined, \"\", helpers);\n if (conflict) {\n lc.addConflictResolver(conflict);\n } else {\n lc.addConflictResolver(defaultIntervalConflictResolver);\n }\n return lc;\n}\n\nexport class LocalIntervalCollection<TInterval extends ISerializableInterval> {\n private readonly intervalTree = new IntervalTree<TInterval>();\n private readonly endIntervalTree: RedBlackTree<TInterval, TInterval>;\n private conflictResolver: IntervalConflictResolver<TInterval>;\n private endConflictResolver: ConflictAction<TInterval, TInterval>;\n\n private static readonly legacyIdPrefix = \"legacy\";\n\n constructor(\n private readonly client: Client,\n private readonly label: string,\n private readonly helpers: IIntervalHelpers<TInterval>) {\n this.endIntervalTree =\n new RedBlackTree<TInterval, TInterval>(helpers.compareEnds);\n }\n\n public addConflictResolver(conflictResolver: IntervalConflictResolver<TInterval>) {\n this.conflictResolver = conflictResolver;\n this.endConflictResolver =\n (key: TInterval, currentKey: TInterval) => {\n const ival = this.conflictResolver(key, currentKey);\n return {\n data: ival,\n key: ival,\n };\n };\n }\n\n public map(fn: (interval: TInterval) => void) {\n this.intervalTree.map(fn);\n }\n\n public createLegacyId(start: number, end: number): string {\n // Create a non-unique ID based on start and end to be used on intervals that come from legacy clients\n // without ID's.\n return `${LocalIntervalCollection.legacyIdPrefix}${start}-${end}`;\n }\n\n public ensureSerializedId(serializedInterval: ISerializedInterval) {\n if (serializedInterval.properties?.[reservedIntervalIdKey] === undefined) {\n // An interval came over the wire without an ID, so create a non-unique one based on start/end.\n // This will allow all clients to refer to this interval consistently.\n const newProps = {\n [reservedIntervalIdKey]: this.createLegacyId(serializedInterval.start, serializedInterval.end),\n };\n serializedInterval.properties = addProperties(serializedInterval.properties, newProps);\n }\n // Make the ID immutable for safety's sake.\n Object.defineProperty(serializedInterval.properties, reservedIntervalIdKey, {\n configurable: false,\n enumerable: true,\n writable: false,\n });\n }\n\n public mapUntil(fn: (interval: TInterval) => boolean) {\n this.intervalTree.mapUntil(fn);\n }\n\n public gatherIterationResults(\n results: TInterval[],\n iteratesForward: boolean,\n start?: number,\n end?: number) {\n if (this.intervalTree.intervals.isEmpty()) {\n return;\n }\n\n if (start === undefined && end === undefined) {\n // No start/end provided. Gather the whole tree in the specified order.\n if (iteratesForward) {\n this.intervalTree.map((interval: TInterval) => {\n results.push(interval);\n });\n }\n else {\n this.intervalTree.mapBackward((interval: TInterval) => {\n results.push(interval);\n });\n }\n }\n else {\n const transientInterval: TInterval = this.helpers.create(\n \"transient\",\n start,\n end,\n this.client,\n IntervalType.Transient,\n );\n\n if (start === undefined) {\n // Only end position provided. Since the tree is not sorted by end position,\n // walk the whole tree in the specified order, gathering intervals that match the end.\n if (iteratesForward) {\n this.intervalTree.map((interval: TInterval) => {\n if (transientInterval.compareEnd(interval) === 0) {\n results.push(interval);\n }\n });\n }\n else {\n this.intervalTree.mapBackward((interval: TInterval) => {\n if (transientInterval.compareEnd(interval) === 0) {\n results.push(interval);\n }\n });\n }\n }\n else {\n // Start and (possibly) end provided. Walk the subtrees that may contain\n // this start position.\n const compareFn =\n end === undefined ?\n (node: IntervalNode<TInterval>) => {\n return transientInterval.compareStart(node.key);\n } :\n (node: IntervalNode<TInterval>) => {\n return transientInterval.compare(node.key);\n };\n const continueLeftFn = (cmpResult: number) => cmpResult <= 0;\n const continueRightFn = (cmpResult: number) => cmpResult >= 0;\n const actionFn = (node: IntervalNode<TInterval>) => {\n results.push(node.key);\n };\n\n if (iteratesForward) {\n this.intervalTree.intervals.walkExactMatchesForward(\n compareFn, actionFn, continueLeftFn, continueRightFn,\n );\n }\n else {\n this.intervalTree.intervals.walkExactMatchesBackward(\n compareFn, actionFn, continueLeftFn, continueRightFn,\n );\n }\n }\n }\n }\n\n public findOverlappingIntervals(startPosition: number, endPosition: number) {\n if (!this.intervalTree.intervals.isEmpty()) {\n const transientInterval =\n this.helpers.create(\n \"transient\",\n startPosition,\n endPosition,\n this.client,\n IntervalType.Transient);\n\n const overlappingIntervalNodes = this.intervalTree.match(transientInterval);\n return overlappingIntervalNodes.map((node) => node.key);\n } else {\n return [];\n }\n }\n\n public previousInterval(pos: number) {\n const transientInterval = this.helpers.create(\n \"transient\", pos, pos, this.client, IntervalType.Transient);\n const rbNode = this.endIntervalTree.floor(transientInterval);\n if (rbNode) {\n return rbNode.data;\n }\n }\n\n public nextInterval(pos: number) {\n const transientInterval = this.helpers.create(\n \"transient\", pos, pos, this.client, IntervalType.Transient);\n const rbNode = this.endIntervalTree.ceil(transientInterval);\n if (rbNode) {\n return rbNode.data;\n }\n }\n\n public removeInterval(startPosition: number, endPosition: number) {\n const transientInterval = this.helpers.create(\n \"transient\", startPosition, endPosition, this.client, IntervalType.Transient);\n this.intervalTree.remove(transientInterval);\n this.endIntervalTree.remove(transientInterval);\n return transientInterval;\n }\n\n public removeExistingInterval(interval: TInterval) {\n this.intervalTree.removeExisting(interval);\n this.endIntervalTree.remove(interval);\n }\n\n public createInterval(\n start: number,\n end: number,\n intervalType: IntervalType,\n op?: ISequencedDocumentMessage): TInterval {\n return this.helpers.create(this.label, start, end, this.client, intervalType, op);\n }\n\n public addInterval(\n start: number,\n end: number,\n intervalType: IntervalType,\n props?: PropertySet,\n op?: ISequencedDocumentMessage) {\n const interval: TInterval = this.createInterval(start, end, intervalType, op);\n if (interval) {\n if (!interval.properties) {\n interval.properties = createMap<any>();\n }\n if (props) {\n interval.addProperties(props);\n }\n if (interval.properties[reservedIntervalIdKey] === undefined) {\n // Create a new ID.\n interval.properties[reservedIntervalIdKey] = uuid();\n }\n // Make the ID immutable.\n Object.defineProperty(interval.properties, reservedIntervalIdKey, {\n configurable: false,\n enumerable: true,\n writable: false,\n });\n this.add(interval);\n }\n return interval;\n }\n\n public add(interval: TInterval) {\n this.intervalTree.put(interval, this.conflictResolver);\n this.endIntervalTree.put(interval, interval, this.endConflictResolver);\n }\n\n public getIntervalById(id: string) {\n let result: TInterval | undefined;\n this.mapUntil((interval: TInterval) => {\n if (interval.getIntervalId() === id) {\n result = interval;\n return false;\n }\n return true;\n });\n return result;\n }\n\n public changeInterval(interval: TInterval, start: number, end: number, op?: ISequencedDocumentMessage) {\n const newInterval = interval.modify(this.label, start, end, op) as TInterval | undefined;\n if (newInterval) {\n this.removeExistingInterval(interval);\n this.add(newInterval);\n }\n return newInterval;\n }\n\n public serialize() {\n const client = this.client;\n const intervals = this.intervalTree.intervals.keys();\n return intervals.map((interval) => interval.serialize(client));\n }\n}\n\nconst compareSequenceIntervalEnds = (a: SequenceInterval, b: SequenceInterval): number => a.end.compare(b.end);\n\nclass SequenceIntervalCollectionFactory\n implements IValueFactory<IntervalCollection<SequenceInterval>> {\n public load(\n emitter: IValueOpEmitter,\n raw: ISerializedInterval[] = [],\n ): IntervalCollection<SequenceInterval> {\n const helpers: IIntervalHelpers<SequenceInterval> = {\n compareEnds: compareSequenceIntervalEnds,\n create: createSequenceInterval,\n };\n return new IntervalCollection<SequenceInterval>(helpers, true, emitter, raw);\n }\n\n public store(value: IntervalCollection<SequenceInterval>): ISerializedInterval[] {\n return value.serializeInternal();\n }\n}\n\nexport class SequenceIntervalCollectionValueType\n implements IValueType<IntervalCollection<SequenceInterval>> {\n public static Name = \"sharedStringIntervalCollection\";\n\n public get name(): string {\n return SequenceIntervalCollectionValueType.Name;\n }\n\n public get factory(): IValueFactory<IntervalCollection<SequenceInterval>> {\n return SequenceIntervalCollectionValueType._factory;\n }\n\n public get ops(): Map<string, IValueOperation<IntervalCollection<SequenceInterval>>> {\n return SequenceIntervalCollectionValueType._ops;\n }\n\n private static readonly _factory: IValueFactory<IntervalCollection<SequenceInterval>> =\n new SequenceIntervalCollectionFactory();\n\n private static readonly _ops: Map<string, IValueOperation<IntervalCollection<SequenceInterval>>> =\n new Map<string, IValueOperation<IntervalCollection<SequenceInterval>>>(\n [[\n \"add\",\n {\n process: (value, params, local, op) => {\n // Local ops were applied when the message was created\n if (local) {\n return;\n }\n\n value.addInternal(params, local, op);\n },\n },\n ],\n [\n \"delete\",\n {\n process: (value, params, local, op) => {\n if (local) {\n return;\n }\n value.deleteInterval(params, local, op);\n },\n },\n ],\n [\n \"change\",\n {\n process: (value, params, local, op) => {\n value.changeInterval(params, local, op);\n },\n },\n ]]);\n}\n\nconst compareIntervalEnds = (a: Interval, b: Interval) => a.end - b.end;\n\nfunction createInterval(label: string, start: number, end: number, client: Client): Interval {\n let rangeProp: PropertySet;\n if (label && (label.length > 0)) {\n rangeProp = {\n [reservedRangeLabelsKey]: [label],\n };\n }\n return new Interval(start, end, rangeProp);\n}\n\nclass IntervalCollectionFactory\n implements IValueFactory<IntervalCollection<Interval>> {\n public load(emitter: IValueOpEmitter, raw: ISerializedInterval[] = []): IntervalCollection<Interval> {\n const helpers: IIntervalHelpers<Interval> = {\n compareEnds: compareIntervalEnds,\n create: createInterval,\n };\n const collection = new IntervalCollection<Interval>(helpers, false, emitter, raw);\n collection.attachGraph(undefined, \"\");\n return collection;\n }\n\n public store(value: IntervalCollection<Interval>): ISerializedInterval[] {\n return value.serializeInternal();\n }\n}\n\nexport class IntervalCollectionValueType\n implements IValueType<IntervalCollection<Interval>> {\n public static Name = \"sharedIntervalCollection\";\n\n public get name(): string {\n return IntervalCollectionValueType.Name;\n }\n\n public get factory(): IValueFactory<IntervalCollection<Interval>> {\n return IntervalCollectionValueType._factory;\n }\n\n public get ops(): Map<string, IValueOperation<IntervalCollection<Interval>>> {\n return IntervalCollectionValueType._ops;\n }\n\n private static readonly _factory: IValueFactory<IntervalCollection<Interval>> =\n new IntervalCollectionFactory();\n private static readonly _ops: Map<string, IValueOperation<IntervalCollection<Interval>>> =\n new Map<string, IValueOperation<IntervalCollection<Interval>>>(\n [[\n \"add\",\n {\n process: (value, params, local, op) => {\n // Local ops were applied when the message was created\n if (local) {\n return;\n }\n\n value.addInternal(params, local, op);\n },\n },\n ],\n [\n \"delete\",\n {\n process: (value, params, local, op) => {\n if (local) {\n return;\n }\n value.deleteInterval(params, local, op);\n },\n },\n ],\n [\n \"change\",\n {\n process: (value, params, local, op) => {\n value.changeInterval(params, local, op);\n },\n },\n ]]);\n}\n\nexport type DeserializeCallback = (properties: PropertySet) => void;\n\nexport class IntervalCollectionIterator<TInterval extends ISerializableInterval> {\n private readonly results: TInterval[];\n private index: number;\n\n constructor(\n collection: IntervalCollection<TInterval>,\n iteratesForward: boolean = true,\n start?: number,\n end?: number) {\n this.results = [];\n this.index = 0;\n\n collection.gatherIterationResults(this.results, iteratesForward, start, end);\n }\n\n public next() {\n let _value: TInterval | undefined;\n let _done: boolean = true;\n\n if (this.index < this.results.length) {\n _value = this.results[this.index++];\n _done = false;\n }\n\n return {\n value: _value,\n done: _done,\n };\n }\n}\n\nexport interface IIntervalCollectionEvent<TInterval extends ISerializableInterval> extends IEvent {\n (event: \"addInterval\" | \"deleteInterval\",\n listener: (interval: TInterval, local: boolean, op: ISequencedDocumentMessage) => void);\n (event: \"propertyChanged\", listener: (interval: TInterval, propertyArgs: PropertySet) => void);\n}\n\nexport class IntervalCollection<TInterval extends ISerializableInterval>\n extends TypedEventEmitter<IIntervalCollectionEvent<TInterval>> {\n private savedSerializedIntervals?: ISerializedInterval[];\n private localCollection: LocalIntervalCollection<TInterval>;\n private onDeserialize: DeserializeCallback;\n private client: Client;\n private pendingChangeStart: Map<string, ISerializedInterval[]>;\n private pendingChangeEnd: Map<string, ISerializedInterval[]>;\n\n public get attached(): boolean {\n return !!this.localCollection;\n }\n\n constructor(private readonly helpers: IIntervalHelpers<TInterval>, private readonly requiresClient: boolean,\n private readonly emitter: IValueOpEmitter,\n serializedIntervals: ISerializedInterval[]) {\n super();\n this.savedSerializedIntervals = serializedIntervals;\n }\n\n public attachGraph(client: Client, label: string) {\n if (this.attached) {\n throw new Error(\"Only supports one Sequence attach\");\n }\n\n if ((client === undefined) && (this.requiresClient)) {\n throw new Error(\"Client required for this collection\");\n }\n\n // Instantiate the local interval collection based on the saved intervals\n this.client = client;\n this.localCollection = new LocalIntervalCollection<TInterval>(client, label, this.helpers);\n if (this.savedSerializedIntervals) {\n for (const serializedInterval of this.savedSerializedIntervals) {\n this.localCollection.ensureSerializedId(serializedInterval);\n this.localCollection.addInterval(\n serializedInterval.start,\n serializedInterval.end,\n serializedInterval.intervalType,\n serializedInterval.properties);\n }\n }\n this.savedSerializedIntervals = undefined;\n }\n\n public getIntervalById(id: string) {\n if (!this.attached) {\n throw new Error(\"attach must be called before accessing intervals\");\n }\n return this.localCollection.getIntervalById(id);\n }\n\n public add(\n start: number,\n end: number,\n intervalType: IntervalType,\n props?: PropertySet,\n ) {\n if (!this.attached) {\n throw new Error(\"attach must be called prior to adding intervals\");\n }\n\n const interval: TInterval = this.localCollection.addInterval(start, end, intervalType, props);\n\n if (interval) {\n const serializedInterval = {\n end,\n intervalType,\n properties: interval.properties,\n sequenceNumber: this.client?.getCurrentSeq() ?? 0,\n start,\n };\n // Local ops get submitted to the server. Remote ops have the deserializer run.\n this.emitter.emit(\"add\", undefined, serializedInterval);\n }\n\n this.emit(\"addInterval\", interval, true, undefined);\n\n return interval;\n }\n\n private deleteExistingInterval(interval: TInterval, local: boolean, op: ISequencedDocumentMessage) {\n // The given interval is known to exist in the collection.\n this.localCollection.removeExistingInterval(interval);\n if (interval) {\n // Local ops get submitted to the server. Remote ops have the deserializer run.\n if (local) {\n this.emitter.emit(\"delete\", undefined, interval.serialize(this.client));\n } else {\n if (this.onDeserialize) {\n this.onDeserialize(interval);\n }\n }\n }\n\n this.emit(\"deleteInterval\", interval, local, op);\n }\n\n public removeIntervalById(id: string) {\n const interval = this.localCollection.getIntervalById(id);\n if (interval) {\n this.deleteExistingInterval(interval, true, undefined);\n }\n return interval;\n }\n\n public changeProperties(id: string, props: PropertySet) {\n if (!this.attached) {\n throw new Error(\"Attach must be called before accessing intervals\");\n }\n if (typeof(id) !== \"string\") {\n throw new Error(\"Change API requires an ID that is a string\");\n }\n if (!props) {\n throw new Error(\"changeProperties should be called with a property set\");\n }\n\n const interval = this.getIntervalById(id);\n if (interval) {\n // Pass Unassigned as the sequence number to indicate that this is a local op that is waiting for an ack.\n const deltaProps = interval.addProperties(props, true, UnassignedSequenceNumber);\n const serializedInterval: ISerializedInterval = interval.serialize(this.client);\n // Emit a change op that will only change properties. Add the ID to the property bag provided by the caller.\n serializedInterval.start = undefined;\n serializedInterval.end = undefined;\n serializedInterval.properties = props;\n serializedInterval.properties[reservedIntervalIdKey] = interval.getIntervalId();\n this.emitter.emit(\"change\", undefined, serializedInterval);\n this.emit(\"propertyChanged\", interval, deltaProps);\n }\n this.emit(\"change\", interval, true, undefined);\n }\n\n public change(id: string, start?: number, end?: number): TInterval | undefined {\n if (!this.attached) {\n throw new Error(\"Attach must be called before accessing intervals\");\n }\n if (typeof(id) !== \"string\") {\n throw new Error(\"Change API requires an ID that is a string\");\n }\n\n // Force id to be a string.\n const interval = this.getIntervalById(id);\n if (interval) {\n this.localCollection.changeInterval(interval, start, end);\n const serializedInterval: ISerializedInterval = interval.serialize(this.client);\n serializedInterval.start = start;\n serializedInterval.end = end;\n // Emit a property bag containing only the ID, as we don't intend for this op to change any properties.\n serializedInterval.properties =\n {\n [reservedIntervalIdKey]: interval.getIntervalId(),\n };\n this.emitter.emit(\"change\", undefined, serializedInterval);\n this.addPendingChange(id, serializedInterval);\n }\n this.emit(\"change\", interval, true, undefined);\n return interval;\n }\n\n private addPendingChange(id: string, serializedInterval: ISerializedInterval) {\n if (serializedInterval.start !== undefined) {\n if (!this.pendingChangeStart) {\n this.pendingChangeStart = new Map<string, ISerializedInterval[]>();\n }\n this.addPendingChangeHelper(id, this.pendingChangeStart, serializedInterval);\n }\n if (serializedInterval.end !== undefined) {\n if (!this.pendingChangeEnd) {\n this.pendingChangeEnd = new Map<string, ISerializedInterval[]>();\n }\n this.addPendingChangeHelper(id, this.pendingChangeEnd, serializedInterval);\n }\n }\n\n private addPendingChangeHelper(\n id: string,\n pendingChanges: Map<string, ISerializedInterval[]>,\n serializedInterval: ISerializedInterval,\n ) {\n let entries: ISerializedInterval[] = pendingChanges.get(id);\n if (!entries) {\n entries = [];\n pendingChanges.set(id, entries);\n }\n entries.push(serializedInterval);\n }\n\n private removePendingChange(serializedInterval: ISerializedInterval) {\n // Change ops always have an ID.\n const id: string = serializedInterval.properties[reservedIntervalIdKey];\n if (serializedInterval.start !== undefined) {\n this.removePendingChangeHelper(id, this.pendingChangeStart, serializedInterval);\n }\n if (serializedInterval.end !== undefined) {\n this.removePendingChangeHelper(id, this.pendingChangeEnd, serializedInterval);\n }\n }\n\n private removePendingChangeHelper(\n id: string,\n pendingChanges: Map<string, ISerializedInterval[]>,\n serializedInterval: ISerializedInterval,\n ) {\n const entries = pendingChanges?.get(id);\n if (entries) {\n const pendingChange = entries.shift();\n if (entries.length === 0) {\n pendingChanges.delete(id);\n }\n if (pendingChange.start !== serializedInterval.start ||\n pendingChange.end !== serializedInterval.end) {\n throw new Error(\"Mismatch in pending changes\");\n }\n }\n }\n\n private hasPendingChangeStart(id: string) {\n const entries = this.pendingChangeStart?.get(id);\n return entries && entries.length !== 0;\n }\n\n private hasPendingChangeEnd(id: string) {\n const entries = this.pendingChangeEnd?.get(id);\n return entries && entries.length !== 0;\n }\n\n public changeInterval(serializedInterval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) {\n if (!this.attached) {\n throw new Error(\"Attach must be called before accessing intervals\");\n }\n\n if (local) {\n // This is an ack from the server. Remove the pending change.\n this.removePendingChange(serializedInterval);\n const id: string = serializedInterval.properties[reservedIntervalIdKey];\n const interval: TInterval = this.getIntervalById(id);\n if (interval) {\n // Let the propertyManager prune its pending change-properties set.\n interval.propertyManager?.ackPendingProperties(\n {\n type: MergeTreeDeltaType.ANNOTATE,\n props: serializedInterval.properties,\n });\n }\n }\n else {\n // If there are pending changes with this ID, don't apply the remote start/end change, as the local ack\n // should be the winning change.\n const id: string = serializedInterval.properties[reservedIntervalIdKey];\n let interval: TInterval = this.getIntervalById(id);\n if (interval) {\n let start: number | undefined;\n let end: number | undefined;\n // Track pending start/end independently of one another.\n if (!this.hasPendingChangeStart(id)) {\n start = serializedInterval.start;\n }\n if (!this.hasPendingChangeEnd(id)) {\n end = serializedInterval.end;\n }\n if (start !== undefined || end !== undefined) {\n // If changeInterval gives us a new interval, work with that one. Otherwise keep working with\n // the one we originally found in the tree.\n interval = this.localCollection.changeInterval(interval, start, end, op) ?? interval;\n }\n const deltaProps = interval.addProperties(serializedInterval.properties, true, op.sequenceNumber);\n if (this.onDeserialize) {\n this.onDeserialize(interval);\n }\n this.emit(\"propertyChanged\", interval, deltaProps);\n }\n this.emit(\"changeInterval\", interval, local, op);\n }\n }\n\n public addConflictResolver(conflictResolver: IntervalConflictResolver<TInterval>): void {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n this.localCollection.addConflictResolver(conflictResolver);\n }\n\n public attachDeserializer(onDeserialize: DeserializeCallback): void {\n // If no deserializer is specified can skip all processing work\n if (!onDeserialize) {\n return;\n }\n\n // Start by storing the callbacks so that any subsequent modifications make use of them\n this.onDeserialize = onDeserialize;\n\n // Trigger the async prepare work across all values in the collection\n this.localCollection.map((interval) => {\n this.onDeserialize(interval);\n });\n }\n\n public addInternal(\n serializedInterval: ISerializedInterval,\n local: boolean,\n op: ISequencedDocumentMessage) {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n\n this.localCollection.ensureSerializedId(serializedInterval);\n\n const interval: TInterval = this.localCollection.addInterval(\n serializedInterval.start,\n serializedInterval.end,\n serializedInterval.intervalType,\n serializedInterval.properties,\n op);\n\n if (interval) {\n // Local ops get submitted to the server. Remote ops have the deserializer run.\n if (local) {\n // Review: Is this case possible?\n this.emitter.emit(\"add\", undefined, serializedInterval);\n } else {\n if (this.onDeserialize) {\n this.onDeserialize(interval);\n }\n }\n }\n\n this.emit(\"addInterval\", interval, local, op);\n\n return interval;\n }\n\n public deleteInterval(\n serializedInterval: ISerializedInterval,\n local: boolean,\n op: ISequencedDocumentMessage): void {\n if (!this.attached) {\n throw new Error(\"attach must be called prior to deleting intervals\");\n }\n\n this.localCollection.ensureSerializedId(serializedInterval);\n const interval = this.localCollection.getIntervalById(serializedInterval.properties[reservedIntervalIdKey]);\n if (interval) {\n this.deleteExistingInterval(interval, local, op);\n }\n }\n\n public serializeInternal() {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n\n return this.localCollection.serialize();\n }\n\n public [Symbol.iterator](): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this);\n return iterator;\n }\n\n public CreateForwardIteratorWithStartPosition(startPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, true, startPosition);\n return iterator;\n }\n\n public CreateBackwardIteratorWithStartPosition(startPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, false, startPosition);\n return iterator;\n }\n\n public CreateForwardIteratorWithEndPosition(endPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, true, undefined, endPosition);\n return iterator;\n }\n\n public CreateBackwardIteratorWithEndPosition(endPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, false, undefined, endPosition);\n return iterator;\n }\n\n public gatherIterationResults(\n results: TInterval[],\n iteratesForward: boolean,\n start?: number,\n end?: number) {\n if (!this.attached) {\n return;\n }\n\n this.localCollection.gatherIterationResults(results, iteratesForward, start, end);\n }\n\n public findOverlappingIntervals(startPosition: number, endPosition: number): TInterval[] {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n\n return this.localCollection.findOverlappingIntervals(startPosition, endPosition);\n }\n\n public map(fn: (interval: TInterval) => void) {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n\n this.localCollection.map(fn);\n }\n\n public previousInterval(pos: number): TInterval {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n\n return this.localCollection.previousInterval(pos);\n }\n\n public nextInterval(pos: number): TInterval {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n\n return this.localCollection.nextInterval(pos);\n }\n}\n"]}
1
+ {"version":3,"file":"intervalCollection.js","sourceRoot":"","sources":["../src/intervalCollection.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable no-bitwise */\n\nimport { assert, TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport { IEvent } from \"@fluidframework/common-definitions\";\nimport {\n addProperties,\n Client,\n ConflictAction,\n createMap,\n ICombiningOp,\n IInterval,\n IntervalConflictResolver,\n IntervalNode,\n IntervalTree,\n LocalReference,\n MergeTreeDeltaType,\n PropertiesManager,\n PropertySet,\n RedBlackTree,\n ReferenceType,\n reservedRangeLabelsKey,\n UnassignedSequenceNumber,\n} from \"@fluidframework/merge-tree\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { v4 as uuid } from \"uuid\";\nimport { IValueFactory, IValueOpEmitter, IValueOperation, IValueType } from \"./mapKernelInterfaces\";\n\nconst reservedIntervalIdKey = \"intervalId\";\n\nexport enum IntervalType {\n Simple = 0x0,\n Nest = 0x1,\n SlideOnRemove = 0x2,\n Transient = 0x4,\n}\n\nexport interface ISerializedInterval {\n sequenceNumber: number;\n start: number;\n end: number;\n intervalType: IntervalType;\n properties?: PropertySet;\n}\n\nexport interface ISerializableInterval extends IInterval {\n properties: PropertySet;\n propertyManager: PropertiesManager;\n serialize(client: Client): ISerializedInterval;\n addProperties(props: PropertySet, collaborating?: boolean, seq?: number):\n PropertySet | undefined;\n getIntervalId(): string | undefined;\n}\n\nexport interface IIntervalHelpers<TInterval extends ISerializableInterval> {\n compareEnds(a: TInterval, b: TInterval): number;\n create(label: string, start: number, end: number,\n client: Client, intervalType?: IntervalType, op?: ISequencedDocumentMessage): TInterval;\n}\n\nexport class Interval implements ISerializableInterval {\n public properties: PropertySet;\n public auxProps: PropertySet[];\n public propertyManager: PropertiesManager;\n constructor(\n public start: number,\n public end: number,\n props?: PropertySet) {\n if (props) {\n this.addProperties(props);\n }\n }\n\n public getIntervalId(): string | undefined {\n const id = this.properties?.[reservedIntervalIdKey];\n if (id === undefined) {\n return undefined;\n }\n return `${id}`;\n }\n\n public getAdditionalPropertySets() {\n return this.auxProps;\n }\n\n public addPropertySet(props: PropertySet) {\n if (this.auxProps === undefined) {\n this.auxProps = [];\n }\n this.auxProps.push(props);\n }\n\n public serialize(client: Client) {\n let seq = 0;\n if (client) {\n seq = client.getCurrentSeq();\n }\n\n const serializedInterval: ISerializedInterval = {\n end: this.end,\n intervalType: 0,\n sequenceNumber: seq,\n start: this.start,\n };\n if (this.properties) {\n serializedInterval.properties = this.properties;\n }\n return serializedInterval;\n }\n\n public clone() {\n return new Interval(this.start, this.end, this.properties);\n }\n\n public compare(b: Interval) {\n const startResult = this.compareStart(b);\n if (startResult === 0) {\n const endResult = this.compareEnd(b);\n if (endResult === 0) {\n const thisId = this.getIntervalId();\n if (thisId) {\n const bId = b.getIntervalId();\n if (bId) {\n return thisId > bId ? 1 : thisId < bId ? -1 : 0;\n }\n return 0;\n }\n return 0;\n }\n else {\n return endResult;\n }\n } else {\n return startResult;\n }\n }\n\n public compareStart(b: Interval) {\n return this.start - b.start;\n }\n\n public compareEnd(b: Interval) {\n return this.end - b.end;\n }\n\n public overlaps(b: Interval) {\n const result = (this.start <= b.end) &&\n (this.end >= b.start);\n return result;\n }\n\n public union(b: Interval) {\n return new Interval(Math.min(this.start, b.start),\n Math.max(this.end, b.end), this.properties);\n }\n\n public getProperties() {\n return this.properties;\n }\n\n public addProperties(\n newProps: PropertySet,\n collaborating: boolean = false,\n seq?: number,\n op?: ICombiningOp,\n ): PropertySet | undefined {\n if (newProps) {\n if (!this.propertyManager) {\n this.propertyManager = new PropertiesManager();\n }\n if (!this.properties) {\n this.properties = createMap<any>();\n }\n return this.propertyManager.addProperties(this.properties, newProps, op, seq, collaborating);\n }\n }\n\n public modify(label: string, start: number, end: number, op?: ISequencedDocumentMessage) {\n const startPos = start ?? this.start;\n const endPos = end ?? this.end;\n if (this.start === startPos && this.end === endPos) {\n // Return undefined to indicate that no change is necessary.\n return;\n }\n return new Interval(startPos, endPos, this.properties);\n }\n}\n\nexport class SequenceInterval implements ISerializableInterval {\n public properties: PropertySet;\n public propertyManager: PropertiesManager;\n\n constructor(\n public start: LocalReference,\n public end: LocalReference,\n public intervalType: IntervalType,\n props?: PropertySet) {\n if (props) {\n this.addProperties(props);\n }\n }\n\n public serialize(client: Client) {\n const startPosition = this.start.toPosition();\n const endPosition = this.end.toPosition();\n const serializedInterval: ISerializedInterval = {\n end: endPosition,\n intervalType: this.intervalType,\n sequenceNumber: client.getCurrentSeq(),\n start: startPosition,\n };\n if (this.properties) {\n serializedInterval.properties = this.properties;\n }\n return serializedInterval;\n }\n\n public clone() {\n return new SequenceInterval(this.start, this.end, this.intervalType, this.properties);\n }\n\n public compare(b: SequenceInterval) {\n const startResult = this.compareStart(b);\n if (startResult === 0) {\n const endResult = this.compareEnd(b);\n if (endResult === 0) {\n const thisId = this.getIntervalId();\n if (thisId) {\n const bId = b.getIntervalId();\n if (bId) {\n return thisId > bId ? 1 : thisId < bId ? -1 : 0;\n }\n return 0;\n }\n return 0;\n }\n else {\n return endResult;\n }\n } else {\n return startResult;\n }\n }\n\n public compareStart(b: SequenceInterval) {\n return this.start.compare(b.start);\n }\n\n public compareEnd(b: SequenceInterval) {\n return this.end.compare(b.end);\n }\n\n public overlaps(b: SequenceInterval) {\n const result = (this.start.compare(b.end) <= 0) &&\n (this.end.compare(b.start) >= 0);\n return result;\n }\n\n public getIntervalId(): string | undefined {\n const id = this.properties?.[reservedIntervalIdKey];\n if (id === undefined) {\n return undefined;\n }\n return `${id}`;\n }\n\n public union(b: SequenceInterval) {\n return new SequenceInterval(this.start.min(b.start),\n this.end.max(b.end), this.intervalType);\n }\n\n public addProperties(\n newProps: PropertySet,\n collab: boolean = false,\n seq?: number,\n op?: ICombiningOp,\n ): PropertySet | undefined {\n if (!this.propertyManager) {\n this.propertyManager = new PropertiesManager();\n }\n if (!this.properties) {\n this.properties = createMap<any>();\n }\n return this.propertyManager.addProperties(this.properties, newProps, op, seq, collab);\n }\n\n public overlapsPos(bstart: number, bend: number) {\n const startPos = this.start.toPosition();\n const endPos = this.start.toPosition();\n return (endPos > bstart) && (startPos < bend);\n }\n\n public modify(label: string, start: number, end: number, op?: ISequencedDocumentMessage) {\n const startPos = start ?? this.start.toPosition();\n const endPos = end ?? this.end.toPosition();\n\n if (this.start.toPosition() === startPos && this.end.toPosition() === endPos) {\n // Return undefined to indicate that no change is necessary.\n return;\n }\n\n const newInterval =\n createSequenceInterval(label, startPos, endPos, this.start.getClient(), this.intervalType, op);\n if (this.properties) {\n newInterval.addProperties(this.properties);\n }\n return newInterval;\n }\n}\n\nfunction createPositionReference(\n client: Client,\n pos: number,\n refType: ReferenceType,\n op?: ISequencedDocumentMessage): LocalReference {\n const segoff = client.getContainingSegment(pos, op);\n if (segoff && segoff.segment) {\n const lref = new LocalReference(client, segoff.segment, segoff.offset, refType);\n if (refType !== ReferenceType.Transient) {\n client.addLocalReference(lref);\n }\n return lref;\n }\n return new LocalReference(client, undefined);\n}\n\nfunction createSequenceInterval(\n label: string,\n start: number,\n end: number,\n client: Client,\n intervalType: IntervalType,\n op?: ISequencedDocumentMessage): SequenceInterval {\n let beginRefType = ReferenceType.RangeBegin;\n let endRefType = ReferenceType.RangeEnd;\n if (intervalType === IntervalType.Nest) {\n beginRefType = ReferenceType.NestBegin;\n endRefType = ReferenceType.NestEnd;\n } else if (intervalType === IntervalType.Transient) {\n beginRefType = ReferenceType.Transient;\n endRefType = ReferenceType.Transient;\n }\n\n // TODO: Should SlideOnRemove be the default behavior?\n if (intervalType & IntervalType.SlideOnRemove) {\n beginRefType |= ReferenceType.SlideOnRemove;\n endRefType |= ReferenceType.SlideOnRemove;\n }\n\n const startLref = createPositionReference(client, start, beginRefType, op);\n const endLref = createPositionReference(client, end, endRefType, op);\n if (startLref && endLref) {\n startLref.pairedRef = endLref;\n endLref.pairedRef = startLref;\n const rangeProp = {\n [reservedRangeLabelsKey]: [label],\n };\n startLref.addProperties(rangeProp);\n endLref.addProperties(rangeProp);\n\n const ival = new SequenceInterval(startLref, endLref, intervalType, rangeProp);\n return ival;\n }\n}\n\nexport function defaultIntervalConflictResolver(a: Interval, b: Interval) {\n a.addPropertySet(b.properties);\n return a;\n}\n\nexport function createIntervalIndex(conflict?: IntervalConflictResolver<Interval>) {\n const helpers: IIntervalHelpers<Interval> = {\n compareEnds: compareIntervalEnds,\n create: createInterval,\n };\n const lc = new LocalIntervalCollection<Interval>(undefined, \"\", helpers);\n if (conflict) {\n lc.addConflictResolver(conflict);\n } else {\n lc.addConflictResolver(defaultIntervalConflictResolver);\n }\n return lc;\n}\n\nexport class LocalIntervalCollection<TInterval extends ISerializableInterval> {\n private readonly intervalTree = new IntervalTree<TInterval>();\n private readonly endIntervalTree: RedBlackTree<TInterval, TInterval>;\n private conflictResolver: IntervalConflictResolver<TInterval>;\n private endConflictResolver: ConflictAction<TInterval, TInterval>;\n\n private static readonly legacyIdPrefix = \"legacy\";\n\n constructor(\n private readonly client: Client,\n private readonly label: string,\n private readonly helpers: IIntervalHelpers<TInterval>,\n ) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.endIntervalTree = new RedBlackTree<TInterval, TInterval>(helpers.compareEnds);\n }\n\n public addConflictResolver(conflictResolver: IntervalConflictResolver<TInterval>) {\n this.conflictResolver = conflictResolver;\n this.endConflictResolver =\n (key: TInterval, currentKey: TInterval) => {\n const ival = this.conflictResolver(key, currentKey);\n return {\n data: ival,\n key: ival,\n };\n };\n }\n\n public map(fn: (interval: TInterval) => void) {\n this.intervalTree.map(fn);\n }\n\n public createLegacyId(start: number, end: number): string {\n // Create a non-unique ID based on start and end to be used on intervals that come from legacy clients\n // without ID's.\n return `${LocalIntervalCollection.legacyIdPrefix}${start}-${end}`;\n }\n\n public ensureSerializedId(serializedInterval: ISerializedInterval) {\n if (serializedInterval.properties?.[reservedIntervalIdKey] === undefined) {\n // An interval came over the wire without an ID, so create a non-unique one based on start/end.\n // This will allow all clients to refer to this interval consistently.\n const newProps = {\n [reservedIntervalIdKey]: this.createLegacyId(serializedInterval.start, serializedInterval.end),\n };\n serializedInterval.properties = addProperties(serializedInterval.properties, newProps);\n }\n // Make the ID immutable for safety's sake.\n Object.defineProperty(serializedInterval.properties, reservedIntervalIdKey, {\n configurable: false,\n enumerable: true,\n writable: false,\n });\n }\n\n public mapUntil(fn: (interval: TInterval) => boolean) {\n this.intervalTree.mapUntil(fn);\n }\n\n public gatherIterationResults(\n results: TInterval[],\n iteratesForward: boolean,\n start?: number,\n end?: number) {\n if (this.intervalTree.intervals.isEmpty()) {\n return;\n }\n\n if (start === undefined && end === undefined) {\n // No start/end provided. Gather the whole tree in the specified order.\n if (iteratesForward) {\n this.intervalTree.map((interval: TInterval) => {\n results.push(interval);\n });\n }\n else {\n this.intervalTree.mapBackward((interval: TInterval) => {\n results.push(interval);\n });\n }\n }\n else {\n const transientInterval: TInterval = this.helpers.create(\n \"transient\",\n start,\n end,\n this.client,\n IntervalType.Transient,\n );\n\n if (start === undefined) {\n // Only end position provided. Since the tree is not sorted by end position,\n // walk the whole tree in the specified order, gathering intervals that match the end.\n if (iteratesForward) {\n this.intervalTree.map((interval: TInterval) => {\n if (transientInterval.compareEnd(interval) === 0) {\n results.push(interval);\n }\n });\n }\n else {\n this.intervalTree.mapBackward((interval: TInterval) => {\n if (transientInterval.compareEnd(interval) === 0) {\n results.push(interval);\n }\n });\n }\n }\n else {\n // Start and (possibly) end provided. Walk the subtrees that may contain\n // this start position.\n const compareFn =\n end === undefined ?\n (node: IntervalNode<TInterval>) => {\n return transientInterval.compareStart(node.key);\n } :\n (node: IntervalNode<TInterval>) => {\n return transientInterval.compare(node.key);\n };\n const continueLeftFn = (cmpResult: number) => cmpResult <= 0;\n const continueRightFn = (cmpResult: number) => cmpResult >= 0;\n const actionFn = (node: IntervalNode<TInterval>) => {\n results.push(node.key);\n };\n\n if (iteratesForward) {\n this.intervalTree.intervals.walkExactMatchesForward(\n compareFn, actionFn, continueLeftFn, continueRightFn,\n );\n }\n else {\n this.intervalTree.intervals.walkExactMatchesBackward(\n compareFn, actionFn, continueLeftFn, continueRightFn,\n );\n }\n }\n }\n }\n\n public findOverlappingIntervals(startPosition: number, endPosition: number) {\n if (!this.intervalTree.intervals.isEmpty()) {\n const transientInterval =\n this.helpers.create(\n \"transient\",\n startPosition,\n endPosition,\n this.client,\n IntervalType.Transient);\n\n const overlappingIntervalNodes = this.intervalTree.match(transientInterval);\n return overlappingIntervalNodes.map((node) => node.key);\n } else {\n return [];\n }\n }\n\n public previousInterval(pos: number) {\n const transientInterval = this.helpers.create(\n \"transient\", pos, pos, this.client, IntervalType.Transient);\n const rbNode = this.endIntervalTree.floor(transientInterval);\n if (rbNode) {\n return rbNode.data;\n }\n }\n\n public nextInterval(pos: number) {\n const transientInterval = this.helpers.create(\n \"transient\", pos, pos, this.client, IntervalType.Transient);\n const rbNode = this.endIntervalTree.ceil(transientInterval);\n if (rbNode) {\n return rbNode.data;\n }\n }\n\n public removeInterval(startPosition: number, endPosition: number) {\n const transientInterval = this.helpers.create(\n \"transient\", startPosition, endPosition, this.client, IntervalType.Transient);\n this.intervalTree.remove(transientInterval);\n this.endIntervalTree.remove(transientInterval);\n return transientInterval;\n }\n\n public removeExistingInterval(interval: TInterval) {\n this.intervalTree.removeExisting(interval);\n this.endIntervalTree.remove(interval);\n }\n\n public createInterval(\n start: number,\n end: number,\n intervalType: IntervalType,\n op?: ISequencedDocumentMessage): TInterval {\n return this.helpers.create(this.label, start, end, this.client, intervalType, op);\n }\n\n public addInterval(\n start: number,\n end: number,\n intervalType: IntervalType,\n props?: PropertySet,\n op?: ISequencedDocumentMessage) {\n const interval: TInterval = this.createInterval(start, end, intervalType, op);\n if (interval) {\n if (!interval.properties) {\n interval.properties = createMap<any>();\n }\n if (props) {\n interval.addProperties(props);\n }\n if (interval.properties[reservedIntervalIdKey] === undefined) {\n // Create a new ID.\n interval.properties[reservedIntervalIdKey] = uuid();\n }\n this.add(interval);\n }\n return interval;\n }\n\n public add(interval: TInterval) {\n assert(Object.prototype.hasOwnProperty.call(interval.properties, reservedIntervalIdKey),\n 0x2c0 /* \"ID must be created before adding interval to collection\" */);\n // Make the ID immutable.\n Object.defineProperty(interval.properties, reservedIntervalIdKey, {\n configurable: false,\n enumerable: true,\n writable: false,\n });\n this.intervalTree.put(interval, this.conflictResolver);\n this.endIntervalTree.put(interval, interval, this.endConflictResolver);\n }\n\n public getIntervalById(id: string) {\n let result: TInterval | undefined;\n this.mapUntil((interval: TInterval) => {\n if (interval.getIntervalId() === id) {\n result = interval;\n return false;\n }\n return true;\n });\n return result;\n }\n\n public changeInterval(interval: TInterval, start: number, end: number, op?: ISequencedDocumentMessage) {\n const newInterval = interval.modify(this.label, start, end, op) as TInterval | undefined;\n if (newInterval) {\n this.removeExistingInterval(interval);\n this.add(newInterval);\n }\n return newInterval;\n }\n\n public serialize() {\n const client = this.client;\n const intervals = this.intervalTree.intervals.keys();\n return intervals.map((interval) => interval.serialize(client));\n }\n}\n\nconst compareSequenceIntervalEnds = (a: SequenceInterval, b: SequenceInterval): number => a.end.compare(b.end);\n\nclass SequenceIntervalCollectionFactory\n implements IValueFactory<IntervalCollection<SequenceInterval>> {\n public load(\n emitter: IValueOpEmitter,\n raw: ISerializedInterval[] = [],\n ): IntervalCollection<SequenceInterval> {\n const helpers: IIntervalHelpers<SequenceInterval> = {\n compareEnds: compareSequenceIntervalEnds,\n create: createSequenceInterval,\n };\n return new IntervalCollection<SequenceInterval>(helpers, true, emitter, raw);\n }\n\n public store(value: IntervalCollection<SequenceInterval>): ISerializedInterval[] {\n return value.serializeInternal();\n }\n}\n\nexport class SequenceIntervalCollectionValueType\n implements IValueType<IntervalCollection<SequenceInterval>> {\n public static Name = \"sharedStringIntervalCollection\";\n\n public get name(): string {\n return SequenceIntervalCollectionValueType.Name;\n }\n\n public get factory(): IValueFactory<IntervalCollection<SequenceInterval>> {\n return SequenceIntervalCollectionValueType._factory;\n }\n\n public get ops(): Map<string, IValueOperation<IntervalCollection<SequenceInterval>>> {\n return SequenceIntervalCollectionValueType._ops;\n }\n\n private static readonly _factory: IValueFactory<IntervalCollection<SequenceInterval>> =\n new SequenceIntervalCollectionFactory();\n\n private static readonly _ops: Map<string, IValueOperation<IntervalCollection<SequenceInterval>>> =\n new Map<string, IValueOperation<IntervalCollection<SequenceInterval>>>(\n [[\n \"add\",\n {\n process: (value, params, local, op) => {\n // Local ops were applied when the message was created\n if (local) {\n return;\n }\n\n value.addInternal(params, local, op);\n },\n },\n ],\n [\n \"delete\",\n {\n process: (value, params, local, op) => {\n if (local) {\n return;\n }\n value.deleteInterval(params, local, op);\n },\n },\n ],\n [\n \"change\",\n {\n process: (value, params, local, op) => {\n value.changeInterval(params, local, op);\n },\n },\n ]]);\n}\n\nconst compareIntervalEnds = (a: Interval, b: Interval) => a.end - b.end;\n\nfunction createInterval(label: string, start: number, end: number, client: Client): Interval {\n let rangeProp: PropertySet;\n if (label && (label.length > 0)) {\n rangeProp = {\n [reservedRangeLabelsKey]: [label],\n };\n }\n return new Interval(start, end, rangeProp);\n}\n\nclass IntervalCollectionFactory\n implements IValueFactory<IntervalCollection<Interval>> {\n public load(emitter: IValueOpEmitter, raw: ISerializedInterval[] = []): IntervalCollection<Interval> {\n const helpers: IIntervalHelpers<Interval> = {\n compareEnds: compareIntervalEnds,\n create: createInterval,\n };\n const collection = new IntervalCollection<Interval>(helpers, false, emitter, raw);\n collection.attachGraph(undefined, \"\");\n return collection;\n }\n\n public store(value: IntervalCollection<Interval>): ISerializedInterval[] {\n return value.serializeInternal();\n }\n}\n\nexport class IntervalCollectionValueType\n implements IValueType<IntervalCollection<Interval>> {\n public static Name = \"sharedIntervalCollection\";\n\n public get name(): string {\n return IntervalCollectionValueType.Name;\n }\n\n public get factory(): IValueFactory<IntervalCollection<Interval>> {\n return IntervalCollectionValueType._factory;\n }\n\n public get ops(): Map<string, IValueOperation<IntervalCollection<Interval>>> {\n return IntervalCollectionValueType._ops;\n }\n\n private static readonly _factory: IValueFactory<IntervalCollection<Interval>> =\n new IntervalCollectionFactory();\n private static readonly _ops: Map<string, IValueOperation<IntervalCollection<Interval>>> =\n new Map<string, IValueOperation<IntervalCollection<Interval>>>(\n [[\n \"add\",\n {\n process: (value, params, local, op) => {\n // Local ops were applied when the message was created\n if (local) {\n return;\n }\n\n value.addInternal(params, local, op);\n },\n },\n ],\n [\n \"delete\",\n {\n process: (value, params, local, op) => {\n if (local) {\n return;\n }\n value.deleteInterval(params, local, op);\n },\n },\n ],\n [\n \"change\",\n {\n process: (value, params, local, op) => {\n value.changeInterval(params, local, op);\n },\n },\n ]]);\n}\n\nexport type DeserializeCallback = (properties: PropertySet) => void;\n\nexport class IntervalCollectionIterator<TInterval extends ISerializableInterval> {\n private readonly results: TInterval[];\n private index: number;\n\n constructor(\n collection: IntervalCollection<TInterval>,\n iteratesForward: boolean = true,\n start?: number,\n end?: number) {\n this.results = [];\n this.index = 0;\n\n collection.gatherIterationResults(this.results, iteratesForward, start, end);\n }\n\n public next() {\n let _value: TInterval | undefined;\n let _done: boolean = true;\n\n if (this.index < this.results.length) {\n _value = this.results[this.index++];\n _done = false;\n }\n\n return {\n value: _value,\n done: _done,\n };\n }\n}\n\nexport interface IIntervalCollectionEvent<TInterval extends ISerializableInterval> extends IEvent {\n (event: \"addInterval\" | \"changeInterval\" | \"deleteInterval\",\n listener: (interval: TInterval, local: boolean, op: ISequencedDocumentMessage) => void);\n (event: \"propertyChanged\", listener: (interval: TInterval, propertyArgs: PropertySet) => void);\n}\n\nexport class IntervalCollection<TInterval extends ISerializableInterval>\n extends TypedEventEmitter<IIntervalCollectionEvent<TInterval>> {\n private savedSerializedIntervals?: ISerializedInterval[];\n private localCollection: LocalIntervalCollection<TInterval>;\n private onDeserialize: DeserializeCallback;\n private client: Client;\n private pendingChangeStart: Map<string, ISerializedInterval[]>;\n private pendingChangeEnd: Map<string, ISerializedInterval[]>;\n\n public get attached(): boolean {\n return !!this.localCollection;\n }\n\n constructor(private readonly helpers: IIntervalHelpers<TInterval>, private readonly requiresClient: boolean,\n private readonly emitter: IValueOpEmitter,\n serializedIntervals: ISerializedInterval[]) {\n super();\n this.savedSerializedIntervals = serializedIntervals;\n }\n\n public attachGraph(client: Client, label: string) {\n if (this.attached) {\n throw new Error(\"Only supports one Sequence attach\");\n }\n\n if ((client === undefined) && (this.requiresClient)) {\n throw new Error(\"Client required for this collection\");\n }\n\n // Instantiate the local interval collection based on the saved intervals\n this.client = client;\n this.localCollection = new LocalIntervalCollection<TInterval>(client, label, this.helpers);\n if (this.savedSerializedIntervals) {\n for (const serializedInterval of this.savedSerializedIntervals) {\n this.localCollection.ensureSerializedId(serializedInterval);\n this.localCollection.addInterval(\n serializedInterval.start,\n serializedInterval.end,\n serializedInterval.intervalType,\n serializedInterval.properties);\n }\n }\n this.savedSerializedIntervals = undefined;\n }\n\n public getIntervalById(id: string) {\n if (!this.attached) {\n throw new Error(\"attach must be called before accessing intervals\");\n }\n return this.localCollection.getIntervalById(id);\n }\n\n public add(\n start: number,\n end: number,\n intervalType: IntervalType,\n props?: PropertySet,\n ) {\n if (!this.attached) {\n throw new Error(\"attach must be called prior to adding intervals\");\n }\n\n const interval: TInterval = this.localCollection.addInterval(start, end, intervalType, props);\n\n if (interval) {\n const serializedInterval = {\n end,\n intervalType,\n properties: interval.properties,\n sequenceNumber: this.client?.getCurrentSeq() ?? 0,\n start,\n };\n // Local ops get submitted to the server. Remote ops have the deserializer run.\n this.emitter.emit(\"add\", undefined, serializedInterval);\n }\n\n this.emit(\"addInterval\", interval, true, undefined);\n\n return interval;\n }\n\n private deleteExistingInterval(interval: TInterval, local: boolean, op: ISequencedDocumentMessage) {\n // The given interval is known to exist in the collection.\n this.localCollection.removeExistingInterval(interval);\n if (interval) {\n // Local ops get submitted to the server. Remote ops have the deserializer run.\n if (local) {\n this.emitter.emit(\"delete\", undefined, interval.serialize(this.client));\n } else {\n if (this.onDeserialize) {\n this.onDeserialize(interval);\n }\n }\n }\n\n this.emit(\"deleteInterval\", interval, local, op);\n }\n\n public removeIntervalById(id: string) {\n const interval = this.localCollection.getIntervalById(id);\n if (interval) {\n this.deleteExistingInterval(interval, true, undefined);\n }\n return interval;\n }\n\n public changeProperties(id: string, props: PropertySet) {\n if (!this.attached) {\n throw new Error(\"Attach must be called before accessing intervals\");\n }\n if (typeof(id) !== \"string\") {\n throw new Error(\"Change API requires an ID that is a string\");\n }\n if (!props) {\n throw new Error(\"changeProperties should be called with a property set\");\n }\n\n const interval = this.getIntervalById(id);\n if (interval) {\n // Pass Unassigned as the sequence number to indicate that this is a local op that is waiting for an ack.\n const deltaProps = interval.addProperties(props, true, UnassignedSequenceNumber);\n const serializedInterval: ISerializedInterval = interval.serialize(this.client);\n // Emit a change op that will only change properties. Add the ID to the property bag provided by the caller.\n serializedInterval.start = undefined;\n serializedInterval.end = undefined;\n serializedInterval.properties = props;\n serializedInterval.properties[reservedIntervalIdKey] = interval.getIntervalId();\n this.emitter.emit(\"change\", undefined, serializedInterval);\n this.emit(\"propertyChanged\", interval, deltaProps);\n }\n this.emit(\"changeInterval\", interval, true, undefined);\n }\n\n public change(id: string, start?: number, end?: number): TInterval | undefined {\n if (!this.attached) {\n throw new Error(\"Attach must be called before accessing intervals\");\n }\n if (typeof(id) !== \"string\") {\n throw new Error(\"Change API requires an ID that is a string\");\n }\n\n // Force id to be a string.\n const interval = this.getIntervalById(id);\n if (interval) {\n this.localCollection.changeInterval(interval, start, end);\n const serializedInterval: ISerializedInterval = interval.serialize(this.client);\n serializedInterval.start = start;\n serializedInterval.end = end;\n // Emit a property bag containing only the ID, as we don't intend for this op to change any properties.\n serializedInterval.properties =\n {\n [reservedIntervalIdKey]: interval.getIntervalId(),\n };\n this.emitter.emit(\"change\", undefined, serializedInterval);\n this.addPendingChange(id, serializedInterval);\n }\n this.emit(\"changeInterval\", interval, true, undefined);\n return interval;\n }\n\n private addPendingChange(id: string, serializedInterval: ISerializedInterval) {\n if (serializedInterval.start !== undefined) {\n if (!this.pendingChangeStart) {\n this.pendingChangeStart = new Map<string, ISerializedInterval[]>();\n }\n this.addPendingChangeHelper(id, this.pendingChangeStart, serializedInterval);\n }\n if (serializedInterval.end !== undefined) {\n if (!this.pendingChangeEnd) {\n this.pendingChangeEnd = new Map<string, ISerializedInterval[]>();\n }\n this.addPendingChangeHelper(id, this.pendingChangeEnd, serializedInterval);\n }\n }\n\n private addPendingChangeHelper(\n id: string,\n pendingChanges: Map<string, ISerializedInterval[]>,\n serializedInterval: ISerializedInterval,\n ) {\n let entries: ISerializedInterval[] = pendingChanges.get(id);\n if (!entries) {\n entries = [];\n pendingChanges.set(id, entries);\n }\n entries.push(serializedInterval);\n }\n\n private removePendingChange(serializedInterval: ISerializedInterval) {\n // Change ops always have an ID.\n const id: string = serializedInterval.properties[reservedIntervalIdKey];\n if (serializedInterval.start !== undefined) {\n this.removePendingChangeHelper(id, this.pendingChangeStart, serializedInterval);\n }\n if (serializedInterval.end !== undefined) {\n this.removePendingChangeHelper(id, this.pendingChangeEnd, serializedInterval);\n }\n }\n\n private removePendingChangeHelper(\n id: string,\n pendingChanges: Map<string, ISerializedInterval[]>,\n serializedInterval: ISerializedInterval,\n ) {\n const entries = pendingChanges?.get(id);\n if (entries) {\n const pendingChange = entries.shift();\n if (entries.length === 0) {\n pendingChanges.delete(id);\n }\n if (pendingChange.start !== serializedInterval.start ||\n pendingChange.end !== serializedInterval.end) {\n throw new Error(\"Mismatch in pending changes\");\n }\n }\n }\n\n private hasPendingChangeStart(id: string) {\n const entries = this.pendingChangeStart?.get(id);\n return entries && entries.length !== 0;\n }\n\n private hasPendingChangeEnd(id: string) {\n const entries = this.pendingChangeEnd?.get(id);\n return entries && entries.length !== 0;\n }\n\n public changeInterval(serializedInterval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) {\n if (!this.attached) {\n throw new Error(\"Attach must be called before accessing intervals\");\n }\n\n let interval: TInterval | undefined;\n\n if (local) {\n // This is an ack from the server. Remove the pending change.\n this.removePendingChange(serializedInterval);\n const id: string = serializedInterval.properties[reservedIntervalIdKey];\n interval = this.getIntervalById(id);\n if (interval) {\n // Let the propertyManager prune its pending change-properties set.\n interval.propertyManager?.ackPendingProperties(\n {\n type: MergeTreeDeltaType.ANNOTATE,\n props: serializedInterval.properties,\n });\n }\n }\n else {\n // If there are pending changes with this ID, don't apply the remote start/end change, as the local ack\n // should be the winning change.\n // Note that the ID is in the property bag only to allow us to find the interval.\n // This API cannot change the ID, and writing to the ID property will result in an exception. So we\n // strip it out of the properties here.\n const { [reservedIntervalIdKey]: id, ...newProps } = serializedInterval.properties;\n interval = this.getIntervalById(id);\n if (interval) {\n let start: number | undefined;\n let end: number | undefined;\n // Track pending start/end independently of one another.\n if (!this.hasPendingChangeStart(id)) {\n start = serializedInterval.start;\n }\n if (!this.hasPendingChangeEnd(id)) {\n end = serializedInterval.end;\n }\n if (start !== undefined || end !== undefined) {\n // If changeInterval gives us a new interval, work with that one. Otherwise keep working with\n // the one we originally found in the tree.\n interval = this.localCollection.changeInterval(interval, start, end, op) ?? interval;\n }\n const deltaProps = interval.addProperties(newProps, true, op.sequenceNumber);\n if (this.onDeserialize) {\n this.onDeserialize(interval);\n }\n this.emit(\"propertyChanged\", interval, deltaProps);\n }\n }\n if (interval) {\n this.emit(\"changeInterval\", interval, local, op);\n }\n }\n\n public addConflictResolver(conflictResolver: IntervalConflictResolver<TInterval>): void {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n this.localCollection.addConflictResolver(conflictResolver);\n }\n\n public attachDeserializer(onDeserialize: DeserializeCallback): void {\n // If no deserializer is specified can skip all processing work\n if (!onDeserialize) {\n return;\n }\n\n // Start by storing the callbacks so that any subsequent modifications make use of them\n this.onDeserialize = onDeserialize;\n\n // Trigger the async prepare work across all values in the collection\n this.localCollection.map((interval) => {\n this.onDeserialize(interval);\n });\n }\n\n public addInternal(\n serializedInterval: ISerializedInterval,\n local: boolean,\n op: ISequencedDocumentMessage) {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n\n this.localCollection.ensureSerializedId(serializedInterval);\n\n const interval: TInterval = this.localCollection.addInterval(\n serializedInterval.start,\n serializedInterval.end,\n serializedInterval.intervalType,\n serializedInterval.properties,\n op);\n\n if (interval) {\n // Local ops get submitted to the server. Remote ops have the deserializer run.\n if (local) {\n // Review: Is this case possible?\n this.emitter.emit(\"add\", undefined, serializedInterval);\n } else {\n if (this.onDeserialize) {\n this.onDeserialize(interval);\n }\n }\n }\n\n this.emit(\"addInterval\", interval, local, op);\n\n return interval;\n }\n\n public deleteInterval(\n serializedInterval: ISerializedInterval,\n local: boolean,\n op: ISequencedDocumentMessage): void {\n if (!this.attached) {\n throw new Error(\"attach must be called prior to deleting intervals\");\n }\n\n this.localCollection.ensureSerializedId(serializedInterval);\n const interval = this.localCollection.getIntervalById(serializedInterval.properties[reservedIntervalIdKey]);\n if (interval) {\n this.deleteExistingInterval(interval, local, op);\n }\n }\n\n public serializeInternal() {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n\n return this.localCollection.serialize();\n }\n\n public [Symbol.iterator](): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this);\n return iterator;\n }\n\n public CreateForwardIteratorWithStartPosition(startPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, true, startPosition);\n return iterator;\n }\n\n public CreateBackwardIteratorWithStartPosition(startPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, false, startPosition);\n return iterator;\n }\n\n public CreateForwardIteratorWithEndPosition(endPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, true, undefined, endPosition);\n return iterator;\n }\n\n public CreateBackwardIteratorWithEndPosition(endPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, false, undefined, endPosition);\n return iterator;\n }\n\n public gatherIterationResults(\n results: TInterval[],\n iteratesForward: boolean,\n start?: number,\n end?: number) {\n if (!this.attached) {\n return;\n }\n\n this.localCollection.gatherIterationResults(results, iteratesForward, start, end);\n }\n\n public findOverlappingIntervals(startPosition: number, endPosition: number): TInterval[] {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n\n return this.localCollection.findOverlappingIntervals(startPosition, endPosition);\n }\n\n public map(fn: (interval: TInterval) => void) {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n\n this.localCollection.map(fn);\n }\n\n public previousInterval(pos: number): TInterval {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n\n return this.localCollection.previousInterval(pos);\n }\n\n public nextInterval(pos: number): TInterval {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n\n return this.localCollection.nextInterval(pos);\n }\n}\n"]}
@@ -7,6 +7,11 @@ import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions"
7
7
  import { IFluidSerializer } from "@fluidframework/shared-object-base";
8
8
  import { TypedEventEmitter } from "@fluidframework/common-utils";
9
9
  import { ISerializableValue, ISerializedValue, IValueType, IValueTypeCreator, IValueTypeOperationValue, ISharedMapEvents } from "./mapKernelInterfaces";
10
+ interface IMapMessageLocalMetadata {
11
+ pendingClearMessageId?: number;
12
+ pendingMessageId?: number;
13
+ lastProcessedSeq: number;
14
+ }
10
15
  /**
11
16
  * Describes an operation specific to a value type.
12
17
  */
@@ -120,6 +125,7 @@ export declare class MapKernel implements IValueTypeCreator {
120
125
  * Object to create encapsulations of the values stored in the map.
121
126
  */
122
127
  private readonly localValueMaker;
128
+ private lastProcessedSeq;
123
129
  /**
124
130
  * Create a new shared map kernel.
125
131
  * @param serializer - The serializer to serialize / parse handles
@@ -129,7 +135,7 @@ export declare class MapKernel implements IValueTypeCreator {
129
135
  * @param valueTypes - The value types to register
130
136
  * @param eventEmitter - The object that will emit map events
131
137
  */
132
- constructor(serializer: IFluidSerializer, handle: IFluidHandle, submitMessage: (op: any, localOpMetadata: unknown) => void, isAttached: () => boolean, valueTypes: Readonly<IValueType<any>[]>, eventEmitter?: TypedEventEmitter<ISharedMapEvents>);
138
+ constructor(serializer: IFluidSerializer, handle: IFluidHandle, submitMessage: (op: any, localOpMetadata: IMapMessageLocalMetadata) => void, isAttached: () => boolean, valueTypes: Readonly<IValueType<any>[]>, eventEmitter?: TypedEventEmitter<ISharedMapEvents>);
133
139
  /**
134
140
  * Get an iterator over the keys in this map.
135
141
  * @returns The iterator
@@ -293,4 +299,5 @@ export declare class MapKernel implements IValueTypeCreator {
293
299
  */
294
300
  private makeMapValueOpEmitter;
295
301
  }
302
+ export {};
296
303
  //# sourceMappingURL=mapKernel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapKernel.d.ts","sourceRoot":"","sources":["../src/mapKernel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mapKernel.d.ts","sourceRoot":"","sources":["../src/mapKernel.ts"],"names":[],"mappings":"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"}
package/lib/mapKernel.js CHANGED
@@ -45,6 +45,7 @@ export class MapKernel {
45
45
  * of that clear operation. Otherwise, is -1.
46
46
  */
47
47
  this.pendingClearMessageId = -1;
48
+ this.lastProcessedSeq = -1;
48
49
  this.localValueMaker = new LocalValueMaker(serializer);
49
50
  this.messageHandlers = this.getMessageHandlers();
50
51
  for (const type of valueTypes) {
@@ -152,10 +153,10 @@ export class MapKernel {
152
153
  if (key === changed.key) {
153
154
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
154
155
  resolve(this.get(changed.key));
155
- this.eventEmitter.removeListener("valueChanged", callback);
156
+ this.eventEmitter.removeListener("create", callback);
156
157
  }
157
158
  };
158
- this.eventEmitter.on("valueChanged", callback);
159
+ this.eventEmitter.on("create", callback);
159
160
  });
160
161
  }
161
162
  /**
@@ -300,8 +301,14 @@ export class MapKernel {
300
301
  trySubmitMessage(op, localOpMetadata) {
301
302
  const type = op.type;
302
303
  if (this.messageHandlers.has(type)) {
304
+ const mapLocalMetadata = localOpMetadata;
305
+ // we don't know how to rebase these operations, so if any other op has come in
306
+ // we will fail.
307
+ if (this.lastProcessedSeq !== (mapLocalMetadata === null || mapLocalMetadata === void 0 ? void 0 : mapLocalMetadata.lastProcessedSeq)) {
308
+ throw new Error("SharedInterval does not support reconnect in presence of external changes");
309
+ }
303
310
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
304
- this.messageHandlers.get(type).submit(op, localOpMetadata);
311
+ this.messageHandlers.get(type).submit(op);
305
312
  return true;
306
313
  }
307
314
  return false;
@@ -323,6 +330,9 @@ export class MapKernel {
323
330
  * @returns True if the operation was processed, false otherwise.
324
331
  */
325
332
  tryProcessMessage(op, local, message, localOpMetadata) {
333
+ // track the seq of every incoming message, so we can detect if any
334
+ // changes happened during a resubmit
335
+ this.lastProcessedSeq = message.sequenceNumber;
326
336
  if (this.messageHandlers.has(op.type)) {
327
337
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
328
338
  this.messageHandlers
@@ -343,7 +353,7 @@ export class MapKernel {
343
353
  const previousValue = this.get(key);
344
354
  this.data.set(key, value);
345
355
  const event = { key, previousValue };
346
- this.eventEmitter.emit("valueChanged", event, local, op, this.eventEmitter);
356
+ this.eventEmitter.emit("create", event, local, op, this.eventEmitter);
347
357
  }
348
358
  /**
349
359
  * Clear implementation used for both locally sourced clears as well as incoming remote clears.
@@ -417,7 +427,8 @@ export class MapKernel {
417
427
  needProcessKeyOperation(op, local, localOpMetadata) {
418
428
  if (this.pendingClearMessageId !== -1) {
419
429
  if (local) {
420
- assert(localOpMetadata !== undefined && localOpMetadata < this.pendingClearMessageId, 0x1f1 /* "Received out of order op when there is an unacked clear message" */);
430
+ assert((localOpMetadata === null || localOpMetadata === void 0 ? void 0 : localOpMetadata.pendingClearMessageId) !== undefined
431
+ && localOpMetadata.pendingClearMessageId < this.pendingClearMessageId, 0x1f1 /* "Received out of order op when there is an unacked clear message" */);
421
432
  }
422
433
  // If we have an unacked clear, we can ignore all ops.
423
434
  return false;
@@ -427,7 +438,7 @@ export class MapKernel {
427
438
  // and don't process the op.
428
439
  if (local) {
429
440
  assert(localOpMetadata !== undefined, 0x1f2 /* `pendingMessageId is missing from the local client's ${op.type} operation` */);
430
- const pendingMessageId = localOpMetadata;
441
+ const pendingMessageId = localOpMetadata.pendingMessageId;
431
442
  const pendingKeyMessageId = this.pendingKeys.get(op.key);
432
443
  if (pendingKeyMessageId === pendingMessageId) {
433
444
  this.pendingKeys.delete(op.key);
@@ -448,7 +459,7 @@ export class MapKernel {
448
459
  process: (op, local, message, localOpMetadata) => {
449
460
  if (local) {
450
461
  assert(localOpMetadata !== undefined, 0x1f3 /* "pendingMessageId is missing from the local client's clear operation" */);
451
- const pendingMessageId = localOpMetadata;
462
+ const pendingMessageId = localOpMetadata === null || localOpMetadata === void 0 ? void 0 : localOpMetadata.pendingMessageId;
452
463
  if (this.pendingClearMessageId === pendingMessageId) {
453
464
  this.pendingClearMessageId = -1;
454
465
  }
@@ -460,7 +471,7 @@ export class MapKernel {
460
471
  }
461
472
  this.clearCore(local, message);
462
473
  },
463
- submit: (op, localOpMetadata) => {
474
+ submit: (op) => {
464
475
  // We don't reuse the metadata but send a new one on each submit.
465
476
  this.submitMapClearMessage(op);
466
477
  },
@@ -476,7 +487,7 @@ export class MapKernel {
476
487
  }
477
488
  this.deleteCore(op.key, local, message);
478
489
  },
479
- submit: (op, localOpMetadata) => {
490
+ submit: (op) => {
480
491
  // We don't reuse the metadata but send a new one on each submit.
481
492
  this.submitMapKeyMessage(op);
482
493
  },
@@ -494,7 +505,7 @@ export class MapKernel {
494
505
  const context = this.makeLocal(op.key, op.value);
495
506
  this.setCore(op.key, context, local, message);
496
507
  },
497
- submit: (op, localOpMetadata) => {
508
+ submit: (op) => {
498
509
  // We don't reuse the metadata but send a new one on each submit.
499
510
  this.submitMapKeyMessage(op);
500
511
  },
@@ -521,8 +532,8 @@ export class MapKernel {
521
532
  const event = { key: op.key, previousValue };
522
533
  this.eventEmitter.emit("valueChanged", event, local, message, this.eventEmitter);
523
534
  },
524
- submit: (op, localOpMetadata) => {
525
- this.submitMessage(op, localOpMetadata);
535
+ submit: (op) => {
536
+ this.submitMessage(op, { lastProcessedSeq: this.lastProcessedSeq });
526
537
  },
527
538
  getStashedOpLocalMetadata: (op) => {
528
539
  assert(false, 0x016 /* "apply stashed op not implemented for custom value type ops" */);
@@ -540,8 +551,8 @@ export class MapKernel {
540
551
  * @param op - The clear message
541
552
  */
542
553
  submitMapClearMessage(op) {
543
- const pendingMessageId = this.getMapClearMessageLocalMetadata(op);
544
- this.submitMessage(op, pendingMessageId);
554
+ const pendingClearMessageId = this.getMapClearMessageLocalMetadata(op);
555
+ this.submitMessage(op, { pendingClearMessageId, lastProcessedSeq: this.lastProcessedSeq });
545
556
  }
546
557
  getMapKeyMessageLocalMetadata(op) {
547
558
  const pendingMessageId = ++this.pendingMessageId;
@@ -554,7 +565,7 @@ export class MapKernel {
554
565
  */
555
566
  submitMapKeyMessage(op) {
556
567
  const pendingMessageId = this.getMapKeyMessageLocalMetadata(op);
557
- this.submitMessage(op, pendingMessageId);
568
+ this.submitMessage(op, { pendingMessageId, lastProcessedSeq: this.lastProcessedSeq });
558
569
  }
559
570
  /**
560
571
  * Create an emitter for a value type to emit ops from the given key.
@@ -574,7 +585,7 @@ export class MapKernel {
574
585
  },
575
586
  };
576
587
  // Send the localOpMetadata as undefined because we don't care about the ack.
577
- this.submitMessage(op, undefined /* localOpMetadata */);
588
+ this.submitMessage(op, { lastProcessedSeq: this.lastProcessedSeq });
578
589
  const event = { key, previousValue };
579
590
  this.eventEmitter.emit("valueChanged", event, true, null, this.eventEmitter);
580
591
  };