@fluid-experimental/property-dds 1.1.0 → 1.2.0

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/dist/index.d.ts CHANGED
@@ -4,4 +4,6 @@
4
4
  */
5
5
  export * from "./propertyTree";
6
6
  export * from "./propertyTreeFactory";
7
+ export * from "./propertyTreeExt";
8
+ export * from "./propertyTreeExtFactories";
7
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC"}
package/dist/index.js CHANGED
@@ -16,4 +16,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./propertyTree"), exports);
18
18
  __exportStar(require("./propertyTreeFactory"), exports);
19
+ __exportStar(require("./propertyTreeExt"), exports);
20
+ __exportStar(require("./propertyTreeExtFactories"), exports);
19
21
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;AAEH,iDAA+B;AAC/B,wDAAsC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport * from \"./propertyTree\";\nexport * from \"./propertyTreeFactory\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;AAEH,iDAA+B;AAC/B,wDAAsC;AACtC,oDAAkC;AAClC,6DAA2C","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport * from \"./propertyTree\";\nexport * from \"./propertyTreeFactory\";\nexport * from \"./propertyTreeExt\";\nexport * from \"./propertyTreeExtFactories\";\n"]}
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ /// <reference types="node" />
5
6
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
6
7
  import { IChannelAttributes, IFluidDataStoreRuntime, IChannelStorageService, IChannelFactory } from "@fluidframework/datastore-definitions";
7
8
  import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
@@ -26,11 +27,29 @@ export interface IPropertyTreeMessage {
26
27
  export interface IRemotePropertyTreeMessage extends IPropertyTreeMessage {
27
28
  sequenceNumber: number;
28
29
  }
30
+ export interface ISnapshotSummary {
31
+ remoteTipView?: SerializedChangeSet;
32
+ remoteChanges?: IPropertyTreeMessage[];
33
+ unrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;
34
+ }
29
35
  export interface SharedPropertyTreeOptions {
30
36
  paths?: string[];
31
37
  clientFiltering?: boolean;
32
38
  useMH?: boolean;
33
39
  }
40
+ export interface ISharedPropertyTreeEncDec {
41
+ messageEncoder: {
42
+ encode: (IPropertyTreeMessage: any) => IPropertyTreeMessage;
43
+ decode: (IPropertyTreeMessage: any) => IPropertyTreeMessage;
44
+ };
45
+ summaryEncoder: {
46
+ encode: (ISnapshotSummary: any) => Buffer;
47
+ decode: (Buffer: any) => ISnapshotSummary;
48
+ };
49
+ }
50
+ export interface IPropertyTreeConfig {
51
+ encDec: ISharedPropertyTreeEncDec;
52
+ }
34
53
  /**
35
54
  * Silly DDS example that models a six sided die.
36
55
  *
@@ -57,7 +76,8 @@ export declare class SharedPropertyTree extends SharedObject {
57
76
  skipSequenceNumber: number;
58
77
  headCommitGuid: string;
59
78
  useMH: boolean;
60
- constructor(id: string, runtime: IFluidDataStoreRuntime, attributes: IChannelAttributes, options: SharedPropertyTreeOptions);
79
+ propertyTreeConfig: IPropertyTreeConfig;
80
+ constructor(id: string, runtime: IFluidDataStoreRuntime, attributes: IChannelAttributes, options: SharedPropertyTreeOptions, propertyTreeConfig?: IPropertyTreeConfig);
61
81
  /**
62
82
  * Create a new shared cell
63
83
  *
@@ -82,6 +102,16 @@ export declare class SharedPropertyTree extends SharedObject {
82
102
  get activeCommit(): IPropertyTreeMessage;
83
103
  get root(): NodeProperty;
84
104
  commit(metadata?: Metadata, submitEmptyChange?: boolean): void;
105
+ /**
106
+ * This method encodes the given message to the transfer form
107
+ * @param change - The message to be encoded.
108
+ */
109
+ private encodeMessage;
110
+ /**
111
+ * This method decodes message from the transfer form.
112
+ * @param transferChange - The message to be decoded.
113
+ */
114
+ private decodeMessage;
85
115
  private applyChangeSet;
86
116
  stopTransmission(stop: boolean): void;
87
117
  /**
@@ -109,6 +139,38 @@ export declare class SharedPropertyTree extends SharedObject {
109
139
  prunedCount: number;
110
140
  };
111
141
  pruneHistory(): void;
142
+ /**
143
+ * This method encodes the local summary (snapshot) object into the serialized form.
144
+ * @param summary - The local summary (snapshot)representation.
145
+ * @returns The serialized summary representation.
146
+ */
147
+ private encodeSummary;
148
+ /**
149
+ * This method decodes the serialized form of the summary into the local summary (snapshot) object.
150
+ * @param serializedSummary - The serialized summary representation.
151
+ * @returns The local summary (snapshot)representation.
152
+ */
153
+ private decodeSummary;
154
+ /**
155
+ * This method writes the log message if the logging is enabled in the extended DDS.
156
+ * The logging is not enabled in the default Property DDS
157
+ * @param message - The message to be logged.
158
+ */
159
+ protected logIfEnabled(message: any): void;
160
+ /**
161
+ * This method encodes the binary representation of the
162
+ * blob.
163
+ * @param blob - The binary representation of the blob.
164
+ * @returns The encoded representation of the blob.
165
+ */
166
+ private encodeSummaryBlob;
167
+ /**
168
+ * This method decodes the encoded representation of the
169
+ * blob.
170
+ * @param blob - The encoded representation of the blob.
171
+ * @returns The binary representation of the blob.
172
+ */
173
+ private decodeSummaryBlob;
112
174
  summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats;
113
175
  protected loadCore(storage: IChannelStorageService): Promise<void>;
114
176
  protected onDisconnect(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"propertyTree.d.ts","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"propertyTree.d.ts","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,22 @@ const property_properties_1 = require("@fluid-experimental/property-properties")
24
24
  const uuid_1 = require("uuid");
25
25
  const axios_1 = __importDefault(require("axios"));
26
26
  const propertyTreeFactory_1 = require("./propertyTreeFactory");
27
+ const defaultEncDec = {
28
+ messageEncoder: { encode: (msg) => msg,
29
+ decode: (msg) => msg },
30
+ summaryEncoder: {
31
+ encode: (summary) => {
32
+ const packr = new msgpackr_1.Packr();
33
+ const serializedSummary = packr.pack(summary);
34
+ return serializedSummary;
35
+ },
36
+ decode: (serializedSummary) => {
37
+ const packr = new msgpackr_1.Packr();
38
+ const snapshotSummary = packr.unpack(serializedSummary);
39
+ return snapshotSummary;
40
+ },
41
+ },
42
+ };
27
43
  /**
28
44
  * Silly DDS example that models a six sided die.
29
45
  *
@@ -37,7 +53,7 @@ const propertyTreeFactory_1 = require("./propertyTreeFactory");
37
53
  * in the total order)
38
54
  */
39
55
  class SharedPropertyTree extends shared_object_base_1.SharedObject {
40
- constructor(id, runtime, attributes, options) {
56
+ constructor(id, runtime, attributes, options, propertyTreeConfig = { encDec: defaultEncDec }) {
41
57
  var _a;
42
58
  super(id, runtime, attributes, "fluid_propertyTree_");
43
59
  this.tipView = {};
@@ -57,6 +73,7 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
57
73
  this._root._tree = this;
58
74
  // By default, we currently don't use the MH
59
75
  this.useMH = (_a = options.useMH) !== null && _a !== void 0 ? _a : false;
76
+ this.propertyTreeConfig = propertyTreeConfig;
60
77
  }
61
78
  /**
62
79
  * Create a new shared cell
@@ -127,6 +144,20 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
127
144
  this.root.cleanDirty();
128
145
  }
129
146
  }
147
+ /**
148
+ * This method encodes the given message to the transfer form
149
+ * @param change - The message to be encoded.
150
+ */
151
+ encodeMessage(change) {
152
+ return this.propertyTreeConfig.encDec.messageEncoder.encode(change);
153
+ }
154
+ /**
155
+ * This method decodes message from the transfer form.
156
+ * @param transferChange - The message to be decoded.
157
+ */
158
+ decodeMessage(transferChange) {
159
+ return this.propertyTreeConfig.encDec.messageEncoder.decode(transferChange);
160
+ }
130
161
  applyChangeSet(changeSet, metadata) {
131
162
  const _changeSet = new property_changeset_1.ChangeSet(changeSet);
132
163
  _changeSet._toReversibleChangeSet(this.tipView);
@@ -145,11 +176,12 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
145
176
  };
146
177
  this._applyLocalChangeSet(change);
147
178
  // Queue the op for transmission to the Fluid service.
179
+ const transferChange = this.encodeMessage((0, fastest_json_copy_1.copy)(change));
148
180
  if (this.transmissionsHaveBeenStopped) {
149
- this.enqueuedMessages.push((0, fastest_json_copy_1.copy)(change));
181
+ this.enqueuedMessages.push(transferChange);
150
182
  }
151
183
  else {
152
- this.submitLocalMessage((0, fastest_json_copy_1.copy)(change));
184
+ this.submitLocalMessage(transferChange);
153
185
  }
154
186
  }
155
187
  stopTransmission(stop) {
@@ -194,7 +226,8 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
194
226
  */
195
227
  processCore(message, local, localOpMetadata) {
196
228
  if (message.type === protocol_definitions_1.MessageType.Operation && message.sequenceNumber > this.skipSequenceNumber) {
197
- const content = Object.assign(Object.assign({}, message.contents), { sequenceNumber: message.sequenceNumber });
229
+ const change = this.decodeMessage((0, fastest_json_copy_1.copy)(message.contents));
230
+ const content = Object.assign(Object.assign({}, change), { sequenceNumber: message.sequenceNumber });
198
231
  switch (content.op) {
199
232
  case 0 /* ChangeSet */:
200
233
  // If the op originated locally from this client, we've already accounted for it
@@ -278,6 +311,47 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
278
311
  this.remoteChanges = remoteChanges;
279
312
  this.unrebasedRemoteChanges = unrebasedRemoteChanges;
280
313
  }
314
+ /**
315
+ * This method encodes the local summary (snapshot) object into the serialized form.
316
+ * @param summary - The local summary (snapshot)representation.
317
+ * @returns The serialized summary representation.
318
+ */
319
+ encodeSummary(summary) {
320
+ return this.propertyTreeConfig.encDec.summaryEncoder.encode(summary);
321
+ }
322
+ /**
323
+ * This method decodes the serialized form of the summary into the local summary (snapshot) object.
324
+ * @param serializedSummary - The serialized summary representation.
325
+ * @returns The local summary (snapshot)representation.
326
+ */
327
+ decodeSummary(serializedSummary) {
328
+ return this.propertyTreeConfig.encDec.summaryEncoder.decode(serializedSummary);
329
+ }
330
+ /**
331
+ * This method writes the log message if the logging is enabled in the extended DDS.
332
+ * The logging is not enabled in the default Property DDS
333
+ * @param message - The message to be logged.
334
+ */
335
+ logIfEnabled(message) { }
336
+ /**
337
+ * This method encodes the binary representation of the
338
+ * blob.
339
+ * @param blob - The binary representation of the blob.
340
+ * @returns The encoded representation of the blob.
341
+ */
342
+ encodeSummaryBlob(blob) {
343
+ return (0, common_utils_1.bufferToString)(blob, "base64");
344
+ }
345
+ /**
346
+ * This method decodes the encoded representation of the
347
+ * blob.
348
+ * @param blob - The encoded representation of the blob.
349
+ * @returns The binary representation of the blob.
350
+ */
351
+ decodeSummaryBlob(encoded) {
352
+ const buffer = (0, common_utils_1.bufferToString)(encoded, "utf8");
353
+ return (0, common_utils_1.stringToBuffer)(buffer, "base64");
354
+ }
281
355
  summarizeCore(serializer) {
282
356
  this.pruneHistory();
283
357
  const snapshot = {
@@ -296,12 +370,16 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
296
370
  unrebasedRemoteChanges: this.unrebasedRemoteChanges,
297
371
  };
298
372
  const chunkSize = 5000 * 1024; // Default limit seems to be 5MB
299
- const packr = new msgpackr_1.Packr();
300
- const serializedSummary = packr.pack(summary);
373
+ let totalBlobsSize = 0;
374
+ const serializedSummary = this.encodeSummary(summary);
301
375
  for (let pos = 0, i = 0; pos < serializedSummary.length; pos += chunkSize, i++) {
302
- builder.addBlob(`summaryChunk_${i}`, (0, common_utils_1.bufferToString)(serializedSummary.slice(pos, pos + chunkSize), "base64"));
376
+ const summaryBlob = this.encodeSummaryBlob(serializedSummary.slice(pos, pos + chunkSize));
377
+ // eslint-disable-next-line @typescript-eslint/dot-notation
378
+ totalBlobsSize += summaryBlob["length"];
379
+ builder.addBlob(`summaryChunk_${i}`, summaryBlob);
303
380
  snapshot.numChunks++;
304
381
  }
382
+ this.logIfEnabled(`Total blobs transfer size: ${totalBlobsSize}`);
305
383
  }
306
384
  builder.addBlob("properties", serializer !== undefined
307
385
  ? serializer.stringify(snapshot, this.handle)
@@ -318,8 +396,7 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
318
396
  if (!snapshot.useMH) {
319
397
  // We load all chunks
320
398
  const chunks = await Promise.all((0, range_1.default)(snapshot.numChunks).map(async (i) => {
321
- const buffer = (0, common_utils_1.bufferToString)(await storage.readBlob(`summaryChunk_${i}`), "utf8");
322
- return (0, common_utils_1.stringToBuffer)(buffer, "base64");
399
+ return this.decodeSummaryBlob(await storage.readBlob(`summaryChunk_${i}`));
323
400
  }));
324
401
  const totalLength = chunks.reduce((a, b) => a + b.byteLength, 0);
325
402
  const serializedSummary = new Uint8Array(totalLength);
@@ -327,8 +404,7 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
327
404
  serializedSummary.set(new Uint8Array(chunk), offset);
328
405
  return offset + chunk.byteLength;
329
406
  }, 0);
330
- const packr = new msgpackr_1.Packr();
331
- const snapshotSummary = packr.unpack(serializedSummary);
407
+ const snapshotSummary = this.decodeSummary(serializedSummary);
332
408
  if (snapshotSummary.remoteChanges === undefined ||
333
409
  snapshotSummary.remoteTipView === undefined ||
334
410
  snapshotSummary.unrebasedRemoteChanges === undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"propertyTree.js","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable import/no-internal-modules */\nimport isEmpty from \"lodash/isEmpty\";\nimport findIndex from \"lodash/findIndex\";\nimport range from \"lodash/range\";\nimport { copy as cloneDeep } from \"fastest-json-copy\";\nimport { Packr } from \"msgpackr\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\n\nimport { bufferToString, stringToBuffer } from \"@fluidframework/common-utils\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\n\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\n\nimport { PropertyFactory, BaseProperty, NodeProperty } from \"@fluid-experimental/property-properties\";\n\nimport { v4 as uuidv4 } from \"uuid\";\nimport axios from \"axios\";\nimport { PropertyTreeFactory } from \"./propertyTreeFactory\";\n\nexport type SerializedChangeSet = any;\n\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\nexport interface IPropertyTreeMessage {\n\top: OpKind;\n\tchangeSet: SerializedChangeSet;\n\tmetadata: Metadata;\n\tguid: string;\n\treferenceGuid: string;\n\tremoteHeadGuid: string;\n\tlocalBranchStart: string | undefined;\n\trebaseMetaInformation?: Map<any, any>;\n\tuseMH?: boolean;\n}\n\nexport interface IRemotePropertyTreeMessage extends IPropertyTreeMessage {\n\tsequenceNumber: number;\n}\ninterface ISnapshot {\n\tbranchGuid: string;\n\tsummaryMinimumSequenceNumber: number;\n\tuseMH: boolean;\n\tnumChunks: number;\n}\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, \"fluid_propertyTree_\");\n\n\t\tthis.options = options;\n\t\t// Quick hack to let the root be aware of the DDS hosting it.\n\t\tthis._root._tree = this;\n\n\t\t// By default, we currently don't use the MH\n\t\tthis.useMH = options.useMH ?? false;\n\t}\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\treturn this.localChanges.length > 0\n ? this.localChanges[this.localChanges.length - 1]\n : this.remoteChanges[this.remoteChanges.length - 1];\n\t}\n\tpublic get root(): NodeProperty {\n\t\treturn this._root as NodeProperty;\n\t}\n\n\tpublic commit(metadata?: Metadata, submitEmptyChange?: boolean) {\n\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\n\t\tlet doSubmit = !!submitEmptyChange;\n\n\t\t// if no override provided dont submit unless metadata are provided\n\t\tif (submitEmptyChange === undefined) {\n\t\t\tdoSubmit = metadata !== undefined;\n\t\t}\n\n\t\tif (doSubmit || !isEmpty(changes)) {\n\t\t\tthis.applyChangeSet(changes, metadata || {});\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\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 { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\n\nimport { bufferToString, stringToBuffer } from \"@fluidframework/common-utils\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\n\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\n\nimport { PropertyFactory, BaseProperty, NodeProperty } from \"@fluid-experimental/property-properties\";\n\nimport { v4 as uuidv4 } from \"uuid\";\nimport axios from \"axios\";\nimport { PropertyTreeFactory } from \"./propertyTreeFactory\";\n\nexport type SerializedChangeSet = any;\n\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\nexport interface IPropertyTreeMessage {\n\top: OpKind;\n\tchangeSet: SerializedChangeSet;\n\tmetadata: Metadata;\n\tguid: string;\n\treferenceGuid: string;\n\tremoteHeadGuid: string;\n\tlocalBranchStart: string | undefined;\n\trebaseMetaInformation?: Map<any, any>;\n\tuseMH?: boolean;\n}\n\nexport interface IRemotePropertyTreeMessage extends IPropertyTreeMessage {\n\tsequenceNumber: number;\n}\ninterface ISnapshot {\n\tbranchGuid: string;\n\tsummaryMinimumSequenceNumber: number;\n\tuseMH: boolean;\n\tnumChunks: number;\n}\nexport interface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n}\n\nexport interface SharedPropertyTreeOptions {\n\tpaths?: string[];\n\tclientFiltering?: boolean;\n\tuseMH?: boolean;\n}\n\nexport interface ISharedPropertyTreeEncDec {\n\tmessageEncoder: { encode: (IPropertyTreeMessage) => IPropertyTreeMessage;\n\t\tdecode: (IPropertyTreeMessage) => IPropertyTreeMessage; };\n\tsummaryEncoder: { encode: (ISnapshotSummary) => Buffer; decode: (Buffer) => ISnapshotSummary; };\n}\n\nexport interface IPropertyTreeConfig {\n\tencDec: ISharedPropertyTreeEncDec;\n}\n\nconst defaultEncDec: ISharedPropertyTreeEncDec = {\n\tmessageEncoder: { encode: (msg: IPropertyTreeMessage) => msg,\n\t\tdecode: (msg: IPropertyTreeMessage) => msg },\n\tsummaryEncoder: {\n\t\tencode: (summary: ISnapshotSummary) => {\n\t\t\tconst packr = new Packr();\n\t\t\tconst serializedSummary = packr.pack(summary);\n\t\t\treturn serializedSummary;\n\t\t},\n\t\tdecode: (serializedSummary) => {\n\t\t\tconst packr = new Packr();\n\t\t\tconst snapshotSummary = packr.unpack(serializedSummary);\n\t\t\treturn snapshotSummary as ISnapshotSummary;\n\t\t},\n\t},\n};\n\n/**\n * Silly DDS example that models a six sided die.\n *\n * Unlike the typical 'Dice Roller' example where clients clobber each other's last roll in a\n * SharedMap, this 'SharedDie' DDS works by advancing an internal PRNG each time it sees a 'roll'\n * operation.\n *\n * Because all clients are using the same PRNG starting in the same state, they arrive at\n * consensus by simply applying the same number of rolls. (A fun addition would be logging\n * who received which roll, which would need to change as clients learn how races are resolved\n * in the total order)\n */\nexport class SharedPropertyTree extends SharedObject {\n\ttipView: SerializedChangeSet = {};\n\tremoteTipView: SerializedChangeSet = {};\n\tlocalChanges: IPropertyTreeMessage[] = [];\n\tremoteChanges: IPropertyTreeMessage[] = [];\n\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\ttransmissionsHaveBeenStopped = false;\n\tenqueuedMessages: IPropertyTreeMessage[] = [];\n\tnotificationDelayScope: number = 0;\n\t_root: any = PropertyFactory.create(\"NodeProperty\");\n\toptions: SharedPropertyTreeOptions;\n\tskipSequenceNumber: number = -1;\n\theadCommitGuid: string = \"\";\n\tuseMH: boolean = false;\n\tpropertyTreeConfig: IPropertyTreeConfig;\n\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\toptions: SharedPropertyTreeOptions,\n\t\tpropertyTreeConfig: IPropertyTreeConfig = { encDec: defaultEncDec },\n\t) {\n\t\tsuper(id, runtime, attributes, \"fluid_propertyTree_\");\n\n\t\tthis.options = options;\n\t\t// Quick hack to let the root be aware of the DDS hosting it.\n\t\tthis._root._tree = this;\n\n\t\t// By default, we currently don't use the MH\n\t\tthis.useMH = options.useMH ?? false;\n\t\tthis.propertyTreeConfig = propertyTreeConfig;\n\t}\n\n\t/**\n\t * Create a new shared cell\n\t *\n\t * @param runtime - data store runtime the new shared map belongs to\n\t * @param id - optional name of the shared map\n\t * @returns newly create shared map (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string, queryString?: string) {\n\t\treturn runtime.createChannel(id, PropertyTreeFactory.Type) as SharedPropertyTree;\n\t}\n\n\t/**\n\t * Get a factory for SharedDie to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedDie\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new PropertyTreeFactory();\n\t}\n\n\t/**\n\t * in case of partial checkout we want to send the paths we are interested in once we are connected\n\t */\n\tprotected onConnect() {\n\t\t// on connect we scope all deltas such that we only get relevant changes\n\t\t// since we know the paths already at constuction time this is okay\n\t\tthis.scopeFutureDeltasToPaths(this.options.paths);\n\t}\n\n\tprivate scopeFutureDeltasToPaths(paths?: string[]) {\n\t\tconst socket = (this.runtime.deltaManager as any).deltaManager.connectionManager.connection.socket;\n\t\tsocket.emit(\"partial_checkout\", { paths });\n\t}\n\n\tpublic _reportDirtinessToView() {\n\t\t// Check whether anybody is listening. If not, we don't want to pay the price\n\t\t// for the serialization of the data structure\n\t\tif (this.listenerCount(\"localModification\") > 0) {\n\t\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n 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\treturn this.localChanges.length > 0\n ? this.localChanges[this.localChanges.length - 1]\n : this.remoteChanges[this.remoteChanges.length - 1];\n\t}\n\tpublic get root(): NodeProperty {\n\t\treturn this._root as NodeProperty;\n\t}\n\n\tpublic commit(metadata?: Metadata, submitEmptyChange?: boolean) {\n\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\n\t\tlet doSubmit = !!submitEmptyChange;\n\n\t\t// if no override provided dont submit unless metadata are provided\n\t\tif (submitEmptyChange === undefined) {\n\t\t\tdoSubmit = metadata !== undefined;\n\t\t}\n\n\t\tif (doSubmit || !isEmpty(changes)) {\n\t\t\tthis.applyChangeSet(changes, metadata || {});\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\t/**\n\t * This method encodes the given message to the transfer form\n\t * @param change - The message to be encoded.\n \t */\n\tprivate encodeMessage(change: IPropertyTreeMessage): IPropertyTreeMessage {\n\t\treturn this.propertyTreeConfig.encDec.messageEncoder.encode(change);\n\t}\n\n\t/**\n \t * This method decodes message from the transfer form.\n\t * @param transferChange - The message to be decoded.\n \t */\n\tprivate decodeMessage(transferChange: IPropertyTreeMessage): IPropertyTreeMessage {\n\t\treturn this.propertyTreeConfig.encDec.messageEncoder.decode(transferChange);\n\t}\n\n\tprivate applyChangeSet(changeSet: SerializedChangeSet, metadata: Metadata) {\n\t\tconst _changeSet = new ChangeSet(changeSet);\n\t\t_changeSet._toReversibleChangeSet(this.tipView);\n\n\t\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\t\t// Queue the op for transmission to the Fluid service.\n\t\tconst transferChange = this.encodeMessage(cloneDeep(change));\n\t\tif (this.transmissionsHaveBeenStopped) {\n\t\t\tthis.enqueuedMessages.push(transferChange);\n\t\t} else {\n\t\t\tthis.submitLocalMessage(transferChange);\n\t\t}\n\t}\n\n\tstopTransmission(stop: boolean) {\n\t\tthis.transmissionsHaveBeenStopped = stop;\n\t\tif (stop === false) {\n\t\t\tfor (const message of this.enqueuedMessages) {\n\t\t\t\tthis.submitLocalMessage(message);\n\t\t\t}\n\t\t\tthis.enqueuedMessages = [];\n\t\t}\n\t}\n\t/**\n\t * Delays notifications until popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic pushNotificationDelayScope() {\n\t\t// set the scope counter\n\t\tthis.notificationDelayScope++;\n\n\t\t// If we reach 0, we have to report unreported changes\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tthis._root._reportDirtinessToView();\n\t\t}\n\t}\n\n\t/**\n\t * Re-enables notifications when popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic popNotificationDelayScope() {\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tconsole.error(\"Unbalanced push/pop calls.\");\n\t\t}\n\t\tthis.notificationDelayScope--;\n\t\tthis._root._reportDirtinessToView();\n\t}\n\n\t/**\n\t * Process an operation\n\t *\n\t * @param message - the message to prepare\n\t * @param local - whether the message was sent by the local client\n\t * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.\n\t * For messages from a remote client, this will be undefined.\n\t */\n\tprotected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\tif (message.type === MessageType.Operation && message.sequenceNumber > this.skipSequenceNumber) {\n\t\t\tconst change: IPropertyTreeMessage = this.decodeMessage(cloneDeep(message.contents));\n\t\t\tconst content: IRemotePropertyTreeMessage = { ...change, sequenceNumber: message.sequenceNumber };\n\t\t\tswitch (content.op) {\n\t\t\t\tcase OpKind.ChangeSet:\n\t\t\t\t\t// If the op originated locally from this client, we've already accounted for it\n\t\t\t\t\t// by advancing the state. Otherwise, advance the PRNG now.\n\t\t\t\t\tthis._applyRemoteChangeSet(cloneDeep(content));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static prune(\n\t\tminimumSequenceNumber: number,\n\t\tremoteChanges: IPropertyTreeMessage[],\n\t\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>,\n\t) {\n\t\t// for faster lookup of remote change guids\n\t\tconst remoteChangeMap = new Map<string, number>();\n\t\tremoteChanges.forEach((change, index) => {\n\t\t\tremoteChangeMap.set(change.guid, index);\n\t\t});\n\n\t\t// we will track visited nodes\n\t\tconst visitedUnrebasedRemoteChanges = new Set<string>();\n\t\tconst visitedRemoteChanges = new Set<string>();\n\n\t\tfor (const id of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tconst unrebasedChange = unrebasedRemoteChanges[id];\n\n\t\t\t// we are only interested in changes that are newer than the sequence number\n\t\t\t// and that were not yet visited previously\n\t\t\tif (\n\t\t\t\tunrebasedChange.sequenceNumber >= minimumSequenceNumber &&\n\t\t\t\t!visitedUnrebasedRemoteChanges.has(unrebasedChange.guid)\n\t\t\t) {\n\t\t\t\t// we visited that unrebased change and mark it as visited\n\t\t\t\tvisitedUnrebasedRemoteChanges.add(unrebasedChange.guid);\n\n\t\t\t\tlet visitor = unrebasedChange;\n\t\t\t\t// we will walk along the commit chain until we hit a remote change or a visited unrebased commit\n\t\t\t\t// at that point we can skip since we already traced the rest of the commit chain\n\t\t\t\twhile (\n\t\t\t\t\tvisitor.remoteHeadGuid !== visitor.referenceGuid ||\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.has(visitor.referenceGuid)\n\t\t\t\t) {\n\t\t\t\t\tconst guid = visitor.referenceGuid;\n\t\t\t\t\tif (guid === \"\") {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// since the change is not in remote it must be in unrebased\n\t\t\t\t\tvisitor = unrebasedRemoteChanges[visitor.referenceGuid];\n\t\t\t\t\tif (!visitor) {\n\t\t\t\t\t\tthrow new Error(`no visitor found for guid \"${guid}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.add(visitor.guid);\n\t\t\t\t}\n\t\t\t\t// if we exited the loop because we hit a remote change than add it as visited\n\t\t\t\tif (visitor.remoteHeadGuid === visitor.referenceGuid && remoteChangeMap.has(visitor.referenceGuid)) {\n\t\t\t\t\tvisitedRemoteChanges.add(visitor.referenceGuid);\n\t\t\t\t}\n\n\t\t\t\t// If we have a change that refers to the start of the history (remoteHeadGuid === \"\"), we have to\n\t\t\t\t// keep all remote Changes until this change has been processed\n\t\t\t\tif (visitor.remoteHeadGuid === \"\") {\n\t\t\t\t\tvisitedRemoteChanges.add(remoteChanges[0].guid);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlet pruned = 0;\n\t\t// we can now filter the unrebased changes by removing any changes\n\t\t// we have not visited at all during our traversal\n\t\tconst prunedUnrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\t\tfor (const key of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tif (visitedUnrebasedRemoteChanges.has(key)) {\n\t\t\t\tprunedUnrebasedRemoteChanges[key] = unrebasedRemoteChanges[key];\n\t\t\t} else {\n\t\t\t\tpruned++;\n\t\t\t}\n\t\t}\n\n\t\t// find minimum index\n\t\tconst minIndex = Math.min(...[...visitedRemoteChanges].map((key) => remoteChangeMap.get(key) as number));\n\n\t\tconst prunedRemoteChanges = remoteChanges.slice(minIndex);\n\t\tpruned += minIndex;\n\n\t\treturn {\n\t\t\tremoteChanges: prunedRemoteChanges,\n\t\t\tunrebasedRemoteChanges: prunedUnrebasedRemoteChanges,\n\t\t\tprunedCount: pruned,\n\t\t};\n\t}\n\tpublic pruneHistory() {\n\t\tconst msn = this.runtime.deltaManager.minimumSequenceNumber;\n\n\t\tconst { remoteChanges, unrebasedRemoteChanges } = SharedPropertyTree.prune(\n\t\t\tmsn,\n\t\t\tthis.remoteChanges,\n\t\t\tthis.unrebasedRemoteChanges,\n\t\t);\n\n\t\tthis.remoteChanges = remoteChanges;\n\t\tthis.unrebasedRemoteChanges = unrebasedRemoteChanges;\n\t}\n\n\t/**\n\t * This method encodes the local summary (snapshot) object into the serialized form.\n\t * @param summary - The local summary (snapshot)representation.\n\t * @returns The serialized summary representation.\n\t */\n\tprivate encodeSummary(summary: ISnapshotSummary) {\n\t\treturn this.propertyTreeConfig.encDec.summaryEncoder.encode(summary);\n\t}\n\n\t/**\n\t * This method decodes the serialized form of the summary into the local summary (snapshot) object.\n\t * @param serializedSummary - The serialized summary representation.\n\t * @returns The local summary (snapshot)representation.\n \t */\n\tprivate decodeSummary(serializedSummary): ISnapshotSummary {\n\t\treturn this.propertyTreeConfig.encDec.summaryEncoder.decode(serializedSummary);\n\t}\n\n\t/**\n \t * This method writes the log message if the logging is enabled in the extended DDS.\n\t * The logging is not enabled in the default Property DDS\n\t * @param message - The message to be logged.\n\t */\n\tprotected logIfEnabled(message) {}\n\n\t/**\n \t * This method encodes the binary representation of the\n \t * blob.\n\t * @param blob - The binary representation of the blob.\n\t * @returns The encoded representation of the blob.\n \t */\n\tprivate encodeSummaryBlob(blob: ArrayBuffer): any {\n\t\treturn bufferToString(blob, \"base64\");\n\t}\n\n\t/**\n \t * This method decodes the encoded representation of the\n\t * blob.\n \t * @param blob - The encoded representation of the blob.\n\t * @returns The binary representation of the blob.\n\t */\n\tprivate decodeSummaryBlob(encoded: any): ArrayBuffer {\n\t\tconst buffer = bufferToString(encoded, \"utf8\");\n\t\treturn stringToBuffer(buffer, \"base64\");\n\t}\n\n\tpublic summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tthis.pruneHistory();\n\t\tconst snapshot: ISnapshot = {\n\t\t\tbranchGuid: this.handle.absolutePath.split(\"/\").pop() as string,\n\t\t\tsummaryMinimumSequenceNumber: this.runtime.deltaManager.minimumSequenceNumber,\n\t\t\tuseMH: this.useMH,\n\t\t\tnumChunks: 0,\n\t\t};\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tif (!this.useMH) {\n\t\t\t// If the MH is not used, we have to include the tip view, the remote changes and the received\n\t\t\t// deltas to the summary\n\t\t\tconst summary: ISnapshotSummary = {\n\t\t\t\tremoteTipView: this.remoteTipView,\n\t\t\t\tremoteChanges: this.remoteChanges,\n\t\t\t\tunrebasedRemoteChanges: this.unrebasedRemoteChanges,\n\t\t\t};\n\t\t\tconst chunkSize = 5000 * 1024; // Default limit seems to be 5MB\n\t\t\tlet totalBlobsSize = 0;\n\t\t\tconst serializedSummary = this.encodeSummary(summary);\n\t\t\tfor (let pos = 0, i = 0; pos < serializedSummary.length; pos += chunkSize, i++) {\n\t\t\t\tconst summaryBlob = this.encodeSummaryBlob(serializedSummary.slice(pos, pos + chunkSize));\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\t\ttotalBlobsSize += summaryBlob[\"length\"];\n\t\t\t\tbuilder.addBlob(`summaryChunk_${i}`, summaryBlob);\n\t\t\t\tsnapshot.numChunks++;\n\t\t\t}\n\t\t\tthis.logIfEnabled(`Total blobs transfer size: ${totalBlobsSize}`);\n\t\t}\n\n\t\tbuilder.addBlob(\"properties\", serializer !== undefined\n\t\t\t? serializer.stringify(snapshot, this.handle)\n\t\t\t: JSON.stringify(snapshot));\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst runtime = this.runtime;\n\t\tconst handleTableChunk = await storage.readBlob(\"properties\");\n\t\tconst utf8 = bufferToString(handleTableChunk, \"utf8\");\n\n\t\tconst snapshot: ISnapshot = this.serializer.parse(utf8);\n\t\tthis.useMH = snapshot.useMH;\n\n\t\ttry {\n\t\t\tif (!snapshot.useMH) {\n\t\t\t\t// We load all chunks\n\t\t\t\tconst chunks: ArrayBufferLike[] = await Promise.all(\n\t\t\t\t\trange(snapshot.numChunks).map(async (i) => {\n\t\t\t\t\t\treturn this.decodeSummaryBlob(await storage.readBlob(`summaryChunk_${i}`));\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst totalLength = chunks.reduce((a, b) => a + b.byteLength, 0);\n\t\t\t\tconst serializedSummary = new Uint8Array(totalLength);\n\t\t\t\tchunks.reduce((offset, chunk) => {\n\t\t\t\t\tserializedSummary.set(new Uint8Array(chunk), offset);\n\t\t\t\t\treturn offset + chunk.byteLength;\n\t\t\t\t}, 0);\n\t\t\t\tconst snapshotSummary = this.decodeSummary(serializedSummary);\n\t\t\t\tif (\n\t\t\t\t\tsnapshotSummary.remoteChanges === undefined ||\n\t\t\t\t\tsnapshotSummary.remoteTipView === undefined ||\n\t\t\t\t\tsnapshotSummary.unrebasedRemoteChanges === undefined\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\"Invalid Snapshot.\");\n\t\t\t\t}\n\n\t\t\t\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"]}
@@ -0,0 +1,15 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { IChannelFactory, IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
6
+ import { SharedPropertyTree } from "./propertyTree";
7
+ /**
8
+ * This class is the extension of SharedPropertyTree which compresses
9
+ * the deltas and summaries communicated to the server by Deflate.
10
+ */
11
+ export declare class DeflatedPropertyTree extends SharedPropertyTree {
12
+ static create(runtime: IFluidDataStoreRuntime, id?: string, queryString?: string): DeflatedPropertyTree;
13
+ static getFactory(): IChannelFactory;
14
+ }
15
+ //# sourceMappingURL=propertyTreeExt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"propertyTreeExt.d.ts","sourceRoot":"","sources":["../src/propertyTreeExt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpD;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,kBAAkB;WAC1C,MAAM,CAAC,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;WAIzE,UAAU,IAAI,eAAe;CAG9C"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.DeflatedPropertyTree = void 0;
8
+ const propertyTree_1 = require("./propertyTree");
9
+ const propertyTreeExtFactories_1 = require("./propertyTreeExtFactories");
10
+ /**
11
+ * This class is the extension of SharedPropertyTree which compresses
12
+ * the deltas and summaries communicated to the server by Deflate.
13
+ */
14
+ class DeflatedPropertyTree extends propertyTree_1.SharedPropertyTree {
15
+ static create(runtime, id, queryString) {
16
+ return runtime.createChannel(id, propertyTreeExtFactories_1.DeflatedPropertyTreeFactory.Type);
17
+ }
18
+ static getFactory() {
19
+ return new propertyTreeExtFactories_1.DeflatedPropertyTreeFactory();
20
+ }
21
+ }
22
+ exports.DeflatedPropertyTree = DeflatedPropertyTree;
23
+ //# sourceMappingURL=propertyTreeExt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"propertyTreeExt.js","sourceRoot":"","sources":["../src/propertyTreeExt.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,iDAAoD;AACpD,yEAAyE;AAEzE;;;GAGG;AACH,MAAa,oBAAqB,SAAQ,iCAAkB;IACjD,MAAM,CAAC,MAAM,CAAC,OAA+B,EAAE,EAAW,EAAE,WAAoB;QACnF,OAAO,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,sDAA2B,CAAC,IAAI,CAAyB,CAAC;IAC/F,CAAC;IAEM,MAAM,CAAC,UAAU;QACpB,OAAO,IAAI,sDAA2B,EAAE,CAAC;IAC7C,CAAC;CACJ;AARD,oDAQC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IChannelFactory, IFluidDataStoreRuntime } from \"@fluidframework/datastore-definitions\";\nimport { SharedPropertyTree } from \"./propertyTree\";\nimport { DeflatedPropertyTreeFactory } from \"./propertyTreeExtFactories\";\n\n/**\n * This class is the extension of SharedPropertyTree which compresses\n * the deltas and summaries communicated to the server by Deflate.\n */\nexport class DeflatedPropertyTree extends SharedPropertyTree {\n public static create(runtime: IFluidDataStoreRuntime, id?: string, queryString?: string) {\n return runtime.createChannel(id, DeflatedPropertyTreeFactory.Type) as DeflatedPropertyTree;\n }\n\n public static getFactory(): IChannelFactory {\n return new DeflatedPropertyTreeFactory();\n }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { IChannelAttributes, IFluidDataStoreRuntime, IChannelServices, IChannelFactory } from "@fluidframework/datastore-definitions";
2
+ import { DeflatedPropertyTree } from "./propertyTreeExt";
3
+ export declare class DeflatedPropertyTreeFactory implements IChannelFactory {
4
+ static readonly Type = "DeflatedPropertyTree:84534a0fe613522101f6";
5
+ static readonly Attributes: IChannelAttributes;
6
+ get type(): string;
7
+ get attributes(): IChannelAttributes;
8
+ load(runtime: IFluidDataStoreRuntime, id: string, services: IChannelServices, attributes: IChannelAttributes, url?: string): Promise<DeflatedPropertyTree>;
9
+ create(document: IFluidDataStoreRuntime, id: string, requestUrl?: string): DeflatedPropertyTree;
10
+ }
11
+ //# sourceMappingURL=propertyTreeExtFactories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"propertyTreeExtFactories.d.ts","sourceRoot":"","sources":["../src/propertyTreeExtFactories.ts"],"names":[],"mappings":"AAMA,OAAO,EACH,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EAClB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAmDzD,qBAAa,2BAA4B,YAAW,eAAe;IAC/D,gBAAuB,IAAI,+CAA+C;IAE1E,gBAAuB,UAAU,EAAE,kBAAkB,CAInD;IAEF,IAAW,IAAI,WAEd;IAED,IAAW,UAAU,uBAEpB;IAEY,IAAI,CACb,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,EAC9B,GAAG,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC;IAQzB,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,oBAAoB;CAOzG"}