@fluid-experimental/tree 0.54.3 → 0.55.2
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/.eslintrc.js +1 -1
- package/api/tree.api.md +3 -3
- package/dist/RevisionValueCache.d.ts.map +1 -1
- package/dist/RevisionValueCache.js +2 -0
- package/dist/RevisionValueCache.js.map +1 -1
- package/dist/SummaryBackCompatibility.d.ts +1 -1
- package/dist/SummaryBackCompatibility.d.ts.map +1 -1
- package/dist/SummaryBackCompatibility.js.map +1 -1
- package/dist/default-edits/UndoRedoHandler.d.ts +1 -1
- package/dist/default-edits/UndoRedoHandler.d.ts.map +1 -1
- package/dist/default-edits/UndoRedoHandler.js +4 -0
- package/dist/default-edits/UndoRedoHandler.js.map +1 -1
- package/dist/generic/GenericSharedTree.d.ts +5 -5
- package/dist/generic/GenericSharedTree.d.ts.map +1 -1
- package/dist/generic/GenericSharedTree.js +5 -19
- package/dist/generic/GenericSharedTree.js.map +1 -1
- package/dist/generic/Summary.d.ts +2 -1
- package/dist/generic/Summary.d.ts.map +1 -1
- package/dist/generic/Summary.js.map +1 -1
- package/lib/RevisionValueCache.d.ts.map +1 -1
- package/lib/RevisionValueCache.js +2 -0
- package/lib/RevisionValueCache.js.map +1 -1
- package/lib/SummaryBackCompatibility.d.ts +1 -1
- package/lib/SummaryBackCompatibility.d.ts.map +1 -1
- package/lib/SummaryBackCompatibility.js.map +1 -1
- package/lib/default-edits/UndoRedoHandler.d.ts +1 -1
- package/lib/default-edits/UndoRedoHandler.d.ts.map +1 -1
- package/lib/default-edits/UndoRedoHandler.js +4 -0
- package/lib/default-edits/UndoRedoHandler.js.map +1 -1
- package/lib/generic/GenericSharedTree.d.ts +5 -5
- package/lib/generic/GenericSharedTree.d.ts.map +1 -1
- package/lib/generic/GenericSharedTree.js +6 -20
- package/lib/generic/GenericSharedTree.js.map +1 -1
- package/lib/generic/Summary.d.ts +2 -1
- package/lib/generic/Summary.d.ts.map +1 -1
- package/lib/generic/Summary.js.map +1 -1
- package/lib/test/SnapshotUtilities.tests.js +2 -1
- package/lib/test/SnapshotUtilities.tests.js.map +1 -1
- package/lib/test/utilities/TestSerializer.d.ts +4 -2
- package/lib/test/utilities/TestSerializer.d.ts.map +1 -1
- package/lib/test/utilities/TestSerializer.js +4 -1
- package/lib/test/utilities/TestSerializer.js.map +1 -1
- package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
- package/lib/test/utilities/TestUtilities.js +2 -1
- package/lib/test/utilities/TestUtilities.js.map +1 -1
- package/package.json +21 -19
- package/src/RevisionValueCache.ts +2 -0
- package/src/SummaryBackCompatibility.ts +1 -1
- package/src/default-edits/UndoRedoHandler.ts +5 -1
- package/src/generic/GenericSharedTree.ts +15 -22
- package/src/generic/Summary.ts +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestUtilities.js","sourceRoot":"","sources":["../../../src/test/utilities/TestUtilities.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 { v4 as uuidv4, v5 as uuidv5 } from 'uuid';\nimport { expect } from 'chai';\nimport { IContainer } from '@fluidframework/container-definitions';\nimport { Loader } from '@fluidframework/container-loader';\nimport { requestFluidObject } from '@fluidframework/runtime-utils';\nimport {\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from '@fluidframework/test-runtime-utils';\nimport {\n\tChannelFactoryRegistry,\n\tITestContainerConfig,\n\tITestFluidObject,\n\tTestObjectProvider,\n\tTestContainerRuntimeFactory,\n\tTestFluidObjectFactory,\n} from '@fluidframework/test-utils';\nimport { createFluidTestDriver } from '@fluidframework/test-drivers';\nimport { ITelemetryBaseLogger } from '@fluidframework/common-definitions';\nimport { Definition, DetachedSequenceId, EditId, NodeId, TraitLabel } from '../../Identifiers';\nimport { compareArrays, comparePayloads, fail } from '../../Common';\nimport { initialTree } from '../../InitialTree';\nimport { Snapshot } from '../../Snapshot';\nimport { SharedTree, Change, setTrait, SharedTreeFactory, StablePlace } from '../../default-edits';\nimport { ChangeNode, Edit, GenericSharedTree, newEdit, NodeData, TraitLocation } from '../../generic';\nimport { SharedTreeWithAnchors, SharedTreeWithAnchorsFactory } from '../../anchored-edits';\nimport { SharedTreeDiagnosticEvent } from '../../generic/GenericSharedTree';\n\n/** Objects returned by setUpTestSharedTree */\nexport interface SharedTreeTestingComponents<TSharedTree = SharedTree> {\n\t/** The MockFluidDataStoreRuntime used to created the SharedTree. */\n\tcomponentRuntime: MockFluidDataStoreRuntime;\n\t/**\n\t * The MockContainerRuntimeFactory created if one was not provided in the options.\n\t * Only connected to the SharedTree if the localMode option was set to false.\n\t * */\n\tcontainerRuntimeFactory: MockContainerRuntimeFactory;\n\t/** The SharedTree created and set up. */\n\ttree: TSharedTree;\n}\n\n/** Options used to customize setUpTestSharedTree */\nexport interface SharedTreeTestingOptions {\n\t/**\n\t * Id for the SharedTree to be created.\n\t * If two SharedTrees have the same id and the same containerRuntimeFactory,\n\t * they will collaborate (send edits to each other)\n\t */\n\tid?: string;\n\t/** Node to initialize the SharedTree with. */\n\tinitialTree?: ChangeNode;\n\t/** If false, a MockContainerRuntimeFactory connected to the SharedTree will be returned. */\n\tlocalMode?: boolean;\n\t/**\n\t * MockContainerRuntimeFactory to connect the SharedTree to. A new one will not be created if one is provided.\n\t * If localMode is set to true, it will not be connected to the created SharedTree.\n\t * */\n\tcontainerRuntimeFactory?: MockContainerRuntimeFactory;\n\t/** Iff true, do not `fail` on invalid edits */\n\tallowInvalid?: boolean;\n\t/** Iff true, do not `fail` on malformed edits */\n\tallowMalformed?: boolean;\n\t/** Unless set to true, a SharedTree error causes the test to fail */\n\tnoFailOnError?: boolean;\n\t/**\n\t * If not set, full history will be preserved.\n\t */\n\tsummarizeHistory?: boolean;\n\t/**\n\t * If set, uses the given id as the edit id for tree setup. Only has an effect if initialTree is also set.\n\t */\n\tsetupEditId?: EditId;\n\n\t/**\n\t * Telemetry logger injected into the SharedTree.\n\t */\n\tlogger?: ITelemetryBaseLogger;\n}\n\n/** Left node of 'simpleTestTree' */\nexport const left: ChangeNode = makeEmptyNode('a083857d-a8e1-447a-ba7c-92fd0be9db2b' as NodeId);\n\n/** Right node of 'simpleTestTree' */\nexport const right: ChangeNode = makeEmptyNode('78849e85-cb7f-4b93-9fdc-18439c60fe30' as NodeId);\n\n/** Label for the 'left' trait in 'simpleTestTree' */\nexport const leftTraitLabel = 'left' as TraitLabel;\n\n/** Label for the 'right' trait in 'simpleTestTree' */\nexport const rightTraitLabel = 'right' as TraitLabel;\n\n/** A simple, three node tree useful for testing. Contains one node under a 'left' trait and one under a 'right' trait. */\nexport const simpleTestTree: ChangeNode = {\n\t...makeEmptyNode('25de3875-9537-47ec-8699-8a85e772a509' as NodeId),\n\ttraits: { [leftTraitLabel]: [left], [rightTraitLabel]: [right] },\n};\n\n/** Convenient pre-made TraitLocation for the left trait of 'simpleTestTree'. */\nexport const leftTraitLocation = {\n\tparent: simpleTestTree.identifier,\n\tlabel: leftTraitLabel,\n};\n\n/** Convenient pre-made TraitLocation for the right trait of 'simpleTestTree'. */\nexport const rightTraitLocation = {\n\tparent: simpleTestTree.identifier,\n\tlabel: rightTraitLabel,\n};\n\n/** Convenient pre-made Snapshot for 'simpleTestTree'. */\nexport const simpleTreeSnapshot = Snapshot.fromTree(simpleTestTree);\n\n/** Convenient pre-made Snapshot for 'initialTree'. */\nexport const initialSnapshot = Snapshot.fromTree(initialTree);\n\n/**\n * Convenient pre-made Snapshot for 'simpleTestTree'.\n * Expensive validation is turned on for this snapshot, and it should not be used for performance testing.\n */\nexport const simpleTreeSnapshotWithValidation = Snapshot.fromTree(simpleTestTree, true);\n\n/**\n * Convenient pre-made Snapshot for 'initialTree'.\n * Expensive validation is turned on for this snapshot, and it should not be used for performance testing.\n */\nexport const initialSnapshotWithValidation = Snapshot.fromTree(initialTree, true);\n\nexport const testTrait: TraitLocation = {\n\tparent: initialSnapshot.root,\n\tlabel: 'e276f382-fa99-49a1-ae81-42001791c733' as TraitLabel,\n};\n\n/** Sets up and returns an object of components useful for testing SharedTree. */\nexport function setUpTestSharedTree(options?: SharedTreeTestingOptions): SharedTreeTestingComponents {\n\treturn setUpTestSharedTreeGeneric(SharedTree.getFactory, options);\n}\n\n/** Sets up and returns an object of components useful for testing SharedTreeWithAnchors. */\nexport function setUpTestSharedTreeWithAnchors(\n\toptions?: SharedTreeTestingOptions\n): SharedTreeTestingComponents<SharedTreeWithAnchors> {\n\treturn setUpTestSharedTreeGeneric(SharedTreeWithAnchors.getFactory, options);\n}\n\nfunction setUpTestSharedTreeGeneric<\n\tTSharedTree extends SharedTree | SharedTreeWithAnchors,\n\tTSharedTreeFactory extends SharedTreeFactory | SharedTreeWithAnchorsFactory\n>(\n\tfactoryGetter: (summarizeHistory?: boolean) => TSharedTreeFactory,\n\toptions: SharedTreeTestingOptions = { localMode: true }\n): SharedTreeTestingComponents<TSharedTree> {\n\tconst { id, initialTree, localMode, containerRuntimeFactory, setupEditId } = options;\n\tlet componentRuntime: MockFluidDataStoreRuntime;\n\tif (options.logger) {\n\t\tconst proxyHandler: ProxyHandler<MockFluidDataStoreRuntime> = {\n\t\t\tget: (target, prop, receiver) => {\n\t\t\t\tif (prop === 'logger' && options.logger) {\n\t\t\t\t\treturn options.logger;\n\t\t\t\t}\n\t\t\t\treturn target[prop as keyof MockFluidDataStoreRuntime];\n\t\t\t},\n\t\t};\n\t\tcomponentRuntime = new Proxy(new MockFluidDataStoreRuntime(), proxyHandler);\n\t} else {\n\t\tcomponentRuntime = new MockFluidDataStoreRuntime();\n\t}\n\n\t// Enable expensiveValidation\n\tconst factory = factoryGetter(options.summarizeHistory);\n\tconst tree = factory.create(componentRuntime, id === undefined ? 'testSharedTree' : id, true) as TSharedTree;\n\n\tif (options.allowInvalid === undefined || !options.allowInvalid) {\n\t\ttree.on(SharedTreeDiagnosticEvent.DroppedInvalidEdit, () => fail('unexpected invalid edit'));\n\t}\n\n\tif (options.allowMalformed === undefined || !options.allowMalformed) {\n\t\ttree.on(SharedTreeDiagnosticEvent.DroppedMalformedEdit, () => fail('unexpected malformed edit'));\n\t}\n\n\tif (options.noFailOnError === undefined || !options.noFailOnError) {\n\t\t// any errors thrown by a SharedObject event listener will be caught and\n\t\t// reemitted on this event. For testing purposes, rethrow so that it\n\t\t// actually causes the test to fail.\n\t\ttree.on('error', (error) => {\n\t\t\tthrow error;\n\t\t});\n\t}\n\n\tconst newContainerRuntimeFactory = containerRuntimeFactory || new MockContainerRuntimeFactory();\n\n\tif (localMode === true) {\n\t\tcomponentRuntime.local = true;\n\t} else {\n\t\tconst containerRuntime = newContainerRuntimeFactory.createContainerRuntime(componentRuntime);\n\t\tconst services = {\n\t\t\tdeltaConnection: containerRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: new MockStorage(undefined),\n\t\t};\n\t\ttree.connect(services);\n\t}\n\n\tif (initialTree !== undefined) {\n\t\tsetTestTree(tree, initialTree, setupEditId);\n\t}\n\n\treturn {\n\t\tcomponentRuntime,\n\t\tcontainerRuntimeFactory: newContainerRuntimeFactory,\n\t\ttree,\n\t};\n}\n\nconst TestDataStoreType = '@fluid-example/test-dataStore';\n\n/** Objects returned by setUpLocalServerTestSharedTree */\nexport interface LocalServerSharedTreeTestingComponents<TSharedTree = SharedTree> {\n\t/** The testObjectProvider created if one was not set in the options. */\n\ttestObjectProvider: TestObjectProvider;\n\t/** The SharedTree created and set up. */\n\ttree: TSharedTree;\n}\n\n/** Options used to customize setUpLocalServerTestSharedTree */\nexport interface LocalServerSharedTreeTestingOptions {\n\t/**\n\t * Id for the SharedTree to be created.\n\t * If two SharedTrees have the same id and the same testObjectProvider,\n\t * they will collaborate (send edits to each other)\n\t */\n\tid?: string;\n\t/** Node to initialize the SharedTree with. */\n\tinitialTree?: ChangeNode;\n\t/** If set, uses the provider to create the container and create the SharedTree. */\n\ttestObjectProvider?: TestObjectProvider;\n\t/**\n\t * If not set, full history will be preserved.\n\t */\n\tsummarizeHistory?: boolean;\n\t/**\n\t * If set, uses the given id as the edit id for tree setup. Only has an effect if initialTree is also set.\n\t */\n\tsetupEditId?: EditId;\n}\n\n/**\n * Sets up and returns an object of components useful for testing SharedTree with a local server.\n * Required for tests that involve the uploadBlob API.\n *\n * If using this method, be sure to clean up server state by calling `reset` on the TestObjectProvider.\n */\nexport async function setUpLocalServerTestSharedTree(\n\toptions: LocalServerSharedTreeTestingOptions\n): Promise<LocalServerSharedTreeTestingComponents> {\n\treturn setUpLocalServerTestSharedTreeGeneric(SharedTree.getFactory, options);\n}\n\n/**\n * Sets up and returns an object of components useful for testing SharedTreeWithAnchors with a local server.\n * Required for tests that involve the uploadBlob API.\n *\n * If using this method, be sure to clean up server state by calling `reset` on the TestObjectProvider.\n */\nexport async function setUpLocalServerTestSharedTreeWithAnchors(\n\toptions: LocalServerSharedTreeTestingOptions\n): Promise<LocalServerSharedTreeTestingComponents<SharedTreeWithAnchors>> {\n\treturn setUpLocalServerTestSharedTreeGeneric(SharedTreeWithAnchors.getFactory, options);\n}\n\nasync function setUpLocalServerTestSharedTreeGeneric<\n\tTSharedTree extends SharedTree | SharedTreeWithAnchors,\n\tTSharedTreeFactory extends SharedTreeFactory | SharedTreeWithAnchorsFactory\n>(\n\tfactoryGetter: (summarizeHistory?: boolean) => TSharedTreeFactory,\n\toptions: LocalServerSharedTreeTestingOptions\n): Promise<LocalServerSharedTreeTestingComponents<TSharedTree>> {\n\tconst { id, initialTree, testObjectProvider, setupEditId, summarizeHistory } = options;\n\n\tconst treeId = id ?? 'test';\n\tconst registry: ChannelFactoryRegistry = [[treeId, factoryGetter(summarizeHistory)]];\n\tconst runtimeFactory = () =>\n\t\tnew TestContainerRuntimeFactory(TestDataStoreType, new TestFluidObjectFactory(registry), {\n\t\t\tsummaryOptions: { initialSummarizerDelayMs: 0 },\n\t\t});\n\n\tlet provider: TestObjectProvider;\n\tlet container: IContainer;\n\n\tif (testObjectProvider !== undefined) {\n\t\tprovider = testObjectProvider;\n\t\tcontainer = await provider.loadTestContainer();\n\t} else {\n\t\tprovider = new TestObjectProvider(Loader, await createFluidTestDriver(), runtimeFactory);\n\t\tcontainer = await provider.makeTestContainer();\n\t}\n\n\tconst dataObject = await requestFluidObject<ITestFluidObject>(container, 'default');\n\tconst tree = await dataObject.getSharedObject<TSharedTree>(treeId);\n\n\tif (initialTree !== undefined && testObjectProvider === undefined) {\n\t\tsetTestTree(tree, initialTree, setupEditId);\n\t}\n\n\treturn { tree, testObjectProvider: provider };\n}\n\n/** Sets testTrait to contain `node`. */\nexport function setTestTree<TExtraChangeTypes = never>(\n\ttree: GenericSharedTree<TExtraChangeTypes | Change>,\n\tnode: ChangeNode,\n\toverrideId?: EditId\n): EditId {\n\tconst edit = newEdit(setTrait(testTrait, [node]));\n\ttree.processLocalEdit({ ...edit, id: overrideId || edit.id });\n\treturn overrideId || edit.id;\n}\n\n/** Creates an empty node for testing purposes. */\nexport function makeEmptyNode(identifier: NodeId = uuidv4() as NodeId): ChangeNode {\n\tconst definition = 'node' as Definition;\n\treturn { definition, identifier, traits: {} };\n}\n\n/** Creates a node with two children, one under a 'left' trait and one under a 'right' trait */\nexport function makeTestNode(identifier: NodeId = uuidv4() as NodeId): ChangeNode {\n\tconst definition = 'node' as Definition;\n\tconst left: ChangeNode = makeEmptyNode('c4acaed2-afac-417e-a3d7-07ea73c0330a' as NodeId);\n\tconst right: ChangeNode = makeEmptyNode('452c618a-ba0c-4d9b-89f3-2248d27f8c7f' as NodeId);\n\tconst leftTraitLabel = 'left' as TraitLabel;\n\tconst rightTraitLabel = 'right' as TraitLabel;\n\treturn {\n\t\tdefinition,\n\t\tidentifier,\n\t\ttraits: { [leftTraitLabel]: [left], [rightTraitLabel]: [right] },\n\t};\n}\n\n/**\n * Creates a list of edits with stable IDs that can be processed by a SharedTree.\n * @param numberOfEdits - the number of edits to create\n * @returns the list of created edits\n */\nexport function createStableEdits(numberOfEdits: number): Edit<Change>[] {\n\tconst uuidNamespace = '44864298-500e-4cf8-9f44-a249e5b3a286';\n\n\t// First edit is an insert\n\tconst nodeId = 'ae6b24eb-6fa8-42cc-abd2-48f250b7798f' as NodeId;\n\tconst node = makeEmptyNode(nodeId);\n\tconst firstEdit = newEdit([\n\t\tChange.build([node], 0 as DetachedSequenceId),\n\t\tChange.insert(0 as DetachedSequenceId, StablePlace.before(left)),\n\t]);\n\n\tconst edits: Edit<Change>[] = [];\n\tedits.push({ ...firstEdit, id: uuidv5('test', uuidNamespace) as EditId });\n\n\t// Every subsequent edit is a set payload\n\tfor (let i = 1; i < numberOfEdits - 1; i++) {\n\t\tconst edit = newEdit([Change.setPayload(nodeId, i)]);\n\t\tedits.push({ ...edit, id: uuidv5(i.toString(), uuidNamespace) as EditId });\n\t}\n\n\treturn edits;\n}\n\n/** Asserts that changes to SharedTree in editor() function do not cause any observable state change */\nexport function assertNoDelta<TChange>(tree: GenericSharedTree<TChange>, editor: () => void) {\n\tconst snapshotA = tree.currentView;\n\teditor();\n\tconst snapshotB = tree.currentView;\n\tconst delta = snapshotA.delta(snapshotB);\n\texpect(delta).deep.equals({\n\t\tchanged: [],\n\t\tadded: [],\n\t\tremoved: [],\n\t});\n}\n\n/**\n * Used to test error throwing in async functions.\n */\nexport async function asyncFunctionThrowsCorrectly(\n\tasyncFunction: () => Promise<unknown>,\n\texpectedError: string\n): Promise<boolean> {\n\tlet errorMessage;\n\n\ttry {\n\t\tawait asyncFunction();\n\t} catch (error) {\n\t\terrorMessage = error.message;\n\t}\n\n\treturn errorMessage === expectedError;\n}\n\n/*\n * Returns true if two nodes have equivalent data, otherwise false.\n * Does not compare children or payloads.\n * @param nodes - two or more nodes to compare\n */\nexport function areNodesEquivalent(...nodes: NodeData[]): boolean {\n\tif (nodes.length < 2) {\n\t\tfail('Too few nodes to compare');\n\t}\n\n\tfor (let i = 1; i < nodes.length; i++) {\n\t\tif (nodes[i].definition !== nodes[0].definition) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (nodes[i].identifier !== nodes[0].identifier) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/**\n * Check if two trees are equivalent, meaning they have the same descendants with the same properties.\n *\n * See {@link comparePayloads} for payload comparison semantics.\n */\nexport function deepCompareNodes(a: ChangeNode, b: ChangeNode): boolean {\n\tif (a.identifier !== b.identifier) {\n\t\treturn false;\n\t}\n\n\tif (a.definition !== b.definition) {\n\t\treturn false;\n\t}\n\n\tif (!comparePayloads(a.payload, b.payload)) {\n\t\treturn false;\n\t}\n\n\tconst traitsA = Object.entries(a.traits);\n\tconst traitsB = Object.entries(b.traits);\n\n\tif (traitsA.length !== traitsB.length) {\n\t\treturn false;\n\t}\n\n\tfor (const [traitLabel, childrenA] of traitsA) {\n\t\tconst childrenB = b.traits[traitLabel];\n\n\t\tif (childrenA.length !== childrenB.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst traitsEqual = compareArrays(childrenA, childrenB, (childA, childB) => {\n\t\t\tif (typeof childA === 'number' || typeof childB === 'number') {\n\t\t\t\t// Check if children are DetachedSequenceIds\n\t\t\t\treturn childA === childB;\n\t\t\t}\n\n\t\t\treturn deepCompareNodes(childA, childB);\n\t\t});\n\n\t\tif (!traitsEqual) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TestUtilities.js","sourceRoot":"","sources":["../../../src/test/utilities/TestUtilities.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 { v4 as uuidv4, v5 as uuidv5 } from 'uuid';\nimport { expect } from 'chai';\nimport { IContainer } from '@fluidframework/container-definitions';\nimport { Loader } from '@fluidframework/container-loader';\nimport { requestFluidObject } from '@fluidframework/runtime-utils';\nimport {\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from '@fluidframework/test-runtime-utils';\nimport {\n\tChannelFactoryRegistry,\n\tITestContainerConfig,\n\tITestFluidObject,\n\tTestObjectProvider,\n\tTestContainerRuntimeFactory,\n\tTestFluidObjectFactory,\n} from '@fluidframework/test-utils';\nimport { createFluidTestDriver } from '@fluidframework/test-drivers';\nimport { ITelemetryBaseLogger } from '@fluidframework/common-definitions';\nimport { IContainerRuntimeBase } from '@fluidframework/runtime-definitions';\nimport { IRequest } from '@fluidframework/core-interfaces';\nimport { Definition, DetachedSequenceId, EditId, NodeId, TraitLabel } from '../../Identifiers';\nimport { compareArrays, comparePayloads, fail } from '../../Common';\nimport { initialTree } from '../../InitialTree';\nimport { Snapshot } from '../../Snapshot';\nimport { SharedTree, Change, setTrait, SharedTreeFactory, StablePlace } from '../../default-edits';\nimport { ChangeNode, Edit, GenericSharedTree, newEdit, NodeData, TraitLocation } from '../../generic';\nimport { SharedTreeWithAnchors, SharedTreeWithAnchorsFactory } from '../../anchored-edits';\nimport { SharedTreeDiagnosticEvent } from '../../generic/GenericSharedTree';\n\n/** Objects returned by setUpTestSharedTree */\nexport interface SharedTreeTestingComponents<TSharedTree = SharedTree> {\n\t/** The MockFluidDataStoreRuntime used to created the SharedTree. */\n\tcomponentRuntime: MockFluidDataStoreRuntime;\n\t/**\n\t * The MockContainerRuntimeFactory created if one was not provided in the options.\n\t * Only connected to the SharedTree if the localMode option was set to false.\n\t * */\n\tcontainerRuntimeFactory: MockContainerRuntimeFactory;\n\t/** The SharedTree created and set up. */\n\ttree: TSharedTree;\n}\n\n/** Options used to customize setUpTestSharedTree */\nexport interface SharedTreeTestingOptions {\n\t/**\n\t * Id for the SharedTree to be created.\n\t * If two SharedTrees have the same id and the same containerRuntimeFactory,\n\t * they will collaborate (send edits to each other)\n\t */\n\tid?: string;\n\t/** Node to initialize the SharedTree with. */\n\tinitialTree?: ChangeNode;\n\t/** If false, a MockContainerRuntimeFactory connected to the SharedTree will be returned. */\n\tlocalMode?: boolean;\n\t/**\n\t * MockContainerRuntimeFactory to connect the SharedTree to. A new one will not be created if one is provided.\n\t * If localMode is set to true, it will not be connected to the created SharedTree.\n\t * */\n\tcontainerRuntimeFactory?: MockContainerRuntimeFactory;\n\t/** Iff true, do not `fail` on invalid edits */\n\tallowInvalid?: boolean;\n\t/** Iff true, do not `fail` on malformed edits */\n\tallowMalformed?: boolean;\n\t/** Unless set to true, a SharedTree error causes the test to fail */\n\tnoFailOnError?: boolean;\n\t/**\n\t * If not set, full history will be preserved.\n\t */\n\tsummarizeHistory?: boolean;\n\t/**\n\t * If set, uses the given id as the edit id for tree setup. Only has an effect if initialTree is also set.\n\t */\n\tsetupEditId?: EditId;\n\n\t/**\n\t * Telemetry logger injected into the SharedTree.\n\t */\n\tlogger?: ITelemetryBaseLogger;\n}\n\n/** Left node of 'simpleTestTree' */\nexport const left: ChangeNode = makeEmptyNode('a083857d-a8e1-447a-ba7c-92fd0be9db2b' as NodeId);\n\n/** Right node of 'simpleTestTree' */\nexport const right: ChangeNode = makeEmptyNode('78849e85-cb7f-4b93-9fdc-18439c60fe30' as NodeId);\n\n/** Label for the 'left' trait in 'simpleTestTree' */\nexport const leftTraitLabel = 'left' as TraitLabel;\n\n/** Label for the 'right' trait in 'simpleTestTree' */\nexport const rightTraitLabel = 'right' as TraitLabel;\n\n/** A simple, three node tree useful for testing. Contains one node under a 'left' trait and one under a 'right' trait. */\nexport const simpleTestTree: ChangeNode = {\n\t...makeEmptyNode('25de3875-9537-47ec-8699-8a85e772a509' as NodeId),\n\ttraits: { [leftTraitLabel]: [left], [rightTraitLabel]: [right] },\n};\n\n/** Convenient pre-made TraitLocation for the left trait of 'simpleTestTree'. */\nexport const leftTraitLocation = {\n\tparent: simpleTestTree.identifier,\n\tlabel: leftTraitLabel,\n};\n\n/** Convenient pre-made TraitLocation for the right trait of 'simpleTestTree'. */\nexport const rightTraitLocation = {\n\tparent: simpleTestTree.identifier,\n\tlabel: rightTraitLabel,\n};\n\n/** Convenient pre-made Snapshot for 'simpleTestTree'. */\nexport const simpleTreeSnapshot = Snapshot.fromTree(simpleTestTree);\n\n/** Convenient pre-made Snapshot for 'initialTree'. */\nexport const initialSnapshot = Snapshot.fromTree(initialTree);\n\n/**\n * Convenient pre-made Snapshot for 'simpleTestTree'.\n * Expensive validation is turned on for this snapshot, and it should not be used for performance testing.\n */\nexport const simpleTreeSnapshotWithValidation = Snapshot.fromTree(simpleTestTree, true);\n\n/**\n * Convenient pre-made Snapshot for 'initialTree'.\n * Expensive validation is turned on for this snapshot, and it should not be used for performance testing.\n */\nexport const initialSnapshotWithValidation = Snapshot.fromTree(initialTree, true);\n\nexport const testTrait: TraitLocation = {\n\tparent: initialSnapshot.root,\n\tlabel: 'e276f382-fa99-49a1-ae81-42001791c733' as TraitLabel,\n};\n\n/** Sets up and returns an object of components useful for testing SharedTree. */\nexport function setUpTestSharedTree(options?: SharedTreeTestingOptions): SharedTreeTestingComponents {\n\treturn setUpTestSharedTreeGeneric(SharedTree.getFactory, options);\n}\n\n/** Sets up and returns an object of components useful for testing SharedTreeWithAnchors. */\nexport function setUpTestSharedTreeWithAnchors(\n\toptions?: SharedTreeTestingOptions\n): SharedTreeTestingComponents<SharedTreeWithAnchors> {\n\treturn setUpTestSharedTreeGeneric(SharedTreeWithAnchors.getFactory, options);\n}\n\nfunction setUpTestSharedTreeGeneric<\n\tTSharedTree extends SharedTree | SharedTreeWithAnchors,\n\tTSharedTreeFactory extends SharedTreeFactory | SharedTreeWithAnchorsFactory\n>(\n\tfactoryGetter: (summarizeHistory?: boolean) => TSharedTreeFactory,\n\toptions: SharedTreeTestingOptions = { localMode: true }\n): SharedTreeTestingComponents<TSharedTree> {\n\tconst { id, initialTree, localMode, containerRuntimeFactory, setupEditId } = options;\n\tlet componentRuntime: MockFluidDataStoreRuntime;\n\tif (options.logger) {\n\t\tconst proxyHandler: ProxyHandler<MockFluidDataStoreRuntime> = {\n\t\t\tget: (target, prop, receiver) => {\n\t\t\t\tif (prop === 'logger' && options.logger) {\n\t\t\t\t\treturn options.logger;\n\t\t\t\t}\n\t\t\t\treturn target[prop as keyof MockFluidDataStoreRuntime];\n\t\t\t},\n\t\t};\n\t\tcomponentRuntime = new Proxy(new MockFluidDataStoreRuntime(), proxyHandler);\n\t} else {\n\t\tcomponentRuntime = new MockFluidDataStoreRuntime();\n\t}\n\n\t// Enable expensiveValidation\n\tconst factory = factoryGetter(options.summarizeHistory);\n\tconst tree = factory.create(componentRuntime, id === undefined ? 'testSharedTree' : id, true) as TSharedTree;\n\n\tif (options.allowInvalid === undefined || !options.allowInvalid) {\n\t\ttree.on(SharedTreeDiagnosticEvent.DroppedInvalidEdit, () => fail('unexpected invalid edit'));\n\t}\n\n\tif (options.allowMalformed === undefined || !options.allowMalformed) {\n\t\ttree.on(SharedTreeDiagnosticEvent.DroppedMalformedEdit, () => fail('unexpected malformed edit'));\n\t}\n\n\tif (options.noFailOnError === undefined || !options.noFailOnError) {\n\t\t// any errors thrown by a SharedObject event listener will be caught and\n\t\t// reemitted on this event. For testing purposes, rethrow so that it\n\t\t// actually causes the test to fail.\n\t\ttree.on('error', (error) => {\n\t\t\tthrow error;\n\t\t});\n\t}\n\n\tconst newContainerRuntimeFactory = containerRuntimeFactory || new MockContainerRuntimeFactory();\n\n\tif (localMode === true) {\n\t\tcomponentRuntime.local = true;\n\t} else {\n\t\tconst containerRuntime = newContainerRuntimeFactory.createContainerRuntime(componentRuntime);\n\t\tconst services = {\n\t\t\tdeltaConnection: containerRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: new MockStorage(undefined),\n\t\t};\n\t\ttree.connect(services);\n\t}\n\n\tif (initialTree !== undefined) {\n\t\tsetTestTree(tree, initialTree, setupEditId);\n\t}\n\n\treturn {\n\t\tcomponentRuntime,\n\t\tcontainerRuntimeFactory: newContainerRuntimeFactory,\n\t\ttree,\n\t};\n}\n\nconst TestDataStoreType = '@fluid-example/test-dataStore';\n\n/** Objects returned by setUpLocalServerTestSharedTree */\nexport interface LocalServerSharedTreeTestingComponents<TSharedTree = SharedTree> {\n\t/** The testObjectProvider created if one was not set in the options. */\n\ttestObjectProvider: TestObjectProvider;\n\t/** The SharedTree created and set up. */\n\ttree: TSharedTree;\n}\n\n/** Options used to customize setUpLocalServerTestSharedTree */\nexport interface LocalServerSharedTreeTestingOptions {\n\t/**\n\t * Id for the SharedTree to be created.\n\t * If two SharedTrees have the same id and the same testObjectProvider,\n\t * they will collaborate (send edits to each other)\n\t */\n\tid?: string;\n\t/** Node to initialize the SharedTree with. */\n\tinitialTree?: ChangeNode;\n\t/** If set, uses the provider to create the container and create the SharedTree. */\n\ttestObjectProvider?: TestObjectProvider;\n\t/**\n\t * If not set, full history will be preserved.\n\t */\n\tsummarizeHistory?: boolean;\n\t/**\n\t * If set, uses the given id as the edit id for tree setup. Only has an effect if initialTree is also set.\n\t */\n\tsetupEditId?: EditId;\n}\n\n/**\n * Sets up and returns an object of components useful for testing SharedTree with a local server.\n * Required for tests that involve the uploadBlob API.\n *\n * If using this method, be sure to clean up server state by calling `reset` on the TestObjectProvider.\n */\nexport async function setUpLocalServerTestSharedTree(\n\toptions: LocalServerSharedTreeTestingOptions\n): Promise<LocalServerSharedTreeTestingComponents> {\n\treturn setUpLocalServerTestSharedTreeGeneric(SharedTree.getFactory, options);\n}\n\n/**\n * Sets up and returns an object of components useful for testing SharedTreeWithAnchors with a local server.\n * Required for tests that involve the uploadBlob API.\n *\n * If using this method, be sure to clean up server state by calling `reset` on the TestObjectProvider.\n */\nexport async function setUpLocalServerTestSharedTreeWithAnchors(\n\toptions: LocalServerSharedTreeTestingOptions\n): Promise<LocalServerSharedTreeTestingComponents<SharedTreeWithAnchors>> {\n\treturn setUpLocalServerTestSharedTreeGeneric(SharedTreeWithAnchors.getFactory, options);\n}\n\nasync function setUpLocalServerTestSharedTreeGeneric<\n\tTSharedTree extends SharedTree | SharedTreeWithAnchors,\n\tTSharedTreeFactory extends SharedTreeFactory | SharedTreeWithAnchorsFactory\n>(\n\tfactoryGetter: (summarizeHistory?: boolean) => TSharedTreeFactory,\n\toptions: LocalServerSharedTreeTestingOptions\n): Promise<LocalServerSharedTreeTestingComponents<TSharedTree>> {\n\tconst { id, initialTree, testObjectProvider, setupEditId, summarizeHistory } = options;\n\n\tconst treeId = id ?? 'test';\n\tconst registry: ChannelFactoryRegistry = [[treeId, factoryGetter(summarizeHistory)]];\n\tconst innerRequestHandler = async (request: IRequest, runtime: IContainerRuntimeBase) =>\n\t\truntime.IFluidHandleContext.resolveHandle(request);\n\tconst runtimeFactory = () =>\n\t\tnew TestContainerRuntimeFactory(\n\t\t\tTestDataStoreType,\n\t\t\tnew TestFluidObjectFactory(registry),\n\t\t\t{\n\t\t\t\tsummaryOptions: { initialSummarizerDelayMs: 0 },\n\t\t\t},\n\t\t\t[innerRequestHandler]\n\t\t);\n\n\tlet provider: TestObjectProvider;\n\tlet container: IContainer;\n\n\tif (testObjectProvider !== undefined) {\n\t\tprovider = testObjectProvider;\n\t\tcontainer = await provider.loadTestContainer();\n\t} else {\n\t\tprovider = new TestObjectProvider(Loader, await createFluidTestDriver(), runtimeFactory);\n\t\tcontainer = await provider.makeTestContainer();\n\t}\n\n\tconst dataObject = await requestFluidObject<ITestFluidObject>(container, 'default');\n\tconst tree = await dataObject.getSharedObject<TSharedTree>(treeId);\n\n\tif (initialTree !== undefined && testObjectProvider === undefined) {\n\t\tsetTestTree(tree, initialTree, setupEditId);\n\t}\n\n\treturn { tree, testObjectProvider: provider };\n}\n\n/** Sets testTrait to contain `node`. */\nexport function setTestTree<TExtraChangeTypes = never>(\n\ttree: GenericSharedTree<TExtraChangeTypes | Change>,\n\tnode: ChangeNode,\n\toverrideId?: EditId\n): EditId {\n\tconst edit = newEdit(setTrait(testTrait, [node]));\n\ttree.processLocalEdit({ ...edit, id: overrideId || edit.id });\n\treturn overrideId || edit.id;\n}\n\n/** Creates an empty node for testing purposes. */\nexport function makeEmptyNode(identifier: NodeId = uuidv4() as NodeId): ChangeNode {\n\tconst definition = 'node' as Definition;\n\treturn { definition, identifier, traits: {} };\n}\n\n/** Creates a node with two children, one under a 'left' trait and one under a 'right' trait */\nexport function makeTestNode(identifier: NodeId = uuidv4() as NodeId): ChangeNode {\n\tconst definition = 'node' as Definition;\n\tconst left: ChangeNode = makeEmptyNode('c4acaed2-afac-417e-a3d7-07ea73c0330a' as NodeId);\n\tconst right: ChangeNode = makeEmptyNode('452c618a-ba0c-4d9b-89f3-2248d27f8c7f' as NodeId);\n\tconst leftTraitLabel = 'left' as TraitLabel;\n\tconst rightTraitLabel = 'right' as TraitLabel;\n\treturn {\n\t\tdefinition,\n\t\tidentifier,\n\t\ttraits: { [leftTraitLabel]: [left], [rightTraitLabel]: [right] },\n\t};\n}\n\n/**\n * Creates a list of edits with stable IDs that can be processed by a SharedTree.\n * @param numberOfEdits - the number of edits to create\n * @returns the list of created edits\n */\nexport function createStableEdits(numberOfEdits: number): Edit<Change>[] {\n\tconst uuidNamespace = '44864298-500e-4cf8-9f44-a249e5b3a286';\n\n\t// First edit is an insert\n\tconst nodeId = 'ae6b24eb-6fa8-42cc-abd2-48f250b7798f' as NodeId;\n\tconst node = makeEmptyNode(nodeId);\n\tconst firstEdit = newEdit([\n\t\tChange.build([node], 0 as DetachedSequenceId),\n\t\tChange.insert(0 as DetachedSequenceId, StablePlace.before(left)),\n\t]);\n\n\tconst edits: Edit<Change>[] = [];\n\tedits.push({ ...firstEdit, id: uuidv5('test', uuidNamespace) as EditId });\n\n\t// Every subsequent edit is a set payload\n\tfor (let i = 1; i < numberOfEdits - 1; i++) {\n\t\tconst edit = newEdit([Change.setPayload(nodeId, i)]);\n\t\tedits.push({ ...edit, id: uuidv5(i.toString(), uuidNamespace) as EditId });\n\t}\n\n\treturn edits;\n}\n\n/** Asserts that changes to SharedTree in editor() function do not cause any observable state change */\nexport function assertNoDelta<TChange>(tree: GenericSharedTree<TChange>, editor: () => void) {\n\tconst snapshotA = tree.currentView;\n\teditor();\n\tconst snapshotB = tree.currentView;\n\tconst delta = snapshotA.delta(snapshotB);\n\texpect(delta).deep.equals({\n\t\tchanged: [],\n\t\tadded: [],\n\t\tremoved: [],\n\t});\n}\n\n/**\n * Used to test error throwing in async functions.\n */\nexport async function asyncFunctionThrowsCorrectly(\n\tasyncFunction: () => Promise<unknown>,\n\texpectedError: string\n): Promise<boolean> {\n\tlet errorMessage;\n\n\ttry {\n\t\tawait asyncFunction();\n\t} catch (error) {\n\t\terrorMessage = error.message;\n\t}\n\n\treturn errorMessage === expectedError;\n}\n\n/*\n * Returns true if two nodes have equivalent data, otherwise false.\n * Does not compare children or payloads.\n * @param nodes - two or more nodes to compare\n */\nexport function areNodesEquivalent(...nodes: NodeData[]): boolean {\n\tif (nodes.length < 2) {\n\t\tfail('Too few nodes to compare');\n\t}\n\n\tfor (let i = 1; i < nodes.length; i++) {\n\t\tif (nodes[i].definition !== nodes[0].definition) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (nodes[i].identifier !== nodes[0].identifier) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/**\n * Check if two trees are equivalent, meaning they have the same descendants with the same properties.\n *\n * See {@link comparePayloads} for payload comparison semantics.\n */\nexport function deepCompareNodes(a: ChangeNode, b: ChangeNode): boolean {\n\tif (a.identifier !== b.identifier) {\n\t\treturn false;\n\t}\n\n\tif (a.definition !== b.definition) {\n\t\treturn false;\n\t}\n\n\tif (!comparePayloads(a.payload, b.payload)) {\n\t\treturn false;\n\t}\n\n\tconst traitsA = Object.entries(a.traits);\n\tconst traitsB = Object.entries(b.traits);\n\n\tif (traitsA.length !== traitsB.length) {\n\t\treturn false;\n\t}\n\n\tfor (const [traitLabel, childrenA] of traitsA) {\n\t\tconst childrenB = b.traits[traitLabel];\n\n\t\tif (childrenA.length !== childrenB.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst traitsEqual = compareArrays(childrenA, childrenB, (childA, childB) => {\n\t\t\tif (typeof childA === 'number' || typeof childB === 'number') {\n\t\t\t\t// Check if children are DetachedSequenceIds\n\t\t\t\treturn childA === childB;\n\t\t\t}\n\n\t\t\treturn deepCompareNodes(childA, childB);\n\t\t});\n\n\t\tif (!traitsEqual) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluid-experimental/tree",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.55.2",
|
|
4
4
|
"description": "Distributed tree",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": "https://github.com/microsoft/FluidFramework",
|
|
@@ -34,10 +34,11 @@
|
|
|
34
34
|
"@fluidframework/common-utils": "^0.32.1",
|
|
35
35
|
"@fluidframework/container-definitions": "^0.44.0",
|
|
36
36
|
"@fluidframework/core-interfaces": "^0.41.0",
|
|
37
|
-
"@fluidframework/datastore-definitions": "^0.
|
|
37
|
+
"@fluidframework/datastore-definitions": "^0.55.2",
|
|
38
38
|
"@fluidframework/protocol-definitions": "^0.1026.0",
|
|
39
|
-
"@fluidframework/
|
|
40
|
-
"@fluidframework/
|
|
39
|
+
"@fluidframework/runtime-definitions": "^0.55.2",
|
|
40
|
+
"@fluidframework/shared-object-base": "^0.55.2",
|
|
41
|
+
"@fluidframework/telemetry-utils": "^0.55.2",
|
|
41
42
|
"buffer": "^6.0.3",
|
|
42
43
|
"denque": "^1.5.0",
|
|
43
44
|
"lru-cache": "^6.0.0",
|
|
@@ -46,30 +47,31 @@
|
|
|
46
47
|
},
|
|
47
48
|
"devDependencies": {
|
|
48
49
|
"@fluidframework/build-common": "^0.23.0",
|
|
49
|
-
"@fluidframework/container-loader": "^0.
|
|
50
|
-
"@fluidframework/eslint-config-fluid": "^0.
|
|
51
|
-
"@fluidframework/mocha-test-setup": "^0.
|
|
52
|
-
"@fluidframework/runtime-definitions": "^0.
|
|
53
|
-
"@fluidframework/runtime-utils": "^0.
|
|
54
|
-
"@fluidframework/test-drivers": "^0.
|
|
55
|
-
"@fluidframework/test-runtime-utils": "^0.
|
|
56
|
-
"@fluidframework/test-utils": "^0.
|
|
50
|
+
"@fluidframework/container-loader": "^0.55.2",
|
|
51
|
+
"@fluidframework/eslint-config-fluid": "^0.25.0",
|
|
52
|
+
"@fluidframework/mocha-test-setup": "^0.55.2",
|
|
53
|
+
"@fluidframework/runtime-definitions": "^0.55.2",
|
|
54
|
+
"@fluidframework/runtime-utils": "^0.55.2",
|
|
55
|
+
"@fluidframework/test-drivers": "^0.55.2",
|
|
56
|
+
"@fluidframework/test-runtime-utils": "^0.55.2",
|
|
57
|
+
"@fluidframework/test-utils": "^0.55.2",
|
|
57
58
|
"@microsoft/api-extractor": "^7.16.1",
|
|
59
|
+
"@rushstack/eslint-config": "^2.5.1",
|
|
58
60
|
"@types/lru-cache": "^5.1.0",
|
|
59
|
-
"@typescript-eslint/eslint-plugin": "~
|
|
60
|
-
"@typescript-eslint/parser": "~
|
|
61
|
+
"@typescript-eslint/eslint-plugin": "~5.9.0",
|
|
62
|
+
"@typescript-eslint/parser": "~5.9.0",
|
|
61
63
|
"chai": "^4.2.0",
|
|
62
64
|
"concurrently": "^6.2.0",
|
|
63
65
|
"cross-env": "^7.0.2",
|
|
64
66
|
"easy-table": "^1.1.1",
|
|
65
67
|
"env-cmd": "^10.1.0",
|
|
66
|
-
"eslint": "~
|
|
68
|
+
"eslint": "~8.6.0",
|
|
69
|
+
"eslint-plugin-editorconfig": "~3.2.0",
|
|
67
70
|
"eslint-plugin-eslint-comments": "~3.2.0",
|
|
68
|
-
"eslint-plugin-import": "~2.
|
|
71
|
+
"eslint-plugin-import": "~2.25.4",
|
|
69
72
|
"eslint-plugin-no-null": "~1.0.2",
|
|
70
|
-
"eslint-plugin-
|
|
71
|
-
"eslint-plugin-
|
|
72
|
-
"eslint-plugin-unicorn": "~26.0.1",
|
|
73
|
+
"eslint-plugin-react": "~7.28.0",
|
|
74
|
+
"eslint-plugin-unicorn": "~40.0.0",
|
|
73
75
|
"mocha": "^8.4.0",
|
|
74
76
|
"nyc": "^15.0.0",
|
|
75
77
|
"prettier": "^2.3.1",
|
|
@@ -47,6 +47,8 @@ export class RevisionValueCache<TValue> {
|
|
|
47
47
|
* The first revision within the retention window. All entries with revisions >= retentionWindowStart will be retained.
|
|
48
48
|
* Must be >= 0.
|
|
49
49
|
*/
|
|
50
|
+
// False positive
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/prefer-readonly
|
|
50
52
|
private retentionWindowStart: Revision,
|
|
51
53
|
/**
|
|
52
54
|
* Optional list of entries to permanently retain.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { IFluidSerializer } from '@fluidframework/
|
|
6
|
+
import { IFluidSerializer } from '@fluidframework/shared-object-base';
|
|
7
7
|
import { ErrorString } from './Common';
|
|
8
8
|
import { EditLog } from './EditLog';
|
|
9
9
|
import { ChangeNode, Edit, SharedTreeSummaryBase, SharedTreeSummary } from './generic';
|
|
@@ -25,7 +25,9 @@ export interface IUndoConsumer {
|
|
|
25
25
|
* undo redo stack manager
|
|
26
26
|
*/
|
|
27
27
|
export class SharedTreeUndoRedoHandler {
|
|
28
|
-
|
|
28
|
+
// False positive
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/prefer-readonly
|
|
30
|
+
constructor(private stackManager: IUndoConsumer) {}
|
|
29
31
|
|
|
30
32
|
public attachTree(tree: SharedTree) {
|
|
31
33
|
tree.on(SharedTreeEvent.EditCommitted, this.treeDeltaHandler);
|
|
@@ -55,6 +57,8 @@ export class SharedTreeUndoRedoHandler {
|
|
|
55
57
|
* Tracks a change on a shared tree and allows reverting it
|
|
56
58
|
*/
|
|
57
59
|
export class SharedTreeRevertible implements IRevertible {
|
|
60
|
+
// False positive
|
|
61
|
+
// eslint-disable-next-line @typescript-eslint/prefer-readonly
|
|
58
62
|
constructor(private editId: EditId, private readonly tree: SharedTree) {}
|
|
59
63
|
|
|
60
64
|
public revert() {
|
|
@@ -4,17 +4,24 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { bufferToString, IsoBuffer } from '@fluidframework/common-utils';
|
|
7
|
-
import { IFluidHandle
|
|
8
|
-
import {
|
|
7
|
+
import { IFluidHandle } from '@fluidframework/core-interfaces';
|
|
8
|
+
import { ISequencedDocumentMessage } from '@fluidframework/protocol-definitions';
|
|
9
9
|
import {
|
|
10
10
|
IFluidDataStoreRuntime,
|
|
11
11
|
IChannelStorageService,
|
|
12
12
|
IChannelAttributes,
|
|
13
13
|
} from '@fluidframework/datastore-definitions';
|
|
14
14
|
import { AttachState } from '@fluidframework/container-definitions';
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
createSingleBlobSummary,
|
|
17
|
+
IFluidSerializer,
|
|
18
|
+
ISharedObjectEvents,
|
|
19
|
+
serializeHandles,
|
|
20
|
+
SharedObject,
|
|
21
|
+
} from '@fluidframework/shared-object-base';
|
|
16
22
|
import { ITelemetryLogger } from '@fluidframework/common-definitions';
|
|
17
23
|
import { ChildLogger, ITelemetryLoggerPropertyBags, PerformanceEvent } from '@fluidframework/telemetry-utils';
|
|
24
|
+
import { ISummaryTreeWithStats } from '@fluidframework/runtime-definitions';
|
|
18
25
|
import { assert, assertNotUndefined, fail } from '../Common';
|
|
19
26
|
import { EditLog, OrderedEditSet } from '../EditLog';
|
|
20
27
|
import { EditId } from '../Identifiers';
|
|
@@ -303,24 +310,10 @@ export abstract class GenericSharedTree<TChange> extends SharedObject<ISharedTre
|
|
|
303
310
|
}
|
|
304
311
|
|
|
305
312
|
/**
|
|
306
|
-
* {@inheritDoc @fluidframework/shared-object-base#SharedObject.
|
|
313
|
+
* {@inheritDoc @fluidframework/shared-object-base#SharedObject.summarizeCore}
|
|
307
314
|
*/
|
|
308
|
-
public
|
|
309
|
-
|
|
310
|
-
entries: [
|
|
311
|
-
{
|
|
312
|
-
mode: FileMode.File,
|
|
313
|
-
path: snapshotFileName,
|
|
314
|
-
type: TreeEntry[TreeEntry.Blob],
|
|
315
|
-
value: {
|
|
316
|
-
contents: this.saveSerializedSummary({ serializer }),
|
|
317
|
-
encoding: 'utf-8',
|
|
318
|
-
},
|
|
319
|
-
},
|
|
320
|
-
],
|
|
321
|
-
};
|
|
322
|
-
|
|
323
|
-
return tree;
|
|
315
|
+
public summarizeCore(serializer: IFluidSerializer, fullTree: boolean): ISummaryTreeWithStats {
|
|
316
|
+
return createSingleBlobSummary(snapshotFileName, this.saveSerializedSummary({ serializer }));
|
|
324
317
|
}
|
|
325
318
|
|
|
326
319
|
/**
|
|
@@ -508,7 +501,7 @@ export abstract class GenericSharedTree<TChange> extends SharedObject<ISharedTre
|
|
|
508
501
|
this.editLog.processEditChunkHandle(this.deserializeHandle(editHandle), startRevision);
|
|
509
502
|
} else if (type === SharedTreeOpType.Edit) {
|
|
510
503
|
const semiSerializedEdit = message.contents.edit;
|
|
511
|
-
// semiSerializedEdit may have handles which have been replaced by `serializer.
|
|
504
|
+
// semiSerializedEdit may have handles which have been replaced by `serializer.encode`.
|
|
512
505
|
// Since there is no API to un-replace them except via parse, re-stringify the edit, then parse it.
|
|
513
506
|
// Stringify using JSON, not IFluidSerializer since OPs use JSON directly.
|
|
514
507
|
// TODO:Performance:#48025: Avoid this serialization round trip.
|
|
@@ -583,7 +576,7 @@ export abstract class GenericSharedTree<TChange> extends SharedObject<ISharedTre
|
|
|
583
576
|
// IFluidHandles are not allowed in Ops.
|
|
584
577
|
// Ops can contain Fluid's Serializable (for payloads) which allows IFluidHandles.
|
|
585
578
|
// So replace the handles before sending:
|
|
586
|
-
const semiSerialized = this.serializer.
|
|
579
|
+
const semiSerialized = this.serializer.encode(editOp, this.handle);
|
|
587
580
|
|
|
588
581
|
// TODO:44711: what should be passed in when unattached?
|
|
589
582
|
this.submitLocalMessage(semiSerialized);
|
package/src/generic/Summary.ts
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { IFluidHandle
|
|
7
|
-
import { serializeHandles } from '@fluidframework/shared-object-base';
|
|
6
|
+
import { IFluidHandle } from '@fluidframework/core-interfaces';
|
|
7
|
+
import { IFluidSerializer, serializeHandles } from '@fluidframework/shared-object-base';
|
|
8
8
|
import { assert, assertNotUndefined } from '../Common';
|
|
9
9
|
import { EditLogSummary, OrderedEditSet } from '../EditLog';
|
|
10
10
|
import { Snapshot } from '../Snapshot';
|