@fluid-experimental/property-dds 2.70.0-361248 → 2.70.0-361788

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.
@@ -5,8 +5,7 @@
5
5
  import { NodeProperty } from "@fluid-experimental/property-properties";
6
6
  import { IsoBuffer } from "@fluid-internal/client-utils";
7
7
  import { IChannelAttributes, IChannelFactory, IFluidDataStoreRuntime, IChannelStorageService } from "@fluidframework/datastore-definitions/internal";
8
- import { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
9
- import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions/internal";
8
+ import { ISummaryTreeWithStats, type IRuntimeMessageCollection } from "@fluidframework/runtime-definitions/internal";
10
9
  import { SharedObject, IFluidSerializer } from "@fluidframework/shared-object-base/internal";
11
10
  /**
12
11
  * @internal
@@ -146,14 +145,10 @@ export declare class SharedPropertyTree extends SharedObject {
146
145
  */
147
146
  popNotificationDelayScope(): void;
148
147
  /**
149
- * Process an operation
150
- *
151
- * @param message - the message to prepare
152
- * @param local - whether the message was sent by the local client
153
- * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.
154
- * For messages from a remote client, this will be undefined.
148
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}
155
149
  */
156
- protected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown): void;
150
+ protected processMessagesCore(messagesCollection: IRuntimeMessageCollection): void;
151
+ private processMessage;
157
152
  private addRemoteChange;
158
153
  private updateRemoteHeadGuid;
159
154
  static prune(minimumSequenceNumber: number, remoteChanges: IPropertyTreeMessage[], unrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>, remoteHeadGuid: string): {
@@ -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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"}
@@ -216,20 +216,21 @@ class SharedPropertyTree extends internal_3.SharedObject {
216
216
  this._root._reportDirtinessToView();
217
217
  }
218
218
  /**
219
- * Process an operation
220
- *
221
- * @param message - the message to prepare
222
- * @param local - whether the message was sent by the local client
223
- * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.
224
- * For messages from a remote client, this will be undefined.
219
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}
225
220
  */
226
- processCore(message, local, localOpMetadata) {
227
- if (message.type === internal_1.MessageType.Operation &&
228
- message.sequenceNumber > this.skipSequenceNumber) {
229
- const change = this.decodeMessage(cloneDeep(message.contents));
221
+ processMessagesCore(messagesCollection) {
222
+ const { envelope, messagesContent } = messagesCollection;
223
+ for (const messageContent of messagesContent) {
224
+ this.processMessage(envelope, messageContent.contents);
225
+ }
226
+ }
227
+ processMessage(messageEnvelope, contents) {
228
+ if (messageEnvelope.type === internal_1.MessageType.Operation &&
229
+ messageEnvelope.sequenceNumber > this.skipSequenceNumber) {
230
+ const change = this.decodeMessage(cloneDeep(contents));
230
231
  const content = {
231
232
  ...change,
232
- sequenceNumber: message.sequenceNumber,
233
+ sequenceNumber: messageEnvelope.sequenceNumber,
233
234
  };
234
235
  switch (content.op) {
235
236
  case 0 /* OpKind.ChangeSet */:
@@ -484,11 +485,12 @@ class SharedPropertyTree extends internal_3.SharedObject {
484
485
  });
485
486
  // eslint-disable-next-line @typescript-eslint/prefer-for-of
486
487
  for (let i = 0; i < missingDeltas.length; i++) {
487
- if (missingDeltas[i].sequenceNumber < commitMetadata.sequenceNumber) {
488
+ const missingDelta = missingDeltas[i];
489
+ if (missingDelta.sequenceNumber < commitMetadata.sequenceNumber) {
488
490
  // TODO: Don't spy on the DeltaManager's private internals.
489
491
  // This is trying to mimic what DeltaManager does in processInboundMessage, but there's no guarantee that
490
492
  // private implementation won't change.
491
- const remoteChange = JSON.parse(missingDeltas[i].contents).contents.contents.content.contents;
493
+ const remoteChange = JSON.parse(missingDelta.contents).contents.contents.content.contents;
492
494
  const { changeSet } = (await axios_1.default.get(`http://localhost:3000/branch/${branchGuid}/commit/${remoteChange.guid}/changeSet`)).data;
493
495
  remoteChange.changeSet = changeSet;
494
496
  if (remoteChange) {
@@ -499,7 +501,7 @@ class SharedPropertyTree extends internal_3.SharedObject {
499
501
  }
500
502
  }
501
503
  else {
502
- this.processCore(missingDeltas[i], false, {});
504
+ this.processMessage(missingDelta, missingDelta.contents);
503
505
  }
504
506
  }
505
507
  this.skipSequenceNumber = lastDelta ?? -1;
@@ -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\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\nimport {\n\tBaseProperty,\n\tNodeProperty,\n\tPropertyFactory,\n} from \"@fluid-experimental/property-properties\";\nimport { IsoBuffer, bufferToString, stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport {\n\tIChannelAttributes,\n\tIChannelFactory,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions/internal\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport { SharedObject, IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport axios from \"axios\";\nimport lodash from \"lodash\";\nimport { Packr } from \"msgpackr\";\nimport { v4 as uuidv4 } from \"uuid\";\n\n// eslint-disable-next-line @typescript-eslint/unbound-method -- 'lodash' import workaround.\nconst { isEmpty, findIndex, find, isEqual, range, cloneDeep } = lodash;\n\nimport { PropertyTreeFactory } from \"./propertyTreeFactory.js\";\n\n/**\n * @internal\n */\nexport type SerializedChangeSet = any;\n\n/**\n * @internal\n */\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\n/**\n * @internal\n */\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\n/**\n * @internal\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\n/**\n * @internal\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}\n/**\n * @internal\n */\nexport interface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n\tremoteHeadGuid: string;\n}\n\n/**\n * @internal\n */\nexport interface SharedPropertyTreeOptions {\n\tpaths?: string[];\n\tclientFiltering?: boolean;\n\tuseMH?: boolean;\n\tdisablePartialCheckout?: boolean;\n}\n\n/**\n * @internal\n */\nexport interface ISharedPropertyTreeEncDec {\n\tmessageEncoder: {\n\t\tencode: (IPropertyTreeMessage) => IPropertyTreeMessage;\n\t\tdecode: (IPropertyTreeMessage) => IPropertyTreeMessage;\n\t};\n\tsummaryEncoder: {\n\t\tencode: (ISnapshotSummary) => IsoBuffer;\n\t\tdecode: (IsoBuffer) => ISnapshotSummary;\n\t};\n}\n\n/**\n * @internal\n */\nexport interface IPropertyTreeConfig {\n\tencDec: ISharedPropertyTreeEncDec;\n}\n\nconst defaultEncDec: ISharedPropertyTreeEncDec = {\n\tmessageEncoder: {\n\t\tencode: (msg: IPropertyTreeMessage) => msg,\n\t\tdecode: (msg: IPropertyTreeMessage) => msg,\n\t},\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 * DDS that models a tree made of objects with properties under string keys.\n * @internal\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 construction 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.deltaManager as any;\n\t\t\twhile (\"deltaManager\" in dm && !(\"connectionManager\" in dm)) {\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(\n\t\t\t\ttrue,\n\t\t\t\tfalse,\n\t\t\t\tBaseProperty.MODIFIED_STATE_FLAGS.DIRTY,\n\t\t\t);\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(\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t\tBaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE,\n\t\t);\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 */\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\t? this.localChanges[this.localChanges.length - 1].guid\n\t\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(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t) {\n\t\tif (\n\t\t\tmessage.type === MessageType.Operation &&\n\t\t\tmessage.sequenceNumber > this.skipSequenceNumber\n\t\t) {\n\t\t\tconst change: IPropertyTreeMessage = this.decodeMessage(\n\t\t\t\tcloneDeep(message.contents as IPropertyTreeMessage),\n\t\t\t);\n\t\t\tconst content: IRemotePropertyTreeMessage = {\n\t\t\t\t...change,\n\t\t\t\tsequenceNumber: message.sequenceNumber,\n\t\t\t};\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 =\n\t\t\tthis.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\tremoteHeadGuid: string,\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 === \"\" || guid === remoteHeadGuid) {\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 (\n\t\t\t\t\tvisitor.remoteHeadGuid === visitor.referenceGuid &&\n\t\t\t\t\tremoteChangeMap.has(visitor.referenceGuid)\n\t\t\t\t) {\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 === \"\" or the\n\t\t\t\t// provided remote head guid), we have to keep all remote Changes until this change has been processed\n\t\t\t\tif (visitor.remoteHeadGuid === \"\" || visitor.remoteHeadGuid === 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(\n\t\t\t...[...visitedRemoteChanges].map((key) => remoteChangeMap.get(key) as number),\n\t\t);\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.deltaManager.minimumSequenceNumber;\n\n\t\tlet lastKnownRemoteGuid = this.headCommitGuid;\n\t\t// We use the reference GUID of the first change in the list\n\t\t// of remote changes as lastKnownRemoteGuid, because there\n\t\t// might still be unrebased changes that reference this GUID\n\t\t// as referenceGUID / remoteHeadGuid and if this happens\n\t\t// we must make sure we preserve the remote changes and\n\t\t// unrebased remote changes\n\t\tif (this.remoteChanges.length > 0) {\n\t\t\tlastKnownRemoteGuid = this.remoteChanges[0].referenceGuid;\n\t\t}\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\tlastKnownRemoteGuid,\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.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(\n\t\t\t\t\tserializedSummary.slice(pos, pos + chunkSize),\n\t\t\t\t);\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(\n\t\t\t\"properties\",\n\t\t\tserializer !== undefined\n\t\t\t\t? serializer.stringify(snapshot, this.handle)\n\t\t\t\t: JSON.stringify(snapshot),\n\t\t);\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) as ISnapshot;\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 =\n\t\t\t\t\t\tsnapshotSummary.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\t// summary we can deduce the head GUID from these changes.\n\t\t\t\t\t\t\t\tsnapshotSummary.remoteChanges[snapshotSummary.remoteChanges.length - 1].guid\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\t// where the head GUID was set to an empty string. However, this could lead to\n\t\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\t// that is using a version of this library without this patch and which\n\t\t\t\t\t\t\t\t// has started the session at a different summary.\n\t\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} = (\n\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}`,\n\t\t\t\t\t)\n\t\t\t\t).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(\n\t\t\t\t\t\tmaterializedView,\n\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t);\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(\n\t\t\t\t\tcommitMetadata.minimumSequenceNumber,\n\t\t\t\t\tsummaryMinimumSequenceNumber,\n\t\t\t\t);\n\t\t\t\tconst lastDelta = commitMetadata.sequenceNumber;\n\n\t\t\t\tconst dm = (this.deltaManager as any).deltaManager;\n\t\t\t\t// TODO: This is accessing a private member of the delta manager, and should not be.\n\t\t\t\tawait dm.getDeltas(\n\t\t\t\t\t\"DocumentOpen\",\n\t\t\t\t\tfirstDelta,\n\t\t\t\t\tlastDelta,\n\t\t\t\t\t(messages: ISequencedDocumentMessage[]) => {\n\t\t\t\t\t\tmissingDeltas = messages.filter((x) => x.type === \"op\");\n\t\t\t\t\t},\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\t// TODO: Don't spy on the DeltaManager's private internals.\n\t\t\t\t\t\t// This is trying to mimic what DeltaManager does in processInboundMessage, but there's no guarantee that\n\t\t\t\t\t\t// private implementation won't change.\n\t\t\t\t\t\tconst remoteChange: IPropertyTreeMessage = JSON.parse(\n\t\t\t\t\t\t\tmissingDeltas[i].contents as string,\n\t\t\t\t\t\t).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(\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t\tBaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE,\n\t\t);\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 (\n\t\t\tstartIndex === -1 &&\n\t\t\tstartGuid !== \"\" &&\n\t\t\t// If the start GUID is the referenceGUID of the first change,\n\t\t\t// we still can get the correct range, because the change with the startGuid itself\n\t\t\t// if not included in the range.\n\t\t\t(this.remoteChanges.length === 0 || startGuid !== this.remoteChanges[0].referenceGuid)\n\t\t) {\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(\n\t\t\t\tthis.localChanges[i].changeSet,\n\t\t\t\tconflicts,\n\t\t\t\t{\n\t\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t\t},\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(): void {\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\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\nimport {\n\tBaseProperty,\n\tNodeProperty,\n\tPropertyFactory,\n} from \"@fluid-experimental/property-properties\";\nimport { IsoBuffer, bufferToString, stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport {\n\tIChannelAttributes,\n\tIChannelFactory,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tISummaryTreeWithStats,\n\ttype IRuntimeMessageCollection,\n\ttype ISequencedMessageEnvelope,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport { SharedObject, IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport axios from \"axios\";\nimport lodash from \"lodash\";\nimport { Packr } from \"msgpackr\";\nimport { v4 as uuidv4 } from \"uuid\";\n\n// eslint-disable-next-line @typescript-eslint/unbound-method -- 'lodash' import workaround.\nconst { isEmpty, findIndex, find, isEqual, range, cloneDeep } = lodash;\n\nimport { PropertyTreeFactory } from \"./propertyTreeFactory.js\";\n\n/**\n * @internal\n */\nexport type SerializedChangeSet = any;\n\n/**\n * @internal\n */\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\n/**\n * @internal\n */\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\n/**\n * @internal\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\n/**\n * @internal\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}\n/**\n * @internal\n */\nexport interface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n\tremoteHeadGuid: string;\n}\n\n/**\n * @internal\n */\nexport interface SharedPropertyTreeOptions {\n\tpaths?: string[];\n\tclientFiltering?: boolean;\n\tuseMH?: boolean;\n\tdisablePartialCheckout?: boolean;\n}\n\n/**\n * @internal\n */\nexport interface ISharedPropertyTreeEncDec {\n\tmessageEncoder: {\n\t\tencode: (IPropertyTreeMessage) => IPropertyTreeMessage;\n\t\tdecode: (IPropertyTreeMessage) => IPropertyTreeMessage;\n\t};\n\tsummaryEncoder: {\n\t\tencode: (ISnapshotSummary) => IsoBuffer;\n\t\tdecode: (IsoBuffer) => ISnapshotSummary;\n\t};\n}\n\n/**\n * @internal\n */\nexport interface IPropertyTreeConfig {\n\tencDec: ISharedPropertyTreeEncDec;\n}\n\nconst defaultEncDec: ISharedPropertyTreeEncDec = {\n\tmessageEncoder: {\n\t\tencode: (msg: IPropertyTreeMessage) => msg,\n\t\tdecode: (msg: IPropertyTreeMessage) => msg,\n\t},\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 * DDS that models a tree made of objects with properties under string keys.\n * @internal\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 construction 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.deltaManager as any;\n\t\t\twhile (\"deltaManager\" in dm && !(\"connectionManager\" in dm)) {\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(\n\t\t\t\ttrue,\n\t\t\t\tfalse,\n\t\t\t\tBaseProperty.MODIFIED_STATE_FLAGS.DIRTY,\n\t\t\t);\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(\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t\tBaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE,\n\t\t);\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 */\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\t? this.localChanges[this.localChanges.length - 1].guid\n\t\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 * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}\n\t */\n\tprotected processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {\n\t\tconst { envelope, messagesContent } = messagesCollection;\n\t\tfor (const messageContent of messagesContent) {\n\t\t\tthis.processMessage(envelope, messageContent.contents);\n\t\t}\n\t}\n\n\tprivate processMessage(messageEnvelope: ISequencedMessageEnvelope, contents: unknown) {\n\t\tif (\n\t\t\tmessageEnvelope.type === MessageType.Operation &&\n\t\t\tmessageEnvelope.sequenceNumber > this.skipSequenceNumber\n\t\t) {\n\t\t\tconst change: IPropertyTreeMessage = this.decodeMessage(\n\t\t\t\tcloneDeep(contents as IPropertyTreeMessage),\n\t\t\t);\n\t\t\tconst content: IRemotePropertyTreeMessage = {\n\t\t\t\t...change,\n\t\t\t\tsequenceNumber: messageEnvelope.sequenceNumber,\n\t\t\t};\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 =\n\t\t\tthis.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\tremoteHeadGuid: string,\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 === \"\" || guid === remoteHeadGuid) {\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 (\n\t\t\t\t\tvisitor.remoteHeadGuid === visitor.referenceGuid &&\n\t\t\t\t\tremoteChangeMap.has(visitor.referenceGuid)\n\t\t\t\t) {\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 === \"\" or the\n\t\t\t\t// provided remote head guid), we have to keep all remote Changes until this change has been processed\n\t\t\t\tif (visitor.remoteHeadGuid === \"\" || visitor.remoteHeadGuid === 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(\n\t\t\t...[...visitedRemoteChanges].map((key) => remoteChangeMap.get(key) as number),\n\t\t);\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.deltaManager.minimumSequenceNumber;\n\n\t\tlet lastKnownRemoteGuid = this.headCommitGuid;\n\t\t// We use the reference GUID of the first change in the list\n\t\t// of remote changes as lastKnownRemoteGuid, because there\n\t\t// might still be unrebased changes that reference this GUID\n\t\t// as referenceGUID / remoteHeadGuid and if this happens\n\t\t// we must make sure we preserve the remote changes and\n\t\t// unrebased remote changes\n\t\tif (this.remoteChanges.length > 0) {\n\t\t\tlastKnownRemoteGuid = this.remoteChanges[0].referenceGuid;\n\t\t}\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\tlastKnownRemoteGuid,\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.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(\n\t\t\t\t\tserializedSummary.slice(pos, pos + chunkSize),\n\t\t\t\t);\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(\n\t\t\t\"properties\",\n\t\t\tserializer !== undefined\n\t\t\t\t? serializer.stringify(snapshot, this.handle)\n\t\t\t\t: JSON.stringify(snapshot),\n\t\t);\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) as ISnapshot;\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 =\n\t\t\t\t\t\tsnapshotSummary.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\t// summary we can deduce the head GUID from these changes.\n\t\t\t\t\t\t\t\tsnapshotSummary.remoteChanges[snapshotSummary.remoteChanges.length - 1].guid\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\t// where the head GUID was set to an empty string. However, this could lead to\n\t\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\t// that is using a version of this library without this patch and which\n\t\t\t\t\t\t\t\t// has started the session at a different summary.\n\t\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} = (\n\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}`,\n\t\t\t\t\t)\n\t\t\t\t).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(\n\t\t\t\t\t\tmaterializedView,\n\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t);\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(\n\t\t\t\t\tcommitMetadata.minimumSequenceNumber,\n\t\t\t\t\tsummaryMinimumSequenceNumber,\n\t\t\t\t);\n\t\t\t\tconst lastDelta = commitMetadata.sequenceNumber;\n\n\t\t\t\tconst dm = (this.deltaManager as any).deltaManager;\n\t\t\t\t// TODO: This is accessing a private member of the delta manager, and should not be.\n\t\t\t\tawait dm.getDeltas(\n\t\t\t\t\t\"DocumentOpen\",\n\t\t\t\t\tfirstDelta,\n\t\t\t\t\tlastDelta,\n\t\t\t\t\t(messages: ISequencedDocumentMessage[]) => {\n\t\t\t\t\t\tmissingDeltas = messages.filter((x) => x.type === \"op\");\n\t\t\t\t\t},\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\tconst missingDelta = missingDeltas[i];\n\t\t\t\t\tif (missingDelta.sequenceNumber < commitMetadata.sequenceNumber) {\n\t\t\t\t\t\t// TODO: Don't spy on the DeltaManager's private internals.\n\t\t\t\t\t\t// This is trying to mimic what DeltaManager does in processInboundMessage, but there's no guarantee that\n\t\t\t\t\t\t// private implementation won't change.\n\t\t\t\t\t\tconst remoteChange: IPropertyTreeMessage = JSON.parse(\n\t\t\t\t\t\t\tmissingDelta.contents as string,\n\t\t\t\t\t\t).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.processMessage(missingDelta, missingDelta.contents);\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(\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t\tBaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE,\n\t\t);\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 (\n\t\t\tstartIndex === -1 &&\n\t\t\tstartGuid !== \"\" &&\n\t\t\t// If the start GUID is the referenceGUID of the first change,\n\t\t\t// we still can get the correct range, because the change with the startGuid itself\n\t\t\t// if not included in the range.\n\t\t\t(this.remoteChanges.length === 0 || startGuid !== this.remoteChanges[0].referenceGuid)\n\t\t) {\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(\n\t\t\t\tthis.localChanges[i].changeSet,\n\t\t\t\tconflicts,\n\t\t\t\t{\n\t\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t\t},\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(): void {\n\t\tthrow new Error(\"not implemented\");\n\t}\n}\n"]}
@@ -5,8 +5,7 @@
5
5
  import { NodeProperty } from "@fluid-experimental/property-properties";
6
6
  import { IsoBuffer } from "@fluid-internal/client-utils";
7
7
  import { IChannelAttributes, IChannelFactory, IFluidDataStoreRuntime, IChannelStorageService } from "@fluidframework/datastore-definitions/internal";
8
- import { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
9
- import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions/internal";
8
+ import { ISummaryTreeWithStats, type IRuntimeMessageCollection } from "@fluidframework/runtime-definitions/internal";
10
9
  import { SharedObject, IFluidSerializer } from "@fluidframework/shared-object-base/internal";
11
10
  /**
12
11
  * @internal
@@ -146,14 +145,10 @@ export declare class SharedPropertyTree extends SharedObject {
146
145
  */
147
146
  popNotificationDelayScope(): void;
148
147
  /**
149
- * Process an operation
150
- *
151
- * @param message - the message to prepare
152
- * @param local - whether the message was sent by the local client
153
- * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.
154
- * For messages from a remote client, this will be undefined.
148
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}
155
149
  */
156
- protected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown): void;
150
+ protected processMessagesCore(messagesCollection: IRuntimeMessageCollection): void;
151
+ private processMessage;
157
152
  private addRemoteChange;
158
153
  private updateRemoteHeadGuid;
159
154
  static prune(minimumSequenceNumber: number, remoteChanges: IPropertyTreeMessage[], unrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>, remoteHeadGuid: string): {
@@ -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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"}
@@ -210,20 +210,21 @@ export class SharedPropertyTree extends SharedObject {
210
210
  this._root._reportDirtinessToView();
211
211
  }
212
212
  /**
213
- * Process an operation
214
- *
215
- * @param message - the message to prepare
216
- * @param local - whether the message was sent by the local client
217
- * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.
218
- * For messages from a remote client, this will be undefined.
213
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}
219
214
  */
220
- processCore(message, local, localOpMetadata) {
221
- if (message.type === MessageType.Operation &&
222
- message.sequenceNumber > this.skipSequenceNumber) {
223
- const change = this.decodeMessage(cloneDeep(message.contents));
215
+ processMessagesCore(messagesCollection) {
216
+ const { envelope, messagesContent } = messagesCollection;
217
+ for (const messageContent of messagesContent) {
218
+ this.processMessage(envelope, messageContent.contents);
219
+ }
220
+ }
221
+ processMessage(messageEnvelope, contents) {
222
+ if (messageEnvelope.type === MessageType.Operation &&
223
+ messageEnvelope.sequenceNumber > this.skipSequenceNumber) {
224
+ const change = this.decodeMessage(cloneDeep(contents));
224
225
  const content = {
225
226
  ...change,
226
- sequenceNumber: message.sequenceNumber,
227
+ sequenceNumber: messageEnvelope.sequenceNumber,
227
228
  };
228
229
  switch (content.op) {
229
230
  case 0 /* OpKind.ChangeSet */:
@@ -478,11 +479,12 @@ export class SharedPropertyTree extends SharedObject {
478
479
  });
479
480
  // eslint-disable-next-line @typescript-eslint/prefer-for-of
480
481
  for (let i = 0; i < missingDeltas.length; i++) {
481
- if (missingDeltas[i].sequenceNumber < commitMetadata.sequenceNumber) {
482
+ const missingDelta = missingDeltas[i];
483
+ if (missingDelta.sequenceNumber < commitMetadata.sequenceNumber) {
482
484
  // TODO: Don't spy on the DeltaManager's private internals.
483
485
  // This is trying to mimic what DeltaManager does in processInboundMessage, but there's no guarantee that
484
486
  // private implementation won't change.
485
- const remoteChange = JSON.parse(missingDeltas[i].contents).contents.contents.content.contents;
487
+ const remoteChange = JSON.parse(missingDelta.contents).contents.contents.content.contents;
486
488
  const { changeSet } = (await axios.get(`http://localhost:3000/branch/${branchGuid}/commit/${remoteChange.guid}/changeSet`)).data;
487
489
  remoteChange.changeSet = changeSet;
488
490
  if (remoteChange) {
@@ -493,7 +495,7 @@ export class SharedPropertyTree extends SharedObject {
493
495
  }
494
496
  }
495
497
  else {
496
- this.processCore(missingDeltas[i], false, {});
498
+ this.processMessage(missingDelta, missingDelta.contents);
497
499
  }
498
500
  }
499
501
  this.skipSequenceNumber = lastDelta ?? -1;
@@ -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\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\nimport {\n\tBaseProperty,\n\tNodeProperty,\n\tPropertyFactory,\n} from \"@fluid-experimental/property-properties\";\nimport { IsoBuffer, bufferToString, stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport {\n\tIChannelAttributes,\n\tIChannelFactory,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions/internal\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport { SharedObject, IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport axios from \"axios\";\nimport lodash from \"lodash\";\nimport { Packr } from \"msgpackr\";\nimport { v4 as uuidv4 } from \"uuid\";\n\n// eslint-disable-next-line @typescript-eslint/unbound-method -- 'lodash' import workaround.\nconst { isEmpty, findIndex, find, isEqual, range, cloneDeep } = lodash;\n\nimport { PropertyTreeFactory } from \"./propertyTreeFactory.js\";\n\n/**\n * @internal\n */\nexport type SerializedChangeSet = any;\n\n/**\n * @internal\n */\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\n/**\n * @internal\n */\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\n/**\n * @internal\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\n/**\n * @internal\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}\n/**\n * @internal\n */\nexport interface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n\tremoteHeadGuid: string;\n}\n\n/**\n * @internal\n */\nexport interface SharedPropertyTreeOptions {\n\tpaths?: string[];\n\tclientFiltering?: boolean;\n\tuseMH?: boolean;\n\tdisablePartialCheckout?: boolean;\n}\n\n/**\n * @internal\n */\nexport interface ISharedPropertyTreeEncDec {\n\tmessageEncoder: {\n\t\tencode: (IPropertyTreeMessage) => IPropertyTreeMessage;\n\t\tdecode: (IPropertyTreeMessage) => IPropertyTreeMessage;\n\t};\n\tsummaryEncoder: {\n\t\tencode: (ISnapshotSummary) => IsoBuffer;\n\t\tdecode: (IsoBuffer) => ISnapshotSummary;\n\t};\n}\n\n/**\n * @internal\n */\nexport interface IPropertyTreeConfig {\n\tencDec: ISharedPropertyTreeEncDec;\n}\n\nconst defaultEncDec: ISharedPropertyTreeEncDec = {\n\tmessageEncoder: {\n\t\tencode: (msg: IPropertyTreeMessage) => msg,\n\t\tdecode: (msg: IPropertyTreeMessage) => msg,\n\t},\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 * DDS that models a tree made of objects with properties under string keys.\n * @internal\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 construction 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.deltaManager as any;\n\t\t\twhile (\"deltaManager\" in dm && !(\"connectionManager\" in dm)) {\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(\n\t\t\t\ttrue,\n\t\t\t\tfalse,\n\t\t\t\tBaseProperty.MODIFIED_STATE_FLAGS.DIRTY,\n\t\t\t);\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(\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t\tBaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE,\n\t\t);\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 */\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\t? this.localChanges[this.localChanges.length - 1].guid\n\t\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(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t) {\n\t\tif (\n\t\t\tmessage.type === MessageType.Operation &&\n\t\t\tmessage.sequenceNumber > this.skipSequenceNumber\n\t\t) {\n\t\t\tconst change: IPropertyTreeMessage = this.decodeMessage(\n\t\t\t\tcloneDeep(message.contents as IPropertyTreeMessage),\n\t\t\t);\n\t\t\tconst content: IRemotePropertyTreeMessage = {\n\t\t\t\t...change,\n\t\t\t\tsequenceNumber: message.sequenceNumber,\n\t\t\t};\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 =\n\t\t\tthis.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\tremoteHeadGuid: string,\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 === \"\" || guid === remoteHeadGuid) {\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 (\n\t\t\t\t\tvisitor.remoteHeadGuid === visitor.referenceGuid &&\n\t\t\t\t\tremoteChangeMap.has(visitor.referenceGuid)\n\t\t\t\t) {\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 === \"\" or the\n\t\t\t\t// provided remote head guid), we have to keep all remote Changes until this change has been processed\n\t\t\t\tif (visitor.remoteHeadGuid === \"\" || visitor.remoteHeadGuid === 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(\n\t\t\t...[...visitedRemoteChanges].map((key) => remoteChangeMap.get(key) as number),\n\t\t);\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.deltaManager.minimumSequenceNumber;\n\n\t\tlet lastKnownRemoteGuid = this.headCommitGuid;\n\t\t// We use the reference GUID of the first change in the list\n\t\t// of remote changes as lastKnownRemoteGuid, because there\n\t\t// might still be unrebased changes that reference this GUID\n\t\t// as referenceGUID / remoteHeadGuid and if this happens\n\t\t// we must make sure we preserve the remote changes and\n\t\t// unrebased remote changes\n\t\tif (this.remoteChanges.length > 0) {\n\t\t\tlastKnownRemoteGuid = this.remoteChanges[0].referenceGuid;\n\t\t}\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\tlastKnownRemoteGuid,\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.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(\n\t\t\t\t\tserializedSummary.slice(pos, pos + chunkSize),\n\t\t\t\t);\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(\n\t\t\t\"properties\",\n\t\t\tserializer !== undefined\n\t\t\t\t? serializer.stringify(snapshot, this.handle)\n\t\t\t\t: JSON.stringify(snapshot),\n\t\t);\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) as ISnapshot;\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 =\n\t\t\t\t\t\tsnapshotSummary.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\t// summary we can deduce the head GUID from these changes.\n\t\t\t\t\t\t\t\tsnapshotSummary.remoteChanges[snapshotSummary.remoteChanges.length - 1].guid\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\t// where the head GUID was set to an empty string. However, this could lead to\n\t\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\t// that is using a version of this library without this patch and which\n\t\t\t\t\t\t\t\t// has started the session at a different summary.\n\t\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} = (\n\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}`,\n\t\t\t\t\t)\n\t\t\t\t).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(\n\t\t\t\t\t\tmaterializedView,\n\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t);\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(\n\t\t\t\t\tcommitMetadata.minimumSequenceNumber,\n\t\t\t\t\tsummaryMinimumSequenceNumber,\n\t\t\t\t);\n\t\t\t\tconst lastDelta = commitMetadata.sequenceNumber;\n\n\t\t\t\tconst dm = (this.deltaManager as any).deltaManager;\n\t\t\t\t// TODO: This is accessing a private member of the delta manager, and should not be.\n\t\t\t\tawait dm.getDeltas(\n\t\t\t\t\t\"DocumentOpen\",\n\t\t\t\t\tfirstDelta,\n\t\t\t\t\tlastDelta,\n\t\t\t\t\t(messages: ISequencedDocumentMessage[]) => {\n\t\t\t\t\t\tmissingDeltas = messages.filter((x) => x.type === \"op\");\n\t\t\t\t\t},\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\t// TODO: Don't spy on the DeltaManager's private internals.\n\t\t\t\t\t\t// This is trying to mimic what DeltaManager does in processInboundMessage, but there's no guarantee that\n\t\t\t\t\t\t// private implementation won't change.\n\t\t\t\t\t\tconst remoteChange: IPropertyTreeMessage = JSON.parse(\n\t\t\t\t\t\t\tmissingDeltas[i].contents as string,\n\t\t\t\t\t\t).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(\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t\tBaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE,\n\t\t);\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 (\n\t\t\tstartIndex === -1 &&\n\t\t\tstartGuid !== \"\" &&\n\t\t\t// If the start GUID is the referenceGUID of the first change,\n\t\t\t// we still can get the correct range, because the change with the startGuid itself\n\t\t\t// if not included in the range.\n\t\t\t(this.remoteChanges.length === 0 || startGuid !== this.remoteChanges[0].referenceGuid)\n\t\t) {\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(\n\t\t\t\tthis.localChanges[i].changeSet,\n\t\t\t\tconflicts,\n\t\t\t\t{\n\t\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t\t},\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(): void {\n\t\tthrow new Error(\"not implemented\");\n\t}\n}\n"]}
1
+ {"version":3,"file":"propertyTree.js","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,SAAS,EACT,KAAK,IAAI,cAAc,EACvB,qBAAqB,GACrB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACN,YAAY,EAEZ,eAAe,GACf,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAa,cAAc,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAOpE,OAAO,EACN,WAAW,GAEX,MAAM,6CAA6C,CAAC;AAMrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAoB,MAAM,6CAA6C,CAAC;AAC7F,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC,4FAA4F;AAC5F,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AA2F/D,MAAM,aAAa,GAA8B;IAChD,cAAc,EAAE;QACf,MAAM,EAAE,CAAC,GAAyB,EAAE,EAAE,CAAC,GAAG;QAC1C,MAAM,EAAE,CAAC,GAAyB,EAAE,EAAE,CAAC,GAAG;KAC1C;IACD,cAAc,EAAE;QACf,MAAM,EAAE,CAAC,OAAyB,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9C,OAAO,iBAAiB,CAAC;QAC1B,CAAC;QACD,MAAM,EAAE,CAAC,iBAAiB,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YACxD,OAAO,eAAmC,CAAC;QAC5C,CAAC;KACD;CACD,CAAC;AAEF;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IAgBnD,YACC,EAAU,EACV,OAA+B,EAC/B,UAA8B,EAC9B,OAAkC,EAClC,qBAA0C,EAAE,MAAM,EAAE,aAAa,EAAE;QAEnE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;QAtBvD,YAAO,GAAwB,EAAE,CAAC;QAClC,kBAAa,GAAwB,EAAE,CAAC;QACxC,iBAAY,GAA2B,EAAE,CAAC;QAC1C,kBAAa,GAA2B,EAAE,CAAC;QAC3C,2BAAsB,GAA+C,EAAE,CAAC;QACxE,iCAA4B,GAAG,KAAK,CAAC;QACrC,qBAAgB,GAA2B,EAAE,CAAC;QAC9C,2BAAsB,GAAW,CAAC,CAAC;QACnC,UAAK,GAAQ,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAEpD,uBAAkB,GAAW,CAAC,CAAC,CAAC;QAChC,mBAAc,GAAW,EAAE,CAAC;QAC5B,UAAK,GAAY,KAAK,CAAC;QAYtB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,6DAA6D;QAC7D,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QAExB,4CAA4C;QAC5C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;QACpC,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;IAC9C,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,MAAM,CAAC,OAA+B,EAAE,EAAW,EAAE,WAAoB;QACtF,OAAO,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,mBAAmB,CAAC,IAAI,CAAuB,CAAC;IAClF,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,UAAU;QACvB,OAAO,IAAI,mBAAmB,EAAE,CAAC;IAClC,CAAC;IAED;;OAEG;IACO,SAAS;QAClB,wEAAwE;QACxE,oEAAoE;QACpE,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAEO,wBAAwB,CAAC,KAAgB;QAChD,4GAA4G;QAC5G,0GAA0G;QAC1G,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC;YAC1C,IAAI,EAAE,GAAG,IAAI,CAAC,YAAmB,CAAC;YAClC,OAAO,cAAc,IAAI,EAAE,IAAI,CAAC,CAAC,mBAAmB,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC7D,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC;YACtB,CAAC;YACD,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5C,CAAC;IACF,CAAC;IAEM,sBAAsB;QAC5B,6EAA6E;QAC7E,8CAA8C;QAC9C,IAAI,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CACpC,IAAI,EACJ,KAAK,EACL,YAAY,CAAC,oBAAoB,CAAC,KAAK,CACvC,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;YAC5C,CAAC;QACF,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC;IACF,CAAC;IAED,IAAW,SAAS;QACnB,+DAA+D;QAC/D,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,IAAW,YAAY;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;YAClC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;YACjD,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,IAAW,IAAI;QACd,OAAO,IAAI,CAAC,KAAqB,CAAC;IACnC,CAAC;IAEM,MAAM,CAAC,QAAmB,EAAE,iBAA2B;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CACpC,IAAI,EACJ,KAAK,EACL,YAAY,CAAC,oBAAoB,CAAC,cAAc,CAChD,CAAC;QAEF,IAAI,QAAQ,GAAG,CAAC,CAAC,iBAAiB,CAAC;QAEnC,mEAAmE;QACnE,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACrC,QAAQ,GAAG,QAAQ,KAAK,SAAS,CAAC;QACnC,CAAC;QAED,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,CAAC;IACF,CAAC;IAED;;;OAGG;IACK,aAAa,CAAC,MAA4B;QACjD,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,CAAC;IAED;;;OAGG;IACK,aAAa,CAAC,cAAoC;QACzD,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC7E,CAAC;IAEO,cAAc,CAAC,SAA8B,EAAE,QAAkB;QACxE,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC;QAC5C,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEhD,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,MAAM,MAAM,GAAG;YACd,EAAE,0BAAkB;YACpB,SAAS;YACT,QAAQ;YACR,IAAI,EAAE,MAAM,EAAE;YACd,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,aAAa,EACZ,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;gBAC3B,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI;gBACtD,CAAC,CAAC,IAAI,CAAC,cAAc;YACvB,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACtF,KAAK,EAAE,IAAI,CAAC,KAAK;SACjB,CAAC;QACF,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAClC,sDAAsD;QACtD,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,4BAA4B,EAAE,CAAC;YACvC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;QACzC,CAAC;IACF,CAAC;IAED,gBAAgB,CAAC,IAAa;QAC7B,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC;QACzC,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACpB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC7C,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAClC,CAAC;YACD,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC5B,CAAC;IACF,CAAC;IACD;;;OAGG;IACI,0BAA0B;QAChC,wBAAwB;QACxB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,sDAAsD;QACtD,IAAI,IAAI,CAAC,sBAAsB,KAAK,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC;QACrC,CAAC;IACF,CAAC;IAED;;;OAGG;IACI,yBAAyB;QAC/B,IAAI,IAAI,CAAC,sBAAsB,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACO,mBAAmB,CAAC,kBAA6C;QAC1E,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,kBAAkB,CAAC;QACzD,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE,CAAC;YAC9C,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;QACxD,CAAC;IACF,CAAC;IAEO,cAAc,CAAC,eAA0C,EAAE,QAAiB;QACnF,IACC,eAAe,CAAC,IAAI,KAAK,WAAW,CAAC,SAAS;YAC9C,eAAe,CAAC,cAAc,GAAG,IAAI,CAAC,kBAAkB,EACvD,CAAC;YACF,MAAM,MAAM,GAAyB,IAAI,CAAC,aAAa,CACtD,SAAS,CAAC,QAAgC,CAAC,CAC3C,CAAC;YACF,MAAM,OAAO,GAA+B;gBAC3C,GAAG,MAAM;gBACT,cAAc,EAAE,eAAe,CAAC,cAAc;aAC9C,CAAC;YACF,QAAQ,OAAO,CAAC,EAAE,EAAE,CAAC;gBACpB;oBACC,gFAAgF;oBAChF,4DAA4D;oBAC5D,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC/C,MAAM;gBACP;oBACC,MAAM;YACR,CAAC;QACF,CAAC;IACF,CAAC;IAEO,eAAe,CAAC,MAA4B;QACnD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC7B,CAAC;IAEO,oBAAoB;QAC3B,IAAI,CAAC,cAAc;YAClB,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;gBAC5B,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI;gBACxD,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;IACzB,CAAC;IAEM,MAAM,CAAC,KAAK,CAClB,qBAA6B,EAC7B,aAAqC,EACrC,sBAAkE,EAClE,cAAsB;QAEtB,2CAA2C;QAC3C,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;QAClD,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACvC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,8BAA8B;QAC9B,MAAM,6BAA6B,GAAG,IAAI,GAAG,EAAU,CAAC;QACxD,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/C,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACtD,MAAM,eAAe,GAAG,sBAAsB,CAAC,EAAE,CAAC,CAAC;YAEnD,4EAA4E;YAC5E,2CAA2C;YAC3C,IACC,eAAe,CAAC,cAAc,IAAI,qBAAqB;gBACvD,CAAC,6BAA6B,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,EACvD,CAAC;gBACF,0DAA0D;gBAC1D,6BAA6B,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAExD,IAAI,OAAO,GAAG,eAAe,CAAC;gBAC9B,iGAAiG;gBACjG,iFAAiF;gBACjF,OACC,OAAO,CAAC,cAAc,KAAK,OAAO,CAAC,aAAa;oBAChD,6BAA6B,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,EACvD,CAAC;oBACF,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;oBACnC,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;wBAC5C,MAAM;oBACP,CAAC;oBACD,4DAA4D;oBAC5D,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;oBACxD,IAAI,CAAC,OAAO,EAAE,CAAC;wBACd,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,GAAG,CAAC,CAAC;oBACxD,CAAC;oBAED,6BAA6B,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACjD,CAAC;gBACD,8EAA8E;gBAC9E,IACC,OAAO,CAAC,cAAc,KAAK,OAAO,CAAC,aAAa;oBAChD,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,EACzC,CAAC;oBACF,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBACjD,CAAC;gBAED,4FAA4F;gBAC5F,uGAAuG;gBACvG,IAAI,OAAO,CAAC,cAAc,KAAK,EAAE,IAAI,OAAO,CAAC,cAAc,KAAK,cAAc,EAAE,CAAC;oBAChF,oBAAoB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjD,CAAC;YACF,CAAC;QACF,CAAC;QACD,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,kEAAkE;QAClE,kDAAkD;QAClD,MAAM,4BAA4B,GAA+C,EAAE,CAAC;QACpF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACvD,IAAI,6BAA6B,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5C,4BAA4B,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACP,MAAM,EAAE,CAAC;YACV,CAAC;QACF,CAAC;QAED,qBAAqB;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACxB,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAW,CAAC,CAC7E,CAAC;QAEF,MAAM,mBAAmB,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1D,MAAM,IAAI,QAAQ,CAAC;QAEnB,OAAO;YACN,aAAa,EAAE,mBAAmB;YAClC,sBAAsB,EAAE,4BAA4B;YACpD,WAAW,EAAE,MAAM;SACnB,CAAC;IACH,CAAC;IACM,YAAY;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC;QAEpD,IAAI,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC;QAC9C,4DAA4D;QAC5D,0DAA0D;QAC1D,4DAA4D;QAC5D,wDAAwD;QACxD,uDAAuD;QACvD,2BAA2B;QAC3B,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,mBAAmB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;QAC3D,CAAC;QAED,MAAM,EAAE,aAAa,EAAE,sBAAsB,EAAE,GAAG,kBAAkB,CAAC,KAAK,CACzE,GAAG,EACH,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,sBAAsB,EAC3B,mBAAmB,CACnB,CAAC;QAEF,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACK,aAAa,CAAC,OAAyB;QAC9C,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtE,CAAC;IAED;;;;OAIG;IACK,aAAa,CAAC,iBAAiB;QACtC,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAChF,CAAC;IAED;;;;OAIG;IACO,YAAY,CAAC,OAAO,IAAG,CAAC;IAElC;;;;;OAKG;IACK,iBAAiB,CAAC,IAAiB;QAC1C,OAAO,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACK,iBAAiB,CAAC,OAAY;QACrC,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAEM,aAAa,CAAC,UAA4B;QAChD,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAc;YAC3B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAY;YAC/D,4BAA4B,EAAE,IAAI,CAAC,YAAY,CAAC,qBAAqB;YACrE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,CAAC;SACZ,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACjB,8FAA8F;YAC9F,wBAAwB;YACxB,MAAM,OAAO,GAAqB;gBACjC,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;aACnD,CAAC;YAEF,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,gCAAgC;YAC/D,IAAI,cAAc,GAAG,CAAC,CAAC;YACvB,MAAM,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACtD,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChF,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CACzC,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,CAAC,CAC7C,CAAC;gBACF,2DAA2D;gBAC3D,cAAc,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACxC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;gBAClD,QAAQ,CAAC,SAAS,EAAE,CAAC;YACtB,CAAC;YACD,IAAI,CAAC,YAAY,CAAC,8BAA8B,cAAc,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,CAAC,OAAO,CACd,YAAY,EACZ,UAAU,KAAK,SAAS;YACvB,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;YAC7C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAC3B,CAAC;QACF,OAAO,OAAO,CAAC,cAAc,EAAE,CAAC;IACjC,CAAC;IAES,KAAK,CAAC,QAAQ,CAAC,OAA+B;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,cAAc,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAEtD,MAAM,QAAQ,GAAc,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;QACrE,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAE5B,IAAI,CAAC;YACJ,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACrB,qBAAqB;gBACrB,MAAM,MAAM,GAAsB,MAAM,OAAO,CAAC,GAAG,CAClD,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;oBACzC,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5E,CAAC,CAAC,CACF,CAAC;gBAEF,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBACjE,MAAM,iBAAiB,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;gBACtD,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBAC/B,iBAAiB,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;oBACrD,OAAO,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC;gBAClC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACN,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;gBAC9D,IACC,eAAe,CAAC,aAAa,KAAK,SAAS;oBAC3C,eAAe,CAAC,aAAa,KAAK,SAAS;oBAC3C,eAAe,CAAC,sBAAsB,KAAK,SAAS,EACnD,CAAC;oBACF,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBACtC,CAAC;gBAED,IAAI,eAAe,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;oBAClD,4EAA4E;oBAC5E,mFAAmF;oBACnF,eAAe,CAAC,cAAc;wBAC7B,eAAe,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;4BACvC,CAAC,CAAC,qCAAqC;gCACtC,0DAA0D;gCAC1D,eAAe,CAAC,aAAa,CAAC,eAAe,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI;4BAC7E,CAAC,CAAC,+EAA+E;gCAChF,8EAA8E;gCAC9E,4EAA4E;gCAC5E,uEAAuE;gCACvE,kDAAkD;gCAClD,EAAE,CAAC;gBACP,CAAC;gBAED,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,aAAa,CAAC;gBACnD,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,aAAa,CAAC;gBACnD,IAAI,CAAC,sBAAsB,GAAG,eAAe,CAAC,sBAAsB,CAAC;gBACrE,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC,cAAc,CAAC;gBACrD,MAAM,uBAAuB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACvF,IAAI,uBAAuB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBACnD,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC,2BAA2B,CAC9D,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,OAAO,CAAC,KAAK,CAClB,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAE7C,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACP,MAAM,EAAE,UAAU,EAAE,4BAA4B,EAAE,GAAG,QAAQ,CAAC;gBAC9D,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,gCAAgC,UAAU,EAAE,CAAC,CAAC;gBACrF,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC;gBACzD,MAAM,EACL,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,GAChC,GAAG,CACH,MAAM,KAAK,CAAC,GAAG,CACd,gCAAgC,UAAU,WAAW,IAAI,CAAC,cAAc,EAAE,CAC1E,CACD,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,CACrC,MAAM,KAAK,CAAC,GAAG,CACd,gCAAgC,UAAU,WAAW,IAAI,CAAC,cAAc,mBAAmB,CAC3F,CACD,CAAC,IAAI,CAAC;gBAEP,MAAM,uBAAuB,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBAEnF,IAAI,uBAAuB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBACnD,gBAAgB,GAAG,cAAc,CAAC,2BAA2B,CAC5D,gBAAgB,EAChB,IAAI,CAAC,OAAO,CAAC,KAAK,CAClB,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC;gBAChC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC7C,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;gBAExB,IAAI,aAAa,GAAgC,EAAE,CAAC;gBACpD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAC1B,cAAc,CAAC,qBAAqB,EACpC,4BAA4B,CAC5B,CAAC;gBACF,MAAM,SAAS,GAAG,cAAc,CAAC,cAAc,CAAC;gBAEhD,MAAM,EAAE,GAAI,IAAI,CAAC,YAAoB,CAAC,YAAY,CAAC;gBACnD,oFAAoF;gBACpF,MAAM,EAAE,CAAC,SAAS,CACjB,cAAc,EACd,UAAU,EACV,SAAS,EACT,CAAC,QAAqC,EAAE,EAAE;oBACzC,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;gBACzD,CAAC,CACD,CAAC;gBAEF,4DAA4D;gBAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC/C,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;oBACtC,IAAI,YAAY,CAAC,cAAc,GAAG,cAAc,CAAC,cAAc,EAAE,CAAC;wBACjE,2DAA2D;wBAC3D,yGAAyG;wBACzG,uCAAuC;wBACvC,MAAM,YAAY,GAAyB,IAAI,CAAC,KAAK,CACpD,YAAY,CAAC,QAAkB,CAC/B,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;wBACrC,MAAM,EAAE,SAAS,EAAE,GAAG,CACrB,MAAM,KAAK,CAAC,GAAG,CACd,gCAAgC,UAAU,WAAW,YAAY,CAAC,IAAI,YAAY,CAClF,CACD,CAAC,IAAI,CAAC;wBACP,YAAY,CAAC,SAAS,GAAG,SAAS,CAAC;wBAEnC,IAAI,YAAY,EAAE,CAAC;4BAClB,IAAI,uBAAuB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gCACnD,YAAY,CAAC,SAAS,GAAG,cAAc,CAAC,2BAA2B,CAClE,YAAY,CAAC,SAAS,EACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAClB,CAAC;4BACH,CAAC;4BACD,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;wBACpC,CAAC;oBACF,CAAC;yBAAM,CAAC;wBACP,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;oBAC1D,CAAC;gBACF,CAAC;gBAED,IAAI,CAAC,kBAAkB,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC;YAC3C,CAAC;QACF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACzB,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,CAAC;IACF,CAAC;IAES,YAAY,KAAI,CAAC;IAEnB,oBAAoB,CAAC,MAA4B;QACxD,MAAM,gBAAgB,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrD,gBAAgB,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAElD,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,WAAW,CAAC,QAAQ,EAAE,CAAC;YACvD,MAAM,sBAAsB,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACjE,sBAAsB,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;IACF,CAAC;IAEO,qBAAqB,CAAC,MAAkC;QAC/D,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAE7D,4DAA4D;QAC5D,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,qBAAqB,CACpB,MAAM,EACN,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAClC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CACjC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7B,qDAAqD;QACrD,MAAM,sBAAsB,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjE,sBAAsB,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAExD,2BAA2B;QAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAC3C,IAAI,EACJ,KAAK,EACL,YAAY,CAAC,oBAAoB,CAAC,cAAc,CAChD,CAAC;QACF,IAAI,SAAS,CAAC,cAAc,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEnE,MAAM,YAAY,GAAwB,EAAE,CAAC;QAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;QAEpF,IAAI,aAAa,EAAE,CAAC;YACnB,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAClC,uBAAuB;YACvB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;YACxE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;YAC1C,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAClC,CAAC;QAED,uEAAuE;QACvE,kFAAkF;IACnF,CAAC;IAED,kBAAkB,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,iBAAiB,CAAC,SAAiB,EAAE,OAAgB;QACpD,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAC9E,IACC,UAAU,KAAK,CAAC,CAAC;YACjB,SAAS,KAAK,EAAE;YAChB,8DAA8D;YAC9D,mFAAmF;YACnF,gCAAgC;YAChC,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EACrF,CAAC;YACF,0EAA0E;YAC1E,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;YAC1E,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IAEO,kBAAkB,CACzB,MAA4B,EAC5B,cAAmC,EACnC,WAAgC;QAEhC,IAAI,mBAAmB,CAAC;QAExB,MAAM,kBAAkB,GAAwB,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,EAAW,CAAC;QAE9B,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;YAC/E,uEAAuE;YACvE,8FAA8F;YAC9F,gEAAgE;YAEhE,IAAI,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/D,+EAA+E;gBAC/E,qFAAqF;gBACrF,oBAAoB;gBACpB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;gBAE1B,OAAO,KAAK,CAAC;YACd,CAAC;iBAAM,CAAC;gBACP,kGAAkG;gBAClG,4FAA4F;gBAC5F,8FAA8F;gBAC9F,mGAAmG;gBACnG,qGAAqG;gBACrG,gDAAgD;gBAEhD,mBAAmB,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;gBAC1E,mBAAmB,CAAC,kBAAkB,EAAE,CAAC;gBACzC,mBAAmB,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACtD,CAAC;QACF,CAAC;aAAM,CAAC;YACP,mBAAmB,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnD,kDAAkD;YAClD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;YAE1D,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAE,CAAC;YAExC,MAAM,eAAe,GAAG,IAAI,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YACjF,IAAI,SAAS,CAAC,mBAAmB,CAAC,CAAC,gBAAgB,CAClD,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,EAC9B,SAAS,EACT;gBACC,yBAAyB,EAAE,qBAAqB;aAChD,CACD,CAAC;YAEF,eAAe,CAAC,kBAAkB,EAAE,CAAC;YACrC,eAAe,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;YACpD,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE;gBAC9D,yBAAyB,EAAE,qBAAqB;aAChD,CAAC,CAAC;YACH,mBAAmB,GAAG,eAAe,CAAC,sBAAsB,EAAE,CAAC;YAE/D,IAAI,SAAS,CAAC,kBAAkB,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAEjF,sCAAsC;YACtC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC;YAClD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACb,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC;YAClD,CAAC;QACF,CAAC;QAED,iFAAiF;QACjF,MAAM,mCAAmC,GAAG,IAAI,GAAG,EAAE,CAAC;QACtD,MAAM,YAAY,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,CAAC;QAChD,YAAY,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAC5C,YAAY,CAAC,kBAAkB,EAAE,CAAC;QAElC,0CAA0C;QAC1C,IAAI,SAAS,CAAC,mBAAmB,CAAC,CAAC,gBAAgB,CAAC,cAAc,EAAE,SAAS,EAAE;YAC9E,yBAAyB,EAAE,mCAAmC;SAC9D,CAAC,CAAC;QAEH,oEAAoE;QACpE,8DAA8D;QAC9D,YAAY,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QAEjD,sBAAsB;QACtB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACnB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9C,SAAS,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACP,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAES,YAAY,CAAC,OAAY,EAAE,eAAwB;QAC5D,8EAA8E;QAC9E,8EAA8E;QAC9E,4EAA4E;QAC5E,2EAA2E;QAC3E,4EAA4E;QAC5E,mFAAmF;QACnF,+EAA+E;QAC/E,gFAAgF;QAChF,uFAAuF;QACvF,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAEnF,IAAI,gBAAgB,EAAE,CAAC;YACtB,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,eAAe,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACP,6FAA6F;YAC7F,OAAO,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QAC9E,CAAC;IACF,CAAC;IAES,cAAc;QACvB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACpC,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\nimport {\n\tBaseProperty,\n\tNodeProperty,\n\tPropertyFactory,\n} from \"@fluid-experimental/property-properties\";\nimport { IsoBuffer, bufferToString, stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport {\n\tIChannelAttributes,\n\tIChannelFactory,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tISummaryTreeWithStats,\n\ttype IRuntimeMessageCollection,\n\ttype ISequencedMessageEnvelope,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport { SharedObject, IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport axios from \"axios\";\nimport lodash from \"lodash\";\nimport { Packr } from \"msgpackr\";\nimport { v4 as uuidv4 } from \"uuid\";\n\n// eslint-disable-next-line @typescript-eslint/unbound-method -- 'lodash' import workaround.\nconst { isEmpty, findIndex, find, isEqual, range, cloneDeep } = lodash;\n\nimport { PropertyTreeFactory } from \"./propertyTreeFactory.js\";\n\n/**\n * @internal\n */\nexport type SerializedChangeSet = any;\n\n/**\n * @internal\n */\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\n/**\n * @internal\n */\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\n/**\n * @internal\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\n/**\n * @internal\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}\n/**\n * @internal\n */\nexport interface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n\tremoteHeadGuid: string;\n}\n\n/**\n * @internal\n */\nexport interface SharedPropertyTreeOptions {\n\tpaths?: string[];\n\tclientFiltering?: boolean;\n\tuseMH?: boolean;\n\tdisablePartialCheckout?: boolean;\n}\n\n/**\n * @internal\n */\nexport interface ISharedPropertyTreeEncDec {\n\tmessageEncoder: {\n\t\tencode: (IPropertyTreeMessage) => IPropertyTreeMessage;\n\t\tdecode: (IPropertyTreeMessage) => IPropertyTreeMessage;\n\t};\n\tsummaryEncoder: {\n\t\tencode: (ISnapshotSummary) => IsoBuffer;\n\t\tdecode: (IsoBuffer) => ISnapshotSummary;\n\t};\n}\n\n/**\n * @internal\n */\nexport interface IPropertyTreeConfig {\n\tencDec: ISharedPropertyTreeEncDec;\n}\n\nconst defaultEncDec: ISharedPropertyTreeEncDec = {\n\tmessageEncoder: {\n\t\tencode: (msg: IPropertyTreeMessage) => msg,\n\t\tdecode: (msg: IPropertyTreeMessage) => msg,\n\t},\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 * DDS that models a tree made of objects with properties under string keys.\n * @internal\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 construction 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.deltaManager as any;\n\t\t\twhile (\"deltaManager\" in dm && !(\"connectionManager\" in dm)) {\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(\n\t\t\t\ttrue,\n\t\t\t\tfalse,\n\t\t\t\tBaseProperty.MODIFIED_STATE_FLAGS.DIRTY,\n\t\t\t);\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(\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t\tBaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE,\n\t\t);\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 */\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\t? this.localChanges[this.localChanges.length - 1].guid\n\t\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 * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}\n\t */\n\tprotected processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {\n\t\tconst { envelope, messagesContent } = messagesCollection;\n\t\tfor (const messageContent of messagesContent) {\n\t\t\tthis.processMessage(envelope, messageContent.contents);\n\t\t}\n\t}\n\n\tprivate processMessage(messageEnvelope: ISequencedMessageEnvelope, contents: unknown) {\n\t\tif (\n\t\t\tmessageEnvelope.type === MessageType.Operation &&\n\t\t\tmessageEnvelope.sequenceNumber > this.skipSequenceNumber\n\t\t) {\n\t\t\tconst change: IPropertyTreeMessage = this.decodeMessage(\n\t\t\t\tcloneDeep(contents as IPropertyTreeMessage),\n\t\t\t);\n\t\t\tconst content: IRemotePropertyTreeMessage = {\n\t\t\t\t...change,\n\t\t\t\tsequenceNumber: messageEnvelope.sequenceNumber,\n\t\t\t};\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 =\n\t\t\tthis.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\tremoteHeadGuid: string,\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 === \"\" || guid === remoteHeadGuid) {\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 (\n\t\t\t\t\tvisitor.remoteHeadGuid === visitor.referenceGuid &&\n\t\t\t\t\tremoteChangeMap.has(visitor.referenceGuid)\n\t\t\t\t) {\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 === \"\" or the\n\t\t\t\t// provided remote head guid), we have to keep all remote Changes until this change has been processed\n\t\t\t\tif (visitor.remoteHeadGuid === \"\" || visitor.remoteHeadGuid === 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(\n\t\t\t...[...visitedRemoteChanges].map((key) => remoteChangeMap.get(key) as number),\n\t\t);\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.deltaManager.minimumSequenceNumber;\n\n\t\tlet lastKnownRemoteGuid = this.headCommitGuid;\n\t\t// We use the reference GUID of the first change in the list\n\t\t// of remote changes as lastKnownRemoteGuid, because there\n\t\t// might still be unrebased changes that reference this GUID\n\t\t// as referenceGUID / remoteHeadGuid and if this happens\n\t\t// we must make sure we preserve the remote changes and\n\t\t// unrebased remote changes\n\t\tif (this.remoteChanges.length > 0) {\n\t\t\tlastKnownRemoteGuid = this.remoteChanges[0].referenceGuid;\n\t\t}\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\tlastKnownRemoteGuid,\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.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(\n\t\t\t\t\tserializedSummary.slice(pos, pos + chunkSize),\n\t\t\t\t);\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(\n\t\t\t\"properties\",\n\t\t\tserializer !== undefined\n\t\t\t\t? serializer.stringify(snapshot, this.handle)\n\t\t\t\t: JSON.stringify(snapshot),\n\t\t);\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) as ISnapshot;\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 =\n\t\t\t\t\t\tsnapshotSummary.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\t// summary we can deduce the head GUID from these changes.\n\t\t\t\t\t\t\t\tsnapshotSummary.remoteChanges[snapshotSummary.remoteChanges.length - 1].guid\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\t// where the head GUID was set to an empty string. However, this could lead to\n\t\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\t// that is using a version of this library without this patch and which\n\t\t\t\t\t\t\t\t// has started the session at a different summary.\n\t\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} = (\n\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}`,\n\t\t\t\t\t)\n\t\t\t\t).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(\n\t\t\t\t\t\tmaterializedView,\n\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t);\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(\n\t\t\t\t\tcommitMetadata.minimumSequenceNumber,\n\t\t\t\t\tsummaryMinimumSequenceNumber,\n\t\t\t\t);\n\t\t\t\tconst lastDelta = commitMetadata.sequenceNumber;\n\n\t\t\t\tconst dm = (this.deltaManager as any).deltaManager;\n\t\t\t\t// TODO: This is accessing a private member of the delta manager, and should not be.\n\t\t\t\tawait dm.getDeltas(\n\t\t\t\t\t\"DocumentOpen\",\n\t\t\t\t\tfirstDelta,\n\t\t\t\t\tlastDelta,\n\t\t\t\t\t(messages: ISequencedDocumentMessage[]) => {\n\t\t\t\t\t\tmissingDeltas = messages.filter((x) => x.type === \"op\");\n\t\t\t\t\t},\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\tconst missingDelta = missingDeltas[i];\n\t\t\t\t\tif (missingDelta.sequenceNumber < commitMetadata.sequenceNumber) {\n\t\t\t\t\t\t// TODO: Don't spy on the DeltaManager's private internals.\n\t\t\t\t\t\t// This is trying to mimic what DeltaManager does in processInboundMessage, but there's no guarantee that\n\t\t\t\t\t\t// private implementation won't change.\n\t\t\t\t\t\tconst remoteChange: IPropertyTreeMessage = JSON.parse(\n\t\t\t\t\t\t\tmissingDelta.contents as string,\n\t\t\t\t\t\t).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.processMessage(missingDelta, missingDelta.contents);\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(\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t\tBaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE,\n\t\t);\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 (\n\t\t\tstartIndex === -1 &&\n\t\t\tstartGuid !== \"\" &&\n\t\t\t// If the start GUID is the referenceGUID of the first change,\n\t\t\t// we still can get the correct range, because the change with the startGuid itself\n\t\t\t// if not included in the range.\n\t\t\t(this.remoteChanges.length === 0 || startGuid !== this.remoteChanges[0].referenceGuid)\n\t\t) {\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(\n\t\t\t\tthis.localChanges[i].changeSet,\n\t\t\t\tconflicts,\n\t\t\t\t{\n\t\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t\t},\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(): void {\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": "2.70.0-361248",
3
+ "version": "2.70.0-361788",
4
4
  "description": "definition of the property distributed data store",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -27,16 +27,16 @@
27
27
  "main": "lib/index.js",
28
28
  "types": "lib/index.d.ts",
29
29
  "dependencies": {
30
- "@fluid-experimental/property-changeset": "2.70.0-361248",
31
- "@fluid-experimental/property-properties": "2.70.0-361248",
32
- "@fluid-internal/client-utils": "2.70.0-361248",
33
- "@fluidframework/container-definitions": "2.70.0-361248",
34
- "@fluidframework/core-interfaces": "2.70.0-361248",
35
- "@fluidframework/datastore-definitions": "2.70.0-361248",
36
- "@fluidframework/driver-definitions": "2.70.0-361248",
37
- "@fluidframework/runtime-definitions": "2.70.0-361248",
38
- "@fluidframework/runtime-utils": "2.70.0-361248",
39
- "@fluidframework/shared-object-base": "2.70.0-361248",
30
+ "@fluid-experimental/property-changeset": "2.70.0-361788",
31
+ "@fluid-experimental/property-properties": "2.70.0-361788",
32
+ "@fluid-internal/client-utils": "2.70.0-361788",
33
+ "@fluidframework/container-definitions": "2.70.0-361788",
34
+ "@fluidframework/core-interfaces": "2.70.0-361788",
35
+ "@fluidframework/datastore-definitions": "2.70.0-361788",
36
+ "@fluidframework/driver-definitions": "2.70.0-361788",
37
+ "@fluidframework/runtime-definitions": "2.70.0-361788",
38
+ "@fluidframework/runtime-utils": "2.70.0-361788",
39
+ "@fluidframework/shared-object-base": "2.70.0-361788",
40
40
  "axios": "^1.8.4",
41
41
  "buffer": "^6.0.3",
42
42
  "lodash": "^4.17.21",
@@ -48,20 +48,20 @@
48
48
  "devDependencies": {
49
49
  "@arethetypeswrong/cli": "^0.17.1",
50
50
  "@biomejs/biome": "~1.9.3",
51
- "@fluid-experimental/property-common": "2.70.0-361248",
52
- "@fluid-internal/mocha-test-setup": "2.70.0-361248",
53
- "@fluid-private/test-drivers": "2.70.0-361248",
51
+ "@fluid-experimental/property-common": "2.70.0-361788",
52
+ "@fluid-internal/mocha-test-setup": "2.70.0-361788",
53
+ "@fluid-private/test-drivers": "2.70.0-361788",
54
54
  "@fluid-tools/build-cli": "^0.58.3",
55
55
  "@fluidframework/build-common": "^2.0.3",
56
56
  "@fluidframework/build-tools": "^0.58.3",
57
- "@fluidframework/container-loader": "2.70.0-361248",
58
- "@fluidframework/container-runtime": "2.70.0-361248",
57
+ "@fluidframework/container-loader": "2.70.0-361788",
58
+ "@fluidframework/container-runtime": "2.70.0-361788",
59
59
  "@fluidframework/eslint-config-fluid": "^6.1.0",
60
- "@fluidframework/local-driver": "2.70.0-361248",
61
- "@fluidframework/sequence": "2.70.0-361248",
60
+ "@fluidframework/local-driver": "2.70.0-361788",
61
+ "@fluidframework/sequence": "2.70.0-361788",
62
62
  "@fluidframework/server-local-server": "^7.0.0",
63
- "@fluidframework/test-runtime-utils": "2.70.0-361248",
64
- "@fluidframework/test-utils": "2.70.0-361248",
63
+ "@fluidframework/test-runtime-utils": "2.70.0-361788",
64
+ "@fluidframework/test-utils": "2.70.0-361788",
65
65
  "@microsoft/api-extractor": "7.52.11",
66
66
  "@types/lodash": "^4.14.118",
67
67
  "@types/mocha": "^10.0.10",
@@ -25,7 +25,11 @@ import {
25
25
  MessageType,
26
26
  ISequencedDocumentMessage,
27
27
  } from "@fluidframework/driver-definitions/internal";
28
- import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions/internal";
28
+ import {
29
+ ISummaryTreeWithStats,
30
+ type IRuntimeMessageCollection,
31
+ type ISequencedMessageEnvelope,
32
+ } from "@fluidframework/runtime-definitions/internal";
29
33
  import { SummaryTreeBuilder } from "@fluidframework/runtime-utils/internal";
30
34
  import { SharedObject, IFluidSerializer } from "@fluidframework/shared-object-base/internal";
31
35
  import axios from "axios";
@@ -360,28 +364,26 @@ export class SharedPropertyTree extends SharedObject {
360
364
  }
361
365
 
362
366
  /**
363
- * Process an operation
364
- *
365
- * @param message - the message to prepare
366
- * @param local - whether the message was sent by the local client
367
- * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.
368
- * For messages from a remote client, this will be undefined.
367
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}
369
368
  */
370
- protected processCore(
371
- message: ISequencedDocumentMessage,
372
- local: boolean,
373
- localOpMetadata: unknown,
374
- ) {
369
+ protected processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {
370
+ const { envelope, messagesContent } = messagesCollection;
371
+ for (const messageContent of messagesContent) {
372
+ this.processMessage(envelope, messageContent.contents);
373
+ }
374
+ }
375
+
376
+ private processMessage(messageEnvelope: ISequencedMessageEnvelope, contents: unknown) {
375
377
  if (
376
- message.type === MessageType.Operation &&
377
- message.sequenceNumber > this.skipSequenceNumber
378
+ messageEnvelope.type === MessageType.Operation &&
379
+ messageEnvelope.sequenceNumber > this.skipSequenceNumber
378
380
  ) {
379
381
  const change: IPropertyTreeMessage = this.decodeMessage(
380
- cloneDeep(message.contents as IPropertyTreeMessage),
382
+ cloneDeep(contents as IPropertyTreeMessage),
381
383
  );
382
384
  const content: IRemotePropertyTreeMessage = {
383
385
  ...change,
384
- sequenceNumber: message.sequenceNumber,
386
+ sequenceNumber: messageEnvelope.sequenceNumber,
385
387
  };
386
388
  switch (content.op) {
387
389
  case OpKind.ChangeSet:
@@ -722,12 +724,13 @@ export class SharedPropertyTree extends SharedObject {
722
724
 
723
725
  // eslint-disable-next-line @typescript-eslint/prefer-for-of
724
726
  for (let i = 0; i < missingDeltas.length; i++) {
725
- if (missingDeltas[i].sequenceNumber < commitMetadata.sequenceNumber) {
727
+ const missingDelta = missingDeltas[i];
728
+ if (missingDelta.sequenceNumber < commitMetadata.sequenceNumber) {
726
729
  // TODO: Don't spy on the DeltaManager's private internals.
727
730
  // This is trying to mimic what DeltaManager does in processInboundMessage, but there's no guarantee that
728
731
  // private implementation won't change.
729
732
  const remoteChange: IPropertyTreeMessage = JSON.parse(
730
- missingDeltas[i].contents as string,
733
+ missingDelta.contents as string,
731
734
  ).contents.contents.content.contents;
732
735
  const { changeSet } = (
733
736
  await axios.get(
@@ -746,7 +749,7 @@ export class SharedPropertyTree extends SharedObject {
746
749
  this.addRemoteChange(remoteChange);
747
750
  }
748
751
  } else {
749
- this.processCore(missingDeltas[i], false, {});
752
+ this.processMessage(missingDelta, missingDelta.contents);
750
753
  }
751
754
  }
752
755