@fluidframework/merge-tree 3.6.0 → 3.10.0
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.
- package/CHANGELOG.md +8 -0
- package/dist/localReference.d.ts +4 -0
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +6 -0
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTreeTracking.d.ts.map +1 -1
- package/dist/mergeTreeTracking.js +3 -5
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/partialLengths.d.ts +13 -0
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +28 -11
- package/dist/partialLengths.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts +0 -1
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js +9 -10
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +2 -0
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +2 -0
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/test/localReference.spec.js +18 -0
- package/dist/test/localReference.spec.js.map +1 -1
- package/dist/test/partialLength.spec.js +62 -0
- package/dist/test/partialLength.spec.js.map +1 -1
- package/dist/test/segmentGroupCollection.spec.js +29 -0
- package/dist/test/segmentGroupCollection.spec.js.map +1 -1
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js +1 -2
- package/dist/test/testUtils.js.map +1 -1
- package/dist/test/tracking.spec.js +16 -0
- package/dist/test/tracking.spec.js.map +1 -1
- package/lib/localReference.d.ts +4 -0
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +6 -0
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTreeTracking.d.ts.map +1 -1
- package/lib/mergeTreeTracking.js +3 -5
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/partialLengths.d.ts +13 -0
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +28 -11
- package/lib/partialLengths.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts +0 -1
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js +9 -10
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +2 -0
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +2 -0
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/test/localReference.spec.js +18 -0
- package/lib/test/localReference.spec.js.map +1 -1
- package/lib/test/partialLength.spec.js +62 -0
- package/lib/test/partialLength.spec.js.map +1 -1
- package/lib/test/segmentGroupCollection.spec.js +30 -1
- package/lib/test/segmentGroupCollection.spec.js.map +1 -1
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/test/testUtils.js +1 -2
- package/lib/test/testUtils.js.map +1 -1
- package/lib/test/tracking.spec.js +17 -1
- package/lib/test/tracking.spec.js.map +1 -1
- package/package.json +16 -16
- package/src/localReference.ts +7 -0
- package/src/mergeTreeTracking.ts +3 -6
- package/src/partialLengths.ts +31 -13
- package/src/segmentGroupCollection.ts +9 -11
- package/src/snapshotV1.ts +2 -0
- package/src/snapshotlegacy.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../src/test/testUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAMjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAMvD,OAAO,EAGN,KAAK,WAAW,EAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,wBAAgB,gBAAgB,CAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,EACpB,QAAQ,SAAI,GACV,SAAS,CAGX;AAED,wBAAgB,2BAA2B,CAC1C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,EACpB,QAAQ,SAAI,GACV,SAAS,CAGX;AAED,MAAM,WAAW,gBAAgB;IAChC,aAAa,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW,CAAC;IACrD,OAAO,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,CAAC;IAC/C;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;CACX;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAUrF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAqBpE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAmB5D;AAiCD,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,EACpB,cAAc,GAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAAO,EACtE,oBAAoB,sBAA4B,EAChD,UAAU,GAAE,UAA2B,GACrC,IAAI,CAsDN;AAED,wBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,wBAAwB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../src/test/testUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAMjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAMvD,OAAO,EAGN,KAAK,WAAW,EAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,wBAAgB,gBAAgB,CAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,EACpB,QAAQ,SAAI,GACV,SAAS,CAGX;AAED,wBAAgB,2BAA2B,CAC1C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,EACpB,QAAQ,SAAI,GACV,SAAS,CAGX;AAED,MAAM,WAAW,gBAAgB;IAChC,aAAa,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW,CAAC;IACrD,OAAO,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,CAAC;IAC/C;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;CACX;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAUrF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAqBpE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAmB5D;AAiCD,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,EACpB,cAAc,GAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAAO,EACtE,oBAAoB,sBAA4B,EAChD,UAAU,GAAE,UAA2B,GACrC,IAAI,CAsDN;AAED,wBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAQ5E;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAUnD;AAmBD,UAAU,kBAAkB;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3C,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAE3E;yBAFe,sBAAsB;qBAGD,kBAAkB;qBAElB,kBAAkB"}
|
package/dist/test/testUtils.js
CHANGED
|
@@ -163,8 +163,7 @@ function validateRefCount(collection) {
|
|
|
163
163
|
return;
|
|
164
164
|
}
|
|
165
165
|
const expectedLength = [...collection].length;
|
|
166
|
-
|
|
167
|
-
node_assert_1.strict.equal(collection["refCount"], expectedLength);
|
|
166
|
+
node_assert_1.strict.equal(collection.size, expectedLength);
|
|
168
167
|
}
|
|
169
168
|
/**
|
|
170
169
|
* Enable stricter partial length assertions inside tests
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../../src/test/testUtils.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 { strict as assert } from \"node:assert\";\nimport fs from \"node:fs\";\n\nimport type { LocalReferenceCollection } from \"../localReference.js\";\nimport type { MergeTree } from \"../mergeTree.js\";\nimport type {\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeMaintenanceCallbackArgs,\n} from \"../mergeTreeDeltaCallback.js\";\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport type { MergeBlock } from \"../mergeTreeNodes.js\";\nimport {\n\tPartialSequenceLengths,\n\tverifyExpectedPartialLengths,\n\tverifyPartialLengths,\n} from \"../partialLengths.js\";\nimport {\n\tLocalReconnectingPerspective,\n\tPriorPerspective,\n\ttype Perspective,\n} from \"../perspective.js\";\nimport type { OperationStamp } from \"../stamps.js\";\n\nimport { ClientTestHelper } from \"./clientTestHelper.js\";\nimport { loadText } from \"./text.js\";\n\nexport function loadTextFromFile(\n\tfilename: string,\n\tmergeTree: MergeTree,\n\tsegLimit = 0,\n): MergeTree {\n\tconst content = fs.readFileSync(filename, \"utf8\");\n\treturn loadText(content, mergeTree, segLimit);\n}\n\nexport function loadTextFromFileWithMarkers(\n\tfilename: string,\n\tmergeTree: MergeTree,\n\tsegLimit = 0,\n): MergeTree {\n\tconst content = fs.readFileSync(filename, \"utf8\");\n\treturn loadText(content, mergeTree, segLimit, true);\n}\n\nexport interface MockRemoteClient {\n\tperspectiveAt(args: { refSeq: number }): Perspective;\n\tstampAt(args: { seq: number }): OperationStamp;\n\t/**\n\t * Short client id for this client.\n\t */\n\tid: number;\n}\n\n/**\n * Creates a \"mock remote client\" which allows ergonomically generating {@link Perspective}s and {@link OperationStamp}s\n * for use in tests that interact directly with a {@link MergeTree}.\n *\n * Example:\n *\n * ```typescript\n * let seq = 0;\n * const remoteClient = makeRemoteClient({ clientId: 18 });\n *\n * mergeTree.insertSegments(\n * 0,\n * [TextSegment.make(\"some text\")],\n * remoteClient.perspectiveAt({ refSeq: seq }),\n * remoteClient.stampAt({ seq: ++seq }),\n * undefined\n * );\n * ```\n */\nexport function makeRemoteClient({ clientId }: { clientId: number }): MockRemoteClient {\n\treturn {\n\t\tperspectiveAt({ refSeq }: { refSeq: number }): Perspective {\n\t\t\treturn new PriorPerspective(refSeq, clientId);\n\t\t},\n\t\tstampAt({ seq }: { seq: number }): OperationStamp {\n\t\t\treturn { seq, clientId };\n\t\t},\n\t\tid: clientId,\n\t};\n}\n\nexport function nodeOrdinalsHaveIntegrity(block: MergeBlock): boolean {\n\tconst olen = block.ordinal.length;\n\tfor (let i = 0; i < block.childCount; i++) {\n\t\tif (block.children[i].ordinal) {\n\t\t\tif (olen !== block.children[i].ordinal.length - 1) {\n\t\t\t\tconsole.log(\"node integrity issue\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (i > 0 && block.children[i].ordinal <= block.children[i - 1].ordinal) {\n\t\t\t\tconsole.log(\"node sib integrity issue\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!block.children[i].isLeaf()) {\n\t\t\t\treturn nodeOrdinalsHaveIntegrity(block.children[i] as MergeBlock);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.log(`node child ordinal not set ${i}`);\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Returns an object that tallies each delta and maintenance operation observed\n * for the given 'mergeTree'.\n */\nexport function countOperations(mergeTree: MergeTree): object {\n\tconst counts = {};\n\n\tassert.strictEqual(mergeTree.mergeTreeDeltaCallback, undefined);\n\tassert.strictEqual(mergeTree.mergeTreeMaintenanceCallback, undefined);\n\n\tconst fn = (\n\t\tdeltaArgs: IMergeTreeDeltaCallbackArgs | IMergeTreeMaintenanceCallbackArgs,\n\t): void => {\n\t\tconst previous = counts[deltaArgs.operation] as undefined | number;\n\t\tcounts[deltaArgs.operation] = previous === undefined ? 1 : previous + 1;\n\t};\n\n\tmergeTree.mergeTreeDeltaCallback = (opArgs, deltaArgs): void => {\n\t\tfn(deltaArgs);\n\t};\n\tmergeTree.mergeTreeMaintenanceCallback = fn;\n\n\treturn counts;\n}\n\nfunction getPartialLengths(\n\tclientId: number,\n\tseq: number,\n\tmergeTree: MergeTree,\n\tlocalSeq?: number,\n\tmergeBlock: MergeBlock = mergeTree.root,\n): {\n\tpartialLen: number | undefined;\n\tactualLen: number;\n} {\n\tconst partialLen = mergeBlock.partialLengths?.getPartialLength(seq, clientId, localSeq);\n\n\tconst perspective =\n\t\tlocalSeq === undefined\n\t\t\t? new PriorPerspective(seq, clientId)\n\t\t\t: new LocalReconnectingPerspective(seq, clientId, localSeq);\n\tlet actualLen = 0;\n\n\twalkAllChildSegments(mergeBlock, (segment) => {\n\t\tif (perspective.isSegmentPresent(segment)) {\n\t\t\tactualLen += segment.cachedLength;\n\t\t}\n\t\treturn true;\n\t});\n\n\treturn {\n\t\tpartialLen,\n\t\tactualLen,\n\t};\n}\n\nexport function validatePartialLengths(\n\tclientId: number,\n\tmergeTree: MergeTree,\n\texpectedValues: { seq: number; len: number; localSeq?: number }[] = [],\n\tminRefSeqForLocalSeq = new Map<number, number>(),\n\tmergeBlock: MergeBlock = mergeTree.root,\n): void {\n\tfunction validatePartialLengthAt(seq: number, localSeq?: number, len?: number): void {\n\t\tconst { partialLen, actualLen } = getPartialLengths(\n\t\t\tclientId,\n\t\t\tseq,\n\t\t\tmergeTree,\n\t\t\tlocalSeq,\n\t\t\tmergeBlock,\n\t\t);\n\n\t\tif (partialLen && partialLen < 0) {\n\t\t\tassert.fail(\"Negative partial length returned\");\n\t\t}\n\t\tassert.equal(\n\t\t\tpartialLen,\n\t\t\tactualLen,\n\t\t\t\"Partial length did not match value obtained from walking all segments in the block.\",\n\t\t);\n\t\tif (len !== undefined) {\n\t\t\tassert.equal(partialLen, len, \"Partial length did not match expected value.\");\n\t\t}\n\t}\n\n\tif (clientId === mergeTree.collabWindow.clientId) {\n\t\tmergeTree.computeLocalPartials(0);\n\t\t// We don't add entries to the local partial lengths entries that ensure that a query for a given localSeq includes any dependent removes.\n\t\t// For example, in a scenario where segments are inserted between seqs 1 and 10 causing a length increase of 10, but then this entire range\n\t\t// is removed locally at localSeq 5, computing the length of the block using partial lengths at (seq: 1, localSeq: 5) can yield a negative\n\t\t// result since the computation \"sees\" the removal of length 10 but only one of the inserts that this removal affected.\n\t\t//\n\t\t// In the production codepath, this doesn't matter because we only ever query for (refSeq, localSeq) for which the refSeq is at or above the original\n\t\t// context in which the edit was applied, which means this 'dependency' is always included in the query.\n\t\t// We could fix it if we wanted to by using a similar solution to what we do for non-local edits (add adjustments to the unsequenced lengths\n\t\t// to ensure whenever the removal of a segment applies, so does existence of that segment), at which point we could validate for a wider range\n\t\t// of local perspectives.\n\t\tfor (const [localSeq, minRefSeq] of minRefSeqForLocalSeq.entries()) {\n\t\t\tfor (let refSeq = minRefSeq; refSeq <= mergeTree.collabWindow.currentSeq; refSeq++) {\n\t\t\t\tvalidatePartialLengthAt(refSeq, localSeq);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// We don't use partial lengths for the local client unless it's a reconnecting perspective (we just use the mergeBlock's cachedLength field).\n\t\tfor (\n\t\t\tlet seq = mergeTree.collabWindow.minSeq + 1;\n\t\t\tseq <= mergeTree.collabWindow.currentSeq;\n\t\t\tseq++\n\t\t) {\n\t\t\tvalidatePartialLengthAt(seq);\n\t\t}\n\t}\n\n\tfor (const { seq, len, localSeq } of expectedValues) {\n\t\tvalidatePartialLengthAt(seq, localSeq, len);\n\t}\n}\n\nexport function validateRefCount(collection?: LocalReferenceCollection): void {\n\tif (!collection) {\n\t\treturn;\n\t}\n\n\tconst expectedLength = [...collection].length;\n\n\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\tassert.equal(collection[\"refCount\"], expectedLength);\n}\n\n/**\n * Enable stricter partial length assertions inside tests\n *\n * Note that these assertions can be expensive, and so should not be enabled in\n * production code or tests that run through thousands of ops (e.g. the SharedString\n * fuzz tests).\n */\nexport function useStrictPartialLengthChecks(): void {\n\tbeforeEach(\"Enable strict partial lengths\", () => {\n\t\tPartialSequenceLengths.options.verifier = verifyPartialLengths;\n\t\tPartialSequenceLengths.options.verifyExpected = verifyExpectedPartialLengths;\n\t});\n\n\tafterEach(\"Disable strict partial lengths\", () => {\n\t\tPartialSequenceLengths.options.verifier = undefined;\n\t\tPartialSequenceLengths.options.verifyExpected = undefined;\n\t});\n}\n\nfunction createObliterateTestBody({ action, expectedText }: ObliterateTestArgs): () => void {\n\treturn () => {\n\t\tconst events: number[] = [];\n\n\t\tconst helper = new ClientTestHelper({\n\t\t\tmergeTreeEnableSidedObliterate: true,\n\t\t});\n\t\thelper.clients.A.on(\"delta\", (opArgs, deltaArgs) => {\n\t\t\tevents.push(deltaArgs.operation);\n\t\t});\n\t\taction(helper);\n\t\thelper.processAllOps();\n\n\t\thelper.logger.validate({ baseText: expectedText });\n\t};\n}\n\ninterface ObliterateTestArgs {\n\ttitle: string;\n\taction: (helper: ClientTestHelper) => void;\n\texpectedText: string;\n}\n\nexport function itCorrectlyObliterates(args: ObliterateTestArgs): Mocha.Test {\n\treturn it(args.title, createObliterateTestBody(args));\n}\nitCorrectlyObliterates.skip = (args: ObliterateTestArgs) =>\n\tit.skip(args.title, createObliterateTestBody(args));\nitCorrectlyObliterates.only = (args: ObliterateTestArgs) =>\n\t// eslint-disable-next-line no-only-tests/no-only-tests -- intentionally provides an `.only` variant for focused debugging\n\tit.only(args.title, createObliterateTestBody(args));\n"]}
|
|
1
|
+
{"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../../src/test/testUtils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AA4BH,4CAOC;AAED,kEAOC;AA8BD,4CAUC;AAED,8DAqBC;AAMD,0CAmBC;AAiCD,wDA4DC;AAED,4CAQC;AASD,oEAUC;AAyBD,wDAEC;AAvRD,6CAA+C;AAC/C,sDAAyB;AAQzB,kEAA+D;AAE/D,4DAI8B;AAC9B,sDAI2B;AAG3B,+DAAyD;AACzD,uCAAqC;AAErC,SAAgB,gBAAgB,CAC/B,QAAgB,EAChB,SAAoB,EACpB,QAAQ,GAAG,CAAC;IAEZ,MAAM,OAAO,GAAG,iBAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClD,OAAO,IAAA,kBAAQ,EAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,2BAA2B,CAC1C,QAAgB,EAChB,SAAoB,EACpB,QAAQ,GAAG,CAAC;IAEZ,MAAM,OAAO,GAAG,iBAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClD,OAAO,IAAA,kBAAQ,EAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAWD;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAwB;IAClE,OAAO;QACN,aAAa,CAAC,EAAE,MAAM,EAAsB;YAC3C,OAAO,IAAI,iCAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,CAAC,EAAE,GAAG,EAAmB;YAC/B,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;QAC1B,CAAC;QACD,EAAE,EAAE,QAAQ;KACZ,CAAC;AACH,CAAC;AAED,SAAgB,yBAAyB,CAAC,KAAiB;IAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAC/B,IAAI,IAAI,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnD,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;gBACpC,OAAO,KAAK,CAAC;YACd,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;gBACxC,OAAO,KAAK,CAAC;YACd,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;gBACjC,OAAO,yBAAyB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAe,CAAC,CAAC;YACnE,CAAC;QACF,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC;YAC/C,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,SAAoB;IACnD,MAAM,MAAM,GAAG,EAAE,CAAC;IAElB,oBAAM,CAAC,WAAW,CAAC,SAAS,CAAC,sBAAsB,EAAE,SAAS,CAAC,CAAC;IAChE,oBAAM,CAAC,WAAW,CAAC,SAAS,CAAC,4BAA4B,EAAE,SAAS,CAAC,CAAC;IAEtE,MAAM,EAAE,GAAG,CACV,SAA0E,EACnE,EAAE;QACT,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAuB,CAAC;QACnE,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzE,CAAC,CAAC;IAEF,SAAS,CAAC,sBAAsB,GAAG,CAAC,MAAM,EAAE,SAAS,EAAQ,EAAE;QAC9D,EAAE,CAAC,SAAS,CAAC,CAAC;IACf,CAAC,CAAC;IACF,SAAS,CAAC,4BAA4B,GAAG,EAAE,CAAC;IAE5C,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CACzB,QAAgB,EAChB,GAAW,EACX,SAAoB,EACpB,QAAiB,EACjB,aAAyB,SAAS,CAAC,IAAI;IAKvC,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,EAAE,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAExF,MAAM,WAAW,GAChB,QAAQ,KAAK,SAAS;QACrB,CAAC,CAAC,IAAI,iCAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC;QACrC,CAAC,CAAC,IAAI,6CAA4B,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC9D,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,IAAA,2CAAoB,EAAC,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE;QAC5C,IAAI,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,OAAO;QACN,UAAU;QACV,SAAS;KACT,CAAC;AACH,CAAC;AAED,SAAgB,sBAAsB,CACrC,QAAgB,EAChB,SAAoB,EACpB,iBAAoE,EAAE,EACtE,uBAAuB,IAAI,GAAG,EAAkB,EAChD,aAAyB,SAAS,CAAC,IAAI;IAEvC,SAAS,uBAAuB,CAAC,GAAW,EAAE,QAAiB,EAAE,GAAY;QAC5E,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,iBAAiB,CAClD,QAAQ,EACR,GAAG,EACH,SAAS,EACT,QAAQ,EACR,UAAU,CACV,CAAC;QAEF,IAAI,UAAU,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YAClC,oBAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACjD,CAAC;QACD,oBAAM,CAAC,KAAK,CACX,UAAU,EACV,SAAS,EACT,qFAAqF,CACrF,CAAC;QACF,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACvB,oBAAM,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,8CAA8C,CAAC,CAAC;QAC/E,CAAC;IACF,CAAC;IAED,IAAI,QAAQ,KAAK,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAClD,SAAS,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAClC,0IAA0I;QAC1I,2IAA2I;QAC3I,0IAA0I;QAC1I,uHAAuH;QACvH,EAAE;QACF,qJAAqJ;QACrJ,wGAAwG;QACxG,4IAA4I;QAC5I,8IAA8I;QAC9I,yBAAyB;QACzB,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,oBAAoB,CAAC,OAAO,EAAE,EAAE,CAAC;YACpE,KAAK,IAAI,MAAM,GAAG,SAAS,EAAE,MAAM,IAAI,SAAS,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC;gBACpF,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC3C,CAAC;QACF,CAAC;IACF,CAAC;SAAM,CAAC;QACP,8IAA8I;QAC9I,KACC,IAAI,GAAG,GAAG,SAAS,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAC3C,GAAG,IAAI,SAAS,CAAC,YAAY,CAAC,UAAU,EACxC,GAAG,EAAE,EACJ,CAAC;YACF,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;IACF,CAAC;IAED,KAAK,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,cAAc,EAAE,CAAC;QACrD,uBAAuB,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;AACF,CAAC;AAED,SAAgB,gBAAgB,CAAC,UAAqC;IACrE,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO;IACR,CAAC;IAED,MAAM,cAAc,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC;IAE9C,oBAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,4BAA4B;IAC3C,UAAU,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAChD,0CAAsB,CAAC,OAAO,CAAC,QAAQ,GAAG,wCAAoB,CAAC;QAC/D,0CAAsB,CAAC,OAAO,CAAC,cAAc,GAAG,gDAA4B,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAChD,0CAAsB,CAAC,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;QACpD,0CAAsB,CAAC,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAC3D,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAsB;IAC7E,OAAO,GAAG,EAAE;QACX,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC;YACnC,8BAA8B,EAAE,IAAI;SACpC,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;YAClD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC;QACf,MAAM,CAAC,aAAa,EAAE,CAAC;QAEvB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC;AACH,CAAC;AAQD,SAAgB,sBAAsB,CAAC,IAAwB;IAC9D,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;AACvD,CAAC;AACD,sBAAsB,CAAC,IAAI,GAAG,CAAC,IAAwB,EAAE,EAAE,CAC1D,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD,sBAAsB,CAAC,IAAI,GAAG,CAAC,IAAwB,EAAE,EAAE;AAC1D,0HAA0H;AAC1H,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport fs from \"node:fs\";\n\nimport type { LocalReferenceCollection } from \"../localReference.js\";\nimport type { MergeTree } from \"../mergeTree.js\";\nimport type {\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeMaintenanceCallbackArgs,\n} from \"../mergeTreeDeltaCallback.js\";\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport type { MergeBlock } from \"../mergeTreeNodes.js\";\nimport {\n\tPartialSequenceLengths,\n\tverifyExpectedPartialLengths,\n\tverifyPartialLengths,\n} from \"../partialLengths.js\";\nimport {\n\tLocalReconnectingPerspective,\n\tPriorPerspective,\n\ttype Perspective,\n} from \"../perspective.js\";\nimport type { OperationStamp } from \"../stamps.js\";\n\nimport { ClientTestHelper } from \"./clientTestHelper.js\";\nimport { loadText } from \"./text.js\";\n\nexport function loadTextFromFile(\n\tfilename: string,\n\tmergeTree: MergeTree,\n\tsegLimit = 0,\n): MergeTree {\n\tconst content = fs.readFileSync(filename, \"utf8\");\n\treturn loadText(content, mergeTree, segLimit);\n}\n\nexport function loadTextFromFileWithMarkers(\n\tfilename: string,\n\tmergeTree: MergeTree,\n\tsegLimit = 0,\n): MergeTree {\n\tconst content = fs.readFileSync(filename, \"utf8\");\n\treturn loadText(content, mergeTree, segLimit, true);\n}\n\nexport interface MockRemoteClient {\n\tperspectiveAt(args: { refSeq: number }): Perspective;\n\tstampAt(args: { seq: number }): OperationStamp;\n\t/**\n\t * Short client id for this client.\n\t */\n\tid: number;\n}\n\n/**\n * Creates a \"mock remote client\" which allows ergonomically generating {@link Perspective}s and {@link OperationStamp}s\n * for use in tests that interact directly with a {@link MergeTree}.\n *\n * Example:\n *\n * ```typescript\n * let seq = 0;\n * const remoteClient = makeRemoteClient({ clientId: 18 });\n *\n * mergeTree.insertSegments(\n * 0,\n * [TextSegment.make(\"some text\")],\n * remoteClient.perspectiveAt({ refSeq: seq }),\n * remoteClient.stampAt({ seq: ++seq }),\n * undefined\n * );\n * ```\n */\nexport function makeRemoteClient({ clientId }: { clientId: number }): MockRemoteClient {\n\treturn {\n\t\tperspectiveAt({ refSeq }: { refSeq: number }): Perspective {\n\t\t\treturn new PriorPerspective(refSeq, clientId);\n\t\t},\n\t\tstampAt({ seq }: { seq: number }): OperationStamp {\n\t\t\treturn { seq, clientId };\n\t\t},\n\t\tid: clientId,\n\t};\n}\n\nexport function nodeOrdinalsHaveIntegrity(block: MergeBlock): boolean {\n\tconst olen = block.ordinal.length;\n\tfor (let i = 0; i < block.childCount; i++) {\n\t\tif (block.children[i].ordinal) {\n\t\t\tif (olen !== block.children[i].ordinal.length - 1) {\n\t\t\t\tconsole.log(\"node integrity issue\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (i > 0 && block.children[i].ordinal <= block.children[i - 1].ordinal) {\n\t\t\t\tconsole.log(\"node sib integrity issue\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!block.children[i].isLeaf()) {\n\t\t\t\treturn nodeOrdinalsHaveIntegrity(block.children[i] as MergeBlock);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.log(`node child ordinal not set ${i}`);\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Returns an object that tallies each delta and maintenance operation observed\n * for the given 'mergeTree'.\n */\nexport function countOperations(mergeTree: MergeTree): object {\n\tconst counts = {};\n\n\tassert.strictEqual(mergeTree.mergeTreeDeltaCallback, undefined);\n\tassert.strictEqual(mergeTree.mergeTreeMaintenanceCallback, undefined);\n\n\tconst fn = (\n\t\tdeltaArgs: IMergeTreeDeltaCallbackArgs | IMergeTreeMaintenanceCallbackArgs,\n\t): void => {\n\t\tconst previous = counts[deltaArgs.operation] as undefined | number;\n\t\tcounts[deltaArgs.operation] = previous === undefined ? 1 : previous + 1;\n\t};\n\n\tmergeTree.mergeTreeDeltaCallback = (opArgs, deltaArgs): void => {\n\t\tfn(deltaArgs);\n\t};\n\tmergeTree.mergeTreeMaintenanceCallback = fn;\n\n\treturn counts;\n}\n\nfunction getPartialLengths(\n\tclientId: number,\n\tseq: number,\n\tmergeTree: MergeTree,\n\tlocalSeq?: number,\n\tmergeBlock: MergeBlock = mergeTree.root,\n): {\n\tpartialLen: number | undefined;\n\tactualLen: number;\n} {\n\tconst partialLen = mergeBlock.partialLengths?.getPartialLength(seq, clientId, localSeq);\n\n\tconst perspective =\n\t\tlocalSeq === undefined\n\t\t\t? new PriorPerspective(seq, clientId)\n\t\t\t: new LocalReconnectingPerspective(seq, clientId, localSeq);\n\tlet actualLen = 0;\n\n\twalkAllChildSegments(mergeBlock, (segment) => {\n\t\tif (perspective.isSegmentPresent(segment)) {\n\t\t\tactualLen += segment.cachedLength;\n\t\t}\n\t\treturn true;\n\t});\n\n\treturn {\n\t\tpartialLen,\n\t\tactualLen,\n\t};\n}\n\nexport function validatePartialLengths(\n\tclientId: number,\n\tmergeTree: MergeTree,\n\texpectedValues: { seq: number; len: number; localSeq?: number }[] = [],\n\tminRefSeqForLocalSeq = new Map<number, number>(),\n\tmergeBlock: MergeBlock = mergeTree.root,\n): void {\n\tfunction validatePartialLengthAt(seq: number, localSeq?: number, len?: number): void {\n\t\tconst { partialLen, actualLen } = getPartialLengths(\n\t\t\tclientId,\n\t\t\tseq,\n\t\t\tmergeTree,\n\t\t\tlocalSeq,\n\t\t\tmergeBlock,\n\t\t);\n\n\t\tif (partialLen && partialLen < 0) {\n\t\t\tassert.fail(\"Negative partial length returned\");\n\t\t}\n\t\tassert.equal(\n\t\t\tpartialLen,\n\t\t\tactualLen,\n\t\t\t\"Partial length did not match value obtained from walking all segments in the block.\",\n\t\t);\n\t\tif (len !== undefined) {\n\t\t\tassert.equal(partialLen, len, \"Partial length did not match expected value.\");\n\t\t}\n\t}\n\n\tif (clientId === mergeTree.collabWindow.clientId) {\n\t\tmergeTree.computeLocalPartials(0);\n\t\t// We don't add entries to the local partial lengths entries that ensure that a query for a given localSeq includes any dependent removes.\n\t\t// For example, in a scenario where segments are inserted between seqs 1 and 10 causing a length increase of 10, but then this entire range\n\t\t// is removed locally at localSeq 5, computing the length of the block using partial lengths at (seq: 1, localSeq: 5) can yield a negative\n\t\t// result since the computation \"sees\" the removal of length 10 but only one of the inserts that this removal affected.\n\t\t//\n\t\t// In the production codepath, this doesn't matter because we only ever query for (refSeq, localSeq) for which the refSeq is at or above the original\n\t\t// context in which the edit was applied, which means this 'dependency' is always included in the query.\n\t\t// We could fix it if we wanted to by using a similar solution to what we do for non-local edits (add adjustments to the unsequenced lengths\n\t\t// to ensure whenever the removal of a segment applies, so does existence of that segment), at which point we could validate for a wider range\n\t\t// of local perspectives.\n\t\tfor (const [localSeq, minRefSeq] of minRefSeqForLocalSeq.entries()) {\n\t\t\tfor (let refSeq = minRefSeq; refSeq <= mergeTree.collabWindow.currentSeq; refSeq++) {\n\t\t\t\tvalidatePartialLengthAt(refSeq, localSeq);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// We don't use partial lengths for the local client unless it's a reconnecting perspective (we just use the mergeBlock's cachedLength field).\n\t\tfor (\n\t\t\tlet seq = mergeTree.collabWindow.minSeq + 1;\n\t\t\tseq <= mergeTree.collabWindow.currentSeq;\n\t\t\tseq++\n\t\t) {\n\t\t\tvalidatePartialLengthAt(seq);\n\t\t}\n\t}\n\n\tfor (const { seq, len, localSeq } of expectedValues) {\n\t\tvalidatePartialLengthAt(seq, localSeq, len);\n\t}\n}\n\nexport function validateRefCount(collection?: LocalReferenceCollection): void {\n\tif (!collection) {\n\t\treturn;\n\t}\n\n\tconst expectedLength = [...collection].length;\n\n\tassert.equal(collection.size, expectedLength);\n}\n\n/**\n * Enable stricter partial length assertions inside tests\n *\n * Note that these assertions can be expensive, and so should not be enabled in\n * production code or tests that run through thousands of ops (e.g. the SharedString\n * fuzz tests).\n */\nexport function useStrictPartialLengthChecks(): void {\n\tbeforeEach(\"Enable strict partial lengths\", () => {\n\t\tPartialSequenceLengths.options.verifier = verifyPartialLengths;\n\t\tPartialSequenceLengths.options.verifyExpected = verifyExpectedPartialLengths;\n\t});\n\n\tafterEach(\"Disable strict partial lengths\", () => {\n\t\tPartialSequenceLengths.options.verifier = undefined;\n\t\tPartialSequenceLengths.options.verifyExpected = undefined;\n\t});\n}\n\nfunction createObliterateTestBody({ action, expectedText }: ObliterateTestArgs): () => void {\n\treturn () => {\n\t\tconst events: number[] = [];\n\n\t\tconst helper = new ClientTestHelper({\n\t\t\tmergeTreeEnableSidedObliterate: true,\n\t\t});\n\t\thelper.clients.A.on(\"delta\", (opArgs, deltaArgs) => {\n\t\t\tevents.push(deltaArgs.operation);\n\t\t});\n\t\taction(helper);\n\t\thelper.processAllOps();\n\n\t\thelper.logger.validate({ baseText: expectedText });\n\t};\n}\n\ninterface ObliterateTestArgs {\n\ttitle: string;\n\taction: (helper: ClientTestHelper) => void;\n\texpectedText: string;\n}\n\nexport function itCorrectlyObliterates(args: ObliterateTestArgs): Mocha.Test {\n\treturn it(args.title, createObliterateTestBody(args));\n}\nitCorrectlyObliterates.skip = (args: ObliterateTestArgs) =>\n\tit.skip(args.title, createObliterateTestBody(args));\nitCorrectlyObliterates.only = (args: ObliterateTestArgs) =>\n\t// eslint-disable-next-line no-only-tests/no-only-tests -- intentionally provides an `.only` variant for focused debugging\n\tit.only(args.title, createObliterateTestBody(args));\n"]}
|
|
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
const node_assert_1 = require("node:assert");
|
|
8
8
|
const mergeTreeTracking_js_1 = require("../mergeTreeTracking.js");
|
|
9
9
|
const ops_js_1 = require("../ops.js");
|
|
10
|
+
const textSegment_js_1 = require("../textSegment.js");
|
|
10
11
|
const testClient_js_1 = require("./testClient.js");
|
|
11
12
|
describe("MergeTree.tracking", () => {
|
|
12
13
|
let testClient;
|
|
@@ -20,6 +21,21 @@ describe("MergeTree.tracking", () => {
|
|
|
20
21
|
const segmentInfo = testClient.getContainingSegment(0);
|
|
21
22
|
(0, node_assert_1.strict)(segmentInfo?.segment?.trackingCollection.empty);
|
|
22
23
|
});
|
|
24
|
+
it("matches tracking groups by identity regardless of insertion order or implementation", () => {
|
|
25
|
+
const first = textSegment_js_1.TextSegment.make("a").trackingCollection;
|
|
26
|
+
const second = textSegment_js_1.TextSegment.make("b").trackingCollection;
|
|
27
|
+
const ordered = new mergeTreeTracking_js_1.TrackingGroup();
|
|
28
|
+
const unordered = new mergeTreeTracking_js_1.UnorderedTrackingGroup();
|
|
29
|
+
(0, node_assert_1.strict)(first.matches(second));
|
|
30
|
+
first.link(ordered);
|
|
31
|
+
(0, node_assert_1.strict)(!first.matches(second));
|
|
32
|
+
second.link(unordered);
|
|
33
|
+
(0, node_assert_1.strict)(!first.matches(second));
|
|
34
|
+
first.link(unordered);
|
|
35
|
+
second.link(ordered);
|
|
36
|
+
(0, node_assert_1.strict)(first.matches(second));
|
|
37
|
+
(0, node_assert_1.strict)(second.matches(first));
|
|
38
|
+
});
|
|
23
39
|
it("Insert single segment with single tracking group", () => {
|
|
24
40
|
const trackingGroup = new mergeTreeTracking_js_1.TrackingGroup();
|
|
25
41
|
testClient.on("delta", (opArgs, deltaArgs) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracking.spec.js","sourceRoot":"","sources":["../../src/test/tracking.spec.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 { strict as assert } from \"node:assert\";\n\nimport type { ISegmentPrivate } from \"../mergeTreeNodes.js\";\nimport { TrackingGroup } from \"../mergeTreeTracking.js\";\nimport { ReferenceType } from \"../ops.js\";\n\nimport { TestClient } from \"./testClient.js\";\n\ndescribe(\"MergeTree.tracking\", () => {\n\tlet testClient: TestClient;\n\n\tbeforeEach(() => {\n\t\ttestClient = new TestClient();\n\t\ttestClient.startOrUpdateCollaboration(\"me\");\n\t});\n\n\tit(\"Inserted segment should have empty tracking groups\", () => {\n\t\ttestClient.insertTextLocal(0, \"abc\");\n\n\t\tassert.equal(testClient.getLength(), 3);\n\n\t\tconst segmentInfo = testClient.getContainingSegment<ISegmentPrivate>(0);\n\n\t\tassert(segmentInfo?.segment?.trackingCollection.empty);\n\t});\n\n\tit(\"Insert single segment with single tracking group\", () => {\n\t\tconst trackingGroup = new TrackingGroup();\n\n\t\ttestClient.on(\"delta\", (opArgs, deltaArgs) => {\n\t\t\tfor (const sg of deltaArgs.deltaSegments)\n\t\t\t\tsg.segment.trackingCollection.link(trackingGroup);\n\t\t});\n\n\t\ttestClient.insertTextLocal(0, \"abc\");\n\n\t\tassert.equal(trackingGroup.size, 1);\n\n\t\tconst segmentInfo = testClient.getContainingSegment<ISegmentPrivate>(0);\n\n\t\tassert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 1);\n\n\t\tassert(trackingGroup.unlink(segmentInfo?.segment), \"unlink segment should be true\");\n\n\t\tassert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 0);\n\t});\n\n\tit(\"Splitting segment should split tracking group\", () => {\n\t\tconst trackingGroup = new TrackingGroup();\n\n\t\ttestClient.on(\"delta\", (opArgs, deltaArgs) => {\n\t\t\tfor (const sg of deltaArgs.deltaSegments)\n\t\t\t\tsg.segment.trackingCollection.link(trackingGroup);\n\t\t});\n\n\t\tconst ops = [testClient.insertTextLocal(0, \"abc\")];\n\n\t\ttestClient.removeAllListeners(\"delta\");\n\t\tassert.equal(trackingGroup.size, 1);\n\n\t\tops.push(testClient.insertTextLocal(1, \"z\"));\n\t\tassert.equal(testClient.getLength(), 4);\n\n\t\tassert.equal(trackingGroup.size, 2);\n\t\tconst segmentInfo = testClient.getContainingSegment<ISegmentPrivate>(0);\n\t\tassert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 1);\n\t});\n\n\tit(\"Zamboni should merge matching tracking groups\", () => {\n\t\tconst trackingGroup = new TrackingGroup();\n\n\t\ttestClient.on(\"delta\", (opArgs, deltaArgs) => {\n\t\t\tfor (const sg of deltaArgs.deltaSegments)\n\t\t\t\tsg.segment.trackingCollection.link(trackingGroup);\n\t\t});\n\n\t\tconst ops = [testClient.insertTextLocal(0, \"abc\")];\n\n\t\tassert.equal(trackingGroup.size, 1);\n\n\t\tops.push(testClient.insertTextLocal(1, \"z\"));\n\t\tassert.equal(testClient.getLength(), 4);\n\n\t\tassert.equal(trackingGroup.size, 3);\n\t\tlet segmentInfo = testClient.getContainingSegment<ISegmentPrivate>(0);\n\t\tassert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 1);\n\n\t\tlet seq = 1;\n\t\tfor (const op of ops) testClient.applyMsg(testClient.makeOpMessage(op, ++seq));\n\n\t\tassert.equal(trackingGroup.size, 3);\n\t\tsegmentInfo = testClient.getContainingSegment<ISegmentPrivate>(0);\n\t\tassert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 1);\n\n\t\ttestClient.updateMinSeq(seq);\n\n\t\tassert.equal(trackingGroup.size, 1);\n\t\tsegmentInfo = testClient.getContainingSegment<ISegmentPrivate>(0);\n\t\tassert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 1);\n\t});\n\n\tit(\"Newly created local reference should have empty tracking group\", () => {\n\t\ttestClient.insertTextLocal(0, \"abc\");\n\n\t\tassert.equal(testClient.getLength(), 3);\n\n\t\tconst segmentInfo = testClient.getContainingSegment<ISegmentPrivate>(0);\n\t\tassert(segmentInfo?.segment);\n\t\tconst ref = testClient.createLocalReferencePosition(\n\t\t\tsegmentInfo?.segment,\n\t\t\t0,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tassert(ref.trackingCollection.empty);\n\t});\n\n\tit(\"Local reference can be added an removed from tracking group\", () => {\n\t\ttestClient.insertTextLocal(0, \"abc\");\n\n\t\tassert.equal(testClient.getLength(), 3);\n\n\t\tconst segmentInfo = testClient.getContainingSegment<ISegmentPrivate>(0);\n\t\tassert(segmentInfo?.segment);\n\t\tconst ref = testClient.createLocalReferencePosition(\n\t\t\tsegmentInfo?.segment,\n\t\t\t0,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tconst trackingGroup = new TrackingGroup();\n\n\t\tref.trackingCollection.link(trackingGroup);\n\n\t\tassert.equal(trackingGroup.size, 1);\n\t\tassert.equal(trackingGroup.has(ref), true);\n\t\tassert.equal(trackingGroup.tracked.includes(ref), true);\n\t\tassert.equal(ref.trackingCollection.trackingGroups.size, 1);\n\n\t\tref.trackingCollection.unlink(trackingGroup);\n\n\t\tassert.equal(trackingGroup.size, 0);\n\t\tassert.equal(trackingGroup.has(ref), false);\n\t\tassert.equal(trackingGroup.tracked.includes(ref), false);\n\t\tassert.equal(ref.trackingCollection.trackingGroups.size, 0);\n\t});\n\n\tit(\"unlink segment from tracking group\", () => {\n\t\tconst trackingGroup = new TrackingGroup();\n\n\t\ttestClient.insertTextLocal(0, \"abc\");\n\n\t\tconst { segment } = testClient.getContainingSegment<ISegmentPrivate>(0) ?? {};\n\t\tsegment?.trackingCollection.link(trackingGroup);\n\n\t\tassert.equal(segment?.trackingCollection.trackingGroups.size, 1);\n\n\t\tassert(trackingGroup.unlink(segment), \"unlink segment should be true\");\n\n\t\tassert.equal(segment?.trackingCollection.trackingGroups.size, 0);\n\n\t\tassert.equal(\n\t\t\ttrackingGroup.unlink(segment),\n\t\t\tfalse,\n\t\t\t\"repeat unlink segment should be false\",\n\t\t);\n\t\tassert.equal(\n\t\t\tsegment.trackingCollection.unlink(trackingGroup),\n\t\t\tfalse,\n\t\t\t\"repeat unlink trackingGroup should be false\",\n\t\t);\n\t});\n\n\tit(\"unlink tracking group from collection\", () => {\n\t\tconst trackingGroup = new TrackingGroup();\n\n\t\ttestClient.insertTextLocal(0, \"abc\");\n\n\t\tconst { segment } = testClient.getContainingSegment<ISegmentPrivate>(0) ?? {};\n\t\tsegment?.trackingCollection.link(trackingGroup);\n\n\t\tassert.equal(segment?.trackingCollection.trackingGroups.size, 1);\n\n\t\tassert(\n\t\t\tsegment.trackingCollection.unlink(trackingGroup),\n\t\t\t\"unlink trackingGroup should be true\",\n\t\t);\n\n\t\tassert.equal(segment?.trackingCollection.trackingGroups.size, 0);\n\t\tassert.equal(\n\t\t\ttrackingGroup.unlink(segment),\n\t\t\tfalse,\n\t\t\t\"repeat unlink segment should be false\",\n\t\t);\n\t\tassert.equal(\n\t\t\tsegment.trackingCollection.unlink(trackingGroup),\n\t\t\tfalse,\n\t\t\t\"repeat unlink trackingGroup should be false\",\n\t\t);\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"tracking.spec.js","sourceRoot":"","sources":["../../src/test/tracking.spec.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 { strict as assert } from \"node:assert\";\n\nimport type { ISegmentPrivate } from \"../mergeTreeNodes.js\";\nimport { TrackingGroup, UnorderedTrackingGroup } from \"../mergeTreeTracking.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\n\ndescribe(\"MergeTree.tracking\", () => {\n\tlet testClient: TestClient;\n\n\tbeforeEach(() => {\n\t\ttestClient = new TestClient();\n\t\ttestClient.startOrUpdateCollaboration(\"me\");\n\t});\n\n\tit(\"Inserted segment should have empty tracking groups\", () => {\n\t\ttestClient.insertTextLocal(0, \"abc\");\n\n\t\tassert.equal(testClient.getLength(), 3);\n\n\t\tconst segmentInfo = testClient.getContainingSegment<ISegmentPrivate>(0);\n\n\t\tassert(segmentInfo?.segment?.trackingCollection.empty);\n\t});\n\n\tit(\"matches tracking groups by identity regardless of insertion order or implementation\", () => {\n\t\tconst first = TextSegment.make(\"a\").trackingCollection;\n\t\tconst second = TextSegment.make(\"b\").trackingCollection;\n\t\tconst ordered = new TrackingGroup();\n\t\tconst unordered = new UnorderedTrackingGroup();\n\n\t\tassert(first.matches(second));\n\t\tfirst.link(ordered);\n\t\tassert(!first.matches(second));\n\t\tsecond.link(unordered);\n\t\tassert(!first.matches(second));\n\t\tfirst.link(unordered);\n\t\tsecond.link(ordered);\n\t\tassert(first.matches(second));\n\t\tassert(second.matches(first));\n\t});\n\n\tit(\"Insert single segment with single tracking group\", () => {\n\t\tconst trackingGroup = new TrackingGroup();\n\n\t\ttestClient.on(\"delta\", (opArgs, deltaArgs) => {\n\t\t\tfor (const sg of deltaArgs.deltaSegments)\n\t\t\t\tsg.segment.trackingCollection.link(trackingGroup);\n\t\t});\n\n\t\ttestClient.insertTextLocal(0, \"abc\");\n\n\t\tassert.equal(trackingGroup.size, 1);\n\n\t\tconst segmentInfo = testClient.getContainingSegment<ISegmentPrivate>(0);\n\n\t\tassert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 1);\n\n\t\tassert(trackingGroup.unlink(segmentInfo?.segment), \"unlink segment should be true\");\n\n\t\tassert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 0);\n\t});\n\n\tit(\"Splitting segment should split tracking group\", () => {\n\t\tconst trackingGroup = new TrackingGroup();\n\n\t\ttestClient.on(\"delta\", (opArgs, deltaArgs) => {\n\t\t\tfor (const sg of deltaArgs.deltaSegments)\n\t\t\t\tsg.segment.trackingCollection.link(trackingGroup);\n\t\t});\n\n\t\tconst ops = [testClient.insertTextLocal(0, \"abc\")];\n\n\t\ttestClient.removeAllListeners(\"delta\");\n\t\tassert.equal(trackingGroup.size, 1);\n\n\t\tops.push(testClient.insertTextLocal(1, \"z\"));\n\t\tassert.equal(testClient.getLength(), 4);\n\n\t\tassert.equal(trackingGroup.size, 2);\n\t\tconst segmentInfo = testClient.getContainingSegment<ISegmentPrivate>(0);\n\t\tassert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 1);\n\t});\n\n\tit(\"Zamboni should merge matching tracking groups\", () => {\n\t\tconst trackingGroup = new TrackingGroup();\n\n\t\ttestClient.on(\"delta\", (opArgs, deltaArgs) => {\n\t\t\tfor (const sg of deltaArgs.deltaSegments)\n\t\t\t\tsg.segment.trackingCollection.link(trackingGroup);\n\t\t});\n\n\t\tconst ops = [testClient.insertTextLocal(0, \"abc\")];\n\n\t\tassert.equal(trackingGroup.size, 1);\n\n\t\tops.push(testClient.insertTextLocal(1, \"z\"));\n\t\tassert.equal(testClient.getLength(), 4);\n\n\t\tassert.equal(trackingGroup.size, 3);\n\t\tlet segmentInfo = testClient.getContainingSegment<ISegmentPrivate>(0);\n\t\tassert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 1);\n\n\t\tlet seq = 1;\n\t\tfor (const op of ops) testClient.applyMsg(testClient.makeOpMessage(op, ++seq));\n\n\t\tassert.equal(trackingGroup.size, 3);\n\t\tsegmentInfo = testClient.getContainingSegment<ISegmentPrivate>(0);\n\t\tassert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 1);\n\n\t\ttestClient.updateMinSeq(seq);\n\n\t\tassert.equal(trackingGroup.size, 1);\n\t\tsegmentInfo = testClient.getContainingSegment<ISegmentPrivate>(0);\n\t\tassert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 1);\n\t});\n\n\tit(\"Newly created local reference should have empty tracking group\", () => {\n\t\ttestClient.insertTextLocal(0, \"abc\");\n\n\t\tassert.equal(testClient.getLength(), 3);\n\n\t\tconst segmentInfo = testClient.getContainingSegment<ISegmentPrivate>(0);\n\t\tassert(segmentInfo?.segment);\n\t\tconst ref = testClient.createLocalReferencePosition(\n\t\t\tsegmentInfo?.segment,\n\t\t\t0,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tassert(ref.trackingCollection.empty);\n\t});\n\n\tit(\"Local reference can be added an removed from tracking group\", () => {\n\t\ttestClient.insertTextLocal(0, \"abc\");\n\n\t\tassert.equal(testClient.getLength(), 3);\n\n\t\tconst segmentInfo = testClient.getContainingSegment<ISegmentPrivate>(0);\n\t\tassert(segmentInfo?.segment);\n\t\tconst ref = testClient.createLocalReferencePosition(\n\t\t\tsegmentInfo?.segment,\n\t\t\t0,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tconst trackingGroup = new TrackingGroup();\n\n\t\tref.trackingCollection.link(trackingGroup);\n\n\t\tassert.equal(trackingGroup.size, 1);\n\t\tassert.equal(trackingGroup.has(ref), true);\n\t\tassert.equal(trackingGroup.tracked.includes(ref), true);\n\t\tassert.equal(ref.trackingCollection.trackingGroups.size, 1);\n\n\t\tref.trackingCollection.unlink(trackingGroup);\n\n\t\tassert.equal(trackingGroup.size, 0);\n\t\tassert.equal(trackingGroup.has(ref), false);\n\t\tassert.equal(trackingGroup.tracked.includes(ref), false);\n\t\tassert.equal(ref.trackingCollection.trackingGroups.size, 0);\n\t});\n\n\tit(\"unlink segment from tracking group\", () => {\n\t\tconst trackingGroup = new TrackingGroup();\n\n\t\ttestClient.insertTextLocal(0, \"abc\");\n\n\t\tconst { segment } = testClient.getContainingSegment<ISegmentPrivate>(0) ?? {};\n\t\tsegment?.trackingCollection.link(trackingGroup);\n\n\t\tassert.equal(segment?.trackingCollection.trackingGroups.size, 1);\n\n\t\tassert(trackingGroup.unlink(segment), \"unlink segment should be true\");\n\n\t\tassert.equal(segment?.trackingCollection.trackingGroups.size, 0);\n\n\t\tassert.equal(\n\t\t\ttrackingGroup.unlink(segment),\n\t\t\tfalse,\n\t\t\t\"repeat unlink segment should be false\",\n\t\t);\n\t\tassert.equal(\n\t\t\tsegment.trackingCollection.unlink(trackingGroup),\n\t\t\tfalse,\n\t\t\t\"repeat unlink trackingGroup should be false\",\n\t\t);\n\t});\n\n\tit(\"unlink tracking group from collection\", () => {\n\t\tconst trackingGroup = new TrackingGroup();\n\n\t\ttestClient.insertTextLocal(0, \"abc\");\n\n\t\tconst { segment } = testClient.getContainingSegment<ISegmentPrivate>(0) ?? {};\n\t\tsegment?.trackingCollection.link(trackingGroup);\n\n\t\tassert.equal(segment?.trackingCollection.trackingGroups.size, 1);\n\n\t\tassert(\n\t\t\tsegment.trackingCollection.unlink(trackingGroup),\n\t\t\t\"unlink trackingGroup should be true\",\n\t\t);\n\n\t\tassert.equal(segment?.trackingCollection.trackingGroups.size, 0);\n\t\tassert.equal(\n\t\t\ttrackingGroup.unlink(segment),\n\t\t\tfalse,\n\t\t\t\"repeat unlink segment should be false\",\n\t\t);\n\t\tassert.equal(\n\t\t\tsegment.trackingCollection.unlink(trackingGroup),\n\t\t\tfalse,\n\t\t\t\"repeat unlink trackingGroup should be false\",\n\t\t);\n\t});\n});\n"]}
|
package/lib/localReference.d.ts
CHANGED
|
@@ -92,6 +92,10 @@ export declare class LocalReferenceCollection {
|
|
|
92
92
|
* @remarks This method should only be called by mergeTree.
|
|
93
93
|
*/
|
|
94
94
|
get empty(): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* The number of references stored in this collection.
|
|
97
|
+
*/
|
|
98
|
+
get size(): number;
|
|
95
99
|
/**
|
|
96
100
|
* Creates a new local reference.
|
|
97
101
|
* @remarks This method should only be called by mergeTree.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localReference.d.ts","sourceRoot":"","sources":["../src/localReference.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"localReference.d.ts","sourceRoot":"","sources":["../src/localReference.ts"],"names":[],"mappings":"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"}
|
package/lib/localReference.js
CHANGED
|
@@ -228,6 +228,12 @@ export class LocalReferenceCollection {
|
|
|
228
228
|
validateRefCount?.(this);
|
|
229
229
|
return this.refCount === 0;
|
|
230
230
|
}
|
|
231
|
+
/**
|
|
232
|
+
* The number of references stored in this collection.
|
|
233
|
+
*/
|
|
234
|
+
get size() {
|
|
235
|
+
return this.refCount;
|
|
236
|
+
}
|
|
231
237
|
/**
|
|
232
238
|
* Creates a new local reference.
|
|
233
239
|
* @remarks This method should only be called by mergeTree.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localReference.js","sourceRoot":"","sources":["../src/localReference.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tassert,\n\tDoublyLinkedList,\n\ttype ListNode,\n\twalkList,\n} from \"@fluidframework/core-utils/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport type { ISegmentInternal } from \"./mergeTreeNodes.js\";\nimport { type TrackingGroup, TrackingGroupCollection } from \"./mergeTreeTracking.js\";\nimport { ReferenceType } from \"./ops.js\";\nimport { type PropertySet, addProperties } from \"./properties.js\";\nimport { type ReferencePosition, refTypeIncludesFlag } from \"./referencePositions.js\";\n\n/**\n * Dictates the preferential direction for a {@link ReferencePosition} to slide\n * in a merge-tree\n * @legacy @beta\n */\nexport const SlidingPreference = {\n\t/**\n\t * Prefer sliding towards the start of the tree\n\t */\n\tBACKWARD: 0,\n\t/**\n\t * Prefer sliding towards the end of the tree\n\t */\n\tFORWARD: 1,\n} as const;\n\n/**\n * Dictates the preferential direction for a {@link ReferencePosition} to slide\n * in a merge-tree\n * @legacy @beta\n */\nexport type SlidingPreference = (typeof SlidingPreference)[keyof typeof SlidingPreference];\n\nfunction _validateReferenceType(refType: ReferenceType): void {\n\tlet exclusiveCount = 0;\n\tif (refTypeIncludesFlag(refType, ReferenceType.Transient)) {\n\t\t++exclusiveCount;\n\t}\n\tif (refTypeIncludesFlag(refType, ReferenceType.SlideOnRemove)) {\n\t\t++exclusiveCount;\n\t}\n\tif (refTypeIncludesFlag(refType, ReferenceType.StayOnRemove)) {\n\t\t++exclusiveCount;\n\t}\n\tif (exclusiveCount > 1) {\n\t\tthrow new UsageError(\n\t\t\t\"Reference types can only be one of Transient, SlideOnRemove, and StayOnRemove\",\n\t\t);\n\t}\n}\n/**\n * @sealed\n * @legacy @beta\n */\nexport interface LocalReferencePosition extends ReferencePosition {\n\tcallbacks?: Partial<\n\t\tRecord<\"beforeSlide\" | \"afterSlide\", (ref: LocalReferencePosition) => void>\n\t>;\n\treadonly trackingCollection: TrackingGroupCollection;\n\t/**\n\t * Whether or not this reference position can slide onto one of the two\n\t * special segments representing the position before or after the tree\n\t */\n\treadonly canSlideToEndpoint?: boolean;\n\n\t/**\n\t * @param newProps - Properties to add to this reference.\n\t * @remarks Note that merge-tree does not broadcast changes to other clients. It is up to the consumer\n\t * to ensure broadcast happens if that is desired.\n\t */\n\taddProperties(newProps: PropertySet): void;\n}\n\n/**\n * @privateRemarks This should not be exported outside merge tree.\n * @internal\n */\nclass LocalReference implements LocalReferencePosition {\n\tpublic properties: PropertySet | undefined;\n\n\tprivate segment: ISegmentInternal | undefined;\n\tprivate offset: number = 0;\n\tprivate listNode: ListNode<LocalReference> | undefined;\n\n\tpublic callbacks?:\n\t\t| Partial<Record<\"beforeSlide\" | \"afterSlide\", (ref: LocalReferencePosition) => void>>\n\t\t| undefined;\n\tprivate _trackingCollection?: TrackingGroupCollection;\n\tpublic get trackingCollection(): TrackingGroupCollection {\n\t\treturn (this._trackingCollection ??= new TrackingGroupCollection(this));\n\t}\n\n\tconstructor(\n\t\tpublic refType = ReferenceType.Simple,\n\t\tproperties?: PropertySet,\n\t\tpublic readonly slidingPreference: SlidingPreference = SlidingPreference.FORWARD,\n\t\tpublic readonly canSlideToEndpoint?: boolean,\n\t) {\n\t\t_validateReferenceType(refType);\n\t\tthis.properties = properties;\n\t}\n\n\tpublic link(\n\t\tsegment: ISegmentInternal | undefined,\n\t\toffset: number,\n\t\tlistNode: ListNode<LocalReference> | undefined,\n\t): void {\n\t\tif (listNode !== this.listNode && this.listNode !== undefined) {\n\t\t\tthis.segment?.localRefs?.removeLocalRef(this);\n\t\t}\n\t\tthis.listNode = listNode;\n\n\t\tif (segment !== this.segment) {\n\t\t\tconst groups: TrackingGroup[] = [];\n\t\t\tfor (const tg of this.trackingCollection.trackingGroups) {\n\t\t\t\ttg.unlink(this);\n\t\t\t\tgroups.push(tg);\n\t\t\t}\n\n\t\t\tthis.segment = segment;\n\n\t\t\tfor (const tg of groups) tg.link(this);\n\t\t}\n\t\tthis.offset = offset;\n\t}\n\n\tpublic isLeaf(): this is ISegmentInternal {\n\t\treturn false;\n\t}\n\n\tpublic addProperties(newProps: PropertySet): void {\n\t\tthis.properties = addProperties(this.properties, newProps);\n\t}\n\n\tpublic getSegment(): ISegmentInternal | undefined {\n\t\treturn this.segment;\n\t}\n\n\tpublic getOffset(): number {\n\t\treturn this.offset;\n\t}\n\n\tpublic getListNode(): ListNode<LocalReference> | undefined {\n\t\treturn this.listNode;\n\t}\n\n\tpublic getProperties(): PropertySet | undefined {\n\t\treturn this.properties;\n\t}\n}\n\n/**\n * Creates a new detached local reference.\n * @internal\n */\nexport function createDetachedLocalReferencePosition(\n\tslidingPreference: SlidingPreference | undefined,\n\trefType?: ReferenceType,\n): LocalReferencePosition {\n\treturn new LocalReference(refType, undefined, slidingPreference);\n}\n\ninterface IRefsAtOffset {\n\tbefore?: DoublyLinkedList<LocalReference>;\n\tat?: DoublyLinkedList<LocalReference>;\n\tafter?: DoublyLinkedList<LocalReference>;\n}\n\nfunction assertLocalReferences(lref: unknown): asserts lref is LocalReference {\n\tassert(lref instanceof LocalReference, 0x2e0 /* \"lref not a Local Reference\" */);\n}\n\n/**\n * Determines if the given function is true for any position within the collection.\n */\nexport function anyLocalReferencePosition(\n\tcollection: LocalReferenceCollection,\n\tfunc: (pos: LocalReferencePosition) => boolean,\n): boolean {\n\tfor (const pos of collection) {\n\t\tif (func(pos)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Finds the local reference positions that satisfy the given predicate.\n */\nexport function* filterLocalReferencePositions(\n\tcollection: LocalReferenceCollection,\n\tpredicate: (pos: LocalReferencePosition) => boolean,\n): Generator<LocalReferencePosition> {\n\tfor (const pos of collection) {\n\t\tif (predicate(pos)) {\n\t\t\tyield pos;\n\t\t}\n\t}\n}\n\n/**\n * Injectable hook for validating that the refCount property matches the\n * expected value\n */\nlet validateRefCount: ((collection?: LocalReferenceCollection) => void) | undefined;\n\nexport function setValidateRefCount(\n\tcb?: (collection?: LocalReferenceCollection) => void,\n): void {\n\tvalidateRefCount = cb;\n}\n\n/**\n * Represents a collection of {@link LocalReferencePosition}s associated with\n * one segment in a merge-tree.\n * Represents a collection of {@link LocalReferencePosition}s associated with one segment in a merge-tree.\n * @sealed\n *\n * @internal\n */\nexport class LocalReferenceCollection {\n\tpublic static append(seg1: ISegmentInternal, seg2: ISegmentInternal): void {\n\t\tif (seg2.localRefs && !seg2.localRefs.empty) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\t\tif (!seg1.localRefs) {\n\t\t\t\tseg1.localRefs = new LocalReferenceCollection(seg1);\n\t\t\t}\n\t\t\tassert(\n\t\t\t\tseg1.localRefs.refsByOffset.length === seg1.cachedLength,\n\t\t\t\t0x2be /* \"LocalReferences array contains a gap\" */,\n\t\t\t);\n\t\t\tseg1.localRefs.append(seg2.localRefs);\n\t\t} else if (seg1.localRefs) {\n\t\t\t// Since creating the LocalReferenceCollection, we may have appended\n\t\t\t// segments that had no local references. Account for them now by padding the array.\n\t\t\tseg1.localRefs.refsByOffset.length += seg2.cachedLength;\n\t\t}\n\t\tvalidateRefCount?.(seg1.localRefs);\n\t\tvalidateRefCount?.(seg2.localRefs);\n\t}\n\n\tpublic static setOrGet(segment: ISegmentInternal): LocalReferenceCollection {\n\t\treturn (segment.localRefs ??= new LocalReferenceCollection(segment));\n\t}\n\n\tprivate readonly refsByOffset: (IRefsAtOffset | undefined)[];\n\tprivate refCount: number = 0;\n\n\tprivate constructor(\n\t\t/**\n\t\t * The segment this `LocalReferenceCollection` is associated with.\n\t\t */\n\t\tprivate readonly segment: ISegmentInternal,\n\t\tinitialRefsByfOffset: (IRefsAtOffset | undefined)[] = Array.from({\n\t\t\tlength: segment.cachedLength,\n\t\t}),\n\t) {\n\t\t// Since javascript arrays are sparse the above won't populate any of the\n\t\t// indices, but it will ensure the length property of the array matches\n\t\t// the length of the segment.\n\t\tthis.refsByOffset = initialRefsByfOffset;\n\t}\n\n\t/**\n\t * Returns an iterator over this LocalReferenceCollection.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic [Symbol.iterator](): {\n\t\tnext(): IteratorResult<LocalReferencePosition>;\n\t\t[Symbol.iterator](): IterableIterator<LocalReferencePosition>;\n\t} {\n\t\tconst subiterators: IterableIterator<ListNode<LocalReferencePosition>>[] = [];\n\t\tfor (const refs of this.refsByOffset) {\n\t\t\tif (refs) {\n\t\t\t\tif (refs.before) {\n\t\t\t\t\tsubiterators.push(refs.before[Symbol.iterator]());\n\t\t\t\t}\n\t\t\t\tif (refs.at) {\n\t\t\t\t\tsubiterators.push(refs.at[Symbol.iterator]());\n\t\t\t\t}\n\t\t\t\tif (refs.after) {\n\t\t\t\t\tsubiterators.push(refs.after[Symbol.iterator]());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst iterator = {\n\t\t\tnext(): IteratorResult<LocalReferencePosition> {\n\t\t\t\twhile (subiterators.length > 0) {\n\t\t\t\t\tconst next = subiterators[0].next();\n\t\t\t\t\tif (next.done === true) {\n\t\t\t\t\t\tsubiterators.shift();\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn { done: next.done, value: next.value.data };\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn { value: undefined, done: true };\n\t\t\t},\n\t\t\t[Symbol.iterator](): {\n\t\t\t\tnext(): IteratorResult<LocalReferencePosition>;\n\t\t\t\t[Symbol.iterator](): IterableIterator<LocalReferencePosition>;\n\t\t\t} {\n\t\t\t\treturn this;\n\t\t\t},\n\t\t};\n\t\treturn iterator;\n\t}\n\n\t/**\n\t * Determines if the collection has no references in it.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic get empty(): boolean {\n\t\tvalidateRefCount?.(this);\n\t\treturn this.refCount === 0;\n\t}\n\n\t/**\n\t * Creates a new local reference.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic createLocalRef(\n\t\toffset: number,\n\t\trefType: ReferenceType,\n\t\tproperties: PropertySet | undefined,\n\t\tslidingPreference?: SlidingPreference,\n\t\tcanSlideToEndpoint?: boolean,\n\t): LocalReferencePosition {\n\t\tconst ref = new LocalReference(refType, properties, slidingPreference, canSlideToEndpoint);\n\t\tref.link(this.segment, offset, undefined);\n\t\tif (!refTypeIncludesFlag(ref, ReferenceType.Transient)) {\n\t\t\tthis.addLocalRef(ref, offset);\n\t\t}\n\t\tvalidateRefCount?.(this);\n\t\treturn ref;\n\t}\n\n\t/**\n\t * Adds a local reference to the collection.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic addLocalRef(lref: LocalReferencePosition, offset: number): void {\n\t\tassertLocalReferences(lref);\n\t\tassert(\n\t\t\toffset < this.segment.cachedLength,\n\t\t\t0x348 /* offset cannot be beyond segment length */,\n\t\t);\n\t\tif (refTypeIncludesFlag(lref, ReferenceType.Transient)) {\n\t\t\tlref.link(this.segment, offset, undefined);\n\t\t} else {\n\t\t\tconst refsAtOffset = (this.refsByOffset[offset] = this.refsByOffset[offset] ?? {\n\t\t\t\tat: new DoublyLinkedList(),\n\t\t\t});\n\t\t\tconst atRefs = (refsAtOffset.at = refsAtOffset.at ?? new DoublyLinkedList());\n\n\t\t\tlref.link(this.segment, offset, atRefs.push(lref).last);\n\n\t\t\tthis.refCount++;\n\t\t}\n\t\tvalidateRefCount?.(this);\n\t}\n\n\t/**\n\t * Removes a local reference from the collection.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic removeLocalRef(lref: LocalReferencePosition): LocalReferencePosition | undefined {\n\t\tif (this.has(lref)) {\n\t\t\tassertLocalReferences(lref);\n\n\t\t\tconst node = lref.getListNode();\n\t\t\tnode?.list?.remove(node);\n\n\t\t\tlref.link(undefined, 0, undefined);\n\n\t\t\tthis.refCount--;\n\t\t\tvalidateRefCount?.(this);\n\t\t\treturn lref;\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * Called by 'append()' implementations to append local refs from the given 'other' segment to the\n\t * end of 'this' segment.\n\t *\n\t * Note: This method should be invoked after the caller has ensured that segments can be merged,\n\t * but before 'this' segment's cachedLength has changed, or the adjustment to the local refs\n\t * will be incorrect.\n\t *\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic append(other: LocalReferenceCollection): void {\n\t\tif (!other || other.empty) {\n\t\t\treturn;\n\t\t}\n\t\tthis.refCount += other.refCount;\n\t\tother.refCount = 0;\n\t\tfor (const lref of other) {\n\t\t\tassertLocalReferences(lref);\n\t\t\tlref.link(this.segment, lref.getOffset() + this.refsByOffset.length, lref.getListNode());\n\t\t}\n\n\t\tthis.refsByOffset.push(...other.refsByOffset);\n\t\tother.refsByOffset.length = 0;\n\t}\n\t/**\n\t * Returns true of the local reference is in the collection, otherwise false.\n\t *\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic has(lref: ReferencePosition): boolean {\n\t\tif (\n\t\t\t!(lref instanceof LocalReference) ||\n\t\t\trefTypeIncludesFlag(lref, ReferenceType.Transient)\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\tconst seg = lref.getSegment();\n\t\tif (seg !== this.segment) {\n\t\t\treturn false;\n\t\t}\n\t\t// we should be able to optimize finding the\n\t\t// list head\n\t\tconst listNode = lref.getListNode();\n\t\tif (listNode === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\tconst offset = lref.getOffset();\n\t\tconst refsAtOffset = this.refsByOffset[offset];\n\t\tif (\n\t\t\t!!refsAtOffset?.before?.includes(listNode) ||\n\t\t\t!!refsAtOffset?.at?.includes(listNode) ||\n\t\t\t!!refsAtOffset?.after?.includes(listNode)\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Splits this `LocalReferenceCollection` into the intervals [0, offset) and [offset, originalLength).\n\t * Local references in the former half of this split will remain associated with the segment used on construction.\n\t * Local references in the latter half of this split will be transferred to `splitSeg`,\n\t * and its `localRefs` field will be set.\n\t * @param offset - Offset into the original segment at which the collection should be split\n\t * @param splitSeg - Split segment which originally corresponded to the indices [offset, originalLength)\n\t * before splitting.\n\t *\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic split(offset: number, splitSeg: ISegmentInternal): void {\n\t\tif (this.empty) {\n\t\t\t// shrink the offset array when empty and splitting\n\t\t\tthis.refsByOffset.length = offset;\n\t\t} else {\n\t\t\tconst localRefs = new LocalReferenceCollection(\n\t\t\t\tsplitSeg,\n\t\t\t\tthis.refsByOffset.splice(offset, this.refsByOffset.length - offset),\n\t\t\t);\n\n\t\t\tsplitSeg.localRefs = localRefs;\n\t\t\tfor (const lref of localRefs) {\n\t\t\t\tassertLocalReferences(lref);\n\t\t\t\tlref.link(splitSeg, lref.getOffset() - offset, lref.getListNode());\n\t\t\t\tthis.refCount--;\n\t\t\t\tlocalRefs.refCount++;\n\t\t\t}\n\t\t}\n\t\tvalidateRefCount?.(this);\n\t}\n\n\t/**\n\t * Insert a reference before tombstoned references.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic addBeforeTombstones(...refs: Iterable<LocalReferencePosition>[]): void {\n\t\tconst beforeRefs = this.refsByOffset[0]?.before ?? new DoublyLinkedList();\n\n\t\tif (this.refsByOffset[0]?.before === undefined) {\n\t\t\tconst refsAtOffset = (this.refsByOffset[0] ??= { before: beforeRefs });\n\t\t\trefsAtOffset.before ??= beforeRefs;\n\t\t}\n\n\t\tlet precedingRef: ListNode<LocalReference> | undefined;\n\t\tfor (const iterable of refs) {\n\t\t\tfor (const lref of iterable) {\n\t\t\t\tassertLocalReferences(lref);\n\t\t\t\tif (refTypeIncludesFlag(lref, ReferenceType.StayOnRemove)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t} else if (refTypeIncludesFlag(lref, ReferenceType.SlideOnRemove)) {\n\t\t\t\t\tlref.callbacks?.beforeSlide?.(lref);\n\t\t\t\t\tprecedingRef =\n\t\t\t\t\t\tprecedingRef === undefined\n\t\t\t\t\t\t\t? beforeRefs.unshift(lref)?.first\n\t\t\t\t\t\t\t: beforeRefs.insertAfter(precedingRef, lref)?.first;\n\t\t\t\t\tlref.link(this.segment, 0, precedingRef);\n\t\t\t\t\tthis.refCount++;\n\t\t\t\t\tlref.callbacks?.afterSlide?.(lref);\n\t\t\t\t} else {\n\t\t\t\t\tlref.link(undefined, 0, undefined);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvalidateRefCount?.(this);\n\t}\n\t/**\n\t * Insert a reference after tombstoned references.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic addAfterTombstones(...refs: Iterable<LocalReferencePosition>[]): void {\n\t\tconst lastOffset = this.segment.cachedLength - 1;\n\t\tconst afterRefs = this.refsByOffset[lastOffset]?.after ?? new DoublyLinkedList();\n\n\t\tif (this.refsByOffset[lastOffset]?.after === undefined) {\n\t\t\tconst refsAtOffset = (this.refsByOffset[lastOffset] ??= { after: afterRefs });\n\t\t\trefsAtOffset.after ??= afterRefs;\n\t\t}\n\n\t\tfor (const iterable of refs) {\n\t\t\tfor (const lref of iterable) {\n\t\t\t\tassertLocalReferences(lref);\n\t\t\t\tif (refTypeIncludesFlag(lref, ReferenceType.StayOnRemove)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t} else if (refTypeIncludesFlag(lref, ReferenceType.SlideOnRemove)) {\n\t\t\t\t\tlref.callbacks?.beforeSlide?.(lref);\n\t\t\t\t\tafterRefs.push(lref);\n\t\t\t\t\tlref.link(this.segment, lastOffset, afterRefs.last);\n\t\t\t\t\tthis.refCount++;\n\t\t\t\t\tlref.callbacks?.afterSlide?.(lref);\n\t\t\t\t} else {\n\t\t\t\t\tlref.link(undefined, 0, undefined);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvalidateRefCount?.(this);\n\t}\n\n\t/**\n\t * Determines if a reference is after tombstoned references.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic isAfterTombstone(lref: LocalReferencePosition): boolean {\n\t\tconst after = this.refsByOffset[lref.getOffset()]?.after;\n\t\tif (after) {\n\t\t\tassertLocalReferences(lref);\n\t\t\treturn after.includes(lref.getListNode());\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Walks all of the references in a collection.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic walkReferences(\n\t\tvisitor: (lref: LocalReferencePosition) => boolean | void | undefined,\n\t\tstart?: LocalReferencePosition,\n\t\tforward: boolean = true,\n\t): boolean {\n\t\tif (start !== undefined) {\n\t\t\tif (!this.has(start)) {\n\t\t\t\tthrow new UsageError(\"start must be in collection\");\n\t\t\t}\n\t\t\tassertLocalReferences(start);\n\t\t}\n\t\tlet offset = start?.getOffset() ?? (forward ? 0 : this.segment.cachedLength - 1);\n\n\t\tconst offsetPositions: DoublyLinkedList<IRefsAtOffset[keyof IRefsAtOffset]> =\n\t\t\tnew DoublyLinkedList();\n\t\toffsetPositions.push(\n\t\t\tthis.refsByOffset[offset]?.before,\n\t\t\tthis.refsByOffset[offset]?.at,\n\t\t\tthis.refsByOffset[offset]?.after,\n\t\t);\n\n\t\tconst startNode = start?.getListNode();\n\t\tconst startList = startNode?.list;\n\n\t\tif (startList !== undefined) {\n\t\t\t// Discard the buckets (before/at/after) which precede the bucket containing `start`,\n\t\t\t// so the walk begins at that bucket. `listWalker` then resumes mid-bucket at `startNode`.\n\t\t\tif (forward) {\n\t\t\t\twhile (!offsetPositions.empty && offsetPositions.first?.data !== startList) {\n\t\t\t\t\toffsetPositions.shift();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile (!offsetPositions.empty && offsetPositions.last?.data !== startList) {\n\t\t\t\t\toffsetPositions.pop();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst listWalker = (pos: DoublyLinkedList<LocalReference>): boolean => {\n\t\t\treturn walkList(\n\t\t\t\tpos,\n\t\t\t\t(node) => visitor(node.data),\n\t\t\t\tstartList === pos ? startNode : undefined,\n\t\t\t\tforward,\n\t\t\t);\n\t\t};\n\t\tconst increment = forward ? 1 : -1;\n\t\twhile (offset >= 0 && offset < this.refsByOffset.length) {\n\t\t\twhile (offsetPositions.length > 0) {\n\t\t\t\tconst offsetPos = forward ? offsetPositions.shift() : offsetPositions.pop();\n\t\t\t\tif (offsetPos?.data !== undefined && listWalker(offsetPos.data) === false) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\toffset += increment;\n\t\t\toffsetPositions.push(\n\t\t\t\tthis.refsByOffset[offset]?.before,\n\t\t\t\tthis.refsByOffset[offset]?.at,\n\t\t\t\tthis.refsByOffset[offset]?.after,\n\t\t\t);\n\t\t}\n\t\treturn true;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"localReference.js","sourceRoot":"","sources":["../src/localReference.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,MAAM,EACN,gBAAgB,EAEhB,QAAQ,GACR,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAGtE,OAAO,EAAsB,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAoB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAA0B,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEtF;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAChC;;OAEG;IACH,QAAQ,EAAE,CAAC;IACX;;OAEG;IACH,OAAO,EAAE,CAAC;CACD,CAAC;AASX,SAAS,sBAAsB,CAAC,OAAsB;IACrD,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3D,EAAE,cAAc,CAAC;IAClB,CAAC;IACD,IAAI,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/D,EAAE,cAAc,CAAC;IAClB,CAAC;IACD,IAAI,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9D,EAAE,cAAc,CAAC;IAClB,CAAC;IACD,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,UAAU,CACnB,+EAA+E,CAC/E,CAAC;IACH,CAAC;AACF,CAAC;AAwBD;;;GAGG;AACH,MAAM,cAAc;IAgBX;IAES;IACA;IAlBV,UAAU,CAA0B;IAEnC,OAAO,CAA+B;IACtC,MAAM,GAAW,CAAC,CAAC;IACnB,QAAQ,CAAuC;IAEhD,SAAS,CAEH;IACL,mBAAmB,CAA2B;IACtD,IAAW,kBAAkB;QAC5B,OAAO,CAAC,IAAI,CAAC,mBAAmB,KAAK,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,YACQ,UAAU,aAAa,CAAC,MAAM,EACrC,UAAwB,EACR,oBAAuC,iBAAiB,CAAC,OAAO,EAChE,kBAA4B;QAHrC,YAAO,GAAP,OAAO,CAAuB;QAErB,sBAAiB,GAAjB,iBAAiB,CAA+C;QAChE,uBAAkB,GAAlB,kBAAkB,CAAU;QAE5C,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC9B,CAAC;IAEM,IAAI,CACV,OAAqC,EACrC,MAAc,EACd,QAA8C;QAE9C,IAAI,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC/D,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,IAAI,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAoB,EAAE,CAAC;YACnC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE,CAAC;gBACzD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;YAED,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YAEvB,KAAK,MAAM,EAAE,IAAI,MAAM;gBAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAEM,MAAM;QACZ,OAAO,KAAK,CAAC;IACd,CAAC;IAEM,aAAa,CAAC,QAAqB;QACzC,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAEM,UAAU;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAEM,SAAS;QACf,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAEM,WAAW;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAEM,aAAa;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;CACD;AAED;;;GAGG;AACH,MAAM,UAAU,oCAAoC,CACnD,iBAAgD,EAChD,OAAuB;IAEvB,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAClE,CAAC;AAQD,SAAS,qBAAqB,CAAC,IAAa;IAC3C,MAAM,CAAC,IAAI,YAAY,cAAc,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAC;AAClF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACxC,UAAoC,EACpC,IAA8C;IAE9C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,SAAS,CAAC,CAAC,6BAA6B,CAC7C,UAAoC,EACpC,SAAmD;IAEnD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,GAAG,CAAC;QACX,CAAC;IACF,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,IAAI,gBAA+E,CAAC;AAEpF,MAAM,UAAU,mBAAmB,CAClC,EAAoD;IAEpD,gBAAgB,GAAG,EAAE,CAAC;AACvB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,wBAAwB;IAgClB;IA/BX,MAAM,CAAC,MAAM,CAAC,IAAsB,EAAE,IAAsB;QAClE,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YAC7C,6HAA6H;YAC7H,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACrB,IAAI,CAAC,SAAS,GAAG,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,CACL,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,KAAK,IAAI,CAAC,YAAY,EACxD,KAAK,CAAC,4CAA4C,CAClD,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3B,oEAAoE;YACpE,oFAAoF;YACpF,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC;QACzD,CAAC;QACD,gBAAgB,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,gBAAgB,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAEM,MAAM,CAAC,QAAQ,CAAC,OAAyB;QAC/C,OAAO,CAAC,OAAO,CAAC,SAAS,KAAK,IAAI,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,CAAC;IAEgB,YAAY,CAAgC;IACrD,QAAQ,GAAW,CAAC,CAAC;IAE7B;IACC;;OAEG;IACc,OAAyB,EAC1C,uBAAsD,KAAK,CAAC,IAAI,CAAC;QAChE,MAAM,EAAE,OAAO,CAAC,YAAY;KAC5B,CAAC;QAHe,YAAO,GAAP,OAAO,CAAkB;QAK1C,yEAAyE;QACzE,uEAAuE;QACvE,6BAA6B;QAC7B,IAAI,CAAC,YAAY,GAAG,oBAAoB,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAIvB,MAAM,YAAY,GAAyD,EAAE,CAAC;QAC9E,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtC,IAAI,IAAI,EAAE,CAAC;gBACV,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACnD,CAAC;gBACD,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;oBACb,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC/C,CAAC;gBACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBAChB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAClD,CAAC;YACF,CAAC;QACF,CAAC;QAED,MAAM,QAAQ,GAAG;YAChB,IAAI;gBACH,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChC,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACpC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;wBACxB,YAAY,CAAC,KAAK,EAAE,CAAC;oBACtB,CAAC;yBAAM,CAAC;wBACP,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;oBACpD,CAAC;gBACF,CAAC;gBAED,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACzC,CAAC;YACD,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAIhB,OAAO,IAAI,CAAC;YACb,CAAC;SACD,CAAC;QACF,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,IAAW,KAAK;QACf,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAW,IAAI;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED;;;OAGG;IACI,cAAc,CACpB,MAAc,EACd,OAAsB,EACtB,UAAmC,EACnC,iBAAqC,EACrC,kBAA4B;QAE5B,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;QAC3F,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,GAAG,CAAC;IACZ,CAAC;IAED;;;OAGG;IACI,WAAW,CAAC,IAA4B,EAAE,MAAc;QAC9D,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,CACL,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAClC,KAAK,CAAC,4CAA4C,CAClD,CAAC;QACF,IAAI,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACP,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI;gBAC9E,EAAE,EAAE,IAAI,gBAAgB,EAAE;aAC1B,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,CAAC,YAAY,CAAC,EAAE,GAAG,YAAY,CAAC,EAAE,IAAI,IAAI,gBAAgB,EAAE,CAAC,CAAC;YAE7E,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YAExD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjB,CAAC;QACD,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACI,cAAc,CAAC,IAA4B;QACjD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAE5B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAChC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAEzB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;YAEnC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC;YACzB,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED;;;;;;;;;;OAUG;IACI,MAAM,CAAC,KAA+B;QAC5C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC3B,OAAO;QACR,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC;QAChC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1F,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;QAC9C,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,CAAC;IACD;;;;OAIG;IACI,GAAG,CAAC,IAAuB;QACjC,IACC,CAAC,CAAC,IAAI,YAAY,cAAc,CAAC;YACjC,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,EACjD,CAAC;YACF,OAAO,KAAK,CAAC;QACd,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9B,IAAI,GAAG,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACd,CAAC;QACD,4CAA4C;QAC5C,YAAY;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC/C,IACC,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC;YAC1C,CAAC,CAAC,YAAY,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;YACtC,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,EACxC,CAAC;YACF,OAAO,IAAI,CAAC;QACb,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAED;;;;;;;;;;OAUG;IACI,KAAK,CAAC,MAAc,EAAE,QAA0B;QACtD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,mDAAmD;YACnD,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC;QACnC,CAAC;aAAM,CAAC;YACP,MAAM,SAAS,GAAG,IAAI,wBAAwB,CAC7C,QAAQ,EACR,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,CACnE,CAAC;YAEF,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC9B,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,SAAS,CAAC,QAAQ,EAAE,CAAC;YACtB,CAAC;QACF,CAAC;QACD,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACI,mBAAmB,CAAC,GAAG,IAAwC;QACrE,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QAE1E,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;YAChD,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YACvE,YAAY,CAAC,MAAM,KAAK,UAAU,CAAC;QACpC,CAAC;QAED,IAAI,YAAkD,CAAC;QACvD,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC7B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC7B,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC3D,SAAS;gBACV,CAAC;qBAAM,IAAI,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;oBACnE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;oBACpC,YAAY;wBACX,YAAY,KAAK,SAAS;4BACzB,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK;4BACjC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC;oBACtD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;oBACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChB,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;gBACpC,CAAC;qBAAM,CAAC;oBACP,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;gBACpC,CAAC;YACF,CAAC;QACF,CAAC;QACD,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD;;;OAGG;IACI,kBAAkB,CAAC,GAAG,IAAwC;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,KAAK,IAAI,IAAI,gBAAgB,EAAE,CAAC;QAEjF,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;YACxD,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAC9E,YAAY,CAAC,KAAK,KAAK,SAAS,CAAC;QAClC,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC7B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC7B,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC3D,SAAS;gBACV,CAAC;qBAAM,IAAI,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;oBACnE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;oBACpC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACrB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;oBACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChB,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;gBACpC,CAAC;qBAAM,CAAC;oBACP,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;gBACpC,CAAC;YACF,CAAC;QACF,CAAC;QACD,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACI,gBAAgB,CAAC,IAA4B;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC;QACzD,IAAI,KAAK,EAAE,CAAC;YACX,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAED;;;OAGG;IACI,cAAc,CACpB,OAAqE,EACrE,KAA8B,EAC9B,UAAmB,IAAI;QAEvB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,UAAU,CAAC,6BAA6B,CAAC,CAAC;YACrD,CAAC;YACD,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,MAAM,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QAEjF,MAAM,eAAe,GACpB,IAAI,gBAAgB,EAAE,CAAC;QACxB,eAAe,CAAC,IAAI,CACnB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,EACjC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,EAC7B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,KAAK,CAChC,CAAC;QAEF,MAAM,SAAS,GAAG,KAAK,EAAE,WAAW,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,SAAS,EAAE,IAAI,CAAC;QAElC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC7B,qFAAqF;YACrF,0FAA0F;YAC1F,IAAI,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,eAAe,CAAC,KAAK,IAAI,eAAe,CAAC,KAAK,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC5E,eAAe,CAAC,KAAK,EAAE,CAAC;gBACzB,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,OAAO,CAAC,eAAe,CAAC,KAAK,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC3E,eAAe,CAAC,GAAG,EAAE,CAAC;gBACvB,CAAC;YACF,CAAC;QACF,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,GAAqC,EAAW,EAAE;YACrE,OAAO,QAAQ,CACd,GAAG,EACH,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAC5B,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EACzC,OAAO,CACP,CAAC;QACH,CAAC,CAAC;QACF,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,OAAO,MAAM,IAAI,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACzD,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;gBAC5E,IAAI,SAAS,EAAE,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;oBAC3E,OAAO,KAAK,CAAC;gBACd,CAAC;YACF,CAAC;YACD,MAAM,IAAI,SAAS,CAAC;YACpB,eAAe,CAAC,IAAI,CACnB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,EACjC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,EAC7B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,KAAK,CAChC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tassert,\n\tDoublyLinkedList,\n\ttype ListNode,\n\twalkList,\n} from \"@fluidframework/core-utils/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport type { ISegmentInternal } from \"./mergeTreeNodes.js\";\nimport { type TrackingGroup, TrackingGroupCollection } from \"./mergeTreeTracking.js\";\nimport { ReferenceType } from \"./ops.js\";\nimport { type PropertySet, addProperties } from \"./properties.js\";\nimport { type ReferencePosition, refTypeIncludesFlag } from \"./referencePositions.js\";\n\n/**\n * Dictates the preferential direction for a {@link ReferencePosition} to slide\n * in a merge-tree\n * @legacy @beta\n */\nexport const SlidingPreference = {\n\t/**\n\t * Prefer sliding towards the start of the tree\n\t */\n\tBACKWARD: 0,\n\t/**\n\t * Prefer sliding towards the end of the tree\n\t */\n\tFORWARD: 1,\n} as const;\n\n/**\n * Dictates the preferential direction for a {@link ReferencePosition} to slide\n * in a merge-tree\n * @legacy @beta\n */\nexport type SlidingPreference = (typeof SlidingPreference)[keyof typeof SlidingPreference];\n\nfunction _validateReferenceType(refType: ReferenceType): void {\n\tlet exclusiveCount = 0;\n\tif (refTypeIncludesFlag(refType, ReferenceType.Transient)) {\n\t\t++exclusiveCount;\n\t}\n\tif (refTypeIncludesFlag(refType, ReferenceType.SlideOnRemove)) {\n\t\t++exclusiveCount;\n\t}\n\tif (refTypeIncludesFlag(refType, ReferenceType.StayOnRemove)) {\n\t\t++exclusiveCount;\n\t}\n\tif (exclusiveCount > 1) {\n\t\tthrow new UsageError(\n\t\t\t\"Reference types can only be one of Transient, SlideOnRemove, and StayOnRemove\",\n\t\t);\n\t}\n}\n/**\n * @sealed\n * @legacy @beta\n */\nexport interface LocalReferencePosition extends ReferencePosition {\n\tcallbacks?: Partial<\n\t\tRecord<\"beforeSlide\" | \"afterSlide\", (ref: LocalReferencePosition) => void>\n\t>;\n\treadonly trackingCollection: TrackingGroupCollection;\n\t/**\n\t * Whether or not this reference position can slide onto one of the two\n\t * special segments representing the position before or after the tree\n\t */\n\treadonly canSlideToEndpoint?: boolean;\n\n\t/**\n\t * @param newProps - Properties to add to this reference.\n\t * @remarks Note that merge-tree does not broadcast changes to other clients. It is up to the consumer\n\t * to ensure broadcast happens if that is desired.\n\t */\n\taddProperties(newProps: PropertySet): void;\n}\n\n/**\n * @privateRemarks This should not be exported outside merge tree.\n * @internal\n */\nclass LocalReference implements LocalReferencePosition {\n\tpublic properties: PropertySet | undefined;\n\n\tprivate segment: ISegmentInternal | undefined;\n\tprivate offset: number = 0;\n\tprivate listNode: ListNode<LocalReference> | undefined;\n\n\tpublic callbacks?:\n\t\t| Partial<Record<\"beforeSlide\" | \"afterSlide\", (ref: LocalReferencePosition) => void>>\n\t\t| undefined;\n\tprivate _trackingCollection?: TrackingGroupCollection;\n\tpublic get trackingCollection(): TrackingGroupCollection {\n\t\treturn (this._trackingCollection ??= new TrackingGroupCollection(this));\n\t}\n\n\tconstructor(\n\t\tpublic refType = ReferenceType.Simple,\n\t\tproperties?: PropertySet,\n\t\tpublic readonly slidingPreference: SlidingPreference = SlidingPreference.FORWARD,\n\t\tpublic readonly canSlideToEndpoint?: boolean,\n\t) {\n\t\t_validateReferenceType(refType);\n\t\tthis.properties = properties;\n\t}\n\n\tpublic link(\n\t\tsegment: ISegmentInternal | undefined,\n\t\toffset: number,\n\t\tlistNode: ListNode<LocalReference> | undefined,\n\t): void {\n\t\tif (listNode !== this.listNode && this.listNode !== undefined) {\n\t\t\tthis.segment?.localRefs?.removeLocalRef(this);\n\t\t}\n\t\tthis.listNode = listNode;\n\n\t\tif (segment !== this.segment) {\n\t\t\tconst groups: TrackingGroup[] = [];\n\t\t\tfor (const tg of this.trackingCollection.trackingGroups) {\n\t\t\t\ttg.unlink(this);\n\t\t\t\tgroups.push(tg);\n\t\t\t}\n\n\t\t\tthis.segment = segment;\n\n\t\t\tfor (const tg of groups) tg.link(this);\n\t\t}\n\t\tthis.offset = offset;\n\t}\n\n\tpublic isLeaf(): this is ISegmentInternal {\n\t\treturn false;\n\t}\n\n\tpublic addProperties(newProps: PropertySet): void {\n\t\tthis.properties = addProperties(this.properties, newProps);\n\t}\n\n\tpublic getSegment(): ISegmentInternal | undefined {\n\t\treturn this.segment;\n\t}\n\n\tpublic getOffset(): number {\n\t\treturn this.offset;\n\t}\n\n\tpublic getListNode(): ListNode<LocalReference> | undefined {\n\t\treturn this.listNode;\n\t}\n\n\tpublic getProperties(): PropertySet | undefined {\n\t\treturn this.properties;\n\t}\n}\n\n/**\n * Creates a new detached local reference.\n * @internal\n */\nexport function createDetachedLocalReferencePosition(\n\tslidingPreference: SlidingPreference | undefined,\n\trefType?: ReferenceType,\n): LocalReferencePosition {\n\treturn new LocalReference(refType, undefined, slidingPreference);\n}\n\ninterface IRefsAtOffset {\n\tbefore?: DoublyLinkedList<LocalReference>;\n\tat?: DoublyLinkedList<LocalReference>;\n\tafter?: DoublyLinkedList<LocalReference>;\n}\n\nfunction assertLocalReferences(lref: unknown): asserts lref is LocalReference {\n\tassert(lref instanceof LocalReference, 0x2e0 /* \"lref not a Local Reference\" */);\n}\n\n/**\n * Determines if the given function is true for any position within the collection.\n */\nexport function anyLocalReferencePosition(\n\tcollection: LocalReferenceCollection,\n\tfunc: (pos: LocalReferencePosition) => boolean,\n): boolean {\n\tfor (const pos of collection) {\n\t\tif (func(pos)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Finds the local reference positions that satisfy the given predicate.\n */\nexport function* filterLocalReferencePositions(\n\tcollection: LocalReferenceCollection,\n\tpredicate: (pos: LocalReferencePosition) => boolean,\n): Generator<LocalReferencePosition> {\n\tfor (const pos of collection) {\n\t\tif (predicate(pos)) {\n\t\t\tyield pos;\n\t\t}\n\t}\n}\n\n/**\n * Injectable hook for validating that the refCount property matches the\n * expected value\n */\nlet validateRefCount: ((collection?: LocalReferenceCollection) => void) | undefined;\n\nexport function setValidateRefCount(\n\tcb?: (collection?: LocalReferenceCollection) => void,\n): void {\n\tvalidateRefCount = cb;\n}\n\n/**\n * Represents a collection of {@link LocalReferencePosition}s associated with\n * one segment in a merge-tree.\n * Represents a collection of {@link LocalReferencePosition}s associated with one segment in a merge-tree.\n * @sealed\n *\n * @internal\n */\nexport class LocalReferenceCollection {\n\tpublic static append(seg1: ISegmentInternal, seg2: ISegmentInternal): void {\n\t\tif (seg2.localRefs && !seg2.localRefs.empty) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\t\tif (!seg1.localRefs) {\n\t\t\t\tseg1.localRefs = new LocalReferenceCollection(seg1);\n\t\t\t}\n\t\t\tassert(\n\t\t\t\tseg1.localRefs.refsByOffset.length === seg1.cachedLength,\n\t\t\t\t0x2be /* \"LocalReferences array contains a gap\" */,\n\t\t\t);\n\t\t\tseg1.localRefs.append(seg2.localRefs);\n\t\t} else if (seg1.localRefs) {\n\t\t\t// Since creating the LocalReferenceCollection, we may have appended\n\t\t\t// segments that had no local references. Account for them now by padding the array.\n\t\t\tseg1.localRefs.refsByOffset.length += seg2.cachedLength;\n\t\t}\n\t\tvalidateRefCount?.(seg1.localRefs);\n\t\tvalidateRefCount?.(seg2.localRefs);\n\t}\n\n\tpublic static setOrGet(segment: ISegmentInternal): LocalReferenceCollection {\n\t\treturn (segment.localRefs ??= new LocalReferenceCollection(segment));\n\t}\n\n\tprivate readonly refsByOffset: (IRefsAtOffset | undefined)[];\n\tprivate refCount: number = 0;\n\n\tprivate constructor(\n\t\t/**\n\t\t * The segment this `LocalReferenceCollection` is associated with.\n\t\t */\n\t\tprivate readonly segment: ISegmentInternal,\n\t\tinitialRefsByfOffset: (IRefsAtOffset | undefined)[] = Array.from({\n\t\t\tlength: segment.cachedLength,\n\t\t}),\n\t) {\n\t\t// Since javascript arrays are sparse the above won't populate any of the\n\t\t// indices, but it will ensure the length property of the array matches\n\t\t// the length of the segment.\n\t\tthis.refsByOffset = initialRefsByfOffset;\n\t}\n\n\t/**\n\t * Returns an iterator over this LocalReferenceCollection.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic [Symbol.iterator](): {\n\t\tnext(): IteratorResult<LocalReferencePosition>;\n\t\t[Symbol.iterator](): IterableIterator<LocalReferencePosition>;\n\t} {\n\t\tconst subiterators: IterableIterator<ListNode<LocalReferencePosition>>[] = [];\n\t\tfor (const refs of this.refsByOffset) {\n\t\t\tif (refs) {\n\t\t\t\tif (refs.before) {\n\t\t\t\t\tsubiterators.push(refs.before[Symbol.iterator]());\n\t\t\t\t}\n\t\t\t\tif (refs.at) {\n\t\t\t\t\tsubiterators.push(refs.at[Symbol.iterator]());\n\t\t\t\t}\n\t\t\t\tif (refs.after) {\n\t\t\t\t\tsubiterators.push(refs.after[Symbol.iterator]());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst iterator = {\n\t\t\tnext(): IteratorResult<LocalReferencePosition> {\n\t\t\t\twhile (subiterators.length > 0) {\n\t\t\t\t\tconst next = subiterators[0].next();\n\t\t\t\t\tif (next.done === true) {\n\t\t\t\t\t\tsubiterators.shift();\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn { done: next.done, value: next.value.data };\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn { value: undefined, done: true };\n\t\t\t},\n\t\t\t[Symbol.iterator](): {\n\t\t\t\tnext(): IteratorResult<LocalReferencePosition>;\n\t\t\t\t[Symbol.iterator](): IterableIterator<LocalReferencePosition>;\n\t\t\t} {\n\t\t\t\treturn this;\n\t\t\t},\n\t\t};\n\t\treturn iterator;\n\t}\n\n\t/**\n\t * Determines if the collection has no references in it.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic get empty(): boolean {\n\t\tvalidateRefCount?.(this);\n\t\treturn this.refCount === 0;\n\t}\n\n\t/**\n\t * The number of references stored in this collection.\n\t */\n\tpublic get size(): number {\n\t\treturn this.refCount;\n\t}\n\n\t/**\n\t * Creates a new local reference.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic createLocalRef(\n\t\toffset: number,\n\t\trefType: ReferenceType,\n\t\tproperties: PropertySet | undefined,\n\t\tslidingPreference?: SlidingPreference,\n\t\tcanSlideToEndpoint?: boolean,\n\t): LocalReferencePosition {\n\t\tconst ref = new LocalReference(refType, properties, slidingPreference, canSlideToEndpoint);\n\t\tref.link(this.segment, offset, undefined);\n\t\tif (!refTypeIncludesFlag(ref, ReferenceType.Transient)) {\n\t\t\tthis.addLocalRef(ref, offset);\n\t\t}\n\t\tvalidateRefCount?.(this);\n\t\treturn ref;\n\t}\n\n\t/**\n\t * Adds a local reference to the collection.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic addLocalRef(lref: LocalReferencePosition, offset: number): void {\n\t\tassertLocalReferences(lref);\n\t\tassert(\n\t\t\toffset < this.segment.cachedLength,\n\t\t\t0x348 /* offset cannot be beyond segment length */,\n\t\t);\n\t\tif (refTypeIncludesFlag(lref, ReferenceType.Transient)) {\n\t\t\tlref.link(this.segment, offset, undefined);\n\t\t} else {\n\t\t\tconst refsAtOffset = (this.refsByOffset[offset] = this.refsByOffset[offset] ?? {\n\t\t\t\tat: new DoublyLinkedList(),\n\t\t\t});\n\t\t\tconst atRefs = (refsAtOffset.at = refsAtOffset.at ?? new DoublyLinkedList());\n\n\t\t\tlref.link(this.segment, offset, atRefs.push(lref).last);\n\n\t\t\tthis.refCount++;\n\t\t}\n\t\tvalidateRefCount?.(this);\n\t}\n\n\t/**\n\t * Removes a local reference from the collection.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic removeLocalRef(lref: LocalReferencePosition): LocalReferencePosition | undefined {\n\t\tif (this.has(lref)) {\n\t\t\tassertLocalReferences(lref);\n\n\t\t\tconst node = lref.getListNode();\n\t\t\tnode?.list?.remove(node);\n\n\t\t\tlref.link(undefined, 0, undefined);\n\n\t\t\tthis.refCount--;\n\t\t\tvalidateRefCount?.(this);\n\t\t\treturn lref;\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * Called by 'append()' implementations to append local refs from the given 'other' segment to the\n\t * end of 'this' segment.\n\t *\n\t * Note: This method should be invoked after the caller has ensured that segments can be merged,\n\t * but before 'this' segment's cachedLength has changed, or the adjustment to the local refs\n\t * will be incorrect.\n\t *\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic append(other: LocalReferenceCollection): void {\n\t\tif (!other || other.empty) {\n\t\t\treturn;\n\t\t}\n\t\tthis.refCount += other.refCount;\n\t\tother.refCount = 0;\n\t\tfor (const lref of other) {\n\t\t\tassertLocalReferences(lref);\n\t\t\tlref.link(this.segment, lref.getOffset() + this.refsByOffset.length, lref.getListNode());\n\t\t}\n\n\t\tthis.refsByOffset.push(...other.refsByOffset);\n\t\tother.refsByOffset.length = 0;\n\t}\n\t/**\n\t * Returns true of the local reference is in the collection, otherwise false.\n\t *\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic has(lref: ReferencePosition): boolean {\n\t\tif (\n\t\t\t!(lref instanceof LocalReference) ||\n\t\t\trefTypeIncludesFlag(lref, ReferenceType.Transient)\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\tconst seg = lref.getSegment();\n\t\tif (seg !== this.segment) {\n\t\t\treturn false;\n\t\t}\n\t\t// we should be able to optimize finding the\n\t\t// list head\n\t\tconst listNode = lref.getListNode();\n\t\tif (listNode === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\tconst offset = lref.getOffset();\n\t\tconst refsAtOffset = this.refsByOffset[offset];\n\t\tif (\n\t\t\t!!refsAtOffset?.before?.includes(listNode) ||\n\t\t\t!!refsAtOffset?.at?.includes(listNode) ||\n\t\t\t!!refsAtOffset?.after?.includes(listNode)\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Splits this `LocalReferenceCollection` into the intervals [0, offset) and [offset, originalLength).\n\t * Local references in the former half of this split will remain associated with the segment used on construction.\n\t * Local references in the latter half of this split will be transferred to `splitSeg`,\n\t * and its `localRefs` field will be set.\n\t * @param offset - Offset into the original segment at which the collection should be split\n\t * @param splitSeg - Split segment which originally corresponded to the indices [offset, originalLength)\n\t * before splitting.\n\t *\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic split(offset: number, splitSeg: ISegmentInternal): void {\n\t\tif (this.empty) {\n\t\t\t// shrink the offset array when empty and splitting\n\t\t\tthis.refsByOffset.length = offset;\n\t\t} else {\n\t\t\tconst localRefs = new LocalReferenceCollection(\n\t\t\t\tsplitSeg,\n\t\t\t\tthis.refsByOffset.splice(offset, this.refsByOffset.length - offset),\n\t\t\t);\n\n\t\t\tsplitSeg.localRefs = localRefs;\n\t\t\tfor (const lref of localRefs) {\n\t\t\t\tassertLocalReferences(lref);\n\t\t\t\tlref.link(splitSeg, lref.getOffset() - offset, lref.getListNode());\n\t\t\t\tthis.refCount--;\n\t\t\t\tlocalRefs.refCount++;\n\t\t\t}\n\t\t}\n\t\tvalidateRefCount?.(this);\n\t}\n\n\t/**\n\t * Insert a reference before tombstoned references.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic addBeforeTombstones(...refs: Iterable<LocalReferencePosition>[]): void {\n\t\tconst beforeRefs = this.refsByOffset[0]?.before ?? new DoublyLinkedList();\n\n\t\tif (this.refsByOffset[0]?.before === undefined) {\n\t\t\tconst refsAtOffset = (this.refsByOffset[0] ??= { before: beforeRefs });\n\t\t\trefsAtOffset.before ??= beforeRefs;\n\t\t}\n\n\t\tlet precedingRef: ListNode<LocalReference> | undefined;\n\t\tfor (const iterable of refs) {\n\t\t\tfor (const lref of iterable) {\n\t\t\t\tassertLocalReferences(lref);\n\t\t\t\tif (refTypeIncludesFlag(lref, ReferenceType.StayOnRemove)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t} else if (refTypeIncludesFlag(lref, ReferenceType.SlideOnRemove)) {\n\t\t\t\t\tlref.callbacks?.beforeSlide?.(lref);\n\t\t\t\t\tprecedingRef =\n\t\t\t\t\t\tprecedingRef === undefined\n\t\t\t\t\t\t\t? beforeRefs.unshift(lref)?.first\n\t\t\t\t\t\t\t: beforeRefs.insertAfter(precedingRef, lref)?.first;\n\t\t\t\t\tlref.link(this.segment, 0, precedingRef);\n\t\t\t\t\tthis.refCount++;\n\t\t\t\t\tlref.callbacks?.afterSlide?.(lref);\n\t\t\t\t} else {\n\t\t\t\t\tlref.link(undefined, 0, undefined);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvalidateRefCount?.(this);\n\t}\n\t/**\n\t * Insert a reference after tombstoned references.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic addAfterTombstones(...refs: Iterable<LocalReferencePosition>[]): void {\n\t\tconst lastOffset = this.segment.cachedLength - 1;\n\t\tconst afterRefs = this.refsByOffset[lastOffset]?.after ?? new DoublyLinkedList();\n\n\t\tif (this.refsByOffset[lastOffset]?.after === undefined) {\n\t\t\tconst refsAtOffset = (this.refsByOffset[lastOffset] ??= { after: afterRefs });\n\t\t\trefsAtOffset.after ??= afterRefs;\n\t\t}\n\n\t\tfor (const iterable of refs) {\n\t\t\tfor (const lref of iterable) {\n\t\t\t\tassertLocalReferences(lref);\n\t\t\t\tif (refTypeIncludesFlag(lref, ReferenceType.StayOnRemove)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t} else if (refTypeIncludesFlag(lref, ReferenceType.SlideOnRemove)) {\n\t\t\t\t\tlref.callbacks?.beforeSlide?.(lref);\n\t\t\t\t\tafterRefs.push(lref);\n\t\t\t\t\tlref.link(this.segment, lastOffset, afterRefs.last);\n\t\t\t\t\tthis.refCount++;\n\t\t\t\t\tlref.callbacks?.afterSlide?.(lref);\n\t\t\t\t} else {\n\t\t\t\t\tlref.link(undefined, 0, undefined);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvalidateRefCount?.(this);\n\t}\n\n\t/**\n\t * Determines if a reference is after tombstoned references.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic isAfterTombstone(lref: LocalReferencePosition): boolean {\n\t\tconst after = this.refsByOffset[lref.getOffset()]?.after;\n\t\tif (after) {\n\t\t\tassertLocalReferences(lref);\n\t\t\treturn after.includes(lref.getListNode());\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Walks all of the references in a collection.\n\t * @remarks This method should only be called by mergeTree.\n\t */\n\tpublic walkReferences(\n\t\tvisitor: (lref: LocalReferencePosition) => boolean | void | undefined,\n\t\tstart?: LocalReferencePosition,\n\t\tforward: boolean = true,\n\t): boolean {\n\t\tif (start !== undefined) {\n\t\t\tif (!this.has(start)) {\n\t\t\t\tthrow new UsageError(\"start must be in collection\");\n\t\t\t}\n\t\t\tassertLocalReferences(start);\n\t\t}\n\t\tlet offset = start?.getOffset() ?? (forward ? 0 : this.segment.cachedLength - 1);\n\n\t\tconst offsetPositions: DoublyLinkedList<IRefsAtOffset[keyof IRefsAtOffset]> =\n\t\t\tnew DoublyLinkedList();\n\t\toffsetPositions.push(\n\t\t\tthis.refsByOffset[offset]?.before,\n\t\t\tthis.refsByOffset[offset]?.at,\n\t\t\tthis.refsByOffset[offset]?.after,\n\t\t);\n\n\t\tconst startNode = start?.getListNode();\n\t\tconst startList = startNode?.list;\n\n\t\tif (startList !== undefined) {\n\t\t\t// Discard the buckets (before/at/after) which precede the bucket containing `start`,\n\t\t\t// so the walk begins at that bucket. `listWalker` then resumes mid-bucket at `startNode`.\n\t\t\tif (forward) {\n\t\t\t\twhile (!offsetPositions.empty && offsetPositions.first?.data !== startList) {\n\t\t\t\t\toffsetPositions.shift();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile (!offsetPositions.empty && offsetPositions.last?.data !== startList) {\n\t\t\t\t\toffsetPositions.pop();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst listWalker = (pos: DoublyLinkedList<LocalReference>): boolean => {\n\t\t\treturn walkList(\n\t\t\t\tpos,\n\t\t\t\t(node) => visitor(node.data),\n\t\t\t\tstartList === pos ? startNode : undefined,\n\t\t\t\tforward,\n\t\t\t);\n\t\t};\n\t\tconst increment = forward ? 1 : -1;\n\t\twhile (offset >= 0 && offset < this.refsByOffset.length) {\n\t\t\twhile (offsetPositions.length > 0) {\n\t\t\t\tconst offsetPos = forward ? offsetPositions.shift() : offsetPositions.pop();\n\t\t\t\tif (offsetPos?.data !== undefined && listWalker(offsetPos.data) === false) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\toffset += increment;\n\t\t\toffsetPositions.push(\n\t\t\t\tthis.refsByOffset[offset]?.before,\n\t\t\t\tthis.refsByOffset[offset]?.at,\n\t\t\t\tthis.refsByOffset[offset]?.after,\n\t\t\t);\n\t\t}\n\t\treturn true;\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeTreeTracking.d.ts","sourceRoot":"","sources":["../src/mergeTreeTracking.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,sBAAsB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,SAAS,SAAS,EAAE,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;CACtC;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,cAAc;IACnD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;;IAMzD,IAAW,OAAO,IAAI,SAAS,SAAS,EAAE,CAEzC;IAED,IAAW,IAAI,IAAI,MAAM,CAExB;IAEM,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IAIlC,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAOhC,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;CAO5C;AAED;;GAEG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAC5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;;IAM5C,IAAW,OAAO,IAAI,SAAS,SAAS,EAAE,CAEzC;IAED,IAAW,IAAI,IAAI,MAAM,CAExB;IAEM,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IAIlC,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAOhC,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;CAO5C;AAED;;;GAGG;AACH,qBAAa,uBAAuB;IAUvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IATtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;IAEtD,IAAW,cAAc,IAAI,GAAG,CAAC,aAAa,CAAC,CAK9C;gBAE4B,SAAS,EAAE,SAAS;IAI1C,IAAI,CAAC,aAAa,EAAE,cAAc,GAAG,IAAI;IAYzC,MAAM,CAAC,aAAa,EAAE,cAAc,GAAG,OAAO;IAY9C,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAMzC,IAAW,KAAK,IAAI,OAAO,CAE1B;IAEM,OAAO,CAAC,kBAAkB,EAAE,uBAAuB,GAAG,OAAO;
|
|
1
|
+
{"version":3,"file":"mergeTreeTracking.d.ts","sourceRoot":"","sources":["../src/mergeTreeTracking.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,sBAAsB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,SAAS,SAAS,EAAE,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;CACtC;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,cAAc;IACnD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;;IAMzD,IAAW,OAAO,IAAI,SAAS,SAAS,EAAE,CAEzC;IAED,IAAW,IAAI,IAAI,MAAM,CAExB;IAEM,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IAIlC,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAOhC,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;CAO5C;AAED;;GAEG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAC5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;;IAM5C,IAAW,OAAO,IAAI,SAAS,SAAS,EAAE,CAEzC;IAED,IAAW,IAAI,IAAI,MAAM,CAExB;IAEM,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IAIlC,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAOhC,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;CAO5C;AAED;;;GAGG;AACH,qBAAa,uBAAuB;IAUvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IATtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;IAEtD,IAAW,cAAc,IAAI,GAAG,CAAC,aAAa,CAAC,CAK9C;gBAE4B,SAAS,EAAE,SAAS;IAI1C,IAAI,CAAC,aAAa,EAAE,cAAc,GAAG,IAAI;IAYzC,MAAM,CAAC,aAAa,EAAE,cAAc,GAAG,OAAO;IAY9C,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAMzC,IAAW,KAAK,IAAI,OAAO,CAE1B;IAEM,OAAO,CAAC,kBAAkB,EAAE,uBAAuB,GAAG,OAAO;CAYpE"}
|
package/lib/mergeTreeTracking.js
CHANGED
|
@@ -111,14 +111,12 @@ export class TrackingGroupCollection {
|
|
|
111
111
|
return this._trackingGroups.size === 0;
|
|
112
112
|
}
|
|
113
113
|
matches(trackingCollection) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
!trackingCollection ||
|
|
117
|
-
this._trackingGroups.size !== trackingCollection._trackingGroups.size) {
|
|
114
|
+
const trackingGroups = trackingCollection.trackingGroups;
|
|
115
|
+
if (this._trackingGroups.size !== trackingGroups.size) {
|
|
118
116
|
return false;
|
|
119
117
|
}
|
|
120
118
|
for (const tg of this._trackingGroups.values()) {
|
|
121
|
-
if (!
|
|
119
|
+
if (!trackingGroups.has(tg)) {
|
|
122
120
|
return false;
|
|
123
121
|
}
|
|
124
122
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeTreeTracking.js","sourceRoot":"","sources":["../src/mergeTreeTracking.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"mergeTreeTracking.js","sourceRoot":"","sources":["../src/mergeTreeTracking.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 type { LocalReferencePosition } from \"./localReference.js\";\nimport type { ISegment } from \"./mergeTreeNodes.js\";\nimport { SortedSegmentSet } from \"./sortedSegmentSet.js\";\n\n/**\n * @legacy @beta\n */\nexport type Trackable = ISegment | LocalReferencePosition;\n\n/**\n * @legacy @beta\n */\nexport interface ITrackingGroup {\n\ttracked: readonly Trackable[];\n\tsize: number;\n\thas(trackable: Trackable): boolean;\n\tlink(trackable: Trackable): void;\n\tunlink(trackable: Trackable): boolean;\n}\n\n/**\n * @legacy @beta\n */\nexport class TrackingGroup implements ITrackingGroup {\n\tprivate readonly trackedSet: SortedSegmentSet<Trackable>;\n\n\tconstructor() {\n\t\tthis.trackedSet = new SortedSegmentSet<Trackable>();\n\t}\n\n\tpublic get tracked(): readonly Trackable[] {\n\t\treturn this.trackedSet.items;\n\t}\n\n\tpublic get size(): number {\n\t\treturn this.trackedSet.size;\n\t}\n\n\tpublic has(trackable: Trackable): boolean {\n\t\treturn this.trackedSet.has(trackable);\n\t}\n\n\tpublic link(trackable: Trackable): void {\n\t\tif (!this.trackedSet.has(trackable)) {\n\t\t\tthis.trackedSet.addOrUpdate(trackable);\n\t\t\ttrackable.trackingCollection.link(this);\n\t\t}\n\t}\n\n\tpublic unlink(trackable: Trackable): boolean {\n\t\tif (this.trackedSet.remove(trackable)) {\n\t\t\ttrackable.trackingCollection.unlink(this);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n\n/**\n * Tracking group backed by an unordered set. Lookup, insertion, and deletion are O(1)\n */\nexport class UnorderedTrackingGroup implements ITrackingGroup {\n\tprivate readonly trackedSet: Set<Trackable>;\n\n\tconstructor() {\n\t\tthis.trackedSet = new Set<Trackable>();\n\t}\n\n\tpublic get tracked(): readonly Trackable[] {\n\t\treturn [...this.trackedSet];\n\t}\n\n\tpublic get size(): number {\n\t\treturn this.trackedSet.size;\n\t}\n\n\tpublic has(trackable: Trackable): boolean {\n\t\treturn this.trackedSet.has(trackable);\n\t}\n\n\tpublic link(trackable: Trackable): void {\n\t\tif (!this.trackedSet.has(trackable)) {\n\t\t\tthis.trackedSet.add(trackable);\n\t\t\ttrackable.trackingCollection.link(this);\n\t\t}\n\t}\n\n\tpublic unlink(trackable: Trackable): boolean {\n\t\tif (this.trackedSet.delete(trackable)) {\n\t\t\ttrackable.trackingCollection.unlink(this);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n\n/**\n * A collection of {@link ITrackingGroup}.\n * @legacy @beta\n */\nexport class TrackingGroupCollection {\n\tprivate readonly _trackingGroups: Set<ITrackingGroup>;\n\n\tpublic get trackingGroups(): Set<TrackingGroup> {\n\t\t// Cast here is necessary to avoid a breaking change to\n\t\t// `TrackingGroupCollection`. Ideally we could just return\n\t\t// `Set<ITrackingGroup>`\n\t\treturn this._trackingGroups as Set<TrackingGroup>;\n\t}\n\n\tconstructor(private readonly trackable: Trackable) {\n\t\tthis._trackingGroups = new Set<ITrackingGroup>();\n\t}\n\n\tpublic link(trackingGroup: ITrackingGroup): void {\n\t\tif (trackingGroup) {\n\t\t\tif (!this._trackingGroups.has(trackingGroup)) {\n\t\t\t\tthis._trackingGroups.add(trackingGroup);\n\t\t\t}\n\n\t\t\tif (!trackingGroup.has(this.trackable)) {\n\t\t\t\ttrackingGroup.link(this.trackable);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic unlink(trackingGroup: ITrackingGroup): boolean {\n\t\tif (this._trackingGroups.has(trackingGroup)) {\n\t\t\tif (trackingGroup.has(this.trackable)) {\n\t\t\t\ttrackingGroup.unlink(this.trackable);\n\t\t\t}\n\t\t\tthis._trackingGroups.delete(trackingGroup);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpublic copyTo(trackable: Trackable): void {\n\t\tfor (const sg of this._trackingGroups) {\n\t\t\ttrackable.trackingCollection.link(sg);\n\t\t}\n\t}\n\n\tpublic get empty(): boolean {\n\t\treturn this._trackingGroups.size === 0;\n\t}\n\n\tpublic matches(trackingCollection: TrackingGroupCollection): boolean {\n\t\tconst trackingGroups: ReadonlySet<ITrackingGroup> = trackingCollection.trackingGroups;\n\t\tif (this._trackingGroups.size !== trackingGroups.size) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (const tg of this._trackingGroups.values()) {\n\t\t\tif (!trackingGroups.has(tg)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n}\n"]}
|
package/lib/partialLengths.d.ts
CHANGED
|
@@ -207,6 +207,19 @@ export declare class PartialSequenceLengths {
|
|
|
207
207
|
*/
|
|
208
208
|
private lastIncrementalInvalidationSeq;
|
|
209
209
|
update(node: MergeBlock, seq: number, clientId: number, collabWindow: CollaborationWindow): void;
|
|
210
|
+
/**
|
|
211
|
+
* Marks `seq` as requiring full parent rebuilds rather than incremental propagation.
|
|
212
|
+
* Replaces the previous invalidation marker without changing the calculated lengths.
|
|
213
|
+
*/
|
|
214
|
+
invalidateIncrementalPropagation(seq: number): void;
|
|
215
|
+
/**
|
|
216
|
+
* Returns the tracked segment count, independent of visibility at a particular sequence.
|
|
217
|
+
*/
|
|
218
|
+
getSegmentCount(): number;
|
|
219
|
+
/**
|
|
220
|
+
* Returns the baseline length at `minSeq`, before sequence and client adjustments.
|
|
221
|
+
*/
|
|
222
|
+
getBaselineLength(): number;
|
|
210
223
|
/**
|
|
211
224
|
* Returns the length of this block as viewed from the perspective of `clientId` at `refSeq`.
|
|
212
225
|
* This is the total length of all segments sequenced at or before refSeq OR submitted by `clientId`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"partialLengths.d.ts","sourceRoot":"","sources":["../src/partialLengths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACN,KAAK,mBAAmB,EAIxB,KAAK,UAAU,EACf,MAAM,qBAAqB,CAAC;AA+F7B;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACrC;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAoCD,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAC5D,cAAc,CAAC,EAAE,CAChB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,KACb,IAAI,CAAC;IACV,OAAO,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,qBAAa,sBAAsB;IAmFjC;;;OAGG;IACI,MAAM,EAAE,MAAM;IAtFtB,OAAc,OAAO,EAAE,6BAA6B,CAElD;IAEF;;OAEG;IACH,OAAO,CAAC,SAAS,CAAK;IAEtB;;OAEG;IACH,OAAO,CAAC,YAAY,CAAK;IAEzB;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8D;IAE7F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACH,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAmC;IAExE;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,kBAAkB,CAA2C;;IAGpE;;;OAGG;IACI,MAAM,EAAE,MAAM,EACrB,oBAAoB,EAAE,OAAO;IAW9B;;;;;;;;;;;OAWG;WACW,OAAO,CACpB,KAAK,EAAE,UAAU,EACjB,YAAY,EAAE,mBAAmB,EACjC,KAAK,UAAQ,EACb,oBAAoB,UAAQ,GAC1B,sBAAsB;
|
|
1
|
+
{"version":3,"file":"partialLengths.d.ts","sourceRoot":"","sources":["../src/partialLengths.ts"],"names":[],"mappings":"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"}
|
package/lib/partialLengths.js
CHANGED
|
@@ -257,14 +257,13 @@ export class PartialSequenceLengths {
|
|
|
257
257
|
// Some children were leaves; add combined partials from these segments
|
|
258
258
|
childPartials.push(leafPartialLengths);
|
|
259
259
|
}
|
|
260
|
-
const childPartialsLen = childPartials.length;
|
|
261
260
|
const childPartialLengths = [];
|
|
262
261
|
const childUnsequencedPartialLengths = [];
|
|
263
262
|
const childPerRefSeqAdjustments = [];
|
|
264
|
-
for (
|
|
265
|
-
const {
|
|
266
|
-
combinedPartialLengths.segmentCount +=
|
|
267
|
-
combinedPartialLengths.minLength +=
|
|
263
|
+
for (const child of childPartials) {
|
|
264
|
+
const { partialLengths, unsequencedRecords } = child;
|
|
265
|
+
combinedPartialLengths.segmentCount += child.getSegmentCount();
|
|
266
|
+
combinedPartialLengths.minLength += child.getBaselineLength();
|
|
268
267
|
childPartialLengths.push(partialLengths.items);
|
|
269
268
|
if (unsequencedRecords) {
|
|
270
269
|
childUnsequencedPartialLengths.push(unsequencedRecords.partialLengths.items);
|
|
@@ -292,8 +291,7 @@ export class PartialSequenceLengths {
|
|
|
292
291
|
}
|
|
293
292
|
}
|
|
294
293
|
// could merge these like we do above rather than do out of order like this
|
|
295
|
-
for (
|
|
296
|
-
const { perClientAdjustments } = childPartials[i];
|
|
294
|
+
for (const { perClientAdjustments } of childPartials) {
|
|
297
295
|
if (perClientAdjustments.length > 0) {
|
|
298
296
|
for (let clientId = 0; clientId < perClientAdjustments.length; clientId++) {
|
|
299
297
|
const clientAdjustment = perClientAdjustments[clientId];
|
|
@@ -688,7 +686,7 @@ export class PartialSequenceLengths {
|
|
|
688
686
|
if (branchPartialLengths.lastIncrementalInvalidationSeq === seq) {
|
|
689
687
|
// Bail out.
|
|
690
688
|
const newPartials = PartialSequenceLengths.combine(node, collabWindow, false);
|
|
691
|
-
newPartials.
|
|
689
|
+
newPartials.invalidateIncrementalPropagation(seq);
|
|
692
690
|
node.partialLengths = newPartials;
|
|
693
691
|
return;
|
|
694
692
|
}
|
|
@@ -698,7 +696,7 @@ export class PartialSequenceLengths {
|
|
|
698
696
|
if (leqPartial && leqPartial.seq === seq) {
|
|
699
697
|
seqSeglen += leqPartial.seglen;
|
|
700
698
|
}
|
|
701
|
-
segCount += branchPartialLengths.
|
|
699
|
+
segCount += branchPartialLengths.getSegmentCount();
|
|
702
700
|
// .forEach natively ignores undefined entries.
|
|
703
701
|
// eslint-disable-next-line unicorn/no-array-for-each
|
|
704
702
|
branchPartialLengths.perClientAdjustments.forEach((clientAdjustments) => {
|
|
@@ -711,7 +709,7 @@ export class PartialSequenceLengths {
|
|
|
711
709
|
}
|
|
712
710
|
}
|
|
713
711
|
if (failIncrementalPropagation) {
|
|
714
|
-
this.
|
|
712
|
+
this.invalidateIncrementalPropagation(seq);
|
|
715
713
|
}
|
|
716
714
|
this.segmentCount = segCount;
|
|
717
715
|
this.unsequencedRecords = undefined;
|
|
@@ -721,6 +719,25 @@ export class PartialSequenceLengths {
|
|
|
721
719
|
}
|
|
722
720
|
PartialSequenceLengths.options.verifier?.(this);
|
|
723
721
|
}
|
|
722
|
+
/**
|
|
723
|
+
* Marks `seq` as requiring full parent rebuilds rather than incremental propagation.
|
|
724
|
+
* Replaces the previous invalidation marker without changing the calculated lengths.
|
|
725
|
+
*/
|
|
726
|
+
invalidateIncrementalPropagation(seq) {
|
|
727
|
+
this.lastIncrementalInvalidationSeq = seq;
|
|
728
|
+
}
|
|
729
|
+
/**
|
|
730
|
+
* Returns the tracked segment count, independent of visibility at a particular sequence.
|
|
731
|
+
*/
|
|
732
|
+
getSegmentCount() {
|
|
733
|
+
return this.segmentCount;
|
|
734
|
+
}
|
|
735
|
+
/**
|
|
736
|
+
* Returns the baseline length at `minSeq`, before sequence and client adjustments.
|
|
737
|
+
*/
|
|
738
|
+
getBaselineLength() {
|
|
739
|
+
return this.minLength;
|
|
740
|
+
}
|
|
724
741
|
/**
|
|
725
742
|
* Returns the length of this block as viewed from the perspective of `clientId` at `refSeq`.
|
|
726
743
|
* This is the total length of all segments sequenced at or before refSeq OR submitted by `clientId`.
|
|
@@ -915,7 +932,7 @@ export function verifyExpectedPartialLengths(mergeTree, node, refSeq, clientId,
|
|
|
915
932
|
continue;
|
|
916
933
|
}
|
|
917
934
|
if (thisNode.isLeaf()) {
|
|
918
|
-
expected += mergeTree
|
|
935
|
+
expected += mergeTree.leafLength(thisNode, perspective) ?? 0;
|
|
919
936
|
}
|
|
920
937
|
else {
|
|
921
938
|
nodesToVisit.push(...thisNode.children.slice(0, thisNode.childCount));
|