@fluidframework/matrix 0.54.2 → 0.55.0-48551
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +1 -1
- package/dist/handletable.d.ts +1 -1
- package/dist/handletable.d.ts.map +1 -1
- package/dist/handletable.js +1 -1
- package/dist/handletable.js.map +1 -1
- package/dist/matrix.d.ts +7 -8
- package/dist/matrix.d.ts.map +1 -1
- package/dist/matrix.js +12 -34
- package/dist/matrix.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/permutationvector.d.ts +4 -3
- package/dist/permutationvector.d.ts.map +1 -1
- package/dist/permutationvector.js +8 -15
- package/dist/permutationvector.js.map +1 -1
- package/dist/serialization.d.ts +2 -1
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js.map +1 -1
- package/lib/handletable.d.ts +1 -1
- package/lib/handletable.d.ts.map +1 -1
- package/lib/handletable.js +1 -1
- package/lib/handletable.js.map +1 -1
- package/lib/matrix.d.ts +7 -8
- package/lib/matrix.d.ts.map +1 -1
- package/lib/matrix.js +15 -37
- package/lib/matrix.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/permutationvector.d.ts +4 -3
- package/lib/permutationvector.d.ts.map +1 -1
- package/lib/permutationvector.js +10 -17
- package/lib/permutationvector.js.map +1 -1
- package/lib/serialization.d.ts +2 -1
- package/lib/serialization.d.ts.map +1 -1
- package/lib/serialization.js.map +1 -1
- package/package.json +20 -19
- package/src/handletable.ts +1 -1
- package/src/matrix.ts +18 -53
- package/src/packageVersion.ts +1 -1
- package/src/permutationvector.ts +14 -18
- package/src/serialization.ts +2 -1
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
import { IFluidDataStoreRuntime, IChannelStorageService } from "@fluidframework/datastore-definitions";
|
|
6
6
|
import { ITelemetryBaseLogger } from "@fluidframework/common-definitions";
|
|
7
7
|
import { BaseSegment, ISegment, Client } from "@fluidframework/merge-tree";
|
|
8
|
-
import { IFluidHandle
|
|
9
|
-
import {
|
|
8
|
+
import { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
9
|
+
import { IFluidSerializer } from "@fluidframework/shared-object-base";
|
|
10
|
+
import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
|
|
10
11
|
import { Handle } from "./handletable";
|
|
11
12
|
import { HandleCache } from "./handlecache";
|
|
12
13
|
import { VectorUndoProvider } from "./undoprovider";
|
|
@@ -50,7 +51,7 @@ export declare class PermutationVector extends Client {
|
|
|
50
51
|
getAllocatedHandle(pos: number): Handle;
|
|
51
52
|
adjustPosition(pos: number, fromSeq: number, clientId: number): number | undefined;
|
|
52
53
|
handleToPosition(handle: Handle, localSeq?: number): number;
|
|
53
|
-
|
|
54
|
+
summarize(runtime: IFluidDataStoreRuntime, handle: IFluidHandle, serializer: IFluidSerializer): ISummaryTreeWithStats;
|
|
54
55
|
load(runtime: IFluidDataStoreRuntime, storage: IChannelStorageService, serializer: IFluidSerializer): Promise<{
|
|
55
56
|
catchupOpsP: Promise<import("@fluidframework/protocol-definitions").ISequencedDocumentMessage[]>;
|
|
56
57
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permutationvector.d.ts","sourceRoot":"","sources":["../src/permutationvector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACvG,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EACH,WAAW,EACX,QAAQ,EAER,MAAM,EAQT,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"permutationvector.d.ts","sourceRoot":"","sources":["../src/permutationvector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACvG,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EACH,WAAW,EACX,QAAQ,EAER,MAAM,EAQT,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,OAAO,EAAe,MAAM,EAAiB,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AASpD,qBAAa,kBAAmB,SAAQ,WAAW;IAC/C,gBAAuB,UAAU,EAAE,MAAM,CAAwB;IACjE,OAAO,CAAC,MAAM,CAAsB;WAEtB,cAAc,CAAC,IAAI,EAAE,GAAG;IAKtC,SAAgB,IAAI,SAAiC;gBAEzC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAqB;IAMtD,IAAW,KAAK,IACQ,MAAM,CADY;IAC1C,IAAW,KAAK,CAAC,KAAK,EAAE,MAAM,EAK7B;IAED;;;;;OAKG;IACI,qBAAqB,CAAC,WAAW,EAAE,kBAAkB;IAuBrD,KAAK;IAIL,YAAY;IAIZ,KAAK,CAAC,KAAK,SAAI,EAAE,GAAG,SAAoB;IAQxC,SAAS,CAAC,OAAO,EAAE,QAAQ;IAQ3B,MAAM,CAAC,OAAO,EAAE,QAAQ;IAQ/B,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM;IAcnC,QAAQ;CAKlB;AAED,qBAAa,iBAAkB,SAAQ,MAAM;IASrC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IAT5C,OAAO,CAAC,WAAW,CAA4B;IAC/C,SAAgB,WAAW,cAAyB;IAC7C,IAAI,EAAE,kBAAkB,GAAG,SAAS,CAAC;gBAGxC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,sBAAsB,EACd,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,EAClF,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI;IAalE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMpC,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;;;;IAWhD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAIpC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAMnC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAsBvC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAc7D,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAuC;IA2DhF,SAAS,CAAC,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,GAChG,qBAAqB;IAOZ,IAAI,CACb,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,gBAAgB;;;IAShC,OAAO,CAAC,QAAQ,CAAC,OAAO,CA2DtB;IAEF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAyB5B;IAEK,QAAQ;CAUlB"}
|
package/lib/permutationvector.js
CHANGED
|
@@ -5,10 +5,9 @@
|
|
|
5
5
|
import { assert } from "@fluidframework/common-utils";
|
|
6
6
|
import { ChildLogger } from "@fluidframework/telemetry-utils";
|
|
7
7
|
import { BaseSegment, LocalReferenceCollection, Client, LocalReference, ReferenceType, } from "@fluidframework/merge-tree";
|
|
8
|
-
import {
|
|
9
|
-
import { ObjectStoragePartition } from "@fluidframework/runtime-utils";
|
|
8
|
+
import { ObjectStoragePartition, SummaryTreeBuilder } from "@fluidframework/runtime-utils";
|
|
10
9
|
import { HandleTable, isHandleValid } from "./handletable";
|
|
11
|
-
import {
|
|
10
|
+
import { deserializeBlob } from "./serialization";
|
|
12
11
|
import { HandleCache } from "./handlecache";
|
|
13
12
|
export class PermutationSegment extends BaseSegment {
|
|
14
13
|
constructor(length, start = -2147483648 /* unallocated */) {
|
|
@@ -257,22 +256,16 @@ export class PermutationVector extends Client {
|
|
|
257
256
|
// Once we know the current position of the handle, we can use the MergeTree to get the segment
|
|
258
257
|
// containing this position and use 'findReconnectionPosition' to adjust for the local ops that
|
|
259
258
|
// have not yet been submitted.
|
|
260
|
-
// eslint-disable-next-line
|
|
259
|
+
// eslint-disable-next-line max-len
|
|
260
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion
|
|
261
261
|
return this.findReconnectionPostition(containingSegment, localSeq) + containingOffset;
|
|
262
262
|
}
|
|
263
|
-
// Constructs an
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
path: "segments" /* segments */,
|
|
270
|
-
type: TreeEntry.Tree,
|
|
271
|
-
value: super.snapshot(runtime, handle, serializer, /* catchUpMsgs: */ []),
|
|
272
|
-
},
|
|
273
|
-
serializeBlob(handle, "handleTable" /* handleTable */, this.handleTable.snapshot(), serializer),
|
|
274
|
-
],
|
|
275
|
-
};
|
|
263
|
+
// Constructs an ISummaryTreeWithStats for the cell data.
|
|
264
|
+
summarize(runtime, handle, serializer) {
|
|
265
|
+
const builder = new SummaryTreeBuilder();
|
|
266
|
+
builder.addWithStats("segments" /* segments */, super.summarize(runtime, handle, serializer, /* catchUpMsgs: */ []));
|
|
267
|
+
builder.addBlob("handleTable" /* handleTable */, serializer.stringify(this.handleTable.getSummaryContent(), handle));
|
|
268
|
+
return builder.getSummaryTree();
|
|
276
269
|
}
|
|
277
270
|
async load(runtime, storage, serializer) {
|
|
278
271
|
const handleTableData = await deserializeBlob(storage, "handleTable" /* handleTable */, serializer);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permutationvector.js","sourceRoot":"","sources":["../src/permutationvector.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { IFluidDataStoreRuntime, IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ITelemetryBaseLogger } from \"@fluidframework/common-definitions\";\nimport {\n BaseSegment,\n ISegment,\n LocalReferenceCollection,\n Client,\n IMergeTreeDeltaOpArgs,\n IMergeTreeDeltaCallbackArgs,\n MergeTreeDeltaType,\n IMergeTreeMaintenanceCallbackArgs,\n MergeTreeMaintenanceType,\n LocalReference,\n ReferenceType,\n} from \"@fluidframework/merge-tree\";\nimport { IFluidHandle, IFluidSerializer } from \"@fluidframework/core-interfaces\";\nimport { FileMode, TreeEntry, ITree } from \"@fluidframework/protocol-definitions\";\nimport { ObjectStoragePartition } from \"@fluidframework/runtime-utils\";\nimport { HandleTable, Handle, isHandleValid } from \"./handletable\";\nimport { serializeBlob, deserializeBlob } from \"./serialization\";\nimport { HandleCache } from \"./handlecache\";\nimport { VectorUndoProvider } from \"./undoprovider\";\n\nconst enum SnapshotPath {\n segments = \"segments\",\n handleTable = \"handleTable\",\n}\n\ntype PermutationSegmentSpec = [number, number];\n\nexport class PermutationSegment extends BaseSegment {\n public static readonly typeString: string = \"PermutationSegment\";\n private _start = Handle.unallocated;\n\n public static fromJSONObject(spec: any) {\n const [length, start] = spec as PermutationSegmentSpec;\n return new PermutationSegment(length, start);\n }\n\n public readonly type = PermutationSegment.typeString;\n\n constructor(length: number, start = Handle.unallocated) {\n super();\n this._start = start;\n this.cachedLength = length;\n }\n\n public get start() { return this._start; }\n public set start(value: Handle) {\n assert(this._start === Handle.unallocated, 0x024 /* \"Start of PermutationSegment already allocated!\" */);\n assert(isHandleValid(value), 0x025 /* \"Trying to set start of PermutationSegment to invalid handle!\" */);\n\n this._start = value;\n }\n\n /**\n * Invoked by '_undoRow/ColRemove' to prepare the newly inserted destination\n * segment to serve as the replacement for this removed segment. This moves handle\n * allocations from this segment to the replacement as well as maintains tracking\n * groups for the undo/redo stack.\n */\n public transferToReplacement(destination: PermutationSegment) {\n // When this segment was removed, it may have been split from a larger original\n // segment. In this case, it will have been added to an undo/redo tracking group\n // that associates all of the fragments from the original insertion.\n //\n // Move this association from the this removed segment to its replacement so that\n // it is included if the undo stack continues to unwind to the original insertion.\n //\n // Out of paranoia we link and unlink in separate loops to avoid mutating the underlying\n // set during enumeration. In pratice, this is unlikely to matter since there should be\n // exactly 0 or 1 items in the enumeration.\n for (const group of this.trackingCollection.trackingGroups) {\n group.link(destination);\n }\n for (const group of this.trackingCollection.trackingGroups) {\n group.unlink(this);\n }\n\n // Move handle allocations from this segment to its replacement.\n destination._start = this._start;\n this.reset();\n }\n\n public reset() {\n this._start = Handle.unallocated;\n }\n\n public toJSONObject() {\n return [this.cachedLength, this.start];\n }\n\n public clone(start = 0, end = this.cachedLength) {\n const b = new PermutationSegment(\n /* length: */ end - start,\n /* start: */ this.start + start);\n this.cloneInto(b);\n return b;\n }\n\n public canAppend(segment: ISegment) {\n const asPerm = segment as PermutationSegment;\n\n return this.start === Handle.unallocated\n ? asPerm.start === Handle.unallocated\n : asPerm.start === this.start + this.cachedLength;\n }\n\n public append(segment: ISegment) {\n // Note: Must call 'LocalReferenceCollection.append(..)' before modifying this segment's length as\n // 'this.cachedLength' is used to adjust the offsets of the local refs.\n LocalReferenceCollection.append(this, segment);\n\n this.cachedLength += segment.cachedLength;\n }\n\n protected createSplitSegmentAt(pos: number) {\n assert(0 < pos && pos < this.cachedLength, 0x026 /* \"Trying to split segment at out-of-bounds position!\" */);\n\n const leafSegment = new PermutationSegment(\n /* length: */ this.cachedLength - pos,\n /* start: */ this.start === Handle.unallocated\n ? Handle.unallocated\n : this.start + pos);\n\n this.cachedLength = pos;\n\n return leafSegment;\n }\n\n public toString() {\n return this.start === Handle.unallocated\n ? `<${this.cachedLength} empty>`\n : `<${this.cachedLength}: ${this.start}..${this.start + this.cachedLength - 1}>`;\n }\n}\n\nexport class PermutationVector extends Client {\n private handleTable = new HandleTable<never>(); // Tracks available storage handles for rows.\n public readonly handleCache = new HandleCache(this);\n public undo: VectorUndoProvider | undefined;\n\n constructor(\n path: string,\n logger: ITelemetryBaseLogger,\n runtime: IFluidDataStoreRuntime,\n private readonly deltaCallback: (position: number, numRemoved: number, numInserted: number) => void,\n private readonly handlesRecycledCallback: (handles: Handle[]) => void,\n ) {\n super(\n PermutationSegment.fromJSONObject,\n ChildLogger.create(logger, `Matrix.${path}.MergeTreeClient`), {\n ...runtime.options,\n newMergeTreeSnapshotFormat: true, // Temporarily force new snapshot format until it is the default.\n }); // (See https://github.com/microsoft/FluidFramework/issues/84)\n\n this.mergeTreeDeltaCallback = this.onDelta;\n this.mergeTreeMaintenanceCallback = this.onMaintenance;\n }\n\n public insert(start: number, length: number) {\n return this.insertSegmentLocal(\n start,\n new PermutationSegment(length));\n }\n\n public insertRelative(segment: ISegment, length: number) {\n const inserted = new PermutationSegment(length);\n\n return {\n op: this.insertAtReferencePositionLocal(\n new LocalReference(this, segment, /* offset: */ 0, ReferenceType.Transient),\n inserted),\n inserted,\n };\n }\n\n public remove(start: number, length: number) {\n return this.removeRangeLocal(start, start + length);\n }\n\n public getMaybeHandle(pos: number): Handle {\n assert(0 <= pos && pos < this.getLength(), 0x027 /* \"Trying to get handle of out-of-bounds position!\" */);\n\n return this.handleCache.getHandle(pos);\n }\n\n public getAllocatedHandle(pos: number): Handle {\n let handle = this.getMaybeHandle(pos);\n if (isHandleValid(handle)) {\n return handle;\n }\n\n this.walkSegments(\n (segment) => {\n const asPerm = segment as PermutationSegment;\n asPerm.start = handle = this.handleTable.allocate();\n return true;\n },\n pos,\n pos + 1,\n /* accum: */ undefined,\n /* splitRange: */ true);\n\n this.handleCache.addHandle(pos, handle);\n\n return handle;\n }\n\n public adjustPosition(pos: number, fromSeq: number, clientId: number) {\n const { segment, offset } = this.mergeTree.getContainingSegment(pos, fromSeq, clientId);\n\n // Note that until the MergeTree GCs, the segment is still reachable via `getContainingSegment()` with\n // a `refSeq` in the past. Prevent remote ops from accidentally allocating or using recycled handles\n // by checking for the presence of 'removedSeq'.\n if (segment === undefined || segment.removedSeq !== undefined) {\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.getPosition(segment) + offset!;\n }\n\n public handleToPosition(handle: Handle, localSeq = this.mergeTree.collabWindow.localSeq) {\n assert(localSeq <= this.mergeTree.collabWindow.localSeq,\n 0x028 /* \"'localSeq' for op being resubmitted must be <= the 'localSeq' of the last submitted op.\" */);\n\n // TODO: In theory, the MergeTree should be able to map the (position, refSeq, localSeq) from\n // the original operation to the current position for resubmitting. This is probably the\n // ideal solution, as we would no longer need to store row/col handles in the op metadata.\n //\n // Failing that, we could avoid the O(n) search below by building a temporary map in the\n // opposite direction from the handle to either it's current position or segment + offset\n // and reuse it for the duration of resubmission. (Ideally, we would know when resubmission\n // ended so we could discard this map.)\n //\n // If we find that we frequently need a reverse handle -> position lookup, we could maintain\n // one using the Tiny-Calc adjust tree.\n let containingSegment!: PermutationSegment;\n let containingOffset: number;\n\n this.mergeTree.walkAllSegments(\n this.mergeTree.root,\n (segment) => {\n const { start, cachedLength } = segment as PermutationSegment;\n\n // If the segment is unallocated, skip it.\n if (!isHandleValid(start)) {\n return true;\n }\n\n const end = start + cachedLength;\n\n if (start <= handle && handle < end) {\n containingSegment = segment as PermutationSegment;\n containingOffset = handle - start;\n return false;\n }\n\n return true;\n });\n\n // We are guaranteed to find the handle in the PermutationVector, even if the corresponding\n // row/col has been removed, because handles are not recycled until the containing segment\n // is unlinked from the MergeTree.\n //\n // Therefore, either a row/col removal has been ACKed, in which case there will be no pending\n // ops that reference the stale handle, or the removal is unACKed, in which case the handle\n // has not yet been recycled.\n\n assert(isHandleValid(containingSegment.start), 0x029 /* \"Invalid handle at start of containing segment!\" */);\n\n // Once we know the current position of the handle, we can use the MergeTree to get the segment\n // containing this position and use 'findReconnectionPosition' to adjust for the local ops that\n // have not yet been submitted.\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.findReconnectionPostition(containingSegment, localSeq) + containingOffset!;\n }\n\n // Constructs an ITreeEntry for the cell data.\n public snapshot(runtime: IFluidDataStoreRuntime, handle: IFluidHandle, serializer: IFluidSerializer): ITree {\n return {\n entries: [\n {\n mode: FileMode.Directory,\n path: SnapshotPath.segments,\n type: TreeEntry.Tree,\n value: super.snapshot(runtime, handle, serializer, /* catchUpMsgs: */[]),\n },\n serializeBlob(handle, SnapshotPath.handleTable, this.handleTable.snapshot(), serializer),\n ],\n };\n }\n\n public async load(\n runtime: IFluidDataStoreRuntime,\n storage: IChannelStorageService,\n serializer: IFluidSerializer,\n ) {\n const handleTableData = await deserializeBlob(storage, SnapshotPath.handleTable, serializer);\n\n this.handleTable = HandleTable.load<never>(handleTableData);\n\n return super.load(runtime, new ObjectStoragePartition(storage, SnapshotPath.segments), serializer);\n }\n\n private readonly onDelta = (\n opArgs: IMergeTreeDeltaOpArgs,\n { operation, deltaSegments }: IMergeTreeDeltaCallbackArgs,\n ) => {\n // Apply deltas in descending order to prevent positions from shifting.\n const ranges = deltaSegments\n .map(({ segment }) => ({\n segment: segment as PermutationSegment,\n position: this.getPosition(segment),\n }))\n .sort((left, right) => left.position - right.position);\n\n const isLocal = opArgs.sequencedMessage === undefined;\n\n // Notify the undo provider, if any is attached.\n if (this.undo !== undefined && isLocal) {\n this.undo.record(operation, ranges);\n }\n\n switch (operation) {\n case MergeTreeDeltaType.INSERT:\n // Pass 1: Perform any internal maintenance first to avoid reentrancy.\n for (const { segment, position } of ranges) {\n // HACK: We need to include the allocated handle in the segment's JSON reperesntation\n // for snapshots, but need to ignore the remote client's handle allocations when\n // processing remote ops.\n segment.reset();\n\n this.handleCache.itemsChanged(\n position,\n /* deleteCount: */ 0,\n /* insertCount: */ segment.cachedLength);\n }\n\n // Pass 2: Notify the 'deltaCallback', which may involve callbacks into user code.\n for (const { segment, position } of ranges) {\n this.deltaCallback(position, /* numRemoved: */ 0, /* numInserted: */ segment.cachedLength);\n }\n break;\n\n case MergeTreeDeltaType.REMOVE: {\n // Pass 1: Perform any internal maintenance first to avoid reentrancy.\n for (const { segment, position } of ranges) {\n this.handleCache.itemsChanged(\n position, /* deleteCount: */\n segment.cachedLength,\n /* insertCount: */ 0);\n }\n\n // Pass 2: Notify the 'deltaCallback', which may involve callbacks into user code.\n for (const { segment, position } of ranges) {\n this.deltaCallback(position, /* numRemoved: */ segment.cachedLength, /* numInsert: */ 0);\n }\n break;\n }\n\n default:\n throw new Error(\"Unhandled MergeTreeDeltaType\");\n }\n };\n\n private readonly onMaintenance = (args: IMergeTreeMaintenanceCallbackArgs) => {\n if (args.operation === MergeTreeMaintenanceType.UNLINK) {\n let freed: number[] = [];\n\n for (const { segment } of args.deltaSegments) {\n const asPerm = segment as PermutationSegment;\n if (isHandleValid(asPerm.start)) {\n // Note: Using the spread operator with `.splice()` can exhaust the stack.\n freed = freed.concat(\n new Array(asPerm.cachedLength)\n .fill(0)\n .map((value, index) => index + asPerm.start),\n );\n }\n }\n\n // Notify matrix that handles are about to be freed. The matrix is responsible for clearing\n // the rows/cols prior to free to ensure recycled row/cols are initially empty.\n this.handlesRecycledCallback(freed);\n\n // Now that the physical storage has been cleared, add the recycled handles back to the free pool.\n for (const handle of freed) {\n this.handleTable.free(handle);\n }\n }\n };\n\n public toString() {\n const s: string[] = [];\n\n this.walkSegments((segment) => {\n s.push(`${segment}`);\n return true;\n });\n\n return s.join(\"\");\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"permutationvector.js","sourceRoot":"","sources":["../src/permutationvector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAG9D,OAAO,EACH,WAAW,EAEX,wBAAwB,EACxB,MAAM,EAMN,cAAc,EACd,aAAa,GAChB,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAU,aAAa,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAU5C,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IAW/C,YAAY,MAAc,EAAE,KAAK,gCAAqB;QAClD,KAAK,EAAE,CAAC;QAVJ,WAAM,iCAAsB;QAOpB,SAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC;QAIjD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;IAC/B,CAAC;IAXM,MAAM,CAAC,cAAc,CAAC,IAAS;QAClC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,IAA8B,CAAC;QACvD,OAAO,IAAI,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IAUD,IAAW,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1C,IAAW,KAAK,CAAC,KAAa;QAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,kCAAuB,EAAE,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACzG,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,oEAAoE,CAAC,CAAC;QAEzG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAED;;;;;OAKG;IACI,qBAAqB,CAAC,WAA+B;QACxD,+EAA+E;QAC/E,iFAAiF;QACjF,oEAAoE;QACpE,EAAE;QACF,iFAAiF;QACjF,kFAAkF;QAClF,EAAE;QACF,wFAAwF;QACxF,wFAAwF;QACxF,2CAA2C;QAC3C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE;YACxD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SAC3B;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE;YACxD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SACtB;QAED,gEAAgE;QAChE,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACjC,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAEM,KAAK;QACR,IAAI,CAAC,MAAM,gCAAqB,CAAC;IACrC,CAAC;IAEM,YAAY;QACf,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAEM,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,YAAY;QAC3C,MAAM,CAAC,GAAG,IAAI,kBAAkB;QAC5B,aAAa,CAAC,GAAG,GAAG,KAAK;QACzB,YAAY,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAClB,OAAO,CAAC,CAAC;IACb,CAAC;IAEM,SAAS,CAAC,OAAiB;QAC9B,MAAM,MAAM,GAAG,OAA6B,CAAC;QAE7C,OAAO,IAAI,CAAC,KAAK,kCAAuB;YACpC,CAAC,CAAC,MAAM,CAAC,KAAK,kCAAuB;YACrC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;IAC1D,CAAC;IAEM,MAAM,CAAC,OAAiB;QAC3B,kGAAkG;QAClG,6EAA6E;QAC7E,wBAAwB,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAE/C,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC;IAC9C,CAAC;IAES,oBAAoB,CAAC,GAAW;QACtC,MAAM,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAE7G,MAAM,WAAW,GAAG,IAAI,kBAAkB;QACtC,aAAa,CAAC,IAAI,CAAC,YAAY,GAAG,GAAG;QACrC,YAAY,CAAC,IAAI,CAAC,KAAK,kCAAuB;YAC1C,CAAC;YACD,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;QAE5B,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC;QAExB,OAAO,WAAW,CAAC;IACvB,CAAC;IAEM,QAAQ;QACX,OAAO,IAAI,CAAC,KAAK,kCAAuB;YACpC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,SAAS;YAChC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC;IACzF,CAAC;;AAvGsB,6BAAU,GAAW,oBAAoB,CAAC;AA0GrE,MAAM,OAAO,iBAAkB,SAAQ,MAAM;IAKzC,YACI,IAAY,EACZ,MAA4B,EAC5B,OAA+B,EACd,aAAkF,EAClF,uBAAoD;QAErE,KAAK,CACD,kBAAkB,CAAC,cAAc,EACjC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,IAAI,kBAAkB,CAAC,kCACzD,OAAO,CAAC,OAAO,KAClB,0BAA0B,EAAE,IAAI,IAClC,CAAC,CAAqC,8DAA8D;QARrF,kBAAa,GAAb,aAAa,CAAqE;QAClF,4BAAuB,GAAvB,uBAAuB,CAA6B;QATjE,gBAAW,GAAG,IAAI,WAAW,EAAS,CAAC,CAAC,6CAA6C;QAC7E,gBAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;QAmKnC,YAAO,GAAG,CACvB,MAA6B,EAC7B,EAAE,SAAS,EAAE,aAAa,EAA+B,EAC3D,EAAE;YACA,uEAAuE;YACvE,MAAM,MAAM,GAAG,aAAa;iBACvB,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;gBACnB,OAAO,EAAE,OAA6B;gBACtC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;aACtC,CAAC,CAAC;iBACF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;YAE3D,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,KAAK,SAAS,CAAC;YAEtD,gDAAgD;YAChD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,EAAE;gBACpC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;aACvC;YAED,QAAQ,SAAS,EAAE;gBACf;oBACI,sEAAsE;oBACtE,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,MAAM,EAAE;wBACxC,qFAAqF;wBACrF,sFAAsF;wBACtF,+BAA+B;wBAC/B,OAAO,CAAC,KAAK,EAAE,CAAC;wBAEhB,IAAI,CAAC,WAAW,CAAC,YAAY,CACzB,QAAQ;wBACR,kBAAkB,CAAC,CAAC;wBACpB,kBAAkB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;qBAChD;oBAED,kFAAkF;oBAClF,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,MAAM,EAAE;wBACxC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,EAAE,kBAAkB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;qBAC9F;oBACD,MAAM;gBAEV,mBAA8B,CAAC,CAAC;oBAC5B,sEAAsE;oBACtE,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,MAAM,EAAE;wBACxC,IAAI,CAAC,WAAW,CAAC,YAAY,CACzB,QAAQ,EAAE,kBAAkB,CAC5B,OAAO,CAAC,YAAY;wBACpB,kBAAkB,CAAC,CAAC,CAAC,CAAC;qBAC7B;oBAED,kFAAkF;oBAClF,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,MAAM,EAAE;wBACxC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,iBAAiB,CAAC,OAAO,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;qBAC5F;oBACD,MAAM;iBACT;gBAED;oBACI,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;aACvD;QACL,CAAC,CAAC;QAEe,kBAAa,GAAG,CAAC,IAAuC,EAAE,EAAE;YACzE,IAAI,IAAI,CAAC,SAAS,oBAAoC,EAAE;gBACpD,IAAI,KAAK,GAAa,EAAE,CAAC;gBAEzB,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE;oBAC1C,MAAM,MAAM,GAAG,OAA6B,CAAC;oBAC7C,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;wBAC7B,0EAA0E;wBAC1E,KAAK,GAAG,KAAK,CAAC,MAAM,CAChB,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC;6BACzB,IAAI,CAAC,CAAC,CAAC;6BACP,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CACnD,CAAC;qBACL;iBACJ;gBAED,4FAA4F;gBAC5F,+EAA+E;gBAC/E,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;gBAEpC,kGAAkG;gBAClG,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE;oBACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;iBACjC;aACJ;QACL,CAAC,CAAC;QAxOE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC;QAC3C,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,aAAa,CAAC;IAC3D,CAAC;IAEM,MAAM,CAAC,KAAa,EAAE,MAAc;QACvC,OAAO,IAAI,CAAC,kBAAkB,CAC1B,KAAK,EACL,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,CAAC;IAEM,cAAc,CAAC,OAAiB,EAAE,MAAc;QACnD,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAEhD,OAAO;YACH,EAAE,EAAE,IAAI,CAAC,8BAA8B,CAC/B,IAAI,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,EAC3E,QAAQ,CAAC;YACjB,QAAQ;SACX,CAAC;IACN,CAAC;IAEM,MAAM,CAAC,KAAa,EAAE,MAAc;QACvC,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;IACxD,CAAC;IAEM,cAAc,CAAC,GAAW;QAC7B,MAAM,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAE1G,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IAEM,kBAAkB,CAAC,GAAW;QACjC,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE;YACvB,OAAO,MAAM,CAAC;SACjB;QAED,IAAI,CAAC,YAAY,CACb,CAAC,OAAO,EAAE,EAAE;YACR,MAAM,MAAM,GAAG,OAA6B,CAAC;YAC7C,MAAM,CAAC,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC;QAChB,CAAC,EACD,GAAG,EACH,GAAG,GAAG,CAAC;QACP,YAAY,CAAC,SAAS;QACtB,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAE5B,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAExC,OAAO,MAAM,CAAC;IAClB,CAAC;IAEM,cAAc,CAAC,GAAW,EAAE,OAAe,EAAE,QAAgB;QAChE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAExF,sGAAsG;QACtG,qGAAqG;QACrG,gDAAgD;QAChD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE;YAC3D,OAAO,SAAS,CAAC;SACpB;QAED,oEAAoE;QACpE,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,MAAO,CAAC;IAC/C,CAAC;IAEM,gBAAgB,CAAC,MAAc,EAAE,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ;QACnF,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EACnD,KAAK,CAAC,+FAA+F,CAAC,CAAC;QAE3G,6FAA6F;QAC7F,+FAA+F;QAC/F,gGAAgG;QAChG,EAAE;QACF,8FAA8F;QAC9F,+FAA+F;QAC/F,kGAAkG;QAClG,6CAA6C;QAC7C,EAAE;QACF,kGAAkG;QAClG,6CAA6C;QAC7C,IAAI,iBAAsC,CAAC;QAC3C,IAAI,gBAAwB,CAAC;QAE7B,IAAI,CAAC,SAAS,CAAC,eAAe,CAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,EACnB,CAAC,OAAO,EAAE,EAAE;YACR,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,OAA6B,CAAC;YAE9D,0CAA0C;YAC1C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;gBACvB,OAAO,IAAI,CAAC;aACf;YAED,MAAM,GAAG,GAAG,KAAK,GAAG,YAAY,CAAC;YAEjC,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,GAAG,GAAG,EAAE;gBACjC,iBAAiB,GAAG,OAA6B,CAAC;gBAClD,gBAAgB,GAAG,MAAM,GAAG,KAAK,CAAC;gBAClC,OAAO,KAAK,CAAC;aAChB;YAED,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;QAEP,2FAA2F;QAC3F,0FAA0F;QAC1F,kCAAkC;QAClC,EAAE;QACF,6FAA6F;QAC7F,2FAA2F;QAC3F,6BAA6B;QAE7B,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAE7G,+FAA+F;QAC/F,+FAA+F;QAC/F,+BAA+B;QAE/B,mCAAmC;QACnC,sHAAsH;QACtH,OAAO,IAAI,CAAC,yBAAyB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG,gBAAiB,CAAC;IAC3F,CAAC;IAED,yDAAyD;IAClD,SAAS,CAAC,OAA+B,EAAE,MAAoB,EAAE,UAA4B;QAEhG,MAAM,OAAO,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACzC,OAAO,CAAC,YAAY,4BAAwB,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,CAAA,EAAE,CAAC,CAAC,CAAC;QAChH,OAAO,CAAC,OAAO,kCAA2B,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9G,OAAO,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,CAAC;IAEM,KAAK,CAAC,IAAI,CACb,OAA+B,EAC/B,OAA+B,EAC/B,UAA4B;QAE5B,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,OAAO,mCAA4B,UAAU,CAAC,CAAC;QAE7F,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAQ,eAAe,CAAC,CAAC;QAE5D,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,sBAAsB,CAAC,OAAO,4BAAwB,EAAE,UAAU,CAAC,CAAC;IACvG,CAAC;IA0FM,QAAQ;QACX,MAAM,CAAC,GAAa,EAAE,CAAC;QAEvB,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE;YAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { IFluidDataStoreRuntime, IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ITelemetryBaseLogger } from \"@fluidframework/common-definitions\";\nimport {\n BaseSegment,\n ISegment,\n LocalReferenceCollection,\n Client,\n IMergeTreeDeltaOpArgs,\n IMergeTreeDeltaCallbackArgs,\n MergeTreeDeltaType,\n IMergeTreeMaintenanceCallbackArgs,\n MergeTreeMaintenanceType,\n LocalReference,\n ReferenceType,\n} from \"@fluidframework/merge-tree\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ObjectStoragePartition, SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { HandleTable, Handle, isHandleValid } from \"./handletable\";\nimport { deserializeBlob } from \"./serialization\";\nimport { HandleCache } from \"./handlecache\";\nimport { VectorUndoProvider } from \"./undoprovider\";\n\nconst enum SnapshotPath {\n segments = \"segments\",\n handleTable = \"handleTable\",\n}\n\ntype PermutationSegmentSpec = [number, number];\n\nexport class PermutationSegment extends BaseSegment {\n public static readonly typeString: string = \"PermutationSegment\";\n private _start = Handle.unallocated;\n\n public static fromJSONObject(spec: any) {\n const [length, start] = spec as PermutationSegmentSpec;\n return new PermutationSegment(length, start);\n }\n\n public readonly type = PermutationSegment.typeString;\n\n constructor(length: number, start = Handle.unallocated) {\n super();\n this._start = start;\n this.cachedLength = length;\n }\n\n public get start() { return this._start; }\n public set start(value: Handle) {\n assert(this._start === Handle.unallocated, 0x024 /* \"Start of PermutationSegment already allocated!\" */);\n assert(isHandleValid(value), 0x025 /* \"Trying to set start of PermutationSegment to invalid handle!\" */);\n\n this._start = value;\n }\n\n /**\n * Invoked by '_undoRow/ColRemove' to prepare the newly inserted destination\n * segment to serve as the replacement for this removed segment. This moves handle\n * allocations from this segment to the replacement as well as maintains tracking\n * groups for the undo/redo stack.\n */\n public transferToReplacement(destination: PermutationSegment) {\n // When this segment was removed, it may have been split from a larger original\n // segment. In this case, it will have been added to an undo/redo tracking group\n // that associates all of the fragments from the original insertion.\n //\n // Move this association from the this removed segment to its replacement so that\n // it is included if the undo stack continues to unwind to the original insertion.\n //\n // Out of paranoia we link and unlink in separate loops to avoid mutating the underlying\n // set during enumeration. In pratice, this is unlikely to matter since there should be\n // exactly 0 or 1 items in the enumeration.\n for (const group of this.trackingCollection.trackingGroups) {\n group.link(destination);\n }\n for (const group of this.trackingCollection.trackingGroups) {\n group.unlink(this);\n }\n\n // Move handle allocations from this segment to its replacement.\n destination._start = this._start;\n this.reset();\n }\n\n public reset() {\n this._start = Handle.unallocated;\n }\n\n public toJSONObject() {\n return [this.cachedLength, this.start];\n }\n\n public clone(start = 0, end = this.cachedLength) {\n const b = new PermutationSegment(\n /* length: */ end - start,\n /* start: */ this.start + start);\n this.cloneInto(b);\n return b;\n }\n\n public canAppend(segment: ISegment) {\n const asPerm = segment as PermutationSegment;\n\n return this.start === Handle.unallocated\n ? asPerm.start === Handle.unallocated\n : asPerm.start === this.start + this.cachedLength;\n }\n\n public append(segment: ISegment) {\n // Note: Must call 'LocalReferenceCollection.append(..)' before modifying this segment's length as\n // 'this.cachedLength' is used to adjust the offsets of the local refs.\n LocalReferenceCollection.append(this, segment);\n\n this.cachedLength += segment.cachedLength;\n }\n\n protected createSplitSegmentAt(pos: number) {\n assert(0 < pos && pos < this.cachedLength, 0x026 /* \"Trying to split segment at out-of-bounds position!\" */);\n\n const leafSegment = new PermutationSegment(\n /* length: */ this.cachedLength - pos,\n /* start: */ this.start === Handle.unallocated\n ? Handle.unallocated\n : this.start + pos);\n\n this.cachedLength = pos;\n\n return leafSegment;\n }\n\n public toString() {\n return this.start === Handle.unallocated\n ? `<${this.cachedLength} empty>`\n : `<${this.cachedLength}: ${this.start}..${this.start + this.cachedLength - 1}>`;\n }\n}\n\nexport class PermutationVector extends Client {\n private handleTable = new HandleTable<never>(); // Tracks available storage handles for rows.\n public readonly handleCache = new HandleCache(this);\n public undo: VectorUndoProvider | undefined;\n\n constructor(\n path: string,\n logger: ITelemetryBaseLogger,\n runtime: IFluidDataStoreRuntime,\n private readonly deltaCallback: (position: number, numRemoved: number, numInserted: number) => void,\n private readonly handlesRecycledCallback: (handles: Handle[]) => void,\n ) {\n super(\n PermutationSegment.fromJSONObject,\n ChildLogger.create(logger, `Matrix.${path}.MergeTreeClient`), {\n ...runtime.options,\n newMergeTreeSnapshotFormat: true, // Temporarily force new snapshot format until it is the default.\n }); // (See https://github.com/microsoft/FluidFramework/issues/84)\n\n this.mergeTreeDeltaCallback = this.onDelta;\n this.mergeTreeMaintenanceCallback = this.onMaintenance;\n }\n\n public insert(start: number, length: number) {\n return this.insertSegmentLocal(\n start,\n new PermutationSegment(length));\n }\n\n public insertRelative(segment: ISegment, length: number) {\n const inserted = new PermutationSegment(length);\n\n return {\n op: this.insertAtReferencePositionLocal(\n new LocalReference(this, segment, /* offset: */ 0, ReferenceType.Transient),\n inserted),\n inserted,\n };\n }\n\n public remove(start: number, length: number) {\n return this.removeRangeLocal(start, start + length);\n }\n\n public getMaybeHandle(pos: number): Handle {\n assert(0 <= pos && pos < this.getLength(), 0x027 /* \"Trying to get handle of out-of-bounds position!\" */);\n\n return this.handleCache.getHandle(pos);\n }\n\n public getAllocatedHandle(pos: number): Handle {\n let handle = this.getMaybeHandle(pos);\n if (isHandleValid(handle)) {\n return handle;\n }\n\n this.walkSegments(\n (segment) => {\n const asPerm = segment as PermutationSegment;\n asPerm.start = handle = this.handleTable.allocate();\n return true;\n },\n pos,\n pos + 1,\n /* accum: */ undefined,\n /* splitRange: */ true);\n\n this.handleCache.addHandle(pos, handle);\n\n return handle;\n }\n\n public adjustPosition(pos: number, fromSeq: number, clientId: number) {\n const { segment, offset } = this.mergeTree.getContainingSegment(pos, fromSeq, clientId);\n\n // Note that until the MergeTree GCs, the segment is still reachable via `getContainingSegment()` with\n // a `refSeq` in the past. Prevent remote ops from accidentally allocating or using recycled handles\n // by checking for the presence of 'removedSeq'.\n if (segment === undefined || segment.removedSeq !== undefined) {\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.getPosition(segment) + offset!;\n }\n\n public handleToPosition(handle: Handle, localSeq = this.mergeTree.collabWindow.localSeq) {\n assert(localSeq <= this.mergeTree.collabWindow.localSeq,\n 0x028 /* \"'localSeq' for op being resubmitted must be <= the 'localSeq' of the last submitted op.\" */);\n\n // TODO: In theory, the MergeTree should be able to map the (position, refSeq, localSeq) from\n // the original operation to the current position for resubmitting. This is probably the\n // ideal solution, as we would no longer need to store row/col handles in the op metadata.\n //\n // Failing that, we could avoid the O(n) search below by building a temporary map in the\n // opposite direction from the handle to either it's current position or segment + offset\n // and reuse it for the duration of resubmission. (Ideally, we would know when resubmission\n // ended so we could discard this map.)\n //\n // If we find that we frequently need a reverse handle -> position lookup, we could maintain\n // one using the Tiny-Calc adjust tree.\n let containingSegment!: PermutationSegment;\n let containingOffset: number;\n\n this.mergeTree.walkAllSegments(\n this.mergeTree.root,\n (segment) => {\n const { start, cachedLength } = segment as PermutationSegment;\n\n // If the segment is unallocated, skip it.\n if (!isHandleValid(start)) {\n return true;\n }\n\n const end = start + cachedLength;\n\n if (start <= handle && handle < end) {\n containingSegment = segment as PermutationSegment;\n containingOffset = handle - start;\n return false;\n }\n\n return true;\n });\n\n // We are guaranteed to find the handle in the PermutationVector, even if the corresponding\n // row/col has been removed, because handles are not recycled until the containing segment\n // is unlinked from the MergeTree.\n //\n // Therefore, either a row/col removal has been ACKed, in which case there will be no pending\n // ops that reference the stale handle, or the removal is unACKed, in which case the handle\n // has not yet been recycled.\n\n assert(isHandleValid(containingSegment.start), 0x029 /* \"Invalid handle at start of containing segment!\" */);\n\n // Once we know the current position of the handle, we can use the MergeTree to get the segment\n // containing this position and use 'findReconnectionPosition' to adjust for the local ops that\n // have not yet been submitted.\n\n // eslint-disable-next-line max-len\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion\n return this.findReconnectionPostition(containingSegment, localSeq) + containingOffset!;\n }\n\n // Constructs an ISummaryTreeWithStats for the cell data.\n public summarize(runtime: IFluidDataStoreRuntime, handle: IFluidHandle, serializer: IFluidSerializer):\n ISummaryTreeWithStats {\n const builder = new SummaryTreeBuilder();\n builder.addWithStats(SnapshotPath.segments, super.summarize(runtime, handle, serializer, /* catchUpMsgs: */[]));\n builder.addBlob(SnapshotPath.handleTable, serializer.stringify(this.handleTable.getSummaryContent(), handle));\n return builder.getSummaryTree();\n }\n\n public async load(\n runtime: IFluidDataStoreRuntime,\n storage: IChannelStorageService,\n serializer: IFluidSerializer,\n ) {\n const handleTableData = await deserializeBlob(storage, SnapshotPath.handleTable, serializer);\n\n this.handleTable = HandleTable.load<never>(handleTableData);\n\n return super.load(runtime, new ObjectStoragePartition(storage, SnapshotPath.segments), serializer);\n }\n\n private readonly onDelta = (\n opArgs: IMergeTreeDeltaOpArgs,\n { operation, deltaSegments }: IMergeTreeDeltaCallbackArgs,\n ) => {\n // Apply deltas in descending order to prevent positions from shifting.\n const ranges = deltaSegments\n .map(({ segment }) => ({\n segment: segment as PermutationSegment,\n position: this.getPosition(segment),\n }))\n .sort((left, right) => left.position - right.position);\n\n const isLocal = opArgs.sequencedMessage === undefined;\n\n // Notify the undo provider, if any is attached.\n if (this.undo !== undefined && isLocal) {\n this.undo.record(operation, ranges);\n }\n\n switch (operation) {\n case MergeTreeDeltaType.INSERT:\n // Pass 1: Perform any internal maintenance first to avoid reentrancy.\n for (const { segment, position } of ranges) {\n // HACK: We need to include the allocated handle in the segment's JSON reperesntation\n // for snapshots, but need to ignore the remote client's handle allocations when\n // processing remote ops.\n segment.reset();\n\n this.handleCache.itemsChanged(\n position,\n /* deleteCount: */ 0,\n /* insertCount: */ segment.cachedLength);\n }\n\n // Pass 2: Notify the 'deltaCallback', which may involve callbacks into user code.\n for (const { segment, position } of ranges) {\n this.deltaCallback(position, /* numRemoved: */ 0, /* numInserted: */ segment.cachedLength);\n }\n break;\n\n case MergeTreeDeltaType.REMOVE: {\n // Pass 1: Perform any internal maintenance first to avoid reentrancy.\n for (const { segment, position } of ranges) {\n this.handleCache.itemsChanged(\n position, /* deleteCount: */\n segment.cachedLength,\n /* insertCount: */ 0);\n }\n\n // Pass 2: Notify the 'deltaCallback', which may involve callbacks into user code.\n for (const { segment, position } of ranges) {\n this.deltaCallback(position, /* numRemoved: */ segment.cachedLength, /* numInsert: */ 0);\n }\n break;\n }\n\n default:\n throw new Error(\"Unhandled MergeTreeDeltaType\");\n }\n };\n\n private readonly onMaintenance = (args: IMergeTreeMaintenanceCallbackArgs) => {\n if (args.operation === MergeTreeMaintenanceType.UNLINK) {\n let freed: number[] = [];\n\n for (const { segment } of args.deltaSegments) {\n const asPerm = segment as PermutationSegment;\n if (isHandleValid(asPerm.start)) {\n // Note: Using the spread operator with `.splice()` can exhaust the stack.\n freed = freed.concat(\n new Array(asPerm.cachedLength)\n .fill(0)\n .map((value, index) => index + asPerm.start),\n );\n }\n }\n\n // Notify matrix that handles are about to be freed. The matrix is responsible for clearing\n // the rows/cols prior to free to ensure recycled row/cols are initially empty.\n this.handlesRecycledCallback(freed);\n\n // Now that the physical storage has been cleared, add the recycled handles back to the free pool.\n for (const handle of freed) {\n this.handleTable.free(handle);\n }\n }\n };\n\n public toString() {\n const s: string[] = [];\n\n this.walkSegments((segment) => {\n s.push(`${segment}`);\n return true;\n });\n\n return s.join(\"\");\n }\n}\n"]}
|
package/lib/serialization.d.ts
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { Serializable, IChannelStorageService } from "@fluidframework/datastore-definitions";
|
|
6
6
|
import { BlobTreeEntry } from "@fluidframework/protocol-base";
|
|
7
|
-
import { IFluidHandle
|
|
7
|
+
import { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
8
|
+
import { IFluidSerializer } from "@fluidframework/shared-object-base";
|
|
8
9
|
export declare const serializeBlob: (handle: IFluidHandle, path: string, snapshot: Serializable, serializer: IFluidSerializer) => BlobTreeEntry;
|
|
9
10
|
export declare function deserializeBlob(storage: IChannelStorageService, path: string, serializer: IFluidSerializer): Promise<any>;
|
|
10
11
|
//# sourceMappingURL=serialization.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../src/serialization.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../src/serialization.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAGtE,eAAO,MAAM,aAAa,WACd,YAAY,QACd,MAAM,YACF,YAAY,cACV,gBAAgB,kBACoC,CAAC;AAErE,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,gBAKhH"}
|
package/lib/serialization.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialization.js","sourceRoot":"","sources":["../src/serialization.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"serialization.js","sourceRoot":"","sources":["../src/serialization.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAG9D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,CAAC,MAAM,aAAa,GAAG,CACzB,MAAoB,EACpB,IAAY,EACZ,QAAsB,EACtB,UAA4B,EAC9B,EAAE,CAAC,IAAI,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA+B,EAAE,IAAY,EAAE,UAA4B;IAC7G,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,+DAA+D;IAC/D,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Serializable, IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { BlobTreeEntry } from \"@fluidframework/protocol-base\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { bufferToString } from \"@fluidframework/common-utils\";\n\nexport const serializeBlob = (\n handle: IFluidHandle,\n path: string,\n snapshot: Serializable,\n serializer: IFluidSerializer,\n) => new BlobTreeEntry(path, serializer.stringify(snapshot, handle));\n\nexport async function deserializeBlob(storage: IChannelStorageService, path: string, serializer: IFluidSerializer) {\n const blob = await storage.readBlob(path);\n const utf8 = bufferToString(blob, \"utf8\");\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return serializer.parse(utf8);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/matrix",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.55.0-48551",
|
|
4
4
|
"description": "Distributed matrix",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": "https://github.com/microsoft/FluidFramework",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"ci:build:docs": "api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/",
|
|
26
26
|
"clean": "rimraf dist lib bench/dist *.tsbuildinfo *.build.log",
|
|
27
27
|
"eslint": "eslint --format stylish src",
|
|
28
|
-
"eslint:fix": "eslint --format stylish src --fix",
|
|
28
|
+
"eslint:fix": "eslint --format stylish src --fix --fix-type problem,suggestion,layout",
|
|
29
29
|
"lint": "npm run eslint",
|
|
30
30
|
"lint:fix": "npm run eslint:fix",
|
|
31
31
|
"stress": "mocha --recursive dist/test/**/*.spec.js --exit -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict --fgrep stress-loop",
|
|
@@ -57,39 +57,40 @@
|
|
|
57
57
|
"@fluidframework/common-definitions": "^0.20.1",
|
|
58
58
|
"@fluidframework/common-utils": "^0.32.1",
|
|
59
59
|
"@fluidframework/core-interfaces": "^0.41.0",
|
|
60
|
-
"@fluidframework/datastore-definitions": "
|
|
61
|
-
"@fluidframework/merge-tree": "
|
|
60
|
+
"@fluidframework/datastore-definitions": "0.55.0-48551",
|
|
61
|
+
"@fluidframework/merge-tree": "0.55.0-48551",
|
|
62
62
|
"@fluidframework/protocol-base": "^0.1034.0",
|
|
63
63
|
"@fluidframework/protocol-definitions": "^0.1026.0",
|
|
64
|
-
"@fluidframework/runtime-definitions": "
|
|
65
|
-
"@fluidframework/runtime-utils": "
|
|
66
|
-
"@fluidframework/shared-object-base": "
|
|
67
|
-
"@fluidframework/telemetry-utils": "
|
|
64
|
+
"@fluidframework/runtime-definitions": "0.55.0-48551",
|
|
65
|
+
"@fluidframework/runtime-utils": "0.55.0-48551",
|
|
66
|
+
"@fluidframework/shared-object-base": "0.55.0-48551",
|
|
67
|
+
"@fluidframework/telemetry-utils": "0.55.0-48551",
|
|
68
68
|
"@tiny-calc/nano": "0.0.0-alpha.5",
|
|
69
69
|
"tslib": "^1.10.0"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
|
-
"@fluid-internal/test-dds-utils": "
|
|
72
|
+
"@fluid-internal/test-dds-utils": "0.55.0-48551",
|
|
73
73
|
"@fluidframework/build-common": "^0.23.0",
|
|
74
|
-
"@fluidframework/eslint-config-fluid": "^0.
|
|
75
|
-
"@fluidframework/mocha-test-setup": "
|
|
76
|
-
"@fluidframework/test-runtime-utils": "
|
|
74
|
+
"@fluidframework/eslint-config-fluid": "^0.25.0-0",
|
|
75
|
+
"@fluidframework/mocha-test-setup": "0.55.0-48551",
|
|
76
|
+
"@fluidframework/test-runtime-utils": "0.55.0-48551",
|
|
77
77
|
"@microsoft/api-extractor": "^7.16.1",
|
|
78
|
+
"@rushstack/eslint-config": "^2.5.1",
|
|
78
79
|
"@tiny-calc/micro": "0.0.0-alpha.5",
|
|
79
80
|
"@types/mocha": "^8.2.2",
|
|
80
|
-
"@typescript-eslint/eslint-plugin": "~
|
|
81
|
-
"@typescript-eslint/parser": "~
|
|
81
|
+
"@typescript-eslint/eslint-plugin": "~5.9.0",
|
|
82
|
+
"@typescript-eslint/parser": "~5.9.0",
|
|
82
83
|
"best-random": "^1.0.0",
|
|
83
84
|
"concurrently": "^6.2.0",
|
|
84
85
|
"copyfiles": "^2.1.0",
|
|
85
86
|
"cross-env": "^7.0.2",
|
|
86
|
-
"eslint": "~
|
|
87
|
+
"eslint": "~8.6.0",
|
|
88
|
+
"eslint-plugin-editorconfig": "~3.2.0",
|
|
87
89
|
"eslint-plugin-eslint-comments": "~3.2.0",
|
|
88
|
-
"eslint-plugin-import": "~2.
|
|
90
|
+
"eslint-plugin-import": "~2.25.4",
|
|
89
91
|
"eslint-plugin-no-null": "~1.0.2",
|
|
90
|
-
"eslint-plugin-
|
|
91
|
-
"eslint-plugin-
|
|
92
|
-
"eslint-plugin-unicorn": "~26.0.1",
|
|
92
|
+
"eslint-plugin-react": "~7.28.0",
|
|
93
|
+
"eslint-plugin-unicorn": "~40.0.0",
|
|
93
94
|
"hotloop": "^1.2.0",
|
|
94
95
|
"mocha": "^8.4.0",
|
|
95
96
|
"nyc": "^15.0.0",
|
package/src/handletable.ts
CHANGED
package/src/matrix.ts
CHANGED
|
@@ -4,13 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { assert } from "@fluidframework/common-utils";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
FileMode,
|
|
10
|
-
ISequencedDocumentMessage,
|
|
11
|
-
ITree,
|
|
12
|
-
TreeEntry,
|
|
13
|
-
} from "@fluidframework/protocol-definitions";
|
|
7
|
+
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
14
8
|
import {
|
|
15
9
|
IFluidDataStoreRuntime,
|
|
16
10
|
IChannelStorageService,
|
|
@@ -18,13 +12,14 @@ import {
|
|
|
18
12
|
IChannelAttributes,
|
|
19
13
|
} from "@fluidframework/datastore-definitions";
|
|
20
14
|
import {
|
|
15
|
+
IFluidSerializer,
|
|
21
16
|
makeHandlesSerializable,
|
|
22
17
|
parseHandles,
|
|
23
18
|
SharedObject,
|
|
24
19
|
SummarySerializer,
|
|
25
20
|
} from "@fluidframework/shared-object-base";
|
|
26
|
-
import {
|
|
27
|
-
import { ObjectStoragePartition } from "@fluidframework/runtime-utils";
|
|
21
|
+
import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
|
|
22
|
+
import { ObjectStoragePartition, SummaryTreeBuilder } from "@fluidframework/runtime-utils";
|
|
28
23
|
import {
|
|
29
24
|
IMatrixProducer,
|
|
30
25
|
IMatrixConsumer,
|
|
@@ -37,7 +32,7 @@ import { PermutationVector, PermutationSegment } from "./permutationvector";
|
|
|
37
32
|
import { SparseArray2D } from "./sparsearray2d";
|
|
38
33
|
import { SharedMatrixFactory } from "./runtime";
|
|
39
34
|
import { Handle, isHandleValid } from "./handletable";
|
|
40
|
-
import { deserializeBlob
|
|
35
|
+
import { deserializeBlob } from "./serialization";
|
|
41
36
|
import { ensureRange } from "./range";
|
|
42
37
|
import { IUndoConsumer } from "./types";
|
|
43
38
|
import { MatrixUndoProvider } from "./undoprovider";
|
|
@@ -429,58 +424,28 @@ export class SharedMatrix<T = any>
|
|
|
429
424
|
}
|
|
430
425
|
}
|
|
431
426
|
|
|
432
|
-
protected
|
|
433
|
-
const
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
mode: FileMode.Directory,
|
|
443
|
-
path: SnapshotPath.cols,
|
|
444
|
-
type: TreeEntry.Tree,
|
|
445
|
-
value: this.cols.snapshot(this.runtime, this.handle, serializer),
|
|
446
|
-
},
|
|
447
|
-
serializeBlob(
|
|
448
|
-
this.handle,
|
|
449
|
-
SnapshotPath.cells,
|
|
450
|
-
[
|
|
451
|
-
this.cells.snapshot(),
|
|
452
|
-
this.pending.snapshot(),
|
|
453
|
-
],
|
|
454
|
-
serializer),
|
|
455
|
-
],
|
|
456
|
-
};
|
|
457
|
-
|
|
458
|
-
return tree;
|
|
427
|
+
protected summarizeCore(serializer: IFluidSerializer, fullTree: boolean): ISummaryTreeWithStats {
|
|
428
|
+
const builder = new SummaryTreeBuilder();
|
|
429
|
+
builder.addWithStats(SnapshotPath.rows, this.rows.summarize(this.runtime, this.handle, serializer));
|
|
430
|
+
builder.addWithStats(SnapshotPath.cols, this.cols.summarize(this.runtime, this.handle, serializer));
|
|
431
|
+
builder.addBlob(SnapshotPath.cells,
|
|
432
|
+
serializer.stringify([
|
|
433
|
+
this.cells.snapshot(),
|
|
434
|
+
this.pending.snapshot(),
|
|
435
|
+
], this.handle));
|
|
436
|
+
return builder.getSummaryTree();
|
|
459
437
|
}
|
|
460
438
|
|
|
461
439
|
/**
|
|
462
|
-
*
|
|
463
|
-
* objects.
|
|
440
|
+
* Runs serializer on the GC data for this SharedMatrix.
|
|
441
|
+
* All the IFluidHandle's stored in the cells represent routes to other objects.
|
|
464
442
|
*/
|
|
465
|
-
protected
|
|
466
|
-
// Create a SummarySerializer and use it to serialize all the cells. It keeps track of all IFluidHandles that it
|
|
467
|
-
// serializes.
|
|
468
|
-
const serializer = new SummarySerializer(
|
|
469
|
-
this.runtime.channelsRoutingContext,
|
|
470
|
-
(handle: IFluidHandle) => this.handleDecoded(handle),
|
|
471
|
-
);
|
|
472
|
-
|
|
443
|
+
protected processGCDataCore(serializer: SummarySerializer) {
|
|
473
444
|
for (let row = 0; row < this.rowCount; row++) {
|
|
474
445
|
for (let col = 0; col < this.colCount; col++) {
|
|
475
446
|
serializer.stringify(this.getCell(row, col), this.handle);
|
|
476
447
|
}
|
|
477
448
|
}
|
|
478
|
-
|
|
479
|
-
return {
|
|
480
|
-
gcNodes:{
|
|
481
|
-
["/"]: serializer.getSerializedRoutes(),
|
|
482
|
-
},
|
|
483
|
-
};
|
|
484
449
|
}
|
|
485
450
|
|
|
486
451
|
/**
|
package/src/packageVersion.ts
CHANGED
package/src/permutationvector.ts
CHANGED
|
@@ -20,11 +20,12 @@ import {
|
|
|
20
20
|
LocalReference,
|
|
21
21
|
ReferenceType,
|
|
22
22
|
} from "@fluidframework/merge-tree";
|
|
23
|
-
import { IFluidHandle
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
23
|
+
import { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
24
|
+
import { IFluidSerializer } from "@fluidframework/shared-object-base";
|
|
25
|
+
import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
|
|
26
|
+
import { ObjectStoragePartition, SummaryTreeBuilder } from "@fluidframework/runtime-utils";
|
|
26
27
|
import { HandleTable, Handle, isHandleValid } from "./handletable";
|
|
27
|
-
import {
|
|
28
|
+
import { deserializeBlob } from "./serialization";
|
|
28
29
|
import { HandleCache } from "./handlecache";
|
|
29
30
|
import { VectorUndoProvider } from "./undoprovider";
|
|
30
31
|
|
|
@@ -281,23 +282,18 @@ export class PermutationVector extends Client {
|
|
|
281
282
|
// containing this position and use 'findReconnectionPosition' to adjust for the local ops that
|
|
282
283
|
// have not yet been submitted.
|
|
283
284
|
|
|
284
|
-
// eslint-disable-next-line
|
|
285
|
+
// eslint-disable-next-line max-len
|
|
286
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion
|
|
285
287
|
return this.findReconnectionPostition(containingSegment, localSeq) + containingOffset!;
|
|
286
288
|
}
|
|
287
289
|
|
|
288
|
-
// Constructs an
|
|
289
|
-
public
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
type: TreeEntry.Tree,
|
|
296
|
-
value: super.snapshot(runtime, handle, serializer, /* catchUpMsgs: */[]),
|
|
297
|
-
},
|
|
298
|
-
serializeBlob(handle, SnapshotPath.handleTable, this.handleTable.snapshot(), serializer),
|
|
299
|
-
],
|
|
300
|
-
};
|
|
290
|
+
// Constructs an ISummaryTreeWithStats for the cell data.
|
|
291
|
+
public summarize(runtime: IFluidDataStoreRuntime, handle: IFluidHandle, serializer: IFluidSerializer):
|
|
292
|
+
ISummaryTreeWithStats {
|
|
293
|
+
const builder = new SummaryTreeBuilder();
|
|
294
|
+
builder.addWithStats(SnapshotPath.segments, super.summarize(runtime, handle, serializer, /* catchUpMsgs: */[]));
|
|
295
|
+
builder.addBlob(SnapshotPath.handleTable, serializer.stringify(this.handleTable.getSummaryContent(), handle));
|
|
296
|
+
return builder.getSummaryTree();
|
|
301
297
|
}
|
|
302
298
|
|
|
303
299
|
public async load(
|
package/src/serialization.ts
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
|
|
6
6
|
import { Serializable, IChannelStorageService } from "@fluidframework/datastore-definitions";
|
|
7
7
|
import { BlobTreeEntry } from "@fluidframework/protocol-base";
|
|
8
|
-
import { IFluidHandle
|
|
8
|
+
import { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
9
|
+
import { IFluidSerializer } from "@fluidframework/shared-object-base";
|
|
9
10
|
import { bufferToString } from "@fluidframework/common-utils";
|
|
10
11
|
|
|
11
12
|
export const serializeBlob = (
|