@fluidframework/tree 2.0.0-dev-rc.5.0.0.271717 → 2.0.0-dev-rc.5.0.0.272251

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/api-extractor/api-extractor-lint-beta.cjs.json +5 -0
  2. package/api-extractor/api-extractor-lint-beta.esm.json +5 -0
  3. package/api-extractor/api-extractor-lint-bundle.json +5 -0
  4. package/api-extractor/api-extractor-lint-public.cjs.json +5 -0
  5. package/api-extractor/api-extractor-lint-public.esm.json +5 -0
  6. package/dist/feature-libraries/index.d.ts +1 -1
  7. package/dist/feature-libraries/index.d.ts.map +1 -1
  8. package/dist/feature-libraries/index.js +2 -3
  9. package/dist/feature-libraries/index.js.map +1 -1
  10. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +7 -7
  11. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  12. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js +6 -6
  13. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  14. package/dist/feature-libraries/modular-schema/index.d.ts +1 -1
  15. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  16. package/dist/feature-libraries/modular-schema/index.js +2 -2
  17. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  18. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +2 -0
  19. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  20. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +37 -19
  21. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  22. package/dist/feature-libraries/optional-field/optionalField.js +2 -2
  23. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  24. package/dist/feature-libraries/sequence-field/rebase.d.ts +2 -2
  25. package/dist/feature-libraries/sequence-field/rebase.d.ts.map +1 -1
  26. package/dist/feature-libraries/sequence-field/rebase.js +20 -14
  27. package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
  28. package/dist/packageVersion.d.ts +1 -1
  29. package/dist/packageVersion.js +1 -1
  30. package/dist/packageVersion.js.map +1 -1
  31. package/dist/shared-tree-core/branch.d.ts +18 -0
  32. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  33. package/dist/shared-tree-core/branch.js +3 -0
  34. package/dist/shared-tree-core/branch.js.map +1 -1
  35. package/dist/shared-tree-core/branchCommitEnricher.d.ts +4 -2
  36. package/dist/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
  37. package/dist/shared-tree-core/branchCommitEnricher.js +11 -4
  38. package/dist/shared-tree-core/branchCommitEnricher.js.map +1 -1
  39. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  40. package/dist/shared-tree-core/sharedTreeCore.js +9 -0
  41. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  42. package/dist/shared-tree-core/transactionEnricher.d.ts +11 -1
  43. package/dist/shared-tree-core/transactionEnricher.d.ts.map +1 -1
  44. package/dist/shared-tree-core/transactionEnricher.js +24 -1
  45. package/dist/shared-tree-core/transactionEnricher.js.map +1 -1
  46. package/lib/feature-libraries/index.d.ts +1 -1
  47. package/lib/feature-libraries/index.d.ts.map +1 -1
  48. package/lib/feature-libraries/index.js +1 -1
  49. package/lib/feature-libraries/index.js.map +1 -1
  50. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +7 -7
  51. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  52. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js +5 -5
  53. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  54. package/lib/feature-libraries/modular-schema/index.d.ts +1 -1
  55. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  56. package/lib/feature-libraries/modular-schema/index.js +1 -1
  57. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  58. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +2 -0
  59. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  60. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +38 -20
  61. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  62. package/lib/feature-libraries/optional-field/optionalField.js +3 -3
  63. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  64. package/lib/feature-libraries/sequence-field/rebase.d.ts +2 -2
  65. package/lib/feature-libraries/sequence-field/rebase.d.ts.map +1 -1
  66. package/lib/feature-libraries/sequence-field/rebase.js +21 -15
  67. package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
  68. package/lib/packageVersion.d.ts +1 -1
  69. package/lib/packageVersion.js +1 -1
  70. package/lib/packageVersion.js.map +1 -1
  71. package/lib/shared-tree-core/branch.d.ts +18 -0
  72. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  73. package/lib/shared-tree-core/branch.js +3 -0
  74. package/lib/shared-tree-core/branch.js.map +1 -1
  75. package/lib/shared-tree-core/branchCommitEnricher.d.ts +4 -2
  76. package/lib/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
  77. package/lib/shared-tree-core/branchCommitEnricher.js +11 -4
  78. package/lib/shared-tree-core/branchCommitEnricher.js.map +1 -1
  79. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  80. package/lib/shared-tree-core/sharedTreeCore.js +9 -0
  81. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  82. package/lib/shared-tree-core/transactionEnricher.d.ts +11 -1
  83. package/lib/shared-tree-core/transactionEnricher.d.ts.map +1 -1
  84. package/lib/shared-tree-core/transactionEnricher.js +24 -1
  85. package/lib/shared-tree-core/transactionEnricher.js.map +1 -1
  86. package/package.json +27 -24
  87. package/src/feature-libraries/index.ts +0 -1
  88. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +6 -7
  89. package/src/feature-libraries/modular-schema/index.ts +1 -1
  90. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +55 -23
  91. package/src/feature-libraries/optional-field/optionalField.ts +3 -3
  92. package/src/feature-libraries/sequence-field/rebase.ts +15 -33
  93. package/src/packageVersion.ts +1 -1
  94. package/src/shared-tree-core/branch.ts +24 -0
  95. package/src/shared-tree-core/branchCommitEnricher.ts +15 -6
  96. package/src/shared-tree-core/sharedTreeCore.ts +9 -0
  97. package/src/shared-tree-core/transactionEnricher.ts +27 -1
  98. package/tsdoc.json +4 -0
@@ -1 +1 @@
1
- {"version":3,"file":"branch.js","sourceRoot":"","sources":["../../src/shared-tree-core/branch.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nimport {\n\ttype BranchRebaseResult,\n\ttype ChangeFamily,\n\ttype ChangeFamilyEditor,\n\tCommitKind,\n\ttype CommitMetadata,\n\ttype GraphCommit,\n\ttype RevisionTag,\n\ttype TaggedChange,\n\tfindAncestor,\n\tmakeAnonChange,\n\tmintCommit,\n\trebaseBranch,\n\ttagChange,\n\ttagRollbackInverse,\n} from \"../core/index.js\";\nimport { EventEmitter, type Listenable } from \"../events/index.js\";\n\nimport { TransactionStack } from \"./transactionStack.js\";\n\n/**\n * Describes a change to a `SharedTreeBranch`. Various operations can mutate the head of the branch;\n * this change format describes each in terms of the \"removed commits\" (all commits which were present\n * on the branch before the operation but are no longer present after) and the \"new commits\" (all\n * commits which are present on the branch after the operation that were not present before). Each of\n * the following event types also provides a `change` which contains the net change to the branch\n * (or is undefined if there was no net change):\n * * Append - when one or more commits are appended to the head of the branch, for example via\n * a change applied by the branch's editor, or as a result of merging another branch into this one\n * * Remove - when one or more commits are removed from the head of the branch. This occurs\n * when a transaction is aborted and all commits pending in that transaction are removed.\n * * Replace - when an operation simultaneously removes and appends commits. For example, when this\n * branch is rebased and some commits are removed and replaced with rebased versions, or when a\n * transaction completes and all pending commits are replaced with a single squash commit.\n */\nexport type SharedTreeBranchChange<TChange> =\n\t| {\n\t\t\ttype: \"append\";\n\t\t\tchange: TaggedChange<TChange>;\n\t\t\tnewCommits: readonly GraphCommit<TChange>[];\n\t }\n\t| {\n\t\t\ttype: \"remove\";\n\t\t\tchange: TaggedChange<TChange> | undefined;\n\t\t\tremovedCommits: readonly GraphCommit<TChange>[];\n\t }\n\t| {\n\t\t\ttype: \"replace\";\n\t\t\tchange: TaggedChange<TChange> | undefined;\n\t\t\tremovedCommits: readonly GraphCommit<TChange>[];\n\t\t\tnewCommits: readonly GraphCommit<TChange>[];\n\t };\n\n/**\n * Returns the operation that caused the given {@link SharedTreeBranchChange}.\n */\nexport function getChangeReplaceType(\n\tchange: SharedTreeBranchChange<unknown> & { type: \"replace\" },\n): \"transactionCommit\" | \"rebase\" {\n\t// The \"replace\" variant of the change event is emitted by two operations: committing a transaction and doing a rebase.\n\t// Committing a transaction will always remove one or more commits (the commits that were squashed),\n\t// and will add exactly one new commit (the squash commit).\n\tif (change.removedCommits.length === 0 || change.newCommits.length !== 1) {\n\t\treturn \"rebase\";\n\t}\n\n\t// There is only one case in which a rebase both removes commits and adds exactly one new commit.\n\t// This occurs when there is exactly one divergent, but equivalent, commit on each branch:\n\t//\n\t// A ─ B (branch X)\t -- rebase Y onto X --> A ─ B (branch X)\n\t// └─ B' (branch Y) └─ (branch Y)\n\t//\n\t// B' is removed and replaced by B because both have the same revision.\n\tif (\n\t\tchange.removedCommits.length === 1 &&\n\t\tchange.removedCommits[0].revision === change.newCommits[0].revision\n\t) {\n\t\treturn \"rebase\";\n\t}\n\n\treturn \"transactionCommit\";\n}\n\n/**\n * The events emitted by a `SharedTreeBranch`\n */\nexport interface SharedTreeBranchEvents<TEditor extends ChangeFamilyEditor, TChange>\n\textends BranchTrimmingEvents {\n\t/**\n\t * Fired just before the head of this branch changes.\n\t * @param change - the change to this branch's state and commits\n\t */\n\tbeforeChange(change: SharedTreeBranchChange<TChange>): void;\n\n\t/**\n\t * Fired just after the head of this branch changes.\n\t * @param change - the change to this branch's state and commits\n\t */\n\tafterChange(change: SharedTreeBranchChange<TChange>): void;\n\n\t/**\n\t * {@inheritdoc TreeViewEvents.commitApplied}\n\t */\n\tcommitApplied(data: CommitMetadata): void;\n\n\t/**\n\t * Fired when this branch forks\n\t * @param fork - the new branch that forked off of this branch\n\t */\n\tfork(fork: SharedTreeBranch<TEditor, TChange>): void;\n\n\t/**\n\t * Fired after this branch is disposed\n\t */\n\tdispose(): void;\n}\n\n/**\n * Events related to branch trimming.\n *\n * @remarks\n * Trimming is a very specific kind of mutation which is the only allowed mutations to branches.\n * References to commits from other commits are removed so that the commit objects can be GC'd by the JS engine.\n * This happens by changing a commit's parent property to undefined, which drops all commits that are in its \"ancestry\".\n * It is done as a performance optimization when it is determined that commits are no longer needed for future computation.\n */\nexport interface BranchTrimmingEvents {\n\t/**\n\t * Fired when some contiguous range of commits beginning with the \"global tail\" of this branch are trimmed from the branch.\n\t * This happens by deleting the parent pointer to the last commit in that range. This event can be fired at any time.\n\t */\n\tancestryTrimmed(trimmedRevisions: RevisionTag[]): void;\n}\n\n/**\n * A branch of changes that can be applied to a SharedTree.\n */\nexport class SharedTreeBranch<TEditor extends ChangeFamilyEditor, TChange> extends EventEmitter<\n\tSharedTreeBranchEvents<TEditor, TChange>\n> {\n\tpublic readonly editor: TEditor;\n\tprivate readonly transactions = new TransactionStack();\n\t/**\n\t * After pushing a starting revision to the transaction stack, this branch might be rebased\n\t * over commits which are children of that starting revision. When the transaction is committed,\n\t * those rebased-over commits should not be included in the transaction's squash commit, even though\n\t * they exist between the starting revision and the final commit within the transaction.\n\t *\n\t * Whenever `rebaseOnto` is called during a transaction, this map is augmented with an entry from the\n\t * original merge-base to the new merge-base.\n\t *\n\t * This state need only be retained for the lifetime of the transaction.\n\t *\n\t * TODO: This strategy might need to be revisited when adding better support for async transactions.\n\t * Since:\n\t *\n\t * 1. Transactionality is guaranteed primarily by squashing at commit time\n\t * 2. Branches may be rebased with an ongoing transaction\n\t *\n\t * a rebase operation might invalidate only a portion of a transaction's commits, thus defeating the\n\t * purpose of transactionality.\n\t *\n\t * AB#6483 and children items track this work.\n\t */\n\tprivate readonly initialTransactionRevToRebasedRev = new Map<RevisionTag, RevisionTag>();\n\tprivate disposed = false;\n\tprivate readonly unsubscribeBranchTrimmer?: () => void;\n\t/**\n\t * Construct a new branch.\n\t * @param head - the head of the branch\n\t * @param changeFamily - determines the set of changes that this branch can commit\n\t * @param branchTrimmer - an optional event emitter that informs the branch it has been trimmed. If this is not supplied, then the branch must\n\t * never be trimmed. See {@link BranchTrimmingEvents} for details on trimming.\n\t */\n\tpublic constructor(\n\t\tprivate head: GraphCommit<TChange>,\n\t\tpublic readonly changeFamily: ChangeFamily<TEditor, TChange>,\n\t\tprivate readonly mintRevisionTag: () => RevisionTag,\n\t\tprivate readonly branchTrimmer?: Listenable<BranchTrimmingEvents>,\n\t) {\n\t\tsuper();\n\t\tthis.editor = this.changeFamily.buildEditor((change) =>\n\t\t\tthis.apply(change, mintRevisionTag()),\n\t\t);\n\t\tthis.unsubscribeBranchTrimmer = branchTrimmer?.on(\"ancestryTrimmed\", (commit) => {\n\t\t\tthis.emit(\"ancestryTrimmed\", commit);\n\t\t});\n\t}\n\n\t/**\n\t * Sets the head of this branch. Emits no change events.\n\t */\n\tpublic setHead(head: GraphCommit<TChange>): void {\n\t\tthis.assertNotDisposed();\n\t\tassert(!this.isTransacting(), 0x685 /* Cannot set head during a transaction */);\n\t\tthis.head = head;\n\t}\n\n\t/**\n\t * Apply a change to this branch.\n\t * @param change - the change to apply\n\t * @param revision - the revision of the new head commit of the branch that contains `change`\n\t * @param changeKind - the kind of change to apply\n\t * @returns the change that was applied and the new head commit of the branch\n\t */\n\tpublic apply(\n\t\tchange: TChange,\n\t\trevision: RevisionTag,\n\t\tchangeKind: CommitKind = CommitKind.Default,\n\t): [change: TChange, newCommit: GraphCommit<TChange>] {\n\t\tthis.assertNotDisposed();\n\n\t\tconst changeWithRevision = this.changeFamily.rebaser.changeRevision(change, revision);\n\n\t\tconst newHead = mintCommit(this.head, {\n\t\t\trevision,\n\t\t\tchange: changeWithRevision,\n\t\t});\n\n\t\tconst changeEvent = {\n\t\t\ttype: \"append\",\n\t\t\tchange: tagChange(changeWithRevision, revision),\n\t\t\tnewCommits: [newHead],\n\t\t} as const;\n\n\t\tthis.emit(\"beforeChange\", changeEvent);\n\t\tthis.head = newHead;\n\n\t\t// If this is not part of a transaction, emit a commitApplied event\n\t\tif (!this.isTransacting()) {\n\t\t\tthis.emit(\"commitApplied\", { isLocal: true, kind: changeKind });\n\t\t}\n\n\t\tthis.emit(\"afterChange\", changeEvent);\n\t\treturn [changeWithRevision, newHead];\n\t}\n\n\t/**\n\t * @returns the commit at the head of this branch.\n\t */\n\tpublic getHead(): GraphCommit<TChange> {\n\t\treturn this.head;\n\t}\n\n\t/**\n\t * Begin a transaction on this branch. If the transaction is committed via {@link commitTransaction},\n\t * all commits made since this call will be squashed into a single head commit.\n\t */\n\tpublic startTransaction(): void {\n\t\tthis.assertNotDisposed();\n\t\tconst forks = new Set<SharedTreeBranch<TEditor, TChange>>();\n\t\tconst onDisposeUnSubscribes: (() => void)[] = [];\n\t\tconst onForkUnSubscribe = onForkTransitive(this, (fork) => {\n\t\t\tforks.add(fork);\n\t\t\tonDisposeUnSubscribes.push(fork.on(\"dispose\", () => forks.delete(fork)));\n\t\t});\n\t\tthis.transactions.push(this.head.revision, () => {\n\t\t\tforks.forEach((fork) => fork.dispose());\n\t\t\tonDisposeUnSubscribes.forEach((unsubscribe) => unsubscribe());\n\t\t\tonForkUnSubscribe();\n\t\t});\n\t\tthis.editor.enterTransaction();\n\t}\n\n\t/**\n\t * Commit the current transaction. There must be a transaction in progress that was begun via {@link startTransaction}.\n\t * If there are commits in the current transaction, they will be squashed into a new single head commit.\n\t * @returns the commits that were squashed and the new squash commit if a squash occurred, otherwise `undefined`.\n\t * @remarks If the transaction had no changes applied during its lifetime, then no squash occurs (i.e. this method is a no-op).\n\t * Even if the transaction contained only one change, it will still be replaced with an (equivalent) squash change.\n\t */\n\tpublic commitTransaction():\n\t\t| [squashedCommits: GraphCommit<TChange>[], newCommit: GraphCommit<TChange>]\n\t\t| undefined {\n\t\tthis.assertNotDisposed();\n\t\tconst [startCommit, commits] = this.popTransaction();\n\t\tthis.editor.exitTransaction();\n\n\t\tif (commits.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Squash the changes and make the squash commit the new head of this branch\n\t\tconst squashedChange = this.changeFamily.rebaser.compose(commits);\n\t\tconst revision = this.mintRevisionTag();\n\n\t\tconst newHead = mintCommit(startCommit, {\n\t\t\trevision,\n\t\t\tchange: this.changeFamily.rebaser.changeRevision(squashedChange, revision),\n\t\t});\n\n\t\tconst changeEvent = {\n\t\t\ttype: \"replace\",\n\t\t\tchange: undefined,\n\t\t\tremovedCommits: commits,\n\t\t\tnewCommits: [newHead],\n\t\t} as const;\n\n\t\tthis.emit(\"beforeChange\", changeEvent);\n\t\tthis.head = newHead;\n\n\t\t// If this transaction is not nested, emit a commitApplied event\n\t\tif (!this.isTransacting()) {\n\t\t\tthis.emit(\"commitApplied\", { isLocal: true, kind: CommitKind.Default });\n\t\t}\n\n\t\tthis.emit(\"afterChange\", changeEvent);\n\t\treturn [commits, newHead];\n\t}\n\n\t/**\n\t * Cancel the current transaction. There must be a transaction in progress that was begun via\n\t * {@link startTransaction}. All commits made during the transaction will be removed.\n\t * @returns the change to this branch resulting in the removal of the commits, and a list of the\n\t * commits that were removed.\n\t */\n\tpublic abortTransaction(): [\n\t\tchange: TChange | undefined,\n\t\tabortedCommits: GraphCommit<TChange>[],\n\t] {\n\t\tthis.assertNotDisposed();\n\t\tconst [startCommit, commits] = this.popTransaction();\n\t\tthis.editor.exitTransaction();\n\n\t\tif (commits.length === 0) {\n\t\t\treturn [undefined, []];\n\t\t}\n\n\t\tconst inverses: TaggedChange<TChange>[] = [];\n\t\tfor (let i = commits.length - 1; i >= 0; i--) {\n\t\t\tconst revision = this.mintRevisionTag();\n\t\t\tconst inverse = this.changeFamily.rebaser.changeRevision(\n\t\t\t\tthis.changeFamily.rebaser.invert(commits[i], false),\n\t\t\t\trevision,\n\t\t\t\tcommits[i].revision,\n\t\t\t);\n\n\t\t\tinverses.push(tagRollbackInverse(inverse, revision, commits[i].revision));\n\t\t}\n\t\tconst change =\n\t\t\tinverses.length > 0 ? this.changeFamily.rebaser.compose(inverses) : undefined;\n\n\t\tconst changeEvent = {\n\t\t\ttype: \"remove\",\n\t\t\tchange: change === undefined ? undefined : makeAnonChange(change),\n\t\t\tremovedCommits: commits,\n\t\t} as const;\n\n\t\tthis.emit(\"beforeChange\", changeEvent);\n\t\tthis.head = startCommit;\n\t\tthis.emit(\"afterChange\", changeEvent);\n\t\treturn [change, commits];\n\t}\n\n\t/**\n\t * True iff this branch is in the middle of a transaction that was begin via {@link startTransaction}\n\t */\n\tpublic isTransacting(): boolean {\n\t\treturn this.transactions.size !== 0;\n\t}\n\n\tprivate popTransaction(): [GraphCommit<TChange>, GraphCommit<TChange>[]] {\n\t\tconst { startRevision: startRevisionOriginal } = this.transactions.pop();\n\t\tlet startRevision = startRevisionOriginal;\n\t\twhile (this.initialTransactionRevToRebasedRev.has(startRevision)) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tstartRevision = this.initialTransactionRevToRebasedRev.get(startRevision)!;\n\t\t}\n\n\t\tif (!this.isTransacting()) {\n\t\t\tthis.initialTransactionRevToRebasedRev.clear();\n\t\t}\n\n\t\tconst commits: GraphCommit<TChange>[] = [];\n\t\tconst startCommit = findAncestor([this.head, commits], (c) => c.revision === startRevision);\n\t\tassert(\n\t\t\tstartCommit !== undefined,\n\t\t\t0x593 /* Expected branch to be ahead of transaction start revision */,\n\t\t);\n\t\treturn [startCommit, commits];\n\t}\n\n\t/**\n\t * Spawn a new branch that is based off of the current state of this branch.\n\t * Changes made to the new branch will not be applied to this branch until the new branch is merged back in.\n\t *\n\t * @remarks Forks created during a transaction will be disposed when the transaction ends.\n\t */\n\tpublic fork(): SharedTreeBranch<TEditor, TChange> {\n\t\tthis.assertNotDisposed();\n\t\tconst fork = new SharedTreeBranch(\n\t\t\tthis.head,\n\t\t\tthis.changeFamily,\n\t\t\tthis.mintRevisionTag,\n\t\t\tthis.branchTrimmer,\n\t\t);\n\t\tthis.emit(\"fork\", fork);\n\t\treturn fork;\n\t}\n\n\t/**\n\t * Rebase the changes that have been applied to this branch over divergent changes in the given branch.\n\t * After this operation completes, this branch will be based off of `branch`.\n\t *\n\t * @param branch - the branch to rebase onto\n\t * @param upTo - the furthest commit on `branch` over which to rebase (inclusive). Defaults to the head commit of `branch`.\n\t * @returns the result of the rebase or undefined if nothing changed\n\t */\n\tpublic rebaseOnto(\n\t\tbranch: SharedTreeBranch<TEditor, TChange>,\n\t\tupTo = branch.getHead(),\n\t): BranchRebaseResult<TChange> | undefined {\n\t\tthis.assertNotDisposed();\n\n\t\t// Rebase this branch onto the given branch\n\t\tconst rebaseResult = this.rebaseBranch(this, branch, upTo);\n\t\tif (rebaseResult === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// The net change to this branch is provided by the `rebaseBranch` API\n\t\tconst { newSourceHead, commits } = rebaseResult;\n\t\tconst { deletedSourceCommits, targetCommits, sourceCommits } = commits;\n\n\t\tconst newCommits = targetCommits.concat(sourceCommits);\n\t\tif (this.isTransacting()) {\n\t\t\tconst src = targetCommits[0].parent?.revision;\n\t\t\tconst dst = targetCommits[targetCommits.length - 1].revision;\n\t\t\tif (src !== undefined && dst !== undefined) {\n\t\t\t\tthis.initialTransactionRevToRebasedRev.set(src, dst);\n\t\t\t}\n\t\t}\n\t\tconst changeEvent = {\n\t\t\ttype: \"replace\",\n\t\t\tget change() {\n\t\t\t\tconst change = rebaseResult.sourceChange;\n\t\t\t\treturn change === undefined ? undefined : makeAnonChange(change);\n\t\t\t},\n\t\t\tremovedCommits: deletedSourceCommits,\n\t\t\tnewCommits,\n\t\t} as const;\n\t\tthis.emit(\"beforeChange\", changeEvent);\n\t\tthis.head = newSourceHead;\n\n\t\tthis.emit(\"afterChange\", changeEvent);\n\t\treturn rebaseResult;\n\t}\n\n\t/**\n\t * Apply all the divergent changes on the given branch to this branch.\n\t *\n\t * @param branch - the branch to merge into this branch\n\t * @returns the net change to this branch and the commits that were added to this branch by the merge,\n\t * or undefined if nothing changed\n\t */\n\tpublic merge(\n\t\tbranch: SharedTreeBranch<TEditor, TChange>,\n\t): [change: TChange, newCommits: GraphCommit<TChange>[]] | undefined {\n\t\tthis.assertNotDisposed();\n\t\tbranch.assertNotDisposed();\n\t\tassert(\n\t\t\t!branch.isTransacting(),\n\t\t\t0x597 /* Branch may not be merged while transaction is in progress */,\n\t\t);\n\n\t\t// Rebase the given branch onto this branch\n\t\tconst rebaseResult = this.rebaseBranch(branch, this);\n\t\tif (rebaseResult === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Compute the net change to this branch\n\t\tconst sourceCommits = rebaseResult.commits.sourceCommits;\n\t\tconst change = this.changeFamily.rebaser.compose(sourceCommits);\n\t\tconst taggedChange = makeAnonChange(change);\n\t\tconst changeEvent = {\n\t\t\ttype: \"append\",\n\t\t\tget change(): TaggedChange<TChange> {\n\t\t\t\treturn taggedChange;\n\t\t\t},\n\t\t\tnewCommits: sourceCommits,\n\t\t} as const;\n\n\t\tthis.emit(\"beforeChange\", changeEvent);\n\t\tthis.head = rebaseResult.newSourceHead;\n\t\tthis.emit(\"afterChange\", changeEvent);\n\t\treturn [change, sourceCommits];\n\t}\n\n\t/** Rebase `branchHead` onto `onto`, but return undefined if nothing changed */\n\tprivate rebaseBranch(\n\t\tbranch: SharedTreeBranch<TEditor, TChange>,\n\t\tonto: SharedTreeBranch<TEditor, TChange>,\n\t\tupTo = onto.getHead(),\n\t): BranchRebaseResult<TChange> | undefined {\n\t\tconst { head } = branch;\n\t\tif (head === upTo) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst rebaseResult = rebaseBranch(\n\t\t\tthis.mintRevisionTag,\n\t\t\tthis.changeFamily.rebaser,\n\t\t\thead,\n\t\t\tupTo,\n\t\t\tonto.getHead(),\n\t\t);\n\t\tif (this.head === rebaseResult.newSourceHead) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn rebaseResult;\n\t}\n\n\t/**\n\t * Dispose this branch, freezing its state.\n\t *\n\t * @remarks\n\t * Attempts to further mutate the branch will error.\n\t * Any transactions in progress will be aborted.\n\t * Calling dispose more than once has no effect.\n\t */\n\tpublic dispose(): void {\n\t\tif (this.disposed) {\n\t\t\treturn;\n\t\t}\n\n\t\twhile (this.isTransacting()) {\n\t\t\tthis.abortTransaction();\n\t\t}\n\n\t\tthis.unsubscribeBranchTrimmer?.();\n\n\t\tthis.disposed = true;\n\t\tthis.emit(\"dispose\");\n\t}\n\n\tprivate assertNotDisposed(): void {\n\t\tassert(!this.disposed, 0x66e /* Branch is disposed */);\n\t}\n}\n\n/**\n * Registers an event listener that fires when the given forkable object forks.\n * The listener will also fire when any of those forks fork, and when those forks of forks fork, and so on.\n * @param forkable - an object that emits an event when it is forked\n * @param onFork - the fork event listener\n * @returns a function which when called will deregister all registrations (including transitive) created by this function.\n * The deregister function has undefined behavior if called more than once.\n */\nexport function onForkTransitive<T extends Listenable<{ fork: (t: T) => void }>>(\n\tforkable: T,\n\tonFork: (fork: T) => void,\n): () => void {\n\tconst offs: (() => void)[] = [];\n\toffs.push(\n\t\tforkable.on(\"fork\", (fork) => {\n\t\t\toffs.push(onForkTransitive(fork, onFork));\n\t\t\tonFork(fork);\n\t\t}),\n\t);\n\treturn () => offs.forEach((off) => off());\n}\n"]}
1
+ {"version":3,"file":"branch.js","sourceRoot":"","sources":["../../src/shared-tree-core/branch.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nimport {\n\ttype BranchRebaseResult,\n\ttype ChangeFamily,\n\ttype ChangeFamilyEditor,\n\tCommitKind,\n\ttype CommitMetadata,\n\ttype GraphCommit,\n\ttype RevisionTag,\n\ttype TaggedChange,\n\tfindAncestor,\n\tmakeAnonChange,\n\tmintCommit,\n\trebaseBranch,\n\ttagChange,\n\ttagRollbackInverse,\n} from \"../core/index.js\";\nimport { EventEmitter, type Listenable } from \"../events/index.js\";\n\nimport { TransactionStack } from \"./transactionStack.js\";\n\n/**\n * Describes a change to a `SharedTreeBranch`. Various operations can mutate the head of the branch;\n * this change format describes each in terms of the \"removed commits\" (all commits which were present\n * on the branch before the operation but are no longer present after) and the \"new commits\" (all\n * commits which are present on the branch after the operation that were not present before). Each of\n * the following event types also provides a `change` which contains the net change to the branch\n * (or is undefined if there was no net change):\n * * Append - when one or more commits are appended to the head of the branch, for example via\n * a change applied by the branch's editor, or as a result of merging another branch into this one\n * * Remove - when one or more commits are removed from the head of the branch. This occurs\n * when a transaction is aborted and all commits pending in that transaction are removed.\n * * Replace - when an operation simultaneously removes and appends commits. For example, when this\n * branch is rebased and some commits are removed and replaced with rebased versions, or when a\n * transaction completes and all pending commits are replaced with a single squash commit.\n */\nexport type SharedTreeBranchChange<TChange> =\n\t| {\n\t\t\ttype: \"append\";\n\t\t\tchange: TaggedChange<TChange>;\n\t\t\tnewCommits: readonly GraphCommit<TChange>[];\n\t }\n\t| {\n\t\t\ttype: \"remove\";\n\t\t\tchange: TaggedChange<TChange> | undefined;\n\t\t\tremovedCommits: readonly GraphCommit<TChange>[];\n\t }\n\t| {\n\t\t\ttype: \"replace\";\n\t\t\tchange: TaggedChange<TChange> | undefined;\n\t\t\tremovedCommits: readonly GraphCommit<TChange>[];\n\t\t\tnewCommits: readonly GraphCommit<TChange>[];\n\t };\n\n/**\n * Returns the operation that caused the given {@link SharedTreeBranchChange}.\n */\nexport function getChangeReplaceType(\n\tchange: SharedTreeBranchChange<unknown> & { type: \"replace\" },\n): \"transactionCommit\" | \"rebase\" {\n\t// The \"replace\" variant of the change event is emitted by two operations: committing a transaction and doing a rebase.\n\t// Committing a transaction will always remove one or more commits (the commits that were squashed),\n\t// and will add exactly one new commit (the squash commit).\n\tif (change.removedCommits.length === 0 || change.newCommits.length !== 1) {\n\t\treturn \"rebase\";\n\t}\n\n\t// There is only one case in which a rebase both removes commits and adds exactly one new commit.\n\t// This occurs when there is exactly one divergent, but equivalent, commit on each branch:\n\t//\n\t// A ─ B (branch X)\t -- rebase Y onto X --> A ─ B (branch X)\n\t// └─ B' (branch Y) └─ (branch Y)\n\t//\n\t// B' is removed and replaced by B because both have the same revision.\n\tif (\n\t\tchange.removedCommits.length === 1 &&\n\t\tchange.removedCommits[0].revision === change.newCommits[0].revision\n\t) {\n\t\treturn \"rebase\";\n\t}\n\n\treturn \"transactionCommit\";\n}\n\n/**\n * The events emitted by a `SharedTreeBranch`\n */\nexport interface SharedTreeBranchEvents<TEditor extends ChangeFamilyEditor, TChange>\n\textends BranchTrimmingEvents {\n\t/**\n\t * Fired just before the head of this branch changes.\n\t * @param change - the change to this branch's state and commits\n\t */\n\tbeforeChange(change: SharedTreeBranchChange<TChange>): void;\n\n\t/**\n\t * Fired just after the head of this branch changes.\n\t * @param change - the change to this branch's state and commits\n\t */\n\tafterChange(change: SharedTreeBranchChange<TChange>): void;\n\n\t/**\n\t * {@inheritdoc TreeViewEvents.commitApplied}\n\t */\n\tcommitApplied(data: CommitMetadata): void;\n\n\t/**\n\t * Fired when this branch forks\n\t * @param fork - the new branch that forked off of this branch\n\t */\n\tfork(fork: SharedTreeBranch<TEditor, TChange>): void;\n\n\t/**\n\t * Fired after this branch is disposed\n\t */\n\tdispose(): void;\n\n\t/**\n\t * Fired after a new transaction is started.\n\t * @param isOuterTransaction - true iff the transaction being started is the outermost transaction\n\t * as opposed to a nested transaction.\n\t */\n\ttransactionStarted(isOuterTransaction: boolean): void;\n\n\t/**\n\t * Fired after the current transaction is aborted.\n\t * @param isOuterTransaction - true iff the transaction being aborted is the outermost transaction\n\t * as opposed to a nested transaction.\n\t */\n\ttransactionAborted(isOuterTransaction: boolean): void;\n\n\t/**\n\t * Fired after the current transaction is committed.\n\t * @param isOuterTransaction - true iff the transaction being committed is the outermost transaction\n\t * as opposed to a nested transaction.\n\t */\n\ttransactionCommitted(isOuterTransaction: boolean): void;\n}\n\n/**\n * Events related to branch trimming.\n *\n * @remarks\n * Trimming is a very specific kind of mutation which is the only allowed mutations to branches.\n * References to commits from other commits are removed so that the commit objects can be GC'd by the JS engine.\n * This happens by changing a commit's parent property to undefined, which drops all commits that are in its \"ancestry\".\n * It is done as a performance optimization when it is determined that commits are no longer needed for future computation.\n */\nexport interface BranchTrimmingEvents {\n\t/**\n\t * Fired when some contiguous range of commits beginning with the \"global tail\" of this branch are trimmed from the branch.\n\t * This happens by deleting the parent pointer to the last commit in that range. This event can be fired at any time.\n\t */\n\tancestryTrimmed(trimmedRevisions: RevisionTag[]): void;\n}\n\n/**\n * A branch of changes that can be applied to a SharedTree.\n */\nexport class SharedTreeBranch<TEditor extends ChangeFamilyEditor, TChange> extends EventEmitter<\n\tSharedTreeBranchEvents<TEditor, TChange>\n> {\n\tpublic readonly editor: TEditor;\n\tprivate readonly transactions = new TransactionStack();\n\t/**\n\t * After pushing a starting revision to the transaction stack, this branch might be rebased\n\t * over commits which are children of that starting revision. When the transaction is committed,\n\t * those rebased-over commits should not be included in the transaction's squash commit, even though\n\t * they exist between the starting revision and the final commit within the transaction.\n\t *\n\t * Whenever `rebaseOnto` is called during a transaction, this map is augmented with an entry from the\n\t * original merge-base to the new merge-base.\n\t *\n\t * This state need only be retained for the lifetime of the transaction.\n\t *\n\t * TODO: This strategy might need to be revisited when adding better support for async transactions.\n\t * Since:\n\t *\n\t * 1. Transactionality is guaranteed primarily by squashing at commit time\n\t * 2. Branches may be rebased with an ongoing transaction\n\t *\n\t * a rebase operation might invalidate only a portion of a transaction's commits, thus defeating the\n\t * purpose of transactionality.\n\t *\n\t * AB#6483 and children items track this work.\n\t */\n\tprivate readonly initialTransactionRevToRebasedRev = new Map<RevisionTag, RevisionTag>();\n\tprivate disposed = false;\n\tprivate readonly unsubscribeBranchTrimmer?: () => void;\n\t/**\n\t * Construct a new branch.\n\t * @param head - the head of the branch\n\t * @param changeFamily - determines the set of changes that this branch can commit\n\t * @param branchTrimmer - an optional event emitter that informs the branch it has been trimmed. If this is not supplied, then the branch must\n\t * never be trimmed. See {@link BranchTrimmingEvents} for details on trimming.\n\t */\n\tpublic constructor(\n\t\tprivate head: GraphCommit<TChange>,\n\t\tpublic readonly changeFamily: ChangeFamily<TEditor, TChange>,\n\t\tprivate readonly mintRevisionTag: () => RevisionTag,\n\t\tprivate readonly branchTrimmer?: Listenable<BranchTrimmingEvents>,\n\t) {\n\t\tsuper();\n\t\tthis.editor = this.changeFamily.buildEditor((change) =>\n\t\t\tthis.apply(change, mintRevisionTag()),\n\t\t);\n\t\tthis.unsubscribeBranchTrimmer = branchTrimmer?.on(\"ancestryTrimmed\", (commit) => {\n\t\t\tthis.emit(\"ancestryTrimmed\", commit);\n\t\t});\n\t}\n\n\t/**\n\t * Sets the head of this branch. Emits no change events.\n\t */\n\tpublic setHead(head: GraphCommit<TChange>): void {\n\t\tthis.assertNotDisposed();\n\t\tassert(!this.isTransacting(), 0x685 /* Cannot set head during a transaction */);\n\t\tthis.head = head;\n\t}\n\n\t/**\n\t * Apply a change to this branch.\n\t * @param change - the change to apply\n\t * @param revision - the revision of the new head commit of the branch that contains `change`\n\t * @param changeKind - the kind of change to apply\n\t * @returns the change that was applied and the new head commit of the branch\n\t */\n\tpublic apply(\n\t\tchange: TChange,\n\t\trevision: RevisionTag,\n\t\tchangeKind: CommitKind = CommitKind.Default,\n\t): [change: TChange, newCommit: GraphCommit<TChange>] {\n\t\tthis.assertNotDisposed();\n\n\t\tconst changeWithRevision = this.changeFamily.rebaser.changeRevision(change, revision);\n\n\t\tconst newHead = mintCommit(this.head, {\n\t\t\trevision,\n\t\t\tchange: changeWithRevision,\n\t\t});\n\n\t\tconst changeEvent = {\n\t\t\ttype: \"append\",\n\t\t\tchange: tagChange(changeWithRevision, revision),\n\t\t\tnewCommits: [newHead],\n\t\t} as const;\n\n\t\tthis.emit(\"beforeChange\", changeEvent);\n\t\tthis.head = newHead;\n\n\t\t// If this is not part of a transaction, emit a commitApplied event\n\t\tif (!this.isTransacting()) {\n\t\t\tthis.emit(\"commitApplied\", { isLocal: true, kind: changeKind });\n\t\t}\n\n\t\tthis.emit(\"afterChange\", changeEvent);\n\t\treturn [changeWithRevision, newHead];\n\t}\n\n\t/**\n\t * @returns the commit at the head of this branch.\n\t */\n\tpublic getHead(): GraphCommit<TChange> {\n\t\treturn this.head;\n\t}\n\n\t/**\n\t * Begin a transaction on this branch. If the transaction is committed via {@link commitTransaction},\n\t * all commits made since this call will be squashed into a single head commit.\n\t */\n\tpublic startTransaction(): void {\n\t\tthis.assertNotDisposed();\n\t\tconst forks = new Set<SharedTreeBranch<TEditor, TChange>>();\n\t\tconst onDisposeUnSubscribes: (() => void)[] = [];\n\t\tconst onForkUnSubscribe = onForkTransitive(this, (fork) => {\n\t\t\tforks.add(fork);\n\t\t\tonDisposeUnSubscribes.push(fork.on(\"dispose\", () => forks.delete(fork)));\n\t\t});\n\t\tthis.transactions.push(this.head.revision, () => {\n\t\t\tforks.forEach((fork) => fork.dispose());\n\t\t\tonDisposeUnSubscribes.forEach((unsubscribe) => unsubscribe());\n\t\t\tonForkUnSubscribe();\n\t\t});\n\t\tthis.editor.enterTransaction();\n\t\tthis.emit(\"transactionStarted\", this.transactions.size === 1);\n\t}\n\n\t/**\n\t * Commit the current transaction. There must be a transaction in progress that was begun via {@link startTransaction}.\n\t * If there are commits in the current transaction, they will be squashed into a new single head commit.\n\t * @returns the commits that were squashed and the new squash commit if a squash occurred, otherwise `undefined`.\n\t * @remarks If the transaction had no changes applied during its lifetime, then no squash occurs (i.e. this method is a no-op).\n\t * Even if the transaction contained only one change, it will still be replaced with an (equivalent) squash change.\n\t */\n\tpublic commitTransaction():\n\t\t| [squashedCommits: GraphCommit<TChange>[], newCommit: GraphCommit<TChange>]\n\t\t| undefined {\n\t\tthis.assertNotDisposed();\n\t\tconst [startCommit, commits] = this.popTransaction();\n\t\tthis.editor.exitTransaction();\n\n\t\tthis.emit(\"transactionCommitted\", this.transactions.size === 0);\n\t\tif (commits.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Squash the changes and make the squash commit the new head of this branch\n\t\tconst squashedChange = this.changeFamily.rebaser.compose(commits);\n\t\tconst revision = this.mintRevisionTag();\n\n\t\tconst newHead = mintCommit(startCommit, {\n\t\t\trevision,\n\t\t\tchange: this.changeFamily.rebaser.changeRevision(squashedChange, revision),\n\t\t});\n\n\t\tconst changeEvent = {\n\t\t\ttype: \"replace\",\n\t\t\tchange: undefined,\n\t\t\tremovedCommits: commits,\n\t\t\tnewCommits: [newHead],\n\t\t} as const;\n\n\t\tthis.emit(\"beforeChange\", changeEvent);\n\t\tthis.head = newHead;\n\n\t\t// If this transaction is not nested, emit a commitApplied event\n\t\tif (!this.isTransacting()) {\n\t\t\tthis.emit(\"commitApplied\", { isLocal: true, kind: CommitKind.Default });\n\t\t}\n\n\t\tthis.emit(\"afterChange\", changeEvent);\n\t\treturn [commits, newHead];\n\t}\n\n\t/**\n\t * Cancel the current transaction. There must be a transaction in progress that was begun via\n\t * {@link startTransaction}. All commits made during the transaction will be removed.\n\t * @returns the change to this branch resulting in the removal of the commits, and a list of the\n\t * commits that were removed.\n\t */\n\tpublic abortTransaction(): [\n\t\tchange: TChange | undefined,\n\t\tabortedCommits: GraphCommit<TChange>[],\n\t] {\n\t\tthis.assertNotDisposed();\n\t\tconst [startCommit, commits] = this.popTransaction();\n\t\tthis.editor.exitTransaction();\n\n\t\tthis.emit(\"transactionAborted\", this.transactions.size === 0);\n\t\tif (commits.length === 0) {\n\t\t\treturn [undefined, []];\n\t\t}\n\n\t\tconst inverses: TaggedChange<TChange>[] = [];\n\t\tfor (let i = commits.length - 1; i >= 0; i--) {\n\t\t\tconst revision = this.mintRevisionTag();\n\t\t\tconst inverse = this.changeFamily.rebaser.changeRevision(\n\t\t\t\tthis.changeFamily.rebaser.invert(commits[i], false),\n\t\t\t\trevision,\n\t\t\t\tcommits[i].revision,\n\t\t\t);\n\n\t\t\tinverses.push(tagRollbackInverse(inverse, revision, commits[i].revision));\n\t\t}\n\t\tconst change =\n\t\t\tinverses.length > 0 ? this.changeFamily.rebaser.compose(inverses) : undefined;\n\n\t\tconst changeEvent = {\n\t\t\ttype: \"remove\",\n\t\t\tchange: change === undefined ? undefined : makeAnonChange(change),\n\t\t\tremovedCommits: commits,\n\t\t} as const;\n\n\t\tthis.emit(\"beforeChange\", changeEvent);\n\t\tthis.head = startCommit;\n\t\tthis.emit(\"afterChange\", changeEvent);\n\t\treturn [change, commits];\n\t}\n\n\t/**\n\t * True iff this branch is in the middle of a transaction that was begin via {@link startTransaction}\n\t */\n\tpublic isTransacting(): boolean {\n\t\treturn this.transactions.size !== 0;\n\t}\n\n\tprivate popTransaction(): [GraphCommit<TChange>, GraphCommit<TChange>[]] {\n\t\tconst { startRevision: startRevisionOriginal } = this.transactions.pop();\n\t\tlet startRevision = startRevisionOriginal;\n\t\twhile (this.initialTransactionRevToRebasedRev.has(startRevision)) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tstartRevision = this.initialTransactionRevToRebasedRev.get(startRevision)!;\n\t\t}\n\n\t\tif (!this.isTransacting()) {\n\t\t\tthis.initialTransactionRevToRebasedRev.clear();\n\t\t}\n\n\t\tconst commits: GraphCommit<TChange>[] = [];\n\t\tconst startCommit = findAncestor([this.head, commits], (c) => c.revision === startRevision);\n\t\tassert(\n\t\t\tstartCommit !== undefined,\n\t\t\t0x593 /* Expected branch to be ahead of transaction start revision */,\n\t\t);\n\t\treturn [startCommit, commits];\n\t}\n\n\t/**\n\t * Spawn a new branch that is based off of the current state of this branch.\n\t * Changes made to the new branch will not be applied to this branch until the new branch is merged back in.\n\t *\n\t * @remarks Forks created during a transaction will be disposed when the transaction ends.\n\t */\n\tpublic fork(): SharedTreeBranch<TEditor, TChange> {\n\t\tthis.assertNotDisposed();\n\t\tconst fork = new SharedTreeBranch(\n\t\t\tthis.head,\n\t\t\tthis.changeFamily,\n\t\t\tthis.mintRevisionTag,\n\t\t\tthis.branchTrimmer,\n\t\t);\n\t\tthis.emit(\"fork\", fork);\n\t\treturn fork;\n\t}\n\n\t/**\n\t * Rebase the changes that have been applied to this branch over divergent changes in the given branch.\n\t * After this operation completes, this branch will be based off of `branch`.\n\t *\n\t * @param branch - the branch to rebase onto\n\t * @param upTo - the furthest commit on `branch` over which to rebase (inclusive). Defaults to the head commit of `branch`.\n\t * @returns the result of the rebase or undefined if nothing changed\n\t */\n\tpublic rebaseOnto(\n\t\tbranch: SharedTreeBranch<TEditor, TChange>,\n\t\tupTo = branch.getHead(),\n\t): BranchRebaseResult<TChange> | undefined {\n\t\tthis.assertNotDisposed();\n\n\t\t// Rebase this branch onto the given branch\n\t\tconst rebaseResult = this.rebaseBranch(this, branch, upTo);\n\t\tif (rebaseResult === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// The net change to this branch is provided by the `rebaseBranch` API\n\t\tconst { newSourceHead, commits } = rebaseResult;\n\t\tconst { deletedSourceCommits, targetCommits, sourceCommits } = commits;\n\n\t\tconst newCommits = targetCommits.concat(sourceCommits);\n\t\tif (this.isTransacting()) {\n\t\t\tconst src = targetCommits[0].parent?.revision;\n\t\t\tconst dst = targetCommits[targetCommits.length - 1].revision;\n\t\t\tif (src !== undefined && dst !== undefined) {\n\t\t\t\tthis.initialTransactionRevToRebasedRev.set(src, dst);\n\t\t\t}\n\t\t}\n\t\tconst changeEvent = {\n\t\t\ttype: \"replace\",\n\t\t\tget change() {\n\t\t\t\tconst change = rebaseResult.sourceChange;\n\t\t\t\treturn change === undefined ? undefined : makeAnonChange(change);\n\t\t\t},\n\t\t\tremovedCommits: deletedSourceCommits,\n\t\t\tnewCommits,\n\t\t} as const;\n\t\tthis.emit(\"beforeChange\", changeEvent);\n\t\tthis.head = newSourceHead;\n\n\t\tthis.emit(\"afterChange\", changeEvent);\n\t\treturn rebaseResult;\n\t}\n\n\t/**\n\t * Apply all the divergent changes on the given branch to this branch.\n\t *\n\t * @param branch - the branch to merge into this branch\n\t * @returns the net change to this branch and the commits that were added to this branch by the merge,\n\t * or undefined if nothing changed\n\t */\n\tpublic merge(\n\t\tbranch: SharedTreeBranch<TEditor, TChange>,\n\t): [change: TChange, newCommits: GraphCommit<TChange>[]] | undefined {\n\t\tthis.assertNotDisposed();\n\t\tbranch.assertNotDisposed();\n\t\tassert(\n\t\t\t!branch.isTransacting(),\n\t\t\t0x597 /* Branch may not be merged while transaction is in progress */,\n\t\t);\n\n\t\t// Rebase the given branch onto this branch\n\t\tconst rebaseResult = this.rebaseBranch(branch, this);\n\t\tif (rebaseResult === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Compute the net change to this branch\n\t\tconst sourceCommits = rebaseResult.commits.sourceCommits;\n\t\tconst change = this.changeFamily.rebaser.compose(sourceCommits);\n\t\tconst taggedChange = makeAnonChange(change);\n\t\tconst changeEvent = {\n\t\t\ttype: \"append\",\n\t\t\tget change(): TaggedChange<TChange> {\n\t\t\t\treturn taggedChange;\n\t\t\t},\n\t\t\tnewCommits: sourceCommits,\n\t\t} as const;\n\n\t\tthis.emit(\"beforeChange\", changeEvent);\n\t\tthis.head = rebaseResult.newSourceHead;\n\t\tthis.emit(\"afterChange\", changeEvent);\n\t\treturn [change, sourceCommits];\n\t}\n\n\t/** Rebase `branchHead` onto `onto`, but return undefined if nothing changed */\n\tprivate rebaseBranch(\n\t\tbranch: SharedTreeBranch<TEditor, TChange>,\n\t\tonto: SharedTreeBranch<TEditor, TChange>,\n\t\tupTo = onto.getHead(),\n\t): BranchRebaseResult<TChange> | undefined {\n\t\tconst { head } = branch;\n\t\tif (head === upTo) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst rebaseResult = rebaseBranch(\n\t\t\tthis.mintRevisionTag,\n\t\t\tthis.changeFamily.rebaser,\n\t\t\thead,\n\t\t\tupTo,\n\t\t\tonto.getHead(),\n\t\t);\n\t\tif (this.head === rebaseResult.newSourceHead) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn rebaseResult;\n\t}\n\n\t/**\n\t * Dispose this branch, freezing its state.\n\t *\n\t * @remarks\n\t * Attempts to further mutate the branch will error.\n\t * Any transactions in progress will be aborted.\n\t * Calling dispose more than once has no effect.\n\t */\n\tpublic dispose(): void {\n\t\tif (this.disposed) {\n\t\t\treturn;\n\t\t}\n\n\t\twhile (this.isTransacting()) {\n\t\t\tthis.abortTransaction();\n\t\t}\n\n\t\tthis.unsubscribeBranchTrimmer?.();\n\n\t\tthis.disposed = true;\n\t\tthis.emit(\"dispose\");\n\t}\n\n\tprivate assertNotDisposed(): void {\n\t\tassert(!this.disposed, 0x66e /* Branch is disposed */);\n\t}\n}\n\n/**\n * Registers an event listener that fires when the given forkable object forks.\n * The listener will also fire when any of those forks fork, and when those forks of forks fork, and so on.\n * @param forkable - an object that emits an event when it is forked\n * @param onFork - the fork event listener\n * @returns a function which when called will deregister all registrations (including transitive) created by this function.\n * The deregister function has undefined behavior if called more than once.\n */\nexport function onForkTransitive<T extends Listenable<{ fork: (t: T) => void }>>(\n\tforkable: T,\n\tonFork: (fork: T) => void,\n): () => void {\n\tconst offs: (() => void)[] = [];\n\toffs.push(\n\t\tforkable.on(\"fork\", (fork) => {\n\t\t\toffs.push(onForkTransitive(fork, onFork));\n\t\t\tonFork(fork);\n\t\t}),\n\t);\n\treturn () => offs.forEach((off) => off());\n}\n"]}
@@ -8,8 +8,7 @@ import type { ChangeEnricherReadonlyCheckout } from "./changeEnricher.js";
8
8
  * Utility for enriching commits from a {@link Branch} before these commits are applied and submitted.
9
9
  */
10
10
  export declare class BranchCommitEnricher<TChange> {
11
- private transactionEnricher?;
12
- private readonly rebaser;
11
+ private readonly transactionEnricher;
13
12
  private readonly enricher;
14
13
  /**
15
14
  * Maps each local commit to the corresponding enriched commit.
@@ -24,6 +23,9 @@ export declare class BranchCommitEnricher<TChange> {
24
23
  * @returns The number of commits that have been prepared but not yet retrieved.
25
24
  */
26
25
  get preparedCommitsCount(): number;
26
+ startNewTransaction(): void;
27
+ commitCurrentTransaction(): void;
28
+ abortCurrentTransaction(): void;
27
29
  /**
28
30
  * Adds a commit to the enricher.
29
31
  * @param commit - A commit that is part of a transaction.
@@ -1 +1 @@
1
- {"version":3,"file":"branchCommitEnricher.d.ts","sourceRoot":"","sources":["../../src/shared-tree-core/branchCommitEnricher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAiB,MAAM,kBAAkB,CAAC;AACvF,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAG1E;;GAEG;AACH,qBAAa,oBAAoB,CAAC,OAAO;IACxC,OAAO,CAAC,mBAAmB,CAAC,CAA+B;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0C;IACnE;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8D;gBAG7F,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,EAC/B,QAAQ,EAAE,8BAA8B,CAAC,OAAO,CAAC;IAMlD;;OAEG;IACH,IAAW,oBAAoB,IAAI,MAAM,CAExC;IAED;;;OAGG;IACI,uBAAuB,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI;IAOlE;;;;;;;OAOG;IACI,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,yBAAyB,EAAE,OAAO,GAAG,IAAI;IAe5F;;;OAGG;IACI,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC;IAO5E;;;;;OAKG;IACI,oBAAoB,IAAI,IAAI;CAGnC"}
1
+ {"version":3,"file":"branchCommitEnricher.d.ts","sourceRoot":"","sources":["../../src/shared-tree-core/branchCommitEnricher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAiB,MAAM,kBAAkB,CAAC;AACvF,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAG1E;;GAEG;AACH,qBAAa,oBAAoB,CAAC,OAAO;IACxC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA+B;IACnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0C;IACnE;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8D;gBAG7F,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,EAC/B,QAAQ,EAAE,8BAA8B,CAAC,OAAO,CAAC;IAMlD;;OAEG;IACH,IAAW,oBAAoB,IAAI,MAAM,CAExC;IAEM,mBAAmB,IAAI,IAAI;IAI3B,wBAAwB,IAAI,IAAI;IAIhC,uBAAuB,IAAI,IAAI;IAItC;;;OAGG;IACI,uBAAuB,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI;IAMlE;;;;;;;OAOG;IACI,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,yBAAyB,EAAE,OAAO,GAAG,IAAI;IAc5F;;;OAGG;IACI,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC;IAO5E;;;;;OAKG;IACI,oBAAoB,IAAI,IAAI;CAGnC"}
@@ -21,8 +21,8 @@ class BranchCommitEnricher {
21
21
  * This would happen if applying a commit were to fail and the commit were not retrieved/purged after the failure.
22
22
  */
23
23
  this.preparedCommits = new Map();
24
- this.rebaser = rebaser;
25
24
  this.enricher = enricher;
25
+ this.transactionEnricher = new transactionEnricher_js_1.TransactionEnricher(rebaser, this.enricher);
26
26
  }
27
27
  /**
28
28
  * @returns The number of commits that have been prepared but not yet retrieved.
@@ -30,6 +30,15 @@ class BranchCommitEnricher {
30
30
  get preparedCommitsCount() {
31
31
  return this.preparedCommits.size;
32
32
  }
33
+ startNewTransaction() {
34
+ this.transactionEnricher.startNewTransaction();
35
+ }
36
+ commitCurrentTransaction() {
37
+ this.transactionEnricher.commitCurrentTransaction();
38
+ }
39
+ abortCurrentTransaction() {
40
+ this.transactionEnricher.abortCurrentTransaction();
41
+ }
33
42
  /**
34
43
  * Adds a commit to the enricher.
35
44
  * @param commit - A commit that is part of a transaction.
@@ -37,8 +46,7 @@ class BranchCommitEnricher {
37
46
  ingestTransactionCommit(commit) {
38
47
  // We do not submit ops for changes that are part of a transaction.
39
48
  // But we need to enrich the commits that will be sent if the transaction is committed.
40
- this.transactionEnricher ?? (this.transactionEnricher = new transactionEnricher_js_1.TransactionEnricher(this.rebaser, this.enricher));
41
- this.transactionEnricher.addTransactionSteps(commit);
49
+ this.transactionEnricher.addTransactionStep(commit);
42
50
  }
43
51
  /**
44
52
  * Prepares an enriched commit for later submission (see {@link BranchCommitEnricher.getPreparedCommit}).
@@ -53,7 +61,6 @@ class BranchCommitEnricher {
53
61
  if (concludesOuterTransaction) {
54
62
  (0, internal_1.assert)(this.transactionEnricher !== undefined, "Unexpected transaction commit without transaction steps");
55
63
  enrichedChange = this.transactionEnricher.getComposedChange(commit.revision);
56
- delete this.transactionEnricher;
57
64
  }
58
65
  else {
59
66
  enrichedChange = this.enricher.updateChangeEnrichments(commit.change, commit.revision);
@@ -1 +1 @@
1
- {"version":3,"file":"branchCommitEnricher.js","sourceRoot":"","sources":["../../src/shared-tree-core/branchCommitEnricher.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA6D;AAC7D,+CAAuF;AAEvF,qEAA+D;AAE/D;;GAEG;AACH,MAAa,oBAAoB;IAahC,YACC,OAA+B,EAC/B,QAAiD;QAXlD;;;;;;WAMG;QACc,oBAAe,GAAoD,IAAI,GAAG,EAAE,CAAC;QAM7F,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,IAAW,oBAAoB;QAC9B,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;IAClC,CAAC;IAED;;;OAGG;IACI,uBAAuB,CAAC,MAA4B;QAC1D,mEAAmE;QACnE,uFAAuF;QACvF,IAAI,CAAC,mBAAmB,KAAxB,IAAI,CAAC,mBAAmB,GAAK,IAAI,4CAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAC;QAClF,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAED;;;;;;;OAOG;IACI,aAAa,CAAC,MAA4B,EAAE,yBAAkC;QACpF,IAAI,cAAuB,CAAC;QAC5B,IAAI,yBAAyB,EAAE,CAAC;YAC/B,IAAA,iBAAM,EACL,IAAI,CAAC,mBAAmB,KAAK,SAAS,EACtC,yDAAyD,CACzD,CAAC;YACF,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7E,OAAO,IAAI,CAAC,mBAAmB,CAAC;QACjC,CAAC;aAAM,CAAC;YACP,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,IAAA,wBAAa,EAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IACzE,CAAC;IAED;;;OAGG;IACI,iBAAiB,CAAC,MAA4B;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,IAAA,iBAAM,EAAC,QAAQ,KAAK,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACjD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACI,oBAAoB;QAC1B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;CACD;AAlFD,oDAkFC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { type ChangeRebaser, type GraphCommit, replaceChange } from \"../core/index.js\";\nimport type { ChangeEnricherReadonlyCheckout } from \"./changeEnricher.js\";\nimport { TransactionEnricher } from \"./transactionEnricher.js\";\n\n/**\n * Utility for enriching commits from a {@link Branch} before these commits are applied and submitted.\n */\nexport class BranchCommitEnricher<TChange> {\n\tprivate transactionEnricher?: TransactionEnricher<TChange>;\n\tprivate readonly rebaser: ChangeRebaser<TChange>;\n\tprivate readonly enricher: ChangeEnricherReadonlyCheckout<TChange>;\n\t/**\n\t * Maps each local commit to the corresponding enriched commit.\n\t * Entries are added when the commits are prepared (before being applied and submitted).\n\t * Entries are removed when the commits are retrieved for submission (after being applied).\n\t * It's possible an entry will linger in the map indefinitely if it is never retrieved for submission.\n\t * This would happen if applying a commit were to fail and the commit were not retrieved/purged after the failure.\n\t */\n\tprivate readonly preparedCommits: Map<GraphCommit<TChange>, GraphCommit<TChange>> = new Map();\n\n\tpublic constructor(\n\t\trebaser: ChangeRebaser<TChange>,\n\t\tenricher: ChangeEnricherReadonlyCheckout<TChange>,\n\t) {\n\t\tthis.rebaser = rebaser;\n\t\tthis.enricher = enricher;\n\t}\n\n\t/**\n\t * @returns The number of commits that have been prepared but not yet retrieved.\n\t */\n\tpublic get preparedCommitsCount(): number {\n\t\treturn this.preparedCommits.size;\n\t}\n\n\t/**\n\t * Adds a commit to the enricher.\n\t * @param commit - A commit that is part of a transaction.\n\t */\n\tpublic ingestTransactionCommit(commit: GraphCommit<TChange>): void {\n\t\t// We do not submit ops for changes that are part of a transaction.\n\t\t// But we need to enrich the commits that will be sent if the transaction is committed.\n\t\tthis.transactionEnricher ??= new TransactionEnricher(this.rebaser, this.enricher);\n\t\tthis.transactionEnricher.addTransactionSteps(commit);\n\t}\n\n\t/**\n\t * Prepares an enriched commit for later submission (see {@link BranchCommitEnricher.getPreparedCommit}).\n\t * @param commit - The commit to prepare an enriched version of.\n\t * @param concludesOuterTransaction - Whether the commit concludes an outer transaction.\n\t *\n\t * Each call to this method must be followed by a call to {@link BranchCommitEnricher.getPreparedCommit} or\n\t * {@link BranchCommitEnricher.purgePreparedCommits}. Failing to do so will result in a memory leak.\n\t */\n\tpublic prepareCommit(commit: GraphCommit<TChange>, concludesOuterTransaction: boolean): void {\n\t\tlet enrichedChange: TChange;\n\t\tif (concludesOuterTransaction) {\n\t\t\tassert(\n\t\t\t\tthis.transactionEnricher !== undefined,\n\t\t\t\t\"Unexpected transaction commit without transaction steps\",\n\t\t\t);\n\t\t\tenrichedChange = this.transactionEnricher.getComposedChange(commit.revision);\n\t\t\tdelete this.transactionEnricher;\n\t\t} else {\n\t\t\tenrichedChange = this.enricher.updateChangeEnrichments(commit.change, commit.revision);\n\t\t}\n\t\tthis.preparedCommits.set(commit, replaceChange(commit, enrichedChange));\n\t}\n\n\t/**\n\t * @param commit - A commit previously passed to {@link BranchCommitEnricher.prepareCommit}.\n\t * @returns The enriched commit corresponds to the given commit.\n\t */\n\tpublic getPreparedCommit(commit: GraphCommit<TChange>): GraphCommit<TChange> {\n\t\tconst prepared = this.preparedCommits.get(commit);\n\t\tassert(prepared !== undefined, \"Unknown commit\");\n\t\tthis.preparedCommits.delete(commit);\n\t\treturn prepared;\n\t}\n\n\t/**\n\t * Purges all commits that have been prepared but not been retrieved.\n\t * This should be called to avoid memory leaks if the prepared commits are no longer needed.\n\t *\n\t * Does not affect ingested transaction commits.\n\t */\n\tpublic purgePreparedCommits(): void {\n\t\tthis.preparedCommits.clear();\n\t}\n}\n"]}
1
+ {"version":3,"file":"branchCommitEnricher.js","sourceRoot":"","sources":["../../src/shared-tree-core/branchCommitEnricher.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA6D;AAC7D,+CAAuF;AAEvF,qEAA+D;AAE/D;;GAEG;AACH,MAAa,oBAAoB;IAYhC,YACC,OAA+B,EAC/B,QAAiD;QAXlD;;;;;;WAMG;QACc,oBAAe,GAAoD,IAAI,GAAG,EAAE,CAAC;QAM7F,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,mBAAmB,GAAG,IAAI,4CAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5E,CAAC;IAED;;OAEG;IACH,IAAW,oBAAoB;QAC9B,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;IAClC,CAAC;IAEM,mBAAmB;QACzB,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,CAAC;IAChD,CAAC;IAEM,wBAAwB;QAC9B,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,EAAE,CAAC;IACrD,CAAC;IAEM,uBAAuB;QAC7B,IAAI,CAAC,mBAAmB,CAAC,uBAAuB,EAAE,CAAC;IACpD,CAAC;IAED;;;OAGG;IACI,uBAAuB,CAAC,MAA4B;QAC1D,mEAAmE;QACnE,uFAAuF;QACvF,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED;;;;;;;OAOG;IACI,aAAa,CAAC,MAA4B,EAAE,yBAAkC;QACpF,IAAI,cAAuB,CAAC;QAC5B,IAAI,yBAAyB,EAAE,CAAC;YAC/B,IAAA,iBAAM,EACL,IAAI,CAAC,mBAAmB,KAAK,SAAS,EACtC,yDAAyD,CACzD,CAAC;YACF,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACP,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,IAAA,wBAAa,EAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IACzE,CAAC;IAED;;;OAGG;IACI,iBAAiB,CAAC,MAA4B;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,IAAA,iBAAM,EAAC,QAAQ,KAAK,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACjD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACI,oBAAoB;QAC1B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;CACD;AA3FD,oDA2FC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { type ChangeRebaser, type GraphCommit, replaceChange } from \"../core/index.js\";\nimport type { ChangeEnricherReadonlyCheckout } from \"./changeEnricher.js\";\nimport { TransactionEnricher } from \"./transactionEnricher.js\";\n\n/**\n * Utility for enriching commits from a {@link Branch} before these commits are applied and submitted.\n */\nexport class BranchCommitEnricher<TChange> {\n\tprivate readonly transactionEnricher: TransactionEnricher<TChange>;\n\tprivate readonly enricher: ChangeEnricherReadonlyCheckout<TChange>;\n\t/**\n\t * Maps each local commit to the corresponding enriched commit.\n\t * Entries are added when the commits are prepared (before being applied and submitted).\n\t * Entries are removed when the commits are retrieved for submission (after being applied).\n\t * It's possible an entry will linger in the map indefinitely if it is never retrieved for submission.\n\t * This would happen if applying a commit were to fail and the commit were not retrieved/purged after the failure.\n\t */\n\tprivate readonly preparedCommits: Map<GraphCommit<TChange>, GraphCommit<TChange>> = new Map();\n\n\tpublic constructor(\n\t\trebaser: ChangeRebaser<TChange>,\n\t\tenricher: ChangeEnricherReadonlyCheckout<TChange>,\n\t) {\n\t\tthis.enricher = enricher;\n\t\tthis.transactionEnricher = new TransactionEnricher(rebaser, this.enricher);\n\t}\n\n\t/**\n\t * @returns The number of commits that have been prepared but not yet retrieved.\n\t */\n\tpublic get preparedCommitsCount(): number {\n\t\treturn this.preparedCommits.size;\n\t}\n\n\tpublic startNewTransaction(): void {\n\t\tthis.transactionEnricher.startNewTransaction();\n\t}\n\n\tpublic commitCurrentTransaction(): void {\n\t\tthis.transactionEnricher.commitCurrentTransaction();\n\t}\n\n\tpublic abortCurrentTransaction(): void {\n\t\tthis.transactionEnricher.abortCurrentTransaction();\n\t}\n\n\t/**\n\t * Adds a commit to the enricher.\n\t * @param commit - A commit that is part of a transaction.\n\t */\n\tpublic ingestTransactionCommit(commit: GraphCommit<TChange>): void {\n\t\t// We do not submit ops for changes that are part of a transaction.\n\t\t// But we need to enrich the commits that will be sent if the transaction is committed.\n\t\tthis.transactionEnricher.addTransactionStep(commit);\n\t}\n\n\t/**\n\t * Prepares an enriched commit for later submission (see {@link BranchCommitEnricher.getPreparedCommit}).\n\t * @param commit - The commit to prepare an enriched version of.\n\t * @param concludesOuterTransaction - Whether the commit concludes an outer transaction.\n\t *\n\t * Each call to this method must be followed by a call to {@link BranchCommitEnricher.getPreparedCommit} or\n\t * {@link BranchCommitEnricher.purgePreparedCommits}. Failing to do so will result in a memory leak.\n\t */\n\tpublic prepareCommit(commit: GraphCommit<TChange>, concludesOuterTransaction: boolean): void {\n\t\tlet enrichedChange: TChange;\n\t\tif (concludesOuterTransaction) {\n\t\t\tassert(\n\t\t\t\tthis.transactionEnricher !== undefined,\n\t\t\t\t\"Unexpected transaction commit without transaction steps\",\n\t\t\t);\n\t\t\tenrichedChange = this.transactionEnricher.getComposedChange(commit.revision);\n\t\t} else {\n\t\t\tenrichedChange = this.enricher.updateChangeEnrichments(commit.change, commit.revision);\n\t\t}\n\t\tthis.preparedCommits.set(commit, replaceChange(commit, enrichedChange));\n\t}\n\n\t/**\n\t * @param commit - A commit previously passed to {@link BranchCommitEnricher.prepareCommit}.\n\t * @returns The enriched commit corresponds to the given commit.\n\t */\n\tpublic getPreparedCommit(commit: GraphCommit<TChange>): GraphCommit<TChange> {\n\t\tconst prepared = this.preparedCommits.get(commit);\n\t\tassert(prepared !== undefined, \"Unknown commit\");\n\t\tthis.preparedCommits.delete(commit);\n\t\treturn prepared;\n\t}\n\n\t/**\n\t * Purges all commits that have been prepared but not been retrieved.\n\t * This should be called to avoid memory leaks if the prepared commits are no longer needed.\n\t *\n\t * Does not affect ingested transaction commits.\n\t */\n\tpublic purgePreparedCommits(): void {\n\t\tthis.preparedCommits.clear();\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sharedTreeCore.d.ts","sourceRoot":"","sources":["../../src/shared-tree-core/sharedTreeCore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sharedTreeCore.d.ts","sourceRoot":"","sources":["../../src/shared-tree-core/sharedTreeCore.ts"],"names":[],"mappings":"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"}
@@ -67,6 +67,15 @@ class SharedTreeCore extends internal_3.SharedObject {
67
67
  */
68
68
  const localSessionId = runtime.idCompressor.localSessionId;
69
69
  this.editManager = new editManager_js_1.EditManager(changeFamily, localSessionId, this.mintRevisionTag);
70
+ this.editManager.localBranch.on("transactionStarted", () => {
71
+ this.commitEnricher.startNewTransaction();
72
+ });
73
+ this.editManager.localBranch.on("transactionAborted", () => {
74
+ this.commitEnricher.abortCurrentTransaction();
75
+ });
76
+ this.editManager.localBranch.on("transactionCommitted", () => {
77
+ this.commitEnricher.commitCurrentTransaction();
78
+ });
70
79
  this.editManager.localBranch.on("beforeChange", (change) => {
71
80
  // Ensure that any previously prepared commits that have not been sent are purged.
72
81
  this.commitEnricher.purgePreparedCommits();
@@ -1 +1 @@
1
- {"version":3,"file":"sharedTreeCore.js","sourceRoot":"","sources":["../../src/shared-tree-core/sharedTreeCore.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA6D;AAc7D,qEAA4E;AAC5E,0EAAkG;AAGlG,+CAS0B;AAC1B,+CAAsE;AAEtE,2CAA0E;AAC1E,qDAA8E;AAC9E,iEAA8D;AAE9D,yEAAmE;AACnE,yDAAmF;AAEnF,2DAA8F;AAE9F,2EAAqE;AACrE,uEAAiE;AAEjE,yDAAyD;AACzD,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAWvC;;;;;GAKG;AACH,MAAa,cAA4D,SAAQ,uBAAY;IAW5F;;;OAGG;IACH,IAAW,MAAM;QAChB,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC;IACrC,CAAC;IA2BD;;;;;;;;OAQG;IACH,YACC,aAAsC,EACtC,YAA4C,EAC5C,OAAsB,EACtB,aAAwC;IACxC,uBAAuB;IACvB,EAAU,EACV,OAA+B,EAC/B,UAA8B,EAC9B,sBAA8B,EAC9B,MAAkC,EAClC,YAA0B,EAC1B,eAA0C,EAC1C,QAAkD;QAElD,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,sBAAsB,CAAC,CAAC;QAhExD;;;;WAIG;QACK,qBAAgB,GAA0B,8CAA6B,CAAC;QA6D/E,IAAI,CAAC,eAAe,GAAG;YACtB,MAAM;YACN,MAAM,EAAE,YAAY;SACpB,CAAC;QAEF,IAAA,iBAAM,EACL,OAAO,CAAC,YAAY,KAAK,SAAS,EAClC,KAAK,CAAC,oDAAoD,CAC1D,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,CAAC;QACtE;;;;WAIG;QACH,MAAM,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC;QAC3D,IAAI,CAAC,WAAW,GAAG,IAAI,4BAAW,CAAC,YAAY,EAAE,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACvF,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE;YAC1D,kFAAkF;YAClF,IAAI,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACzC,4GAA4G;YAC7G,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC;oBAC3C,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;wBAC3C,IAAI,CAAC,cAAc,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;oBACxD,CAAC;gBACF,CAAC;qBAAM,CAAC;oBACP,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;wBAC3C,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;oBACrD,CAAC;gBACF,CAAC;YACF,CAAC;iBAAM,IACN,MAAM,CAAC,IAAI,KAAK,SAAS;gBACzB,IAAA,gCAAoB,EAAC,MAAM,CAAC,KAAK,mBAAmB;gBACpD,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,aAAa,EAAE,EACrC,CAAC;gBACF,IAAA,iBAAM,EACL,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAC9B,0DAA0D,CAC1D,CAAC;gBACF,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC/D,CAAC;QACF,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE;YACzD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC;gBAC3C,mEAAmE;gBACnE,OAAO;YACR,CAAC;YACD,IACC,MAAM,CAAC,IAAI,KAAK,QAAQ;gBACxB,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,IAAA,gCAAoB,EAAC,MAAM,CAAC,KAAK,mBAAmB,CAAC,EAClF,CAAC;gBACF,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;oBACzC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;wBAC3C,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;oBACpD,CAAC;gBACF,CAAC;qBAAM,CAAC;oBACP,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;wBAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;wBAClE,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;oBACnD,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAG,IAAI,2BAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACpE,MAAM,gBAAgB,GAAG,IAAA,2CAAoB,EAC5C,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,EACpC,gBAAgB,EAChB,OAAO,EACP,aAAa,CAAC,WAAW,CACzB,CAAC;QACF,IAAI,CAAC,aAAa,GAAG;YACpB,IAAI,gDAAqB,CACxB,IAAI,CAAC,WAAW,EAChB,gBAAgB,EAChB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,eAAe,CACpB;YACD,GAAG,aAAa;SAChB,CAAC;QACF,IAAA,iBAAM,EACL,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,EAChF,KAAK,CAAC,+CAA+C,CACrD,CAAC;QAEF,IAAI,CAAC,YAAY,GAAG,IAAA,mCAAgB,EACnC,YAAY,CAAC,MAAM,EACnB,IAAI,2BAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,EAC1C,OAAO,EACP,aAAa,CAAC,OAAO,CACrB,CAAC;QAEF,MAAM,cAAc,GAAG,QAAQ,IAAI,IAAI,sCAAkB,EAAE,CAAC;QAC5D,IAAI,CAAC,eAAe;YACnB,eAAe;gBACf,IAAI,kDAAsB,CACzB,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EACtD,cAAc,CACd,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,IAAI,8CAAoB,CAAC,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACtF,CAAC;IAED,uGAAuG;IACvG,uFAAuF;IAC7E,aAAa,CACtB,UAA4B,EAC5B,gBAAoC,EACpC,yBAAkE;QAElE,MAAM,OAAO,GAAG,IAAI,6BAAkB,EAAE,CAAC;QACzC,MAAM,mBAAmB,GAAG,IAAI,6BAAkB,EAAE,CAAC;QACrD,gFAAgF;QAChF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACpC,mBAAmB,CAAC,YAAY,CAC/B,CAAC,CAAC,GAAG,EACL,CAAC,CAAC,gBAAgB,CACjB,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EACzD,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,yBAAyB,CACzB,CACD,CAAC;QACH,CAAC;QAED,OAAO,CAAC,YAAY,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,cAAc,EAAE,CAAC,CAAC;QACjF,OAAO,OAAO,CAAC,cAAc,EAAE,CAAC;IACjC,CAAC;IAES,KAAK,CAAC,QAAQ,CAAC,QAAgC;QACxD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,CACrE,cAAc,CAAC,IAAI,CAClB,mBAAmB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,cAAc,CAAC,GAAG,CAAC,EACvE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAC7C,CACD,CAAC;QAEF,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACK,YAAY,CACnB,MAA4B,EAC5B,eAAwC,EACxC,UAAU,GAAG,KAAK;QAElB,IAAA,iBAAM;QACL,8DAA8D;QAC9D,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,aAAa,EAAE,IAAI,UAAU,EACpD,KAAK,CAAC,kDAAkD,CACxD,CAAC;QACF,IAAA,iBAAM,EACL,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC,EAC3D,KAAK,CAAC,4DAA4D,CAClE,CAAC;QAEF,iGAAiG;QACjG,yDAAyD;QACzD,yGAAyG;QACzG,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACzC,MAAM,WAAW,GAAc,IAAA,gBAAK,EAAE,IAAI,CAAC,gBAA2B,GAAG,CAAC,CAAC,CAAC;YAC5E,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC;YACpC,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAClC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,EACzD,WAAW,EACX,IAAI,CAAC,gBAAgB,CACrB,CAAC;YACF,IAAI,CAAC,WAAW,CAAC,4BAA4B,CAAC,WAAW,CAAC,CAAC;YAC3D,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CACvC;YACC,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc;SAC1C,EACD;YACC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,MAAM,EAAE,eAAe;SACvB,CACD,CAAC;QACF,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;YAChC,mGAAmG;YACnG,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE;YACtC,MAAM,EAAE,eAAe,CAAC,MAAM;SAC9B,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAES,WAAW,CACpB,OAAkC,EAClC,KAAc,EACd,eAAwB;QAExB,gFAAgF;QAChF,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE;YACxE,YAAY,EAAE,IAAI,CAAC,YAAY;SAC/B,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAClC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,EACxB,IAAA,gBAAK,EAAC,OAAO,CAAC,cAAc,CAAC,EAC7B,IAAA,gBAAK,EAAC,OAAO,CAAC,uBAAuB,CAAC,CACtC,CAAC;QACF,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAErD,IAAI,CAAC,WAAW,CAAC,4BAA4B,CAAC,IAAA,gBAAK,EAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACrF,CAAC;IAED;;OAEG;IACO,cAAc;QACvB,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;IACrC,CAAC;IAES,YAAY,KAAU,CAAC;IAEd,SAAS;QAC3B,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QACnC,CAAC;IACF,CAAC;IAEkB,YAAY,CAC9B,OAA+B,EAC/B,eAAwB;QAExB,gFAAgF;QAChF,MAAM,EACL,MAAM,EAAE,EAAE,QAAQ,EAAE,GACpB,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YAC7D,YAAY,EAAE,IAAI,CAAC,YAAY;SAC/B,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC5D,8GAA8G;QAC9G,IAAI,IAAI,CAAC,eAAe,CAAC,iBAAiB,KAAK,KAAK,EAAE,CAAC;YACtD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;YACtD,IAAA,iBAAM,EACL,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,EACxB,KAAK,CAAC,8DAA8D,CACpE,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACrD,CAAC;QACD,IAAA,iBAAM,EACL,sBAAsB,CAAC,eAAe,CAAC,EACvC,KAAK,CAAC,oDAAoD,CAC1D,CAAC;QACF,IAAA,iBAAM,EACL,IAAI,CAAC,eAAe,CAAC,iBAAiB,KAAK,KAAK,EAChD,4CAA4C,CAC5C,CAAC;QACF,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC;QAC7D,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IAES,cAAc,CAAC,OAA+B;QACvD,IAAA,iBAAM,EACL,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,aAAa,EAAE,EACtC,KAAK,CAAC,+DAA+D,CACrE,CAAC;QACF,gFAAgF;QAChF,MAAM,EACL,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAC5B,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAEe,SAAS,CAAC,MAAgB;QACzC,MAAM,OAAO,GAAsC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;QACnF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACpC,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxE,OAAO,CAAC,EAAE,MAAV,OAAO,CAAC,EAAE,IAAM,EAAE,EAAC;gBACnB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC5B,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzB,CAAC;YACF,CAAC;QACF,CAAC;QAED,OAAO;YACN,OAAO;SACP,CAAC;IACH,CAAC;CACD;AAxWD,wCAwWC;AAED,SAAS,sBAAsB,CAC9B,iBAA0B;IAE1B,MAAM,eAAe,GAAG,iBAA4C,CAAC;IACrE,OAAO,eAAe,CAAC,MAAM,KAAK,SAAS,IAAI,eAAe,CAAC,MAAM,KAAK,SAAS,CAAC;AACrF,CAAC;AA6DD;;GAEG;AACH,SAAS,mBAAmB,CAC3B,OAA+B,EAC/B,GAAG,YAAsB;IAEzB,MAAM,KAAK,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAE3C,OAAO;QACN,KAAK,CAAC,QAAQ,CAAC,IAAY;YAC1B,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,IAAI;YAClB,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI;YACd,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;KACD,CAAC;AACH,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport type {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport type {\n\tIExperimentalIncrementalSummaryContext,\n\tIGarbageCollectionData,\n\tISummaryTreeWithStats,\n\tITelemetryContext,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport { type IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base/internal\";\n\nimport type { ICodecOptions, IJsonCodec } from \"../codec/index.js\";\nimport {\n\ttype ChangeFamily,\n\ttype ChangeFamilyEditor,\n\ttype GraphCommit,\n\ttype RevisionTag,\n\tRevisionTagCodec,\n\ttype SchemaAndPolicy,\n\ttype SchemaPolicy,\n\ttype TreeStoredSchemaRepository,\n} from \"../core/index.js\";\nimport { type JsonCompatibleReadOnly, brand } from \"../util/index.js\";\n\nimport { type SharedTreeBranch, getChangeReplaceType } from \"./branch.js\";\nimport { EditManager, minimumPossibleSequenceNumber } from \"./editManager.js\";\nimport { makeEditManagerCodec } from \"./editManagerCodecs.js\";\nimport type { SeqNumber } from \"./editManagerFormat.js\";\nimport { EditManagerSummarizer } from \"./editManagerSummarizer.js\";\nimport { type MessageEncodingContext, makeMessageCodec } from \"./messageCodecs.js\";\nimport type { DecodedMessage } from \"./messageTypes.js\";\nimport { type ChangeEnricherReadonlyCheckout, NoOpChangeEnricher } from \"./changeEnricher.js\";\nimport type { ResubmitMachine } from \"./resubmitMachine.js\";\nimport { DefaultResubmitMachine } from \"./defaultResubmitMachine.js\";\nimport { BranchCommitEnricher } from \"./branchCommitEnricher.js\";\n\n// TODO: Organize this to be adjacent to persisted types.\nconst summarizablesTreeKey = \"indexes\";\n\nexport interface ExplicitCoreCodecVersions {\n\teditManager: number;\n\tmessage: number;\n}\n\nexport interface ClonableSchemaAndPolicy extends SchemaAndPolicy {\n\tschema: TreeStoredSchemaRepository;\n}\n\n/**\n * Generic shared tree, which needs to be configured with indexes, field kinds and a history policy to be used.\n *\n * TODO: actually implement\n * TODO: is history policy a detail of what indexes are used, or is there something else to it?\n */\nexport class SharedTreeCore<TEditor extends ChangeFamilyEditor, TChange> extends SharedObject {\n\tprivate readonly editManager: EditManager<TEditor, TChange, ChangeFamily<TEditor, TChange>>;\n\tprivate readonly summarizables: readonly Summarizable[];\n\n\t/**\n\t * The sequence number that this instance is at.\n\t * This number is artificial in that it is made up by this instance as opposed to being provided by the runtime.\n\t * Is `undefined` after (and only after) this instance is attached.\n\t */\n\tprivate detachedRevision: SeqNumber | undefined = minimumPossibleSequenceNumber;\n\n\t/**\n\t * Used to edit the state of the tree. Edits will be immediately applied locally to the tree.\n\t * If there is no transaction currently ongoing, then the edits will be submitted to Fluid immediately as well.\n\t */\n\tpublic get editor(): TEditor {\n\t\treturn this.getLocalBranch().editor;\n\t}\n\n\t/**\n\t * Used to encode/decode messages sent to/received from the Fluid runtime.\n\t *\n\t * @remarks Since there is currently only one format, this can just be cached on the class.\n\t * With more write formats active, it may make sense to keep around the \"usual\" format codec\n\t * (the one for the current persisted configuration) and resolve codecs for different versions\n\t * as necessary (e.g. an upgrade op came in, or the configuration changed within the collab window\n\t * and an op needs to be interpreted which isn't written with the current configuration).\n\t */\n\tprivate readonly messageCodec: IJsonCodec<\n\t\tDecodedMessage<TChange>,\n\t\tunknown,\n\t\tunknown,\n\t\tMessageEncodingContext\n\t>;\n\n\tprivate readonly idCompressor: IIdCompressor;\n\n\tprivate readonly resubmitMachine: ResubmitMachine<TChange>;\n\tprotected readonly commitEnricher: BranchCommitEnricher<TChange>;\n\n\tprotected readonly mintRevisionTag: () => RevisionTag;\n\n\tprivate readonly schemaAndPolicy: ClonableSchemaAndPolicy;\n\n\t/**\n\t * @param summarizables - Summarizers for all indexes used by this tree\n\t * @param changeFamily - The change family\n\t * @param editManager - The edit manager\n\t * @param id - The id of the shared object\n\t * @param runtime - The IFluidDataStoreRuntime which contains the shared object\n\t * @param attributes - Attributes of the shared object\n\t * @param telemetryContextPrefix - The property prefix for telemetry pertaining to this object. See {@link ITelemetryContext}\n\t */\n\tpublic constructor(\n\t\tsummarizables: readonly Summarizable[],\n\t\tchangeFamily: ChangeFamily<TEditor, TChange>,\n\t\toptions: ICodecOptions,\n\t\tformatOptions: ExplicitCoreCodecVersions,\n\t\t// Base class arguments\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\ttelemetryContextPrefix: string,\n\t\tschema: TreeStoredSchemaRepository,\n\t\tschemaPolicy: SchemaPolicy,\n\t\tresubmitMachine?: ResubmitMachine<TChange>,\n\t\tenricher?: ChangeEnricherReadonlyCheckout<TChange>,\n\t) {\n\t\tsuper(id, runtime, attributes, telemetryContextPrefix);\n\n\t\tthis.schemaAndPolicy = {\n\t\t\tschema,\n\t\t\tpolicy: schemaPolicy,\n\t\t};\n\n\t\tassert(\n\t\t\truntime.idCompressor !== undefined,\n\t\t\t0x886 /* IdCompressor must be enabled to use SharedTree */,\n\t\t);\n\t\tthis.idCompressor = runtime.idCompressor;\n\t\tthis.mintRevisionTag = () => this.idCompressor.generateCompressedId();\n\t\t/**\n\t\t * A random ID that uniquely identifies this client in the collab session.\n\t\t * This is sent alongside every op to identify which client the op originated from.\n\t\t * This is used rather than the Fluid client ID because the Fluid client ID is not stable across reconnections.\n\t\t */\n\t\tconst localSessionId = runtime.idCompressor.localSessionId;\n\t\tthis.editManager = new EditManager(changeFamily, localSessionId, this.mintRevisionTag);\n\t\tthis.editManager.localBranch.on(\"beforeChange\", (change) => {\n\t\t\t// Ensure that any previously prepared commits that have not been sent are purged.\n\t\t\tthis.commitEnricher.purgePreparedCommits();\n\t\t\tif (this.detachedRevision !== undefined) {\n\t\t\t\t// Edits submitted before the first attach do not need enrichment because they will not be applied by peers.\n\t\t\t} else if (change.type === \"append\") {\n\t\t\t\tif (this.getLocalBranch().isTransacting()) {\n\t\t\t\t\tfor (const newCommit of change.newCommits) {\n\t\t\t\t\t\tthis.commitEnricher.ingestTransactionCommit(newCommit);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (const newCommit of change.newCommits) {\n\t\t\t\t\t\tthis.commitEnricher.prepareCommit(newCommit, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tchange.type === \"replace\" &&\n\t\t\t\tgetChangeReplaceType(change) === \"transactionCommit\" &&\n\t\t\t\t!this.getLocalBranch().isTransacting()\n\t\t\t) {\n\t\t\t\tassert(\n\t\t\t\t\tchange.newCommits.length === 1,\n\t\t\t\t\t\"Unexpected number of commits when committing transaction\",\n\t\t\t\t);\n\t\t\t\tthis.commitEnricher.prepareCommit(change.newCommits[0], true);\n\t\t\t}\n\t\t});\n\t\tthis.editManager.localBranch.on(\"afterChange\", (change) => {\n\t\t\tif (this.getLocalBranch().isTransacting()) {\n\t\t\t\t// We do not submit ops for changes that are part of a transaction.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tchange.type === \"append\" ||\n\t\t\t\t(change.type === \"replace\" && getChangeReplaceType(change) === \"transactionCommit\")\n\t\t\t) {\n\t\t\t\tif (this.detachedRevision !== undefined) {\n\t\t\t\t\tfor (const newCommit of change.newCommits) {\n\t\t\t\t\t\tthis.submitCommit(newCommit, this.schemaAndPolicy);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (const newCommit of change.newCommits) {\n\t\t\t\t\t\tconst prepared = this.commitEnricher.getPreparedCommit(newCommit);\n\t\t\t\t\t\tthis.submitCommit(prepared, this.schemaAndPolicy);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tconst revisionTagCodec = new RevisionTagCodec(runtime.idCompressor);\n\t\tconst editManagerCodec = makeEditManagerCodec(\n\t\t\tthis.editManager.changeFamily.codecs,\n\t\t\trevisionTagCodec,\n\t\t\toptions,\n\t\t\tformatOptions.editManager,\n\t\t);\n\t\tthis.summarizables = [\n\t\t\tnew EditManagerSummarizer(\n\t\t\t\tthis.editManager,\n\t\t\t\teditManagerCodec,\n\t\t\t\tthis.idCompressor,\n\t\t\t\tthis.schemaAndPolicy,\n\t\t\t),\n\t\t\t...summarizables,\n\t\t];\n\t\tassert(\n\t\t\tnew Set(this.summarizables.map((e) => e.key)).size === this.summarizables.length,\n\t\t\t0x350 /* Index summary element keys must be unique */,\n\t\t);\n\n\t\tthis.messageCodec = makeMessageCodec(\n\t\t\tchangeFamily.codecs,\n\t\t\tnew RevisionTagCodec(runtime.idCompressor),\n\t\t\toptions,\n\t\t\tformatOptions.message,\n\t\t);\n\n\t\tconst changeEnricher = enricher ?? new NoOpChangeEnricher();\n\t\tthis.resubmitMachine =\n\t\t\tresubmitMachine ??\n\t\t\tnew DefaultResubmitMachine(\n\t\t\t\tchangeFamily.rebaser.invert.bind(changeFamily.rebaser),\n\t\t\t\tchangeEnricher,\n\t\t\t);\n\t\tthis.commitEnricher = new BranchCommitEnricher(changeFamily.rebaser, changeEnricher);\n\t}\n\n\t// TODO: SharedObject's merging of the two summary methods into summarizeCore is not what we want here:\n\t// We might want to not subclass it, or override/reimplement most of its functionality.\n\tprotected summarizeCore(\n\t\tserializer: IFluidSerializer,\n\t\ttelemetryContext?: ITelemetryContext,\n\t\tincrementalSummaryContext?: IExperimentalIncrementalSummaryContext,\n\t): ISummaryTreeWithStats {\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tconst summarizableBuilder = new SummaryTreeBuilder();\n\t\t// Merge the summaries of all summarizables together under a single ISummaryTree\n\t\tfor (const s of this.summarizables) {\n\t\t\tsummarizableBuilder.addWithStats(\n\t\t\t\ts.key,\n\t\t\t\ts.getAttachSummary(\n\t\t\t\t\t(contents) => serializer.stringify(contents, this.handle),\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\ttelemetryContext,\n\t\t\t\t\tincrementalSummaryContext,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tbuilder.addWithStats(summarizablesTreeKey, summarizableBuilder.getSummaryTree());\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected async loadCore(services: IChannelStorageService): Promise<void> {\n\t\tconst loadSummaries = this.summarizables.map(async (summaryElement) =>\n\t\t\tsummaryElement.load(\n\t\t\t\tscopeStorageService(services, summarizablesTreeKey, summaryElement.key),\n\t\t\t\t(contents) => this.serializer.parse(contents),\n\t\t\t),\n\t\t);\n\n\t\tawait Promise.all(loadSummaries);\n\t}\n\n\t/**\n\t * Submits an op to the Fluid runtime containing the given commit\n\t * @param commit - the commit to submit\n\t * @returns the submitted commit. This is undefined if the underlying `SharedObject` is not attached,\n\t * and may differ from `commit` due to enrichments like detached tree refreshers.\n\t */\n\tprivate submitCommit(\n\t\tcommit: GraphCommit<TChange>,\n\t\tschemaAndPolicy: ClonableSchemaAndPolicy,\n\t\tisResubmit = false,\n\t): void {\n\t\tassert(\n\t\t\t// Edits should not be submitted until all transactions finish\n\t\t\t!this.getLocalBranch().isTransacting() || isResubmit,\n\t\t\t0x68b /* Unexpected edit submitted during transaction */,\n\t\t);\n\t\tassert(\n\t\t\tthis.isAttached() === (this.detachedRevision === undefined),\n\t\t\t0x95a /* Detached revision should only be set when not attached */,\n\t\t);\n\n\t\t// Edits submitted before the first attach are treated as sequenced because they will be included\n\t\t// in the attach summary that is uploaded to the service.\n\t\t// Until this attach workflow happens, this instance essentially behaves as a centralized data structure.\n\t\tif (this.detachedRevision !== undefined) {\n\t\t\tconst newRevision: SeqNumber = brand((this.detachedRevision as number) + 1);\n\t\t\tthis.detachedRevision = newRevision;\n\t\t\tthis.editManager.addSequencedChange(\n\t\t\t\t{ ...commit, sessionId: this.editManager.localSessionId },\n\t\t\t\tnewRevision,\n\t\t\t\tthis.detachedRevision,\n\t\t\t);\n\t\t\tthis.editManager.advanceMinimumSequenceNumber(newRevision);\n\t\t\treturn undefined;\n\t\t}\n\t\tconst message = this.messageCodec.encode(\n\t\t\t{\n\t\t\t\tcommit,\n\t\t\t\tsessionId: this.editManager.localSessionId,\n\t\t\t},\n\t\t\t{\n\t\t\t\tidCompressor: this.idCompressor,\n\t\t\t\tschema: schemaAndPolicy,\n\t\t\t},\n\t\t);\n\t\tthis.submitLocalMessage(message, {\n\t\t\t// Clone the schema to ensure that during resubmit the schema has not been mutated by later changes\n\t\t\tschema: schemaAndPolicy.schema.clone(),\n\t\t\tpolicy: schemaAndPolicy.policy,\n\t\t});\n\t\tthis.resubmitMachine.onCommitSubmitted(commit);\n\t}\n\n\tprotected processCore(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t): void {\n\t\t// Empty context object is passed in, as our decode function is schema-agnostic.\n\t\tconst { commit, sessionId } = this.messageCodec.decode(message.contents, {\n\t\t\tidCompressor: this.idCompressor,\n\t\t});\n\n\t\tthis.editManager.addSequencedChange(\n\t\t\t{ ...commit, sessionId },\n\t\t\tbrand(message.sequenceNumber),\n\t\t\tbrand(message.referenceSequenceNumber),\n\t\t);\n\t\tthis.resubmitMachine.onSequencedCommitApplied(local);\n\n\t\tthis.editManager.advanceMinimumSequenceNumber(brand(message.minimumSequenceNumber));\n\t}\n\n\t/**\n\t * @returns the head commit of the root local branch\n\t */\n\tprotected getLocalBranch(): SharedTreeBranch<TEditor, TChange> {\n\t\treturn this.editManager.localBranch;\n\t}\n\n\tprotected onDisconnect(): void {}\n\n\tprotected override didAttach(): void {\n\t\tif (this.detachedRevision !== undefined) {\n\t\t\tthis.detachedRevision = undefined;\n\t\t}\n\t}\n\n\tprotected override reSubmitCore(\n\t\tcontent: JsonCompatibleReadOnly,\n\t\tlocalOpMetadata: unknown,\n\t): void {\n\t\t// Empty context object is passed in, as our decode function is schema-agnostic.\n\t\tconst {\n\t\t\tcommit: { revision },\n\t\t} = this.messageCodec.decode(this.serializer.decode(content), {\n\t\t\tidCompressor: this.idCompressor,\n\t\t});\n\t\tconst [commit] = this.editManager.findLocalCommit(revision);\n\t\t// If a resubmit phase is not already in progress, then this must be the first commit of a new resubmit phase.\n\t\tif (this.resubmitMachine.isInResubmitPhase === false) {\n\t\t\tconst toResubmit = this.editManager.getLocalCommits();\n\t\t\tassert(\n\t\t\t\tcommit === toResubmit[0],\n\t\t\t\t0x95d /* Resubmit phase should start with the oldest local commit */,\n\t\t\t);\n\t\t\tthis.resubmitMachine.prepareForResubmit(toResubmit);\n\t\t}\n\t\tassert(\n\t\t\tisClonableSchemaPolicy(localOpMetadata),\n\t\t\t0x95e /* Local metadata must contain schema and policy. */,\n\t\t);\n\t\tassert(\n\t\t\tthis.resubmitMachine.isInResubmitPhase !== false,\n\t\t\t\"Invalid resubmit outside of resubmit phase\",\n\t\t);\n\t\tconst enrichedCommit = this.resubmitMachine.peekNextCommit();\n\t\tthis.submitCommit(enrichedCommit, localOpMetadata, true);\n\t}\n\n\tprotected applyStashedOp(content: JsonCompatibleReadOnly): void {\n\t\tassert(\n\t\t\t!this.getLocalBranch().isTransacting(),\n\t\t\t0x674 /* Unexpected transaction is open while applying stashed ops */,\n\t\t);\n\t\t// Empty context object is passed in, as our decode function is schema-agnostic.\n\t\tconst {\n\t\t\tcommit: { revision, change },\n\t\t} = this.messageCodec.decode(content, { idCompressor: this.idCompressor });\n\t\tthis.editManager.localBranch.apply(change, revision);\n\t}\n\n\tpublic override getGCData(fullGC?: boolean): IGarbageCollectionData {\n\t\tconst gcNodes: IGarbageCollectionData[\"gcNodes\"] = super.getGCData(fullGC).gcNodes;\n\t\tfor (const s of this.summarizables) {\n\t\t\tfor (const [id, routes] of Object.entries(s.getGCData(fullGC).gcNodes)) {\n\t\t\t\tgcNodes[id] ??= [];\n\t\t\t\tfor (const route of routes) {\n\t\t\t\t\tgcNodes[id].push(route);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tgcNodes,\n\t\t};\n\t}\n}\n\nfunction isClonableSchemaPolicy(\n\tmaybeSchemaPolicy: unknown,\n): maybeSchemaPolicy is ClonableSchemaAndPolicy {\n\tconst schemaAndPolicy = maybeSchemaPolicy as ClonableSchemaAndPolicy;\n\treturn schemaAndPolicy.schema !== undefined && schemaAndPolicy.policy !== undefined;\n}\n\n/**\n * Specifies the behavior of a component that puts data in a summary.\n */\nexport interface Summarizable {\n\t/**\n\t * Field name in summary json under which this element stores its data.\n\t */\n\treadonly key: string;\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#(IChannel:interface).getAttachSummary}\n\t * @param stringify - Serializes the contents of the component (including {@link (IFluidHandle:interface)}s) for storage.\n\t */\n\tgetAttachSummary(\n\t\tstringify: SummaryElementStringifier,\n\t\tfullTree?: boolean,\n\t\ttrackState?: boolean,\n\t\ttelemetryContext?: ITelemetryContext,\n\t\tincrementalSummaryContext?: IExperimentalIncrementalSummaryContext,\n\t): ISummaryTreeWithStats;\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#(IChannel:interface).summarize}\n\t * @param stringify - Serializes the contents of the component (including {@link (IFluidHandle:interface)}s) for storage.\n\t */\n\tsummarize(\n\t\tstringify: SummaryElementStringifier,\n\t\tfullTree?: boolean,\n\t\ttrackState?: boolean,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): Promise<ISummaryTreeWithStats>;\n\n\t/**\n\t * {@inheritDoc (ISharedObject:interface).getGCData}\n\t */\n\t// TODO: Change this interface (and the one in ISharedObject, if necessary) to support \"handles within handles\".\n\t// Consider the case of a document with history; the return value here currently grows unboundedly.\n\tgetGCData(fullGC?: boolean): IGarbageCollectionData;\n\n\t/**\n\t * Allows the component to perform custom loading. The storage service is scoped to this component and therefore\n\t * paths in this component will not collide with those in other components, even if they are the same string.\n\t * @param service - Storage used by the component\n\t * @param parse - Parses serialized data from storage into runtime objects for the component\n\t */\n\tload(service: IChannelStorageService, parse: SummaryElementParser): Promise<void>;\n}\n\n/**\n * Serializes the given contents into a string acceptable for storing in summaries, i.e. all\n * Fluid handles have been replaced appropriately by an IFluidSerializer\n */\nexport type SummaryElementStringifier = (contents: unknown) => string;\n\n/**\n * Parses a serialized/summarized string into an object, rehydrating any Fluid handles as necessary\n */\nexport type SummaryElementParser = (contents: string) => unknown;\n\n/**\n * Compose an {@link IChannelStorageService} which prefixes all paths before forwarding them to the original service\n */\nfunction scopeStorageService(\n\tservice: IChannelStorageService,\n\t...pathElements: string[]\n): IChannelStorageService {\n\tconst scope = `${pathElements.join(\"/\")}/`;\n\n\treturn {\n\t\tasync readBlob(path: string): Promise<ArrayBufferLike> {\n\t\t\treturn service.readBlob(`${scope}${path}`);\n\t\t},\n\t\tasync contains(path) {\n\t\t\treturn service.contains(`${scope}${path}`);\n\t\t},\n\t\tasync list(path) {\n\t\t\treturn service.list(`${scope}${path}`);\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"sharedTreeCore.js","sourceRoot":"","sources":["../../src/shared-tree-core/sharedTreeCore.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport type {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport type {\n\tIExperimentalIncrementalSummaryContext,\n\tIGarbageCollectionData,\n\tISummaryTreeWithStats,\n\tITelemetryContext,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport { type IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base/internal\";\n\nimport type { ICodecOptions, IJsonCodec } from \"../codec/index.js\";\nimport {\n\ttype ChangeFamily,\n\ttype ChangeFamilyEditor,\n\ttype GraphCommit,\n\ttype RevisionTag,\n\tRevisionTagCodec,\n\ttype SchemaAndPolicy,\n\ttype SchemaPolicy,\n\ttype TreeStoredSchemaRepository,\n} from \"../core/index.js\";\nimport { type JsonCompatibleReadOnly, brand } from \"../util/index.js\";\n\nimport { type SharedTreeBranch, getChangeReplaceType } from \"./branch.js\";\nimport { EditManager, minimumPossibleSequenceNumber } from \"./editManager.js\";\nimport { makeEditManagerCodec } from \"./editManagerCodecs.js\";\nimport type { SeqNumber } from \"./editManagerFormat.js\";\nimport { EditManagerSummarizer } from \"./editManagerSummarizer.js\";\nimport { type MessageEncodingContext, makeMessageCodec } from \"./messageCodecs.js\";\nimport type { DecodedMessage } from \"./messageTypes.js\";\nimport { type ChangeEnricherReadonlyCheckout, NoOpChangeEnricher } from \"./changeEnricher.js\";\nimport type { ResubmitMachine } from \"./resubmitMachine.js\";\nimport { DefaultResubmitMachine } from \"./defaultResubmitMachine.js\";\nimport { BranchCommitEnricher } from \"./branchCommitEnricher.js\";\n\n// TODO: Organize this to be adjacent to persisted types.\nconst summarizablesTreeKey = \"indexes\";\n\nexport interface ExplicitCoreCodecVersions {\n\teditManager: number;\n\tmessage: number;\n}\n\nexport interface ClonableSchemaAndPolicy extends SchemaAndPolicy {\n\tschema: TreeStoredSchemaRepository;\n}\n\n/**\n * Generic shared tree, which needs to be configured with indexes, field kinds and a history policy to be used.\n *\n * TODO: actually implement\n * TODO: is history policy a detail of what indexes are used, or is there something else to it?\n */\nexport class SharedTreeCore<TEditor extends ChangeFamilyEditor, TChange> extends SharedObject {\n\tprivate readonly editManager: EditManager<TEditor, TChange, ChangeFamily<TEditor, TChange>>;\n\tprivate readonly summarizables: readonly Summarizable[];\n\n\t/**\n\t * The sequence number that this instance is at.\n\t * This number is artificial in that it is made up by this instance as opposed to being provided by the runtime.\n\t * Is `undefined` after (and only after) this instance is attached.\n\t */\n\tprivate detachedRevision: SeqNumber | undefined = minimumPossibleSequenceNumber;\n\n\t/**\n\t * Used to edit the state of the tree. Edits will be immediately applied locally to the tree.\n\t * If there is no transaction currently ongoing, then the edits will be submitted to Fluid immediately as well.\n\t */\n\tpublic get editor(): TEditor {\n\t\treturn this.getLocalBranch().editor;\n\t}\n\n\t/**\n\t * Used to encode/decode messages sent to/received from the Fluid runtime.\n\t *\n\t * @remarks Since there is currently only one format, this can just be cached on the class.\n\t * With more write formats active, it may make sense to keep around the \"usual\" format codec\n\t * (the one for the current persisted configuration) and resolve codecs for different versions\n\t * as necessary (e.g. an upgrade op came in, or the configuration changed within the collab window\n\t * and an op needs to be interpreted which isn't written with the current configuration).\n\t */\n\tprivate readonly messageCodec: IJsonCodec<\n\t\tDecodedMessage<TChange>,\n\t\tunknown,\n\t\tunknown,\n\t\tMessageEncodingContext\n\t>;\n\n\tprivate readonly idCompressor: IIdCompressor;\n\n\tprivate readonly resubmitMachine: ResubmitMachine<TChange>;\n\tprotected readonly commitEnricher: BranchCommitEnricher<TChange>;\n\n\tprotected readonly mintRevisionTag: () => RevisionTag;\n\n\tprivate readonly schemaAndPolicy: ClonableSchemaAndPolicy;\n\n\t/**\n\t * @param summarizables - Summarizers for all indexes used by this tree\n\t * @param changeFamily - The change family\n\t * @param editManager - The edit manager\n\t * @param id - The id of the shared object\n\t * @param runtime - The IFluidDataStoreRuntime which contains the shared object\n\t * @param attributes - Attributes of the shared object\n\t * @param telemetryContextPrefix - The property prefix for telemetry pertaining to this object. See {@link ITelemetryContext}\n\t */\n\tpublic constructor(\n\t\tsummarizables: readonly Summarizable[],\n\t\tchangeFamily: ChangeFamily<TEditor, TChange>,\n\t\toptions: ICodecOptions,\n\t\tformatOptions: ExplicitCoreCodecVersions,\n\t\t// Base class arguments\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\ttelemetryContextPrefix: string,\n\t\tschema: TreeStoredSchemaRepository,\n\t\tschemaPolicy: SchemaPolicy,\n\t\tresubmitMachine?: ResubmitMachine<TChange>,\n\t\tenricher?: ChangeEnricherReadonlyCheckout<TChange>,\n\t) {\n\t\tsuper(id, runtime, attributes, telemetryContextPrefix);\n\n\t\tthis.schemaAndPolicy = {\n\t\t\tschema,\n\t\t\tpolicy: schemaPolicy,\n\t\t};\n\n\t\tassert(\n\t\t\truntime.idCompressor !== undefined,\n\t\t\t0x886 /* IdCompressor must be enabled to use SharedTree */,\n\t\t);\n\t\tthis.idCompressor = runtime.idCompressor;\n\t\tthis.mintRevisionTag = () => this.idCompressor.generateCompressedId();\n\t\t/**\n\t\t * A random ID that uniquely identifies this client in the collab session.\n\t\t * This is sent alongside every op to identify which client the op originated from.\n\t\t * This is used rather than the Fluid client ID because the Fluid client ID is not stable across reconnections.\n\t\t */\n\t\tconst localSessionId = runtime.idCompressor.localSessionId;\n\t\tthis.editManager = new EditManager(changeFamily, localSessionId, this.mintRevisionTag);\n\t\tthis.editManager.localBranch.on(\"transactionStarted\", () => {\n\t\t\tthis.commitEnricher.startNewTransaction();\n\t\t});\n\t\tthis.editManager.localBranch.on(\"transactionAborted\", () => {\n\t\t\tthis.commitEnricher.abortCurrentTransaction();\n\t\t});\n\t\tthis.editManager.localBranch.on(\"transactionCommitted\", () => {\n\t\t\tthis.commitEnricher.commitCurrentTransaction();\n\t\t});\n\t\tthis.editManager.localBranch.on(\"beforeChange\", (change) => {\n\t\t\t// Ensure that any previously prepared commits that have not been sent are purged.\n\t\t\tthis.commitEnricher.purgePreparedCommits();\n\t\t\tif (this.detachedRevision !== undefined) {\n\t\t\t\t// Edits submitted before the first attach do not need enrichment because they will not be applied by peers.\n\t\t\t} else if (change.type === \"append\") {\n\t\t\t\tif (this.getLocalBranch().isTransacting()) {\n\t\t\t\t\tfor (const newCommit of change.newCommits) {\n\t\t\t\t\t\tthis.commitEnricher.ingestTransactionCommit(newCommit);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (const newCommit of change.newCommits) {\n\t\t\t\t\t\tthis.commitEnricher.prepareCommit(newCommit, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tchange.type === \"replace\" &&\n\t\t\t\tgetChangeReplaceType(change) === \"transactionCommit\" &&\n\t\t\t\t!this.getLocalBranch().isTransacting()\n\t\t\t) {\n\t\t\t\tassert(\n\t\t\t\t\tchange.newCommits.length === 1,\n\t\t\t\t\t\"Unexpected number of commits when committing transaction\",\n\t\t\t\t);\n\t\t\t\tthis.commitEnricher.prepareCommit(change.newCommits[0], true);\n\t\t\t}\n\t\t});\n\t\tthis.editManager.localBranch.on(\"afterChange\", (change) => {\n\t\t\tif (this.getLocalBranch().isTransacting()) {\n\t\t\t\t// We do not submit ops for changes that are part of a transaction.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tchange.type === \"append\" ||\n\t\t\t\t(change.type === \"replace\" && getChangeReplaceType(change) === \"transactionCommit\")\n\t\t\t) {\n\t\t\t\tif (this.detachedRevision !== undefined) {\n\t\t\t\t\tfor (const newCommit of change.newCommits) {\n\t\t\t\t\t\tthis.submitCommit(newCommit, this.schemaAndPolicy);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (const newCommit of change.newCommits) {\n\t\t\t\t\t\tconst prepared = this.commitEnricher.getPreparedCommit(newCommit);\n\t\t\t\t\t\tthis.submitCommit(prepared, this.schemaAndPolicy);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tconst revisionTagCodec = new RevisionTagCodec(runtime.idCompressor);\n\t\tconst editManagerCodec = makeEditManagerCodec(\n\t\t\tthis.editManager.changeFamily.codecs,\n\t\t\trevisionTagCodec,\n\t\t\toptions,\n\t\t\tformatOptions.editManager,\n\t\t);\n\t\tthis.summarizables = [\n\t\t\tnew EditManagerSummarizer(\n\t\t\t\tthis.editManager,\n\t\t\t\teditManagerCodec,\n\t\t\t\tthis.idCompressor,\n\t\t\t\tthis.schemaAndPolicy,\n\t\t\t),\n\t\t\t...summarizables,\n\t\t];\n\t\tassert(\n\t\t\tnew Set(this.summarizables.map((e) => e.key)).size === this.summarizables.length,\n\t\t\t0x350 /* Index summary element keys must be unique */,\n\t\t);\n\n\t\tthis.messageCodec = makeMessageCodec(\n\t\t\tchangeFamily.codecs,\n\t\t\tnew RevisionTagCodec(runtime.idCompressor),\n\t\t\toptions,\n\t\t\tformatOptions.message,\n\t\t);\n\n\t\tconst changeEnricher = enricher ?? new NoOpChangeEnricher();\n\t\tthis.resubmitMachine =\n\t\t\tresubmitMachine ??\n\t\t\tnew DefaultResubmitMachine(\n\t\t\t\tchangeFamily.rebaser.invert.bind(changeFamily.rebaser),\n\t\t\t\tchangeEnricher,\n\t\t\t);\n\t\tthis.commitEnricher = new BranchCommitEnricher(changeFamily.rebaser, changeEnricher);\n\t}\n\n\t// TODO: SharedObject's merging of the two summary methods into summarizeCore is not what we want here:\n\t// We might want to not subclass it, or override/reimplement most of its functionality.\n\tprotected summarizeCore(\n\t\tserializer: IFluidSerializer,\n\t\ttelemetryContext?: ITelemetryContext,\n\t\tincrementalSummaryContext?: IExperimentalIncrementalSummaryContext,\n\t): ISummaryTreeWithStats {\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tconst summarizableBuilder = new SummaryTreeBuilder();\n\t\t// Merge the summaries of all summarizables together under a single ISummaryTree\n\t\tfor (const s of this.summarizables) {\n\t\t\tsummarizableBuilder.addWithStats(\n\t\t\t\ts.key,\n\t\t\t\ts.getAttachSummary(\n\t\t\t\t\t(contents) => serializer.stringify(contents, this.handle),\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\ttelemetryContext,\n\t\t\t\t\tincrementalSummaryContext,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tbuilder.addWithStats(summarizablesTreeKey, summarizableBuilder.getSummaryTree());\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected async loadCore(services: IChannelStorageService): Promise<void> {\n\t\tconst loadSummaries = this.summarizables.map(async (summaryElement) =>\n\t\t\tsummaryElement.load(\n\t\t\t\tscopeStorageService(services, summarizablesTreeKey, summaryElement.key),\n\t\t\t\t(contents) => this.serializer.parse(contents),\n\t\t\t),\n\t\t);\n\n\t\tawait Promise.all(loadSummaries);\n\t}\n\n\t/**\n\t * Submits an op to the Fluid runtime containing the given commit\n\t * @param commit - the commit to submit\n\t * @returns the submitted commit. This is undefined if the underlying `SharedObject` is not attached,\n\t * and may differ from `commit` due to enrichments like detached tree refreshers.\n\t */\n\tprivate submitCommit(\n\t\tcommit: GraphCommit<TChange>,\n\t\tschemaAndPolicy: ClonableSchemaAndPolicy,\n\t\tisResubmit = false,\n\t): void {\n\t\tassert(\n\t\t\t// Edits should not be submitted until all transactions finish\n\t\t\t!this.getLocalBranch().isTransacting() || isResubmit,\n\t\t\t0x68b /* Unexpected edit submitted during transaction */,\n\t\t);\n\t\tassert(\n\t\t\tthis.isAttached() === (this.detachedRevision === undefined),\n\t\t\t0x95a /* Detached revision should only be set when not attached */,\n\t\t);\n\n\t\t// Edits submitted before the first attach are treated as sequenced because they will be included\n\t\t// in the attach summary that is uploaded to the service.\n\t\t// Until this attach workflow happens, this instance essentially behaves as a centralized data structure.\n\t\tif (this.detachedRevision !== undefined) {\n\t\t\tconst newRevision: SeqNumber = brand((this.detachedRevision as number) + 1);\n\t\t\tthis.detachedRevision = newRevision;\n\t\t\tthis.editManager.addSequencedChange(\n\t\t\t\t{ ...commit, sessionId: this.editManager.localSessionId },\n\t\t\t\tnewRevision,\n\t\t\t\tthis.detachedRevision,\n\t\t\t);\n\t\t\tthis.editManager.advanceMinimumSequenceNumber(newRevision);\n\t\t\treturn undefined;\n\t\t}\n\t\tconst message = this.messageCodec.encode(\n\t\t\t{\n\t\t\t\tcommit,\n\t\t\t\tsessionId: this.editManager.localSessionId,\n\t\t\t},\n\t\t\t{\n\t\t\t\tidCompressor: this.idCompressor,\n\t\t\t\tschema: schemaAndPolicy,\n\t\t\t},\n\t\t);\n\t\tthis.submitLocalMessage(message, {\n\t\t\t// Clone the schema to ensure that during resubmit the schema has not been mutated by later changes\n\t\t\tschema: schemaAndPolicy.schema.clone(),\n\t\t\tpolicy: schemaAndPolicy.policy,\n\t\t});\n\t\tthis.resubmitMachine.onCommitSubmitted(commit);\n\t}\n\n\tprotected processCore(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t): void {\n\t\t// Empty context object is passed in, as our decode function is schema-agnostic.\n\t\tconst { commit, sessionId } = this.messageCodec.decode(message.contents, {\n\t\t\tidCompressor: this.idCompressor,\n\t\t});\n\n\t\tthis.editManager.addSequencedChange(\n\t\t\t{ ...commit, sessionId },\n\t\t\tbrand(message.sequenceNumber),\n\t\t\tbrand(message.referenceSequenceNumber),\n\t\t);\n\t\tthis.resubmitMachine.onSequencedCommitApplied(local);\n\n\t\tthis.editManager.advanceMinimumSequenceNumber(brand(message.minimumSequenceNumber));\n\t}\n\n\t/**\n\t * @returns the head commit of the root local branch\n\t */\n\tprotected getLocalBranch(): SharedTreeBranch<TEditor, TChange> {\n\t\treturn this.editManager.localBranch;\n\t}\n\n\tprotected onDisconnect(): void {}\n\n\tprotected override didAttach(): void {\n\t\tif (this.detachedRevision !== undefined) {\n\t\t\tthis.detachedRevision = undefined;\n\t\t}\n\t}\n\n\tprotected override reSubmitCore(\n\t\tcontent: JsonCompatibleReadOnly,\n\t\tlocalOpMetadata: unknown,\n\t): void {\n\t\t// Empty context object is passed in, as our decode function is schema-agnostic.\n\t\tconst {\n\t\t\tcommit: { revision },\n\t\t} = this.messageCodec.decode(this.serializer.decode(content), {\n\t\t\tidCompressor: this.idCompressor,\n\t\t});\n\t\tconst [commit] = this.editManager.findLocalCommit(revision);\n\t\t// If a resubmit phase is not already in progress, then this must be the first commit of a new resubmit phase.\n\t\tif (this.resubmitMachine.isInResubmitPhase === false) {\n\t\t\tconst toResubmit = this.editManager.getLocalCommits();\n\t\t\tassert(\n\t\t\t\tcommit === toResubmit[0],\n\t\t\t\t0x95d /* Resubmit phase should start with the oldest local commit */,\n\t\t\t);\n\t\t\tthis.resubmitMachine.prepareForResubmit(toResubmit);\n\t\t}\n\t\tassert(\n\t\t\tisClonableSchemaPolicy(localOpMetadata),\n\t\t\t0x95e /* Local metadata must contain schema and policy. */,\n\t\t);\n\t\tassert(\n\t\t\tthis.resubmitMachine.isInResubmitPhase !== false,\n\t\t\t\"Invalid resubmit outside of resubmit phase\",\n\t\t);\n\t\tconst enrichedCommit = this.resubmitMachine.peekNextCommit();\n\t\tthis.submitCommit(enrichedCommit, localOpMetadata, true);\n\t}\n\n\tprotected applyStashedOp(content: JsonCompatibleReadOnly): void {\n\t\tassert(\n\t\t\t!this.getLocalBranch().isTransacting(),\n\t\t\t0x674 /* Unexpected transaction is open while applying stashed ops */,\n\t\t);\n\t\t// Empty context object is passed in, as our decode function is schema-agnostic.\n\t\tconst {\n\t\t\tcommit: { revision, change },\n\t\t} = this.messageCodec.decode(content, { idCompressor: this.idCompressor });\n\t\tthis.editManager.localBranch.apply(change, revision);\n\t}\n\n\tpublic override getGCData(fullGC?: boolean): IGarbageCollectionData {\n\t\tconst gcNodes: IGarbageCollectionData[\"gcNodes\"] = super.getGCData(fullGC).gcNodes;\n\t\tfor (const s of this.summarizables) {\n\t\t\tfor (const [id, routes] of Object.entries(s.getGCData(fullGC).gcNodes)) {\n\t\t\t\tgcNodes[id] ??= [];\n\t\t\t\tfor (const route of routes) {\n\t\t\t\t\tgcNodes[id].push(route);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tgcNodes,\n\t\t};\n\t}\n}\n\nfunction isClonableSchemaPolicy(\n\tmaybeSchemaPolicy: unknown,\n): maybeSchemaPolicy is ClonableSchemaAndPolicy {\n\tconst schemaAndPolicy = maybeSchemaPolicy as ClonableSchemaAndPolicy;\n\treturn schemaAndPolicy.schema !== undefined && schemaAndPolicy.policy !== undefined;\n}\n\n/**\n * Specifies the behavior of a component that puts data in a summary.\n */\nexport interface Summarizable {\n\t/**\n\t * Field name in summary json under which this element stores its data.\n\t */\n\treadonly key: string;\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#(IChannel:interface).getAttachSummary}\n\t * @param stringify - Serializes the contents of the component (including {@link (IFluidHandle:interface)}s) for storage.\n\t */\n\tgetAttachSummary(\n\t\tstringify: SummaryElementStringifier,\n\t\tfullTree?: boolean,\n\t\ttrackState?: boolean,\n\t\ttelemetryContext?: ITelemetryContext,\n\t\tincrementalSummaryContext?: IExperimentalIncrementalSummaryContext,\n\t): ISummaryTreeWithStats;\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#(IChannel:interface).summarize}\n\t * @param stringify - Serializes the contents of the component (including {@link (IFluidHandle:interface)}s) for storage.\n\t */\n\tsummarize(\n\t\tstringify: SummaryElementStringifier,\n\t\tfullTree?: boolean,\n\t\ttrackState?: boolean,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): Promise<ISummaryTreeWithStats>;\n\n\t/**\n\t * {@inheritDoc (ISharedObject:interface).getGCData}\n\t */\n\t// TODO: Change this interface (and the one in ISharedObject, if necessary) to support \"handles within handles\".\n\t// Consider the case of a document with history; the return value here currently grows unboundedly.\n\tgetGCData(fullGC?: boolean): IGarbageCollectionData;\n\n\t/**\n\t * Allows the component to perform custom loading. The storage service is scoped to this component and therefore\n\t * paths in this component will not collide with those in other components, even if they are the same string.\n\t * @param service - Storage used by the component\n\t * @param parse - Parses serialized data from storage into runtime objects for the component\n\t */\n\tload(service: IChannelStorageService, parse: SummaryElementParser): Promise<void>;\n}\n\n/**\n * Serializes the given contents into a string acceptable for storing in summaries, i.e. all\n * Fluid handles have been replaced appropriately by an IFluidSerializer\n */\nexport type SummaryElementStringifier = (contents: unknown) => string;\n\n/**\n * Parses a serialized/summarized string into an object, rehydrating any Fluid handles as necessary\n */\nexport type SummaryElementParser = (contents: string) => unknown;\n\n/**\n * Compose an {@link IChannelStorageService} which prefixes all paths before forwarding them to the original service\n */\nfunction scopeStorageService(\n\tservice: IChannelStorageService,\n\t...pathElements: string[]\n): IChannelStorageService {\n\tconst scope = `${pathElements.join(\"/\")}/`;\n\n\treturn {\n\t\tasync readBlob(path: string): Promise<ArrayBufferLike> {\n\t\t\treturn service.readBlob(`${scope}${path}`);\n\t\t},\n\t\tasync contains(path) {\n\t\t\treturn service.contains(`${scope}${path}`);\n\t\t},\n\t\tasync list(path) {\n\t\t\treturn service.list(`${scope}${path}`);\n\t\t},\n\t};\n}\n"]}
@@ -11,8 +11,18 @@ export declare class TransactionEnricher<TChange> {
11
11
  private readonly rebaser;
12
12
  private readonly enricher;
13
13
  private readonly transactionCommits;
14
+ /**
15
+ * The number of commits before the start of each active transaction scope.
16
+ * For a stack of `n` transaction scopes, the array will contain `n` integers,
17
+ * where the integer at index `i` is the number of commits made before the start of the `i`th transaction scope
18
+ * (therefore, the first element in the array, if present, is always 0)
19
+ */
20
+ private readonly transactionScopesStart;
14
21
  constructor(rebaser: ChangeRebaser<TChange>, enricher: ChangeEnricherReadonlyCheckout<TChange>);
15
- addTransactionSteps(commit: GraphCommit<TChange>): void;
22
+ startNewTransaction(): void;
23
+ commitCurrentTransaction(): void;
24
+ abortCurrentTransaction(): void;
25
+ addTransactionStep(commit: GraphCommit<TChange>): void;
16
26
  getComposedChange(revision: RevisionTag): TChange;
17
27
  }
18
28
  //# sourceMappingURL=transactionEnricher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transactionEnricher.d.ts","sourceRoot":"","sources":["../../src/shared-tree-core/transactionEnricher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAE1E;;GAEG;AACH,qBAAa,mBAAmB,CAAC,OAAO;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0C;IACnE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA8B;gBAGhE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,EAC/B,QAAQ,EAAE,8BAA8B,CAAC,OAAO,CAAC;IAM3C,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI;IAKvD,iBAAiB,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO;CAKxD"}
1
+ {"version":3,"file":"transactionEnricher.d.ts","sourceRoot":"","sources":["../../src/shared-tree-core/transactionEnricher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAE1E;;GAEG;AACH,qBAAa,mBAAmB,CAAC,OAAO;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0C;IACnE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA8B;IACjE;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAgB;gBAGtD,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,EAC/B,QAAQ,EAAE,8BAA8B,CAAC,OAAO,CAAC;IAM3C,mBAAmB,IAAI,IAAI;IAI3B,wBAAwB,IAAI,IAAI;IAKhC,uBAAuB,IAAI,IAAI;IAM/B,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI;IAMtD,iBAAiB,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO;CAOxD"}
@@ -5,22 +5,45 @@
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.TransactionEnricher = void 0;
8
+ const internal_1 = require("@fluidframework/core-utils/internal");
8
9
  /**
9
10
  * Utility for producing an enriched commit out of multiple transaction steps
10
11
  */
11
12
  class TransactionEnricher {
12
13
  constructor(rebaser, enricher) {
13
14
  this.transactionCommits = [];
15
+ /**
16
+ * The number of commits before the start of each active transaction scope.
17
+ * For a stack of `n` transaction scopes, the array will contain `n` integers,
18
+ * where the integer at index `i` is the number of commits made before the start of the `i`th transaction scope
19
+ * (therefore, the first element in the array, if present, is always 0)
20
+ */
21
+ this.transactionScopesStart = [];
14
22
  this.rebaser = rebaser;
15
23
  this.enricher = enricher;
16
24
  }
17
- addTransactionSteps(commit) {
25
+ startNewTransaction() {
26
+ this.transactionScopesStart.push(this.transactionCommits.length);
27
+ }
28
+ commitCurrentTransaction() {
29
+ const commitsCommitted = this.transactionScopesStart.pop();
30
+ (0, internal_1.assert)(commitsCommitted !== undefined, "No transaction to commit");
31
+ }
32
+ abortCurrentTransaction() {
33
+ const scopeStart = this.transactionScopesStart.pop();
34
+ (0, internal_1.assert)(scopeStart !== undefined, "No transaction to abort");
35
+ this.transactionCommits.length = scopeStart;
36
+ }
37
+ addTransactionStep(commit) {
38
+ (0, internal_1.assert)(this.transactionScopesStart.length !== 0, "No transaction to add a step to");
18
39
  const change = this.enricher.updateChangeEnrichments(commit.change, commit.revision);
19
40
  this.transactionCommits.push({ ...commit, change });
20
41
  }
21
42
  getComposedChange(revision) {
43
+ (0, internal_1.assert)(this.transactionScopesStart.length === 0, "Transaction not committed");
22
44
  const squashed = this.rebaser.compose(this.transactionCommits);
23
45
  const tagged = this.rebaser.changeRevision(squashed, revision);
46
+ this.transactionCommits.length = 0;
24
47
  return tagged;
25
48
  }
26
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"transactionEnricher.js","sourceRoot":"","sources":["../../src/shared-tree-core/transactionEnricher.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAKH;;GAEG;AACH,MAAa,mBAAmB;IAK/B,YACC,OAA+B,EAC/B,QAAiD;QAJjC,uBAAkB,GAA2B,EAAE,CAAC;QAMhE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAEM,mBAAmB,CAAC,MAA4B;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrF,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC;IAEM,iBAAiB,CAAC,QAAqB;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC;IACf,CAAC;CACD;AAvBD,kDAuBC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { ChangeRebaser, GraphCommit, RevisionTag } from \"../core/index.js\";\nimport type { ChangeEnricherReadonlyCheckout } from \"./changeEnricher.js\";\n\n/**\n * Utility for producing an enriched commit out of multiple transaction steps\n */\nexport class TransactionEnricher<TChange> {\n\tprivate readonly rebaser: ChangeRebaser<TChange>;\n\tprivate readonly enricher: ChangeEnricherReadonlyCheckout<TChange>;\n\tprivate readonly transactionCommits: GraphCommit<TChange>[] = [];\n\n\tpublic constructor(\n\t\trebaser: ChangeRebaser<TChange>,\n\t\tenricher: ChangeEnricherReadonlyCheckout<TChange>,\n\t) {\n\t\tthis.rebaser = rebaser;\n\t\tthis.enricher = enricher;\n\t}\n\n\tpublic addTransactionSteps(commit: GraphCommit<TChange>): void {\n\t\tconst change = this.enricher.updateChangeEnrichments(commit.change, commit.revision);\n\t\tthis.transactionCommits.push({ ...commit, change });\n\t}\n\n\tpublic getComposedChange(revision: RevisionTag): TChange {\n\t\tconst squashed = this.rebaser.compose(this.transactionCommits);\n\t\tconst tagged = this.rebaser.changeRevision(squashed, revision);\n\t\treturn tagged;\n\t}\n}\n"]}
1
+ {"version":3,"file":"transactionEnricher.js","sourceRoot":"","sources":["../../src/shared-tree-core/transactionEnricher.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA6D;AAI7D;;GAEG;AACH,MAAa,mBAAmB;IAY/B,YACC,OAA+B,EAC/B,QAAiD;QAXjC,uBAAkB,GAA2B,EAAE,CAAC;QACjE;;;;;WAKG;QACc,2BAAsB,GAAa,EAAE,CAAC;QAMtD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAEM,mBAAmB;QACzB,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC;IAEM,wBAAwB;QAC9B,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,CAAC;QAC3D,IAAA,iBAAM,EAAC,gBAAgB,KAAK,SAAS,EAAE,0BAA0B,CAAC,CAAC;IACpE,CAAC;IAEM,uBAAuB;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,CAAC;QACrD,IAAA,iBAAM,EAAC,UAAU,KAAK,SAAS,EAAE,yBAAyB,CAAC,CAAC;QAC5D,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,UAAU,CAAC;IAC7C,CAAC;IAEM,kBAAkB,CAAC,MAA4B;QACrD,IAAA,iBAAM,EAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,KAAK,CAAC,EAAE,iCAAiC,CAAC,CAAC;QACpF,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrF,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC;IAEM,iBAAiB,CAAC,QAAqB;QAC7C,IAAA,iBAAM,EAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,KAAK,CAAC,EAAE,2BAA2B,CAAC,CAAC;QAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/D,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC;IACf,CAAC;CACD;AAhDD,kDAgDC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport type { ChangeRebaser, GraphCommit, RevisionTag } from \"../core/index.js\";\nimport type { ChangeEnricherReadonlyCheckout } from \"./changeEnricher.js\";\n\n/**\n * Utility for producing an enriched commit out of multiple transaction steps\n */\nexport class TransactionEnricher<TChange> {\n\tprivate readonly rebaser: ChangeRebaser<TChange>;\n\tprivate readonly enricher: ChangeEnricherReadonlyCheckout<TChange>;\n\tprivate readonly transactionCommits: GraphCommit<TChange>[] = [];\n\t/**\n\t * The number of commits before the start of each active transaction scope.\n\t * For a stack of `n` transaction scopes, the array will contain `n` integers,\n\t * where the integer at index `i` is the number of commits made before the start of the `i`th transaction scope\n\t * (therefore, the first element in the array, if present, is always 0)\n\t */\n\tprivate readonly transactionScopesStart: number[] = [];\n\n\tpublic constructor(\n\t\trebaser: ChangeRebaser<TChange>,\n\t\tenricher: ChangeEnricherReadonlyCheckout<TChange>,\n\t) {\n\t\tthis.rebaser = rebaser;\n\t\tthis.enricher = enricher;\n\t}\n\n\tpublic startNewTransaction(): void {\n\t\tthis.transactionScopesStart.push(this.transactionCommits.length);\n\t}\n\n\tpublic commitCurrentTransaction(): void {\n\t\tconst commitsCommitted = this.transactionScopesStart.pop();\n\t\tassert(commitsCommitted !== undefined, \"No transaction to commit\");\n\t}\n\n\tpublic abortCurrentTransaction(): void {\n\t\tconst scopeStart = this.transactionScopesStart.pop();\n\t\tassert(scopeStart !== undefined, \"No transaction to abort\");\n\t\tthis.transactionCommits.length = scopeStart;\n\t}\n\n\tpublic addTransactionStep(commit: GraphCommit<TChange>): void {\n\t\tassert(this.transactionScopesStart.length !== 0, \"No transaction to add a step to\");\n\t\tconst change = this.enricher.updateChangeEnrichments(commit.change, commit.revision);\n\t\tthis.transactionCommits.push({ ...commit, change });\n\t}\n\n\tpublic getComposedChange(revision: RevisionTag): TChange {\n\t\tassert(this.transactionScopesStart.length === 0, \"Transaction not committed\");\n\t\tconst squashed = this.rebaser.compose(this.transactionCommits);\n\t\tconst tagged = this.rebaser.changeRevision(squashed, revision);\n\t\tthis.transactionCommits.length = 0;\n\t\treturn tagged;\n\t}\n}\n"]}
@@ -15,7 +15,7 @@ export { stackTreeNodeCursor, type CursorAdapter, prefixPath, prefixFieldPath, t
15
15
  export { cursorForJsonableTreeNode, cursorForJsonableTreeField, jsonableTreeFromCursor, jsonableTreeFromFieldCursor, jsonableTreeFromForest, } from "./treeTextCursor.js";
16
16
  import * as SequenceField from "./sequence-field/index.js";
17
17
  export { SequenceField };
18
- export { isNeverField, ModularEditBuilder, type FieldEditDescription as EditDescription, type FieldChangeHandler, type FieldChangeRebaser, type FieldEditor, type FieldChangeMap, type FieldChange, type FieldChangeset, type ToDelta, type ModularChangeset, makeModularChangeCodecFamily, type NodeChangeComposer, type NodeChangeInverter, type NodeChangeRebaser, type NodeChangePruner, type CrossFieldManager, CrossFieldTarget, FlexFieldKind, type FullSchemaPolicy, allowsRepoSuperset, type GenericChangeset, genericFieldKind, type HasFieldChanges, type NodeExistsConstraint, NodeExistenceState, FieldKindWithEditor, ModularChangeFamily, type RelevantRemovedRootsFromChild, EncodedModularChangeset, updateRefreshers, type NodeId, type FieldChangeEncodingContext, type FieldKindConfiguration, type FieldKindConfigurationEntry, } from "./modular-schema/index.js";
18
+ export { isNeverField, ModularEditBuilder, type FieldEditDescription as EditDescription, type FieldChangeHandler, type FieldChangeRebaser, type FieldEditor, type FieldChangeMap, type FieldChange, type FieldChangeset, type ToDelta, type ModularChangeset, makeModularChangeCodecFamily, type NodeChangeComposer, type NodeChangeInverter, type NodeChangeRebaser, type NodeChangePruner, type CrossFieldManager, CrossFieldTarget, FlexFieldKind, type FullSchemaPolicy, allowsRepoSuperset, type GenericChangeset, genericFieldKind, type HasFieldChanges, type NodeExistsConstraint, FieldKindWithEditor, ModularChangeFamily, type RelevantRemovedRootsFromChild, EncodedModularChangeset, updateRefreshers, type NodeId, type FieldChangeEncodingContext, type FieldKindConfiguration, type FieldKindConfigurationEntry, } from "./modular-schema/index.js";
19
19
  export { type FlexTreeNodeSchema, type FlexAllowedTypes, FlexFieldSchema, type FlexTreeSchema, Any, type SchemaLibraryData, type LazyTreeNodeSchema, ViewSchema, type SchemaLintConfiguration, FlexFieldNodeSchema, LeafNodeSchema, FlexMapNodeSchema, FlexObjectNodeSchema, schemaIsFieldNode, schemaIsLeaf, schemaIsMap, schemaIsObjectNode, type Unenforced, type AllowedTypeSet, markEager, type FlexMapFieldSchema, type SchemaCollection, TreeNodeSchemaBase, type LazyItem, InternalFlexListTypes, isLazy, type NormalizeObjectNodeFields, type NormalizeField as NormalizeFieldSchema, type FlexObjectNodeFields, intoStoredSchema, intoStoredSchemaCollection, type NormalizeLazyItem, type FlexList, } from "./typed-schema/index.js";
20
20
  export { SchemaBuilderBase, type SchemaLibrary, type FlexImplicitFieldSchema, type NormalizeField, type FlexImplicitAllowedTypes, type NormalizeAllowedTypes, type SchemaBuilderOptions, normalizeAllowedTypes, normalizeField, } from "./schemaBuilderBase.js";
21
21
  export { SchemaBuilderInternal } from "./schemaBuilder.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feature-libraries/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,yBAAyB,EACzB,sBAAsB,EACtB,4BAA4B,EAC5B,mBAAmB,EACnB,4BAA4B,EAC5B,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,WAAW,EACX,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,UAAU,EACV,eAAe,EACf,iBAAiB,GACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,cAAc,EACd,WAAW,EACX,KAAK,+BAA+B,EACpC,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EACpB,iCAAiC,EACjC,YAAY,EACZ,KAAK,YAAY,EACjB,wBAAwB,EACxB,yBAAyB,EACzB,KAAK,0BAA0B,EAC/B,kBAAkB,EAClB,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,EACxB,KAAK,eAAe,EACpB,gBAAgB,EAChB,eAAe,GACf,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEnF,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACpG,OAAO,EAAE,wBAAwB,EAAE,KAAK,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC9F,OAAO,EACN,mBAAmB,EACnB,KAAK,aAAa,EAClB,UAAU,EACV,eAAe,EACf,KAAK,cAAc,EACnB,oBAAoB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACN,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,EACtB,2BAA2B,EAC3B,sBAAsB,GACtB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,aAAa,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,OAAO,EACN,YAAY,EACZ,kBAAkB,EAClB,KAAK,oBAAoB,IAAI,eAAe,EAC5C,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACrB,4BAA4B,EAC5B,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,gBAAgB,EAChB,aAAa,EACb,KAAK,gBAAgB,EACrB,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,6BAA6B,EAClC,uBAAuB,EACvB,gBAAgB,EAChB,KAAK,MAAM,EACX,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,GAChC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,eAAe,EACf,KAAK,cAAc,EACnB,GAAG,EACH,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,UAAU,EACV,KAAK,uBAAuB,EAC5B,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,SAAS,EACT,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,kBAAkB,EAClB,KAAK,QAAQ,EACb,qBAAqB,EACrB,MAAM,EACN,KAAK,yBAAyB,EAC9B,KAAK,cAAc,IAAI,oBAAoB,EAC3C,KAAK,oBAAoB,EACzB,gBAAgB,EAChB,0BAA0B,EAC1B,KAAK,iBAAiB,EACtB,KAAK,QAAQ,GACb,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACN,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,qBAAqB,EACrB,cAAc,GACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EACN,KAAK,SAAS,EACd,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,eAAe,EACf,mBAAmB,EACnB,KAAK,yBAAyB,GAC9B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACN,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,KAAK,YAAY,EACjB,kBAAkB,EAClB,YAAY,EACZ,KAAK,cAAc,EACnB,qBAAqB,EACrB,KAAK,aAAa,GAClB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,UAAU,EACV,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,mBAAmB,EACnB,UAAU,EACV,uBAAuB,EACvB,SAAS,EACT,oBAAoB,EACpB,sBAAsB,EACtB,cAAc,GACd,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACN,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,IAAI,EACJ,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,cAAc,EACd,KAAK,iBAAiB,EACtB,UAAU,EACV,OAAO,EACP,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,cAAc,EACd,WAAW,EAGX,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,cAAc,EACd,kBAAkB,EAClB,KAAK,wBAAwB,EAC7B,KAAK,oCAAoC,EACzC,KAAK,2CAA2C,EAChD,oCAAoC,EACpC,2CAA2C,EAC3C,KAAK,6BAA6B,EAClC,4BAA4B,EAC5B,YAAY,EACZ,kBAAkB,GAClB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,YAAY,EACX,kBAAkB,EAClB,mBAAmB,EACnB,gCAAgC,EAChC,iBAAiB,EAGjB,cAAc,EACd,WAAW,EACX,aAAa,EACb,WAAW,GACX,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AAEjF,OAAO,EACN,KAAK,YAAY,EACjB,sBAAsB,EACtB,mBAAmB,GACnB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,OAAO,EACN,KAAK,WAAW,EAChB,aAAa,EACb,sBAAsB,EACtB,iBAAiB,GACjB,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feature-libraries/index.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@ export { cursorForJsonableTreeNode, cursorForJsonableTreeField, jsonableTreeFrom
15
15
  // Split this up into separate import and export for compatibility with API-Extractor.
16
16
  import * as SequenceField from "./sequence-field/index.js";
17
17
  export { SequenceField };
18
- export { isNeverField, ModularEditBuilder, makeModularChangeCodecFamily, CrossFieldTarget, FlexFieldKind, allowsRepoSuperset, genericFieldKind, NodeExistenceState, FieldKindWithEditor, ModularChangeFamily, EncodedModularChangeset, updateRefreshers, } from "./modular-schema/index.js";
18
+ export { isNeverField, ModularEditBuilder, makeModularChangeCodecFamily, CrossFieldTarget, FlexFieldKind, allowsRepoSuperset, genericFieldKind, FieldKindWithEditor, ModularChangeFamily, EncodedModularChangeset, updateRefreshers, } from "./modular-schema/index.js";
19
19
  export { FlexFieldSchema, Any, ViewSchema, FlexFieldNodeSchema, LeafNodeSchema, FlexMapNodeSchema, FlexObjectNodeSchema, schemaIsFieldNode, schemaIsLeaf, schemaIsMap, schemaIsObjectNode, markEager, TreeNodeSchemaBase, InternalFlexListTypes, isLazy, intoStoredSchema, intoStoredSchemaCollection, } from "./typed-schema/index.js";
20
20
  export { SchemaBuilderBase, normalizeAllowedTypes, normalizeField, } from "./schemaBuilderBase.js";
21
21
  export { SchemaBuilderInternal } from "./schemaBuilder.js";