@fluid-experimental/property-dds 1.3.6 → 1.3.7

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.
@@ -37,6 +37,7 @@ export interface SharedPropertyTreeOptions {
37
37
  paths?: string[];
38
38
  clientFiltering?: boolean;
39
39
  useMH?: boolean;
40
+ disablePartialCheckout?: boolean;
40
41
  }
41
42
  export interface ISharedPropertyTreeEncDec {
42
43
  messageEncoder: {
@@ -182,6 +183,7 @@ export declare class SharedPropertyTree extends SharedObject {
182
183
  getUnrebasedChange(guid: string): IRemotePropertyTreeMessage;
183
184
  getRebasedChanges(startGuid: string, endGuid?: string): IPropertyTreeMessage[];
184
185
  private rebaseLocalChanges;
186
+ protected reSubmitCore(content: any, localOpMetadata: unknown): void;
185
187
  protected applyStashedOp(): void;
186
188
  }
187
189
  //# sourceMappingURL=propertyTree.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"propertyTree.d.ts","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"propertyTree.d.ts","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,8 @@ exports.SharedPropertyTree = void 0;
11
11
  /* eslint-disable import/no-internal-modules */
12
12
  const isEmpty_1 = __importDefault(require("lodash/isEmpty"));
13
13
  const findIndex_1 = __importDefault(require("lodash/findIndex"));
14
+ const find_1 = __importDefault(require("lodash/find"));
15
+ const isEqual_1 = __importDefault(require("lodash/isEqual"));
14
16
  const range_1 = __importDefault(require("lodash/range"));
15
17
  const fastest_json_copy_1 = require("fastest-json-copy");
16
18
  const msgpackr_1 = require("msgpackr");
@@ -102,8 +104,16 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
102
104
  this.scopeFutureDeltasToPaths(this.options.paths);
103
105
  }
104
106
  scopeFutureDeltasToPaths(paths) {
105
- const socket = this.runtime.deltaManager.deltaManager.connectionManager.connection.socket;
106
- socket.emit("partial_checkout", { paths });
107
+ // Backdoor to emit "partial_checkout" events on the socket. The delta manager at container runtime layer is
108
+ // a proxy and the delta manager at the container context layer is yet another proxy, so account for that.
109
+ if (!this.options.disablePartialCheckout) {
110
+ let dm = this.runtime.deltaManager.deltaManager;
111
+ if (dm.deltaManager !== undefined) {
112
+ dm = dm.deltaManager;
113
+ }
114
+ const socket = dm.connectionManager.connection.socket;
115
+ socket.emit("partial_checkout", { paths });
116
+ }
107
117
  }
108
118
  _reportDirtinessToView() {
109
119
  // Check whether anybody is listening. If not, we don't want to pay the price
@@ -542,6 +552,10 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
542
552
  }
543
553
  getRebasedChanges(startGuid, endGuid) {
544
554
  const startIndex = (0, findIndex_1.default)(this.remoteChanges, (c) => c.guid === startGuid);
555
+ if (startIndex === -1 && startGuid !== "") {
556
+ // TODO: Consider throwing an error once clients have picked up PR #16277.
557
+ console.error("Unknown start GUID specified.");
558
+ }
545
559
  if (endGuid !== undefined) {
546
560
  const endIndex = (0, findIndex_1.default)(this.remoteChanges, (c) => c.guid === endGuid);
547
561
  return this.remoteChanges.slice(startIndex + 1, endIndex + 1);
@@ -549,20 +563,36 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
549
563
  return this.remoteChanges.slice(startIndex + 1);
550
564
  }
551
565
  rebaseLocalChanges(change, pendingChanges, newTipDelta) {
552
- let rebaseBaseChangeSet = (0, fastest_json_copy_1.copy)(change.changeSet);
566
+ var _a;
567
+ let rebaseBaseChangeSet;
553
568
  const accumulatedChanges = {};
554
569
  const conflicts = [];
555
570
  if (this.localChanges.length > 0 && this.localChanges[0].guid === change.guid) {
556
571
  // This is disabled for performance reasons. Only used during debugging
557
572
  // assert(JSON.stringify(this.localChanges[0].changeSet) === JSON.stringify(change.changeSet),
558
573
  // "Local change different than rebased remote change.");
559
- // If we got a confirmation of the commit on the tip of the localChanges array,
560
- // there will be no update of the tip view at all. We just move it from local changes
561
- // to remote changes
562
- this.localChanges.shift();
563
- return false;
574
+ if ((0, isEqual_1.default)(this.localChanges[0].changeSet, change.changeSet)) {
575
+ // If we got a confirmation of the commit on the tip of the localChanges array,
576
+ // there will be no update of the tip view at all. We just move it from local changes
577
+ // to remote changes
578
+ this.localChanges.shift();
579
+ return false;
580
+ }
581
+ else {
582
+ // There is a case where the localChanges that were created by incrementally rebasing with respect
583
+ // to every incoming change do no exactly agree with the rebased remote change (this happens
584
+ // when there are changes that cancel out with each other that have happened in the meantime).
585
+ // In that case, we must make sure, we correctly update the local view to take this difference into
586
+ // account by rebasing with respect to the changeset that is obtained by combining the inverse of the
587
+ // local change with the incoming remote change.
588
+ rebaseBaseChangeSet = new property_changeset_1.ChangeSet((_a = this.localChanges.shift()) === null || _a === void 0 ? void 0 : _a.changeSet);
589
+ rebaseBaseChangeSet.toInverseChangeSet();
590
+ rebaseBaseChangeSet.applyChangeSet(change.changeSet);
591
+ }
592
+ }
593
+ else {
594
+ rebaseBaseChangeSet = (0, fastest_json_copy_1.copy)(change.changeSet);
564
595
  }
565
- // eslint-disable-next-line @typescript-eslint/prefer-for-of
566
596
  for (let i = 0; i < this.localChanges.length; i++) {
567
597
  // Make sure we never receive changes out of order
568
598
  console.assert(this.localChanges[i].guid !== change.guid);
@@ -578,6 +608,11 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
578
608
  });
579
609
  rebaseBaseChangeSet = copiedChangeSet.getSerializedChangeSet();
580
610
  new property_changeset_1.ChangeSet(accumulatedChanges).applyChangeSet(this.localChanges[i].changeSet);
611
+ // Update the reference and head guids
612
+ this.localChanges[i].remoteHeadGuid = change.guid;
613
+ if (i === 0) {
614
+ this.localChanges[i].referenceGuid = change.guid;
615
+ }
581
616
  }
582
617
  // Compute the inverse of the pending changes and store the result in newTipDelta
583
618
  const pendingChangesRebaseMetaInformation = new Map();
@@ -602,6 +637,25 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
602
637
  }
603
638
  return true;
604
639
  }
640
+ reSubmitCore(content, localOpMetadata) {
641
+ // We have to provide our own implementation of the resubmit core function, to
642
+ // handle the case where an operation is no longer referencing a commit within
643
+ // the collaboration window as its referenceGuid. Other clients would not be
644
+ // able to perform the rebase for such an operation. To handle this problem
645
+ // we have to resubmit a version of the operations which has been rebased to
646
+ // the current remote tip. We already have these rebased versions of the operations
647
+ // in our localChanges, because we continuously update those to follow the tip.
648
+ // Therefore our reSubmitCore function searches for the rebased operation in the
649
+ // localChanges array and submits this up-to-date version instead of the old operation.
650
+ const rebasedOperation = (0, find_1.default)(this.localChanges, (op) => op.guid === content.guid);
651
+ if (rebasedOperation) {
652
+ this.submitLocalMessage((0, fastest_json_copy_1.copy)(rebasedOperation), localOpMetadata);
653
+ }
654
+ else {
655
+ // Could this happen or is there a guard that we will never resubmit an already submitted op?
656
+ console.warn("Resubmitting operation which has already been received back.");
657
+ }
658
+ }
605
659
  applyStashedOp() {
606
660
  throw new Error("not implemented");
607
661
  }
@@ -1 +1 @@
1
- {"version":3,"file":"propertyTree.js","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable import/no-internal-modules */\nimport isEmpty from \"lodash/isEmpty\";\nimport findIndex from \"lodash/findIndex\";\nimport range from \"lodash/range\";\nimport { copy as cloneDeep } from \"fastest-json-copy\";\nimport { Packr } from \"msgpackr\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\n\nimport { bufferToString, stringToBuffer } from \"@fluidframework/common-utils\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\n\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\n\nimport { PropertyFactory, BaseProperty, NodeProperty } from \"@fluid-experimental/property-properties\";\n\nimport { v4 as uuidv4 } from \"uuid\";\nimport axios from \"axios\";\nimport { PropertyTreeFactory } from \"./propertyTreeFactory\";\n\nexport type SerializedChangeSet = any;\n\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\nexport interface IPropertyTreeMessage {\n\top: OpKind;\n\tchangeSet: SerializedChangeSet;\n\tmetadata: Metadata;\n\tguid: string;\n\treferenceGuid: string;\n\tremoteHeadGuid: string;\n\tlocalBranchStart: string | undefined;\n\trebaseMetaInformation?: Map<any, any>;\n\tuseMH?: boolean;\n}\n\nexport interface IRemotePropertyTreeMessage extends IPropertyTreeMessage {\n\tsequenceNumber: number;\n}\ninterface ISnapshot {\n\tbranchGuid: string;\n\tsummaryMinimumSequenceNumber: number;\n\tuseMH: boolean;\n\tnumChunks: number;\n}\nexport interface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n\tremoteHeadGuid: string;\n}\n\nexport interface SharedPropertyTreeOptions {\n\tpaths?: string[];\n\tclientFiltering?: boolean;\n\tuseMH?: boolean;\n}\n\nexport interface ISharedPropertyTreeEncDec {\n\tmessageEncoder: { encode: (IPropertyTreeMessage) => IPropertyTreeMessage;\n\t\tdecode: (IPropertyTreeMessage) => IPropertyTreeMessage; };\n\tsummaryEncoder: { encode: (ISnapshotSummary) => Buffer; decode: (Buffer) => ISnapshotSummary; };\n}\n\nexport interface IPropertyTreeConfig {\n\tencDec: ISharedPropertyTreeEncDec;\n}\n\nconst defaultEncDec: ISharedPropertyTreeEncDec = {\n\tmessageEncoder: { encode: (msg: IPropertyTreeMessage) => msg,\n\t\tdecode: (msg: IPropertyTreeMessage) => msg },\n\tsummaryEncoder: {\n\t\tencode: (summary: ISnapshotSummary) => {\n\t\t\tconst packr = new Packr();\n\t\t\tconst serializedSummary = packr.pack(summary);\n\t\t\treturn serializedSummary;\n\t\t},\n\t\tdecode: (serializedSummary) => {\n\t\t\tconst packr = new Packr();\n\t\t\tconst snapshotSummary = packr.unpack(serializedSummary);\n\t\t\treturn snapshotSummary as ISnapshotSummary;\n\t\t},\n\t},\n};\n\n/**\n * Silly DDS example that models a six sided die.\n *\n * Unlike the typical 'Dice Roller' example where clients clobber each other's last roll in a\n * SharedMap, this 'SharedDie' DDS works by advancing an internal PRNG each time it sees a 'roll'\n * operation.\n *\n * Because all clients are using the same PRNG starting in the same state, they arrive at\n * consensus by simply applying the same number of rolls. (A fun addition would be logging\n * who received which roll, which would need to change as clients learn how races are resolved\n * in the total order)\n */\nexport class SharedPropertyTree extends SharedObject {\n\ttipView: SerializedChangeSet = {};\n\tremoteTipView: SerializedChangeSet = {};\n\tlocalChanges: IPropertyTreeMessage[] = [];\n\tremoteChanges: IPropertyTreeMessage[] = [];\n\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\ttransmissionsHaveBeenStopped = false;\n\tenqueuedMessages: IPropertyTreeMessage[] = [];\n\tnotificationDelayScope: number = 0;\n\t_root: any = PropertyFactory.create(\"NodeProperty\");\n\toptions: SharedPropertyTreeOptions;\n\tskipSequenceNumber: number = -1;\n\theadCommitGuid: string = \"\";\n\tuseMH: boolean = false;\n\tpropertyTreeConfig: IPropertyTreeConfig;\n\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\toptions: SharedPropertyTreeOptions,\n\t\tpropertyTreeConfig: IPropertyTreeConfig = { encDec: defaultEncDec },\n\t) {\n\t\tsuper(id, runtime, attributes, \"fluid_propertyTree_\");\n\n\t\tthis.options = options;\n\t\t// Quick hack to let the root be aware of the DDS hosting it.\n\t\tthis._root._tree = this;\n\n\t\t// By default, we currently don't use the MH\n\t\tthis.useMH = options.useMH ?? false;\n\t\tthis.propertyTreeConfig = propertyTreeConfig;\n\t}\n\n\t/**\n\t * Create a new shared cell\n\t *\n\t * @param runtime - data store runtime the new shared map belongs to\n\t * @param id - optional name of the shared map\n\t * @returns newly create shared map (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string, queryString?: string) {\n\t\treturn runtime.createChannel(id, PropertyTreeFactory.Type) as SharedPropertyTree;\n\t}\n\n\t/**\n\t * Get a factory for SharedDie to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedDie\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new PropertyTreeFactory();\n\t}\n\n\t/**\n\t * in case of partial checkout we want to send the paths we are interested in once we are connected\n\t */\n\tprotected onConnect() {\n\t\t// on connect we scope all deltas such that we only get relevant changes\n\t\t// since we know the paths already at constuction time this is okay\n\t\tthis.scopeFutureDeltasToPaths(this.options.paths);\n\t}\n\n\tprivate scopeFutureDeltasToPaths(paths?: string[]) {\n\t\tconst socket = (this.runtime.deltaManager as any).deltaManager.connectionManager.connection.socket;\n\t\tsocket.emit(\"partial_checkout\", { paths });\n\t}\n\n\tpublic _reportDirtinessToView() {\n\t\t// Check whether anybody is listening. If not, we don't want to pay the price\n\t\t// for the serialization of the data structure\n\t\tif (this.listenerCount(\"localModification\") > 0) {\n\t\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t\tconst _changeSet = new ChangeSet(changes);\n\t\t\tif (!isEmpty(_changeSet.getSerializedChangeSet())) {\n\t\t\t\tthis.emit(\"localModification\", _changeSet);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t}\n\t}\n\n\tpublic get changeSet(): SerializedChangeSet {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\treturn this.tipView;\n\t}\n\n\tpublic get activeCommit(): IPropertyTreeMessage {\n\t\treturn this.localChanges.length > 0\n\t\t\t? this.localChanges[this.localChanges.length - 1]\n\t\t\t: this.remoteChanges[this.remoteChanges.length - 1];\n\t}\n\tpublic get root(): NodeProperty {\n\t\treturn this._root as NodeProperty;\n\t}\n\n\tpublic commit(metadata?: Metadata, submitEmptyChange?: boolean) {\n\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\n\t\tlet doSubmit = !!submitEmptyChange;\n\n\t\t// if no override provided dont submit unless metadata are provided\n\t\tif (submitEmptyChange === undefined) {\n\t\t\tdoSubmit = metadata !== undefined;\n\t\t}\n\n\t\tif (doSubmit || !isEmpty(changes)) {\n\t\t\tthis.applyChangeSet(changes, metadata || {});\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\t/**\n\t * This method encodes the given message to the transfer form\n\t * @param change - The message to be encoded.\n \t */\n\tprivate encodeMessage(change: IPropertyTreeMessage): IPropertyTreeMessage {\n\t\treturn this.propertyTreeConfig.encDec.messageEncoder.encode(change);\n\t}\n\n\t/**\n \t * This method decodes message from the transfer form.\n\t * @param transferChange - The message to be decoded.\n\t \t */\n\tprivate decodeMessage(transferChange: IPropertyTreeMessage): IPropertyTreeMessage {\n\t\treturn this.propertyTreeConfig.encDec.messageEncoder.decode(transferChange);\n\t}\n\n\tprivate applyChangeSet(changeSet: SerializedChangeSet, metadata: Metadata) {\n\t\tconst _changeSet = new ChangeSet(changeSet);\n\t\t_changeSet._toReversibleChangeSet(this.tipView);\n\n\t\tthis.updateRemoteHeadGuid();\n\n\t\tconst change = {\n\t\t\top: OpKind.ChangeSet,\n\t\t\tchangeSet,\n\t\t\tmetadata,\n\t\t\tguid: uuidv4(),\n\t\t\tremoteHeadGuid: this.headCommitGuid,\n\t\t\treferenceGuid:\n\t\t\t\tthis.localChanges.length > 0\n\t\t\t\t? this.localChanges[this.localChanges.length - 1].guid\n\t\t\t\t: this.headCommitGuid,\n\t\t\tlocalBranchStart: this.localChanges.length > 0 ? this.localChanges[0].guid : undefined,\n\t\t\tuseMH: this.useMH,\n\t\t};\n\t\tthis._applyLocalChangeSet(change);\n\t\t// Queue the op for transmission to the Fluid service.\n\t\tconst transferChange = this.encodeMessage(cloneDeep(change));\n\t\tif (this.transmissionsHaveBeenStopped) {\n\t\t\tthis.enqueuedMessages.push(transferChange);\n\t\t} else {\n\t\t\tthis.submitLocalMessage(transferChange);\n\t\t}\n\t}\n\n\tstopTransmission(stop: boolean) {\n\t\tthis.transmissionsHaveBeenStopped = stop;\n\t\tif (stop === false) {\n\t\t\tfor (const message of this.enqueuedMessages) {\n\t\t\t\tthis.submitLocalMessage(message);\n\t\t\t}\n\t\t\tthis.enqueuedMessages = [];\n\t\t}\n\t}\n\t/**\n\t * Delays notifications until popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic pushNotificationDelayScope() {\n\t\t// set the scope counter\n\t\tthis.notificationDelayScope++;\n\n\t\t// If we reach 0, we have to report unreported changes\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tthis._root._reportDirtinessToView();\n\t\t}\n\t}\n\n\t/**\n\t * Re-enables notifications when popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic popNotificationDelayScope() {\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tconsole.error(\"Unbalanced push/pop calls.\");\n\t\t}\n\t\tthis.notificationDelayScope--;\n\t\tthis._root._reportDirtinessToView();\n\t}\n\n\t/**\n\t * Process an operation\n\t *\n\t * @param message - the message to prepare\n\t * @param local - whether the message was sent by the local client\n\t * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.\n\t * For messages from a remote client, this will be undefined.\n\t */\n\tprotected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\tif (message.type === MessageType.Operation && message.sequenceNumber > this.skipSequenceNumber) {\n\t\t\tconst change: IPropertyTreeMessage = this.decodeMessage(cloneDeep(message.contents));\n\t\t\tconst content: IRemotePropertyTreeMessage = { ...change, sequenceNumber: message.sequenceNumber };\n\t\t\tswitch (content.op) {\n\t\t\t\tcase OpKind.ChangeSet:\n\t\t\t\t\t// If the op originated locally from this client, we've already accounted for it\n\t\t\t\t\t// by advancing the state. Otherwise, advance the PRNG now.\n\t\t\t\t\tthis._applyRemoteChangeSet(cloneDeep(content));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate addRemoteChange(change: IPropertyTreeMessage) {\n\t\tthis.remoteChanges.push(change);\n\t\tthis.updateRemoteHeadGuid();\n\t}\n\n\tprivate updateRemoteHeadGuid() {\n\t\tthis.headCommitGuid = this.remoteChanges.length > 0\n\t\t\t\t? this.remoteChanges[this.remoteChanges.length - 1].guid\n\t\t\t\t: this.headCommitGuid;\n\t}\n\n\tpublic static prune(\n\t\tminimumSequenceNumber: number,\n\t\tremoteChanges: IPropertyTreeMessage[],\n\t\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>,\n\t) {\n\t\t// for faster lookup of remote change guids\n\t\tconst remoteChangeMap = new Map<string, number>();\n\t\tremoteChanges.forEach((change, index) => {\n\t\t\tremoteChangeMap.set(change.guid, index);\n\t\t});\n\n\t\t// we will track visited nodes\n\t\tconst visitedUnrebasedRemoteChanges = new Set<string>();\n\t\tconst visitedRemoteChanges = new Set<string>();\n\n\t\tfor (const id of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tconst unrebasedChange = unrebasedRemoteChanges[id];\n\n\t\t\t// we are only interested in changes that are newer than the sequence number\n\t\t\t// and that were not yet visited previously\n\t\t\tif (\n\t\t\t\tunrebasedChange.sequenceNumber >= minimumSequenceNumber &&\n\t\t\t\t!visitedUnrebasedRemoteChanges.has(unrebasedChange.guid)\n\t\t\t) {\n\t\t\t\t// we visited that unrebased change and mark it as visited\n\t\t\t\tvisitedUnrebasedRemoteChanges.add(unrebasedChange.guid);\n\n\t\t\t\tlet visitor = unrebasedChange;\n\t\t\t\t// we will walk along the commit chain until we hit a remote change or a visited unrebased commit\n\t\t\t\t// at that point we can skip since we already traced the rest of the commit chain\n\t\t\t\twhile (\n\t\t\t\t\tvisitor.remoteHeadGuid !== visitor.referenceGuid ||\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.has(visitor.referenceGuid)\n\t\t\t\t) {\n\t\t\t\t\tconst guid = visitor.referenceGuid;\n\t\t\t\t\tif (guid === \"\") {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// since the change is not in remote it must be in unrebased\n\t\t\t\t\tvisitor = unrebasedRemoteChanges[visitor.referenceGuid];\n\t\t\t\t\tif (!visitor) {\n\t\t\t\t\t\tthrow new Error(`no visitor found for guid \"${guid}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.add(visitor.guid);\n\t\t\t\t}\n\t\t\t\t// if we exited the loop because we hit a remote change than add it as visited\n\t\t\t\tif (visitor.remoteHeadGuid === visitor.referenceGuid && remoteChangeMap.has(visitor.referenceGuid)) {\n\t\t\t\t\tvisitedRemoteChanges.add(visitor.referenceGuid);\n\t\t\t\t}\n\n\t\t\t\t// If we have a change that refers to the start of the history (remoteHeadGuid === \"\"), we have to\n\t\t\t\t// keep all remote Changes until this change has been processed\n\t\t\t\tif (visitor.remoteHeadGuid === \"\") {\n\t\t\t\t\tvisitedRemoteChanges.add(remoteChanges[0].guid);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlet pruned = 0;\n\t\t// we can now filter the unrebased changes by removing any changes\n\t\t// we have not visited at all during our traversal\n\t\tconst prunedUnrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\t\tfor (const key of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tif (visitedUnrebasedRemoteChanges.has(key)) {\n\t\t\t\tprunedUnrebasedRemoteChanges[key] = unrebasedRemoteChanges[key];\n\t\t\t} else {\n\t\t\t\tpruned++;\n\t\t\t}\n\t\t}\n\n\t\t// find minimum index\n\t\tconst minIndex = Math.min(...[...visitedRemoteChanges].map((key) => remoteChangeMap.get(key) as number));\n\n\t\tconst prunedRemoteChanges = remoteChanges.slice(minIndex);\n\t\tpruned += minIndex;\n\n\t\treturn {\n\t\t\tremoteChanges: prunedRemoteChanges,\n\t\t\tunrebasedRemoteChanges: prunedUnrebasedRemoteChanges,\n\t\t\tprunedCount: pruned,\n\t\t};\n\t}\n\tpublic pruneHistory() {\n\t\tconst msn = this.runtime.deltaManager.minimumSequenceNumber;\n\n\t\tconst { remoteChanges, unrebasedRemoteChanges } = SharedPropertyTree.prune(\n\t\t\tmsn,\n\t\t\tthis.remoteChanges,\n\t\t\tthis.unrebasedRemoteChanges,\n\t\t);\n\n\t\tthis.remoteChanges = remoteChanges;\n\t\tthis.unrebasedRemoteChanges = unrebasedRemoteChanges;\n\t}\n\n\t/**\n\t * This method encodes the local summary (snapshot) object into the serialized form.\n\t * @param summary - The local summary (snapshot)representation.\n\t * @returns The serialized summary representation.\n\t */\n\tprivate encodeSummary(summary: ISnapshotSummary) {\n\t\treturn this.propertyTreeConfig.encDec.summaryEncoder.encode(summary);\n\t}\n\n\t/**\n\t * This method decodes the serialized form of the summary into the local summary (snapshot) object.\n\t * @param serializedSummary - The serialized summary representation.\n\t * @returns The local summary (snapshot)representation.\n \t */\n\tprivate decodeSummary(serializedSummary): ISnapshotSummary {\n\t\treturn this.propertyTreeConfig.encDec.summaryEncoder.decode(serializedSummary);\n\t}\n\n\t/**\n \t * This method writes the log message if the logging is enabled in the extended DDS.\n\t * The logging is not enabled in the default Property DDS\n\t * @param message - The message to be logged.\n\t */\n\tprotected logIfEnabled(message) {}\n\n\t/**\n \t * This method encodes the binary representation of the\n \t * blob.\n\t * @param blob - The binary representation of the blob.\n\t * @returns The encoded representation of the blob.\n \t */\n\tprivate encodeSummaryBlob(blob: ArrayBuffer): any {\n\t\treturn bufferToString(blob, \"base64\");\n\t}\n\n\t/**\n \t * This method decodes the encoded representation of the\n\t * blob.\n \t * @param blob - The encoded representation of the blob.\n\t * @returns The binary representation of the blob.\n\t */\n\tprivate decodeSummaryBlob(encoded: any): ArrayBuffer {\n\t\tconst buffer = bufferToString(encoded, \"utf8\");\n\t\treturn stringToBuffer(buffer, \"base64\");\n\t}\n\n\tpublic summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tthis.pruneHistory();\n\t\tconst snapshot: ISnapshot = {\n\t\t\tbranchGuid: this.handle.absolutePath.split(\"/\").pop() as string,\n\t\t\tsummaryMinimumSequenceNumber: this.runtime.deltaManager.minimumSequenceNumber,\n\t\t\tuseMH: this.useMH,\n\t\t\tnumChunks: 0,\n\t\t};\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tif (!this.useMH) {\n\t\t\t// If the MH is not used, we have to include the tip view, the remote changes and the received\n\t\t\t// deltas to the summary\n\t\t\tconst summary: ISnapshotSummary = {\n\t\t\t\tremoteTipView: this.remoteTipView,\n\t\t\t\tremoteChanges: this.remoteChanges,\n\t\t\t\tremoteHeadGuid: this.headCommitGuid,\n\t\t\t\tunrebasedRemoteChanges: this.unrebasedRemoteChanges,\n\t\t\t};\n\n\t\t\tconst chunkSize = 5000 * 1024; // Default limit seems to be 5MB\n\t\t\tlet totalBlobsSize = 0;\n\t\t\tconst serializedSummary = this.encodeSummary(summary);\n\t\t\tfor (let pos = 0, i = 0; pos < serializedSummary.length; pos += chunkSize, i++) {\n\t\t\t\tconst summaryBlob = this.encodeSummaryBlob(serializedSummary.slice(pos, pos + chunkSize));\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\t\ttotalBlobsSize += summaryBlob[\"length\"];\n\t\t\t\tbuilder.addBlob(`summaryChunk_${i}`, summaryBlob);\n\t\t\t\tsnapshot.numChunks++;\n\t\t\t}\n\t\t\tthis.logIfEnabled(`Total blobs transfer size: ${totalBlobsSize}`);\n\t\t}\n\n\t\tbuilder.addBlob(\"properties\", serializer !== undefined\n\t\t\t? serializer.stringify(snapshot, this.handle)\n\t\t\t: JSON.stringify(snapshot));\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst runtime = this.runtime;\n\t\tconst handleTableChunk = await storage.readBlob(\"properties\");\n\t\tconst utf8 = bufferToString(handleTableChunk, \"utf8\");\n\n\t\tconst snapshot: ISnapshot = this.serializer.parse(utf8);\n\t\tthis.useMH = snapshot.useMH;\n\n\t\ttry {\n\t\t\tif (!snapshot.useMH) {\n\t\t\t\t// We load all chunks\n\t\t\t\tconst chunks: ArrayBufferLike[] = await Promise.all(\n\t\t\t\t\trange(snapshot.numChunks).map(async (i) => {\n\t\t\t\t\t\treturn this.decodeSummaryBlob(await storage.readBlob(`summaryChunk_${i}`));\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst totalLength = chunks.reduce((a, b) => a + b.byteLength, 0);\n\t\t\t\tconst serializedSummary = new Uint8Array(totalLength);\n\t\t\t\tchunks.reduce((offset, chunk) => {\n\t\t\t\t\tserializedSummary.set(new Uint8Array(chunk), offset);\n\t\t\t\t\treturn offset + chunk.byteLength;\n\t\t\t\t}, 0);\n\t\t\t\tconst snapshotSummary = this.decodeSummary(serializedSummary);\n\t\t\t\tif (\n\t\t\t\t\tsnapshotSummary.remoteChanges === undefined ||\n\t\t\t\t\tsnapshotSummary.remoteTipView === undefined ||\n\t\t\t\t\tsnapshotSummary.unrebasedRemoteChanges === undefined\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\"Invalid Snapshot.\");\n\t\t\t\t}\n\n\t\t\t\tif (snapshotSummary.remoteHeadGuid === undefined) {\n\t\t\t\t\t// The summary does not contain a remoteHeadGuid. This means the summary has\n\t\t\t\t\t// been created by an old version of PropertyDDS, that did not yet have this patch.\n\t\t\t\t\tsnapshotSummary.remoteHeadGuid = (snapshotSummary.remoteChanges.length > 0) ?\n\t\t\t\t\t\t\t// If there are remote changes in the\n\t\t\t\t\t\t\t// summary we can deduce the head GUID from these changes.\n\t\t\t\t\t\t\tsnapshotSummary.remoteChanges[snapshotSummary.remoteChanges.length - 1].guid :\n\n\t\t\t\t\t\t\t// If no remote head GUID is available, we will fall back to the old behaviour,\n\t\t\t\t\t\t\t// where the head GUID was set to an empty string. However, this could lead to\n\t\t\t\t\t\t\t// divergence between the clients, if there is still a client in the session\n\t\t\t\t\t\t\t// that is using a version of this library without this patch and which\n\t\t\t\t\t\t\t// has started the session at a different summary.\n\t\t\t\t\t\t\t\"\";\n\t\t\t\t}\n\n\t\t\t\tthis.remoteTipView = snapshotSummary.remoteTipView;\n\t\t\t\tthis.remoteChanges = snapshotSummary.remoteChanges;\n\t\t\t\tthis.unrebasedRemoteChanges = snapshotSummary.unrebasedRemoteChanges;\n\t\t\t\tthis.headCommitGuid = snapshotSummary.remoteHeadGuid;\n\t\t\t\tconst isPartialCheckoutActive = !!(this.options.clientFiltering && this.options.paths);\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tthis.remoteTipView = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\tthis.remoteTipView,\n\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\n\t\t\t\tthis.skipSequenceNumber = 0;\n\t\t\t} else {\n\t\t\t\tconst { branchGuid, summaryMinimumSequenceNumber } = snapshot;\n\t\t\t\tconst branchResponse = await axios.get(`http://localhost:3000/branch/${branchGuid}`);\n\t\t\t\tthis.headCommitGuid = branchResponse.data.headCommitGuid;\n\t\t\t\tconst {\n\t\t\t\t\tcommit: { meta: commitMetadata },\n\t\t\t\t} = (await axios.get(`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}`)).data;\n\t\t\t\tlet { changeSet: materializedView } = (\n\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}/materializedView`,\n\t\t\t\t\t)\n\t\t\t\t).data;\n\n\t\t\t\tconst isPartialCheckoutActive = this.options.clientFiltering && this.options.paths;\n\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tmaterializedView = ChangeSetUtils.getFilteredChangeSetByPaths(materializedView, this.options.paths);\n\t\t\t\t}\n\n\t\t\t\tthis.tipView = materializedView;\n\t\t\t\tthis.remoteTipView = cloneDeep(this.tipView);\n\t\t\t\tthis.remoteChanges = [];\n\n\t\t\t\tlet missingDeltas: ISequencedDocumentMessage[] = [];\n\t\t\t\tconst firstDelta = Math.min(commitMetadata.minimumSequenceNumber, summaryMinimumSequenceNumber);\n\t\t\t\tconst lastDelta = commitMetadata.sequenceNumber;\n\n\t\t\t\tconst dm = (this.runtime.deltaManager as any).deltaManager;\n\t\t\t\tawait dm.getDeltas(\"DocumentOpen\", firstDelta, lastDelta, (messages: ISequencedDocumentMessage[]) => {\n\t\t\t\t\tmissingDeltas = messages.filter((x) => x.type === \"op\");\n\t\t\t\t});\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\t\t\tfor (let i = 0; i < missingDeltas.length; i++) {\n\t\t\t\t\tif (missingDeltas[i].sequenceNumber < commitMetadata.sequenceNumber) {\n\t\t\t\t\t\tconst remoteChange: IPropertyTreeMessage\n\t\t\t\t\t\t\t= JSON.parse(missingDeltas[i].contents).contents.contents.content.contents;\n\t\t\t\t\t\tconst { changeSet } = (\n\t\t\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${remoteChange.guid}/changeSet`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t).data;\n\t\t\t\t\t\tremoteChange.changeSet = changeSet;\n\n\t\t\t\t\t\tif (remoteChange) {\n\t\t\t\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\t\t\t\tremoteChange.changeSet = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\t\t\t\tremoteChange.changeSet,\n\t\t\t\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.addRemoteChange(remoteChange);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.processCore(missingDeltas[i], false, {});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.skipSequenceNumber = lastDelta ?? -1;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.tipView = {};\n\t\t\tthis.remoteTipView = {};\n\t\t\tthis.remoteChanges = [];\n\t\t} finally {\n\t\t\tthis._root.deserialize(this.tipView, undefined, false, false);\n\t\t\tconst _changeSet = new ChangeSet(this.tipView);\n\t\t\tif (!isEmpty(_changeSet.getSerializedChangeSet())) {\n\t\t\t\tthis.emit(\"localModification\", _changeSet);\n\t\t\t}\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\tprotected onDisconnect() { }\n\n\tprivate _applyLocalChangeSet(change: IPropertyTreeMessage) {\n\t\tconst changeSetWrapper = new ChangeSet(this.tipView);\n\t\tchangeSetWrapper.applyChangeSet(change.changeSet);\n\n\t\tif (this.runtime.attachState === AttachState.Detached) {\n\t\t\tconst remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);\n\t\t\tremoteChangeSetWrapper.applyChangeSet(change.changeSet);\n\t\t} else {\n\t\t\tthis.localChanges.push(change);\n\t\t}\n\t}\n\n\tprivate _applyRemoteChangeSet(change: IRemotePropertyTreeMessage) {\n\t\tthis.unrebasedRemoteChanges[change.guid] = cloneDeep(change);\n\n\t\t// This is the first message in the history of the document.\n\t\tif (this.remoteChanges.length !== 0) {\n\t\t\trebaseToRemoteChanges(\n\t\t\t\tchange,\n\t\t\t\tthis.getUnrebasedChange.bind(this),\n\t\t\t\tthis.getRebasedChanges.bind(this),\n\t\t\t);\n\t\t}\n\n\t\tthis.addRemoteChange(change);\n\t\t// Apply the remote change set to the remote tip view\n\t\tconst remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);\n\t\tremoteChangeSetWrapper.applyChangeSet(change.changeSet);\n\n\t\t// Rebase the local changes\n\t\tconst pendingChanges = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\tnew ChangeSet(pendingChanges)._toReversibleChangeSet(this.tipView);\n\n\t\tconst changesToTip: SerializedChangeSet = {};\n\t\tconst changesNeeded = this.rebaseLocalChanges(change, pendingChanges, changesToTip);\n\n\t\tif (changesNeeded) {\n\t\t\tthis.pushNotificationDelayScope();\n\t\t\t// Checkout the new tip\n\t\t\tthis._root.applyChangeSet(changesToTip);\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\t\tthis._root.applyChangeSet(pendingChanges);\n\t\t\tthis.popNotificationDelayScope();\n\t\t}\n\n\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t// assert(JSON.stringify(this.root.serialize()) === JSON.stringify(this.tipView));\n\t}\n\n\tgetUnrebasedChange(guid: string) {\n\t\treturn this.unrebasedRemoteChanges[guid];\n\t}\n\n\tgetRebasedChanges(startGuid: string, endGuid?: string) {\n\t\tconst startIndex = findIndex(this.remoteChanges, (c) => c.guid === startGuid);\n\t\tif (endGuid !== undefined) {\n\t\t\tconst endIndex = findIndex(this.remoteChanges, (c) => c.guid === endGuid);\n\t\t\treturn this.remoteChanges.slice(startIndex + 1, endIndex + 1);\n\t\t}\n\t\treturn this.remoteChanges.slice(startIndex + 1);\n\t}\n\n\tprivate rebaseLocalChanges(\n\t\tchange: IPropertyTreeMessage,\n\t\tpendingChanges: SerializedChangeSet,\n\t\tnewTipDelta: SerializedChangeSet,\n\t): boolean {\n\t\tlet rebaseBaseChangeSet = cloneDeep(change.changeSet);\n\n\t\tconst accumulatedChanges: SerializedChangeSet = {};\n\t\tconst conflicts = [] as any[];\n\n\t\tif (this.localChanges.length > 0 && this.localChanges[0].guid === change.guid) {\n\t\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t\t// assert(JSON.stringify(this.localChanges[0].changeSet) === JSON.stringify(change.changeSet),\n\t\t\t// \"Local change different than rebased remote change.\");\n\n\t\t\t// If we got a confirmation of the commit on the tip of the localChanges array,\n\t\t\t// there will be no update of the tip view at all. We just move it from local changes\n\t\t\t// to remote changes\n\t\t\tthis.localChanges.shift();\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\tfor (let i = 0; i < this.localChanges.length; i++) {\n\t\t\t// Make sure we never receive changes out of order\n\t\t\tconsole.assert(this.localChanges[i].guid !== change.guid);\n\n\t\t\tconst rebaseMetaInformation = new Map();\n\n\t\t\tconst copiedChangeSet = new ChangeSet(cloneDeep(this.localChanges[i].changeSet));\n\t\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(this.localChanges[i].changeSet, conflicts, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\n\t\t\tcopiedChangeSet.toInverseChangeSet();\n\t\t\tcopiedChangeSet.applyChangeSet(rebaseBaseChangeSet);\n\t\t\tcopiedChangeSet.applyChangeSet(this.localChanges[i].changeSet, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\t\t\trebaseBaseChangeSet = copiedChangeSet.getSerializedChangeSet();\n\n\t\t\tnew ChangeSet(accumulatedChanges).applyChangeSet(this.localChanges[i].changeSet);\n\t\t}\n\n\t\t// Compute the inverse of the pending changes and store the result in newTipDelta\n\t\tconst pendingChangesRebaseMetaInformation = new Map();\n\t\tconst deltaToTipCS = new ChangeSet(newTipDelta);\n\t\tdeltaToTipCS.applyChangeSet(pendingChanges);\n\t\tdeltaToTipCS.toInverseChangeSet();\n\n\t\t// Perform a rebase of the pending changes\n\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(pendingChanges, conflicts, {\n\t\t\tapplyAfterMetaInformation: pendingChangesRebaseMetaInformation,\n\t\t});\n\n\t\t// Compute the delta between the old tip (including pending changes)\n\t\t// and the new tip (not including the rebased pending changes)\n\t\tdeltaToTipCS.applyChangeSet(rebaseBaseChangeSet);\n\n\t\t// Update the tip view\n\t\tif (!this.tipView) {\n\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\t\t\tconst changeSet = new ChangeSet(this.tipView);\n\t\t\tchangeSet.applyChangeSet(accumulatedChanges);\n\t\t} else {\n\t\t\tnew ChangeSet(this.tipView).applyChangeSet(newTipDelta);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprotected applyStashedOp() {\n\t\tthrow new Error(\"not implemented\");\n\t}\n}\n"]}
1
+ {"version":3,"file":"propertyTree.js","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable import/no-internal-modules */\nimport isEmpty from \"lodash/isEmpty\";\nimport findIndex from \"lodash/findIndex\";\nimport find from \"lodash/find\";\nimport isEqual from \"lodash/isEqual\";\nimport range from \"lodash/range\";\nimport { copy as cloneDeep } from \"fastest-json-copy\";\nimport { Packr } from \"msgpackr\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\n\nimport { bufferToString, stringToBuffer } from \"@fluidframework/common-utils\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\n\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\n\nimport { PropertyFactory, BaseProperty, NodeProperty } from \"@fluid-experimental/property-properties\";\n\nimport { v4 as uuidv4 } from \"uuid\";\nimport axios from \"axios\";\nimport { PropertyTreeFactory } from \"./propertyTreeFactory\";\n\nexport type SerializedChangeSet = any;\n\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\nexport interface IPropertyTreeMessage {\n\top: OpKind;\n\tchangeSet: SerializedChangeSet;\n\tmetadata: Metadata;\n\tguid: string;\n\treferenceGuid: string;\n\tremoteHeadGuid: string;\n\tlocalBranchStart: string | undefined;\n\trebaseMetaInformation?: Map<any, any>;\n\tuseMH?: boolean;\n}\n\nexport interface IRemotePropertyTreeMessage extends IPropertyTreeMessage {\n\tsequenceNumber: number;\n}\ninterface ISnapshot {\n\tbranchGuid: string;\n\tsummaryMinimumSequenceNumber: number;\n\tuseMH: boolean;\n\tnumChunks: number;\n}\nexport interface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n\tremoteHeadGuid: string;\n}\n\nexport interface SharedPropertyTreeOptions {\n\tpaths?: string[];\n\tclientFiltering?: boolean;\n\tuseMH?: boolean;\n\tdisablePartialCheckout?: boolean;\n}\n\nexport interface ISharedPropertyTreeEncDec {\n\tmessageEncoder: { encode: (IPropertyTreeMessage) => IPropertyTreeMessage;\n\t\tdecode: (IPropertyTreeMessage) => IPropertyTreeMessage; };\n\tsummaryEncoder: { encode: (ISnapshotSummary) => Buffer; decode: (Buffer) => ISnapshotSummary; };\n}\n\nexport interface IPropertyTreeConfig {\n\tencDec: ISharedPropertyTreeEncDec;\n}\n\nconst defaultEncDec: ISharedPropertyTreeEncDec = {\n\tmessageEncoder: { encode: (msg: IPropertyTreeMessage) => msg,\n\t\tdecode: (msg: IPropertyTreeMessage) => msg },\n\tsummaryEncoder: {\n\t\tencode: (summary: ISnapshotSummary) => {\n\t\t\tconst packr = new Packr();\n\t\t\tconst serializedSummary = packr.pack(summary);\n\t\t\treturn serializedSummary;\n\t\t},\n\t\tdecode: (serializedSummary) => {\n\t\t\tconst packr = new Packr();\n\t\t\tconst snapshotSummary = packr.unpack(serializedSummary);\n\t\t\treturn snapshotSummary as ISnapshotSummary;\n\t\t},\n\t},\n};\n\n/**\n * Silly DDS example that models a six sided die.\n *\n * Unlike the typical 'Dice Roller' example where clients clobber each other's last roll in a\n * SharedMap, this 'SharedDie' DDS works by advancing an internal PRNG each time it sees a 'roll'\n * operation.\n *\n * Because all clients are using the same PRNG starting in the same state, they arrive at\n * consensus by simply applying the same number of rolls. (A fun addition would be logging\n * who received which roll, which would need to change as clients learn how races are resolved\n * in the total order)\n */\nexport class SharedPropertyTree extends SharedObject {\n\ttipView: SerializedChangeSet = {};\n\tremoteTipView: SerializedChangeSet = {};\n\tlocalChanges: IPropertyTreeMessage[] = [];\n\tremoteChanges: IPropertyTreeMessage[] = [];\n\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\ttransmissionsHaveBeenStopped = false;\n\tenqueuedMessages: IPropertyTreeMessage[] = [];\n\tnotificationDelayScope: number = 0;\n\t_root: any = PropertyFactory.create(\"NodeProperty\");\n\toptions: SharedPropertyTreeOptions;\n\tskipSequenceNumber: number = -1;\n\theadCommitGuid: string = \"\";\n\tuseMH: boolean = false;\n\tpropertyTreeConfig: IPropertyTreeConfig;\n\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\toptions: SharedPropertyTreeOptions,\n\t\tpropertyTreeConfig: IPropertyTreeConfig = { encDec: defaultEncDec },\n\t) {\n\t\tsuper(id, runtime, attributes, \"fluid_propertyTree_\");\n\n\t\tthis.options = options;\n\t\t// Quick hack to let the root be aware of the DDS hosting it.\n\t\tthis._root._tree = this;\n\n\t\t// By default, we currently don't use the MH\n\t\tthis.useMH = options.useMH ?? false;\n\t\tthis.propertyTreeConfig = propertyTreeConfig;\n\t}\n\n\t/**\n\t * Create a new shared cell\n\t *\n\t * @param runtime - data store runtime the new shared map belongs to\n\t * @param id - optional name of the shared map\n\t * @returns newly create shared map (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string, queryString?: string) {\n\t\treturn runtime.createChannel(id, PropertyTreeFactory.Type) as SharedPropertyTree;\n\t}\n\n\t/**\n\t * Get a factory for SharedDie to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedDie\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new PropertyTreeFactory();\n\t}\n\n\t/**\n\t * in case of partial checkout we want to send the paths we are interested in once we are connected\n\t */\n\tprotected onConnect() {\n\t\t// on connect we scope all deltas such that we only get relevant changes\n\t\t// since we know the paths already at constuction time this is okay\n\t\tthis.scopeFutureDeltasToPaths(this.options.paths);\n\t}\n\n\tprivate scopeFutureDeltasToPaths(paths?: string[]) {\n\t\t// Backdoor to emit \"partial_checkout\" events on the socket. The delta manager at container runtime layer is\n\t\t// a proxy and the delta manager at the container context layer is yet another proxy, so account for that.\n\t\tif (!this.options.disablePartialCheckout) {\n\t\t\tlet dm = (this.runtime.deltaManager as any).deltaManager;\n\t\t\tif (dm.deltaManager !== undefined) {\n\t\t\t\tdm = dm.deltaManager;\n\t\t\t}\n\t\t\tconst socket = dm.connectionManager.connection.socket;\n\t\t\tsocket.emit(\"partial_checkout\", { paths });\n\t\t}\n\t}\n\n\tpublic _reportDirtinessToView() {\n\t\t// Check whether anybody is listening. If not, we don't want to pay the price\n\t\t// for the serialization of the data structure\n\t\tif (this.listenerCount(\"localModification\") > 0) {\n\t\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t\tconst _changeSet = new ChangeSet(changes);\n\t\t\tif (!isEmpty(_changeSet.getSerializedChangeSet())) {\n\t\t\t\tthis.emit(\"localModification\", _changeSet);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t}\n\t}\n\n\tpublic get changeSet(): SerializedChangeSet {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\treturn this.tipView;\n\t}\n\n\tpublic get activeCommit(): IPropertyTreeMessage {\n\t\treturn this.localChanges.length > 0\n\t\t\t? this.localChanges[this.localChanges.length - 1]\n\t\t\t: this.remoteChanges[this.remoteChanges.length - 1];\n\t}\n\tpublic get root(): NodeProperty {\n\t\treturn this._root as NodeProperty;\n\t}\n\n\tpublic commit(metadata?: Metadata, submitEmptyChange?: boolean) {\n\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\n\t\tlet doSubmit = !!submitEmptyChange;\n\n\t\t// if no override provided dont submit unless metadata are provided\n\t\tif (submitEmptyChange === undefined) {\n\t\t\tdoSubmit = metadata !== undefined;\n\t\t}\n\n\t\tif (doSubmit || !isEmpty(changes)) {\n\t\t\tthis.applyChangeSet(changes, metadata || {});\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\t/**\n\t * This method encodes the given message to the transfer form\n\t * @param change - The message to be encoded.\n \t */\n\tprivate encodeMessage(change: IPropertyTreeMessage): IPropertyTreeMessage {\n\t\treturn this.propertyTreeConfig.encDec.messageEncoder.encode(change);\n\t}\n\n\t/**\n \t * This method decodes message from the transfer form.\n\t * @param transferChange - The message to be decoded.\n\t \t */\n\tprivate decodeMessage(transferChange: IPropertyTreeMessage): IPropertyTreeMessage {\n\t\treturn this.propertyTreeConfig.encDec.messageEncoder.decode(transferChange);\n\t}\n\n\tprivate applyChangeSet(changeSet: SerializedChangeSet, metadata: Metadata) {\n\t\tconst _changeSet = new ChangeSet(changeSet);\n\t\t_changeSet._toReversibleChangeSet(this.tipView);\n\n\t\tthis.updateRemoteHeadGuid();\n\n\t\tconst change = {\n\t\t\top: OpKind.ChangeSet,\n\t\t\tchangeSet,\n\t\t\tmetadata,\n\t\t\tguid: uuidv4(),\n\t\t\tremoteHeadGuid: this.headCommitGuid,\n\t\t\treferenceGuid:\n\t\t\t\tthis.localChanges.length > 0\n\t\t\t\t? this.localChanges[this.localChanges.length - 1].guid\n\t\t\t\t: this.headCommitGuid,\n\t\t\tlocalBranchStart: this.localChanges.length > 0 ? this.localChanges[0].guid : undefined,\n\t\t\tuseMH: this.useMH,\n\t\t};\n\t\tthis._applyLocalChangeSet(change);\n\t\t// Queue the op for transmission to the Fluid service.\n\t\tconst transferChange = this.encodeMessage(cloneDeep(change));\n\t\tif (this.transmissionsHaveBeenStopped) {\n\t\t\tthis.enqueuedMessages.push(transferChange);\n\t\t} else {\n\t\t\tthis.submitLocalMessage(transferChange);\n\t\t}\n\t}\n\n\tstopTransmission(stop: boolean) {\n\t\tthis.transmissionsHaveBeenStopped = stop;\n\t\tif (stop === false) {\n\t\t\tfor (const message of this.enqueuedMessages) {\n\t\t\t\tthis.submitLocalMessage(message);\n\t\t\t}\n\t\t\tthis.enqueuedMessages = [];\n\t\t}\n\t}\n\t/**\n\t * Delays notifications until popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic pushNotificationDelayScope() {\n\t\t// set the scope counter\n\t\tthis.notificationDelayScope++;\n\n\t\t// If we reach 0, we have to report unreported changes\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tthis._root._reportDirtinessToView();\n\t\t}\n\t}\n\n\t/**\n\t * Re-enables notifications when popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic popNotificationDelayScope() {\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tconsole.error(\"Unbalanced push/pop calls.\");\n\t\t}\n\t\tthis.notificationDelayScope--;\n\t\tthis._root._reportDirtinessToView();\n\t}\n\n\t/**\n\t * Process an operation\n\t *\n\t * @param message - the message to prepare\n\t * @param local - whether the message was sent by the local client\n\t * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.\n\t * For messages from a remote client, this will be undefined.\n\t */\n\tprotected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\tif (message.type === MessageType.Operation && message.sequenceNumber > this.skipSequenceNumber) {\n\t\t\tconst change: IPropertyTreeMessage = this.decodeMessage(cloneDeep(message.contents));\n\t\t\tconst content: IRemotePropertyTreeMessage = { ...change, sequenceNumber: message.sequenceNumber };\n\t\t\tswitch (content.op) {\n\t\t\t\tcase OpKind.ChangeSet:\n\t\t\t\t\t// If the op originated locally from this client, we've already accounted for it\n\t\t\t\t\t// by advancing the state. Otherwise, advance the PRNG now.\n\t\t\t\t\tthis._applyRemoteChangeSet(cloneDeep(content));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate addRemoteChange(change: IPropertyTreeMessage) {\n\t\tthis.remoteChanges.push(change);\n\t\tthis.updateRemoteHeadGuid();\n\t}\n\n\tprivate updateRemoteHeadGuid() {\n\t\tthis.headCommitGuid = this.remoteChanges.length > 0\n\t\t\t\t? this.remoteChanges[this.remoteChanges.length - 1].guid\n\t\t\t\t: this.headCommitGuid;\n\t}\n\n\tpublic static prune(\n\t\tminimumSequenceNumber: number,\n\t\tremoteChanges: IPropertyTreeMessage[],\n\t\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>,\n\t) {\n\t\t// for faster lookup of remote change guids\n\t\tconst remoteChangeMap = new Map<string, number>();\n\t\tremoteChanges.forEach((change, index) => {\n\t\t\tremoteChangeMap.set(change.guid, index);\n\t\t});\n\n\t\t// we will track visited nodes\n\t\tconst visitedUnrebasedRemoteChanges = new Set<string>();\n\t\tconst visitedRemoteChanges = new Set<string>();\n\n\t\tfor (const id of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tconst unrebasedChange = unrebasedRemoteChanges[id];\n\n\t\t\t// we are only interested in changes that are newer than the sequence number\n\t\t\t// and that were not yet visited previously\n\t\t\tif (\n\t\t\t\tunrebasedChange.sequenceNumber >= minimumSequenceNumber &&\n\t\t\t\t!visitedUnrebasedRemoteChanges.has(unrebasedChange.guid)\n\t\t\t) {\n\t\t\t\t// we visited that unrebased change and mark it as visited\n\t\t\t\tvisitedUnrebasedRemoteChanges.add(unrebasedChange.guid);\n\n\t\t\t\tlet visitor = unrebasedChange;\n\t\t\t\t// we will walk along the commit chain until we hit a remote change or a visited unrebased commit\n\t\t\t\t// at that point we can skip since we already traced the rest of the commit chain\n\t\t\t\twhile (\n\t\t\t\t\tvisitor.remoteHeadGuid !== visitor.referenceGuid ||\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.has(visitor.referenceGuid)\n\t\t\t\t) {\n\t\t\t\t\tconst guid = visitor.referenceGuid;\n\t\t\t\t\tif (guid === \"\") {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// since the change is not in remote it must be in unrebased\n\t\t\t\t\tvisitor = unrebasedRemoteChanges[visitor.referenceGuid];\n\t\t\t\t\tif (!visitor) {\n\t\t\t\t\t\tthrow new Error(`no visitor found for guid \"${guid}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.add(visitor.guid);\n\t\t\t\t}\n\t\t\t\t// if we exited the loop because we hit a remote change than add it as visited\n\t\t\t\tif (visitor.remoteHeadGuid === visitor.referenceGuid && remoteChangeMap.has(visitor.referenceGuid)) {\n\t\t\t\t\tvisitedRemoteChanges.add(visitor.referenceGuid);\n\t\t\t\t}\n\n\t\t\t\t// If we have a change that refers to the start of the history (remoteHeadGuid === \"\"), we have to\n\t\t\t\t// keep all remote Changes until this change has been processed\n\t\t\t\tif (visitor.remoteHeadGuid === \"\") {\n\t\t\t\t\tvisitedRemoteChanges.add(remoteChanges[0].guid);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlet pruned = 0;\n\t\t// we can now filter the unrebased changes by removing any changes\n\t\t// we have not visited at all during our traversal\n\t\tconst prunedUnrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\t\tfor (const key of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tif (visitedUnrebasedRemoteChanges.has(key)) {\n\t\t\t\tprunedUnrebasedRemoteChanges[key] = unrebasedRemoteChanges[key];\n\t\t\t} else {\n\t\t\t\tpruned++;\n\t\t\t}\n\t\t}\n\n\t\t// find minimum index\n\t\tconst minIndex = Math.min(...[...visitedRemoteChanges].map((key) => remoteChangeMap.get(key) as number));\n\n\t\tconst prunedRemoteChanges = remoteChanges.slice(minIndex);\n\t\tpruned += minIndex;\n\n\t\treturn {\n\t\t\tremoteChanges: prunedRemoteChanges,\n\t\t\tunrebasedRemoteChanges: prunedUnrebasedRemoteChanges,\n\t\t\tprunedCount: pruned,\n\t\t};\n\t}\n\tpublic pruneHistory() {\n\t\tconst msn = this.runtime.deltaManager.minimumSequenceNumber;\n\n\t\tconst { remoteChanges, unrebasedRemoteChanges } = SharedPropertyTree.prune(\n\t\t\tmsn,\n\t\t\tthis.remoteChanges,\n\t\t\tthis.unrebasedRemoteChanges,\n\t\t);\n\n\t\tthis.remoteChanges = remoteChanges;\n\t\tthis.unrebasedRemoteChanges = unrebasedRemoteChanges;\n\t}\n\n\t/**\n\t * This method encodes the local summary (snapshot) object into the serialized form.\n\t * @param summary - The local summary (snapshot)representation.\n\t * @returns The serialized summary representation.\n\t */\n\tprivate encodeSummary(summary: ISnapshotSummary) {\n\t\treturn this.propertyTreeConfig.encDec.summaryEncoder.encode(summary);\n\t}\n\n\t/**\n\t * This method decodes the serialized form of the summary into the local summary (snapshot) object.\n\t * @param serializedSummary - The serialized summary representation.\n\t * @returns The local summary (snapshot)representation.\n \t */\n\tprivate decodeSummary(serializedSummary): ISnapshotSummary {\n\t\treturn this.propertyTreeConfig.encDec.summaryEncoder.decode(serializedSummary);\n\t}\n\n\t/**\n \t * This method writes the log message if the logging is enabled in the extended DDS.\n\t * The logging is not enabled in the default Property DDS\n\t * @param message - The message to be logged.\n\t */\n\tprotected logIfEnabled(message) {}\n\n\t/**\n \t * This method encodes the binary representation of the\n \t * blob.\n\t * @param blob - The binary representation of the blob.\n\t * @returns The encoded representation of the blob.\n \t */\n\tprivate encodeSummaryBlob(blob: ArrayBuffer): any {\n\t\treturn bufferToString(blob, \"base64\");\n\t}\n\n\t/**\n \t * This method decodes the encoded representation of the\n\t * blob.\n \t * @param blob - The encoded representation of the blob.\n\t * @returns The binary representation of the blob.\n\t */\n\tprivate decodeSummaryBlob(encoded: any): ArrayBuffer {\n\t\tconst buffer = bufferToString(encoded, \"utf8\");\n\t\treturn stringToBuffer(buffer, \"base64\");\n\t}\n\n\tpublic summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tthis.pruneHistory();\n\t\tconst snapshot: ISnapshot = {\n\t\t\tbranchGuid: this.handle.absolutePath.split(\"/\").pop() as string,\n\t\t\tsummaryMinimumSequenceNumber: this.runtime.deltaManager.minimumSequenceNumber,\n\t\t\tuseMH: this.useMH,\n\t\t\tnumChunks: 0,\n\t\t};\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tif (!this.useMH) {\n\t\t\t// If the MH is not used, we have to include the tip view, the remote changes and the received\n\t\t\t// deltas to the summary\n\t\t\tconst summary: ISnapshotSummary = {\n\t\t\t\tremoteTipView: this.remoteTipView,\n\t\t\t\tremoteChanges: this.remoteChanges,\n\t\t\t\tremoteHeadGuid: this.headCommitGuid,\n\t\t\t\tunrebasedRemoteChanges: this.unrebasedRemoteChanges,\n\t\t\t};\n\n\t\t\tconst chunkSize = 5000 * 1024; // Default limit seems to be 5MB\n\t\t\tlet totalBlobsSize = 0;\n\t\t\tconst serializedSummary = this.encodeSummary(summary);\n\t\t\tfor (let pos = 0, i = 0; pos < serializedSummary.length; pos += chunkSize, i++) {\n\t\t\t\tconst summaryBlob = this.encodeSummaryBlob(serializedSummary.slice(pos, pos + chunkSize));\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\t\ttotalBlobsSize += summaryBlob[\"length\"];\n\t\t\t\tbuilder.addBlob(`summaryChunk_${i}`, summaryBlob);\n\t\t\t\tsnapshot.numChunks++;\n\t\t\t}\n\t\t\tthis.logIfEnabled(`Total blobs transfer size: ${totalBlobsSize}`);\n\t\t}\n\n\t\tbuilder.addBlob(\"properties\", serializer !== undefined\n\t\t\t? serializer.stringify(snapshot, this.handle)\n\t\t\t: JSON.stringify(snapshot));\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst runtime = this.runtime;\n\t\tconst handleTableChunk = await storage.readBlob(\"properties\");\n\t\tconst utf8 = bufferToString(handleTableChunk, \"utf8\");\n\n\t\tconst snapshot: ISnapshot = this.serializer.parse(utf8);\n\t\tthis.useMH = snapshot.useMH;\n\n\t\ttry {\n\t\t\tif (!snapshot.useMH) {\n\t\t\t\t// We load all chunks\n\t\t\t\tconst chunks: ArrayBufferLike[] = await Promise.all(\n\t\t\t\t\trange(snapshot.numChunks).map(async (i) => {\n\t\t\t\t\t\treturn this.decodeSummaryBlob(await storage.readBlob(`summaryChunk_${i}`));\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst totalLength = chunks.reduce((a, b) => a + b.byteLength, 0);\n\t\t\t\tconst serializedSummary = new Uint8Array(totalLength);\n\t\t\t\tchunks.reduce((offset, chunk) => {\n\t\t\t\t\tserializedSummary.set(new Uint8Array(chunk), offset);\n\t\t\t\t\treturn offset + chunk.byteLength;\n\t\t\t\t}, 0);\n\t\t\t\tconst snapshotSummary = this.decodeSummary(serializedSummary);\n\t\t\t\tif (\n\t\t\t\t\tsnapshotSummary.remoteChanges === undefined ||\n\t\t\t\t\tsnapshotSummary.remoteTipView === undefined ||\n\t\t\t\t\tsnapshotSummary.unrebasedRemoteChanges === undefined\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\"Invalid Snapshot.\");\n\t\t\t\t}\n\n\t\t\t\tif (snapshotSummary.remoteHeadGuid === undefined) {\n\t\t\t\t\t// The summary does not contain a remoteHeadGuid. This means the summary has\n\t\t\t\t\t// been created by an old version of PropertyDDS, that did not yet have this patch.\n\t\t\t\t\tsnapshotSummary.remoteHeadGuid = (snapshotSummary.remoteChanges.length > 0) ?\n\t\t\t\t\t\t\t// If there are remote changes in the\n\t\t\t\t\t\t\t// summary we can deduce the head GUID from these changes.\n\t\t\t\t\t\t\tsnapshotSummary.remoteChanges[snapshotSummary.remoteChanges.length - 1].guid :\n\n\t\t\t\t\t\t\t// If no remote head GUID is available, we will fall back to the old behaviour,\n\t\t\t\t\t\t\t// where the head GUID was set to an empty string. However, this could lead to\n\t\t\t\t\t\t\t// divergence between the clients, if there is still a client in the session\n\t\t\t\t\t\t\t// that is using a version of this library without this patch and which\n\t\t\t\t\t\t\t// has started the session at a different summary.\n\t\t\t\t\t\t\t\"\";\n\t\t\t\t}\n\n\t\t\t\tthis.remoteTipView = snapshotSummary.remoteTipView;\n\t\t\t\tthis.remoteChanges = snapshotSummary.remoteChanges;\n\t\t\t\tthis.unrebasedRemoteChanges = snapshotSummary.unrebasedRemoteChanges;\n\t\t\t\tthis.headCommitGuid = snapshotSummary.remoteHeadGuid;\n\t\t\t\tconst isPartialCheckoutActive = !!(this.options.clientFiltering && this.options.paths);\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tthis.remoteTipView = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\tthis.remoteTipView,\n\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\n\t\t\t\tthis.skipSequenceNumber = 0;\n\t\t\t} else {\n\t\t\t\tconst { branchGuid, summaryMinimumSequenceNumber } = snapshot;\n\t\t\t\tconst branchResponse = await axios.get(`http://localhost:3000/branch/${branchGuid}`);\n\t\t\t\tthis.headCommitGuid = branchResponse.data.headCommitGuid;\n\t\t\t\tconst {\n\t\t\t\t\tcommit: { meta: commitMetadata },\n\t\t\t\t} = (await axios.get(`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}`)).data;\n\t\t\t\tlet { changeSet: materializedView } = (\n\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}/materializedView`,\n\t\t\t\t\t)\n\t\t\t\t).data;\n\n\t\t\t\tconst isPartialCheckoutActive = this.options.clientFiltering && this.options.paths;\n\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tmaterializedView = ChangeSetUtils.getFilteredChangeSetByPaths(materializedView, this.options.paths);\n\t\t\t\t}\n\n\t\t\t\tthis.tipView = materializedView;\n\t\t\t\tthis.remoteTipView = cloneDeep(this.tipView);\n\t\t\t\tthis.remoteChanges = [];\n\n\t\t\t\tlet missingDeltas: ISequencedDocumentMessage[] = [];\n\t\t\t\tconst firstDelta = Math.min(commitMetadata.minimumSequenceNumber, summaryMinimumSequenceNumber);\n\t\t\t\tconst lastDelta = commitMetadata.sequenceNumber;\n\n\t\t\t\tconst dm = (this.runtime.deltaManager as any).deltaManager;\n\t\t\t\tawait dm.getDeltas(\"DocumentOpen\", firstDelta, lastDelta, (messages: ISequencedDocumentMessage[]) => {\n\t\t\t\t\tmissingDeltas = messages.filter((x) => x.type === \"op\");\n\t\t\t\t});\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\t\t\tfor (let i = 0; i < missingDeltas.length; i++) {\n\t\t\t\t\tif (missingDeltas[i].sequenceNumber < commitMetadata.sequenceNumber) {\n\t\t\t\t\t\tconst remoteChange: IPropertyTreeMessage\n\t\t\t\t\t\t\t= JSON.parse(missingDeltas[i].contents).contents.contents.content.contents;\n\t\t\t\t\t\tconst { changeSet } = (\n\t\t\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${remoteChange.guid}/changeSet`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t).data;\n\t\t\t\t\t\tremoteChange.changeSet = changeSet;\n\n\t\t\t\t\t\tif (remoteChange) {\n\t\t\t\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\t\t\t\tremoteChange.changeSet = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\t\t\t\tremoteChange.changeSet,\n\t\t\t\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.addRemoteChange(remoteChange);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.processCore(missingDeltas[i], false, {});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.skipSequenceNumber = lastDelta ?? -1;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.tipView = {};\n\t\t\tthis.remoteTipView = {};\n\t\t\tthis.remoteChanges = [];\n\t\t} finally {\n\t\t\tthis._root.deserialize(this.tipView, undefined, false, false);\n\t\t\tconst _changeSet = new ChangeSet(this.tipView);\n\t\t\tif (!isEmpty(_changeSet.getSerializedChangeSet())) {\n\t\t\t\tthis.emit(\"localModification\", _changeSet);\n\t\t\t}\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\tprotected onDisconnect() { }\n\n\tprivate _applyLocalChangeSet(change: IPropertyTreeMessage) {\n\t\tconst changeSetWrapper = new ChangeSet(this.tipView);\n\t\tchangeSetWrapper.applyChangeSet(change.changeSet);\n\n\t\tif (this.runtime.attachState === AttachState.Detached) {\n\t\t\tconst remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);\n\t\t\tremoteChangeSetWrapper.applyChangeSet(change.changeSet);\n\t\t} else {\n\t\t\tthis.localChanges.push(change);\n\t\t}\n\t}\n\n\tprivate _applyRemoteChangeSet(change: IRemotePropertyTreeMessage) {\n\t\tthis.unrebasedRemoteChanges[change.guid] = cloneDeep(change);\n\n\t\t// This is the first message in the history of the document.\n\t\tif (this.remoteChanges.length !== 0) {\n\t\t\trebaseToRemoteChanges(\n\t\t\t\tchange,\n\t\t\t\tthis.getUnrebasedChange.bind(this),\n\t\t\t\tthis.getRebasedChanges.bind(this),\n\t\t\t);\n\t\t}\n\n\t\tthis.addRemoteChange(change);\n\t\t// Apply the remote change set to the remote tip view\n\t\tconst remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);\n\t\tremoteChangeSetWrapper.applyChangeSet(change.changeSet);\n\n\t\t// Rebase the local changes\n\t\tconst pendingChanges = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\tnew ChangeSet(pendingChanges)._toReversibleChangeSet(this.tipView);\n\n\t\tconst changesToTip: SerializedChangeSet = {};\n\t\tconst changesNeeded = this.rebaseLocalChanges(change, pendingChanges, changesToTip);\n\n\t\tif (changesNeeded) {\n\t\t\tthis.pushNotificationDelayScope();\n\t\t\t// Checkout the new tip\n\t\t\tthis._root.applyChangeSet(changesToTip);\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\t\tthis._root.applyChangeSet(pendingChanges);\n\t\t\tthis.popNotificationDelayScope();\n\t\t}\n\n\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t// assert(JSON.stringify(this.root.serialize()) === JSON.stringify(this.tipView));\n\t}\n\n\tgetUnrebasedChange(guid: string) {\n\t\treturn this.unrebasedRemoteChanges[guid];\n\t}\n\n\tgetRebasedChanges(startGuid: string, endGuid?: string) {\n\t\tconst startIndex = findIndex(this.remoteChanges, (c) => c.guid === startGuid);\n\t\tif (startIndex === -1 && startGuid !== \"\") {\n\t\t\t// TODO: Consider throwing an error once clients have picked up PR #16277.\n\t\t\tconsole.error(\"Unknown start GUID specified.\");\n\t\t}\n\t\tif (endGuid !== undefined) {\n\t\t\tconst endIndex = findIndex(this.remoteChanges, (c) => c.guid === endGuid);\n\t\t\treturn this.remoteChanges.slice(startIndex + 1, endIndex + 1);\n\t\t}\n\t\treturn this.remoteChanges.slice(startIndex + 1);\n\t}\n\n\tprivate rebaseLocalChanges(\n\t\tchange: IPropertyTreeMessage,\n\t\tpendingChanges: SerializedChangeSet,\n\t\tnewTipDelta: SerializedChangeSet,\n\t): boolean {\n\t\tlet rebaseBaseChangeSet;\n\n\t\tconst accumulatedChanges: SerializedChangeSet = {};\n\t\tconst conflicts = [] as any[];\n\n\t\tif (this.localChanges.length > 0 && this.localChanges[0].guid === change.guid) {\n\t\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t\t// assert(JSON.stringify(this.localChanges[0].changeSet) === JSON.stringify(change.changeSet),\n\t\t\t// \"Local change different than rebased remote change.\");\n\n\t\t\tif (isEqual(this.localChanges[0].changeSet, change.changeSet)) {\n\t\t\t\t// If we got a confirmation of the commit on the tip of the localChanges array,\n\t\t\t\t// there will be no update of the tip view at all. We just move it from local changes\n\t\t\t\t// to remote changes\n\t\t\t\tthis.localChanges.shift();\n\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\t// There is a case where the localChanges that were created by incrementally rebasing with respect\n\t\t\t\t// to every incoming change do no exactly agree with the rebased remote change (this happens\n\t\t\t\t// when there are changes that cancel out with each other that have happened in the meantime).\n\t\t\t\t// In that case, we must make sure, we correctly update the local view to take this difference into\n\t\t\t\t// account by rebasing with respect to the changeset that is obtained by combining the inverse of the\n\t\t\t\t// local change with the incoming remote change.\n\n\t\t\t\trebaseBaseChangeSet = new ChangeSet(this.localChanges.shift()?.changeSet);\n\t\t\t\trebaseBaseChangeSet.toInverseChangeSet();\n\t\t\t\trebaseBaseChangeSet.applyChangeSet(change.changeSet);\n\t\t\t}\n\t\t} else {\n\t\t\trebaseBaseChangeSet = cloneDeep(change.changeSet);\n\t\t}\n\n\t\tfor (let i = 0; i < this.localChanges.length; i++) {\n\t\t\t// Make sure we never receive changes out of order\n\t\t\tconsole.assert(this.localChanges[i].guid !== change.guid);\n\n\t\t\tconst rebaseMetaInformation = new Map();\n\n\t\t\tconst copiedChangeSet = new ChangeSet(cloneDeep(this.localChanges[i].changeSet));\n\t\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(this.localChanges[i].changeSet, conflicts, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\n\t\t\tcopiedChangeSet.toInverseChangeSet();\n\t\t\tcopiedChangeSet.applyChangeSet(rebaseBaseChangeSet);\n\t\t\tcopiedChangeSet.applyChangeSet(this.localChanges[i].changeSet, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\t\t\trebaseBaseChangeSet = copiedChangeSet.getSerializedChangeSet();\n\n\t\t\tnew ChangeSet(accumulatedChanges).applyChangeSet(this.localChanges[i].changeSet);\n\n\t\t\t// Update the reference and head guids\n\t\t\tthis.localChanges[i].remoteHeadGuid = change.guid;\n\t\t\tif (i === 0) {\n\t\t\t\tthis.localChanges[i].referenceGuid = change.guid;\n\t\t\t}\n\t\t}\n\n\t\t// Compute the inverse of the pending changes and store the result in newTipDelta\n\t\tconst pendingChangesRebaseMetaInformation = new Map();\n\t\tconst deltaToTipCS = new ChangeSet(newTipDelta);\n\t\tdeltaToTipCS.applyChangeSet(pendingChanges);\n\t\tdeltaToTipCS.toInverseChangeSet();\n\n\t\t// Perform a rebase of the pending changes\n\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(pendingChanges, conflicts, {\n\t\t\tapplyAfterMetaInformation: pendingChangesRebaseMetaInformation,\n\t\t});\n\n\t\t// Compute the delta between the old tip (including pending changes)\n\t\t// and the new tip (not including the rebased pending changes)\n\t\tdeltaToTipCS.applyChangeSet(rebaseBaseChangeSet);\n\n\t\t// Update the tip view\n\t\tif (!this.tipView) {\n\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\t\t\tconst changeSet = new ChangeSet(this.tipView);\n\t\t\tchangeSet.applyChangeSet(accumulatedChanges);\n\t\t} else {\n\t\t\tnew ChangeSet(this.tipView).applyChangeSet(newTipDelta);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprotected reSubmitCore(content: any, localOpMetadata: unknown) {\n\t\t// We have to provide our own implementation of the resubmit core function, to\n\t\t// handle the case where an operation is no longer referencing a commit within\n\t\t// the collaboration window as its referenceGuid. Other clients would not be\n\t\t// able to perform the rebase for such an operation. To handle this problem\n\t\t// we have to resubmit a version of the operations which has been rebased to\n\t\t// the current remote tip. We already have these rebased versions of the operations\n\t\t// in our localChanges, because we continuously update those to follow the tip.\n\t\t// Therefore our reSubmitCore function searches for the rebased operation in the\n\t\t// localChanges array and submits this up-to-date version instead of the old operation.\n\t\tconst rebasedOperation = find(this.localChanges, (op) => op.guid === content.guid);\n\n\t\tif (rebasedOperation) {\n\t\t\tthis.submitLocalMessage(cloneDeep(rebasedOperation), localOpMetadata);\n\t\t} else {\n\t\t\t// Could this happen or is there a guard that we will never resubmit an already submitted op?\n\t\t\tconsole.warn(\"Resubmitting operation which has already been received back.\");\n\t\t}\n\t}\n\n\tprotected applyStashedOp() {\n\t\tthrow new Error(\"not implemented\");\n\t}\n}\n"]}
@@ -37,6 +37,7 @@ export interface SharedPropertyTreeOptions {
37
37
  paths?: string[];
38
38
  clientFiltering?: boolean;
39
39
  useMH?: boolean;
40
+ disablePartialCheckout?: boolean;
40
41
  }
41
42
  export interface ISharedPropertyTreeEncDec {
42
43
  messageEncoder: {
@@ -182,6 +183,7 @@ export declare class SharedPropertyTree extends SharedObject {
182
183
  getUnrebasedChange(guid: string): IRemotePropertyTreeMessage;
183
184
  getRebasedChanges(startGuid: string, endGuid?: string): IPropertyTreeMessage[];
184
185
  private rebaseLocalChanges;
186
+ protected reSubmitCore(content: any, localOpMetadata: unknown): void;
185
187
  protected applyStashedOp(): void;
186
188
  }
187
189
  //# sourceMappingURL=propertyTree.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"propertyTree.d.ts","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"propertyTree.d.ts","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@
5
5
  /* eslint-disable import/no-internal-modules */
6
6
  import isEmpty from "lodash/isEmpty";
7
7
  import findIndex from "lodash/findIndex";
8
+ import find from "lodash/find";
9
+ import isEqual from "lodash/isEqual";
8
10
  import range from "lodash/range";
9
11
  import { copy as cloneDeep } from "fastest-json-copy";
10
12
  import { Packr } from "msgpackr";
@@ -96,8 +98,16 @@ export class SharedPropertyTree extends SharedObject {
96
98
  this.scopeFutureDeltasToPaths(this.options.paths);
97
99
  }
98
100
  scopeFutureDeltasToPaths(paths) {
99
- const socket = this.runtime.deltaManager.deltaManager.connectionManager.connection.socket;
100
- socket.emit("partial_checkout", { paths });
101
+ // Backdoor to emit "partial_checkout" events on the socket. The delta manager at container runtime layer is
102
+ // a proxy and the delta manager at the container context layer is yet another proxy, so account for that.
103
+ if (!this.options.disablePartialCheckout) {
104
+ let dm = this.runtime.deltaManager.deltaManager;
105
+ if (dm.deltaManager !== undefined) {
106
+ dm = dm.deltaManager;
107
+ }
108
+ const socket = dm.connectionManager.connection.socket;
109
+ socket.emit("partial_checkout", { paths });
110
+ }
101
111
  }
102
112
  _reportDirtinessToView() {
103
113
  // Check whether anybody is listening. If not, we don't want to pay the price
@@ -536,6 +546,10 @@ export class SharedPropertyTree extends SharedObject {
536
546
  }
537
547
  getRebasedChanges(startGuid, endGuid) {
538
548
  const startIndex = findIndex(this.remoteChanges, (c) => c.guid === startGuid);
549
+ if (startIndex === -1 && startGuid !== "") {
550
+ // TODO: Consider throwing an error once clients have picked up PR #16277.
551
+ console.error("Unknown start GUID specified.");
552
+ }
539
553
  if (endGuid !== undefined) {
540
554
  const endIndex = findIndex(this.remoteChanges, (c) => c.guid === endGuid);
541
555
  return this.remoteChanges.slice(startIndex + 1, endIndex + 1);
@@ -543,20 +557,36 @@ export class SharedPropertyTree extends SharedObject {
543
557
  return this.remoteChanges.slice(startIndex + 1);
544
558
  }
545
559
  rebaseLocalChanges(change, pendingChanges, newTipDelta) {
546
- let rebaseBaseChangeSet = cloneDeep(change.changeSet);
560
+ var _a;
561
+ let rebaseBaseChangeSet;
547
562
  const accumulatedChanges = {};
548
563
  const conflicts = [];
549
564
  if (this.localChanges.length > 0 && this.localChanges[0].guid === change.guid) {
550
565
  // This is disabled for performance reasons. Only used during debugging
551
566
  // assert(JSON.stringify(this.localChanges[0].changeSet) === JSON.stringify(change.changeSet),
552
567
  // "Local change different than rebased remote change.");
553
- // If we got a confirmation of the commit on the tip of the localChanges array,
554
- // there will be no update of the tip view at all. We just move it from local changes
555
- // to remote changes
556
- this.localChanges.shift();
557
- return false;
568
+ if (isEqual(this.localChanges[0].changeSet, change.changeSet)) {
569
+ // If we got a confirmation of the commit on the tip of the localChanges array,
570
+ // there will be no update of the tip view at all. We just move it from local changes
571
+ // to remote changes
572
+ this.localChanges.shift();
573
+ return false;
574
+ }
575
+ else {
576
+ // There is a case where the localChanges that were created by incrementally rebasing with respect
577
+ // to every incoming change do no exactly agree with the rebased remote change (this happens
578
+ // when there are changes that cancel out with each other that have happened in the meantime).
579
+ // In that case, we must make sure, we correctly update the local view to take this difference into
580
+ // account by rebasing with respect to the changeset that is obtained by combining the inverse of the
581
+ // local change with the incoming remote change.
582
+ rebaseBaseChangeSet = new ChangeSet((_a = this.localChanges.shift()) === null || _a === void 0 ? void 0 : _a.changeSet);
583
+ rebaseBaseChangeSet.toInverseChangeSet();
584
+ rebaseBaseChangeSet.applyChangeSet(change.changeSet);
585
+ }
586
+ }
587
+ else {
588
+ rebaseBaseChangeSet = cloneDeep(change.changeSet);
558
589
  }
559
- // eslint-disable-next-line @typescript-eslint/prefer-for-of
560
590
  for (let i = 0; i < this.localChanges.length; i++) {
561
591
  // Make sure we never receive changes out of order
562
592
  console.assert(this.localChanges[i].guid !== change.guid);
@@ -572,6 +602,11 @@ export class SharedPropertyTree extends SharedObject {
572
602
  });
573
603
  rebaseBaseChangeSet = copiedChangeSet.getSerializedChangeSet();
574
604
  new ChangeSet(accumulatedChanges).applyChangeSet(this.localChanges[i].changeSet);
605
+ // Update the reference and head guids
606
+ this.localChanges[i].remoteHeadGuid = change.guid;
607
+ if (i === 0) {
608
+ this.localChanges[i].referenceGuid = change.guid;
609
+ }
575
610
  }
576
611
  // Compute the inverse of the pending changes and store the result in newTipDelta
577
612
  const pendingChangesRebaseMetaInformation = new Map();
@@ -596,6 +631,25 @@ export class SharedPropertyTree extends SharedObject {
596
631
  }
597
632
  return true;
598
633
  }
634
+ reSubmitCore(content, localOpMetadata) {
635
+ // We have to provide our own implementation of the resubmit core function, to
636
+ // handle the case where an operation is no longer referencing a commit within
637
+ // the collaboration window as its referenceGuid. Other clients would not be
638
+ // able to perform the rebase for such an operation. To handle this problem
639
+ // we have to resubmit a version of the operations which has been rebased to
640
+ // the current remote tip. We already have these rebased versions of the operations
641
+ // in our localChanges, because we continuously update those to follow the tip.
642
+ // Therefore our reSubmitCore function searches for the rebased operation in the
643
+ // localChanges array and submits this up-to-date version instead of the old operation.
644
+ const rebasedOperation = find(this.localChanges, (op) => op.guid === content.guid);
645
+ if (rebasedOperation) {
646
+ this.submitLocalMessage(cloneDeep(rebasedOperation), localOpMetadata);
647
+ }
648
+ else {
649
+ // Could this happen or is there a guard that we will never resubmit an already submitted op?
650
+ console.warn("Resubmitting operation which has already been received back.");
651
+ }
652
+ }
599
653
  applyStashedOp() {
600
654
  throw new Error("not implemented");
601
655
  }
@@ -1 +1 @@
1
- {"version":3,"file":"propertyTree.js","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable import/no-internal-modules */\nimport isEmpty from \"lodash/isEmpty\";\nimport findIndex from \"lodash/findIndex\";\nimport range from \"lodash/range\";\nimport { copy as cloneDeep } from \"fastest-json-copy\";\nimport { Packr } from \"msgpackr\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\n\nimport { bufferToString, stringToBuffer } from \"@fluidframework/common-utils\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\n\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\n\nimport { PropertyFactory, BaseProperty, NodeProperty } from \"@fluid-experimental/property-properties\";\n\nimport { v4 as uuidv4 } from \"uuid\";\nimport axios from \"axios\";\nimport { PropertyTreeFactory } from \"./propertyTreeFactory\";\n\nexport type SerializedChangeSet = any;\n\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\nexport interface IPropertyTreeMessage {\n\top: OpKind;\n\tchangeSet: SerializedChangeSet;\n\tmetadata: Metadata;\n\tguid: string;\n\treferenceGuid: string;\n\tremoteHeadGuid: string;\n\tlocalBranchStart: string | undefined;\n\trebaseMetaInformation?: Map<any, any>;\n\tuseMH?: boolean;\n}\n\nexport interface IRemotePropertyTreeMessage extends IPropertyTreeMessage {\n\tsequenceNumber: number;\n}\ninterface ISnapshot {\n\tbranchGuid: string;\n\tsummaryMinimumSequenceNumber: number;\n\tuseMH: boolean;\n\tnumChunks: number;\n}\nexport interface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n\tremoteHeadGuid: string;\n}\n\nexport interface SharedPropertyTreeOptions {\n\tpaths?: string[];\n\tclientFiltering?: boolean;\n\tuseMH?: boolean;\n}\n\nexport interface ISharedPropertyTreeEncDec {\n\tmessageEncoder: { encode: (IPropertyTreeMessage) => IPropertyTreeMessage;\n\t\tdecode: (IPropertyTreeMessage) => IPropertyTreeMessage; };\n\tsummaryEncoder: { encode: (ISnapshotSummary) => Buffer; decode: (Buffer) => ISnapshotSummary; };\n}\n\nexport interface IPropertyTreeConfig {\n\tencDec: ISharedPropertyTreeEncDec;\n}\n\nconst defaultEncDec: ISharedPropertyTreeEncDec = {\n\tmessageEncoder: { encode: (msg: IPropertyTreeMessage) => msg,\n\t\tdecode: (msg: IPropertyTreeMessage) => msg },\n\tsummaryEncoder: {\n\t\tencode: (summary: ISnapshotSummary) => {\n\t\t\tconst packr = new Packr();\n\t\t\tconst serializedSummary = packr.pack(summary);\n\t\t\treturn serializedSummary;\n\t\t},\n\t\tdecode: (serializedSummary) => {\n\t\t\tconst packr = new Packr();\n\t\t\tconst snapshotSummary = packr.unpack(serializedSummary);\n\t\t\treturn snapshotSummary as ISnapshotSummary;\n\t\t},\n\t},\n};\n\n/**\n * Silly DDS example that models a six sided die.\n *\n * Unlike the typical 'Dice Roller' example where clients clobber each other's last roll in a\n * SharedMap, this 'SharedDie' DDS works by advancing an internal PRNG each time it sees a 'roll'\n * operation.\n *\n * Because all clients are using the same PRNG starting in the same state, they arrive at\n * consensus by simply applying the same number of rolls. (A fun addition would be logging\n * who received which roll, which would need to change as clients learn how races are resolved\n * in the total order)\n */\nexport class SharedPropertyTree extends SharedObject {\n\ttipView: SerializedChangeSet = {};\n\tremoteTipView: SerializedChangeSet = {};\n\tlocalChanges: IPropertyTreeMessage[] = [];\n\tremoteChanges: IPropertyTreeMessage[] = [];\n\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\ttransmissionsHaveBeenStopped = false;\n\tenqueuedMessages: IPropertyTreeMessage[] = [];\n\tnotificationDelayScope: number = 0;\n\t_root: any = PropertyFactory.create(\"NodeProperty\");\n\toptions: SharedPropertyTreeOptions;\n\tskipSequenceNumber: number = -1;\n\theadCommitGuid: string = \"\";\n\tuseMH: boolean = false;\n\tpropertyTreeConfig: IPropertyTreeConfig;\n\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\toptions: SharedPropertyTreeOptions,\n\t\tpropertyTreeConfig: IPropertyTreeConfig = { encDec: defaultEncDec },\n\t) {\n\t\tsuper(id, runtime, attributes, \"fluid_propertyTree_\");\n\n\t\tthis.options = options;\n\t\t// Quick hack to let the root be aware of the DDS hosting it.\n\t\tthis._root._tree = this;\n\n\t\t// By default, we currently don't use the MH\n\t\tthis.useMH = options.useMH ?? false;\n\t\tthis.propertyTreeConfig = propertyTreeConfig;\n\t}\n\n\t/**\n\t * Create a new shared cell\n\t *\n\t * @param runtime - data store runtime the new shared map belongs to\n\t * @param id - optional name of the shared map\n\t * @returns newly create shared map (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string, queryString?: string) {\n\t\treturn runtime.createChannel(id, PropertyTreeFactory.Type) as SharedPropertyTree;\n\t}\n\n\t/**\n\t * Get a factory for SharedDie to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedDie\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new PropertyTreeFactory();\n\t}\n\n\t/**\n\t * in case of partial checkout we want to send the paths we are interested in once we are connected\n\t */\n\tprotected onConnect() {\n\t\t// on connect we scope all deltas such that we only get relevant changes\n\t\t// since we know the paths already at constuction time this is okay\n\t\tthis.scopeFutureDeltasToPaths(this.options.paths);\n\t}\n\n\tprivate scopeFutureDeltasToPaths(paths?: string[]) {\n\t\tconst socket = (this.runtime.deltaManager as any).deltaManager.connectionManager.connection.socket;\n\t\tsocket.emit(\"partial_checkout\", { paths });\n\t}\n\n\tpublic _reportDirtinessToView() {\n\t\t// Check whether anybody is listening. If not, we don't want to pay the price\n\t\t// for the serialization of the data structure\n\t\tif (this.listenerCount(\"localModification\") > 0) {\n\t\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t\tconst _changeSet = new ChangeSet(changes);\n\t\t\tif (!isEmpty(_changeSet.getSerializedChangeSet())) {\n\t\t\t\tthis.emit(\"localModification\", _changeSet);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t}\n\t}\n\n\tpublic get changeSet(): SerializedChangeSet {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\treturn this.tipView;\n\t}\n\n\tpublic get activeCommit(): IPropertyTreeMessage {\n\t\treturn this.localChanges.length > 0\n\t\t\t? this.localChanges[this.localChanges.length - 1]\n\t\t\t: this.remoteChanges[this.remoteChanges.length - 1];\n\t}\n\tpublic get root(): NodeProperty {\n\t\treturn this._root as NodeProperty;\n\t}\n\n\tpublic commit(metadata?: Metadata, submitEmptyChange?: boolean) {\n\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\n\t\tlet doSubmit = !!submitEmptyChange;\n\n\t\t// if no override provided dont submit unless metadata are provided\n\t\tif (submitEmptyChange === undefined) {\n\t\t\tdoSubmit = metadata !== undefined;\n\t\t}\n\n\t\tif (doSubmit || !isEmpty(changes)) {\n\t\t\tthis.applyChangeSet(changes, metadata || {});\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\t/**\n\t * This method encodes the given message to the transfer form\n\t * @param change - The message to be encoded.\n \t */\n\tprivate encodeMessage(change: IPropertyTreeMessage): IPropertyTreeMessage {\n\t\treturn this.propertyTreeConfig.encDec.messageEncoder.encode(change);\n\t}\n\n\t/**\n \t * This method decodes message from the transfer form.\n\t * @param transferChange - The message to be decoded.\n\t \t */\n\tprivate decodeMessage(transferChange: IPropertyTreeMessage): IPropertyTreeMessage {\n\t\treturn this.propertyTreeConfig.encDec.messageEncoder.decode(transferChange);\n\t}\n\n\tprivate applyChangeSet(changeSet: SerializedChangeSet, metadata: Metadata) {\n\t\tconst _changeSet = new ChangeSet(changeSet);\n\t\t_changeSet._toReversibleChangeSet(this.tipView);\n\n\t\tthis.updateRemoteHeadGuid();\n\n\t\tconst change = {\n\t\t\top: OpKind.ChangeSet,\n\t\t\tchangeSet,\n\t\t\tmetadata,\n\t\t\tguid: uuidv4(),\n\t\t\tremoteHeadGuid: this.headCommitGuid,\n\t\t\treferenceGuid:\n\t\t\t\tthis.localChanges.length > 0\n\t\t\t\t? this.localChanges[this.localChanges.length - 1].guid\n\t\t\t\t: this.headCommitGuid,\n\t\t\tlocalBranchStart: this.localChanges.length > 0 ? this.localChanges[0].guid : undefined,\n\t\t\tuseMH: this.useMH,\n\t\t};\n\t\tthis._applyLocalChangeSet(change);\n\t\t// Queue the op for transmission to the Fluid service.\n\t\tconst transferChange = this.encodeMessage(cloneDeep(change));\n\t\tif (this.transmissionsHaveBeenStopped) {\n\t\t\tthis.enqueuedMessages.push(transferChange);\n\t\t} else {\n\t\t\tthis.submitLocalMessage(transferChange);\n\t\t}\n\t}\n\n\tstopTransmission(stop: boolean) {\n\t\tthis.transmissionsHaveBeenStopped = stop;\n\t\tif (stop === false) {\n\t\t\tfor (const message of this.enqueuedMessages) {\n\t\t\t\tthis.submitLocalMessage(message);\n\t\t\t}\n\t\t\tthis.enqueuedMessages = [];\n\t\t}\n\t}\n\t/**\n\t * Delays notifications until popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic pushNotificationDelayScope() {\n\t\t// set the scope counter\n\t\tthis.notificationDelayScope++;\n\n\t\t// If we reach 0, we have to report unreported changes\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tthis._root._reportDirtinessToView();\n\t\t}\n\t}\n\n\t/**\n\t * Re-enables notifications when popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic popNotificationDelayScope() {\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tconsole.error(\"Unbalanced push/pop calls.\");\n\t\t}\n\t\tthis.notificationDelayScope--;\n\t\tthis._root._reportDirtinessToView();\n\t}\n\n\t/**\n\t * Process an operation\n\t *\n\t * @param message - the message to prepare\n\t * @param local - whether the message was sent by the local client\n\t * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.\n\t * For messages from a remote client, this will be undefined.\n\t */\n\tprotected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\tif (message.type === MessageType.Operation && message.sequenceNumber > this.skipSequenceNumber) {\n\t\t\tconst change: IPropertyTreeMessage = this.decodeMessage(cloneDeep(message.contents));\n\t\t\tconst content: IRemotePropertyTreeMessage = { ...change, sequenceNumber: message.sequenceNumber };\n\t\t\tswitch (content.op) {\n\t\t\t\tcase OpKind.ChangeSet:\n\t\t\t\t\t// If the op originated locally from this client, we've already accounted for it\n\t\t\t\t\t// by advancing the state. Otherwise, advance the PRNG now.\n\t\t\t\t\tthis._applyRemoteChangeSet(cloneDeep(content));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate addRemoteChange(change: IPropertyTreeMessage) {\n\t\tthis.remoteChanges.push(change);\n\t\tthis.updateRemoteHeadGuid();\n\t}\n\n\tprivate updateRemoteHeadGuid() {\n\t\tthis.headCommitGuid = this.remoteChanges.length > 0\n\t\t\t\t? this.remoteChanges[this.remoteChanges.length - 1].guid\n\t\t\t\t: this.headCommitGuid;\n\t}\n\n\tpublic static prune(\n\t\tminimumSequenceNumber: number,\n\t\tremoteChanges: IPropertyTreeMessage[],\n\t\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>,\n\t) {\n\t\t// for faster lookup of remote change guids\n\t\tconst remoteChangeMap = new Map<string, number>();\n\t\tremoteChanges.forEach((change, index) => {\n\t\t\tremoteChangeMap.set(change.guid, index);\n\t\t});\n\n\t\t// we will track visited nodes\n\t\tconst visitedUnrebasedRemoteChanges = new Set<string>();\n\t\tconst visitedRemoteChanges = new Set<string>();\n\n\t\tfor (const id of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tconst unrebasedChange = unrebasedRemoteChanges[id];\n\n\t\t\t// we are only interested in changes that are newer than the sequence number\n\t\t\t// and that were not yet visited previously\n\t\t\tif (\n\t\t\t\tunrebasedChange.sequenceNumber >= minimumSequenceNumber &&\n\t\t\t\t!visitedUnrebasedRemoteChanges.has(unrebasedChange.guid)\n\t\t\t) {\n\t\t\t\t// we visited that unrebased change and mark it as visited\n\t\t\t\tvisitedUnrebasedRemoteChanges.add(unrebasedChange.guid);\n\n\t\t\t\tlet visitor = unrebasedChange;\n\t\t\t\t// we will walk along the commit chain until we hit a remote change or a visited unrebased commit\n\t\t\t\t// at that point we can skip since we already traced the rest of the commit chain\n\t\t\t\twhile (\n\t\t\t\t\tvisitor.remoteHeadGuid !== visitor.referenceGuid ||\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.has(visitor.referenceGuid)\n\t\t\t\t) {\n\t\t\t\t\tconst guid = visitor.referenceGuid;\n\t\t\t\t\tif (guid === \"\") {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// since the change is not in remote it must be in unrebased\n\t\t\t\t\tvisitor = unrebasedRemoteChanges[visitor.referenceGuid];\n\t\t\t\t\tif (!visitor) {\n\t\t\t\t\t\tthrow new Error(`no visitor found for guid \"${guid}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.add(visitor.guid);\n\t\t\t\t}\n\t\t\t\t// if we exited the loop because we hit a remote change than add it as visited\n\t\t\t\tif (visitor.remoteHeadGuid === visitor.referenceGuid && remoteChangeMap.has(visitor.referenceGuid)) {\n\t\t\t\t\tvisitedRemoteChanges.add(visitor.referenceGuid);\n\t\t\t\t}\n\n\t\t\t\t// If we have a change that refers to the start of the history (remoteHeadGuid === \"\"), we have to\n\t\t\t\t// keep all remote Changes until this change has been processed\n\t\t\t\tif (visitor.remoteHeadGuid === \"\") {\n\t\t\t\t\tvisitedRemoteChanges.add(remoteChanges[0].guid);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlet pruned = 0;\n\t\t// we can now filter the unrebased changes by removing any changes\n\t\t// we have not visited at all during our traversal\n\t\tconst prunedUnrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\t\tfor (const key of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tif (visitedUnrebasedRemoteChanges.has(key)) {\n\t\t\t\tprunedUnrebasedRemoteChanges[key] = unrebasedRemoteChanges[key];\n\t\t\t} else {\n\t\t\t\tpruned++;\n\t\t\t}\n\t\t}\n\n\t\t// find minimum index\n\t\tconst minIndex = Math.min(...[...visitedRemoteChanges].map((key) => remoteChangeMap.get(key) as number));\n\n\t\tconst prunedRemoteChanges = remoteChanges.slice(minIndex);\n\t\tpruned += minIndex;\n\n\t\treturn {\n\t\t\tremoteChanges: prunedRemoteChanges,\n\t\t\tunrebasedRemoteChanges: prunedUnrebasedRemoteChanges,\n\t\t\tprunedCount: pruned,\n\t\t};\n\t}\n\tpublic pruneHistory() {\n\t\tconst msn = this.runtime.deltaManager.minimumSequenceNumber;\n\n\t\tconst { remoteChanges, unrebasedRemoteChanges } = SharedPropertyTree.prune(\n\t\t\tmsn,\n\t\t\tthis.remoteChanges,\n\t\t\tthis.unrebasedRemoteChanges,\n\t\t);\n\n\t\tthis.remoteChanges = remoteChanges;\n\t\tthis.unrebasedRemoteChanges = unrebasedRemoteChanges;\n\t}\n\n\t/**\n\t * This method encodes the local summary (snapshot) object into the serialized form.\n\t * @param summary - The local summary (snapshot)representation.\n\t * @returns The serialized summary representation.\n\t */\n\tprivate encodeSummary(summary: ISnapshotSummary) {\n\t\treturn this.propertyTreeConfig.encDec.summaryEncoder.encode(summary);\n\t}\n\n\t/**\n\t * This method decodes the serialized form of the summary into the local summary (snapshot) object.\n\t * @param serializedSummary - The serialized summary representation.\n\t * @returns The local summary (snapshot)representation.\n \t */\n\tprivate decodeSummary(serializedSummary): ISnapshotSummary {\n\t\treturn this.propertyTreeConfig.encDec.summaryEncoder.decode(serializedSummary);\n\t}\n\n\t/**\n \t * This method writes the log message if the logging is enabled in the extended DDS.\n\t * The logging is not enabled in the default Property DDS\n\t * @param message - The message to be logged.\n\t */\n\tprotected logIfEnabled(message) {}\n\n\t/**\n \t * This method encodes the binary representation of the\n \t * blob.\n\t * @param blob - The binary representation of the blob.\n\t * @returns The encoded representation of the blob.\n \t */\n\tprivate encodeSummaryBlob(blob: ArrayBuffer): any {\n\t\treturn bufferToString(blob, \"base64\");\n\t}\n\n\t/**\n \t * This method decodes the encoded representation of the\n\t * blob.\n \t * @param blob - The encoded representation of the blob.\n\t * @returns The binary representation of the blob.\n\t */\n\tprivate decodeSummaryBlob(encoded: any): ArrayBuffer {\n\t\tconst buffer = bufferToString(encoded, \"utf8\");\n\t\treturn stringToBuffer(buffer, \"base64\");\n\t}\n\n\tpublic summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tthis.pruneHistory();\n\t\tconst snapshot: ISnapshot = {\n\t\t\tbranchGuid: this.handle.absolutePath.split(\"/\").pop() as string,\n\t\t\tsummaryMinimumSequenceNumber: this.runtime.deltaManager.minimumSequenceNumber,\n\t\t\tuseMH: this.useMH,\n\t\t\tnumChunks: 0,\n\t\t};\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tif (!this.useMH) {\n\t\t\t// If the MH is not used, we have to include the tip view, the remote changes and the received\n\t\t\t// deltas to the summary\n\t\t\tconst summary: ISnapshotSummary = {\n\t\t\t\tremoteTipView: this.remoteTipView,\n\t\t\t\tremoteChanges: this.remoteChanges,\n\t\t\t\tremoteHeadGuid: this.headCommitGuid,\n\t\t\t\tunrebasedRemoteChanges: this.unrebasedRemoteChanges,\n\t\t\t};\n\n\t\t\tconst chunkSize = 5000 * 1024; // Default limit seems to be 5MB\n\t\t\tlet totalBlobsSize = 0;\n\t\t\tconst serializedSummary = this.encodeSummary(summary);\n\t\t\tfor (let pos = 0, i = 0; pos < serializedSummary.length; pos += chunkSize, i++) {\n\t\t\t\tconst summaryBlob = this.encodeSummaryBlob(serializedSummary.slice(pos, pos + chunkSize));\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\t\ttotalBlobsSize += summaryBlob[\"length\"];\n\t\t\t\tbuilder.addBlob(`summaryChunk_${i}`, summaryBlob);\n\t\t\t\tsnapshot.numChunks++;\n\t\t\t}\n\t\t\tthis.logIfEnabled(`Total blobs transfer size: ${totalBlobsSize}`);\n\t\t}\n\n\t\tbuilder.addBlob(\"properties\", serializer !== undefined\n\t\t\t? serializer.stringify(snapshot, this.handle)\n\t\t\t: JSON.stringify(snapshot));\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst runtime = this.runtime;\n\t\tconst handleTableChunk = await storage.readBlob(\"properties\");\n\t\tconst utf8 = bufferToString(handleTableChunk, \"utf8\");\n\n\t\tconst snapshot: ISnapshot = this.serializer.parse(utf8);\n\t\tthis.useMH = snapshot.useMH;\n\n\t\ttry {\n\t\t\tif (!snapshot.useMH) {\n\t\t\t\t// We load all chunks\n\t\t\t\tconst chunks: ArrayBufferLike[] = await Promise.all(\n\t\t\t\t\trange(snapshot.numChunks).map(async (i) => {\n\t\t\t\t\t\treturn this.decodeSummaryBlob(await storage.readBlob(`summaryChunk_${i}`));\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst totalLength = chunks.reduce((a, b) => a + b.byteLength, 0);\n\t\t\t\tconst serializedSummary = new Uint8Array(totalLength);\n\t\t\t\tchunks.reduce((offset, chunk) => {\n\t\t\t\t\tserializedSummary.set(new Uint8Array(chunk), offset);\n\t\t\t\t\treturn offset + chunk.byteLength;\n\t\t\t\t}, 0);\n\t\t\t\tconst snapshotSummary = this.decodeSummary(serializedSummary);\n\t\t\t\tif (\n\t\t\t\t\tsnapshotSummary.remoteChanges === undefined ||\n\t\t\t\t\tsnapshotSummary.remoteTipView === undefined ||\n\t\t\t\t\tsnapshotSummary.unrebasedRemoteChanges === undefined\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\"Invalid Snapshot.\");\n\t\t\t\t}\n\n\t\t\t\tif (snapshotSummary.remoteHeadGuid === undefined) {\n\t\t\t\t\t// The summary does not contain a remoteHeadGuid. This means the summary has\n\t\t\t\t\t// been created by an old version of PropertyDDS, that did not yet have this patch.\n\t\t\t\t\tsnapshotSummary.remoteHeadGuid = (snapshotSummary.remoteChanges.length > 0) ?\n\t\t\t\t\t\t\t// If there are remote changes in the\n\t\t\t\t\t\t\t// summary we can deduce the head GUID from these changes.\n\t\t\t\t\t\t\tsnapshotSummary.remoteChanges[snapshotSummary.remoteChanges.length - 1].guid :\n\n\t\t\t\t\t\t\t// If no remote head GUID is available, we will fall back to the old behaviour,\n\t\t\t\t\t\t\t// where the head GUID was set to an empty string. However, this could lead to\n\t\t\t\t\t\t\t// divergence between the clients, if there is still a client in the session\n\t\t\t\t\t\t\t// that is using a version of this library without this patch and which\n\t\t\t\t\t\t\t// has started the session at a different summary.\n\t\t\t\t\t\t\t\"\";\n\t\t\t\t}\n\n\t\t\t\tthis.remoteTipView = snapshotSummary.remoteTipView;\n\t\t\t\tthis.remoteChanges = snapshotSummary.remoteChanges;\n\t\t\t\tthis.unrebasedRemoteChanges = snapshotSummary.unrebasedRemoteChanges;\n\t\t\t\tthis.headCommitGuid = snapshotSummary.remoteHeadGuid;\n\t\t\t\tconst isPartialCheckoutActive = !!(this.options.clientFiltering && this.options.paths);\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tthis.remoteTipView = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\tthis.remoteTipView,\n\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\n\t\t\t\tthis.skipSequenceNumber = 0;\n\t\t\t} else {\n\t\t\t\tconst { branchGuid, summaryMinimumSequenceNumber } = snapshot;\n\t\t\t\tconst branchResponse = await axios.get(`http://localhost:3000/branch/${branchGuid}`);\n\t\t\t\tthis.headCommitGuid = branchResponse.data.headCommitGuid;\n\t\t\t\tconst {\n\t\t\t\t\tcommit: { meta: commitMetadata },\n\t\t\t\t} = (await axios.get(`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}`)).data;\n\t\t\t\tlet { changeSet: materializedView } = (\n\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}/materializedView`,\n\t\t\t\t\t)\n\t\t\t\t).data;\n\n\t\t\t\tconst isPartialCheckoutActive = this.options.clientFiltering && this.options.paths;\n\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tmaterializedView = ChangeSetUtils.getFilteredChangeSetByPaths(materializedView, this.options.paths);\n\t\t\t\t}\n\n\t\t\t\tthis.tipView = materializedView;\n\t\t\t\tthis.remoteTipView = cloneDeep(this.tipView);\n\t\t\t\tthis.remoteChanges = [];\n\n\t\t\t\tlet missingDeltas: ISequencedDocumentMessage[] = [];\n\t\t\t\tconst firstDelta = Math.min(commitMetadata.minimumSequenceNumber, summaryMinimumSequenceNumber);\n\t\t\t\tconst lastDelta = commitMetadata.sequenceNumber;\n\n\t\t\t\tconst dm = (this.runtime.deltaManager as any).deltaManager;\n\t\t\t\tawait dm.getDeltas(\"DocumentOpen\", firstDelta, lastDelta, (messages: ISequencedDocumentMessage[]) => {\n\t\t\t\t\tmissingDeltas = messages.filter((x) => x.type === \"op\");\n\t\t\t\t});\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\t\t\tfor (let i = 0; i < missingDeltas.length; i++) {\n\t\t\t\t\tif (missingDeltas[i].sequenceNumber < commitMetadata.sequenceNumber) {\n\t\t\t\t\t\tconst remoteChange: IPropertyTreeMessage\n\t\t\t\t\t\t\t= JSON.parse(missingDeltas[i].contents).contents.contents.content.contents;\n\t\t\t\t\t\tconst { changeSet } = (\n\t\t\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${remoteChange.guid}/changeSet`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t).data;\n\t\t\t\t\t\tremoteChange.changeSet = changeSet;\n\n\t\t\t\t\t\tif (remoteChange) {\n\t\t\t\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\t\t\t\tremoteChange.changeSet = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\t\t\t\tremoteChange.changeSet,\n\t\t\t\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.addRemoteChange(remoteChange);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.processCore(missingDeltas[i], false, {});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.skipSequenceNumber = lastDelta ?? -1;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.tipView = {};\n\t\t\tthis.remoteTipView = {};\n\t\t\tthis.remoteChanges = [];\n\t\t} finally {\n\t\t\tthis._root.deserialize(this.tipView, undefined, false, false);\n\t\t\tconst _changeSet = new ChangeSet(this.tipView);\n\t\t\tif (!isEmpty(_changeSet.getSerializedChangeSet())) {\n\t\t\t\tthis.emit(\"localModification\", _changeSet);\n\t\t\t}\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\tprotected onDisconnect() { }\n\n\tprivate _applyLocalChangeSet(change: IPropertyTreeMessage) {\n\t\tconst changeSetWrapper = new ChangeSet(this.tipView);\n\t\tchangeSetWrapper.applyChangeSet(change.changeSet);\n\n\t\tif (this.runtime.attachState === AttachState.Detached) {\n\t\t\tconst remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);\n\t\t\tremoteChangeSetWrapper.applyChangeSet(change.changeSet);\n\t\t} else {\n\t\t\tthis.localChanges.push(change);\n\t\t}\n\t}\n\n\tprivate _applyRemoteChangeSet(change: IRemotePropertyTreeMessage) {\n\t\tthis.unrebasedRemoteChanges[change.guid] = cloneDeep(change);\n\n\t\t// This is the first message in the history of the document.\n\t\tif (this.remoteChanges.length !== 0) {\n\t\t\trebaseToRemoteChanges(\n\t\t\t\tchange,\n\t\t\t\tthis.getUnrebasedChange.bind(this),\n\t\t\t\tthis.getRebasedChanges.bind(this),\n\t\t\t);\n\t\t}\n\n\t\tthis.addRemoteChange(change);\n\t\t// Apply the remote change set to the remote tip view\n\t\tconst remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);\n\t\tremoteChangeSetWrapper.applyChangeSet(change.changeSet);\n\n\t\t// Rebase the local changes\n\t\tconst pendingChanges = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\tnew ChangeSet(pendingChanges)._toReversibleChangeSet(this.tipView);\n\n\t\tconst changesToTip: SerializedChangeSet = {};\n\t\tconst changesNeeded = this.rebaseLocalChanges(change, pendingChanges, changesToTip);\n\n\t\tif (changesNeeded) {\n\t\t\tthis.pushNotificationDelayScope();\n\t\t\t// Checkout the new tip\n\t\t\tthis._root.applyChangeSet(changesToTip);\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\t\tthis._root.applyChangeSet(pendingChanges);\n\t\t\tthis.popNotificationDelayScope();\n\t\t}\n\n\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t// assert(JSON.stringify(this.root.serialize()) === JSON.stringify(this.tipView));\n\t}\n\n\tgetUnrebasedChange(guid: string) {\n\t\treturn this.unrebasedRemoteChanges[guid];\n\t}\n\n\tgetRebasedChanges(startGuid: string, endGuid?: string) {\n\t\tconst startIndex = findIndex(this.remoteChanges, (c) => c.guid === startGuid);\n\t\tif (endGuid !== undefined) {\n\t\t\tconst endIndex = findIndex(this.remoteChanges, (c) => c.guid === endGuid);\n\t\t\treturn this.remoteChanges.slice(startIndex + 1, endIndex + 1);\n\t\t}\n\t\treturn this.remoteChanges.slice(startIndex + 1);\n\t}\n\n\tprivate rebaseLocalChanges(\n\t\tchange: IPropertyTreeMessage,\n\t\tpendingChanges: SerializedChangeSet,\n\t\tnewTipDelta: SerializedChangeSet,\n\t): boolean {\n\t\tlet rebaseBaseChangeSet = cloneDeep(change.changeSet);\n\n\t\tconst accumulatedChanges: SerializedChangeSet = {};\n\t\tconst conflicts = [] as any[];\n\n\t\tif (this.localChanges.length > 0 && this.localChanges[0].guid === change.guid) {\n\t\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t\t// assert(JSON.stringify(this.localChanges[0].changeSet) === JSON.stringify(change.changeSet),\n\t\t\t// \"Local change different than rebased remote change.\");\n\n\t\t\t// If we got a confirmation of the commit on the tip of the localChanges array,\n\t\t\t// there will be no update of the tip view at all. We just move it from local changes\n\t\t\t// to remote changes\n\t\t\tthis.localChanges.shift();\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\tfor (let i = 0; i < this.localChanges.length; i++) {\n\t\t\t// Make sure we never receive changes out of order\n\t\t\tconsole.assert(this.localChanges[i].guid !== change.guid);\n\n\t\t\tconst rebaseMetaInformation = new Map();\n\n\t\t\tconst copiedChangeSet = new ChangeSet(cloneDeep(this.localChanges[i].changeSet));\n\t\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(this.localChanges[i].changeSet, conflicts, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\n\t\t\tcopiedChangeSet.toInverseChangeSet();\n\t\t\tcopiedChangeSet.applyChangeSet(rebaseBaseChangeSet);\n\t\t\tcopiedChangeSet.applyChangeSet(this.localChanges[i].changeSet, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\t\t\trebaseBaseChangeSet = copiedChangeSet.getSerializedChangeSet();\n\n\t\t\tnew ChangeSet(accumulatedChanges).applyChangeSet(this.localChanges[i].changeSet);\n\t\t}\n\n\t\t// Compute the inverse of the pending changes and store the result in newTipDelta\n\t\tconst pendingChangesRebaseMetaInformation = new Map();\n\t\tconst deltaToTipCS = new ChangeSet(newTipDelta);\n\t\tdeltaToTipCS.applyChangeSet(pendingChanges);\n\t\tdeltaToTipCS.toInverseChangeSet();\n\n\t\t// Perform a rebase of the pending changes\n\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(pendingChanges, conflicts, {\n\t\t\tapplyAfterMetaInformation: pendingChangesRebaseMetaInformation,\n\t\t});\n\n\t\t// Compute the delta between the old tip (including pending changes)\n\t\t// and the new tip (not including the rebased pending changes)\n\t\tdeltaToTipCS.applyChangeSet(rebaseBaseChangeSet);\n\n\t\t// Update the tip view\n\t\tif (!this.tipView) {\n\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\t\t\tconst changeSet = new ChangeSet(this.tipView);\n\t\t\tchangeSet.applyChangeSet(accumulatedChanges);\n\t\t} else {\n\t\t\tnew ChangeSet(this.tipView).applyChangeSet(newTipDelta);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprotected applyStashedOp() {\n\t\tthrow new Error(\"not implemented\");\n\t}\n}\n"]}
1
+ {"version":3,"file":"propertyTree.js","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable import/no-internal-modules */\nimport isEmpty from \"lodash/isEmpty\";\nimport findIndex from \"lodash/findIndex\";\nimport find from \"lodash/find\";\nimport isEqual from \"lodash/isEqual\";\nimport range from \"lodash/range\";\nimport { copy as cloneDeep } from \"fastest-json-copy\";\nimport { Packr } from \"msgpackr\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\n\nimport { bufferToString, stringToBuffer } from \"@fluidframework/common-utils\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\n\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\n\nimport { PropertyFactory, BaseProperty, NodeProperty } from \"@fluid-experimental/property-properties\";\n\nimport { v4 as uuidv4 } from \"uuid\";\nimport axios from \"axios\";\nimport { PropertyTreeFactory } from \"./propertyTreeFactory\";\n\nexport type SerializedChangeSet = any;\n\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\nexport interface IPropertyTreeMessage {\n\top: OpKind;\n\tchangeSet: SerializedChangeSet;\n\tmetadata: Metadata;\n\tguid: string;\n\treferenceGuid: string;\n\tremoteHeadGuid: string;\n\tlocalBranchStart: string | undefined;\n\trebaseMetaInformation?: Map<any, any>;\n\tuseMH?: boolean;\n}\n\nexport interface IRemotePropertyTreeMessage extends IPropertyTreeMessage {\n\tsequenceNumber: number;\n}\ninterface ISnapshot {\n\tbranchGuid: string;\n\tsummaryMinimumSequenceNumber: number;\n\tuseMH: boolean;\n\tnumChunks: number;\n}\nexport interface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n\tremoteHeadGuid: string;\n}\n\nexport interface SharedPropertyTreeOptions {\n\tpaths?: string[];\n\tclientFiltering?: boolean;\n\tuseMH?: boolean;\n\tdisablePartialCheckout?: boolean;\n}\n\nexport interface ISharedPropertyTreeEncDec {\n\tmessageEncoder: { encode: (IPropertyTreeMessage) => IPropertyTreeMessage;\n\t\tdecode: (IPropertyTreeMessage) => IPropertyTreeMessage; };\n\tsummaryEncoder: { encode: (ISnapshotSummary) => Buffer; decode: (Buffer) => ISnapshotSummary; };\n}\n\nexport interface IPropertyTreeConfig {\n\tencDec: ISharedPropertyTreeEncDec;\n}\n\nconst defaultEncDec: ISharedPropertyTreeEncDec = {\n\tmessageEncoder: { encode: (msg: IPropertyTreeMessage) => msg,\n\t\tdecode: (msg: IPropertyTreeMessage) => msg },\n\tsummaryEncoder: {\n\t\tencode: (summary: ISnapshotSummary) => {\n\t\t\tconst packr = new Packr();\n\t\t\tconst serializedSummary = packr.pack(summary);\n\t\t\treturn serializedSummary;\n\t\t},\n\t\tdecode: (serializedSummary) => {\n\t\t\tconst packr = new Packr();\n\t\t\tconst snapshotSummary = packr.unpack(serializedSummary);\n\t\t\treturn snapshotSummary as ISnapshotSummary;\n\t\t},\n\t},\n};\n\n/**\n * Silly DDS example that models a six sided die.\n *\n * Unlike the typical 'Dice Roller' example where clients clobber each other's last roll in a\n * SharedMap, this 'SharedDie' DDS works by advancing an internal PRNG each time it sees a 'roll'\n * operation.\n *\n * Because all clients are using the same PRNG starting in the same state, they arrive at\n * consensus by simply applying the same number of rolls. (A fun addition would be logging\n * who received which roll, which would need to change as clients learn how races are resolved\n * in the total order)\n */\nexport class SharedPropertyTree extends SharedObject {\n\ttipView: SerializedChangeSet = {};\n\tremoteTipView: SerializedChangeSet = {};\n\tlocalChanges: IPropertyTreeMessage[] = [];\n\tremoteChanges: IPropertyTreeMessage[] = [];\n\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\ttransmissionsHaveBeenStopped = false;\n\tenqueuedMessages: IPropertyTreeMessage[] = [];\n\tnotificationDelayScope: number = 0;\n\t_root: any = PropertyFactory.create(\"NodeProperty\");\n\toptions: SharedPropertyTreeOptions;\n\tskipSequenceNumber: number = -1;\n\theadCommitGuid: string = \"\";\n\tuseMH: boolean = false;\n\tpropertyTreeConfig: IPropertyTreeConfig;\n\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\toptions: SharedPropertyTreeOptions,\n\t\tpropertyTreeConfig: IPropertyTreeConfig = { encDec: defaultEncDec },\n\t) {\n\t\tsuper(id, runtime, attributes, \"fluid_propertyTree_\");\n\n\t\tthis.options = options;\n\t\t// Quick hack to let the root be aware of the DDS hosting it.\n\t\tthis._root._tree = this;\n\n\t\t// By default, we currently don't use the MH\n\t\tthis.useMH = options.useMH ?? false;\n\t\tthis.propertyTreeConfig = propertyTreeConfig;\n\t}\n\n\t/**\n\t * Create a new shared cell\n\t *\n\t * @param runtime - data store runtime the new shared map belongs to\n\t * @param id - optional name of the shared map\n\t * @returns newly create shared map (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string, queryString?: string) {\n\t\treturn runtime.createChannel(id, PropertyTreeFactory.Type) as SharedPropertyTree;\n\t}\n\n\t/**\n\t * Get a factory for SharedDie to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedDie\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new PropertyTreeFactory();\n\t}\n\n\t/**\n\t * in case of partial checkout we want to send the paths we are interested in once we are connected\n\t */\n\tprotected onConnect() {\n\t\t// on connect we scope all deltas such that we only get relevant changes\n\t\t// since we know the paths already at constuction time this is okay\n\t\tthis.scopeFutureDeltasToPaths(this.options.paths);\n\t}\n\n\tprivate scopeFutureDeltasToPaths(paths?: string[]) {\n\t\t// Backdoor to emit \"partial_checkout\" events on the socket. The delta manager at container runtime layer is\n\t\t// a proxy and the delta manager at the container context layer is yet another proxy, so account for that.\n\t\tif (!this.options.disablePartialCheckout) {\n\t\t\tlet dm = (this.runtime.deltaManager as any).deltaManager;\n\t\t\tif (dm.deltaManager !== undefined) {\n\t\t\t\tdm = dm.deltaManager;\n\t\t\t}\n\t\t\tconst socket = dm.connectionManager.connection.socket;\n\t\t\tsocket.emit(\"partial_checkout\", { paths });\n\t\t}\n\t}\n\n\tpublic _reportDirtinessToView() {\n\t\t// Check whether anybody is listening. If not, we don't want to pay the price\n\t\t// for the serialization of the data structure\n\t\tif (this.listenerCount(\"localModification\") > 0) {\n\t\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t\tconst _changeSet = new ChangeSet(changes);\n\t\t\tif (!isEmpty(_changeSet.getSerializedChangeSet())) {\n\t\t\t\tthis.emit(\"localModification\", _changeSet);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t}\n\t}\n\n\tpublic get changeSet(): SerializedChangeSet {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\treturn this.tipView;\n\t}\n\n\tpublic get activeCommit(): IPropertyTreeMessage {\n\t\treturn this.localChanges.length > 0\n\t\t\t? this.localChanges[this.localChanges.length - 1]\n\t\t\t: this.remoteChanges[this.remoteChanges.length - 1];\n\t}\n\tpublic get root(): NodeProperty {\n\t\treturn this._root as NodeProperty;\n\t}\n\n\tpublic commit(metadata?: Metadata, submitEmptyChange?: boolean) {\n\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\n\t\tlet doSubmit = !!submitEmptyChange;\n\n\t\t// if no override provided dont submit unless metadata are provided\n\t\tif (submitEmptyChange === undefined) {\n\t\t\tdoSubmit = metadata !== undefined;\n\t\t}\n\n\t\tif (doSubmit || !isEmpty(changes)) {\n\t\t\tthis.applyChangeSet(changes, metadata || {});\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\t/**\n\t * This method encodes the given message to the transfer form\n\t * @param change - The message to be encoded.\n \t */\n\tprivate encodeMessage(change: IPropertyTreeMessage): IPropertyTreeMessage {\n\t\treturn this.propertyTreeConfig.encDec.messageEncoder.encode(change);\n\t}\n\n\t/**\n \t * This method decodes message from the transfer form.\n\t * @param transferChange - The message to be decoded.\n\t \t */\n\tprivate decodeMessage(transferChange: IPropertyTreeMessage): IPropertyTreeMessage {\n\t\treturn this.propertyTreeConfig.encDec.messageEncoder.decode(transferChange);\n\t}\n\n\tprivate applyChangeSet(changeSet: SerializedChangeSet, metadata: Metadata) {\n\t\tconst _changeSet = new ChangeSet(changeSet);\n\t\t_changeSet._toReversibleChangeSet(this.tipView);\n\n\t\tthis.updateRemoteHeadGuid();\n\n\t\tconst change = {\n\t\t\top: OpKind.ChangeSet,\n\t\t\tchangeSet,\n\t\t\tmetadata,\n\t\t\tguid: uuidv4(),\n\t\t\tremoteHeadGuid: this.headCommitGuid,\n\t\t\treferenceGuid:\n\t\t\t\tthis.localChanges.length > 0\n\t\t\t\t? this.localChanges[this.localChanges.length - 1].guid\n\t\t\t\t: this.headCommitGuid,\n\t\t\tlocalBranchStart: this.localChanges.length > 0 ? this.localChanges[0].guid : undefined,\n\t\t\tuseMH: this.useMH,\n\t\t};\n\t\tthis._applyLocalChangeSet(change);\n\t\t// Queue the op for transmission to the Fluid service.\n\t\tconst transferChange = this.encodeMessage(cloneDeep(change));\n\t\tif (this.transmissionsHaveBeenStopped) {\n\t\t\tthis.enqueuedMessages.push(transferChange);\n\t\t} else {\n\t\t\tthis.submitLocalMessage(transferChange);\n\t\t}\n\t}\n\n\tstopTransmission(stop: boolean) {\n\t\tthis.transmissionsHaveBeenStopped = stop;\n\t\tif (stop === false) {\n\t\t\tfor (const message of this.enqueuedMessages) {\n\t\t\t\tthis.submitLocalMessage(message);\n\t\t\t}\n\t\t\tthis.enqueuedMessages = [];\n\t\t}\n\t}\n\t/**\n\t * Delays notifications until popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic pushNotificationDelayScope() {\n\t\t// set the scope counter\n\t\tthis.notificationDelayScope++;\n\n\t\t// If we reach 0, we have to report unreported changes\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tthis._root._reportDirtinessToView();\n\t\t}\n\t}\n\n\t/**\n\t * Re-enables notifications when popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic popNotificationDelayScope() {\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tconsole.error(\"Unbalanced push/pop calls.\");\n\t\t}\n\t\tthis.notificationDelayScope--;\n\t\tthis._root._reportDirtinessToView();\n\t}\n\n\t/**\n\t * Process an operation\n\t *\n\t * @param message - the message to prepare\n\t * @param local - whether the message was sent by the local client\n\t * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.\n\t * For messages from a remote client, this will be undefined.\n\t */\n\tprotected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\tif (message.type === MessageType.Operation && message.sequenceNumber > this.skipSequenceNumber) {\n\t\t\tconst change: IPropertyTreeMessage = this.decodeMessage(cloneDeep(message.contents));\n\t\t\tconst content: IRemotePropertyTreeMessage = { ...change, sequenceNumber: message.sequenceNumber };\n\t\t\tswitch (content.op) {\n\t\t\t\tcase OpKind.ChangeSet:\n\t\t\t\t\t// If the op originated locally from this client, we've already accounted for it\n\t\t\t\t\t// by advancing the state. Otherwise, advance the PRNG now.\n\t\t\t\t\tthis._applyRemoteChangeSet(cloneDeep(content));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate addRemoteChange(change: IPropertyTreeMessage) {\n\t\tthis.remoteChanges.push(change);\n\t\tthis.updateRemoteHeadGuid();\n\t}\n\n\tprivate updateRemoteHeadGuid() {\n\t\tthis.headCommitGuid = this.remoteChanges.length > 0\n\t\t\t\t? this.remoteChanges[this.remoteChanges.length - 1].guid\n\t\t\t\t: this.headCommitGuid;\n\t}\n\n\tpublic static prune(\n\t\tminimumSequenceNumber: number,\n\t\tremoteChanges: IPropertyTreeMessage[],\n\t\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>,\n\t) {\n\t\t// for faster lookup of remote change guids\n\t\tconst remoteChangeMap = new Map<string, number>();\n\t\tremoteChanges.forEach((change, index) => {\n\t\t\tremoteChangeMap.set(change.guid, index);\n\t\t});\n\n\t\t// we will track visited nodes\n\t\tconst visitedUnrebasedRemoteChanges = new Set<string>();\n\t\tconst visitedRemoteChanges = new Set<string>();\n\n\t\tfor (const id of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tconst unrebasedChange = unrebasedRemoteChanges[id];\n\n\t\t\t// we are only interested in changes that are newer than the sequence number\n\t\t\t// and that were not yet visited previously\n\t\t\tif (\n\t\t\t\tunrebasedChange.sequenceNumber >= minimumSequenceNumber &&\n\t\t\t\t!visitedUnrebasedRemoteChanges.has(unrebasedChange.guid)\n\t\t\t) {\n\t\t\t\t// we visited that unrebased change and mark it as visited\n\t\t\t\tvisitedUnrebasedRemoteChanges.add(unrebasedChange.guid);\n\n\t\t\t\tlet visitor = unrebasedChange;\n\t\t\t\t// we will walk along the commit chain until we hit a remote change or a visited unrebased commit\n\t\t\t\t// at that point we can skip since we already traced the rest of the commit chain\n\t\t\t\twhile (\n\t\t\t\t\tvisitor.remoteHeadGuid !== visitor.referenceGuid ||\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.has(visitor.referenceGuid)\n\t\t\t\t) {\n\t\t\t\t\tconst guid = visitor.referenceGuid;\n\t\t\t\t\tif (guid === \"\") {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// since the change is not in remote it must be in unrebased\n\t\t\t\t\tvisitor = unrebasedRemoteChanges[visitor.referenceGuid];\n\t\t\t\t\tif (!visitor) {\n\t\t\t\t\t\tthrow new Error(`no visitor found for guid \"${guid}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.add(visitor.guid);\n\t\t\t\t}\n\t\t\t\t// if we exited the loop because we hit a remote change than add it as visited\n\t\t\t\tif (visitor.remoteHeadGuid === visitor.referenceGuid && remoteChangeMap.has(visitor.referenceGuid)) {\n\t\t\t\t\tvisitedRemoteChanges.add(visitor.referenceGuid);\n\t\t\t\t}\n\n\t\t\t\t// If we have a change that refers to the start of the history (remoteHeadGuid === \"\"), we have to\n\t\t\t\t// keep all remote Changes until this change has been processed\n\t\t\t\tif (visitor.remoteHeadGuid === \"\") {\n\t\t\t\t\tvisitedRemoteChanges.add(remoteChanges[0].guid);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlet pruned = 0;\n\t\t// we can now filter the unrebased changes by removing any changes\n\t\t// we have not visited at all during our traversal\n\t\tconst prunedUnrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\t\tfor (const key of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tif (visitedUnrebasedRemoteChanges.has(key)) {\n\t\t\t\tprunedUnrebasedRemoteChanges[key] = unrebasedRemoteChanges[key];\n\t\t\t} else {\n\t\t\t\tpruned++;\n\t\t\t}\n\t\t}\n\n\t\t// find minimum index\n\t\tconst minIndex = Math.min(...[...visitedRemoteChanges].map((key) => remoteChangeMap.get(key) as number));\n\n\t\tconst prunedRemoteChanges = remoteChanges.slice(minIndex);\n\t\tpruned += minIndex;\n\n\t\treturn {\n\t\t\tremoteChanges: prunedRemoteChanges,\n\t\t\tunrebasedRemoteChanges: prunedUnrebasedRemoteChanges,\n\t\t\tprunedCount: pruned,\n\t\t};\n\t}\n\tpublic pruneHistory() {\n\t\tconst msn = this.runtime.deltaManager.minimumSequenceNumber;\n\n\t\tconst { remoteChanges, unrebasedRemoteChanges } = SharedPropertyTree.prune(\n\t\t\tmsn,\n\t\t\tthis.remoteChanges,\n\t\t\tthis.unrebasedRemoteChanges,\n\t\t);\n\n\t\tthis.remoteChanges = remoteChanges;\n\t\tthis.unrebasedRemoteChanges = unrebasedRemoteChanges;\n\t}\n\n\t/**\n\t * This method encodes the local summary (snapshot) object into the serialized form.\n\t * @param summary - The local summary (snapshot)representation.\n\t * @returns The serialized summary representation.\n\t */\n\tprivate encodeSummary(summary: ISnapshotSummary) {\n\t\treturn this.propertyTreeConfig.encDec.summaryEncoder.encode(summary);\n\t}\n\n\t/**\n\t * This method decodes the serialized form of the summary into the local summary (snapshot) object.\n\t * @param serializedSummary - The serialized summary representation.\n\t * @returns The local summary (snapshot)representation.\n \t */\n\tprivate decodeSummary(serializedSummary): ISnapshotSummary {\n\t\treturn this.propertyTreeConfig.encDec.summaryEncoder.decode(serializedSummary);\n\t}\n\n\t/**\n \t * This method writes the log message if the logging is enabled in the extended DDS.\n\t * The logging is not enabled in the default Property DDS\n\t * @param message - The message to be logged.\n\t */\n\tprotected logIfEnabled(message) {}\n\n\t/**\n \t * This method encodes the binary representation of the\n \t * blob.\n\t * @param blob - The binary representation of the blob.\n\t * @returns The encoded representation of the blob.\n \t */\n\tprivate encodeSummaryBlob(blob: ArrayBuffer): any {\n\t\treturn bufferToString(blob, \"base64\");\n\t}\n\n\t/**\n \t * This method decodes the encoded representation of the\n\t * blob.\n \t * @param blob - The encoded representation of the blob.\n\t * @returns The binary representation of the blob.\n\t */\n\tprivate decodeSummaryBlob(encoded: any): ArrayBuffer {\n\t\tconst buffer = bufferToString(encoded, \"utf8\");\n\t\treturn stringToBuffer(buffer, \"base64\");\n\t}\n\n\tpublic summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tthis.pruneHistory();\n\t\tconst snapshot: ISnapshot = {\n\t\t\tbranchGuid: this.handle.absolutePath.split(\"/\").pop() as string,\n\t\t\tsummaryMinimumSequenceNumber: this.runtime.deltaManager.minimumSequenceNumber,\n\t\t\tuseMH: this.useMH,\n\t\t\tnumChunks: 0,\n\t\t};\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tif (!this.useMH) {\n\t\t\t// If the MH is not used, we have to include the tip view, the remote changes and the received\n\t\t\t// deltas to the summary\n\t\t\tconst summary: ISnapshotSummary = {\n\t\t\t\tremoteTipView: this.remoteTipView,\n\t\t\t\tremoteChanges: this.remoteChanges,\n\t\t\t\tremoteHeadGuid: this.headCommitGuid,\n\t\t\t\tunrebasedRemoteChanges: this.unrebasedRemoteChanges,\n\t\t\t};\n\n\t\t\tconst chunkSize = 5000 * 1024; // Default limit seems to be 5MB\n\t\t\tlet totalBlobsSize = 0;\n\t\t\tconst serializedSummary = this.encodeSummary(summary);\n\t\t\tfor (let pos = 0, i = 0; pos < serializedSummary.length; pos += chunkSize, i++) {\n\t\t\t\tconst summaryBlob = this.encodeSummaryBlob(serializedSummary.slice(pos, pos + chunkSize));\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\t\ttotalBlobsSize += summaryBlob[\"length\"];\n\t\t\t\tbuilder.addBlob(`summaryChunk_${i}`, summaryBlob);\n\t\t\t\tsnapshot.numChunks++;\n\t\t\t}\n\t\t\tthis.logIfEnabled(`Total blobs transfer size: ${totalBlobsSize}`);\n\t\t}\n\n\t\tbuilder.addBlob(\"properties\", serializer !== undefined\n\t\t\t? serializer.stringify(snapshot, this.handle)\n\t\t\t: JSON.stringify(snapshot));\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst runtime = this.runtime;\n\t\tconst handleTableChunk = await storage.readBlob(\"properties\");\n\t\tconst utf8 = bufferToString(handleTableChunk, \"utf8\");\n\n\t\tconst snapshot: ISnapshot = this.serializer.parse(utf8);\n\t\tthis.useMH = snapshot.useMH;\n\n\t\ttry {\n\t\t\tif (!snapshot.useMH) {\n\t\t\t\t// We load all chunks\n\t\t\t\tconst chunks: ArrayBufferLike[] = await Promise.all(\n\t\t\t\t\trange(snapshot.numChunks).map(async (i) => {\n\t\t\t\t\t\treturn this.decodeSummaryBlob(await storage.readBlob(`summaryChunk_${i}`));\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst totalLength = chunks.reduce((a, b) => a + b.byteLength, 0);\n\t\t\t\tconst serializedSummary = new Uint8Array(totalLength);\n\t\t\t\tchunks.reduce((offset, chunk) => {\n\t\t\t\t\tserializedSummary.set(new Uint8Array(chunk), offset);\n\t\t\t\t\treturn offset + chunk.byteLength;\n\t\t\t\t}, 0);\n\t\t\t\tconst snapshotSummary = this.decodeSummary(serializedSummary);\n\t\t\t\tif (\n\t\t\t\t\tsnapshotSummary.remoteChanges === undefined ||\n\t\t\t\t\tsnapshotSummary.remoteTipView === undefined ||\n\t\t\t\t\tsnapshotSummary.unrebasedRemoteChanges === undefined\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\"Invalid Snapshot.\");\n\t\t\t\t}\n\n\t\t\t\tif (snapshotSummary.remoteHeadGuid === undefined) {\n\t\t\t\t\t// The summary does not contain a remoteHeadGuid. This means the summary has\n\t\t\t\t\t// been created by an old version of PropertyDDS, that did not yet have this patch.\n\t\t\t\t\tsnapshotSummary.remoteHeadGuid = (snapshotSummary.remoteChanges.length > 0) ?\n\t\t\t\t\t\t\t// If there are remote changes in the\n\t\t\t\t\t\t\t// summary we can deduce the head GUID from these changes.\n\t\t\t\t\t\t\tsnapshotSummary.remoteChanges[snapshotSummary.remoteChanges.length - 1].guid :\n\n\t\t\t\t\t\t\t// If no remote head GUID is available, we will fall back to the old behaviour,\n\t\t\t\t\t\t\t// where the head GUID was set to an empty string. However, this could lead to\n\t\t\t\t\t\t\t// divergence between the clients, if there is still a client in the session\n\t\t\t\t\t\t\t// that is using a version of this library without this patch and which\n\t\t\t\t\t\t\t// has started the session at a different summary.\n\t\t\t\t\t\t\t\"\";\n\t\t\t\t}\n\n\t\t\t\tthis.remoteTipView = snapshotSummary.remoteTipView;\n\t\t\t\tthis.remoteChanges = snapshotSummary.remoteChanges;\n\t\t\t\tthis.unrebasedRemoteChanges = snapshotSummary.unrebasedRemoteChanges;\n\t\t\t\tthis.headCommitGuid = snapshotSummary.remoteHeadGuid;\n\t\t\t\tconst isPartialCheckoutActive = !!(this.options.clientFiltering && this.options.paths);\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tthis.remoteTipView = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\tthis.remoteTipView,\n\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\n\t\t\t\tthis.skipSequenceNumber = 0;\n\t\t\t} else {\n\t\t\t\tconst { branchGuid, summaryMinimumSequenceNumber } = snapshot;\n\t\t\t\tconst branchResponse = await axios.get(`http://localhost:3000/branch/${branchGuid}`);\n\t\t\t\tthis.headCommitGuid = branchResponse.data.headCommitGuid;\n\t\t\t\tconst {\n\t\t\t\t\tcommit: { meta: commitMetadata },\n\t\t\t\t} = (await axios.get(`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}`)).data;\n\t\t\t\tlet { changeSet: materializedView } = (\n\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}/materializedView`,\n\t\t\t\t\t)\n\t\t\t\t).data;\n\n\t\t\t\tconst isPartialCheckoutActive = this.options.clientFiltering && this.options.paths;\n\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tmaterializedView = ChangeSetUtils.getFilteredChangeSetByPaths(materializedView, this.options.paths);\n\t\t\t\t}\n\n\t\t\t\tthis.tipView = materializedView;\n\t\t\t\tthis.remoteTipView = cloneDeep(this.tipView);\n\t\t\t\tthis.remoteChanges = [];\n\n\t\t\t\tlet missingDeltas: ISequencedDocumentMessage[] = [];\n\t\t\t\tconst firstDelta = Math.min(commitMetadata.minimumSequenceNumber, summaryMinimumSequenceNumber);\n\t\t\t\tconst lastDelta = commitMetadata.sequenceNumber;\n\n\t\t\t\tconst dm = (this.runtime.deltaManager as any).deltaManager;\n\t\t\t\tawait dm.getDeltas(\"DocumentOpen\", firstDelta, lastDelta, (messages: ISequencedDocumentMessage[]) => {\n\t\t\t\t\tmissingDeltas = messages.filter((x) => x.type === \"op\");\n\t\t\t\t});\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\t\t\tfor (let i = 0; i < missingDeltas.length; i++) {\n\t\t\t\t\tif (missingDeltas[i].sequenceNumber < commitMetadata.sequenceNumber) {\n\t\t\t\t\t\tconst remoteChange: IPropertyTreeMessage\n\t\t\t\t\t\t\t= JSON.parse(missingDeltas[i].contents).contents.contents.content.contents;\n\t\t\t\t\t\tconst { changeSet } = (\n\t\t\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${remoteChange.guid}/changeSet`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t).data;\n\t\t\t\t\t\tremoteChange.changeSet = changeSet;\n\n\t\t\t\t\t\tif (remoteChange) {\n\t\t\t\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\t\t\t\tremoteChange.changeSet = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\t\t\t\tremoteChange.changeSet,\n\t\t\t\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.addRemoteChange(remoteChange);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.processCore(missingDeltas[i], false, {});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.skipSequenceNumber = lastDelta ?? -1;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.tipView = {};\n\t\t\tthis.remoteTipView = {};\n\t\t\tthis.remoteChanges = [];\n\t\t} finally {\n\t\t\tthis._root.deserialize(this.tipView, undefined, false, false);\n\t\t\tconst _changeSet = new ChangeSet(this.tipView);\n\t\t\tif (!isEmpty(_changeSet.getSerializedChangeSet())) {\n\t\t\t\tthis.emit(\"localModification\", _changeSet);\n\t\t\t}\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\tprotected onDisconnect() { }\n\n\tprivate _applyLocalChangeSet(change: IPropertyTreeMessage) {\n\t\tconst changeSetWrapper = new ChangeSet(this.tipView);\n\t\tchangeSetWrapper.applyChangeSet(change.changeSet);\n\n\t\tif (this.runtime.attachState === AttachState.Detached) {\n\t\t\tconst remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);\n\t\t\tremoteChangeSetWrapper.applyChangeSet(change.changeSet);\n\t\t} else {\n\t\t\tthis.localChanges.push(change);\n\t\t}\n\t}\n\n\tprivate _applyRemoteChangeSet(change: IRemotePropertyTreeMessage) {\n\t\tthis.unrebasedRemoteChanges[change.guid] = cloneDeep(change);\n\n\t\t// This is the first message in the history of the document.\n\t\tif (this.remoteChanges.length !== 0) {\n\t\t\trebaseToRemoteChanges(\n\t\t\t\tchange,\n\t\t\t\tthis.getUnrebasedChange.bind(this),\n\t\t\t\tthis.getRebasedChanges.bind(this),\n\t\t\t);\n\t\t}\n\n\t\tthis.addRemoteChange(change);\n\t\t// Apply the remote change set to the remote tip view\n\t\tconst remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);\n\t\tremoteChangeSetWrapper.applyChangeSet(change.changeSet);\n\n\t\t// Rebase the local changes\n\t\tconst pendingChanges = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\tnew ChangeSet(pendingChanges)._toReversibleChangeSet(this.tipView);\n\n\t\tconst changesToTip: SerializedChangeSet = {};\n\t\tconst changesNeeded = this.rebaseLocalChanges(change, pendingChanges, changesToTip);\n\n\t\tif (changesNeeded) {\n\t\t\tthis.pushNotificationDelayScope();\n\t\t\t// Checkout the new tip\n\t\t\tthis._root.applyChangeSet(changesToTip);\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\t\tthis._root.applyChangeSet(pendingChanges);\n\t\t\tthis.popNotificationDelayScope();\n\t\t}\n\n\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t// assert(JSON.stringify(this.root.serialize()) === JSON.stringify(this.tipView));\n\t}\n\n\tgetUnrebasedChange(guid: string) {\n\t\treturn this.unrebasedRemoteChanges[guid];\n\t}\n\n\tgetRebasedChanges(startGuid: string, endGuid?: string) {\n\t\tconst startIndex = findIndex(this.remoteChanges, (c) => c.guid === startGuid);\n\t\tif (startIndex === -1 && startGuid !== \"\") {\n\t\t\t// TODO: Consider throwing an error once clients have picked up PR #16277.\n\t\t\tconsole.error(\"Unknown start GUID specified.\");\n\t\t}\n\t\tif (endGuid !== undefined) {\n\t\t\tconst endIndex = findIndex(this.remoteChanges, (c) => c.guid === endGuid);\n\t\t\treturn this.remoteChanges.slice(startIndex + 1, endIndex + 1);\n\t\t}\n\t\treturn this.remoteChanges.slice(startIndex + 1);\n\t}\n\n\tprivate rebaseLocalChanges(\n\t\tchange: IPropertyTreeMessage,\n\t\tpendingChanges: SerializedChangeSet,\n\t\tnewTipDelta: SerializedChangeSet,\n\t): boolean {\n\t\tlet rebaseBaseChangeSet;\n\n\t\tconst accumulatedChanges: SerializedChangeSet = {};\n\t\tconst conflicts = [] as any[];\n\n\t\tif (this.localChanges.length > 0 && this.localChanges[0].guid === change.guid) {\n\t\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t\t// assert(JSON.stringify(this.localChanges[0].changeSet) === JSON.stringify(change.changeSet),\n\t\t\t// \"Local change different than rebased remote change.\");\n\n\t\t\tif (isEqual(this.localChanges[0].changeSet, change.changeSet)) {\n\t\t\t\t// If we got a confirmation of the commit on the tip of the localChanges array,\n\t\t\t\t// there will be no update of the tip view at all. We just move it from local changes\n\t\t\t\t// to remote changes\n\t\t\t\tthis.localChanges.shift();\n\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\t// There is a case where the localChanges that were created by incrementally rebasing with respect\n\t\t\t\t// to every incoming change do no exactly agree with the rebased remote change (this happens\n\t\t\t\t// when there are changes that cancel out with each other that have happened in the meantime).\n\t\t\t\t// In that case, we must make sure, we correctly update the local view to take this difference into\n\t\t\t\t// account by rebasing with respect to the changeset that is obtained by combining the inverse of the\n\t\t\t\t// local change with the incoming remote change.\n\n\t\t\t\trebaseBaseChangeSet = new ChangeSet(this.localChanges.shift()?.changeSet);\n\t\t\t\trebaseBaseChangeSet.toInverseChangeSet();\n\t\t\t\trebaseBaseChangeSet.applyChangeSet(change.changeSet);\n\t\t\t}\n\t\t} else {\n\t\t\trebaseBaseChangeSet = cloneDeep(change.changeSet);\n\t\t}\n\n\t\tfor (let i = 0; i < this.localChanges.length; i++) {\n\t\t\t// Make sure we never receive changes out of order\n\t\t\tconsole.assert(this.localChanges[i].guid !== change.guid);\n\n\t\t\tconst rebaseMetaInformation = new Map();\n\n\t\t\tconst copiedChangeSet = new ChangeSet(cloneDeep(this.localChanges[i].changeSet));\n\t\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(this.localChanges[i].changeSet, conflicts, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\n\t\t\tcopiedChangeSet.toInverseChangeSet();\n\t\t\tcopiedChangeSet.applyChangeSet(rebaseBaseChangeSet);\n\t\t\tcopiedChangeSet.applyChangeSet(this.localChanges[i].changeSet, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\t\t\trebaseBaseChangeSet = copiedChangeSet.getSerializedChangeSet();\n\n\t\t\tnew ChangeSet(accumulatedChanges).applyChangeSet(this.localChanges[i].changeSet);\n\n\t\t\t// Update the reference and head guids\n\t\t\tthis.localChanges[i].remoteHeadGuid = change.guid;\n\t\t\tif (i === 0) {\n\t\t\t\tthis.localChanges[i].referenceGuid = change.guid;\n\t\t\t}\n\t\t}\n\n\t\t// Compute the inverse of the pending changes and store the result in newTipDelta\n\t\tconst pendingChangesRebaseMetaInformation = new Map();\n\t\tconst deltaToTipCS = new ChangeSet(newTipDelta);\n\t\tdeltaToTipCS.applyChangeSet(pendingChanges);\n\t\tdeltaToTipCS.toInverseChangeSet();\n\n\t\t// Perform a rebase of the pending changes\n\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(pendingChanges, conflicts, {\n\t\t\tapplyAfterMetaInformation: pendingChangesRebaseMetaInformation,\n\t\t});\n\n\t\t// Compute the delta between the old tip (including pending changes)\n\t\t// and the new tip (not including the rebased pending changes)\n\t\tdeltaToTipCS.applyChangeSet(rebaseBaseChangeSet);\n\n\t\t// Update the tip view\n\t\tif (!this.tipView) {\n\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\t\t\tconst changeSet = new ChangeSet(this.tipView);\n\t\t\tchangeSet.applyChangeSet(accumulatedChanges);\n\t\t} else {\n\t\t\tnew ChangeSet(this.tipView).applyChangeSet(newTipDelta);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprotected reSubmitCore(content: any, localOpMetadata: unknown) {\n\t\t// We have to provide our own implementation of the resubmit core function, to\n\t\t// handle the case where an operation is no longer referencing a commit within\n\t\t// the collaboration window as its referenceGuid. Other clients would not be\n\t\t// able to perform the rebase for such an operation. To handle this problem\n\t\t// we have to resubmit a version of the operations which has been rebased to\n\t\t// the current remote tip. We already have these rebased versions of the operations\n\t\t// in our localChanges, because we continuously update those to follow the tip.\n\t\t// Therefore our reSubmitCore function searches for the rebased operation in the\n\t\t// localChanges array and submits this up-to-date version instead of the old operation.\n\t\tconst rebasedOperation = find(this.localChanges, (op) => op.guid === content.guid);\n\n\t\tif (rebasedOperation) {\n\t\t\tthis.submitLocalMessage(cloneDeep(rebasedOperation), localOpMetadata);\n\t\t} else {\n\t\t\t// Could this happen or is there a guard that we will never resubmit an already submitted op?\n\t\t\tconsole.warn(\"Resubmitting operation which has already been received back.\");\n\t\t}\n\t}\n\n\tprotected applyStashedOp() {\n\t\tthrow new Error(\"not implemented\");\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluid-experimental/property-dds",
3
- "version": "1.3.6",
3
+ "version": "1.3.7",
4
4
  "description": "definition of the property distributed data store",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -31,20 +31,21 @@
31
31
  "test": "npm run test:mocha",
32
32
  "test:mocha": "mocha \"dist/**/*.spec.js\" --exit -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict",
33
33
  "test:mocha-ts": "cross-env FLUID_TEST_VERBOSE=1 TS_NODE_PROJECT=\"./src/test/tsconfig.json\" mocha --require ts-node/register --extensions ts,tsx \"src/test/**/*.spec.ts\" --exit -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict --timeout 1500000",
34
+ "test:mocha-ts-inspect": "cross-env FLUID_TEST_VERBOSE=1 TS_NODE_PROJECT=\"./src/test/tsconfig.json\" mocha --inspect-brk --require ts-node/register --extensions ts,tsx \"src/test/**/*.spec.ts\" --exit -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict --timeout 1500000",
34
35
  "test:mocha:verbose": "cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha",
35
36
  "tsc": "tsc"
36
37
  },
37
38
  "dependencies": {
38
- "@fluid-experimental/property-changeset": "^1.3.6",
39
- "@fluid-experimental/property-properties": "^1.3.6",
39
+ "@fluid-experimental/property-changeset": "^1.3.7",
40
+ "@fluid-experimental/property-properties": "^1.3.7",
40
41
  "@fluidframework/common-utils": "^0.32.2",
41
- "@fluidframework/container-definitions": "^1.3.6",
42
- "@fluidframework/core-interfaces": "^1.3.6",
43
- "@fluidframework/datastore-definitions": "^1.3.6",
42
+ "@fluidframework/container-definitions": "^1.3.7",
43
+ "@fluidframework/core-interfaces": "^1.3.7",
44
+ "@fluidframework/datastore-definitions": "^1.3.7",
44
45
  "@fluidframework/protocol-definitions": "^0.1028.2000",
45
- "@fluidframework/runtime-definitions": "^1.3.6",
46
- "@fluidframework/runtime-utils": "^1.3.6",
47
- "@fluidframework/shared-object-base": "^1.3.6",
46
+ "@fluidframework/runtime-definitions": "^1.3.7",
47
+ "@fluidframework/runtime-utils": "^1.3.7",
48
+ "@fluidframework/shared-object-base": "^1.3.7",
48
49
  "axios": "^0.26.0",
49
50
  "fastest-json-copy": "^1.0.1",
50
51
  "lodash": "^4.17.21",
@@ -53,18 +54,18 @@
53
54
  "uuid": "^8.3.1"
54
55
  },
55
56
  "devDependencies": {
56
- "@fluid-experimental/property-common": "^1.3.6",
57
+ "@fluid-experimental/property-common": "^1.3.7",
57
58
  "@fluidframework/build-common": "^0.24.0",
58
- "@fluidframework/container-loader": "^1.3.6",
59
- "@fluidframework/driver-definitions": "^1.3.6",
59
+ "@fluidframework/container-loader": "^1.3.7",
60
+ "@fluidframework/driver-definitions": "^1.3.7",
60
61
  "@fluidframework/eslint-config-fluid": "^0.28.2000",
61
- "@fluidframework/local-driver": "^1.3.6",
62
- "@fluidframework/mocha-test-setup": "^1.3.6",
63
- "@fluidframework/sequence": "^1.3.6",
62
+ "@fluidframework/local-driver": "^1.3.7",
63
+ "@fluidframework/mocha-test-setup": "^1.3.7",
64
+ "@fluidframework/sequence": "^1.3.7",
64
65
  "@fluidframework/server-local-server": "^0.1036.5001",
65
- "@fluidframework/test-drivers": "^1.3.6",
66
- "@fluidframework/test-runtime-utils": "^1.3.6",
67
- "@fluidframework/test-utils": "^1.3.6",
66
+ "@fluidframework/test-drivers": "^1.3.7",
67
+ "@fluidframework/test-runtime-utils": "^1.3.7",
68
+ "@fluidframework/test-utils": "^1.3.7",
68
69
  "@microsoft/api-extractor": "^7.22.2",
69
70
  "@rushstack/eslint-config": "^2.5.1",
70
71
  "@types/mocha": "^9.1.1",
@@ -6,6 +6,8 @@
6
6
  /* eslint-disable import/no-internal-modules */
7
7
  import isEmpty from "lodash/isEmpty";
8
8
  import findIndex from "lodash/findIndex";
9
+ import find from "lodash/find";
10
+ import isEqual from "lodash/isEqual";
9
11
  import range from "lodash/range";
10
12
  import { copy as cloneDeep } from "fastest-json-copy";
11
13
  import { Packr } from "msgpackr";
@@ -80,6 +82,7 @@ export interface SharedPropertyTreeOptions {
80
82
  paths?: string[];
81
83
  clientFiltering?: boolean;
82
84
  useMH?: boolean;
85
+ disablePartialCheckout?: boolean;
83
86
  }
84
87
 
85
88
  export interface ISharedPropertyTreeEncDec {
@@ -185,8 +188,16 @@ export class SharedPropertyTree extends SharedObject {
185
188
  }
186
189
 
187
190
  private scopeFutureDeltasToPaths(paths?: string[]) {
188
- const socket = (this.runtime.deltaManager as any).deltaManager.connectionManager.connection.socket;
189
- socket.emit("partial_checkout", { paths });
191
+ // Backdoor to emit "partial_checkout" events on the socket. The delta manager at container runtime layer is
192
+ // a proxy and the delta manager at the container context layer is yet another proxy, so account for that.
193
+ if (!this.options.disablePartialCheckout) {
194
+ let dm = (this.runtime.deltaManager as any).deltaManager;
195
+ if (dm.deltaManager !== undefined) {
196
+ dm = dm.deltaManager;
197
+ }
198
+ const socket = dm.connectionManager.connection.socket;
199
+ socket.emit("partial_checkout", { paths });
200
+ }
190
201
  }
191
202
 
192
203
  public _reportDirtinessToView() {
@@ -722,6 +733,10 @@ export class SharedPropertyTree extends SharedObject {
722
733
 
723
734
  getRebasedChanges(startGuid: string, endGuid?: string) {
724
735
  const startIndex = findIndex(this.remoteChanges, (c) => c.guid === startGuid);
736
+ if (startIndex === -1 && startGuid !== "") {
737
+ // TODO: Consider throwing an error once clients have picked up PR #16277.
738
+ console.error("Unknown start GUID specified.");
739
+ }
725
740
  if (endGuid !== undefined) {
726
741
  const endIndex = findIndex(this.remoteChanges, (c) => c.guid === endGuid);
727
742
  return this.remoteChanges.slice(startIndex + 1, endIndex + 1);
@@ -734,7 +749,7 @@ export class SharedPropertyTree extends SharedObject {
734
749
  pendingChanges: SerializedChangeSet,
735
750
  newTipDelta: SerializedChangeSet,
736
751
  ): boolean {
737
- let rebaseBaseChangeSet = cloneDeep(change.changeSet);
752
+ let rebaseBaseChangeSet;
738
753
 
739
754
  const accumulatedChanges: SerializedChangeSet = {};
740
755
  const conflicts = [] as any[];
@@ -744,15 +759,29 @@ export class SharedPropertyTree extends SharedObject {
744
759
  // assert(JSON.stringify(this.localChanges[0].changeSet) === JSON.stringify(change.changeSet),
745
760
  // "Local change different than rebased remote change.");
746
761
 
747
- // If we got a confirmation of the commit on the tip of the localChanges array,
748
- // there will be no update of the tip view at all. We just move it from local changes
749
- // to remote changes
750
- this.localChanges.shift();
762
+ if (isEqual(this.localChanges[0].changeSet, change.changeSet)) {
763
+ // If we got a confirmation of the commit on the tip of the localChanges array,
764
+ // there will be no update of the tip view at all. We just move it from local changes
765
+ // to remote changes
766
+ this.localChanges.shift();
751
767
 
752
- return false;
768
+ return false;
769
+ } else {
770
+ // There is a case where the localChanges that were created by incrementally rebasing with respect
771
+ // to every incoming change do no exactly agree with the rebased remote change (this happens
772
+ // when there are changes that cancel out with each other that have happened in the meantime).
773
+ // In that case, we must make sure, we correctly update the local view to take this difference into
774
+ // account by rebasing with respect to the changeset that is obtained by combining the inverse of the
775
+ // local change with the incoming remote change.
776
+
777
+ rebaseBaseChangeSet = new ChangeSet(this.localChanges.shift()?.changeSet);
778
+ rebaseBaseChangeSet.toInverseChangeSet();
779
+ rebaseBaseChangeSet.applyChangeSet(change.changeSet);
780
+ }
781
+ } else {
782
+ rebaseBaseChangeSet = cloneDeep(change.changeSet);
753
783
  }
754
784
 
755
- // eslint-disable-next-line @typescript-eslint/prefer-for-of
756
785
  for (let i = 0; i < this.localChanges.length; i++) {
757
786
  // Make sure we never receive changes out of order
758
787
  console.assert(this.localChanges[i].guid !== change.guid);
@@ -772,6 +801,12 @@ export class SharedPropertyTree extends SharedObject {
772
801
  rebaseBaseChangeSet = copiedChangeSet.getSerializedChangeSet();
773
802
 
774
803
  new ChangeSet(accumulatedChanges).applyChangeSet(this.localChanges[i].changeSet);
804
+
805
+ // Update the reference and head guids
806
+ this.localChanges[i].remoteHeadGuid = change.guid;
807
+ if (i === 0) {
808
+ this.localChanges[i].referenceGuid = change.guid;
809
+ }
775
810
  }
776
811
 
777
812
  // Compute the inverse of the pending changes and store the result in newTipDelta
@@ -801,6 +836,26 @@ export class SharedPropertyTree extends SharedObject {
801
836
  return true;
802
837
  }
803
838
 
839
+ protected reSubmitCore(content: any, localOpMetadata: unknown) {
840
+ // We have to provide our own implementation of the resubmit core function, to
841
+ // handle the case where an operation is no longer referencing a commit within
842
+ // the collaboration window as its referenceGuid. Other clients would not be
843
+ // able to perform the rebase for such an operation. To handle this problem
844
+ // we have to resubmit a version of the operations which has been rebased to
845
+ // the current remote tip. We already have these rebased versions of the operations
846
+ // in our localChanges, because we continuously update those to follow the tip.
847
+ // Therefore our reSubmitCore function searches for the rebased operation in the
848
+ // localChanges array and submits this up-to-date version instead of the old operation.
849
+ const rebasedOperation = find(this.localChanges, (op) => op.guid === content.guid);
850
+
851
+ if (rebasedOperation) {
852
+ this.submitLocalMessage(cloneDeep(rebasedOperation), localOpMetadata);
853
+ } else {
854
+ // Could this happen or is there a guard that we will never resubmit an already submitted op?
855
+ console.warn("Resubmitting operation which has already been received back.");
856
+ }
857
+ }
858
+
804
859
  protected applyStashedOp() {
805
860
  throw new Error("not implemented");
806
861
  }