@fluidframework/merge-tree 0.58.1001 → 0.58.2001

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 (50) hide show
  1. package/DEV.md +9 -0
  2. package/dist/base.js.map +1 -1
  3. package/dist/localReference.d.ts.map +1 -1
  4. package/dist/localReference.js +7 -0
  5. package/dist/localReference.js.map +1 -1
  6. package/dist/mergeTree.d.ts.map +1 -1
  7. package/dist/mergeTree.js +26 -23
  8. package/dist/mergeTree.js.map +1 -1
  9. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  10. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  11. package/dist/partialLengths.d.ts.map +1 -1
  12. package/dist/partialLengths.js +2 -2
  13. package/dist/partialLengths.js.map +1 -1
  14. package/dist/properties.d.ts.map +1 -1
  15. package/dist/properties.js +9 -2
  16. package/dist/properties.js.map +1 -1
  17. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  18. package/dist/segmentPropertiesManager.js +4 -0
  19. package/dist/segmentPropertiesManager.js.map +1 -1
  20. package/dist/textSegment.d.ts.map +1 -1
  21. package/dist/textSegment.js.map +1 -1
  22. package/lib/base.js.map +1 -1
  23. package/lib/localReference.d.ts.map +1 -1
  24. package/lib/localReference.js +7 -0
  25. package/lib/localReference.js.map +1 -1
  26. package/lib/mergeTree.d.ts.map +1 -1
  27. package/lib/mergeTree.js +26 -23
  28. package/lib/mergeTree.js.map +1 -1
  29. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
  30. package/lib/mergeTreeDeltaCallback.js.map +1 -1
  31. package/lib/partialLengths.d.ts.map +1 -1
  32. package/lib/partialLengths.js +2 -2
  33. package/lib/partialLengths.js.map +1 -1
  34. package/lib/properties.d.ts.map +1 -1
  35. package/lib/properties.js +9 -2
  36. package/lib/properties.js.map +1 -1
  37. package/lib/segmentPropertiesManager.d.ts.map +1 -1
  38. package/lib/segmentPropertiesManager.js +4 -0
  39. package/lib/segmentPropertiesManager.js.map +1 -1
  40. package/lib/textSegment.d.ts.map +1 -1
  41. package/lib/textSegment.js.map +1 -1
  42. package/package.json +14 -10
  43. package/src/base.ts +2 -2
  44. package/src/localReference.ts +8 -0
  45. package/src/mergeTree.ts +31 -34
  46. package/src/mergeTreeDeltaCallback.ts +1 -0
  47. package/src/partialLengths.ts +2 -4
  48. package/src/properties.ts +9 -3
  49. package/src/segmentPropertiesManager.ts +4 -3
  50. package/src/textSegment.ts +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"mergeTreeDeltaCallback.d.ts","sourceRoot":"","sources":["../src/mergeTreeDeltaCallback.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EACH,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EACrB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,oBAAY,2BAA2B,GACnC,kBAAkB,CAAC,QAAQ,GAAG,kBAAkB,CAAC,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC;AAGxF,0BAAkB,wBAAwB;IACtC,MAAM,KAAK;IACX,KAAK,KAAK;IACV;;;;;;;;OAQG;IACH,MAAM,KAAK;IACX;;;OAGG;IACH,YAAY,KAAK;CACpB;AAED,oBAAY,4BAA4B,GAAG,2BAA2B,GAAG,wBAAwB,CAAC;AAGlG,MAAM,WAAW,2BAA2B,CAAC,cAAc,SAAS,4BAA4B,GAAG,2BAA2B;IAC1H,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,sBAAsB,EAAE,CAAC;CACpD;AAED,MAAM,WAAW,sBAAsB;IACnC,OAAO,EAAE,QAAQ,CAAC;IAClB,cAAc,CAAC,EAAE,WAAW,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IAClC;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC;IACtC;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,yBAAyB,CAAC;CACzD;AAED,MAAM,WAAW,4BAA4B;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACnC;AAED,oBAAY,sBAAsB,GAC9B,CAAC,MAAM,EAAE,qBAAqB,EAAE,SAAS,EAAE,2BAA2B,KAAK,IAAI,CAAC;AAEpF,MAAM,WAAW,iCAAkC,SAAQ,2BAA2B,CAAC,wBAAwB,CAAC;CAAI;AAEpH,oBAAY,4BAA4B,GACpC,CAAC,eAAe,EAAE,iCAAiC,EAAE,MAAM,EAAE,qBAAqB,GAAG,SAAS,KAAK,IAAI,CAAC"}
1
+ {"version":3,"file":"mergeTreeDeltaCallback.d.ts","sourceRoot":"","sources":["../src/mergeTreeDeltaCallback.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EACH,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EACrB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,oBAAY,2BAA2B,GACnC,kBAAkB,CAAC,QAAQ,GAAG,kBAAkB,CAAC,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC;AAGxF,0BAAkB,wBAAwB;IACtC,MAAM,KAAK;IACX,KAAK,KAAK;IACV;;;;;;;;OAQG;IACH,MAAM,KAAK;IACX;;;OAGG;IACH,YAAY,KAAK;CACpB;AAED,oBAAY,4BAA4B,GAAG,2BAA2B,GAAG,wBAAwB,CAAC;AAGlG,MAAM,WAAW,2BAA2B,CAAC,cAAc,SAAS,4BAA4B,GAAG,2BAA2B;IAC1H,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,sBAAsB,EAAE,CAAC;CACpD;AAED,MAAM,WAAW,sBAAsB;IACnC,OAAO,EAAE,QAAQ,CAAC;IAClB,cAAc,CAAC,EAAE,WAAW,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IAClC;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC;IACtC;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,yBAAyB,CAAC;CACzD;AAED,MAAM,WAAW,4BAA4B;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACnC;AAED,oBAAY,sBAAsB,GAC9B,CAAC,MAAM,EAAE,qBAAqB,EAAE,SAAS,EAAE,2BAA2B,KAAK,IAAI,CAAC;AAGpF,MAAM,WAAW,iCAAkC,SAAQ,2BAA2B,CAAC,wBAAwB,CAAC;CAAI;AAEpH,oBAAY,4BAA4B,GACpC,CAAC,eAAe,EAAE,iCAAiC,EAAE,MAAM,EAAE,qBAAqB,GAAG,SAAS,KAAK,IAAI,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mergeTreeDeltaCallback.js","sourceRoot":"","sources":["../src/mergeTreeDeltaCallback.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAcH,6EAA6E;AAC7E,IAAkB,wBAkBjB;AAlBD,WAAkB,wBAAwB;IACtC,4EAAW,CAAA;IACX,0EAAU,CAAA;IACV;;;;;;;;OAQG;IACH,4EAAW,CAAA;IACX;;;OAGG;IACH,wFAAiB,CAAA;AACrB,CAAC,EAlBiB,wBAAwB,GAAxB,gCAAwB,KAAxB,gCAAwB,QAkBzC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n IMergeTreeGroupMsg,\n IMergeTreeOp,\n MergeTreeDeltaType,\n} from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { ISegment } from \"./mergeTree\";\n\nexport type MergeTreeDeltaOperationType =\n MergeTreeDeltaType.ANNOTATE | MergeTreeDeltaType.INSERT | MergeTreeDeltaType.REMOVE;\n\n// Note: Assigned negative integers to avoid clashing with MergeTreeDeltaType\nexport const enum MergeTreeMaintenanceType {\n APPEND = -1,\n SPLIT = -2,\n /**\n * Notification that a segment has been unlinked from the MergeTree. This occurs during\n * Zamboni when:\n *\n * a) The minSeq has moved past the segment's removeSeq, in which case the segment\n * can no longer be referenced by incoming remote ops, and...\n *\n * b) The segment's tracking collection is empty (e.g., not being tracked for undo/redo).\n */\n UNLINK = -3,\n /**\n * Notification that a local change has been acknowledged by the server.\n * This means that it has made the round trip to the server and has had a sequence number assigned.\n */\n ACKNOWLEDGED = -4,\n}\n\nexport type MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationType | MergeTreeMaintenanceType;\n\n// eslint-disable-next-line max-len\nexport interface IMergeTreeDeltaCallbackArgs<TOperationType extends MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationType> {\n readonly operation: TOperationType;\n readonly deltaSegments: IMergeTreeSegmentDelta[];\n}\n\nexport interface IMergeTreeSegmentDelta {\n segment: ISegment;\n propertyDeltas?: PropertySet;\n}\n\nexport interface IMergeTreeDeltaOpArgs {\n /**\n * The group op which contains the operation\n * if there operation is part of a group op.\n */\n readonly groupOp?: IMergeTreeGroupMsg;\n /**\n * The merge tree operation\n */\n readonly op: IMergeTreeOp;\n /**\n * Get the sequence message, should only be null if the\n * Delta op args are for an unacked local change\n */\n readonly sequencedMessage?: ISequencedDocumentMessage;\n}\n\nexport interface IMergeTreeClientSequenceArgs {\n readonly clientId: number;\n readonly referenceSequenceNumber: number;\n readonly sequenceNumber: number;\n}\n\nexport type MergeTreeDeltaCallback =\n (opArgs: IMergeTreeDeltaOpArgs, deltaArgs: IMergeTreeDeltaCallbackArgs) => void;\n\nexport interface IMergeTreeMaintenanceCallbackArgs extends IMergeTreeDeltaCallbackArgs<MergeTreeMaintenanceType> { }\n\nexport type MergeTreeMaintenanceCallback =\n (MaintenanceArgs: IMergeTreeMaintenanceCallbackArgs, opArgs: IMergeTreeDeltaOpArgs | undefined) => void;\n"]}
1
+ {"version":3,"file":"mergeTreeDeltaCallback.js","sourceRoot":"","sources":["../src/mergeTreeDeltaCallback.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAcH,6EAA6E;AAC7E,IAAkB,wBAkBjB;AAlBD,WAAkB,wBAAwB;IACtC,4EAAW,CAAA;IACX,0EAAU,CAAA;IACV;;;;;;;;OAQG;IACH,4EAAW,CAAA;IACX;;;OAGG;IACH,wFAAiB,CAAA;AACrB,CAAC,EAlBiB,wBAAwB,GAAxB,gCAAwB,KAAxB,gCAAwB,QAkBzC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n IMergeTreeGroupMsg,\n IMergeTreeOp,\n MergeTreeDeltaType,\n} from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { ISegment } from \"./mergeTree\";\n\nexport type MergeTreeDeltaOperationType =\n MergeTreeDeltaType.ANNOTATE | MergeTreeDeltaType.INSERT | MergeTreeDeltaType.REMOVE;\n\n// Note: Assigned negative integers to avoid clashing with MergeTreeDeltaType\nexport const enum MergeTreeMaintenanceType {\n APPEND = -1,\n SPLIT = -2,\n /**\n * Notification that a segment has been unlinked from the MergeTree. This occurs during\n * Zamboni when:\n *\n * a) The minSeq has moved past the segment's removeSeq, in which case the segment\n * can no longer be referenced by incoming remote ops, and...\n *\n * b) The segment's tracking collection is empty (e.g., not being tracked for undo/redo).\n */\n UNLINK = -3,\n /**\n * Notification that a local change has been acknowledged by the server.\n * This means that it has made the round trip to the server and has had a sequence number assigned.\n */\n ACKNOWLEDGED = -4,\n}\n\nexport type MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationType | MergeTreeMaintenanceType;\n\n// eslint-disable-next-line max-len\nexport interface IMergeTreeDeltaCallbackArgs<TOperationType extends MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationType> {\n readonly operation: TOperationType;\n readonly deltaSegments: IMergeTreeSegmentDelta[];\n}\n\nexport interface IMergeTreeSegmentDelta {\n segment: ISegment;\n propertyDeltas?: PropertySet;\n}\n\nexport interface IMergeTreeDeltaOpArgs {\n /**\n * The group op which contains the operation\n * if there operation is part of a group op.\n */\n readonly groupOp?: IMergeTreeGroupMsg;\n /**\n * The merge tree operation\n */\n readonly op: IMergeTreeOp;\n /**\n * Get the sequence message, should only be null if the\n * Delta op args are for an unacked local change\n */\n readonly sequencedMessage?: ISequencedDocumentMessage;\n}\n\nexport interface IMergeTreeClientSequenceArgs {\n readonly clientId: number;\n readonly referenceSequenceNumber: number;\n readonly sequenceNumber: number;\n}\n\nexport type MergeTreeDeltaCallback =\n (opArgs: IMergeTreeDeltaOpArgs, deltaArgs: IMergeTreeDeltaCallbackArgs) => void;\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface IMergeTreeMaintenanceCallbackArgs extends IMergeTreeDeltaCallbackArgs<MergeTreeMaintenanceType> { }\n\nexport type MergeTreeMaintenanceCallback =\n (MaintenanceArgs: IMergeTreeMaintenanceCallbackArgs, opArgs: IMergeTreeDeltaOpArgs | undefined) => void;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"partialLengths.d.ts","sourceRoot":"","sources":["../src/partialLengths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EACH,mBAAmB,EAEnB,WAAW,EAGX,SAAS,EACZ,MAAM,aAAa,CAAC;AAErB,UAAU,cAAc;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAClB;AA2BD,MAAM,WAAW,qBAAqB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC/D;AAED;;;;GAIG;AACH,qBAAa,sBAAsB;IA0UZ,MAAM,EAAE,MAAM;IAzUjC,OAAc,OAAO;;;MAGnB;WAEY,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,KAAK,UAAQ;IAIhH;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAsI5B,OAAO,CAAC,MAAM,CAAC,UAAU;IAsDzB,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAQhC,OAAO,CAAC,MAAM,CAAC,6BAA6B;IAmB5C,OAAO,CAAC,MAAM,CAAC,aAAa;IA4D5B,OAAO,CAAC,MAAM,CAAC,MAAM;IAkCd,SAAS,SAAK;IACd,YAAY,SAAK;IACjB,cAAc,EAAE,qBAAqB,EAAE,CAAM;IAC7C,gBAAgB,EAAE,qBAAqB,EAAE,EAAE,CAAM;gBAErC,MAAM,EAAE,MAAM;IAM1B,MAAM,CACT,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,mBAAmB;IAkD9B,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAgCjD,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,EAAE,WAAW,SAAI;IA2B7D,OAAO,CAAC,OAAO;IA8Bf,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,6BAA6B;IAWrC,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,oBAAoB;IAqD5B,OAAO,CAAC,MAAM;CAqBjB"}
1
+ {"version":3,"file":"partialLengths.d.ts","sourceRoot":"","sources":["../src/partialLengths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EACH,mBAAmB,EAEnB,WAAW,EAGX,SAAS,EACZ,MAAM,aAAa,CAAC;AAErB,UAAU,cAAc;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAClB;AA2BD,MAAM,WAAW,qBAAqB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC/D;AAED;;;;GAIG;AACH,qBAAa,sBAAsB;IAwUZ,MAAM,EAAE,MAAM;IAvUjC,OAAc,OAAO;;;MAGnB;WAEY,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,KAAK,UAAQ;IAIhH;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAqI5B,OAAO,CAAC,MAAM,CAAC,UAAU;IAsDzB,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAQhC,OAAO,CAAC,MAAM,CAAC,6BAA6B;IAmB5C,OAAO,CAAC,MAAM,CAAC,aAAa;IA4D5B,OAAO,CAAC,MAAM,CAAC,MAAM;IAiCd,SAAS,SAAK;IACd,YAAY,SAAK;IACjB,cAAc,EAAE,qBAAqB,EAAE,CAAM;IAC7C,gBAAgB,EAAE,qBAAqB,EAAE,EAAE,CAAM;gBAErC,MAAM,EAAE,MAAM;IAM1B,MAAM,CACT,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,mBAAmB;IAkD9B,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAgCjD,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,EAAE,WAAW,SAAI;IA2B7D,OAAO,CAAC,OAAO;IA8Bf,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,6BAA6B;IAWrC,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,oBAAoB;IAqD5B,OAAO,CAAC,MAAM;CAqBjB"}
@@ -428,7 +428,7 @@ class PartialSequenceLengths {
428
428
  for (const partial of this.partialLengths) {
429
429
  buf += `(${partial.seq},${partial.len}) `;
430
430
  }
431
- // eslint-disable-next-line @typescript-eslint/no-for-in-array
431
+ // eslint-disable-next-line @typescript-eslint/no-for-in-array, no-restricted-syntax
432
432
  for (const clientId in this.clientSeqNumbers) {
433
433
  if (this.clientSeqNumbers[clientId].length > 0) {
434
434
  buf += `Client `;
@@ -470,7 +470,7 @@ class PartialSequenceLengths {
470
470
  return minLength;
471
471
  }
472
472
  this.minLength += copyDown(this.partialLengths);
473
- // eslint-disable-next-line @typescript-eslint/no-for-in-array, guard-for-in
473
+ // eslint-disable-next-line @typescript-eslint/no-for-in-array, guard-for-in, no-restricted-syntax
474
474
  for (const clientId in this.clientSeqNumbers) {
475
475
  const cliPartials = this.clientSeqNumbers[clientId];
476
476
  if (cliPartials) {
@@ -1 +1 @@
1
- {"version":3,"file":"partialLengths.js","sourceRoot":"","sources":["../src/partialLengths.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 { assert } from \"@fluidframework/common-utils\";\nimport { Property } from \"./base\";\nimport { RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport {\n CollaborationWindow,\n compareNumbers,\n IMergeBlock,\n IRemovalInfo,\n ISegment,\n MergeTree,\n} from \"./mergeTree\";\n\ninterface IOverlapClient {\n clientId: number;\n seglen: number;\n}\n\n/**\n * Returns the partial length whose sequence number is\n * the greatest sequence number within a that is\n * less than or equal to key.\n * @param a - array of partial segment lengths\n * @param key - sequence number\n */\nfunction latestLEQ(a: PartialSequenceLength[], key: number) {\n let best = -1;\n let lo = 0;\n let hi = a.length - 1;\n while (lo <= hi) {\n const mid = lo + Math.floor((hi - lo) / 2);\n if (a[mid].seq <= key) {\n if ((best < 0) || (a[best].seq < a[mid].seq)) {\n best = mid;\n }\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return best;\n}\n\nexport interface PartialSequenceLength {\n seq: number;\n len: number;\n seglen: number;\n clientId?: number;\n overlapRemoveClients?: RedBlackTree<number, IOverlapClient>;\n}\n\n/**\n * Keep track of partial sums of segment lengths for all sequence numbers\n * in the current collaboration window (if any). Only used during active\n * collaboration.\n */\nexport class PartialSequenceLengths {\n public static options = {\n verify: false,\n zamboni: true,\n };\n\n public static combine(mergeTree: MergeTree, block: IMergeBlock, collabWindow: CollaborationWindow, recur = false) {\n return PartialSequenceLengths.combineBranch(mergeTree, block, collabWindow, recur);\n }\n\n /**\n * Combine the partial lengths of block's children\n * @param block - an interior node; it is assumed that each interior node child of this block\n * has its partials up to date\n * @param collabWindow - segment window of the segment tree containing textSegmentBlock\n */\n private static combineBranch(\n mergeTree: MergeTree,\n block: IMergeBlock,\n collabWindow: CollaborationWindow,\n recur = false) {\n let combinedPartialLengths = new PartialSequenceLengths(collabWindow.minSeq);\n PartialSequenceLengths.fromLeaves(mergeTree, combinedPartialLengths, block, collabWindow);\n let prevPartial: PartialSequenceLength | undefined;\n\n function cloneOverlapRemoveClients(oldTree: RedBlackTree<number, IOverlapClient> | undefined) {\n if (!oldTree) { return undefined; }\n const newTree = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n oldTree.map((bProp: Property<number, IOverlapClient>) => {\n newTree.put(bProp.data.clientId, { ...bProp.data });\n return true;\n });\n return newTree;\n }\n\n function combineOverlapClients(a: PartialSequenceLength, b: PartialSequenceLength) {\n const overlapRemoveClientsA = a.overlapRemoveClients;\n if (overlapRemoveClientsA) {\n if (b.overlapRemoveClients) {\n b.overlapRemoveClients.map((bProp: Property<number, IOverlapClient>) => {\n const aProp = overlapRemoveClientsA.get(bProp.key);\n if (aProp) {\n aProp.data.seglen += bProp.data.seglen;\n } else {\n overlapRemoveClientsA.put(bProp.data.clientId, { ...bProp.data });\n }\n return true;\n });\n }\n } else {\n a.overlapRemoveClients = cloneOverlapRemoveClients(b.overlapRemoveClients);\n }\n }\n\n function addNext(partialLength: PartialSequenceLength) {\n const seq = partialLength.seq;\n let pLen = 0;\n\n if (prevPartial) {\n if (prevPartial.seq === partialLength.seq) {\n prevPartial.seglen += partialLength.seglen;\n prevPartial.len += partialLength.seglen;\n combineOverlapClients(prevPartial, partialLength);\n return;\n } else {\n pLen = prevPartial.len;\n // Previous sequence number is finished\n combinedPartialLengths.addClientSeqNumberFromPartial(prevPartial);\n }\n }\n prevPartial = {\n clientId: partialLength.clientId,\n len: pLen + partialLength.seglen,\n overlapRemoveClients: cloneOverlapRemoveClients(partialLength.overlapRemoveClients),\n seglen: partialLength.seglen,\n seq,\n };\n combinedPartialLengths.partialLengths.push(prevPartial);\n }\n\n const childPartials: PartialSequenceLengths[] = [];\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (!child.isLeaf()) {\n const childBlock = child;\n if (recur) {\n childBlock.partialLengths =\n PartialSequenceLengths.combine(mergeTree, childBlock, collabWindow, true);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n childPartials.push(childBlock.partialLengths!);\n }\n }\n let childPartialsLen = childPartials.length;\n if (childPartialsLen !== 0) {\n // Some children are interior nodes\n if (combinedPartialLengths.partialLengths.length > 0) {\n // Some children were leaves; add combined partials from these segments\n childPartials.push(combinedPartialLengths);\n childPartialsLen++;\n combinedPartialLengths = new PartialSequenceLengths(collabWindow.minSeq);\n }\n const indices = new Array<number>(childPartialsLen);\n const childPartialsCounts = new Array<number>(childPartialsLen);\n for (let i = 0; i < childPartialsLen; i++) {\n indices[i] = 0;\n childPartialsCounts[i] = childPartials[i].partialLengths.length;\n combinedPartialLengths.minLength += childPartials[i].minLength;\n combinedPartialLengths.segmentCount += childPartials[i].segmentCount;\n }\n let outerIndexOfEarliest = 0;\n let earliestPartialLength: PartialSequenceLength;\n while (outerIndexOfEarliest >= 0) {\n outerIndexOfEarliest = -1;\n for (let k = 0; k < childPartialsLen; k++) {\n // Find next earliest sequence number\n if (indices[k] < childPartialsCounts[k]) {\n const cpLen = childPartials[k].partialLengths[indices[k]];\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((outerIndexOfEarliest < 0) || (cpLen.seq < earliestPartialLength!.seq)) {\n outerIndexOfEarliest = k;\n earliestPartialLength = cpLen;\n }\n }\n }\n if (outerIndexOfEarliest >= 0) {\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n addNext(earliestPartialLength!);\n indices[outerIndexOfEarliest]++;\n }\n }\n // Add client entry for last partial, if any\n if (prevPartial) {\n combinedPartialLengths.addClientSeqNumberFromPartial(prevPartial);\n }\n }\n // TODO: incremental zamboni during build\n if (PartialSequenceLengths.options.zamboni) {\n combinedPartialLengths.zamboni(collabWindow);\n }\n\n if (PartialSequenceLengths.options.verify) {\n combinedPartialLengths.verify();\n }\n\n return combinedPartialLengths;\n }\n\n private static fromLeaves(\n mergeTree: MergeTree, combinedPartialLengths: PartialSequenceLengths,\n block: IMergeBlock, collabWindow: CollaborationWindow) {\n combinedPartialLengths.minLength = 0;\n combinedPartialLengths.segmentCount = block.childCount;\n\n function seqLTE(seq: number, minSeq: number) {\n return (seq !== UnassignedSequenceNumber) && (seq <= minSeq);\n }\n\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (child.isLeaf()) {\n // Leaf segment\n const segment = child;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (seqLTE(segment.seq!, collabWindow.minSeq)) {\n combinedPartialLengths.minLength += segment.cachedLength;\n } else {\n if (segment.seq !== UnassignedSequenceNumber) {\n PartialSequenceLengths.insertSegment(combinedPartialLengths, segment);\n }\n }\n const removalInfo: IRemovalInfo = segment;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (seqLTE(removalInfo.removedSeq!, collabWindow.minSeq)) {\n combinedPartialLengths.minLength -= segment.cachedLength;\n } else {\n if ((removalInfo.removedSeq !== undefined) &&\n (removalInfo.removedSeq !== UnassignedSequenceNumber)) {\n PartialSequenceLengths.insertSegment(\n combinedPartialLengths,\n segment,\n removalInfo);\n }\n }\n }\n }\n // Post-process correctly-ordered partials computing sums and creating\n // lists for each present client id\n const seqPartials = combinedPartialLengths.partialLengths;\n const seqPartialsLen = seqPartials.length;\n\n let prevLen = 0;\n for (let i = 0; i < seqPartialsLen; i++) {\n seqPartials[i].len = prevLen + seqPartials[i].seglen;\n prevLen = seqPartials[i].len;\n combinedPartialLengths.addClientSeqNumberFromPartial(seqPartials[i]);\n }\n if (PartialSequenceLengths.options.verify) {\n combinedPartialLengths.verify();\n }\n }\n\n private static getOverlapClients(overlapClientIds: number[], seglen: number) {\n const bst = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n for (const clientId of overlapClientIds) {\n bst.put(clientId, { clientId, seglen });\n }\n return bst;\n }\n\n private static accumulateRemoveClientOverlap(\n partialLength: PartialSequenceLength,\n overlapRemoveClientIds: number[],\n seglen: number) {\n if (partialLength.overlapRemoveClients) {\n for (const clientId of overlapRemoveClientIds) {\n const overlapClientNode = partialLength.overlapRemoveClients.get(clientId);\n if (!overlapClientNode) {\n partialLength.overlapRemoveClients.put(clientId, { clientId, seglen });\n } else {\n overlapClientNode.data.seglen += seglen;\n }\n }\n } else {\n partialLength.overlapRemoveClients =\n PartialSequenceLengths.getOverlapClients(overlapRemoveClientIds, seglen);\n }\n }\n\n private static insertSegment(\n combinedPartialLengths: PartialSequenceLengths,\n segment: ISegment,\n removalInfo?: IRemovalInfo) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n let seq = segment.seq!;\n let segmentLen = segment.cachedLength;\n let clientId = segment.clientId;\n let removeClientOverlap: number[] | undefined;\n\n if (removalInfo) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n seq = removalInfo.removedSeq!;\n segmentLen = -segmentLen;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n clientId = removalInfo.removedClientId!;\n if (removalInfo.removedClientOverlap) {\n removeClientOverlap = removalInfo.removedClientOverlap;\n }\n }\n\n const seqPartials = combinedPartialLengths.partialLengths;\n const seqPartialsLen = seqPartials.length;\n // Find the first entry with sequence number greater or equal to seq\n let indexFirstGTE = 0;\n for (; indexFirstGTE < seqPartialsLen; indexFirstGTE++) {\n if (seqPartials[indexFirstGTE].seq >= seq) {\n break;\n }\n }\n if ((indexFirstGTE < seqPartialsLen) && (seqPartials[indexFirstGTE].seq === seq)) {\n seqPartials[indexFirstGTE].seglen += segmentLen;\n if (removeClientOverlap) {\n PartialSequenceLengths.accumulateRemoveClientOverlap(\n seqPartials[indexFirstGTE],\n removeClientOverlap,\n segmentLen);\n }\n } else {\n let pLen: PartialSequenceLength;\n if (removeClientOverlap) {\n const overlapClients = PartialSequenceLengths.getOverlapClients(removeClientOverlap, segmentLen);\n pLen = { seq, clientId, len: 0, seglen: segmentLen, overlapRemoveClients: overlapClients };\n } else {\n pLen = { seq, clientId, len: 0, seglen: segmentLen };\n }\n\n if (indexFirstGTE < seqPartialsLen) {\n // Shift entries with greater sequence numbers\n // TODO: investigate performance improvement using BST\n for (let k = seqPartialsLen; k > indexFirstGTE; k--) {\n seqPartials[k] = seqPartials[k - 1];\n }\n seqPartials[indexFirstGTE] = pLen;\n } else {\n seqPartials.push(pLen);\n }\n }\n }\n\n private static addSeq(partialLengths: PartialSequenceLength[], seq: number, seqSeglen: number, clientId?: number) {\n let seqPartialLen: PartialSequenceLength | undefined;\n let penultPartialLen: PartialSequenceLength | undefined;\n let leqIndex = latestLEQ(partialLengths, seq);\n if (leqIndex >= 0) {\n const pLen = partialLengths[leqIndex];\n if (pLen.seq === seq) {\n seqPartialLen = pLen;\n leqIndex = latestLEQ(partialLengths, seq - 1);\n if (leqIndex >= 0) {\n penultPartialLen = partialLengths[leqIndex];\n }\n } else {\n penultPartialLen = pLen;\n }\n }\n if (seqPartialLen === undefined) {\n\n seqPartialLen = {\n clientId,\n seglen: seqSeglen,\n seq,\n } as PartialSequenceLength;\n partialLengths.push(seqPartialLen);\n } else {\n seqPartialLen.seglen = seqSeglen;\n // Assert client id matches\n }\n if (penultPartialLen !== undefined) {\n seqPartialLen.len = seqPartialLen.seglen + penultPartialLen.len;\n } else {\n seqPartialLen.len = seqPartialLen.seglen;\n }\n }\n public minLength = 0;\n public segmentCount = 0;\n public partialLengths: PartialSequenceLength[] = [];\n public clientSeqNumbers: PartialSequenceLength[][] = [];\n\n constructor(public minSeq: number) {\n }\n\n // Assume: seq is latest sequence number; no structural change to sub-tree, but a segment\n // with sequence number seq has been added within the sub-tree\n // TODO: assert client id matches\n public update(\n mergeTree: MergeTree,\n node: IMergeBlock,\n seq: number,\n clientId: number,\n collabWindow: CollaborationWindow) {\n let seqSeglen = 0;\n let segCount = 0;\n // Compute length for seq across children\n for (let i = 0; i < node.childCount; i++) {\n const child = node.children[i];\n if (!child.isLeaf()) {\n const childBlock = child;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const branchPartialLengths = childBlock.partialLengths!;\n const partialLengths = branchPartialLengths.partialLengths;\n const seqIndex = latestLEQ(partialLengths, seq);\n if (seqIndex >= 0) {\n const leqPartial = partialLengths[seqIndex];\n if (leqPartial.seq === seq) {\n seqSeglen += leqPartial.seglen;\n }\n }\n segCount += branchPartialLengths.segmentCount;\n } else {\n const segment = child;\n const removalInfo: IRemovalInfo = segment;\n\n if (segment.seq === seq) {\n if (removalInfo.removedSeq !== seq) {\n seqSeglen += segment.cachedLength;\n }\n } else {\n if (removalInfo.removedSeq === seq) {\n seqSeglen -= segment.cachedLength;\n }\n }\n segCount++;\n }\n }\n this.segmentCount = segCount;\n\n PartialSequenceLengths.addSeq(this.partialLengths, seq, seqSeglen, clientId);\n if (this.clientSeqNumbers[clientId] === undefined) {\n this.clientSeqNumbers[clientId] = [];\n }\n PartialSequenceLengths.addSeq(this.clientSeqNumbers[clientId], seq, seqSeglen);\n if (PartialSequenceLengths.options.zamboni) {\n this.zamboni(collabWindow);\n }\n if (PartialSequenceLengths.options.verify) {\n this.verify();\n }\n }\n\n public getPartialLength(refSeq: number, clientId: number) {\n let pLen = this.minLength;\n const seqIndex = latestLEQ(this.partialLengths, refSeq);\n const cliLatestIndex = this.cliLatest(clientId);\n const cliSeq = this.clientSeqNumbers[clientId];\n if (seqIndex >= 0) {\n // Add the partial length up to refSeq\n pLen += this.partialLengths[seqIndex].len;\n\n if (cliLatestIndex >= 0) {\n const cliLatest = cliSeq[cliLatestIndex];\n\n if (cliLatest.seq > refSeq) {\n // The client has local edits after refSeq, add in the length adjustments\n pLen += cliLatest.len;\n const precedingCliIndex = this.cliLatestLEQ(clientId, refSeq);\n if (precedingCliIndex >= 0) {\n pLen -= cliSeq[precedingCliIndex].len;\n }\n }\n }\n } else {\n // RefSeq is before any of the partial lengths\n // so just add in all local edits of that client (which should all be after the refSeq)\n if (cliLatestIndex >= 0) {\n const cliLatest = cliSeq[cliLatestIndex];\n pLen += cliLatest.len;\n }\n }\n return pLen;\n }\n\n public toString(glc?: (id: number) => string, indentCount = 0) {\n let buf = \"\";\n for (const partial of this.partialLengths) {\n buf += `(${partial.seq},${partial.len}) `;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-for-in-array\n for (const clientId in this.clientSeqNumbers) {\n if (this.clientSeqNumbers[clientId].length > 0) {\n buf += `Client `;\n if (glc) {\n buf += `${glc(+clientId)}`;\n } else {\n buf += `${clientId}`;\n }\n buf += \"[\";\n for (const partial of this.clientSeqNumbers[clientId]) {\n buf += `(${partial.seq},${partial.len})`;\n }\n buf += \"]\";\n }\n }\n buf = `min(seq ${this.minSeq}): ${this.minLength}; sc: ${this.segmentCount};${buf}`;\n return buf;\n }\n\n // Clear away partial sums for sequence numbers earlier than the current window\n private zamboni(segmentWindow: CollaborationWindow) {\n function copyDown(partialLengths: PartialSequenceLength[]) {\n const mindex = latestLEQ(partialLengths, segmentWindow.minSeq);\n let minLength = 0;\n if (mindex >= 0) {\n minLength = partialLengths[mindex].len;\n const seqCount = partialLengths.length;\n if (mindex <= (seqCount - 1)) {\n // Still some entries remaining\n const remainingCount = (seqCount - mindex) - 1;\n // Copy down\n for (let i = 0; i < remainingCount; i++) {\n partialLengths[i] = partialLengths[i + mindex + 1];\n partialLengths[i].len -= minLength;\n }\n partialLengths.length = remainingCount;\n }\n }\n return minLength;\n }\n this.minLength += copyDown(this.partialLengths);\n // eslint-disable-next-line @typescript-eslint/no-for-in-array, guard-for-in\n for (const clientId in this.clientSeqNumbers) {\n const cliPartials = this.clientSeqNumbers[clientId];\n if (cliPartials) {\n copyDown(cliPartials);\n }\n }\n }\n\n private addClientSeqNumber(clientId: number, seq: number, seglen: number) {\n if (this.clientSeqNumbers[clientId] === undefined) {\n this.clientSeqNumbers[clientId] = [];\n }\n const cli = this.clientSeqNumbers[clientId];\n let pLen = seglen;\n if (cli.length > 0) {\n pLen += cli[cli.length - 1].len;\n }\n cli.push({ seq, len: pLen, seglen });\n }\n\n // Assumes sequence number already coalesced\n private addClientSeqNumberFromPartial(partialLength: PartialSequenceLength) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.addClientSeqNumber(partialLength.clientId!, partialLength.seq, partialLength.seglen);\n if (partialLength.overlapRemoveClients) {\n partialLength.overlapRemoveClients.map((oc: Property<number, IOverlapClient>) => {\n this.addClientSeqNumber(oc.data.clientId, partialLength.seq, oc.data.seglen);\n return true;\n });\n }\n }\n\n private cliLatestLEQ(clientId: number, refSeq: number) {\n const cliSeqs = this.clientSeqNumbers[clientId];\n if (cliSeqs) {\n return latestLEQ(cliSeqs, refSeq);\n } else {\n return -1;\n }\n }\n\n private cliLatest(clientId: number) {\n const cliSeqs = this.clientSeqNumbers[clientId];\n if (cliSeqs && (cliSeqs.length > 0)) {\n return cliSeqs.length - 1;\n } else {\n return -1;\n }\n }\n\n // Debug only\n private verifyPartialLengths(partialLengths: PartialSequenceLength[], clientPartials: boolean) {\n if (partialLengths.length === 0) { return 0; }\n\n let lastSeqNum = 0;\n let accumSegLen = 0;\n let count = 0;\n\n for (const partialLength of partialLengths) {\n // Count total number of partial length\n count++;\n\n // Sequence number should be larger or equal to minseq\n assert(this.minSeq <= partialLength.seq, 0x054 /* \"Sequence number less than minSeq!\" */);\n\n // Sequence number should be sorted\n assert(lastSeqNum < partialLength.seq, 0x055 /* \"Sequence number is not sorted!\" */);\n lastSeqNum = partialLength.seq;\n\n // Len is a accumulation of all the seglen adjustments\n accumSegLen += partialLength.seglen;\n if (accumSegLen !== partialLength.len) {\n assert(false, 0x056 /* \"Unexpected total for accumulation of all seglen adjustments!\" */);\n }\n\n if (clientPartials) {\n // Client partials used to track local edits so we can account for them some refSeq.\n // But the information we keep track of are since minSeq, so we keep track of more history\n // then needed, and some of them doesn't make sense to be used for length calculations\n // e.g. if you have this sequence, where the minSeq is #5 because of other clients\n // seq 10: client 1: insert seg #1\n // seq 11: client 2: delete seg #2 refseq: 10\n // minLength is 0, we would have keep a record of seglen: -1 for clientPartialLengths for client 2\n // So if you ask for partial length for client 2 @ seq 5, we will have return -1.\n // However, that combination is invalid, since we should never see any ops with refseq < 10 for\n // client 2 after seq 11.\n } else {\n // Len adjustment should not make length negative\n if (this.minLength + partialLength.len < 0) {\n assert(false, 0x057 /* \"Negative length after length adjustment!\" */);\n }\n }\n\n if (partialLength.overlapRemoveClients) {\n // Only the flat partialLengths can have overlapRemoveClients, the per client view shouldn't\n assert(!clientPartials, 0x058 /* \"Both overlapRemoveClients and clientPartials are set!\" */);\n\n // Each overlap client count as one\n count += partialLength.overlapRemoveClients.size();\n }\n }\n return count;\n }\n\n private verify() {\n if (this.clientSeqNumbers) {\n let cliCount = 0;\n for (const cliSeq of this.clientSeqNumbers) {\n if (cliSeq) {\n cliCount += this.verifyPartialLengths(cliSeq, true);\n }\n }\n\n // If we have client view, we should have the flat view\n assert(!!this.partialLengths, 0x059 /* \"Client view exists but flat view does not!\" */);\n const flatCount = this.verifyPartialLengths(this.partialLengths, false);\n\n // The number of partial lengths on the client view and flat view should be the same\n assert(flatCount === cliCount,\n 0x05a /* \"Mismatch between number of partial lengths on client and flat views!\" */);\n } else {\n // If we don't have a client view, we shouldn't have the flat view either\n assert(!this.partialLengths, 0x05b /* \"Flat view exists but client view does not!\" */);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"partialLengths.js","sourceRoot":"","sources":["../src/partialLengths.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 { assert } from \"@fluidframework/common-utils\";\nimport { Property } from \"./base\";\nimport { RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport {\n CollaborationWindow,\n compareNumbers,\n IMergeBlock,\n IRemovalInfo,\n ISegment,\n MergeTree,\n} from \"./mergeTree\";\n\ninterface IOverlapClient {\n clientId: number;\n seglen: number;\n}\n\n/**\n * Returns the partial length whose sequence number is\n * the greatest sequence number within a that is\n * less than or equal to key.\n * @param a - array of partial segment lengths\n * @param key - sequence number\n */\nfunction latestLEQ(a: PartialSequenceLength[], key: number) {\n let best = -1;\n let lo = 0;\n let hi = a.length - 1;\n while (lo <= hi) {\n const mid = lo + Math.floor((hi - lo) / 2);\n if (a[mid].seq <= key) {\n if ((best < 0) || (a[best].seq < a[mid].seq)) {\n best = mid;\n }\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return best;\n}\n\nexport interface PartialSequenceLength {\n seq: number;\n len: number;\n seglen: number;\n clientId?: number;\n overlapRemoveClients?: RedBlackTree<number, IOverlapClient>;\n}\n\n/**\n * Keep track of partial sums of segment lengths for all sequence numbers\n * in the current collaboration window (if any). Only used during active\n * collaboration.\n */\nexport class PartialSequenceLengths {\n public static options = {\n verify: false,\n zamboni: true,\n };\n\n public static combine(mergeTree: MergeTree, block: IMergeBlock, collabWindow: CollaborationWindow, recur = false) {\n return PartialSequenceLengths.combineBranch(mergeTree, block, collabWindow, recur);\n }\n\n /**\n * Combine the partial lengths of block's children\n * @param block - an interior node; it is assumed that each interior node child of this block\n * has its partials up to date\n * @param collabWindow - segment window of the segment tree containing textSegmentBlock\n */\n private static combineBranch(\n mergeTree: MergeTree,\n block: IMergeBlock,\n collabWindow: CollaborationWindow,\n recur = false) {\n let combinedPartialLengths = new PartialSequenceLengths(collabWindow.minSeq);\n PartialSequenceLengths.fromLeaves(mergeTree, combinedPartialLengths, block, collabWindow);\n let prevPartial: PartialSequenceLength | undefined;\n\n function cloneOverlapRemoveClients(oldTree: RedBlackTree<number, IOverlapClient> | undefined) {\n if (!oldTree) { return undefined; }\n const newTree = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n oldTree.map((bProp: Property<number, IOverlapClient>) => {\n newTree.put(bProp.data.clientId, { ...bProp.data });\n return true;\n });\n return newTree;\n }\n\n function combineOverlapClients(a: PartialSequenceLength, b: PartialSequenceLength) {\n const overlapRemoveClientsA = a.overlapRemoveClients;\n if (overlapRemoveClientsA) {\n if (b.overlapRemoveClients) {\n b.overlapRemoveClients.map((bProp: Property<number, IOverlapClient>) => {\n const aProp = overlapRemoveClientsA.get(bProp.key);\n if (aProp) {\n aProp.data.seglen += bProp.data.seglen;\n } else {\n overlapRemoveClientsA.put(bProp.data.clientId, { ...bProp.data });\n }\n return true;\n });\n }\n } else {\n a.overlapRemoveClients = cloneOverlapRemoveClients(b.overlapRemoveClients);\n }\n }\n\n function addNext(partialLength: PartialSequenceLength) {\n const seq = partialLength.seq;\n let pLen = 0;\n\n if (prevPartial) {\n if (prevPartial.seq === partialLength.seq) {\n prevPartial.seglen += partialLength.seglen;\n prevPartial.len += partialLength.seglen;\n combineOverlapClients(prevPartial, partialLength);\n return;\n } else {\n pLen = prevPartial.len;\n // Previous sequence number is finished\n combinedPartialLengths.addClientSeqNumberFromPartial(prevPartial);\n }\n }\n prevPartial = {\n clientId: partialLength.clientId,\n len: pLen + partialLength.seglen,\n overlapRemoveClients: cloneOverlapRemoveClients(partialLength.overlapRemoveClients),\n seglen: partialLength.seglen,\n seq,\n };\n combinedPartialLengths.partialLengths.push(prevPartial);\n }\n\n const childPartials: PartialSequenceLengths[] = [];\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (!child.isLeaf()) {\n const childBlock = child;\n if (recur) {\n childBlock.partialLengths =\n PartialSequenceLengths.combine(mergeTree, childBlock, collabWindow, true);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n childPartials.push(childBlock.partialLengths!);\n }\n }\n let childPartialsLen = childPartials.length;\n if (childPartialsLen !== 0) {\n // Some children are interior nodes\n if (combinedPartialLengths.partialLengths.length > 0) {\n // Some children were leaves; add combined partials from these segments\n childPartials.push(combinedPartialLengths);\n childPartialsLen++;\n combinedPartialLengths = new PartialSequenceLengths(collabWindow.minSeq);\n }\n const indices = new Array<number>(childPartialsLen);\n const childPartialsCounts = new Array<number>(childPartialsLen);\n for (let i = 0; i < childPartialsLen; i++) {\n indices[i] = 0;\n childPartialsCounts[i] = childPartials[i].partialLengths.length;\n combinedPartialLengths.minLength += childPartials[i].minLength;\n combinedPartialLengths.segmentCount += childPartials[i].segmentCount;\n }\n let outerIndexOfEarliest = 0;\n let earliestPartialLength: PartialSequenceLength;\n while (outerIndexOfEarliest >= 0) {\n outerIndexOfEarliest = -1;\n for (let k = 0; k < childPartialsLen; k++) {\n // Find next earliest sequence number\n if (indices[k] < childPartialsCounts[k]) {\n const cpLen = childPartials[k].partialLengths[indices[k]];\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((outerIndexOfEarliest < 0) || (cpLen.seq < earliestPartialLength!.seq)) {\n outerIndexOfEarliest = k;\n earliestPartialLength = cpLen;\n }\n }\n }\n if (outerIndexOfEarliest >= 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n addNext(earliestPartialLength!);\n indices[outerIndexOfEarliest]++;\n }\n }\n // Add client entry for last partial, if any\n if (prevPartial) {\n combinedPartialLengths.addClientSeqNumberFromPartial(prevPartial);\n }\n }\n // TODO: incremental zamboni during build\n if (PartialSequenceLengths.options.zamboni) {\n combinedPartialLengths.zamboni(collabWindow);\n }\n\n if (PartialSequenceLengths.options.verify) {\n combinedPartialLengths.verify();\n }\n\n return combinedPartialLengths;\n }\n\n private static fromLeaves(\n mergeTree: MergeTree, combinedPartialLengths: PartialSequenceLengths,\n block: IMergeBlock, collabWindow: CollaborationWindow) {\n combinedPartialLengths.minLength = 0;\n combinedPartialLengths.segmentCount = block.childCount;\n\n function seqLTE(seq: number, minSeq: number) {\n return (seq !== UnassignedSequenceNumber) && (seq <= minSeq);\n }\n\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (child.isLeaf()) {\n // Leaf segment\n const segment = child;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (seqLTE(segment.seq!, collabWindow.minSeq)) {\n combinedPartialLengths.minLength += segment.cachedLength;\n } else {\n if (segment.seq !== UnassignedSequenceNumber) {\n PartialSequenceLengths.insertSegment(combinedPartialLengths, segment);\n }\n }\n const removalInfo: IRemovalInfo = segment;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (seqLTE(removalInfo.removedSeq!, collabWindow.minSeq)) {\n combinedPartialLengths.minLength -= segment.cachedLength;\n } else {\n if ((removalInfo.removedSeq !== undefined) &&\n (removalInfo.removedSeq !== UnassignedSequenceNumber)) {\n PartialSequenceLengths.insertSegment(\n combinedPartialLengths,\n segment,\n removalInfo);\n }\n }\n }\n }\n // Post-process correctly-ordered partials computing sums and creating\n // lists for each present client id\n const seqPartials = combinedPartialLengths.partialLengths;\n const seqPartialsLen = seqPartials.length;\n\n let prevLen = 0;\n for (let i = 0; i < seqPartialsLen; i++) {\n seqPartials[i].len = prevLen + seqPartials[i].seglen;\n prevLen = seqPartials[i].len;\n combinedPartialLengths.addClientSeqNumberFromPartial(seqPartials[i]);\n }\n if (PartialSequenceLengths.options.verify) {\n combinedPartialLengths.verify();\n }\n }\n\n private static getOverlapClients(overlapClientIds: number[], seglen: number) {\n const bst = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n for (const clientId of overlapClientIds) {\n bst.put(clientId, { clientId, seglen });\n }\n return bst;\n }\n\n private static accumulateRemoveClientOverlap(\n partialLength: PartialSequenceLength,\n overlapRemoveClientIds: number[],\n seglen: number) {\n if (partialLength.overlapRemoveClients) {\n for (const clientId of overlapRemoveClientIds) {\n const overlapClientNode = partialLength.overlapRemoveClients.get(clientId);\n if (!overlapClientNode) {\n partialLength.overlapRemoveClients.put(clientId, { clientId, seglen });\n } else {\n overlapClientNode.data.seglen += seglen;\n }\n }\n } else {\n partialLength.overlapRemoveClients =\n PartialSequenceLengths.getOverlapClients(overlapRemoveClientIds, seglen);\n }\n }\n\n private static insertSegment(\n combinedPartialLengths: PartialSequenceLengths,\n segment: ISegment,\n removalInfo?: IRemovalInfo) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n let seq = segment.seq!;\n let segmentLen = segment.cachedLength;\n let clientId = segment.clientId;\n let removeClientOverlap: number[] | undefined;\n\n if (removalInfo) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n seq = removalInfo.removedSeq!;\n segmentLen = -segmentLen;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n clientId = removalInfo.removedClientId!;\n if (removalInfo.removedClientOverlap) {\n removeClientOverlap = removalInfo.removedClientOverlap;\n }\n }\n\n const seqPartials = combinedPartialLengths.partialLengths;\n const seqPartialsLen = seqPartials.length;\n // Find the first entry with sequence number greater or equal to seq\n let indexFirstGTE = 0;\n for (; indexFirstGTE < seqPartialsLen; indexFirstGTE++) {\n if (seqPartials[indexFirstGTE].seq >= seq) {\n break;\n }\n }\n if ((indexFirstGTE < seqPartialsLen) && (seqPartials[indexFirstGTE].seq === seq)) {\n seqPartials[indexFirstGTE].seglen += segmentLen;\n if (removeClientOverlap) {\n PartialSequenceLengths.accumulateRemoveClientOverlap(\n seqPartials[indexFirstGTE],\n removeClientOverlap,\n segmentLen);\n }\n } else {\n let pLen: PartialSequenceLength;\n if (removeClientOverlap) {\n const overlapClients = PartialSequenceLengths.getOverlapClients(removeClientOverlap, segmentLen);\n pLen = { seq, clientId, len: 0, seglen: segmentLen, overlapRemoveClients: overlapClients };\n } else {\n pLen = { seq, clientId, len: 0, seglen: segmentLen };\n }\n\n if (indexFirstGTE < seqPartialsLen) {\n // Shift entries with greater sequence numbers\n // TODO: investigate performance improvement using BST\n for (let k = seqPartialsLen; k > indexFirstGTE; k--) {\n seqPartials[k] = seqPartials[k - 1];\n }\n seqPartials[indexFirstGTE] = pLen;\n } else {\n seqPartials.push(pLen);\n }\n }\n }\n\n private static addSeq(partialLengths: PartialSequenceLength[], seq: number, seqSeglen: number, clientId?: number) {\n let seqPartialLen: PartialSequenceLength | undefined;\n let penultPartialLen: PartialSequenceLength | undefined;\n let leqIndex = latestLEQ(partialLengths, seq);\n if (leqIndex >= 0) {\n const pLen = partialLengths[leqIndex];\n if (pLen.seq === seq) {\n seqPartialLen = pLen;\n leqIndex = latestLEQ(partialLengths, seq - 1);\n if (leqIndex >= 0) {\n penultPartialLen = partialLengths[leqIndex];\n }\n } else {\n penultPartialLen = pLen;\n }\n }\n if (seqPartialLen === undefined) {\n seqPartialLen = {\n clientId,\n seglen: seqSeglen,\n seq,\n } as PartialSequenceLength;\n partialLengths.push(seqPartialLen);\n } else {\n seqPartialLen.seglen = seqSeglen;\n // Assert client id matches\n }\n if (penultPartialLen !== undefined) {\n seqPartialLen.len = seqPartialLen.seglen + penultPartialLen.len;\n } else {\n seqPartialLen.len = seqPartialLen.seglen;\n }\n }\n public minLength = 0;\n public segmentCount = 0;\n public partialLengths: PartialSequenceLength[] = [];\n public clientSeqNumbers: PartialSequenceLength[][] = [];\n\n constructor(public minSeq: number) {\n }\n\n // Assume: seq is latest sequence number; no structural change to sub-tree, but a segment\n // with sequence number seq has been added within the sub-tree\n // TODO: assert client id matches\n public update(\n mergeTree: MergeTree,\n node: IMergeBlock,\n seq: number,\n clientId: number,\n collabWindow: CollaborationWindow) {\n let seqSeglen = 0;\n let segCount = 0;\n // Compute length for seq across children\n for (let i = 0; i < node.childCount; i++) {\n const child = node.children[i];\n if (!child.isLeaf()) {\n const childBlock = child;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const branchPartialLengths = childBlock.partialLengths!;\n const partialLengths = branchPartialLengths.partialLengths;\n const seqIndex = latestLEQ(partialLengths, seq);\n if (seqIndex >= 0) {\n const leqPartial = partialLengths[seqIndex];\n if (leqPartial.seq === seq) {\n seqSeglen += leqPartial.seglen;\n }\n }\n segCount += branchPartialLengths.segmentCount;\n } else {\n const segment = child;\n const removalInfo: IRemovalInfo = segment;\n\n if (segment.seq === seq) {\n if (removalInfo.removedSeq !== seq) {\n seqSeglen += segment.cachedLength;\n }\n } else {\n if (removalInfo.removedSeq === seq) {\n seqSeglen -= segment.cachedLength;\n }\n }\n segCount++;\n }\n }\n this.segmentCount = segCount;\n\n PartialSequenceLengths.addSeq(this.partialLengths, seq, seqSeglen, clientId);\n if (this.clientSeqNumbers[clientId] === undefined) {\n this.clientSeqNumbers[clientId] = [];\n }\n PartialSequenceLengths.addSeq(this.clientSeqNumbers[clientId], seq, seqSeglen);\n if (PartialSequenceLengths.options.zamboni) {\n this.zamboni(collabWindow);\n }\n if (PartialSequenceLengths.options.verify) {\n this.verify();\n }\n }\n\n public getPartialLength(refSeq: number, clientId: number) {\n let pLen = this.minLength;\n const seqIndex = latestLEQ(this.partialLengths, refSeq);\n const cliLatestIndex = this.cliLatest(clientId);\n const cliSeq = this.clientSeqNumbers[clientId];\n if (seqIndex >= 0) {\n // Add the partial length up to refSeq\n pLen += this.partialLengths[seqIndex].len;\n\n if (cliLatestIndex >= 0) {\n const cliLatest = cliSeq[cliLatestIndex];\n\n if (cliLatest.seq > refSeq) {\n // The client has local edits after refSeq, add in the length adjustments\n pLen += cliLatest.len;\n const precedingCliIndex = this.cliLatestLEQ(clientId, refSeq);\n if (precedingCliIndex >= 0) {\n pLen -= cliSeq[precedingCliIndex].len;\n }\n }\n }\n } else {\n // RefSeq is before any of the partial lengths\n // so just add in all local edits of that client (which should all be after the refSeq)\n if (cliLatestIndex >= 0) {\n const cliLatest = cliSeq[cliLatestIndex];\n pLen += cliLatest.len;\n }\n }\n return pLen;\n }\n\n public toString(glc?: (id: number) => string, indentCount = 0) {\n let buf = \"\";\n for (const partial of this.partialLengths) {\n buf += `(${partial.seq},${partial.len}) `;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-for-in-array, no-restricted-syntax\n for (const clientId in this.clientSeqNumbers) {\n if (this.clientSeqNumbers[clientId].length > 0) {\n buf += `Client `;\n if (glc) {\n buf += `${glc(+clientId)}`;\n } else {\n buf += `${clientId}`;\n }\n buf += \"[\";\n for (const partial of this.clientSeqNumbers[clientId]) {\n buf += `(${partial.seq},${partial.len})`;\n }\n buf += \"]\";\n }\n }\n buf = `min(seq ${this.minSeq}): ${this.minLength}; sc: ${this.segmentCount};${buf}`;\n return buf;\n }\n\n // Clear away partial sums for sequence numbers earlier than the current window\n private zamboni(segmentWindow: CollaborationWindow) {\n function copyDown(partialLengths: PartialSequenceLength[]) {\n const mindex = latestLEQ(partialLengths, segmentWindow.minSeq);\n let minLength = 0;\n if (mindex >= 0) {\n minLength = partialLengths[mindex].len;\n const seqCount = partialLengths.length;\n if (mindex <= (seqCount - 1)) {\n // Still some entries remaining\n const remainingCount = (seqCount - mindex) - 1;\n // Copy down\n for (let i = 0; i < remainingCount; i++) {\n partialLengths[i] = partialLengths[i + mindex + 1];\n partialLengths[i].len -= minLength;\n }\n partialLengths.length = remainingCount;\n }\n }\n return minLength;\n }\n this.minLength += copyDown(this.partialLengths);\n // eslint-disable-next-line @typescript-eslint/no-for-in-array, guard-for-in, no-restricted-syntax\n for (const clientId in this.clientSeqNumbers) {\n const cliPartials = this.clientSeqNumbers[clientId];\n if (cliPartials) {\n copyDown(cliPartials);\n }\n }\n }\n\n private addClientSeqNumber(clientId: number, seq: number, seglen: number) {\n if (this.clientSeqNumbers[clientId] === undefined) {\n this.clientSeqNumbers[clientId] = [];\n }\n const cli = this.clientSeqNumbers[clientId];\n let pLen = seglen;\n if (cli.length > 0) {\n pLen += cli[cli.length - 1].len;\n }\n cli.push({ seq, len: pLen, seglen });\n }\n\n // Assumes sequence number already coalesced\n private addClientSeqNumberFromPartial(partialLength: PartialSequenceLength) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.addClientSeqNumber(partialLength.clientId!, partialLength.seq, partialLength.seglen);\n if (partialLength.overlapRemoveClients) {\n partialLength.overlapRemoveClients.map((oc: Property<number, IOverlapClient>) => {\n this.addClientSeqNumber(oc.data.clientId, partialLength.seq, oc.data.seglen);\n return true;\n });\n }\n }\n\n private cliLatestLEQ(clientId: number, refSeq: number) {\n const cliSeqs = this.clientSeqNumbers[clientId];\n if (cliSeqs) {\n return latestLEQ(cliSeqs, refSeq);\n } else {\n return -1;\n }\n }\n\n private cliLatest(clientId: number) {\n const cliSeqs = this.clientSeqNumbers[clientId];\n if (cliSeqs && (cliSeqs.length > 0)) {\n return cliSeqs.length - 1;\n } else {\n return -1;\n }\n }\n\n // Debug only\n private verifyPartialLengths(partialLengths: PartialSequenceLength[], clientPartials: boolean) {\n if (partialLengths.length === 0) { return 0; }\n\n let lastSeqNum = 0;\n let accumSegLen = 0;\n let count = 0;\n\n for (const partialLength of partialLengths) {\n // Count total number of partial length\n count++;\n\n // Sequence number should be larger or equal to minseq\n assert(this.minSeq <= partialLength.seq, 0x054 /* \"Sequence number less than minSeq!\" */);\n\n // Sequence number should be sorted\n assert(lastSeqNum < partialLength.seq, 0x055 /* \"Sequence number is not sorted!\" */);\n lastSeqNum = partialLength.seq;\n\n // Len is a accumulation of all the seglen adjustments\n accumSegLen += partialLength.seglen;\n if (accumSegLen !== partialLength.len) {\n assert(false, 0x056 /* \"Unexpected total for accumulation of all seglen adjustments!\" */);\n }\n\n if (clientPartials) {\n // Client partials used to track local edits so we can account for them some refSeq.\n // But the information we keep track of are since minSeq, so we keep track of more history\n // then needed, and some of them doesn't make sense to be used for length calculations\n // e.g. if you have this sequence, where the minSeq is #5 because of other clients\n // seq 10: client 1: insert seg #1\n // seq 11: client 2: delete seg #2 refseq: 10\n // minLength is 0, we would have keep a record of seglen: -1 for clientPartialLengths for client 2\n // So if you ask for partial length for client 2 @ seq 5, we will have return -1.\n // However, that combination is invalid, since we should never see any ops with refseq < 10 for\n // client 2 after seq 11.\n } else {\n // Len adjustment should not make length negative\n if (this.minLength + partialLength.len < 0) {\n assert(false, 0x057 /* \"Negative length after length adjustment!\" */);\n }\n }\n\n if (partialLength.overlapRemoveClients) {\n // Only the flat partialLengths can have overlapRemoveClients, the per client view shouldn't\n assert(!clientPartials, 0x058 /* \"Both overlapRemoveClients and clientPartials are set!\" */);\n\n // Each overlap client count as one\n count += partialLength.overlapRemoveClients.size();\n }\n }\n return count;\n }\n\n private verify() {\n if (this.clientSeqNumbers) {\n let cliCount = 0;\n for (const cliSeq of this.clientSeqNumbers) {\n if (cliSeq) {\n cliCount += this.verifyPartialLengths(cliSeq, true);\n }\n }\n\n // If we have client view, we should have the flat view\n assert(!!this.partialLengths, 0x059 /* \"Client view exists but flat view does not!\" */);\n const flatCount = this.verifyPartialLengths(this.partialLengths, false);\n\n // The number of partial lengths on the client view and flat view should be the same\n assert(flatCount === cliCount,\n 0x05a /* \"Mismatch between number of partial lengths on client and flat views!\" */);\n } else {\n // If we don't have a client view, we shouldn't have the flat view either\n assert(!this.partialLengths, 0x05b /* \"Flat view exists but client view does not!\" */);\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,MAAM,WAAW,OAAO,CAAC,CAAC;IACtB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;CACtB;AAKD,oBAAY,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,GAAG,CAAC;CACd;AAED,wBAAgB,OAAO,CAAC,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,OAqClG;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,EAAE,CAAC,EAAE,WAAW,GAAG,SAAS,WA+BrF;AAED,wBAAgB,MAAM,CAAC,CAAC,EACpB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAChB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,EACjC,WAAW,CAAC,EAAE,YAAY,EAC1B,GAAG,CAAC,EAAE,MAAM,cAkBf;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,0BAazD;AAED,wBAAgB,aAAa,CACzB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,QAAQ,EAAE,WAAW,EACrB,EAAE,CAAC,EAAE,YAAY,EACjB,GAAG,CAAC,EAAE,MAAM,eAQf;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,cAUvF;AAGD,wBAAgB,SAAS,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAEzC"}
1
+ {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,MAAM,WAAW,OAAO,CAAC,CAAC;IACtB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;CACtB;AAKD,oBAAY,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,GAAG,CAAC;CACd;AAED,wBAAgB,OAAO,CAAC,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,OAwClG;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,EAAE,CAAC,EAAE,WAAW,GAAG,SAAS,WAiCrF;AAED,wBAAgB,MAAM,CAAC,CAAC,EACpB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAChB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,EACjC,WAAW,CAAC,EAAE,YAAY,EAC1B,GAAG,CAAC,EAAE,MAAM,cAmBf;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,0BAazD;AAED,wBAAgB,aAAa,CACzB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,QAAQ,EAAE,WAAW,EACrB,EAAE,CAAC,EAAE,YAAY,EACjB,GAAG,CAAC,EAAE,MAAM,eAQf;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,cAUvF;AAGD,wBAAgB,SAAS,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAEzC"}
@@ -37,7 +37,10 @@ function combine(combiningInfo, currentValue, newValue, seq) {
37
37
  }
38
38
  }
39
39
  break;
40
+ default:
41
+ break;
40
42
  }
43
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
41
44
  return _currentValue;
42
45
  }
43
46
  exports.combine = combine;
@@ -48,6 +51,7 @@ function matchProperties(a, b) {
48
51
  }
49
52
  else {
50
53
  // For now, straightforward; later use hashing
54
+ // eslint-disable-next-line no-restricted-syntax
51
55
  for (const key in a) {
52
56
  if (b[key] === undefined) {
53
57
  return false;
@@ -61,6 +65,7 @@ function matchProperties(a, b) {
61
65
  return false;
62
66
  }
63
67
  }
68
+ // eslint-disable-next-line no-restricted-syntax
64
69
  for (const key in b) {
65
70
  if (a[key] === undefined) {
66
71
  return false;
@@ -78,10 +83,11 @@ function matchProperties(a, b) {
78
83
  exports.matchProperties = matchProperties;
79
84
  function extend(base, extension, combiningOp, seq) {
80
85
  if (extension !== undefined) {
81
- // eslint-disable-next-line guard-for-in
86
+ // eslint-disable-next-line guard-for-in, no-restricted-syntax
82
87
  for (const key in extension) {
83
88
  const v = extension[key];
84
89
  if (v === null) {
90
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
85
91
  delete base[key];
86
92
  }
87
93
  else {
@@ -102,7 +108,7 @@ function clone(extension) {
102
108
  return undefined;
103
109
  }
104
110
  const cloneMap = createMap();
105
- // eslint-disable-next-line guard-for-in
111
+ // eslint-disable-next-line guard-for-in, no-restricted-syntax
106
112
  for (const key in extension) {
107
113
  const v = extension[key];
108
114
  if (v !== null) {
@@ -123,6 +129,7 @@ function addProperties(oldProps, newProps, op, seq) {
123
129
  exports.addProperties = addProperties;
124
130
  function extendIfUndefined(base, extension) {
125
131
  if (extension !== undefined) {
132
+ // eslint-disable-next-line no-restricted-syntax
126
133
  for (const key in extension) {
127
134
  if (base[key] === undefined) {
128
135
  base[key] = extension[key];
@@ -1 +1 @@
1
- {"version":3,"file":"properties.js","sourceRoot":"","sources":["../src/properties.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 { ICombiningOp } from \"./ops\";\n\nexport interface MapLike<T> {\n [index: string]: T;\n}\n\n// We use any because when you include custom methods\n// such as toJSON(), JSON.stringify accepts most types other\n// than functions\nexport type PropertySet = MapLike<any>;\n\n// Assume these are created with Object.create(null)\n\nexport interface IConsensusValue {\n seq: number;\n value: any;\n}\n\nexport function combine(combiningInfo: ICombiningOp, currentValue: any, newValue: any, seq?: number) {\n let _currentValue = currentValue;\n\n if (_currentValue === undefined) {\n _currentValue = combiningInfo.defaultValue;\n }\n // Fixed set of operations for now\n\n switch (combiningInfo.name) {\n case \"incr\":\n _currentValue += newValue as number;\n if (combiningInfo.minValue) {\n if (_currentValue < combiningInfo.minValue) {\n _currentValue = combiningInfo.minValue;\n }\n }\n break;\n case \"consensus\":\n if (_currentValue === undefined) {\n const cv: IConsensusValue = {\n value: newValue,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n seq: seq!,\n };\n\n _currentValue = cv;\n } else {\n const cv = _currentValue as IConsensusValue;\n if (cv.seq === -1) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n cv.seq = seq!;\n }\n }\n break;\n }\n\n return _currentValue;\n}\n\nexport function matchProperties(a: PropertySet | undefined, b: PropertySet | undefined) {\n if (a) {\n if (!b) {\n return false;\n } else {\n // For now, straightforward; later use hashing\n\n for (const key in a) {\n if (b[key] === undefined) {\n return false;\n } else if (typeof b[key] === \"object\") {\n if (!matchProperties(a[key], b[key])) {\n return false;\n }\n } else if (b[key] !== a[key]) {\n return false;\n }\n }\n\n for (const key in b) {\n if (a[key] === undefined) {\n return false;\n }\n }\n }\n } else {\n if (b) {\n return false;\n }\n }\n return true;\n}\n\nexport function extend<T>(\n base: MapLike<T>,\n extension: MapLike<T> | undefined,\n combiningOp?: ICombiningOp,\n seq?: number,\n) {\n if (extension !== undefined) {\n // eslint-disable-next-line guard-for-in\n for (const key in extension) {\n const v = extension[key];\n if (v === null) {\n delete base[key];\n } else {\n if (combiningOp && (combiningOp.name !== \"rewrite\")) {\n base[key] = combine(combiningOp, base[key], v, seq);\n } else {\n base[key] = v;\n }\n }\n }\n }\n return base;\n}\n\nexport function clone<T>(extension: MapLike<T> | undefined) {\n if (extension === undefined) {\n return undefined;\n }\n const cloneMap = createMap<T>();\n // eslint-disable-next-line guard-for-in\n for (const key in extension) {\n const v = extension[key];\n if (v !== null) {\n cloneMap[key] = v;\n }\n }\n return cloneMap;\n}\n\nexport function addProperties(\n oldProps: PropertySet | undefined,\n newProps: PropertySet,\n op?: ICombiningOp,\n seq?: number,\n) {\n let _oldProps = oldProps;\n if ((!_oldProps) || (op && (op.name === \"rewrite\"))) {\n _oldProps = createMap<any>();\n }\n extend(_oldProps, newProps, op, seq);\n return _oldProps;\n}\n\nexport function extendIfUndefined<T>(base: MapLike<T>, extension: MapLike<T> | undefined) {\n if (extension !== undefined) {\n\n for (const key in extension) {\n if (base[key] === undefined) {\n base[key] = extension[key];\n }\n }\n }\n return base;\n}\n\n// Create a MapLike with good performance.\nexport function createMap<T>(): MapLike<T> {\n return Object.create(null) as MapLike<T>;\n}\n"]}
1
+ {"version":3,"file":"properties.js","sourceRoot":"","sources":["../src/properties.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 { ICombiningOp } from \"./ops\";\n\nexport interface MapLike<T> {\n [index: string]: T;\n}\n\n// We use any because when you include custom methods\n// such as toJSON(), JSON.stringify accepts most types other\n// than functions\nexport type PropertySet = MapLike<any>;\n\n// Assume these are created with Object.create(null)\n\nexport interface IConsensusValue {\n seq: number;\n value: any;\n}\n\nexport function combine(combiningInfo: ICombiningOp, currentValue: any, newValue: any, seq?: number) {\n let _currentValue = currentValue;\n\n if (_currentValue === undefined) {\n _currentValue = combiningInfo.defaultValue;\n }\n // Fixed set of operations for now\n\n switch (combiningInfo.name) {\n case \"incr\":\n _currentValue += newValue as number;\n if (combiningInfo.minValue) {\n if (_currentValue < combiningInfo.minValue) {\n _currentValue = combiningInfo.minValue;\n }\n }\n break;\n case \"consensus\":\n if (_currentValue === undefined) {\n const cv: IConsensusValue = {\n value: newValue,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n seq: seq!,\n };\n\n _currentValue = cv;\n } else {\n const cv = _currentValue as IConsensusValue;\n if (cv.seq === -1) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n cv.seq = seq!;\n }\n }\n break;\n default:\n break;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return _currentValue;\n}\n\nexport function matchProperties(a: PropertySet | undefined, b: PropertySet | undefined) {\n if (a) {\n if (!b) {\n return false;\n } else {\n // For now, straightforward; later use hashing\n\n // eslint-disable-next-line no-restricted-syntax\n for (const key in a) {\n if (b[key] === undefined) {\n return false;\n } else if (typeof b[key] === \"object\") {\n if (!matchProperties(a[key], b[key])) {\n return false;\n }\n } else if (b[key] !== a[key]) {\n return false;\n }\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (const key in b) {\n if (a[key] === undefined) {\n return false;\n }\n }\n }\n } else {\n if (b) {\n return false;\n }\n }\n return true;\n}\n\nexport function extend<T>(\n base: MapLike<T>,\n extension: MapLike<T> | undefined,\n combiningOp?: ICombiningOp,\n seq?: number,\n) {\n if (extension !== undefined) {\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const key in extension) {\n const v = extension[key];\n if (v === null) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete base[key];\n } else {\n if (combiningOp && (combiningOp.name !== \"rewrite\")) {\n base[key] = combine(combiningOp, base[key], v, seq);\n } else {\n base[key] = v;\n }\n }\n }\n }\n return base;\n}\n\nexport function clone<T>(extension: MapLike<T> | undefined) {\n if (extension === undefined) {\n return undefined;\n }\n const cloneMap = createMap<T>();\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const key in extension) {\n const v = extension[key];\n if (v !== null) {\n cloneMap[key] = v;\n }\n }\n return cloneMap;\n}\n\nexport function addProperties(\n oldProps: PropertySet | undefined,\n newProps: PropertySet,\n op?: ICombiningOp,\n seq?: number,\n) {\n let _oldProps = oldProps;\n if ((!_oldProps) || (op && (op.name === \"rewrite\"))) {\n _oldProps = createMap<any>();\n }\n extend(_oldProps, newProps, op, seq);\n return _oldProps;\n}\n\nexport function extendIfUndefined<T>(base: MapLike<T>, extension: MapLike<T> | undefined) {\n if (extension !== undefined) {\n // eslint-disable-next-line no-restricted-syntax\n for (const key in extension) {\n if (base[key] === undefined) {\n base[key] = extension[key];\n }\n }\n }\n return base;\n}\n\n// Create a MapLike with good performance.\nexport function createMap<T>(): MapLike<T> {\n return Object.create(null) as MapLike<T>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"segmentPropertiesManager.d.ts","sourceRoot":"","sources":["../src/segmentPropertiesManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAIH,WAAW,EACd,MAAM,cAAc,CAAC;AAEtB,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,qBAAqB,CAA8B;IAC3D,OAAO,CAAC,mBAAmB,CAAS;;IAM7B,oBAAoB,CAAC,UAAU,EAAE,qBAAqB;IAiBtD,aAAa,CAChB,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,EACrB,EAAE,CAAC,EAAE,YAAY,EACjB,GAAG,CAAC,EAAE,MAAM,EACZ,aAAa,GAAE,OAAe,GAAG,WAAW,GAAG,SAAS;IAsErD,MAAM,CACT,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,UAAU,EAAE,iBAAiB,GAC9B,WAAW,GAAG,SAAS;IAqBnB,oBAAoB;CAG9B"}
1
+ {"version":3,"file":"segmentPropertiesManager.d.ts","sourceRoot":"","sources":["../src/segmentPropertiesManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAIH,WAAW,EACd,MAAM,cAAc,CAAC;AAEtB,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,qBAAqB,CAA8B;IAC3D,OAAO,CAAC,mBAAmB,CAAS;;IAM7B,oBAAoB,CAAC,UAAU,EAAE,qBAAqB;IAiBtD,aAAa,CAChB,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,EACrB,EAAE,CAAC,EAAE,YAAY,EACjB,GAAG,CAAC,EAAE,MAAM,EACZ,aAAa,GAAE,OAAe,GAAG,WAAW,GAAG,SAAS;IAuErD,MAAM,CACT,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,UAAU,EAAE,iBAAiB,GAC9B,WAAW,GAAG,SAAS;IAqBnB,oBAAoB;CAG9B"}
@@ -23,6 +23,7 @@ class PropertiesManager {
23
23
  common_utils_1.assert(this.pendingKeyUpdateCount[key] > 0, 0x05c /* "Trying to update more annotate props than do exist!" */);
24
24
  this.pendingKeyUpdateCount[key]--;
25
25
  if (((_b = this.pendingKeyUpdateCount) === null || _b === void 0 ? void 0 : _b[key]) === 0) {
26
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
26
27
  delete this.pendingKeyUpdateCount[key];
27
28
  }
28
29
  }
@@ -58,6 +59,7 @@ class PropertiesManager {
58
59
  for (const key of Object.keys(oldProps)) {
59
60
  if (!newProps[key] && shouldModifyKey(key)) {
60
61
  deltas[key] = oldProps[key];
62
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
61
63
  delete oldProps[key];
62
64
  }
63
65
  }
@@ -85,6 +87,7 @@ class PropertiesManager {
85
87
  newValue = newProps[key];
86
88
  }
87
89
  if (newValue === null) {
90
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
88
91
  delete oldProps[key];
89
92
  }
90
93
  else {
@@ -96,6 +99,7 @@ class PropertiesManager {
96
99
  copyTo(oldProps, newProps, newManager) {
97
100
  if (oldProps) {
98
101
  if (!newProps) {
102
+ // eslint-disable-next-line no-param-reassign
99
103
  newProps = properties_1.createMap();
100
104
  }
101
105
  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\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"]}
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-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 // 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 +1 @@
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"}
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,CAkFzB;CACL"}
@@ -1 +1 @@
1
- {"version":3,"file":"textSegment.js","sourceRoot":"","sources":["../src/textSegment.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IIntegerRange } from \"./base\";\nimport { BaseSegment, ISegment, Marker, MergeTree } from \"./mergeTree\";\nimport { IJSONSegment } from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { LocalReferenceCollection } from \"./localReference\";\n\n// Maximum length of text segment to be considered to be merged with other segment.\n// Maximum segment length is at least 2x of it (not taking into account initial segment creation).\n// The bigger it is, the more expensive it is to break segment into sub-segments (on edits)\n// The smaller it is, the more segments we have in snapshots (and in memory) - it's more expensive to load snapshots.\n// Small number also makes ReplayTool produce false positives (\"same\" snapshots have slightly different binary\n// representations). More measurements needs to be done, but it's very likely the right spot is somewhere between\n// 1K-2K mark. That said, we also break segments on newline and there are very few segments that are longer than 256\n// because of it. Must be an even number\nconst TextSegmentGranularity = 256;\n\nexport interface IJSONTextSegment extends IJSONSegment {\n text: string;\n}\n\nexport class TextSegment extends BaseSegment {\n public static readonly type = \"TextSegment\";\n\n public static is(segment: ISegment): segment is TextSegment {\n return segment.type === TextSegment.type;\n }\n\n public static make(text: string, props?: PropertySet) {\n const seg = new TextSegment(text);\n if (props) {\n seg.addProperties(props);\n }\n return seg;\n }\n\n public static fromJSONObject(spec: any) {\n if (typeof spec === \"string\") {\n return new TextSegment(spec);\n } else if (spec && typeof spec === \"object\" && \"text\" in spec) {\n const textSpec = spec as IJSONTextSegment;\n return TextSegment.make(textSpec.text, textSpec.props as PropertySet);\n }\n return undefined;\n }\n\n public readonly type = TextSegment.type;\n\n constructor(public text: string) {\n super();\n this.cachedLength = text.length;\n }\n\n public toJSONObject() {\n // To reduce snapshot/ops size, we serialize a TextSegment as a plain 'string' if it is\n // not annotated.\n return this.properties\n ? { text: this.text, props: this.properties }\n : this.text;\n }\n\n public clone(start = 0, end?: number) {\n const text = this.text.substring(start, end);\n const b = TextSegment.make(text, this.properties);\n this.cloneInto(b);\n return b;\n }\n\n public canAppend(segment: ISegment): boolean {\n return !this.text.endsWith(\"\\n\")\n && TextSegment.is(segment)\n && (this.cachedLength <= TextSegmentGranularity ||\n segment.cachedLength <= TextSegmentGranularity);\n }\n\n public toString() {\n return this.text;\n }\n\n public append(segment: ISegment) {\n if (TextSegment.is(segment)) {\n // Note: Must call 'appendLocalRefs' before modifying this segment's length as\n // 'this.cachedLength' is used to adjust the offsets of the local refs.\n LocalReferenceCollection.append(this, segment);\n\n this.text += segment.text;\n this.cachedLength = this.text.length;\n } else {\n throw new Error(\"can only append text segment\");\n }\n }\n\n // TODO: retain removed text for undo\n // returns true if entire string removed\n public removeRange(start: number, end: number) {\n let remnantString = \"\";\n const len = this.text.length;\n if (start > 0) {\n remnantString += this.text.substring(0, start);\n }\n if (end < len) {\n remnantString += this.text.substring(end);\n }\n this.text = remnantString;\n this.cachedLength = remnantString.length;\n return (remnantString.length === 0);\n }\n\n protected createSplitSegmentAt(pos: number) {\n if (pos > 0) {\n const remainingText = this.text.substring(pos);\n this.text = this.text.substring(0, pos);\n this.cachedLength = this.text.length;\n const leafSegment = new TextSegment(remainingText);\n return leafSegment;\n }\n }\n}\n\ninterface ITextAccumulator {\n textSegment: TextSegment;\n placeholder?: string;\n parallelArrays?: boolean;\n}\n\ninterface ITextAndMarkerAccumulator extends ITextAccumulator {\n parallelArrays: true;\n parallelText: string[];\n parallelMarkers: Marker[];\n parallelMarkerLabel: string;\n tagsInProgress: string[];\n}\n\nfunction isTextAndMarkerAccumulator(accum: ITextAccumulator): accum is ITextAndMarkerAccumulator {\n return accum.parallelArrays === true;\n}\n\ntype ITextAccumulatorType = ITextAccumulator | ITextAndMarkerAccumulator;\nexport class MergeTreeTextHelper {\n constructor(private readonly mergeTree: MergeTree) { }\n\n public getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number) {\n const range = this.getValidRange(start, end, refSeq, clientId);\n const accum: ITextAndMarkerAccumulator = {\n parallelArrays: true,\n parallelMarkerLabel: label,\n parallelMarkers: [],\n parallelText: [],\n tagsInProgress: [],\n textSegment: new TextSegment(\"\"),\n };\n\n this.mergeTree.mapRange<ITextAndMarkerAccumulator>(\n { leaf: this.gatherText },\n refSeq,\n clientId,\n accum,\n range.start,\n range.end);\n\n return { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };\n }\n\n public getText(refSeq: number, clientId: number, placeholder = \"\", start?: number, end?: number) {\n const range = this.getValidRange(start, end, refSeq, clientId);\n\n const accum: ITextAccumulator = { textSegment: new TextSegment(\"\"), placeholder };\n\n this.mergeTree.mapRange<ITextAccumulator>(\n { leaf: this.gatherText },\n refSeq,\n clientId,\n accum,\n range.start,\n range.end);\n return accum.textSegment.text;\n }\n\n private getValidRange(\n start: number | undefined,\n end: number | undefined,\n refSeq: number,\n clientId: number,\n ): IIntegerRange {\n const range: IIntegerRange = {\n end: end ?? this.mergeTree.getLength(refSeq, clientId),\n start: start ?? 0,\n };\n return range;\n }\n\n private readonly gatherText = (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number,\n end: number, accumText: ITextAccumulatorType) => {\n let _start = start;\n if (TextSegment.is(segment)) {\n\n let beginTags = \"\";\n let endTags = \"\";\n if (isTextAndMarkerAccumulator(accumText)) {\n // TODO: let clients pass in function to get tag\n const tags = [] as string[];\n const initTags = [] as string[];\n\n if (segment.properties && (segment.properties[\"font-weight\"])) {\n tags.push(\"b\");\n }\n if (segment.properties && (segment.properties[\"text-decoration\"])) {\n tags.push(\"u\");\n }\n const remTags = [] as string[];\n if (tags.length > 0) {\n for (const tag of tags) {\n if (!accumText.tagsInProgress.includes(tag)) {\n beginTags += `<${tag}>`;\n initTags.push(tag);\n }\n }\n for (const accumTag of accumText.tagsInProgress) {\n if (!tags.includes(accumTag)) {\n endTags += `</${accumTag}>`;\n remTags.push(accumTag);\n }\n }\n for (const initTag of initTags.reverse()) {\n accumText.tagsInProgress.push(initTag);\n }\n } else {\n for (const accumTag of accumText.tagsInProgress) {\n endTags += `</${accumTag}>`;\n remTags.push(accumTag);\n }\n }\n for (const remTag of remTags) {\n const remdex = accumText.tagsInProgress.indexOf(remTag);\n if (remdex >= 0) {\n accumText.tagsInProgress.splice(remdex, 1);\n }\n }\n }\n accumText.textSegment.text += endTags;\n accumText.textSegment.text += beginTags;\n if ((_start <= 0) && (end >= segment.text.length)) {\n accumText.textSegment.text += segment.text;\n } else {\n if (_start < 0) {\n _start = 0;\n }\n if (end >= segment.text.length) {\n accumText.textSegment.text += segment.text.substring(_start);\n } else {\n accumText.textSegment.text += segment.text.substring(_start, end);\n }\n }\n } else {\n if (accumText.placeholder && (accumText.placeholder.length > 0)) {\n if (accumText.placeholder === \"*\") {\n const marker = segment as Marker;\n accumText.textSegment.text += `\\n${marker.toString()}`;\n } else {\n for (let i = 0; i < segment.cachedLength; i++) {\n accumText.textSegment.text += accumText.placeholder;\n }\n }\n } else if (isTextAndMarkerAccumulator(accumText)) {\n const marker = segment as Marker;\n if (marker.hasTileLabel(accumText.parallelMarkerLabel)) {\n accumText.parallelMarkers.push(marker);\n accumText.parallelText.push(accumText.textSegment.text);\n accumText.textSegment.text = \"\";\n }\n }\n }\n\n return true;\n };\n}\n"]}
1
+ {"version":3,"file":"textSegment.js","sourceRoot":"","sources":["../src/textSegment.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IIntegerRange } from \"./base\";\nimport { BaseSegment, ISegment, Marker, MergeTree } from \"./mergeTree\";\nimport { IJSONSegment } from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { LocalReferenceCollection } from \"./localReference\";\n\n// Maximum length of text segment to be considered to be merged with other segment.\n// Maximum segment length is at least 2x of it (not taking into account initial segment creation).\n// The bigger it is, the more expensive it is to break segment into sub-segments (on edits)\n// The smaller it is, the more segments we have in snapshots (and in memory) - it's more expensive to load snapshots.\n// Small number also makes ReplayTool produce false positives (\"same\" snapshots have slightly different binary\n// representations). More measurements needs to be done, but it's very likely the right spot is somewhere between\n// 1K-2K mark. That said, we also break segments on newline and there are very few segments that are longer than 256\n// because of it. Must be an even number\nconst TextSegmentGranularity = 256;\n\nexport interface IJSONTextSegment extends IJSONSegment {\n text: string;\n}\n\nexport class TextSegment extends BaseSegment {\n public static readonly type = \"TextSegment\";\n\n public static is(segment: ISegment): segment is TextSegment {\n return segment.type === TextSegment.type;\n }\n\n public static make(text: string, props?: PropertySet) {\n const seg = new TextSegment(text);\n if (props) {\n seg.addProperties(props);\n }\n return seg;\n }\n\n public static fromJSONObject(spec: any) {\n if (typeof spec === \"string\") {\n return new TextSegment(spec);\n } else if (spec && typeof spec === \"object\" && \"text\" in spec) {\n const textSpec = spec as IJSONTextSegment;\n return TextSegment.make(textSpec.text, textSpec.props as PropertySet);\n }\n return undefined;\n }\n\n public readonly type = TextSegment.type;\n\n constructor(public text: string) {\n super();\n this.cachedLength = text.length;\n }\n\n public toJSONObject() {\n // To reduce snapshot/ops size, we serialize a TextSegment as a plain 'string' if it is\n // not annotated.\n return this.properties\n ? { text: this.text, props: this.properties }\n : this.text;\n }\n\n public clone(start = 0, end?: number) {\n const text = this.text.substring(start, end);\n const b = TextSegment.make(text, this.properties);\n this.cloneInto(b);\n return b;\n }\n\n public canAppend(segment: ISegment): boolean {\n return !this.text.endsWith(\"\\n\")\n && TextSegment.is(segment)\n && (this.cachedLength <= TextSegmentGranularity ||\n segment.cachedLength <= TextSegmentGranularity);\n }\n\n public toString() {\n return this.text;\n }\n\n public append(segment: ISegment) {\n if (TextSegment.is(segment)) {\n // Note: Must call 'appendLocalRefs' before modifying this segment's length as\n // 'this.cachedLength' is used to adjust the offsets of the local refs.\n LocalReferenceCollection.append(this, segment);\n\n this.text += segment.text;\n this.cachedLength = this.text.length;\n } else {\n throw new Error(\"can only append text segment\");\n }\n }\n\n // TODO: retain removed text for undo\n // returns true if entire string removed\n public removeRange(start: number, end: number) {\n let remnantString = \"\";\n const len = this.text.length;\n if (start > 0) {\n remnantString += this.text.substring(0, start);\n }\n if (end < len) {\n remnantString += this.text.substring(end);\n }\n this.text = remnantString;\n this.cachedLength = remnantString.length;\n return (remnantString.length === 0);\n }\n\n protected createSplitSegmentAt(pos: number) {\n if (pos > 0) {\n const remainingText = this.text.substring(pos);\n this.text = this.text.substring(0, pos);\n this.cachedLength = this.text.length;\n const leafSegment = new TextSegment(remainingText);\n return leafSegment;\n }\n }\n}\n\ninterface ITextAccumulator {\n textSegment: TextSegment;\n placeholder?: string;\n parallelArrays?: boolean;\n}\n\ninterface ITextAndMarkerAccumulator extends ITextAccumulator {\n parallelArrays: true;\n parallelText: string[];\n parallelMarkers: Marker[];\n parallelMarkerLabel: string;\n tagsInProgress: string[];\n}\n\nfunction isTextAndMarkerAccumulator(accum: ITextAccumulator): accum is ITextAndMarkerAccumulator {\n return accum.parallelArrays === true;\n}\n\ntype ITextAccumulatorType = ITextAccumulator | ITextAndMarkerAccumulator;\nexport class MergeTreeTextHelper {\n constructor(private readonly mergeTree: MergeTree) { }\n\n public getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number) {\n const range = this.getValidRange(start, end, refSeq, clientId);\n const accum: ITextAndMarkerAccumulator = {\n parallelArrays: true,\n parallelMarkerLabel: label,\n parallelMarkers: [],\n parallelText: [],\n tagsInProgress: [],\n textSegment: new TextSegment(\"\"),\n };\n\n this.mergeTree.mapRange<ITextAndMarkerAccumulator>(\n { leaf: this.gatherText },\n refSeq,\n clientId,\n accum,\n range.start,\n range.end);\n\n return { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };\n }\n\n public getText(refSeq: number, clientId: number, placeholder = \"\", start?: number, end?: number) {\n const range = this.getValidRange(start, end, refSeq, clientId);\n\n const accum: ITextAccumulator = { textSegment: new TextSegment(\"\"), placeholder };\n\n this.mergeTree.mapRange<ITextAccumulator>(\n { leaf: this.gatherText },\n refSeq,\n clientId,\n accum,\n range.start,\n range.end);\n return accum.textSegment.text;\n }\n\n private getValidRange(\n start: number | undefined,\n end: number | undefined,\n refSeq: number,\n clientId: number,\n ): IIntegerRange {\n const range: IIntegerRange = {\n end: end ?? this.mergeTree.getLength(refSeq, clientId),\n start: start ?? 0,\n };\n return range;\n }\n\n private readonly gatherText = (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number,\n end: number, accumText: ITextAccumulatorType) => {\n let _start = start;\n if (TextSegment.is(segment)) {\n let beginTags = \"\";\n let endTags = \"\";\n if (isTextAndMarkerAccumulator(accumText)) {\n // TODO: let clients pass in function to get tag\n const tags = [] as string[];\n const initTags = [] as string[];\n\n if (segment.properties && (segment.properties[\"font-weight\"])) {\n tags.push(\"b\");\n }\n if (segment.properties && (segment.properties[\"text-decoration\"])) {\n tags.push(\"u\");\n }\n const remTags = [] as string[];\n if (tags.length > 0) {\n for (const tag of tags) {\n if (!accumText.tagsInProgress.includes(tag)) {\n beginTags += `<${tag}>`;\n initTags.push(tag);\n }\n }\n for (const accumTag of accumText.tagsInProgress) {\n if (!tags.includes(accumTag)) {\n endTags += `</${accumTag}>`;\n remTags.push(accumTag);\n }\n }\n for (const initTag of initTags.reverse()) {\n accumText.tagsInProgress.push(initTag);\n }\n } else {\n for (const accumTag of accumText.tagsInProgress) {\n endTags += `</${accumTag}>`;\n remTags.push(accumTag);\n }\n }\n for (const remTag of remTags) {\n const remdex = accumText.tagsInProgress.indexOf(remTag);\n if (remdex >= 0) {\n accumText.tagsInProgress.splice(remdex, 1);\n }\n }\n }\n accumText.textSegment.text += endTags;\n accumText.textSegment.text += beginTags;\n if ((_start <= 0) && (end >= segment.text.length)) {\n accumText.textSegment.text += segment.text;\n } else {\n if (_start < 0) {\n _start = 0;\n }\n if (end >= segment.text.length) {\n accumText.textSegment.text += segment.text.substring(_start);\n } else {\n accumText.textSegment.text += segment.text.substring(_start, end);\n }\n }\n } else {\n if (accumText.placeholder && (accumText.placeholder.length > 0)) {\n if (accumText.placeholder === \"*\") {\n const marker = segment as Marker;\n accumText.textSegment.text += `\\n${marker.toString()}`;\n } else {\n for (let i = 0; i < segment.cachedLength; i++) {\n accumText.textSegment.text += accumText.placeholder;\n }\n }\n } else if (isTextAndMarkerAccumulator(accumText)) {\n const marker = segment as Marker;\n if (marker.hasTileLabel(accumText.parallelMarkerLabel)) {\n accumText.parallelMarkers.push(marker);\n accumText.parallelText.push(accumText.textSegment.text);\n accumText.textSegment.text = \"\";\n }\n }\n }\n\n return true;\n };\n}\n"]}
package/lib/base.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport interface Property<TKey, TData> {\n key: TKey;\n data: TData;\n}\n\nexport interface QProperty<TKey, TData> {\n key?: TKey;\n data?: TData;\n}\n\nexport interface PropertyAction<TKey, TData> {\n\n <TAccum>(p: Property<TKey, TData>, accum?: TAccum): boolean;\n}\n\nexport type ConflictAction<TKey, TData> =\n (key: TKey, currentKey: TKey, data: TData, currentData: TData) => QProperty<TKey, TData>;\n\nexport interface Dictionary<TKey, TData> {\n get(key: TKey): Property<TKey, TData> | undefined;\n put(key: TKey, data: TData, conflict?: ConflictAction<TKey, TData>): void;\n remove(key: TKey): void;\n map<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum): void;\n}\n\nexport interface SortedDictionary<TKey, TData> extends Dictionary<TKey, TData> {\n max(): Property<TKey, TData> | undefined;\n min(): Property<TKey, TData> | undefined;\n mapRange<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum, start?: TKey, end?: TKey): void;\n}\n\nexport interface KeyComparer<TKey> {\n\n (a: TKey, b: TKey): number;\n}\n/**\n * A range [start, end)\n */\nexport interface IIntegerRange {\n start: number;\n end: number;\n}\n"]}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport interface Property<TKey, TData> {\n key: TKey;\n data: TData;\n}\n\nexport interface QProperty<TKey, TData> {\n key?: TKey;\n data?: TData;\n}\n\nexport interface PropertyAction<TKey, TData> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n <TAccum>(p: Property<TKey, TData>, accum?: TAccum): boolean;\n}\n\nexport type ConflictAction<TKey, TData> =\n (key: TKey, currentKey: TKey, data: TData, currentData: TData) => QProperty<TKey, TData>;\n\nexport interface Dictionary<TKey, TData> {\n get(key: TKey): Property<TKey, TData> | undefined;\n put(key: TKey, data: TData, conflict?: ConflictAction<TKey, TData>): void;\n remove(key: TKey): void;\n map<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum): void;\n}\n\nexport interface SortedDictionary<TKey, TData> extends Dictionary<TKey, TData> {\n max(): Property<TKey, TData> | undefined;\n min(): Property<TKey, TData> | undefined;\n mapRange<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum, start?: TKey, end?: TKey): void;\n}\n\nexport interface KeyComparer<TKey> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (a: TKey, b: TKey): number;\n}\n/**\n * A range [start, end)\n */\nexport interface IIntegerRange {\n start: number;\n end: number;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"localReference.d.ts","sourceRoot":"","sources":["../src/localReference.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EACH,QAAQ,EACR,iBAAiB,EAKpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAiB,WAAW,EAAE,MAAM,cAAc,CAAC;AAE1D,qBAAa,cAAe,YAAW,iBAAiB;IAQhD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEhB,MAAM;IACN,OAAO;IAVlB,gBAAuB,gBAAgB,EAAE,MAAM,CAAM;IAE9C,UAAU,EAAE,WAAW,GAAG,SAAS,CAAC;IACpC,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;gBAGhB,MAAM,EAAE,MAAM,EAC/B,WAAW,EAAE,QAAQ,EACd,MAAM,SAAI,EACV,OAAO,gBAAuB;IAKlC,GAAG,CAAC,CAAC,EAAE,cAAc;IAQrB,GAAG,CAAC,CAAC,EAAE,cAAc;IAQrB,OAAO,CAAC,CAAC,EAAE,cAAc;IAczB,UAAU;IAQV,aAAa;IAIb,cAAc;IAId,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIpC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIrC,aAAa,IAAI,MAAM,EAAE,GAAG,SAAS;IAIrC,cAAc,IAAI,MAAM,EAAE,GAAG,SAAS;IAItC,MAAM;IAIN,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,YAAY;IAItD,SAAS;IAIT,UAAU;IAIV,SAAS;IAOT,aAAa;CAGvB;AAED,UAAU,aAAa;IACnB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,qBAAa,wBAAwB;IAe7B,OAAO,CAAC,QAAQ,CAAC,OAAO;WAdd,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ;IAS5C,YAAY,EAAE,MAAM,CAAK;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgC;IAC7D,OAAO,CAAC,QAAQ,CAAa;gBAGR,OAAO,EAAE,QAAQ,EAClC,oBAAoB,gCAA6D;IAO9E,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAiBR,eAAe,cAAc,CAAC;;;IAmBvC,KAAK;IAuBZ,IAAW,KAAK,YAEf;IAEM,WAAW,CAAC,IAAI,EAAE,cAAc;IAmBhC,cAAc,CAAC,IAAI,EAAE,cAAc;IAiC1C;;;;;;;OAOG;IACI,MAAM,CAAC,KAAK,EAAE,wBAAwB;IAetC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ;IAqBxC,mBAAmB,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE;IA8BvD,kBAAkB,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE;CA8BhE"}
1
+ {"version":3,"file":"localReference.d.ts","sourceRoot":"","sources":["../src/localReference.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EACH,QAAQ,EACR,iBAAiB,EAKpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAiB,WAAW,EAAE,MAAM,cAAc,CAAC;AAE1D,qBAAa,cAAe,YAAW,iBAAiB;IAQhD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEhB,MAAM;IACN,OAAO;IAVlB,gBAAuB,gBAAgB,EAAE,MAAM,CAAM;IAE9C,UAAU,EAAE,WAAW,GAAG,SAAS,CAAC;IACpC,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;gBAGhB,MAAM,EAAE,MAAM,EAC/B,WAAW,EAAE,QAAQ,EACd,MAAM,SAAI,EACV,OAAO,gBAAuB;IAKlC,GAAG,CAAC,CAAC,EAAE,cAAc;IAQrB,GAAG,CAAC,CAAC,EAAE,cAAc;IAQrB,OAAO,CAAC,CAAC,EAAE,cAAc;IAczB,UAAU;IAQV,aAAa;IAIb,cAAc;IAId,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIpC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIrC,aAAa,IAAI,MAAM,EAAE,GAAG,SAAS;IAIrC,cAAc,IAAI,MAAM,EAAE,GAAG,SAAS;IAItC,MAAM;IAIN,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,YAAY;IAItD,SAAS;IAIT,UAAU;IAIV,SAAS;IAOT,aAAa;CAGvB;AAED,UAAU,aAAa;IACnB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,qBAAa,wBAAwB;IAsB7B,OAAO,CAAC,QAAQ,CAAC,OAAO;WArBd,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ;IAgB5C,YAAY,EAAE,MAAM,CAAK;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgC;IAC7D,OAAO,CAAC,QAAQ,CAAa;gBAGR,OAAO,EAAE,QAAQ,EAClC,oBAAoB,gCAA6D;IAO9E,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAiBR,eAAe,cAAc,CAAC;;;IAmBvC,KAAK;IAuBZ,IAAW,KAAK,YAEf;IAEM,WAAW,CAAC,IAAI,EAAE,cAAc;IAmBhC,cAAc,CAAC,IAAI,EAAE,cAAc;IAiC1C;;;;;;;OAOG;IACI,MAAM,CAAC,KAAK,EAAE,wBAAwB;IAetC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ;IAqBxC,mBAAmB,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE;IA8BvD,kBAAkB,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE;CA8BhE"}