@fluid-experimental/property-dds 1.3.4 → 1.3.5
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/propertyTree.d.ts +3 -0
- package/dist/propertyTree.d.ts.map +1 -1
- package/dist/propertyTree.js +32 -7
- package/dist/propertyTree.js.map +1 -1
- package/lib/propertyTree.d.ts +3 -0
- package/lib/propertyTree.d.ts.map +1 -1
- package/lib/propertyTree.js +32 -7
- package/lib/propertyTree.js.map +1 -1
- package/package.json +19 -16
- package/src/propertyTree.ts +45 -16
- package/tsconfig.json +2 -1
package/dist/propertyTree.d.ts
CHANGED
|
@@ -31,6 +31,7 @@ export interface ISnapshotSummary {
|
|
|
31
31
|
remoteTipView?: SerializedChangeSet;
|
|
32
32
|
remoteChanges?: IPropertyTreeMessage[];
|
|
33
33
|
unrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;
|
|
34
|
+
remoteHeadGuid: string;
|
|
34
35
|
}
|
|
35
36
|
export interface SharedPropertyTreeOptions {
|
|
36
37
|
paths?: string[];
|
|
@@ -133,6 +134,8 @@ export declare class SharedPropertyTree extends SharedObject {
|
|
|
133
134
|
* For messages from a remote client, this will be undefined.
|
|
134
135
|
*/
|
|
135
136
|
protected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown): void;
|
|
137
|
+
private addRemoteChange;
|
|
138
|
+
private updateRemoteHeadGuid;
|
|
136
139
|
static prune(minimumSequenceNumber: number, remoteChanges: IPropertyTreeMessage[], unrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>): {
|
|
137
140
|
remoteChanges: IPropertyTreeMessage[];
|
|
138
141
|
unrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propertyTree.d.ts","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAUH,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AASpF,OAAO,EAAiC,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAMtG,oBAAY,mBAAmB,GAAG,GAAG,CAAC;AAEtC,oBAAY,QAAQ,GAAG,GAAG,CAAC;AAK3B,0BAAkB,MAAM;IAEvB,SAAS,IAAI;CACb;AAED,MAAM,WAAW,oBAAoB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,mBAAmB,CAAC;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,qBAAqB,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,0BAA2B,SAAQ,oBAAoB;IACvE,cAAc,EAAE,MAAM,CAAC;CACvB;AAOD,MAAM,WAAW,gBAAgB;IAChC,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,aAAa,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACvC,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"propertyTree.d.ts","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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"}
|
package/dist/propertyTree.js
CHANGED
|
@@ -161,16 +161,16 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
|
|
|
161
161
|
applyChangeSet(changeSet, metadata) {
|
|
162
162
|
const _changeSet = new property_changeset_1.ChangeSet(changeSet);
|
|
163
163
|
_changeSet._toReversibleChangeSet(this.tipView);
|
|
164
|
-
|
|
165
|
-
? this.remoteChanges[this.remoteChanges.length - 1].guid
|
|
166
|
-
: this.headCommitGuid;
|
|
164
|
+
this.updateRemoteHeadGuid();
|
|
167
165
|
const change = {
|
|
168
166
|
op: 0 /* ChangeSet */,
|
|
169
167
|
changeSet,
|
|
170
168
|
metadata,
|
|
171
169
|
guid: (0, uuid_1.v4)(),
|
|
172
|
-
remoteHeadGuid,
|
|
173
|
-
referenceGuid: this.localChanges.length > 0
|
|
170
|
+
remoteHeadGuid: this.headCommitGuid,
|
|
171
|
+
referenceGuid: this.localChanges.length > 0
|
|
172
|
+
? this.localChanges[this.localChanges.length - 1].guid
|
|
173
|
+
: this.headCommitGuid,
|
|
174
174
|
localBranchStart: this.localChanges.length > 0 ? this.localChanges[0].guid : undefined,
|
|
175
175
|
useMH: this.useMH,
|
|
176
176
|
};
|
|
@@ -239,6 +239,15 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
|
|
|
239
239
|
}
|
|
240
240
|
}
|
|
241
241
|
}
|
|
242
|
+
addRemoteChange(change) {
|
|
243
|
+
this.remoteChanges.push(change);
|
|
244
|
+
this.updateRemoteHeadGuid();
|
|
245
|
+
}
|
|
246
|
+
updateRemoteHeadGuid() {
|
|
247
|
+
this.headCommitGuid = this.remoteChanges.length > 0
|
|
248
|
+
? this.remoteChanges[this.remoteChanges.length - 1].guid
|
|
249
|
+
: this.headCommitGuid;
|
|
250
|
+
}
|
|
242
251
|
static prune(minimumSequenceNumber, remoteChanges, unrebasedRemoteChanges) {
|
|
243
252
|
// for faster lookup of remote change guids
|
|
244
253
|
const remoteChangeMap = new Map();
|
|
@@ -367,6 +376,7 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
|
|
|
367
376
|
const summary = {
|
|
368
377
|
remoteTipView: this.remoteTipView,
|
|
369
378
|
remoteChanges: this.remoteChanges,
|
|
379
|
+
remoteHeadGuid: this.headCommitGuid,
|
|
370
380
|
unrebasedRemoteChanges: this.unrebasedRemoteChanges,
|
|
371
381
|
};
|
|
372
382
|
const chunkSize = 5000 * 1024; // Default limit seems to be 5MB
|
|
@@ -410,9 +420,24 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
|
|
|
410
420
|
snapshotSummary.unrebasedRemoteChanges === undefined) {
|
|
411
421
|
throw new Error("Invalid Snapshot.");
|
|
412
422
|
}
|
|
423
|
+
if (snapshotSummary.remoteHeadGuid === undefined) {
|
|
424
|
+
// The summary does not contain a remoteHeadGuid. This means the summary has
|
|
425
|
+
// been created by an old version of PropertyDDS, that did not yet have this patch.
|
|
426
|
+
snapshotSummary.remoteHeadGuid = (snapshotSummary.remoteChanges.length > 0) ?
|
|
427
|
+
// If there are remote changes in the
|
|
428
|
+
// summary we can deduce the head GUID from these changes.
|
|
429
|
+
snapshotSummary.remoteChanges[snapshotSummary.remoteChanges.length - 1].guid :
|
|
430
|
+
// If no remote head GUID is available, we will fall back to the old behaviour,
|
|
431
|
+
// where the head GUID was set to an empty string. However, this could lead to
|
|
432
|
+
// divergence between the clients, if there is still a client in the session
|
|
433
|
+
// that is using a version of this library without this patch and which
|
|
434
|
+
// has started the session at a different summary.
|
|
435
|
+
"";
|
|
436
|
+
}
|
|
413
437
|
this.remoteTipView = snapshotSummary.remoteTipView;
|
|
414
438
|
this.remoteChanges = snapshotSummary.remoteChanges;
|
|
415
439
|
this.unrebasedRemoteChanges = snapshotSummary.unrebasedRemoteChanges;
|
|
440
|
+
this.headCommitGuid = snapshotSummary.remoteHeadGuid;
|
|
416
441
|
const isPartialCheckoutActive = !!(this.options.clientFiltering && this.options.paths);
|
|
417
442
|
if (isPartialCheckoutActive && this.options.paths) {
|
|
418
443
|
this.remoteTipView = property_changeset_1.Utils.getFilteredChangeSetByPaths(this.remoteTipView, this.options.paths);
|
|
@@ -450,7 +475,7 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
|
|
|
450
475
|
if (isPartialCheckoutActive && this.options.paths) {
|
|
451
476
|
remoteChange.changeSet = property_changeset_1.Utils.getFilteredChangeSetByPaths(remoteChange.changeSet, this.options.paths);
|
|
452
477
|
}
|
|
453
|
-
this.
|
|
478
|
+
this.addRemoteChange(remoteChange);
|
|
454
479
|
}
|
|
455
480
|
}
|
|
456
481
|
else {
|
|
@@ -492,7 +517,7 @@ class SharedPropertyTree extends shared_object_base_1.SharedObject {
|
|
|
492
517
|
if (this.remoteChanges.length !== 0) {
|
|
493
518
|
(0, property_changeset_1.rebaseToRemoteChanges)(change, this.getUnrebasedChange.bind(this), this.getRebasedChanges.bind(this));
|
|
494
519
|
}
|
|
495
|
-
this.
|
|
520
|
+
this.addRemoteChange(change);
|
|
496
521
|
// Apply the remote change set to the remote tip view
|
|
497
522
|
const remoteChangeSetWrapper = new property_changeset_1.ChangeSet(this.remoteTipView);
|
|
498
523
|
remoteChangeSetWrapper.applyChangeSet(change.changeSet);
|
package/dist/propertyTree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propertyTree.js","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable import/no-internal-modules */\nimport isEmpty from \"lodash/isEmpty\";\nimport findIndex from \"lodash/findIndex\";\nimport range from \"lodash/range\";\nimport { copy as cloneDeep } from \"fastest-json-copy\";\nimport { Packr } from \"msgpackr\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\n\nimport { bufferToString, stringToBuffer } from \"@fluidframework/common-utils\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\n\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\n\nimport { PropertyFactory, BaseProperty, NodeProperty } from \"@fluid-experimental/property-properties\";\n\nimport { v4 as uuidv4 } from \"uuid\";\nimport axios from \"axios\";\nimport { PropertyTreeFactory } from \"./propertyTreeFactory\";\n\nexport type SerializedChangeSet = any;\n\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\nexport interface IPropertyTreeMessage {\n\top: OpKind;\n\tchangeSet: SerializedChangeSet;\n\tmetadata: Metadata;\n\tguid: string;\n\treferenceGuid: string;\n\tremoteHeadGuid: string;\n\tlocalBranchStart: string | undefined;\n\trebaseMetaInformation?: Map<any, any>;\n\tuseMH?: boolean;\n}\n\nexport interface IRemotePropertyTreeMessage extends IPropertyTreeMessage {\n\tsequenceNumber: number;\n}\ninterface ISnapshot {\n\tbranchGuid: string;\n\tsummaryMinimumSequenceNumber: number;\n\tuseMH: boolean;\n\tnumChunks: number;\n}\nexport interface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n}\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"]}
|
|
1
|
+
{"version":3,"file":"propertyTree.js","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable import/no-internal-modules */\nimport isEmpty from \"lodash/isEmpty\";\nimport findIndex from \"lodash/findIndex\";\nimport range from \"lodash/range\";\nimport { copy as cloneDeep } from \"fastest-json-copy\";\nimport { Packr } from \"msgpackr\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\n\nimport { bufferToString, stringToBuffer } from \"@fluidframework/common-utils\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\n\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\n\nimport { PropertyFactory, BaseProperty, NodeProperty } from \"@fluid-experimental/property-properties\";\n\nimport { v4 as uuidv4 } from \"uuid\";\nimport axios from \"axios\";\nimport { PropertyTreeFactory } from \"./propertyTreeFactory\";\n\nexport type SerializedChangeSet = any;\n\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\nexport interface IPropertyTreeMessage {\n\top: OpKind;\n\tchangeSet: SerializedChangeSet;\n\tmetadata: Metadata;\n\tguid: string;\n\treferenceGuid: string;\n\tremoteHeadGuid: string;\n\tlocalBranchStart: string | undefined;\n\trebaseMetaInformation?: Map<any, any>;\n\tuseMH?: boolean;\n}\n\nexport interface IRemotePropertyTreeMessage extends IPropertyTreeMessage {\n\tsequenceNumber: number;\n}\ninterface ISnapshot {\n\tbranchGuid: string;\n\tsummaryMinimumSequenceNumber: number;\n\tuseMH: boolean;\n\tnumChunks: number;\n}\nexport interface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n\tremoteHeadGuid: string;\n}\n\nexport interface SharedPropertyTreeOptions {\n\tpaths?: string[];\n\tclientFiltering?: boolean;\n\tuseMH?: boolean;\n}\n\nexport interface ISharedPropertyTreeEncDec {\n\tmessageEncoder: { encode: (IPropertyTreeMessage) => IPropertyTreeMessage;\n\t\tdecode: (IPropertyTreeMessage) => IPropertyTreeMessage; };\n\tsummaryEncoder: { encode: (ISnapshotSummary) => Buffer; decode: (Buffer) => ISnapshotSummary; };\n}\n\nexport interface IPropertyTreeConfig {\n\tencDec: ISharedPropertyTreeEncDec;\n}\n\nconst defaultEncDec: ISharedPropertyTreeEncDec = {\n\tmessageEncoder: { encode: (msg: IPropertyTreeMessage) => msg,\n\t\tdecode: (msg: IPropertyTreeMessage) => msg },\n\tsummaryEncoder: {\n\t\tencode: (summary: ISnapshotSummary) => {\n\t\t\tconst packr = new Packr();\n\t\t\tconst serializedSummary = packr.pack(summary);\n\t\t\treturn serializedSummary;\n\t\t},\n\t\tdecode: (serializedSummary) => {\n\t\t\tconst packr = new Packr();\n\t\t\tconst snapshotSummary = packr.unpack(serializedSummary);\n\t\t\treturn snapshotSummary as ISnapshotSummary;\n\t\t},\n\t},\n};\n\n/**\n * Silly DDS example that models a six sided die.\n *\n * Unlike the typical 'Dice Roller' example where clients clobber each other's last roll in a\n * SharedMap, this 'SharedDie' DDS works by advancing an internal PRNG each time it sees a 'roll'\n * operation.\n *\n * Because all clients are using the same PRNG starting in the same state, they arrive at\n * consensus by simply applying the same number of rolls. (A fun addition would be logging\n * who received which roll, which would need to change as clients learn how races are resolved\n * in the total order)\n */\nexport class SharedPropertyTree extends SharedObject {\n\ttipView: SerializedChangeSet = {};\n\tremoteTipView: SerializedChangeSet = {};\n\tlocalChanges: IPropertyTreeMessage[] = [];\n\tremoteChanges: IPropertyTreeMessage[] = [];\n\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\ttransmissionsHaveBeenStopped = false;\n\tenqueuedMessages: IPropertyTreeMessage[] = [];\n\tnotificationDelayScope: number = 0;\n\t_root: any = PropertyFactory.create(\"NodeProperty\");\n\toptions: SharedPropertyTreeOptions;\n\tskipSequenceNumber: number = -1;\n\theadCommitGuid: string = \"\";\n\tuseMH: boolean = false;\n\tpropertyTreeConfig: IPropertyTreeConfig;\n\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\toptions: SharedPropertyTreeOptions,\n\t\tpropertyTreeConfig: IPropertyTreeConfig = { encDec: defaultEncDec },\n\t) {\n\t\tsuper(id, runtime, attributes, \"fluid_propertyTree_\");\n\n\t\tthis.options = options;\n\t\t// Quick hack to let the root be aware of the DDS hosting it.\n\t\tthis._root._tree = this;\n\n\t\t// By default, we currently don't use the MH\n\t\tthis.useMH = options.useMH ?? false;\n\t\tthis.propertyTreeConfig = propertyTreeConfig;\n\t}\n\n\t/**\n\t * Create a new shared cell\n\t *\n\t * @param runtime - data store runtime the new shared map belongs to\n\t * @param id - optional name of the shared map\n\t * @returns newly create shared map (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string, queryString?: string) {\n\t\treturn runtime.createChannel(id, PropertyTreeFactory.Type) as SharedPropertyTree;\n\t}\n\n\t/**\n\t * Get a factory for SharedDie to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedDie\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new PropertyTreeFactory();\n\t}\n\n\t/**\n\t * in case of partial checkout we want to send the paths we are interested in once we are connected\n\t */\n\tprotected onConnect() {\n\t\t// on connect we scope all deltas such that we only get relevant changes\n\t\t// since we know the paths already at constuction time this is okay\n\t\tthis.scopeFutureDeltasToPaths(this.options.paths);\n\t}\n\n\tprivate scopeFutureDeltasToPaths(paths?: string[]) {\n\t\tconst socket = (this.runtime.deltaManager as any).deltaManager.connectionManager.connection.socket;\n\t\tsocket.emit(\"partial_checkout\", { paths });\n\t}\n\n\tpublic _reportDirtinessToView() {\n\t\t// Check whether anybody is listening. If not, we don't want to pay the price\n\t\t// for the serialization of the data structure\n\t\tif (this.listenerCount(\"localModification\") > 0) {\n\t\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t\tconst _changeSet = new ChangeSet(changes);\n\t\t\tif (!isEmpty(_changeSet.getSerializedChangeSet())) {\n\t\t\t\tthis.emit(\"localModification\", _changeSet);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t}\n\t}\n\n\tpublic get changeSet(): SerializedChangeSet {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\treturn this.tipView;\n\t}\n\n\tpublic get activeCommit(): IPropertyTreeMessage {\n\t\treturn this.localChanges.length > 0\n\t\t\t? this.localChanges[this.localChanges.length - 1]\n\t\t\t: this.remoteChanges[this.remoteChanges.length - 1];\n\t}\n\tpublic get root(): NodeProperty {\n\t\treturn this._root as NodeProperty;\n\t}\n\n\tpublic commit(metadata?: Metadata, submitEmptyChange?: boolean) {\n\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\n\t\tlet doSubmit = !!submitEmptyChange;\n\n\t\t// if no override provided dont submit unless metadata are provided\n\t\tif (submitEmptyChange === undefined) {\n\t\t\tdoSubmit = metadata !== undefined;\n\t\t}\n\n\t\tif (doSubmit || !isEmpty(changes)) {\n\t\t\tthis.applyChangeSet(changes, metadata || {});\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\t/**\n\t * This method encodes the given message to the transfer form\n\t * @param change - The message to be encoded.\n \t */\n\tprivate encodeMessage(change: IPropertyTreeMessage): IPropertyTreeMessage {\n\t\treturn this.propertyTreeConfig.encDec.messageEncoder.encode(change);\n\t}\n\n\t/**\n \t * This method decodes message from the transfer form.\n\t * @param transferChange - The message to be decoded.\n\t \t */\n\tprivate decodeMessage(transferChange: IPropertyTreeMessage): IPropertyTreeMessage {\n\t\treturn this.propertyTreeConfig.encDec.messageEncoder.decode(transferChange);\n\t}\n\n\tprivate applyChangeSet(changeSet: SerializedChangeSet, metadata: Metadata) {\n\t\tconst _changeSet = new ChangeSet(changeSet);\n\t\t_changeSet._toReversibleChangeSet(this.tipView);\n\n\t\tthis.updateRemoteHeadGuid();\n\n\t\tconst change = {\n\t\t\top: OpKind.ChangeSet,\n\t\t\tchangeSet,\n\t\t\tmetadata,\n\t\t\tguid: uuidv4(),\n\t\t\tremoteHeadGuid: this.headCommitGuid,\n\t\t\treferenceGuid:\n\t\t\t\tthis.localChanges.length > 0\n\t\t\t\t? this.localChanges[this.localChanges.length - 1].guid\n\t\t\t\t: this.headCommitGuid,\n\t\t\tlocalBranchStart: this.localChanges.length > 0 ? this.localChanges[0].guid : undefined,\n\t\t\tuseMH: this.useMH,\n\t\t};\n\t\tthis._applyLocalChangeSet(change);\n\t\t// Queue the op for transmission to the Fluid service.\n\t\tconst transferChange = this.encodeMessage(cloneDeep(change));\n\t\tif (this.transmissionsHaveBeenStopped) {\n\t\t\tthis.enqueuedMessages.push(transferChange);\n\t\t} else {\n\t\t\tthis.submitLocalMessage(transferChange);\n\t\t}\n\t}\n\n\tstopTransmission(stop: boolean) {\n\t\tthis.transmissionsHaveBeenStopped = stop;\n\t\tif (stop === false) {\n\t\t\tfor (const message of this.enqueuedMessages) {\n\t\t\t\tthis.submitLocalMessage(message);\n\t\t\t}\n\t\t\tthis.enqueuedMessages = [];\n\t\t}\n\t}\n\t/**\n\t * Delays notifications until popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic pushNotificationDelayScope() {\n\t\t// set the scope counter\n\t\tthis.notificationDelayScope++;\n\n\t\t// If we reach 0, we have to report unreported changes\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tthis._root._reportDirtinessToView();\n\t\t}\n\t}\n\n\t/**\n\t * Re-enables notifications when popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic popNotificationDelayScope() {\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tconsole.error(\"Unbalanced push/pop calls.\");\n\t\t}\n\t\tthis.notificationDelayScope--;\n\t\tthis._root._reportDirtinessToView();\n\t}\n\n\t/**\n\t * Process an operation\n\t *\n\t * @param message - the message to prepare\n\t * @param local - whether the message was sent by the local client\n\t * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.\n\t * For messages from a remote client, this will be undefined.\n\t */\n\tprotected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\tif (message.type === MessageType.Operation && message.sequenceNumber > this.skipSequenceNumber) {\n\t\t\tconst change: IPropertyTreeMessage = this.decodeMessage(cloneDeep(message.contents));\n\t\t\tconst content: IRemotePropertyTreeMessage = { ...change, sequenceNumber: message.sequenceNumber };\n\t\t\tswitch (content.op) {\n\t\t\t\tcase OpKind.ChangeSet:\n\t\t\t\t\t// If the op originated locally from this client, we've already accounted for it\n\t\t\t\t\t// by advancing the state. Otherwise, advance the PRNG now.\n\t\t\t\t\tthis._applyRemoteChangeSet(cloneDeep(content));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate addRemoteChange(change: IPropertyTreeMessage) {\n\t\tthis.remoteChanges.push(change);\n\t\tthis.updateRemoteHeadGuid();\n\t}\n\n\tprivate updateRemoteHeadGuid() {\n\t\tthis.headCommitGuid = this.remoteChanges.length > 0\n\t\t\t\t? this.remoteChanges[this.remoteChanges.length - 1].guid\n\t\t\t\t: this.headCommitGuid;\n\t}\n\n\tpublic static prune(\n\t\tminimumSequenceNumber: number,\n\t\tremoteChanges: IPropertyTreeMessage[],\n\t\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>,\n\t) {\n\t\t// for faster lookup of remote change guids\n\t\tconst remoteChangeMap = new Map<string, number>();\n\t\tremoteChanges.forEach((change, index) => {\n\t\t\tremoteChangeMap.set(change.guid, index);\n\t\t});\n\n\t\t// we will track visited nodes\n\t\tconst visitedUnrebasedRemoteChanges = new Set<string>();\n\t\tconst visitedRemoteChanges = new Set<string>();\n\n\t\tfor (const id of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tconst unrebasedChange = unrebasedRemoteChanges[id];\n\n\t\t\t// we are only interested in changes that are newer than the sequence number\n\t\t\t// and that were not yet visited previously\n\t\t\tif (\n\t\t\t\tunrebasedChange.sequenceNumber >= minimumSequenceNumber &&\n\t\t\t\t!visitedUnrebasedRemoteChanges.has(unrebasedChange.guid)\n\t\t\t) {\n\t\t\t\t// we visited that unrebased change and mark it as visited\n\t\t\t\tvisitedUnrebasedRemoteChanges.add(unrebasedChange.guid);\n\n\t\t\t\tlet visitor = unrebasedChange;\n\t\t\t\t// we will walk along the commit chain until we hit a remote change or a visited unrebased commit\n\t\t\t\t// at that point we can skip since we already traced the rest of the commit chain\n\t\t\t\twhile (\n\t\t\t\t\tvisitor.remoteHeadGuid !== visitor.referenceGuid ||\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.has(visitor.referenceGuid)\n\t\t\t\t) {\n\t\t\t\t\tconst guid = visitor.referenceGuid;\n\t\t\t\t\tif (guid === \"\") {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// since the change is not in remote it must be in unrebased\n\t\t\t\t\tvisitor = unrebasedRemoteChanges[visitor.referenceGuid];\n\t\t\t\t\tif (!visitor) {\n\t\t\t\t\t\tthrow new Error(`no visitor found for guid \"${guid}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.add(visitor.guid);\n\t\t\t\t}\n\t\t\t\t// if we exited the loop because we hit a remote change than add it as visited\n\t\t\t\tif (visitor.remoteHeadGuid === visitor.referenceGuid && remoteChangeMap.has(visitor.referenceGuid)) {\n\t\t\t\t\tvisitedRemoteChanges.add(visitor.referenceGuid);\n\t\t\t\t}\n\n\t\t\t\t// If we have a change that refers to the start of the history (remoteHeadGuid === \"\"), we have to\n\t\t\t\t// keep all remote Changes until this change has been processed\n\t\t\t\tif (visitor.remoteHeadGuid === \"\") {\n\t\t\t\t\tvisitedRemoteChanges.add(remoteChanges[0].guid);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlet pruned = 0;\n\t\t// we can now filter the unrebased changes by removing any changes\n\t\t// we have not visited at all during our traversal\n\t\tconst prunedUnrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\t\tfor (const key of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tif (visitedUnrebasedRemoteChanges.has(key)) {\n\t\t\t\tprunedUnrebasedRemoteChanges[key] = unrebasedRemoteChanges[key];\n\t\t\t} else {\n\t\t\t\tpruned++;\n\t\t\t}\n\t\t}\n\n\t\t// find minimum index\n\t\tconst minIndex = Math.min(...[...visitedRemoteChanges].map((key) => remoteChangeMap.get(key) as number));\n\n\t\tconst prunedRemoteChanges = remoteChanges.slice(minIndex);\n\t\tpruned += minIndex;\n\n\t\treturn {\n\t\t\tremoteChanges: prunedRemoteChanges,\n\t\t\tunrebasedRemoteChanges: prunedUnrebasedRemoteChanges,\n\t\t\tprunedCount: pruned,\n\t\t};\n\t}\n\tpublic pruneHistory() {\n\t\tconst msn = this.runtime.deltaManager.minimumSequenceNumber;\n\n\t\tconst { remoteChanges, unrebasedRemoteChanges } = SharedPropertyTree.prune(\n\t\t\tmsn,\n\t\t\tthis.remoteChanges,\n\t\t\tthis.unrebasedRemoteChanges,\n\t\t);\n\n\t\tthis.remoteChanges = remoteChanges;\n\t\tthis.unrebasedRemoteChanges = unrebasedRemoteChanges;\n\t}\n\n\t/**\n\t * This method encodes the local summary (snapshot) object into the serialized form.\n\t * @param summary - The local summary (snapshot)representation.\n\t * @returns The serialized summary representation.\n\t */\n\tprivate encodeSummary(summary: ISnapshotSummary) {\n\t\treturn this.propertyTreeConfig.encDec.summaryEncoder.encode(summary);\n\t}\n\n\t/**\n\t * This method decodes the serialized form of the summary into the local summary (snapshot) object.\n\t * @param serializedSummary - The serialized summary representation.\n\t * @returns The local summary (snapshot)representation.\n \t */\n\tprivate decodeSummary(serializedSummary): ISnapshotSummary {\n\t\treturn this.propertyTreeConfig.encDec.summaryEncoder.decode(serializedSummary);\n\t}\n\n\t/**\n \t * This method writes the log message if the logging is enabled in the extended DDS.\n\t * The logging is not enabled in the default Property DDS\n\t * @param message - The message to be logged.\n\t */\n\tprotected logIfEnabled(message) {}\n\n\t/**\n \t * This method encodes the binary representation of the\n \t * blob.\n\t * @param blob - The binary representation of the blob.\n\t * @returns The encoded representation of the blob.\n \t */\n\tprivate encodeSummaryBlob(blob: ArrayBuffer): any {\n\t\treturn bufferToString(blob, \"base64\");\n\t}\n\n\t/**\n \t * This method decodes the encoded representation of the\n\t * blob.\n \t * @param blob - The encoded representation of the blob.\n\t * @returns The binary representation of the blob.\n\t */\n\tprivate decodeSummaryBlob(encoded: any): ArrayBuffer {\n\t\tconst buffer = bufferToString(encoded, \"utf8\");\n\t\treturn stringToBuffer(buffer, \"base64\");\n\t}\n\n\tpublic summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tthis.pruneHistory();\n\t\tconst snapshot: ISnapshot = {\n\t\t\tbranchGuid: this.handle.absolutePath.split(\"/\").pop() as string,\n\t\t\tsummaryMinimumSequenceNumber: this.runtime.deltaManager.minimumSequenceNumber,\n\t\t\tuseMH: this.useMH,\n\t\t\tnumChunks: 0,\n\t\t};\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tif (!this.useMH) {\n\t\t\t// If the MH is not used, we have to include the tip view, the remote changes and the received\n\t\t\t// deltas to the summary\n\t\t\tconst summary: ISnapshotSummary = {\n\t\t\t\tremoteTipView: this.remoteTipView,\n\t\t\t\tremoteChanges: this.remoteChanges,\n\t\t\t\tremoteHeadGuid: this.headCommitGuid,\n\t\t\t\tunrebasedRemoteChanges: this.unrebasedRemoteChanges,\n\t\t\t};\n\n\t\t\tconst chunkSize = 5000 * 1024; // Default limit seems to be 5MB\n\t\t\tlet totalBlobsSize = 0;\n\t\t\tconst serializedSummary = this.encodeSummary(summary);\n\t\t\tfor (let pos = 0, i = 0; pos < serializedSummary.length; pos += chunkSize, i++) {\n\t\t\t\tconst summaryBlob = this.encodeSummaryBlob(serializedSummary.slice(pos, pos + chunkSize));\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\t\ttotalBlobsSize += summaryBlob[\"length\"];\n\t\t\t\tbuilder.addBlob(`summaryChunk_${i}`, summaryBlob);\n\t\t\t\tsnapshot.numChunks++;\n\t\t\t}\n\t\t\tthis.logIfEnabled(`Total blobs transfer size: ${totalBlobsSize}`);\n\t\t}\n\n\t\tbuilder.addBlob(\"properties\", serializer !== undefined\n\t\t\t? serializer.stringify(snapshot, this.handle)\n\t\t\t: JSON.stringify(snapshot));\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst runtime = this.runtime;\n\t\tconst handleTableChunk = await storage.readBlob(\"properties\");\n\t\tconst utf8 = bufferToString(handleTableChunk, \"utf8\");\n\n\t\tconst snapshot: ISnapshot = this.serializer.parse(utf8);\n\t\tthis.useMH = snapshot.useMH;\n\n\t\ttry {\n\t\t\tif (!snapshot.useMH) {\n\t\t\t\t// We load all chunks\n\t\t\t\tconst chunks: ArrayBufferLike[] = await Promise.all(\n\t\t\t\t\trange(snapshot.numChunks).map(async (i) => {\n\t\t\t\t\t\treturn this.decodeSummaryBlob(await storage.readBlob(`summaryChunk_${i}`));\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst totalLength = chunks.reduce((a, b) => a + b.byteLength, 0);\n\t\t\t\tconst serializedSummary = new Uint8Array(totalLength);\n\t\t\t\tchunks.reduce((offset, chunk) => {\n\t\t\t\t\tserializedSummary.set(new Uint8Array(chunk), offset);\n\t\t\t\t\treturn offset + chunk.byteLength;\n\t\t\t\t}, 0);\n\t\t\t\tconst snapshotSummary = this.decodeSummary(serializedSummary);\n\t\t\t\tif (\n\t\t\t\t\tsnapshotSummary.remoteChanges === undefined ||\n\t\t\t\t\tsnapshotSummary.remoteTipView === undefined ||\n\t\t\t\t\tsnapshotSummary.unrebasedRemoteChanges === undefined\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\"Invalid Snapshot.\");\n\t\t\t\t}\n\n\t\t\t\tif (snapshotSummary.remoteHeadGuid === undefined) {\n\t\t\t\t\t// The summary does not contain a remoteHeadGuid. This means the summary has\n\t\t\t\t\t// been created by an old version of PropertyDDS, that did not yet have this patch.\n\t\t\t\t\tsnapshotSummary.remoteHeadGuid = (snapshotSummary.remoteChanges.length > 0) ?\n\t\t\t\t\t\t\t// If there are remote changes in the\n\t\t\t\t\t\t\t// summary we can deduce the head GUID from these changes.\n\t\t\t\t\t\t\tsnapshotSummary.remoteChanges[snapshotSummary.remoteChanges.length - 1].guid :\n\n\t\t\t\t\t\t\t// If no remote head GUID is available, we will fall back to the old behaviour,\n\t\t\t\t\t\t\t// where the head GUID was set to an empty string. However, this could lead to\n\t\t\t\t\t\t\t// divergence between the clients, if there is still a client in the session\n\t\t\t\t\t\t\t// that is using a version of this library without this patch and which\n\t\t\t\t\t\t\t// has started the session at a different summary.\n\t\t\t\t\t\t\t\"\";\n\t\t\t\t}\n\n\t\t\t\tthis.remoteTipView = snapshotSummary.remoteTipView;\n\t\t\t\tthis.remoteChanges = snapshotSummary.remoteChanges;\n\t\t\t\tthis.unrebasedRemoteChanges = snapshotSummary.unrebasedRemoteChanges;\n\t\t\t\tthis.headCommitGuid = snapshotSummary.remoteHeadGuid;\n\t\t\t\tconst isPartialCheckoutActive = !!(this.options.clientFiltering && this.options.paths);\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tthis.remoteTipView = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\tthis.remoteTipView,\n\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\n\t\t\t\tthis.skipSequenceNumber = 0;\n\t\t\t} else {\n\t\t\t\tconst { branchGuid, summaryMinimumSequenceNumber } = snapshot;\n\t\t\t\tconst branchResponse = await axios.get(`http://localhost:3000/branch/${branchGuid}`);\n\t\t\t\tthis.headCommitGuid = branchResponse.data.headCommitGuid;\n\t\t\t\tconst {\n\t\t\t\t\tcommit: { meta: commitMetadata },\n\t\t\t\t} = (await axios.get(`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}`)).data;\n\t\t\t\tlet { changeSet: materializedView } = (\n\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}/materializedView`,\n\t\t\t\t\t)\n\t\t\t\t).data;\n\n\t\t\t\tconst isPartialCheckoutActive = this.options.clientFiltering && this.options.paths;\n\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tmaterializedView = ChangeSetUtils.getFilteredChangeSetByPaths(materializedView, this.options.paths);\n\t\t\t\t}\n\n\t\t\t\tthis.tipView = materializedView;\n\t\t\t\tthis.remoteTipView = cloneDeep(this.tipView);\n\t\t\t\tthis.remoteChanges = [];\n\n\t\t\t\tlet missingDeltas: ISequencedDocumentMessage[] = [];\n\t\t\t\tconst firstDelta = Math.min(commitMetadata.minimumSequenceNumber, summaryMinimumSequenceNumber);\n\t\t\t\tconst lastDelta = commitMetadata.sequenceNumber;\n\n\t\t\t\tconst dm = (this.runtime.deltaManager as any).deltaManager;\n\t\t\t\tawait dm.getDeltas(\"DocumentOpen\", firstDelta, lastDelta, (messages: ISequencedDocumentMessage[]) => {\n\t\t\t\t\tmissingDeltas = messages.filter((x) => x.type === \"op\");\n\t\t\t\t});\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\t\t\tfor (let i = 0; i < missingDeltas.length; i++) {\n\t\t\t\t\tif (missingDeltas[i].sequenceNumber < commitMetadata.sequenceNumber) {\n\t\t\t\t\t\tconst remoteChange: IPropertyTreeMessage\n\t\t\t\t\t\t\t= JSON.parse(missingDeltas[i].contents).contents.contents.content.contents;\n\t\t\t\t\t\tconst { changeSet } = (\n\t\t\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${remoteChange.guid}/changeSet`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t).data;\n\t\t\t\t\t\tremoteChange.changeSet = changeSet;\n\n\t\t\t\t\t\tif (remoteChange) {\n\t\t\t\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\t\t\t\tremoteChange.changeSet = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\t\t\t\tremoteChange.changeSet,\n\t\t\t\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.addRemoteChange(remoteChange);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.processCore(missingDeltas[i], false, {});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.skipSequenceNumber = lastDelta ?? -1;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.tipView = {};\n\t\t\tthis.remoteTipView = {};\n\t\t\tthis.remoteChanges = [];\n\t\t} finally {\n\t\t\tthis._root.deserialize(this.tipView, undefined, false, false);\n\t\t\tconst _changeSet = new ChangeSet(this.tipView);\n\t\t\tif (!isEmpty(_changeSet.getSerializedChangeSet())) {\n\t\t\t\tthis.emit(\"localModification\", _changeSet);\n\t\t\t}\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\tprotected onDisconnect() { }\n\n\tprivate _applyLocalChangeSet(change: IPropertyTreeMessage) {\n\t\tconst changeSetWrapper = new ChangeSet(this.tipView);\n\t\tchangeSetWrapper.applyChangeSet(change.changeSet);\n\n\t\tif (this.runtime.attachState === AttachState.Detached) {\n\t\t\tconst remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);\n\t\t\tremoteChangeSetWrapper.applyChangeSet(change.changeSet);\n\t\t} else {\n\t\t\tthis.localChanges.push(change);\n\t\t}\n\t}\n\n\tprivate _applyRemoteChangeSet(change: IRemotePropertyTreeMessage) {\n\t\tthis.unrebasedRemoteChanges[change.guid] = cloneDeep(change);\n\n\t\t// This is the first message in the history of the document.\n\t\tif (this.remoteChanges.length !== 0) {\n\t\t\trebaseToRemoteChanges(\n\t\t\t\tchange,\n\t\t\t\tthis.getUnrebasedChange.bind(this),\n\t\t\t\tthis.getRebasedChanges.bind(this),\n\t\t\t);\n\t\t}\n\n\t\tthis.addRemoteChange(change);\n\t\t// Apply the remote change set to the remote tip view\n\t\tconst remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);\n\t\tremoteChangeSetWrapper.applyChangeSet(change.changeSet);\n\n\t\t// Rebase the local changes\n\t\tconst pendingChanges = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\tnew ChangeSet(pendingChanges)._toReversibleChangeSet(this.tipView);\n\n\t\tconst changesToTip: SerializedChangeSet = {};\n\t\tconst changesNeeded = this.rebaseLocalChanges(change, pendingChanges, changesToTip);\n\n\t\tif (changesNeeded) {\n\t\t\tthis.pushNotificationDelayScope();\n\t\t\t// Checkout the new tip\n\t\t\tthis._root.applyChangeSet(changesToTip);\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\t\tthis._root.applyChangeSet(pendingChanges);\n\t\t\tthis.popNotificationDelayScope();\n\t\t}\n\n\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t// assert(JSON.stringify(this.root.serialize()) === JSON.stringify(this.tipView));\n\t}\n\n\tgetUnrebasedChange(guid: string) {\n\t\treturn this.unrebasedRemoteChanges[guid];\n\t}\n\n\tgetRebasedChanges(startGuid: string, endGuid?: string) {\n\t\tconst startIndex = findIndex(this.remoteChanges, (c) => c.guid === startGuid);\n\t\tif (endGuid !== undefined) {\n\t\t\tconst endIndex = findIndex(this.remoteChanges, (c) => c.guid === endGuid);\n\t\t\treturn this.remoteChanges.slice(startIndex + 1, endIndex + 1);\n\t\t}\n\t\treturn this.remoteChanges.slice(startIndex + 1);\n\t}\n\n\tprivate rebaseLocalChanges(\n\t\tchange: IPropertyTreeMessage,\n\t\tpendingChanges: SerializedChangeSet,\n\t\tnewTipDelta: SerializedChangeSet,\n\t): boolean {\n\t\tlet rebaseBaseChangeSet = cloneDeep(change.changeSet);\n\n\t\tconst accumulatedChanges: SerializedChangeSet = {};\n\t\tconst conflicts = [] as any[];\n\n\t\tif (this.localChanges.length > 0 && this.localChanges[0].guid === change.guid) {\n\t\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t\t// assert(JSON.stringify(this.localChanges[0].changeSet) === JSON.stringify(change.changeSet),\n\t\t\t// \"Local change different than rebased remote change.\");\n\n\t\t\t// If we got a confirmation of the commit on the tip of the localChanges array,\n\t\t\t// there will be no update of the tip view at all. We just move it from local changes\n\t\t\t// to remote changes\n\t\t\tthis.localChanges.shift();\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\tfor (let i = 0; i < this.localChanges.length; i++) {\n\t\t\t// Make sure we never receive changes out of order\n\t\t\tconsole.assert(this.localChanges[i].guid !== change.guid);\n\n\t\t\tconst rebaseMetaInformation = new Map();\n\n\t\t\tconst copiedChangeSet = new ChangeSet(cloneDeep(this.localChanges[i].changeSet));\n\t\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(this.localChanges[i].changeSet, conflicts, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\n\t\t\tcopiedChangeSet.toInverseChangeSet();\n\t\t\tcopiedChangeSet.applyChangeSet(rebaseBaseChangeSet);\n\t\t\tcopiedChangeSet.applyChangeSet(this.localChanges[i].changeSet, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\t\t\trebaseBaseChangeSet = copiedChangeSet.getSerializedChangeSet();\n\n\t\t\tnew ChangeSet(accumulatedChanges).applyChangeSet(this.localChanges[i].changeSet);\n\t\t}\n\n\t\t// Compute the inverse of the pending changes and store the result in newTipDelta\n\t\tconst pendingChangesRebaseMetaInformation = new Map();\n\t\tconst deltaToTipCS = new ChangeSet(newTipDelta);\n\t\tdeltaToTipCS.applyChangeSet(pendingChanges);\n\t\tdeltaToTipCS.toInverseChangeSet();\n\n\t\t// Perform a rebase of the pending changes\n\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(pendingChanges, conflicts, {\n\t\t\tapplyAfterMetaInformation: pendingChangesRebaseMetaInformation,\n\t\t});\n\n\t\t// Compute the delta between the old tip (including pending changes)\n\t\t// and the new tip (not including the rebased pending changes)\n\t\tdeltaToTipCS.applyChangeSet(rebaseBaseChangeSet);\n\n\t\t// Update the tip view\n\t\tif (!this.tipView) {\n\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\t\t\tconst changeSet = new ChangeSet(this.tipView);\n\t\t\tchangeSet.applyChangeSet(accumulatedChanges);\n\t\t} else {\n\t\t\tnew ChangeSet(this.tipView).applyChangeSet(newTipDelta);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprotected applyStashedOp() {\n\t\tthrow new Error(\"not implemented\");\n\t}\n}\n"]}
|
package/lib/propertyTree.d.ts
CHANGED
|
@@ -31,6 +31,7 @@ export interface ISnapshotSummary {
|
|
|
31
31
|
remoteTipView?: SerializedChangeSet;
|
|
32
32
|
remoteChanges?: IPropertyTreeMessage[];
|
|
33
33
|
unrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;
|
|
34
|
+
remoteHeadGuid: string;
|
|
34
35
|
}
|
|
35
36
|
export interface SharedPropertyTreeOptions {
|
|
36
37
|
paths?: string[];
|
|
@@ -133,6 +134,8 @@ export declare class SharedPropertyTree extends SharedObject {
|
|
|
133
134
|
* For messages from a remote client, this will be undefined.
|
|
134
135
|
*/
|
|
135
136
|
protected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown): void;
|
|
137
|
+
private addRemoteChange;
|
|
138
|
+
private updateRemoteHeadGuid;
|
|
136
139
|
static prune(minimumSequenceNumber: number, remoteChanges: IPropertyTreeMessage[], unrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>): {
|
|
137
140
|
remoteChanges: IPropertyTreeMessage[];
|
|
138
141
|
unrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propertyTree.d.ts","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAUH,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AASpF,OAAO,EAAiC,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAMtG,oBAAY,mBAAmB,GAAG,GAAG,CAAC;AAEtC,oBAAY,QAAQ,GAAG,GAAG,CAAC;AAK3B,0BAAkB,MAAM;IAEvB,SAAS,IAAI;CACb;AAED,MAAM,WAAW,oBAAoB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,mBAAmB,CAAC;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,qBAAqB,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,0BAA2B,SAAQ,oBAAoB;IACvE,cAAc,EAAE,MAAM,CAAC;CACvB;AAOD,MAAM,WAAW,gBAAgB;IAChC,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,aAAa,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACvC,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"propertyTree.d.ts","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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"}
|
package/lib/propertyTree.js
CHANGED
|
@@ -155,16 +155,16 @@ export class SharedPropertyTree extends SharedObject {
|
|
|
155
155
|
applyChangeSet(changeSet, metadata) {
|
|
156
156
|
const _changeSet = new ChangeSet(changeSet);
|
|
157
157
|
_changeSet._toReversibleChangeSet(this.tipView);
|
|
158
|
-
|
|
159
|
-
? this.remoteChanges[this.remoteChanges.length - 1].guid
|
|
160
|
-
: this.headCommitGuid;
|
|
158
|
+
this.updateRemoteHeadGuid();
|
|
161
159
|
const change = {
|
|
162
160
|
op: 0 /* ChangeSet */,
|
|
163
161
|
changeSet,
|
|
164
162
|
metadata,
|
|
165
163
|
guid: uuidv4(),
|
|
166
|
-
remoteHeadGuid,
|
|
167
|
-
referenceGuid: this.localChanges.length > 0
|
|
164
|
+
remoteHeadGuid: this.headCommitGuid,
|
|
165
|
+
referenceGuid: this.localChanges.length > 0
|
|
166
|
+
? this.localChanges[this.localChanges.length - 1].guid
|
|
167
|
+
: this.headCommitGuid,
|
|
168
168
|
localBranchStart: this.localChanges.length > 0 ? this.localChanges[0].guid : undefined,
|
|
169
169
|
useMH: this.useMH,
|
|
170
170
|
};
|
|
@@ -233,6 +233,15 @@ export class SharedPropertyTree extends SharedObject {
|
|
|
233
233
|
}
|
|
234
234
|
}
|
|
235
235
|
}
|
|
236
|
+
addRemoteChange(change) {
|
|
237
|
+
this.remoteChanges.push(change);
|
|
238
|
+
this.updateRemoteHeadGuid();
|
|
239
|
+
}
|
|
240
|
+
updateRemoteHeadGuid() {
|
|
241
|
+
this.headCommitGuid = this.remoteChanges.length > 0
|
|
242
|
+
? this.remoteChanges[this.remoteChanges.length - 1].guid
|
|
243
|
+
: this.headCommitGuid;
|
|
244
|
+
}
|
|
236
245
|
static prune(minimumSequenceNumber, remoteChanges, unrebasedRemoteChanges) {
|
|
237
246
|
// for faster lookup of remote change guids
|
|
238
247
|
const remoteChangeMap = new Map();
|
|
@@ -361,6 +370,7 @@ export class SharedPropertyTree extends SharedObject {
|
|
|
361
370
|
const summary = {
|
|
362
371
|
remoteTipView: this.remoteTipView,
|
|
363
372
|
remoteChanges: this.remoteChanges,
|
|
373
|
+
remoteHeadGuid: this.headCommitGuid,
|
|
364
374
|
unrebasedRemoteChanges: this.unrebasedRemoteChanges,
|
|
365
375
|
};
|
|
366
376
|
const chunkSize = 5000 * 1024; // Default limit seems to be 5MB
|
|
@@ -404,9 +414,24 @@ export class SharedPropertyTree extends SharedObject {
|
|
|
404
414
|
snapshotSummary.unrebasedRemoteChanges === undefined) {
|
|
405
415
|
throw new Error("Invalid Snapshot.");
|
|
406
416
|
}
|
|
417
|
+
if (snapshotSummary.remoteHeadGuid === undefined) {
|
|
418
|
+
// The summary does not contain a remoteHeadGuid. This means the summary has
|
|
419
|
+
// been created by an old version of PropertyDDS, that did not yet have this patch.
|
|
420
|
+
snapshotSummary.remoteHeadGuid = (snapshotSummary.remoteChanges.length > 0) ?
|
|
421
|
+
// If there are remote changes in the
|
|
422
|
+
// summary we can deduce the head GUID from these changes.
|
|
423
|
+
snapshotSummary.remoteChanges[snapshotSummary.remoteChanges.length - 1].guid :
|
|
424
|
+
// If no remote head GUID is available, we will fall back to the old behaviour,
|
|
425
|
+
// where the head GUID was set to an empty string. However, this could lead to
|
|
426
|
+
// divergence between the clients, if there is still a client in the session
|
|
427
|
+
// that is using a version of this library without this patch and which
|
|
428
|
+
// has started the session at a different summary.
|
|
429
|
+
"";
|
|
430
|
+
}
|
|
407
431
|
this.remoteTipView = snapshotSummary.remoteTipView;
|
|
408
432
|
this.remoteChanges = snapshotSummary.remoteChanges;
|
|
409
433
|
this.unrebasedRemoteChanges = snapshotSummary.unrebasedRemoteChanges;
|
|
434
|
+
this.headCommitGuid = snapshotSummary.remoteHeadGuid;
|
|
410
435
|
const isPartialCheckoutActive = !!(this.options.clientFiltering && this.options.paths);
|
|
411
436
|
if (isPartialCheckoutActive && this.options.paths) {
|
|
412
437
|
this.remoteTipView = ChangeSetUtils.getFilteredChangeSetByPaths(this.remoteTipView, this.options.paths);
|
|
@@ -444,7 +469,7 @@ export class SharedPropertyTree extends SharedObject {
|
|
|
444
469
|
if (isPartialCheckoutActive && this.options.paths) {
|
|
445
470
|
remoteChange.changeSet = ChangeSetUtils.getFilteredChangeSetByPaths(remoteChange.changeSet, this.options.paths);
|
|
446
471
|
}
|
|
447
|
-
this.
|
|
472
|
+
this.addRemoteChange(remoteChange);
|
|
448
473
|
}
|
|
449
474
|
}
|
|
450
475
|
else {
|
|
@@ -486,7 +511,7 @@ export class SharedPropertyTree extends SharedObject {
|
|
|
486
511
|
if (this.remoteChanges.length !== 0) {
|
|
487
512
|
rebaseToRemoteChanges(change, this.getUnrebasedChange.bind(this), this.getRebasedChanges.bind(this));
|
|
488
513
|
}
|
|
489
|
-
this.
|
|
514
|
+
this.addRemoteChange(change);
|
|
490
515
|
// Apply the remote change set to the remote tip view
|
|
491
516
|
const remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);
|
|
492
517
|
remoteChangeSetWrapper.applyChangeSet(change.changeSet);
|
package/lib/propertyTree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propertyTree.js","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable import/no-internal-modules */\nimport isEmpty from \"lodash/isEmpty\";\nimport findIndex from \"lodash/findIndex\";\nimport range from \"lodash/range\";\nimport { copy as cloneDeep } from \"fastest-json-copy\";\nimport { Packr } from \"msgpackr\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\n\nimport { bufferToString, stringToBuffer } from \"@fluidframework/common-utils\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\n\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\n\nimport { PropertyFactory, BaseProperty, NodeProperty } from \"@fluid-experimental/property-properties\";\n\nimport { v4 as uuidv4 } from \"uuid\";\nimport axios from \"axios\";\nimport { PropertyTreeFactory } from \"./propertyTreeFactory\";\n\nexport type SerializedChangeSet = any;\n\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\nexport interface IPropertyTreeMessage {\n\top: OpKind;\n\tchangeSet: SerializedChangeSet;\n\tmetadata: Metadata;\n\tguid: string;\n\treferenceGuid: string;\n\tremoteHeadGuid: string;\n\tlocalBranchStart: string | undefined;\n\trebaseMetaInformation?: Map<any, any>;\n\tuseMH?: boolean;\n}\n\nexport interface IRemotePropertyTreeMessage extends IPropertyTreeMessage {\n\tsequenceNumber: number;\n}\ninterface ISnapshot {\n\tbranchGuid: string;\n\tsummaryMinimumSequenceNumber: number;\n\tuseMH: boolean;\n\tnumChunks: number;\n}\nexport interface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n}\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"]}
|
|
1
|
+
{"version":3,"file":"propertyTree.js","sourceRoot":"","sources":["../src/propertyTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable import/no-internal-modules */\nimport isEmpty from \"lodash/isEmpty\";\nimport findIndex from \"lodash/findIndex\";\nimport range from \"lodash/range\";\nimport { copy as cloneDeep } from \"fastest-json-copy\";\nimport { Packr } from \"msgpackr\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\n\nimport { bufferToString, stringToBuffer } from \"@fluidframework/common-utils\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\n\nimport {\n\tChangeSet,\n\tUtils as ChangeSetUtils,\n\trebaseToRemoteChanges,\n} from \"@fluid-experimental/property-changeset\";\n\nimport { PropertyFactory, BaseProperty, NodeProperty } from \"@fluid-experimental/property-properties\";\n\nimport { v4 as uuidv4 } from \"uuid\";\nimport axios from \"axios\";\nimport { PropertyTreeFactory } from \"./propertyTreeFactory\";\n\nexport type SerializedChangeSet = any;\n\nexport type Metadata = any;\n\ntype FetchUnrebasedChangeFn = (guid: string) => IRemotePropertyTreeMessage;\ntype FetchRebasedChangesFn = (startGuid: string, endGuid?: string) => IPropertyTreeMessage[];\n\nexport const enum OpKind {\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tChangeSet = 0,\n}\n\nexport interface IPropertyTreeMessage {\n\top: OpKind;\n\tchangeSet: SerializedChangeSet;\n\tmetadata: Metadata;\n\tguid: string;\n\treferenceGuid: string;\n\tremoteHeadGuid: string;\n\tlocalBranchStart: string | undefined;\n\trebaseMetaInformation?: Map<any, any>;\n\tuseMH?: boolean;\n}\n\nexport interface IRemotePropertyTreeMessage extends IPropertyTreeMessage {\n\tsequenceNumber: number;\n}\ninterface ISnapshot {\n\tbranchGuid: string;\n\tsummaryMinimumSequenceNumber: number;\n\tuseMH: boolean;\n\tnumChunks: number;\n}\nexport interface ISnapshotSummary {\n\tremoteTipView?: SerializedChangeSet;\n\tremoteChanges?: IPropertyTreeMessage[];\n\tunrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;\n\tremoteHeadGuid: string;\n}\n\nexport interface SharedPropertyTreeOptions {\n\tpaths?: string[];\n\tclientFiltering?: boolean;\n\tuseMH?: boolean;\n}\n\nexport interface ISharedPropertyTreeEncDec {\n\tmessageEncoder: { encode: (IPropertyTreeMessage) => IPropertyTreeMessage;\n\t\tdecode: (IPropertyTreeMessage) => IPropertyTreeMessage; };\n\tsummaryEncoder: { encode: (ISnapshotSummary) => Buffer; decode: (Buffer) => ISnapshotSummary; };\n}\n\nexport interface IPropertyTreeConfig {\n\tencDec: ISharedPropertyTreeEncDec;\n}\n\nconst defaultEncDec: ISharedPropertyTreeEncDec = {\n\tmessageEncoder: { encode: (msg: IPropertyTreeMessage) => msg,\n\t\tdecode: (msg: IPropertyTreeMessage) => msg },\n\tsummaryEncoder: {\n\t\tencode: (summary: ISnapshotSummary) => {\n\t\t\tconst packr = new Packr();\n\t\t\tconst serializedSummary = packr.pack(summary);\n\t\t\treturn serializedSummary;\n\t\t},\n\t\tdecode: (serializedSummary) => {\n\t\t\tconst packr = new Packr();\n\t\t\tconst snapshotSummary = packr.unpack(serializedSummary);\n\t\t\treturn snapshotSummary as ISnapshotSummary;\n\t\t},\n\t},\n};\n\n/**\n * Silly DDS example that models a six sided die.\n *\n * Unlike the typical 'Dice Roller' example where clients clobber each other's last roll in a\n * SharedMap, this 'SharedDie' DDS works by advancing an internal PRNG each time it sees a 'roll'\n * operation.\n *\n * Because all clients are using the same PRNG starting in the same state, they arrive at\n * consensus by simply applying the same number of rolls. (A fun addition would be logging\n * who received which roll, which would need to change as clients learn how races are resolved\n * in the total order)\n */\nexport class SharedPropertyTree extends SharedObject {\n\ttipView: SerializedChangeSet = {};\n\tremoteTipView: SerializedChangeSet = {};\n\tlocalChanges: IPropertyTreeMessage[] = [];\n\tremoteChanges: IPropertyTreeMessage[] = [];\n\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\ttransmissionsHaveBeenStopped = false;\n\tenqueuedMessages: IPropertyTreeMessage[] = [];\n\tnotificationDelayScope: number = 0;\n\t_root: any = PropertyFactory.create(\"NodeProperty\");\n\toptions: SharedPropertyTreeOptions;\n\tskipSequenceNumber: number = -1;\n\theadCommitGuid: string = \"\";\n\tuseMH: boolean = false;\n\tpropertyTreeConfig: IPropertyTreeConfig;\n\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\toptions: SharedPropertyTreeOptions,\n\t\tpropertyTreeConfig: IPropertyTreeConfig = { encDec: defaultEncDec },\n\t) {\n\t\tsuper(id, runtime, attributes, \"fluid_propertyTree_\");\n\n\t\tthis.options = options;\n\t\t// Quick hack to let the root be aware of the DDS hosting it.\n\t\tthis._root._tree = this;\n\n\t\t// By default, we currently don't use the MH\n\t\tthis.useMH = options.useMH ?? false;\n\t\tthis.propertyTreeConfig = propertyTreeConfig;\n\t}\n\n\t/**\n\t * Create a new shared cell\n\t *\n\t * @param runtime - data store runtime the new shared map belongs to\n\t * @param id - optional name of the shared map\n\t * @returns newly create shared map (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string, queryString?: string) {\n\t\treturn runtime.createChannel(id, PropertyTreeFactory.Type) as SharedPropertyTree;\n\t}\n\n\t/**\n\t * Get a factory for SharedDie to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedDie\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new PropertyTreeFactory();\n\t}\n\n\t/**\n\t * in case of partial checkout we want to send the paths we are interested in once we are connected\n\t */\n\tprotected onConnect() {\n\t\t// on connect we scope all deltas such that we only get relevant changes\n\t\t// since we know the paths already at constuction time this is okay\n\t\tthis.scopeFutureDeltasToPaths(this.options.paths);\n\t}\n\n\tprivate scopeFutureDeltasToPaths(paths?: string[]) {\n\t\tconst socket = (this.runtime.deltaManager as any).deltaManager.connectionManager.connection.socket;\n\t\tsocket.emit(\"partial_checkout\", { paths });\n\t}\n\n\tpublic _reportDirtinessToView() {\n\t\t// Check whether anybody is listening. If not, we don't want to pay the price\n\t\t// for the serialization of the data structure\n\t\tif (this.listenerCount(\"localModification\") > 0) {\n\t\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t\tconst _changeSet = new ChangeSet(changes);\n\t\t\tif (!isEmpty(_changeSet.getSerializedChangeSet())) {\n\t\t\t\tthis.emit(\"localModification\", _changeSet);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);\n\t\t}\n\t}\n\n\tpublic get changeSet(): SerializedChangeSet {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\treturn this.tipView;\n\t}\n\n\tpublic get activeCommit(): IPropertyTreeMessage {\n\t\treturn this.localChanges.length > 0\n\t\t\t? this.localChanges[this.localChanges.length - 1]\n\t\t\t: this.remoteChanges[this.remoteChanges.length - 1];\n\t}\n\tpublic get root(): NodeProperty {\n\t\treturn this._root as NodeProperty;\n\t}\n\n\tpublic commit(metadata?: Metadata, submitEmptyChange?: boolean) {\n\t\tconst changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\n\t\tlet doSubmit = !!submitEmptyChange;\n\n\t\t// if no override provided dont submit unless metadata are provided\n\t\tif (submitEmptyChange === undefined) {\n\t\t\tdoSubmit = metadata !== undefined;\n\t\t}\n\n\t\tif (doSubmit || !isEmpty(changes)) {\n\t\t\tthis.applyChangeSet(changes, metadata || {});\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\t/**\n\t * This method encodes the given message to the transfer form\n\t * @param change - The message to be encoded.\n \t */\n\tprivate encodeMessage(change: IPropertyTreeMessage): IPropertyTreeMessage {\n\t\treturn this.propertyTreeConfig.encDec.messageEncoder.encode(change);\n\t}\n\n\t/**\n \t * This method decodes message from the transfer form.\n\t * @param transferChange - The message to be decoded.\n\t \t */\n\tprivate decodeMessage(transferChange: IPropertyTreeMessage): IPropertyTreeMessage {\n\t\treturn this.propertyTreeConfig.encDec.messageEncoder.decode(transferChange);\n\t}\n\n\tprivate applyChangeSet(changeSet: SerializedChangeSet, metadata: Metadata) {\n\t\tconst _changeSet = new ChangeSet(changeSet);\n\t\t_changeSet._toReversibleChangeSet(this.tipView);\n\n\t\tthis.updateRemoteHeadGuid();\n\n\t\tconst change = {\n\t\t\top: OpKind.ChangeSet,\n\t\t\tchangeSet,\n\t\t\tmetadata,\n\t\t\tguid: uuidv4(),\n\t\t\tremoteHeadGuid: this.headCommitGuid,\n\t\t\treferenceGuid:\n\t\t\t\tthis.localChanges.length > 0\n\t\t\t\t? this.localChanges[this.localChanges.length - 1].guid\n\t\t\t\t: this.headCommitGuid,\n\t\t\tlocalBranchStart: this.localChanges.length > 0 ? this.localChanges[0].guid : undefined,\n\t\t\tuseMH: this.useMH,\n\t\t};\n\t\tthis._applyLocalChangeSet(change);\n\t\t// Queue the op for transmission to the Fluid service.\n\t\tconst transferChange = this.encodeMessage(cloneDeep(change));\n\t\tif (this.transmissionsHaveBeenStopped) {\n\t\t\tthis.enqueuedMessages.push(transferChange);\n\t\t} else {\n\t\t\tthis.submitLocalMessage(transferChange);\n\t\t}\n\t}\n\n\tstopTransmission(stop: boolean) {\n\t\tthis.transmissionsHaveBeenStopped = stop;\n\t\tif (stop === false) {\n\t\t\tfor (const message of this.enqueuedMessages) {\n\t\t\t\tthis.submitLocalMessage(message);\n\t\t\t}\n\t\t\tthis.enqueuedMessages = [];\n\t\t}\n\t}\n\t/**\n\t * Delays notifications until popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic pushNotificationDelayScope() {\n\t\t// set the scope counter\n\t\tthis.notificationDelayScope++;\n\n\t\t// If we reach 0, we have to report unreported changes\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tthis._root._reportDirtinessToView();\n\t\t}\n\t}\n\n\t/**\n\t * Re-enables notifications when popNotificationDelayScope has been called the same number of times as\n\t * pushNotificationDelayScope.\n\t */\n\tpublic popNotificationDelayScope() {\n\t\tif (this.notificationDelayScope === 0) {\n\t\t\tconsole.error(\"Unbalanced push/pop calls.\");\n\t\t}\n\t\tthis.notificationDelayScope--;\n\t\tthis._root._reportDirtinessToView();\n\t}\n\n\t/**\n\t * Process an operation\n\t *\n\t * @param message - the message to prepare\n\t * @param local - whether the message was sent by the local client\n\t * @param localOpMetadata - For local client messages, this is the metadata that was submitted with the message.\n\t * For messages from a remote client, this will be undefined.\n\t */\n\tprotected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\tif (message.type === MessageType.Operation && message.sequenceNumber > this.skipSequenceNumber) {\n\t\t\tconst change: IPropertyTreeMessage = this.decodeMessage(cloneDeep(message.contents));\n\t\t\tconst content: IRemotePropertyTreeMessage = { ...change, sequenceNumber: message.sequenceNumber };\n\t\t\tswitch (content.op) {\n\t\t\t\tcase OpKind.ChangeSet:\n\t\t\t\t\t// If the op originated locally from this client, we've already accounted for it\n\t\t\t\t\t// by advancing the state. Otherwise, advance the PRNG now.\n\t\t\t\t\tthis._applyRemoteChangeSet(cloneDeep(content));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate addRemoteChange(change: IPropertyTreeMessage) {\n\t\tthis.remoteChanges.push(change);\n\t\tthis.updateRemoteHeadGuid();\n\t}\n\n\tprivate updateRemoteHeadGuid() {\n\t\tthis.headCommitGuid = this.remoteChanges.length > 0\n\t\t\t\t? this.remoteChanges[this.remoteChanges.length - 1].guid\n\t\t\t\t: this.headCommitGuid;\n\t}\n\n\tpublic static prune(\n\t\tminimumSequenceNumber: number,\n\t\tremoteChanges: IPropertyTreeMessage[],\n\t\tunrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage>,\n\t) {\n\t\t// for faster lookup of remote change guids\n\t\tconst remoteChangeMap = new Map<string, number>();\n\t\tremoteChanges.forEach((change, index) => {\n\t\t\tremoteChangeMap.set(change.guid, index);\n\t\t});\n\n\t\t// we will track visited nodes\n\t\tconst visitedUnrebasedRemoteChanges = new Set<string>();\n\t\tconst visitedRemoteChanges = new Set<string>();\n\n\t\tfor (const id of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tconst unrebasedChange = unrebasedRemoteChanges[id];\n\n\t\t\t// we are only interested in changes that are newer than the sequence number\n\t\t\t// and that were not yet visited previously\n\t\t\tif (\n\t\t\t\tunrebasedChange.sequenceNumber >= minimumSequenceNumber &&\n\t\t\t\t!visitedUnrebasedRemoteChanges.has(unrebasedChange.guid)\n\t\t\t) {\n\t\t\t\t// we visited that unrebased change and mark it as visited\n\t\t\t\tvisitedUnrebasedRemoteChanges.add(unrebasedChange.guid);\n\n\t\t\t\tlet visitor = unrebasedChange;\n\t\t\t\t// we will walk along the commit chain until we hit a remote change or a visited unrebased commit\n\t\t\t\t// at that point we can skip since we already traced the rest of the commit chain\n\t\t\t\twhile (\n\t\t\t\t\tvisitor.remoteHeadGuid !== visitor.referenceGuid ||\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.has(visitor.referenceGuid)\n\t\t\t\t) {\n\t\t\t\t\tconst guid = visitor.referenceGuid;\n\t\t\t\t\tif (guid === \"\") {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// since the change is not in remote it must be in unrebased\n\t\t\t\t\tvisitor = unrebasedRemoteChanges[visitor.referenceGuid];\n\t\t\t\t\tif (!visitor) {\n\t\t\t\t\t\tthrow new Error(`no visitor found for guid \"${guid}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tvisitedUnrebasedRemoteChanges.add(visitor.guid);\n\t\t\t\t}\n\t\t\t\t// if we exited the loop because we hit a remote change than add it as visited\n\t\t\t\tif (visitor.remoteHeadGuid === visitor.referenceGuid && remoteChangeMap.has(visitor.referenceGuid)) {\n\t\t\t\t\tvisitedRemoteChanges.add(visitor.referenceGuid);\n\t\t\t\t}\n\n\t\t\t\t// If we have a change that refers to the start of the history (remoteHeadGuid === \"\"), we have to\n\t\t\t\t// keep all remote Changes until this change has been processed\n\t\t\t\tif (visitor.remoteHeadGuid === \"\") {\n\t\t\t\t\tvisitedRemoteChanges.add(remoteChanges[0].guid);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlet pruned = 0;\n\t\t// we can now filter the unrebased changes by removing any changes\n\t\t// we have not visited at all during our traversal\n\t\tconst prunedUnrebasedRemoteChanges: Record<string, IRemotePropertyTreeMessage> = {};\n\t\tfor (const key of Object.keys(unrebasedRemoteChanges)) {\n\t\t\tif (visitedUnrebasedRemoteChanges.has(key)) {\n\t\t\t\tprunedUnrebasedRemoteChanges[key] = unrebasedRemoteChanges[key];\n\t\t\t} else {\n\t\t\t\tpruned++;\n\t\t\t}\n\t\t}\n\n\t\t// find minimum index\n\t\tconst minIndex = Math.min(...[...visitedRemoteChanges].map((key) => remoteChangeMap.get(key) as number));\n\n\t\tconst prunedRemoteChanges = remoteChanges.slice(minIndex);\n\t\tpruned += minIndex;\n\n\t\treturn {\n\t\t\tremoteChanges: prunedRemoteChanges,\n\t\t\tunrebasedRemoteChanges: prunedUnrebasedRemoteChanges,\n\t\t\tprunedCount: pruned,\n\t\t};\n\t}\n\tpublic pruneHistory() {\n\t\tconst msn = this.runtime.deltaManager.minimumSequenceNumber;\n\n\t\tconst { remoteChanges, unrebasedRemoteChanges } = SharedPropertyTree.prune(\n\t\t\tmsn,\n\t\t\tthis.remoteChanges,\n\t\t\tthis.unrebasedRemoteChanges,\n\t\t);\n\n\t\tthis.remoteChanges = remoteChanges;\n\t\tthis.unrebasedRemoteChanges = unrebasedRemoteChanges;\n\t}\n\n\t/**\n\t * This method encodes the local summary (snapshot) object into the serialized form.\n\t * @param summary - The local summary (snapshot)representation.\n\t * @returns The serialized summary representation.\n\t */\n\tprivate encodeSummary(summary: ISnapshotSummary) {\n\t\treturn this.propertyTreeConfig.encDec.summaryEncoder.encode(summary);\n\t}\n\n\t/**\n\t * This method decodes the serialized form of the summary into the local summary (snapshot) object.\n\t * @param serializedSummary - The serialized summary representation.\n\t * @returns The local summary (snapshot)representation.\n \t */\n\tprivate decodeSummary(serializedSummary): ISnapshotSummary {\n\t\treturn this.propertyTreeConfig.encDec.summaryEncoder.decode(serializedSummary);\n\t}\n\n\t/**\n \t * This method writes the log message if the logging is enabled in the extended DDS.\n\t * The logging is not enabled in the default Property DDS\n\t * @param message - The message to be logged.\n\t */\n\tprotected logIfEnabled(message) {}\n\n\t/**\n \t * This method encodes the binary representation of the\n \t * blob.\n\t * @param blob - The binary representation of the blob.\n\t * @returns The encoded representation of the blob.\n \t */\n\tprivate encodeSummaryBlob(blob: ArrayBuffer): any {\n\t\treturn bufferToString(blob, \"base64\");\n\t}\n\n\t/**\n \t * This method decodes the encoded representation of the\n\t * blob.\n \t * @param blob - The encoded representation of the blob.\n\t * @returns The binary representation of the blob.\n\t */\n\tprivate decodeSummaryBlob(encoded: any): ArrayBuffer {\n\t\tconst buffer = bufferToString(encoded, \"utf8\");\n\t\treturn stringToBuffer(buffer, \"base64\");\n\t}\n\n\tpublic summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tthis.pruneHistory();\n\t\tconst snapshot: ISnapshot = {\n\t\t\tbranchGuid: this.handle.absolutePath.split(\"/\").pop() as string,\n\t\t\tsummaryMinimumSequenceNumber: this.runtime.deltaManager.minimumSequenceNumber,\n\t\t\tuseMH: this.useMH,\n\t\t\tnumChunks: 0,\n\t\t};\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tif (!this.useMH) {\n\t\t\t// If the MH is not used, we have to include the tip view, the remote changes and the received\n\t\t\t// deltas to the summary\n\t\t\tconst summary: ISnapshotSummary = {\n\t\t\t\tremoteTipView: this.remoteTipView,\n\t\t\t\tremoteChanges: this.remoteChanges,\n\t\t\t\tremoteHeadGuid: this.headCommitGuid,\n\t\t\t\tunrebasedRemoteChanges: this.unrebasedRemoteChanges,\n\t\t\t};\n\n\t\t\tconst chunkSize = 5000 * 1024; // Default limit seems to be 5MB\n\t\t\tlet totalBlobsSize = 0;\n\t\t\tconst serializedSummary = this.encodeSummary(summary);\n\t\t\tfor (let pos = 0, i = 0; pos < serializedSummary.length; pos += chunkSize, i++) {\n\t\t\t\tconst summaryBlob = this.encodeSummaryBlob(serializedSummary.slice(pos, pos + chunkSize));\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\t\ttotalBlobsSize += summaryBlob[\"length\"];\n\t\t\t\tbuilder.addBlob(`summaryChunk_${i}`, summaryBlob);\n\t\t\t\tsnapshot.numChunks++;\n\t\t\t}\n\t\t\tthis.logIfEnabled(`Total blobs transfer size: ${totalBlobsSize}`);\n\t\t}\n\n\t\tbuilder.addBlob(\"properties\", serializer !== undefined\n\t\t\t? serializer.stringify(snapshot, this.handle)\n\t\t\t: JSON.stringify(snapshot));\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst runtime = this.runtime;\n\t\tconst handleTableChunk = await storage.readBlob(\"properties\");\n\t\tconst utf8 = bufferToString(handleTableChunk, \"utf8\");\n\n\t\tconst snapshot: ISnapshot = this.serializer.parse(utf8);\n\t\tthis.useMH = snapshot.useMH;\n\n\t\ttry {\n\t\t\tif (!snapshot.useMH) {\n\t\t\t\t// We load all chunks\n\t\t\t\tconst chunks: ArrayBufferLike[] = await Promise.all(\n\t\t\t\t\trange(snapshot.numChunks).map(async (i) => {\n\t\t\t\t\t\treturn this.decodeSummaryBlob(await storage.readBlob(`summaryChunk_${i}`));\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst totalLength = chunks.reduce((a, b) => a + b.byteLength, 0);\n\t\t\t\tconst serializedSummary = new Uint8Array(totalLength);\n\t\t\t\tchunks.reduce((offset, chunk) => {\n\t\t\t\t\tserializedSummary.set(new Uint8Array(chunk), offset);\n\t\t\t\t\treturn offset + chunk.byteLength;\n\t\t\t\t}, 0);\n\t\t\t\tconst snapshotSummary = this.decodeSummary(serializedSummary);\n\t\t\t\tif (\n\t\t\t\t\tsnapshotSummary.remoteChanges === undefined ||\n\t\t\t\t\tsnapshotSummary.remoteTipView === undefined ||\n\t\t\t\t\tsnapshotSummary.unrebasedRemoteChanges === undefined\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\"Invalid Snapshot.\");\n\t\t\t\t}\n\n\t\t\t\tif (snapshotSummary.remoteHeadGuid === undefined) {\n\t\t\t\t\t// The summary does not contain a remoteHeadGuid. This means the summary has\n\t\t\t\t\t// been created by an old version of PropertyDDS, that did not yet have this patch.\n\t\t\t\t\tsnapshotSummary.remoteHeadGuid = (snapshotSummary.remoteChanges.length > 0) ?\n\t\t\t\t\t\t\t// If there are remote changes in the\n\t\t\t\t\t\t\t// summary we can deduce the head GUID from these changes.\n\t\t\t\t\t\t\tsnapshotSummary.remoteChanges[snapshotSummary.remoteChanges.length - 1].guid :\n\n\t\t\t\t\t\t\t// If no remote head GUID is available, we will fall back to the old behaviour,\n\t\t\t\t\t\t\t// where the head GUID was set to an empty string. However, this could lead to\n\t\t\t\t\t\t\t// divergence between the clients, if there is still a client in the session\n\t\t\t\t\t\t\t// that is using a version of this library without this patch and which\n\t\t\t\t\t\t\t// has started the session at a different summary.\n\t\t\t\t\t\t\t\"\";\n\t\t\t\t}\n\n\t\t\t\tthis.remoteTipView = snapshotSummary.remoteTipView;\n\t\t\t\tthis.remoteChanges = snapshotSummary.remoteChanges;\n\t\t\t\tthis.unrebasedRemoteChanges = snapshotSummary.unrebasedRemoteChanges;\n\t\t\t\tthis.headCommitGuid = snapshotSummary.remoteHeadGuid;\n\t\t\t\tconst isPartialCheckoutActive = !!(this.options.clientFiltering && this.options.paths);\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tthis.remoteTipView = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\tthis.remoteTipView,\n\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\n\t\t\t\tthis.skipSequenceNumber = 0;\n\t\t\t} else {\n\t\t\t\tconst { branchGuid, summaryMinimumSequenceNumber } = snapshot;\n\t\t\t\tconst branchResponse = await axios.get(`http://localhost:3000/branch/${branchGuid}`);\n\t\t\t\tthis.headCommitGuid = branchResponse.data.headCommitGuid;\n\t\t\t\tconst {\n\t\t\t\t\tcommit: { meta: commitMetadata },\n\t\t\t\t} = (await axios.get(`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}`)).data;\n\t\t\t\tlet { changeSet: materializedView } = (\n\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${this.headCommitGuid}/materializedView`,\n\t\t\t\t\t)\n\t\t\t\t).data;\n\n\t\t\t\tconst isPartialCheckoutActive = this.options.clientFiltering && this.options.paths;\n\n\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\tmaterializedView = ChangeSetUtils.getFilteredChangeSetByPaths(materializedView, this.options.paths);\n\t\t\t\t}\n\n\t\t\t\tthis.tipView = materializedView;\n\t\t\t\tthis.remoteTipView = cloneDeep(this.tipView);\n\t\t\t\tthis.remoteChanges = [];\n\n\t\t\t\tlet missingDeltas: ISequencedDocumentMessage[] = [];\n\t\t\t\tconst firstDelta = Math.min(commitMetadata.minimumSequenceNumber, summaryMinimumSequenceNumber);\n\t\t\t\tconst lastDelta = commitMetadata.sequenceNumber;\n\n\t\t\t\tconst dm = (this.runtime.deltaManager as any).deltaManager;\n\t\t\t\tawait dm.getDeltas(\"DocumentOpen\", firstDelta, lastDelta, (messages: ISequencedDocumentMessage[]) => {\n\t\t\t\t\tmissingDeltas = messages.filter((x) => x.type === \"op\");\n\t\t\t\t});\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\t\t\tfor (let i = 0; i < missingDeltas.length; i++) {\n\t\t\t\t\tif (missingDeltas[i].sequenceNumber < commitMetadata.sequenceNumber) {\n\t\t\t\t\t\tconst remoteChange: IPropertyTreeMessage\n\t\t\t\t\t\t\t= JSON.parse(missingDeltas[i].contents).contents.contents.content.contents;\n\t\t\t\t\t\tconst { changeSet } = (\n\t\t\t\t\t\t\tawait axios.get(\n\t\t\t\t\t\t\t\t`http://localhost:3000/branch/${branchGuid}/commit/${remoteChange.guid}/changeSet`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t).data;\n\t\t\t\t\t\tremoteChange.changeSet = changeSet;\n\n\t\t\t\t\t\tif (remoteChange) {\n\t\t\t\t\t\t\tif (isPartialCheckoutActive && this.options.paths) {\n\t\t\t\t\t\t\t\tremoteChange.changeSet = ChangeSetUtils.getFilteredChangeSetByPaths(\n\t\t\t\t\t\t\t\t\tremoteChange.changeSet,\n\t\t\t\t\t\t\t\t\tthis.options.paths,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.addRemoteChange(remoteChange);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.processCore(missingDeltas[i], false, {});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.skipSequenceNumber = lastDelta ?? -1;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.tipView = {};\n\t\t\tthis.remoteTipView = {};\n\t\t\tthis.remoteChanges = [];\n\t\t} finally {\n\t\t\tthis._root.deserialize(this.tipView, undefined, false, false);\n\t\t\tconst _changeSet = new ChangeSet(this.tipView);\n\t\t\tif (!isEmpty(_changeSet.getSerializedChangeSet())) {\n\t\t\t\tthis.emit(\"localModification\", _changeSet);\n\t\t\t}\n\t\t\tthis.root.cleanDirty();\n\t\t}\n\t}\n\n\tprotected onDisconnect() { }\n\n\tprivate _applyLocalChangeSet(change: IPropertyTreeMessage) {\n\t\tconst changeSetWrapper = new ChangeSet(this.tipView);\n\t\tchangeSetWrapper.applyChangeSet(change.changeSet);\n\n\t\tif (this.runtime.attachState === AttachState.Detached) {\n\t\t\tconst remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);\n\t\t\tremoteChangeSetWrapper.applyChangeSet(change.changeSet);\n\t\t} else {\n\t\t\tthis.localChanges.push(change);\n\t\t}\n\t}\n\n\tprivate _applyRemoteChangeSet(change: IRemotePropertyTreeMessage) {\n\t\tthis.unrebasedRemoteChanges[change.guid] = cloneDeep(change);\n\n\t\t// This is the first message in the history of the document.\n\t\tif (this.remoteChanges.length !== 0) {\n\t\t\trebaseToRemoteChanges(\n\t\t\t\tchange,\n\t\t\t\tthis.getUnrebasedChange.bind(this),\n\t\t\t\tthis.getRebasedChanges.bind(this),\n\t\t\t);\n\t\t}\n\n\t\tthis.addRemoteChange(change);\n\t\t// Apply the remote change set to the remote tip view\n\t\tconst remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);\n\t\tremoteChangeSetWrapper.applyChangeSet(change.changeSet);\n\n\t\t// Rebase the local changes\n\t\tconst pendingChanges = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\tnew ChangeSet(pendingChanges)._toReversibleChangeSet(this.tipView);\n\n\t\tconst changesToTip: SerializedChangeSet = {};\n\t\tconst changesNeeded = this.rebaseLocalChanges(change, pendingChanges, changesToTip);\n\n\t\tif (changesNeeded) {\n\t\t\tthis.pushNotificationDelayScope();\n\t\t\t// Checkout the new tip\n\t\t\tthis._root.applyChangeSet(changesToTip);\n\t\t\tthis._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.PENDING_CHANGE);\n\t\t\tthis._root.applyChangeSet(pendingChanges);\n\t\t\tthis.popNotificationDelayScope();\n\t\t}\n\n\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t// assert(JSON.stringify(this.root.serialize()) === JSON.stringify(this.tipView));\n\t}\n\n\tgetUnrebasedChange(guid: string) {\n\t\treturn this.unrebasedRemoteChanges[guid];\n\t}\n\n\tgetRebasedChanges(startGuid: string, endGuid?: string) {\n\t\tconst startIndex = findIndex(this.remoteChanges, (c) => c.guid === startGuid);\n\t\tif (endGuid !== undefined) {\n\t\t\tconst endIndex = findIndex(this.remoteChanges, (c) => c.guid === endGuid);\n\t\t\treturn this.remoteChanges.slice(startIndex + 1, endIndex + 1);\n\t\t}\n\t\treturn this.remoteChanges.slice(startIndex + 1);\n\t}\n\n\tprivate rebaseLocalChanges(\n\t\tchange: IPropertyTreeMessage,\n\t\tpendingChanges: SerializedChangeSet,\n\t\tnewTipDelta: SerializedChangeSet,\n\t): boolean {\n\t\tlet rebaseBaseChangeSet = cloneDeep(change.changeSet);\n\n\t\tconst accumulatedChanges: SerializedChangeSet = {};\n\t\tconst conflicts = [] as any[];\n\n\t\tif (this.localChanges.length > 0 && this.localChanges[0].guid === change.guid) {\n\t\t\t// This is disabled for performance reasons. Only used during debugging\n\t\t\t// assert(JSON.stringify(this.localChanges[0].changeSet) === JSON.stringify(change.changeSet),\n\t\t\t// \"Local change different than rebased remote change.\");\n\n\t\t\t// If we got a confirmation of the commit on the tip of the localChanges array,\n\t\t\t// there will be no update of the tip view at all. We just move it from local changes\n\t\t\t// to remote changes\n\t\t\tthis.localChanges.shift();\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\tfor (let i = 0; i < this.localChanges.length; i++) {\n\t\t\t// Make sure we never receive changes out of order\n\t\t\tconsole.assert(this.localChanges[i].guid !== change.guid);\n\n\t\t\tconst rebaseMetaInformation = new Map();\n\n\t\t\tconst copiedChangeSet = new ChangeSet(cloneDeep(this.localChanges[i].changeSet));\n\t\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(this.localChanges[i].changeSet, conflicts, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\n\t\t\tcopiedChangeSet.toInverseChangeSet();\n\t\t\tcopiedChangeSet.applyChangeSet(rebaseBaseChangeSet);\n\t\t\tcopiedChangeSet.applyChangeSet(this.localChanges[i].changeSet, {\n\t\t\t\tapplyAfterMetaInformation: rebaseMetaInformation,\n\t\t\t});\n\t\t\trebaseBaseChangeSet = copiedChangeSet.getSerializedChangeSet();\n\n\t\t\tnew ChangeSet(accumulatedChanges).applyChangeSet(this.localChanges[i].changeSet);\n\t\t}\n\n\t\t// Compute the inverse of the pending changes and store the result in newTipDelta\n\t\tconst pendingChangesRebaseMetaInformation = new Map();\n\t\tconst deltaToTipCS = new ChangeSet(newTipDelta);\n\t\tdeltaToTipCS.applyChangeSet(pendingChanges);\n\t\tdeltaToTipCS.toInverseChangeSet();\n\n\t\t// Perform a rebase of the pending changes\n\t\tnew ChangeSet(rebaseBaseChangeSet)._rebaseChangeSet(pendingChanges, conflicts, {\n\t\t\tapplyAfterMetaInformation: pendingChangesRebaseMetaInformation,\n\t\t});\n\n\t\t// Compute the delta between the old tip (including pending changes)\n\t\t// and the new tip (not including the rebased pending changes)\n\t\tdeltaToTipCS.applyChangeSet(rebaseBaseChangeSet);\n\n\t\t// Update the tip view\n\t\tif (!this.tipView) {\n\t\t\tthis.tipView = cloneDeep(this.remoteTipView);\n\t\t\tconst changeSet = new ChangeSet(this.tipView);\n\t\t\tchangeSet.applyChangeSet(accumulatedChanges);\n\t\t} else {\n\t\t\tnew ChangeSet(this.tipView).applyChangeSet(newTipDelta);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprotected applyStashedOp() {\n\t\tthrow new Error(\"not implemented\");\n\t}\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluid-experimental/property-dds",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.5",
|
|
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": "^1.3.
|
|
39
|
-
"@fluid-experimental/property-properties": "^1.3.
|
|
38
|
+
"@fluid-experimental/property-changeset": "^1.3.5",
|
|
39
|
+
"@fluid-experimental/property-properties": "^1.3.5",
|
|
40
40
|
"@fluidframework/common-utils": "^0.32.2",
|
|
41
|
-
"@fluidframework/container-definitions": "^1.3.
|
|
42
|
-
"@fluidframework/core-interfaces": "^1.3.
|
|
43
|
-
"@fluidframework/datastore-definitions": "^1.3.
|
|
41
|
+
"@fluidframework/container-definitions": "^1.3.5",
|
|
42
|
+
"@fluidframework/core-interfaces": "^1.3.5",
|
|
43
|
+
"@fluidframework/datastore-definitions": "^1.3.5",
|
|
44
44
|
"@fluidframework/protocol-definitions": "^0.1028.2000",
|
|
45
|
-
"@fluidframework/runtime-definitions": "^1.3.
|
|
46
|
-
"@fluidframework/runtime-utils": "^1.3.
|
|
47
|
-
"@fluidframework/shared-object-base": "^1.3.
|
|
45
|
+
"@fluidframework/runtime-definitions": "^1.3.5",
|
|
46
|
+
"@fluidframework/runtime-utils": "^1.3.5",
|
|
47
|
+
"@fluidframework/shared-object-base": "^1.3.5",
|
|
48
48
|
"axios": "^0.26.0",
|
|
49
49
|
"fastest-json-copy": "^1.0.1",
|
|
50
50
|
"lodash": "^4.17.21",
|
|
@@ -53,19 +53,22 @@
|
|
|
53
53
|
"uuid": "^8.3.1"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
|
-
"@fluid-experimental/property-common": "^1.3.
|
|
56
|
+
"@fluid-experimental/property-common": "^1.3.5",
|
|
57
57
|
"@fluidframework/build-common": "^0.24.0",
|
|
58
|
-
"@fluidframework/
|
|
58
|
+
"@fluidframework/container-loader": "^1.3.5",
|
|
59
|
+
"@fluidframework/driver-definitions": "^1.3.5",
|
|
59
60
|
"@fluidframework/eslint-config-fluid": "^0.28.2000",
|
|
60
|
-
"@fluidframework/local-driver": "^1.3.
|
|
61
|
-
"@fluidframework/mocha-test-setup": "^1.3.
|
|
62
|
-
"@fluidframework/sequence": "^1.3.
|
|
61
|
+
"@fluidframework/local-driver": "^1.3.5",
|
|
62
|
+
"@fluidframework/mocha-test-setup": "^1.3.5",
|
|
63
|
+
"@fluidframework/sequence": "^1.3.5",
|
|
63
64
|
"@fluidframework/server-local-server": "^0.1036.5001",
|
|
64
|
-
"@fluidframework/test-
|
|
65
|
-
"@fluidframework/test-utils": "^1.3.
|
|
65
|
+
"@fluidframework/test-drivers": "^1.3.5",
|
|
66
|
+
"@fluidframework/test-runtime-utils": "^1.3.5",
|
|
67
|
+
"@fluidframework/test-utils": "^1.3.5",
|
|
66
68
|
"@microsoft/api-extractor": "^7.22.2",
|
|
67
69
|
"@rushstack/eslint-config": "^2.5.1",
|
|
68
70
|
"@types/mocha": "^9.1.1",
|
|
71
|
+
"@types/node": "^14.18.0",
|
|
69
72
|
"chai": "^4.2.0",
|
|
70
73
|
"concurrently": "^6.2.0",
|
|
71
74
|
"copyfiles": "^2.1.0",
|
package/src/propertyTree.ts
CHANGED
|
@@ -73,6 +73,7 @@ export interface ISnapshotSummary {
|
|
|
73
73
|
remoteTipView?: SerializedChangeSet;
|
|
74
74
|
remoteChanges?: IPropertyTreeMessage[];
|
|
75
75
|
unrebasedRemoteChanges?: Record<string, IRemotePropertyTreeMessage>;
|
|
76
|
+
remoteHeadGuid: string;
|
|
76
77
|
}
|
|
77
78
|
|
|
78
79
|
export interface SharedPropertyTreeOptions {
|
|
@@ -193,14 +194,14 @@ export class SharedPropertyTree extends SharedObject {
|
|
|
193
194
|
// for the serialization of the data structure
|
|
194
195
|
if (this.listenerCount("localModification") > 0) {
|
|
195
196
|
const changes = this._root._serialize(true, false, BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);
|
|
196
|
-
|
|
197
|
+
this._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);
|
|
197
198
|
const _changeSet = new ChangeSet(changes);
|
|
198
199
|
if (!isEmpty(_changeSet.getSerializedChangeSet())) {
|
|
199
200
|
this.emit("localModification", _changeSet);
|
|
200
201
|
}
|
|
201
202
|
} else {
|
|
202
|
-
|
|
203
|
-
|
|
203
|
+
this._root.cleanDirty(BaseProperty.MODIFIED_STATE_FLAGS.DIRTY);
|
|
204
|
+
}
|
|
204
205
|
}
|
|
205
206
|
|
|
206
207
|
public get changeSet(): SerializedChangeSet {
|
|
@@ -210,8 +211,8 @@ export class SharedPropertyTree extends SharedObject {
|
|
|
210
211
|
|
|
211
212
|
public get activeCommit(): IPropertyTreeMessage {
|
|
212
213
|
return this.localChanges.length > 0
|
|
213
|
-
|
|
214
|
-
|
|
214
|
+
? this.localChanges[this.localChanges.length - 1]
|
|
215
|
+
: this.remoteChanges[this.remoteChanges.length - 1];
|
|
215
216
|
}
|
|
216
217
|
public get root(): NodeProperty {
|
|
217
218
|
return this._root as NodeProperty;
|
|
@@ -244,7 +245,7 @@ export class SharedPropertyTree extends SharedObject {
|
|
|
244
245
|
/**
|
|
245
246
|
* This method decodes message from the transfer form.
|
|
246
247
|
* @param transferChange - The message to be decoded.
|
|
247
|
-
|
|
248
|
+
*/
|
|
248
249
|
private decodeMessage(transferChange: IPropertyTreeMessage): IPropertyTreeMessage {
|
|
249
250
|
return this.propertyTreeConfig.encDec.messageEncoder.decode(transferChange);
|
|
250
251
|
}
|
|
@@ -253,18 +254,18 @@ export class SharedPropertyTree extends SharedObject {
|
|
|
253
254
|
const _changeSet = new ChangeSet(changeSet);
|
|
254
255
|
_changeSet._toReversibleChangeSet(this.tipView);
|
|
255
256
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
? this.remoteChanges[this.remoteChanges.length - 1].guid
|
|
259
|
-
: this.headCommitGuid;
|
|
257
|
+
this.updateRemoteHeadGuid();
|
|
258
|
+
|
|
260
259
|
const change = {
|
|
261
260
|
op: OpKind.ChangeSet,
|
|
262
261
|
changeSet,
|
|
263
262
|
metadata,
|
|
264
263
|
guid: uuidv4(),
|
|
265
|
-
remoteHeadGuid,
|
|
264
|
+
remoteHeadGuid: this.headCommitGuid,
|
|
266
265
|
referenceGuid:
|
|
267
|
-
this.localChanges.length > 0
|
|
266
|
+
this.localChanges.length > 0
|
|
267
|
+
? this.localChanges[this.localChanges.length - 1].guid
|
|
268
|
+
: this.headCommitGuid,
|
|
268
269
|
localBranchStart: this.localChanges.length > 0 ? this.localChanges[0].guid : undefined,
|
|
269
270
|
useMH: this.useMH,
|
|
270
271
|
};
|
|
@@ -337,6 +338,17 @@ export class SharedPropertyTree extends SharedObject {
|
|
|
337
338
|
}
|
|
338
339
|
}
|
|
339
340
|
|
|
341
|
+
private addRemoteChange(change: IPropertyTreeMessage) {
|
|
342
|
+
this.remoteChanges.push(change);
|
|
343
|
+
this.updateRemoteHeadGuid();
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
private updateRemoteHeadGuid() {
|
|
347
|
+
this.headCommitGuid = this.remoteChanges.length > 0
|
|
348
|
+
? this.remoteChanges[this.remoteChanges.length - 1].guid
|
|
349
|
+
: this.headCommitGuid;
|
|
350
|
+
}
|
|
351
|
+
|
|
340
352
|
public static prune(
|
|
341
353
|
minimumSequenceNumber: number,
|
|
342
354
|
remoteChanges: IPropertyTreeMessage[],
|
|
@@ -494,8 +506,10 @@ export class SharedPropertyTree extends SharedObject {
|
|
|
494
506
|
const summary: ISnapshotSummary = {
|
|
495
507
|
remoteTipView: this.remoteTipView,
|
|
496
508
|
remoteChanges: this.remoteChanges,
|
|
509
|
+
remoteHeadGuid: this.headCommitGuid,
|
|
497
510
|
unrebasedRemoteChanges: this.unrebasedRemoteChanges,
|
|
498
511
|
};
|
|
512
|
+
|
|
499
513
|
const chunkSize = 5000 * 1024; // Default limit seems to be 5MB
|
|
500
514
|
let totalBlobsSize = 0;
|
|
501
515
|
const serializedSummary = this.encodeSummary(summary);
|
|
@@ -547,10 +561,26 @@ export class SharedPropertyTree extends SharedObject {
|
|
|
547
561
|
throw new Error("Invalid Snapshot.");
|
|
548
562
|
}
|
|
549
563
|
|
|
564
|
+
if (snapshotSummary.remoteHeadGuid === undefined) {
|
|
565
|
+
// The summary does not contain a remoteHeadGuid. This means the summary has
|
|
566
|
+
// been created by an old version of PropertyDDS, that did not yet have this patch.
|
|
567
|
+
snapshotSummary.remoteHeadGuid = (snapshotSummary.remoteChanges.length > 0) ?
|
|
568
|
+
// If there are remote changes in the
|
|
569
|
+
// summary we can deduce the head GUID from these changes.
|
|
570
|
+
snapshotSummary.remoteChanges[snapshotSummary.remoteChanges.length - 1].guid :
|
|
571
|
+
|
|
572
|
+
// If no remote head GUID is available, we will fall back to the old behaviour,
|
|
573
|
+
// where the head GUID was set to an empty string. However, this could lead to
|
|
574
|
+
// divergence between the clients, if there is still a client in the session
|
|
575
|
+
// that is using a version of this library without this patch and which
|
|
576
|
+
// has started the session at a different summary.
|
|
577
|
+
"";
|
|
578
|
+
}
|
|
579
|
+
|
|
550
580
|
this.remoteTipView = snapshotSummary.remoteTipView;
|
|
551
581
|
this.remoteChanges = snapshotSummary.remoteChanges;
|
|
552
582
|
this.unrebasedRemoteChanges = snapshotSummary.unrebasedRemoteChanges;
|
|
553
|
-
|
|
583
|
+
this.headCommitGuid = snapshotSummary.remoteHeadGuid;
|
|
554
584
|
const isPartialCheckoutActive = !!(this.options.clientFiltering && this.options.paths);
|
|
555
585
|
if (isPartialCheckoutActive && this.options.paths) {
|
|
556
586
|
this.remoteTipView = ChangeSetUtils.getFilteredChangeSetByPaths(
|
|
@@ -612,7 +642,7 @@ export class SharedPropertyTree extends SharedObject {
|
|
|
612
642
|
this.options.paths,
|
|
613
643
|
);
|
|
614
644
|
}
|
|
615
|
-
this.
|
|
645
|
+
this.addRemoteChange(remoteChange);
|
|
616
646
|
}
|
|
617
647
|
} else {
|
|
618
648
|
this.processCore(missingDeltas[i], false, {});
|
|
@@ -661,8 +691,7 @@ export class SharedPropertyTree extends SharedObject {
|
|
|
661
691
|
);
|
|
662
692
|
}
|
|
663
693
|
|
|
664
|
-
this.
|
|
665
|
-
|
|
694
|
+
this.addRemoteChange(change);
|
|
666
695
|
// Apply the remote change set to the remote tip view
|
|
667
696
|
const remoteChangeSetWrapper = new ChangeSet(this.remoteTipView);
|
|
668
697
|
remoteChangeSetWrapper.applyChangeSet(change.changeSet);
|