@fluidframework/merge-tree 0.59.3000-66610 → 0.59.3000-67119

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 (61) hide show
  1. package/dist/client.d.ts +11 -2
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +21 -1
  4. package/dist/client.js.map +1 -1
  5. package/dist/collections.d.ts +7 -1
  6. package/dist/collections.d.ts.map +1 -1
  7. package/dist/collections.js +27 -1
  8. package/dist/collections.js.map +1 -1
  9. package/dist/localReference.d.ts +46 -8
  10. package/dist/localReference.d.ts.map +1 -1
  11. package/dist/localReference.js +92 -61
  12. package/dist/localReference.js.map +1 -1
  13. package/dist/mergeTree.d.ts +3 -0
  14. package/dist/mergeTree.d.ts.map +1 -1
  15. package/dist/mergeTree.js +28 -9
  16. package/dist/mergeTree.js.map +1 -1
  17. package/dist/referencePositions.d.ts +1 -0
  18. package/dist/referencePositions.d.ts.map +1 -1
  19. package/dist/referencePositions.js +8 -5
  20. package/dist/referencePositions.js.map +1 -1
  21. package/dist/snapshotlegacy.js +1 -1
  22. package/dist/snapshotlegacy.js.map +1 -1
  23. package/dist/sortedSegmentSet.js +1 -1
  24. package/dist/sortedSegmentSet.js.map +1 -1
  25. package/dist/textSegment.js +3 -2
  26. package/dist/textSegment.js.map +1 -1
  27. package/lib/client.d.ts +11 -2
  28. package/lib/client.d.ts.map +1 -1
  29. package/lib/client.js +21 -1
  30. package/lib/client.js.map +1 -1
  31. package/lib/collections.d.ts +7 -1
  32. package/lib/collections.d.ts.map +1 -1
  33. package/lib/collections.js +26 -1
  34. package/lib/collections.js.map +1 -1
  35. package/lib/localReference.d.ts +46 -8
  36. package/lib/localReference.d.ts.map +1 -1
  37. package/lib/localReference.js +93 -62
  38. package/lib/localReference.js.map +1 -1
  39. package/lib/mergeTree.d.ts +3 -0
  40. package/lib/mergeTree.d.ts.map +1 -1
  41. package/lib/mergeTree.js +29 -10
  42. package/lib/mergeTree.js.map +1 -1
  43. package/lib/referencePositions.d.ts +1 -0
  44. package/lib/referencePositions.d.ts.map +1 -1
  45. package/lib/referencePositions.js +6 -4
  46. package/lib/referencePositions.js.map +1 -1
  47. package/lib/snapshotlegacy.js +1 -1
  48. package/lib/snapshotlegacy.js.map +1 -1
  49. package/lib/sortedSegmentSet.js +1 -1
  50. package/lib/sortedSegmentSet.js.map +1 -1
  51. package/lib/textSegment.js +3 -2
  52. package/lib/textSegment.js.map +1 -1
  53. package/package.json +87 -9
  54. package/src/client.ts +27 -3
  55. package/src/collections.ts +29 -2
  56. package/src/localReference.ts +124 -67
  57. package/src/mergeTree.ts +36 -9
  58. package/src/referencePositions.ts +7 -3
  59. package/src/snapshotlegacy.ts +1 -1
  60. package/src/sortedSegmentSet.ts +1 -1
  61. package/src/textSegment.ts +2 -2
@@ -8,6 +8,7 @@ import { ReferenceType, ICombiningOp } from "./ops";
8
8
  import { PropertySet, MapLike } from "./properties";
9
9
  export declare const reservedTileLabelsKey = "referenceTileLabels";
10
10
  export declare const reservedRangeLabelsKey = "referenceRangeLabels";
11
+ export declare function refTypeIncludesFlag(refPos: ReferencePosition, flags: ReferenceType): boolean;
11
12
  export declare const refGetTileLabels: (refPos: ReferencePosition) => string[] | undefined;
12
13
  export declare const refGetRangeLabels: (refPos: ReferencePosition) => string[] | undefined;
13
14
  export declare function refHasTileLabel(refPos: ReferencePosition, label: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"referencePositions.d.ts","sourceRoot":"","sources":["../src/referencePositions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEpD,eAAO,MAAM,qBAAqB,wBAAwB,CAAC;AAC3D,eAAO,MAAM,sBAAsB,yBAAyB,CAAC;AAE7D,eAAO,MAAM,gBAAgB,WAAY,iBAAiB,KAAG,MAAM,EAAE,GAAG,SAGuB,CAAC;AAEhG,eAAO,MAAM,iBAAiB,WAAY,iBAAiB,KAAG,MAAM,EAAE,GAAG,SAGuB,CAAC;AAEjG,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAUjF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAUlF;AACD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEnE;AACD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEpE;AAED,MAAM,WAAW,iBAAiB;IAC9B,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IAEvB,UAAU,IAAI,QAAQ,GAAG,SAAS,CAAC;IACnC,SAAS,IAAI,MAAM,CAAC;IACpB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9D,MAAM,IAAI,OAAO,CAAC;IAElB;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC;IACzB;;OAEG;IACH,cAAc,IAAI,OAAO,CAAC;IAC1B;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE,GAAG,SAAS,CAAC;IACtC;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE,GAAG,SAAS,CAAC;CAC1C;AAED,oBAAY,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC9D,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAM/E;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAM/E;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAc5F"}
1
+ {"version":3,"file":"referencePositions.d.ts","sourceRoot":"","sources":["../src/referencePositions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEpD,eAAO,MAAM,qBAAqB,wBAAwB,CAAC;AAC3D,eAAO,MAAM,sBAAsB,yBAAyB,CAAC;AAE7D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAG5F;AAED,eAAO,MAAM,gBAAgB,WAAY,iBAAiB,KAAG,MAAM,EAAE,GAAG,SAEuB,CAAC;AAEhG,eAAO,MAAM,iBAAiB,WAAY,iBAAiB,KAAG,MAAM,EAAE,GAAG,SAGuB,CAAC;AAEjG,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAUjF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAUlF;AACD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEnE;AACD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEpE;AAED,MAAM,WAAW,iBAAiB;IAC9B,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IAEvB,UAAU,IAAI,QAAQ,GAAG,SAAS,CAAC;IACnC,SAAS,IAAI,MAAM,CAAC;IACpB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9D,MAAM,IAAI,OAAO,CAAC;IAElB;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC;IACzB;;OAEG;IACH,cAAc,IAAI,OAAO,CAAC;IAC1B;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE,GAAG,SAAS,CAAC;IACtC;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE,GAAG,SAAS,CAAC;CAC1C;AAED,oBAAY,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC9D,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAM/E;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAM/E;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAc5F"}
@@ -5,13 +5,15 @@
5
5
  import { ReferenceType } from "./ops";
6
6
  export const reservedTileLabelsKey = "referenceTileLabels";
7
7
  export const reservedRangeLabelsKey = "referenceRangeLabels";
8
- export const refGetTileLabels = (refPos) =>
9
- // eslint-disable-next-line no-bitwise
10
- (refPos.refType & ReferenceType.Tile)
8
+ export function refTypeIncludesFlag(refPos, flags) {
9
+ // eslint-disable-next-line no-bitwise
10
+ return (refPos.refType & flags) !== 0;
11
+ }
12
+ export const refGetTileLabels = (refPos) => refTypeIncludesFlag(refPos, ReferenceType.Tile)
11
13
  && refPos.properties ? refPos.properties[reservedTileLabelsKey] : undefined;
12
14
  export const refGetRangeLabels = (refPos) =>
13
15
  // eslint-disable-next-line no-bitwise
14
- (refPos.refType & (ReferenceType.NestBegin | ReferenceType.NestEnd))
16
+ (refTypeIncludesFlag(refPos, ReferenceType.NestBegin | ReferenceType.NestEnd))
15
17
  && refPos.properties ? refPos.properties[reservedRangeLabelsKey] : undefined;
16
18
  export function refHasTileLabel(refPos, label) {
17
19
  const tileLabels = refGetTileLabels(refPos);
@@ -1 +1 @@
1
- {"version":3,"file":"referencePositions.js","sourceRoot":"","sources":["../src/referencePositions.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Stack } from \"./collections\";\nimport { ISegment } from \"./mergeTree\";\nimport { ReferenceType, ICombiningOp } from \"./ops\";\nimport { PropertySet, MapLike } from \"./properties\";\n\nexport const reservedTileLabelsKey = \"referenceTileLabels\";\nexport const reservedRangeLabelsKey = \"referenceRangeLabels\";\n\nexport const refGetTileLabels = (refPos: ReferencePosition): string[] | undefined =>\n // eslint-disable-next-line no-bitwise\n (refPos.refType & ReferenceType.Tile)\n && refPos.properties ? refPos.properties[reservedTileLabelsKey] as string[] : undefined;\n\nexport const refGetRangeLabels = (refPos: ReferencePosition): string[] | undefined =>\n // eslint-disable-next-line no-bitwise\n (refPos.refType & (ReferenceType.NestBegin | ReferenceType.NestEnd))\n && refPos.properties ? refPos.properties[reservedRangeLabelsKey] as string[] : undefined;\n\nexport function refHasTileLabel(refPos: ReferencePosition, label: string): boolean {\n const tileLabels = refGetTileLabels(refPos);\n if (tileLabels) {\n for (const refLabel of tileLabels) {\n if (label === refLabel) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function refHasRangeLabel(refPos: ReferencePosition, label: string): boolean {\n const rangeLabels = refGetRangeLabels(refPos);\n if (rangeLabels) {\n for (const refLabel of rangeLabels) {\n if (label === refLabel) {\n return true;\n }\n }\n }\n return false;\n}\nexport function refHasTileLabels(refPos: ReferencePosition): boolean {\n return refGetTileLabels(refPos) !== undefined;\n}\nexport function refHasRangeLabels(refPos: ReferencePosition): boolean {\n return refGetRangeLabels(refPos) !== undefined;\n}\n\nexport interface ReferencePosition {\n properties?: PropertySet;\n refType: ReferenceType;\n\n getSegment(): ISegment | undefined;\n getOffset(): number;\n addProperties(newProps: PropertySet, op?: ICombiningOp): void;\n isLeaf(): boolean;\n\n /**\n * @deprecated - use refHasTileLabels\n */\n hasTileLabels(): boolean;\n /**\n * @deprecated - use refHasRangeLabels\n */\n hasRangeLabels(): boolean;\n /**\n * @deprecated - use refHasTileLabel\n */\n hasTileLabel(label: string): boolean;\n /**\n * @deprecated - use refHasRangeLabel\n */\n hasRangeLabel(label: string): boolean;\n /**\n * @deprecated - use refGetTileLabels\n */\n getTileLabels(): string[] | undefined;\n /**\n * @deprecated - use refGetRangeLabels\n */\n getRangeLabels(): string[] | undefined;\n}\n\nexport type RangeStackMap = MapLike<Stack<ReferencePosition>>;\nexport const DetachedReferencePosition = -1;\n\nexport function minReferencePosition<T extends ReferencePosition>(a: T, b: T): T {\n if (compareReferencePositions(a, b) < 0) {\n return a;\n } else {\n return b;\n }\n}\n\nexport function maxReferencePosition<T extends ReferencePosition>(a: T, b: T): T {\n if (compareReferencePositions(a, b) > 0) {\n return a;\n } else {\n return b;\n }\n}\n\nexport function compareReferencePositions(a: ReferencePosition, b: ReferencePosition): number {\n const aSeg = a.getSegment();\n const bSeg = b.getSegment();\n if (aSeg === bSeg) {\n return a.getOffset() - b.getOffset();\n } else {\n if (aSeg === undefined\n || (bSeg !== undefined &&\n aSeg.ordinal < bSeg.ordinal)) {\n return -1;\n } else {\n return 1;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"referencePositions.js","sourceRoot":"","sources":["../src/referencePositions.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Stack } from \"./collections\";\nimport { ISegment } from \"./mergeTree\";\nimport { ReferenceType, ICombiningOp } from \"./ops\";\nimport { PropertySet, MapLike } from \"./properties\";\n\nexport const reservedTileLabelsKey = \"referenceTileLabels\";\nexport const reservedRangeLabelsKey = \"referenceRangeLabels\";\n\nexport function refTypeIncludesFlag(refPos: ReferencePosition, flags: ReferenceType): boolean {\n // eslint-disable-next-line no-bitwise\n return (refPos.refType & flags) !== 0;\n}\n\nexport const refGetTileLabels = (refPos: ReferencePosition): string[] | undefined =>\n refTypeIncludesFlag(refPos, ReferenceType.Tile)\n && refPos.properties ? refPos.properties[reservedTileLabelsKey] as string[] : undefined;\n\nexport const refGetRangeLabels = (refPos: ReferencePosition): string[] | undefined =>\n // eslint-disable-next-line no-bitwise\n (refTypeIncludesFlag(refPos, ReferenceType.NestBegin | ReferenceType.NestEnd))\n && refPos.properties ? refPos.properties[reservedRangeLabelsKey] as string[] : undefined;\n\nexport function refHasTileLabel(refPos: ReferencePosition, label: string): boolean {\n const tileLabels = refGetTileLabels(refPos);\n if (tileLabels) {\n for (const refLabel of tileLabels) {\n if (label === refLabel) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function refHasRangeLabel(refPos: ReferencePosition, label: string): boolean {\n const rangeLabels = refGetRangeLabels(refPos);\n if (rangeLabels) {\n for (const refLabel of rangeLabels) {\n if (label === refLabel) {\n return true;\n }\n }\n }\n return false;\n}\nexport function refHasTileLabels(refPos: ReferencePosition): boolean {\n return refGetTileLabels(refPos) !== undefined;\n}\nexport function refHasRangeLabels(refPos: ReferencePosition): boolean {\n return refGetRangeLabels(refPos) !== undefined;\n}\n\nexport interface ReferencePosition {\n properties?: PropertySet;\n refType: ReferenceType;\n\n getSegment(): ISegment | undefined;\n getOffset(): number;\n addProperties(newProps: PropertySet, op?: ICombiningOp): void;\n isLeaf(): boolean;\n\n /**\n * @deprecated - use refHasTileLabels\n */\n hasTileLabels(): boolean;\n /**\n * @deprecated - use refHasRangeLabels\n */\n hasRangeLabels(): boolean;\n /**\n * @deprecated - use refHasTileLabel\n */\n hasTileLabel(label: string): boolean;\n /**\n * @deprecated - use refHasRangeLabel\n */\n hasRangeLabel(label: string): boolean;\n /**\n * @deprecated - use refGetTileLabels\n */\n getTileLabels(): string[] | undefined;\n /**\n * @deprecated - use refGetRangeLabels\n */\n getRangeLabels(): string[] | undefined;\n}\n\nexport type RangeStackMap = MapLike<Stack<ReferencePosition>>;\nexport const DetachedReferencePosition = -1;\n\nexport function minReferencePosition<T extends ReferencePosition>(a: T, b: T): T {\n if (compareReferencePositions(a, b) < 0) {\n return a;\n } else {\n return b;\n }\n}\n\nexport function maxReferencePosition<T extends ReferencePosition>(a: T, b: T): T {\n if (compareReferencePositions(a, b) > 0) {\n return a;\n } else {\n return b;\n }\n}\n\nexport function compareReferencePositions(a: ReferencePosition, b: ReferencePosition): number {\n const aSeg = a.getSegment();\n const bSeg = b.getSegment();\n if (aSeg === bSeg) {\n return a.getOffset() - b.getOffset();\n } else {\n if (aSeg === undefined\n || (bSeg !== undefined &&\n aSeg.ordinal < bSeg.ordinal)) {\n return -1;\n } else {\n return 1;\n }\n }\n}\n"]}
@@ -77,7 +77,7 @@ export class SnapshotLegacy {
77
77
  if ((segment.seq !== UnassignedSequenceNumber) && (segment.seq <= this.seq) &&
78
78
  ((segment.removedSeq === undefined) || (segment.removedSeq === UnassignedSequenceNumber) ||
79
79
  (segment.removedSeq > this.seq))) {
80
- if (prev && prev.canAppend(segment)
80
+ if ((prev === null || prev === void 0 ? void 0 : prev.canAppend(segment))
81
81
  && matchProperties(prev.properties, segment.properties)) {
82
82
  prev = prev.clone();
83
83
  prev.append(segment.clone());
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotlegacy.js","sourceRoot":"","sources":["../src/snapshotlegacy.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert } from \"@fluidframework/common-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { NonCollabClient, UnassignedSequenceNumber } from \"./constants\";\nimport {\n ISegment,\n MergeTree,\n} from \"./mergeTree\";\nimport { IJSONSegment } from \"./ops\";\nimport { matchProperties } from \"./properties\";\nimport {\n MergeTreeChunkLegacy,\n serializeAsMinSupportedVersion,\n} from \"./snapshotChunks\";\n\ninterface SnapshotHeader {\n chunkCount?: number;\n segmentsTotalLength: number;\n indexOffset?: number;\n segmentsOffset?: number;\n seq: number;\n // TODO: Make 'minSeq' non-optional once the new snapshot format becomes the default?\n // (See https://github.com/microsoft/FluidFramework/issues/84)\n minSeq?: number;\n}\n\nexport class SnapshotLegacy {\n public static readonly header = \"header\";\n public static readonly body = \"body\";\n private static readonly catchupOps = \"catchupOps\";\n\n // Split snapshot into two entries - headers (small) and body (overflow) for faster loading initial content\n // Please note that this number has no direct relationship to anything other than size of raw text (characters).\n // As we produce json for the blob (and then send over the wire compressed), this number\n // is really hard to correlate with any actual metric that matters (like bytes over the wire).\n // For test with small number of chunks it would be closer to blob size,\n // for very chunky text, blob size can easily be 4x-8x of that number.\n public static readonly sizeOfFirstChunk: number = 10000;\n\n private header: SnapshotHeader | undefined;\n private seq: number | undefined;\n private segments: IJSONSegment[] | undefined;\n private segmentLengths: number[] | undefined;\n private readonly logger: ITelemetryLogger;\n private readonly chunkSize: number;\n\n constructor(public mergeTree: MergeTree, logger: ITelemetryLogger, public filename?: string,\n public onCompletion?: () => void) {\n this.logger = ChildLogger.create(logger, \"Snapshot\");\n this.chunkSize = mergeTree?.options?.mergeTreeSnapshotChunkSize ?? SnapshotLegacy.sizeOfFirstChunk;\n }\n\n private getSeqLengthSegs(\n allSegments: IJSONSegment[],\n allLengths: number[],\n approxSequenceLength: number,\n startIndex = 0): MergeTreeChunkLegacy {\n const segs: IJSONSegment[] = [];\n let sequenceLength = 0;\n let segCount = 0;\n while ((sequenceLength < approxSequenceLength) && ((startIndex + segCount) < allSegments.length)) {\n const pseg = allSegments[startIndex + segCount];\n segs.push(pseg);\n sequenceLength += allLengths[startIndex + segCount];\n segCount++;\n }\n return {\n version: undefined,\n chunkStartSegmentIndex: startIndex,\n chunkSegmentCount: segCount,\n chunkLengthChars: sequenceLength,\n totalLengthChars: this.header!.segmentsTotalLength,\n totalSegmentCount: allSegments.length,\n chunkSequenceNumber: this.header!.seq,\n segmentTexts: segs,\n };\n }\n\n /**\n * Emits the snapshot to an ISummarizeResult. If provided the optional IFluidSerializer will be used when\n * serializing the summary data rather than JSON.stringify.\n */\n emit(\n catchUpMsgs: ISequencedDocumentMessage[],\n serializer: IFluidSerializer,\n bind: IFluidHandle,\n ): ISummaryTreeWithStats {\n const chunk1 = this.getSeqLengthSegs(this.segments!, this.segmentLengths!, this.chunkSize);\n let length: number = chunk1.chunkLengthChars;\n let segments: number = chunk1.chunkSegmentCount;\n const builder = new SummaryTreeBuilder();\n builder.addBlob(SnapshotLegacy.header, serializeAsMinSupportedVersion(\n SnapshotLegacy.header,\n chunk1,\n this.logger,\n this.mergeTree.options,\n serializer,\n bind));\n\n if (chunk1.chunkSegmentCount < chunk1.totalSegmentCount!) {\n const chunk2 = this.getSeqLengthSegs(this.segments!, this.segmentLengths!,\n this.header!.segmentsTotalLength, chunk1.chunkSegmentCount);\n length += chunk2.chunkLengthChars;\n segments += chunk2.chunkSegmentCount;\n builder.addBlob(SnapshotLegacy.body, serializeAsMinSupportedVersion(\n SnapshotLegacy.body,\n chunk2,\n this.logger,\n this.mergeTree.options,\n serializer,\n bind));\n }\n\n assert(\n length === this.header!.segmentsTotalLength,\n 0x05d /* \"emit: mismatch in segmentsTotalLength\" */);\n\n assert(\n segments === chunk1.totalSegmentCount,\n 0x05e /* \"emit: mismatch in totalSegmentCount\" */);\n\n if (catchUpMsgs !== undefined && catchUpMsgs.length > 0) {\n builder.addBlob(\n this.mergeTree.options?.catchUpBlobName ?? SnapshotLegacy.catchupOps,\n serializer ? serializer.stringify(catchUpMsgs, bind) : JSON.stringify(catchUpMsgs));\n }\n\n return builder.getSummaryTree();\n }\n\n extractSync() {\n const collabWindow = this.mergeTree.getCollabWindow();\n this.seq = collabWindow.minSeq;\n this.header = {\n segmentsTotalLength: this.mergeTree.getLength(this.mergeTree.collabWindow.minSeq,\n NonCollabClient),\n seq: this.mergeTree.collabWindow.minSeq,\n };\n\n const segs: ISegment[] = [];\n let prev: ISegment | undefined;\n const extractSegment =\n // eslint-disable-next-line max-len\n (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number | undefined, end: number | undefined) => {\n if ((segment.seq !== UnassignedSequenceNumber) && (segment.seq! <= this.seq!) &&\n ((segment.removedSeq === undefined) || (segment.removedSeq === UnassignedSequenceNumber) ||\n (segment.removedSeq > this.seq!))) {\n if (prev && prev.canAppend(segment)\n && matchProperties(prev.properties, segment.properties)\n ) {\n prev = prev.clone();\n prev.append(segment.clone());\n } else {\n if (prev) {\n segs.push(prev);\n }\n prev = segment;\n }\n }\n return true;\n };\n\n this.mergeTree.map({ leaf: extractSegment }, this.seq, NonCollabClient, undefined);\n if (prev) {\n segs.push(prev);\n }\n\n this.segments = [];\n this.segmentLengths = [];\n let totalLength: number = 0;\n segs.map((segment) => {\n totalLength += segment.cachedLength;\n this.segments!.push(segment.toJSONObject());\n this.segmentLengths!.push(segment.cachedLength);\n });\n\n // We observed this.header.segmentsTotalLength < totalLength to happen in some cases\n // When this condition happens, we might not write out all segments in getSeqLengthSegs()\n // when writing out \"body\". Issue #1995 tracks following up on the core of the problem.\n // In the meantime, this code makes sure we will write out all segments properly\n\n if (this.header.segmentsTotalLength !== totalLength) {\n this.logger.sendErrorEvent({\n eventName: \"SegmentsTotalLengthMismatch\",\n totalLength,\n segmentsTotalLength: this.header.segmentsTotalLength,\n });\n this.header.segmentsTotalLength = totalLength;\n }\n\n return this.segments;\n }\n}\n"]}
1
+ {"version":3,"file":"snapshotlegacy.js","sourceRoot":"","sources":["../src/snapshotlegacy.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert } from \"@fluidframework/common-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { NonCollabClient, UnassignedSequenceNumber } from \"./constants\";\nimport {\n ISegment,\n MergeTree,\n} from \"./mergeTree\";\nimport { IJSONSegment } from \"./ops\";\nimport { matchProperties } from \"./properties\";\nimport {\n MergeTreeChunkLegacy,\n serializeAsMinSupportedVersion,\n} from \"./snapshotChunks\";\n\ninterface SnapshotHeader {\n chunkCount?: number;\n segmentsTotalLength: number;\n indexOffset?: number;\n segmentsOffset?: number;\n seq: number;\n // TODO: Make 'minSeq' non-optional once the new snapshot format becomes the default?\n // (See https://github.com/microsoft/FluidFramework/issues/84)\n minSeq?: number;\n}\n\nexport class SnapshotLegacy {\n public static readonly header = \"header\";\n public static readonly body = \"body\";\n private static readonly catchupOps = \"catchupOps\";\n\n // Split snapshot into two entries - headers (small) and body (overflow) for faster loading initial content\n // Please note that this number has no direct relationship to anything other than size of raw text (characters).\n // As we produce json for the blob (and then send over the wire compressed), this number\n // is really hard to correlate with any actual metric that matters (like bytes over the wire).\n // For test with small number of chunks it would be closer to blob size,\n // for very chunky text, blob size can easily be 4x-8x of that number.\n public static readonly sizeOfFirstChunk: number = 10000;\n\n private header: SnapshotHeader | undefined;\n private seq: number | undefined;\n private segments: IJSONSegment[] | undefined;\n private segmentLengths: number[] | undefined;\n private readonly logger: ITelemetryLogger;\n private readonly chunkSize: number;\n\n constructor(public mergeTree: MergeTree, logger: ITelemetryLogger, public filename?: string,\n public onCompletion?: () => void) {\n this.logger = ChildLogger.create(logger, \"Snapshot\");\n this.chunkSize = mergeTree?.options?.mergeTreeSnapshotChunkSize ?? SnapshotLegacy.sizeOfFirstChunk;\n }\n\n private getSeqLengthSegs(\n allSegments: IJSONSegment[],\n allLengths: number[],\n approxSequenceLength: number,\n startIndex = 0): MergeTreeChunkLegacy {\n const segs: IJSONSegment[] = [];\n let sequenceLength = 0;\n let segCount = 0;\n while ((sequenceLength < approxSequenceLength) && ((startIndex + segCount) < allSegments.length)) {\n const pseg = allSegments[startIndex + segCount];\n segs.push(pseg);\n sequenceLength += allLengths[startIndex + segCount];\n segCount++;\n }\n return {\n version: undefined,\n chunkStartSegmentIndex: startIndex,\n chunkSegmentCount: segCount,\n chunkLengthChars: sequenceLength,\n totalLengthChars: this.header!.segmentsTotalLength,\n totalSegmentCount: allSegments.length,\n chunkSequenceNumber: this.header!.seq,\n segmentTexts: segs,\n };\n }\n\n /**\n * Emits the snapshot to an ISummarizeResult. If provided the optional IFluidSerializer will be used when\n * serializing the summary data rather than JSON.stringify.\n */\n emit(\n catchUpMsgs: ISequencedDocumentMessage[],\n serializer: IFluidSerializer,\n bind: IFluidHandle,\n ): ISummaryTreeWithStats {\n const chunk1 = this.getSeqLengthSegs(this.segments!, this.segmentLengths!, this.chunkSize);\n let length: number = chunk1.chunkLengthChars;\n let segments: number = chunk1.chunkSegmentCount;\n const builder = new SummaryTreeBuilder();\n builder.addBlob(SnapshotLegacy.header, serializeAsMinSupportedVersion(\n SnapshotLegacy.header,\n chunk1,\n this.logger,\n this.mergeTree.options,\n serializer,\n bind));\n\n if (chunk1.chunkSegmentCount < chunk1.totalSegmentCount!) {\n const chunk2 = this.getSeqLengthSegs(this.segments!, this.segmentLengths!,\n this.header!.segmentsTotalLength, chunk1.chunkSegmentCount);\n length += chunk2.chunkLengthChars;\n segments += chunk2.chunkSegmentCount;\n builder.addBlob(SnapshotLegacy.body, serializeAsMinSupportedVersion(\n SnapshotLegacy.body,\n chunk2,\n this.logger,\n this.mergeTree.options,\n serializer,\n bind));\n }\n\n assert(\n length === this.header!.segmentsTotalLength,\n 0x05d /* \"emit: mismatch in segmentsTotalLength\" */);\n\n assert(\n segments === chunk1.totalSegmentCount,\n 0x05e /* \"emit: mismatch in totalSegmentCount\" */);\n\n if (catchUpMsgs !== undefined && catchUpMsgs.length > 0) {\n builder.addBlob(\n this.mergeTree.options?.catchUpBlobName ?? SnapshotLegacy.catchupOps,\n serializer ? serializer.stringify(catchUpMsgs, bind) : JSON.stringify(catchUpMsgs));\n }\n\n return builder.getSummaryTree();\n }\n\n extractSync() {\n const collabWindow = this.mergeTree.getCollabWindow();\n this.seq = collabWindow.minSeq;\n this.header = {\n segmentsTotalLength: this.mergeTree.getLength(this.mergeTree.collabWindow.minSeq,\n NonCollabClient),\n seq: this.mergeTree.collabWindow.minSeq,\n };\n\n const segs: ISegment[] = [];\n let prev: ISegment | undefined;\n const extractSegment =\n // eslint-disable-next-line max-len\n (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number | undefined, end: number | undefined) => {\n if ((segment.seq !== UnassignedSequenceNumber) && (segment.seq! <= this.seq!) &&\n ((segment.removedSeq === undefined) || (segment.removedSeq === UnassignedSequenceNumber) ||\n (segment.removedSeq > this.seq!))) {\n if (prev?.canAppend(segment)\n && matchProperties(prev.properties, segment.properties)\n ) {\n prev = prev.clone();\n prev.append(segment.clone());\n } else {\n if (prev) {\n segs.push(prev);\n }\n prev = segment;\n }\n }\n return true;\n };\n\n this.mergeTree.map({ leaf: extractSegment }, this.seq, NonCollabClient, undefined);\n if (prev) {\n segs.push(prev);\n }\n\n this.segments = [];\n this.segmentLengths = [];\n let totalLength: number = 0;\n segs.map((segment) => {\n totalLength += segment.cachedLength;\n this.segments!.push(segment.toJSONObject());\n this.segmentLengths!.push(segment.cachedLength);\n });\n\n // We observed this.header.segmentsTotalLength < totalLength to happen in some cases\n // When this condition happens, we might not write out all segments in getSeqLengthSegs()\n // when writing out \"body\". Issue #1995 tracks following up on the core of the problem.\n // In the meantime, this code makes sure we will write out all segments properly\n\n if (this.header.segmentsTotalLength !== totalLength) {\n this.logger.sendErrorEvent({\n eventName: \"SegmentsTotalLengthMismatch\",\n totalLength,\n segmentsTotalLength: this.header.segmentsTotalLength,\n });\n this.header.segmentsTotalLength = totalLength;\n }\n\n return this.segments;\n }\n}\n"]}
@@ -47,7 +47,7 @@ export class SortedSegmentSet {
47
47
  }
48
48
  getOrdinal(item) {
49
49
  const maybeObject = item;
50
- if (maybeObject && maybeObject.segment) {
50
+ if (maybeObject === null || maybeObject === void 0 ? void 0 : maybeObject.segment) {
51
51
  return maybeObject.segment.ordinal;
52
52
  }
53
53
  const maybeSegment = item;
@@ -1 +1 @@
1
- {"version":3,"file":"sortedSegmentSet.js","sourceRoot":"","sources":["../src/sortedSegmentSet.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ISegment } from \"./mergeTree\";\n\n/**\n * Stores a unique and sorted set of segments, or objects with segments\n *\n * This differs from a normal sorted set in that the keys are not fixed.\n * The segments are sorted via their ordinals which can change as the merge tree is modified.\n * Even though the values of the ordinals can change their ordering and uniqueness cannot, so the order of a set of\n * segments ordered by their ordinals will always have the same order even if the ordinal values on\n * the segments changes. This invariant allows ensure the segments stay ordered and unique, and that new segments\n * can be inserted into that order.\n */\nexport class SortedSegmentSet<T extends ISegment | { readonly segment: ISegment; } = ISegment> {\n private readonly ordinalSortedItems: T[] = [];\n\n public get size(): number {\n return this.ordinalSortedItems.length;\n }\n\n public get items(): readonly T[] {\n return this.ordinalSortedItems;\n }\n\n public addOrUpdate(newItem: T, update?: (existingItem: T, newItem: T) => T) {\n const position = this.findOrdinalPosition(this.getOrdinal(newItem));\n if (position.exists) {\n if (update) {\n update(this.ordinalSortedItems[position.index], newItem);\n }\n } else {\n this.ordinalSortedItems.splice(position.index, 0, newItem);\n }\n }\n\n public remove(item: T): boolean {\n const position = this.findOrdinalPosition(this.getOrdinal(item));\n if (position.exists) {\n this.ordinalSortedItems.splice(position.index, 1);\n return true;\n }\n return false;\n }\n\n public has(item: T): boolean {\n const position = this.findOrdinalPosition(this.getOrdinal(item));\n return position.exists;\n }\n\n private getOrdinal(item: T): string {\n const maybeObject = item as { readonly segment: ISegment; };\n if (maybeObject && maybeObject.segment) {\n return maybeObject.segment.ordinal;\n }\n\n const maybeSegment = item as ISegment;\n return maybeSegment.ordinal;\n }\n\n private findOrdinalPosition(ordinal: string, start?: number, end?: number): { exists: boolean; index: number; } {\n if (this.ordinalSortedItems.length === 0) {\n return { exists: false, index: 0 };\n }\n if (start === undefined || end === undefined) {\n return this.findOrdinalPosition(ordinal, 0, this.ordinalSortedItems.length - 1);\n }\n const index = start + Math.floor((end - start) / 2);\n if (this.getOrdinal(this.ordinalSortedItems[index]) > ordinal) {\n if (start === index) {\n return { exists: false, index };\n }\n return this.findOrdinalPosition(ordinal, start, index - 1);\n } else if (this.getOrdinal(this.ordinalSortedItems[index]) < ordinal) {\n if (index === end) {\n return { exists: false, index: index + 1 };\n }\n return this.findOrdinalPosition(ordinal, index + 1, end);\n }\n return { exists: true, index };\n }\n}\n"]}
1
+ {"version":3,"file":"sortedSegmentSet.js","sourceRoot":"","sources":["../src/sortedSegmentSet.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ISegment } from \"./mergeTree\";\n\n/**\n * Stores a unique and sorted set of segments, or objects with segments\n *\n * This differs from a normal sorted set in that the keys are not fixed.\n * The segments are sorted via their ordinals which can change as the merge tree is modified.\n * Even though the values of the ordinals can change their ordering and uniqueness cannot, so the order of a set of\n * segments ordered by their ordinals will always have the same order even if the ordinal values on\n * the segments changes. This invariant allows ensure the segments stay ordered and unique, and that new segments\n * can be inserted into that order.\n */\nexport class SortedSegmentSet<T extends ISegment | { readonly segment: ISegment; } = ISegment> {\n private readonly ordinalSortedItems: T[] = [];\n\n public get size(): number {\n return this.ordinalSortedItems.length;\n }\n\n public get items(): readonly T[] {\n return this.ordinalSortedItems;\n }\n\n public addOrUpdate(newItem: T, update?: (existingItem: T, newItem: T) => T) {\n const position = this.findOrdinalPosition(this.getOrdinal(newItem));\n if (position.exists) {\n if (update) {\n update(this.ordinalSortedItems[position.index], newItem);\n }\n } else {\n this.ordinalSortedItems.splice(position.index, 0, newItem);\n }\n }\n\n public remove(item: T): boolean {\n const position = this.findOrdinalPosition(this.getOrdinal(item));\n if (position.exists) {\n this.ordinalSortedItems.splice(position.index, 1);\n return true;\n }\n return false;\n }\n\n public has(item: T): boolean {\n const position = this.findOrdinalPosition(this.getOrdinal(item));\n return position.exists;\n }\n\n private getOrdinal(item: T): string {\n const maybeObject = item as { readonly segment: ISegment; };\n if (maybeObject?.segment) {\n return maybeObject.segment.ordinal;\n }\n\n const maybeSegment = item as ISegment;\n return maybeSegment.ordinal;\n }\n\n private findOrdinalPosition(ordinal: string, start?: number, end?: number): { exists: boolean; index: number; } {\n if (this.ordinalSortedItems.length === 0) {\n return { exists: false, index: 0 };\n }\n if (start === undefined || end === undefined) {\n return this.findOrdinalPosition(ordinal, 0, this.ordinalSortedItems.length - 1);\n }\n const index = start + Math.floor((end - start) / 2);\n if (this.getOrdinal(this.ordinalSortedItems[index]) > ordinal) {\n if (start === index) {\n return { exists: false, index };\n }\n return this.findOrdinalPosition(ordinal, start, index - 1);\n } else if (this.getOrdinal(this.ordinalSortedItems[index]) < ordinal) {\n if (index === end) {\n return { exists: false, index: index + 1 };\n }\n return this.findOrdinalPosition(ordinal, index + 1, end);\n }\n return { exists: true, index };\n }\n}\n"]}
@@ -107,6 +107,7 @@ export class MergeTreeTextHelper {
107
107
  constructor(mergeTree) {
108
108
  this.mergeTree = mergeTree;
109
109
  this.gatherText = (segment, pos, refSeq, clientId, start, end, accumText) => {
110
+ var _a, _b;
110
111
  let _start = start;
111
112
  if (TextSegment.is(segment)) {
112
113
  let beginTags = "";
@@ -115,10 +116,10 @@ export class MergeTreeTextHelper {
115
116
  // TODO: let clients pass in function to get tag
116
117
  const tags = [];
117
118
  const initTags = [];
118
- if (segment.properties && (segment.properties["font-weight"])) {
119
+ if ((_a = segment.properties) === null || _a === void 0 ? void 0 : _a["font-weight"]) {
119
120
  tags.push("b");
120
121
  }
121
- if (segment.properties && (segment.properties["text-decoration"])) {
122
+ if ((_b = segment.properties) === null || _b === void 0 ? void 0 : _b["text-decoration"]) {
122
123
  tags.push("u");
123
124
  }
124
125
  const remTags = [];
@@ -1 +1 @@
1
- {"version":3,"file":"textSegment.js","sourceRoot":"","sources":["../src/textSegment.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IIntegerRange } from \"./base\";\nimport { BaseSegment, ISegment, Marker, MergeTree } from \"./mergeTree\";\nimport { IJSONSegment } from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { LocalReferenceCollection } from \"./localReference\";\n\n// Maximum length of text segment to be considered to be merged with other segment.\n// Maximum segment length is at least 2x of it (not taking into account initial segment creation).\n// The bigger it is, the more expensive it is to break segment into sub-segments (on edits)\n// The smaller it is, the more segments we have in snapshots (and in memory) - it's more expensive to load snapshots.\n// Small number also makes ReplayTool produce false positives (\"same\" snapshots have slightly different binary\n// representations). More measurements needs to be done, but it's very likely the right spot is somewhere between\n// 1K-2K mark. That said, we also break segments on newline and there are very few segments that are longer than 256\n// because of it. Must be an even number\nconst TextSegmentGranularity = 256;\n\nexport interface IJSONTextSegment extends IJSONSegment {\n text: string;\n}\n\nexport class TextSegment extends BaseSegment {\n public static readonly type = \"TextSegment\";\n\n public static is(segment: ISegment): segment is TextSegment {\n return segment.type === TextSegment.type;\n }\n\n public static make(text: string, props?: PropertySet) {\n const seg = new TextSegment(text);\n if (props) {\n seg.addProperties(props);\n }\n return seg;\n }\n\n public static fromJSONObject(spec: any) {\n if (typeof spec === \"string\") {\n return new TextSegment(spec);\n } else if (spec && typeof spec === \"object\" && \"text\" in spec) {\n const textSpec = spec as IJSONTextSegment;\n return TextSegment.make(textSpec.text, textSpec.props as PropertySet);\n }\n return undefined;\n }\n\n public readonly type = TextSegment.type;\n\n constructor(public text: string) {\n super();\n this.cachedLength = text.length;\n }\n\n public toJSONObject() {\n // To reduce snapshot/ops size, we serialize a TextSegment as a plain 'string' if it is\n // not annotated.\n return this.properties\n ? { text: this.text, props: this.properties }\n : this.text;\n }\n\n public clone(start = 0, end?: number) {\n const text = this.text.substring(start, end);\n const b = TextSegment.make(text, this.properties);\n this.cloneInto(b);\n return b;\n }\n\n public canAppend(segment: ISegment): boolean {\n return !this.text.endsWith(\"\\n\")\n && TextSegment.is(segment)\n && (this.cachedLength <= TextSegmentGranularity ||\n segment.cachedLength <= TextSegmentGranularity);\n }\n\n public toString() {\n return this.text;\n }\n\n public append(segment: ISegment) {\n if (TextSegment.is(segment)) {\n // Note: Must call 'appendLocalRefs' before modifying this segment's length as\n // 'this.cachedLength' is used to adjust the offsets of the local refs.\n LocalReferenceCollection.append(this, segment);\n\n this.text += segment.text;\n this.cachedLength = this.text.length;\n } else {\n throw new Error(\"can only append text segment\");\n }\n }\n\n // TODO: retain removed text for undo\n // returns true if entire string removed\n public removeRange(start: number, end: number) {\n let remnantString = \"\";\n const len = this.text.length;\n if (start > 0) {\n remnantString += this.text.substring(0, start);\n }\n if (end < len) {\n remnantString += this.text.substring(end);\n }\n this.text = remnantString;\n this.cachedLength = remnantString.length;\n return (remnantString.length === 0);\n }\n\n protected createSplitSegmentAt(pos: number) {\n if (pos > 0) {\n const remainingText = this.text.substring(pos);\n this.text = this.text.substring(0, pos);\n this.cachedLength = this.text.length;\n const leafSegment = new TextSegment(remainingText);\n return leafSegment;\n }\n }\n}\n\ninterface ITextAccumulator {\n textSegment: TextSegment;\n placeholder?: string;\n parallelArrays?: boolean;\n}\n\ninterface ITextAndMarkerAccumulator extends ITextAccumulator {\n parallelArrays: true;\n parallelText: string[];\n parallelMarkers: Marker[];\n parallelMarkerLabel: string;\n tagsInProgress: string[];\n}\n\nfunction isTextAndMarkerAccumulator(accum: ITextAccumulator): accum is ITextAndMarkerAccumulator {\n return accum.parallelArrays === true;\n}\n\ntype ITextAccumulatorType = ITextAccumulator | ITextAndMarkerAccumulator;\nexport class MergeTreeTextHelper {\n constructor(private readonly mergeTree: MergeTree) { }\n\n public getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number) {\n const range = this.getValidRange(start, end, refSeq, clientId);\n const accum: ITextAndMarkerAccumulator = {\n parallelArrays: true,\n parallelMarkerLabel: label,\n parallelMarkers: [],\n parallelText: [],\n tagsInProgress: [],\n textSegment: new TextSegment(\"\"),\n };\n\n this.mergeTree.mapRange<ITextAndMarkerAccumulator>(\n { leaf: this.gatherText },\n refSeq,\n clientId,\n accum,\n range.start,\n range.end);\n\n return { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };\n }\n\n public getText(refSeq: number, clientId: number, placeholder = \"\", start?: number, end?: number) {\n const range = this.getValidRange(start, end, refSeq, clientId);\n\n const accum: ITextAccumulator = { textSegment: new TextSegment(\"\"), placeholder };\n\n this.mergeTree.mapRange<ITextAccumulator>(\n { leaf: this.gatherText },\n refSeq,\n clientId,\n accum,\n range.start,\n range.end);\n return accum.textSegment.text;\n }\n\n private getValidRange(\n start: number | undefined,\n end: number | undefined,\n refSeq: number,\n clientId: number,\n ): IIntegerRange {\n const range: IIntegerRange = {\n end: end ?? this.mergeTree.getLength(refSeq, clientId),\n start: start ?? 0,\n };\n return range;\n }\n\n private readonly gatherText = (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number,\n end: number, accumText: ITextAccumulatorType) => {\n let _start = start;\n if (TextSegment.is(segment)) {\n let beginTags = \"\";\n let endTags = \"\";\n if (isTextAndMarkerAccumulator(accumText)) {\n // TODO: let clients pass in function to get tag\n const tags = [] as string[];\n const initTags = [] as string[];\n\n if (segment.properties && (segment.properties[\"font-weight\"])) {\n tags.push(\"b\");\n }\n if (segment.properties && (segment.properties[\"text-decoration\"])) {\n tags.push(\"u\");\n }\n const remTags = [] as string[];\n if (tags.length > 0) {\n for (const tag of tags) {\n if (!accumText.tagsInProgress.includes(tag)) {\n beginTags += `<${tag}>`;\n initTags.push(tag);\n }\n }\n for (const accumTag of accumText.tagsInProgress) {\n if (!tags.includes(accumTag)) {\n endTags += `</${accumTag}>`;\n remTags.push(accumTag);\n }\n }\n for (const initTag of initTags.reverse()) {\n accumText.tagsInProgress.push(initTag);\n }\n } else {\n for (const accumTag of accumText.tagsInProgress) {\n endTags += `</${accumTag}>`;\n remTags.push(accumTag);\n }\n }\n for (const remTag of remTags) {\n const remdex = accumText.tagsInProgress.indexOf(remTag);\n if (remdex >= 0) {\n accumText.tagsInProgress.splice(remdex, 1);\n }\n }\n }\n accumText.textSegment.text += endTags;\n accumText.textSegment.text += beginTags;\n if ((_start <= 0) && (end >= segment.text.length)) {\n accumText.textSegment.text += segment.text;\n } else {\n if (_start < 0) {\n _start = 0;\n }\n if (end >= segment.text.length) {\n accumText.textSegment.text += segment.text.substring(_start);\n } else {\n accumText.textSegment.text += segment.text.substring(_start, end);\n }\n }\n } else {\n if (accumText.placeholder && (accumText.placeholder.length > 0)) {\n if (accumText.placeholder === \"*\") {\n const marker = segment as Marker;\n accumText.textSegment.text += `\\n${marker.toString()}`;\n } else {\n for (let i = 0; i < segment.cachedLength; i++) {\n accumText.textSegment.text += accumText.placeholder;\n }\n }\n } else if (isTextAndMarkerAccumulator(accumText)) {\n const marker = segment as Marker;\n if (marker.hasTileLabel(accumText.parallelMarkerLabel)) {\n accumText.parallelMarkers.push(marker);\n accumText.parallelText.push(accumText.textSegment.text);\n accumText.textSegment.text = \"\";\n }\n }\n }\n\n return true;\n };\n}\n"]}
1
+ {"version":3,"file":"textSegment.js","sourceRoot":"","sources":["../src/textSegment.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IIntegerRange } from \"./base\";\nimport { BaseSegment, ISegment, Marker, MergeTree } from \"./mergeTree\";\nimport { IJSONSegment } from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { LocalReferenceCollection } from \"./localReference\";\n\n// Maximum length of text segment to be considered to be merged with other segment.\n// Maximum segment length is at least 2x of it (not taking into account initial segment creation).\n// The bigger it is, the more expensive it is to break segment into sub-segments (on edits)\n// The smaller it is, the more segments we have in snapshots (and in memory) - it's more expensive to load snapshots.\n// Small number also makes ReplayTool produce false positives (\"same\" snapshots have slightly different binary\n// representations). More measurements needs to be done, but it's very likely the right spot is somewhere between\n// 1K-2K mark. That said, we also break segments on newline and there are very few segments that are longer than 256\n// because of it. Must be an even number\nconst TextSegmentGranularity = 256;\n\nexport interface IJSONTextSegment extends IJSONSegment {\n text: string;\n}\n\nexport class TextSegment extends BaseSegment {\n public static readonly type = \"TextSegment\";\n\n public static is(segment: ISegment): segment is TextSegment {\n return segment.type === TextSegment.type;\n }\n\n public static make(text: string, props?: PropertySet) {\n const seg = new TextSegment(text);\n if (props) {\n seg.addProperties(props);\n }\n return seg;\n }\n\n public static fromJSONObject(spec: any) {\n if (typeof spec === \"string\") {\n return new TextSegment(spec);\n } else if (spec && typeof spec === \"object\" && \"text\" in spec) {\n const textSpec = spec as IJSONTextSegment;\n return TextSegment.make(textSpec.text, textSpec.props as PropertySet);\n }\n return undefined;\n }\n\n public readonly type = TextSegment.type;\n\n constructor(public text: string) {\n super();\n this.cachedLength = text.length;\n }\n\n public toJSONObject() {\n // To reduce snapshot/ops size, we serialize a TextSegment as a plain 'string' if it is\n // not annotated.\n return this.properties\n ? { text: this.text, props: this.properties }\n : this.text;\n }\n\n public clone(start = 0, end?: number) {\n const text = this.text.substring(start, end);\n const b = TextSegment.make(text, this.properties);\n this.cloneInto(b);\n return b;\n }\n\n public canAppend(segment: ISegment): boolean {\n return !this.text.endsWith(\"\\n\")\n && TextSegment.is(segment)\n && (this.cachedLength <= TextSegmentGranularity ||\n segment.cachedLength <= TextSegmentGranularity);\n }\n\n public toString() {\n return this.text;\n }\n\n public append(segment: ISegment) {\n if (TextSegment.is(segment)) {\n // Note: Must call 'appendLocalRefs' before modifying this segment's length as\n // 'this.cachedLength' is used to adjust the offsets of the local refs.\n LocalReferenceCollection.append(this, segment);\n\n this.text += segment.text;\n this.cachedLength = this.text.length;\n } else {\n throw new Error(\"can only append text segment\");\n }\n }\n\n // TODO: retain removed text for undo\n // returns true if entire string removed\n public removeRange(start: number, end: number) {\n let remnantString = \"\";\n const len = this.text.length;\n if (start > 0) {\n remnantString += this.text.substring(0, start);\n }\n if (end < len) {\n remnantString += this.text.substring(end);\n }\n this.text = remnantString;\n this.cachedLength = remnantString.length;\n return (remnantString.length === 0);\n }\n\n protected createSplitSegmentAt(pos: number) {\n if (pos > 0) {\n const remainingText = this.text.substring(pos);\n this.text = this.text.substring(0, pos);\n this.cachedLength = this.text.length;\n const leafSegment = new TextSegment(remainingText);\n return leafSegment;\n }\n }\n}\n\ninterface ITextAccumulator {\n textSegment: TextSegment;\n placeholder?: string;\n parallelArrays?: boolean;\n}\n\ninterface ITextAndMarkerAccumulator extends ITextAccumulator {\n parallelArrays: true;\n parallelText: string[];\n parallelMarkers: Marker[];\n parallelMarkerLabel: string;\n tagsInProgress: string[];\n}\n\nfunction isTextAndMarkerAccumulator(accum: ITextAccumulator): accum is ITextAndMarkerAccumulator {\n return accum.parallelArrays === true;\n}\n\ntype ITextAccumulatorType = ITextAccumulator | ITextAndMarkerAccumulator;\nexport class MergeTreeTextHelper {\n constructor(private readonly mergeTree: MergeTree) { }\n\n public getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number) {\n const range = this.getValidRange(start, end, refSeq, clientId);\n const accum: ITextAndMarkerAccumulator = {\n parallelArrays: true,\n parallelMarkerLabel: label,\n parallelMarkers: [],\n parallelText: [],\n tagsInProgress: [],\n textSegment: new TextSegment(\"\"),\n };\n\n this.mergeTree.mapRange<ITextAndMarkerAccumulator>(\n { leaf: this.gatherText },\n refSeq,\n clientId,\n accum,\n range.start,\n range.end);\n\n return { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };\n }\n\n public getText(refSeq: number, clientId: number, placeholder = \"\", start?: number, end?: number) {\n const range = this.getValidRange(start, end, refSeq, clientId);\n\n const accum: ITextAccumulator = { textSegment: new TextSegment(\"\"), placeholder };\n\n this.mergeTree.mapRange<ITextAccumulator>(\n { leaf: this.gatherText },\n refSeq,\n clientId,\n accum,\n range.start,\n range.end);\n return accum.textSegment.text;\n }\n\n private getValidRange(\n start: number | undefined,\n end: number | undefined,\n refSeq: number,\n clientId: number,\n ): IIntegerRange {\n const range: IIntegerRange = {\n end: end ?? this.mergeTree.getLength(refSeq, clientId),\n start: start ?? 0,\n };\n return range;\n }\n\n private readonly gatherText = (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number,\n end: number, accumText: ITextAccumulatorType) => {\n let _start = start;\n if (TextSegment.is(segment)) {\n let beginTags = \"\";\n let endTags = \"\";\n if (isTextAndMarkerAccumulator(accumText)) {\n // TODO: let clients pass in function to get tag\n const tags = [] as string[];\n const initTags = [] as string[];\n\n if (segment.properties?.[\"font-weight\"]) {\n tags.push(\"b\");\n }\n if (segment.properties?.[\"text-decoration\"]) {\n tags.push(\"u\");\n }\n const remTags = [] as string[];\n if (tags.length > 0) {\n for (const tag of tags) {\n if (!accumText.tagsInProgress.includes(tag)) {\n beginTags += `<${tag}>`;\n initTags.push(tag);\n }\n }\n for (const accumTag of accumText.tagsInProgress) {\n if (!tags.includes(accumTag)) {\n endTags += `</${accumTag}>`;\n remTags.push(accumTag);\n }\n }\n for (const initTag of initTags.reverse()) {\n accumText.tagsInProgress.push(initTag);\n }\n } else {\n for (const accumTag of accumText.tagsInProgress) {\n endTags += `</${accumTag}>`;\n remTags.push(accumTag);\n }\n }\n for (const remTag of remTags) {\n const remdex = accumText.tagsInProgress.indexOf(remTag);\n if (remdex >= 0) {\n accumText.tagsInProgress.splice(remdex, 1);\n }\n }\n }\n accumText.textSegment.text += endTags;\n accumText.textSegment.text += beginTags;\n if ((_start <= 0) && (end >= segment.text.length)) {\n accumText.textSegment.text += segment.text;\n } else {\n if (_start < 0) {\n _start = 0;\n }\n if (end >= segment.text.length) {\n accumText.textSegment.text += segment.text.substring(_start);\n } else {\n accumText.textSegment.text += segment.text.substring(_start, end);\n }\n }\n } else {\n if (accumText.placeholder && (accumText.placeholder.length > 0)) {\n if (accumText.placeholder === \"*\") {\n const marker = segment as Marker;\n accumText.textSegment.text += `\\n${marker.toString()}`;\n } else {\n for (let i = 0; i < segment.cachedLength; i++) {\n accumText.textSegment.text += accumText.placeholder;\n }\n }\n } else if (isTextAndMarkerAccumulator(accumText)) {\n const marker = segment as Marker;\n if (marker.hasTileLabel(accumText.parallelMarkerLabel)) {\n accumText.parallelMarkers.push(marker);\n accumText.parallelText.push(accumText.textSegment.text);\n accumText.textSegment.text = \"\";\n }\n }\n }\n\n return true;\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/merge-tree",
3
- "version": "0.59.3000-66610",
3
+ "version": "0.59.3000-67119",
4
4
  "description": "Merge tree",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -63,20 +63,20 @@
63
63
  "@fluidframework/common-utils": "^0.32.1",
64
64
  "@fluidframework/container-definitions": "^0.48.1000",
65
65
  "@fluidframework/core-interfaces": "^0.43.1000",
66
- "@fluidframework/datastore-definitions": "0.59.3000-66610",
66
+ "@fluidframework/datastore-definitions": "0.59.3000-67119",
67
67
  "@fluidframework/protocol-definitions": "^0.1028.1000",
68
- "@fluidframework/runtime-definitions": "0.59.3000-66610",
69
- "@fluidframework/runtime-utils": "0.59.3000-66610",
70
- "@fluidframework/shared-object-base": "0.59.3000-66610",
71
- "@fluidframework/telemetry-utils": "0.59.3000-66610"
68
+ "@fluidframework/runtime-definitions": "0.59.3000-67119",
69
+ "@fluidframework/runtime-utils": "0.59.3000-67119",
70
+ "@fluidframework/shared-object-base": "0.59.3000-67119",
71
+ "@fluidframework/telemetry-utils": "0.59.3000-67119"
72
72
  },
73
73
  "devDependencies": {
74
74
  "@fluidframework/build-common": "^0.23.0",
75
- "@fluidframework/build-tools": "^0.2.66048",
75
+ "@fluidframework/build-tools": "^0.2.66793",
76
76
  "@fluidframework/eslint-config-fluid": "^0.28.2000-0",
77
77
  "@fluidframework/merge-tree-previous": "npm:@fluidframework/merge-tree@0.59.2000",
78
- "@fluidframework/mocha-test-setup": "0.59.3000-66610",
79
- "@fluidframework/test-runtime-utils": "0.59.3000-66610",
78
+ "@fluidframework/mocha-test-setup": "0.59.3000-67119",
79
+ "@fluidframework/test-runtime-utils": "0.59.3000-67119",
80
80
  "@microsoft/api-extractor": "^7.22.2",
81
81
  "@rushstack/eslint-config": "^2.5.1",
82
82
  "@types/diff": "^3.5.1",
@@ -177,6 +177,84 @@
177
177
  "InterfaceDeclaration_RBNode": {
178
178
  "forwardCompat": false,
179
179
  "backCompat": false
180
+ },
181
+ "ClassDeclaration_List": {
182
+ "forwardCompat": false
183
+ },
184
+ "ClassDeclaration_BaseSegment": {
185
+ "forwardCompat": false
186
+ },
187
+ "ClassDeclaration_Client": {
188
+ "forwardCompat": false
189
+ },
190
+ "InterfaceDeclaration_IConsensusInfo": {
191
+ "forwardCompat": false
192
+ },
193
+ "InterfaceDeclaration_IHierBlock": {
194
+ "forwardCompat": false
195
+ },
196
+ "InterfaceDeclaration_IMergeBlock": {
197
+ "forwardCompat": false
198
+ },
199
+ "TypeAliasDeclaration_IMergeNode": {
200
+ "forwardCompat": false
201
+ },
202
+ "InterfaceDeclaration_IMergeNodeCommon": {
203
+ "forwardCompat": false
204
+ },
205
+ "InterfaceDeclaration_IMergeTreeSegmentDelta": {
206
+ "forwardCompat": false
207
+ },
208
+ "ClassDeclaration_IncrementalMapState": {
209
+ "forwardCompat": false
210
+ },
211
+ "InterfaceDeclaration_InsertContext": {
212
+ "forwardCompat": false
213
+ },
214
+ "InterfaceDeclaration_ISegment": {
215
+ "forwardCompat": false
216
+ },
217
+ "ClassDeclaration_LocalReference": {
218
+ "forwardCompat": false
219
+ },
220
+ "ClassDeclaration_LocalReferenceCollection": {
221
+ "forwardCompat": false
222
+ },
223
+ "InterfaceDeclaration_LRUSegment": {
224
+ "forwardCompat": false
225
+ },
226
+ "ClassDeclaration_MergeBlock": {
227
+ "forwardCompat": false
228
+ },
229
+ "InterfaceDeclaration_ISegmentChanges": {
230
+ "forwardCompat": false
231
+ },
232
+ "ClassDeclaration_Marker": {
233
+ "forwardCompat": false
234
+ },
235
+ "ClassDeclaration_MergeNode": {
236
+ "forwardCompat": false
237
+ },
238
+ "ClassDeclaration_MergeTree": {
239
+ "forwardCompat": false
240
+ },
241
+ "InterfaceDeclaration_SegmentAccumulator": {
242
+ "forwardCompat": false
243
+ },
244
+ "InterfaceDeclaration_SegmentGroup": {
245
+ "forwardCompat": false
246
+ },
247
+ "ClassDeclaration_SnapshotLegacy": {
248
+ "forwardCompat": false
249
+ },
250
+ "ClassDeclaration_SortedSegmentSet": {
251
+ "forwardCompat": false
252
+ },
253
+ "ClassDeclaration_TextSegment": {
254
+ "forwardCompat": false
255
+ },
256
+ "ClassDeclaration_TrackingGroup": {
257
+ "forwardCompat": false
180
258
  }
181
259
  }
182
260
  }
package/src/client.ts CHANGED
@@ -46,13 +46,14 @@ import {
46
46
  IMergeTreeOp,
47
47
  IRelativePosition,
48
48
  MergeTreeDeltaType,
49
+ ReferenceType,
49
50
  } from "./ops";
50
51
  import { PropertySet } from "./properties";
51
52
  import { SnapshotLegacy } from "./snapshotlegacy";
52
53
  import { SnapshotLoader } from "./snapshotLoader";
53
54
  import { MergeTreeTextHelper } from "./textSegment";
54
55
  import { SnapshotV1 } from "./snapshotV1";
55
- import { ReferencePosition, RangeStackMap } from "./referencePositions";
56
+ import { ReferencePosition, RangeStackMap, DetachedReferencePosition } from "./referencePositions";
56
57
  import {
57
58
  IMergeTreeClientSequenceArgs,
58
59
  IMergeTreeDeltaOpArgs,
@@ -317,13 +318,36 @@ export class Client {
317
318
  }
318
319
  return this.mergeTree.getPosition(segment, this.getCurrentSeq(), this.getClientId());
319
320
  }
320
-
321
+ /**
322
+ * @deprecated - use createReferencePosition instead
323
+ */
321
324
  public addLocalReference(lref: LocalReference) {
322
325
  return this.mergeTree.addLocalReference(lref);
323
326
  }
324
327
 
328
+ /**
329
+ * @deprecated - use removeReferencePosition instead
330
+ */
325
331
  public removeLocalReference(lref: LocalReference) {
326
- return this.mergeTree.removeLocalReference(lref.segment!, lref);
332
+ return this.removeLocalReferencePosition(lref);
333
+ }
334
+
335
+ public createLocalReferencePosition(
336
+ segment: ISegment, offset: number, refType: ReferenceType, properties: PropertySet | undefined,
337
+ ): ReferencePosition {
338
+ return this.mergeTree.createLocalReferencePosition(segment, offset, refType, properties, this);
339
+ }
340
+
341
+ public removeLocalReferencePosition(lref: ReferencePosition) {
342
+ return this.mergeTree.removeLocalReferencePosition(lref);
343
+ }
344
+
345
+ public localReferencePositionToPosition(lref: ReferencePosition) {
346
+ const segment = lref.getSegment();
347
+ if (segment === undefined) {
348
+ return DetachedReferencePosition;
349
+ }
350
+ return this.getPosition(segment) + lref.getOffset();
327
351
  }
328
352
 
329
353
  /**
@@ -35,7 +35,7 @@ export class Stack<T> {
35
35
  }
36
36
  }
37
37
 
38
- function ListRemoveEntry<U>(entry: List<U>): List<U> | undefined {
38
+ export function ListRemoveEntry<U>(entry: List<U>): List<U> | undefined {
39
39
  if (entry === undefined) {
40
40
  return undefined;
41
41
  } else if (entry.isHead) {
@@ -59,7 +59,7 @@ export class List<T> {
59
59
  public next: List<T>;
60
60
  public prev: List<T>;
61
61
 
62
- constructor(public isHead: boolean, private data: T | undefined) {
62
+ constructor(public isHead: boolean, public data: T | undefined) {
63
63
  this.prev = this;
64
64
  this.next = this;
65
65
  }
@@ -144,7 +144,14 @@ export class List<T> {
144
144
  return (this.next === this);
145
145
  }
146
146
 
147
+ /**
148
+ * @deprecated - use unshift
149
+ */
147
150
  public push(data: T): void {
151
+ this.unshift(data);
152
+ }
153
+
154
+ public unshift(data: T): void {
148
155
  const entry = ListMakeEntry(data);
149
156
  entry.data = data;
150
157
  entry.isHead = false;
@@ -153,6 +160,26 @@ export class List<T> {
153
160
  this.next = entry;
154
161
  entry.next.prev = entry;
155
162
  }
163
+
164
+ public [Symbol.iterator]() {
165
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
166
+ let node: List<T> | undefined = this;
167
+ const iterator: IterableIterator<T> = {
168
+ next(): IteratorResult<T> {
169
+ while (node && node.next.isHead === false) {
170
+ node = node.next;
171
+ if (node.data !== undefined) {
172
+ return { value: node.data, done: false };
173
+ }
174
+ }
175
+ return { value: undefined, done: true };
176
+ },
177
+ [Symbol.iterator]() {
178
+ return this;
179
+ },
180
+ };
181
+ return iterator;
182
+ }
156
183
  }
157
184
 
158
185
  export interface Comparer<T> {