@fluid-experimental/property-dds 0.59.2001 → 0.59.3000

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.eslintrc.js CHANGED
@@ -14,6 +14,6 @@ module.exports = {
14
14
  },
15
15
  rules: {
16
16
  "@typescript-eslint/strict-boolean-expressions": "off",
17
- "no-null/no-null": "off",
17
+ "tsdoc/syntax": "off",
18
18
  },
19
19
  };
@@ -95,7 +95,7 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
95
95
  const changes = this._root._serialize(true, false, property_properties_1.BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);
96
96
  this._root.cleanDirty(property_properties_1.BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);
97
97
  const _changeSet = new property_changeset_1.ChangeSet(changes);
98
- if (!isEmpty_1.default(_changeSet.getSerializedChangeSet())) {
98
+ if (!(0, isEmpty_1.default)(_changeSet.getSerializedChangeSet())) {
99
99
  this.emit("localModification", _changeSet);
100
100
  }
101
101
  }
@@ -125,7 +125,7 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
125
125
  if (submitEmptyChange === undefined) {
126
126
  doSubmit = metadata !== undefined;
127
127
  }
128
- if (doSubmit || !isEmpty_1.default(changes)) {
128
+ if (doSubmit || !(0, isEmpty_1.default)(changes)) {
129
129
  this.applyChangeSet(changes, metadata || {});
130
130
  this.root.cleanDirty();
131
131
  }
@@ -140,7 +140,7 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
140
140
  op: 0 /* ChangeSet */,
141
141
  changeSet,
142
142
  metadata,
143
- guid: uuid_1.v4(),
143
+ guid: (0, uuid_1.v4)(),
144
144
  remoteHeadGuid,
145
145
  referenceGuid: this.localChanges.length > 0 ? this.localChanges[this.localChanges.length - 1].guid : remoteHeadGuid,
146
146
  localBranchStart: this.localChanges.length > 0 ? this.localChanges[0].guid : undefined,
@@ -149,10 +149,10 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
149
149
  this._applyLocalChangeSet(change);
150
150
  // Queue the op for transmission to the Fluid service.
151
151
  if (this.transmissionsHaveBeenStopped) {
152
- this.enqueuedMessages.push(fastest_json_copy_1.copy(change));
152
+ this.enqueuedMessages.push((0, fastest_json_copy_1.copy)(change));
153
153
  }
154
154
  else {
155
- this.submitLocalMessage(fastest_json_copy_1.copy(change));
155
+ this.submitLocalMessage((0, fastest_json_copy_1.copy)(change));
156
156
  }
157
157
  }
158
158
  stopTransmission(stop) {
@@ -202,7 +202,7 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
202
202
  case 0 /* ChangeSet */:
203
203
  // If the op originated locally from this client, we've already accounted for it
204
204
  // by advancing the state. Otherwise, advance the PRNG now.
205
- this._applyRemoteChangeSet(fastest_json_copy_1.copy(content));
205
+ this._applyRemoteChangeSet((0, fastest_json_copy_1.copy)(content));
206
206
  break;
207
207
  default:
208
208
  break;
@@ -302,7 +302,7 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
302
302
  const packr = new msgpackr_1.Packr();
303
303
  const serializedSummary = packr.pack(summary);
304
304
  for (let pos = 0, i = 0; pos < serializedSummary.length; pos += chunkSize, i++) {
305
- builder.addBlob(`summaryChunk_${i}`, common_utils_1.bufferToString(serializedSummary.slice(pos, pos + chunkSize), "base64"));
305
+ builder.addBlob(`summaryChunk_${i}`, (0, common_utils_1.bufferToString)(serializedSummary.slice(pos, pos + chunkSize), "base64"));
306
306
  snapshot.numChunks++;
307
307
  }
308
308
  }
@@ -314,15 +314,15 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
314
314
  async loadCore(storage) {
315
315
  const runtime = this.runtime;
316
316
  const handleTableChunk = await storage.readBlob("properties");
317
- const utf8 = common_utils_1.bufferToString(handleTableChunk, "utf8");
317
+ const utf8 = (0, common_utils_1.bufferToString)(handleTableChunk, "utf8");
318
318
  const snapshot = this.serializer.parse(utf8);
319
319
  this.useMH = snapshot.useMH;
320
320
  try {
321
321
  if (!snapshot.useMH) {
322
322
  // We load all chunks
323
- const chunks = await Promise.all(range_1.default(snapshot.numChunks).map(async (i) => {
324
- const buffer = common_utils_1.bufferToString(await storage.readBlob(`summaryChunk_${i}`), "utf8");
325
- return common_utils_1.stringToBuffer(buffer, "base64");
323
+ const chunks = await Promise.all((0, range_1.default)(snapshot.numChunks).map(async (i) => {
324
+ const buffer = (0, common_utils_1.bufferToString)(await storage.readBlob(`summaryChunk_${i}`), "utf8");
325
+ return (0, common_utils_1.stringToBuffer)(buffer, "base64");
326
326
  }));
327
327
  const totalLength = chunks.reduce((a, b) => a + b.byteLength, 0);
328
328
  const serializedSummary = new Uint8Array(totalLength);
@@ -344,7 +344,7 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
344
344
  if (isPartialCheckoutActive && this.options.paths) {
345
345
  this.remoteTipView = property_changeset_1.Utils.getFilteredChangeSetByPaths(this.remoteTipView, this.options.paths);
346
346
  }
347
- this.tipView = fastest_json_copy_1.copy(this.remoteTipView);
347
+ this.tipView = (0, fastest_json_copy_1.copy)(this.remoteTipView);
348
348
  this.skipSequenceNumber = 0;
349
349
  }
350
350
  else {
@@ -358,7 +358,7 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
358
358
  materializedView = property_changeset_1.Utils.getFilteredChangeSetByPaths(materializedView, this.options.paths);
359
359
  }
360
360
  this.tipView = materializedView;
361
- this.remoteTipView = fastest_json_copy_1.copy(this.tipView);
361
+ this.remoteTipView = (0, fastest_json_copy_1.copy)(this.tipView);
362
362
  this.remoteChanges = [];
363
363
  let missingDeltas = [];
364
364
  const firstDelta = Math.min(commitMetadata.minimumSequenceNumber, summaryMinimumSequenceNumber);
@@ -395,7 +395,7 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
395
395
  finally {
396
396
  this._root.deserialize(this.tipView, undefined, false, false);
397
397
  const _changeSet = new property_changeset_1.ChangeSet(this.tipView);
398
- if (!isEmpty_1.default(_changeSet.getSerializedChangeSet())) {
398
+ if (!(0, isEmpty_1.default)(_changeSet.getSerializedChangeSet())) {
399
399
  this.emit("localModification", _changeSet);
400
400
  }
401
401
  this.root.cleanDirty();
@@ -414,10 +414,10 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
414
414
  }
415
415
  }
416
416
  _applyRemoteChangeSet(change) {
417
- this.unrebasedRemoteChanges[change.guid] = fastest_json_copy_1.copy(change);
417
+ this.unrebasedRemoteChanges[change.guid] = (0, fastest_json_copy_1.copy)(change);
418
418
  // This is the first message in the history of the document.
419
419
  if (this.remoteChanges.length !== 0) {
420
- property_changeset_1.rebaseToRemoteChanges(change, this.getUnrebasedChange.bind(this), this.getRebasedChanges.bind(this));
420
+ (0, property_changeset_1.rebaseToRemoteChanges)(change, this.getUnrebasedChange.bind(this), this.getRebasedChanges.bind(this));
421
421
  }
422
422
  this.remoteChanges.push(change);
423
423
  // Apply the remote change set to the remote tip view
@@ -443,15 +443,15 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
443
443
  return this.unrebasedRemoteChanges[guid];
444
444
  }
445
445
  getRebasedChanges(startGuid, endGuid) {
446
- const startIndex = findIndex_1.default(this.remoteChanges, (c) => c.guid === startGuid);
446
+ const startIndex = (0, findIndex_1.default)(this.remoteChanges, (c) => c.guid === startGuid);
447
447
  if (endGuid !== undefined) {
448
- const endIndex = findIndex_1.default(this.remoteChanges, (c) => c.guid === endGuid);
448
+ const endIndex = (0, findIndex_1.default)(this.remoteChanges, (c) => c.guid === endGuid);
449
449
  return this.remoteChanges.slice(startIndex + 1, endIndex + 1);
450
450
  }
451
451
  return this.remoteChanges.slice(startIndex + 1);
452
452
  }
453
453
  rebaseLocalChanges(change, pendingChanges, newTipDelta) {
454
- let rebaseBaseChangeSet = fastest_json_copy_1.copy(change.changeSet);
454
+ let rebaseBaseChangeSet = (0, fastest_json_copy_1.copy)(change.changeSet);
455
455
  const accumulatedChanges = {};
456
456
  const conflicts = [];
457
457
  if (this.localChanges.length > 0 && this.localChanges[0].guid === change.guid) {
@@ -469,7 +469,7 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
469
469
  // Make sure we never receive changes out of order
470
470
  console.assert(this.localChanges[i].guid !== change.guid);
471
471
  const rebaseMetaInformation = new Map();
472
- const copiedChangeSet = new property_changeset_1.ChangeSet(fastest_json_copy_1.copy(this.localChanges[i].changeSet));
472
+ const copiedChangeSet = new property_changeset_1.ChangeSet((0, fastest_json_copy_1.copy)(this.localChanges[i].changeSet));
473
473
  new property_changeset_1.ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(this.localChanges[i].changeSet, conflicts, {
474
474
  applyAfterMetaInformation: rebaseMetaInformation,
475
475
  });
@@ -495,7 +495,7 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
495
495
  deltaToTipCS.applyChangeSet(rebaseBaseChangeSet);
496
496
  // Update the tip view
497
497
  if (!this.tipView) {
498
- this.tipView = fastest_json_copy_1.copy(this.remoteTipView);
498
+ this.tipView = (0, fastest_json_copy_1.copy)(this.remoteTipView);
499
499
  const changeSet = new property_changeset_1.ChangeSet(this.tipView);
500
500
  changeSet.applyChangeSet(accumulatedChanges);
501
501
  }
@@ -1 +1 @@
1
- {"version":3,"file":"propertyTree.js","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable import/no-internal-modules */\nimport isEmpty from \"lodash/isEmpty\";\nimport findIndex from \"lodash/findIndex\";\nimport range from \"lodash/range\";\nimport {copy as cloneDeep} from \"fastest-json-copy\";\nimport { Packr } from \"msgpackr\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport {\n\tISequencedDocumentMessage,\n\tMessageType,\n\tFileMode,\n\tTreeEntry,\n\tITreeEntry,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\n\nimport { bufferToString, stringToBuffer, assert } from \"@fluidframework/common-utils\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\n\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\n\nimport { PropertyFactory, BaseProperty, NodeProperty } from \"@fluid-experimental/property-properties\";\n\nimport { v4 as uuidv4 } from \"uuid\";\nimport axios from \"axios\";\nimport { PropertyTreeFactory } from \"./propertyTreeFactory\";\n\nexport type SerializedChangeSet = any;\n\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\nexport interface IPropertyTreeMessage {\n\top: OpKind;\n\tchangeSet: SerializedChangeSet;\n\tmetadata: Metadata;\n\tguid: string;\n\treferenceGuid: string;\n\tremoteHeadGuid: string;\n\tlocalBranchStart: string | undefined;\n\trebaseMetaInformation?: Map<any, any>;\n\tuseMH?: boolean;\n}\n\nexport interface IRemotePropertyTreeMessage extends IPropertyTreeMessage {\n\tsequenceNumber: number;\n}\ninterface ISnapshot {\n\tbranchGuid: string;\n\tsummaryMinimumSequenceNumber: number;\n\tuseMH: boolean;\n\tnumChunks: number;\n}\ninterface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n}\n\nexport interface SharedPropertyTreeOptions {\n\tpaths?: string[];\n\tclientFiltering?: boolean;\n\tuseMH?: boolean;\n}\n\n/**\n * Silly DDS example that models a six sided die.\n *\n * Unlike the typical 'Dice Roller' example where clients clobber each other's last roll in a\n * SharedMap, this 'SharedDie' DDS works by advancing an internal PRNG each time it sees a 'roll'\n * operation.\n *\n * Because all clients are using the same PRNG starting in the same state, they arrive at\n * consensus by simply applying the same number of rolls. (A fun addition would be logging\n * who received which roll, which would need to change as clients learn how races are resolved\n * in the total order)\n */\nexport class SharedPropertyTree extends SharedObject {\n\ttipView: SerializedChangeSet = {};\n\tremoteTipView: SerializedChangeSet = {};\n\tlocalChanges: IPropertyTreeMessage[] = [];\n\tremoteChanges: IPropertyTreeMessage[] = [];\n\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\ttransmissionsHaveBeenStopped = false;\n\tenqueuedMessages: IPropertyTreeMessage[] = [];\n\tnotificationDelayScope: number = 0;\n\t_root: any = PropertyFactory.create(\"NodeProperty\");\n\toptions: SharedPropertyTreeOptions;\n\tskipSequenceNumber: number = -1;\n\theadCommitGuid: string = \"\";\n\tuseMH: boolean = false;\n\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\toptions: SharedPropertyTreeOptions,\n\t) {\n\t\tsuper(id, runtime, attributes);\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}\n\n\t/**\n\t * Create a new shared cell\n\t *\n\t * @param runtime - data store runtime the new shared map belongs to\n\t * @param id - optional name of the shared map\n\t * @returns newly create shared map (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string, queryString?: string) {\n\t\treturn runtime.createChannel(id, PropertyTreeFactory.Type) as SharedPropertyTree;\n\t}\n\n\t/**\n\t * Get a factory for SharedDie to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedDie\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new PropertyTreeFactory();\n\t}\n\n\t/**\n\t * in case of partial checkout we want to send the paths we are interested in once we are connected\n\t */\n\tprotected onConnect() {\n\t\t// on connect we scope all deltas such that we only get relevant changes\n\t\t// since we know the paths already at constuction time this is okay\n\t\tthis.scopeFutureDeltasToPaths(this.options.paths);\n\t}\n\n\tprivate scopeFutureDeltasToPaths(paths?: string[]) {\n\t\tconst socket = (this.runtime.deltaManager as any).deltaManager.connectionManager.connection.socket;\n\t\tsocket.emit(\"partial_checkout\", { paths });\n\t}\n\n\tpublic _reportDirtinessToView() {\n\t\t// Check whether anybody is listening. If not, we don't want to pay the price\n\t\t// for the serialization of the data structure\n\t\tif (this.listenerCount(\"localModification\") > 0) {\n\t\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n this._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 this._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n }\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\tif(this.localChanges.length > 0) {\n\t\t\treturn this.localChanges[this.localChanges.length - 1];\n\t\t} else {\n\t\t\treturn this.remoteChanges[this.remoteChanges.length - 1];\n\t\t}\n\t}\n\tpublic get root(): NodeProperty {\n\t\treturn this._root as NodeProperty;\n\t}\n\n\tpublic commit(metadata?: Metadata, submitEmptyChange?: boolean) {\n\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\n\t\tlet doSubmit = !!submitEmptyChange;\n\n\t\t// if no override provided dont submit unless metadata are provided\n\t\tif (submitEmptyChange === undefined) {\n\t\t\tdoSubmit = metadata !== undefined;\n\t\t}\n\n\t\tif (doSubmit || !isEmpty(changes)) {\n\t\t\tthis.applyChangeSet(changes, metadata || {});\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\tprivate applyChangeSet(changeSet: SerializedChangeSet, metadata: Metadata) {\n\t\tconst _changeSet = new ChangeSet(changeSet);\n\t\t_changeSet._toReversibleChangeSet(this.tipView);\n\n\t\tconst remoteHeadGuid =\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\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,\n\t\t\treferenceGuid:\n\t\t\t\tthis.localChanges.length > 0 ? this.localChanges[this.localChanges.length - 1].guid : remoteHeadGuid,\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\n\t\t// Queue the op for transmission to the Fluid service.\n\t\tif (this.transmissionsHaveBeenStopped) {\n\t\t\tthis.enqueuedMessages.push(cloneDeep(change));\n\t\t} else {\n\t\t\tthis.submitLocalMessage(cloneDeep(change));\n\t\t}\n\t}\n\n\tstopTransmission(stop: boolean) {\n\t\tthis.transmissionsHaveBeenStopped = stop;\n\t\tif (stop === false) {\n\t\t\tfor (const message of this.enqueuedMessages) {\n\t\t\t\tthis.submitLocalMessage(message);\n\t\t\t}\n\t\t\tthis.enqueuedMessages = [];\n\t\t}\n\t}\n\t/**\n\t * Delays notifications until popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic pushNotificationDelayScope() {\n\t\t// set the scope counter\n\t\tthis.notificationDelayScope++;\n\n\t\t// If we reach 0, we have to report unreported changes\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tthis._root._reportDirtinessToView();\n\t\t}\n\t}\n\n\t/**\n\t * Re-enables notifications when popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic popNotificationDelayScope() {\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tconsole.error(\"Unbalanced push/pop calls.\");\n\t\t}\n\t\tthis.notificationDelayScope--;\n\t\tthis._root._reportDirtinessToView();\n\t}\n\n\t/**\n\t * Process an operation\n\t *\n\t * @param message - the message to prepare\n\t * @param local - whether the message was sent by the local client\n\t * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.\n\t * For messages from a remote client, this will be undefined.\n\t */\n\tprotected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\tif (message.type === MessageType.Operation && message.sequenceNumber > this.skipSequenceNumber) {\n\t\t\tconst content: IRemotePropertyTreeMessage = { ...message.contents, sequenceNumber: message.sequenceNumber };\n\t\t\tswitch (content.op) {\n\t\t\t\tcase OpKind.ChangeSet:\n\t\t\t\t\t// If the op originated locally from this client, we've already accounted for it\n\t\t\t\t\t// by advancing the state. Otherwise, advance the PRNG now.\n\t\t\t\t\tthis._applyRemoteChangeSet(cloneDeep(content));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static prune(\n\t\tminimumSequenceNumber: number,\n\t\tremoteChanges: IPropertyTreeMessage[],\n\t\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>,\n\t) {\n\t\t// for faster lookup of remote change guids\n\t\tconst remoteChangeMap = new Map<string, number>();\n\t\tremoteChanges.forEach((change, index) => {\n\t\t\tremoteChangeMap.set(change.guid, index);\n\t\t});\n\n\t\t// we will track visited nodes\n\t\tconst visitedUnrebasedRemoteChanges = new Set<string>();\n\t\tconst visitedRemoteChanges = new Set<string>();\n\n\t\tfor (const id of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tconst unrebasedChange = unrebasedRemoteChanges[id];\n\n\t\t\t// we are only interested in changes that are newer than the sequence number\n\t\t\t// and that were not yet visited previously\n\t\t\tif (\n\t\t\t\tunrebasedChange.sequenceNumber >= minimumSequenceNumber &&\n\t\t\t\t!visitedUnrebasedRemoteChanges.has(unrebasedChange.guid)\n\t\t\t) {\n\t\t\t\t// we visited that unrebased change and mark it as visited\n\t\t\t\tvisitedUnrebasedRemoteChanges.add(unrebasedChange.guid);\n\n\t\t\t\tlet visitor = unrebasedChange;\n\t\t\t\t// we will walk along the commit chain until we hit a remote change or a visited unrebased commit\n\t\t\t\t// at that point we can skip since we already traced the rest of the commit chain\n\t\t\t\twhile (\n\t\t\t\t\tvisitor.remoteHeadGuid !== visitor.referenceGuid ||\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.has(visitor.referenceGuid)\n\t\t\t\t) {\n\t\t\t\t\tconst guid = visitor.referenceGuid;\n\t\t\t\t\tif (guid === \"\") {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// since the change is not in remote it must be in unrebased\n\t\t\t\t\tvisitor = unrebasedRemoteChanges[visitor.referenceGuid];\n\t\t\t\t\tif (!visitor) {\n\t\t\t\t\t\tthrow new Error(`no visitor found for guid \"${guid}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.add(visitor.guid);\n\t\t\t\t}\n\t\t\t\t// if we exited the loop because we hit a remote change than add it as visited\n\t\t\t\tif (visitor.remoteHeadGuid === visitor.referenceGuid && remoteChangeMap.has(visitor.referenceGuid)) {\n\t\t\t\t\tvisitedRemoteChanges.add(visitor.referenceGuid);\n\t\t\t\t}\n\n\t\t\t\t// If we have a change that refers to the start of the history (remoteHeadGuid === \"\"), we have to\n\t\t\t\t// keep all remote Changes until this change has been processed\n\t\t\t\tif (visitor.remoteHeadGuid === \"\") {\n\t\t\t\t\tvisitedRemoteChanges.add(remoteChanges[0].guid);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlet pruned = 0;\n\t\t// we can now filter the unrebased changes by removing any changes\n\t\t// we have not visited at all during our traversal\n\t\tconst prunedUnrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\t\tfor (const key of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tif (visitedUnrebasedRemoteChanges.has(key)) {\n\t\t\t\tprunedUnrebasedRemoteChanges[key] = unrebasedRemoteChanges[key];\n\t\t\t} else {\n\t\t\t\tpruned++;\n\t\t\t}\n\t\t}\n\n\t\t// find minimum index\n\t\tconst minIndex = Math.min(...[...visitedRemoteChanges].map((key) => remoteChangeMap.get(key) as number));\n\n\t\tconst prunedRemoteChanges = remoteChanges.slice(minIndex);\n\t\tpruned += minIndex;\n\n\t\treturn {\n\t\t\tremoteChanges: prunedRemoteChanges,\n\t\t\tunrebasedRemoteChanges: prunedUnrebasedRemoteChanges,\n\t\t\tprunedCount: pruned,\n\t\t};\n\t}\n\tpublic pruneHistory() {\n\t\tconst msn = this.runtime.deltaManager.minimumSequenceNumber;\n\n\t\tconst { remoteChanges, unrebasedRemoteChanges } = SharedPropertyTree.prune(\n\t\t\tmsn,\n\t\t\tthis.remoteChanges,\n\t\t\tthis.unrebasedRemoteChanges,\n\t\t);\n\n\t\tthis.remoteChanges = remoteChanges;\n\t\tthis.unrebasedRemoteChanges = unrebasedRemoteChanges;\n\t}\n\tpublic summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tthis.pruneHistory();\n\t\tconst snapshot: ISnapshot = {\n\t\t\tbranchGuid: this.handle.absolutePath.split(\"/\").pop() as string,\n\t\t\tsummaryMinimumSequenceNumber: this.runtime.deltaManager.minimumSequenceNumber,\n\t\t\tuseMH: this.useMH,\n\t\t\tnumChunks: 0,\n\t\t};\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tif (!this.useMH) {\n\t\t\t// If the MH is not used, we have to include the tip view, the remote changes and the received\n\t\t\t// deltas to the summary\n\t\t\tconst summary: ISnapshotSummary = {\n\t\t\t\tremoteTipView: this.remoteTipView,\n\t\t\t\tremoteChanges: this.remoteChanges,\n\t\t\t\tunrebasedRemoteChanges: this.unrebasedRemoteChanges,\n\t\t\t};\n\t\t\tconst chunkSize = 5000 * 1024; // Default limit seems to be 5MB\n\t\t\tconst packr = new Packr();\n\t\t\tconst serializedSummary = packr.pack(summary);\n\n\t\t\tfor (let pos = 0, i = 0; pos < serializedSummary.length; pos += chunkSize, i++) {\n\t\t\t\tbuilder.addBlob(`summaryChunk_${i}`,\n\t\t\t\t\t\t\t\tbufferToString(serializedSummary.slice(pos, pos + chunkSize), \"base64\"));\n\t\t\t\tsnapshot.numChunks++;\n\t\t\t}\n\t\t}\n\n\t\tbuilder.addBlob(\"properties\", serializer !== undefined\n\t\t\t? serializer.stringify(snapshot, this.handle)\n\t\t\t: JSON.stringify(snapshot));\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst runtime = this.runtime;\n\t\tconst handleTableChunk = await storage.readBlob(\"properties\");\n\t\tconst utf8 = bufferToString(handleTableChunk, \"utf8\");\n\n\t\tconst snapshot: ISnapshot = this.serializer.parse(utf8);\n\t\tthis.useMH = snapshot.useMH;\n\n\t\ttry {\n\t\t\tif (!snapshot.useMH) {\n\t\t\t\t// We load all chunks\n\t\t\t\tconst chunks: ArrayBufferLike[] = await Promise.all(\n\t\t\t\t\trange(snapshot.numChunks).map(async (i) => {\n\t\t\t\t\t\tconst buffer = bufferToString(await storage.readBlob(`summaryChunk_${i}`), \"utf8\");\n\t\t\t\t\t\treturn stringToBuffer(buffer, \"base64\");\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\n\t\t\t\tconst packr = new Packr();\n\t\t\t\tconst snapshotSummary = packr.unpack(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\tthis.remoteTipView = snapshotSummary.remoteTipView;\n\t\t\t\tthis.remoteChanges = snapshotSummary.remoteChanges;\n\t\t\t\tthis.unrebasedRemoteChanges = snapshotSummary.unrebasedRemoteChanges;\n\n\t\t\t\tconst isPartialCheckoutActive = !!(this.options.clientFiltering && this.options.paths);\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tthis.remoteTipView = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\tthis.remoteTipView,\n\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\n\t\t\t\tthis.skipSequenceNumber = 0;\n\t\t\t} else {\n\t\t\t\tconst { branchGuid, summaryMinimumSequenceNumber } = snapshot;\n\t\t\t\tconst branchResponse = await axios.get(`http://localhost:3000/branch/${branchGuid}`);\n\t\t\t\tthis.headCommitGuid = branchResponse.data.headCommitGuid;\n\t\t\t\tconst {\n\t\t\t\t\tcommit: { meta: commitMetadata },\n\t\t\t\t} = (await axios.get(`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}`)).data;\n\t\t\t\tlet { changeSet: materializedView } = (\n\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}/materializedView`,\n\t\t\t\t\t)\n\t\t\t\t).data;\n\n\t\t\t\tconst isPartialCheckoutActive = this.options.clientFiltering && this.options.paths;\n\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tmaterializedView = ChangeSetUtils.getFilteredChangeSetByPaths(materializedView, this.options.paths);\n\t\t\t\t}\n\n\t\t\t\tthis.tipView = materializedView;\n\t\t\t\tthis.remoteTipView = cloneDeep(this.tipView);\n\t\t\t\tthis.remoteChanges = [];\n\n\t\t\t\tlet missingDeltas: ISequencedDocumentMessage[] = [];\n\t\t\t\tconst firstDelta = Math.min(commitMetadata.minimumSequenceNumber, summaryMinimumSequenceNumber);\n\t\t\t\tconst lastDelta = commitMetadata.sequenceNumber;\n\n\t\t\t\tconst dm = (this.runtime.deltaManager as any).deltaManager;\n\t\t\t\tawait dm.getDeltas(\"DocumentOpen\", firstDelta, lastDelta, (messages: ISequencedDocumentMessage[]) => {\n\t\t\t\t\tmissingDeltas = messages.filter((x) => x.type === \"op\");\n\t\t\t\t});\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\t\t\tfor (let i = 0; i < missingDeltas.length; i++) {\n\t\t\t\t\tif (missingDeltas[i].sequenceNumber < commitMetadata.sequenceNumber) {\n\t\t\t\t\t\tconst remoteChange: IPropertyTreeMessage\n\t\t\t\t\t\t\t= JSON.parse(missingDeltas[i].contents).contents.contents.content.contents;\n\t\t\t\t\t\tconst { changeSet } = (\n\t\t\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${remoteChange.guid}/changeSet`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t).data;\n\t\t\t\t\t\tremoteChange.changeSet = changeSet;\n\n\t\t\t\t\t\tif (remoteChange) {\n\t\t\t\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\t\t\t\tremoteChange.changeSet = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\t\t\t\tremoteChange.changeSet,\n\t\t\t\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.remoteChanges.push(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.remoteChanges.push(change);\n\n\t\t// Apply the remote change set to the remote tip view\n\t\tconst remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);\n\t\tremoteChangeSetWrapper.applyChangeSet(change.changeSet);\n\n\t\t// Rebase the local changes\n\t\tconst pendingChanges = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\tnew ChangeSet(pendingChanges)._toReversibleChangeSet(this.tipView);\n\n\t\tconst changesToTip: SerializedChangeSet = {};\n\t\tconst changesNeeded = this.rebaseLocalChanges(change, pendingChanges, changesToTip);\n\n\t\tif (changesNeeded) {\n\t\t\tthis.pushNotificationDelayScope();\n\t\t\t// Checkout the new tip\n\t\t\tthis._root.applyChangeSet(changesToTip);\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\t\tthis._root.applyChangeSet(pendingChanges);\n\t\t\tthis.popNotificationDelayScope();\n\t\t}\n\n\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t// assert(JSON.stringify(this.root.serialize()) === JSON.stringify(this.tipView));\n\t}\n\n\tgetUnrebasedChange(guid: string) {\n\t\treturn this.unrebasedRemoteChanges[guid];\n\t}\n\n\tgetRebasedChanges(startGuid: string, endGuid?: string) {\n\t\tconst startIndex = findIndex(this.remoteChanges, (c) => c.guid === startGuid);\n\t\tif (endGuid !== undefined) {\n\t\t\tconst endIndex = findIndex(this.remoteChanges, (c) => c.guid === endGuid);\n\t\t\treturn this.remoteChanges.slice(startIndex + 1, endIndex + 1);\n\t\t}\n\t\treturn this.remoteChanges.slice(startIndex + 1);\n\t}\n\n\tprivate rebaseLocalChanges(\n\t\tchange: IPropertyTreeMessage,\n\t\tpendingChanges: SerializedChangeSet,\n\t\tnewTipDelta: SerializedChangeSet,\n\t): boolean {\n\t\tlet rebaseBaseChangeSet = cloneDeep(change.changeSet);\n\n\t\tconst accumulatedChanges: SerializedChangeSet = {};\n\t\tconst conflicts = [] as any[];\n\n\t\tif (this.localChanges.length > 0 && this.localChanges[0].guid === change.guid) {\n\t\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t\t// assert(JSON.stringify(this.localChanges[0].changeSet) === JSON.stringify(change.changeSet),\n\t\t\t// \"Local change different than rebased remote change.\");\n\n\t\t\t// If we got a confirmation of the commit on the tip of the localChanges array,\n\t\t\t// there will be no update of the tip view at all. We just move it from local changes\n\t\t\t// to remote changes\n\t\t\tthis.localChanges.shift();\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\tfor (let i = 0; i < this.localChanges.length; i++) {\n\t\t\t// Make sure we never receive changes out of order\n\t\t\tconsole.assert(this.localChanges[i].guid !== change.guid);\n\n\t\t\tconst rebaseMetaInformation = new Map();\n\n\t\t\tconst copiedChangeSet = new ChangeSet(cloneDeep(this.localChanges[i].changeSet));\n\t\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(this.localChanges[i].changeSet, conflicts, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\n\t\t\tcopiedChangeSet.toInverseChangeSet();\n\t\t\tcopiedChangeSet.applyChangeSet(rebaseBaseChangeSet);\n\t\t\tcopiedChangeSet.applyChangeSet(this.localChanges[i].changeSet, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\t\t\trebaseBaseChangeSet = copiedChangeSet.getSerializedChangeSet();\n\n\t\t\tnew ChangeSet(accumulatedChanges).applyChangeSet(this.localChanges[i].changeSet);\n\t\t}\n\n\t\t// Compute the inverse of the pending changes and store the result in newTipDelta\n\t\tconst pendingChangesRebaseMetaInformation = new Map();\n\t\tconst deltaToTipCS = new ChangeSet(newTipDelta);\n\t\tdeltaToTipCS.applyChangeSet(pendingChanges);\n\t\tdeltaToTipCS.toInverseChangeSet();\n\n\t\t// Perform a rebase of the pending changes\n\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(pendingChanges, conflicts, {\n\t\t\tapplyAfterMetaInformation: pendingChangesRebaseMetaInformation,\n\t\t});\n\n\t\t// Compute the delta between the old tip (including pending changes)\n\t\t// and the new tip (not including the rebased pending changes)\n\t\tdeltaToTipCS.applyChangeSet(rebaseBaseChangeSet);\n\n\t\t// Update the tip view\n\t\tif (!this.tipView) {\n\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\t\t\tconst changeSet = new ChangeSet(this.tipView);\n\t\t\tchangeSet.applyChangeSet(accumulatedChanges);\n\t\t} else {\n\t\t\tnew ChangeSet(this.tipView).applyChangeSet(newTipDelta);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprotected applyStashedOp() {\n\t\tthrow new Error(\"not implemented\");\n\t}\n}\n"]}
1
+ {"version":3,"file":"propertyTree.js","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable import/no-internal-modules */\nimport isEmpty from \"lodash/isEmpty\";\nimport findIndex from \"lodash/findIndex\";\nimport range from \"lodash/range\";\nimport { copy as cloneDeep } from \"fastest-json-copy\";\nimport { Packr } from \"msgpackr\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport {\n\tISequencedDocumentMessage,\n\tMessageType,\n\tFileMode,\n\tTreeEntry,\n\tITreeEntry,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\n\nimport { bufferToString, stringToBuffer, assert } from \"@fluidframework/common-utils\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\n\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\n\nimport { PropertyFactory, BaseProperty, NodeProperty } from \"@fluid-experimental/property-properties\";\n\nimport { v4 as uuidv4 } from \"uuid\";\nimport axios from \"axios\";\nimport { PropertyTreeFactory } from \"./propertyTreeFactory\";\n\nexport type SerializedChangeSet = any;\n\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\nexport interface IPropertyTreeMessage {\n\top: OpKind;\n\tchangeSet: SerializedChangeSet;\n\tmetadata: Metadata;\n\tguid: string;\n\treferenceGuid: string;\n\tremoteHeadGuid: string;\n\tlocalBranchStart: string | undefined;\n\trebaseMetaInformation?: Map<any, any>;\n\tuseMH?: boolean;\n}\n\nexport interface IRemotePropertyTreeMessage extends IPropertyTreeMessage {\n\tsequenceNumber: number;\n}\ninterface ISnapshot {\n\tbranchGuid: string;\n\tsummaryMinimumSequenceNumber: number;\n\tuseMH: boolean;\n\tnumChunks: number;\n}\ninterface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n}\n\nexport interface SharedPropertyTreeOptions {\n\tpaths?: string[];\n\tclientFiltering?: boolean;\n\tuseMH?: boolean;\n}\n\n/**\n * Silly DDS example that models a six sided die.\n *\n * Unlike the typical 'Dice Roller' example where clients clobber each other's last roll in a\n * SharedMap, this 'SharedDie' DDS works by advancing an internal PRNG each time it sees a 'roll'\n * operation.\n *\n * Because all clients are using the same PRNG starting in the same state, they arrive at\n * consensus by simply applying the same number of rolls. (A fun addition would be logging\n * who received which roll, which would need to change as clients learn how races are resolved\n * in the total order)\n */\nexport class SharedPropertyTree extends SharedObject {\n\ttipView: SerializedChangeSet = {};\n\tremoteTipView: SerializedChangeSet = {};\n\tlocalChanges: IPropertyTreeMessage[] = [];\n\tremoteChanges: IPropertyTreeMessage[] = [];\n\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\ttransmissionsHaveBeenStopped = false;\n\tenqueuedMessages: IPropertyTreeMessage[] = [];\n\tnotificationDelayScope: number = 0;\n\t_root: any = PropertyFactory.create(\"NodeProperty\");\n\toptions: SharedPropertyTreeOptions;\n\tskipSequenceNumber: number = -1;\n\theadCommitGuid: string = \"\";\n\tuseMH: boolean = false;\n\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\toptions: SharedPropertyTreeOptions,\n\t) {\n\t\tsuper(id, runtime, attributes);\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}\n\n\t/**\n\t * Create a new shared cell\n\t *\n\t * @param runtime - data store runtime the new shared map belongs to\n\t * @param id - optional name of the shared map\n\t * @returns newly create shared map (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string, queryString?: string) {\n\t\treturn runtime.createChannel(id, PropertyTreeFactory.Type) as SharedPropertyTree;\n\t}\n\n\t/**\n\t * Get a factory for SharedDie to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedDie\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new PropertyTreeFactory();\n\t}\n\n\t/**\n\t * in case of partial checkout we want to send the paths we are interested in once we are connected\n\t */\n\tprotected onConnect() {\n\t\t// on connect we scope all deltas such that we only get relevant changes\n\t\t// since we know the paths already at constuction time this is okay\n\t\tthis.scopeFutureDeltasToPaths(this.options.paths);\n\t}\n\n\tprivate scopeFutureDeltasToPaths(paths?: string[]) {\n\t\tconst socket = (this.runtime.deltaManager as any).deltaManager.connectionManager.connection.socket;\n\t\tsocket.emit(\"partial_checkout\", { paths });\n\t}\n\n\tpublic _reportDirtinessToView() {\n\t\t// Check whether anybody is listening. If not, we don't want to pay the price\n\t\t// for the serialization of the data structure\n\t\tif (this.listenerCount(\"localModification\") > 0) {\n\t\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n this._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 this._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n }\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\tif (this.localChanges.length > 0) {\n\t\t\treturn this.localChanges[this.localChanges.length - 1];\n\t\t} else {\n\t\t\treturn this.remoteChanges[this.remoteChanges.length - 1];\n\t\t}\n\t}\n\tpublic get root(): NodeProperty {\n\t\treturn this._root as NodeProperty;\n\t}\n\n\tpublic commit(metadata?: Metadata, submitEmptyChange?: boolean) {\n\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\n\t\tlet doSubmit = !!submitEmptyChange;\n\n\t\t// if no override provided dont submit unless metadata are provided\n\t\tif (submitEmptyChange === undefined) {\n\t\t\tdoSubmit = metadata !== undefined;\n\t\t}\n\n\t\tif (doSubmit || !isEmpty(changes)) {\n\t\t\tthis.applyChangeSet(changes, metadata || {});\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\tprivate applyChangeSet(changeSet: SerializedChangeSet, metadata: Metadata) {\n\t\tconst _changeSet = new ChangeSet(changeSet);\n\t\t_changeSet._toReversibleChangeSet(this.tipView);\n\n\t\tconst remoteHeadGuid =\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\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,\n\t\t\treferenceGuid:\n\t\t\t\tthis.localChanges.length > 0 ? this.localChanges[this.localChanges.length - 1].guid : remoteHeadGuid,\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\n\t\t// Queue the op for transmission to the Fluid service.\n\t\tif (this.transmissionsHaveBeenStopped) {\n\t\t\tthis.enqueuedMessages.push(cloneDeep(change));\n\t\t} else {\n\t\t\tthis.submitLocalMessage(cloneDeep(change));\n\t\t}\n\t}\n\n\tstopTransmission(stop: boolean) {\n\t\tthis.transmissionsHaveBeenStopped = stop;\n\t\tif (stop === false) {\n\t\t\tfor (const message of this.enqueuedMessages) {\n\t\t\t\tthis.submitLocalMessage(message);\n\t\t\t}\n\t\t\tthis.enqueuedMessages = [];\n\t\t}\n\t}\n\t/**\n\t * Delays notifications until popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic pushNotificationDelayScope() {\n\t\t// set the scope counter\n\t\tthis.notificationDelayScope++;\n\n\t\t// If we reach 0, we have to report unreported changes\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tthis._root._reportDirtinessToView();\n\t\t}\n\t}\n\n\t/**\n\t * Re-enables notifications when popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic popNotificationDelayScope() {\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tconsole.error(\"Unbalanced push/pop calls.\");\n\t\t}\n\t\tthis.notificationDelayScope--;\n\t\tthis._root._reportDirtinessToView();\n\t}\n\n\t/**\n\t * Process an operation\n\t *\n\t * @param message - the message to prepare\n\t * @param local - whether the message was sent by the local client\n\t * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.\n\t * For messages from a remote client, this will be undefined.\n\t */\n\tprotected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\tif (message.type === MessageType.Operation && message.sequenceNumber > this.skipSequenceNumber) {\n\t\t\tconst content: IRemotePropertyTreeMessage = { ...message.contents, sequenceNumber: message.sequenceNumber };\n\t\t\tswitch (content.op) {\n\t\t\t\tcase OpKind.ChangeSet:\n\t\t\t\t\t// If the op originated locally from this client, we've already accounted for it\n\t\t\t\t\t// by advancing the state. Otherwise, advance the PRNG now.\n\t\t\t\t\tthis._applyRemoteChangeSet(cloneDeep(content));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static prune(\n\t\tminimumSequenceNumber: number,\n\t\tremoteChanges: IPropertyTreeMessage[],\n\t\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>,\n\t) {\n\t\t// for faster lookup of remote change guids\n\t\tconst remoteChangeMap = new Map<string, number>();\n\t\tremoteChanges.forEach((change, index) => {\n\t\t\tremoteChangeMap.set(change.guid, index);\n\t\t});\n\n\t\t// we will track visited nodes\n\t\tconst visitedUnrebasedRemoteChanges = new Set<string>();\n\t\tconst visitedRemoteChanges = new Set<string>();\n\n\t\tfor (const id of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tconst unrebasedChange = unrebasedRemoteChanges[id];\n\n\t\t\t// we are only interested in changes that are newer than the sequence number\n\t\t\t// and that were not yet visited previously\n\t\t\tif (\n\t\t\t\tunrebasedChange.sequenceNumber >= minimumSequenceNumber &&\n\t\t\t\t!visitedUnrebasedRemoteChanges.has(unrebasedChange.guid)\n\t\t\t) {\n\t\t\t\t// we visited that unrebased change and mark it as visited\n\t\t\t\tvisitedUnrebasedRemoteChanges.add(unrebasedChange.guid);\n\n\t\t\t\tlet visitor = unrebasedChange;\n\t\t\t\t// we will walk along the commit chain until we hit a remote change or a visited unrebased commit\n\t\t\t\t// at that point we can skip since we already traced the rest of the commit chain\n\t\t\t\twhile (\n\t\t\t\t\tvisitor.remoteHeadGuid !== visitor.referenceGuid ||\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.has(visitor.referenceGuid)\n\t\t\t\t) {\n\t\t\t\t\tconst guid = visitor.referenceGuid;\n\t\t\t\t\tif (guid === \"\") {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// since the change is not in remote it must be in unrebased\n\t\t\t\t\tvisitor = unrebasedRemoteChanges[visitor.referenceGuid];\n\t\t\t\t\tif (!visitor) {\n\t\t\t\t\t\tthrow new Error(`no visitor found for guid \"${guid}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.add(visitor.guid);\n\t\t\t\t}\n\t\t\t\t// if we exited the loop because we hit a remote change than add it as visited\n\t\t\t\tif (visitor.remoteHeadGuid === visitor.referenceGuid && remoteChangeMap.has(visitor.referenceGuid)) {\n\t\t\t\t\tvisitedRemoteChanges.add(visitor.referenceGuid);\n\t\t\t\t}\n\n\t\t\t\t// If we have a change that refers to the start of the history (remoteHeadGuid === \"\"), we have to\n\t\t\t\t// keep all remote Changes until this change has been processed\n\t\t\t\tif (visitor.remoteHeadGuid === \"\") {\n\t\t\t\t\tvisitedRemoteChanges.add(remoteChanges[0].guid);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlet pruned = 0;\n\t\t// we can now filter the unrebased changes by removing any changes\n\t\t// we have not visited at all during our traversal\n\t\tconst prunedUnrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\t\tfor (const key of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tif (visitedUnrebasedRemoteChanges.has(key)) {\n\t\t\t\tprunedUnrebasedRemoteChanges[key] = unrebasedRemoteChanges[key];\n\t\t\t} else {\n\t\t\t\tpruned++;\n\t\t\t}\n\t\t}\n\n\t\t// find minimum index\n\t\tconst minIndex = Math.min(...[...visitedRemoteChanges].map((key) => remoteChangeMap.get(key) as number));\n\n\t\tconst prunedRemoteChanges = remoteChanges.slice(minIndex);\n\t\tpruned += minIndex;\n\n\t\treturn {\n\t\t\tremoteChanges: prunedRemoteChanges,\n\t\t\tunrebasedRemoteChanges: prunedUnrebasedRemoteChanges,\n\t\t\tprunedCount: pruned,\n\t\t};\n\t}\n\tpublic pruneHistory() {\n\t\tconst msn = this.runtime.deltaManager.minimumSequenceNumber;\n\n\t\tconst { remoteChanges, unrebasedRemoteChanges } = SharedPropertyTree.prune(\n\t\t\tmsn,\n\t\t\tthis.remoteChanges,\n\t\t\tthis.unrebasedRemoteChanges,\n\t\t);\n\n\t\tthis.remoteChanges = remoteChanges;\n\t\tthis.unrebasedRemoteChanges = unrebasedRemoteChanges;\n\t}\n\tpublic summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tthis.pruneHistory();\n\t\tconst snapshot: ISnapshot = {\n\t\t\tbranchGuid: this.handle.absolutePath.split(\"/\").pop() as string,\n\t\t\tsummaryMinimumSequenceNumber: this.runtime.deltaManager.minimumSequenceNumber,\n\t\t\tuseMH: this.useMH,\n\t\t\tnumChunks: 0,\n\t\t};\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tif (!this.useMH) {\n\t\t\t// If the MH is not used, we have to include the tip view, the remote changes and the received\n\t\t\t// deltas to the summary\n\t\t\tconst summary: ISnapshotSummary = {\n\t\t\t\tremoteTipView: this.remoteTipView,\n\t\t\t\tremoteChanges: this.remoteChanges,\n\t\t\t\tunrebasedRemoteChanges: this.unrebasedRemoteChanges,\n\t\t\t};\n\t\t\tconst chunkSize = 5000 * 1024; // Default limit seems to be 5MB\n\t\t\tconst packr = new Packr();\n\t\t\tconst serializedSummary = packr.pack(summary);\n\n\t\t\tfor (let pos = 0, i = 0; pos < serializedSummary.length; pos += chunkSize, i++) {\n\t\t\t\tbuilder.addBlob(`summaryChunk_${i}`,\n\t\t\t\t\t\t\t\tbufferToString(serializedSummary.slice(pos, pos + chunkSize), \"base64\"));\n\t\t\t\tsnapshot.numChunks++;\n\t\t\t}\n\t\t}\n\n\t\tbuilder.addBlob(\"properties\", serializer !== undefined\n\t\t\t? serializer.stringify(snapshot, this.handle)\n\t\t\t: JSON.stringify(snapshot));\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst runtime = this.runtime;\n\t\tconst handleTableChunk = await storage.readBlob(\"properties\");\n\t\tconst utf8 = bufferToString(handleTableChunk, \"utf8\");\n\n\t\tconst snapshot: ISnapshot = this.serializer.parse(utf8);\n\t\tthis.useMH = snapshot.useMH;\n\n\t\ttry {\n\t\t\tif (!snapshot.useMH) {\n\t\t\t\t// We load all chunks\n\t\t\t\tconst chunks: ArrayBufferLike[] = await Promise.all(\n\t\t\t\t\trange(snapshot.numChunks).map(async (i) => {\n\t\t\t\t\t\tconst buffer = bufferToString(await storage.readBlob(`summaryChunk_${i}`), \"utf8\");\n\t\t\t\t\t\treturn stringToBuffer(buffer, \"base64\");\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\n\t\t\t\tconst packr = new Packr();\n\t\t\t\tconst snapshotSummary = packr.unpack(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\tthis.remoteTipView = snapshotSummary.remoteTipView;\n\t\t\t\tthis.remoteChanges = snapshotSummary.remoteChanges;\n\t\t\t\tthis.unrebasedRemoteChanges = snapshotSummary.unrebasedRemoteChanges;\n\n\t\t\t\tconst isPartialCheckoutActive = !!(this.options.clientFiltering && this.options.paths);\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tthis.remoteTipView = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\tthis.remoteTipView,\n\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\n\t\t\t\tthis.skipSequenceNumber = 0;\n\t\t\t} else {\n\t\t\t\tconst { branchGuid, summaryMinimumSequenceNumber } = snapshot;\n\t\t\t\tconst branchResponse = await axios.get(`http://localhost:3000/branch/${branchGuid}`);\n\t\t\t\tthis.headCommitGuid = branchResponse.data.headCommitGuid;\n\t\t\t\tconst {\n\t\t\t\t\tcommit: { meta: commitMetadata },\n\t\t\t\t} = (await axios.get(`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}`)).data;\n\t\t\t\tlet { changeSet: materializedView } = (\n\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}/materializedView`,\n\t\t\t\t\t)\n\t\t\t\t).data;\n\n\t\t\t\tconst isPartialCheckoutActive = this.options.clientFiltering && this.options.paths;\n\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tmaterializedView = ChangeSetUtils.getFilteredChangeSetByPaths(materializedView, this.options.paths);\n\t\t\t\t}\n\n\t\t\t\tthis.tipView = materializedView;\n\t\t\t\tthis.remoteTipView = cloneDeep(this.tipView);\n\t\t\t\tthis.remoteChanges = [];\n\n\t\t\t\tlet missingDeltas: ISequencedDocumentMessage[] = [];\n\t\t\t\tconst firstDelta = Math.min(commitMetadata.minimumSequenceNumber, summaryMinimumSequenceNumber);\n\t\t\t\tconst lastDelta = commitMetadata.sequenceNumber;\n\n\t\t\t\tconst dm = (this.runtime.deltaManager as any).deltaManager;\n\t\t\t\tawait dm.getDeltas(\"DocumentOpen\", firstDelta, lastDelta, (messages: ISequencedDocumentMessage[]) => {\n\t\t\t\t\tmissingDeltas = messages.filter((x) => x.type === \"op\");\n\t\t\t\t});\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\t\t\tfor (let i = 0; i < missingDeltas.length; i++) {\n\t\t\t\t\tif (missingDeltas[i].sequenceNumber < commitMetadata.sequenceNumber) {\n\t\t\t\t\t\tconst remoteChange: IPropertyTreeMessage\n\t\t\t\t\t\t\t= JSON.parse(missingDeltas[i].contents).contents.contents.content.contents;\n\t\t\t\t\t\tconst { changeSet } = (\n\t\t\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${remoteChange.guid}/changeSet`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t).data;\n\t\t\t\t\t\tremoteChange.changeSet = changeSet;\n\n\t\t\t\t\t\tif (remoteChange) {\n\t\t\t\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\t\t\t\tremoteChange.changeSet = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\t\t\t\tremoteChange.changeSet,\n\t\t\t\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.remoteChanges.push(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.remoteChanges.push(change);\n\n\t\t// Apply the remote change set to the remote tip view\n\t\tconst remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);\n\t\tremoteChangeSetWrapper.applyChangeSet(change.changeSet);\n\n\t\t// Rebase the local changes\n\t\tconst pendingChanges = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\tnew ChangeSet(pendingChanges)._toReversibleChangeSet(this.tipView);\n\n\t\tconst changesToTip: SerializedChangeSet = {};\n\t\tconst changesNeeded = this.rebaseLocalChanges(change, pendingChanges, changesToTip);\n\n\t\tif (changesNeeded) {\n\t\t\tthis.pushNotificationDelayScope();\n\t\t\t// Checkout the new tip\n\t\t\tthis._root.applyChangeSet(changesToTip);\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\t\tthis._root.applyChangeSet(pendingChanges);\n\t\t\tthis.popNotificationDelayScope();\n\t\t}\n\n\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t// assert(JSON.stringify(this.root.serialize()) === JSON.stringify(this.tipView));\n\t}\n\n\tgetUnrebasedChange(guid: string) {\n\t\treturn this.unrebasedRemoteChanges[guid];\n\t}\n\n\tgetRebasedChanges(startGuid: string, endGuid?: string) {\n\t\tconst startIndex = findIndex(this.remoteChanges, (c) => c.guid === startGuid);\n\t\tif (endGuid !== undefined) {\n\t\t\tconst endIndex = findIndex(this.remoteChanges, (c) => c.guid === endGuid);\n\t\t\treturn this.remoteChanges.slice(startIndex + 1, endIndex + 1);\n\t\t}\n\t\treturn this.remoteChanges.slice(startIndex + 1);\n\t}\n\n\tprivate rebaseLocalChanges(\n\t\tchange: IPropertyTreeMessage,\n\t\tpendingChanges: SerializedChangeSet,\n\t\tnewTipDelta: SerializedChangeSet,\n\t): boolean {\n\t\tlet rebaseBaseChangeSet = cloneDeep(change.changeSet);\n\n\t\tconst accumulatedChanges: SerializedChangeSet = {};\n\t\tconst conflicts = [] as any[];\n\n\t\tif (this.localChanges.length > 0 && this.localChanges[0].guid === change.guid) {\n\t\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t\t// assert(JSON.stringify(this.localChanges[0].changeSet) === JSON.stringify(change.changeSet),\n\t\t\t// \"Local change different than rebased remote change.\");\n\n\t\t\t// If we got a confirmation of the commit on the tip of the localChanges array,\n\t\t\t// there will be no update of the tip view at all. We just move it from local changes\n\t\t\t// to remote changes\n\t\t\tthis.localChanges.shift();\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\tfor (let i = 0; i < this.localChanges.length; i++) {\n\t\t\t// Make sure we never receive changes out of order\n\t\t\tconsole.assert(this.localChanges[i].guid !== change.guid);\n\n\t\t\tconst rebaseMetaInformation = new Map();\n\n\t\t\tconst copiedChangeSet = new ChangeSet(cloneDeep(this.localChanges[i].changeSet));\n\t\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(this.localChanges[i].changeSet, conflicts, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\n\t\t\tcopiedChangeSet.toInverseChangeSet();\n\t\t\tcopiedChangeSet.applyChangeSet(rebaseBaseChangeSet);\n\t\t\tcopiedChangeSet.applyChangeSet(this.localChanges[i].changeSet, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\t\t\trebaseBaseChangeSet = copiedChangeSet.getSerializedChangeSet();\n\n\t\t\tnew ChangeSet(accumulatedChanges).applyChangeSet(this.localChanges[i].changeSet);\n\t\t}\n\n\t\t// Compute the inverse of the pending changes and store the result in newTipDelta\n\t\tconst pendingChangesRebaseMetaInformation = new Map();\n\t\tconst deltaToTipCS = new ChangeSet(newTipDelta);\n\t\tdeltaToTipCS.applyChangeSet(pendingChanges);\n\t\tdeltaToTipCS.toInverseChangeSet();\n\n\t\t// Perform a rebase of the pending changes\n\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(pendingChanges, conflicts, {\n\t\t\tapplyAfterMetaInformation: pendingChangesRebaseMetaInformation,\n\t\t});\n\n\t\t// Compute the delta between the old tip (including pending changes)\n\t\t// and the new tip (not including the rebased pending changes)\n\t\tdeltaToTipCS.applyChangeSet(rebaseBaseChangeSet);\n\n\t\t// Update the tip view\n\t\tif (!this.tipView) {\n\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\t\t\tconst changeSet = new ChangeSet(this.tipView);\n\t\t\tchangeSet.applyChangeSet(accumulatedChanges);\n\t\t} else {\n\t\t\tnew ChangeSet(this.tipView).applyChangeSet(newTipDelta);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprotected applyStashedOp() {\n\t\tthrow new Error(\"not implemented\");\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"propertyTree.js","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable import/no-internal-modules */\nimport isEmpty from \"lodash/isEmpty\";\nimport findIndex from \"lodash/findIndex\";\nimport range from \"lodash/range\";\nimport {copy as cloneDeep} from \"fastest-json-copy\";\nimport { Packr } from \"msgpackr\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport {\n\tISequencedDocumentMessage,\n\tMessageType,\n\tFileMode,\n\tTreeEntry,\n\tITreeEntry,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\n\nimport { bufferToString, stringToBuffer, assert } from \"@fluidframework/common-utils\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\n\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\n\nimport { PropertyFactory, BaseProperty, NodeProperty } from \"@fluid-experimental/property-properties\";\n\nimport { v4 as uuidv4 } from \"uuid\";\nimport axios from \"axios\";\nimport { PropertyTreeFactory } from \"./propertyTreeFactory\";\n\nexport type SerializedChangeSet = any;\n\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\nexport interface IPropertyTreeMessage {\n\top: OpKind;\n\tchangeSet: SerializedChangeSet;\n\tmetadata: Metadata;\n\tguid: string;\n\treferenceGuid: string;\n\tremoteHeadGuid: string;\n\tlocalBranchStart: string | undefined;\n\trebaseMetaInformation?: Map<any, any>;\n\tuseMH?: boolean;\n}\n\nexport interface IRemotePropertyTreeMessage extends IPropertyTreeMessage {\n\tsequenceNumber: number;\n}\ninterface ISnapshot {\n\tbranchGuid: string;\n\tsummaryMinimumSequenceNumber: number;\n\tuseMH: boolean;\n\tnumChunks: number;\n}\ninterface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n}\n\nexport interface SharedPropertyTreeOptions {\n\tpaths?: string[];\n\tclientFiltering?: boolean;\n\tuseMH?: boolean;\n}\n\n/**\n * Silly DDS example that models a six sided die.\n *\n * Unlike the typical 'Dice Roller' example where clients clobber each other's last roll in a\n * SharedMap, this 'SharedDie' DDS works by advancing an internal PRNG each time it sees a 'roll'\n * operation.\n *\n * Because all clients are using the same PRNG starting in the same state, they arrive at\n * consensus by simply applying the same number of rolls. (A fun addition would be logging\n * who received which roll, which would need to change as clients learn how races are resolved\n * in the total order)\n */\nexport class SharedPropertyTree extends SharedObject {\n\ttipView: SerializedChangeSet = {};\n\tremoteTipView: SerializedChangeSet = {};\n\tlocalChanges: IPropertyTreeMessage[] = [];\n\tremoteChanges: IPropertyTreeMessage[] = [];\n\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\ttransmissionsHaveBeenStopped = false;\n\tenqueuedMessages: IPropertyTreeMessage[] = [];\n\tnotificationDelayScope: number = 0;\n\t_root: any = PropertyFactory.create(\"NodeProperty\");\n\toptions: SharedPropertyTreeOptions;\n\tskipSequenceNumber: number = -1;\n\theadCommitGuid: string = \"\";\n\tuseMH: boolean = false;\n\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\toptions: SharedPropertyTreeOptions,\n\t) {\n\t\tsuper(id, runtime, attributes);\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}\n\n\t/**\n\t * Create a new shared cell\n\t *\n\t * @param runtime - data store runtime the new shared map belongs to\n\t * @param id - optional name of the shared map\n\t * @returns newly create shared map (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string, queryString?: string) {\n\t\treturn runtime.createChannel(id, PropertyTreeFactory.Type) as SharedPropertyTree;\n\t}\n\n\t/**\n\t * Get a factory for SharedDie to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedDie\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new PropertyTreeFactory();\n\t}\n\n\t/**\n\t * in case of partial checkout we want to send the paths we are interested in once we are connected\n\t */\n\tprotected onConnect() {\n\t\t// on connect we scope all deltas such that we only get relevant changes\n\t\t// since we know the paths already at constuction time this is okay\n\t\tthis.scopeFutureDeltasToPaths(this.options.paths);\n\t}\n\n\tprivate scopeFutureDeltasToPaths(paths?: string[]) {\n\t\tconst socket = (this.runtime.deltaManager as any).deltaManager.connectionManager.connection.socket;\n\t\tsocket.emit(\"partial_checkout\", { paths });\n\t}\n\n\tpublic _reportDirtinessToView() {\n\t\t// Check whether anybody is listening. If not, we don't want to pay the price\n\t\t// for the serialization of the data structure\n\t\tif (this.listenerCount(\"localModification\") > 0) {\n\t\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n this._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 this._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n }\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\tif(this.localChanges.length > 0) {\n\t\t\treturn this.localChanges[this.localChanges.length - 1];\n\t\t} else {\n\t\t\treturn this.remoteChanges[this.remoteChanges.length - 1];\n\t\t}\n\t}\n\tpublic get root(): NodeProperty {\n\t\treturn this._root as NodeProperty;\n\t}\n\n\tpublic commit(metadata?: Metadata, submitEmptyChange?: boolean) {\n\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\n\t\tlet doSubmit = !!submitEmptyChange;\n\n\t\t// if no override provided dont submit unless metadata are provided\n\t\tif (submitEmptyChange === undefined) {\n\t\t\tdoSubmit = metadata !== undefined;\n\t\t}\n\n\t\tif (doSubmit || !isEmpty(changes)) {\n\t\t\tthis.applyChangeSet(changes, metadata || {});\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\tprivate applyChangeSet(changeSet: SerializedChangeSet, metadata: Metadata) {\n\t\tconst _changeSet = new ChangeSet(changeSet);\n\t\t_changeSet._toReversibleChangeSet(this.tipView);\n\n\t\tconst remoteHeadGuid =\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\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,\n\t\t\treferenceGuid:\n\t\t\t\tthis.localChanges.length > 0 ? this.localChanges[this.localChanges.length - 1].guid : remoteHeadGuid,\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\n\t\t// Queue the op for transmission to the Fluid service.\n\t\tif (this.transmissionsHaveBeenStopped) {\n\t\t\tthis.enqueuedMessages.push(cloneDeep(change));\n\t\t} else {\n\t\t\tthis.submitLocalMessage(cloneDeep(change));\n\t\t}\n\t}\n\n\tstopTransmission(stop: boolean) {\n\t\tthis.transmissionsHaveBeenStopped = stop;\n\t\tif (stop === false) {\n\t\t\tfor (const message of this.enqueuedMessages) {\n\t\t\t\tthis.submitLocalMessage(message);\n\t\t\t}\n\t\t\tthis.enqueuedMessages = [];\n\t\t}\n\t}\n\t/**\n\t * Delays notifications until popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic pushNotificationDelayScope() {\n\t\t// set the scope counter\n\t\tthis.notificationDelayScope++;\n\n\t\t// If we reach 0, we have to report unreported changes\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tthis._root._reportDirtinessToView();\n\t\t}\n\t}\n\n\t/**\n\t * Re-enables notifications when popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic popNotificationDelayScope() {\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tconsole.error(\"Unbalanced push/pop calls.\");\n\t\t}\n\t\tthis.notificationDelayScope--;\n\t\tthis._root._reportDirtinessToView();\n\t}\n\n\t/**\n\t * Process an operation\n\t *\n\t * @param message - the message to prepare\n\t * @param local - whether the message was sent by the local client\n\t * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.\n\t * For messages from a remote client, this will be undefined.\n\t */\n\tprotected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\tif (message.type === MessageType.Operation && message.sequenceNumber > this.skipSequenceNumber) {\n\t\t\tconst content: IRemotePropertyTreeMessage = { ...message.contents, sequenceNumber: message.sequenceNumber };\n\t\t\tswitch (content.op) {\n\t\t\t\tcase OpKind.ChangeSet:\n\t\t\t\t\t// If the op originated locally from this client, we've already accounted for it\n\t\t\t\t\t// by advancing the state. Otherwise, advance the PRNG now.\n\t\t\t\t\tthis._applyRemoteChangeSet(cloneDeep(content));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static prune(\n\t\tminimumSequenceNumber: number,\n\t\tremoteChanges: IPropertyTreeMessage[],\n\t\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>,\n\t) {\n\t\t// for faster lookup of remote change guids\n\t\tconst remoteChangeMap = new Map<string, number>();\n\t\tremoteChanges.forEach((change, index) => {\n\t\t\tremoteChangeMap.set(change.guid, index);\n\t\t});\n\n\t\t// we will track visited nodes\n\t\tconst visitedUnrebasedRemoteChanges = new Set<string>();\n\t\tconst visitedRemoteChanges = new Set<string>();\n\n\t\tfor (const id of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tconst unrebasedChange = unrebasedRemoteChanges[id];\n\n\t\t\t// we are only interested in changes that are newer than the sequence number\n\t\t\t// and that were not yet visited previously\n\t\t\tif (\n\t\t\t\tunrebasedChange.sequenceNumber >= minimumSequenceNumber &&\n\t\t\t\t!visitedUnrebasedRemoteChanges.has(unrebasedChange.guid)\n\t\t\t) {\n\t\t\t\t// we visited that unrebased change and mark it as visited\n\t\t\t\tvisitedUnrebasedRemoteChanges.add(unrebasedChange.guid);\n\n\t\t\t\tlet visitor = unrebasedChange;\n\t\t\t\t// we will walk along the commit chain until we hit a remote change or a visited unrebased commit\n\t\t\t\t// at that point we can skip since we already traced the rest of the commit chain\n\t\t\t\twhile (\n\t\t\t\t\tvisitor.remoteHeadGuid !== visitor.referenceGuid ||\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.has(visitor.referenceGuid)\n\t\t\t\t) {\n\t\t\t\t\tconst guid = visitor.referenceGuid;\n\t\t\t\t\tif (guid === \"\") {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// since the change is not in remote it must be in unrebased\n\t\t\t\t\tvisitor = unrebasedRemoteChanges[visitor.referenceGuid];\n\t\t\t\t\tif (!visitor) {\n\t\t\t\t\t\tthrow new Error(`no visitor found for guid \"${guid}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.add(visitor.guid);\n\t\t\t\t}\n\t\t\t\t// if we exited the loop because we hit a remote change than add it as visited\n\t\t\t\tif (visitor.remoteHeadGuid === visitor.referenceGuid && remoteChangeMap.has(visitor.referenceGuid)) {\n\t\t\t\t\tvisitedRemoteChanges.add(visitor.referenceGuid);\n\t\t\t\t}\n\n\t\t\t\t// If we have a change that refers to the start of the history (remoteHeadGuid === \"\"), we have to\n\t\t\t\t// keep all remote Changes until this change has been processed\n\t\t\t\tif (visitor.remoteHeadGuid === \"\") {\n\t\t\t\t\tvisitedRemoteChanges.add(remoteChanges[0].guid);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlet pruned = 0;\n\t\t// we can now filter the unrebased changes by removing any changes\n\t\t// we have not visited at all during our traversal\n\t\tconst prunedUnrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\t\tfor (const key of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tif (visitedUnrebasedRemoteChanges.has(key)) {\n\t\t\t\tprunedUnrebasedRemoteChanges[key] = unrebasedRemoteChanges[key];\n\t\t\t} else {\n\t\t\t\tpruned++;\n\t\t\t}\n\t\t}\n\n\t\t// find minimum index\n\t\tconst minIndex = Math.min(...[...visitedRemoteChanges].map((key) => remoteChangeMap.get(key) as number));\n\n\t\tconst prunedRemoteChanges = remoteChanges.slice(minIndex);\n\t\tpruned += minIndex;\n\n\t\treturn {\n\t\t\tremoteChanges: prunedRemoteChanges,\n\t\t\tunrebasedRemoteChanges: prunedUnrebasedRemoteChanges,\n\t\t\tprunedCount: pruned,\n\t\t};\n\t}\n\tpublic pruneHistory() {\n\t\tconst msn = this.runtime.deltaManager.minimumSequenceNumber;\n\n\t\tconst { remoteChanges, unrebasedRemoteChanges } = SharedPropertyTree.prune(\n\t\t\tmsn,\n\t\t\tthis.remoteChanges,\n\t\t\tthis.unrebasedRemoteChanges,\n\t\t);\n\n\t\tthis.remoteChanges = remoteChanges;\n\t\tthis.unrebasedRemoteChanges = unrebasedRemoteChanges;\n\t}\n\tpublic summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tthis.pruneHistory();\n\t\tconst snapshot: ISnapshot = {\n\t\t\tbranchGuid: this.handle.absolutePath.split(\"/\").pop() as string,\n\t\t\tsummaryMinimumSequenceNumber: this.runtime.deltaManager.minimumSequenceNumber,\n\t\t\tuseMH: this.useMH,\n\t\t\tnumChunks: 0,\n\t\t};\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tif (!this.useMH) {\n\t\t\t// If the MH is not used, we have to include the tip view, the remote changes and the received\n\t\t\t// deltas to the summary\n\t\t\tconst summary: ISnapshotSummary = {\n\t\t\t\tremoteTipView: this.remoteTipView,\n\t\t\t\tremoteChanges: this.remoteChanges,\n\t\t\t\tunrebasedRemoteChanges: this.unrebasedRemoteChanges,\n\t\t\t};\n\t\t\tconst chunkSize = 5000 * 1024; // Default limit seems to be 5MB\n\t\t\tconst packr = new Packr();\n\t\t\tconst serializedSummary = packr.pack(summary);\n\n\t\t\tfor (let pos = 0, i = 0; pos < serializedSummary.length; pos += chunkSize, i++) {\n\t\t\t\tbuilder.addBlob(`summaryChunk_${i}`,\n\t\t\t\t\t\t\t\tbufferToString(serializedSummary.slice(pos, pos + chunkSize), \"base64\"));\n\t\t\t\tsnapshot.numChunks++;\n\t\t\t}\n\t\t}\n\n\t\tbuilder.addBlob(\"properties\", serializer !== undefined\n\t\t\t? serializer.stringify(snapshot, this.handle)\n\t\t\t: JSON.stringify(snapshot));\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst runtime = this.runtime;\n\t\tconst handleTableChunk = await storage.readBlob(\"properties\");\n\t\tconst utf8 = bufferToString(handleTableChunk, \"utf8\");\n\n\t\tconst snapshot: ISnapshot = this.serializer.parse(utf8);\n\t\tthis.useMH = snapshot.useMH;\n\n\t\ttry {\n\t\t\tif (!snapshot.useMH) {\n\t\t\t\t// We load all chunks\n\t\t\t\tconst chunks: ArrayBufferLike[] = await Promise.all(\n\t\t\t\t\trange(snapshot.numChunks).map(async (i) => {\n\t\t\t\t\t\tconst buffer = bufferToString(await storage.readBlob(`summaryChunk_${i}`), \"utf8\");\n\t\t\t\t\t\treturn stringToBuffer(buffer, \"base64\");\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\n\t\t\t\tconst packr = new Packr();\n\t\t\t\tconst snapshotSummary = packr.unpack(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\tthis.remoteTipView = snapshotSummary.remoteTipView;\n\t\t\t\tthis.remoteChanges = snapshotSummary.remoteChanges;\n\t\t\t\tthis.unrebasedRemoteChanges = snapshotSummary.unrebasedRemoteChanges;\n\n\t\t\t\tconst isPartialCheckoutActive = !!(this.options.clientFiltering && this.options.paths);\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tthis.remoteTipView = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\tthis.remoteTipView,\n\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\n\t\t\t\tthis.skipSequenceNumber = 0;\n\t\t\t} else {\n\t\t\t\tconst { branchGuid, summaryMinimumSequenceNumber } = snapshot;\n\t\t\t\tconst branchResponse = await axios.get(`http://localhost:3000/branch/${branchGuid}`);\n\t\t\t\tthis.headCommitGuid = branchResponse.data.headCommitGuid;\n\t\t\t\tconst {\n\t\t\t\t\tcommit: { meta: commitMetadata },\n\t\t\t\t} = (await axios.get(`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}`)).data;\n\t\t\t\tlet { changeSet: materializedView } = (\n\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}/materializedView`,\n\t\t\t\t\t)\n\t\t\t\t).data;\n\n\t\t\t\tconst isPartialCheckoutActive = this.options.clientFiltering && this.options.paths;\n\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tmaterializedView = ChangeSetUtils.getFilteredChangeSetByPaths(materializedView, this.options.paths);\n\t\t\t\t}\n\n\t\t\t\tthis.tipView = materializedView;\n\t\t\t\tthis.remoteTipView = cloneDeep(this.tipView);\n\t\t\t\tthis.remoteChanges = [];\n\n\t\t\t\tlet missingDeltas: ISequencedDocumentMessage[] = [];\n\t\t\t\tconst firstDelta = Math.min(commitMetadata.minimumSequenceNumber, summaryMinimumSequenceNumber);\n\t\t\t\tconst lastDelta = commitMetadata.sequenceNumber;\n\n\t\t\t\tconst dm = (this.runtime.deltaManager as any).deltaManager;\n\t\t\t\tawait dm.getDeltas(\"DocumentOpen\", firstDelta, lastDelta, (messages: ISequencedDocumentMessage[]) => {\n\t\t\t\t\tmissingDeltas = messages.filter((x) => x.type === \"op\");\n\t\t\t\t});\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\t\t\tfor (let i = 0; i < missingDeltas.length; i++) {\n\t\t\t\t\tif (missingDeltas[i].sequenceNumber < commitMetadata.sequenceNumber) {\n\t\t\t\t\t\tconst remoteChange: IPropertyTreeMessage\n\t\t\t\t\t\t\t= JSON.parse(missingDeltas[i].contents).contents.contents.content.contents;\n\t\t\t\t\t\tconst { changeSet } = (\n\t\t\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${remoteChange.guid}/changeSet`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t).data;\n\t\t\t\t\t\tremoteChange.changeSet = changeSet;\n\n\t\t\t\t\t\tif (remoteChange) {\n\t\t\t\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\t\t\t\tremoteChange.changeSet = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\t\t\t\tremoteChange.changeSet,\n\t\t\t\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.remoteChanges.push(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.remoteChanges.push(change);\n\n\t\t// Apply the remote change set to the remote tip view\n\t\tconst remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);\n\t\tremoteChangeSetWrapper.applyChangeSet(change.changeSet);\n\n\t\t// Rebase the local changes\n\t\tconst pendingChanges = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\tnew ChangeSet(pendingChanges)._toReversibleChangeSet(this.tipView);\n\n\t\tconst changesToTip: SerializedChangeSet = {};\n\t\tconst changesNeeded = this.rebaseLocalChanges(change, pendingChanges, changesToTip);\n\n\t\tif (changesNeeded) {\n\t\t\tthis.pushNotificationDelayScope();\n\t\t\t// Checkout the new tip\n\t\t\tthis._root.applyChangeSet(changesToTip);\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\t\tthis._root.applyChangeSet(pendingChanges);\n\t\t\tthis.popNotificationDelayScope();\n\t\t}\n\n\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t// assert(JSON.stringify(this.root.serialize()) === JSON.stringify(this.tipView));\n\t}\n\n\tgetUnrebasedChange(guid: string) {\n\t\treturn this.unrebasedRemoteChanges[guid];\n\t}\n\n\tgetRebasedChanges(startGuid: string, endGuid?: string) {\n\t\tconst startIndex = findIndex(this.remoteChanges, (c) => c.guid === startGuid);\n\t\tif (endGuid !== undefined) {\n\t\t\tconst endIndex = findIndex(this.remoteChanges, (c) => c.guid === endGuid);\n\t\t\treturn this.remoteChanges.slice(startIndex + 1, endIndex + 1);\n\t\t}\n\t\treturn this.remoteChanges.slice(startIndex + 1);\n\t}\n\n\tprivate rebaseLocalChanges(\n\t\tchange: IPropertyTreeMessage,\n\t\tpendingChanges: SerializedChangeSet,\n\t\tnewTipDelta: SerializedChangeSet,\n\t): boolean {\n\t\tlet rebaseBaseChangeSet = cloneDeep(change.changeSet);\n\n\t\tconst accumulatedChanges: SerializedChangeSet = {};\n\t\tconst conflicts = [] as any[];\n\n\t\tif (this.localChanges.length > 0 && this.localChanges[0].guid === change.guid) {\n\t\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t\t// assert(JSON.stringify(this.localChanges[0].changeSet) === JSON.stringify(change.changeSet),\n\t\t\t// \"Local change different than rebased remote change.\");\n\n\t\t\t// If we got a confirmation of the commit on the tip of the localChanges array,\n\t\t\t// there will be no update of the tip view at all. We just move it from local changes\n\t\t\t// to remote changes\n\t\t\tthis.localChanges.shift();\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\tfor (let i = 0; i < this.localChanges.length; i++) {\n\t\t\t// Make sure we never receive changes out of order\n\t\t\tconsole.assert(this.localChanges[i].guid !== change.guid);\n\n\t\t\tconst rebaseMetaInformation = new Map();\n\n\t\t\tconst copiedChangeSet = new ChangeSet(cloneDeep(this.localChanges[i].changeSet));\n\t\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(this.localChanges[i].changeSet, conflicts, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\n\t\t\tcopiedChangeSet.toInverseChangeSet();\n\t\t\tcopiedChangeSet.applyChangeSet(rebaseBaseChangeSet);\n\t\t\tcopiedChangeSet.applyChangeSet(this.localChanges[i].changeSet, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\t\t\trebaseBaseChangeSet = copiedChangeSet.getSerializedChangeSet();\n\n\t\t\tnew ChangeSet(accumulatedChanges).applyChangeSet(this.localChanges[i].changeSet);\n\t\t}\n\n\t\t// Compute the inverse of the pending changes and store the result in newTipDelta\n\t\tconst pendingChangesRebaseMetaInformation = new Map();\n\t\tconst deltaToTipCS = new ChangeSet(newTipDelta);\n\t\tdeltaToTipCS.applyChangeSet(pendingChanges);\n\t\tdeltaToTipCS.toInverseChangeSet();\n\n\t\t// Perform a rebase of the pending changes\n\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(pendingChanges, conflicts, {\n\t\t\tapplyAfterMetaInformation: pendingChangesRebaseMetaInformation,\n\t\t});\n\n\t\t// Compute the delta between the old tip (including pending changes)\n\t\t// and the new tip (not including the rebased pending changes)\n\t\tdeltaToTipCS.applyChangeSet(rebaseBaseChangeSet);\n\n\t\t// Update the tip view\n\t\tif (!this.tipView) {\n\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\t\t\tconst changeSet = new ChangeSet(this.tipView);\n\t\t\tchangeSet.applyChangeSet(accumulatedChanges);\n\t\t} else {\n\t\t\tnew ChangeSet(this.tipView).applyChangeSet(newTipDelta);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprotected applyStashedOp() {\n\t\tthrow new Error(\"not implemented\");\n\t}\n}\n"]}
1
+ {"version":3,"file":"propertyTree.js","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+CAA+C;AAC/C,OAAO,OAAO,MAAM,gBAAgB,CAAC;AACrC,OAAO,SAAS,MAAM,kBAAkB,CAAC;AACzC,OAAO,KAAK,MAAM,cAAc,CAAC;AACjC,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACpE,OAAO,EAEN,WAAW,GAIX,MAAM,sCAAsC,CAAC;AAQ9C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAU,MAAM,8BAA8B,CAAC;AAEtF,OAAO,EAAoB,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EACN,SAAS,EACT,KAAK,IAAI,cAAc,EACvB,qBAAqB,GACrB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAgB,MAAM,yCAAyC,CAAC;AAEtG,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AA+C5D;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IAenD,YACC,EAAU,EACV,OAA+B,EAC/B,UAA8B,EAC9B,OAAkC;;QAElC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QApBhC,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;QAUtB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,6DAA6D;QAC7D,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QAExB,4CAA4C;QAC5C,IAAI,CAAC,KAAK,GAAG,MAAA,OAAO,CAAC,KAAK,mCAAI,KAAK,CAAC;IACrC,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,mEAAmE;QACnE,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAEO,wBAAwB,CAAC,KAAgB;QAChD,MAAM,MAAM,GAAI,IAAI,CAAC,OAAO,CAAC,YAAoB,CAAC,YAAY,CAAC,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC;QACnG,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IAEM,sBAAsB;QAC5B,6EAA6E;QAC7E,8CAA8C;QAC9C,IAAI,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YACnF,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YACxE,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC,EAAE;gBAClD,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;aAC3C;SACD;aAAM;YACG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;SAClE;IACR,CAAC;IAED,IAAW,SAAS;QACnB,+DAA+D;QAC/D,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,IAAW,YAAY;QACtB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SACvD;aAAM;YACN,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SACzD;IACF,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,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;QAErG,IAAI,QAAQ,GAAG,CAAC,CAAC,iBAAiB,CAAC;QAEnC,mEAAmE;QACnE,IAAI,iBAAiB,KAAK,SAAS,EAAE;YACpC,QAAQ,GAAG,QAAQ,KAAK,SAAS,CAAC;SAClC;QAED,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAClC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;SACvB;IACF,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,MAAM,cAAc,GACnB,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YAC5B,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI;YACxD,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;QACxB,MAAM,MAAM,GAAG;YACd,EAAE,mBAAkB;YACpB,SAAS;YACT,QAAQ;YACR,IAAI,EAAE,MAAM,EAAE;YACd,cAAc;YACd,aAAa,EACZ,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc;YACrG,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;QAElC,sDAAsD;QACtD,IAAI,IAAI,CAAC,4BAA4B,EAAE;YACtC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;SAC9C;aAAM;YACN,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;SAC3C;IACF,CAAC;IAED,gBAAgB,CAAC,IAAa;QAC7B,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC;QACzC,IAAI,IAAI,KAAK,KAAK,EAAE;YACnB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB,EAAE;gBAC5C,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;aACjC;YACD,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;SAC3B;IACF,CAAC;IACD;;;OAGG;IACI,0BAA0B;QAChC,wBAAwB;QACxB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,sDAAsD;QACtD,IAAI,IAAI,CAAC,sBAAsB,KAAK,CAAC,EAAE;YACtC,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC;SACpC;IACF,CAAC;IAED;;;OAGG;IACI,yBAAyB;QAC/B,IAAI,IAAI,CAAC,sBAAsB,KAAK,CAAC,EAAE;YACtC,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;SAC5C;QACD,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC;IACrC,CAAC;IAED;;;;;;;OAOG;IACO,WAAW,CAAC,OAAkC,EAAE,KAAc,EAAE,eAAwB;QACjG,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,SAAS,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE;YAC/F,MAAM,OAAO,mCAAoC,OAAO,CAAC,QAAQ,KAAE,cAAc,EAAE,OAAO,CAAC,cAAc,GAAE,CAAC;YAC5G,QAAQ,OAAO,CAAC,EAAE,EAAE;gBACnB;oBACC,gFAAgF;oBAChF,4DAA4D;oBAC5D,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC/C,MAAM;gBACP;oBACC,MAAM;aACP;SACD;IACF,CAAC;IAEM,MAAM,CAAC,KAAK,CAClB,qBAA6B,EAC7B,aAAqC,EACrC,sBAAkE;QAElE,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;YACrD,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;gBACD,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;oBACD,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;oBACnC,IAAI,IAAI,KAAK,EAAE,EAAE;wBAChB,MAAM;qBACN;oBACD,4DAA4D;oBAC5D,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;oBACxD,IAAI,CAAC,OAAO,EAAE;wBACb,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,GAAG,CAAC,CAAC;qBACvD;oBAED,6BAA6B,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;iBAChD;gBACD,8EAA8E;gBAC9E,IAAI,OAAO,CAAC,cAAc,KAAK,OAAO,CAAC,aAAa,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;oBACnG,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;iBAChD;gBAED,kGAAkG;gBAClG,+DAA+D;gBAC/D,IAAI,OAAO,CAAC,cAAc,KAAK,EAAE,EAAE;oBAClC,oBAAoB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;iBAChD;aACD;SACD;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;YACtD,IAAI,6BAA6B,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBAC3C,4BAA4B,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;aAChE;iBAAM;gBACN,MAAM,EAAE,CAAC;aACT;SACD;QAED,qBAAqB;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAW,CAAC,CAAC,CAAC;QAEzG,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,OAAO,CAAC,YAAY,CAAC,qBAAqB,CAAC;QAE5D,MAAM,EAAE,aAAa,EAAE,sBAAsB,EAAE,GAAG,kBAAkB,CAAC,KAAK,CACzE,GAAG,EACH,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,sBAAsB,CAC3B,CAAC;QAEF,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;IACtD,CAAC;IACM,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,OAAO,CAAC,YAAY,CAAC,qBAAqB;YAC7E,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;YAChB,8FAA8F;YAC9F,wBAAwB;YACxB,MAAM,OAAO,GAAqB;gBACjC,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;aACnD,CAAC;YACF,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,gCAAgC;YAC/D,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE9C,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC,EAAE,EAAE;gBAC/E,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAC/B,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAC7E,QAAQ,CAAC,SAAS,EAAE,CAAC;aACrB;SACD;QAED,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,KAAK,SAAS;YACrD,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;YAC7C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7B,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;QACxD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAE5B,IAAI;YACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;gBACpB,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,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;oBACnF,OAAO,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACzC,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;gBAEN,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;gBAC1B,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;gBACxD,IACC,eAAe,CAAC,aAAa,KAAK,SAAS;oBAC3C,eAAe,CAAC,aAAa,KAAK,SAAS;oBAC3C,eAAe,CAAC,sBAAsB,KAAK,SAAS,EACnD;oBACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;iBACrC;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;gBAErE,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;oBAClD,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC,2BAA2B,CAC9D,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,OAAO,CAAC,KAAK,CAClB,CAAC;iBACF;gBACD,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAE7C,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;aAC5B;iBAAM;gBACN,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,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,gCAAgC,UAAU,WAAW,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACvG,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;oBAClD,gBAAgB,GAAG,cAAc,CAAC,2BAA2B,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;iBACpG;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,CAAC,cAAc,CAAC,qBAAqB,EAAE,4BAA4B,CAAC,CAAC;gBAChG,MAAM,SAAS,GAAG,cAAc,CAAC,cAAc,CAAC;gBAEhD,MAAM,EAAE,GAAI,IAAI,CAAC,OAAO,CAAC,YAAoB,CAAC,YAAY,CAAC;gBAC3D,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,QAAqC,EAAE,EAAE;oBACnG,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;gBACzD,CAAC,CAAC,CAAC;gBAEH,4DAA4D;gBAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAC9C,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,cAAc,CAAC,cAAc,EAAE;wBACpE,MAAM,YAAY,GACf,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;wBAC5E,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;4BACjB,IAAI,uBAAuB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;gCAClD,YAAY,CAAC,SAAS,GAAG,cAAc,CAAC,2BAA2B,CAClE,YAAY,CAAC,SAAS,EACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAClB,CAAC;6BACF;4BACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;yBACtC;qBACD;yBAAM;wBACN,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;qBAC9C;iBACD;gBAED,IAAI,CAAC,kBAAkB,GAAG,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,CAAC,CAAC,CAAC;aAC1C;SACD;QAAC,OAAO,CAAC,EAAE;YACX,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;SACxB;gBAAS;YACT,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;gBAClD,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;aAC3C;YACD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;SACvB;IACF,CAAC;IAES,YAAY,KAAK,CAAC;IAEpB,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;YACtD,MAAM,sBAAsB,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACjE,sBAAsB,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;SACxD;aAAM;YACN,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC/B;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;YACpC,qBAAqB,CACpB,MAAM,EACN,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAClC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CACjC,CAAC;SACF;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhC,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,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;QAC5G,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;YAClB,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;SACjC;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,IAAI,OAAO,KAAK,SAAS,EAAE;YAC1B,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;SAC9D;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,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEtD,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;YAC9E,uEAAuE;YACvE,8FAA8F;YAC9F,gEAAgE;YAEhE,+EAA+E;YAC/E,qFAAqF;YACrF,oBAAoB;YACpB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YAE1B,OAAO,KAAK,CAAC;SACb;QAED,4DAA4D;QAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAClD,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,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE;gBAC9F,yBAAyB,EAAE,qBAAqB;aAChD,CAAC,CAAC;YAEH,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;SACjF;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;YAClB,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;SAC7C;aAAM;YACN,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;SACxD;QAED,OAAO,IAAI,CAAC;IACb,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\n/* eslint-disable import/no-internal-modules */\nimport isEmpty from \"lodash/isEmpty\";\nimport findIndex from \"lodash/findIndex\";\nimport range from \"lodash/range\";\nimport { copy as cloneDeep } from \"fastest-json-copy\";\nimport { Packr } from \"msgpackr\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport {\n\tISequencedDocumentMessage,\n\tMessageType,\n\tFileMode,\n\tTreeEntry,\n\tITreeEntry,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\n\nimport { bufferToString, stringToBuffer, assert } from \"@fluidframework/common-utils\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\n\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\n\nimport { PropertyFactory, BaseProperty, NodeProperty } from \"@fluid-experimental/property-properties\";\n\nimport { v4 as uuidv4 } from \"uuid\";\nimport axios from \"axios\";\nimport { PropertyTreeFactory } from \"./propertyTreeFactory\";\n\nexport type SerializedChangeSet = any;\n\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\nexport interface IPropertyTreeMessage {\n\top: OpKind;\n\tchangeSet: SerializedChangeSet;\n\tmetadata: Metadata;\n\tguid: string;\n\treferenceGuid: string;\n\tremoteHeadGuid: string;\n\tlocalBranchStart: string | undefined;\n\trebaseMetaInformation?: Map<any, any>;\n\tuseMH?: boolean;\n}\n\nexport interface IRemotePropertyTreeMessage extends IPropertyTreeMessage {\n\tsequenceNumber: number;\n}\ninterface ISnapshot {\n\tbranchGuid: string;\n\tsummaryMinimumSequenceNumber: number;\n\tuseMH: boolean;\n\tnumChunks: number;\n}\ninterface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n}\n\nexport interface SharedPropertyTreeOptions {\n\tpaths?: string[];\n\tclientFiltering?: boolean;\n\tuseMH?: boolean;\n}\n\n/**\n * Silly DDS example that models a six sided die.\n *\n * Unlike the typical 'Dice Roller' example where clients clobber each other's last roll in a\n * SharedMap, this 'SharedDie' DDS works by advancing an internal PRNG each time it sees a 'roll'\n * operation.\n *\n * Because all clients are using the same PRNG starting in the same state, they arrive at\n * consensus by simply applying the same number of rolls. (A fun addition would be logging\n * who received which roll, which would need to change as clients learn how races are resolved\n * in the total order)\n */\nexport class SharedPropertyTree extends SharedObject {\n\ttipView: SerializedChangeSet = {};\n\tremoteTipView: SerializedChangeSet = {};\n\tlocalChanges: IPropertyTreeMessage[] = [];\n\tremoteChanges: IPropertyTreeMessage[] = [];\n\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\ttransmissionsHaveBeenStopped = false;\n\tenqueuedMessages: IPropertyTreeMessage[] = [];\n\tnotificationDelayScope: number = 0;\n\t_root: any = PropertyFactory.create(\"NodeProperty\");\n\toptions: SharedPropertyTreeOptions;\n\tskipSequenceNumber: number = -1;\n\theadCommitGuid: string = \"\";\n\tuseMH: boolean = false;\n\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\toptions: SharedPropertyTreeOptions,\n\t) {\n\t\tsuper(id, runtime, attributes);\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}\n\n\t/**\n\t * Create a new shared cell\n\t *\n\t * @param runtime - data store runtime the new shared map belongs to\n\t * @param id - optional name of the shared map\n\t * @returns newly create shared map (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string, queryString?: string) {\n\t\treturn runtime.createChannel(id, PropertyTreeFactory.Type) as SharedPropertyTree;\n\t}\n\n\t/**\n\t * Get a factory for SharedDie to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedDie\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new PropertyTreeFactory();\n\t}\n\n\t/**\n\t * in case of partial checkout we want to send the paths we are interested in once we are connected\n\t */\n\tprotected onConnect() {\n\t\t// on connect we scope all deltas such that we only get relevant changes\n\t\t// since we know the paths already at constuction time this is okay\n\t\tthis.scopeFutureDeltasToPaths(this.options.paths);\n\t}\n\n\tprivate scopeFutureDeltasToPaths(paths?: string[]) {\n\t\tconst socket = (this.runtime.deltaManager as any).deltaManager.connectionManager.connection.socket;\n\t\tsocket.emit(\"partial_checkout\", { paths });\n\t}\n\n\tpublic _reportDirtinessToView() {\n\t\t// Check whether anybody is listening. If not, we don't want to pay the price\n\t\t// for the serialization of the data structure\n\t\tif (this.listenerCount(\"localModification\") > 0) {\n\t\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n this._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 this._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n }\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\tif (this.localChanges.length > 0) {\n\t\t\treturn this.localChanges[this.localChanges.length - 1];\n\t\t} else {\n\t\t\treturn this.remoteChanges[this.remoteChanges.length - 1];\n\t\t}\n\t}\n\tpublic get root(): NodeProperty {\n\t\treturn this._root as NodeProperty;\n\t}\n\n\tpublic commit(metadata?: Metadata, submitEmptyChange?: boolean) {\n\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\n\t\tlet doSubmit = !!submitEmptyChange;\n\n\t\t// if no override provided dont submit unless metadata are provided\n\t\tif (submitEmptyChange === undefined) {\n\t\t\tdoSubmit = metadata !== undefined;\n\t\t}\n\n\t\tif (doSubmit || !isEmpty(changes)) {\n\t\t\tthis.applyChangeSet(changes, metadata || {});\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\tprivate applyChangeSet(changeSet: SerializedChangeSet, metadata: Metadata) {\n\t\tconst _changeSet = new ChangeSet(changeSet);\n\t\t_changeSet._toReversibleChangeSet(this.tipView);\n\n\t\tconst remoteHeadGuid =\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\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,\n\t\t\treferenceGuid:\n\t\t\t\tthis.localChanges.length > 0 ? this.localChanges[this.localChanges.length - 1].guid : remoteHeadGuid,\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\n\t\t// Queue the op for transmission to the Fluid service.\n\t\tif (this.transmissionsHaveBeenStopped) {\n\t\t\tthis.enqueuedMessages.push(cloneDeep(change));\n\t\t} else {\n\t\t\tthis.submitLocalMessage(cloneDeep(change));\n\t\t}\n\t}\n\n\tstopTransmission(stop: boolean) {\n\t\tthis.transmissionsHaveBeenStopped = stop;\n\t\tif (stop === false) {\n\t\t\tfor (const message of this.enqueuedMessages) {\n\t\t\t\tthis.submitLocalMessage(message);\n\t\t\t}\n\t\t\tthis.enqueuedMessages = [];\n\t\t}\n\t}\n\t/**\n\t * Delays notifications until popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic pushNotificationDelayScope() {\n\t\t// set the scope counter\n\t\tthis.notificationDelayScope++;\n\n\t\t// If we reach 0, we have to report unreported changes\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tthis._root._reportDirtinessToView();\n\t\t}\n\t}\n\n\t/**\n\t * Re-enables notifications when popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic popNotificationDelayScope() {\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tconsole.error(\"Unbalanced push/pop calls.\");\n\t\t}\n\t\tthis.notificationDelayScope--;\n\t\tthis._root._reportDirtinessToView();\n\t}\n\n\t/**\n\t * Process an operation\n\t *\n\t * @param message - the message to prepare\n\t * @param local - whether the message was sent by the local client\n\t * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.\n\t * For messages from a remote client, this will be undefined.\n\t */\n\tprotected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\tif (message.type === MessageType.Operation && message.sequenceNumber > this.skipSequenceNumber) {\n\t\t\tconst content: IRemotePropertyTreeMessage = { ...message.contents, sequenceNumber: message.sequenceNumber };\n\t\t\tswitch (content.op) {\n\t\t\t\tcase OpKind.ChangeSet:\n\t\t\t\t\t// If the op originated locally from this client, we've already accounted for it\n\t\t\t\t\t// by advancing the state. Otherwise, advance the PRNG now.\n\t\t\t\t\tthis._applyRemoteChangeSet(cloneDeep(content));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static prune(\n\t\tminimumSequenceNumber: number,\n\t\tremoteChanges: IPropertyTreeMessage[],\n\t\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>,\n\t) {\n\t\t// for faster lookup of remote change guids\n\t\tconst remoteChangeMap = new Map<string, number>();\n\t\tremoteChanges.forEach((change, index) => {\n\t\t\tremoteChangeMap.set(change.guid, index);\n\t\t});\n\n\t\t// we will track visited nodes\n\t\tconst visitedUnrebasedRemoteChanges = new Set<string>();\n\t\tconst visitedRemoteChanges = new Set<string>();\n\n\t\tfor (const id of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tconst unrebasedChange = unrebasedRemoteChanges[id];\n\n\t\t\t// we are only interested in changes that are newer than the sequence number\n\t\t\t// and that were not yet visited previously\n\t\t\tif (\n\t\t\t\tunrebasedChange.sequenceNumber >= minimumSequenceNumber &&\n\t\t\t\t!visitedUnrebasedRemoteChanges.has(unrebasedChange.guid)\n\t\t\t) {\n\t\t\t\t// we visited that unrebased change and mark it as visited\n\t\t\t\tvisitedUnrebasedRemoteChanges.add(unrebasedChange.guid);\n\n\t\t\t\tlet visitor = unrebasedChange;\n\t\t\t\t// we will walk along the commit chain until we hit a remote change or a visited unrebased commit\n\t\t\t\t// at that point we can skip since we already traced the rest of the commit chain\n\t\t\t\twhile (\n\t\t\t\t\tvisitor.remoteHeadGuid !== visitor.referenceGuid ||\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.has(visitor.referenceGuid)\n\t\t\t\t) {\n\t\t\t\t\tconst guid = visitor.referenceGuid;\n\t\t\t\t\tif (guid === \"\") {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// since the change is not in remote it must be in unrebased\n\t\t\t\t\tvisitor = unrebasedRemoteChanges[visitor.referenceGuid];\n\t\t\t\t\tif (!visitor) {\n\t\t\t\t\t\tthrow new Error(`no visitor found for guid \"${guid}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.add(visitor.guid);\n\t\t\t\t}\n\t\t\t\t// if we exited the loop because we hit a remote change than add it as visited\n\t\t\t\tif (visitor.remoteHeadGuid === visitor.referenceGuid && remoteChangeMap.has(visitor.referenceGuid)) {\n\t\t\t\t\tvisitedRemoteChanges.add(visitor.referenceGuid);\n\t\t\t\t}\n\n\t\t\t\t// If we have a change that refers to the start of the history (remoteHeadGuid === \"\"), we have to\n\t\t\t\t// keep all remote Changes until this change has been processed\n\t\t\t\tif (visitor.remoteHeadGuid === \"\") {\n\t\t\t\t\tvisitedRemoteChanges.add(remoteChanges[0].guid);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlet pruned = 0;\n\t\t// we can now filter the unrebased changes by removing any changes\n\t\t// we have not visited at all during our traversal\n\t\tconst prunedUnrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\t\tfor (const key of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tif (visitedUnrebasedRemoteChanges.has(key)) {\n\t\t\t\tprunedUnrebasedRemoteChanges[key] = unrebasedRemoteChanges[key];\n\t\t\t} else {\n\t\t\t\tpruned++;\n\t\t\t}\n\t\t}\n\n\t\t// find minimum index\n\t\tconst minIndex = Math.min(...[...visitedRemoteChanges].map((key) => remoteChangeMap.get(key) as number));\n\n\t\tconst prunedRemoteChanges = remoteChanges.slice(minIndex);\n\t\tpruned += minIndex;\n\n\t\treturn {\n\t\t\tremoteChanges: prunedRemoteChanges,\n\t\t\tunrebasedRemoteChanges: prunedUnrebasedRemoteChanges,\n\t\t\tprunedCount: pruned,\n\t\t};\n\t}\n\tpublic pruneHistory() {\n\t\tconst msn = this.runtime.deltaManager.minimumSequenceNumber;\n\n\t\tconst { remoteChanges, unrebasedRemoteChanges } = SharedPropertyTree.prune(\n\t\t\tmsn,\n\t\t\tthis.remoteChanges,\n\t\t\tthis.unrebasedRemoteChanges,\n\t\t);\n\n\t\tthis.remoteChanges = remoteChanges;\n\t\tthis.unrebasedRemoteChanges = unrebasedRemoteChanges;\n\t}\n\tpublic summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tthis.pruneHistory();\n\t\tconst snapshot: ISnapshot = {\n\t\t\tbranchGuid: this.handle.absolutePath.split(\"/\").pop() as string,\n\t\t\tsummaryMinimumSequenceNumber: this.runtime.deltaManager.minimumSequenceNumber,\n\t\t\tuseMH: this.useMH,\n\t\t\tnumChunks: 0,\n\t\t};\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tif (!this.useMH) {\n\t\t\t// If the MH is not used, we have to include the tip view, the remote changes and the received\n\t\t\t// deltas to the summary\n\t\t\tconst summary: ISnapshotSummary = {\n\t\t\t\tremoteTipView: this.remoteTipView,\n\t\t\t\tremoteChanges: this.remoteChanges,\n\t\t\t\tunrebasedRemoteChanges: this.unrebasedRemoteChanges,\n\t\t\t};\n\t\t\tconst chunkSize = 5000 * 1024; // Default limit seems to be 5MB\n\t\t\tconst packr = new Packr();\n\t\t\tconst serializedSummary = packr.pack(summary);\n\n\t\t\tfor (let pos = 0, i = 0; pos < serializedSummary.length; pos += chunkSize, i++) {\n\t\t\t\tbuilder.addBlob(`summaryChunk_${i}`,\n\t\t\t\t\t\t\t\tbufferToString(serializedSummary.slice(pos, pos + chunkSize), \"base64\"));\n\t\t\t\tsnapshot.numChunks++;\n\t\t\t}\n\t\t}\n\n\t\tbuilder.addBlob(\"properties\", serializer !== undefined\n\t\t\t? serializer.stringify(snapshot, this.handle)\n\t\t\t: JSON.stringify(snapshot));\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst runtime = this.runtime;\n\t\tconst handleTableChunk = await storage.readBlob(\"properties\");\n\t\tconst utf8 = bufferToString(handleTableChunk, \"utf8\");\n\n\t\tconst snapshot: ISnapshot = this.serializer.parse(utf8);\n\t\tthis.useMH = snapshot.useMH;\n\n\t\ttry {\n\t\t\tif (!snapshot.useMH) {\n\t\t\t\t// We load all chunks\n\t\t\t\tconst chunks: ArrayBufferLike[] = await Promise.all(\n\t\t\t\t\trange(snapshot.numChunks).map(async (i) => {\n\t\t\t\t\t\tconst buffer = bufferToString(await storage.readBlob(`summaryChunk_${i}`), \"utf8\");\n\t\t\t\t\t\treturn stringToBuffer(buffer, \"base64\");\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\n\t\t\t\tconst packr = new Packr();\n\t\t\t\tconst snapshotSummary = packr.unpack(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\tthis.remoteTipView = snapshotSummary.remoteTipView;\n\t\t\t\tthis.remoteChanges = snapshotSummary.remoteChanges;\n\t\t\t\tthis.unrebasedRemoteChanges = snapshotSummary.unrebasedRemoteChanges;\n\n\t\t\t\tconst isPartialCheckoutActive = !!(this.options.clientFiltering && this.options.paths);\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tthis.remoteTipView = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\tthis.remoteTipView,\n\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\n\t\t\t\tthis.skipSequenceNumber = 0;\n\t\t\t} else {\n\t\t\t\tconst { branchGuid, summaryMinimumSequenceNumber } = snapshot;\n\t\t\t\tconst branchResponse = await axios.get(`http://localhost:3000/branch/${branchGuid}`);\n\t\t\t\tthis.headCommitGuid = branchResponse.data.headCommitGuid;\n\t\t\t\tconst {\n\t\t\t\t\tcommit: { meta: commitMetadata },\n\t\t\t\t} = (await axios.get(`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}`)).data;\n\t\t\t\tlet { changeSet: materializedView } = (\n\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}/materializedView`,\n\t\t\t\t\t)\n\t\t\t\t).data;\n\n\t\t\t\tconst isPartialCheckoutActive = this.options.clientFiltering && this.options.paths;\n\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tmaterializedView = ChangeSetUtils.getFilteredChangeSetByPaths(materializedView, this.options.paths);\n\t\t\t\t}\n\n\t\t\t\tthis.tipView = materializedView;\n\t\t\t\tthis.remoteTipView = cloneDeep(this.tipView);\n\t\t\t\tthis.remoteChanges = [];\n\n\t\t\t\tlet missingDeltas: ISequencedDocumentMessage[] = [];\n\t\t\t\tconst firstDelta = Math.min(commitMetadata.minimumSequenceNumber, summaryMinimumSequenceNumber);\n\t\t\t\tconst lastDelta = commitMetadata.sequenceNumber;\n\n\t\t\t\tconst dm = (this.runtime.deltaManager as any).deltaManager;\n\t\t\t\tawait dm.getDeltas(\"DocumentOpen\", firstDelta, lastDelta, (messages: ISequencedDocumentMessage[]) => {\n\t\t\t\t\tmissingDeltas = messages.filter((x) => x.type === \"op\");\n\t\t\t\t});\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\t\t\tfor (let i = 0; i < missingDeltas.length; i++) {\n\t\t\t\t\tif (missingDeltas[i].sequenceNumber < commitMetadata.sequenceNumber) {\n\t\t\t\t\t\tconst remoteChange: IPropertyTreeMessage\n\t\t\t\t\t\t\t= JSON.parse(missingDeltas[i].contents).contents.contents.content.contents;\n\t\t\t\t\t\tconst { changeSet } = (\n\t\t\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${remoteChange.guid}/changeSet`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t).data;\n\t\t\t\t\t\tremoteChange.changeSet = changeSet;\n\n\t\t\t\t\t\tif (remoteChange) {\n\t\t\t\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\t\t\t\tremoteChange.changeSet = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\t\t\t\tremoteChange.changeSet,\n\t\t\t\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.remoteChanges.push(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.remoteChanges.push(change);\n\n\t\t// Apply the remote change set to the remote tip view\n\t\tconst remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);\n\t\tremoteChangeSetWrapper.applyChangeSet(change.changeSet);\n\n\t\t// Rebase the local changes\n\t\tconst pendingChanges = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\tnew ChangeSet(pendingChanges)._toReversibleChangeSet(this.tipView);\n\n\t\tconst changesToTip: SerializedChangeSet = {};\n\t\tconst changesNeeded = this.rebaseLocalChanges(change, pendingChanges, changesToTip);\n\n\t\tif (changesNeeded) {\n\t\t\tthis.pushNotificationDelayScope();\n\t\t\t// Checkout the new tip\n\t\t\tthis._root.applyChangeSet(changesToTip);\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\t\tthis._root.applyChangeSet(pendingChanges);\n\t\t\tthis.popNotificationDelayScope();\n\t\t}\n\n\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t// assert(JSON.stringify(this.root.serialize()) === JSON.stringify(this.tipView));\n\t}\n\n\tgetUnrebasedChange(guid: string) {\n\t\treturn this.unrebasedRemoteChanges[guid];\n\t}\n\n\tgetRebasedChanges(startGuid: string, endGuid?: string) {\n\t\tconst startIndex = findIndex(this.remoteChanges, (c) => c.guid === startGuid);\n\t\tif (endGuid !== undefined) {\n\t\t\tconst endIndex = findIndex(this.remoteChanges, (c) => c.guid === endGuid);\n\t\t\treturn this.remoteChanges.slice(startIndex + 1, endIndex + 1);\n\t\t}\n\t\treturn this.remoteChanges.slice(startIndex + 1);\n\t}\n\n\tprivate rebaseLocalChanges(\n\t\tchange: IPropertyTreeMessage,\n\t\tpendingChanges: SerializedChangeSet,\n\t\tnewTipDelta: SerializedChangeSet,\n\t): boolean {\n\t\tlet rebaseBaseChangeSet = cloneDeep(change.changeSet);\n\n\t\tconst accumulatedChanges: SerializedChangeSet = {};\n\t\tconst conflicts = [] as any[];\n\n\t\tif (this.localChanges.length > 0 && this.localChanges[0].guid === change.guid) {\n\t\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t\t// assert(JSON.stringify(this.localChanges[0].changeSet) === JSON.stringify(change.changeSet),\n\t\t\t// \"Local change different than rebased remote change.\");\n\n\t\t\t// If we got a confirmation of the commit on the tip of the localChanges array,\n\t\t\t// there will be no update of the tip view at all. We just move it from local changes\n\t\t\t// to remote changes\n\t\t\tthis.localChanges.shift();\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\tfor (let i = 0; i < this.localChanges.length; i++) {\n\t\t\t// Make sure we never receive changes out of order\n\t\t\tconsole.assert(this.localChanges[i].guid !== change.guid);\n\n\t\t\tconst rebaseMetaInformation = new Map();\n\n\t\t\tconst copiedChangeSet = new ChangeSet(cloneDeep(this.localChanges[i].changeSet));\n\t\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(this.localChanges[i].changeSet, conflicts, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\n\t\t\tcopiedChangeSet.toInverseChangeSet();\n\t\t\tcopiedChangeSet.applyChangeSet(rebaseBaseChangeSet);\n\t\t\tcopiedChangeSet.applyChangeSet(this.localChanges[i].changeSet, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\t\t\trebaseBaseChangeSet = copiedChangeSet.getSerializedChangeSet();\n\n\t\t\tnew ChangeSet(accumulatedChanges).applyChangeSet(this.localChanges[i].changeSet);\n\t\t}\n\n\t\t// Compute the inverse of the pending changes and store the result in newTipDelta\n\t\tconst pendingChangesRebaseMetaInformation = new Map();\n\t\tconst deltaToTipCS = new ChangeSet(newTipDelta);\n\t\tdeltaToTipCS.applyChangeSet(pendingChanges);\n\t\tdeltaToTipCS.toInverseChangeSet();\n\n\t\t// Perform a rebase of the pending changes\n\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(pendingChanges, conflicts, {\n\t\t\tapplyAfterMetaInformation: pendingChangesRebaseMetaInformation,\n\t\t});\n\n\t\t// Compute the delta between the old tip (including pending changes)\n\t\t// and the new tip (not including the rebased pending changes)\n\t\tdeltaToTipCS.applyChangeSet(rebaseBaseChangeSet);\n\n\t\t// Update the tip view\n\t\tif (!this.tipView) {\n\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\t\t\tconst changeSet = new ChangeSet(this.tipView);\n\t\t\tchangeSet.applyChangeSet(accumulatedChanges);\n\t\t} else {\n\t\t\tnew ChangeSet(this.tipView).applyChangeSet(newTipDelta);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprotected applyStashedOp() {\n\t\tthrow new Error(\"not implemented\");\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluid-experimental/property-dds",
3
- "version": "0.59.2001",
3
+ "version": "0.59.3000",
4
4
  "description": "definition of the property distributed data store",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -35,16 +35,16 @@
35
35
  "tsc": "tsc"
36
36
  },
37
37
  "dependencies": {
38
- "@fluid-experimental/property-changeset": "^0.59.2001",
39
- "@fluid-experimental/property-properties": "^0.59.2001",
38
+ "@fluid-experimental/property-changeset": "^0.59.3000",
39
+ "@fluid-experimental/property-properties": "^0.59.3000",
40
40
  "@fluidframework/common-utils": "^0.32.1",
41
41
  "@fluidframework/container-definitions": "^0.48.1000",
42
42
  "@fluidframework/core-interfaces": "^0.43.1000",
43
- "@fluidframework/datastore-definitions": "^0.59.2001",
43
+ "@fluidframework/datastore-definitions": "^0.59.3000",
44
44
  "@fluidframework/protocol-definitions": "^0.1028.1000",
45
- "@fluidframework/runtime-definitions": "^0.59.2001",
46
- "@fluidframework/runtime-utils": "^0.59.2001",
47
- "@fluidframework/shared-object-base": "^0.59.2001",
45
+ "@fluidframework/runtime-definitions": "^0.59.3000",
46
+ "@fluidframework/runtime-utils": "^0.59.3000",
47
+ "@fluidframework/shared-object-base": "^0.59.3000",
48
48
  "axios": "^0.26.0",
49
49
  "fastest-json-copy": "^1.0.1",
50
50
  "lodash": "^4.17.21",
@@ -52,16 +52,16 @@
52
52
  "uuid": "^8.3.1"
53
53
  },
54
54
  "devDependencies": {
55
- "@fluid-experimental/property-common": "^0.59.2001",
55
+ "@fluid-experimental/property-common": "^0.59.3000",
56
56
  "@fluidframework/build-common": "^0.23.0",
57
57
  "@fluidframework/driver-definitions": "^0.46.1000",
58
- "@fluidframework/eslint-config-fluid": "^0.28.1000",
59
- "@fluidframework/local-driver": "^0.59.2001",
60
- "@fluidframework/mocha-test-setup": "^0.59.2001",
61
- "@fluidframework/sequence": "^0.59.2001",
62
- "@fluidframework/server-local-server": "^0.1036.2000",
63
- "@fluidframework/test-runtime-utils": "^0.59.2001",
64
- "@fluidframework/test-utils": "^0.59.2001",
58
+ "@fluidframework/eslint-config-fluid": "^0.28.2000",
59
+ "@fluidframework/local-driver": "^0.59.3000",
60
+ "@fluidframework/mocha-test-setup": "^0.59.3000",
61
+ "@fluidframework/sequence": "^0.59.3000",
62
+ "@fluidframework/server-local-server": "^0.1036.3000",
63
+ "@fluidframework/test-runtime-utils": "^0.59.3000",
64
+ "@fluidframework/test-utils": "^0.59.3000",
65
65
  "@microsoft/api-extractor": "^7.22.2",
66
66
  "@rushstack/eslint-config": "^2.5.1",
67
67
  "@types/mocha": "^8.2.2",
@@ -86,6 +86,6 @@
86
86
  "mocha": "^8.4.0",
87
87
  "nyc": "^15.0.0",
88
88
  "rimraf": "^2.6.2",
89
- "typescript": "~4.1.3"
89
+ "typescript": "~4.5.5"
90
90
  }
91
91
  }
@@ -7,7 +7,7 @@
7
7
  import isEmpty from "lodash/isEmpty";
8
8
  import findIndex from "lodash/findIndex";
9
9
  import range from "lodash/range";
10
- import {copy as cloneDeep} from "fastest-json-copy";
10
+ import { copy as cloneDeep } from "fastest-json-copy";
11
11
  import { Packr } from "msgpackr";
12
12
 
13
13
  import { AttachState } from "@fluidframework/container-definitions";
@@ -185,7 +185,7 @@ export class SharedPropertyTree extends SharedObject {
185
185
  }
186
186
 
187
187
  public get activeCommit(): IPropertyTreeMessage {
188
- if(this.localChanges.length > 0) {
188
+ if (this.localChanges.length > 0) {
189
189
  return this.localChanges[this.localChanges.length - 1];
190
190
  } else {
191
191
  return this.remoteChanges[this.remoteChanges.length - 1];