@fluidframework/sequence 2.0.0-rc.2.0.5 → 2.0.0-rc.2.0.7

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 (41) hide show
  1. package/.eslintrc.cjs +29 -0
  2. package/dist/defaultMap.d.ts +3 -3
  3. package/dist/defaultMap.d.ts.map +1 -1
  4. package/dist/defaultMap.js +10 -7
  5. package/dist/defaultMap.js.map +1 -1
  6. package/dist/intervals/intervalUtils.d.ts.map +1 -1
  7. package/dist/intervals/intervalUtils.js.map +1 -1
  8. package/dist/packageVersion.d.ts +1 -1
  9. package/dist/packageVersion.js +1 -1
  10. package/dist/packageVersion.js.map +1 -1
  11. package/dist/sequence-alpha.d.ts +0 -4
  12. package/dist/sequence-untrimmed.d.ts +0 -4
  13. package/dist/sequence.d.ts +0 -4
  14. package/dist/sequence.d.ts.map +1 -1
  15. package/dist/sequence.js +14 -10
  16. package/dist/sequence.js.map +1 -1
  17. package/dist/sharedString.d.ts.map +1 -1
  18. package/dist/sharedString.js.map +1 -1
  19. package/lib/defaultMap.d.ts +3 -3
  20. package/lib/defaultMap.d.ts.map +1 -1
  21. package/lib/defaultMap.js +11 -8
  22. package/lib/defaultMap.js.map +1 -1
  23. package/lib/intervals/intervalUtils.d.ts.map +1 -1
  24. package/lib/intervals/intervalUtils.js.map +1 -1
  25. package/lib/packageVersion.d.ts +1 -1
  26. package/lib/packageVersion.js +1 -1
  27. package/lib/packageVersion.js.map +1 -1
  28. package/lib/sequence-alpha.d.ts +0 -4
  29. package/lib/sequence-untrimmed.d.ts +0 -4
  30. package/lib/sequence.d.ts +0 -4
  31. package/lib/sequence.d.ts.map +1 -1
  32. package/lib/sequence.js +15 -11
  33. package/lib/sequence.js.map +1 -1
  34. package/lib/sharedString.d.ts.map +1 -1
  35. package/lib/sharedString.js.map +1 -1
  36. package/package.json +15 -15
  37. package/src/defaultMap.ts +18 -9
  38. package/src/intervals/intervalUtils.ts +2 -1
  39. package/src/packageVersion.ts +1 -1
  40. package/src/sequence.ts +18 -10
  41. package/src/sharedString.ts +2 -0
@@ -1 +1 @@
1
- {"version":3,"file":"sharedString.js","sourceRoot":"","sources":["../src/sharedString.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 {\n\tIMergeTreeTextHelper,\n\tIRelativePosition,\n\tISegment,\n\tISegmentAction,\n\tMarker,\n\tPropertySet,\n\tReferenceType,\n\trefHasTileLabel,\n\tTextSegment,\n} from \"@fluidframework/merge-tree\";\nimport { IFluidDataStoreRuntime, IChannelAttributes } from \"@fluidframework/datastore-definitions\";\nimport { SharedSegmentSequence } from \"./sequence.js\";\nimport { SharedStringFactory } from \"./sequenceFactory.js\";\n\n/**\n * Fluid object interface describing access methods on a SharedString\n * @alpha\n */\nexport interface ISharedString extends SharedSegmentSequence<SharedStringSegment> {\n\t/**\n\t * Inserts the text at the position.\n\t * @param pos - The position to insert the text at\n\t * @param text - The text to insert\n\t * @param props - The properties of the text\n\t */\n\tinsertText(pos: number, text: string, props?: PropertySet): void;\n\n\t/**\n\t * Inserts a marker at the position.\n\t * @param pos - The position to insert the marker at\n\t * @param refType - The reference type of the marker\n\t * @param props - The properties of the marker\n\t */\n\tinsertMarker(pos: number, refType: ReferenceType, props?: PropertySet): void;\n\n\t/**\n\t * {@inheritDoc SharedSegmentSequence.posFromRelativePos}\n\t */\n\tposFromRelativePos(relativePos: IRelativePosition): number;\n}\n\n/**\n * @alpha\n */\nexport type SharedStringSegment = TextSegment | Marker;\n\n/**\n * The Shared String is a specialized data structure for handling collaborative\n * text. It is based on a more general Sequence data structure but has\n * additional features that make working with text easier.\n *\n * In addition to text, a Shared String can also contain markers. Markers can be\n * used to store metadata at positions within the text, like the details of an\n * image or Fluid object that should be rendered with the text.\n * @alpha\n */\nexport class SharedString\n\textends SharedSegmentSequence<SharedStringSegment>\n\timplements ISharedString\n{\n\t/**\n\t * Create a new shared string.\n\t * @param runtime - data store runtime the new shared string belongs to\n\t * @param id - optional name of the shared string\n\t * @returns newly create shared string (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string) {\n\t\treturn runtime.createChannel(id, SharedStringFactory.Type) as SharedString;\n\t}\n\n\t/**\n\t * Get a factory for SharedString to register with the data store.\n\t * @returns a factory that creates and load SharedString\n\t */\n\tpublic static getFactory() {\n\t\treturn new SharedStringFactory();\n\t}\n\n\tpublic get ISharedString(): ISharedString {\n\t\treturn this;\n\t}\n\n\tprivate readonly mergeTreeTextHelper: IMergeTreeTextHelper;\n\n\tconstructor(\n\t\tdocument: IFluidDataStoreRuntime,\n\t\tpublic id: string,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(document, id, attributes, SharedStringFactory.segmentFromSpec as any);\n\t\tthis.mergeTreeTextHelper = this.client.createTextHelper();\n\t}\n\n\t/**\n\t * Inserts a marker at a relative position.\n\t * @param relativePos1 - The relative position to insert the marker at\n\t * @param refType - The reference type of the marker\n\t * @param props - The properties of the marker\n\t */\n\tpublic insertMarkerRelative(\n\t\trelativePos1: IRelativePosition,\n\t\trefType: ReferenceType,\n\t\tprops?: PropertySet,\n\t): void {\n\t\tconst segment = new Marker(refType);\n\t\tif (props) {\n\t\t\tsegment.addProperties(props);\n\t\t}\n\n\t\tconst pos = this.posFromRelativePos(relativePos1);\n\t\tthis.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));\n\t}\n\n\t/**\n\t * {@inheritDoc ISharedString.insertMarker}\n\t */\n\tpublic insertMarker(pos: number, refType: ReferenceType, props?: PropertySet): void {\n\t\tconst segment = new Marker(refType);\n\t\tif (props) {\n\t\t\tsegment.addProperties(props);\n\t\t}\n\n\t\tthis.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));\n\t}\n\n\t/**\n\t * Inserts the text at the position.\n\t * @param relativePos1 - The relative position to insert the text at\n\t * @param text - The text to insert\n\t * @param props - The properties of text\n\t */\n\tpublic insertTextRelative(\n\t\trelativePos1: IRelativePosition,\n\t\ttext: string,\n\t\tprops?: PropertySet,\n\t): void {\n\t\tconst segment = new TextSegment(text);\n\t\tif (props) {\n\t\t\tsegment.addProperties(props);\n\t\t}\n\n\t\tconst pos = this.posFromRelativePos(relativePos1);\n\t\tthis.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));\n\t}\n\n\t/**\n\t * {@inheritDoc ISharedString.insertText}\n\t */\n\tpublic insertText(pos: number, text: string, props?: PropertySet): void {\n\t\tconst segment = new TextSegment(text);\n\t\tif (props) {\n\t\t\tsegment.addProperties(props);\n\t\t}\n\n\t\tthis.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));\n\t}\n\n\t/**\n\t * Replaces a range with the provided text.\n\t * @param start - The inclusive start of the range to replace\n\t * @param end - The exclusive end of the range to replace\n\t * @param text - The text to replace the range with\n\t * @param props - Optional. The properties of the replacement text\n\t */\n\tpublic replaceText(start: number, end: number, text: string, props?: PropertySet): void {\n\t\tthis.replaceRange(start, end, TextSegment.make(text, props));\n\t}\n\n\t/**\n\t * Removes the text in the given range.\n\t * @param start - The inclusive start of the range to remove\n\t * @param end - The exclusive end of the range to replace\n\t * @returns the message sent.\n\t */\n\tpublic removeText(start: number, end: number): void {\n\t\tthis.removeRange(start, end);\n\t}\n\n\t/**\n\t * Annotates the marker with the provided properties.\n\t * @param marker - The marker to annotate\n\t * @param props - The properties to annotate the marker with\n\t */\n\tpublic annotateMarker(marker: Marker, props: PropertySet) {\n\t\tthis.guardReentrancy(() => this.client.annotateMarker(marker, props));\n\t}\n\n\t/**\n\t * Searches a string for the nearest marker in either direction to a given start position.\n\t * The search will include the start position, so markers at the start position are valid\n\t * results of the search.\n\t * @param startPos - Position at which to start the search\n\t * @param markerLabel - Label of the marker to search for\n\t * @param forwards - Whether the desired marker comes before (false) or after (true) `startPos`\n\t */\n\tpublic searchForMarker(\n\t\tstartPos: number,\n\t\tmarkerLabel: string,\n\t\tforwards = true,\n\t): Marker | undefined {\n\t\treturn this.client.searchForMarker(startPos, markerLabel, forwards);\n\t}\n\n\t/**\n\t * Retrieve text from the SharedString in string format.\n\t * @param start - The starting index of the text to retrieve, or 0 if omitted.\n\t * @param end - The ending index of the text to retrieve, or the end of the string if omitted\n\t * @returns The requested text content as a string.\n\t */\n\tpublic getText(start?: number, end?: number) {\n\t\tconst segmentWindow = this.client.getCollabWindow();\n\t\treturn this.mergeTreeTextHelper.getText(\n\t\t\tsegmentWindow.currentSeq,\n\t\t\tsegmentWindow.clientId,\n\t\t\t\"\",\n\t\t\tstart,\n\t\t\tend,\n\t\t);\n\t}\n\n\t/**\n\t * Adds spaces for markers and handles, so that position calculations account for them.\n\t */\n\tpublic getTextWithPlaceholders(start?: number, end?: number) {\n\t\tconst segmentWindow = this.client.getCollabWindow();\n\t\treturn this.mergeTreeTextHelper.getText(\n\t\t\tsegmentWindow.currentSeq,\n\t\t\tsegmentWindow.clientId,\n\t\t\t\" \",\n\t\t\tstart,\n\t\t\tend,\n\t\t);\n\t}\n\n\tpublic getTextRangeWithMarkers(start: number, end: number) {\n\t\tconst segmentWindow = this.client.getCollabWindow();\n\t\treturn this.mergeTreeTextHelper.getText(\n\t\t\tsegmentWindow.currentSeq,\n\t\t\tsegmentWindow.clientId,\n\t\t\t\"*\",\n\t\t\tstart,\n\t\t\tend,\n\t\t);\n\t}\n\n\t/**\n\t * Looks up and returns a `Marker` using its id. Returns `undefined` if there is no marker with the provided\n\t * id in this `SharedString`.\n\t */\n\tpublic getMarkerFromId(id: string): ISegment | undefined {\n\t\treturn this.client.getMarkerFromId(id);\n\t}\n\n\t/**\n\t * Revert an op\n\t */\n\tprotected rollback(content: any, localOpMetadata: unknown): void {\n\t\tif (this.client.rollback !== undefined) {\n\t\t\tthis.client.rollback(content, localOpMetadata);\n\t\t} else {\n\t\t\tsuper.rollback(content, localOpMetadata);\n\t\t}\n\t}\n}\n\ninterface ITextAndMarkerAccumulator {\n\tparallelText: string[];\n\tparallelMarkers: Marker[];\n\tparallelMarkerLabel: string;\n\tplaceholder?: string;\n\ttagsInProgress: string[];\n\ttextSegment: TextSegment;\n}\n\n/**\n * Splits the text into regions ending with markers with the given `label`.\n * @param sharedString - String to retrieve text and markers from\n * @param label - label to split on\n * @returns Two parallel lists of text and markers, split by markers with the provided `label`.\n * For example:\n * ```typescript\n * // Say sharedstring has contents \"hello<paragraph marker 1>world<paragraph marker 2>missing\".\n * const { parallelText, parallelMarkers } = getTextAndMarkers(sharedString, \"paragraph\");\n * // parallelText === [\"hello\", \"world\"]\n * // parallelMarkers === [<paragraph marker 1 object>, <paragraph marker 2 object>]\n * // Note parallelText does not include \"missing\".\n * ```\n * @internal\n */\nexport function getTextAndMarkers(\n\tsharedString: SharedString,\n\tlabel: string,\n\tstart?: number,\n\tend?: number,\n): {\n\tparallelText: string[];\n\tparallelMarkers: Marker[];\n} {\n\tconst accum: ITextAndMarkerAccumulator = {\n\t\tparallelMarkerLabel: label,\n\t\tparallelMarkers: [],\n\t\tparallelText: [],\n\t\ttagsInProgress: [],\n\t\ttextSegment: new TextSegment(\"\"),\n\t};\n\n\tsharedString.walkSegments(gatherTextAndMarkers, start, end, accum);\n\treturn { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };\n}\n\nconst gatherTextAndMarkers: ISegmentAction<ITextAndMarkerAccumulator> = (\n\tsegment: ISegment,\n\tpos: number,\n\trefSeq: number,\n\tclientId: number,\n\tstart: number,\n\tend: number,\n\taccumText: ITextAndMarkerAccumulator,\n) => {\n\tconst { placeholder, tagsInProgress, textSegment } = accumText;\n\tif (TextSegment.is(segment)) {\n\t\tlet beginTags = \"\";\n\t\tlet endTags = \"\";\n\t\t// TODO: let clients pass in function to get tag\n\t\tconst tags = [] as string[];\n\t\tconst initTags = [] as string[];\n\n\t\tif (segment.properties?.[\"font-weight\"]) {\n\t\t\ttags.push(\"b\");\n\t\t}\n\t\tif (segment.properties?.[\"text-decoration\"]) {\n\t\t\ttags.push(\"u\");\n\t\t}\n\t\tconst remTags = [] as string[];\n\t\tif (tags.length > 0) {\n\t\t\tfor (const tag of tags) {\n\t\t\t\tif (!tagsInProgress.includes(tag)) {\n\t\t\t\t\tbeginTags += `<${tag}>`;\n\t\t\t\t\tinitTags.push(tag);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const accumTag of tagsInProgress) {\n\t\t\t\tif (!tags.includes(accumTag)) {\n\t\t\t\t\tendTags += `</${accumTag}>`;\n\t\t\t\t\tremTags.push(accumTag);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const initTag of initTags.reverse()) {\n\t\t\t\ttagsInProgress.push(initTag);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const accumTag of tagsInProgress) {\n\t\t\t\tendTags += `</${accumTag}>`;\n\t\t\t\tremTags.push(accumTag);\n\t\t\t}\n\t\t}\n\t\tfor (const remTag of remTags) {\n\t\t\tconst remdex = tagsInProgress.indexOf(remTag);\n\t\t\tif (remdex >= 0) {\n\t\t\t\ttagsInProgress.splice(remdex, 1);\n\t\t\t}\n\t\t}\n\t\ttextSegment.text += endTags;\n\t\ttextSegment.text += beginTags;\n\t\tif (start <= 0 && end >= segment.text.length) {\n\t\t\ttextSegment.text += segment.text;\n\t\t} else {\n\t\t\tconst seglen = segment.text.length;\n\t\t\tconst _start = start < 0 ? 0 : start;\n\t\t\tconst _end = end >= seglen ? undefined : end;\n\t\t\ttextSegment.text += segment.text.substring(_start, _end);\n\t\t}\n\t} else {\n\t\tif (placeholder && placeholder.length > 0) {\n\t\t\tconst placeholderText =\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\t\t\tplaceholder === \"*\" ? `\\n${segment}` : placeholder.repeat(segment.cachedLength);\n\t\t\ttextSegment.text += placeholderText;\n\t\t} else {\n\t\t\tconst marker = segment as Marker;\n\t\t\tif (refHasTileLabel(marker, accumText.parallelMarkerLabel)) {\n\t\t\t\taccumText.parallelMarkers.push(marker);\n\t\t\t\taccumText.parallelText.push(textSegment.text);\n\t\t\t\ttextSegment.text = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n};\n"]}
1
+ {"version":3,"file":"sharedString.js","sourceRoot":"","sources":["../src/sharedString.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAMN,MAAM,EAGN,eAAe,EACf,WAAW,GACX,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAkC3D;;;;;;;;;GASG;AACH,MAAM,OAAO,YACZ,SAAQ,qBAA0C;IAGlD;;;;;OAKG;IACI,MAAM,CAAC,MAAM,CAAC,OAA+B,EAAE,EAAW;QAChE,OAAO,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,mBAAmB,CAAC,IAAI,CAAiB,CAAC;IAC5E,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,UAAU;QACvB,OAAO,IAAI,mBAAmB,EAAE,CAAC;IAClC,CAAC;IAED,IAAW,aAAa;QACvB,OAAO,IAAI,CAAC;IACb,CAAC;IAKD,YACC,QAAgC,EACzB,EAAU,EACjB,UAA8B;QAE9B,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,mBAAmB,CAAC,eAAsB,CAAC,CAAC;QAHrE,OAAE,GAAF,EAAE,CAAQ;QAIjB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;IAC3D,CAAC;IAED;;;;;OAKG;IACI,oBAAoB,CAC1B,YAA+B,EAC/B,OAAsB,EACtB,KAAmB;QAEnB,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,KAAK,EAAE;YACV,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SAC7B;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,GAAW,EAAE,OAAsB,EAAE,KAAmB;QAC3E,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,KAAK,EAAE;YACV,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SAC7B;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED;;;;;OAKG;IACI,kBAAkB,CACxB,YAA+B,EAC/B,IAAY,EACZ,KAAmB;QAEnB,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE;YACV,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SAC7B;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,GAAW,EAAE,IAAY,EAAE,KAAmB;QAC/D,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE;YACV,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SAC7B;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED;;;;;;OAMG;IACI,WAAW,CAAC,KAAa,EAAE,GAAW,EAAE,IAAY,EAAE,KAAmB;QAC/E,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;OAKG;IACI,UAAU,CAAC,KAAa,EAAE,GAAW;QAC3C,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACI,cAAc,CAAC,MAAc,EAAE,KAAkB;QACvD,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;IAED;;;;;;;OAOG;IACI,eAAe,CACrB,QAAgB,EAChB,WAAmB,EACnB,QAAQ,GAAG,IAAI;QAEf,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACrE,CAAC;IAED;;;;;OAKG;IACI,OAAO,CAAC,KAAc,EAAE,GAAY;QAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CACtC,aAAa,CAAC,UAAU,EACxB,aAAa,CAAC,QAAQ,EACtB,EAAE,EACF,KAAK,EACL,GAAG,CACH,CAAC;IACH,CAAC;IAED;;OAEG;IACI,uBAAuB,CAAC,KAAc,EAAE,GAAY;QAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CACtC,aAAa,CAAC,UAAU,EACxB,aAAa,CAAC,QAAQ,EACtB,GAAG,EACH,KAAK,EACL,GAAG,CACH,CAAC;IACH,CAAC;IAEM,uBAAuB,CAAC,KAAa,EAAE,GAAW;QACxD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CACtC,aAAa,CAAC,UAAU,EACxB,aAAa,CAAC,QAAQ,EACtB,GAAG,EACH,KAAK,EACL,GAAG,CACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,eAAe,CAAC,EAAU;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACO,QAAQ,CAAC,OAAY,EAAE,eAAwB;QACxD,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;SAC/C;aAAM;YACN,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;SACzC;IACF,CAAC;CACD;AAWD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAChC,YAA0B,EAC1B,KAAa,EACb,KAAc,EACd,GAAY;IAKZ,MAAM,KAAK,GAA8B;QACxC,mBAAmB,EAAE,KAAK;QAC1B,eAAe,EAAE,EAAE;QACnB,YAAY,EAAE,EAAE;QAChB,cAAc,EAAE,EAAE;QAClB,WAAW,EAAE,IAAI,WAAW,CAAC,EAAE,CAAC;KAChC,CAAC;IAEF,YAAY,CAAC,YAAY,CAAC,oBAAoB,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACnE,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC;AACrF,CAAC;AAED,MAAM,oBAAoB,GAA8C,CACvE,OAAiB,EACjB,GAAW,EACX,MAAc,EACd,QAAgB,EAChB,KAAa,EACb,GAAW,EACX,SAAoC,EACnC,EAAE;IACH,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IAC/D,IAAI,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;QAC5B,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,gDAAgD;QAChD,MAAM,IAAI,GAAG,EAAc,CAAC;QAC5B,MAAM,QAAQ,GAAG,EAAc,CAAC;QAEhC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,aAAa,CAAC,EAAE;YACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACf;QACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,iBAAiB,CAAC,EAAE;YAC5C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACf;QACD,MAAM,OAAO,GAAG,EAAc,CAAC;QAC/B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;gBACvB,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;oBAClC,SAAS,IAAI,IAAI,GAAG,GAAG,CAAC;oBACxB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iBACnB;aACD;YACD,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE;gBACtC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;oBAC7B,OAAO,IAAI,KAAK,QAAQ,GAAG,CAAC;oBAC5B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACvB;aACD;YACD,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;gBACzC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAC7B;SACD;aAAM;YACN,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE;gBACtC,OAAO,IAAI,KAAK,QAAQ,GAAG,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aACvB;SACD;QACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,MAAM,IAAI,CAAC,EAAE;gBAChB,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;aACjC;SACD;QACD,WAAW,CAAC,IAAI,IAAI,OAAO,CAAC;QAC5B,WAAW,CAAC,IAAI,IAAI,SAAS,CAAC;QAC9B,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;YAC7C,WAAW,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;SACjC;aAAM;YACN,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YACnC,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACrC,MAAM,IAAI,GAAG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;YAC7C,WAAW,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;SACzD;KACD;SAAM;QACN,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1C,MAAM,eAAe;YACpB,gEAAgE;YAChE,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACjF,WAAW,CAAC,IAAI,IAAI,eAAe,CAAC;SACpC;aAAM;YACN,MAAM,MAAM,GAAG,OAAiB,CAAC;YACjC,IAAI,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,mBAAmB,CAAC,EAAE;gBAC3D,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC9C,WAAW,CAAC,IAAI,GAAG,EAAE,CAAC;aACtB;SACD;KACD;IAED,OAAO,IAAI,CAAC;AACb,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\t// eslint-disable-next-line import/no-deprecated\n\tIMergeTreeTextHelper,\n\tIRelativePosition,\n\tISegment,\n\tISegmentAction,\n\tMarker,\n\tPropertySet,\n\tReferenceType,\n\trefHasTileLabel,\n\tTextSegment,\n} from \"@fluidframework/merge-tree\";\nimport { IFluidDataStoreRuntime, IChannelAttributes } from \"@fluidframework/datastore-definitions\";\nimport { SharedSegmentSequence } from \"./sequence.js\";\nimport { SharedStringFactory } from \"./sequenceFactory.js\";\n\n/**\n * Fluid object interface describing access methods on a SharedString\n * @alpha\n */\nexport interface ISharedString extends SharedSegmentSequence<SharedStringSegment> {\n\t/**\n\t * Inserts the text at the position.\n\t * @param pos - The position to insert the text at\n\t * @param text - The text to insert\n\t * @param props - The properties of the text\n\t */\n\tinsertText(pos: number, text: string, props?: PropertySet): void;\n\n\t/**\n\t * Inserts a marker at the position.\n\t * @param pos - The position to insert the marker at\n\t * @param refType - The reference type of the marker\n\t * @param props - The properties of the marker\n\t */\n\tinsertMarker(pos: number, refType: ReferenceType, props?: PropertySet): void;\n\n\t/**\n\t * {@inheritDoc SharedSegmentSequence.posFromRelativePos}\n\t */\n\tposFromRelativePos(relativePos: IRelativePosition): number;\n}\n\n/**\n * @alpha\n */\nexport type SharedStringSegment = TextSegment | Marker;\n\n/**\n * The Shared String is a specialized data structure for handling collaborative\n * text. It is based on a more general Sequence data structure but has\n * additional features that make working with text easier.\n *\n * In addition to text, a Shared String can also contain markers. Markers can be\n * used to store metadata at positions within the text, like the details of an\n * image or Fluid object that should be rendered with the text.\n * @alpha\n */\nexport class SharedString\n\textends SharedSegmentSequence<SharedStringSegment>\n\timplements ISharedString\n{\n\t/**\n\t * Create a new shared string.\n\t * @param runtime - data store runtime the new shared string belongs to\n\t * @param id - optional name of the shared string\n\t * @returns newly create shared string (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string) {\n\t\treturn runtime.createChannel(id, SharedStringFactory.Type) as SharedString;\n\t}\n\n\t/**\n\t * Get a factory for SharedString to register with the data store.\n\t * @returns a factory that creates and load SharedString\n\t */\n\tpublic static getFactory() {\n\t\treturn new SharedStringFactory();\n\t}\n\n\tpublic get ISharedString(): ISharedString {\n\t\treturn this;\n\t}\n\n\t// eslint-disable-next-line import/no-deprecated\n\tprivate readonly mergeTreeTextHelper: IMergeTreeTextHelper;\n\n\tconstructor(\n\t\tdocument: IFluidDataStoreRuntime,\n\t\tpublic id: string,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(document, id, attributes, SharedStringFactory.segmentFromSpec as any);\n\t\tthis.mergeTreeTextHelper = this.client.createTextHelper();\n\t}\n\n\t/**\n\t * Inserts a marker at a relative position.\n\t * @param relativePos1 - The relative position to insert the marker at\n\t * @param refType - The reference type of the marker\n\t * @param props - The properties of the marker\n\t */\n\tpublic insertMarkerRelative(\n\t\trelativePos1: IRelativePosition,\n\t\trefType: ReferenceType,\n\t\tprops?: PropertySet,\n\t): void {\n\t\tconst segment = new Marker(refType);\n\t\tif (props) {\n\t\t\tsegment.addProperties(props);\n\t\t}\n\n\t\tconst pos = this.posFromRelativePos(relativePos1);\n\t\tthis.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));\n\t}\n\n\t/**\n\t * {@inheritDoc ISharedString.insertMarker}\n\t */\n\tpublic insertMarker(pos: number, refType: ReferenceType, props?: PropertySet): void {\n\t\tconst segment = new Marker(refType);\n\t\tif (props) {\n\t\t\tsegment.addProperties(props);\n\t\t}\n\n\t\tthis.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));\n\t}\n\n\t/**\n\t * Inserts the text at the position.\n\t * @param relativePos1 - The relative position to insert the text at\n\t * @param text - The text to insert\n\t * @param props - The properties of text\n\t */\n\tpublic insertTextRelative(\n\t\trelativePos1: IRelativePosition,\n\t\ttext: string,\n\t\tprops?: PropertySet,\n\t): void {\n\t\tconst segment = new TextSegment(text);\n\t\tif (props) {\n\t\t\tsegment.addProperties(props);\n\t\t}\n\n\t\tconst pos = this.posFromRelativePos(relativePos1);\n\t\tthis.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));\n\t}\n\n\t/**\n\t * {@inheritDoc ISharedString.insertText}\n\t */\n\tpublic insertText(pos: number, text: string, props?: PropertySet): void {\n\t\tconst segment = new TextSegment(text);\n\t\tif (props) {\n\t\t\tsegment.addProperties(props);\n\t\t}\n\n\t\tthis.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));\n\t}\n\n\t/**\n\t * Replaces a range with the provided text.\n\t * @param start - The inclusive start of the range to replace\n\t * @param end - The exclusive end of the range to replace\n\t * @param text - The text to replace the range with\n\t * @param props - Optional. The properties of the replacement text\n\t */\n\tpublic replaceText(start: number, end: number, text: string, props?: PropertySet): void {\n\t\tthis.replaceRange(start, end, TextSegment.make(text, props));\n\t}\n\n\t/**\n\t * Removes the text in the given range.\n\t * @param start - The inclusive start of the range to remove\n\t * @param end - The exclusive end of the range to replace\n\t * @returns the message sent.\n\t */\n\tpublic removeText(start: number, end: number): void {\n\t\tthis.removeRange(start, end);\n\t}\n\n\t/**\n\t * Annotates the marker with the provided properties.\n\t * @param marker - The marker to annotate\n\t * @param props - The properties to annotate the marker with\n\t */\n\tpublic annotateMarker(marker: Marker, props: PropertySet) {\n\t\tthis.guardReentrancy(() => this.client.annotateMarker(marker, props));\n\t}\n\n\t/**\n\t * Searches a string for the nearest marker in either direction to a given start position.\n\t * The search will include the start position, so markers at the start position are valid\n\t * results of the search.\n\t * @param startPos - Position at which to start the search\n\t * @param markerLabel - Label of the marker to search for\n\t * @param forwards - Whether the desired marker comes before (false) or after (true) `startPos`\n\t */\n\tpublic searchForMarker(\n\t\tstartPos: number,\n\t\tmarkerLabel: string,\n\t\tforwards = true,\n\t): Marker | undefined {\n\t\treturn this.client.searchForMarker(startPos, markerLabel, forwards);\n\t}\n\n\t/**\n\t * Retrieve text from the SharedString in string format.\n\t * @param start - The starting index of the text to retrieve, or 0 if omitted.\n\t * @param end - The ending index of the text to retrieve, or the end of the string if omitted\n\t * @returns The requested text content as a string.\n\t */\n\tpublic getText(start?: number, end?: number) {\n\t\tconst segmentWindow = this.client.getCollabWindow();\n\t\treturn this.mergeTreeTextHelper.getText(\n\t\t\tsegmentWindow.currentSeq,\n\t\t\tsegmentWindow.clientId,\n\t\t\t\"\",\n\t\t\tstart,\n\t\t\tend,\n\t\t);\n\t}\n\n\t/**\n\t * Adds spaces for markers and handles, so that position calculations account for them.\n\t */\n\tpublic getTextWithPlaceholders(start?: number, end?: number) {\n\t\tconst segmentWindow = this.client.getCollabWindow();\n\t\treturn this.mergeTreeTextHelper.getText(\n\t\t\tsegmentWindow.currentSeq,\n\t\t\tsegmentWindow.clientId,\n\t\t\t\" \",\n\t\t\tstart,\n\t\t\tend,\n\t\t);\n\t}\n\n\tpublic getTextRangeWithMarkers(start: number, end: number) {\n\t\tconst segmentWindow = this.client.getCollabWindow();\n\t\treturn this.mergeTreeTextHelper.getText(\n\t\t\tsegmentWindow.currentSeq,\n\t\t\tsegmentWindow.clientId,\n\t\t\t\"*\",\n\t\t\tstart,\n\t\t\tend,\n\t\t);\n\t}\n\n\t/**\n\t * Looks up and returns a `Marker` using its id. Returns `undefined` if there is no marker with the provided\n\t * id in this `SharedString`.\n\t */\n\tpublic getMarkerFromId(id: string): ISegment | undefined {\n\t\treturn this.client.getMarkerFromId(id);\n\t}\n\n\t/**\n\t * Revert an op\n\t */\n\tprotected rollback(content: any, localOpMetadata: unknown): void {\n\t\tif (this.client.rollback !== undefined) {\n\t\t\tthis.client.rollback(content, localOpMetadata);\n\t\t} else {\n\t\t\tsuper.rollback(content, localOpMetadata);\n\t\t}\n\t}\n}\n\ninterface ITextAndMarkerAccumulator {\n\tparallelText: string[];\n\tparallelMarkers: Marker[];\n\tparallelMarkerLabel: string;\n\tplaceholder?: string;\n\ttagsInProgress: string[];\n\ttextSegment: TextSegment;\n}\n\n/**\n * Splits the text into regions ending with markers with the given `label`.\n * @param sharedString - String to retrieve text and markers from\n * @param label - label to split on\n * @returns Two parallel lists of text and markers, split by markers with the provided `label`.\n * For example:\n * ```typescript\n * // Say sharedstring has contents \"hello<paragraph marker 1>world<paragraph marker 2>missing\".\n * const { parallelText, parallelMarkers } = getTextAndMarkers(sharedString, \"paragraph\");\n * // parallelText === [\"hello\", \"world\"]\n * // parallelMarkers === [<paragraph marker 1 object>, <paragraph marker 2 object>]\n * // Note parallelText does not include \"missing\".\n * ```\n * @internal\n */\nexport function getTextAndMarkers(\n\tsharedString: SharedString,\n\tlabel: string,\n\tstart?: number,\n\tend?: number,\n): {\n\tparallelText: string[];\n\tparallelMarkers: Marker[];\n} {\n\tconst accum: ITextAndMarkerAccumulator = {\n\t\tparallelMarkerLabel: label,\n\t\tparallelMarkers: [],\n\t\tparallelText: [],\n\t\ttagsInProgress: [],\n\t\ttextSegment: new TextSegment(\"\"),\n\t};\n\n\tsharedString.walkSegments(gatherTextAndMarkers, start, end, accum);\n\treturn { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };\n}\n\nconst gatherTextAndMarkers: ISegmentAction<ITextAndMarkerAccumulator> = (\n\tsegment: ISegment,\n\tpos: number,\n\trefSeq: number,\n\tclientId: number,\n\tstart: number,\n\tend: number,\n\taccumText: ITextAndMarkerAccumulator,\n) => {\n\tconst { placeholder, tagsInProgress, textSegment } = accumText;\n\tif (TextSegment.is(segment)) {\n\t\tlet beginTags = \"\";\n\t\tlet endTags = \"\";\n\t\t// TODO: let clients pass in function to get tag\n\t\tconst tags = [] as string[];\n\t\tconst initTags = [] as string[];\n\n\t\tif (segment.properties?.[\"font-weight\"]) {\n\t\t\ttags.push(\"b\");\n\t\t}\n\t\tif (segment.properties?.[\"text-decoration\"]) {\n\t\t\ttags.push(\"u\");\n\t\t}\n\t\tconst remTags = [] as string[];\n\t\tif (tags.length > 0) {\n\t\t\tfor (const tag of tags) {\n\t\t\t\tif (!tagsInProgress.includes(tag)) {\n\t\t\t\t\tbeginTags += `<${tag}>`;\n\t\t\t\t\tinitTags.push(tag);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const accumTag of tagsInProgress) {\n\t\t\t\tif (!tags.includes(accumTag)) {\n\t\t\t\t\tendTags += `</${accumTag}>`;\n\t\t\t\t\tremTags.push(accumTag);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const initTag of initTags.reverse()) {\n\t\t\t\ttagsInProgress.push(initTag);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const accumTag of tagsInProgress) {\n\t\t\t\tendTags += `</${accumTag}>`;\n\t\t\t\tremTags.push(accumTag);\n\t\t\t}\n\t\t}\n\t\tfor (const remTag of remTags) {\n\t\t\tconst remdex = tagsInProgress.indexOf(remTag);\n\t\t\tif (remdex >= 0) {\n\t\t\t\ttagsInProgress.splice(remdex, 1);\n\t\t\t}\n\t\t}\n\t\ttextSegment.text += endTags;\n\t\ttextSegment.text += beginTags;\n\t\tif (start <= 0 && end >= segment.text.length) {\n\t\t\ttextSegment.text += segment.text;\n\t\t} else {\n\t\t\tconst seglen = segment.text.length;\n\t\t\tconst _start = start < 0 ? 0 : start;\n\t\t\tconst _end = end >= seglen ? undefined : end;\n\t\t\ttextSegment.text += segment.text.substring(_start, _end);\n\t\t}\n\t} else {\n\t\tif (placeholder && placeholder.length > 0) {\n\t\t\tconst placeholderText =\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\t\t\tplaceholder === \"*\" ? `\\n${segment}` : placeholder.repeat(segment.cachedLength);\n\t\t\ttextSegment.text += placeholderText;\n\t\t} else {\n\t\t\tconst marker = segment as Marker;\n\t\t\tif (refHasTileLabel(marker, accumText.parallelMarkerLabel)) {\n\t\t\t\taccumText.parallelMarkers.push(marker);\n\t\t\t\taccumText.parallelText.push(textSegment.text);\n\t\t\t\ttextSegment.text = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/sequence",
3
- "version": "2.0.0-rc.2.0.5",
3
+ "version": "2.0.0-rc.2.0.7",
4
4
  "description": "Distributed sequence",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -97,32 +97,32 @@
97
97
  "temp-directory": "nyc/.nyc_output"
98
98
  },
99
99
  "dependencies": {
100
- "@fluid-internal/client-utils": ">=2.0.0-rc.2.0.5 <2.0.0-rc.2.1.0",
101
- "@fluidframework/core-interfaces": ">=2.0.0-rc.2.0.5 <2.0.0-rc.2.1.0",
102
- "@fluidframework/core-utils": ">=2.0.0-rc.2.0.5 <2.0.0-rc.2.1.0",
103
- "@fluidframework/datastore-definitions": ">=2.0.0-rc.2.0.5 <2.0.0-rc.2.1.0",
104
- "@fluidframework/merge-tree": ">=2.0.0-rc.2.0.5 <2.0.0-rc.2.1.0",
100
+ "@fluid-internal/client-utils": ">=2.0.0-rc.2.0.7 <2.0.0-rc.2.1.0",
101
+ "@fluidframework/core-interfaces": ">=2.0.0-rc.2.0.7 <2.0.0-rc.2.1.0",
102
+ "@fluidframework/core-utils": ">=2.0.0-rc.2.0.7 <2.0.0-rc.2.1.0",
103
+ "@fluidframework/datastore-definitions": ">=2.0.0-rc.2.0.7 <2.0.0-rc.2.1.0",
104
+ "@fluidframework/merge-tree": ">=2.0.0-rc.2.0.7 <2.0.0-rc.2.1.0",
105
105
  "@fluidframework/protocol-definitions": "^3.2.0",
106
- "@fluidframework/runtime-definitions": ">=2.0.0-rc.2.0.5 <2.0.0-rc.2.1.0",
107
- "@fluidframework/runtime-utils": ">=2.0.0-rc.2.0.5 <2.0.0-rc.2.1.0",
108
- "@fluidframework/shared-object-base": ">=2.0.0-rc.2.0.5 <2.0.0-rc.2.1.0",
109
- "@fluidframework/telemetry-utils": ">=2.0.0-rc.2.0.5 <2.0.0-rc.2.1.0",
106
+ "@fluidframework/runtime-definitions": ">=2.0.0-rc.2.0.7 <2.0.0-rc.2.1.0",
107
+ "@fluidframework/runtime-utils": ">=2.0.0-rc.2.0.7 <2.0.0-rc.2.1.0",
108
+ "@fluidframework/shared-object-base": ">=2.0.0-rc.2.0.7 <2.0.0-rc.2.1.0",
109
+ "@fluidframework/telemetry-utils": ">=2.0.0-rc.2.0.7 <2.0.0-rc.2.1.0",
110
110
  "double-ended-queue": "^2.1.0-0",
111
111
  "uuid": "^9.0.0"
112
112
  },
113
113
  "devDependencies": {
114
114
  "@arethetypeswrong/cli": "^0.13.3",
115
- "@fluid-internal/mocha-test-setup": ">=2.0.0-rc.2.0.5 <2.0.0-rc.2.1.0",
116
- "@fluid-private/stochastic-test-utils": ">=2.0.0-rc.2.0.5 <2.0.0-rc.2.1.0",
117
- "@fluid-private/test-dds-utils": ">=2.0.0-rc.2.0.5 <2.0.0-rc.2.1.0",
115
+ "@fluid-internal/mocha-test-setup": ">=2.0.0-rc.2.0.7 <2.0.0-rc.2.1.0",
116
+ "@fluid-private/stochastic-test-utils": ">=2.0.0-rc.2.0.7 <2.0.0-rc.2.1.0",
117
+ "@fluid-private/test-dds-utils": ">=2.0.0-rc.2.0.7 <2.0.0-rc.2.1.0",
118
118
  "@fluid-tools/benchmark": "^0.48.0",
119
119
  "@fluid-tools/build-cli": "^0.34.0",
120
120
  "@fluidframework/build-common": "^2.0.3",
121
121
  "@fluidframework/build-tools": "^0.34.0",
122
- "@fluidframework/container-definitions": ">=2.0.0-rc.2.0.5 <2.0.0-rc.2.1.0",
122
+ "@fluidframework/container-definitions": ">=2.0.0-rc.2.0.7 <2.0.0-rc.2.1.0",
123
123
  "@fluidframework/eslint-config-fluid": "^4.0.0",
124
124
  "@fluidframework/sequence-previous": "npm:@fluidframework/sequence@2.0.0-internal.8.0.0",
125
- "@fluidframework/test-runtime-utils": ">=2.0.0-rc.2.0.5 <2.0.0-rc.2.1.0",
125
+ "@fluidframework/test-runtime-utils": ">=2.0.0-rc.2.0.7 <2.0.0-rc.2.1.0",
126
126
  "@microsoft/api-extractor": "^7.42.3",
127
127
  "@types/diff": "^3.5.1",
128
128
  "@types/double-ended-queue": "^2.1.0",
package/src/defaultMap.ts CHANGED
@@ -5,7 +5,12 @@
5
5
 
6
6
  import { IFluidHandle } from "@fluidframework/core-interfaces";
7
7
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
8
- import { IFluidSerializer, ValueType } from "@fluidframework/shared-object-base";
8
+ import {
9
+ IFluidSerializer,
10
+ makeHandlesSerializable,
11
+ parseHandles,
12
+ ValueType,
13
+ } from "@fluidframework/shared-object-base";
9
14
  import { TypedEventEmitter } from "@fluid-internal/client-utils";
10
15
  import { assert } from "@fluidframework/core-utils";
11
16
  import { makeSerializable, ValueTypeLocalValue } from "./localValues.js";
@@ -98,7 +103,7 @@ export class DefaultMap<T extends IntervalCollection<any> = IntervalCollection<a
98
103
  const localValue = this.data.get(op.key) ?? this.createCore(op.key, local);
99
104
  const handler = localValue.getOpHandler(op.value.opName);
100
105
  const previousValue = localValue.value;
101
- const translatedValue = op.value.value as any;
106
+ const translatedValue = parseHandles(op.value.value, this.serializer);
102
107
  handler.process(previousValue, translatedValue, local, message, localOpMetadata);
103
108
  const event: IValueChanged = { key: op.key, previousValue };
104
109
  this.eventEmitter.emit("valueChanged", event, local, message, this.eventEmitter);
@@ -256,13 +261,10 @@ export class DefaultMap<T extends IntervalCollection<any> = IntervalCollection<a
256
261
 
257
262
  /**
258
263
  * Populate the kernel with the given map data.
259
- *
260
- * @param serialized - A JSON string containing serialized map data
264
+ * @param data - A JSON string containing serialized map data
261
265
  */
262
- public populate(serialized: string): void {
263
- const parsed = this.serializer.parse(serialized) as IMapDataObjectSerializable;
264
-
265
- for (const [key, serializable] of Object.entries(parsed)) {
266
+ public populateFromSerializable(json: IMapDataObjectSerializable): void {
267
+ for (const [key, serializable] of Object.entries(json)) {
266
268
  // Back-compat: legacy documents may have handles to an intervalCollection map kernel.
267
269
  // These collections should be empty, and ValueTypes are no longer supported.
268
270
  if (
@@ -287,6 +289,10 @@ export class DefaultMap<T extends IntervalCollection<any> = IntervalCollection<a
287
289
  }
288
290
  }
289
291
 
292
+ public populate(json: string): void {
293
+ this.populateFromSerializable(JSON.parse(json) as IMapDataObjectSerializable);
294
+ }
295
+
290
296
  /**
291
297
  * Submit the given op if a handler is registered.
292
298
  * @param op - The operation to attempt to submit
@@ -402,6 +408,7 @@ export class DefaultMap<T extends IntervalCollection<any> = IntervalCollection<a
402
408
  0x2e1 /* "Support for plain value types removed." */,
403
409
  );
404
410
 
411
+ serializable.value = parseHandles(serializable.value, this.serializer);
405
412
  const localValue = this.type.factory.load(
406
413
  this.makeMapValueOpEmitter(key),
407
414
  serializable.value,
@@ -424,12 +431,14 @@ export class DefaultMap<T extends IntervalCollection<any> = IntervalCollection<a
424
431
  params: SerializedIntervalDelta,
425
432
  localOpMetadata: IMapMessageLocalMetadata,
426
433
  ): void => {
434
+ const translatedParams = makeHandlesSerializable(params, this.serializer, this.handle);
435
+
427
436
  const op: IMapValueTypeOperation = {
428
437
  key,
429
438
  type: "act",
430
439
  value: {
431
440
  opName,
432
- value: params,
441
+ value: translatedParams,
433
442
  },
434
443
  };
435
444
 
@@ -6,6 +6,7 @@
6
6
  /* eslint-disable no-bitwise */
7
7
 
8
8
  import {
9
+ // eslint-disable-next-line import/no-deprecated
9
10
  Client,
10
11
  PropertiesManager,
11
12
  PropertySet,
@@ -231,7 +232,7 @@ export interface IIntervalHelpers<TInterval extends ISerializableInterval> {
231
232
  label: string,
232
233
  start: SequencePlace | undefined,
233
234
  end: SequencePlace | undefined,
234
-
235
+ // eslint-disable-next-line import/no-deprecated
235
236
  client: Client | undefined,
236
237
  intervalType: IntervalType,
237
238
  op?: ISequencedDocumentMessage,
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/sequence";
9
- export const pkgVersion = "2.0.0-rc.2.0.5";
9
+ export const pkgVersion = "2.0.0-rc.2.0.7";
package/src/sequence.ts CHANGED
@@ -24,6 +24,7 @@ import {
24
24
  IJSONSegment,
25
25
  IMergeTreeAnnotateMsg,
26
26
  IMergeTreeDeltaOp,
27
+ // eslint-disable-next-line import/no-deprecated
27
28
  IMergeTreeGroupMsg,
28
29
  IMergeTreeOp,
29
30
  IMergeTreeRemoveMsg,
@@ -37,7 +38,9 @@ import {
37
38
  ReferencePosition,
38
39
  ReferenceType,
39
40
  MergeTreeRevertibleDriver,
41
+ // eslint-disable-next-line import/no-deprecated
40
42
  SegmentGroup,
43
+ // eslint-disable-next-line import/no-deprecated
41
44
  IMergeTreeObliterateMsg,
42
45
  createObliterateRangeOp,
43
46
  SlidingPreference,
@@ -45,6 +48,8 @@ import {
45
48
  import { ObjectStoragePartition, SummaryTreeBuilder } from "@fluidframework/runtime-utils";
46
49
  import {
47
50
  IFluidSerializer,
51
+ makeHandlesSerializable,
52
+ parseHandles,
48
53
  SharedObject,
49
54
  ISharedObjectEvents,
50
55
  } from "@fluidframework/shared-object-base";
@@ -187,6 +192,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
187
192
  }
188
193
 
189
194
  case MergeTreeDeltaType.OBLITERATE: {
195
+ // eslint-disable-next-line import/no-deprecated
190
196
  const lastRem = ops[ops.length - 1] as IMergeTreeObliterateMsg;
191
197
  if (lastRem?.pos1 === r.position) {
192
198
  assert(
@@ -250,6 +256,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
250
256
  /** `Deferred` that triggers once the object is loaded */
251
257
  protected loadedDeferred = new Deferred<void>();
252
258
  // cache out going ops created when partial loading
259
+ // eslint-disable-next-line import/no-deprecated
253
260
  private readonly loadedDeferredOutgoingOps: [IMergeTreeOp, SegmentGroup | SegmentGroup[]][] =
254
261
  [];
255
262
  // cache incoming ops that arrive when partial loading
@@ -347,6 +354,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
347
354
  * release, as group ops are redundant with the native batching capabilities
348
355
  * of the runtime
349
356
  */
357
+ // eslint-disable-next-line import/no-deprecated
350
358
  public groupOperation(groupOp: IMergeTreeGroupMsg) {
351
359
  this.guardReentrancy(() => this.client.localTransaction(groupOp));
352
360
  }
@@ -476,7 +484,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
476
484
  }
477
485
 
478
486
  this.inFlightRefSeqs.push(this.currentRefSeq);
479
-
487
+ const translated = makeHandlesSerializable(message, this.serializer, this.handle);
480
488
  const metadata = this.client.peekPendingSegmentGroups(
481
489
  message.type === MergeTreeDeltaType.GROUP ? message.ops.length : 1,
482
490
  );
@@ -485,9 +493,9 @@ export abstract class SharedSegmentSequence<T extends ISegment>
485
493
  // local ops until loading is complete, and then
486
494
  // they will be present
487
495
  if (!this.loadedDeferred.isCompleted) {
488
- this.loadedDeferredOutgoingOps.push(metadata ? [message, metadata] : (message as any));
496
+ this.loadedDeferredOutgoingOps.push(metadata ? [translated, metadata] : translated);
489
497
  } else {
490
- this.submitLocalMessage(message, metadata);
498
+ this.submitLocalMessage(translated, metadata);
491
499
  }
492
500
  }
493
501
 
@@ -661,6 +669,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
661
669
  this.submitSequenceMessage(
662
670
  this.client.regeneratePendingOp(
663
671
  content as IMergeTreeOp,
672
+ // eslint-disable-next-line import/no-deprecated
664
673
  localOpMetadata as SegmentGroup | SegmentGroup[],
665
674
  ),
666
675
  );
@@ -799,8 +808,9 @@ export abstract class SharedSegmentSequence<T extends ISegment>
799
808
  * {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}
800
809
  */
801
810
  protected applyStashedOp(content: any): void {
802
- if (!this.intervalCollections.tryApplyStashedOp(content)) {
803
- this.client.applyStashedOp(content);
811
+ const parsedContent = parseHandles(content, this.serializer);
812
+ if (!this.intervalCollections.tryApplyStashedOp(parsedContent)) {
813
+ this.client.applyStashedOp(parsedContent);
804
814
  }
805
815
  }
806
816
 
@@ -826,11 +836,9 @@ export abstract class SharedSegmentSequence<T extends ISegment>
826
836
  );
827
837
  }
828
838
 
829
- /**
830
- *
831
- * @param message - Message with decoded and hydrated handles
832
- */
833
- private processMergeTreeMsg(message: ISequencedDocumentMessage, local?: boolean) {
839
+ private processMergeTreeMsg(rawMessage: ISequencedDocumentMessage, local?: boolean) {
840
+ const message = parseHandles(rawMessage, this.serializer);
841
+
834
842
  const ops: IMergeTreeDeltaOp[] = [];
835
843
  function transformOps(event: SequenceDeltaEvent) {
836
844
  ops.push(...SharedSegmentSequence.createOpsFromDelta(event));
@@ -4,6 +4,7 @@
4
4
  */
5
5
 
6
6
  import {
7
+ // eslint-disable-next-line import/no-deprecated
7
8
  IMergeTreeTextHelper,
8
9
  IRelativePosition,
9
10
  ISegment,
@@ -86,6 +87,7 @@ export class SharedString
86
87
  return this;
87
88
  }
88
89
 
90
+ // eslint-disable-next-line import/no-deprecated
89
91
  private readonly mergeTreeTextHelper: IMergeTreeTextHelper;
90
92
 
91
93
  constructor(