@fluidframework/merge-tree 0.57.0 → 0.58.0-55983

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 (123) hide show
  1. package/dist/base.d.ts +0 -1
  2. package/dist/base.d.ts.map +1 -1
  3. package/dist/base.js.map +1 -1
  4. package/dist/client.d.ts +3 -5
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/client.js +14 -36
  7. package/dist/client.js.map +1 -1
  8. package/dist/collections.d.ts +1 -4
  9. package/dist/collections.d.ts.map +1 -1
  10. package/dist/collections.js +8 -24
  11. package/dist/collections.js.map +1 -1
  12. package/dist/index.d.ts +0 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +0 -3
  15. package/dist/index.js.map +1 -1
  16. package/dist/mergeTree.d.ts +8 -30
  17. package/dist/mergeTree.d.ts.map +1 -1
  18. package/dist/mergeTree.js +17 -326
  19. package/dist/mergeTree.js.map +1 -1
  20. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  21. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  22. package/dist/ops.d.ts +0 -6
  23. package/dist/ops.d.ts.map +1 -1
  24. package/dist/ops.js +1 -8
  25. package/dist/ops.js.map +1 -1
  26. package/dist/partialLengths.d.ts.map +1 -1
  27. package/dist/partialLengths.js +14 -26
  28. package/dist/partialLengths.js.map +1 -1
  29. package/dist/properties.d.ts.map +1 -1
  30. package/dist/properties.js +2 -15
  31. package/dist/properties.js.map +1 -1
  32. package/dist/segmentPropertiesManager.js +1 -5
  33. package/dist/segmentPropertiesManager.js.map +1 -1
  34. package/dist/snapshotChunks.js +3 -3
  35. package/dist/snapshotChunks.js.map +1 -1
  36. package/dist/snapshotV1.d.ts +2 -1
  37. package/dist/snapshotV1.d.ts.map +1 -1
  38. package/dist/snapshotV1.js +4 -4
  39. package/dist/snapshotV1.js.map +1 -1
  40. package/dist/snapshotlegacy.d.ts.map +1 -1
  41. package/dist/snapshotlegacy.js +3 -6
  42. package/dist/snapshotlegacy.js.map +1 -1
  43. package/dist/sortedSegmentSet.d.ts +3 -3
  44. package/dist/sortedSegmentSet.d.ts.map +1 -1
  45. package/dist/sortedSegmentSet.js +12 -12
  46. package/dist/sortedSegmentSet.js.map +1 -1
  47. package/dist/textSegment.d.ts.map +1 -1
  48. package/dist/textSegment.js +3 -17
  49. package/dist/textSegment.js.map +1 -1
  50. package/lib/base.d.ts +0 -1
  51. package/lib/base.d.ts.map +1 -1
  52. package/lib/base.js.map +1 -1
  53. package/lib/client.d.ts +3 -5
  54. package/lib/client.d.ts.map +1 -1
  55. package/lib/client.js +11 -33
  56. package/lib/client.js.map +1 -1
  57. package/lib/collections.d.ts +1 -4
  58. package/lib/collections.d.ts.map +1 -1
  59. package/lib/collections.js +8 -24
  60. package/lib/collections.js.map +1 -1
  61. package/lib/index.d.ts +0 -1
  62. package/lib/index.d.ts.map +1 -1
  63. package/lib/index.js +0 -1
  64. package/lib/index.js.map +1 -1
  65. package/lib/mergeTree.d.ts +8 -30
  66. package/lib/mergeTree.d.ts.map +1 -1
  67. package/lib/mergeTree.js +16 -322
  68. package/lib/mergeTree.js.map +1 -1
  69. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
  70. package/lib/mergeTreeDeltaCallback.js.map +1 -1
  71. package/lib/ops.d.ts +0 -6
  72. package/lib/ops.d.ts.map +1 -1
  73. package/lib/ops.js +0 -7
  74. package/lib/ops.js.map +1 -1
  75. package/lib/partialLengths.d.ts.map +1 -1
  76. package/lib/partialLengths.js +14 -26
  77. package/lib/partialLengths.js.map +1 -1
  78. package/lib/properties.d.ts.map +1 -1
  79. package/lib/properties.js +2 -15
  80. package/lib/properties.js.map +1 -1
  81. package/lib/segmentPropertiesManager.js +1 -5
  82. package/lib/segmentPropertiesManager.js.map +1 -1
  83. package/lib/snapshotChunks.js +3 -3
  84. package/lib/snapshotChunks.js.map +1 -1
  85. package/lib/snapshotV1.d.ts +2 -1
  86. package/lib/snapshotV1.d.ts.map +1 -1
  87. package/lib/snapshotV1.js +4 -4
  88. package/lib/snapshotV1.js.map +1 -1
  89. package/lib/snapshotlegacy.d.ts.map +1 -1
  90. package/lib/snapshotlegacy.js +3 -6
  91. package/lib/snapshotlegacy.js.map +1 -1
  92. package/lib/sortedSegmentSet.d.ts +3 -3
  93. package/lib/sortedSegmentSet.d.ts.map +1 -1
  94. package/lib/sortedSegmentSet.js +12 -12
  95. package/lib/sortedSegmentSet.js.map +1 -1
  96. package/lib/textSegment.d.ts.map +1 -1
  97. package/lib/textSegment.js +4 -18
  98. package/lib/textSegment.js.map +1 -1
  99. package/package.json +11 -11
  100. package/src/base.ts +2 -3
  101. package/src/client.ts +11 -36
  102. package/src/collections.ts +9 -26
  103. package/src/index.ts +0 -1
  104. package/src/mergeTree.ts +32 -357
  105. package/src/mergeTreeDeltaCallback.ts +0 -1
  106. package/src/ops.ts +0 -7
  107. package/src/partialLengths.ts +17 -27
  108. package/src/properties.ts +7 -15
  109. package/src/segmentPropertiesManager.ts +5 -5
  110. package/src/snapshotChunks.ts +3 -3
  111. package/src/snapshotV1.ts +3 -3
  112. package/src/snapshotlegacy.ts +4 -6
  113. package/src/sortedSegmentSet.ts +12 -12
  114. package/src/textSegment.ts +5 -20
  115. package/dist/text.d.ts +0 -8
  116. package/dist/text.d.ts.map +0 -1
  117. package/dist/text.js +0 -78
  118. package/dist/text.js.map +0 -1
  119. package/lib/text.d.ts +0 -8
  120. package/lib/text.d.ts.map +0 -1
  121. package/lib/text.js +0 -73
  122. package/lib/text.js.map +0 -1
  123. package/src/text.ts +0 -83
@@ -20,7 +20,6 @@ export class PropertiesManager {
20
20
  assert(this.pendingKeyUpdateCount[key] > 0, 0x05c /* "Trying to update more annotate props than do exist!" */);
21
21
  this.pendingKeyUpdateCount[key]--;
22
22
  if (((_b = this.pendingKeyUpdateCount) === null || _b === void 0 ? void 0 : _b[key]) === 0) {
23
- // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
24
23
  delete this.pendingKeyUpdateCount[key];
25
24
  }
26
25
  }
@@ -51,12 +50,11 @@ export class PropertiesManager {
51
50
  if (collaborating && seq === UnassignedSequenceNumber) {
52
51
  this.pendingRewriteCount++;
53
52
  }
54
- // We are re-writting so delete all the properties
53
+ // We are re-writing so delete all the properties
55
54
  // not in the new props
56
55
  for (const key of Object.keys(oldProps)) {
57
56
  if (!newProps[key] && shouldModifyKey(key)) {
58
57
  deltas[key] = oldProps[key];
59
- // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
60
58
  delete oldProps[key];
61
59
  }
62
60
  }
@@ -84,7 +82,6 @@ export class PropertiesManager {
84
82
  newValue = newProps[key];
85
83
  }
86
84
  if (newValue === null) {
87
- // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
88
85
  delete oldProps[key];
89
86
  }
90
87
  else {
@@ -96,7 +93,6 @@ export class PropertiesManager {
96
93
  copyTo(oldProps, newProps, newManager) {
97
94
  if (oldProps) {
98
95
  if (!newProps) {
99
- // eslint-disable-next-line no-param-reassign
100
96
  newProps = createMap();
101
97
  }
102
98
  if (!newManager) {
@@ -1 +1 @@
1
- {"version":3,"file":"segmentPropertiesManager.js","sourceRoot":"","sources":["../src/segmentPropertiesManager.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 { assert } from \"@fluidframework/common-utils\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport { ICombiningOp, IMergeTreeAnnotateMsg } from \"./ops\";\nimport {\n combine,\n createMap,\n MapLike,\n PropertySet,\n} from \"./properties\";\n\nexport class PropertiesManager {\n private pendingKeyUpdateCount: MapLike<number> | undefined;\n private pendingRewriteCount: number;\n\n constructor() {\n this.pendingRewriteCount = 0;\n }\n\n public ackPendingProperties(annotateOp: IMergeTreeAnnotateMsg) {\n if (annotateOp.combiningOp && annotateOp.combiningOp.name === \"rewrite\") {\n this.pendingRewriteCount--;\n }\n for (const key of Object.keys(annotateOp.props)) {\n if (this.pendingKeyUpdateCount?.[key] !== undefined) {\n assert(this.pendingKeyUpdateCount[key] > 0,\n 0x05c /* \"Trying to update more annotate props than do exist!\" */);\n this.pendingKeyUpdateCount[key]--;\n if (this.pendingKeyUpdateCount?.[key] === 0) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this.pendingKeyUpdateCount[key];\n }\n }\n }\n }\n\n public addProperties(\n oldProps: PropertySet,\n newProps: PropertySet,\n op?: ICombiningOp,\n seq?: number,\n collaborating: boolean = false): PropertySet | undefined {\n if (!this.pendingKeyUpdateCount) {\n this.pendingKeyUpdateCount = createMap<number>();\n }\n\n // There are outstanding local rewrites, so block all non-local changes\n if (this.pendingRewriteCount > 0 && seq !== UnassignedSequenceNumber && collaborating) {\n return undefined;\n }\n\n const rewrite = (op && op.name === \"rewrite\");\n const combiningOp = !rewrite ? op ? op : undefined : undefined;\n\n const shouldModifyKey = (key: string): boolean => {\n if (seq === UnassignedSequenceNumber\n || this.pendingKeyUpdateCount?.[key] === undefined\n || combiningOp) {\n return true;\n }\n return false;\n };\n\n const deltas: PropertySet = {};\n if (rewrite) {\n if (collaborating && seq === UnassignedSequenceNumber) {\n this.pendingRewriteCount++;\n }\n // We are re-writting so delete all the properties\n // not in the new props\n for (const key of Object.keys(oldProps)) {\n if (!newProps[key] && shouldModifyKey(key)) {\n deltas[key] = oldProps[key];\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete oldProps[key];\n }\n }\n }\n\n for (const key of Object.keys(newProps)) {\n if (collaborating) {\n if (seq === UnassignedSequenceNumber) {\n if (this.pendingKeyUpdateCount?.[key] === undefined) {\n this.pendingKeyUpdateCount[key] = 0;\n }\n this.pendingKeyUpdateCount[key]++;\n } else if (!shouldModifyKey(key)) {\n continue;\n }\n }\n\n const previousValue: any = oldProps[key];\n // The delta should be null if undefined, as thats how we encode delete\n deltas[key] = (previousValue === undefined) ? null : previousValue;\n let newValue: any;\n if (combiningOp) {\n newValue = combine(combiningOp, previousValue, newValue, seq);\n } else {\n newValue = newProps[key];\n }\n if (newValue === null) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete oldProps[key];\n } else {\n oldProps[key] = newValue;\n }\n }\n\n return deltas;\n }\n\n public copyTo(\n oldProps: PropertySet,\n newProps: PropertySet | undefined,\n newManager: PropertiesManager,\n ): PropertySet | undefined {\n if (oldProps) {\n if (!newProps) {\n // eslint-disable-next-line no-param-reassign\n newProps = createMap<any>();\n }\n if (!newManager) {\n throw new Error(\"Must provide new PropertyManager\");\n }\n for (const key of Object.keys(oldProps)) {\n newProps[key] = oldProps[key];\n }\n newManager.pendingRewriteCount = this.pendingRewriteCount;\n newManager.pendingKeyUpdateCount = createMap<number>();\n for (const key of Object.keys(this.pendingKeyUpdateCount!)) {\n newManager.pendingKeyUpdateCount[key] = this.pendingKeyUpdateCount![key];\n }\n }\n return newProps;\n }\n\n public hasPendingProperties() {\n return this.pendingRewriteCount > 0 || Object.keys(this.pendingKeyUpdateCount!).length > 0;\n }\n}\n"]}
1
+ {"version":3,"file":"segmentPropertiesManager.js","sourceRoot":"","sources":["../src/segmentPropertiesManager.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 { assert } from \"@fluidframework/common-utils\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport { ICombiningOp, IMergeTreeAnnotateMsg } from \"./ops\";\nimport {\n combine,\n createMap,\n MapLike,\n PropertySet,\n} from \"./properties\";\n\nexport class PropertiesManager {\n private pendingKeyUpdateCount: MapLike<number> | undefined;\n private pendingRewriteCount: number;\n\n constructor() {\n this.pendingRewriteCount = 0;\n }\n\n public ackPendingProperties(annotateOp: IMergeTreeAnnotateMsg) {\n if (annotateOp.combiningOp && annotateOp.combiningOp.name === \"rewrite\") {\n this.pendingRewriteCount--;\n }\n for (const key of Object.keys(annotateOp.props)) {\n if (this.pendingKeyUpdateCount?.[key] !== undefined) {\n assert(this.pendingKeyUpdateCount[key] > 0,\n 0x05c /* \"Trying to update more annotate props than do exist!\" */);\n this.pendingKeyUpdateCount[key]--;\n if (this.pendingKeyUpdateCount?.[key] === 0) {\n\n delete this.pendingKeyUpdateCount[key];\n }\n }\n }\n }\n\n public addProperties(\n oldProps: PropertySet,\n newProps: PropertySet,\n op?: ICombiningOp,\n seq?: number,\n collaborating: boolean = false): PropertySet | undefined {\n if (!this.pendingKeyUpdateCount) {\n this.pendingKeyUpdateCount = createMap<number>();\n }\n\n // There are outstanding local rewrites, so block all non-local changes\n if (this.pendingRewriteCount > 0 && seq !== UnassignedSequenceNumber && collaborating) {\n return undefined;\n }\n\n const rewrite = (op && op.name === \"rewrite\");\n const combiningOp = !rewrite ? op ? op : undefined : undefined;\n\n const shouldModifyKey = (key: string): boolean => {\n if (seq === UnassignedSequenceNumber\n || this.pendingKeyUpdateCount?.[key] === undefined\n || combiningOp) {\n return true;\n }\n return false;\n };\n\n const deltas: PropertySet = {};\n if (rewrite) {\n if (collaborating && seq === UnassignedSequenceNumber) {\n this.pendingRewriteCount++;\n }\n // We are re-writing so delete all the properties\n // not in the new props\n for (const key of Object.keys(oldProps)) {\n if (!newProps[key] && shouldModifyKey(key)) {\n deltas[key] = oldProps[key];\n\n delete oldProps[key];\n }\n }\n }\n\n for (const key of Object.keys(newProps)) {\n if (collaborating) {\n if (seq === UnassignedSequenceNumber) {\n if (this.pendingKeyUpdateCount?.[key] === undefined) {\n this.pendingKeyUpdateCount[key] = 0;\n }\n this.pendingKeyUpdateCount[key]++;\n } else if (!shouldModifyKey(key)) {\n continue;\n }\n }\n\n const previousValue: any = oldProps[key];\n // The delta should be null if undefined, as thats how we encode delete\n deltas[key] = (previousValue === undefined) ? null : previousValue;\n let newValue: any;\n if (combiningOp) {\n newValue = combine(combiningOp, previousValue, newValue, seq);\n } else {\n newValue = newProps[key];\n }\n if (newValue === null) {\n\n delete oldProps[key];\n } else {\n oldProps[key] = newValue;\n }\n }\n\n return deltas;\n }\n\n public copyTo(\n oldProps: PropertySet,\n newProps: PropertySet | undefined,\n newManager: PropertiesManager,\n ): PropertySet | undefined {\n if (oldProps) {\n if (!newProps) {\n\n newProps = createMap<any>();\n }\n if (!newManager) {\n throw new Error(\"Must provide new PropertyManager\");\n }\n for (const key of Object.keys(oldProps)) {\n newProps[key] = oldProps[key];\n }\n newManager.pendingRewriteCount = this.pendingRewriteCount;\n newManager.pendingKeyUpdateCount = createMap<number>();\n for (const key of Object.keys(this.pendingKeyUpdateCount!)) {\n newManager.pendingKeyUpdateCount[key] = this.pendingKeyUpdateCount![key];\n }\n }\n return newProps;\n }\n\n public hasPendingProperties() {\n return this.pendingRewriteCount > 0 || Object.keys(this.pendingKeyUpdateCount!).length > 0;\n }\n}\n"]}
@@ -22,7 +22,7 @@ export function serializeAsMinSupportedVersion(path, chunk, logger, options, ser
22
22
  switch (chunk.version) {
23
23
  case undefined:
24
24
  targetChuck = chunk;
25
- targetChuck.headerMetadata = buildHeaderMetadataForLegecyChunk(path, targetChuck, options);
25
+ targetChuck.headerMetadata = buildHeaderMetadataForLegacyChunk(path, targetChuck, options);
26
26
  break;
27
27
  case "1":
28
28
  const chunkV1 = chunk;
@@ -57,7 +57,7 @@ export function toLatestVersion(path, chunk, logger, options) {
57
57
  version: "1",
58
58
  length: chunkLegacy.chunkLengthChars,
59
59
  segmentCount: chunkLegacy.chunkSegmentCount,
60
- headerMetadata: buildHeaderMetadataForLegecyChunk(path, chunkLegacy, options),
60
+ headerMetadata: buildHeaderMetadataForLegacyChunk(path, chunkLegacy, options),
61
61
  segments: chunkLegacy.segmentTexts,
62
62
  startIndex: chunkLegacy.chunkStartSegmentIndex,
63
63
  };
@@ -68,7 +68,7 @@ export function toLatestVersion(path, chunk, logger, options) {
68
68
  throw new Error(`Unsupported chunk path: ${path} version: ${chunk.version}`);
69
69
  }
70
70
  }
71
- function buildHeaderMetadataForLegecyChunk(path, chunk, options) {
71
+ function buildHeaderMetadataForLegacyChunk(path, chunk, options) {
72
72
  if (path === SnapshotLegacy.header) {
73
73
  if (chunk.headerMetadata !== undefined) {
74
74
  return chunk.headerMetadata;
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotChunks.js","sourceRoot":"","sources":["../src/snapshotChunks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAyDlD;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAA8C;IACvE,OAAO,CAAC,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC1C,IAAY,EACZ,KAA8B,EAC9B,MAAwB,EACxB,OAAgC,EAChC,UAA4B,EAC5B,IAAkB;IAClB,IAAI,WAAiC,CAAC;IAEtC,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE;QAC7B,MAAM,CAAC,IAAI,CAAC;YACR,SAAS,EAAE,+CAA+C;YAC1D,QAAQ,EAAE,SAAS;YACnB,gBAAgB,EAAE,KAAK,CAAC,OAAO;YAC/B,cAAc,EAAE,SAAS;SAC5B,CAAC,CAAC;KACN;IAED,QAAQ,KAAK,CAAC,OAAO,EAAE;QACnB,KAAK,SAAS;YACV,WAAW,GAAG,KAA6B,CAAC;YAC5C,WAAW,CAAC,cAAc,GAAG,iCAAiC,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YAC3F,MAAM;QAEV,KAAK,GAAG;YACJ,MAAM,OAAO,GAAG,KAAyB,CAAC;YAC1C,MAAM,cAAc,GAAG,IAAI,KAAK,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3F,WAAW,GAAG;gBACV,OAAO,EAAE,SAAS;gBAClB,sBAAsB,EAAE,OAAO,CAAC,UAAU;gBAC1C,gBAAgB,EAAE,OAAO,CAAC,MAAM;gBAChC,iBAAiB,EAAE,OAAO,CAAC,YAAY;gBACvC,YAAY,EAAE,OAAO,CAAC,QAAQ;gBAC9B,gBAAgB,EAAE,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW;gBAC7C,iBAAiB,EAAE,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,iBAAiB;gBACpD,mBAAmB,EAAE,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,cAAc;gBACnD,sBAAsB,EAAE,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,iBAAiB;gBACzD,cAAc;aACjB,CAAC;YACF,MAAM;QAEV;YACI,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,aAAa,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;KACpF;IACD,OAAO,UAAU,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC1C,IAAY,EACZ,KAA8B,EAC9B,MAAwB,EACxB,OAAgC,EAChC,UAA4B,EAC5B,IAAkB;IAClB,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAClE,OAAO,UAAU,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,eAAe,CAC3B,IAAY,EACZ,KAA8B,EAC9B,MAAwB,EACxB,OAAgC;IAChC,QAAQ,KAAK,CAAC,OAAO,EAAE;QACnB,KAAK,SAAS,CAAC,CAAC;YACZ,MAAM,WAAW,GAAG,KAA6B,CAAC;YAClD,OAAO;gBACH,OAAO,EAAE,GAAG;gBACZ,MAAM,EAAE,WAAW,CAAC,gBAAgB;gBACpC,YAAY,EAAE,WAAW,CAAC,iBAAiB;gBAC3C,cAAc,EAAE,iCAAiC,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC;gBAC7E,QAAQ,EAAE,WAAW,CAAC,YAAY;gBAClC,UAAU,EAAE,WAAW,CAAC,sBAAsB;aACjD,CAAC;SACL;QACD,KAAK,GAAG;YACJ,OAAO,KAAyB,CAAC;QAErC;YACI,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,aAAa,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;KACpF;AACL,CAAC;AAED,SAAS,iCAAiC,CACtC,IAAY,EAAE,KAA2B,EAAE,OAAgC;IAC3E,IAAI,IAAI,KAAK,cAAc,CAAC,MAAM,EAAE;QAChC,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE;YACpC,OAAO,KAAK,CAAC,cAAc,CAAC;SAC/B;QACD,MAAM,QAAQ,GAAmC,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QACjF,IAAI,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAiB,EAAE;YAClD,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;SAC9C;QACD,OAAO;YACH,oBAAoB,EAAE,QAAQ;YAC9B,iBAAiB,EAAE,KAAK,CAAC,sBAAuB;YAChD,cAAc,EAAE,KAAK,CAAC,mBAAoB;YAC1C,WAAW,EAAE,KAAK,CAAC,gBAAiB;YACpC,iBAAiB,EAAE,KAAK,CAAC,iBAAkB;SAC9C,CAAC;KACL;IACD,OAAO,SAAS,CAAC;AACrB,CAAC","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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { PropertySet } from \"./properties\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\nimport { IJSONSegment } from \"./ops\";\n\nexport interface VersionedMergeTreeChunk {\n version: undefined | \"1\";\n}\n\nexport type JsonSegmentSpecs = IJSONSegment | IJSONSegmentWithMergeInfo;\n\nexport interface MergeTreeChunkLegacy extends VersionedMergeTreeChunk {\n version: undefined;\n chunkStartSegmentIndex: number,\n chunkSegmentCount: number;\n chunkLengthChars: number;\n totalLengthChars?: number;\n totalSegmentCount?: number;\n chunkSequenceNumber?: number;\n chunkMinSequenceNumber?: number;\n segmentTexts: JsonSegmentSpecs[];\n headerMetadata?: MergeTreeHeaderMetadata;\n}\n\nexport interface MergeTreeHeaderChunkMetadata {\n id: string,\n}\n\nexport interface MergeTreeHeaderMetadata {\n totalLength: number,\n totalSegmentCount: number,\n orderedChunkMetadata: MergeTreeHeaderChunkMetadata[],\n sequenceNumber: number,\n minSequenceNumber: number,\n}\n\nexport interface MergeTreeChunkV1 extends VersionedMergeTreeChunk {\n version: \"1\",\n startIndex: number;\n segmentCount: number;\n length: number;\n segments: JsonSegmentSpecs[];\n headerMetadata: MergeTreeHeaderMetadata | undefined;\n}\n\n/**\n * Used during snapshotting to record the metadata required to merge segments above the MSN\n * to the raw output of `ISegment.toJSONObject()`. (Note that IJSONSegment may be a raw\n * string or array, which is why this interface wraps the original IJSONSegment instead of\n * extending it.)\n */\nexport interface IJSONSegmentWithMergeInfo {\n json: IJSONSegment;\n client?: string;\n seq?: number;\n removedClient?: string;\n removedSeq?: number;\n}\n\n/**\n * Returns true if the given 'spec' is an IJSONSegmentWithMergeInfo.\n */\nexport function hasMergeInfo(spec: IJSONSegment | IJSONSegmentWithMergeInfo): spec is IJSONSegmentWithMergeInfo {\n return !!spec && typeof spec === \"object\" && \"json\" in spec;\n}\n\nexport function serializeAsMinSupportedVersion(\n path: string,\n chunk: VersionedMergeTreeChunk,\n logger: ITelemetryLogger,\n options: PropertySet | undefined,\n serializer: IFluidSerializer,\n bind: IFluidHandle) {\n let targetChuck: MergeTreeChunkLegacy;\n\n if (chunk.version !== undefined) {\n logger.send({\n eventName: \"MergeTreeChunk:serializeAsMinSupportedVersion\",\n category: \"generic\",\n fromChunkVersion: chunk.version,\n toChunkVersion: undefined,\n });\n }\n\n switch (chunk.version) {\n case undefined:\n targetChuck = chunk as MergeTreeChunkLegacy;\n targetChuck.headerMetadata = buildHeaderMetadataForLegecyChunk(path, targetChuck, options);\n break;\n\n case \"1\":\n const chunkV1 = chunk as MergeTreeChunkV1;\n const headerMetadata = path === SnapshotLegacy.header ? chunkV1.headerMetadata : undefined;\n targetChuck = {\n version: undefined,\n chunkStartSegmentIndex: chunkV1.startIndex,\n chunkLengthChars: chunkV1.length,\n chunkSegmentCount: chunkV1.segmentCount,\n segmentTexts: chunkV1.segments,\n totalLengthChars: headerMetadata?.totalLength,\n totalSegmentCount: headerMetadata?.totalSegmentCount,\n chunkSequenceNumber: headerMetadata?.sequenceNumber,\n chunkMinSequenceNumber: headerMetadata?.minSequenceNumber,\n headerMetadata,\n };\n break;\n\n default:\n throw new Error(`Unsupported chunk path: ${path} version: ${chunk.version}`);\n }\n return serializer.stringify(targetChuck, bind);\n}\n\nexport function serializeAsMaxSupportedVersion(\n path: string,\n chunk: VersionedMergeTreeChunk,\n logger: ITelemetryLogger,\n options: PropertySet | undefined,\n serializer: IFluidSerializer,\n bind: IFluidHandle) {\n const targetChuck = toLatestVersion(path, chunk, logger, options);\n return serializer.stringify(targetChuck, bind);\n}\n\nexport function toLatestVersion(\n path: string,\n chunk: VersionedMergeTreeChunk,\n logger: ITelemetryLogger,\n options: PropertySet | undefined): MergeTreeChunkV1 {\n switch (chunk.version) {\n case undefined: {\n const chunkLegacy = chunk as MergeTreeChunkLegacy;\n return {\n version: \"1\",\n length: chunkLegacy.chunkLengthChars,\n segmentCount: chunkLegacy.chunkSegmentCount,\n headerMetadata: buildHeaderMetadataForLegecyChunk(path, chunkLegacy, options),\n segments: chunkLegacy.segmentTexts,\n startIndex: chunkLegacy.chunkStartSegmentIndex,\n };\n }\n case \"1\":\n return chunk as MergeTreeChunkV1;\n\n default:\n throw new Error(`Unsupported chunk path: ${path} version: ${chunk.version}`);\n }\n}\n\nfunction buildHeaderMetadataForLegecyChunk(\n path: string, chunk: MergeTreeChunkLegacy, options: PropertySet | undefined): MergeTreeHeaderMetadata | undefined {\n if (path === SnapshotLegacy.header) {\n if (chunk.headerMetadata !== undefined) {\n return chunk.headerMetadata;\n }\n const chunkIds: MergeTreeHeaderChunkMetadata[] = [{ id: SnapshotLegacy.header }];\n if (chunk.chunkLengthChars < chunk.totalLengthChars!) {\n chunkIds.push({ id: SnapshotLegacy.body });\n }\n return {\n orderedChunkMetadata: chunkIds,\n minSequenceNumber: chunk.chunkMinSequenceNumber!,\n sequenceNumber: chunk.chunkSequenceNumber!,\n totalLength: chunk.totalLengthChars!,\n totalSegmentCount: chunk.totalSegmentCount!,\n };\n }\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"snapshotChunks.js","sourceRoot":"","sources":["../src/snapshotChunks.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { PropertySet } from \"./properties\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\nimport { IJSONSegment } from \"./ops\";\n\nexport interface VersionedMergeTreeChunk {\n version: undefined | \"1\";\n}\n\nexport type JsonSegmentSpecs = IJSONSegment | IJSONSegmentWithMergeInfo;\n\nexport interface MergeTreeChunkLegacy extends VersionedMergeTreeChunk {\n version: undefined;\n chunkStartSegmentIndex: number,\n chunkSegmentCount: number;\n chunkLengthChars: number;\n totalLengthChars?: number;\n totalSegmentCount?: number;\n chunkSequenceNumber?: number;\n chunkMinSequenceNumber?: number;\n segmentTexts: JsonSegmentSpecs[];\n headerMetadata?: MergeTreeHeaderMetadata;\n}\n\nexport interface MergeTreeHeaderChunkMetadata {\n id: string,\n}\n\nexport interface MergeTreeHeaderMetadata {\n totalLength: number,\n totalSegmentCount: number,\n orderedChunkMetadata: MergeTreeHeaderChunkMetadata[],\n sequenceNumber: number,\n minSequenceNumber: number,\n}\n\nexport interface MergeTreeChunkV1 extends VersionedMergeTreeChunk {\n version: \"1\",\n startIndex: number;\n segmentCount: number;\n length: number;\n segments: JsonSegmentSpecs[];\n headerMetadata: MergeTreeHeaderMetadata | undefined;\n}\n\n/**\n * Used during snapshotting to record the metadata required to merge segments above the MSN\n * to the raw output of `ISegment.toJSONObject()`. (Note that IJSONSegment may be a raw\n * string or array, which is why this interface wraps the original IJSONSegment instead of\n * extending it.)\n */\nexport interface IJSONSegmentWithMergeInfo {\n json: IJSONSegment;\n client?: string;\n seq?: number;\n removedClient?: string;\n removedSeq?: number;\n}\n\n/**\n * Returns true if the given 'spec' is an IJSONSegmentWithMergeInfo.\n */\nexport function hasMergeInfo(spec: IJSONSegment | IJSONSegmentWithMergeInfo): spec is IJSONSegmentWithMergeInfo {\n return !!spec && typeof spec === \"object\" && \"json\" in spec;\n}\n\nexport function serializeAsMinSupportedVersion(\n path: string,\n chunk: VersionedMergeTreeChunk,\n logger: ITelemetryLogger,\n options: PropertySet | undefined,\n serializer: IFluidSerializer,\n bind: IFluidHandle) {\n let targetChuck: MergeTreeChunkLegacy;\n\n if (chunk.version !== undefined) {\n logger.send({\n eventName: \"MergeTreeChunk:serializeAsMinSupportedVersion\",\n category: \"generic\",\n fromChunkVersion: chunk.version,\n toChunkVersion: undefined,\n });\n }\n\n switch (chunk.version) {\n case undefined:\n targetChuck = chunk as MergeTreeChunkLegacy;\n targetChuck.headerMetadata = buildHeaderMetadataForLegacyChunk(path, targetChuck, options);\n break;\n\n case \"1\":\n const chunkV1 = chunk as MergeTreeChunkV1;\n const headerMetadata = path === SnapshotLegacy.header ? chunkV1.headerMetadata : undefined;\n targetChuck = {\n version: undefined,\n chunkStartSegmentIndex: chunkV1.startIndex,\n chunkLengthChars: chunkV1.length,\n chunkSegmentCount: chunkV1.segmentCount,\n segmentTexts: chunkV1.segments,\n totalLengthChars: headerMetadata?.totalLength,\n totalSegmentCount: headerMetadata?.totalSegmentCount,\n chunkSequenceNumber: headerMetadata?.sequenceNumber,\n chunkMinSequenceNumber: headerMetadata?.minSequenceNumber,\n headerMetadata,\n };\n break;\n\n default:\n throw new Error(`Unsupported chunk path: ${path} version: ${chunk.version}`);\n }\n return serializer.stringify(targetChuck, bind);\n}\n\nexport function serializeAsMaxSupportedVersion(\n path: string,\n chunk: VersionedMergeTreeChunk,\n logger: ITelemetryLogger,\n options: PropertySet | undefined,\n serializer: IFluidSerializer,\n bind: IFluidHandle) {\n const targetChuck = toLatestVersion(path, chunk, logger, options);\n return serializer.stringify(targetChuck, bind);\n}\n\nexport function toLatestVersion(\n path: string,\n chunk: VersionedMergeTreeChunk,\n logger: ITelemetryLogger,\n options: PropertySet | undefined): MergeTreeChunkV1 {\n switch (chunk.version) {\n case undefined: {\n const chunkLegacy = chunk as MergeTreeChunkLegacy;\n return {\n version: \"1\",\n length: chunkLegacy.chunkLengthChars,\n segmentCount: chunkLegacy.chunkSegmentCount,\n headerMetadata: buildHeaderMetadataForLegacyChunk(path, chunkLegacy, options),\n segments: chunkLegacy.segmentTexts,\n startIndex: chunkLegacy.chunkStartSegmentIndex,\n };\n }\n case \"1\":\n return chunk as MergeTreeChunkV1;\n\n default:\n throw new Error(`Unsupported chunk path: ${path} version: ${chunk.version}`);\n }\n}\n\nfunction buildHeaderMetadataForLegacyChunk(\n path: string, chunk: MergeTreeChunkLegacy, options: PropertySet | undefined): MergeTreeHeaderMetadata | undefined {\n if (path === SnapshotLegacy.header) {\n if (chunk.headerMetadata !== undefined) {\n return chunk.headerMetadata;\n }\n const chunkIds: MergeTreeHeaderChunkMetadata[] = [{ id: SnapshotLegacy.header }];\n if (chunk.chunkLengthChars < chunk.totalLengthChars!) {\n chunkIds.push({ id: SnapshotLegacy.body });\n }\n return {\n orderedChunkMetadata: chunkIds,\n minSequenceNumber: chunk.chunkMinSequenceNumber!,\n sequenceNumber: chunk.chunkSequenceNumber!,\n totalLength: chunk.totalLengthChars!,\n totalSegmentCount: chunk.totalSegmentCount!,\n };\n }\n return undefined;\n}\n"]}
@@ -12,6 +12,7 @@ import { PropertySet } from "./properties";
12
12
  import { JsonSegmentSpecs, MergeTreeChunkV1 } from "./snapshotChunks";
13
13
  export declare class SnapshotV1 {
14
14
  mergeTree: MergeTree;
15
+ private readonly getLongClientId;
15
16
  filename?: string | undefined;
16
17
  onCompletion?: (() => void) | undefined;
17
18
  static readonly chunkSize: number;
@@ -20,7 +21,7 @@ export declare class SnapshotV1 {
20
21
  private readonly segmentLengths;
21
22
  private readonly logger;
22
23
  private readonly chunkSize;
23
- constructor(mergeTree: MergeTree, logger: ITelemetryLogger, filename?: string | undefined, onCompletion?: (() => void) | undefined);
24
+ constructor(mergeTree: MergeTree, logger: ITelemetryLogger, getLongClientId: (id: number) => string, filename?: string | undefined, onCompletion?: (() => void) | undefined);
24
25
  private getSeqLengthSegs;
25
26
  /**
26
27
  * Emits the snapshot to an ISummarizeResult. If provided the optional IFluidSerializer will be used when
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotV1.d.ts","sourceRoot":"","sources":["../src/snapshotV1.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAGtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,OAAO,EAEH,SAAS,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAEH,WAAW,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAEH,gBAAgB,EAEhB,gBAAgB,EAGnB,MAAM,kBAAkB,CAAC;AAG1B,qBAAa,UAAU;IAgBR,SAAS,EAAE,SAAS;IAEpB,QAAQ,CAAC;IACT,YAAY,CAAC,SAAQ,IAAI;IAZpC,gBAAuB,SAAS,EAAE,MAAM,CAAS;IAEjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAW;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGxB,SAAS,EAAE,SAAS,EAC3B,MAAM,EAAE,gBAAgB,EACjB,QAAQ,CAAC,oBAAQ,EACjB,YAAY,CAAC,SAAQ,IAAI,aAAA;IAkBpC,OAAO,CAAC,gBAAgB;IAwBxB;;;OAGG;IACH,IAAI,CACA,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,GACnB,qBAAqB;IAgDxB,WAAW;WA+FS,SAAS,CACzB,OAAO,EAAE,sBAAsB,EAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,CAAC,EAAE,gBAAgB,GAC9B,OAAO,CAAC,gBAAgB,CAAC;WAMd,YAAY,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,CAAC,EAAE,gBAAgB,GAC9B,gBAAgB;CAItB"}
1
+ {"version":3,"file":"snapshotV1.d.ts","sourceRoot":"","sources":["../src/snapshotV1.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAGtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,OAAO,EAEH,SAAS,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAEH,WAAW,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAEH,gBAAgB,EAEhB,gBAAgB,EAGnB,MAAM,kBAAkB,CAAC;AAG1B,qBAAa,UAAU;IAgBR,SAAS,EAAE,SAAS;IAE3B,OAAO,CAAC,QAAQ,CAAC,eAAe;IACzB,QAAQ,CAAC;IACT,YAAY,CAAC,SAAQ,IAAI;IAbpC,gBAAuB,SAAS,EAAE,MAAM,CAAS;IAEjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAW;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGxB,SAAS,EAAE,SAAS,EAC3B,MAAM,EAAE,gBAAgB,EACP,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,EACjD,QAAQ,CAAC,oBAAQ,EACjB,YAAY,CAAC,SAAQ,IAAI,aAAA;IAkBpC,OAAO,CAAC,gBAAgB;IAwBxB;;;OAGG;IACH,IAAI,CACA,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,GACnB,qBAAqB;IAgDxB,WAAW;WA8FS,SAAS,CACzB,OAAO,EAAE,sBAAsB,EAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,CAAC,EAAE,gBAAgB,GAC9B,OAAO,CAAC,gBAAgB,CAAC;WAMd,YAAY,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,CAAC,EAAE,gBAAgB,GAC9B,gBAAgB;CAItB"}
package/lib/snapshotV1.js CHANGED
@@ -10,9 +10,10 @@ import { matchProperties, } from "./properties";
10
10
  import { toLatestVersion, serializeAsMaxSupportedVersion, } from "./snapshotChunks";
11
11
  import { SnapshotLegacy } from "./snapshotlegacy";
12
12
  export class SnapshotV1 {
13
- constructor(mergeTree, logger, filename, onCompletion) {
13
+ constructor(mergeTree, logger, getLongClientId, filename, onCompletion) {
14
14
  var _a, _b;
15
15
  this.mergeTree = mergeTree;
16
+ this.getLongClientId = getLongClientId;
16
17
  this.filename = filename;
17
18
  this.onCompletion = onCompletion;
18
19
  this.logger = ChildLogger.create(logger, "Snapshot");
@@ -142,8 +143,7 @@ export class SnapshotV1 {
142
143
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
143
144
  if (segment.seq > minSeq) {
144
145
  raw.seq = segment.seq;
145
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
146
- raw.client = mergeTree.getLongClientId(segment.clientId);
146
+ raw.client = this.getLongClientId(segment.clientId);
147
147
  }
148
148
  // We have already dispensed with removed segments below the MSN and removed segments with unassigned
149
149
  // sequence numbers. Any remaining removal info should be preserved.
@@ -151,7 +151,7 @@ export class SnapshotV1 {
151
151
  assert(segment.removedSeq !== UnassignedSequenceNumber && segment.removedSeq > minSeq, 0x065 /* "On removal info preservation, segment has invalid removed sequence number!" */);
152
152
  raw.removedSeq = segment.removedSeq;
153
153
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
154
- raw.removedClient = mergeTree.getLongClientId(segment.removedClientId);
154
+ raw.removedClient = this.getLongClientId(segment.removedClientId);
155
155
  }
156
156
  // Sanity check that we are preserving either the seq < minSeq or a removed segment's info.
157
157
  assert(raw.seq !== undefined && raw.client !== undefined
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotV1.js","sourceRoot":"","sources":["../src/snapshotV1.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { assert, bufferToString } from \"@fluidframework/common-utils\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport {\n ISegment,\n MergeTree,\n} from \"./mergeTree\";\nimport {\n matchProperties,\n PropertySet,\n} from \"./properties\";\nimport {\n IJSONSegmentWithMergeInfo,\n JsonSegmentSpecs,\n MergeTreeHeaderMetadata,\n MergeTreeChunkV1,\n toLatestVersion,\n serializeAsMaxSupportedVersion,\n} from \"./snapshotChunks\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\n\nexport class SnapshotV1 {\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 chunkSize: number = 10000;\n\n private readonly header: MergeTreeHeaderMetadata;\n private readonly segments: JsonSegmentSpecs[];\n private readonly segmentLengths: number[];\n private readonly logger: ITelemetryLogger;\n private readonly chunkSize: number;\n\n constructor(\n public mergeTree: MergeTree,\n logger: ITelemetryLogger,\n public filename?: string,\n public onCompletion?: () => void,\n ) {\n this.logger = ChildLogger.create(logger, \"Snapshot\");\n this.chunkSize = mergeTree?.options?.mergeTreeSnapshotChunkSize ?? SnapshotV1.chunkSize;\n\n const { currentSeq, minSeq } = mergeTree.getCollabWindow();\n this.header = {\n minSequenceNumber: minSeq,\n sequenceNumber: currentSeq,\n orderedChunkMetadata: [],\n totalLength: 0,\n totalSegmentCount: 0,\n };\n\n this.segments = [];\n this.segmentLengths = [];\n }\n\n private getSeqLengthSegs(\n allSegments: JsonSegmentSpecs[],\n allLengths: number[],\n approxSequenceLength: number,\n startIndex = 0): MergeTreeChunkV1 {\n const segments: JsonSegmentSpecs[] = [];\n let length = 0;\n let segmentCount = 0;\n while ((length < approxSequenceLength) && ((startIndex + segmentCount) < allSegments.length)) {\n const pseg = allSegments[startIndex + segmentCount];\n segments.push(pseg);\n length += allLengths[startIndex + segmentCount];\n segmentCount++;\n }\n return {\n version: \"1\",\n segmentCount,\n length,\n segments,\n startIndex,\n headerMetadata: undefined,\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 serializer: IFluidSerializer,\n bind: IFluidHandle,\n ): ISummaryTreeWithStats {\n const chunks: MergeTreeChunkV1[] = [];\n this.header.totalSegmentCount = 0;\n this.header.totalLength = 0;\n do {\n const chunk = this.getSeqLengthSegs(\n this.segments,\n this.segmentLengths,\n this.chunkSize,\n this.header.totalSegmentCount);\n chunks.push(chunk);\n this.header.totalSegmentCount += chunk.segmentCount;\n this.header.totalLength += chunk.length;\n } while (this.header.totalSegmentCount < this.segments.length);\n\n // The do while loop should have added at least one chunk\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const headerChunk = chunks.shift()!;\n headerChunk.headerMetadata = this.header;\n headerChunk.headerMetadata.orderedChunkMetadata = [{ id: SnapshotLegacy.header }];\n const blobs: [key: string, content: string][] = [];\n chunks.forEach((chunk, index) => {\n const id = `${SnapshotLegacy.body}_${index}`;\n this.header.orderedChunkMetadata.push({ id });\n blobs.push([id, serializeAsMaxSupportedVersion(\n id,\n chunk,\n this.logger,\n this.mergeTree.options,\n serializer,\n bind)]);\n });\n\n const builder = new SummaryTreeBuilder();\n builder.addBlob(SnapshotLegacy.header, serializeAsMaxSupportedVersion(\n SnapshotLegacy.header,\n headerChunk,\n this.logger,\n this.mergeTree.options,\n serializer,\n bind));\n blobs.forEach((value) => {\n builder.addBlob(value[0], value[1]);\n });\n\n return builder.getSummaryTree();\n }\n\n extractSync() {\n const mergeTree = this.mergeTree;\n const minSeq = this.header.minSequenceNumber;\n\n // Helper to add the given `MergeTreeChunkV0SegmentSpec` to the snapshot.\n const pushSegRaw = (json: JsonSegmentSpecs, length: number) => {\n this.segments.push(json);\n this.segmentLengths.push(length);\n };\n\n // Helper to serialize the given `segment` and add it to the snapshot (if a segment is provided).\n const pushSeg = (segment?: ISegment) => {\n if (segment) { pushSegRaw(segment.toJSONObject(), segment.cachedLength); }\n };\n\n let prev: ISegment | undefined;\n const extractSegment = (segment: ISegment) => {\n // Elide segments that do not need to be included in the snapshot. A segment may be elided if\n // either condition is true:\n // a) The segment has not yet been ACKed. We do not need to snapshot unACKed segments because\n // there is a pending insert op that will deliver the segment on reconnection.\n // b) The segment was removed at or below the MSN. Pending ops can no longer reference this\n // segment, and therefore we can discard it.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (segment.seq === UnassignedSequenceNumber || segment.removedSeq! <= minSeq) {\n return true;\n }\n\n // Next determine if the snapshot needs to preserve information required for merging the segment\n // (seq, client, etc.) This information is only needed if the segment is above the MSN (and doesn't\n // have a pending remove.)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((segment.seq! <= minSeq) // Segment is below the MSN, and...\n && (segment.removedSeq === undefined // .. Segment has not been removed, or...\n || segment.removedSeq === UnassignedSequenceNumber) // .. Removal op to be delivered on reconnect\n ) {\n // This segment is below the MSN, which means that future ops will not reference it. Attempt to\n // coalesce the new segment with the previous (if any).\n if (!prev) {\n // We do not have a previous candidate for coalescing. Make the current segment the new candidate.\n prev = segment;\n } else if (prev.canAppend(segment) && matchProperties(prev.properties, segment.properties)) {\n // We have a compatible pair. Replace `prev` with the coalesced segment. Clone to avoid\n // modifying the segment instances currently in the MergeTree.\n prev = prev.clone();\n prev.append(segment.clone());\n } else {\n // The segment pair could not be coalesced. Record the `prev` segment in the snapshot\n // and make the current segment the new candidate for coalescing.\n pushSeg(prev);\n prev = segment;\n }\n } else {\n // This segment needs to preserve it's metadata as it may be referenced by future ops. It's ineligible\n // for coalescing, so emit the 'prev' segment now (if any).\n pushSeg(prev);\n prev = undefined;\n\n const raw: IJSONSegmentWithMergeInfo = { json: segment.toJSONObject() };\n // If the segment insertion is above the MSN, record the insertion merge info.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (segment.seq! > minSeq) {\n raw.seq = segment.seq;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n raw.client = mergeTree.getLongClientId!(segment.clientId);\n }\n // We have already dispensed with removed segments below the MSN and removed segments with unassigned\n // sequence numbers. Any remaining removal info should be preserved.\n if (segment.removedSeq !== undefined) {\n assert(segment.removedSeq !== UnassignedSequenceNumber && segment.removedSeq > minSeq,\n 0x065 /* \"On removal info preservation, segment has invalid removed sequence number!\" */);\n raw.removedSeq = segment.removedSeq;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n raw.removedClient = mergeTree.getLongClientId!(segment.removedClientId!);\n }\n\n // Sanity check that we are preserving either the seq < minSeq or a removed segment's info.\n assert(raw.seq !== undefined && raw.client !== undefined\n || raw.removedSeq !== undefined && raw.removedClient !== undefined,\n 0x066 /* \"Corrupted preservation of segment metadata!\" */);\n\n // Record the segment with it's required metadata.\n pushSegRaw(raw, segment.cachedLength);\n }\n return true;\n };\n\n mergeTree.walkAllSegments(mergeTree.root, extractSegment, this);\n\n // If the last segment in the walk was coalescable, push it now.\n pushSeg(prev);\n\n return this.segments;\n }\n\n public static async loadChunk(\n storage: IChannelStorageService,\n path: string,\n logger: ITelemetryLogger,\n options: PropertySet | undefined,\n serializer?: IFluidSerializer,\n ): Promise<MergeTreeChunkV1> {\n const blob = await storage.readBlob(path);\n const chunkAsString = bufferToString(blob, \"utf8\");\n return SnapshotV1.processChunk(path, chunkAsString, logger, options, serializer);\n }\n\n public static processChunk(\n path: string,\n chunk: string,\n logger: ITelemetryLogger,\n options: PropertySet | undefined,\n serializer?: IFluidSerializer,\n ): MergeTreeChunkV1 {\n const chunkObj = serializer ? serializer.parse(chunk) : JSON.parse(chunk);\n return toLatestVersion(path, chunkObj, logger, options);\n }\n}\n"]}
1
+ {"version":3,"file":"snapshotV1.js","sourceRoot":"","sources":["../src/snapshotV1.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { assert, bufferToString } from \"@fluidframework/common-utils\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport {\n ISegment,\n MergeTree,\n} from \"./mergeTree\";\nimport {\n matchProperties,\n PropertySet,\n} from \"./properties\";\nimport {\n IJSONSegmentWithMergeInfo,\n JsonSegmentSpecs,\n MergeTreeHeaderMetadata,\n MergeTreeChunkV1,\n toLatestVersion,\n serializeAsMaxSupportedVersion,\n} from \"./snapshotChunks\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\n\nexport class SnapshotV1 {\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 chunkSize: number = 10000;\n\n private readonly header: MergeTreeHeaderMetadata;\n private readonly segments: JsonSegmentSpecs[];\n private readonly segmentLengths: number[];\n private readonly logger: ITelemetryLogger;\n private readonly chunkSize: number;\n\n constructor(\n public mergeTree: MergeTree,\n logger: ITelemetryLogger,\n private readonly getLongClientId: (id: number) => string,\n public filename?: string,\n public onCompletion?: () => void,\n ) {\n this.logger = ChildLogger.create(logger, \"Snapshot\");\n this.chunkSize = mergeTree?.options?.mergeTreeSnapshotChunkSize ?? SnapshotV1.chunkSize;\n\n const { currentSeq, minSeq } = mergeTree.getCollabWindow();\n this.header = {\n minSequenceNumber: minSeq,\n sequenceNumber: currentSeq,\n orderedChunkMetadata: [],\n totalLength: 0,\n totalSegmentCount: 0,\n };\n\n this.segments = [];\n this.segmentLengths = [];\n }\n\n private getSeqLengthSegs(\n allSegments: JsonSegmentSpecs[],\n allLengths: number[],\n approxSequenceLength: number,\n startIndex = 0): MergeTreeChunkV1 {\n const segments: JsonSegmentSpecs[] = [];\n let length = 0;\n let segmentCount = 0;\n while ((length < approxSequenceLength) && ((startIndex + segmentCount) < allSegments.length)) {\n const pseg = allSegments[startIndex + segmentCount];\n segments.push(pseg);\n length += allLengths[startIndex + segmentCount];\n segmentCount++;\n }\n return {\n version: \"1\",\n segmentCount,\n length,\n segments,\n startIndex,\n headerMetadata: undefined,\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 serializer: IFluidSerializer,\n bind: IFluidHandle,\n ): ISummaryTreeWithStats {\n const chunks: MergeTreeChunkV1[] = [];\n this.header.totalSegmentCount = 0;\n this.header.totalLength = 0;\n do {\n const chunk = this.getSeqLengthSegs(\n this.segments,\n this.segmentLengths,\n this.chunkSize,\n this.header.totalSegmentCount);\n chunks.push(chunk);\n this.header.totalSegmentCount += chunk.segmentCount;\n this.header.totalLength += chunk.length;\n } while (this.header.totalSegmentCount < this.segments.length);\n\n // The do while loop should have added at least one chunk\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const headerChunk = chunks.shift()!;\n headerChunk.headerMetadata = this.header;\n headerChunk.headerMetadata.orderedChunkMetadata = [{ id: SnapshotLegacy.header }];\n const blobs: [key: string, content: string][] = [];\n chunks.forEach((chunk, index) => {\n const id = `${SnapshotLegacy.body}_${index}`;\n this.header.orderedChunkMetadata.push({ id });\n blobs.push([id, serializeAsMaxSupportedVersion(\n id,\n chunk,\n this.logger,\n this.mergeTree.options,\n serializer,\n bind)]);\n });\n\n const builder = new SummaryTreeBuilder();\n builder.addBlob(SnapshotLegacy.header, serializeAsMaxSupportedVersion(\n SnapshotLegacy.header,\n headerChunk,\n this.logger,\n this.mergeTree.options,\n serializer,\n bind));\n blobs.forEach((value) => {\n builder.addBlob(value[0], value[1]);\n });\n\n return builder.getSummaryTree();\n }\n\n extractSync() {\n const mergeTree = this.mergeTree;\n const minSeq = this.header.minSequenceNumber;\n\n // Helper to add the given `MergeTreeChunkV0SegmentSpec` to the snapshot.\n const pushSegRaw = (json: JsonSegmentSpecs, length: number) => {\n this.segments.push(json);\n this.segmentLengths.push(length);\n };\n\n // Helper to serialize the given `segment` and add it to the snapshot (if a segment is provided).\n const pushSeg = (segment?: ISegment) => {\n if (segment) { pushSegRaw(segment.toJSONObject(), segment.cachedLength); }\n };\n\n let prev: ISegment | undefined;\n const extractSegment = (segment: ISegment) => {\n // Elide segments that do not need to be included in the snapshot. A segment may be elided if\n // either condition is true:\n // a) The segment has not yet been ACKed. We do not need to snapshot unACKed segments because\n // there is a pending insert op that will deliver the segment on reconnection.\n // b) The segment was removed at or below the MSN. Pending ops can no longer reference this\n // segment, and therefore we can discard it.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (segment.seq === UnassignedSequenceNumber || segment.removedSeq! <= minSeq) {\n return true;\n }\n\n // Next determine if the snapshot needs to preserve information required for merging the segment\n // (seq, client, etc.) This information is only needed if the segment is above the MSN (and doesn't\n // have a pending remove.)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((segment.seq! <= minSeq) // Segment is below the MSN, and...\n && (segment.removedSeq === undefined // .. Segment has not been removed, or...\n || segment.removedSeq === UnassignedSequenceNumber) // .. Removal op to be delivered on reconnect\n ) {\n // This segment is below the MSN, which means that future ops will not reference it. Attempt to\n // coalesce the new segment with the previous (if any).\n if (!prev) {\n // We do not have a previous candidate for coalescing. Make the current segment the new candidate.\n prev = segment;\n } else if (prev.canAppend(segment) && matchProperties(prev.properties, segment.properties)) {\n // We have a compatible pair. Replace `prev` with the coalesced segment. Clone to avoid\n // modifying the segment instances currently in the MergeTree.\n prev = prev.clone();\n prev.append(segment.clone());\n } else {\n // The segment pair could not be coalesced. Record the `prev` segment in the snapshot\n // and make the current segment the new candidate for coalescing.\n pushSeg(prev);\n prev = segment;\n }\n } else {\n // This segment needs to preserve it's metadata as it may be referenced by future ops. It's ineligible\n // for coalescing, so emit the 'prev' segment now (if any).\n pushSeg(prev);\n prev = undefined;\n\n const raw: IJSONSegmentWithMergeInfo = { json: segment.toJSONObject() };\n // If the segment insertion is above the MSN, record the insertion merge info.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (segment.seq! > minSeq) {\n raw.seq = segment.seq;\n raw.client = this.getLongClientId(segment.clientId);\n }\n // We have already dispensed with removed segments below the MSN and removed segments with unassigned\n // sequence numbers. Any remaining removal info should be preserved.\n if (segment.removedSeq !== undefined) {\n assert(segment.removedSeq !== UnassignedSequenceNumber && segment.removedSeq > minSeq,\n 0x065 /* \"On removal info preservation, segment has invalid removed sequence number!\" */);\n raw.removedSeq = segment.removedSeq;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n raw.removedClient = this.getLongClientId(segment.removedClientId!);\n }\n\n // Sanity check that we are preserving either the seq < minSeq or a removed segment's info.\n assert(raw.seq !== undefined && raw.client !== undefined\n || raw.removedSeq !== undefined && raw.removedClient !== undefined,\n 0x066 /* \"Corrupted preservation of segment metadata!\" */);\n\n // Record the segment with it's required metadata.\n pushSegRaw(raw, segment.cachedLength);\n }\n return true;\n };\n\n mergeTree.walkAllSegments(mergeTree.root, extractSegment, this);\n\n // If the last segment in the walk was coalescable, push it now.\n pushSeg(prev);\n\n return this.segments;\n }\n\n public static async loadChunk(\n storage: IChannelStorageService,\n path: string,\n logger: ITelemetryLogger,\n options: PropertySet | undefined,\n serializer?: IFluidSerializer,\n ): Promise<MergeTreeChunkV1> {\n const blob = await storage.readBlob(path);\n const chunkAsString = bufferToString(blob, \"utf8\");\n return SnapshotV1.processChunk(path, chunkAsString, logger, options, serializer);\n }\n\n public static processChunk(\n path: string,\n chunk: string,\n logger: ITelemetryLogger,\n options: PropertySet | undefined,\n serializer?: IFluidSerializer,\n ): MergeTreeChunkV1 {\n const chunkObj = serializer ? serializer.parse(chunk) : JSON.parse(chunk);\n return toLatestVersion(path, chunkObj, logger, options);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotlegacy.d.ts","sourceRoot":"","sources":["../src/snapshotlegacy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAGjF,OAAO,EAEH,SAAS,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAkBrC,qBAAa,cAAc;IAoBJ,SAAS,EAAE,SAAS;IAAmC,QAAQ,CAAC;IACxE,YAAY,CAAC,SAAQ,IAAI;IApBpC,gBAAuB,MAAM,YAAY;IACzC,gBAAuB,IAAI,UAAU;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAQlD,gBAAuB,gBAAgB,EAAE,MAAM,CAAS;IAExD,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEhB,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAS,QAAQ,CAAC,oBAAQ,EAChF,YAAY,CAAC,SAAQ,IAAI,aAAA;IAKpC,OAAO,CAAC,gBAAgB;IA0BxB;;;OAGG;IACH,IAAI,CACA,WAAW,EAAE,yBAAyB,EAAE,EACxC,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,GACnB,qBAAqB;IA4CxB,WAAW;CAgEd"}
1
+ {"version":3,"file":"snapshotlegacy.d.ts","sourceRoot":"","sources":["../src/snapshotlegacy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAGjF,OAAO,EAEH,SAAS,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAkBrC,qBAAa,cAAc;IAoBJ,SAAS,EAAE,SAAS;IAAmC,QAAQ,CAAC;IACxE,YAAY,CAAC,SAAQ,IAAI;IApBpC,gBAAuB,MAAM,YAAY;IACzC,gBAAuB,IAAI,UAAU;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAQlD,gBAAuB,gBAAgB,EAAE,MAAM,CAAS;IAExD,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEhB,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAS,QAAQ,CAAC,oBAAQ,EAChF,YAAY,CAAC,SAAQ,IAAI,aAAA;IAKpC,OAAO,CAAC,gBAAgB;IA0BxB;;;OAGG;IACH,IAAI,CACA,WAAW,EAAE,yBAAyB,EAAE,EACxC,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,GACnB,qBAAqB;IA4CxB,WAAW;CA8Dd"}
@@ -74,10 +74,8 @@ export class SnapshotLegacy {
74
74
  const extractSegment =
75
75
  // eslint-disable-next-line max-len
76
76
  (segment, pos, refSeq, clientId, start, end) => {
77
- // eslint-disable-next-line eqeqeq
78
- if ((segment.seq != UnassignedSequenceNumber) && (segment.seq <= this.seq) &&
79
- // eslint-disable-next-line eqeqeq
80
- ((segment.removedSeq === undefined) || (segment.removedSeq == UnassignedSequenceNumber) ||
77
+ if ((segment.seq !== UnassignedSequenceNumber) && (segment.seq <= this.seq) &&
78
+ ((segment.removedSeq === undefined) || (segment.removedSeq === UnassignedSequenceNumber) ||
81
79
  (segment.removedSeq > this.seq))) {
82
80
  if (prev && prev.canAppend(segment)
83
81
  && matchProperties(prev.properties, segment.properties)) {
@@ -109,8 +107,7 @@ export class SnapshotLegacy {
109
107
  // When this condition happens, we might not write out all segments in getSeqLengthSegs()
110
108
  // when writing out "body". Issue #1995 tracks following up on the core of the problem.
111
109
  // In the meantime, this code makes sure we will write out all segments properly
112
- // eslint-disable-next-line eqeqeq
113
- if (this.header.segmentsTotalLength != totalLength) {
110
+ if (this.header.segmentsTotalLength !== totalLength) {
114
111
  this.logger.sendErrorEvent({
115
112
  eventName: "SegmentsTotalLengthMismatch",
116
113
  totalLength,
@@ -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 // eslint-disable-next-line eqeqeq\n if ((segment.seq != UnassignedSequenceNumber) && (segment.seq! <= this.seq!) &&\n // eslint-disable-next-line eqeqeq\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 // eslint-disable-next-line eqeqeq\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 && 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"]}
@@ -8,15 +8,15 @@ import { ISegment } from "./mergeTree";
8
8
  *
9
9
  * This differs from a normal sorted set in that the keys are not fixed.
10
10
  * The segments are sorted via their ordinals which can change as the merge tree is modified.
11
- * Eventhough the values of the ordinals can change their ordering and uniqueness cannot, so the order of a set of
11
+ * Even though the values of the ordinals can change their ordering and uniqueness cannot, so the order of a set of
12
12
  * segments ordered by their ordinals will always have the same order even if the ordinal values on
13
- * the segments changes. This invarient allows ensure the segments stay ordered and unique, and that new segments
13
+ * the segments changes. This invariant allows ensure the segments stay ordered and unique, and that new segments
14
14
  * can be inserted into that order.
15
15
  */
16
16
  export declare class SortedSegmentSet<T extends ISegment | {
17
17
  readonly segment: ISegment;
18
18
  } = ISegment> {
19
- private readonly oridinalSortedItems;
19
+ private readonly ordinalSortedItems;
20
20
  get size(): number;
21
21
  get items(): readonly T[];
22
22
  addOrUpdate(newItem: T, update?: (existingItem: T, newItem: T) => T): void;
@@ -1 +1 @@
1
- {"version":3,"file":"sortedSegmentSet.d.ts","sourceRoot":"","sources":["../src/sortedSegmentSet.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;;;;;;;;GASG;AACH,qBAAa,gBAAgB,CAAC,CAAC,SAAS,QAAQ,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,GAAG,QAAQ;IACxF,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAW;IAE/C,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,KAAK,IAAI,SAAS,CAAC,EAAE,CAE/B;IAEM,WAAW,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC;IAWnE,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO;IASxB,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO;IAK5B,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,mBAAmB;CAqB9B"}
1
+ {"version":3,"file":"sortedSegmentSet.d.ts","sourceRoot":"","sources":["../src/sortedSegmentSet.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;;;;;;;;GASG;AACH,qBAAa,gBAAgB,CAAC,CAAC,SAAS,QAAQ,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,GAAG,QAAQ;IACxF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAW;IAE9C,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,KAAK,IAAI,SAAS,CAAC,EAAE,CAE/B;IAEM,WAAW,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC;IAWnE,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO;IASxB,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO;IAK5B,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,mBAAmB;CAqB9B"}
@@ -7,36 +7,36 @@
7
7
  *
8
8
  * This differs from a normal sorted set in that the keys are not fixed.
9
9
  * The segments are sorted via their ordinals which can change as the merge tree is modified.
10
- * Eventhough the values of the ordinals can change their ordering and uniqueness cannot, so the order of a set of
10
+ * Even though the values of the ordinals can change their ordering and uniqueness cannot, so the order of a set of
11
11
  * segments ordered by their ordinals will always have the same order even if the ordinal values on
12
- * the segments changes. This invarient allows ensure the segments stay ordered and unique, and that new segments
12
+ * the segments changes. This invariant allows ensure the segments stay ordered and unique, and that new segments
13
13
  * can be inserted into that order.
14
14
  */
15
15
  export class SortedSegmentSet {
16
16
  constructor() {
17
- this.oridinalSortedItems = [];
17
+ this.ordinalSortedItems = [];
18
18
  }
19
19
  get size() {
20
- return this.oridinalSortedItems.length;
20
+ return this.ordinalSortedItems.length;
21
21
  }
22
22
  get items() {
23
- return this.oridinalSortedItems;
23
+ return this.ordinalSortedItems;
24
24
  }
25
25
  addOrUpdate(newItem, update) {
26
26
  const position = this.findOrdinalPosition(this.getOrdinal(newItem));
27
27
  if (position.exists) {
28
28
  if (update) {
29
- update(this.oridinalSortedItems[position.index], newItem);
29
+ update(this.ordinalSortedItems[position.index], newItem);
30
30
  }
31
31
  }
32
32
  else {
33
- this.oridinalSortedItems.splice(position.index, 0, newItem);
33
+ this.ordinalSortedItems.splice(position.index, 0, newItem);
34
34
  }
35
35
  }
36
36
  remove(item) {
37
37
  const position = this.findOrdinalPosition(this.getOrdinal(item));
38
38
  if (position.exists) {
39
- this.oridinalSortedItems.splice(position.index, 1);
39
+ this.ordinalSortedItems.splice(position.index, 1);
40
40
  return true;
41
41
  }
42
42
  return false;
@@ -54,20 +54,20 @@ export class SortedSegmentSet {
54
54
  return maybeSegment.ordinal;
55
55
  }
56
56
  findOrdinalPosition(ordinal, start, end) {
57
- if (this.oridinalSortedItems.length === 0) {
57
+ if (this.ordinalSortedItems.length === 0) {
58
58
  return { exists: false, index: 0 };
59
59
  }
60
60
  if (start === undefined || end === undefined) {
61
- return this.findOrdinalPosition(ordinal, 0, this.oridinalSortedItems.length - 1);
61
+ return this.findOrdinalPosition(ordinal, 0, this.ordinalSortedItems.length - 1);
62
62
  }
63
63
  const index = start + Math.floor((end - start) / 2);
64
- if (this.getOrdinal(this.oridinalSortedItems[index]) > ordinal) {
64
+ if (this.getOrdinal(this.ordinalSortedItems[index]) > ordinal) {
65
65
  if (start === index) {
66
66
  return { exists: false, index };
67
67
  }
68
68
  return this.findOrdinalPosition(ordinal, start, index - 1);
69
69
  }
70
- else if (this.getOrdinal(this.oridinalSortedItems[index]) < ordinal) {
70
+ else if (this.getOrdinal(this.ordinalSortedItems[index]) < ordinal) {
71
71
  if (index === end) {
72
72
  return { exists: false, index: index + 1 };
73
73
  }
@@ -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 * Eventhough 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 invarient 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 oridinalSortedItems: T[] = [];\n\n public get size(): number {\n return this.oridinalSortedItems.length;\n }\n\n public get items(): readonly T[] {\n return this.oridinalSortedItems;\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.oridinalSortedItems[position.index], newItem);\n }\n } else {\n this.oridinalSortedItems.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.oridinalSortedItems.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.oridinalSortedItems.length === 0) {\n return { exists: false, index: 0 };\n }\n if (start === undefined || end === undefined) {\n return this.findOrdinalPosition(ordinal, 0, this.oridinalSortedItems.length - 1);\n }\n const index = start + Math.floor((end - start) / 2);\n if (this.getOrdinal(this.oridinalSortedItems[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.oridinalSortedItems[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 && 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 +1 @@
1
- {"version":3,"file":"textSegment.d.ts","sourceRoot":"","sources":["../src/textSegment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAO,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAa3C,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IAClD,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,WAAY,SAAQ,WAAW;IA2BrB,IAAI,EAAE,MAAM;IA1B/B,gBAAuB,IAAI,iBAAiB;WAE9B,EAAE,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,IAAI,WAAW;WAI7C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW;WAQtC,cAAc,CAAC,IAAI,EAAE,GAAG;IAUtC,SAAgB,IAAI,iBAAoB;gBAErB,IAAI,EAAE,MAAM;IAKxB,YAAY;;;;IAQZ,KAAK,CAAC,KAAK,SAAI,EAAE,GAAG,CAAC,EAAE,MAAM;IAO7B,SAAS,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO;IAOrC,QAAQ;IAIR,MAAM,CAAC,OAAO,EAAE,QAAQ;IAexB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAc7C,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM;CAS7C;AAqBD,qBAAa,mBAAmB;IAChB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAE1C,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM;;;;IA2B/F,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,SAAK,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM;IAoB/F,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAwFzB;CACL"}
1
+ {"version":3,"file":"textSegment.d.ts","sourceRoot":"","sources":["../src/textSegment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAa3C,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IAClD,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,WAAY,SAAQ,WAAW;IA2BrB,IAAI,EAAE,MAAM;IA1B/B,gBAAuB,IAAI,iBAAiB;WAE9B,EAAE,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,IAAI,WAAW;WAI7C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW;WAQtC,cAAc,CAAC,IAAI,EAAE,GAAG;IAUtC,SAAgB,IAAI,iBAAoB;gBAErB,IAAI,EAAE,MAAM;IAKxB,YAAY;;;;IAQZ,KAAK,CAAC,KAAK,SAAI,EAAE,GAAG,CAAC,EAAE,MAAM;IAO7B,SAAS,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO;IAOrC,QAAQ;IAIR,MAAM,CAAC,OAAO,EAAE,QAAQ;IAexB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAc7C,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM;CAS7C;AAqBD,qBAAa,mBAAmB;IAChB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAE1C,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM;;;;IAsB/F,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,SAAK,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM;IAe/F,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAmFzB;CACL"}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { BaseSegment, glc, MergeTree } from "./mergeTree";
5
+ import { BaseSegment } from "./mergeTree";
6
6
  import { LocalReferenceCollection } from "./localReference";
7
7
  // Maximum length of text segment to be considered to be merged with other segment.
8
8
  // Maximum segment length is at least 2x of it (not taking into account initial segment creation).
@@ -24,11 +24,11 @@ export class TextSegment extends BaseSegment {
24
24
  return segment.type === TextSegment.type;
25
25
  }
26
26
  static make(text, props) {
27
- const tseg = new TextSegment(text);
27
+ const seg = new TextSegment(text);
28
28
  if (props) {
29
- tseg.addProperties(props);
29
+ seg.addProperties(props);
30
30
  }
31
- return tseg;
31
+ return seg;
32
32
  }
33
33
  static fromJSONObject(spec) {
34
34
  if (typeof spec === "string") {
@@ -109,12 +109,6 @@ export class MergeTreeTextHelper {
109
109
  this.gatherText = (segment, pos, refSeq, clientId, start, end, accumText) => {
110
110
  let _start = start;
111
111
  if (TextSegment.is(segment)) {
112
- if (MergeTree.traceGatherText) {
113
- console.log(
114
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
115
- `@cli ${this.mergeTree.getLongClientId(this.mergeTree.collabWindow.clientId)} ` +
116
- `gather seg seq ${segment.seq} rseq ${segment.removedSeq} text ${segment.text}`);
117
- }
118
112
  let beginTags = "";
119
113
  let endTags = "";
120
114
  if (isTextAndMarkerAccumulator(accumText)) {
@@ -209,20 +203,12 @@ export class MergeTreeTextHelper {
209
203
  tagsInProgress: [],
210
204
  textSegment: new TextSegment(""),
211
205
  };
212
- if (MergeTree.traceGatherText) {
213
- console.log(`get text on cli ${glc(this.mergeTree, this.mergeTree.collabWindow.clientId)} ` +
214
- `ref cli ${glc(this.mergeTree, clientId)} refSeq ${refSeq}`);
215
- }
216
206
  this.mergeTree.mapRange({ leaf: this.gatherText }, refSeq, clientId, accum, range.start, range.end);
217
207
  return { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };
218
208
  }
219
209
  getText(refSeq, clientId, placeholder = "", start, end) {
220
210
  const range = this.getValidRange(start, end, refSeq, clientId);
221
211
  const accum = { textSegment: new TextSegment(""), placeholder };
222
- if (MergeTree.traceGatherText) {
223
- console.log(`get text on cli ${glc(this.mergeTree, this.mergeTree.collabWindow.clientId)} ` +
224
- `ref cli ${glc(this.mergeTree, clientId)} refSeq ${refSeq}`);
225
- }
226
212
  this.mergeTree.mapRange({ leaf: this.gatherText }, refSeq, clientId, accum, range.start, range.end);
227
213
  return accum.textSegment.text;
228
214
  }