@fluidframework/merge-tree 1.2.1 → 2.0.0-internal.1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DEV.md +2 -2
- package/README.md +1 -1
- package/REFERENCEPOSITIONS.md +2 -2
- package/dist/MergeTreeTextHelper.d.ts +23 -0
- package/dist/MergeTreeTextHelper.d.ts.map +1 -0
- package/dist/MergeTreeTextHelper.js +136 -0
- package/dist/MergeTreeTextHelper.js.map +1 -0
- package/dist/base.d.ts +2 -26
- package/dist/base.d.ts.map +1 -1
- package/dist/base.js.map +1 -1
- package/dist/client.d.ts +21 -12
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +87 -27
- package/dist/client.js.map +1 -1
- package/dist/collections/heap.d.ts +28 -0
- package/dist/collections/heap.d.ts.map +1 -0
- package/dist/collections/heap.js +65 -0
- package/dist/collections/heap.js.map +1 -0
- package/dist/collections/index.d.ts +11 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +23 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/collections/intervalTree.d.ts +60 -0
- package/dist/collections/intervalTree.d.ts.map +1 -0
- package/dist/collections/intervalTree.js +99 -0
- package/dist/collections/intervalTree.js.map +1 -0
- package/dist/collections/list.d.ts +39 -0
- package/dist/collections/list.d.ts.map +1 -0
- package/dist/collections/list.js +155 -0
- package/dist/collections/list.js.map +1 -0
- package/dist/collections/rbTree.d.ts +154 -0
- package/dist/collections/rbTree.d.ts.map +1 -0
- package/dist/{collections.js → collections/rbTree.js} +10 -448
- package/dist/collections/rbTree.js.map +1 -0
- package/dist/collections/stack.d.ts +16 -0
- package/dist/collections/stack.d.ts.map +1 -0
- package/dist/collections/stack.js +30 -0
- package/dist/collections/stack.js.map +1 -0
- package/dist/collections/tst.d.ts +55 -0
- package/dist/collections/tst.d.ts.map +1 -0
- package/dist/collections/tst.js +171 -0
- package/dist/collections/tst.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/localReference.d.ts +48 -99
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +132 -169
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts +38 -299
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +214 -598
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeDeltaCallback.d.ts +1 -1
- package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/dist/mergeTreeDeltaCallback.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +269 -0
- package/dist/mergeTreeNodes.d.ts.map +1 -0
- package/dist/mergeTreeNodes.js +383 -0
- package/dist/mergeTreeNodes.js.map +1 -0
- package/dist/mergeTreeTracking.d.ts +1 -1
- package/dist/mergeTreeTracking.d.ts.map +1 -1
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/opBuilder.d.ts +1 -1
- package/dist/opBuilder.d.ts.map +1 -1
- package/dist/opBuilder.js.map +1 -1
- package/dist/partialLengths.d.ts +130 -15
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +230 -138
- package/dist/partialLengths.js.map +1 -1
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js.map +1 -1
- package/dist/referencePositions.d.ts +6 -26
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts +2 -1
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js +3 -0
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentPropertiesManager.d.ts +10 -1
- package/dist/segmentPropertiesManager.d.ts.map +1 -1
- package/dist/segmentPropertiesManager.js +41 -6
- package/dist/segmentPropertiesManager.js.map +1 -1
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts +5 -1
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +4 -0
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts +1 -1
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/textSegment.d.ts +7 -7
- package/dist/textSegment.d.ts.map +1 -1
- package/dist/textSegment.js +3 -125
- package/dist/textSegment.js.map +1 -1
- package/lib/MergeTreeTextHelper.d.ts +23 -0
- package/lib/MergeTreeTextHelper.d.ts.map +1 -0
- package/lib/MergeTreeTextHelper.js +132 -0
- package/lib/MergeTreeTextHelper.js.map +1 -0
- package/lib/base.d.ts +2 -26
- package/lib/base.d.ts.map +1 -1
- package/lib/base.js.map +1 -1
- package/lib/client.d.ts +21 -12
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +85 -25
- package/lib/client.js.map +1 -1
- package/lib/collections/heap.d.ts +28 -0
- package/lib/collections/heap.d.ts.map +1 -0
- package/lib/collections/heap.js +61 -0
- package/lib/collections/heap.js.map +1 -0
- package/lib/collections/index.d.ts +11 -0
- package/lib/collections/index.d.ts.map +1 -0
- package/lib/collections/index.js +11 -0
- package/lib/collections/index.js.map +1 -0
- package/lib/collections/intervalTree.d.ts +60 -0
- package/lib/collections/intervalTree.d.ts.map +1 -0
- package/lib/collections/intervalTree.js +94 -0
- package/lib/collections/intervalTree.js.map +1 -0
- package/lib/collections/list.d.ts +39 -0
- package/lib/collections/list.d.ts.map +1 -0
- package/lib/collections/list.js +149 -0
- package/lib/collections/list.js.map +1 -0
- package/lib/collections/rbTree.d.ts +154 -0
- package/lib/collections/rbTree.d.ts.map +1 -0
- package/lib/{collections.js → collections/rbTree.js} +9 -439
- package/lib/collections/rbTree.js.map +1 -0
- package/lib/collections/stack.d.ts +16 -0
- package/lib/collections/stack.d.ts.map +1 -0
- package/lib/collections/stack.js +26 -0
- package/lib/collections/stack.js.map +1 -0
- package/lib/collections/tst.d.ts +55 -0
- package/lib/collections/tst.d.ts.map +1 -0
- package/lib/collections/tst.js +167 -0
- package/lib/collections/tst.js.map +1 -0
- package/lib/index.d.ts +3 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -1
- package/lib/index.js.map +1 -1
- package/lib/localReference.d.ts +48 -99
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +132 -170
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts +38 -299
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +190 -563
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeDeltaCallback.d.ts +1 -1
- package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/lib/mergeTreeDeltaCallback.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +269 -0
- package/lib/mergeTreeNodes.d.ts.map +1 -0
- package/lib/mergeTreeNodes.js +369 -0
- package/lib/mergeTreeNodes.js.map +1 -0
- package/lib/mergeTreeTracking.d.ts +1 -1
- package/lib/mergeTreeTracking.d.ts.map +1 -1
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/opBuilder.d.ts +1 -1
- package/lib/opBuilder.d.ts.map +1 -1
- package/lib/opBuilder.js.map +1 -1
- package/lib/partialLengths.d.ts +130 -15
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +227 -135
- package/lib/partialLengths.js.map +1 -1
- package/lib/properties.d.ts.map +1 -1
- package/lib/properties.js.map +1 -1
- package/lib/referencePositions.d.ts +6 -26
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts +2 -1
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js +3 -0
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentPropertiesManager.d.ts +10 -1
- package/lib/segmentPropertiesManager.d.ts.map +1 -1
- package/lib/segmentPropertiesManager.js +41 -6
- package/lib/segmentPropertiesManager.js.map +1 -1
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts +5 -1
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +4 -0
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts +1 -1
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/textSegment.d.ts +7 -7
- package/lib/textSegment.d.ts.map +1 -1
- package/lib/textSegment.js +1 -122
- package/lib/textSegment.js.map +1 -1
- package/package.json +93 -17
- package/src/MergeTreeTextHelper.ts +172 -0
- package/src/base.ts +2 -35
- package/src/client.ts +114 -30
- package/src/collections/heap.ts +75 -0
- package/src/collections/index.ts +11 -0
- package/src/collections/intervalTree.ts +140 -0
- package/src/collections/list.ts +165 -0
- package/src/{collections.ts → collections/rbTree.ts} +79 -538
- package/src/collections/stack.ts +27 -0
- package/src/collections/tst.ts +212 -0
- package/src/index.ts +8 -2
- package/src/localReference.ts +152 -203
- package/src/mergeTree.ts +265 -868
- package/src/mergeTreeDeltaCallback.ts +1 -1
- package/src/mergeTreeNodes.ts +676 -0
- package/src/mergeTreeTracking.ts +1 -1
- package/src/opBuilder.ts +1 -1
- package/src/partialLengths.ts +295 -150
- package/src/properties.ts +1 -0
- package/src/referencePositions.ts +7 -27
- package/src/segmentGroupCollection.ts +5 -1
- package/src/segmentPropertiesManager.ts +45 -6
- package/src/snapshotLoader.ts +2 -1
- package/src/snapshotV1.ts +2 -2
- package/src/snapshotlegacy.ts +6 -2
- package/src/sortedSegmentSet.ts +1 -1
- package/src/textSegment.ts +10 -157
- package/dist/collections.d.ts +0 -197
- package/dist/collections.d.ts.map +0 -1
- package/dist/collections.js.map +0 -1
- package/lib/collections.d.ts +0 -197
- package/lib/collections.d.ts.map +0 -1
- package/lib/collections.js.map +0 -1
package/dist/textSegment.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textSegment.js","sourceRoot":"","sources":["../src/textSegment.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 { IIntegerRange } from \"./base\";\nimport { BaseSegment, ISegment, Marker, MergeTree } from \"./mergeTree\";\nimport { IJSONSegment } from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { LocalReferenceCollection } from \"./localReference\";\n\n// Maximum length of text segment to be considered to be merged with other segment.\n// Maximum segment length is at least 2x of it (not taking into account initial segment creation).\n// The bigger it is, the more expensive it is to break segment into sub-segments (on edits)\n// The smaller it is, the more segments we have in snapshots (and in memory) - it's more expensive to load snapshots.\n// Small number also makes ReplayTool produce false positives (\"same\" snapshots have slightly different binary\n// representations). More measurements needs to be done, but it's very likely the right spot is somewhere between\n// 1K-2K mark. That said, we also break segments on newline and there are very few segments that are longer than 256\n// because of it. Must be an even number\nconst TextSegmentGranularity = 256;\n\nexport interface IJSONTextSegment extends IJSONSegment {\n text: string;\n}\n\nexport class TextSegment extends BaseSegment {\n public static readonly type = \"TextSegment\";\n\n public static is(segment: ISegment): segment is TextSegment {\n return segment.type === TextSegment.type;\n }\n\n public static make(text: string, props?: PropertySet) {\n const seg = new TextSegment(text);\n if (props) {\n seg.addProperties(props);\n }\n return seg;\n }\n\n public static fromJSONObject(spec: any) {\n if (typeof spec === \"string\") {\n return new TextSegment(spec);\n } else if (spec && typeof spec === \"object\" && \"text\" in spec) {\n const textSpec = spec as IJSONTextSegment;\n return TextSegment.make(textSpec.text, textSpec.props as PropertySet);\n }\n return undefined;\n }\n\n public readonly type = TextSegment.type;\n\n constructor(public text: string) {\n super();\n this.cachedLength = text.length;\n }\n\n public toJSONObject() {\n // To reduce snapshot/ops size, we serialize a TextSegment as a plain 'string' if it is\n // not annotated.\n return this.properties\n ? { text: this.text, props: this.properties }\n : this.text;\n }\n\n public clone(start = 0, end?: number) {\n const text = this.text.substring(start, end);\n const b = TextSegment.make(text, this.properties);\n this.cloneInto(b);\n return b;\n }\n\n public canAppend(segment: ISegment): boolean {\n return !this.text.endsWith(\"\\n\")\n && TextSegment.is(segment)\n && (this.cachedLength <= TextSegmentGranularity ||\n segment.cachedLength <= TextSegmentGranularity);\n }\n\n public toString() {\n return this.text;\n }\n\n public append(segment: ISegment) {\n if (TextSegment.is(segment)) {\n // Note: Must call 'appendLocalRefs' before modifying this segment's length as\n // 'this.cachedLength' is used to adjust the offsets of the local refs.\n LocalReferenceCollection.append(this, segment);\n\n this.text += segment.text;\n this.cachedLength = this.text.length;\n } else {\n throw new Error(\"can only append text segment\");\n }\n }\n\n // TODO: retain removed text for undo\n // returns true if entire string removed\n public removeRange(start: number, end: number) {\n let remnantString = \"\";\n const len = this.text.length;\n if (start > 0) {\n remnantString += this.text.substring(0, start);\n }\n if (end < len) {\n remnantString += this.text.substring(end);\n }\n this.text = remnantString;\n this.cachedLength = remnantString.length;\n return (remnantString.length === 0);\n }\n\n protected createSplitSegmentAt(pos: number) {\n if (pos > 0) {\n const remainingText = this.text.substring(pos);\n this.text = this.text.substring(0, pos);\n this.cachedLength = this.text.length;\n const leafSegment = new TextSegment(remainingText);\n return leafSegment;\n }\n }\n}\n\ninterface ITextAccumulator {\n textSegment: TextSegment;\n placeholder?: string;\n parallelArrays?: boolean;\n}\n\ninterface ITextAndMarkerAccumulator extends ITextAccumulator {\n parallelArrays: true;\n parallelText: string[];\n parallelMarkers: Marker[];\n parallelMarkerLabel: string;\n tagsInProgress: string[];\n}\n\nfunction isTextAndMarkerAccumulator(accum: ITextAccumulator): accum is ITextAndMarkerAccumulator {\n return accum.parallelArrays === true;\n}\n\ntype ITextAccumulatorType = ITextAccumulator | ITextAndMarkerAccumulator;\nexport class MergeTreeTextHelper {\n constructor(private readonly mergeTree: MergeTree) { }\n\n public getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number) {\n const range = this.getValidRange(start, end, refSeq, clientId);\n const accum: ITextAndMarkerAccumulator = {\n parallelArrays: true,\n parallelMarkerLabel: label,\n parallelMarkers: [],\n parallelText: [],\n tagsInProgress: [],\n textSegment: new TextSegment(\"\"),\n };\n\n this.mergeTree.mapRange<ITextAndMarkerAccumulator>(\n { leaf: this.gatherText },\n refSeq,\n clientId,\n accum,\n range.start,\n range.end);\n\n return { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };\n }\n\n public getText(refSeq: number, clientId: number, placeholder = \"\", start?: number, end?: number) {\n const range = this.getValidRange(start, end, refSeq, clientId);\n\n const accum: ITextAccumulator = { textSegment: new TextSegment(\"\"), placeholder };\n\n this.mergeTree.mapRange<ITextAccumulator>(\n { leaf: this.gatherText },\n refSeq,\n clientId,\n accum,\n range.start,\n range.end);\n return accum.textSegment.text;\n }\n\n private getValidRange(\n start: number | undefined,\n end: number | undefined,\n refSeq: number,\n clientId: number,\n ): IIntegerRange {\n const range: IIntegerRange = {\n end: end ?? this.mergeTree.getLength(refSeq, clientId),\n start: start ?? 0,\n };\n return range;\n }\n\n private readonly gatherText = (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number,\n end: number, accumText: ITextAccumulatorType) => {\n let _start = start;\n if (TextSegment.is(segment)) {\n let beginTags = \"\";\n let endTags = \"\";\n if (isTextAndMarkerAccumulator(accumText)) {\n // TODO: let clients pass in function to get tag\n const tags = [] as string[];\n const initTags = [] as string[];\n\n if (segment.properties?.[\"font-weight\"]) {\n tags.push(\"b\");\n }\n if (segment.properties?.[\"text-decoration\"]) {\n tags.push(\"u\");\n }\n const remTags = [] as string[];\n if (tags.length > 0) {\n for (const tag of tags) {\n if (!accumText.tagsInProgress.includes(tag)) {\n beginTags += `<${tag}>`;\n initTags.push(tag);\n }\n }\n for (const accumTag of accumText.tagsInProgress) {\n if (!tags.includes(accumTag)) {\n endTags += `</${accumTag}>`;\n remTags.push(accumTag);\n }\n }\n for (const initTag of initTags.reverse()) {\n accumText.tagsInProgress.push(initTag);\n }\n } else {\n for (const accumTag of accumText.tagsInProgress) {\n endTags += `</${accumTag}>`;\n remTags.push(accumTag);\n }\n }\n for (const remTag of remTags) {\n const remdex = accumText.tagsInProgress.indexOf(remTag);\n if (remdex >= 0) {\n accumText.tagsInProgress.splice(remdex, 1);\n }\n }\n }\n accumText.textSegment.text += endTags;\n accumText.textSegment.text += beginTags;\n if ((_start <= 0) && (end >= segment.text.length)) {\n accumText.textSegment.text += segment.text;\n } else {\n if (_start < 0) {\n _start = 0;\n }\n if (end >= segment.text.length) {\n accumText.textSegment.text += segment.text.substring(_start);\n } else {\n accumText.textSegment.text += segment.text.substring(_start, end);\n }\n }\n } else {\n if (accumText.placeholder && (accumText.placeholder.length > 0)) {\n if (accumText.placeholder === \"*\") {\n const marker = segment as Marker;\n accumText.textSegment.text += `\\n${marker.toString()}`;\n } else {\n for (let i = 0; i < segment.cachedLength; i++) {\n accumText.textSegment.text += accumText.placeholder;\n }\n }\n } else if (isTextAndMarkerAccumulator(accumText)) {\n const marker = segment as Marker;\n if (marker.hasTileLabel(accumText.parallelMarkerLabel)) {\n accumText.parallelMarkers.push(marker);\n accumText.parallelText.push(accumText.textSegment.text);\n accumText.textSegment.text = \"\";\n }\n }\n }\n\n return true;\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"textSegment.js","sourceRoot":"","sources":["../src/textSegment.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 { BaseSegment, ISegment, Marker } from \"./mergeTreeNodes\";\nimport { IJSONSegment } from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { LocalReferenceCollection } from \"./localReference\";\n\n// Maximum length of text segment to be considered to be merged with other segment.\n// Maximum segment length is at least 2x of it (not taking into account initial segment creation).\n// The bigger it is, the more expensive it is to break segment into sub-segments (on edits)\n// The smaller it is, the more segments we have in snapshots (and in memory) - it's more expensive to load snapshots.\n// Small number also makes ReplayTool produce false positives (\"same\" snapshots have slightly different binary\n// representations). More measurements needs to be done, but it's very likely the right spot is somewhere between\n// 1K-2K mark. That said, we also break segments on newline and there are very few segments that are longer than 256\n// because of it. Must be an even number\nconst TextSegmentGranularity = 256;\n\nexport interface IJSONTextSegment extends IJSONSegment {\n text: string;\n}\n\nexport class TextSegment extends BaseSegment {\n public static readonly type = \"TextSegment\";\n\n public static is(segment: ISegment): segment is TextSegment {\n return segment.type === TextSegment.type;\n }\n\n public static make(text: string, props?: PropertySet) {\n const seg = new TextSegment(text);\n if (props) {\n seg.addProperties(props);\n }\n return seg;\n }\n\n public static fromJSONObject(spec: any) {\n if (typeof spec === \"string\") {\n return new TextSegment(spec);\n } else if (spec && typeof spec === \"object\" && \"text\" in spec) {\n const textSpec = spec as IJSONTextSegment;\n return TextSegment.make(textSpec.text, textSpec.props as PropertySet);\n }\n return undefined;\n }\n\n public readonly type = TextSegment.type;\n\n constructor(public text: string) {\n super();\n this.cachedLength = text.length;\n }\n\n public toJSONObject() {\n // To reduce snapshot/ops size, we serialize a TextSegment as a plain 'string' if it is\n // not annotated.\n return this.properties\n ? { text: this.text, props: this.properties }\n : this.text;\n }\n\n public clone(start = 0, end?: number) {\n const text = this.text.substring(start, end);\n const b = TextSegment.make(text, this.properties);\n this.cloneInto(b);\n return b;\n }\n\n public canAppend(segment: ISegment): boolean {\n return !this.text.endsWith(\"\\n\")\n && TextSegment.is(segment)\n && (this.cachedLength <= TextSegmentGranularity ||\n segment.cachedLength <= TextSegmentGranularity);\n }\n\n public toString() {\n return this.text;\n }\n\n public append(segment: ISegment) {\n if (TextSegment.is(segment)) {\n // Note: Must call 'appendLocalRefs' before modifying this segment's length as\n // 'this.cachedLength' is used to adjust the offsets of the local refs.\n LocalReferenceCollection.append(this, segment);\n\n this.text += segment.text;\n this.cachedLength = this.text.length;\n } else {\n throw new Error(\"can only append text segment\");\n }\n }\n\n // TODO: retain removed text for undo\n // returns true if entire string removed\n public removeRange(start: number, end: number) {\n let remnantString = \"\";\n const len = this.text.length;\n if (start > 0) {\n remnantString += this.text.substring(0, start);\n }\n if (end < len) {\n remnantString += this.text.substring(end);\n }\n this.text = remnantString;\n this.cachedLength = remnantString.length;\n return (remnantString.length === 0);\n }\n\n protected createSplitSegmentAt(pos: number) {\n if (pos > 0) {\n const remainingText = this.text.substring(pos);\n this.text = this.text.substring(0, pos);\n this.cachedLength = this.text.length;\n const leafSegment = new TextSegment(remainingText);\n return leafSegment;\n }\n }\n}\n\nexport interface IMergeTreeTextHelper{\n /**\n * @deprecated - If consuming via sequence, use `getTextAndMarkers` exported from \\@fluidframework/sequence.\n * Otherwise, define your own accumulation model and use `Client.walkSegments`.\n */\n getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number): {\n parallelText: string[];\n parallelMarkers: Marker[]; };\n getText(refSeq: number, clientId: number, placeholder: string, start?: number, end?: number): string;\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { Marker } from "./mergeTreeNodes";
|
|
6
|
+
import { MergeTree } from "./mergeTree";
|
|
7
|
+
import { IMergeTreeTextHelper } from "./textSegment";
|
|
8
|
+
/**
|
|
9
|
+
* @deprecated for internal use only. public export will be removed.
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export declare class MergeTreeTextHelper implements IMergeTreeTextHelper {
|
|
13
|
+
private readonly mergeTree;
|
|
14
|
+
constructor(mergeTree: MergeTree);
|
|
15
|
+
getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number): {
|
|
16
|
+
parallelText: string[];
|
|
17
|
+
parallelMarkers: Marker[];
|
|
18
|
+
};
|
|
19
|
+
getText(refSeq: number, clientId: number, placeholder?: string, start?: number, end?: number): string;
|
|
20
|
+
private getValidRange;
|
|
21
|
+
private readonly gatherText;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=MergeTreeTextHelper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MergeTreeTextHelper.d.ts","sourceRoot":"","sources":["../src/MergeTreeTextHelper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAY,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAe,MAAM,eAAe,CAAC;AAsBlE;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,oBAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAE1C,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM;;;;IAsB/F,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,SAAK,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM;IAe/F,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAkFzB;CACL"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { refHasTileLabel } from "./referencePositions";
|
|
6
|
+
import { TextSegment } from "./textSegment";
|
|
7
|
+
function isTextAndMarkerAccumulator(accum) {
|
|
8
|
+
return accum.parallelArrays === true;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* @deprecated for internal use only. public export will be removed.
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export class MergeTreeTextHelper {
|
|
15
|
+
constructor(mergeTree) {
|
|
16
|
+
this.mergeTree = mergeTree;
|
|
17
|
+
this.gatherText = (segment, pos, refSeq, clientId, start, end, accumText) => {
|
|
18
|
+
var _a, _b;
|
|
19
|
+
let _start = start;
|
|
20
|
+
if (TextSegment.is(segment)) {
|
|
21
|
+
let beginTags = "";
|
|
22
|
+
let endTags = "";
|
|
23
|
+
if (isTextAndMarkerAccumulator(accumText)) {
|
|
24
|
+
// TODO: let clients pass in function to get tag
|
|
25
|
+
const tags = [];
|
|
26
|
+
const initTags = [];
|
|
27
|
+
if ((_a = segment.properties) === null || _a === void 0 ? void 0 : _a["font-weight"]) {
|
|
28
|
+
tags.push("b");
|
|
29
|
+
}
|
|
30
|
+
if ((_b = segment.properties) === null || _b === void 0 ? void 0 : _b["text-decoration"]) {
|
|
31
|
+
tags.push("u");
|
|
32
|
+
}
|
|
33
|
+
const remTags = [];
|
|
34
|
+
if (tags.length > 0) {
|
|
35
|
+
for (const tag of tags) {
|
|
36
|
+
if (!accumText.tagsInProgress.includes(tag)) {
|
|
37
|
+
beginTags += `<${tag}>`;
|
|
38
|
+
initTags.push(tag);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
for (const accumTag of accumText.tagsInProgress) {
|
|
42
|
+
if (!tags.includes(accumTag)) {
|
|
43
|
+
endTags += `</${accumTag}>`;
|
|
44
|
+
remTags.push(accumTag);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
for (const initTag of initTags.reverse()) {
|
|
48
|
+
accumText.tagsInProgress.push(initTag);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
for (const accumTag of accumText.tagsInProgress) {
|
|
53
|
+
endTags += `</${accumTag}>`;
|
|
54
|
+
remTags.push(accumTag);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
for (const remTag of remTags) {
|
|
58
|
+
const remdex = accumText.tagsInProgress.indexOf(remTag);
|
|
59
|
+
if (remdex >= 0) {
|
|
60
|
+
accumText.tagsInProgress.splice(remdex, 1);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
accumText.textSegment.text += endTags;
|
|
65
|
+
accumText.textSegment.text += beginTags;
|
|
66
|
+
if ((_start <= 0) && (end >= segment.text.length)) {
|
|
67
|
+
accumText.textSegment.text += segment.text;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
if (_start < 0) {
|
|
71
|
+
_start = 0;
|
|
72
|
+
}
|
|
73
|
+
if (end >= segment.text.length) {
|
|
74
|
+
accumText.textSegment.text += segment.text.substring(_start);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
accumText.textSegment.text += segment.text.substring(_start, end);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
if (accumText.placeholder && (accumText.placeholder.length > 0)) {
|
|
83
|
+
if (accumText.placeholder === "*") {
|
|
84
|
+
const marker = segment;
|
|
85
|
+
accumText.textSegment.text += `\n${marker.toString()}`;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
for (let i = 0; i < segment.cachedLength; i++) {
|
|
89
|
+
accumText.textSegment.text += accumText.placeholder;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else if (isTextAndMarkerAccumulator(accumText)) {
|
|
94
|
+
const marker = segment;
|
|
95
|
+
if (refHasTileLabel(marker, accumText.parallelMarkerLabel)) {
|
|
96
|
+
accumText.parallelMarkers.push(marker);
|
|
97
|
+
accumText.parallelText.push(accumText.textSegment.text);
|
|
98
|
+
accumText.textSegment.text = "";
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return true;
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
getTextAndMarkers(refSeq, clientId, label, start, end) {
|
|
106
|
+
const range = this.getValidRange(start, end, refSeq, clientId);
|
|
107
|
+
const accum = {
|
|
108
|
+
parallelArrays: true,
|
|
109
|
+
parallelMarkerLabel: label,
|
|
110
|
+
parallelMarkers: [],
|
|
111
|
+
parallelText: [],
|
|
112
|
+
tagsInProgress: [],
|
|
113
|
+
textSegment: new TextSegment(""),
|
|
114
|
+
};
|
|
115
|
+
this.mergeTree.mapRange({ leaf: this.gatherText }, refSeq, clientId, accum, range.start, range.end);
|
|
116
|
+
return { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };
|
|
117
|
+
}
|
|
118
|
+
getText(refSeq, clientId, placeholder = "", start, end) {
|
|
119
|
+
const range = this.getValidRange(start, end, refSeq, clientId);
|
|
120
|
+
const accum = { textSegment: new TextSegment(""), placeholder };
|
|
121
|
+
this.mergeTree.mapRange({ leaf: this.gatherText }, refSeq, clientId, accum, range.start, range.end);
|
|
122
|
+
return accum.textSegment.text;
|
|
123
|
+
}
|
|
124
|
+
getValidRange(start, end, refSeq, clientId) {
|
|
125
|
+
const range = {
|
|
126
|
+
end: end !== null && end !== void 0 ? end : this.mergeTree.getLength(refSeq, clientId),
|
|
127
|
+
start: start !== null && start !== void 0 ? start : 0,
|
|
128
|
+
};
|
|
129
|
+
return range;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=MergeTreeTextHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MergeTreeTextHelper.js","sourceRoot":"","sources":["../src/MergeTreeTextHelper.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 { IIntegerRange } from \"./base\";\nimport { ISegment, Marker } from \"./mergeTreeNodes\";\nimport { refHasTileLabel } from \"./referencePositions\";\nimport { MergeTree } from \"./mergeTree\";\nimport { IMergeTreeTextHelper, TextSegment } from \"./textSegment\";\n\ninterface ITextAccumulator {\n textSegment: TextSegment;\n placeholder?: string;\n parallelArrays?: boolean;\n}\n\ninterface ITextAndMarkerAccumulator extends ITextAccumulator {\n parallelArrays: true;\n parallelText: string[];\n parallelMarkers: Marker[];\n parallelMarkerLabel: string;\n tagsInProgress: string[];\n}\n\nfunction isTextAndMarkerAccumulator(accum: ITextAccumulator): accum is ITextAndMarkerAccumulator {\n return accum.parallelArrays === true;\n}\n\ntype ITextAccumulatorType = ITextAccumulator | ITextAndMarkerAccumulator;\n\n/**\n * @deprecated for internal use only. public export will be removed.\n * @internal\n */\nexport class MergeTreeTextHelper implements IMergeTreeTextHelper {\n constructor(private readonly mergeTree: MergeTree) { }\n\n public getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number) {\n const range = this.getValidRange(start, end, refSeq, clientId);\n const accum: ITextAndMarkerAccumulator = {\n parallelArrays: true,\n parallelMarkerLabel: label,\n parallelMarkers: [],\n parallelText: [],\n tagsInProgress: [],\n textSegment: new TextSegment(\"\"),\n };\n\n this.mergeTree.mapRange<ITextAndMarkerAccumulator>(\n { leaf: this.gatherText },\n refSeq,\n clientId,\n accum,\n range.start,\n range.end);\n\n return { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };\n }\n\n public getText(refSeq: number, clientId: number, placeholder = \"\", start?: number, end?: number) {\n const range = this.getValidRange(start, end, refSeq, clientId);\n\n const accum: ITextAccumulator = { textSegment: new TextSegment(\"\"), placeholder };\n\n this.mergeTree.mapRange<ITextAccumulator>(\n { leaf: this.gatherText },\n refSeq,\n clientId,\n accum,\n range.start,\n range.end);\n return accum.textSegment.text;\n }\n\n private getValidRange(\n start: number | undefined,\n end: number | undefined,\n refSeq: number,\n clientId: number,\n ): IIntegerRange {\n const range: IIntegerRange = {\n end: end ?? this.mergeTree.getLength(refSeq, clientId),\n start: start ?? 0,\n };\n return range;\n }\n\n private readonly gatherText = (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number,\n end: number, accumText: ITextAccumulatorType) => {\n let _start = start;\n if (TextSegment.is(segment)) {\n let beginTags = \"\";\n let endTags = \"\";\n if (isTextAndMarkerAccumulator(accumText)) {\n // TODO: let clients pass in function to get tag\n const tags = [] as string[];\n const initTags = [] as string[];\n\n if (segment.properties?.[\"font-weight\"]) {\n tags.push(\"b\");\n }\n if (segment.properties?.[\"text-decoration\"]) {\n tags.push(\"u\");\n }\n const remTags = [] as string[];\n if (tags.length > 0) {\n for (const tag of tags) {\n if (!accumText.tagsInProgress.includes(tag)) {\n beginTags += `<${tag}>`;\n initTags.push(tag);\n }\n }\n for (const accumTag of accumText.tagsInProgress) {\n if (!tags.includes(accumTag)) {\n endTags += `</${accumTag}>`;\n remTags.push(accumTag);\n }\n }\n for (const initTag of initTags.reverse()) {\n accumText.tagsInProgress.push(initTag);\n }\n } else {\n for (const accumTag of accumText.tagsInProgress) {\n endTags += `</${accumTag}>`;\n remTags.push(accumTag);\n }\n }\n for (const remTag of remTags) {\n const remdex = accumText.tagsInProgress.indexOf(remTag);\n if (remdex >= 0) {\n accumText.tagsInProgress.splice(remdex, 1);\n }\n }\n }\n accumText.textSegment.text += endTags;\n accumText.textSegment.text += beginTags;\n if ((_start <= 0) && (end >= segment.text.length)) {\n accumText.textSegment.text += segment.text;\n } else {\n if (_start < 0) {\n _start = 0;\n }\n if (end >= segment.text.length) {\n accumText.textSegment.text += segment.text.substring(_start);\n } else {\n accumText.textSegment.text += segment.text.substring(_start, end);\n }\n }\n } else {\n if (accumText.placeholder && (accumText.placeholder.length > 0)) {\n if (accumText.placeholder === \"*\") {\n const marker = segment as Marker;\n accumText.textSegment.text += `\\n${marker.toString()}`;\n } else {\n for (let i = 0; i < segment.cachedLength; i++) {\n accumText.textSegment.text += accumText.placeholder;\n }\n }\n } else if (isTextAndMarkerAccumulator(accumText)) {\n const marker = segment as Marker;\n if (refHasTileLabel(marker, accumText.parallelMarkerLabel)) {\n accumText.parallelMarkers.push(marker);\n accumText.parallelText.push(accumText.textSegment.text);\n accumText.textSegment.text = \"\";\n }\n }\n }\n\n return true;\n };\n}\n"]}
|
package/lib/base.d.ts
CHANGED
|
@@ -2,33 +2,9 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
export interface Property<TKey, TData> {
|
|
6
|
-
key: TKey;
|
|
7
|
-
data: TData;
|
|
8
|
-
}
|
|
9
|
-
export interface QProperty<TKey, TData> {
|
|
10
|
-
key?: TKey;
|
|
11
|
-
data?: TData;
|
|
12
|
-
}
|
|
13
|
-
export interface PropertyAction<TKey, TData> {
|
|
14
|
-
<TAccum>(p: Property<TKey, TData>, accum?: TAccum): boolean;
|
|
15
|
-
}
|
|
16
|
-
export declare type ConflictAction<TKey, TData> = (key: TKey, currentKey: TKey, data: TData, currentData: TData) => QProperty<TKey, TData>;
|
|
17
|
-
export interface Dictionary<TKey, TData> {
|
|
18
|
-
get(key: TKey): Property<TKey, TData> | undefined;
|
|
19
|
-
put(key: TKey, data: TData, conflict?: ConflictAction<TKey, TData>): void;
|
|
20
|
-
remove(key: TKey): void;
|
|
21
|
-
map<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum): void;
|
|
22
|
-
}
|
|
23
|
-
export interface SortedDictionary<TKey, TData> extends Dictionary<TKey, TData> {
|
|
24
|
-
max(): Property<TKey, TData> | undefined;
|
|
25
|
-
min(): Property<TKey, TData> | undefined;
|
|
26
|
-
mapRange<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum, start?: TKey, end?: TKey): void;
|
|
27
|
-
}
|
|
28
|
-
export interface KeyComparer<TKey> {
|
|
29
|
-
(a: TKey, b: TKey): number;
|
|
30
|
-
}
|
|
31
5
|
/**
|
|
6
|
+
* @deprecated for internal use only. public export will be removed.
|
|
7
|
+
* @internal
|
|
32
8
|
* A range [start, end)
|
|
33
9
|
*/
|
|
34
10
|
export interface IIntegerRange {
|
package/lib/base.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACf"}
|
package/lib/base.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * @deprecated for internal use only. public export will be removed.\n * @internal\n * A range [start, end)\n */\nexport interface IIntegerRange {\n start: number;\n end: number;\n}\n"]}
|
package/lib/client.d.ts
CHANGED
|
@@ -8,13 +8,14 @@ import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions"
|
|
|
8
8
|
import { IFluidDataStoreRuntime, IChannelStorageService } from "@fluidframework/datastore-definitions";
|
|
9
9
|
import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
|
|
10
10
|
import { ITelemetryLogger } from "@fluidframework/common-definitions";
|
|
11
|
-
import {
|
|
12
|
-
import { CollaborationWindow, ISegment, ISegmentAction, Marker,
|
|
11
|
+
import { LocalReferencePosition } from "./localReference";
|
|
12
|
+
import { CollaborationWindow, ISegment, ISegmentAction, Marker, SegmentGroup } from "./mergeTreeNodes";
|
|
13
13
|
import { MergeTreeDeltaCallback } from "./mergeTreeDeltaCallback";
|
|
14
14
|
import { ICombiningOp, IJSONSegment, IMergeTreeAnnotateMsg, IMergeTreeDeltaOp, IMergeTreeGroupMsg, IMergeTreeInsertMsg, IMergeTreeRemoveMsg, IMergeTreeOp, IRelativePosition, ReferenceType } from "./ops";
|
|
15
15
|
import { PropertySet } from "./properties";
|
|
16
|
-
import {
|
|
16
|
+
import { IMergeTreeTextHelper } from "./textSegment";
|
|
17
17
|
import { ReferencePosition, RangeStackMap } from "./referencePositions";
|
|
18
|
+
import { MergeTree } from "./mergeTree";
|
|
18
19
|
import { MergeTreeMaintenanceCallback } from "./index";
|
|
19
20
|
export declare class Client {
|
|
20
21
|
readonly specToSegment: (spec: IJSONSegment) => ISegment;
|
|
@@ -32,6 +33,10 @@ export declare class Client {
|
|
|
32
33
|
set mergeTreeDeltaCallback(callback: MergeTreeDeltaCallback | undefined);
|
|
33
34
|
get mergeTreeMaintenanceCallback(): MergeTreeMaintenanceCallback | undefined;
|
|
34
35
|
set mergeTreeMaintenanceCallback(callback: MergeTreeMaintenanceCallback | undefined);
|
|
36
|
+
/**
|
|
37
|
+
* @deprecated for internal use only. public export will be removed.
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
35
40
|
protected readonly mergeTree: MergeTree;
|
|
36
41
|
private readonly clientNameToIds;
|
|
37
42
|
private readonly shortClientIdMap;
|
|
@@ -102,14 +107,6 @@ export declare class Client {
|
|
|
102
107
|
* @param segment - The segment to get the position of
|
|
103
108
|
*/
|
|
104
109
|
getPosition(segment: ISegment): number;
|
|
105
|
-
/**
|
|
106
|
-
* @deprecated - use createReferencePosition instead
|
|
107
|
-
*/
|
|
108
|
-
addLocalReference(lref: LocalReference): void;
|
|
109
|
-
/**
|
|
110
|
-
* @deprecated - use removeReferencePosition instead
|
|
111
|
-
*/
|
|
112
|
-
removeLocalReference(lref: LocalReference): LocalReferencePosition | undefined;
|
|
113
110
|
createLocalReferencePosition(segment: ISegment, offset: number | undefined, refType: ReferenceType, properties: PropertySet | undefined): LocalReferencePosition;
|
|
114
111
|
removeLocalReferencePosition(lref: LocalReferencePosition): LocalReferencePosition | undefined;
|
|
115
112
|
localReferencePositionToPosition(lref: ReferencePosition): number;
|
|
@@ -120,6 +117,14 @@ export declare class Client {
|
|
|
120
117
|
*/
|
|
121
118
|
posFromRelativePos(relativePos: IRelativePosition): number;
|
|
122
119
|
getMarkerFromId(id: string): ISegment | undefined;
|
|
120
|
+
/**
|
|
121
|
+
* Revert an op
|
|
122
|
+
*/
|
|
123
|
+
rollback?(op: any, localOpMetadata: unknown): void;
|
|
124
|
+
/**
|
|
125
|
+
* Walk the segments up to the current segment and calculate its position
|
|
126
|
+
*/
|
|
127
|
+
private findRollbackPosition;
|
|
123
128
|
/**
|
|
124
129
|
* Performs the remove based on the provided op
|
|
125
130
|
* @param opArgs - The ops args for the op
|
|
@@ -210,11 +215,15 @@ export declare class Client {
|
|
|
210
215
|
* @param segmentGroup - The segment group associated with the op
|
|
211
216
|
*/
|
|
212
217
|
regeneratePendingOp(resetOp: IMergeTreeOp, segmentGroup: SegmentGroup | SegmentGroup[]): IMergeTreeOp;
|
|
213
|
-
createTextHelper():
|
|
218
|
+
createTextHelper(): IMergeTreeTextHelper;
|
|
214
219
|
summarize(runtime: IFluidDataStoreRuntime, handle: IFluidHandle, serializer: IFluidSerializer, catchUpMsgs: ISequencedDocumentMessage[]): ISummaryTreeWithStats;
|
|
215
220
|
load(runtime: IFluidDataStoreRuntime, storage: IChannelStorageService, serializer: IFluidSerializer): Promise<{
|
|
216
221
|
catchupOpsP: Promise<ISequencedDocumentMessage[]>;
|
|
217
222
|
}>;
|
|
223
|
+
/**
|
|
224
|
+
* @deprecated for internal use only. public export will be removed.
|
|
225
|
+
* @internal
|
|
226
|
+
*/
|
|
218
227
|
getStackContext(startPos: number, rangeLabels: string[]): RangeStackMap;
|
|
219
228
|
private getLocalSequenceNumber;
|
|
220
229
|
localTransaction(groupOp: IMergeTreeGroupMsg): void;
|
package/lib/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACvG,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAMtE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/lib/client.js
CHANGED
|
@@ -7,14 +7,16 @@ import { assert, Trace, unreachableCase } from "@fluidframework/common-utils";
|
|
|
7
7
|
import { LoggingError } from "@fluidframework/telemetry-utils";
|
|
8
8
|
import { RedBlackTree } from "./collections";
|
|
9
9
|
import { UnassignedSequenceNumber, UniversalSequenceNumber } from "./constants";
|
|
10
|
-
import {
|
|
11
|
-
import { compareStrings, MergeTree, } from "./mergeTree";
|
|
10
|
+
import { compareStrings, } from "./mergeTreeNodes";
|
|
12
11
|
import { createAnnotateMarkerOp, createAnnotateRangeOp, createGroupOp, createInsertSegmentOp, createRemoveRangeOp, } from "./opBuilder";
|
|
13
12
|
import { MergeTreeDeltaType, } from "./ops";
|
|
13
|
+
import { PropertiesRollback } from "./segmentPropertiesManager";
|
|
14
14
|
import { SnapshotLegacy } from "./snapshotlegacy";
|
|
15
15
|
import { SnapshotLoader } from "./snapshotLoader";
|
|
16
|
-
import { MergeTreeTextHelper } from "./textSegment";
|
|
17
16
|
import { SnapshotV1 } from "./snapshotV1";
|
|
17
|
+
import { DetachedReferencePosition } from "./referencePositions";
|
|
18
|
+
import { MergeTree } from "./mergeTree";
|
|
19
|
+
import { MergeTreeTextHelper } from "./MergeTreeTextHelper";
|
|
18
20
|
function elapsedMicroseconds(trace) {
|
|
19
21
|
return trace.trace().duration * 1000;
|
|
20
22
|
}
|
|
@@ -156,7 +158,7 @@ export class Client {
|
|
|
156
158
|
*/
|
|
157
159
|
insertAtReferencePositionLocal(refPos, segment) {
|
|
158
160
|
const pos = this.mergeTree.referencePositionToLocalPosition(refPos, this.getCurrentSeq(), this.getClientId());
|
|
159
|
-
if (pos ===
|
|
161
|
+
if (pos === DetachedReferencePosition) {
|
|
160
162
|
return undefined;
|
|
161
163
|
}
|
|
162
164
|
const op = createInsertSegmentOp(pos, segment);
|
|
@@ -202,20 +204,8 @@ export class Client {
|
|
|
202
204
|
}
|
|
203
205
|
return this.mergeTree.getPosition(segment, this.getCurrentSeq(), this.getClientId());
|
|
204
206
|
}
|
|
205
|
-
/**
|
|
206
|
-
* @deprecated - use createReferencePosition instead
|
|
207
|
-
*/
|
|
208
|
-
addLocalReference(lref) {
|
|
209
|
-
return this.mergeTree.addLocalReference(lref);
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* @deprecated - use removeReferencePosition instead
|
|
213
|
-
*/
|
|
214
|
-
removeLocalReference(lref) {
|
|
215
|
-
return this.removeLocalReferencePosition(lref);
|
|
216
|
-
}
|
|
217
207
|
createLocalReferencePosition(segment, offset, refType, properties) {
|
|
218
|
-
return this.mergeTree.createLocalReferencePosition(segment, offset, refType, properties
|
|
208
|
+
return this.mergeTree.createLocalReferencePosition(segment, offset !== null && offset !== void 0 ? offset : 0, refType, properties);
|
|
219
209
|
}
|
|
220
210
|
removeLocalReferencePosition(lref) {
|
|
221
211
|
return this.mergeTree.removeLocalReferencePosition(lref);
|
|
@@ -234,6 +224,59 @@ export class Client {
|
|
|
234
224
|
getMarkerFromId(id) {
|
|
235
225
|
return this.mergeTree.getMarkerFromId(id);
|
|
236
226
|
}
|
|
227
|
+
/**
|
|
228
|
+
* Revert an op
|
|
229
|
+
*/
|
|
230
|
+
rollback(op, localOpMetadata) {
|
|
231
|
+
var _a, _b;
|
|
232
|
+
if (op.type === MergeTreeDeltaType.INSERT || op.type === MergeTreeDeltaType.ANNOTATE) {
|
|
233
|
+
const pendingSegmentGroup = (_b = (_a = this.mergeTree.pendingSegments) === null || _a === void 0 ? void 0 : _a.pop) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
234
|
+
if (pendingSegmentGroup === undefined || pendingSegmentGroup !== localOpMetadata
|
|
235
|
+
|| (op.type === MergeTreeDeltaType.ANNOTATE && !pendingSegmentGroup.previousProps)) {
|
|
236
|
+
throw new Error("Rollback op doesn't match last edit");
|
|
237
|
+
}
|
|
238
|
+
let i = 0;
|
|
239
|
+
for (const segment of pendingSegmentGroup.segments) {
|
|
240
|
+
const segmentSegmentGroup = segment.segmentGroups.pop ? segment.segmentGroups.pop() : undefined;
|
|
241
|
+
assert(segmentSegmentGroup === pendingSegmentGroup, 0x347 /* Unexpected segmentGroup in segment */);
|
|
242
|
+
const start = this.findRollbackPosition(segment);
|
|
243
|
+
const segWindow = this.getCollabWindow();
|
|
244
|
+
if (op.type === MergeTreeDeltaType.INSERT) {
|
|
245
|
+
const removeOp = createRemoveRangeOp(start, start + segment.cachedLength);
|
|
246
|
+
this.mergeTree.markRangeRemoved(start, start + segment.cachedLength, UniversalSequenceNumber, segWindow.clientId, UniversalSequenceNumber, false, { op: removeOp });
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
const props = pendingSegmentGroup.previousProps[i];
|
|
250
|
+
const rollbackType = (op.combiningOp && op.combiningOp.name === "rewrite") ?
|
|
251
|
+
PropertiesRollback.Rewrite : PropertiesRollback.Rollback;
|
|
252
|
+
const annotateOp = createAnnotateRangeOp(start, start + segment.cachedLength, props, undefined);
|
|
253
|
+
this.mergeTree.annotateRange(start, start + segment.cachedLength, props, undefined, UniversalSequenceNumber, segWindow.clientId, UniversalSequenceNumber, { op: annotateOp }, rollbackType);
|
|
254
|
+
i++;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
throw new Error("Unsupported op type for rollback");
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Walk the segments up to the current segment and calculate its position
|
|
264
|
+
*/
|
|
265
|
+
findRollbackPosition(segment) {
|
|
266
|
+
let segmentPosition = 0;
|
|
267
|
+
this.mergeTree.walkAllSegments(this.mergeTree.root, (seg) => {
|
|
268
|
+
// If we've found the desired segment, terminate the walk and return 'segmentPosition'.
|
|
269
|
+
if (seg === segment) {
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
// If not removed, increase position
|
|
273
|
+
if (seg.removedSeq === undefined) {
|
|
274
|
+
segmentPosition += seg.cachedLength;
|
|
275
|
+
}
|
|
276
|
+
return true;
|
|
277
|
+
});
|
|
278
|
+
return segmentPosition;
|
|
279
|
+
}
|
|
237
280
|
/**
|
|
238
281
|
* Performs the remove based on the provided op
|
|
239
282
|
* @param opArgs - The ops args for the op
|
|
@@ -483,8 +526,11 @@ export class Client {
|
|
|
483
526
|
findReconnectionPosition(segment, localSeq) {
|
|
484
527
|
assert(localSeq <= this.mergeTree.collabWindow.localSeq, 0x032 /* "localSeq greater than collab window" */);
|
|
485
528
|
let segmentPosition = 0;
|
|
529
|
+
const isInsertedInView = (seg) => seg.localSeq === undefined || seg.localSeq <= localSeq;
|
|
530
|
+
const isRemovedFromView = (seg) => seg.removedSeq !== undefined &&
|
|
531
|
+
(seg.removedSeq !== UnassignedSequenceNumber || seg.localRemovedSeq <= localSeq);
|
|
486
532
|
/*
|
|
487
|
-
Walk the segments up to the current segment, and calculate
|
|
533
|
+
Walk the segments up to the current segment, and calculate its
|
|
488
534
|
position taking into account local segments that were modified,
|
|
489
535
|
after the current segment.
|
|
490
536
|
|
|
@@ -501,9 +547,7 @@ export class Client {
|
|
|
501
547
|
//
|
|
502
548
|
// Note that all ACKed / remote ops are applied and we only need concern ourself with
|
|
503
549
|
// determining if locally pending ops fall before/after the given 'localSeq'.
|
|
504
|
-
if ((seg
|
|
505
|
-
&& (seg.removedSeq === undefined || seg.localRemovedSeq > localSeq) // Not removed
|
|
506
|
-
) {
|
|
550
|
+
if (isInsertedInView(seg) && !isRemovedFromView(seg)) {
|
|
507
551
|
segmentPosition += seg.cachedLength;
|
|
508
552
|
}
|
|
509
553
|
return true;
|
|
@@ -560,7 +604,7 @@ export class Client {
|
|
|
560
604
|
// We need to sort the segments by ordinal, as the segments are not sorted in the segment group.
|
|
561
605
|
// The reason they need them sorted, as they have the same local sequence number and which means
|
|
562
606
|
// farther segments will take into account nearer segments when calculating their position.
|
|
563
|
-
// By sorting we ensure the nearer segment will be applied and sequenced before the
|
|
607
|
+
// By sorting we ensure the nearer segment will be applied and sequenced before the farther segments
|
|
564
608
|
// so their recalculated positions will be correct.
|
|
565
609
|
for (const segment of segmentGroup.segments.sort((a, b) => a.ordinal < b.ordinal ? -1 : 1)) {
|
|
566
610
|
const segmentSegGroup = segment.segmentGroups.dequeue();
|
|
@@ -573,7 +617,8 @@ export class Client {
|
|
|
573
617
|
// if the segment has been removed, there's no need to send the annotate op
|
|
574
618
|
// unless the remove was local, in which case the annotate must have come
|
|
575
619
|
// before the remove
|
|
576
|
-
if (segment.removedSeq === undefined ||
|
|
620
|
+
if (segment.removedSeq === undefined ||
|
|
621
|
+
(segment.localRemovedSeq !== undefined && segment.removedSeq === UnassignedSequenceNumber)) {
|
|
577
622
|
newOp = createAnnotateRangeOp(segmentPosition, segmentPosition + segment.cachedLength, resetOp.props, resetOp.combiningOp);
|
|
578
623
|
}
|
|
579
624
|
break;
|
|
@@ -587,7 +632,7 @@ export class Client {
|
|
|
587
632
|
newOp = createInsertSegmentOp(segmentPosition, segInsertOp);
|
|
588
633
|
break;
|
|
589
634
|
case MergeTreeDeltaType.REMOVE:
|
|
590
|
-
if (segment.localRemovedSeq !== undefined) {
|
|
635
|
+
if (segment.localRemovedSeq !== undefined && segment.removedSeq === UnassignedSequenceNumber) {
|
|
591
636
|
newOp = createRemoveRangeOp(segmentPosition, segmentPosition + segment.cachedLength);
|
|
592
637
|
}
|
|
593
638
|
break;
|
|
@@ -754,6 +799,10 @@ export class Client {
|
|
|
754
799
|
const loader = new SnapshotLoader(runtime, this, this.mergeTree, this.logger, serializer);
|
|
755
800
|
return loader.initialize(storage);
|
|
756
801
|
}
|
|
802
|
+
/**
|
|
803
|
+
* @deprecated for internal use only. public export will be removed.
|
|
804
|
+
* @internal
|
|
805
|
+
*/
|
|
757
806
|
getStackContext(startPos, rangeLabels) {
|
|
758
807
|
return this.mergeTree.getStackContext(startPos, this.getCollabWindow().clientId, rangeLabels);
|
|
759
808
|
}
|
|
@@ -819,7 +868,18 @@ export class Client {
|
|
|
819
868
|
* @returns - segment and offset to slide the reference to
|
|
820
869
|
*/
|
|
821
870
|
getSlideToSegment(segoff) {
|
|
822
|
-
|
|
871
|
+
if (segoff.segment === undefined) {
|
|
872
|
+
return segoff;
|
|
873
|
+
}
|
|
874
|
+
const segment = this.mergeTree._getSlideToSegment(segoff.segment);
|
|
875
|
+
if (segment === segoff.segment) {
|
|
876
|
+
return segoff;
|
|
877
|
+
}
|
|
878
|
+
const offset = segment && segment.ordinal < segoff.segment.ordinal ? segment.cachedLength - 1 : 0;
|
|
879
|
+
return {
|
|
880
|
+
segment,
|
|
881
|
+
offset,
|
|
882
|
+
};
|
|
823
883
|
}
|
|
824
884
|
getPropertiesAtPosition(pos) {
|
|
825
885
|
let propertiesAtPosition;
|