@fluidframework/matrix 1.3.0 → 2.0.0-dev.1.4.5.105745
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 +8 -22
- package/.mocharc.js +12 -0
- package/dist/handlecache.d.ts +1 -1
- package/dist/handlecache.js +1 -1
- package/dist/handlecache.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.map +1 -1
- package/dist/permutationvector.js +1 -1
- package/dist/permutationvector.js.map +1 -1
- package/lib/handlecache.d.ts +1 -1
- package/lib/handlecache.js +1 -1
- package/lib/handlecache.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.map +1 -1
- package/lib/permutationvector.js +2 -2
- package/lib/permutationvector.js.map +1 -1
- package/package.json +23 -21
- package/src/handlecache.ts +1 -1
- package/src/packageVersion.ts +1 -1
- package/src/permutationvector.ts +1 -2
package/.eslintrc.js
CHANGED
|
@@ -4,28 +4,14 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
module.exports = {
|
|
7
|
-
extends: [
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
"extends": [
|
|
8
|
+
require.resolve("@fluidframework/eslint-config-fluid")
|
|
9
|
+
],
|
|
10
|
+
"parserOptions": {
|
|
11
|
+
"project": ["./tsconfig.json", "./src/test/tsconfig.json"]
|
|
10
12
|
},
|
|
11
|
-
rules: {
|
|
13
|
+
"rules": {
|
|
12
14
|
"@typescript-eslint/no-shadow": "off",
|
|
13
15
|
"space-before-function-paren": "off", // Off because it conflicts with typescript-formatter
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
"import/no-nodejs-modules": ["error", { allow: ["events"] }],
|
|
17
|
-
},
|
|
18
|
-
overrides: [
|
|
19
|
-
{
|
|
20
|
-
// Rules only for test files
|
|
21
|
-
files: ["*.spec.ts", "src/test/**"],
|
|
22
|
-
rules: {
|
|
23
|
-
// Test files are run in node only so additional node libraries can be used.
|
|
24
|
-
"import/no-nodejs-modules": [
|
|
25
|
-
"error",
|
|
26
|
-
{ allow: ["assert", "events"] },
|
|
27
|
-
],
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
],
|
|
31
|
-
};
|
|
16
|
+
}
|
|
17
|
+
}
|
package/.mocharc.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
const getFluidTestMochaConfig = require('@fluidframework/mocha-test-setup/mocharc-common');
|
|
9
|
+
|
|
10
|
+
const packageDir = __dirname;
|
|
11
|
+
const config = getFluidTestMochaConfig(packageDir);
|
|
12
|
+
module.exports = config;
|
package/dist/handlecache.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { PermutationVector } from "./permutationvector";
|
|
|
9
9
|
* Used by PermutationVector to cache position -\> handle lookups.
|
|
10
10
|
*
|
|
11
11
|
* Perf: Possibly, this should eventually be inlined into PermutationVector itself, but
|
|
12
|
-
*
|
|
12
|
+
* so far there's no measurable perf penalty for being a separate object (node 12 x64)
|
|
13
13
|
*/
|
|
14
14
|
export declare class HandleCache implements IVectorConsumer<Handle> {
|
|
15
15
|
readonly vector: PermutationVector;
|
package/dist/handlecache.js
CHANGED
|
@@ -13,7 +13,7 @@ const range_1 = require("./range");
|
|
|
13
13
|
* Used by PermutationVector to cache position -\> handle lookups.
|
|
14
14
|
*
|
|
15
15
|
* Perf: Possibly, this should eventually be inlined into PermutationVector itself, but
|
|
16
|
-
*
|
|
16
|
+
* so far there's no measurable perf penalty for being a separate object (node 12 x64)
|
|
17
17
|
*/
|
|
18
18
|
class HandleCache {
|
|
19
19
|
constructor(vector) {
|
package/dist/handlecache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlecache.js","sourceRoot":"","sources":["../src/handlecache.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 no-bitwise */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { IVectorConsumer } from \"@tiny-calc/nano\";\nimport { Handle, isHandleValid } from \"./handletable\";\nimport { PermutationVector, PermutationSegment } from \"./permutationvector\";\nimport { ensureRange } from \"./range\";\n\n/**\n * Used by PermutationVector to cache position -\\> handle lookups.\n *\n * Perf: Possibly, this should eventually be inlined into PermutationVector itself, but\n *
|
|
1
|
+
{"version":3,"file":"handlecache.js","sourceRoot":"","sources":["../src/handlecache.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 no-bitwise */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { IVectorConsumer } from \"@tiny-calc/nano\";\nimport { Handle, isHandleValid } from \"./handletable\";\nimport { PermutationVector, PermutationSegment } from \"./permutationvector\";\nimport { ensureRange } from \"./range\";\n\n/**\n * Used by PermutationVector to cache position -\\> handle lookups.\n *\n * Perf: Possibly, this should eventually be inlined into PermutationVector itself, but\n * so far there's no measurable perf penalty for being a separate object (node 12 x64)\n */\nexport class HandleCache implements IVectorConsumer<Handle> {\n private handles: Handle[] = [];\n private start = 0;\n\n constructor(public readonly vector: PermutationVector) { }\n\n /**\n * Returns the index of the given position in the 'handles' array as a Uint32.\n * (If the position is not in the array, returns an integer greater than 'handles.length').\n */\n private getIndex(position: number) {\n return (position - this.start) >>> 0;\n }\n\n /**\n * Returns the handle currently assigned to the given 'position' (if any). Check\n * the result with 'isValidHandle(..)' to see if a handle has been allocated for\n * the given position.\n *\n * Throws a 'RangeError' if the provided 'position' is out-of-bounds wrt. the\n * PermutationVector's length.\n */\n public getHandle(position: number) {\n const index = this.getIndex(position);\n\n // Perf: To encourage inlining, handling of the 'cacheMiss(..)' case has been extracted\n // to a separate method.\n\n // Perf: A cache hit implies that 'position' was in bounds. Therefore, we can defer\n // checking that 'position' is in bounds until 'cacheMiss(..)'. This yields an\n // ~40% speedup when the position is in the cache (node v12 x64).\n\n return index < this.handles.length\n ? this.handles[index]\n : this.cacheMiss(position);\n }\n\n /** Update the cache when a handle has been allocated for a given position. */\n public addHandle(position: number, handle: Handle) {\n assert(isHandleValid(handle), 0x017 /* \"Trying to add invalid handle!\" */);\n\n const index = this.getIndex(position);\n if (index < this.handles.length) {\n assert(!isHandleValid(this.handles[index]),\n 0x018 /* \"Trying to insert handle into position with already valid handle!\" */);\n this.handles[index] = handle;\n }\n }\n\n /** Used by 'CacheMiss()' to retrieve handles for a range of positions. */\n private getHandles(start: number, end: number) {\n // TODO: This can be accelerated substantially using 'walkSegments()'. The only catch\n // is that\n\n const handles: Handle[] = [];\n const { vector } = this;\n\n for (let pos = start; pos < end; pos++) {\n const { segment, offset } = vector.getContainingSegment(pos);\n const asPerm = segment as PermutationSegment;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n handles.push(asPerm.start + offset!);\n }\n\n return handles;\n }\n\n private cacheMiss(position: number) {\n // Coercing 'position' to an Uint32 allows us to handle a negative 'position' value\n // with the same logic that handles 'position' >= length.\n const _position = position >>> 0;\n\n // TODO: To bound memory usage, there should be a limit on the maximum size of\n // handle[].\n\n // TODO: To reduce MergeTree lookups, this code should opportunistically grow\n // the cache to the next MergeTree segment boundary (within the limits of\n // the handle cache).\n\n if (_position < this.start) {\n this.handles = this.getHandles(_position, this.start).concat(this.handles);\n this.start = _position;\n return this.handles[0];\n } else {\n ensureRange(_position, this.vector.getLength());\n\n this.handles = this.handles.concat(this.getHandles(this.start + this.handles.length, _position + 1));\n return this.handles[this.handles.length - 1];\n }\n }\n\n // #region IVectorConsumer\n\n itemsChanged(start: number, removedCount: number, insertedCount: number): void {\n // If positions were inserted/removed, our current policy is to trim the array\n // at the beginning of the invalidate range and lazily repopulate the handles\n // on demand.\n //\n // Some alternatives to consider that preserve the previously cached handles\n // that are still valid:\n //\n // * Eagerly populate the 'handles[]' with the newly insert values (currently guaranteed\n // to be Handle.unallocated, so we don't even need to look them up.)\n //\n // * Use a sentinel value or other mechanism to allow \"holes\" in the cache.\n\n const index = this.getIndex(start);\n if (index < this.handles.length) {\n this.handles.length = index;\n }\n }\n\n // #endregion IVectorConsumer\n}\n"]}
|
package/dist/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/matrix";
|
|
8
|
-
export declare const pkgVersion = "1.
|
|
8
|
+
export declare const pkgVersion = "2.0.0-dev.1.4.5.105745";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,2BAA2B,CAAC;AAChD,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,2BAA2B,CAAC;AAChD,eAAO,MAAM,UAAU,2BAA2B,CAAC"}
|
package/dist/packageVersion.js
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.pkgVersion = exports.pkgName = void 0;
|
|
10
10
|
exports.pkgName = "@fluidframework/matrix";
|
|
11
|
-
exports.pkgVersion = "1.
|
|
11
|
+
exports.pkgVersion = "2.0.0-dev.1.4.5.105745";
|
|
12
12
|
//# sourceMappingURL=packageVersion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,wBAAwB,CAAC;AACnC,QAAA,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,wBAAwB,CAAC;AACnC,QAAA,UAAU,GAAG,wBAAwB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/matrix\";\nexport const pkgVersion = \"2.0.0-dev.1.4.5.105745\";\n"]}
|
|
@@ -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,
|
|
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,EAOT,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;IA0DhF,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"}
|
|
@@ -183,7 +183,7 @@ class PermutationVector extends merge_tree_1.Client {
|
|
|
183
183
|
insertRelative(segment, length) {
|
|
184
184
|
const inserted = new PermutationSegment(length);
|
|
185
185
|
return {
|
|
186
|
-
op: this.insertAtReferencePositionLocal(
|
|
186
|
+
op: this.insertAtReferencePositionLocal(this.createLocalReferencePosition(segment, 0, merge_tree_1.ReferenceType.Transient, undefined), inserted),
|
|
187
187
|
inserted,
|
|
188
188
|
};
|
|
189
189
|
}
|
|
@@ -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 } 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 practice, 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.findReconnectionPosition(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 representation\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":"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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 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 practice, 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 this.createLocalReferencePosition(segment, 0, ReferenceType.Transient, undefined),\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.findReconnectionPosition(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 representation\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/handlecache.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { PermutationVector } from "./permutationvector";
|
|
|
9
9
|
* Used by PermutationVector to cache position -\> handle lookups.
|
|
10
10
|
*
|
|
11
11
|
* Perf: Possibly, this should eventually be inlined into PermutationVector itself, but
|
|
12
|
-
*
|
|
12
|
+
* so far there's no measurable perf penalty for being a separate object (node 12 x64)
|
|
13
13
|
*/
|
|
14
14
|
export declare class HandleCache implements IVectorConsumer<Handle> {
|
|
15
15
|
readonly vector: PermutationVector;
|
package/lib/handlecache.js
CHANGED
|
@@ -10,7 +10,7 @@ import { ensureRange } from "./range";
|
|
|
10
10
|
* Used by PermutationVector to cache position -\> handle lookups.
|
|
11
11
|
*
|
|
12
12
|
* Perf: Possibly, this should eventually be inlined into PermutationVector itself, but
|
|
13
|
-
*
|
|
13
|
+
* so far there's no measurable perf penalty for being a separate object (node 12 x64)
|
|
14
14
|
*/
|
|
15
15
|
export class HandleCache {
|
|
16
16
|
constructor(vector) {
|
package/lib/handlecache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlecache.js","sourceRoot":"","sources":["../src/handlecache.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 no-bitwise */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { IVectorConsumer } from \"@tiny-calc/nano\";\nimport { Handle, isHandleValid } from \"./handletable\";\nimport { PermutationVector, PermutationSegment } from \"./permutationvector\";\nimport { ensureRange } from \"./range\";\n\n/**\n * Used by PermutationVector to cache position -\\> handle lookups.\n *\n * Perf: Possibly, this should eventually be inlined into PermutationVector itself, but\n *
|
|
1
|
+
{"version":3,"file":"handlecache.js","sourceRoot":"","sources":["../src/handlecache.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 no-bitwise */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { IVectorConsumer } from \"@tiny-calc/nano\";\nimport { Handle, isHandleValid } from \"./handletable\";\nimport { PermutationVector, PermutationSegment } from \"./permutationvector\";\nimport { ensureRange } from \"./range\";\n\n/**\n * Used by PermutationVector to cache position -\\> handle lookups.\n *\n * Perf: Possibly, this should eventually be inlined into PermutationVector itself, but\n * so far there's no measurable perf penalty for being a separate object (node 12 x64)\n */\nexport class HandleCache implements IVectorConsumer<Handle> {\n private handles: Handle[] = [];\n private start = 0;\n\n constructor(public readonly vector: PermutationVector) { }\n\n /**\n * Returns the index of the given position in the 'handles' array as a Uint32.\n * (If the position is not in the array, returns an integer greater than 'handles.length').\n */\n private getIndex(position: number) {\n return (position - this.start) >>> 0;\n }\n\n /**\n * Returns the handle currently assigned to the given 'position' (if any). Check\n * the result with 'isValidHandle(..)' to see if a handle has been allocated for\n * the given position.\n *\n * Throws a 'RangeError' if the provided 'position' is out-of-bounds wrt. the\n * PermutationVector's length.\n */\n public getHandle(position: number) {\n const index = this.getIndex(position);\n\n // Perf: To encourage inlining, handling of the 'cacheMiss(..)' case has been extracted\n // to a separate method.\n\n // Perf: A cache hit implies that 'position' was in bounds. Therefore, we can defer\n // checking that 'position' is in bounds until 'cacheMiss(..)'. This yields an\n // ~40% speedup when the position is in the cache (node v12 x64).\n\n return index < this.handles.length\n ? this.handles[index]\n : this.cacheMiss(position);\n }\n\n /** Update the cache when a handle has been allocated for a given position. */\n public addHandle(position: number, handle: Handle) {\n assert(isHandleValid(handle), 0x017 /* \"Trying to add invalid handle!\" */);\n\n const index = this.getIndex(position);\n if (index < this.handles.length) {\n assert(!isHandleValid(this.handles[index]),\n 0x018 /* \"Trying to insert handle into position with already valid handle!\" */);\n this.handles[index] = handle;\n }\n }\n\n /** Used by 'CacheMiss()' to retrieve handles for a range of positions. */\n private getHandles(start: number, end: number) {\n // TODO: This can be accelerated substantially using 'walkSegments()'. The only catch\n // is that\n\n const handles: Handle[] = [];\n const { vector } = this;\n\n for (let pos = start; pos < end; pos++) {\n const { segment, offset } = vector.getContainingSegment(pos);\n const asPerm = segment as PermutationSegment;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n handles.push(asPerm.start + offset!);\n }\n\n return handles;\n }\n\n private cacheMiss(position: number) {\n // Coercing 'position' to an Uint32 allows us to handle a negative 'position' value\n // with the same logic that handles 'position' >= length.\n const _position = position >>> 0;\n\n // TODO: To bound memory usage, there should be a limit on the maximum size of\n // handle[].\n\n // TODO: To reduce MergeTree lookups, this code should opportunistically grow\n // the cache to the next MergeTree segment boundary (within the limits of\n // the handle cache).\n\n if (_position < this.start) {\n this.handles = this.getHandles(_position, this.start).concat(this.handles);\n this.start = _position;\n return this.handles[0];\n } else {\n ensureRange(_position, this.vector.getLength());\n\n this.handles = this.handles.concat(this.getHandles(this.start + this.handles.length, _position + 1));\n return this.handles[this.handles.length - 1];\n }\n }\n\n // #region IVectorConsumer\n\n itemsChanged(start: number, removedCount: number, insertedCount: number): void {\n // If positions were inserted/removed, our current policy is to trim the array\n // at the beginning of the invalidate range and lazily repopulate the handles\n // on demand.\n //\n // Some alternatives to consider that preserve the previously cached handles\n // that are still valid:\n //\n // * Eagerly populate the 'handles[]' with the newly insert values (currently guaranteed\n // to be Handle.unallocated, so we don't even need to look them up.)\n //\n // * Use a sentinel value or other mechanism to allow \"holes\" in the cache.\n\n const index = this.getIndex(start);\n if (index < this.handles.length) {\n this.handles.length = index;\n }\n }\n\n // #endregion IVectorConsumer\n}\n"]}
|
package/lib/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/matrix";
|
|
8
|
-
export declare const pkgVersion = "1.
|
|
8
|
+
export declare const pkgVersion = "2.0.0-dev.1.4.5.105745";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,2BAA2B,CAAC;AAChD,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,2BAA2B,CAAC;AAChD,eAAO,MAAM,UAAU,2BAA2B,CAAC"}
|
package/lib/packageVersion.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,wBAAwB,CAAC;AAChD,MAAM,CAAC,MAAM,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,wBAAwB,CAAC;AAChD,MAAM,CAAC,MAAM,UAAU,GAAG,wBAAwB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/matrix\";\nexport const pkgVersion = \"2.0.0-dev.1.4.5.105745\";\n"]}
|
|
@@ -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,
|
|
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,EAOT,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;IA0DhF,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
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { assert } from "@fluidframework/common-utils";
|
|
6
6
|
import { ChildLogger } from "@fluidframework/telemetry-utils";
|
|
7
|
-
import { BaseSegment, LocalReferenceCollection, Client, MergeTreeDeltaType, MergeTreeMaintenanceType,
|
|
7
|
+
import { BaseSegment, LocalReferenceCollection, Client, MergeTreeDeltaType, MergeTreeMaintenanceType, ReferenceType, } from "@fluidframework/merge-tree";
|
|
8
8
|
import { ObjectStoragePartition, SummaryTreeBuilder } from "@fluidframework/runtime-utils";
|
|
9
9
|
import { HandleTable, isHandleValid } from "./handletable";
|
|
10
10
|
import { deserializeBlob } from "./serialization";
|
|
@@ -179,7 +179,7 @@ export class PermutationVector extends Client {
|
|
|
179
179
|
insertRelative(segment, length) {
|
|
180
180
|
const inserted = new PermutationSegment(length);
|
|
181
181
|
return {
|
|
182
|
-
op: this.insertAtReferencePositionLocal(
|
|
182
|
+
op: this.insertAtReferencePositionLocal(this.createLocalReferencePosition(segment, 0, ReferenceType.Transient, undefined), inserted),
|
|
183
183
|
inserted,
|
|
184
184
|
};
|
|
185
185
|
}
|
|
@@ -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 } 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 practice, 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.findReconnectionPosition(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 representation\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":"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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 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 practice, 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 this.createLocalReferencePosition(segment, 0, ReferenceType.Transient, undefined),\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.findReconnectionPosition(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 representation\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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/matrix",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "2.0.0-dev.1.4.5.105745",
|
|
4
4
|
"description": "Distributed matrix",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -35,6 +35,8 @@
|
|
|
35
35
|
"stress": "mocha --recursive dist/test/**/*.spec.js --exit -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict --fgrep stress-loop",
|
|
36
36
|
"test": "npm run test:mocha",
|
|
37
37
|
"test:coverage": "nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml --exit",
|
|
38
|
+
"test:memory": "mocha --config src/test/memory/.mocharc.js",
|
|
39
|
+
"test:memory-profiling:report": "mocha --config src/test/memory/.mocharc.js",
|
|
38
40
|
"test:mocha": "npm run stress -- --invert",
|
|
39
41
|
"test:mocha:verbose": "cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha",
|
|
40
42
|
"tsc": "tsc",
|
|
@@ -60,35 +62,35 @@
|
|
|
60
62
|
},
|
|
61
63
|
"dependencies": {
|
|
62
64
|
"@fluidframework/common-definitions": "^0.20.1",
|
|
63
|
-
"@fluidframework/common-utils": "^0.
|
|
64
|
-
"@fluidframework/core-interfaces": "
|
|
65
|
-
"@fluidframework/datastore-definitions": "
|
|
66
|
-
"@fluidframework/merge-tree": "
|
|
67
|
-
"@fluidframework/protocol-base": "^0.
|
|
68
|
-
"@fluidframework/protocol-definitions": "^0.
|
|
69
|
-
"@fluidframework/runtime-definitions": "
|
|
70
|
-
"@fluidframework/runtime-utils": "
|
|
71
|
-
"@fluidframework/shared-object-base": "
|
|
72
|
-
"@fluidframework/telemetry-utils": "
|
|
65
|
+
"@fluidframework/common-utils": "^1.0.0",
|
|
66
|
+
"@fluidframework/core-interfaces": "2.0.0-dev.1.4.5.105745",
|
|
67
|
+
"@fluidframework/datastore-definitions": "2.0.0-dev.1.4.5.105745",
|
|
68
|
+
"@fluidframework/merge-tree": "2.0.0-dev.1.4.5.105745",
|
|
69
|
+
"@fluidframework/protocol-base": "^0.1037.2001",
|
|
70
|
+
"@fluidframework/protocol-definitions": "^1.0.0",
|
|
71
|
+
"@fluidframework/runtime-definitions": "2.0.0-dev.1.4.5.105745",
|
|
72
|
+
"@fluidframework/runtime-utils": "2.0.0-dev.1.4.5.105745",
|
|
73
|
+
"@fluidframework/shared-object-base": "2.0.0-dev.1.4.5.105745",
|
|
74
|
+
"@fluidframework/telemetry-utils": "2.0.0-dev.1.4.5.105745",
|
|
73
75
|
"@tiny-calc/nano": "0.0.0-alpha.5",
|
|
74
|
-
"events": "^3.1.0",
|
|
75
76
|
"tslib": "^1.10.0"
|
|
76
77
|
},
|
|
77
78
|
"devDependencies": {
|
|
78
|
-
"@fluid-internal/test-dds-utils": "
|
|
79
|
-
"@
|
|
80
|
-
"@fluidframework/build-
|
|
81
|
-
"@fluidframework/
|
|
82
|
-
"@fluidframework/
|
|
83
|
-
"@fluidframework/
|
|
84
|
-
"@fluidframework/test-
|
|
79
|
+
"@fluid-internal/test-dds-utils": "2.0.0-dev.1.4.5.105745",
|
|
80
|
+
"@fluid-tools/benchmark": "^0.43.0",
|
|
81
|
+
"@fluidframework/build-common": "^1.0.0",
|
|
82
|
+
"@fluidframework/build-tools": "^0.4.4000",
|
|
83
|
+
"@fluidframework/eslint-config-fluid": "^1.0.0",
|
|
84
|
+
"@fluidframework/matrix-previous": "npm:@fluidframework/matrix@^1.0.0",
|
|
85
|
+
"@fluidframework/mocha-test-setup": "2.0.0-dev.1.4.5.105745",
|
|
86
|
+
"@fluidframework/test-runtime-utils": "2.0.0-dev.1.4.5.105745",
|
|
85
87
|
"@microsoft/api-extractor": "^7.22.2",
|
|
86
88
|
"@rushstack/eslint-config": "^2.5.1",
|
|
87
89
|
"@tiny-calc/micro": "0.0.0-alpha.5",
|
|
88
90
|
"@types/mocha": "^9.1.1",
|
|
89
91
|
"best-random": "^1.0.0",
|
|
90
92
|
"concurrently": "^6.2.0",
|
|
91
|
-
"copyfiles": "^2.1
|
|
93
|
+
"copyfiles": "^2.4.1",
|
|
92
94
|
"cross-env": "^7.0.2",
|
|
93
95
|
"eslint": "~8.6.0",
|
|
94
96
|
"hotloop": "^1.2.0",
|
|
@@ -102,7 +104,7 @@
|
|
|
102
104
|
"uuid": "^8.3.1"
|
|
103
105
|
},
|
|
104
106
|
"typeValidation": {
|
|
105
|
-
"version": "
|
|
107
|
+
"version": "2.0.0",
|
|
106
108
|
"broken": {}
|
|
107
109
|
}
|
|
108
110
|
}
|
package/src/handlecache.ts
CHANGED
|
@@ -15,7 +15,7 @@ import { ensureRange } from "./range";
|
|
|
15
15
|
* Used by PermutationVector to cache position -\> handle lookups.
|
|
16
16
|
*
|
|
17
17
|
* Perf: Possibly, this should eventually be inlined into PermutationVector itself, but
|
|
18
|
-
*
|
|
18
|
+
* so far there's no measurable perf penalty for being a separate object (node 12 x64)
|
|
19
19
|
*/
|
|
20
20
|
export class HandleCache implements IVectorConsumer<Handle> {
|
|
21
21
|
private handles: Handle[] = [];
|
package/src/packageVersion.ts
CHANGED
package/src/permutationvector.ts
CHANGED
|
@@ -17,7 +17,6 @@ import {
|
|
|
17
17
|
MergeTreeDeltaType,
|
|
18
18
|
IMergeTreeMaintenanceCallbackArgs,
|
|
19
19
|
MergeTreeMaintenanceType,
|
|
20
|
-
LocalReference,
|
|
21
20
|
ReferenceType,
|
|
22
21
|
} from "@fluidframework/merge-tree";
|
|
23
22
|
import { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
@@ -177,7 +176,7 @@ export class PermutationVector extends Client {
|
|
|
177
176
|
|
|
178
177
|
return {
|
|
179
178
|
op: this.insertAtReferencePositionLocal(
|
|
180
|
-
|
|
179
|
+
this.createLocalReferencePosition(segment, 0, ReferenceType.Transient, undefined),
|
|
181
180
|
inserted),
|
|
182
181
|
inserted,
|
|
183
182
|
};
|