@fluidframework/merge-tree 2.0.0-internal.6.1.2 → 2.0.0-internal.6.2.1

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 (73) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +4 -3
  3. package/dist/MergeTreeTextHelper.d.ts.map +1 -1
  4. package/dist/MergeTreeTextHelper.js +1 -0
  5. package/dist/MergeTreeTextHelper.js.map +1 -1
  6. package/dist/client.d.ts +17 -2
  7. package/dist/client.d.ts.map +1 -1
  8. package/dist/client.js +24 -3
  9. package/dist/client.js.map +1 -1
  10. package/dist/collections/list.js +3 -3
  11. package/dist/collections/list.js.map +1 -1
  12. package/dist/localReference.js +3 -3
  13. package/dist/localReference.js.map +1 -1
  14. package/dist/mergeTree.d.ts +18 -1
  15. package/dist/mergeTree.d.ts.map +1 -1
  16. package/dist/mergeTree.js +46 -3
  17. package/dist/mergeTree.js.map +1 -1
  18. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  19. package/dist/mergeTreeDeltaCallback.js +0 -4
  20. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  21. package/dist/opBuilder.d.ts.map +1 -1
  22. package/dist/opBuilder.js +1 -0
  23. package/dist/opBuilder.js.map +1 -1
  24. package/dist/ops.d.ts +6 -0
  25. package/dist/ops.d.ts.map +1 -1
  26. package/dist/ops.js +6 -0
  27. package/dist/ops.js.map +1 -1
  28. package/dist/revertibles.js +3 -3
  29. package/dist/revertibles.js.map +1 -1
  30. package/dist/snapshotLoader.d.ts.map +1 -1
  31. package/dist/snapshotLoader.js +1 -2
  32. package/dist/snapshotLoader.js.map +1 -1
  33. package/lib/MergeTreeTextHelper.d.ts.map +1 -1
  34. package/lib/MergeTreeTextHelper.js +1 -0
  35. package/lib/MergeTreeTextHelper.js.map +1 -1
  36. package/lib/client.d.ts +17 -2
  37. package/lib/client.d.ts.map +1 -1
  38. package/lib/client.js +27 -4
  39. package/lib/client.js.map +1 -1
  40. package/lib/collections/list.js +1 -1
  41. package/lib/collections/list.js.map +1 -1
  42. package/lib/localReference.js +1 -1
  43. package/lib/localReference.js.map +1 -1
  44. package/lib/mergeTree.d.ts +18 -1
  45. package/lib/mergeTree.d.ts.map +1 -1
  46. package/lib/mergeTree.js +44 -1
  47. package/lib/mergeTree.js.map +1 -1
  48. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
  49. package/lib/mergeTreeDeltaCallback.js +0 -4
  50. package/lib/mergeTreeDeltaCallback.js.map +1 -1
  51. package/lib/opBuilder.d.ts.map +1 -1
  52. package/lib/opBuilder.js +1 -0
  53. package/lib/opBuilder.js.map +1 -1
  54. package/lib/ops.d.ts +6 -0
  55. package/lib/ops.d.ts.map +1 -1
  56. package/lib/ops.js +6 -0
  57. package/lib/ops.js.map +1 -1
  58. package/lib/revertibles.js +1 -1
  59. package/lib/revertibles.js.map +1 -1
  60. package/lib/snapshotLoader.d.ts.map +1 -1
  61. package/lib/snapshotLoader.js +1 -2
  62. package/lib/snapshotLoader.js.map +1 -1
  63. package/package.json +21 -19
  64. package/src/MergeTreeTextHelper.ts +3 -0
  65. package/src/client.ts +32 -5
  66. package/src/collections/list.ts +1 -1
  67. package/src/localReference.ts +1 -1
  68. package/src/mergeTree.ts +62 -1
  69. package/src/mergeTreeDeltaCallback.ts +2 -1
  70. package/src/opBuilder.ts +1 -0
  71. package/src/ops.ts +6 -0
  72. package/src/revertibles.ts +1 -1
  73. package/src/snapshotLoader.ts +5 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,45 @@
1
1
  # @fluidframework/merge-tree
2
2
 
3
+ ## 2.0.0-internal.6.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Deprecate getStackContext and associated NestBegin/End ([#16877](https://github.com/microsoft/FluidFramework/issues/16877)) [8e743fe1dd](https://github.com/microsoft/FluidFramework/commits/8e743fe1dde9adb3a1240971987d3abd51ab2fbe)
8
+
9
+ Deprecate SharedSegmentSequence.getStackContext and Client.getStackContext (and the enums ReferenceType.NestBegin and NestEnd they use).
10
+ This functionality is unused, poorly tested, and incurs performance overhead.
11
+
12
+ - Remove use of @fluidframework/common-definitions ([#16638](https://github.com/microsoft/FluidFramework/issues/16638)) [a8c81509c9](https://github.com/microsoft/FluidFramework/commits/a8c81509c9bf09cfb2092ebcf7265205f9eb6dbf)
13
+
14
+ The **@fluidframework/common-definitions** package is being deprecated, so the following interfaces and types are now
15
+ imported from the **@fluidframework/core-interfaces** package:
16
+
17
+ - interface IDisposable
18
+ - interface IErrorEvent
19
+ - interface IErrorEvent
20
+ - interface IEvent
21
+ - interface IEventProvider
22
+ - interface ILoggingError
23
+ - interface ITaggedTelemetryPropertyType
24
+ - interface ITelemetryBaseEvent
25
+ - interface ITelemetryBaseLogger
26
+ - interface ITelemetryErrorEvent
27
+ - interface ITelemetryGenericEvent
28
+ - interface ITelemetryLogger
29
+ - interface ITelemetryPerformanceEvent
30
+ - interface ITelemetryProperties
31
+ - type ExtendEventProvider
32
+ - type IEventThisPlaceHolder
33
+ - type IEventTransformer
34
+ - type ReplaceIEventThisPlaceHolder
35
+ - type ReplaceIEventThisPlaceHolder
36
+ - type TelemetryEventCategory
37
+ - type TelemetryEventPropertyType
38
+
39
+ - Deprecation of findTile in favor of searchForMarker, which uses depthFirstNodeWalk to locate the nearest marker. ([#16517](https://github.com/microsoft/FluidFramework/issues/16517)) [e928b1f185](https://github.com/microsoft/FluidFramework/commits/e928b1f185ca32123eff9d4bfc5bce28ba1b95c1)
40
+
41
+ findTile has a decent amount of buggy behavior, which leads partners who want to use it to implement workarounds for the odd behavior. searchForMarker is being introduced as a replacement. It performs the same basic functionality of searching for the nearest marker to a given start position in the indicated direction. However, it includes the start position as one of the nodes to search, so markers at the start position will be returned as the nearest marker to that position. Notably, positions 0 and length-1 will be included in the search as well, so searching forwards from position 0 or backwards from position length-1 would allow the entire string to be searched.
42
+
3
43
  ## 2.0.0-internal.6.1.0
4
44
 
5
45
  Dependency updates only.
package/README.md CHANGED
@@ -16,9 +16,10 @@ When taking a dependency on a Fluid Framework library, we recommend using a `^`
16
16
  While Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,
17
17
  library consumers should always prefer `^`.
18
18
 
19
- Note that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version
20
- scheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the
21
- [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)
19
+ Note that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,
20
+ you must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).
21
+ Standard `^` and `~` ranges will not work as expected.
22
+ See the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)
22
23
  package for more information including tools to convert between version schemes.
23
24
 
24
25
  <!-- prettier-ignore-end -->
@@ -1 +1 @@
1
- {"version":3,"file":"MergeTreeTextHelper.d.ts","sourceRoot":"","sources":["../src/MergeTreeTextHelper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAe,MAAM,eAAe,CAAC;AAQlE,qBAAa,mBAAoB,YAAW,oBAAoB;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAE1C,OAAO,CACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,WAAW,SAAK,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM;IAiBb,OAAO,CAAC,aAAa;CAYrB"}
1
+ {"version":3,"file":"MergeTreeTextHelper.d.ts","sourceRoot":"","sources":["../src/MergeTreeTextHelper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAe,MAAM,eAAe,CAAC;AAQlE,qBAAa,mBAAoB,YAAW,oBAAoB;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAE1C,OAAO,CACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,WAAW,SAAK,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM;IAiBb,OAAO,CAAC,aAAa;CAcrB"}
@@ -17,6 +17,7 @@ class MergeTreeTextHelper {
17
17
  return accum.textSegment.text;
18
18
  }
19
19
  getValidRange(start, end, refSeq, clientId) {
20
+ // eslint-disable-next-line import/no-deprecated
20
21
  const range = {
21
22
  end: end ?? this.mergeTree.getLength(refSeq, clientId),
22
23
  start: start ?? 0,
@@ -1 +1 @@
1
- {"version":3,"file":"MergeTreeTextHelper.js","sourceRoot":"","sources":["../src/MergeTreeTextHelper.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAKH,+CAAkE;AAQlE,MAAa,mBAAmB;IAC/B,YAA6B,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAE9C,OAAO,CACb,MAAc,EACd,QAAgB,EAChB,WAAW,GAAG,EAAE,EAChB,KAAc,EACd,GAAY;QAEZ,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/D,MAAM,KAAK,GAAqB,EAAE,WAAW,EAAE,IAAI,yBAAW,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;QAElF,IAAI,CAAC,SAAS,CAAC,QAAQ,CACtB,UAAU,EACV,MAAM,EACN,QAAQ,EACR,KAAK,EACL,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,GAAG,CACT,CAAC;QACF,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;IAC/B,CAAC;IAEO,aAAa,CACpB,KAAyB,EACzB,GAAuB,EACvB,MAAc,EACd,QAAgB;QAEhB,MAAM,KAAK,GAAkB;YAC5B,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC;YACtD,KAAK,EAAE,KAAK,IAAI,CAAC;SACjB,CAAC;QACF,OAAO,KAAK,CAAC;IACd,CAAC;CACD;AArCD,kDAqCC;AAED,SAAS,UAAU,CAClB,OAAiB,EACjB,GAAW,EACX,MAAc,EACd,QAAgB,EAChB,KAAa,EACb,GAAW,EACX,EAAE,WAAW,EAAE,WAAW,EAAoB;IAE9C,IAAI,yBAAW,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;QAC5B,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,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;QACjD,MAAM,eAAe,GACpB,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACjF,WAAW,CAAC,IAAI,IAAI,eAAe,CAAC;KACpC;IAED,OAAO,IAAI,CAAC;AACb,CAAC","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 } from \"./mergeTreeNodes\";\nimport { MergeTree } from \"./mergeTree\";\nimport { IMergeTreeTextHelper, TextSegment } from \"./textSegment\";\n\ninterface ITextAccumulator {\n\ttextSegment: TextSegment;\n\tplaceholder?: string;\n\tparallelArrays?: boolean;\n}\n\nexport class MergeTreeTextHelper implements IMergeTreeTextHelper {\n\tconstructor(private readonly mergeTree: MergeTree) {}\n\n\tpublic getText(\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tplaceholder = \"\",\n\t\tstart?: number,\n\t\tend?: number,\n\t) {\n\t\tconst range = this.getValidRange(start, end, refSeq, clientId);\n\n\t\tconst accum: ITextAccumulator = { textSegment: new TextSegment(\"\"), placeholder };\n\n\t\tthis.mergeTree.mapRange<ITextAccumulator>(\n\t\t\tgatherText,\n\t\t\trefSeq,\n\t\t\tclientId,\n\t\t\taccum,\n\t\t\trange.start,\n\t\t\trange.end,\n\t\t);\n\t\treturn accum.textSegment.text;\n\t}\n\n\tprivate getValidRange(\n\t\tstart: number | undefined,\n\t\tend: number | undefined,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t): IIntegerRange {\n\t\tconst range: IIntegerRange = {\n\t\t\tend: end ?? this.mergeTree.getLength(refSeq, clientId),\n\t\t\tstart: start ?? 0,\n\t\t};\n\t\treturn range;\n\t}\n}\n\nfunction gatherText(\n\tsegment: ISegment,\n\tpos: number,\n\trefSeq: number,\n\tclientId: number,\n\tstart: number,\n\tend: number,\n\t{ textSegment, placeholder }: ITextAccumulator,\n): boolean {\n\tif (TextSegment.is(segment)) {\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 if (placeholder && placeholder.length > 0) {\n\t\tconst placeholderText =\n\t\t\tplaceholder === \"*\" ? `\\n${segment}` : placeholder.repeat(segment.cachedLength);\n\t\ttextSegment.text += placeholderText;\n\t}\n\n\treturn true;\n}\n"]}
1
+ {"version":3,"file":"MergeTreeTextHelper.js","sourceRoot":"","sources":["../src/MergeTreeTextHelper.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAMH,+CAAkE;AAQlE,MAAa,mBAAmB;IAC/B,YAA6B,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAE9C,OAAO,CACb,MAAc,EACd,QAAgB,EAChB,WAAW,GAAG,EAAE,EAChB,KAAc,EACd,GAAY;QAEZ,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/D,MAAM,KAAK,GAAqB,EAAE,WAAW,EAAE,IAAI,yBAAW,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;QAElF,IAAI,CAAC,SAAS,CAAC,QAAQ,CACtB,UAAU,EACV,MAAM,EACN,QAAQ,EACR,KAAK,EACL,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,GAAG,CACT,CAAC;QACF,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;IAC/B,CAAC;IAEO,aAAa,CACpB,KAAyB,EACzB,GAAuB,EACvB,MAAc,EACd,QAAgB;QAGhB,gDAAgD;QAChD,MAAM,KAAK,GAAkB;YAC5B,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC;YACtD,KAAK,EAAE,KAAK,IAAI,CAAC;SACjB,CAAC;QACF,OAAO,KAAK,CAAC;IACd,CAAC;CACD;AAvCD,kDAuCC;AAED,SAAS,UAAU,CAClB,OAAiB,EACjB,GAAW,EACX,MAAc,EACd,QAAgB,EAChB,KAAa,EACb,GAAW,EACX,EAAE,WAAW,EAAE,WAAW,EAAoB;IAE9C,IAAI,yBAAW,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;QAC5B,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,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;QACjD,MAAM,eAAe,GACpB,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACjF,WAAW,CAAC,IAAI,IAAI,eAAe,CAAC;KACpC;IAED,OAAO,IAAI,CAAC;AACb,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n// eslint-disable-next-line import/no-deprecated\nimport { IIntegerRange } from \"./base\";\nimport { ISegment } from \"./mergeTreeNodes\";\nimport { MergeTree } from \"./mergeTree\";\nimport { IMergeTreeTextHelper, TextSegment } from \"./textSegment\";\n\ninterface ITextAccumulator {\n\ttextSegment: TextSegment;\n\tplaceholder?: string;\n\tparallelArrays?: boolean;\n}\n\nexport class MergeTreeTextHelper implements IMergeTreeTextHelper {\n\tconstructor(private readonly mergeTree: MergeTree) {}\n\n\tpublic getText(\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tplaceholder = \"\",\n\t\tstart?: number,\n\t\tend?: number,\n\t) {\n\t\tconst range = this.getValidRange(start, end, refSeq, clientId);\n\n\t\tconst accum: ITextAccumulator = { textSegment: new TextSegment(\"\"), placeholder };\n\n\t\tthis.mergeTree.mapRange<ITextAccumulator>(\n\t\t\tgatherText,\n\t\t\trefSeq,\n\t\t\tclientId,\n\t\t\taccum,\n\t\t\trange.start,\n\t\t\trange.end,\n\t\t);\n\t\treturn accum.textSegment.text;\n\t}\n\n\tprivate getValidRange(\n\t\tstart: number | undefined,\n\t\tend: number | undefined,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t): IIntegerRange {\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tconst range: IIntegerRange = {\n\t\t\tend: end ?? this.mergeTree.getLength(refSeq, clientId),\n\t\t\tstart: start ?? 0,\n\t\t};\n\t\treturn range;\n\t}\n}\n\nfunction gatherText(\n\tsegment: ISegment,\n\tpos: number,\n\trefSeq: number,\n\tclientId: number,\n\tstart: number,\n\tend: number,\n\t{ textSegment, placeholder }: ITextAccumulator,\n): boolean {\n\tif (TextSegment.is(segment)) {\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 if (placeholder && placeholder.length > 0) {\n\t\tconst placeholderText =\n\t\t\tplaceholder === \"*\" ? `\\n${segment}` : placeholder.repeat(segment.cachedLength);\n\t\ttextSegment.text += placeholderText;\n\t}\n\n\treturn true;\n}\n"]}
package/dist/client.d.ts CHANGED
@@ -2,12 +2,11 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IFluidHandle } from "@fluidframework/core-interfaces";
5
+ import { IFluidHandle, type IEventThisPlaceHolder } from "@fluidframework/core-interfaces";
6
6
  import { IFluidSerializer } from "@fluidframework/shared-object-base";
7
7
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
8
8
  import { IFluidDataStoreRuntime, IChannelStorageService } from "@fluidframework/datastore-definitions";
9
9
  import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
10
- import type { IEventThisPlaceHolder } from "@fluidframework/common-definitions";
11
10
  import { TypedEventEmitter } from "@fluidframework/common-utils";
12
11
  import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
13
12
  import { LocalReferencePosition, SlidingPreference } from "./localReference";
@@ -214,6 +213,9 @@ export declare class Client extends TypedEventEmitter<IClientEvents> {
214
213
  load(runtime: IFluidDataStoreRuntime, storage: IChannelStorageService, serializer: IFluidSerializer): Promise<{
215
214
  catchupOpsP: Promise<ISequencedDocumentMessage[]>;
216
215
  }>;
216
+ /**
217
+ * @deprecated - this functionality is no longer supported and will be removed
218
+ */
217
219
  getStackContext(startPos: number, rangeLabels: string[]): RangeStackMap;
218
220
  private getLocalSequenceNumber;
219
221
  localTransaction(groupOp: IMergeTreeGroupMsg): void;
@@ -232,9 +234,22 @@ export declare class Client extends TypedEventEmitter<IClientEvents> {
232
234
  getClientId(): number;
233
235
  getLength(): number;
234
236
  startOrUpdateCollaboration(longClientId: string | undefined, minSeq?: number, currentSeq?: number): void;
237
+ /**
238
+ * @deprecated - Use searchForMarker instead.
239
+ */
235
240
  findTile(startPos: number, tileLabel: string, preceding?: boolean): {
236
241
  tile: ReferencePosition;
237
242
  pos: number;
238
243
  } | undefined;
244
+ /**
245
+ * Searches a string for the nearest marker in either direction to a given start position.
246
+ * The search will include the start position, so markers at the start position are valid
247
+ * results of the search. Makes use of block-accelerated search functions for log(n) complexity.
248
+ *
249
+ * @param startPos - Position at which to start the search
250
+ * @param markerLabel - Label of the marker to search for
251
+ * @param forwards - Whether the desired marker comes before (false) or after (true) `startPos`
252
+ */
253
+ searchForMarker(startPos: number, markerLabel: string, forwards?: boolean): Marker | undefined;
239
254
  }
240
255
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -8,7 +8,6 @@ exports.Client = void 0;
8
8
  const protocol_definitions_1 = require("@fluidframework/protocol-definitions");
9
9
  const common_utils_1 = require("@fluidframework/common-utils");
10
10
  const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
11
- const container_utils_1 = require("@fluidframework/container-utils");
12
11
  const collections_1 = require("./collections");
13
12
  const constants_1 = require("./constants");
14
13
  const mergeTreeNodes_1 = require("./mergeTreeNodes");
@@ -42,7 +41,7 @@ class Client extends common_utils_1.TypedEventEmitter {
42
41
  if (options?.attribution?.track) {
43
42
  const policy = this._mergeTree?.attributionPolicy;
44
43
  if (policy === undefined) {
45
- throw new container_utils_1.UsageError("Attribution policy must be provided when attribution tracking is requested.");
44
+ throw new telemetry_utils_1.UsageError("Attribution policy must be provided when attribution tracking is requested.");
46
45
  }
47
46
  policy.attach(this);
48
47
  }
@@ -347,7 +346,7 @@ class Client extends common_utils_1.TypedEventEmitter {
347
346
  }
348
347
  }
349
348
  // start and end are guaranteed to be non-null here, otherwise we throw above.
350
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
349
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions, import/no-deprecated
351
350
  return { start, end };
352
351
  }
353
352
  /**
@@ -609,6 +608,7 @@ class Client extends common_utils_1.TypedEventEmitter {
609
608
  if (Array.isArray(segmentGroup)) {
610
609
  if (segmentGroup.length === 0) {
611
610
  // sometimes we rebase to an empty op
611
+ // eslint-disable-next-line import/no-deprecated
612
612
  return (0, opBuilder_1.createGroupOp)();
613
613
  }
614
614
  firstGroup = segmentGroup[0];
@@ -646,6 +646,7 @@ class Client extends common_utils_1.TypedEventEmitter {
646
646
  (0, common_utils_1.assert)(!Array.isArray(segmentGroup), 0x03d /* "segmentGroup is array rather than singleton!" */);
647
647
  opList.push(...this.resetPendingDeltaToOps(resetOp, segmentGroup));
648
648
  }
649
+ // eslint-disable-next-line import/no-deprecated
649
650
  return opList.length === 1 ? opList[0] : (0, opBuilder_1.createGroupOp)(...opList);
650
651
  }
651
652
  createTextHelper() {
@@ -679,6 +680,9 @@ class Client extends common_utils_1.TypedEventEmitter {
679
680
  const loader = new snapshotLoader_1.SnapshotLoader(runtime, this, this._mergeTree, this.logger, serializer);
680
681
  return loader.initialize(storage);
681
682
  }
683
+ /**
684
+ * @deprecated - this functionality is no longer supported and will be removed
685
+ */
682
686
  getStackContext(startPos, rangeLabels) {
683
687
  return this._mergeTree.getStackContext(startPos, this.getCollabWindow().clientId, rangeLabels);
684
688
  }
@@ -686,6 +690,7 @@ class Client extends common_utils_1.TypedEventEmitter {
686
690
  const segWindow = this.getCollabWindow();
687
691
  return segWindow.collaborating ? constants_1.UnassignedSequenceNumber : constants_1.UniversalSequenceNumber;
688
692
  }
693
+ // eslint-disable-next-line import/no-deprecated
689
694
  localTransaction(groupOp) {
690
695
  for (const op of groupOp.ops) {
691
696
  const opArgs = {
@@ -772,10 +777,26 @@ class Client extends common_utils_1.TypedEventEmitter {
772
777
  }
773
778
  }
774
779
  }
780
+ /**
781
+ * @deprecated - Use searchForMarker instead.
782
+ */
775
783
  findTile(startPos, tileLabel, preceding = true) {
776
784
  const clientId = this.getClientId();
777
785
  return this._mergeTree.findTile(startPos, clientId, tileLabel, preceding);
778
786
  }
787
+ /**
788
+ * Searches a string for the nearest marker in either direction to a given start position.
789
+ * The search will include the start position, so markers at the start position are valid
790
+ * results of the search. Makes use of block-accelerated search functions for log(n) complexity.
791
+ *
792
+ * @param startPos - Position at which to start the search
793
+ * @param markerLabel - Label of the marker to search for
794
+ * @param forwards - Whether the desired marker comes before (false) or after (true) `startPos`
795
+ */
796
+ searchForMarker(startPos, markerLabel, forwards = true) {
797
+ const clientId = this.getClientId();
798
+ return this._mergeTree.searchForMarker(startPos, clientId, markerLabel, forwards);
799
+ }
779
800
  }
780
801
  exports.Client = Client;
781
802
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport type { IEventThisPlaceHolder } from \"@fluidframework/common-definitions\";\nimport { assert, TypedEventEmitter, unreachableCase } from \"@fluidframework/common-utils\";\nimport { ITelemetryLoggerExt, LoggingError } from \"@fluidframework/telemetry-utils\";\nimport { UsageError } from \"@fluidframework/container-utils\";\nimport { IIntegerRange } from \"./base\";\nimport { List, RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber, UniversalSequenceNumber } from \"./constants\";\nimport { LocalReferencePosition, SlidingPreference } from \"./localReference\";\nimport {\n\tCollaborationWindow,\n\tcompareStrings,\n\tIConsensusInfo,\n\tIMergeLeaf,\n\tISegment,\n\tISegmentAction,\n\tMarker,\n\tSegmentGroup,\n} from \"./mergeTreeNodes\";\nimport {\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeMaintenanceCallbackArgs,\n} from \"./mergeTreeDeltaCallback\";\nimport {\n\tcreateAnnotateMarkerOp,\n\tcreateAnnotateRangeOp,\n\tcreateGroupOp,\n\tcreateInsertSegmentOp,\n\tcreateRemoveRangeOp,\n} from \"./opBuilder\";\nimport {\n\tICombiningOp,\n\tIJSONSegment,\n\tIMergeTreeAnnotateMsg,\n\tIMergeTreeDeltaOp,\n\tIMergeTreeGroupMsg,\n\tIMergeTreeInsertMsg,\n\tIMergeTreeRemoveMsg,\n\tIMergeTreeOp,\n\tIRelativePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n} from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\nimport { SnapshotLoader } from \"./snapshotLoader\";\nimport { IMergeTreeTextHelper } from \"./textSegment\";\nimport { SnapshotV1 } from \"./snapshotV1\";\nimport { ReferencePosition, RangeStackMap, DetachedReferencePosition } from \"./referencePositions\";\nimport { MergeTree } from \"./mergeTree\";\nimport { MergeTreeTextHelper } from \"./MergeTreeTextHelper\";\nimport { walkAllChildSegments } from \"./mergeTreeNodeWalk\";\nimport { IMergeTreeClientSequenceArgs, IMergeTreeDeltaOpArgs } from \"./index\";\n\ntype IMergeTreeDeltaRemoteOpArgs = Omit<IMergeTreeDeltaOpArgs, \"sequencedMessage\"> &\n\tRequired<Pick<IMergeTreeDeltaOpArgs, \"sequencedMessage\">>;\n\n/**\n * Emitted before this client's merge-tree normalizes its segments on reconnect, potentially\n * ordering them. Useful for DDS-like consumers built atop the merge-tree to compute any information\n * they need for rebasing their ops on reconnection.\n *\n * @internal\n */\nexport interface IClientEvents {\n\t(event: \"normalize\", listener: (target: IEventThisPlaceHolder) => void);\n\t(\n\t\tevent: \"delta\",\n\t\tlistener: (\n\t\t\topArgs: IMergeTreeDeltaOpArgs,\n\t\t\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t);\n\t(\n\t\tevent: \"maintenance\",\n\t\tlistener: (\n\t\t\targs: IMergeTreeMaintenanceCallbackArgs,\n\t\t\tdeltaArgs: IMergeTreeDeltaOpArgs | undefined,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t);\n}\n\nexport class Client extends TypedEventEmitter<IClientEvents> {\n\tpublic longClientId: string | undefined;\n\n\tprivate readonly _mergeTree: MergeTree;\n\n\tprivate readonly clientNameToIds = new RedBlackTree<string, number>(compareStrings);\n\tprivate readonly shortClientIdMap: string[] = [];\n\tprivate readonly pendingConsensus = new Map<string, IConsensusInfo>();\n\n\tconstructor(\n\t\t// Passing this callback would be unnecessary if Client were merged with SharedSegmentSequence\n\t\tpublic readonly specToSegment: (spec: IJSONSegment) => ISegment,\n\t\tpublic readonly logger: ITelemetryLoggerExt,\n\t\toptions?: PropertySet,\n\t) {\n\t\tsuper();\n\t\tthis._mergeTree = new MergeTree(options);\n\t\tthis._mergeTree.mergeTreeDeltaCallback = (opArgs, deltaArgs) => {\n\t\t\tthis.emit(\"delta\", opArgs, deltaArgs, this);\n\t\t};\n\t\tthis._mergeTree.mergeTreeMaintenanceCallback = (args, opArgs) => {\n\t\t\tthis.emit(\"maintenance\", args, opArgs, this);\n\t\t};\n\n\t\tif (options?.attribution?.track) {\n\t\t\tconst policy = this._mergeTree?.attributionPolicy;\n\t\t\tif (policy === undefined) {\n\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\"Attribution policy must be provided when attribution tracking is requested.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tpolicy.attach(this);\n\t\t}\n\t}\n\n\t/**\n\t * The merge tree maintains a queue of segment groups for each local operation.\n\t * These segment groups track segments modified by an operation.\n\t * This method peeks the tail of that queue, and returns the segments groups there.\n\t * It is used to get the segment group(s) for the previous operations.\n\t * @param count - The number segment groups to get peek from the tail of the queue. Default 1.\n\t */\n\tpublic peekPendingSegmentGroups(count: number = 1): SegmentGroup | SegmentGroup[] | undefined {\n\t\tconst pending = this._mergeTree.pendingSegments;\n\t\tlet node = pending?.last;\n\t\tif (count === 1 || pending === undefined) {\n\t\t\treturn node?.data;\n\t\t}\n\t\tconst taken: SegmentGroup[] = new Array(Math.min(count, pending.length));\n\t\tfor (let i = taken.length - 1; i >= 0; i--) {\n\t\t\ttaken[i] = node!.data;\n\t\t\tnode = node!.prev;\n\t\t}\n\t\treturn taken;\n\t}\n\n\t/**\n\t * Annotate a marker and call the callback on consensus.\n\t * @param marker - The marker to annotate\n\t * @param props - The properties to annotate the marker with\n\t * @param consensusCallback - The callback called when consensus is reached\n\t * @returns The annotate op if valid, otherwise undefined\n\t */\n\tpublic annotateMarkerNotifyConsensus(\n\t\tmarker: Marker,\n\t\tprops: PropertySet,\n\t\tconsensusCallback: (m: Marker) => void,\n\t): IMergeTreeAnnotateMsg | undefined {\n\t\tconst combiningOp: ICombiningOp = {\n\t\t\tname: \"consensus\",\n\t\t};\n\n\t\tconst annotateOp = this.annotateMarker(marker, props, combiningOp);\n\n\t\tif (annotateOp) {\n\t\t\tconst consensusInfo: IConsensusInfo = {\n\t\t\t\tcallback: consensusCallback,\n\t\t\t\tmarker,\n\t\t\t};\n\t\t\tthis.pendingConsensus.set(marker.getId()!, consensusInfo);\n\t\t\treturn annotateOp;\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\t/**\n\t * Annotates the markers with the provided properties\n\t * @param marker - The marker to annotate\n\t * @param props - The properties to annotate the marker with\n\t * @param combiningOp - Optional. Specifies how to combine values for the property, such as \"incr\" for increment.\n\t * @returns The annotate op if valid, otherwise undefined\n\t */\n\tpublic annotateMarker(\n\t\tmarker: Marker,\n\t\tprops: PropertySet,\n\t\tcombiningOp?: ICombiningOp,\n\t): IMergeTreeAnnotateMsg | undefined {\n\t\tconst annotateOp = createAnnotateMarkerOp(marker, props, combiningOp)!;\n\n\t\treturn this.applyAnnotateRangeOp({ op: annotateOp }) ? annotateOp : undefined;\n\t}\n\t/**\n\t * Annotates the range with the provided properties\n\t * @param start - The inclusive start position of the range to annotate\n\t * @param end - The exclusive end position of the range to annotate\n\t * @param props - The properties to annotate the range with\n\t * @param combiningOp - Specifies how to combine values for the property, such as \"incr\" for increment.\n\t * @returns The annotate op if valid, otherwise undefined\n\t */\n\tpublic annotateRangeLocal(\n\t\tstart: number,\n\t\tend: number,\n\t\tprops: PropertySet,\n\t\tcombiningOp: ICombiningOp | undefined,\n\t): IMergeTreeAnnotateMsg | undefined {\n\t\tconst annotateOp = createAnnotateRangeOp(start, end, props, combiningOp);\n\n\t\tif (this.applyAnnotateRangeOp({ op: annotateOp })) {\n\t\t\treturn annotateOp;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Removes the range\n\t *\n\t * @param start - The inclusive start of the range to remove\n\t * @param end - The exclusive end of the range to remove\n\t */\n\tpublic removeRangeLocal(start: number, end: number): IMergeTreeRemoveMsg {\n\t\tconst removeOp = createRemoveRangeOp(start, end);\n\t\tthis.applyRemoveRangeOp({ op: removeOp });\n\t\treturn removeOp;\n\t}\n\n\t/**\n\t * @param pos - The position to insert the segment at\n\t * @param segment - The segment to insert\n\t */\n\tpublic insertSegmentLocal(pos: number, segment: ISegment): IMergeTreeInsertMsg | undefined {\n\t\tif (segment.cachedLength <= 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst insertOp = createInsertSegmentOp(pos, segment);\n\t\tif (this.applyInsertOp({ op: insertOp })) {\n\t\t\treturn insertOp;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * @param refPos - The reference position to insert the segment at\n\t * @param segment - The segment to insert\n\t */\n\tpublic insertAtReferencePositionLocal(\n\t\trefPos: ReferencePosition,\n\t\tsegment: ISegment,\n\t): IMergeTreeInsertMsg | undefined {\n\t\tconst pos = this._mergeTree.referencePositionToLocalPosition(\n\t\t\trefPos,\n\t\t\tthis.getCurrentSeq(),\n\t\t\tthis.getClientId(),\n\t\t);\n\n\t\tif (pos === DetachedReferencePosition) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst op = createInsertSegmentOp(pos, segment);\n\n\t\tif (this.applyInsertOp({ op })) {\n\t\t\treturn op;\n\t\t}\n\t}\n\n\tpublic walkSegments<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\tstart: number | undefined,\n\t\tend: number | undefined,\n\t\taccum: TClientData,\n\t\tsplitRange?: boolean,\n\t): void;\n\tpublic walkSegments<undefined>(\n\t\thandler: ISegmentAction<undefined>,\n\t\tstart?: number,\n\t\tend?: number,\n\t\taccum?: undefined,\n\t\tsplitRange?: boolean,\n\t): void;\n\tpublic walkSegments<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\tstart: number | undefined,\n\t\tend: number | undefined,\n\t\taccum: TClientData,\n\t\tsplitRange: boolean = false,\n\t): void {\n\t\tthis._mergeTree.mapRange(\n\t\t\thandler,\n\t\t\tthis.getCurrentSeq(),\n\t\t\tthis.getClientId(),\n\t\t\taccum,\n\t\t\tstart,\n\t\t\tend,\n\t\t\tsplitRange,\n\t\t);\n\t}\n\n\tprotected walkAllSegments<TClientData>(\n\t\taction: (segment: ISegment, accum?: TClientData) => boolean,\n\t\taccum?: TClientData,\n\t): boolean {\n\t\treturn walkAllChildSegments(\n\t\t\tthis._mergeTree.root,\n\t\t\taccum === undefined ? action : (seg) => action(seg, accum),\n\t\t);\n\t}\n\n\t/**\n\t * Serializes the data required for garbage collection. The IFluidHandles stored in all segments that haven't\n\t * been removed represent routes to other objects. We serialize the data in these segments using the passed in\n\t * serializer which keeps track of all serialized handles.\n\t */\n\tpublic serializeGCData(\n\t\thandle: IFluidHandle,\n\t\thandleCollectingSerializer: IFluidSerializer,\n\t): void {\n\t\tlet localInserts = 0;\n\t\tlet localRemoves = 0;\n\t\twalkAllChildSegments(this._mergeTree.root, (seg) => {\n\t\t\tif (seg.seq === UnassignedSequenceNumber) {\n\t\t\t\tlocalInserts++;\n\t\t\t}\n\t\t\tif (seg.removedSeq === UnassignedSequenceNumber) {\n\t\t\t\tlocalRemoves++;\n\t\t\t}\n\t\t\t// Only serialize segments that have not been removed.\n\t\t\tif (seg.removedSeq === undefined) {\n\t\t\t\thandleCollectingSerializer.stringify(seg.clone().toJSONObject(), handle);\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t\tif (localInserts > 0 || localRemoves > 0) {\n\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\teventName: \"LocalEditsInProcessGCData\",\n\t\t\t\tlocalInserts,\n\t\t\t\tlocalRemoves,\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic getCollabWindow(): CollaborationWindow {\n\t\treturn this._mergeTree.collabWindow;\n\t}\n\n\t/**\n\t * Returns the current position of a segment, and -1 if the segment\n\t * does not exist in this merge tree\n\t * @param segment - The segment to get the position of\n\t */\n\tpublic getPosition(segment: ISegment | undefined, localSeq?: number): number {\n\t\tconst mergeSegment: IMergeLeaf | undefined = segment;\n\t\tif (mergeSegment?.parent === undefined) {\n\t\t\treturn -1;\n\t\t}\n\t\treturn this._mergeTree.getPosition(\n\t\t\tmergeSegment,\n\t\t\tthis.getCurrentSeq(),\n\t\t\tthis.getClientId(),\n\t\t\tlocalSeq,\n\t\t);\n\t}\n\n\t/**\n\t * Creates a `LocalReferencePosition` on this client. If the refType does not include ReferenceType.Transient,\n\t * the returned reference will be added to the localRefs on the provided segment.\n\t * @param segment - Segment to add the local reference on\n\t * @param offset - Offset on the segment at which to place the local reference\n\t * @param refType - ReferenceType for the created local reference\n\t * @param properties - PropertySet to place on the created local reference\n\t */\n\tpublic createLocalReferencePosition(\n\t\tsegment: ISegment,\n\t\toffset: number | undefined,\n\t\trefType: ReferenceType,\n\t\tproperties: PropertySet | undefined,\n\t\tslidingPreference?: SlidingPreference,\n\t): LocalReferencePosition {\n\t\treturn this._mergeTree.createLocalReferencePosition(\n\t\t\tsegment,\n\t\t\toffset ?? 0,\n\t\t\trefType,\n\t\t\tproperties,\n\t\t\tslidingPreference,\n\t\t);\n\t}\n\n\t/**\n\t * Removes a `LocalReferencePosition` from this client.\n\t */\n\tpublic removeLocalReferencePosition(lref: LocalReferencePosition) {\n\t\treturn this._mergeTree.removeLocalReferencePosition(lref);\n\t}\n\n\t/**\n\t * Resolves a `ReferencePosition` into a character position using this client's perspective.\n\t */\n\tpublic localReferencePositionToPosition(lref: ReferencePosition): number {\n\t\treturn this._mergeTree.referencePositionToLocalPosition(lref);\n\t}\n\n\t/**\n\t * Given a position specified relative to a marker id, lookup the marker\n\t * and convert the position to a character position.\n\t * @param relativePos - Id of marker (may be indirect) and whether position is before or after marker.\n\t */\n\tpublic posFromRelativePos(relativePos: IRelativePosition) {\n\t\treturn this._mergeTree.posFromRelativePos(relativePos);\n\t}\n\n\tpublic getMarkerFromId(id: string): ISegment | undefined {\n\t\treturn this._mergeTree.getMarkerFromId(id);\n\t}\n\n\t/**\n\t * Revert an op\n\t */\n\tpublic rollback?(op: any, localOpMetadata: unknown) {\n\t\tthis._mergeTree.rollback(op as IMergeTreeDeltaOp, localOpMetadata as SegmentGroup);\n\t}\n\n\t/**\n\t * Performs the remove based on the provided op\n\t * @param opArgs - The ops args for the op\n\t * @returns True if the remove was applied. False if it could not be.\n\t */\n\tprivate applyRemoveRangeOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n\t\tassert(\n\t\t\topArgs.op.type === MergeTreeDeltaType.REMOVE,\n\t\t\t0x02d /* \"Unexpected op type on range remove!\" */,\n\t\t);\n\t\tconst op = opArgs.op;\n\t\tconst clientArgs = this.getClientSequenceArgs(opArgs);\n\t\tconst range = this.getValidOpRange(op, clientArgs);\n\n\t\tthis._mergeTree.markRangeRemoved(\n\t\t\trange.start,\n\t\t\trange.end,\n\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\tclientArgs.clientId,\n\t\t\tclientArgs.sequenceNumber,\n\t\t\tfalse,\n\t\t\topArgs,\n\t\t);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Performs the annotate based on the provided op\n\t * @param opArgs - The ops args for the op\n\t * @returns True if the annotate was applied. False if it could not be.\n\t */\n\tprivate applyAnnotateRangeOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n\t\tassert(\n\t\t\topArgs.op.type === MergeTreeDeltaType.ANNOTATE,\n\t\t\t0x02e /* \"Unexpected op type on range annotate!\" */,\n\t\t);\n\t\tconst op = opArgs.op;\n\t\tconst clientArgs = this.getClientSequenceArgs(opArgs);\n\t\tconst range = this.getValidOpRange(op, clientArgs);\n\n\t\tif (!range) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis._mergeTree.annotateRange(\n\t\t\trange.start,\n\t\t\trange.end,\n\t\t\top.props,\n\t\t\top.combiningOp,\n\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\tclientArgs.clientId,\n\t\t\tclientArgs.sequenceNumber,\n\t\t\topArgs,\n\t\t);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Performs the insert based on the provided op\n\t * @param opArgs - The ops args for the op\n\t * @returns True if the insert was applied. False if it could not be.\n\t */\n\tprivate applyInsertOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n\t\tassert(\n\t\t\topArgs.op.type === MergeTreeDeltaType.INSERT,\n\t\t\t0x02f /* \"Unexpected op type on range insert!\" */,\n\t\t);\n\t\tconst op = opArgs.op;\n\t\tconst clientArgs = this.getClientSequenceArgs(opArgs);\n\t\tconst range = this.getValidOpRange(op, clientArgs);\n\n\t\tif (!range) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet segments: ISegment[] | undefined;\n\t\tif (op.seg) {\n\t\t\tsegments = [this.specToSegment(op.seg)];\n\t\t}\n\n\t\tif (!segments || segments.length === 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis._mergeTree.insertSegments(\n\t\t\trange.start,\n\t\t\tsegments,\n\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\tclientArgs.clientId,\n\t\t\tclientArgs.sequenceNumber,\n\t\t\topArgs,\n\t\t);\n\t\treturn true;\n\t}\n\n\t/**\n\t * Returns a valid range for the op, or undefined\n\t * @param op - The op to generate the range for\n\t * @param clientArgs - The client args for the op\n\t */\n\tprivate getValidOpRange(\n\t\top: IMergeTreeAnnotateMsg | IMergeTreeInsertMsg | IMergeTreeRemoveMsg,\n\t\tclientArgs: IMergeTreeClientSequenceArgs,\n\t): IIntegerRange {\n\t\tlet start: number | undefined = op.pos1;\n\t\tif (start === undefined && op.relativePos1) {\n\t\t\tstart = this._mergeTree.posFromRelativePos(\n\t\t\t\top.relativePos1,\n\t\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\t\tclientArgs.clientId,\n\t\t\t);\n\t\t}\n\n\t\tlet end: number | undefined = op.pos2;\n\t\tif (end === undefined && op.relativePos2) {\n\t\t\tend = this._mergeTree.posFromRelativePos(\n\t\t\t\top.relativePos2,\n\t\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\t\tclientArgs.clientId,\n\t\t\t);\n\t\t}\n\n\t\t// Validate if local op\n\t\tif (clientArgs.clientId === this.getClientId()) {\n\t\t\tconst length = this.getLength();\n\n\t\t\tconst invalidPositions: string[] = [];\n\n\t\t\t// Validate start position\n\t\t\t//\n\t\t\tif (\n\t\t\t\tstart === undefined ||\n\t\t\t\tstart < 0 ||\n\t\t\t\tstart > length ||\n\t\t\t\t(start === length && op.type !== MergeTreeDeltaType.INSERT)\n\t\t\t) {\n\t\t\t\tinvalidPositions.push(\"start\");\n\t\t\t}\n\t\t\t// Validate end if not insert, or insert has end\n\t\t\t//\n\t\t\tif (op.type !== MergeTreeDeltaType.INSERT || end !== undefined) {\n\t\t\t\tif (end === undefined || end <= start!) {\n\t\t\t\t\tinvalidPositions.push(\"end\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (invalidPositions.length > 0) {\n\t\t\t\tthrow new LoggingError(\"RangeOutOfBounds\", {\n\t\t\t\t\tusageError: true,\n\t\t\t\t\tend,\n\t\t\t\t\tinvalidPositions: invalidPositions.toString(),\n\t\t\t\t\tlength,\n\t\t\t\t\topPos1: op.pos1,\n\t\t\t\t\topPos1Relative: op.relativePos1 !== undefined,\n\t\t\t\t\topPos2: op.pos2,\n\t\t\t\t\topPos2Relative: op.relativePos2 !== undefined,\n\t\t\t\t\topType: op.type,\n\t\t\t\t\tstart,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// start and end are guaranteed to be non-null here, otherwise we throw above.\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\treturn { start, end } as IIntegerRange;\n\t}\n\n\t/**\n\t * Gets the client args from the op if remote, otherwise uses the local clients info\n\t * @param sequencedMessage - The sequencedMessage to get the client sequence args for\n\t */\n\tprivate getClientSequenceArgsForMessage(\n\t\tsequencedMessage:\n\t\t\t| ISequencedDocumentMessage\n\t\t\t| Pick<ISequencedDocumentMessage, \"referenceSequenceNumber\" | \"clientId\">\n\t\t\t| undefined,\n\t) {\n\t\t// If there this no sequenced message, then the op is local\n\t\t// and unacked, so use this clients sequenced args\n\t\t//\n\t\tif (!sequencedMessage) {\n\t\t\tconst segWindow = this.getCollabWindow();\n\t\t\treturn {\n\t\t\t\tclientId: segWindow.clientId,\n\t\t\t\treferenceSequenceNumber: segWindow.currentSeq,\n\t\t\t\tsequenceNumber: this.getLocalSequenceNumber(),\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tclientId: this.getOrAddShortClientIdFromMessage(sequencedMessage),\n\t\t\t\treferenceSequenceNumber: sequencedMessage.referenceSequenceNumber,\n\t\t\t\t// Note: return value satisfies overload signatures despite the cast, as if input argument doesn't contain sequenceNumber,\n\t\t\t\t// return value isn't expected to have it either.\n\t\t\t\tsequenceNumber: (sequencedMessage as ISequencedDocumentMessage).sequenceNumber,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Gets the client args from the op if remote, otherwise uses the local clients info\n\t * @param opArgs - The op arg to get the client sequence args for\n\t */\n\tprivate getClientSequenceArgs(opArgs: IMergeTreeDeltaOpArgs): IMergeTreeClientSequenceArgs {\n\t\treturn this.getClientSequenceArgsForMessage(opArgs.sequencedMessage);\n\t}\n\n\tprivate ackPendingSegment(opArgs: IMergeTreeDeltaRemoteOpArgs) {\n\t\tconst ackOp = (deltaOpArgs: IMergeTreeDeltaRemoteOpArgs) => {\n\t\t\tthis._mergeTree.ackPendingSegment(deltaOpArgs);\n\t\t\tif (deltaOpArgs.op.type === MergeTreeDeltaType.ANNOTATE) {\n\t\t\t\tif (deltaOpArgs.op.combiningOp && deltaOpArgs.op.combiningOp.name === \"consensus\") {\n\t\t\t\t\tthis.updateConsensusProperty(deltaOpArgs.op, deltaOpArgs.sequencedMessage);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (opArgs.op.type === MergeTreeDeltaType.GROUP) {\n\t\t\tfor (const memberOp of opArgs.op.ops) {\n\t\t\t\tackOp({\n\t\t\t\t\tgroupOp: opArgs.op,\n\t\t\t\t\top: memberOp,\n\t\t\t\t\tsequencedMessage: opArgs.sequencedMessage,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tackOp(opArgs);\n\t\t}\n\t}\n\n\t// as functions are modified move them above the eslint-disabled waterline and lint them\n\n\tcloneFromSegments() {\n\t\tconst clone = new Client(this.specToSegment, this.logger, this._mergeTree.options);\n\t\tconst segments: ISegment[] = [];\n\t\tconst newRoot = this._mergeTree.blockClone(this._mergeTree.root, segments);\n\t\tclone._mergeTree.root = newRoot;\n\t\treturn clone;\n\t}\n\tgetOrAddShortClientId(longClientId: string) {\n\t\tif (!this.clientNameToIds.get(longClientId)) {\n\t\t\tthis.addLongClientId(longClientId);\n\t\t}\n\t\treturn this.getShortClientId(longClientId);\n\t}\n\n\tgetShortClientId(longClientId: string) {\n\t\treturn this.clientNameToIds.get(longClientId)!.data;\n\t}\n\tgetLongClientId(shortClientId: number) {\n\t\treturn shortClientId >= 0 ? this.shortClientIdMap[shortClientId] : \"original\";\n\t}\n\taddLongClientId(longClientId: string) {\n\t\tthis.clientNameToIds.put(longClientId, this.shortClientIdMap.length);\n\t\tthis.shortClientIdMap.push(longClientId);\n\t}\n\tprivate getOrAddShortClientIdFromMessage(msg: Pick<ISequencedDocumentMessage, \"clientId\">) {\n\t\treturn this.getOrAddShortClientId(msg.clientId ?? \"server\");\n\t}\n\n\t/**\n\t * During reconnect, we must find the positions to pending segments\n\t * relative to other pending segments. This methods computes that\n\t * position relative to a localSeq. Pending segments above the localSeq\n\t * will be ignored.\n\t *\n\t * @param segment - The segment to find the position for\n\t * @param localSeq - The localSeq to find the position of the segment at\n\t */\n\tpublic findReconnectionPosition(segment: ISegment, localSeq: number) {\n\t\tassert(\n\t\t\tlocalSeq <= this._mergeTree.collabWindow.localSeq,\n\t\t\t0x032 /* \"localSeq greater than collab window\" */,\n\t\t);\n\t\tconst { currentSeq, clientId } = this.getCollabWindow();\n\t\treturn this._mergeTree.getPosition(segment, currentSeq, clientId, localSeq);\n\t}\n\n\tprivate resetPendingDeltaToOps(\n\t\tresetOp: IMergeTreeDeltaOp,\n\t\tsegmentGroup: SegmentGroup,\n\t): IMergeTreeDeltaOp[] {\n\t\tassert(!!segmentGroup, 0x033 /* \"Segment group undefined\" */);\n\t\tconst NACKedSegmentGroup = this.pendingRebase?.shift()?.data;\n\t\tassert(\n\t\t\tsegmentGroup === NACKedSegmentGroup,\n\t\t\t0x034 /* \"Segment group not at head of pending rebase queue\" */,\n\t\t);\n\t\tif (this.pendingRebase?.empty) {\n\t\t\tthis.pendingRebase = undefined;\n\t\t}\n\n\t\tconst opList: IMergeTreeDeltaOp[] = [];\n\t\t// We need to sort the segments by ordinal, as the segments are not sorted in the segment group.\n\t\t// The reason they need them sorted, as they have the same local sequence number and which means\n\t\t// farther segments will take into account nearer segments when calculating their position.\n\t\t// By sorting we ensure the nearer segment will be applied and sequenced before the farther segments\n\t\t// so their recalculated positions will be correct.\n\t\tfor (const segment of segmentGroup.segments.sort((a, b) =>\n\t\t\ta.ordinal < b.ordinal ? -1 : 1,\n\t\t)) {\n\t\t\tconst segmentSegGroup = segment.segmentGroups.dequeue();\n\t\t\tassert(\n\t\t\t\tsegmentGroup === segmentSegGroup,\n\t\t\t\t0x035 /* \"Segment group not at head of segment pending queue\" */,\n\t\t\t);\n\t\t\tconst segmentPosition = this.findReconnectionPosition(segment, segmentGroup.localSeq);\n\t\t\tlet newOp: IMergeTreeDeltaOp | undefined;\n\t\t\tswitch (resetOp.type) {\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE:\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsegment.propertyManager?.hasPendingProperties() === true,\n\t\t\t\t\t\t0x036 /* \"Segment has no pending properties\" */,\n\t\t\t\t\t);\n\t\t\t\t\t// if the segment has been removed, there's no need to send the annotate op\n\t\t\t\t\t// unless the remove was local, in which case the annotate must have come\n\t\t\t\t\t// before the remove\n\t\t\t\t\tif (\n\t\t\t\t\t\tsegment.removedSeq === undefined ||\n\t\t\t\t\t\t(segment.localRemovedSeq !== undefined &&\n\t\t\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber)\n\t\t\t\t\t) {\n\t\t\t\t\t\tnewOp = createAnnotateRangeOp(\n\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t\tresetOp.props,\n\t\t\t\t\t\t\tresetOp.combiningOp,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MergeTreeDeltaType.INSERT:\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsegment.seq === UnassignedSequenceNumber,\n\t\t\t\t\t\t0x037 /* \"Segment already has assigned sequence number\" */,\n\t\t\t\t\t);\n\t\t\t\t\tlet segInsertOp = segment;\n\t\t\t\t\tif (typeof resetOp.seg === \"object\" && resetOp.seg.props !== undefined) {\n\t\t\t\t\t\tsegInsertOp = segment.clone();\n\t\t\t\t\t\tsegInsertOp.properties = resetOp.seg.props;\n\t\t\t\t\t}\n\t\t\t\t\tnewOp = createInsertSegmentOp(segmentPosition, segInsertOp);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MergeTreeDeltaType.REMOVE:\n\t\t\t\t\tif (\n\t\t\t\t\t\tsegment.localRemovedSeq !== undefined &&\n\t\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber\n\t\t\t\t\t) {\n\t\t\t\t\t\tnewOp = createRemoveRangeOp(\n\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Invalid op type`);\n\t\t\t}\n\n\t\t\tif (newOp) {\n\t\t\t\tconst newSegmentGroup: SegmentGroup = {\n\t\t\t\t\tsegments: [],\n\t\t\t\t\tlocalSeq: segmentGroup.localSeq,\n\t\t\t\t\trefSeq: this.getCollabWindow().currentSeq,\n\t\t\t\t};\n\t\t\t\tsegment.segmentGroups.enqueue(newSegmentGroup);\n\t\t\t\tthis._mergeTree.pendingSegments.push(newSegmentGroup);\n\t\t\t\topList.push(newOp);\n\t\t\t}\n\t\t}\n\n\t\treturn opList;\n\t}\n\n\tprivate applyRemoteOp(opArgs: IMergeTreeDeltaRemoteOpArgs) {\n\t\tconst op = opArgs.op;\n\t\tconst msg = opArgs.sequencedMessage;\n\t\tthis.getOrAddShortClientIdFromMessage(msg);\n\t\tswitch (op.type) {\n\t\t\tcase MergeTreeDeltaType.INSERT:\n\t\t\t\tthis.applyInsertOp(opArgs);\n\t\t\t\tbreak;\n\t\t\tcase MergeTreeDeltaType.REMOVE:\n\t\t\t\tthis.applyRemoveRangeOp(opArgs);\n\t\t\t\tbreak;\n\t\t\tcase MergeTreeDeltaType.ANNOTATE:\n\t\t\t\tthis.applyAnnotateRangeOp(opArgs);\n\t\t\t\tbreak;\n\t\t\tcase MergeTreeDeltaType.GROUP: {\n\t\t\t\tfor (const memberOp of op.ops) {\n\t\t\t\t\tthis.applyRemoteOp({\n\t\t\t\t\t\top: memberOp,\n\t\t\t\t\t\tgroupOp: op,\n\t\t\t\t\t\tsequencedMessage: msg,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpublic applyStashedOp(op: IMergeTreeDeltaOp): SegmentGroup;\n\tpublic applyStashedOp(op: IMergeTreeGroupMsg): SegmentGroup[];\n\tpublic applyStashedOp(op: IMergeTreeOp): SegmentGroup | SegmentGroup[];\n\tpublic applyStashedOp(op: IMergeTreeOp): SegmentGroup | SegmentGroup[] {\n\t\tlet metadata: SegmentGroup | SegmentGroup[] | undefined;\n\t\tconst stashed = true;\n\t\tswitch (op.type) {\n\t\t\tcase MergeTreeDeltaType.INSERT:\n\t\t\t\tthis.applyInsertOp({ op, stashed });\n\t\t\t\tmetadata = this.peekPendingSegmentGroups();\n\t\t\t\tbreak;\n\t\t\tcase MergeTreeDeltaType.REMOVE:\n\t\t\t\tthis.applyRemoveRangeOp({ op, stashed });\n\t\t\t\tmetadata = this.peekPendingSegmentGroups();\n\t\t\t\tbreak;\n\t\t\tcase MergeTreeDeltaType.ANNOTATE:\n\t\t\t\tthis.applyAnnotateRangeOp({ op, stashed });\n\t\t\t\tmetadata = this.peekPendingSegmentGroups();\n\t\t\t\tbreak;\n\t\t\tcase MergeTreeDeltaType.GROUP:\n\t\t\t\treturn op.ops.map((o) => this.applyStashedOp(o));\n\t\t\tdefault:\n\t\t\t\tunreachableCase(op, \"unrecognized op type\");\n\t\t}\n\t\tassert(!!metadata, 0x2db /* \"Applying op must generate a pending segment\" */);\n\t\treturn metadata;\n\t}\n\n\tpublic applyMsg(msg: ISequencedDocumentMessage, local: boolean = false) {\n\t\t// Ensure client ID is registered\n\t\tthis.getOrAddShortClientIdFromMessage(msg);\n\t\t// Apply if an operation message\n\t\tif (msg.type === MessageType.Operation) {\n\t\t\tconst opArgs: IMergeTreeDeltaRemoteOpArgs = {\n\t\t\t\top: msg.contents as IMergeTreeOp,\n\t\t\t\tsequencedMessage: msg,\n\t\t\t};\n\t\t\tif (opArgs.sequencedMessage?.clientId === this.longClientId || local) {\n\t\t\t\tthis.ackPendingSegment(opArgs);\n\t\t\t} else {\n\t\t\t\tthis.applyRemoteOp(opArgs);\n\t\t\t}\n\t\t}\n\n\t\tthis.updateSeqNumbers(msg.minimumSequenceNumber, msg.sequenceNumber);\n\t}\n\n\tpublic updateSeqNumbers(min: number, seq: number) {\n\t\tconst collabWindow = this.getCollabWindow();\n\t\t// Equal is fine here due to SharedSegmentSequence<>.snapshotContent() potentially updating with same #\n\t\tassert(\n\t\t\tcollabWindow.currentSeq <= seq,\n\t\t\t0x038 /* \"Incoming op sequence# < local collabWindow's currentSequence#\" */,\n\t\t);\n\t\tcollabWindow.currentSeq = seq;\n\t\tassert(min <= seq, 0x039 /* \"Incoming op sequence# < minSequence#\" */);\n\t\tthis.updateMinSeq(min);\n\t}\n\n\t/**\n\t * Resolves a remote client's position against the local sequence\n\t * and returns the remote client's position relative to the local\n\t * sequence\n\t * @param remoteClientPosition - The remote client's position to resolve\n\t * @param remoteClientRefSeq - The reference sequence number of the remote client\n\t * @param remoteClientId - The client id of the remote client\n\t */\n\tpublic resolveRemoteClientPosition(\n\t\tremoteClientPosition: number,\n\t\tremoteClientRefSeq: number,\n\t\tremoteClientId: string,\n\t): number | undefined {\n\t\tconst shortRemoteClientId = this.getOrAddShortClientId(remoteClientId);\n\t\treturn this._mergeTree.resolveRemoteClientPosition(\n\t\t\tremoteClientPosition,\n\t\t\tremoteClientRefSeq,\n\t\t\tshortRemoteClientId,\n\t\t);\n\t}\n\n\tprivate lastNormalizationRefSeq = 0;\n\n\tprivate pendingRebase: List<SegmentGroup> | undefined;\n\t/**\n\t * Given an pending operation and segment group, regenerate the op, so it\n\t * can be resubmitted\n\t * @param resetOp - The op to reset\n\t * @param segmentGroup - The segment group associated with the op\n\t */\n\tpublic regeneratePendingOp(\n\t\tresetOp: IMergeTreeOp,\n\t\tsegmentGroup: SegmentGroup | SegmentGroup[],\n\t): IMergeTreeOp {\n\t\tif (this.pendingRebase === undefined || this.pendingRebase.empty) {\n\t\t\tlet firstGroup: SegmentGroup;\n\t\t\tif (Array.isArray(segmentGroup)) {\n\t\t\t\tif (segmentGroup.length === 0) {\n\t\t\t\t\t// sometimes we rebase to an empty op\n\t\t\t\t\treturn createGroupOp();\n\t\t\t\t}\n\t\t\t\tfirstGroup = segmentGroup[0];\n\t\t\t} else {\n\t\t\t\tfirstGroup = segmentGroup;\n\t\t\t}\n\t\t\tconst firstGroupNode = this._mergeTree.pendingSegments.find(\n\t\t\t\t(node) => node.data === firstGroup,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tfirstGroupNode !== undefined,\n\t\t\t\t0x70e /* segment group must exist in pending list */,\n\t\t\t);\n\t\t\tthis.pendingRebase = this._mergeTree.pendingSegments.splice(firstGroupNode);\n\t\t}\n\n\t\tconst rebaseTo = this.getCollabWindow().currentSeq;\n\t\tif (rebaseTo !== this.lastNormalizationRefSeq) {\n\t\t\tthis.emit(\"normalize\", this);\n\t\t\tthis._mergeTree.normalizeSegmentsOnRebase();\n\t\t\tthis.lastNormalizationRefSeq = rebaseTo;\n\t\t}\n\n\t\tconst opList: IMergeTreeDeltaOp[] = [];\n\t\tif (resetOp.type === MergeTreeDeltaType.GROUP) {\n\t\t\tif (Array.isArray(segmentGroup)) {\n\t\t\t\tassert(\n\t\t\t\t\tresetOp.ops.length === segmentGroup.length,\n\t\t\t\t\t0x03a /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */,\n\t\t\t\t);\n\n\t\t\t\tfor (let i = 0; i < resetOp.ops.length; i++) {\n\t\t\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i]));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// A group op containing a single op will pass a direct reference to 'segmentGroup'\n\t\t\t\t// rather than an array of segment groups. (See 'peekPendingSegmentGroups()')\n\t\t\t\tassert(\n\t\t\t\t\tresetOp.ops.length === 1,\n\t\t\t\t\t0x03b /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */,\n\t\t\t\t);\n\t\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp.ops[0], segmentGroup));\n\t\t\t}\n\t\t} else {\n\t\t\tassert(\n\t\t\t\t(resetOp.type as any) !== MergeTreeDeltaType.GROUP,\n\t\t\t\t0x03c /* \"Reset op has 'group' delta type!\" */,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!Array.isArray(segmentGroup),\n\t\t\t\t0x03d /* \"segmentGroup is array rather than singleton!\" */,\n\t\t\t);\n\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp, segmentGroup));\n\t\t}\n\t\treturn opList.length === 1 ? opList[0] : createGroupOp(...opList);\n\t}\n\n\tpublic createTextHelper(): IMergeTreeTextHelper {\n\t\treturn new MergeTreeTextHelper(this._mergeTree);\n\t}\n\n\tpublic summarize(\n\t\truntime: IFluidDataStoreRuntime,\n\t\thandle: IFluidHandle,\n\t\tserializer: IFluidSerializer,\n\t\tcatchUpMsgs: ISequencedDocumentMessage[],\n\t): ISummaryTreeWithStats {\n\t\tconst deltaManager = runtime.deltaManager;\n\t\tconst minSeq = deltaManager.minimumSequenceNumber;\n\n\t\t// Catch up to latest MSN, if we have not had a chance to do it.\n\t\t// Required for case where FluidDataStoreRuntime.attachChannel()\n\t\t// generates summary right after loading data store.\n\n\t\tthis.updateSeqNumbers(minSeq, deltaManager.lastSequenceNumber);\n\n\t\t// One of the summaries (from SPO) I observed to have chunk.chunkSequenceNumber > minSeq!\n\t\t// Not sure why - need to catch it sooner\n\t\tassert(\n\t\t\tthis.getCollabWindow().minSeq === minSeq,\n\t\t\t0x03e /* \"minSeq mismatch between collab window and delta manager!\" */,\n\t\t);\n\n\t\t// Must continue to support legacy\n\t\t// (See https://github.com/microsoft/FluidFramework/issues/84)\n\t\tif (this._mergeTree.options?.newMergeTreeSnapshotFormat === true) {\n\t\t\tassert(\n\t\t\t\tcatchUpMsgs === undefined || catchUpMsgs.length === 0,\n\t\t\t\t0x03f /* \"New format should not emit catchup ops\" */,\n\t\t\t);\n\t\t\tconst snap = new SnapshotV1(this._mergeTree, this.logger, (id) =>\n\t\t\t\tthis.getLongClientId(id),\n\t\t\t);\n\t\t\tsnap.extractSync();\n\t\t\treturn snap.emit(serializer, handle);\n\t\t} else {\n\t\t\tconst snap = new SnapshotLegacy(this._mergeTree, this.logger);\n\t\t\tsnap.extractSync();\n\t\t\treturn snap.emit(catchUpMsgs, serializer, handle);\n\t\t}\n\t}\n\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tstorage: IChannelStorageService,\n\t\tserializer: IFluidSerializer,\n\t): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]> }> {\n\t\tconst loader = new SnapshotLoader(runtime, this, this._mergeTree, this.logger, serializer);\n\n\t\treturn loader.initialize(storage);\n\t}\n\n\tgetStackContext(startPos: number, rangeLabels: string[]): RangeStackMap {\n\t\treturn this._mergeTree.getStackContext(\n\t\t\tstartPos,\n\t\t\tthis.getCollabWindow().clientId,\n\t\t\trangeLabels,\n\t\t);\n\t}\n\n\tprivate getLocalSequenceNumber() {\n\t\tconst segWindow = this.getCollabWindow();\n\t\treturn segWindow.collaborating ? UnassignedSequenceNumber : UniversalSequenceNumber;\n\t}\n\tlocalTransaction(groupOp: IMergeTreeGroupMsg) {\n\t\tfor (const op of groupOp.ops) {\n\t\t\tconst opArgs: IMergeTreeDeltaOpArgs = {\n\t\t\t\top,\n\t\t\t\tgroupOp,\n\t\t\t};\n\t\t\tswitch (op.type) {\n\t\t\t\tcase MergeTreeDeltaType.INSERT:\n\t\t\t\t\tthis.applyInsertOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE:\n\t\t\t\t\tthis.applyAnnotateRangeOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\tcase MergeTreeDeltaType.REMOVE:\n\t\t\t\t\tthis.applyRemoveRangeOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tupdateConsensusProperty(op: IMergeTreeAnnotateMsg, msg: ISequencedDocumentMessage) {\n\t\tconst markerId = op.relativePos1!.id!;\n\t\tconst consensusInfo = this.pendingConsensus.get(markerId);\n\t\tif (consensusInfo) {\n\t\t\tconsensusInfo.marker.addProperties(op.props, op.combiningOp, msg.sequenceNumber);\n\t\t}\n\t\tthis._mergeTree.addMinSeqListener(msg.sequenceNumber, () =>\n\t\t\tconsensusInfo!.callback(consensusInfo!.marker),\n\t\t);\n\t}\n\n\tupdateMinSeq(minSeq: number) {\n\t\tthis._mergeTree.setMinSeq(minSeq);\n\t}\n\n\tgetContainingSegment<T extends ISegment>(\n\t\tpos: number,\n\t\tsequenceArgs?: Pick<ISequencedDocumentMessage, \"referenceSequenceNumber\" | \"clientId\">,\n\t\tlocalSeq?: number,\n\t) {\n\t\tconst { referenceSequenceNumber, clientId } =\n\t\t\tthis.getClientSequenceArgsForMessage(sequenceArgs);\n\t\treturn this._mergeTree.getContainingSegment<T>(\n\t\t\tpos,\n\t\t\treferenceSequenceNumber,\n\t\t\tclientId,\n\t\t\tlocalSeq,\n\t\t);\n\t}\n\n\tgetPropertiesAtPosition(pos: number) {\n\t\tlet propertiesAtPosition: PropertySet | undefined;\n\t\tconst segoff = this.getContainingSegment(pos);\n\t\tconst seg = segoff.segment;\n\t\tif (seg) {\n\t\t\tpropertiesAtPosition = seg.properties;\n\t\t}\n\t\treturn propertiesAtPosition;\n\t}\n\tgetRangeExtentsOfPosition(pos: number) {\n\t\tlet posStart: number | undefined;\n\t\tlet posAfterEnd: number | undefined;\n\n\t\tconst segoff = this.getContainingSegment(pos);\n\t\tconst seg = segoff.segment;\n\t\tif (seg) {\n\t\t\tposStart = this.getPosition(seg);\n\t\t\tposAfterEnd = posStart + seg.cachedLength;\n\t\t}\n\t\treturn { posStart, posAfterEnd };\n\t}\n\tgetCurrentSeq() {\n\t\treturn this.getCollabWindow().currentSeq;\n\t}\n\tgetClientId() {\n\t\treturn this.getCollabWindow().clientId;\n\t}\n\n\tgetLength() {\n\t\treturn this._mergeTree.length ?? 0;\n\t}\n\n\tstartOrUpdateCollaboration(longClientId: string | undefined, minSeq = 0, currentSeq = 0) {\n\t\t// we should always have a client id if we are collaborating\n\t\t// if the client id is undefined we are likely bound to a detached\n\t\t// container, so we should keep going in local mode. once\n\t\t// the container attaches this will be called again on connect with the\n\t\t// client id\n\t\tif (longClientId !== undefined) {\n\t\t\tif (this.longClientId === undefined) {\n\t\t\t\tthis.longClientId = longClientId;\n\t\t\t\tthis.addLongClientId(this.longClientId);\n\t\t\t\tthis._mergeTree.startCollaboration(\n\t\t\t\t\tthis.getShortClientId(this.longClientId),\n\t\t\t\t\tminSeq,\n\t\t\t\t\tcurrentSeq,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst oldClientId = this.longClientId;\n\t\t\t\tconst oldData = this.clientNameToIds.get(oldClientId)!.data;\n\t\t\t\tthis.longClientId = longClientId;\n\t\t\t\tthis.clientNameToIds.put(longClientId, oldData);\n\t\t\t\tthis.shortClientIdMap[oldData] = longClientId;\n\t\t\t}\n\t\t}\n\t}\n\n\tfindTile(startPos: number, tileLabel: string, preceding = true) {\n\t\tconst clientId = this.getClientId();\n\t\treturn this._mergeTree.findTile(startPos, clientId, tileLabel, preceding);\n\t}\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAMH,+EAA8F;AAM9F,+DAA0F;AAC1F,qEAAgG;AAGhG,+CAAmD;AACnD,2CAAgF;AAEhF,qDAS0B;AAK1B,2CAOqB;AACrB,+BAae;AAEf,qDAAkD;AAClD,qDAAkD;AAElD,6CAA0C;AAC1C,6DAAmG;AACnG,2CAAwC;AACxC,+DAA4D;AAC5D,2DAA2D;AAiC3D,MAAa,MAAO,SAAQ,gCAAgC;IAS3D;IACC,8FAA8F;IAC9E,aAA+C,EAC/C,MAA2B,EAC3C,OAAqB;QAErB,KAAK,EAAE,CAAC;QAJQ,kBAAa,GAAb,aAAa,CAAkC;QAC/C,WAAM,GAAN,MAAM,CAAqB;QAP3B,oBAAe,GAAG,IAAI,0BAAY,CAAiB,+BAAc,CAAC,CAAC;QACnE,qBAAgB,GAAa,EAAE,CAAC;QAChC,qBAAgB,GAAG,IAAI,GAAG,EAA0B,CAAC;QA0yB9D,4BAAuB,GAAG,CAAC,CAAC;QAjyBnC,IAAI,CAAC,UAAU,GAAG,IAAI,qBAAS,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,CAAC,sBAAsB,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;YAC9D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAC7C,CAAC,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,4BAA4B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAC/D,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC,CAAC;QAEF,IAAI,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC;YAClD,IAAI,MAAM,KAAK,SAAS,EAAE;gBACzB,MAAM,IAAI,4BAAU,CACnB,6EAA6E,CAC7E,CAAC;aACF;YACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SACpB;IACF,CAAC;IAED;;;;;;OAMG;IACI,wBAAwB,CAAC,QAAgB,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;QAChD,IAAI,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC;QACzB,IAAI,KAAK,KAAK,CAAC,IAAI,OAAO,KAAK,SAAS,EAAE;YACzC,OAAO,IAAI,EAAE,IAAI,CAAC;SAClB;QACD,MAAM,KAAK,GAAmB,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3C,KAAK,CAAC,CAAC,CAAC,GAAG,IAAK,CAAC,IAAI,CAAC;YACtB,IAAI,GAAG,IAAK,CAAC,IAAI,CAAC;SAClB;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACI,6BAA6B,CACnC,MAAc,EACd,KAAkB,EAClB,iBAAsC;QAEtC,MAAM,WAAW,GAAiB;YACjC,IAAI,EAAE,WAAW;SACjB,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAEnE,IAAI,UAAU,EAAE;YACf,MAAM,aAAa,GAAmB;gBACrC,QAAQ,EAAE,iBAAiB;gBAC3B,MAAM;aACN,CAAC;YACF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAG,EAAE,aAAa,CAAC,CAAC;YAC1D,OAAO,UAAU,CAAC;SAClB;aAAM;YACN,OAAO,SAAS,CAAC;SACjB;IACF,CAAC;IACD;;;;;;OAMG;IACI,cAAc,CACpB,MAAc,EACd,KAAkB,EAClB,WAA0B;QAE1B,MAAM,UAAU,GAAG,IAAA,kCAAsB,EAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAE,CAAC;QAEvE,OAAO,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,CAAC;IACD;;;;;;;OAOG;IACI,kBAAkB,CACxB,KAAa,EACb,GAAW,EACX,KAAkB,EAClB,WAAqC;QAErC,MAAM,UAAU,GAAG,IAAA,iCAAqB,EAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAEzE,IAAI,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;YAClD,OAAO,UAAU,CAAC;SAClB;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACI,gBAAgB,CAAC,KAAa,EAAE,GAAW;QACjD,MAAM,QAAQ,GAAG,IAAA,+BAAmB,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1C,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED;;;OAGG;IACI,kBAAkB,CAAC,GAAW,EAAE,OAAiB;QACvD,IAAI,OAAO,CAAC,YAAY,IAAI,CAAC,EAAE;YAC9B,OAAO,SAAS,CAAC;SACjB;QACD,MAAM,QAAQ,GAAG,IAAA,iCAAqB,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;YACzC,OAAO,QAAQ,CAAC;SAChB;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;;OAGG;IACI,8BAA8B,CACpC,MAAyB,EACzB,OAAiB;QAEjB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,gCAAgC,CAC3D,MAAM,EACN,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,WAAW,EAAE,CAClB,CAAC;QAEF,IAAI,GAAG,KAAK,8CAAyB,EAAE;YACtC,OAAO,SAAS,CAAC;SACjB;QACD,MAAM,EAAE,GAAG,IAAA,iCAAqB,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAE/C,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;YAC/B,OAAO,EAAE,CAAC;SACV;IACF,CAAC;IAgBM,YAAY,CAClB,OAAoC,EACpC,KAAyB,EACzB,GAAuB,EACvB,KAAkB,EAClB,aAAsB,KAAK;QAE3B,IAAI,CAAC,UAAU,CAAC,QAAQ,CACvB,OAAO,EACP,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,WAAW,EAAE,EAClB,KAAK,EACL,KAAK,EACL,GAAG,EACH,UAAU,CACV,CAAC;IACH,CAAC;IAES,eAAe,CACxB,MAA2D,EAC3D,KAAmB;QAEnB,OAAO,IAAA,wCAAoB,EAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,EACpB,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAC1D,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,eAAe,CACrB,MAAoB,EACpB,0BAA4C;QAE5C,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAA,wCAAoB,EAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YAClD,IAAI,GAAG,CAAC,GAAG,KAAK,oCAAwB,EAAE;gBACzC,YAAY,EAAE,CAAC;aACf;YACD,IAAI,GAAG,CAAC,UAAU,KAAK,oCAAwB,EAAE;gBAChD,YAAY,EAAE,CAAC;aACf;YACD,sDAAsD;YACtD,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE;gBACjC,0BAA0B,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC;aACzE;YACD,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;QAEH,IAAI,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE;YACzC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;gBAC1B,SAAS,EAAE,2BAA2B;gBACtC,YAAY;gBACZ,YAAY;aACZ,CAAC,CAAC;SACH;IACF,CAAC;IAEM,eAAe;QACrB,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,OAA6B,EAAE,QAAiB;QAClE,MAAM,YAAY,GAA2B,OAAO,CAAC;QACrD,IAAI,YAAY,EAAE,MAAM,KAAK,SAAS,EAAE;YACvC,OAAO,CAAC,CAAC,CAAC;SACV;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CACjC,YAAY,EACZ,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,WAAW,EAAE,EAClB,QAAQ,CACR,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACI,4BAA4B,CAClC,OAAiB,EACjB,MAA0B,EAC1B,OAAsB,EACtB,UAAmC,EACnC,iBAAqC;QAErC,OAAO,IAAI,CAAC,UAAU,CAAC,4BAA4B,CAClD,OAAO,EACP,MAAM,IAAI,CAAC,EACX,OAAO,EACP,UAAU,EACV,iBAAiB,CACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACI,4BAA4B,CAAC,IAA4B;QAC/D,OAAO,IAAI,CAAC,UAAU,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACI,gCAAgC,CAAC,IAAuB;QAC9D,OAAO,IAAI,CAAC,UAAU,CAAC,gCAAgC,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAC,WAA8B;QACvD,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACxD,CAAC;IAEM,eAAe,CAAC,EAAU;QAChC,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACI,QAAQ,CAAE,EAAO,EAAE,eAAwB;QACjD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAuB,EAAE,eAA+B,CAAC,CAAC;IACpF,CAAC;IAED;;;;OAIG;IACK,kBAAkB,CAAC,MAA6B;QACvD,IAAA,qBAAM,EACL,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,wBAAkB,CAAC,MAAM,EAC5C,KAAK,CAAC,2CAA2C,CACjD,CAAC;QACF,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAEnD,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAC/B,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,GAAG,EACT,UAAU,CAAC,uBAAuB,EAClC,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,cAAc,EACzB,KAAK,EACL,MAAM,CACN,CAAC;QAEF,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;OAIG;IACK,oBAAoB,CAAC,MAA6B;QACzD,IAAA,qBAAM,EACL,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,wBAAkB,CAAC,QAAQ,EAC9C,KAAK,CAAC,6CAA6C,CACnD,CAAC;QACF,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAEnD,IAAI,CAAC,KAAK,EAAE;YACX,OAAO,KAAK,CAAC;SACb;QAED,IAAI,CAAC,UAAU,CAAC,aAAa,CAC5B,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,GAAG,EACT,EAAE,CAAC,KAAK,EACR,EAAE,CAAC,WAAW,EACd,UAAU,CAAC,uBAAuB,EAClC,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,cAAc,EACzB,MAAM,CACN,CAAC;QAEF,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;OAIG;IACK,aAAa,CAAC,MAA6B;QAClD,IAAA,qBAAM,EACL,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,wBAAkB,CAAC,MAAM,EAC5C,KAAK,CAAC,2CAA2C,CACjD,CAAC;QACF,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAEnD,IAAI,CAAC,KAAK,EAAE;YACX,OAAO,KAAK,CAAC;SACb;QAED,IAAI,QAAgC,CAAC;QACrC,IAAI,EAAE,CAAC,GAAG,EAAE;YACX,QAAQ,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SACxC;QAED,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACvC,OAAO,KAAK,CAAC;SACb;QAED,IAAI,CAAC,UAAU,CAAC,cAAc,CAC7B,KAAK,CAAC,KAAK,EACX,QAAQ,EACR,UAAU,CAAC,uBAAuB,EAClC,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,cAAc,EACzB,MAAM,CACN,CAAC;QACF,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;OAIG;IACK,eAAe,CACtB,EAAqE,EACrE,UAAwC;QAGxC,IAAI,KAAK,GAAuB,EAAE,CAAC,IAAI,CAAC;QACxC,IAAI,KAAK,KAAK,SAAS,IAAI,EAAE,CAAC,YAAY,EAAE;YAC3C,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,CACzC,EAAE,CAAC,YAAY,EACf,UAAU,CAAC,uBAAuB,EAClC,UAAU,CAAC,QAAQ,CACnB,CAAC;SACF;QAED,IAAI,GAAG,GAAuB,EAAE,CAAC,IAAI,CAAC;QACtC,IAAI,GAAG,KAAK,SAAS,IAAI,EAAE,CAAC,YAAY,EAAE;YACzC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,CACvC,EAAE,CAAC,YAAY,EACf,UAAU,CAAC,uBAAuB,EAClC,UAAU,CAAC,QAAQ,CACnB,CAAC;SACF;QAED,uBAAuB;QACvB,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAEhC,MAAM,gBAAgB,GAAa,EAAE,CAAC;YAEtC,0BAA0B;YAC1B,EAAE;YACF,IACC,KAAK,KAAK,SAAS;gBACnB,KAAK,GAAG,CAAC;gBACT,KAAK,GAAG,MAAM;gBACd,CAAC,KAAK,KAAK,MAAM,IAAI,EAAE,CAAC,IAAI,KAAK,wBAAkB,CAAC,MAAM,CAAC,EAC1D;gBACD,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAC/B;YACD,gDAAgD;YAChD,EAAE;YACF,IAAI,EAAE,CAAC,IAAI,KAAK,wBAAkB,CAAC,MAAM,IAAI,GAAG,KAAK,SAAS,EAAE;gBAC/D,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,IAAI,KAAM,EAAE;oBACvC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBAC7B;aACD;YAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;gBAChC,MAAM,IAAI,8BAAY,CAAC,kBAAkB,EAAE;oBAC1C,UAAU,EAAE,IAAI;oBAChB,GAAG;oBACH,gBAAgB,EAAE,gBAAgB,CAAC,QAAQ,EAAE;oBAC7C,MAAM;oBACN,MAAM,EAAE,EAAE,CAAC,IAAI;oBACf,cAAc,EAAE,EAAE,CAAC,YAAY,KAAK,SAAS;oBAC7C,MAAM,EAAE,EAAE,CAAC,IAAI;oBACf,cAAc,EAAE,EAAE,CAAC,YAAY,KAAK,SAAS;oBAC7C,MAAM,EAAE,EAAE,CAAC,IAAI;oBACf,KAAK;iBACL,CAAC,CAAC;aACH;SACD;QAED,8EAA8E;QAC9E,+FAA+F;QAC/F,OAAO,EAAE,KAAK,EAAE,GAAG,EAAmB,CAAC;IACxC,CAAC;IAED;;;OAGG;IACK,+BAA+B,CACtC,gBAGY;QAEZ,2DAA2D;QAC3D,kDAAkD;QAClD,EAAE;QACF,IAAI,CAAC,gBAAgB,EAAE;YACtB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACzC,OAAO;gBACN,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,uBAAuB,EAAE,SAAS,CAAC,UAAU;gBAC7C,cAAc,EAAE,IAAI,CAAC,sBAAsB,EAAE;aAC7C,CAAC;SACF;aAAM;YACN,OAAO;gBACN,QAAQ,EAAE,IAAI,CAAC,gCAAgC,CAAC,gBAAgB,CAAC;gBACjE,uBAAuB,EAAE,gBAAgB,CAAC,uBAAuB;gBACjE,0HAA0H;gBAC1H,iDAAiD;gBACjD,cAAc,EAAG,gBAA8C,CAAC,cAAc;aAC9E,CAAC;SACF;IACF,CAAC;IAED;;;OAGG;IACK,qBAAqB,CAAC,MAA6B;QAC1D,OAAO,IAAI,CAAC,+BAA+B,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACtE,CAAC;IAEO,iBAAiB,CAAC,MAAmC;QAC5D,MAAM,KAAK,GAAG,CAAC,WAAwC,EAAE,EAAE;YAC1D,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAC/C,IAAI,WAAW,CAAC,EAAE,CAAC,IAAI,KAAK,wBAAkB,CAAC,QAAQ,EAAE;gBACxD,IAAI,WAAW,CAAC,EAAE,CAAC,WAAW,IAAI,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,WAAW,EAAE;oBAClF,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAC;iBAC3E;aACD;QACF,CAAC,CAAC;QAEF,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,wBAAkB,CAAC,KAAK,EAAE;YAChD,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE;gBACrC,KAAK,CAAC;oBACL,OAAO,EAAE,MAAM,CAAC,EAAE;oBAClB,EAAE,EAAE,QAAQ;oBACZ,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;iBACzC,CAAC,CAAC;aACH;SACD;aAAM;YACN,KAAK,CAAC,MAAM,CAAC,CAAC;SACd;IACF,CAAC;IAED,wFAAwF;IAExF,iBAAiB;QAChB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACnF,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3E,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,OAAO,CAAC;QAChC,OAAO,KAAK,CAAC;IACd,CAAC;IACD,qBAAqB,CAAC,YAAoB;QACzC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;YAC5C,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;SACnC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC;IAED,gBAAgB,CAAC,YAAoB;QACpC,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC,IAAI,CAAC;IACrD,CAAC;IACD,eAAe,CAAC,aAAqB;QACpC,OAAO,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAC/E,CAAC;IACD,eAAe,CAAC,YAAoB;QACnC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC;IACO,gCAAgC,CAAC,GAAgD;QACxF,OAAO,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;;;;OAQG;IACI,wBAAwB,CAAC,OAAiB,EAAE,QAAgB;QAClE,IAAA,qBAAM,EACL,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,EACjD,KAAK,CAAC,2CAA2C,CACjD,CAAC;QACF,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC7E,CAAC;IAEO,sBAAsB,CAC7B,OAA0B,EAC1B,YAA0B;QAE1B,IAAA,qBAAM,EAAC,CAAC,CAAC,YAAY,EAAE,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC9D,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC;QAC7D,IAAA,qBAAM,EACL,YAAY,KAAK,kBAAkB,EACnC,KAAK,CAAC,yDAAyD,CAC/D,CAAC;QACF,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE;YAC9B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;SAC/B;QAED,MAAM,MAAM,GAAwB,EAAE,CAAC;QACvC,gGAAgG;QAChG,gGAAgG;QAChG,4FAA4F;QAC5F,oGAAoG;QACpG,mDAAmD;QACnD,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACzD,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9B,EAAE;YACF,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YACxD,IAAA,qBAAM,EACL,YAAY,KAAK,eAAe,EAChC,KAAK,CAAC,0DAA0D,CAChE,CAAC;YACF,MAAM,eAAe,GAAG,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;YACtF,IAAI,KAAoC,CAAC;YACzC,QAAQ,OAAO,CAAC,IAAI,EAAE;gBACrB,KAAK,wBAAkB,CAAC,QAAQ;oBAC/B,IAAA,qBAAM,EACL,OAAO,CAAC,eAAe,EAAE,oBAAoB,EAAE,KAAK,IAAI,EACxD,KAAK,CAAC,yCAAyC,CAC/C,CAAC;oBACF,2EAA2E;oBAC3E,yEAAyE;oBACzE,oBAAoB;oBACpB,IACC,OAAO,CAAC,UAAU,KAAK,SAAS;wBAChC,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS;4BACrC,OAAO,CAAC,UAAU,KAAK,oCAAwB,CAAC,EAChD;wBACD,KAAK,GAAG,IAAA,iCAAqB,EAC5B,eAAe,EACf,eAAe,GAAG,OAAO,CAAC,YAAY,EACtC,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,WAAW,CACnB,CAAC;qBACF;oBACD,MAAM;gBAEP,KAAK,wBAAkB,CAAC,MAAM;oBAC7B,IAAA,qBAAM,EACL,OAAO,CAAC,GAAG,KAAK,oCAAwB,EACxC,KAAK,CAAC,oDAAoD,CAC1D,CAAC;oBACF,IAAI,WAAW,GAAG,OAAO,CAAC;oBAC1B,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE;wBACvE,WAAW,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;wBAC9B,WAAW,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;qBAC3C;oBACD,KAAK,GAAG,IAAA,iCAAqB,EAAC,eAAe,EAAE,WAAW,CAAC,CAAC;oBAC5D,MAAM;gBAEP,KAAK,wBAAkB,CAAC,MAAM;oBAC7B,IACC,OAAO,CAAC,eAAe,KAAK,SAAS;wBACrC,OAAO,CAAC,UAAU,KAAK,oCAAwB,EAC9C;wBACD,KAAK,GAAG,IAAA,+BAAmB,EAC1B,eAAe,EACf,eAAe,GAAG,OAAO,CAAC,YAAY,CACtC,CAAC;qBACF;oBACD,MAAM;gBAEP;oBACC,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;aACpC;YAED,IAAI,KAAK,EAAE;gBACV,MAAM,eAAe,GAAiB;oBACrC,QAAQ,EAAE,EAAE;oBACZ,QAAQ,EAAE,YAAY,CAAC,QAAQ;oBAC/B,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,UAAU;iBACzC,CAAC;gBACF,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;gBAC/C,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBACtD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACnB;SACD;QAED,OAAO,MAAM,CAAC;IACf,CAAC;IAEO,aAAa,CAAC,MAAmC;QACxD,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACpC,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,CAAC;QAC3C,QAAQ,EAAE,CAAC,IAAI,EAAE;YAChB,KAAK,wBAAkB,CAAC,MAAM;gBAC7B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC3B,MAAM;YACP,KAAK,wBAAkB,CAAC,MAAM;gBAC7B,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAChC,MAAM;YACP,KAAK,wBAAkB,CAAC,QAAQ;gBAC/B,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;gBAClC,MAAM;YACP,KAAK,wBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC9B,KAAK,MAAM,QAAQ,IAAI,EAAE,CAAC,GAAG,EAAE;oBAC9B,IAAI,CAAC,aAAa,CAAC;wBAClB,EAAE,EAAE,QAAQ;wBACZ,OAAO,EAAE,EAAE;wBACX,gBAAgB,EAAE,GAAG;qBACrB,CAAC,CAAC;iBACH;gBACD,MAAM;aACN;YACD;gBACC,MAAM;SACP;IACF,CAAC;IAMM,cAAc,CAAC,EAAgB;QACrC,IAAI,QAAmD,CAAC;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,QAAQ,EAAE,CAAC,IAAI,EAAE;YAChB,KAAK,wBAAkB,CAAC,MAAM;gBAC7B,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;gBACpC,QAAQ,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAC3C,MAAM;YACP,KAAK,wBAAkB,CAAC,MAAM;gBAC7B,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;gBACzC,QAAQ,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAC3C,MAAM;YACP,KAAK,wBAAkB,CAAC,QAAQ;gBAC/B,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC3C,QAAQ,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAC3C,MAAM;YACP,KAAK,wBAAkB,CAAC,KAAK;gBAC5B,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YAClD;gBACC,IAAA,8BAAe,EAAC,EAAE,EAAE,sBAAsB,CAAC,CAAC;SAC7C;QACD,IAAA,qBAAM,EAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAC9E,OAAO,QAAQ,CAAC;IACjB,CAAC;IAEM,QAAQ,CAAC,GAA8B,EAAE,QAAiB,KAAK;QACrE,iCAAiC;QACjC,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,CAAC;QAC3C,gCAAgC;QAChC,IAAI,GAAG,CAAC,IAAI,KAAK,kCAAW,CAAC,SAAS,EAAE;YACvC,MAAM,MAAM,GAAgC;gBAC3C,EAAE,EAAE,GAAG,CAAC,QAAwB;gBAChC,gBAAgB,EAAE,GAAG;aACrB,CAAC;YACF,IAAI,MAAM,CAAC,gBAAgB,EAAE,QAAQ,KAAK,IAAI,CAAC,YAAY,IAAI,KAAK,EAAE;gBACrE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;aAC/B;iBAAM;gBACN,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;aAC3B;SACD;QAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IACtE,CAAC;IAEM,gBAAgB,CAAC,GAAW,EAAE,GAAW;QAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,uGAAuG;QACvG,IAAA,qBAAM,EACL,YAAY,CAAC,UAAU,IAAI,GAAG,EAC9B,KAAK,CAAC,qEAAqE,CAC3E,CAAC;QACF,YAAY,CAAC,UAAU,GAAG,GAAG,CAAC;QAC9B,IAAA,qBAAM,EAAC,GAAG,IAAI,GAAG,EAAE,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACvE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED;;;;;;;OAOG;IACI,2BAA2B,CACjC,oBAA4B,EAC5B,kBAA0B,EAC1B,cAAsB;QAEtB,MAAM,mBAAmB,GAAG,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,UAAU,CAAC,2BAA2B,CACjD,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,CACnB,CAAC;IACH,CAAC;IAKD;;;;;OAKG;IACI,mBAAmB,CACzB,OAAqB,EACrB,YAA2C;QAE3C,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;YACjE,IAAI,UAAwB,CAAC;YAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;gBAChC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC9B,qCAAqC;oBACrC,gDAAgD;oBAChD,OAAO,IAAA,yBAAa,GAAE,CAAC;iBACvB;gBACD,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;aAC7B;iBAAM;gBACN,UAAU,GAAG,YAAY,CAAC;aAC1B;YACD,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAC1D,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAClC,CAAC;YACF,IAAA,qBAAM,EACL,cAAc,KAAK,SAAS,EAC5B,KAAK,CAAC,8CAA8C,CACpD,CAAC;YACF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;SAC5E;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,UAAU,CAAC;QACnD,IAAI,QAAQ,KAAK,IAAI,CAAC,uBAAuB,EAAE;YAC9C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,yBAAyB,EAAE,CAAC;YAC5C,IAAI,CAAC,uBAAuB,GAAG,QAAQ,CAAC;SACxC;QAED,MAAM,MAAM,GAAwB,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,IAAI,KAAK,wBAAkB,CAAC,KAAK,EAAE;YAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;gBAChC,IAAA,qBAAM,EACL,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,EAC1C,KAAK,CAAC,oFAAoF,CAC1F,CAAC;gBAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAC5C,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC7E;aACD;iBAAM;gBACN,mFAAmF;gBACnF,8EAA8E;gBAC9E,IAAA,qBAAM,EACL,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EACxB,KAAK,CAAC,oFAAoF,CAC1F,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;aAC1E;SACD;aAAM;YACN,IAAA,qBAAM,EACJ,OAAO,CAAC,IAAY,KAAK,wBAAkB,CAAC,KAAK,EAClD,KAAK,CAAC,wCAAwC,CAC9C,CAAC;YACF,IAAA,qBAAM,EACL,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAC5B,KAAK,CAAC,oDAAoD,CAC1D,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;SACnE;QACD,gDAAgD;QAChD,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAA,yBAAa,EAAC,GAAG,MAAM,CAAC,CAAC;IACnE,CAAC;IAEM,gBAAgB;QACtB,OAAO,IAAI,yCAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAEM,SAAS,CACf,OAA+B,EAC/B,MAAoB,EACpB,UAA4B,EAC5B,WAAwC;QAExC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,qBAAqB,CAAC;QAElD,gEAAgE;QAChE,gEAAgE;QAChE,oDAAoD;QAEpD,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC;QAE/D,yFAAyF;QACzF,yCAAyC;QACzC,IAAA,qBAAM,EACL,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,KAAK,MAAM,EACxC,KAAK,CAAC,gEAAgE,CACtE,CAAC;QAEF,kCAAkC;QAClC,oEAAoE;QACpE,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,0BAA0B,KAAK,IAAI,EAAE;YACjE,IAAA,qBAAM,EACL,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EACrD,KAAK,CAAC,8CAA8C,CACpD,CAAC;YACF,MAAM,IAAI,GAAG,IAAI,uBAAU,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAChE,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CACxB,CAAC;YACF,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;SACrC;aAAM;YACN,MAAM,IAAI,GAAG,IAAI,+BAAc,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9D,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;SAClD;IACF,CAAC;IAEM,KAAK,CAAC,IAAI,CAChB,OAA+B,EAC/B,OAA+B,EAC/B,UAA4B;QAE5B,MAAM,MAAM,GAAG,IAAI,+BAAc,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAE3F,OAAO,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,QAAgB,EAAE,WAAqB;QACtD,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CACrC,QAAQ,EACR,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,EAC/B,WAAW,CACX,CAAC;IACH,CAAC;IAEO,sBAAsB;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,oCAAwB,CAAC,CAAC,CAAC,mCAAuB,CAAC;IACrF,CAAC;IAED,gDAAgD;IAChD,gBAAgB,CAAC,OAA2B;QAC3C,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE;YAC7B,MAAM,MAAM,GAA0B;gBACrC,EAAE;gBACF,OAAO;aACP,CAAC;YACF,QAAQ,EAAE,CAAC,IAAI,EAAE;gBAChB,KAAK,wBAAkB,CAAC,MAAM;oBAC7B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;oBAC3B,MAAM;gBACP,KAAK,wBAAkB,CAAC,QAAQ;oBAC/B,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;oBAClC,MAAM;gBACP,KAAK,wBAAkB,CAAC,MAAM;oBAC7B,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;oBAChC,MAAM;gBACP;oBACC,MAAM;aACP;SACD;IACF,CAAC;IACD,uBAAuB,CAAC,EAAyB,EAAE,GAA8B;QAChF,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAa,CAAC,EAAG,CAAC;QACtC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1D,IAAI,aAAa,EAAE;YAClB,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;SACjF;QACD,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,EAAE,CAC1D,aAAc,CAAC,QAAQ,CAAC,aAAc,CAAC,MAAM,CAAC,CAC9C,CAAC;IACH,CAAC;IAED,YAAY,CAAC,MAAc;QAC1B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,oBAAoB,CACnB,GAAW,EACX,YAAsF,EACtF,QAAiB;QAEjB,MAAM,EAAE,uBAAuB,EAAE,QAAQ,EAAE,GAC1C,IAAI,CAAC,+BAA+B,CAAC,YAAY,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAC1C,GAAG,EACH,uBAAuB,EACvB,QAAQ,EACR,QAAQ,CACR,CAAC;IACH,CAAC;IAED,uBAAuB,CAAC,GAAW;QAClC,IAAI,oBAA6C,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,IAAI,GAAG,EAAE;YACR,oBAAoB,GAAG,GAAG,CAAC,UAAU,CAAC;SACtC;QACD,OAAO,oBAAoB,CAAC;IAC7B,CAAC;IACD,yBAAyB,CAAC,GAAW;QACpC,IAAI,QAA4B,CAAC;QACjC,IAAI,WAA+B,CAAC;QAEpC,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,IAAI,GAAG,EAAE;YACR,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACjC,WAAW,GAAG,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC;SAC1C;QACD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAClC,CAAC;IACD,aAAa;QACZ,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,UAAU,CAAC;IAC1C,CAAC;IACD,WAAW;QACV,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;IACxC,CAAC;IAED,SAAS;QACR,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,0BAA0B,CAAC,YAAgC,EAAE,MAAM,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC;QACtF,4DAA4D;QAC5D,kEAAkE;QAClE,yDAAyD;QACzD,uEAAuE;QACvE,YAAY;QACZ,IAAI,YAAY,KAAK,SAAS,EAAE;YAC/B,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE;gBACpC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;gBACjC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACxC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CACjC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,EACxC,MAAM,EACN,UAAU,CACV,CAAC;aACF;iBAAM;gBACN,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;gBACtC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC,IAAI,CAAC;gBAC5D,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;gBACjC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBAChD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC;aAC9C;SACD;IACF,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,QAAgB,EAAE,SAAiB,EAAE,SAAS,GAAG,IAAI;QAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC3E,CAAC;IAED;;;;;;;;OAQG;IACH,eAAe,CAAC,QAAgB,EAAE,WAAmB,EAAE,QAAQ,GAAG,IAAI;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACnF,CAAC;CACD;AAvkCD,wBAukCC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { IFluidHandle, type IEventThisPlaceHolder } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { assert, TypedEventEmitter, unreachableCase } from \"@fluidframework/common-utils\";\nimport { ITelemetryLoggerExt, LoggingError, UsageError } from \"@fluidframework/telemetry-utils\";\n// eslint-disable-next-line import/no-deprecated\nimport { IIntegerRange } from \"./base\";\nimport { List, RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber, UniversalSequenceNumber } from \"./constants\";\nimport { LocalReferencePosition, SlidingPreference } from \"./localReference\";\nimport {\n\tCollaborationWindow,\n\tcompareStrings,\n\tIConsensusInfo,\n\tIMergeLeaf,\n\tISegment,\n\tISegmentAction,\n\tMarker,\n\tSegmentGroup,\n} from \"./mergeTreeNodes\";\nimport {\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeMaintenanceCallbackArgs,\n} from \"./mergeTreeDeltaCallback\";\nimport {\n\tcreateAnnotateMarkerOp,\n\tcreateAnnotateRangeOp,\n\t// eslint-disable-next-line import/no-deprecated\n\tcreateGroupOp,\n\tcreateInsertSegmentOp,\n\tcreateRemoveRangeOp,\n} from \"./opBuilder\";\nimport {\n\tICombiningOp,\n\tIJSONSegment,\n\tIMergeTreeAnnotateMsg,\n\tIMergeTreeDeltaOp,\n\t// eslint-disable-next-line import/no-deprecated\n\tIMergeTreeGroupMsg,\n\tIMergeTreeInsertMsg,\n\tIMergeTreeRemoveMsg,\n\tIMergeTreeOp,\n\tIRelativePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n} from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\nimport { SnapshotLoader } from \"./snapshotLoader\";\nimport { IMergeTreeTextHelper } from \"./textSegment\";\nimport { SnapshotV1 } from \"./snapshotV1\";\nimport { ReferencePosition, RangeStackMap, DetachedReferencePosition } from \"./referencePositions\";\nimport { MergeTree } from \"./mergeTree\";\nimport { MergeTreeTextHelper } from \"./MergeTreeTextHelper\";\nimport { walkAllChildSegments } from \"./mergeTreeNodeWalk\";\nimport { IMergeTreeClientSequenceArgs, IMergeTreeDeltaOpArgs } from \"./index\";\n\ntype IMergeTreeDeltaRemoteOpArgs = Omit<IMergeTreeDeltaOpArgs, \"sequencedMessage\"> &\n\tRequired<Pick<IMergeTreeDeltaOpArgs, \"sequencedMessage\">>;\n\n/**\n * Emitted before this client's merge-tree normalizes its segments on reconnect, potentially\n * ordering them. Useful for DDS-like consumers built atop the merge-tree to compute any information\n * they need for rebasing their ops on reconnection.\n *\n * @internal\n */\nexport interface IClientEvents {\n\t(event: \"normalize\", listener: (target: IEventThisPlaceHolder) => void);\n\t(\n\t\tevent: \"delta\",\n\t\tlistener: (\n\t\t\topArgs: IMergeTreeDeltaOpArgs,\n\t\t\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t);\n\t(\n\t\tevent: \"maintenance\",\n\t\tlistener: (\n\t\t\targs: IMergeTreeMaintenanceCallbackArgs,\n\t\t\tdeltaArgs: IMergeTreeDeltaOpArgs | undefined,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t);\n}\n\nexport class Client extends TypedEventEmitter<IClientEvents> {\n\tpublic longClientId: string | undefined;\n\n\tprivate readonly _mergeTree: MergeTree;\n\n\tprivate readonly clientNameToIds = new RedBlackTree<string, number>(compareStrings);\n\tprivate readonly shortClientIdMap: string[] = [];\n\tprivate readonly pendingConsensus = new Map<string, IConsensusInfo>();\n\n\tconstructor(\n\t\t// Passing this callback would be unnecessary if Client were merged with SharedSegmentSequence\n\t\tpublic readonly specToSegment: (spec: IJSONSegment) => ISegment,\n\t\tpublic readonly logger: ITelemetryLoggerExt,\n\t\toptions?: PropertySet,\n\t) {\n\t\tsuper();\n\t\tthis._mergeTree = new MergeTree(options);\n\t\tthis._mergeTree.mergeTreeDeltaCallback = (opArgs, deltaArgs) => {\n\t\t\tthis.emit(\"delta\", opArgs, deltaArgs, this);\n\t\t};\n\t\tthis._mergeTree.mergeTreeMaintenanceCallback = (args, opArgs) => {\n\t\t\tthis.emit(\"maintenance\", args, opArgs, this);\n\t\t};\n\n\t\tif (options?.attribution?.track) {\n\t\t\tconst policy = this._mergeTree?.attributionPolicy;\n\t\t\tif (policy === undefined) {\n\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\"Attribution policy must be provided when attribution tracking is requested.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tpolicy.attach(this);\n\t\t}\n\t}\n\n\t/**\n\t * The merge tree maintains a queue of segment groups for each local operation.\n\t * These segment groups track segments modified by an operation.\n\t * This method peeks the tail of that queue, and returns the segments groups there.\n\t * It is used to get the segment group(s) for the previous operations.\n\t * @param count - The number segment groups to get peek from the tail of the queue. Default 1.\n\t */\n\tpublic peekPendingSegmentGroups(count: number = 1): SegmentGroup | SegmentGroup[] | undefined {\n\t\tconst pending = this._mergeTree.pendingSegments;\n\t\tlet node = pending?.last;\n\t\tif (count === 1 || pending === undefined) {\n\t\t\treturn node?.data;\n\t\t}\n\t\tconst taken: SegmentGroup[] = new Array(Math.min(count, pending.length));\n\t\tfor (let i = taken.length - 1; i >= 0; i--) {\n\t\t\ttaken[i] = node!.data;\n\t\t\tnode = node!.prev;\n\t\t}\n\t\treturn taken;\n\t}\n\n\t/**\n\t * Annotate a marker and call the callback on consensus.\n\t * @param marker - The marker to annotate\n\t * @param props - The properties to annotate the marker with\n\t * @param consensusCallback - The callback called when consensus is reached\n\t * @returns The annotate op if valid, otherwise undefined\n\t */\n\tpublic annotateMarkerNotifyConsensus(\n\t\tmarker: Marker,\n\t\tprops: PropertySet,\n\t\tconsensusCallback: (m: Marker) => void,\n\t): IMergeTreeAnnotateMsg | undefined {\n\t\tconst combiningOp: ICombiningOp = {\n\t\t\tname: \"consensus\",\n\t\t};\n\n\t\tconst annotateOp = this.annotateMarker(marker, props, combiningOp);\n\n\t\tif (annotateOp) {\n\t\t\tconst consensusInfo: IConsensusInfo = {\n\t\t\t\tcallback: consensusCallback,\n\t\t\t\tmarker,\n\t\t\t};\n\t\t\tthis.pendingConsensus.set(marker.getId()!, consensusInfo);\n\t\t\treturn annotateOp;\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\t/**\n\t * Annotates the markers with the provided properties\n\t * @param marker - The marker to annotate\n\t * @param props - The properties to annotate the marker with\n\t * @param combiningOp - Optional. Specifies how to combine values for the property, such as \"incr\" for increment.\n\t * @returns The annotate op if valid, otherwise undefined\n\t */\n\tpublic annotateMarker(\n\t\tmarker: Marker,\n\t\tprops: PropertySet,\n\t\tcombiningOp?: ICombiningOp,\n\t): IMergeTreeAnnotateMsg | undefined {\n\t\tconst annotateOp = createAnnotateMarkerOp(marker, props, combiningOp)!;\n\n\t\treturn this.applyAnnotateRangeOp({ op: annotateOp }) ? annotateOp : undefined;\n\t}\n\t/**\n\t * Annotates the range with the provided properties\n\t * @param start - The inclusive start position of the range to annotate\n\t * @param end - The exclusive end position of the range to annotate\n\t * @param props - The properties to annotate the range with\n\t * @param combiningOp - Specifies how to combine values for the property, such as \"incr\" for increment.\n\t * @returns The annotate op if valid, otherwise undefined\n\t */\n\tpublic annotateRangeLocal(\n\t\tstart: number,\n\t\tend: number,\n\t\tprops: PropertySet,\n\t\tcombiningOp: ICombiningOp | undefined,\n\t): IMergeTreeAnnotateMsg | undefined {\n\t\tconst annotateOp = createAnnotateRangeOp(start, end, props, combiningOp);\n\n\t\tif (this.applyAnnotateRangeOp({ op: annotateOp })) {\n\t\t\treturn annotateOp;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Removes the range\n\t *\n\t * @param start - The inclusive start of the range to remove\n\t * @param end - The exclusive end of the range to remove\n\t */\n\tpublic removeRangeLocal(start: number, end: number): IMergeTreeRemoveMsg {\n\t\tconst removeOp = createRemoveRangeOp(start, end);\n\t\tthis.applyRemoveRangeOp({ op: removeOp });\n\t\treturn removeOp;\n\t}\n\n\t/**\n\t * @param pos - The position to insert the segment at\n\t * @param segment - The segment to insert\n\t */\n\tpublic insertSegmentLocal(pos: number, segment: ISegment): IMergeTreeInsertMsg | undefined {\n\t\tif (segment.cachedLength <= 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst insertOp = createInsertSegmentOp(pos, segment);\n\t\tif (this.applyInsertOp({ op: insertOp })) {\n\t\t\treturn insertOp;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * @param refPos - The reference position to insert the segment at\n\t * @param segment - The segment to insert\n\t */\n\tpublic insertAtReferencePositionLocal(\n\t\trefPos: ReferencePosition,\n\t\tsegment: ISegment,\n\t): IMergeTreeInsertMsg | undefined {\n\t\tconst pos = this._mergeTree.referencePositionToLocalPosition(\n\t\t\trefPos,\n\t\t\tthis.getCurrentSeq(),\n\t\t\tthis.getClientId(),\n\t\t);\n\n\t\tif (pos === DetachedReferencePosition) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst op = createInsertSegmentOp(pos, segment);\n\n\t\tif (this.applyInsertOp({ op })) {\n\t\t\treturn op;\n\t\t}\n\t}\n\n\tpublic walkSegments<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\tstart: number | undefined,\n\t\tend: number | undefined,\n\t\taccum: TClientData,\n\t\tsplitRange?: boolean,\n\t): void;\n\tpublic walkSegments<undefined>(\n\t\thandler: ISegmentAction<undefined>,\n\t\tstart?: number,\n\t\tend?: number,\n\t\taccum?: undefined,\n\t\tsplitRange?: boolean,\n\t): void;\n\tpublic walkSegments<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\tstart: number | undefined,\n\t\tend: number | undefined,\n\t\taccum: TClientData,\n\t\tsplitRange: boolean = false,\n\t): void {\n\t\tthis._mergeTree.mapRange(\n\t\t\thandler,\n\t\t\tthis.getCurrentSeq(),\n\t\t\tthis.getClientId(),\n\t\t\taccum,\n\t\t\tstart,\n\t\t\tend,\n\t\t\tsplitRange,\n\t\t);\n\t}\n\n\tprotected walkAllSegments<TClientData>(\n\t\taction: (segment: ISegment, accum?: TClientData) => boolean,\n\t\taccum?: TClientData,\n\t): boolean {\n\t\treturn walkAllChildSegments(\n\t\t\tthis._mergeTree.root,\n\t\t\taccum === undefined ? action : (seg) => action(seg, accum),\n\t\t);\n\t}\n\n\t/**\n\t * Serializes the data required for garbage collection. The IFluidHandles stored in all segments that haven't\n\t * been removed represent routes to other objects. We serialize the data in these segments using the passed in\n\t * serializer which keeps track of all serialized handles.\n\t */\n\tpublic serializeGCData(\n\t\thandle: IFluidHandle,\n\t\thandleCollectingSerializer: IFluidSerializer,\n\t): void {\n\t\tlet localInserts = 0;\n\t\tlet localRemoves = 0;\n\t\twalkAllChildSegments(this._mergeTree.root, (seg) => {\n\t\t\tif (seg.seq === UnassignedSequenceNumber) {\n\t\t\t\tlocalInserts++;\n\t\t\t}\n\t\t\tif (seg.removedSeq === UnassignedSequenceNumber) {\n\t\t\t\tlocalRemoves++;\n\t\t\t}\n\t\t\t// Only serialize segments that have not been removed.\n\t\t\tif (seg.removedSeq === undefined) {\n\t\t\t\thandleCollectingSerializer.stringify(seg.clone().toJSONObject(), handle);\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t\tif (localInserts > 0 || localRemoves > 0) {\n\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\teventName: \"LocalEditsInProcessGCData\",\n\t\t\t\tlocalInserts,\n\t\t\t\tlocalRemoves,\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic getCollabWindow(): CollaborationWindow {\n\t\treturn this._mergeTree.collabWindow;\n\t}\n\n\t/**\n\t * Returns the current position of a segment, and -1 if the segment\n\t * does not exist in this merge tree\n\t * @param segment - The segment to get the position of\n\t */\n\tpublic getPosition(segment: ISegment | undefined, localSeq?: number): number {\n\t\tconst mergeSegment: IMergeLeaf | undefined = segment;\n\t\tif (mergeSegment?.parent === undefined) {\n\t\t\treturn -1;\n\t\t}\n\t\treturn this._mergeTree.getPosition(\n\t\t\tmergeSegment,\n\t\t\tthis.getCurrentSeq(),\n\t\t\tthis.getClientId(),\n\t\t\tlocalSeq,\n\t\t);\n\t}\n\n\t/**\n\t * Creates a `LocalReferencePosition` on this client. If the refType does not include ReferenceType.Transient,\n\t * the returned reference will be added to the localRefs on the provided segment.\n\t * @param segment - Segment to add the local reference on\n\t * @param offset - Offset on the segment at which to place the local reference\n\t * @param refType - ReferenceType for the created local reference\n\t * @param properties - PropertySet to place on the created local reference\n\t */\n\tpublic createLocalReferencePosition(\n\t\tsegment: ISegment,\n\t\toffset: number | undefined,\n\t\trefType: ReferenceType,\n\t\tproperties: PropertySet | undefined,\n\t\tslidingPreference?: SlidingPreference,\n\t): LocalReferencePosition {\n\t\treturn this._mergeTree.createLocalReferencePosition(\n\t\t\tsegment,\n\t\t\toffset ?? 0,\n\t\t\trefType,\n\t\t\tproperties,\n\t\t\tslidingPreference,\n\t\t);\n\t}\n\n\t/**\n\t * Removes a `LocalReferencePosition` from this client.\n\t */\n\tpublic removeLocalReferencePosition(lref: LocalReferencePosition) {\n\t\treturn this._mergeTree.removeLocalReferencePosition(lref);\n\t}\n\n\t/**\n\t * Resolves a `ReferencePosition` into a character position using this client's perspective.\n\t */\n\tpublic localReferencePositionToPosition(lref: ReferencePosition): number {\n\t\treturn this._mergeTree.referencePositionToLocalPosition(lref);\n\t}\n\n\t/**\n\t * Given a position specified relative to a marker id, lookup the marker\n\t * and convert the position to a character position.\n\t * @param relativePos - Id of marker (may be indirect) and whether position is before or after marker.\n\t */\n\tpublic posFromRelativePos(relativePos: IRelativePosition) {\n\t\treturn this._mergeTree.posFromRelativePos(relativePos);\n\t}\n\n\tpublic getMarkerFromId(id: string): ISegment | undefined {\n\t\treturn this._mergeTree.getMarkerFromId(id);\n\t}\n\n\t/**\n\t * Revert an op\n\t */\n\tpublic rollback?(op: any, localOpMetadata: unknown) {\n\t\tthis._mergeTree.rollback(op as IMergeTreeDeltaOp, localOpMetadata as SegmentGroup);\n\t}\n\n\t/**\n\t * Performs the remove based on the provided op\n\t * @param opArgs - The ops args for the op\n\t * @returns True if the remove was applied. False if it could not be.\n\t */\n\tprivate applyRemoveRangeOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n\t\tassert(\n\t\t\topArgs.op.type === MergeTreeDeltaType.REMOVE,\n\t\t\t0x02d /* \"Unexpected op type on range remove!\" */,\n\t\t);\n\t\tconst op = opArgs.op;\n\t\tconst clientArgs = this.getClientSequenceArgs(opArgs);\n\t\tconst range = this.getValidOpRange(op, clientArgs);\n\n\t\tthis._mergeTree.markRangeRemoved(\n\t\t\trange.start,\n\t\t\trange.end,\n\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\tclientArgs.clientId,\n\t\t\tclientArgs.sequenceNumber,\n\t\t\tfalse,\n\t\t\topArgs,\n\t\t);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Performs the annotate based on the provided op\n\t * @param opArgs - The ops args for the op\n\t * @returns True if the annotate was applied. False if it could not be.\n\t */\n\tprivate applyAnnotateRangeOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n\t\tassert(\n\t\t\topArgs.op.type === MergeTreeDeltaType.ANNOTATE,\n\t\t\t0x02e /* \"Unexpected op type on range annotate!\" */,\n\t\t);\n\t\tconst op = opArgs.op;\n\t\tconst clientArgs = this.getClientSequenceArgs(opArgs);\n\t\tconst range = this.getValidOpRange(op, clientArgs);\n\n\t\tif (!range) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis._mergeTree.annotateRange(\n\t\t\trange.start,\n\t\t\trange.end,\n\t\t\top.props,\n\t\t\top.combiningOp,\n\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\tclientArgs.clientId,\n\t\t\tclientArgs.sequenceNumber,\n\t\t\topArgs,\n\t\t);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Performs the insert based on the provided op\n\t * @param opArgs - The ops args for the op\n\t * @returns True if the insert was applied. False if it could not be.\n\t */\n\tprivate applyInsertOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n\t\tassert(\n\t\t\topArgs.op.type === MergeTreeDeltaType.INSERT,\n\t\t\t0x02f /* \"Unexpected op type on range insert!\" */,\n\t\t);\n\t\tconst op = opArgs.op;\n\t\tconst clientArgs = this.getClientSequenceArgs(opArgs);\n\t\tconst range = this.getValidOpRange(op, clientArgs);\n\n\t\tif (!range) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet segments: ISegment[] | undefined;\n\t\tif (op.seg) {\n\t\t\tsegments = [this.specToSegment(op.seg)];\n\t\t}\n\n\t\tif (!segments || segments.length === 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis._mergeTree.insertSegments(\n\t\t\trange.start,\n\t\t\tsegments,\n\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\tclientArgs.clientId,\n\t\t\tclientArgs.sequenceNumber,\n\t\t\topArgs,\n\t\t);\n\t\treturn true;\n\t}\n\n\t/**\n\t * Returns a valid range for the op, or undefined\n\t * @param op - The op to generate the range for\n\t * @param clientArgs - The client args for the op\n\t */\n\tprivate getValidOpRange(\n\t\top: IMergeTreeAnnotateMsg | IMergeTreeInsertMsg | IMergeTreeRemoveMsg,\n\t\tclientArgs: IMergeTreeClientSequenceArgs,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t): IIntegerRange {\n\t\tlet start: number | undefined = op.pos1;\n\t\tif (start === undefined && op.relativePos1) {\n\t\t\tstart = this._mergeTree.posFromRelativePos(\n\t\t\t\top.relativePos1,\n\t\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\t\tclientArgs.clientId,\n\t\t\t);\n\t\t}\n\n\t\tlet end: number | undefined = op.pos2;\n\t\tif (end === undefined && op.relativePos2) {\n\t\t\tend = this._mergeTree.posFromRelativePos(\n\t\t\t\top.relativePos2,\n\t\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\t\tclientArgs.clientId,\n\t\t\t);\n\t\t}\n\n\t\t// Validate if local op\n\t\tif (clientArgs.clientId === this.getClientId()) {\n\t\t\tconst length = this.getLength();\n\n\t\t\tconst invalidPositions: string[] = [];\n\n\t\t\t// Validate start position\n\t\t\t//\n\t\t\tif (\n\t\t\t\tstart === undefined ||\n\t\t\t\tstart < 0 ||\n\t\t\t\tstart > length ||\n\t\t\t\t(start === length && op.type !== MergeTreeDeltaType.INSERT)\n\t\t\t) {\n\t\t\t\tinvalidPositions.push(\"start\");\n\t\t\t}\n\t\t\t// Validate end if not insert, or insert has end\n\t\t\t//\n\t\t\tif (op.type !== MergeTreeDeltaType.INSERT || end !== undefined) {\n\t\t\t\tif (end === undefined || end <= start!) {\n\t\t\t\t\tinvalidPositions.push(\"end\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (invalidPositions.length > 0) {\n\t\t\t\tthrow new LoggingError(\"RangeOutOfBounds\", {\n\t\t\t\t\tusageError: true,\n\t\t\t\t\tend,\n\t\t\t\t\tinvalidPositions: invalidPositions.toString(),\n\t\t\t\t\tlength,\n\t\t\t\t\topPos1: op.pos1,\n\t\t\t\t\topPos1Relative: op.relativePos1 !== undefined,\n\t\t\t\t\topPos2: op.pos2,\n\t\t\t\t\topPos2Relative: op.relativePos2 !== undefined,\n\t\t\t\t\topType: op.type,\n\t\t\t\t\tstart,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// start and end are guaranteed to be non-null here, otherwise we throw above.\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions, import/no-deprecated\n\t\treturn { start, end } as IIntegerRange;\n\t}\n\n\t/**\n\t * Gets the client args from the op if remote, otherwise uses the local clients info\n\t * @param sequencedMessage - The sequencedMessage to get the client sequence args for\n\t */\n\tprivate getClientSequenceArgsForMessage(\n\t\tsequencedMessage:\n\t\t\t| ISequencedDocumentMessage\n\t\t\t| Pick<ISequencedDocumentMessage, \"referenceSequenceNumber\" | \"clientId\">\n\t\t\t| undefined,\n\t) {\n\t\t// If there this no sequenced message, then the op is local\n\t\t// and unacked, so use this clients sequenced args\n\t\t//\n\t\tif (!sequencedMessage) {\n\t\t\tconst segWindow = this.getCollabWindow();\n\t\t\treturn {\n\t\t\t\tclientId: segWindow.clientId,\n\t\t\t\treferenceSequenceNumber: segWindow.currentSeq,\n\t\t\t\tsequenceNumber: this.getLocalSequenceNumber(),\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tclientId: this.getOrAddShortClientIdFromMessage(sequencedMessage),\n\t\t\t\treferenceSequenceNumber: sequencedMessage.referenceSequenceNumber,\n\t\t\t\t// Note: return value satisfies overload signatures despite the cast, as if input argument doesn't contain sequenceNumber,\n\t\t\t\t// return value isn't expected to have it either.\n\t\t\t\tsequenceNumber: (sequencedMessage as ISequencedDocumentMessage).sequenceNumber,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Gets the client args from the op if remote, otherwise uses the local clients info\n\t * @param opArgs - The op arg to get the client sequence args for\n\t */\n\tprivate getClientSequenceArgs(opArgs: IMergeTreeDeltaOpArgs): IMergeTreeClientSequenceArgs {\n\t\treturn this.getClientSequenceArgsForMessage(opArgs.sequencedMessage);\n\t}\n\n\tprivate ackPendingSegment(opArgs: IMergeTreeDeltaRemoteOpArgs) {\n\t\tconst ackOp = (deltaOpArgs: IMergeTreeDeltaRemoteOpArgs) => {\n\t\t\tthis._mergeTree.ackPendingSegment(deltaOpArgs);\n\t\t\tif (deltaOpArgs.op.type === MergeTreeDeltaType.ANNOTATE) {\n\t\t\t\tif (deltaOpArgs.op.combiningOp && deltaOpArgs.op.combiningOp.name === \"consensus\") {\n\t\t\t\t\tthis.updateConsensusProperty(deltaOpArgs.op, deltaOpArgs.sequencedMessage);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (opArgs.op.type === MergeTreeDeltaType.GROUP) {\n\t\t\tfor (const memberOp of opArgs.op.ops) {\n\t\t\t\tackOp({\n\t\t\t\t\tgroupOp: opArgs.op,\n\t\t\t\t\top: memberOp,\n\t\t\t\t\tsequencedMessage: opArgs.sequencedMessage,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tackOp(opArgs);\n\t\t}\n\t}\n\n\t// as functions are modified move them above the eslint-disabled waterline and lint them\n\n\tcloneFromSegments() {\n\t\tconst clone = new Client(this.specToSegment, this.logger, this._mergeTree.options);\n\t\tconst segments: ISegment[] = [];\n\t\tconst newRoot = this._mergeTree.blockClone(this._mergeTree.root, segments);\n\t\tclone._mergeTree.root = newRoot;\n\t\treturn clone;\n\t}\n\tgetOrAddShortClientId(longClientId: string) {\n\t\tif (!this.clientNameToIds.get(longClientId)) {\n\t\t\tthis.addLongClientId(longClientId);\n\t\t}\n\t\treturn this.getShortClientId(longClientId);\n\t}\n\n\tgetShortClientId(longClientId: string) {\n\t\treturn this.clientNameToIds.get(longClientId)!.data;\n\t}\n\tgetLongClientId(shortClientId: number) {\n\t\treturn shortClientId >= 0 ? this.shortClientIdMap[shortClientId] : \"original\";\n\t}\n\taddLongClientId(longClientId: string) {\n\t\tthis.clientNameToIds.put(longClientId, this.shortClientIdMap.length);\n\t\tthis.shortClientIdMap.push(longClientId);\n\t}\n\tprivate getOrAddShortClientIdFromMessage(msg: Pick<ISequencedDocumentMessage, \"clientId\">) {\n\t\treturn this.getOrAddShortClientId(msg.clientId ?? \"server\");\n\t}\n\n\t/**\n\t * During reconnect, we must find the positions to pending segments\n\t * relative to other pending segments. This methods computes that\n\t * position relative to a localSeq. Pending segments above the localSeq\n\t * will be ignored.\n\t *\n\t * @param segment - The segment to find the position for\n\t * @param localSeq - The localSeq to find the position of the segment at\n\t */\n\tpublic findReconnectionPosition(segment: ISegment, localSeq: number) {\n\t\tassert(\n\t\t\tlocalSeq <= this._mergeTree.collabWindow.localSeq,\n\t\t\t0x032 /* \"localSeq greater than collab window\" */,\n\t\t);\n\t\tconst { currentSeq, clientId } = this.getCollabWindow();\n\t\treturn this._mergeTree.getPosition(segment, currentSeq, clientId, localSeq);\n\t}\n\n\tprivate resetPendingDeltaToOps(\n\t\tresetOp: IMergeTreeDeltaOp,\n\t\tsegmentGroup: SegmentGroup,\n\t): IMergeTreeDeltaOp[] {\n\t\tassert(!!segmentGroup, 0x033 /* \"Segment group undefined\" */);\n\t\tconst NACKedSegmentGroup = this.pendingRebase?.shift()?.data;\n\t\tassert(\n\t\t\tsegmentGroup === NACKedSegmentGroup,\n\t\t\t0x034 /* \"Segment group not at head of pending rebase queue\" */,\n\t\t);\n\t\tif (this.pendingRebase?.empty) {\n\t\t\tthis.pendingRebase = undefined;\n\t\t}\n\n\t\tconst opList: IMergeTreeDeltaOp[] = [];\n\t\t// We need to sort the segments by ordinal, as the segments are not sorted in the segment group.\n\t\t// The reason they need them sorted, as they have the same local sequence number and which means\n\t\t// farther segments will take into account nearer segments when calculating their position.\n\t\t// By sorting we ensure the nearer segment will be applied and sequenced before the farther segments\n\t\t// so their recalculated positions will be correct.\n\t\tfor (const segment of segmentGroup.segments.sort((a, b) =>\n\t\t\ta.ordinal < b.ordinal ? -1 : 1,\n\t\t)) {\n\t\t\tconst segmentSegGroup = segment.segmentGroups.dequeue();\n\t\t\tassert(\n\t\t\t\tsegmentGroup === segmentSegGroup,\n\t\t\t\t0x035 /* \"Segment group not at head of segment pending queue\" */,\n\t\t\t);\n\t\t\tconst segmentPosition = this.findReconnectionPosition(segment, segmentGroup.localSeq);\n\t\t\tlet newOp: IMergeTreeDeltaOp | undefined;\n\t\t\tswitch (resetOp.type) {\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE:\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsegment.propertyManager?.hasPendingProperties() === true,\n\t\t\t\t\t\t0x036 /* \"Segment has no pending properties\" */,\n\t\t\t\t\t);\n\t\t\t\t\t// if the segment has been removed, there's no need to send the annotate op\n\t\t\t\t\t// unless the remove was local, in which case the annotate must have come\n\t\t\t\t\t// before the remove\n\t\t\t\t\tif (\n\t\t\t\t\t\tsegment.removedSeq === undefined ||\n\t\t\t\t\t\t(segment.localRemovedSeq !== undefined &&\n\t\t\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber)\n\t\t\t\t\t) {\n\t\t\t\t\t\tnewOp = createAnnotateRangeOp(\n\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t\tresetOp.props,\n\t\t\t\t\t\t\tresetOp.combiningOp,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MergeTreeDeltaType.INSERT:\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsegment.seq === UnassignedSequenceNumber,\n\t\t\t\t\t\t0x037 /* \"Segment already has assigned sequence number\" */,\n\t\t\t\t\t);\n\t\t\t\t\tlet segInsertOp = segment;\n\t\t\t\t\tif (typeof resetOp.seg === \"object\" && resetOp.seg.props !== undefined) {\n\t\t\t\t\t\tsegInsertOp = segment.clone();\n\t\t\t\t\t\tsegInsertOp.properties = resetOp.seg.props;\n\t\t\t\t\t}\n\t\t\t\t\tnewOp = createInsertSegmentOp(segmentPosition, segInsertOp);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MergeTreeDeltaType.REMOVE:\n\t\t\t\t\tif (\n\t\t\t\t\t\tsegment.localRemovedSeq !== undefined &&\n\t\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber\n\t\t\t\t\t) {\n\t\t\t\t\t\tnewOp = createRemoveRangeOp(\n\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Invalid op type`);\n\t\t\t}\n\n\t\t\tif (newOp) {\n\t\t\t\tconst newSegmentGroup: SegmentGroup = {\n\t\t\t\t\tsegments: [],\n\t\t\t\t\tlocalSeq: segmentGroup.localSeq,\n\t\t\t\t\trefSeq: this.getCollabWindow().currentSeq,\n\t\t\t\t};\n\t\t\t\tsegment.segmentGroups.enqueue(newSegmentGroup);\n\t\t\t\tthis._mergeTree.pendingSegments.push(newSegmentGroup);\n\t\t\t\topList.push(newOp);\n\t\t\t}\n\t\t}\n\n\t\treturn opList;\n\t}\n\n\tprivate applyRemoteOp(opArgs: IMergeTreeDeltaRemoteOpArgs) {\n\t\tconst op = opArgs.op;\n\t\tconst msg = opArgs.sequencedMessage;\n\t\tthis.getOrAddShortClientIdFromMessage(msg);\n\t\tswitch (op.type) {\n\t\t\tcase MergeTreeDeltaType.INSERT:\n\t\t\t\tthis.applyInsertOp(opArgs);\n\t\t\t\tbreak;\n\t\t\tcase MergeTreeDeltaType.REMOVE:\n\t\t\t\tthis.applyRemoveRangeOp(opArgs);\n\t\t\t\tbreak;\n\t\t\tcase MergeTreeDeltaType.ANNOTATE:\n\t\t\t\tthis.applyAnnotateRangeOp(opArgs);\n\t\t\t\tbreak;\n\t\t\tcase MergeTreeDeltaType.GROUP: {\n\t\t\t\tfor (const memberOp of op.ops) {\n\t\t\t\t\tthis.applyRemoteOp({\n\t\t\t\t\t\top: memberOp,\n\t\t\t\t\t\tgroupOp: op,\n\t\t\t\t\t\tsequencedMessage: msg,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpublic applyStashedOp(op: IMergeTreeDeltaOp): SegmentGroup;\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic applyStashedOp(op: IMergeTreeGroupMsg): SegmentGroup[];\n\tpublic applyStashedOp(op: IMergeTreeOp): SegmentGroup | SegmentGroup[];\n\tpublic applyStashedOp(op: IMergeTreeOp): SegmentGroup | SegmentGroup[] {\n\t\tlet metadata: SegmentGroup | SegmentGroup[] | undefined;\n\t\tconst stashed = true;\n\t\tswitch (op.type) {\n\t\t\tcase MergeTreeDeltaType.INSERT:\n\t\t\t\tthis.applyInsertOp({ op, stashed });\n\t\t\t\tmetadata = this.peekPendingSegmentGroups();\n\t\t\t\tbreak;\n\t\t\tcase MergeTreeDeltaType.REMOVE:\n\t\t\t\tthis.applyRemoveRangeOp({ op, stashed });\n\t\t\t\tmetadata = this.peekPendingSegmentGroups();\n\t\t\t\tbreak;\n\t\t\tcase MergeTreeDeltaType.ANNOTATE:\n\t\t\t\tthis.applyAnnotateRangeOp({ op, stashed });\n\t\t\t\tmetadata = this.peekPendingSegmentGroups();\n\t\t\t\tbreak;\n\t\t\tcase MergeTreeDeltaType.GROUP:\n\t\t\t\treturn op.ops.map((o) => this.applyStashedOp(o));\n\t\t\tdefault:\n\t\t\t\tunreachableCase(op, \"unrecognized op type\");\n\t\t}\n\t\tassert(!!metadata, 0x2db /* \"Applying op must generate a pending segment\" */);\n\t\treturn metadata;\n\t}\n\n\tpublic applyMsg(msg: ISequencedDocumentMessage, local: boolean = false) {\n\t\t// Ensure client ID is registered\n\t\tthis.getOrAddShortClientIdFromMessage(msg);\n\t\t// Apply if an operation message\n\t\tif (msg.type === MessageType.Operation) {\n\t\t\tconst opArgs: IMergeTreeDeltaRemoteOpArgs = {\n\t\t\t\top: msg.contents as IMergeTreeOp,\n\t\t\t\tsequencedMessage: msg,\n\t\t\t};\n\t\t\tif (opArgs.sequencedMessage?.clientId === this.longClientId || local) {\n\t\t\t\tthis.ackPendingSegment(opArgs);\n\t\t\t} else {\n\t\t\t\tthis.applyRemoteOp(opArgs);\n\t\t\t}\n\t\t}\n\n\t\tthis.updateSeqNumbers(msg.minimumSequenceNumber, msg.sequenceNumber);\n\t}\n\n\tpublic updateSeqNumbers(min: number, seq: number) {\n\t\tconst collabWindow = this.getCollabWindow();\n\t\t// Equal is fine here due to SharedSegmentSequence<>.snapshotContent() potentially updating with same #\n\t\tassert(\n\t\t\tcollabWindow.currentSeq <= seq,\n\t\t\t0x038 /* \"Incoming op sequence# < local collabWindow's currentSequence#\" */,\n\t\t);\n\t\tcollabWindow.currentSeq = seq;\n\t\tassert(min <= seq, 0x039 /* \"Incoming op sequence# < minSequence#\" */);\n\t\tthis.updateMinSeq(min);\n\t}\n\n\t/**\n\t * Resolves a remote client's position against the local sequence\n\t * and returns the remote client's position relative to the local\n\t * sequence\n\t * @param remoteClientPosition - The remote client's position to resolve\n\t * @param remoteClientRefSeq - The reference sequence number of the remote client\n\t * @param remoteClientId - The client id of the remote client\n\t */\n\tpublic resolveRemoteClientPosition(\n\t\tremoteClientPosition: number,\n\t\tremoteClientRefSeq: number,\n\t\tremoteClientId: string,\n\t): number | undefined {\n\t\tconst shortRemoteClientId = this.getOrAddShortClientId(remoteClientId);\n\t\treturn this._mergeTree.resolveRemoteClientPosition(\n\t\t\tremoteClientPosition,\n\t\t\tremoteClientRefSeq,\n\t\t\tshortRemoteClientId,\n\t\t);\n\t}\n\n\tprivate lastNormalizationRefSeq = 0;\n\n\tprivate pendingRebase: List<SegmentGroup> | undefined;\n\t/**\n\t * Given an pending operation and segment group, regenerate the op, so it\n\t * can be resubmitted\n\t * @param resetOp - The op to reset\n\t * @param segmentGroup - The segment group associated with the op\n\t */\n\tpublic regeneratePendingOp(\n\t\tresetOp: IMergeTreeOp,\n\t\tsegmentGroup: SegmentGroup | SegmentGroup[],\n\t): IMergeTreeOp {\n\t\tif (this.pendingRebase === undefined || this.pendingRebase.empty) {\n\t\t\tlet firstGroup: SegmentGroup;\n\t\t\tif (Array.isArray(segmentGroup)) {\n\t\t\t\tif (segmentGroup.length === 0) {\n\t\t\t\t\t// sometimes we rebase to an empty op\n\t\t\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t\t\treturn createGroupOp();\n\t\t\t\t}\n\t\t\t\tfirstGroup = segmentGroup[0];\n\t\t\t} else {\n\t\t\t\tfirstGroup = segmentGroup;\n\t\t\t}\n\t\t\tconst firstGroupNode = this._mergeTree.pendingSegments.find(\n\t\t\t\t(node) => node.data === firstGroup,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tfirstGroupNode !== undefined,\n\t\t\t\t0x70e /* segment group must exist in pending list */,\n\t\t\t);\n\t\t\tthis.pendingRebase = this._mergeTree.pendingSegments.splice(firstGroupNode);\n\t\t}\n\n\t\tconst rebaseTo = this.getCollabWindow().currentSeq;\n\t\tif (rebaseTo !== this.lastNormalizationRefSeq) {\n\t\t\tthis.emit(\"normalize\", this);\n\t\t\tthis._mergeTree.normalizeSegmentsOnRebase();\n\t\t\tthis.lastNormalizationRefSeq = rebaseTo;\n\t\t}\n\n\t\tconst opList: IMergeTreeDeltaOp[] = [];\n\t\tif (resetOp.type === MergeTreeDeltaType.GROUP) {\n\t\t\tif (Array.isArray(segmentGroup)) {\n\t\t\t\tassert(\n\t\t\t\t\tresetOp.ops.length === segmentGroup.length,\n\t\t\t\t\t0x03a /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */,\n\t\t\t\t);\n\n\t\t\t\tfor (let i = 0; i < resetOp.ops.length; i++) {\n\t\t\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i]));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// A group op containing a single op will pass a direct reference to 'segmentGroup'\n\t\t\t\t// rather than an array of segment groups. (See 'peekPendingSegmentGroups()')\n\t\t\t\tassert(\n\t\t\t\t\tresetOp.ops.length === 1,\n\t\t\t\t\t0x03b /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */,\n\t\t\t\t);\n\t\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp.ops[0], segmentGroup));\n\t\t\t}\n\t\t} else {\n\t\t\tassert(\n\t\t\t\t(resetOp.type as any) !== MergeTreeDeltaType.GROUP,\n\t\t\t\t0x03c /* \"Reset op has 'group' delta type!\" */,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!Array.isArray(segmentGroup),\n\t\t\t\t0x03d /* \"segmentGroup is array rather than singleton!\" */,\n\t\t\t);\n\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp, segmentGroup));\n\t\t}\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\treturn opList.length === 1 ? opList[0] : createGroupOp(...opList);\n\t}\n\n\tpublic createTextHelper(): IMergeTreeTextHelper {\n\t\treturn new MergeTreeTextHelper(this._mergeTree);\n\t}\n\n\tpublic summarize(\n\t\truntime: IFluidDataStoreRuntime,\n\t\thandle: IFluidHandle,\n\t\tserializer: IFluidSerializer,\n\t\tcatchUpMsgs: ISequencedDocumentMessage[],\n\t): ISummaryTreeWithStats {\n\t\tconst deltaManager = runtime.deltaManager;\n\t\tconst minSeq = deltaManager.minimumSequenceNumber;\n\n\t\t// Catch up to latest MSN, if we have not had a chance to do it.\n\t\t// Required for case where FluidDataStoreRuntime.attachChannel()\n\t\t// generates summary right after loading data store.\n\n\t\tthis.updateSeqNumbers(minSeq, deltaManager.lastSequenceNumber);\n\n\t\t// One of the summaries (from SPO) I observed to have chunk.chunkSequenceNumber > minSeq!\n\t\t// Not sure why - need to catch it sooner\n\t\tassert(\n\t\t\tthis.getCollabWindow().minSeq === minSeq,\n\t\t\t0x03e /* \"minSeq mismatch between collab window and delta manager!\" */,\n\t\t);\n\n\t\t// Must continue to support legacy\n\t\t// (See https://github.com/microsoft/FluidFramework/issues/84)\n\t\tif (this._mergeTree.options?.newMergeTreeSnapshotFormat === true) {\n\t\t\tassert(\n\t\t\t\tcatchUpMsgs === undefined || catchUpMsgs.length === 0,\n\t\t\t\t0x03f /* \"New format should not emit catchup ops\" */,\n\t\t\t);\n\t\t\tconst snap = new SnapshotV1(this._mergeTree, this.logger, (id) =>\n\t\t\t\tthis.getLongClientId(id),\n\t\t\t);\n\t\t\tsnap.extractSync();\n\t\t\treturn snap.emit(serializer, handle);\n\t\t} else {\n\t\t\tconst snap = new SnapshotLegacy(this._mergeTree, this.logger);\n\t\t\tsnap.extractSync();\n\t\t\treturn snap.emit(catchUpMsgs, serializer, handle);\n\t\t}\n\t}\n\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tstorage: IChannelStorageService,\n\t\tserializer: IFluidSerializer,\n\t): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]> }> {\n\t\tconst loader = new SnapshotLoader(runtime, this, this._mergeTree, this.logger, serializer);\n\n\t\treturn loader.initialize(storage);\n\t}\n\n\t/**\n\t * @deprecated - this functionality is no longer supported and will be removed\n\t */\n\tgetStackContext(startPos: number, rangeLabels: string[]): RangeStackMap {\n\t\treturn this._mergeTree.getStackContext(\n\t\t\tstartPos,\n\t\t\tthis.getCollabWindow().clientId,\n\t\t\trangeLabels,\n\t\t);\n\t}\n\n\tprivate getLocalSequenceNumber() {\n\t\tconst segWindow = this.getCollabWindow();\n\t\treturn segWindow.collaborating ? UnassignedSequenceNumber : UniversalSequenceNumber;\n\t}\n\n\t// eslint-disable-next-line import/no-deprecated\n\tlocalTransaction(groupOp: IMergeTreeGroupMsg) {\n\t\tfor (const op of groupOp.ops) {\n\t\t\tconst opArgs: IMergeTreeDeltaOpArgs = {\n\t\t\t\top,\n\t\t\t\tgroupOp,\n\t\t\t};\n\t\t\tswitch (op.type) {\n\t\t\t\tcase MergeTreeDeltaType.INSERT:\n\t\t\t\t\tthis.applyInsertOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE:\n\t\t\t\t\tthis.applyAnnotateRangeOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\tcase MergeTreeDeltaType.REMOVE:\n\t\t\t\t\tthis.applyRemoveRangeOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tupdateConsensusProperty(op: IMergeTreeAnnotateMsg, msg: ISequencedDocumentMessage) {\n\t\tconst markerId = op.relativePos1!.id!;\n\t\tconst consensusInfo = this.pendingConsensus.get(markerId);\n\t\tif (consensusInfo) {\n\t\t\tconsensusInfo.marker.addProperties(op.props, op.combiningOp, msg.sequenceNumber);\n\t\t}\n\t\tthis._mergeTree.addMinSeqListener(msg.sequenceNumber, () =>\n\t\t\tconsensusInfo!.callback(consensusInfo!.marker),\n\t\t);\n\t}\n\n\tupdateMinSeq(minSeq: number) {\n\t\tthis._mergeTree.setMinSeq(minSeq);\n\t}\n\n\tgetContainingSegment<T extends ISegment>(\n\t\tpos: number,\n\t\tsequenceArgs?: Pick<ISequencedDocumentMessage, \"referenceSequenceNumber\" | \"clientId\">,\n\t\tlocalSeq?: number,\n\t) {\n\t\tconst { referenceSequenceNumber, clientId } =\n\t\t\tthis.getClientSequenceArgsForMessage(sequenceArgs);\n\t\treturn this._mergeTree.getContainingSegment<T>(\n\t\t\tpos,\n\t\t\treferenceSequenceNumber,\n\t\t\tclientId,\n\t\t\tlocalSeq,\n\t\t);\n\t}\n\n\tgetPropertiesAtPosition(pos: number) {\n\t\tlet propertiesAtPosition: PropertySet | undefined;\n\t\tconst segoff = this.getContainingSegment(pos);\n\t\tconst seg = segoff.segment;\n\t\tif (seg) {\n\t\t\tpropertiesAtPosition = seg.properties;\n\t\t}\n\t\treturn propertiesAtPosition;\n\t}\n\tgetRangeExtentsOfPosition(pos: number) {\n\t\tlet posStart: number | undefined;\n\t\tlet posAfterEnd: number | undefined;\n\n\t\tconst segoff = this.getContainingSegment(pos);\n\t\tconst seg = segoff.segment;\n\t\tif (seg) {\n\t\t\tposStart = this.getPosition(seg);\n\t\t\tposAfterEnd = posStart + seg.cachedLength;\n\t\t}\n\t\treturn { posStart, posAfterEnd };\n\t}\n\tgetCurrentSeq() {\n\t\treturn this.getCollabWindow().currentSeq;\n\t}\n\tgetClientId() {\n\t\treturn this.getCollabWindow().clientId;\n\t}\n\n\tgetLength() {\n\t\treturn this._mergeTree.length ?? 0;\n\t}\n\n\tstartOrUpdateCollaboration(longClientId: string | undefined, minSeq = 0, currentSeq = 0) {\n\t\t// we should always have a client id if we are collaborating\n\t\t// if the client id is undefined we are likely bound to a detached\n\t\t// container, so we should keep going in local mode. once\n\t\t// the container attaches this will be called again on connect with the\n\t\t// client id\n\t\tif (longClientId !== undefined) {\n\t\t\tif (this.longClientId === undefined) {\n\t\t\t\tthis.longClientId = longClientId;\n\t\t\t\tthis.addLongClientId(this.longClientId);\n\t\t\t\tthis._mergeTree.startCollaboration(\n\t\t\t\t\tthis.getShortClientId(this.longClientId),\n\t\t\t\t\tminSeq,\n\t\t\t\t\tcurrentSeq,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst oldClientId = this.longClientId;\n\t\t\t\tconst oldData = this.clientNameToIds.get(oldClientId)!.data;\n\t\t\t\tthis.longClientId = longClientId;\n\t\t\t\tthis.clientNameToIds.put(longClientId, oldData);\n\t\t\t\tthis.shortClientIdMap[oldData] = longClientId;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @deprecated - Use searchForMarker instead.\n\t */\n\tfindTile(startPos: number, tileLabel: string, preceding = true) {\n\t\tconst clientId = this.getClientId();\n\t\treturn this._mergeTree.findTile(startPos, clientId, tileLabel, preceding);\n\t}\n\n\t/**\n\t * Searches a string for the nearest marker in either direction to a given start position.\n\t * The search will include the start position, so markers at the start position are valid\n\t * results of the search. Makes use of block-accelerated search functions for log(n) complexity.\n\t *\n\t * @param startPos - Position at which to start the search\n\t * @param markerLabel - Label of the marker to search for\n\t * @param forwards - Whether the desired marker comes before (false) or after (true) `startPos`\n\t */\n\tsearchForMarker(startPos: number, markerLabel: string, forwards = true) {\n\t\tconst clientId = this.getClientId();\n\t\treturn this._mergeTree.searchForMarker(startPos, clientId, markerLabel, forwards);\n\t}\n}\n"]}
@@ -5,7 +5,7 @@
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.walkList = exports.List = void 0;
8
- const container_utils_1 = require("@fluidframework/container-utils");
8
+ const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
9
9
  class HeadNode {
10
10
  constructor(list) {
11
11
  this._next = this;
@@ -57,7 +57,7 @@ function insertAfter(node, items) {
57
57
  // so i went with a more user-friendly error, which describes the
58
58
  // only condition that could lead to this being undefined in the current code.
59
59
  if (newRange === undefined) {
60
- throw new container_utils_1.UsageError("items must not be empty");
60
+ throw new telemetry_utils_1.UsageError("items must not be empty");
61
61
  }
62
62
  return newRange;
63
63
  }
@@ -189,7 +189,7 @@ function walkList(list, visitor, start, forward = true) {
189
189
  let current;
190
190
  if (start) {
191
191
  if (!list.includes(start)) {
192
- throw new container_utils_1.UsageError("start must be in the provided list");
192
+ throw new telemetry_utils_1.UsageError("start must be in the provided list");
193
193
  }
194
194
  current = start;
195
195
  }