@fluid-experimental/tree 1.0.0 → 1.1.0-76254
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/dist/EditLog.d.ts.map +1 -1
- package/dist/EditLog.js +4 -7
- package/dist/EditLog.js.map +1 -1
- package/dist/LogViewer.d.ts.map +1 -1
- package/dist/LogViewer.js +1 -7
- package/dist/LogViewer.js.map +1 -1
- package/dist/SharedTree.d.ts.map +1 -1
- package/dist/SharedTree.js +12 -12
- package/dist/SharedTree.js.map +1 -1
- package/dist/SharedTreeEncoder.d.ts.map +1 -1
- package/dist/SharedTreeEncoder.js +6 -12
- package/dist/SharedTreeEncoder.js.map +1 -1
- package/dist/TransactionInternal.d.ts.map +1 -1
- package/dist/TransactionInternal.js +4 -7
- package/dist/TransactionInternal.js.map +1 -1
- package/dist/id-compressor/IdCompressor.d.ts +3 -1
- package/dist/id-compressor/IdCompressor.d.ts.map +1 -1
- package/dist/id-compressor/IdCompressor.js +45 -17
- package/dist/id-compressor/IdCompressor.js.map +1 -1
- package/lib/EditLog.d.ts.map +1 -1
- package/lib/EditLog.js +4 -7
- package/lib/EditLog.js.map +1 -1
- package/lib/LogViewer.d.ts.map +1 -1
- package/lib/LogViewer.js +1 -7
- package/lib/LogViewer.js.map +1 -1
- package/lib/SharedTree.d.ts.map +1 -1
- package/lib/SharedTree.js +12 -12
- package/lib/SharedTree.js.map +1 -1
- package/lib/SharedTreeEncoder.d.ts.map +1 -1
- package/lib/SharedTreeEncoder.js +6 -12
- package/lib/SharedTreeEncoder.js.map +1 -1
- package/lib/TransactionInternal.d.ts.map +1 -1
- package/lib/TransactionInternal.js +4 -7
- package/lib/TransactionInternal.js.map +1 -1
- package/lib/id-compressor/IdCompressor.d.ts +3 -1
- package/lib/id-compressor/IdCompressor.d.ts.map +1 -1
- package/lib/id-compressor/IdCompressor.js +45 -17
- package/lib/id-compressor/IdCompressor.js.map +1 -1
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.js +1 -1
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.js.map +1 -1
- package/lib/test/SessionIdNormalizer.tests.js +4 -6
- package/lib/test/SessionIdNormalizer.tests.js.map +1 -1
- package/lib/test/Summary.tests.js +3 -6
- package/lib/test/Summary.tests.js.map +1 -1
- package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
- package/lib/test/utilities/SharedTreeTests.js +33 -11
- package/lib/test/utilities/SharedTreeTests.js.map +1 -1
- package/lib/test/utilities/TestNode.d.ts.map +1 -1
- package/lib/test/utilities/TestNode.js +2 -12
- package/lib/test/utilities/TestNode.js.map +1 -1
- package/package.json +18 -18
- package/src/EditLog.ts +21 -23
- package/src/LogViewer.ts +1 -6
- package/src/SharedTree.ts +17 -16
- package/src/SharedTreeEncoder.ts +6 -17
- package/src/TransactionInternal.ts +11 -13
- package/src/id-compressor/IdCompressor.ts +46 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestNode.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/TestNode.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"TestNode.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/TestNode.ts"],"names":[],"mappings":"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"}
|
|
@@ -118,12 +118,7 @@ export class SimpleTestTree {
|
|
|
118
118
|
return convertTreeNodes(this, (node) => convertNodeDataIds(node, identity));
|
|
119
119
|
}
|
|
120
120
|
buildLeaf(id, payload) {
|
|
121
|
-
|
|
122
|
-
return buildLeaf(undefined, payload);
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
return buildLeaf(id, payload);
|
|
126
|
-
}
|
|
121
|
+
return id === undefined ? buildLeaf(undefined, payload) : buildLeaf(id, payload);
|
|
127
122
|
}
|
|
128
123
|
buildLeafInternal(id, payload) {
|
|
129
124
|
return buildLeafInternal(this, id, payload);
|
|
@@ -206,12 +201,7 @@ export class RefreshingTestTree {
|
|
|
206
201
|
return convertTreeNodes(this.testTree, (node) => convertNodeDataIds(node, identity));
|
|
207
202
|
}
|
|
208
203
|
buildLeaf(id, payload) {
|
|
209
|
-
|
|
210
|
-
return this.testTree.buildLeaf(undefined, payload);
|
|
211
|
-
}
|
|
212
|
-
else {
|
|
213
|
-
return this.testTree.buildLeaf(id, payload);
|
|
214
|
-
}
|
|
204
|
+
return id === undefined ? this.testTree.buildLeaf(undefined, payload) : this.testTree.buildLeaf(id, payload);
|
|
215
205
|
}
|
|
216
206
|
buildLeafInternal(id, payload) {
|
|
217
207
|
return this.testTree.buildLeafInternal(id, payload);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestNode.js","sourceRoot":"","sources":["../../../src/test/utilities/TestNode.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 { BuildTreeNode } from '../../ChangeTypes';\nimport { memoizeGetter, fail, setPropertyIfDefined, identity } from '../../Common';\nimport { convertTreeNodes } from '../../EditUtilities';\nimport { convertNodeDataIds } from '../../IdConversion';\nimport { Definition, NodeId, OpSpaceNodeId, SessionId, StableNodeId, TraitLabel } from '../../Identifiers';\nimport { initialTree } from '../../InitialTree';\nimport { NodeIdContext, NodeIdConverter, NodeIdNormalizer } from '../../NodeIdUtilities';\nimport {\n\tBuildNodeInternal,\n\tChangeNode,\n\tPayload,\n\tTraitLocationInternal,\n\tTraitLocationInternal_0_0_2,\n\tTraitMap,\n\tTreeNode,\n} from '../../persisted-types';\nimport { RevisionView } from '../../RevisionView';\nimport { TraitLocation } from '../../TreeView';\n\n/** A legacy format of a `TestNode` */\nexport type TestNode_0_0_2 = TreeNode<TestNode_0_0_2, StableNodeId>;\n\n/**\n * A node with no children\n */\nexport type LeafNode<T> = Omit<T, 'traits'> & { traits: Record<string, never> };\n\n/**\n * Test extension of {@link TraitLocation} which can be converted to stable or legacy formats\n */\nexport interface TestTraitLocation extends TraitLocation {\n\tstable: TraitLocationInternal_0_0_2;\n\t/** Translate this location into the equivalent location in another ID context */\n\ttranslate(idConverter: NodeIdConverter): TestTraitLocation;\n}\n\n/**\n * An object containing useful properties for analyzing a node within a test context.\n */\nexport interface TestNode extends TreeNode<TestNode, NodeId> {\n\t/** The label of the trait under which this node resides */\n\ttraitLabel: TraitLabel;\n\t/** The trait location at which this node resides */\n\ttraitLocation: TestTraitLocation;\n\t/** A revision view of this node */\n\tview: RevisionView;\n\t/** A version of this tree with stable IDs */\n\tstable: TestNode_0_0_2;\n\t/** Translate this node's ID into the equivalent ID in another ID context */\n\ttranslateId(idConverter: NodeIdConverter): NodeId;\n\t/** Express this tree as a ChangeNode */\n\ttoChangeNode(): ChangeNode;\n}\n\n/**\n * A small tree of `TestNode`s consisting of a root/parent node, a \"left\" child and a \"right\" child. This is a useful tree for initializing\n * tests as it makes it ergonomic to retrieve various properties of the tree. Note that it only represents the initial state of the tree,\n * it does not update even if the SharedTree that it was the initial state for is mutated.\n */\nexport interface TestTree extends TestNode, NodeIdContext, NodeIdNormalizer<OpSpaceNodeId> {\n\t/** The left child node */\n\tleft: TestNode;\n\t/** The right child node */\n\tright: TestNode;\n\t/** Create an arbitrary unparented node with the given payload, if specified */\n\tbuildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\t/** Create an arbitrary unparented node with the given identifier and payload, if specified */\n\tbuildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\t/**\n\t * Generates a leaf node for use in internal build changes.\n\t * If no `id` is explicitly provided, one will be generated.\n\t * @param id - Explicit ID to use as the new node's identifier. If not provided, one will be generated.\n\t */\n\tbuildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>>;\n}\n\n/**\n * A TestTree for general use within the shared-tree package. The nodes in every `SimpleTestTree` will have unique identifiers - i.e. two\n * different instances of `SimpleTestTree` are never equivalent.\n */\nexport class SimpleTestTree implements TestTree {\n\tpublic static readonly definition = 'node' as Definition;\n\tpublic static readonly traitLabel = 'e276f382-fa99-49a1-ae81-42001791c733' as TraitLabel;\n\tpublic static readonly leftTraitLabel = 'left' as TraitLabel;\n\tpublic static readonly rightTraitLabel = 'right' as TraitLabel;\n\n\tprivate readonly root: TestNode;\n\tpublic readonly left: TestNode;\n\tpublic readonly right: TestNode;\n\tpublic readonly expensiveValidation;\n\n\tpublic constructor(\n\t\tprivate readonly nodeIdContext: NodeIdContext,\n\t\tprivate readonly nodeIdNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\texpensiveValidation = true\n\t) {\n\t\tconst leftIdentifier = nodeIdContext.generateNodeId();\n\t\tconst rightIdentifier = nodeIdContext.generateNodeId();\n\t\tconst rootIdentifier = nodeIdContext.generateNodeId();\n\t\tthis.expensiveValidation = expensiveValidation;\n\t\tthis.left = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: leftIdentifier,\n\t\t\ttraits: {},\n\t\t\ttraitLabel: SimpleTestTree.leftTraitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tparent: rootIdentifier,\n\t\t\t\tlabel: SimpleTestTree.leftTraitLabel,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.leftTraitLabel, rootIdentifier, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(leftIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.left, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t\tthis.right = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: rightIdentifier,\n\t\t\ttraits: {},\n\t\t\ttraitLabel: SimpleTestTree.rightTraitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tparent: rootIdentifier,\n\t\t\t\tlabel: SimpleTestTree.rightTraitLabel,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.rightTraitLabel, rootIdentifier, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(rightIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.right, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t\tconst rootParent = nodeIdContext.convertToNodeId(initialTree.identifier);\n\t\tthis.root = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: rootIdentifier,\n\t\t\ttraits: {\n\t\t\t\t[SimpleTestTree.leftTraitLabel]: [this.left],\n\t\t\t\t[SimpleTestTree.rightTraitLabel]: [this.right],\n\t\t\t},\n\t\t\ttraitLabel: SimpleTestTree.traitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tlabel: SimpleTestTree.traitLabel,\n\t\t\t\tparent: rootParent,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.traitLabel, rootParent, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(rootIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.root, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t}\n\n\tpublic get definition(): Definition {\n\t\treturn this.root.definition;\n\t}\n\n\tpublic get identifier(): NodeId {\n\t\treturn this.root.identifier;\n\t}\n\n\tpublic get traits(): TraitMap<TestNode> {\n\t\treturn this.root.traits;\n\t}\n\n\tpublic get traitLabel(): TraitLabel {\n\t\treturn this.root.traitLabel;\n\t}\n\n\tpublic get traitLocation(): TestTraitLocation {\n\t\treturn this.root.traitLocation;\n\t}\n\n\tpublic get view(): RevisionView {\n\t\treturn this.root.view;\n\t}\n\n\tpublic get stable() {\n\t\treturn this.root.stable;\n\t}\n\n\tpublic translateId(idConverter: NodeIdConverter): NodeId {\n\t\treturn this.root.translateId(idConverter);\n\t}\n\n\tpublic toChangeNode(): ChangeNode {\n\t\treturn convertTreeNodes<ChangeNode, ChangeNode>(this, (node) => convertNodeDataIds(node, identity));\n\t}\n\n\tpublic buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\n\tpublic buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\n\tpublic buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\t\tif (id === undefined) {\n\t\t\treturn buildLeaf(undefined, payload);\n\t\t} else {\n\t\t\treturn buildLeaf(id, payload);\n\t\t}\n\t}\n\n\tpublic buildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\t\treturn buildLeafInternal(this, id, payload);\n\t}\n\n\tpublic generateNodeId(override?: string): NodeId {\n\t\treturn this.nodeIdContext.generateNodeId(override);\n\t}\n\n\tpublic convertToStableNodeId(id: NodeId): StableNodeId {\n\t\treturn this.nodeIdContext.convertToStableNodeId(id);\n\t}\n\n\tpublic tryConvertToStableNodeId(id: NodeId): StableNodeId | undefined {\n\t\treturn this.nodeIdContext.tryConvertToStableNodeId(id);\n\t}\n\n\tpublic convertToNodeId(id: StableNodeId): NodeId {\n\t\treturn this.nodeIdContext.convertToNodeId(id);\n\t}\n\n\tpublic tryConvertToNodeId(id: StableNodeId): NodeId | undefined {\n\t\treturn this.nodeIdContext.tryConvertToNodeId(id);\n\t}\n\n\tget localSessionId(): SessionId {\n\t\treturn this.nodeIdNormalizer.localSessionId;\n\t}\n\n\tnormalizeToOpSpace(id: NodeId): OpSpaceNodeId {\n\t\treturn this.nodeIdNormalizer.normalizeToOpSpace(id);\n\t}\n\tnormalizeToSessionSpace(id: OpSpaceNodeId, sessionId: SessionId): NodeId {\n\t\treturn this.nodeIdNormalizer.normalizeToSessionSpace(id, sessionId);\n\t}\n}\n\n/** A TestTree which resets before each test */\nexport class RefreshingTestTree<T extends TestTree> implements TestTree {\n\tprivate _testTree?: T;\n\n\tpublic constructor(createTestTree: () => T, fn?: (testTree: T) => void) {\n\t\tbeforeEach(() => {\n\t\t\tthis._testTree = createTestTree();\n\t\t\tfn?.(this._testTree);\n\t\t});\n\t\tafterEach(() => {\n\t\t\tthis._testTree = undefined;\n\t\t});\n\t}\n\n\tprivate get testTree(): T {\n\t\treturn (\n\t\t\tthis._testTree ??\n\t\t\tfail(\n\t\t\t\t'RefreshingTestTree should be created within a describe() block and should only be read within it() blocks'\n\t\t\t)\n\t\t);\n\t}\n\n\tpublic get left(): TestNode {\n\t\treturn this.testTree.left;\n\t}\n\n\tpublic get right(): TestNode {\n\t\treturn this.testTree.right;\n\t}\n\n\tpublic get definition(): Definition {\n\t\treturn this.testTree.definition;\n\t}\n\n\tpublic get identifier(): NodeId {\n\t\treturn this.testTree.identifier;\n\t}\n\n\tpublic get traits(): TraitMap<TestNode> {\n\t\treturn this.testTree.traits;\n\t}\n\n\tpublic get traitLabel(): TraitLabel {\n\t\treturn this.testTree.traitLabel;\n\t}\n\n\tpublic get traitLocation(): TestTraitLocation {\n\t\treturn this.testTree.traitLocation;\n\t}\n\n\tpublic get view(): RevisionView {\n\t\treturn this.testTree.view;\n\t}\n\n\tpublic get stable(): TestNode_0_0_2 {\n\t\treturn this.testTree.stable;\n\t}\n\n\tpublic translateId(idConverter: NodeIdConverter): NodeId {\n\t\treturn this.testTree.translateId(idConverter);\n\t}\n\n\tpublic toChangeNode(): ChangeNode {\n\t\treturn convertTreeNodes<ChangeNode, ChangeNode>(this.testTree, (node) => convertNodeDataIds(node, identity));\n\t}\n\n\tpublic buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\tpublic buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\tpublic buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\t\tif (id === undefined) {\n\t\t\treturn this.testTree.buildLeaf(undefined, payload);\n\t\t} else {\n\t\t\treturn this.testTree.buildLeaf(id, payload);\n\t\t}\n\t}\n\n\tpublic buildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\t\treturn this.testTree.buildLeafInternal(id, payload);\n\t}\n\n\tpublic generateNodeId(override?: string): NodeId {\n\t\treturn this.testTree.generateNodeId(override);\n\t}\n\n\tconvertToStableNodeId(id: NodeId): StableNodeId {\n\t\treturn this.testTree.convertToStableNodeId(id);\n\t}\n\n\ttryConvertToStableNodeId(id: NodeId): StableNodeId | undefined {\n\t\treturn this.testTree.convertToStableNodeId(id);\n\t}\n\n\tconvertToNodeId(id: StableNodeId): NodeId {\n\t\treturn this.testTree.convertToNodeId(id);\n\t}\n\n\ttryConvertToNodeId(id: StableNodeId): NodeId | undefined {\n\t\treturn this.testTree.tryConvertToNodeId(id);\n\t}\n\n\tget localSessionId(): SessionId {\n\t\treturn this.testTree.localSessionId;\n\t}\n\n\tnormalizeToOpSpace(id: NodeId): OpSpaceNodeId {\n\t\treturn this.testTree.normalizeToOpSpace(id);\n\t}\n\n\tnormalizeToSessionSpace(id: OpSpaceNodeId, sessionId: SessionId): NodeId {\n\t\treturn this.testTree.normalizeToSessionSpace(id, sessionId);\n\t}\n}\n\n/** Create a new node with an automatically generated ID and the given payload */\nexport function buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n/** Create a new node with the given ID and payload */\nexport function buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n/** Create a new node with the given ID and payload */\nexport function buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\tconst node: LeafNode<BuildTreeNode> = {\n\t\tdefinition: SimpleTestTree.definition,\n\t\ttraits: {},\n\t};\n\tsetPropertyIfDefined(id, node, 'identifier');\n\tsetPropertyIfDefined(payload, node, 'payload');\n\treturn node;\n}\n\n/**\n * Generates a leaf {@link ChangeNode}.\n * If no `id` is explicitly provided, one will be generated.\n * @param id - Explicit ID to use as the new node's identifier. If not provided, one will be generated.\n */\nexport function buildLeafInternal(\n\tnodeIdContext: NodeIdContext,\n\tid?: NodeId,\n\tpayload?: Payload\n): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\tconst leaf = buildLeaf(undefined, payload);\n\treturn {\n\t\tdefinition: leaf.definition as Definition,\n\t\tidentifier: id ?? nodeIdContext.generateNodeId(),\n\t\ttraits: {},\n\t};\n}\n\n/** Translate an ID in one context to an ID in another */\nfunction translateId(id: NodeId, from: NodeIdConverter, to: NodeIdConverter): NodeId {\n\treturn to.convertToNodeId(from.convertToStableNodeId(id));\n}\n\nfunction translateTraitLocation(\n\tlabel: TraitLabel,\n\tparentId: NodeId,\n\tfrom: NodeIdConverter,\n\tto: NodeIdConverter\n): TestTraitLocation {\n\treturn {\n\t\tlabel,\n\t\tparent: translateId(parentId, from, to),\n\t\tget stable() {\n\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, to));\n\t\t},\n\t\ttranslate: (idManager) => translateTraitLocation(label, parentId, to, idManager),\n\t};\n}\n\nfunction convertToTestNode_0_0_2(node: TestNode, idConverter: NodeIdConverter): TestNode_0_0_2 {\n\t// This is equivalent to calling tryConvertToChangeNode_0_0_2 but that causes lint to stack overflow\n\treturn convertTreeNodes<TestNode, TestNode_0_0_2>(node, (nodeData) =>\n\t\tconvertNodeDataIds(nodeData, (id) => idConverter.convertToStableNodeId(id))\n\t);\n}\n\nfunction convertToTraitLocation_0_0_2(\n\ttraitLocation: TraitLocationInternal,\n\tidConverter: NodeIdConverter\n): TraitLocationInternal_0_0_2 {\n\tconst parent = idConverter.convertToStableNodeId(traitLocation.parent);\n\treturn {\n\t\tlabel: traitLocation.label,\n\t\tparent,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TestNode.js","sourceRoot":"","sources":["../../../src/test/utilities/TestNode.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 { BuildTreeNode } from '../../ChangeTypes';\nimport { memoizeGetter, fail, setPropertyIfDefined, identity } from '../../Common';\nimport { convertTreeNodes } from '../../EditUtilities';\nimport { convertNodeDataIds } from '../../IdConversion';\nimport { Definition, NodeId, OpSpaceNodeId, SessionId, StableNodeId, TraitLabel } from '../../Identifiers';\nimport { initialTree } from '../../InitialTree';\nimport { NodeIdContext, NodeIdConverter, NodeIdNormalizer } from '../../NodeIdUtilities';\nimport {\n\tBuildNodeInternal,\n\tChangeNode,\n\tPayload,\n\tTraitLocationInternal,\n\tTraitLocationInternal_0_0_2,\n\tTraitMap,\n\tTreeNode,\n} from '../../persisted-types';\nimport { RevisionView } from '../../RevisionView';\nimport { TraitLocation } from '../../TreeView';\n\n/** A legacy format of a `TestNode` */\nexport type TestNode_0_0_2 = TreeNode<TestNode_0_0_2, StableNodeId>;\n\n/**\n * A node with no children\n */\nexport type LeafNode<T> = Omit<T, 'traits'> & { traits: Record<string, never> };\n\n/**\n * Test extension of {@link TraitLocation} which can be converted to stable or legacy formats\n */\nexport interface TestTraitLocation extends TraitLocation {\n\tstable: TraitLocationInternal_0_0_2;\n\t/** Translate this location into the equivalent location in another ID context */\n\ttranslate(idConverter: NodeIdConverter): TestTraitLocation;\n}\n\n/**\n * An object containing useful properties for analyzing a node within a test context.\n */\nexport interface TestNode extends TreeNode<TestNode, NodeId> {\n\t/** The label of the trait under which this node resides */\n\ttraitLabel: TraitLabel;\n\t/** The trait location at which this node resides */\n\ttraitLocation: TestTraitLocation;\n\t/** A revision view of this node */\n\tview: RevisionView;\n\t/** A version of this tree with stable IDs */\n\tstable: TestNode_0_0_2;\n\t/** Translate this node's ID into the equivalent ID in another ID context */\n\ttranslateId(idConverter: NodeIdConverter): NodeId;\n\t/** Express this tree as a ChangeNode */\n\ttoChangeNode(): ChangeNode;\n}\n\n/**\n * A small tree of `TestNode`s consisting of a root/parent node, a \"left\" child and a \"right\" child. This is a useful tree for initializing\n * tests as it makes it ergonomic to retrieve various properties of the tree. Note that it only represents the initial state of the tree,\n * it does not update even if the SharedTree that it was the initial state for is mutated.\n */\nexport interface TestTree extends TestNode, NodeIdContext, NodeIdNormalizer<OpSpaceNodeId> {\n\t/** The left child node */\n\tleft: TestNode;\n\t/** The right child node */\n\tright: TestNode;\n\t/** Create an arbitrary unparented node with the given payload, if specified */\n\tbuildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\t/** Create an arbitrary unparented node with the given identifier and payload, if specified */\n\tbuildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\t/**\n\t * Generates a leaf node for use in internal build changes.\n\t * If no `id` is explicitly provided, one will be generated.\n\t * @param id - Explicit ID to use as the new node's identifier. If not provided, one will be generated.\n\t */\n\tbuildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>>;\n}\n\n/**\n * A TestTree for general use within the shared-tree package. The nodes in every `SimpleTestTree` will have unique identifiers - i.e. two\n * different instances of `SimpleTestTree` are never equivalent.\n */\nexport class SimpleTestTree implements TestTree {\n\tpublic static readonly definition = 'node' as Definition;\n\tpublic static readonly traitLabel = 'e276f382-fa99-49a1-ae81-42001791c733' as TraitLabel;\n\tpublic static readonly leftTraitLabel = 'left' as TraitLabel;\n\tpublic static readonly rightTraitLabel = 'right' as TraitLabel;\n\n\tprivate readonly root: TestNode;\n\tpublic readonly left: TestNode;\n\tpublic readonly right: TestNode;\n\tpublic readonly expensiveValidation;\n\n\tpublic constructor(\n\t\tprivate readonly nodeIdContext: NodeIdContext,\n\t\tprivate readonly nodeIdNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\texpensiveValidation = true\n\t) {\n\t\tconst leftIdentifier = nodeIdContext.generateNodeId();\n\t\tconst rightIdentifier = nodeIdContext.generateNodeId();\n\t\tconst rootIdentifier = nodeIdContext.generateNodeId();\n\t\tthis.expensiveValidation = expensiveValidation;\n\t\tthis.left = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: leftIdentifier,\n\t\t\ttraits: {},\n\t\t\ttraitLabel: SimpleTestTree.leftTraitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tparent: rootIdentifier,\n\t\t\t\tlabel: SimpleTestTree.leftTraitLabel,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.leftTraitLabel, rootIdentifier, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(leftIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.left, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t\tthis.right = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: rightIdentifier,\n\t\t\ttraits: {},\n\t\t\ttraitLabel: SimpleTestTree.rightTraitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tparent: rootIdentifier,\n\t\t\t\tlabel: SimpleTestTree.rightTraitLabel,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.rightTraitLabel, rootIdentifier, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(rightIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.right, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t\tconst rootParent = nodeIdContext.convertToNodeId(initialTree.identifier);\n\t\tthis.root = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: rootIdentifier,\n\t\t\ttraits: {\n\t\t\t\t[SimpleTestTree.leftTraitLabel]: [this.left],\n\t\t\t\t[SimpleTestTree.rightTraitLabel]: [this.right],\n\t\t\t},\n\t\t\ttraitLabel: SimpleTestTree.traitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tlabel: SimpleTestTree.traitLabel,\n\t\t\t\tparent: rootParent,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.traitLabel, rootParent, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(rootIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.root, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t}\n\n\tpublic get definition(): Definition {\n\t\treturn this.root.definition;\n\t}\n\n\tpublic get identifier(): NodeId {\n\t\treturn this.root.identifier;\n\t}\n\n\tpublic get traits(): TraitMap<TestNode> {\n\t\treturn this.root.traits;\n\t}\n\n\tpublic get traitLabel(): TraitLabel {\n\t\treturn this.root.traitLabel;\n\t}\n\n\tpublic get traitLocation(): TestTraitLocation {\n\t\treturn this.root.traitLocation;\n\t}\n\n\tpublic get view(): RevisionView {\n\t\treturn this.root.view;\n\t}\n\n\tpublic get stable() {\n\t\treturn this.root.stable;\n\t}\n\n\tpublic translateId(idConverter: NodeIdConverter): NodeId {\n\t\treturn this.root.translateId(idConverter);\n\t}\n\n\tpublic toChangeNode(): ChangeNode {\n\t\treturn convertTreeNodes<ChangeNode, ChangeNode>(this, (node) => convertNodeDataIds(node, identity));\n\t}\n\n\tpublic buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\n\tpublic buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\n\tpublic buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\t\treturn id === undefined ? buildLeaf(undefined, payload) : buildLeaf(id, payload);\n\t}\n\n\tpublic buildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\t\treturn buildLeafInternal(this, id, payload);\n\t}\n\n\tpublic generateNodeId(override?: string): NodeId {\n\t\treturn this.nodeIdContext.generateNodeId(override);\n\t}\n\n\tpublic convertToStableNodeId(id: NodeId): StableNodeId {\n\t\treturn this.nodeIdContext.convertToStableNodeId(id);\n\t}\n\n\tpublic tryConvertToStableNodeId(id: NodeId): StableNodeId | undefined {\n\t\treturn this.nodeIdContext.tryConvertToStableNodeId(id);\n\t}\n\n\tpublic convertToNodeId(id: StableNodeId): NodeId {\n\t\treturn this.nodeIdContext.convertToNodeId(id);\n\t}\n\n\tpublic tryConvertToNodeId(id: StableNodeId): NodeId | undefined {\n\t\treturn this.nodeIdContext.tryConvertToNodeId(id);\n\t}\n\n\tget localSessionId(): SessionId {\n\t\treturn this.nodeIdNormalizer.localSessionId;\n\t}\n\n\tnormalizeToOpSpace(id: NodeId): OpSpaceNodeId {\n\t\treturn this.nodeIdNormalizer.normalizeToOpSpace(id);\n\t}\n\tnormalizeToSessionSpace(id: OpSpaceNodeId, sessionId: SessionId): NodeId {\n\t\treturn this.nodeIdNormalizer.normalizeToSessionSpace(id, sessionId);\n\t}\n}\n\n/** A TestTree which resets before each test */\nexport class RefreshingTestTree<T extends TestTree> implements TestTree {\n\tprivate _testTree?: T;\n\n\tpublic constructor(createTestTree: () => T, fn?: (testTree: T) => void) {\n\t\tbeforeEach(() => {\n\t\t\tthis._testTree = createTestTree();\n\t\t\tfn?.(this._testTree);\n\t\t});\n\t\tafterEach(() => {\n\t\t\tthis._testTree = undefined;\n\t\t});\n\t}\n\n\tprivate get testTree(): T {\n\t\treturn (\n\t\t\tthis._testTree ??\n\t\t\tfail(\n\t\t\t\t'RefreshingTestTree should be created within a describe() block and should only be read within it() blocks'\n\t\t\t)\n\t\t);\n\t}\n\n\tpublic get left(): TestNode {\n\t\treturn this.testTree.left;\n\t}\n\n\tpublic get right(): TestNode {\n\t\treturn this.testTree.right;\n\t}\n\n\tpublic get definition(): Definition {\n\t\treturn this.testTree.definition;\n\t}\n\n\tpublic get identifier(): NodeId {\n\t\treturn this.testTree.identifier;\n\t}\n\n\tpublic get traits(): TraitMap<TestNode> {\n\t\treturn this.testTree.traits;\n\t}\n\n\tpublic get traitLabel(): TraitLabel {\n\t\treturn this.testTree.traitLabel;\n\t}\n\n\tpublic get traitLocation(): TestTraitLocation {\n\t\treturn this.testTree.traitLocation;\n\t}\n\n\tpublic get view(): RevisionView {\n\t\treturn this.testTree.view;\n\t}\n\n\tpublic get stable(): TestNode_0_0_2 {\n\t\treturn this.testTree.stable;\n\t}\n\n\tpublic translateId(idConverter: NodeIdConverter): NodeId {\n\t\treturn this.testTree.translateId(idConverter);\n\t}\n\n\tpublic toChangeNode(): ChangeNode {\n\t\treturn convertTreeNodes<ChangeNode, ChangeNode>(this.testTree, (node) => convertNodeDataIds(node, identity));\n\t}\n\n\tpublic buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\tpublic buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\tpublic buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\t\treturn id === undefined ? this.testTree.buildLeaf(undefined, payload) : this.testTree.buildLeaf(id, payload);\n\t}\n\n\tpublic buildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\t\treturn this.testTree.buildLeafInternal(id, payload);\n\t}\n\n\tpublic generateNodeId(override?: string): NodeId {\n\t\treturn this.testTree.generateNodeId(override);\n\t}\n\n\tconvertToStableNodeId(id: NodeId): StableNodeId {\n\t\treturn this.testTree.convertToStableNodeId(id);\n\t}\n\n\ttryConvertToStableNodeId(id: NodeId): StableNodeId | undefined {\n\t\treturn this.testTree.convertToStableNodeId(id);\n\t}\n\n\tconvertToNodeId(id: StableNodeId): NodeId {\n\t\treturn this.testTree.convertToNodeId(id);\n\t}\n\n\ttryConvertToNodeId(id: StableNodeId): NodeId | undefined {\n\t\treturn this.testTree.tryConvertToNodeId(id);\n\t}\n\n\tget localSessionId(): SessionId {\n\t\treturn this.testTree.localSessionId;\n\t}\n\n\tnormalizeToOpSpace(id: NodeId): OpSpaceNodeId {\n\t\treturn this.testTree.normalizeToOpSpace(id);\n\t}\n\n\tnormalizeToSessionSpace(id: OpSpaceNodeId, sessionId: SessionId): NodeId {\n\t\treturn this.testTree.normalizeToSessionSpace(id, sessionId);\n\t}\n}\n\n/** Create a new node with an automatically generated ID and the given payload */\nexport function buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n/** Create a new node with the given ID and payload */\nexport function buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n/** Create a new node with the given ID and payload */\nexport function buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\tconst node: LeafNode<BuildTreeNode> = {\n\t\tdefinition: SimpleTestTree.definition,\n\t\ttraits: {},\n\t};\n\tsetPropertyIfDefined(id, node, 'identifier');\n\tsetPropertyIfDefined(payload, node, 'payload');\n\treturn node;\n}\n\n/**\n * Generates a leaf {@link ChangeNode}.\n * If no `id` is explicitly provided, one will be generated.\n * @param id - Explicit ID to use as the new node's identifier. If not provided, one will be generated.\n */\nexport function buildLeafInternal(\n\tnodeIdContext: NodeIdContext,\n\tid?: NodeId,\n\tpayload?: Payload\n): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\tconst leaf = buildLeaf(undefined, payload);\n\treturn {\n\t\tdefinition: leaf.definition as Definition,\n\t\tidentifier: id ?? nodeIdContext.generateNodeId(),\n\t\ttraits: {},\n\t};\n}\n\n/** Translate an ID in one context to an ID in another */\nfunction translateId(id: NodeId, from: NodeIdConverter, to: NodeIdConverter): NodeId {\n\treturn to.convertToNodeId(from.convertToStableNodeId(id));\n}\n\nfunction translateTraitLocation(\n\tlabel: TraitLabel,\n\tparentId: NodeId,\n\tfrom: NodeIdConverter,\n\tto: NodeIdConverter\n): TestTraitLocation {\n\treturn {\n\t\tlabel,\n\t\tparent: translateId(parentId, from, to),\n\t\tget stable() {\n\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, to));\n\t\t},\n\t\ttranslate: (idManager) => translateTraitLocation(label, parentId, to, idManager),\n\t};\n}\n\nfunction convertToTestNode_0_0_2(node: TestNode, idConverter: NodeIdConverter): TestNode_0_0_2 {\n\t// This is equivalent to calling tryConvertToChangeNode_0_0_2 but that causes lint to stack overflow\n\treturn convertTreeNodes<TestNode, TestNode_0_0_2>(node, (nodeData) =>\n\t\tconvertNodeDataIds(nodeData, (id) => idConverter.convertToStableNodeId(id))\n\t);\n}\n\nfunction convertToTraitLocation_0_0_2(\n\ttraitLocation: TraitLocationInternal,\n\tidConverter: NodeIdConverter\n): TraitLocationInternal_0_0_2 {\n\tconst parent = idConverter.convertToStableNodeId(traitLocation.parent);\n\treturn {\n\t\tlabel: traitLocation.label,\n\t\tparent,\n\t};\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluid-experimental/tree",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0-76254",
|
|
4
4
|
"description": "Distributed tree",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -38,13 +38,13 @@
|
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@fluidframework/common-definitions": "^0.20.1",
|
|
40
40
|
"@fluidframework/common-utils": "^0.32.1",
|
|
41
|
-
"@fluidframework/container-definitions": "
|
|
42
|
-
"@fluidframework/core-interfaces": "
|
|
43
|
-
"@fluidframework/datastore-definitions": "
|
|
41
|
+
"@fluidframework/container-definitions": "1.1.0-76254",
|
|
42
|
+
"@fluidframework/core-interfaces": "1.1.0-76254",
|
|
43
|
+
"@fluidframework/datastore-definitions": "1.1.0-76254",
|
|
44
44
|
"@fluidframework/protocol-definitions": "^0.1028.2000",
|
|
45
|
-
"@fluidframework/runtime-definitions": "
|
|
46
|
-
"@fluidframework/shared-object-base": "
|
|
47
|
-
"@fluidframework/telemetry-utils": "
|
|
45
|
+
"@fluidframework/runtime-definitions": "1.1.0-76254",
|
|
46
|
+
"@fluidframework/shared-object-base": "1.1.0-76254",
|
|
47
|
+
"@fluidframework/telemetry-utils": "1.1.0-76254",
|
|
48
48
|
"buffer": "^6.0.3",
|
|
49
49
|
"denque": "^1.5.1",
|
|
50
50
|
"lru-cache": "^6.0.0",
|
|
@@ -52,19 +52,19 @@
|
|
|
52
52
|
"uuid": "^8.3.1"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@fluid-internal/stochastic-test-utils": "
|
|
55
|
+
"@fluid-internal/stochastic-test-utils": "1.1.0-76254",
|
|
56
56
|
"@fluid-tools/benchmark": "^0.40.0",
|
|
57
|
-
"@fluidframework/build-common": "^0.
|
|
58
|
-
"@fluidframework/container-loader": "
|
|
59
|
-
"@fluidframework/container-runtime": "
|
|
57
|
+
"@fluidframework/build-common": "^0.24.0-0",
|
|
58
|
+
"@fluidframework/container-loader": "1.1.0-76254",
|
|
59
|
+
"@fluidframework/container-runtime": "1.1.0-76254",
|
|
60
60
|
"@fluidframework/eslint-config-fluid": "^0.28.2000",
|
|
61
|
-
"@fluidframework/mocha-test-setup": "
|
|
62
|
-
"@fluidframework/runtime-utils": "
|
|
63
|
-
"@fluidframework/test-driver-definitions": "
|
|
64
|
-
"@fluidframework/test-drivers": "
|
|
65
|
-
"@fluidframework/test-runtime-utils": "
|
|
66
|
-
"@fluidframework/test-utils": "
|
|
67
|
-
"@fluidframework/undo-redo": "
|
|
61
|
+
"@fluidframework/mocha-test-setup": "1.1.0-76254",
|
|
62
|
+
"@fluidframework/runtime-utils": "1.1.0-76254",
|
|
63
|
+
"@fluidframework/test-driver-definitions": "1.1.0-76254",
|
|
64
|
+
"@fluidframework/test-drivers": "1.1.0-76254",
|
|
65
|
+
"@fluidframework/test-runtime-utils": "1.1.0-76254",
|
|
66
|
+
"@fluidframework/test-utils": "1.1.0-76254",
|
|
67
|
+
"@fluidframework/undo-redo": "1.1.0-76254",
|
|
68
68
|
"@microsoft/api-extractor": "^7.22.2",
|
|
69
69
|
"@rushstack/eslint-config": "^2.5.1",
|
|
70
70
|
"@types/lru-cache": "^5.1.0",
|
package/src/EditLog.ts
CHANGED
|
@@ -645,29 +645,27 @@ export class EditLog<TChange = unknown> extends TypedEventEmitter<IEditLogEvents
|
|
|
645
645
|
public getEditLogSummary<TCompressedChange>(
|
|
646
646
|
compressEdit?: (edit: Pick<Edit<TChange>, 'changes'>) => Pick<Edit<TCompressedChange>, 'changes'>
|
|
647
647
|
): EditLogSummary<TChange, FluidEditHandle> | EditLogSummary<TCompressedChange, FluidEditHandle> {
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
};
|
|
670
|
-
}
|
|
648
|
+
return compressEdit !== undefined
|
|
649
|
+
? {
|
|
650
|
+
editChunks: this.editChunks.toArray().map(([startRevision, { handle, edits }]) => ({
|
|
651
|
+
startRevision,
|
|
652
|
+
chunk:
|
|
653
|
+
handle?.baseHandle ??
|
|
654
|
+
edits?.map((edit) => compressEdit(edit)) ??
|
|
655
|
+
fail('An edit chunk must have either a handle or a list of edits.'),
|
|
656
|
+
})),
|
|
657
|
+
editIds: this.sequencedEditIds,
|
|
658
|
+
}
|
|
659
|
+
: {
|
|
660
|
+
editChunks: this.editChunks.toArray().map(([startRevision, { handle, edits }]) => ({
|
|
661
|
+
startRevision,
|
|
662
|
+
chunk:
|
|
663
|
+
handle?.baseHandle ??
|
|
664
|
+
edits ??
|
|
665
|
+
fail('An edit chunk must have either a handle or a list of edits.'),
|
|
666
|
+
})),
|
|
667
|
+
editIds: this.sequencedEditIds,
|
|
668
|
+
};
|
|
671
669
|
}
|
|
672
670
|
|
|
673
671
|
private addKeyToCache(newKey: number): void {
|
package/src/LogViewer.ts
CHANGED
|
@@ -439,12 +439,7 @@ export class CachingLogViewer implements LogViewer {
|
|
|
439
439
|
}
|
|
440
440
|
|
|
441
441
|
const revision = editIndex + 1;
|
|
442
|
-
|
|
443
|
-
if (editingResult.status === EditStatus.Applied) {
|
|
444
|
-
nextView = editingResult.after;
|
|
445
|
-
} else {
|
|
446
|
-
nextView = prevView;
|
|
447
|
-
}
|
|
442
|
+
const nextView: RevisionView = editingResult.status === EditStatus.Applied ? editingResult.after : prevView;
|
|
448
443
|
|
|
449
444
|
const computedCacheEntry =
|
|
450
445
|
editingResult.status === EditStatus.Applied
|
package/src/SharedTree.ts
CHANGED
|
@@ -478,17 +478,15 @@ export class SharedTree extends SharedObject<ISharedTreeEvents> implements NodeI
|
|
|
478
478
|
uploadEditChunks: boolean;
|
|
479
479
|
} {
|
|
480
480
|
const noCompatOptions = options as SharedTreeOptions<WriteFormat, 'None'>;
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
};
|
|
491
|
-
}
|
|
481
|
+
return typeof noCompatOptions.summarizeHistory === 'object'
|
|
482
|
+
? {
|
|
483
|
+
summarizeHistory: true,
|
|
484
|
+
uploadEditChunks: noCompatOptions.summarizeHistory.uploadEditChunks,
|
|
485
|
+
}
|
|
486
|
+
: {
|
|
487
|
+
summarizeHistory: noCompatOptions.summarizeHistory ?? false,
|
|
488
|
+
uploadEditChunks: false,
|
|
489
|
+
};
|
|
492
490
|
}
|
|
493
491
|
|
|
494
492
|
/**
|
|
@@ -532,7 +530,7 @@ export class SharedTree extends SharedObject<ISharedTreeEvents> implements NodeI
|
|
|
532
530
|
);
|
|
533
531
|
|
|
534
532
|
const attributionId = (options as SharedTreeOptions<WriteFormat.v0_1_1>).attributionId;
|
|
535
|
-
this.idCompressor = new IdCompressor(createSessionId(), reservedIdCount, attributionId);
|
|
533
|
+
this.idCompressor = new IdCompressor(createSessionId(), reservedIdCount, attributionId, this.logger);
|
|
536
534
|
const { editLog, cachingLogViewer } = this.initializeNewEditLogFromSummary(
|
|
537
535
|
{
|
|
538
536
|
editChunks: [],
|
|
@@ -1093,9 +1091,12 @@ export class SharedTree extends SharedObject<ISharedTreeEvents> implements NodeI
|
|
|
1093
1091
|
};
|
|
1094
1092
|
this.cachingLogViewer.setMinimumSequenceNumber(typedMessage.minimumSequenceNumber);
|
|
1095
1093
|
const op = typedMessage.contents;
|
|
1094
|
+
if (op.version === undefined) {
|
|
1095
|
+
// Back-compat: some legacy documents may contain trailing ops with an unstamped version; normalize them.
|
|
1096
|
+
(op as { version: WriteFormat | undefined }).version = WriteFormat.v0_0_2;
|
|
1097
|
+
}
|
|
1096
1098
|
const { type, version } = op;
|
|
1097
|
-
const
|
|
1098
|
-
const sameVersion = resolvedVersion === this.writeFormat;
|
|
1099
|
+
const sameVersion = version === this.writeFormat;
|
|
1099
1100
|
|
|
1100
1101
|
// Edit and handle ops should only be processed if they're the same version as the tree write version.
|
|
1101
1102
|
// Update ops should only be processed if they're not the same version.
|
|
@@ -1128,7 +1129,7 @@ export class SharedTree extends SharedObject<ISharedTreeEvents> implements NodeI
|
|
|
1128
1129
|
}
|
|
1129
1130
|
} else if (type === SharedTreeOpType.Update) {
|
|
1130
1131
|
this.processVersionUpdate(op.version);
|
|
1131
|
-
} else if (compareSummaryFormatVersions(
|
|
1132
|
+
} else if (compareSummaryFormatVersions(version, this.writeFormat) === 1) {
|
|
1132
1133
|
// An op version newer than our current version should not be received. If this happens, either an
|
|
1133
1134
|
// incorrect op version has been written or an update op was skipped.
|
|
1134
1135
|
const error = 'Newer op version received by a client that has yet to be updated.';
|
|
@@ -1264,7 +1265,7 @@ export class SharedTree extends SharedObject<ISharedTreeEvents> implements NodeI
|
|
|
1264
1265
|
this.interner = new MutableStringInterner([initialTree.definition]);
|
|
1265
1266
|
const oldIdCompressor = this.idCompressor;
|
|
1266
1267
|
// Create the IdCompressor that will be used after the upgrade
|
|
1267
|
-
const newIdCompressor = new IdCompressor(createSessionId(), reservedIdCount, this.attributionId);
|
|
1268
|
+
const newIdCompressor = new IdCompressor(createSessionId(), reservedIdCount, this.attributionId, this.logger);
|
|
1268
1269
|
const newContext = getNodeIdContext(newIdCompressor);
|
|
1269
1270
|
// Generate all local IDs in the new compressor that were in the old compressor and preserve their UUIDs.
|
|
1270
1271
|
// This will allow the client to continue to use local IDs that were allocated pre-upgrade
|
package/src/SharedTreeEncoder.ts
CHANGED
|
@@ -134,18 +134,9 @@ export class SharedTreeEncoder_0_1_1 {
|
|
|
134
134
|
interner: StringInterner,
|
|
135
135
|
serializedIdCompressor: SerializedIdCompressorWithNoSession
|
|
136
136
|
): SharedTreeSummary {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
return this.noHistorySummarizer(
|
|
141
|
-
edits,
|
|
142
|
-
currentView,
|
|
143
|
-
idContext,
|
|
144
|
-
idNormalizer,
|
|
145
|
-
interner,
|
|
146
|
-
serializedIdCompressor
|
|
147
|
-
);
|
|
148
|
-
}
|
|
137
|
+
return this.summarizeHistory
|
|
138
|
+
? this.fullHistorySummarizer(edits, currentView, idNormalizer, interner, serializedIdCompressor)
|
|
139
|
+
: this.noHistorySummarizer(edits, currentView, idContext, idNormalizer, interner, serializedIdCompressor);
|
|
149
140
|
}
|
|
150
141
|
|
|
151
142
|
/**
|
|
@@ -364,11 +355,9 @@ export class SharedTreeEncoder_0_0_2 {
|
|
|
364
355
|
currentView: RevisionView,
|
|
365
356
|
idConverter: NodeIdConverter
|
|
366
357
|
): SharedTreeSummary_0_0_2 {
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
return this.noHistorySummarizer(edits, currentView, idConverter);
|
|
371
|
-
}
|
|
358
|
+
return this.summarizeHistory
|
|
359
|
+
? this.fullHistorySummarizer(edits, currentView, idConverter)
|
|
360
|
+
: this.noHistorySummarizer(edits, currentView, idConverter);
|
|
372
361
|
}
|
|
373
362
|
|
|
374
363
|
/**
|
|
@@ -347,19 +347,17 @@ export class GenericTransaction {
|
|
|
347
347
|
}
|
|
348
348
|
const resolvedChange = resolutionResult.result;
|
|
349
349
|
const changeResult = this.policy.dispatchChange(this.state, resolvedChange);
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
};
|
|
362
|
-
}
|
|
350
|
+
this.state = Result.isOk(changeResult)
|
|
351
|
+
? {
|
|
352
|
+
status: EditStatus.Applied,
|
|
353
|
+
view: changeResult.result,
|
|
354
|
+
changes: this.changes.concat(change),
|
|
355
|
+
steps: this.steps.concat({ resolvedChange, after: changeResult.result }),
|
|
356
|
+
}
|
|
357
|
+
: {
|
|
358
|
+
...this.state,
|
|
359
|
+
...changeResult.error,
|
|
360
|
+
};
|
|
363
361
|
return this;
|
|
364
362
|
}
|
|
365
363
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
/* eslint-disable @typescript-eslint/restrict-plus-operands */
|
|
7
7
|
|
|
8
|
+
import { ITelemetryLogger } from '@fluidframework/common-definitions';
|
|
8
9
|
import BTree from 'sorted-btree';
|
|
9
10
|
import {
|
|
10
11
|
assert,
|
|
@@ -384,7 +385,8 @@ export class IdCompressor {
|
|
|
384
385
|
public constructor(
|
|
385
386
|
public readonly localSessionId: SessionId,
|
|
386
387
|
public readonly reservedIdCount: number,
|
|
387
|
-
attributionId?: AttributionId
|
|
388
|
+
attributionId?: AttributionId,
|
|
389
|
+
private readonly logger?: ITelemetryLogger
|
|
388
390
|
) {
|
|
389
391
|
assert(reservedIdCount >= 0, 'reservedIdCount must be non-negative');
|
|
390
392
|
if (attributionId !== undefined) {
|
|
@@ -565,6 +567,7 @@ export class IdCompressor {
|
|
|
565
567
|
const finalizeCount = normalizedLastFinalizedLocal - newLastFinalizedLocal;
|
|
566
568
|
assert(finalizeCount >= 1, 'Cannot finalize an empty range.');
|
|
567
569
|
|
|
570
|
+
let eagerFinalIdCount = 0;
|
|
568
571
|
let initialClusterCount = 0;
|
|
569
572
|
let remainingCount = finalizeCount;
|
|
570
573
|
let newBaseUuid: NumericUuid | undefined;
|
|
@@ -577,6 +580,7 @@ export class IdCompressor {
|
|
|
577
580
|
Math.min(currentCluster.count + finalizeCount, currentCluster.capacity) -
|
|
578
581
|
1) as FinalCompressedId;
|
|
579
582
|
if (lastFinalInCluster > lastKnownFinal) {
|
|
583
|
+
eagerFinalIdCount = lastFinalInCluster - (lastKnownFinal + 1);
|
|
580
584
|
this.sessionIdNormalizer.addFinalIds(
|
|
581
585
|
(lastKnownFinal + 1) as FinalCompressedId,
|
|
582
586
|
lastFinalInCluster,
|
|
@@ -596,6 +600,7 @@ export class IdCompressor {
|
|
|
596
600
|
// The cluster is full but is the last in the list of clusters.
|
|
597
601
|
// This allows it to be expanded instead of allocating a new one.
|
|
598
602
|
const expansionAmount = this.newClusterCapacity + overflow;
|
|
603
|
+
const previousCapacity = currentCluster.capacity;
|
|
599
604
|
currentCluster.capacity += expansionAmount;
|
|
600
605
|
this.nextClusterBaseFinalId = (this.nextClusterBaseFinalId + expansionAmount) as FinalCompressedId;
|
|
601
606
|
assert(
|
|
@@ -617,6 +622,13 @@ export class IdCompressor {
|
|
|
617
622
|
const lastFinalizedFinal = (currentBaseFinalId + currentCluster.count - 1) as FinalCompressedId;
|
|
618
623
|
const finalPivot = (lastFinalizedFinal - overflow + 1) as FinalCompressedId;
|
|
619
624
|
this.sessionIdNormalizer.addFinalIds(finalPivot, lastFinalizedFinal, currentCluster);
|
|
625
|
+
this.logger?.sendTelemetryEvent({
|
|
626
|
+
eventName: 'IdCompressor:ClusterExpansion',
|
|
627
|
+
sessionId: this.localSessionId,
|
|
628
|
+
previousCapacity,
|
|
629
|
+
newCapacity: currentCluster.capacity,
|
|
630
|
+
overflow,
|
|
631
|
+
});
|
|
620
632
|
}
|
|
621
633
|
}
|
|
622
634
|
} else {
|
|
@@ -625,10 +637,18 @@ export class IdCompressor {
|
|
|
625
637
|
newBaseUuid = incrementUuid(currentCluster.baseUuid, currentCluster.capacity);
|
|
626
638
|
currentCluster.count += remainingCapacity;
|
|
627
639
|
remainingCount -= remainingCapacity;
|
|
640
|
+
this.logger?.sendTelemetryEvent({
|
|
641
|
+
eventName: 'IdCompressor:OverfilledCluster',
|
|
642
|
+
sessionId: this.localSessionId,
|
|
643
|
+
});
|
|
628
644
|
}
|
|
629
645
|
} else {
|
|
630
646
|
// Session has never made a cluster, form a new one with the session UUID as the baseUuid
|
|
631
647
|
newBaseUuid = session.sessionUuid;
|
|
648
|
+
this.logger?.sendTelemetryEvent({
|
|
649
|
+
eventName: 'IdCompressor:FirstCluster',
|
|
650
|
+
sessionId: this.localSessionId,
|
|
651
|
+
});
|
|
632
652
|
}
|
|
633
653
|
|
|
634
654
|
// Finalizing a range results in one of three cases:
|
|
@@ -652,9 +672,10 @@ export class IdCompressor {
|
|
|
652
672
|
}
|
|
653
673
|
|
|
654
674
|
newBaseFinalId = this.nextClusterBaseFinalId;
|
|
675
|
+
const newCapacity = Math.max(this.newClusterCapacity, remainingCount);
|
|
655
676
|
newCluster = {
|
|
656
677
|
baseUuid: newBaseUuid,
|
|
657
|
-
capacity:
|
|
678
|
+
capacity: newCapacity,
|
|
658
679
|
count: remainingCount,
|
|
659
680
|
session,
|
|
660
681
|
};
|
|
@@ -663,6 +684,12 @@ export class IdCompressor {
|
|
|
663
684
|
localIdPivot = (newFirstFinalizedLocal - usedCapacity) as LocalCompressedId;
|
|
664
685
|
|
|
665
686
|
if (isLocal) {
|
|
687
|
+
this.logger?.sendTelemetryEvent({
|
|
688
|
+
eventName: 'IdCompressor:NewCluster',
|
|
689
|
+
sessionId: this.localSessionId,
|
|
690
|
+
clusterCapacity: newCapacity,
|
|
691
|
+
clusterCount: remainingCount,
|
|
692
|
+
});
|
|
666
693
|
const lastFinalizedFinal = (newBaseFinalId + newCluster.count - 1) as FinalCompressedId;
|
|
667
694
|
this.sessionIdNormalizer.addFinalIds(newBaseFinalId, lastFinalizedFinal, newCluster);
|
|
668
695
|
}
|
|
@@ -779,6 +806,16 @@ export class IdCompressor {
|
|
|
779
806
|
}
|
|
780
807
|
}
|
|
781
808
|
|
|
809
|
+
if (isLocal) {
|
|
810
|
+
this.logger?.sendTelemetryEvent({
|
|
811
|
+
eventName: 'IdCompressor:IdCompressorStatus',
|
|
812
|
+
eagerFinalIdCount,
|
|
813
|
+
localIdCount: remainingCount,
|
|
814
|
+
overridesCount: overrides?.length ?? 0,
|
|
815
|
+
sessionId: this.localSessionId,
|
|
816
|
+
});
|
|
817
|
+
}
|
|
818
|
+
|
|
782
819
|
session.lastFinalizedLocalId = newLastFinalizedLocal;
|
|
783
820
|
}
|
|
784
821
|
|
|
@@ -1014,11 +1051,9 @@ export class IdCompressor {
|
|
|
1014
1051
|
// `localOverrides`s. Otherwise, it is a sequential allocation from the session UUID and can simply be negated and
|
|
1015
1052
|
// added to that UUID to obtain the stable ID associated with it.
|
|
1016
1053
|
const localOverride = this.localOverrides?.get(id);
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
return stableIdFromNumericUuid(this.localSession.sessionUuid, idOffset - 1);
|
|
1021
|
-
}
|
|
1054
|
+
return localOverride !== undefined
|
|
1055
|
+
? localOverride
|
|
1056
|
+
: stableIdFromNumericUuid(this.localSession.sessionUuid, idOffset - 1);
|
|
1022
1057
|
}
|
|
1023
1058
|
}
|
|
1024
1059
|
|
|
@@ -1056,14 +1091,10 @@ export class IdCompressor {
|
|
|
1056
1091
|
const [key, compressionMapping] = closestMatch;
|
|
1057
1092
|
if (!IdCompressor.isClusterInfo(compressionMapping)) {
|
|
1058
1093
|
if (key === inversionKey) {
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
compressionMapping.associatedLocalId ??
|
|
1064
|
-
(compressionMapping.originalOverridingFinal as SessionSpaceCompressedId)
|
|
1065
|
-
);
|
|
1066
|
-
}
|
|
1094
|
+
return IdCompressor.isUnfinalizedOverride(compressionMapping)
|
|
1095
|
+
? compressionMapping
|
|
1096
|
+
: compressionMapping.associatedLocalId ??
|
|
1097
|
+
(compressionMapping.originalOverridingFinal as SessionSpaceCompressedId);
|
|
1067
1098
|
}
|
|
1068
1099
|
} else {
|
|
1069
1100
|
if (!isStable) {
|