@fluidframework/matrix 2.42.0 → 2.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/handlecache.js +1 -1
- package/dist/handlecache.js.map +1 -1
- package/dist/matrix.d.ts.map +1 -1
- package/dist/matrix.js +1 -1
- package/dist/matrix.js.map +1 -1
- package/dist/packageVersion.d.ts +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 +4 -3
- package/dist/permutationvector.js.map +1 -1
- package/lib/handlecache.js +1 -1
- package/lib/handlecache.js.map +1 -1
- package/lib/matrix.d.ts.map +1 -1
- package/lib/matrix.js +1 -1
- package/lib/matrix.js.map +1 -1
- package/lib/packageVersion.d.ts +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 +4 -3
- package/lib/permutationvector.js.map +1 -1
- package/package.json +20 -20
- package/src/handlecache.ts +3 -3
- package/src/matrix.ts +1 -4
- package/src/packageVersion.ts +1 -1
- package/src/permutationvector.ts +4 -3
|
@@ -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 { IFluidHandle, ITelemetryBaseLogger } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tBaseSegment,\n\tClient,\n\tIJSONSegment,\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeDeltaOpArgs,\n\tIMergeTreeMaintenanceCallbackArgs,\n\tISegment,\n\tMergeTreeDeltaType,\n\tMergeTreeMaintenanceType,\n\tsegmentIsRemoved,\n\ttype IMergeTreeInsertMsg,\n\ttype IMergeTreeRemoveMsg,\n} from \"@fluidframework/merge-tree/internal\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions/internal\";\nimport {\n\tObjectStoragePartition,\n\tSummaryTreeBuilder,\n} from \"@fluidframework/runtime-utils/internal\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport { createChildLogger } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { HandleCache } from \"./handlecache.js\";\nimport { Handle, HandleTable, isHandleValid } from \"./handletable.js\";\nimport { deserializeBlob } from \"./serialization.js\";\nimport { VectorUndoProvider } from \"./undoprovider.js\";\n\nconst enum SnapshotPath {\n\tsegments = \"segments\",\n\thandleTable = \"handleTable\",\n}\n\ntype PermutationSegmentSpec = [number, number];\n\nexport class PermutationSegment extends BaseSegment {\n\tpublic static readonly typeString: string = \"PermutationSegment\";\n\tprivate _start = Handle.unallocated;\n\n\tpublic static fromJSONObject(spec: IJSONSegment): PermutationSegment {\n\t\tconst [length, start] = spec as PermutationSegmentSpec;\n\t\treturn new PermutationSegment(length, start);\n\t}\n\n\tpublic readonly type = PermutationSegment.typeString;\n\n\tconstructor(length: number, start = Handle.unallocated) {\n\t\tsuper();\n\t\tthis._start = start;\n\t\tthis.cachedLength = length;\n\t}\n\n\tpublic get start(): Handle {\n\t\treturn this._start;\n\t}\n\tpublic set start(value: Handle) {\n\t\tassert(\n\t\t\tthis._start === Handle.unallocated,\n\t\t\t0x024 /* \"Start of PermutationSegment already allocated!\" */,\n\t\t);\n\t\tassert(\n\t\t\tisHandleValid(value),\n\t\t\t0x025 /* \"Trying to set start of PermutationSegment to invalid handle!\" */,\n\t\t);\n\n\t\tthis._start = value;\n\t}\n\n\tpublic reset(): void {\n\t\tthis._start = Handle.unallocated;\n\t}\n\n\tpublic toJSONObject(): number[] {\n\t\treturn [this.cachedLength, this.start];\n\t}\n\n\tpublic clone(start = 0, end = this.cachedLength): PermutationSegment {\n\t\tconst b = new PermutationSegment(\n\t\t\t/* length: */ end - start,\n\t\t\t/* start: */ this.start + start,\n\t\t);\n\t\tthis.cloneInto(b);\n\t\treturn b;\n\t}\n\n\tpublic canAppend(segment: ISegment): boolean {\n\t\tconst asPerm = segment as PermutationSegment;\n\n\t\treturn this.start === Handle.unallocated\n\t\t\t? asPerm.start === Handle.unallocated\n\t\t\t: asPerm.start === this.start + this.cachedLength;\n\t}\n\n\tprotected createSplitSegmentAt(pos: number): PermutationSegment {\n\t\tassert(\n\t\t\t0 < pos && pos < this.cachedLength,\n\t\t\t0x026 /* \"Trying to split segment at out-of-bounds position!\" */,\n\t\t);\n\n\t\tconst leafSegment = new PermutationSegment(\n\t\t\t/* length: */ this.cachedLength - pos,\n\t\t\t/* start: */ this.start === Handle.unallocated ? Handle.unallocated : this.start + pos,\n\t\t);\n\n\t\tthis.cachedLength = pos;\n\n\t\treturn leafSegment;\n\t}\n\n\tpublic toString(): string {\n\t\treturn this.start === Handle.unallocated\n\t\t\t? `<${this.cachedLength} empty>`\n\t\t\t: `<${this.cachedLength}: ${this.start}..${this.start + this.cachedLength - 1}>`;\n\t}\n}\n\n// eslint-disable-next-line import/no-deprecated\nexport class PermutationVector extends Client {\n\tprivate handleTable = new HandleTable<never>(); // Tracks available storage handles for rows.\n\tpublic readonly handleCache = new HandleCache(this);\n\tpublic undo: VectorUndoProvider | undefined;\n\n\tconstructor(\n\t\tpath: string,\n\t\tlogger: ITelemetryBaseLogger,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tprivate readonly deltaCallback: (\n\t\t\tposition: number,\n\t\t\tnumRemoved: number,\n\t\t\tnumInserted: number,\n\t\t) => void,\n\t\tprivate readonly handlesRecycledCallback: (handles: Handle[]) => void,\n\t\tgetMinInFlightRefSeq: () => number | undefined,\n\t) {\n\t\tsuper(\n\t\t\tPermutationSegment.fromJSONObject,\n\t\t\tcreateChildLogger({ logger, namespace: `Matrix.${path}.MergeTreeClient` }),\n\t\t\t{\n\t\t\t\t...runtime.options,\n\t\t\t\tnewMergeTreeSnapshotFormat: true, // Force new snapshot format as it's generally more efficient for matrices.\n\t\t\t},\n\t\t\tgetMinInFlightRefSeq,\n\t\t);\n\n\t\tthis.on(\"delta\", this.onDelta);\n\t\tthis.on(\"maintenance\", this.onMaintenance);\n\t}\n\n\tpublic insert(start: number, length: number): IMergeTreeInsertMsg | undefined {\n\t\treturn this.insertSegmentLocal(start, new PermutationSegment(length));\n\t}\n\n\tpublic remove(start: number, length: number): IMergeTreeRemoveMsg {\n\t\treturn this.removeRangeLocal(start, start + length);\n\t}\n\n\tpublic getMaybeHandle(pos: number): Handle {\n\t\tassert(\n\t\t\t0 <= pos && pos < this.getLength(),\n\t\t\t0x027 /* \"Trying to get handle of out-of-bounds position!\" */,\n\t\t);\n\n\t\treturn this.handleCache.getHandle(pos);\n\t}\n\n\tpublic getAllocatedHandle(pos: number): Handle {\n\t\tlet handle = this.getMaybeHandle(pos);\n\t\tif (isHandleValid(handle)) {\n\t\t\treturn handle;\n\t\t}\n\n\t\tthis.walkSegments(\n\t\t\t(segment) => {\n\t\t\t\tconst asPerm = segment as PermutationSegment;\n\t\t\t\tasPerm.start = handle = this.handleTable.allocate();\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tpos,\n\t\t\tpos + 1,\n\t\t\t/* accum: */ undefined,\n\t\t\t/* splitRange: */ true,\n\t\t);\n\n\t\tthis.handleCache.addHandle(pos, handle);\n\n\t\treturn handle;\n\t}\n\n\tpublic adjustPosition(\n\t\tposToAdjust: number,\n\t\top: ISequencedDocumentMessage,\n\t): { pos: number | undefined; handle: Handle } {\n\t\tconst { segment, offset } = this.getContainingSegment<PermutationSegment>(posToAdjust, {\n\t\t\treferenceSequenceNumber: op.referenceSequenceNumber,\n\t\t\tclientId: op.clientId,\n\t\t});\n\n\t\tassert(\n\t\t\tsegment !== undefined && offset !== undefined,\n\t\t\t0xbac /* segment must be available for operations in the collab window */,\n\t\t);\n\n\t\tif (segmentIsRemoved(segment)) {\n\t\t\t// this case is tricky. the segment which the row or column data is remove\n\t\t\t// but an op before that remove references a cell. we still want to apply\n\t\t\t// the op, as the row/col could become active again in the case where\n\t\t\t// the remove was local and it get's rolled back. so we allocate a handle\n\t\t\t// for the row/col if not allocated, but don't put it in the cache\n\t\t\t// as the cache can only contain live positions.\n\t\t\tlet handle = segment.start;\n\t\t\tif (!isHandleValid(handle)) {\n\t\t\t\tthis.walkSegments(\n\t\t\t\t\t(s) => {\n\t\t\t\t\t\tconst asPerm = s as PermutationSegment;\n\t\t\t\t\t\tasPerm.start = handle = this.handleTable.allocate();\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t},\n\t\t\t\t\tposToAdjust,\n\t\t\t\t\tposToAdjust + 1,\n\t\t\t\t\t/* accum: */ undefined,\n\t\t\t\t\t/* splitRange: */ true,\n\t\t\t\t\top,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn { handle, pos: undefined };\n\t\t} else {\n\t\t\tconst pos = this.getPosition(segment) + offset;\n\t\t\treturn {\n\t\t\t\tpos,\n\t\t\t\thandle: this.getAllocatedHandle(pos),\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic handleToPosition(handle: Handle, localSeq = this.getCollabWindow().localSeq): number {\n\t\tassert(\n\t\t\tlocalSeq <= this.getCollabWindow().localSeq,\n\t\t\t0x028 /* \"'localSeq' for op being resubmitted must be <= the 'localSeq' of the last submitted op.\" */,\n\t\t);\n\n\t\t// TODO: In theory, the MergeTree should be able to map the (position, refSeq, localSeq) from\n\t\t// the original operation to the current position for undo/redo scenarios. This is probably the\n\t\t// ideal solution, as we would no longer need to store row/col handles in the op metadata.\n\t\t//\n\t\t// Failing that, we could avoid the O(n) search below by building a temporary map in the\n\t\t// opposite direction from the handle to either it's current position or segment + offset\n\t\t// and reuse it for the duration of undo/redo. (Ideally, we would know when the undo/redo\n\t\t// ended so we could discard this map.)\n\t\t//\n\t\t// If we find that we frequently need a reverse handle -> position lookup, we could maintain\n\t\t// one using the Tiny-Calc adjust tree.\n\t\tlet containingSegment!: PermutationSegment;\n\t\tlet containingOffset: number;\n\n\t\tthis.walkAllSegments((segment) => {\n\t\t\tconst { start, cachedLength } = segment as PermutationSegment;\n\n\t\t\t// If the segment is unallocated, skip it.\n\t\t\tif (!isHandleValid(start)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst end = start + cachedLength;\n\n\t\t\tif (start <= handle && handle < end) {\n\t\t\t\tcontainingSegment = segment as PermutationSegment;\n\t\t\t\tcontainingOffset = handle - start;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\n\t\t// We are guaranteed to find the handle in the PermutationVector, even if the corresponding\n\t\t// row/col has been removed, because handles are not recycled until the containing segment\n\t\t// is unlinked from the MergeTree.\n\t\t//\n\t\t// Therefore, either a row/col removal has been ACKed, in which case there will be no pending\n\t\t// ops that reference the stale handle, or the removal is unACKed, in which case the handle\n\t\t// has not yet been recycled.\n\n\t\tassert(\n\t\t\tisHandleValid(containingSegment.start),\n\t\t\t0x029 /* \"Invalid handle at start of containing segment!\" */,\n\t\t);\n\n\t\t// Once we know the current position of the handle, we can use the MergeTree to get the segment\n\t\t// containing this position and use 'findReconnectionPosition' to adjust for the local ops that\n\t\t// have not yet been submitted.\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\treturn this.findReconnectionPosition(containingSegment, localSeq) + containingOffset!;\n\t}\n\n\t// Constructs an ISummaryTreeWithStats for the cell data.\n\tpublic summarize(\n\t\truntime: IFluidDataStoreRuntime,\n\t\thandle: IFluidHandle,\n\t\tserializer: IFluidSerializer,\n\t): ISummaryTreeWithStats {\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tbuilder.addWithStats(\n\t\t\tSnapshotPath.segments,\n\t\t\tsuper.summarize(runtime, handle, serializer, /* catchUpMsgs: */ []),\n\t\t);\n\t\tbuilder.addBlob(\n\t\t\tSnapshotPath.handleTable,\n\t\t\tserializer.stringify(this.handleTable.getSummaryContent(), handle),\n\t\t);\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tstorage: IChannelStorageService,\n\t\tserializer: IFluidSerializer,\n\t): Promise<{\n\t\tcatchupOpsP: Promise<ISequencedDocumentMessage[]>;\n\t}> {\n\t\tconst handleTableData = (await deserializeBlob(\n\t\t\tstorage,\n\t\t\tSnapshotPath.handleTable,\n\t\t\tserializer,\n\t\t\t// Cast is needed since the (de)serializer returns content of type `any`.\n\t\t)) as Handle[];\n\n\t\tthis.handleTable = HandleTable.load<never>(handleTableData);\n\n\t\treturn super.load(\n\t\t\truntime,\n\t\t\tnew ObjectStoragePartition(storage, SnapshotPath.segments),\n\t\t\tserializer,\n\t\t);\n\t}\n\n\tprivate readonly onDelta = (\n\t\topArgs: IMergeTreeDeltaOpArgs,\n\t\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\t): void => {\n\t\t// Apply deltas in descending order to prevent positions from shifting.\n\t\tconst ranges = deltaArgs.deltaSegments\n\t\t\t.map(({ segment }) => ({\n\t\t\t\tsegment: segment as PermutationSegment,\n\t\t\t\tposition: this.getPosition(segment),\n\t\t\t}))\n\t\t\t.sort((left, right) => left.position - right.position);\n\n\t\tconst isLocal = opArgs.sequencedMessage === undefined;\n\n\t\t// Notify the undo provider, if any is attached.\n\t\tif (this.undo !== undefined && isLocal) {\n\t\t\tthis.undo.record(deltaArgs);\n\t\t}\n\n\t\tswitch (deltaArgs.operation) {\n\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\t// Pass 1: Perform any internal maintenance first to avoid reentrancy.\n\t\t\t\tfor (const { segment, position } of ranges) {\n\t\t\t\t\tif (opArgs.rollback !== true) {\n\t\t\t\t\t\t// HACK: We need to include the allocated handle in the segment's JSON representation\n\t\t\t\t\t\t// for snapshots, but need to ignore the remote client's handle allocations when\n\t\t\t\t\t\t// processing remote ops.\n\t\t\t\t\t\tsegment.reset();\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.handleCache.itemsChanged(\n\t\t\t\t\t\tposition,\n\t\t\t\t\t\t/* deleteCount: */ 0,\n\t\t\t\t\t\t/* insertCount: */ segment.cachedLength,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Pass 2: Notify the 'deltaCallback', which may involve callbacks into user code.\n\t\t\t\tfor (const { segment, position } of ranges) {\n\t\t\t\t\tthis.deltaCallback(\n\t\t\t\t\t\tposition,\n\t\t\t\t\t\t/* numRemoved: */ 0,\n\t\t\t\t\t\t/* numInserted: */ segment.cachedLength,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\t// Pass 1: Perform any internal maintenance first to avoid reentrancy.\n\t\t\t\tfor (const { segment, position } of ranges) {\n\t\t\t\t\tthis.handleCache.itemsChanged(\n\t\t\t\t\t\tposition /* deleteCount: */,\n\t\t\t\t\t\tsegment.cachedLength,\n\t\t\t\t\t\t/* insertCount: */ 0,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Pass 2: Notify the 'deltaCallback', which may involve callbacks into user code.\n\t\t\t\tfor (const { segment, position } of ranges) {\n\t\t\t\t\tthis.deltaCallback(\n\t\t\t\t\t\tposition,\n\t\t\t\t\t\t/* numRemoved: */ segment.cachedLength,\n\t\t\t\t\t\t/* numInsert: */ 0,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new Error(\"Unhandled MergeTreeDeltaType\");\n\t\t\t}\n\t\t}\n\t};\n\n\tprivate readonly onMaintenance = (args: IMergeTreeMaintenanceCallbackArgs): void => {\n\t\tif (args.operation === MergeTreeMaintenanceType.UNLINK) {\n\t\t\tlet freed: number[] = [];\n\n\t\t\tfor (const { segment } of args.deltaSegments) {\n\t\t\t\tconst asPerm = segment as PermutationSegment;\n\t\t\t\tif (isHandleValid(asPerm.start)) {\n\t\t\t\t\t// Note: Using the spread operator with `.splice()` can exhaust the stack.\n\t\t\t\t\t// eslint-disable-next-line unicorn/prefer-spread\n\t\t\t\t\tfreed = freed.concat(\n\t\t\t\t\t\tArray.from({ length: asPerm.cachedLength })\n\t\t\t\t\t\t\t.fill(0)\n\t\t\t\t\t\t\t.map((value, index) => index + asPerm.start),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Notify matrix that handles are about to be freed. The matrix is responsible for clearing\n\t\t\t// the rows/cols prior to free to ensure recycled row/cols are initially empty.\n\t\t\tthis.handlesRecycledCallback(freed);\n\n\t\t\t// Now that the physical storage has been cleared, add the recycled handles back to the free pool.\n\t\t\tfor (const handle of freed) {\n\t\t\t\tthis.handleTable.free(handle);\n\t\t\t}\n\t\t}\n\t};\n\n\tpublic toString(): string {\n\t\tconst s: string[] = [];\n\n\t\tthis.walkSegments((segment) => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\t\ts.push(`${segment}`);\n\t\t\treturn true;\n\t\t});\n\n\t\treturn s.join(\"\");\n\t}\n}\n\nexport function reinsertSegmentIntoVector(\n\tvector: PermutationVector,\n\tpos: number,\n\tspec: IJSONSegment,\n): {\n\top: IMergeTreeInsertMsg | undefined;\n\tinserted: PermutationSegment;\n} {\n\tconst original = PermutationSegment.fromJSONObject(spec);\n\n\t// (Re)insert the removed number of rows at the original position.\n\tconst op = vector.insertSegmentLocal(pos, original);\n\tconst inserted = vector.getContainingSegment(pos).segment as PermutationSegment;\n\n\t// we reuse the original handle here\n\t// so if cells exist, they can be found, and re-inserted\n\tif (isHandleValid(original.start)) {\n\t\tinserted.start = original.start;\n\t}\n\n\t// Invalidate the handleCache in case it was populated during the 'rowsChanged'\n\t// callback, which occurs before the handle span is populated.\n\tvector.handleCache.itemsChanged(\n\t\tpos,\n\t\t/* removedCount: */ 0,\n\t\t/* insertedCount: */ inserted.cachedLength,\n\t);\n\treturn { op, inserted };\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 { IFluidHandle, ITelemetryBaseLogger } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tBaseSegment,\n\tClient,\n\tIJSONSegment,\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeDeltaOpArgs,\n\tIMergeTreeMaintenanceCallbackArgs,\n\tISegment,\n\tMergeTreeDeltaType,\n\tMergeTreeMaintenanceType,\n\tsegmentIsRemoved,\n\ttype IMergeTreeInsertMsg,\n\ttype IMergeTreeRemoveMsg,\n} from \"@fluidframework/merge-tree/internal\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions/internal\";\nimport {\n\tObjectStoragePartition,\n\tSummaryTreeBuilder,\n} from \"@fluidframework/runtime-utils/internal\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport { createChildLogger } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { HandleCache } from \"./handlecache.js\";\nimport { Handle, HandleTable, isHandleValid } from \"./handletable.js\";\nimport { deserializeBlob } from \"./serialization.js\";\nimport { VectorUndoProvider } from \"./undoprovider.js\";\n\nconst enum SnapshotPath {\n\tsegments = \"segments\",\n\thandleTable = \"handleTable\",\n}\n\ntype PermutationSegmentSpec = [number, number];\n\nexport class PermutationSegment extends BaseSegment {\n\tpublic static readonly typeString: string = \"PermutationSegment\";\n\tprivate _start = Handle.unallocated;\n\n\tpublic static fromJSONObject(spec: IJSONSegment): PermutationSegment {\n\t\tconst [length, start] = spec as PermutationSegmentSpec;\n\t\treturn new PermutationSegment(length, start);\n\t}\n\n\tpublic readonly type = PermutationSegment.typeString;\n\n\tconstructor(length: number, start = Handle.unallocated) {\n\t\tsuper();\n\t\tthis._start = start;\n\t\tthis.cachedLength = length;\n\t}\n\n\tpublic get start(): Handle {\n\t\treturn this._start;\n\t}\n\tpublic set start(value: Handle) {\n\t\tassert(\n\t\t\tthis._start === Handle.unallocated,\n\t\t\t0x024 /* \"Start of PermutationSegment already allocated!\" */,\n\t\t);\n\t\tassert(\n\t\t\tisHandleValid(value),\n\t\t\t0x025 /* \"Trying to set start of PermutationSegment to invalid handle!\" */,\n\t\t);\n\n\t\tthis._start = value;\n\t}\n\n\tpublic reset(): void {\n\t\tthis._start = Handle.unallocated;\n\t}\n\n\tpublic toJSONObject(): number[] {\n\t\treturn [this.cachedLength, this.start];\n\t}\n\n\tpublic clone(start = 0, end = this.cachedLength): PermutationSegment {\n\t\tconst b = new PermutationSegment(\n\t\t\t/* length: */ end - start,\n\t\t\t/* start: */ this.start + start,\n\t\t);\n\t\tthis.cloneInto(b);\n\t\treturn b;\n\t}\n\n\tpublic canAppend(segment: ISegment): boolean {\n\t\tconst asPerm = segment as PermutationSegment;\n\n\t\treturn this.start === Handle.unallocated\n\t\t\t? asPerm.start === Handle.unallocated\n\t\t\t: asPerm.start === this.start + this.cachedLength;\n\t}\n\n\tprotected createSplitSegmentAt(pos: number): PermutationSegment {\n\t\tassert(\n\t\t\t0 < pos && pos < this.cachedLength,\n\t\t\t0x026 /* \"Trying to split segment at out-of-bounds position!\" */,\n\t\t);\n\n\t\tconst leafSegment = new PermutationSegment(\n\t\t\t/* length: */ this.cachedLength - pos,\n\t\t\t/* start: */ this.start === Handle.unallocated ? Handle.unallocated : this.start + pos,\n\t\t);\n\n\t\tthis.cachedLength = pos;\n\n\t\treturn leafSegment;\n\t}\n\n\tpublic toString(): string {\n\t\treturn this.start === Handle.unallocated\n\t\t\t? `<${this.cachedLength} empty>`\n\t\t\t: `<${this.cachedLength}: ${this.start}..${this.start + this.cachedLength - 1}>`;\n\t}\n}\n\n// eslint-disable-next-line import/no-deprecated\nexport class PermutationVector extends Client {\n\tprivate handleTable = new HandleTable<never>(); // Tracks available storage handles for rows.\n\tpublic readonly handleCache = new HandleCache(this);\n\tpublic undo: VectorUndoProvider | undefined;\n\n\tconstructor(\n\t\tpath: string,\n\t\tlogger: ITelemetryBaseLogger,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tprivate readonly deltaCallback: (\n\t\t\tposition: number,\n\t\t\tnumRemoved: number,\n\t\t\tnumInserted: number,\n\t\t) => void,\n\t\tprivate readonly handlesRecycledCallback: (handles: Handle[]) => void,\n\t\tgetMinInFlightRefSeq: () => number | undefined,\n\t) {\n\t\tsuper(\n\t\t\tPermutationSegment.fromJSONObject,\n\t\t\tcreateChildLogger({ logger, namespace: `Matrix.${path}.MergeTreeClient` }),\n\t\t\t{\n\t\t\t\t...runtime.options,\n\t\t\t\tnewMergeTreeSnapshotFormat: true, // Force new snapshot format as it's generally more efficient for matrices.\n\t\t\t},\n\t\t\tgetMinInFlightRefSeq,\n\t\t);\n\n\t\tthis.on(\"delta\", this.onDelta);\n\t\tthis.on(\"maintenance\", this.onMaintenance);\n\t}\n\n\tpublic insert(start: number, length: number): IMergeTreeInsertMsg | undefined {\n\t\treturn this.insertSegmentLocal(start, new PermutationSegment(length));\n\t}\n\n\tpublic remove(start: number, length: number): IMergeTreeRemoveMsg {\n\t\treturn this.removeRangeLocal(start, start + length);\n\t}\n\n\tpublic getMaybeHandle(pos: number): Handle {\n\t\tassert(\n\t\t\t0 <= pos && pos < this.getLength(),\n\t\t\t0x027 /* \"Trying to get handle of out-of-bounds position!\" */,\n\t\t);\n\n\t\treturn this.handleCache.getHandle(pos);\n\t}\n\n\tpublic getAllocatedHandle(pos: number): Handle {\n\t\tlet handle = this.getMaybeHandle(pos);\n\t\tif (isHandleValid(handle)) {\n\t\t\treturn handle;\n\t\t}\n\n\t\tthis.walkSegments(\n\t\t\t(segment) => {\n\t\t\t\tconst asPerm = segment as PermutationSegment;\n\t\t\t\tasPerm.start = handle = this.handleTable.allocate();\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tpos,\n\t\t\tpos + 1,\n\t\t\t/* accum: */ undefined,\n\t\t\t/* splitRange: */ true,\n\t\t);\n\n\t\tthis.handleCache.addHandle(pos, handle);\n\n\t\treturn handle;\n\t}\n\n\tpublic adjustPosition(\n\t\tposToAdjust: number,\n\t\top: ISequencedDocumentMessage,\n\t): { pos: number | undefined; handle: Handle } {\n\t\tconst segOff = this.getContainingSegment<PermutationSegment>(posToAdjust, {\n\t\t\treferenceSequenceNumber: op.referenceSequenceNumber,\n\t\t\tclientId: op.clientId,\n\t\t});\n\n\t\tassert(\n\t\t\tsegOff !== undefined,\n\t\t\t0xbac /* segment must be available for operations in the collab window */,\n\t\t);\n\t\tconst { segment, offset } = segOff;\n\n\t\tif (segmentIsRemoved(segment)) {\n\t\t\t// this case is tricky. the segment which the row or column data is remove\n\t\t\t// but an op before that remove references a cell. we still want to apply\n\t\t\t// the op, as the row/col could become active again in the case where\n\t\t\t// the remove was local and it get's rolled back. so we allocate a handle\n\t\t\t// for the row/col if not allocated, but don't put it in the cache\n\t\t\t// as the cache can only contain live positions.\n\t\t\tlet handle = segment.start;\n\t\t\tif (!isHandleValid(handle)) {\n\t\t\t\tthis.walkSegments(\n\t\t\t\t\t(s) => {\n\t\t\t\t\t\tconst asPerm = s as PermutationSegment;\n\t\t\t\t\t\tasPerm.start = handle = this.handleTable.allocate();\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t},\n\t\t\t\t\tposToAdjust,\n\t\t\t\t\tposToAdjust + 1,\n\t\t\t\t\t/* accum: */ undefined,\n\t\t\t\t\t/* splitRange: */ true,\n\t\t\t\t\top,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn { handle, pos: undefined };\n\t\t} else {\n\t\t\tconst pos = this.getPosition(segment) + offset;\n\t\t\treturn {\n\t\t\t\tpos,\n\t\t\t\thandle: this.getAllocatedHandle(pos),\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic handleToPosition(handle: Handle, localSeq = this.getCollabWindow().localSeq): number {\n\t\tassert(\n\t\t\tlocalSeq <= this.getCollabWindow().localSeq,\n\t\t\t0x028 /* \"'localSeq' for op being resubmitted must be <= the 'localSeq' of the last submitted op.\" */,\n\t\t);\n\n\t\t// TODO: In theory, the MergeTree should be able to map the (position, refSeq, localSeq) from\n\t\t// the original operation to the current position for undo/redo scenarios. This is probably the\n\t\t// ideal solution, as we would no longer need to store row/col handles in the op metadata.\n\t\t//\n\t\t// Failing that, we could avoid the O(n) search below by building a temporary map in the\n\t\t// opposite direction from the handle to either it's current position or segment + offset\n\t\t// and reuse it for the duration of undo/redo. (Ideally, we would know when the undo/redo\n\t\t// ended so we could discard this map.)\n\t\t//\n\t\t// If we find that we frequently need a reverse handle -> position lookup, we could maintain\n\t\t// one using the Tiny-Calc adjust tree.\n\t\tlet containingSegment!: PermutationSegment;\n\t\tlet containingOffset: number;\n\n\t\tthis.walkAllSegments((segment) => {\n\t\t\tconst { start, cachedLength } = segment as PermutationSegment;\n\n\t\t\t// If the segment is unallocated, skip it.\n\t\t\tif (!isHandleValid(start)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst end = start + cachedLength;\n\n\t\t\tif (start <= handle && handle < end) {\n\t\t\t\tcontainingSegment = segment as PermutationSegment;\n\t\t\t\tcontainingOffset = handle - start;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\n\t\t// We are guaranteed to find the handle in the PermutationVector, even if the corresponding\n\t\t// row/col has been removed, because handles are not recycled until the containing segment\n\t\t// is unlinked from the MergeTree.\n\t\t//\n\t\t// Therefore, either a row/col removal has been ACKed, in which case there will be no pending\n\t\t// ops that reference the stale handle, or the removal is unACKed, in which case the handle\n\t\t// has not yet been recycled.\n\n\t\tassert(\n\t\t\tisHandleValid(containingSegment.start),\n\t\t\t0x029 /* \"Invalid handle at start of containing segment!\" */,\n\t\t);\n\n\t\t// Once we know the current position of the handle, we can use the MergeTree to get the segment\n\t\t// containing this position and use 'findReconnectionPosition' to adjust for the local ops that\n\t\t// have not yet been submitted.\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\treturn this.findReconnectionPosition(containingSegment, localSeq) + containingOffset!;\n\t}\n\n\t// Constructs an ISummaryTreeWithStats for the cell data.\n\tpublic summarize(\n\t\truntime: IFluidDataStoreRuntime,\n\t\thandle: IFluidHandle,\n\t\tserializer: IFluidSerializer,\n\t): ISummaryTreeWithStats {\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tbuilder.addWithStats(\n\t\t\tSnapshotPath.segments,\n\t\t\tsuper.summarize(runtime, handle, serializer, /* catchUpMsgs: */ []),\n\t\t);\n\t\tbuilder.addBlob(\n\t\t\tSnapshotPath.handleTable,\n\t\t\tserializer.stringify(this.handleTable.getSummaryContent(), handle),\n\t\t);\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tstorage: IChannelStorageService,\n\t\tserializer: IFluidSerializer,\n\t): Promise<{\n\t\tcatchupOpsP: Promise<ISequencedDocumentMessage[]>;\n\t}> {\n\t\tconst handleTableData = (await deserializeBlob(\n\t\t\tstorage,\n\t\t\tSnapshotPath.handleTable,\n\t\t\tserializer,\n\t\t\t// Cast is needed since the (de)serializer returns content of type `any`.\n\t\t)) as Handle[];\n\n\t\tthis.handleTable = HandleTable.load<never>(handleTableData);\n\n\t\treturn super.load(\n\t\t\truntime,\n\t\t\tnew ObjectStoragePartition(storage, SnapshotPath.segments),\n\t\t\tserializer,\n\t\t);\n\t}\n\n\tprivate readonly onDelta = (\n\t\topArgs: IMergeTreeDeltaOpArgs,\n\t\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\t): void => {\n\t\t// Apply deltas in descending order to prevent positions from shifting.\n\t\tconst ranges = deltaArgs.deltaSegments\n\t\t\t.map(({ segment }) => ({\n\t\t\t\tsegment: segment as PermutationSegment,\n\t\t\t\tposition: this.getPosition(segment),\n\t\t\t}))\n\t\t\t.sort((left, right) => left.position - right.position);\n\n\t\tconst isLocal = opArgs.sequencedMessage === undefined;\n\n\t\t// Notify the undo provider, if any is attached.\n\t\tif (this.undo !== undefined && isLocal) {\n\t\t\tthis.undo.record(deltaArgs);\n\t\t}\n\n\t\tswitch (deltaArgs.operation) {\n\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\t// Pass 1: Perform any internal maintenance first to avoid reentrancy.\n\t\t\t\tfor (const { segment, position } of ranges) {\n\t\t\t\t\tif (opArgs.rollback !== true) {\n\t\t\t\t\t\t// HACK: We need to include the allocated handle in the segment's JSON representation\n\t\t\t\t\t\t// for snapshots, but need to ignore the remote client's handle allocations when\n\t\t\t\t\t\t// processing remote ops.\n\t\t\t\t\t\tsegment.reset();\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.handleCache.itemsChanged(\n\t\t\t\t\t\tposition,\n\t\t\t\t\t\t/* deleteCount: */ 0,\n\t\t\t\t\t\t/* insertCount: */ segment.cachedLength,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Pass 2: Notify the 'deltaCallback', which may involve callbacks into user code.\n\t\t\t\tfor (const { segment, position } of ranges) {\n\t\t\t\t\tthis.deltaCallback(\n\t\t\t\t\t\tposition,\n\t\t\t\t\t\t/* numRemoved: */ 0,\n\t\t\t\t\t\t/* numInserted: */ segment.cachedLength,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\t// Pass 1: Perform any internal maintenance first to avoid reentrancy.\n\t\t\t\tfor (const { segment, position } of ranges) {\n\t\t\t\t\tthis.handleCache.itemsChanged(\n\t\t\t\t\t\tposition /* deleteCount: */,\n\t\t\t\t\t\tsegment.cachedLength,\n\t\t\t\t\t\t/* insertCount: */ 0,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Pass 2: Notify the 'deltaCallback', which may involve callbacks into user code.\n\t\t\t\tfor (const { segment, position } of ranges) {\n\t\t\t\t\tthis.deltaCallback(\n\t\t\t\t\t\tposition,\n\t\t\t\t\t\t/* numRemoved: */ segment.cachedLength,\n\t\t\t\t\t\t/* numInsert: */ 0,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new Error(\"Unhandled MergeTreeDeltaType\");\n\t\t\t}\n\t\t}\n\t};\n\n\tprivate readonly onMaintenance = (args: IMergeTreeMaintenanceCallbackArgs): void => {\n\t\tif (args.operation === MergeTreeMaintenanceType.UNLINK) {\n\t\t\tlet freed: number[] = [];\n\n\t\t\tfor (const { segment } of args.deltaSegments) {\n\t\t\t\tconst asPerm = segment as PermutationSegment;\n\t\t\t\tif (isHandleValid(asPerm.start)) {\n\t\t\t\t\t// Note: Using the spread operator with `.splice()` can exhaust the stack.\n\t\t\t\t\t// eslint-disable-next-line unicorn/prefer-spread\n\t\t\t\t\tfreed = freed.concat(\n\t\t\t\t\t\tArray.from({ length: asPerm.cachedLength })\n\t\t\t\t\t\t\t.fill(0)\n\t\t\t\t\t\t\t.map((value, index) => index + asPerm.start),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Notify matrix that handles are about to be freed. The matrix is responsible for clearing\n\t\t\t// the rows/cols prior to free to ensure recycled row/cols are initially empty.\n\t\t\tthis.handlesRecycledCallback(freed);\n\n\t\t\t// Now that the physical storage has been cleared, add the recycled handles back to the free pool.\n\t\t\tfor (const handle of freed) {\n\t\t\t\tthis.handleTable.free(handle);\n\t\t\t}\n\t\t}\n\t};\n\n\tpublic toString(): string {\n\t\tconst s: string[] = [];\n\n\t\tthis.walkSegments((segment) => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\t\ts.push(`${segment}`);\n\t\t\treturn true;\n\t\t});\n\n\t\treturn s.join(\"\");\n\t}\n}\n\nexport function reinsertSegmentIntoVector(\n\tvector: PermutationVector,\n\tpos: number,\n\tspec: IJSONSegment,\n): {\n\top: IMergeTreeInsertMsg | undefined;\n\tinserted: PermutationSegment;\n} {\n\tconst original = PermutationSegment.fromJSONObject(spec);\n\n\t// (Re)insert the removed number of rows at the original position.\n\tconst op = vector.insertSegmentLocal(pos, original);\n\tconst inserted = vector.getContainingSegment(pos)?.segment as PermutationSegment;\n\n\t// we reuse the original handle here\n\t// so if cells exist, they can be found, and re-inserted\n\tif (isHandleValid(original.start)) {\n\t\tinserted.start = original.start;\n\t}\n\n\t// Invalidate the handleCache in case it was populated during the 'rowsChanged'\n\t// callback, which occurs before the handle span is populated.\n\tvector.handleCache.itemsChanged(\n\t\tpos,\n\t\t/* removedCount: */ 0,\n\t\t/* insertedCount: */ inserted.cachedLength,\n\t);\n\treturn { op, inserted };\n}\n"]}
|
package/lib/handlecache.js
CHANGED
|
@@ -64,9 +64,9 @@ export class HandleCache {
|
|
|
64
64
|
// is that
|
|
65
65
|
const { vector } = this;
|
|
66
66
|
for (let pos = start; pos < end; pos++) {
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
67
68
|
const { segment, offset } = vector.getContainingSegment(pos);
|
|
68
69
|
const asPerm = segment;
|
|
69
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
70
70
|
handles.push(asPerm.start + offset);
|
|
71
71
|
}
|
|
72
72
|
}
|
package/lib/handlecache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlecache.js","sourceRoot":"","sources":["../src/handlecache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+BAA+B;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAG7D,OAAO,EAAU,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IAIvB,YAA4B,MAAyB;QAAzB,WAAM,GAAN,MAAM,CAAmB;QAH7C,YAAO,GAAa,EAAE,CAAC;QACvB,UAAK,GAAG,CAAC,CAAC;IAEsC,CAAC;IAEzD;;;OAGG;IACK,QAAQ,CAAC,QAAgB;QAChC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED;;;;;;;OAOG;IACI,SAAS,CAAC,QAAgB;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEtC,uFAAuF;QACvF,8BAA8B;QAE9B,oFAAoF;QACpF,qFAAqF;QACrF,uEAAuE;QAEvE,OAAO,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACrF,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,QAAgB,EAAE,MAAc;QAChD,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAE3E,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,CACL,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EACnC,KAAK,CAAC,wEAAwE,CAC9E,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;QAC9B,CAAC;IACF,CAAC;IAED;;;;;OAKG;IACK,UAAU,CAAC,KAAa,EAAE,GAAW,EAAE,OAAiB;QAC/D,sFAAsF;QACtF,gBAAgB;QAEhB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAExB,KAAK,IAAI,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;YACxC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,oBAAoB,CAAC,GAAG,
|
|
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/core-utils/internal\";\nimport { IVectorConsumer } from \"@tiny-calc/nano\";\n\nimport { Handle, isHandleValid } from \"./handletable.js\";\nimport { PermutationSegment, PermutationVector } from \"./permutationvector.js\";\nimport { ensureRange } from \"./range.js\";\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\tprivate handles: Handle[] = [];\n\tprivate start = 0;\n\n\tconstructor(public readonly vector: PermutationVector) {}\n\n\t/**\n\t * Returns the index of the given position in the 'handles' array as a Uint32.\n\t * (If the position is not in the array, returns an integer greater than 'handles.length').\n\t */\n\tprivate getIndex(position: number): number {\n\t\treturn (position - this.start) >>> 0;\n\t}\n\n\t/**\n\t * Returns the handle currently assigned to the given 'position' (if any). Check\n\t * the result with 'isValidHandle(..)' to see if a handle has been allocated for\n\t * the given position.\n\t *\n\t * @throws A 'RangeError' if the provided 'position' is out-of-bounds with regards to the\n\t * PermutationVector's length.\n\t */\n\tpublic getHandle(position: number): Handle {\n\t\tconst index = this.getIndex(position);\n\n\t\t// Perf: To encourage inlining, handling of the 'cacheMiss(..)' case has been extracted\n\t\t// to a separate method.\n\n\t\t// Perf: A cache hit implies that 'position' was in bounds. Therefore, we can defer\n\t\t// checking that 'position' is in bounds until 'cacheMiss(..)'. This yields an\n\t\t// ~40% speedup when the position is in the cache (node v12 x64).\n\n\t\treturn index < this.handles.length ? this.handles[index] : this.cacheMiss(position);\n\t}\n\n\t/**\n\t * Update the cache when a handle has been allocated for a given position.\n\t */\n\tpublic addHandle(position: number, handle: Handle): void {\n\t\tassert(isHandleValid(handle), 0x017 /* \"Trying to add invalid handle!\" */);\n\n\t\tconst index = this.getIndex(position);\n\t\tif (index < this.handles.length) {\n\t\t\tassert(\n\t\t\t\t!isHandleValid(this.handles[index]),\n\t\t\t\t0x018 /* \"Trying to insert handle into position with already valid handle!\" */,\n\t\t\t);\n\t\t\tthis.handles[index] = handle;\n\t\t}\n\t}\n\n\t/**\n\t * Used by {@link HandleCache.cacheMiss} to retrieve handles for a range of positions.\n\t * @param start - The start position (inclusive).\n\t * @param end - The end position (exclusive).\n\t * @param handles - The array to populate with handles. Note that it is mutated in place.\n\t */\n\tprivate getHandles(start: number, end: number, handles: Handle[]): void {\n\t\t// TODO: This can be accelerated substantially using 'walkSegments()'. The only catch\n\t\t// is that\n\n\t\tconst { vector } = this;\n\n\t\tfor (let pos = start; pos < end; pos++) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst { segment, offset } = vector.getContainingSegment(pos)!;\n\t\t\tconst asPerm = segment as PermutationSegment;\n\t\t\thandles.push(asPerm.start + offset);\n\t\t}\n\t}\n\n\tprivate cacheMiss(position: number): Handle {\n\t\t// Coercing 'position' to an Uint32 allows us to handle a negative 'position' value\n\t\t// with the same logic that handles 'position' >= length.\n\t\tconst _position = position >>> 0;\n\n\t\t// TODO: To bound memory usage, there should be a limit on the maximum size of\n\t\t// handle[].\n\n\t\t// TODO: To reduce MergeTree lookups, this code should opportunistically grow\n\t\t// the cache to the next MergeTree segment boundary (within the limits of\n\t\t// the handle cache).\n\n\t\tif (_position < this.start) {\n\t\t\tconst handles: Handle[] = [];\n\t\t\tthis.getHandles(_position, this.start, handles);\n\t\t\thandles.push(...this.handles);\n\t\t\tthis.handles = handles;\n\t\t\tthis.start = _position;\n\t\t\treturn this.handles[0];\n\t\t} else {\n\t\t\tensureRange(_position, this.vector.getLength());\n\t\t\tthis.getHandles(this.start + this.handles.length, _position + 1, this.handles);\n\t\t\treturn this.handles[this.handles.length - 1];\n\t\t}\n\t}\n\n\t// #region IVectorConsumer\n\n\titemsChanged(start: number, removedCount: number, insertedCount: number): void {\n\t\t// If positions were inserted/removed, our current policy is to trim the array\n\t\t// at the beginning of the invalidate range and lazily repopulate the handles\n\t\t// on demand.\n\t\t//\n\t\t// Some alternatives to consider that preserve the previously cached handles\n\t\t// that are still valid:\n\t\t//\n\t\t// * Eagerly populate the 'handles[]' with the newly insert values (currently guaranteed\n\t\t// to be Handle.unallocated, so we don't even need to look them up.)\n\t\t//\n\t\t// * Use a sentinel value or other mechanism to allow \"holes\" in the cache.\n\n\t\tconst index = this.getIndex(start);\n\t\tif (index < this.handles.length) {\n\t\t\tthis.handles.length = index;\n\t\t}\n\t}\n\n\t// #endregion IVectorConsumer\n}\n"]}
|
package/lib/matrix.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matrix.d.ts","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"matrix.d.ts","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"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"}
|
package/lib/matrix.js
CHANGED
|
@@ -203,7 +203,7 @@ export class SharedMatrix extends SharedObject {
|
|
|
203
203
|
}
|
|
204
204
|
createOpMetadataLocalRef(vector, pos, localSeq) {
|
|
205
205
|
const segoff = vector.getContainingSegment(pos, undefined, localSeq);
|
|
206
|
-
assert(segoff
|
|
206
|
+
assert(segoff !== undefined, 0x8b3 /* expected valid position */);
|
|
207
207
|
return vector.createLocalReferencePosition(segoff.segment, segoff.offset, ReferenceType.StayOnRemove, undefined);
|
|
208
208
|
}
|
|
209
209
|
sendSetCellOp(row, col, value, rowHandle, colHandle, localSeq = this.nextLocalSeq()) {
|
package/lib/matrix.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matrix.js","sourceRoot":"","sources":["../src/matrix.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 {\n\tIEvent,\n\tIEventThisPlaceHolder,\n\ttype IEventProvider,\n} from \"@fluidframework/core-interfaces\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\ttype IChannel,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tClient,\n\tIJSONSegment,\n\tIMergeTreeOp,\n\ttype ISegmentInternal,\n\ttype LocalReferencePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\tsegmentIsRemoved,\n} from \"@fluidframework/merge-tree/internal\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions/internal\";\nimport {\n\tObjectStoragePartition,\n\tSummaryTreeBuilder,\n} from \"@fluidframework/runtime-utils/internal\";\nimport {\n\tIFluidSerializer,\n\tISharedObjectEvents,\n\tSharedObject,\n} from \"@fluidframework/shared-object-base/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport {\n\tIMatrixConsumer,\n\tIMatrixProducer,\n\tIMatrixReader,\n\tIMatrixWriter,\n} from \"@tiny-calc/nano\";\nimport Deque from \"double-ended-queue\";\n\nimport type { HandleCache } from \"./handlecache.js\";\nimport { Handle, isHandleValid } from \"./handletable.js\";\nimport {\n\tISetOp,\n\tMatrixItem,\n\tMatrixOp,\n\tMatrixSetOrVectorOp,\n\tSnapshotPath,\n\tVectorOp,\n} from \"./ops.js\";\nimport { PermutationVector, reinsertSegmentIntoVector } from \"./permutationvector.js\";\nimport { ensureRange } from \"./range.js\";\nimport { deserializeBlob } from \"./serialization.js\";\nimport { SparseArray2D, type RecurArray } from \"./sparsearray2d.js\";\nimport { IUndoConsumer } from \"./types.js\";\nimport { MatrixUndoProvider } from \"./undoprovider.js\";\n\ninterface ISetOpMetadata {\n\trowHandle: Handle;\n\tcolHandle: Handle;\n\tlocalSeq: number;\n\trowsRef: LocalReferencePosition;\n\tcolsRef: LocalReferencePosition;\n\treferenceSeqNumber: number;\n}\n\n/**\n * Events emitted by Shared Matrix.\n * @legacy\n * @alpha\n */\nexport interface ISharedMatrixEvents<T> extends IEvent {\n\t/**\n\t * This event is only emitted when the SetCell Resolution Policy is First Write Win(FWW).\n\t * This is emitted when two clients race and send changes without observing each other changes,\n\t * the changes that gets sequenced last would be rejected, and only client who's changes rejected\n\t * would be notified via this event, with expectation that it will merge its changes back by\n\t * accounting new information (state from winner of the race).\n\t *\n\t * @remarks Listener parameters:\n\t *\n\t * - `row` - Row number at which conflict happened.\n\t *\n\t * - `col` - Col number at which conflict happened.\n\t *\n\t * - `currentValue` - The current value of the cell.\n\t *\n\t * - `conflictingValue` - The value that this client tried to set in the cell and got ignored due to conflict.\n\t *\n\t * - `target` - The {@link ISharedMatrix} itself.\n\t */\n\t(\n\t\tevent: \"conflict\",\n\t\tlistener: (\n\t\t\trow: number,\n\t\t\tcol: number,\n\t\t\tcurrentValue: MatrixItem<T>,\n\t\t\tconflictingValue: MatrixItem<T>,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n}\n\n/**\n * This represents the item which is used to track the client which modified the cell last.\n */\ninterface CellLastWriteTrackerItem {\n\tseqNum: number; // Seq number of op which last modified this cell\n\tclientId: string; // clientId of the client which last modified this cell\n}\n\n/**\n * @legacy\n * @alpha\n */\n// Changing this to `unknown` would be a breaking change.\n// TODO: if possible, transition ISharedMatrix to not use `any`.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface ISharedMatrix<T = any>\n\textends IEventProvider<ISharedMatrixEvents<T>>,\n\t\tIMatrixProducer<MatrixItem<T>>,\n\t\tIMatrixReader<MatrixItem<T>>,\n\t\tIMatrixWriter<MatrixItem<T>>,\n\t\tIChannel {\n\t/**\n\t * Inserts columns into the matrix.\n\t * @param colStart - Index of the first column to insert.\n\t * @param count - Number of columns to insert.\n\t * @remarks\n\t * Inserting 0 columns is a noop.\n\t */\n\tinsertCols(colStart: number, count: number): void;\n\t/**\n\t * Removes columns from the matrix.\n\t * @param colStart - Index of the first column to remove.\n\t * @param count - Number of columns to remove.\n\t * @remarks\n\t * Removing 0 columns is a noop.\n\t */\n\tremoveCols(colStart: number, count: number): void;\n\t/**\n\t * Inserts rows into the matrix.\n\t * @param rowStart - Index of the first row to insert.\n\t * @param count - Number of rows to insert.\n\t * @remarks\n\t * Inserting 0 rows is a noop.\n\t */\n\tinsertRows(rowStart: number, count: number): void;\n\t/**\n\t * Removes rows from the matrix.\n\t * @param rowStart - Index of the first row to remove.\n\t * @param count - Number of rows to remove.\n\t * @remarks\n\t * Removing 0 rows is a noop.\n\t */\n\tremoveRows(rowStart: number, count: number): void;\n\n\t/**\n\t * Sets a range of cells in the matrix.\n\t * Cells are set in consecutive columns between `colStart` and `colStart + colCount - 1`.\n\t * When `values` has larger size than `colCount`, the extra values are inserted in subsequent rows\n\t * a la text-wrapping.\n\t * @param rowStart - Index of the row to start setting cells.\n\t * @param colStart - Index of the column to start setting cells.\n\t * @param colCount - Number of columns to set before wrapping to subsequent rows (if `values` has more items)\n\t * @param values - Values to insert.\n\t * @remarks\n\t * This is not currently more efficient than calling `setCell` for each cell.\n\t */\n\tsetCells(\n\t\trowStart: number,\n\t\tcolStart: number,\n\t\tcolCount: number,\n\t\tvalues: readonly MatrixItem<T>[],\n\t): void;\n\n\t/**\n\t * Attach an {@link IUndoConsumer} to the matrix.\n\t * @param consumer - Undo consumer which will receive revertibles from the matrix.\n\t */\n\topenUndo(consumer: IUndoConsumer): void;\n\n\t/**\n\t * Whether the current conflict resolution policy is first-write win (FWW).\n\t * See {@link ISharedMatrix.switchSetCellPolicy} for more details.\n\t */\n\tisSetCellConflictResolutionPolicyFWW(): boolean;\n\n\t/**\n\t * Change the conflict resolution policy for setCell operations to first-write win (FWW).\n\t *\n\t * This API only switches from LWW to FWW and not from FWW to LWW.\n\t *\n\t * @privateRemarks\n\t * The next SetOp which is sent will communicate this policy to other clients.\n\t */\n\tswitchSetCellPolicy(): void;\n}\n\ntype FirstWriterWinsPolicy =\n\t| { state: \"off\" }\n\t| { state: \"local\" }\n\t| {\n\t\t\tstate: \"on\";\n\t\t\tswitchOpSeqNumber: number;\n\t\t\tcellLastWriteTracker: SparseArray2D<CellLastWriteTrackerItem>;\n\t };\n\n/**\n * Tracks pending local changes for a cell.\n */\ninterface PendingCellChanges<T> {\n\t/**\n\t * The local changes including the local seq, and the value set at that local seq.\n\t */\n\tlocal: { localSeq: number; value: MatrixItem<T> }[];\n\t/**\n\t * The latest consensus value across all clients.\n\t * this will either be a remote value or ack'd local\n\t * value.\n\t */\n\tconsensus?: MatrixItem<T>;\n}\n\n/**\n * A SharedMatrix holds a rectangular 2D array of values. Supported operations\n * include setting values and inserting/removing rows and columns.\n *\n * Matrix values may be any Fluid serializable type, which is the set of JSON\n * serializable types extended to include IFluidHandles.\n *\n * Fluid's SharedMatrix implementation works equally well for dense and sparse\n * matrix data and physically stores data in Z-order to leverage CPU caches and\n * prefetching when reading in either row or column major order. (See README.md\n * for more details.)\n * @legacy\n * @alpha\n */\n// Changing this to `unknown` would be a breaking change.\n// TODO: if possible, transition SharedMatrix to not use `any`.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class SharedMatrix<T = any>\n\textends SharedObject<ISharedMatrixEvents<T> & ISharedObjectEvents>\n\timplements ISharedMatrix<T>\n{\n\tprivate readonly consumers = new Set<IMatrixConsumer<MatrixItem<T>>>();\n\n\t/**\n\t * Note: this field only provides a lower-bound on the reference sequence numbers for in-flight ops.\n\t * The exact reason isn't understood, but some e2e tests suggest that the runtime may sometimes process\n\t * incoming leave/join ops before putting an op that this DDS submits over the wire.\n\t *\n\t * E.g. SharedMatrix submits an op while deltaManager has lastSequenceNumber = 10, but before the runtime\n\t * puts this op over the wire, it processes a client join/leave op with sequence number 11, so the referenceSequenceNumber\n\t * on the SharedMatrix op is 11.\n\t */\n\tprivate readonly inFlightRefSeqs = new Deque<number>();\n\treadonly getMinInFlightRefSeq = (): number | undefined => this.inFlightRefSeqs.get(0);\n\n\tprivate readonly rows: PermutationVector; // Map logical row to storage handle (if any)\n\tprivate readonly cols: PermutationVector; // Map logical col to storage handle (if any)\n\n\tprivate cells = new SparseArray2D<MatrixItem<T>>(); // Stores cell values.\n\tprivate readonly pending = new SparseArray2D<PendingCellChanges<T>>(); // Tracks pending writes.\n\n\tprivate fwwPolicy: FirstWriterWinsPolicy = {\n\t\tstate: \"off\",\n\t};\n\n\t// Used to track if there is any reentrancy in setCell code.\n\tprivate reentrantCount: number = 0;\n\n\t/**\n\t * Constructor for the Shared Matrix\n\t * @param runtime - DataStore runtime.\n\t * @param id - id of the dds\n\t * @param attributes - channel attributes\n\t * @param _isSetCellConflictResolutionPolicyFWW - Conflict resolution for Matrix set op is First Writer Win in case of\n\t * race condition. Client can still overwrite values in case of no race.\n\t */\n\tconstructor(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tpublic id: string,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(id, runtime, attributes, \"fluid_matrix_\");\n\n\t\tthis.rows = new PermutationVector(\n\t\t\tSnapshotPath.rows,\n\t\t\tthis.logger,\n\t\t\truntime,\n\t\t\tthis.onRowDelta,\n\t\t\tthis.onRowHandlesRecycled,\n\t\t\tthis.getMinInFlightRefSeq,\n\t\t);\n\n\t\tthis.cols = new PermutationVector(\n\t\t\tSnapshotPath.cols,\n\t\t\tthis.logger,\n\t\t\truntime,\n\t\t\tthis.onColDelta,\n\t\t\tthis.onColHandlesRecycled,\n\t\t\tthis.getMinInFlightRefSeq,\n\t\t);\n\t}\n\n\tprivate undo?: MatrixUndoProvider<T>;\n\n\t/**\n\t * Subscribes the given IUndoConsumer to the matrix.\n\t */\n\tpublic openUndo(consumer: IUndoConsumer): void {\n\t\tassert(\n\t\t\tthis.undo === undefined,\n\t\t\t0x019 /* \"SharedMatrix.openUndo() supports at most a single IUndoConsumer.\" */,\n\t\t);\n\n\t\tthis.undo = new MatrixUndoProvider(consumer, this, this.rows, this.cols);\n\t}\n\n\t// TODO: closeUndo()?\n\n\tprivate get rowHandles(): HandleCache {\n\t\treturn this.rows.handleCache;\n\t}\n\tprivate get colHandles(): HandleCache {\n\t\treturn this.cols.handleCache;\n\t}\n\n\t// #region IMatrixProducer\n\n\topenMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): IMatrixReader<MatrixItem<T>> {\n\t\tthis.consumers.add(consumer);\n\t\treturn this;\n\t}\n\n\tcloseMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): void {\n\t\tthis.consumers.delete(consumer);\n\t}\n\n\t// #endregion IMatrixProducer\n\n\t// #region IMatrixReader\n\n\tpublic get rowCount(): number {\n\t\treturn this.rows.getLength();\n\t}\n\tpublic get colCount(): number {\n\t\treturn this.cols.getLength();\n\t}\n\n\tpublic isSetCellConflictResolutionPolicyFWW(): boolean {\n\t\treturn this.fwwPolicy.state !== \"off\";\n\t}\n\n\tpublic getCell(row: number, col: number): MatrixItem<T> {\n\t\t// Perf: When possible, bounds checking is performed inside the implementation for\n\t\t// 'getHandle()' so that it can be elided in the case of a cache hit. This\n\t\t// yields an ~40% improvement in the case of a cache hit (node v12 x64)\n\n\t\t// Map the logical (row, col) to associated storage handles.\n\t\tconst rowHandle = this.rowHandles.getHandle(row);\n\t\tif (isHandleValid(rowHandle)) {\n\t\t\tconst colHandle = this.colHandles.getHandle(col);\n\t\t\tif (isHandleValid(colHandle)) {\n\t\t\t\treturn this.cells.getCell(rowHandle, colHandle);\n\t\t\t}\n\t\t} else {\n\t\t\t// If we early exit because the given rowHandle is unallocated, we still need to\n\t\t\t// bounds-check the 'col' parameter.\n\t\t\tensureRange(col, this.cols.getLength());\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tpublic get matrixProducer(): IMatrixProducer<MatrixItem<T>> {\n\t\treturn this;\n\t}\n\n\t// #endregion IMatrixReader\n\n\tpublic setCell(row: number, col: number, value: MatrixItem<T>): void {\n\t\tif (row < 0 || row >= this.rowCount || col < 0 || col >= this.colCount) {\n\t\t\tthrow new UsageError(\"Trying to set out-of-bounds cell.\");\n\t\t}\n\n\t\tthis.setCellCore(row, col, value);\n\t}\n\n\tpublic setCells(\n\t\trowStart: number,\n\t\tcolStart: number,\n\t\tcolCount: number,\n\t\tvalues: readonly MatrixItem<T>[],\n\t): void {\n\t\tconst rowCount = Math.ceil(values.length / colCount);\n\n\t\tassert(\n\t\t\t0 <= rowStart &&\n\t\t\t\trowStart < this.rowCount &&\n\t\t\t\t0 <= colStart &&\n\t\t\t\tcolStart < this.colCount &&\n\t\t\t\t1 <= colCount &&\n\t\t\t\tcolCount <= this.colCount - colStart &&\n\t\t\t\trowCount <= this.rowCount - rowStart,\n\t\t\t0x01b /* \"Trying to set multiple out-of-bounds cells!\" */,\n\t\t);\n\n\t\tconst endCol = colStart + colCount;\n\t\tlet r = rowStart;\n\t\tlet c = colStart;\n\n\t\tfor (const value of values) {\n\t\t\tthis.setCellCore(r, c, value);\n\n\t\t\tif (++c === endCol) {\n\t\t\t\tc = colStart;\n\t\t\t\tr++;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate setCellCore(\n\t\trow: number,\n\t\tcol: number,\n\t\tvalue: MatrixItem<T>,\n\t\trowHandle = this.rows.getAllocatedHandle(row),\n\t\tcolHandle = this.cols.getAllocatedHandle(col),\n\t\trollback?: boolean,\n\t): void {\n\t\tthis.protectAgainstReentrancy(() => {\n\t\t\tconst oldValue = this.cells.getCell(rowHandle, colHandle) ?? undefined;\n\n\t\t\tif (this.undo !== undefined) {\n\t\t\t\tthis.undo.cellSet(rowHandle, colHandle, oldValue);\n\t\t\t}\n\n\t\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\n\t\t\tif (this.isAttached() && rollback !== true) {\n\t\t\t\tconst pending = this.sendSetCellOp(row, col, value, rowHandle, colHandle);\n\t\t\t\tif (pending.local.length === 1) {\n\t\t\t\t\tpending.consensus ??= oldValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Avoid reentrancy by raising change notifications after the op is queued.\n\t\t\tfor (const consumer of this.consumers.values()) {\n\t\t\t\tconsumer.cellsChanged(row, col, 1, 1, this);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate createOpMetadataLocalRef(\n\t\tvector: PermutationVector,\n\t\tpos: number,\n\t\tlocalSeq: number,\n\t): LocalReferencePosition {\n\t\tconst segoff = vector.getContainingSegment(pos, undefined, localSeq);\n\t\tassert(\n\t\t\tsegoff.segment !== undefined && segoff.offset !== undefined,\n\t\t\t0x8b3 /* expected valid position */,\n\t\t);\n\t\treturn vector.createLocalReferencePosition(\n\t\t\tsegoff.segment,\n\t\t\tsegoff.offset,\n\t\t\tReferenceType.StayOnRemove,\n\t\t\tundefined,\n\t\t);\n\t}\n\n\tprivate sendSetCellOp(\n\t\trow: number,\n\t\tcol: number,\n\t\tvalue: MatrixItem<T>,\n\t\trowHandle: Handle,\n\t\tcolHandle: Handle,\n\t\tlocalSeq = this.nextLocalSeq(),\n\t): PendingCellChanges<T> {\n\t\tassert(\n\t\t\tthis.isAttached(),\n\t\t\t0x1e2 /* \"Caller must ensure 'isAttached()' before calling 'sendSetCellOp'.\" */,\n\t\t);\n\n\t\tconst op: ISetOp<T> = {\n\t\t\ttype: MatrixOp.set,\n\t\t\trow,\n\t\t\tcol,\n\t\t\tvalue,\n\t\t\tfwwMode: this.fwwPolicy.state !== \"off\",\n\t\t};\n\n\t\tconst rowsRef = this.createOpMetadataLocalRef(this.rows, row, localSeq);\n\t\tconst colsRef = this.createOpMetadataLocalRef(this.cols, col, localSeq);\n\t\tconst metadata: ISetOpMetadata = {\n\t\t\trowHandle,\n\t\t\tcolHandle,\n\t\t\tlocalSeq,\n\t\t\trowsRef,\n\t\t\tcolsRef,\n\t\t\treferenceSeqNumber: this.deltaManager.lastSequenceNumber,\n\t\t};\n\n\t\tthis.submitLocalMessage(op, metadata);\n\t\tconst pendingCell: PendingCellChanges<T> = this.pending.getCell(rowHandle, colHandle) ?? {\n\t\t\tlocal: [],\n\t\t};\n\t\tpendingCell.local.push({ localSeq, value });\n\t\tthis.pending.setCell(rowHandle, colHandle, pendingCell);\n\t\treturn pendingCell;\n\t}\n\n\t/**\n\t * This makes sure that the code inside the callback is not reentrant. We need to do that because we raise notifications\n\t * to the consumers telling about these changes and they can try to change the matrix while listening to those notifications\n\t * which can make the shared matrix to be in bad state. For example, we are raising notification for a setCell changes and\n\t * a consumer tries to delete that row/col on receiving that notification which can lead to this matrix trying to setCell in\n\t * a deleted row/col.\n\t * @param callback - code that needs to protected against reentrancy.\n\t */\n\tprivate protectAgainstReentrancy(callback: () => void): void {\n\t\tif (this.reentrantCount !== 0) {\n\t\t\t// Validate that applications don't submit edits in response to matrix change notifications. This is unsupported.\n\t\t\tthrow new UsageError(\"Reentrancy detected in SharedMatrix.\");\n\t\t}\n\t\tthis.reentrantCount++;\n\t\ttry {\n\t\t\tcallback();\n\t\t} finally {\n\t\t\tthis.reentrantCount--;\n\t\t}\n\t\tassert(\n\t\t\tthis.reentrantCount === 0,\n\t\t\t0x85e /* indicates a problem with the reentrancy tracking code. */,\n\t\t);\n\t}\n\n\tprivate submitVectorMessage(\n\t\tcurrentVector: PermutationVector,\n\t\toppositeVector: PermutationVector,\n\t\ttarget: SnapshotPath.rows | SnapshotPath.cols,\n\t\tmessage: IMergeTreeOp,\n\t): void {\n\t\t// Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n\t\t// and the SharedMatrix's cell data. Instead, we externally advance each MergeTree's 'localSeq' counter\n\t\t// for each submitted op it not aware of to keep them synchronized.\n\t\tconst localSeq = currentVector.getCollabWindow().localSeq;\n\t\tconst oppositeWindow = oppositeVector.getCollabWindow();\n\n\t\t// Note that the comparison is '>=' because, in the case the MergeTree is regenerating ops for reconnection,\n\t\t// the MergeTree submits the op with the original 'localSeq'.\n\t\tassert(\n\t\t\tlocalSeq >= oppositeWindow.localSeq,\n\t\t\t0x01c /* \"The 'localSeq' of the vector submitting an op must >= the 'localSeq' of the other vector.\" */,\n\t\t);\n\n\t\toppositeWindow.localSeq = localSeq;\n\n\t\t// If the SharedMatrix is local, it's state will be submitted via a Snapshot when initially connected.\n\t\t// Do not queue a message or track the pending op, as there will never be an ACK, etc.\n\t\tif (this.isAttached()) {\n\t\t\t// Record whether this `op` targets rows or cols. (See dispatch in `processCore()`)\n\t\t\tconst targetedMessage: VectorOp = { ...message, target };\n\n\t\t\tthis.submitLocalMessage(\n\t\t\t\ttargetedMessage,\n\t\t\t\tcurrentVector.peekPendingSegmentGroups(\n\t\t\t\t\tmessage.type === MergeTreeDeltaType.GROUP ? message.ops.length : 1,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate submitColMessage(message: IMergeTreeOp): void {\n\t\tthis.submitVectorMessage(this.cols, this.rows, SnapshotPath.cols, message);\n\t}\n\n\tpublic insertCols(colStart: number, count: number): void {\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (colStart > this.colCount) {\n\t\t\tthrow new UsageError(\"insertCols: out of bounds\");\n\t\t}\n\t\tthis.protectAgainstReentrancy(() => {\n\t\t\tconst message = this.cols.insert(colStart, count);\n\t\t\tassert(message !== undefined, 0x8b4 /* must be defined */);\n\t\t\tthis.submitColMessage(message);\n\t\t});\n\t}\n\n\tpublic removeCols(colStart: number, count: number): void {\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (colStart > this.colCount) {\n\t\t\tthrow new UsageError(\"removeCols: out of bounds\");\n\t\t}\n\t\tthis.protectAgainstReentrancy(() =>\n\t\t\tthis.submitColMessage(this.cols.remove(colStart, count)),\n\t\t);\n\t}\n\n\tprivate submitRowMessage(message: IMergeTreeOp): void {\n\t\tthis.submitVectorMessage(this.rows, this.cols, SnapshotPath.rows, message);\n\t}\n\n\tpublic insertRows(rowStart: number, count: number): void {\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (rowStart > this.rowCount) {\n\t\t\tthrow new UsageError(\"insertRows: out of bounds\");\n\t\t}\n\t\tthis.protectAgainstReentrancy(() => {\n\t\t\tconst message = this.rows.insert(rowStart, count);\n\t\t\tassert(message !== undefined, 0x8b5 /* must be defined */);\n\t\t\tthis.submitRowMessage(message);\n\t\t});\n\t}\n\n\tpublic removeRows(rowStart: number, count: number): void {\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (rowStart > this.rowCount) {\n\t\t\tthrow new UsageError(\"removeRows: out of bounds\");\n\t\t}\n\t\tthis.protectAgainstReentrancy(() =>\n\t\t\tthis.submitRowMessage(this.rows.remove(rowStart, count)),\n\t\t);\n\t}\n\n\tpublic _undoRemoveRows(rowStart: number, spec: IJSONSegment): void {\n\t\tconst { op, inserted } = reinsertSegmentIntoVector(this.rows, rowStart, spec);\n\t\tassert(op !== undefined, 0x8b6 /* must be defined */);\n\t\tthis.submitRowMessage(op);\n\n\t\t// Generate setCell ops for each populated cell in the reinserted rows.\n\t\tlet rowHandle = inserted.start;\n\t\tconst rowCount = inserted.cachedLength;\n\t\tfor (let row = rowStart; row < rowStart + rowCount; row++, rowHandle++) {\n\t\t\tfor (let col = 0; col < this.colCount; col++) {\n\t\t\t\tconst colHandle = this.colHandles.getHandle(col);\n\t\t\t\tconst value = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\tif (this.isAttached() && value !== undefined && value !== null) {\n\t\t\t\t\tthis.sendSetCellOp(row, col, value, rowHandle, colHandle);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Avoid reentrancy by raising change notifications after the op is queued.\n\t\tfor (const consumer of this.consumers.values()) {\n\t\t\tconsumer.cellsChanged(rowStart, /* colStart: */ 0, rowCount, this.colCount, this);\n\t\t}\n\t}\n\n\t/***/ public _undoRemoveCols(colStart: number, spec: IJSONSegment): void {\n\t\tconst { op, inserted } = reinsertSegmentIntoVector(this.cols, colStart, spec);\n\t\tassert(op !== undefined, 0x8b7 /* must be defined */);\n\t\tthis.submitColMessage(op);\n\n\t\t// Generate setCell ops for each populated cell in the reinserted cols.\n\t\tlet colHandle = inserted.start;\n\t\tconst colCount = inserted.cachedLength;\n\t\tfor (let col = colStart; col < colStart + colCount; col++, colHandle++) {\n\t\t\tfor (let row = 0; row < this.rowCount; row++) {\n\t\t\t\tconst rowHandle = this.rowHandles.getHandle(row);\n\t\t\t\tconst value = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\tif (this.isAttached() && value !== undefined && value !== null) {\n\t\t\t\t\tthis.sendSetCellOp(row, col, value, rowHandle, colHandle);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Avoid reentrancy by raising change notifications after the op is queued.\n\t\tfor (const consumer of this.consumers.values()) {\n\t\t\tconsumer.cellsChanged(/* rowStart: */ 0, colStart, this.rowCount, colCount, this);\n\t\t}\n\t}\n\n\tprotected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tbuilder.addWithStats(\n\t\t\tSnapshotPath.rows,\n\t\t\tthis.rows.summarize(this.runtime, this.handle, serializer),\n\t\t);\n\t\tbuilder.addWithStats(\n\t\t\tSnapshotPath.cols,\n\t\t\tthis.cols.summarize(this.runtime, this.handle, serializer),\n\t\t);\n\t\tconst artifactsToSummarize: (\n\t\t\t| undefined\n\t\t\t| number\n\t\t\t| ReturnType<SparseArray2D<MatrixItem<T> | number>[\"snapshot\"]>\n\t\t)[] = [\n\t\t\tthis.cells.snapshot(),\n\t\t\t/**\n\t\t\t * we used to write this.pending.snapshot(). this should have never been done, as pending is only for local\n\t\t\t * changes, and there should never be local changes in the summarizer. This was also never used on load\n\t\t\t * as there is no way to understand a previous clients pending changes. so we just set this to a constant\n\t\t\t * which matches an empty this.pending.snapshot() for back-compat in terms of the array length\n\t\t\t */\n\t\t\t[undefined],\n\t\t];\n\n\t\t// Only need to store it in the snapshot if we have switched the policy already.\n\t\tif (this.fwwPolicy.state === \"on\") {\n\t\t\tartifactsToSummarize.push(\n\t\t\t\tthis.fwwPolicy.switchOpSeqNumber,\n\t\t\t\tthis.fwwPolicy.cellLastWriteTracker.snapshot(),\n\t\t\t);\n\t\t} else {\n\t\t\t// back-compat: used -1 for disabled\n\t\t\tartifactsToSummarize.push(\n\t\t\t\t-1,\n\t\t\t\t/*\n\t\t\t\t * we should set undefined in place of cellLastWriteTracker to ensure the number of array entries is consistent.\n\t\t\t\t * Doing that currently breaks snapshot tests. Its is probably fine, but if new elements are ever added, we need\n\t\t\t\t * ensure undefined is also set.\n\t\t\t\t */\n\t\t\t\t// undefined\n\t\t\t);\n\t\t}\n\t\tbuilder.addBlob(\n\t\t\tSnapshotPath.cells,\n\t\t\tserializer.stringify(artifactsToSummarize, this.handle),\n\t\t);\n\t\treturn builder.getSummaryTree();\n\t}\n\n\t/**\n\t * Runs serializer on the GC data for this SharedMatrix.\n\t * All the IFluidHandle's stored in the cells represent routes to other objects.\n\t */\n\tprotected processGCDataCore(serializer: IFluidSerializer): void {\n\t\tfor (let row = 0; row < this.rowCount; row++) {\n\t\t\tfor (let col = 0; col < this.colCount; col++) {\n\t\t\t\tserializer.stringify(this.getCell(row, col), this.handle);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Advances the 'localSeq' counter for the cell data operation currently being queued.\n\t *\n\t * Do not use with 'submitColMessage()/submitRowMessage()' as these helpers + the MergeTree will\n\t * automatically advance 'localSeq'.\n\t */\n\tprivate nextLocalSeq(): number {\n\t\t// Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n\t\t// and the SharedMatrix's cell data. Instead, we externally bump each MergeTree's 'localSeq' counter\n\t\t// for SharedMatrix ops it's not aware of to keep them synchronized. (For cell data operations, we\n\t\t// need to bump both counters.)\n\n\t\tthis.cols.getCollabWindow().localSeq++;\n\t\treturn ++this.rows.getCollabWindow().localSeq;\n\t}\n\n\tprotected submitLocalMessage(message: unknown, localOpMetadata?: unknown): void {\n\t\t// TODO: Recommend moving this assertion into SharedObject\n\t\t// (See https://github.com/microsoft/FluidFramework/issues/2559)\n\t\tassert(\n\t\t\tthis.isAttached() === true,\n\t\t\t0x01d /* \"Trying to submit message to runtime while detached!\" */,\n\t\t);\n\n\t\tthis.inFlightRefSeqs.push(this.deltaManager.lastSequenceNumber);\n\t\tsuper.submitLocalMessage(message, localOpMetadata);\n\n\t\t// Ensure that row/col 'localSeq' are synchronized (see 'nextLocalSeq()').\n\t\tassert(\n\t\t\tthis.rows.getCollabWindow().localSeq === this.cols.getCollabWindow().localSeq,\n\t\t\t0x01e /* \"Row and col collab window 'localSeq' desynchronized!\" */,\n\t\t);\n\t}\n\n\tprotected didAttach(): void {\n\t\t// We've attached we need to start generating and sending ops.\n\t\t// so start collaboration and provide a default client id incase we are not connected\n\t\tif (this.isAttached()) {\n\t\t\tthis.rows.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n\t\t\tthis.cols.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n\t\t}\n\t}\n\n\tprotected onConnect(): void {\n\t\tassert(\n\t\t\tthis.rows.getCollabWindow().collaborating === this.cols.getCollabWindow().collaborating,\n\t\t\t0x01f /* \"Row and col collab window 'collaborating' status desynchronized!\" */,\n\t\t);\n\n\t\t// Update merge tree collaboration information with new client ID and then resend pending ops\n\t\tthis.rows.startOrUpdateCollaboration(this.runtime.clientId as string);\n\t\tthis.cols.startOrUpdateCollaboration(this.runtime.clientId as string);\n\t}\n\n\tprivate rebasePosition(\n\t\tclient: Client,\n\t\tref: LocalReferencePosition,\n\t\tlocalSeq: number,\n\t): number | undefined {\n\t\tconst segment: ISegmentInternal | undefined = ref.getSegment();\n\t\tconst offset = ref.getOffset();\n\t\t// If the segment that contains the position is removed, then this setCell op should do nothing.\n\t\tif (segment === undefined || offset === undefined || segmentIsRemoved(segment)) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn client.findReconnectionPosition(segment, localSeq) + offset;\n\t}\n\n\tprotected reSubmitCore(incoming: unknown, localOpMetadata: unknown): void {\n\t\tconst originalRefSeq = this.inFlightRefSeqs.shift();\n\t\tassert(\n\t\t\toriginalRefSeq !== undefined,\n\t\t\t0x8b9 /* Expected a recorded refSeq when resubmitting an op */,\n\t\t);\n\t\tconst content = incoming as MatrixSetOrVectorOp<T>;\n\n\t\tif (content.type === MatrixOp.set && content.target === undefined) {\n\t\t\tconst setOp = content;\n\t\t\tconst { rowHandle, colHandle, localSeq, rowsRef, colsRef, referenceSeqNumber } =\n\t\t\t\tlocalOpMetadata as ISetOpMetadata;\n\n\t\t\t// If after rebasing the op, we get a valid row/col number, that means the row/col\n\t\t\t// handles have not been recycled and we can safely use them.\n\t\t\tconst row = this.rebasePosition(this.rows, rowsRef, localSeq);\n\t\t\tconst col = this.rebasePosition(this.cols, colsRef, localSeq);\n\t\t\tthis.rows.removeLocalReferencePosition(rowsRef);\n\t\t\tthis.cols.removeLocalReferencePosition(colsRef);\n\n\t\t\tconst pendingCell = this.pending.getCell(rowHandle, colHandle);\n\t\t\tassert(pendingCell !== undefined, 0xba4 /* local operation must have a pending array */);\n\t\t\tconst { local } = pendingCell;\n\t\t\tassert(local !== undefined, 0xba5 /* local operation must have a pending array */);\n\t\t\tconst localSeqIndex = local.findIndex((p) => p.localSeq === localSeq);\n\t\t\tassert(localSeqIndex >= 0, 0xba6 /* local operation must have a pending entry */);\n\t\t\tconst [change] = local.splice(localSeqIndex, 1);\n\t\t\tassert(change.localSeq === localSeq, 0xba7 /* must match */);\n\n\t\t\tif (\n\t\t\t\trow !== undefined &&\n\t\t\t\tcol !== undefined &&\n\t\t\t\trow >= 0 &&\n\t\t\t\tcol >= 0 && // If the mode is LWW, then send the op.\n\t\t\t\t// Otherwise if the current mode is FWW and if we generated this op, after seeing the\n\t\t\t\t// last set op, or it is the first set op for the cell, then regenerate the op,\n\t\t\t\t// otherwise raise conflict. We want to check the current mode here and not that\n\t\t\t\t// whether op was made in FWW or not.\n\t\t\t\t(this.fwwPolicy.state !== \"on\" ||\n\t\t\t\t\treferenceSeqNumber >=\n\t\t\t\t\t\t(this.fwwPolicy.cellLastWriteTracker.getCell(rowHandle, colHandle)?.seqNum ?? 0))\n\t\t\t) {\n\t\t\t\tthis.sendSetCellOp(row, col, setOp.value, rowHandle, colHandle, localSeq);\n\t\t\t}\n\t\t} else {\n\t\t\tswitch (content.target) {\n\t\t\t\tcase SnapshotPath.cols: {\n\t\t\t\t\tthis.submitColMessage(\n\t\t\t\t\t\tthis.cols.regeneratePendingOp(content, localOpMetadata, false),\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase SnapshotPath.rows: {\n\t\t\t\t\tthis.submitRowMessage(\n\t\t\t\t\t\tthis.rows.regeneratePendingOp(content, localOpMetadata, false),\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tunreachableCase(content);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected rollback(content: unknown, localOpMetadata: unknown): void {\n\t\tconst contents = content as MatrixSetOrVectorOp<T>;\n\t\tconst target = contents.target;\n\n\t\tswitch (target) {\n\t\t\tcase SnapshotPath.cols: {\n\t\t\t\tthis.cols.rollback(content, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SnapshotPath.rows: {\n\t\t\t\tthis.rows.rollback(content, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase undefined: {\n\t\t\t\tassert(contents.type === MatrixOp.set, 0xba8 /* only sets supported */);\n\t\t\t\tconst setMetadata = localOpMetadata as ISetOpMetadata;\n\n\t\t\t\tconst pendingCell = this.pending.getCell(setMetadata.rowHandle, setMetadata.colHandle);\n\t\t\t\tassert(pendingCell !== undefined, 0xba9 /* must have pending */);\n\n\t\t\t\tconst change = pendingCell.local.pop();\n\t\t\t\tassert(change?.localSeq === setMetadata.localSeq, 0xbaa /* must have change */);\n\n\t\t\t\tconst previous =\n\t\t\t\t\tpendingCell.local.length > 0\n\t\t\t\t\t\t? pendingCell.local[pendingCell.local.length - 1].value\n\t\t\t\t\t\t: pendingCell.consensus;\n\n\t\t\t\tthis.setCellCore(\n\t\t\t\t\tcontents.row,\n\t\t\t\t\tcontents.col,\n\t\t\t\t\tprevious,\n\t\t\t\t\tsetMetadata.rowHandle,\n\t\t\t\t\tsetMetadata.colHandle,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault:\n\t\t}\n\t}\n\n\tprotected onDisconnect(): void {}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\ttry {\n\t\t\tawait this.rows.load(\n\t\t\t\tthis.runtime,\n\t\t\t\tnew ObjectStoragePartition(storage, SnapshotPath.rows),\n\t\t\t\tthis.serializer,\n\t\t\t);\n\t\t\tawait this.cols.load(\n\t\t\t\tthis.runtime,\n\t\t\t\tnew ObjectStoragePartition(storage, SnapshotPath.cols),\n\t\t\t\tthis.serializer,\n\t\t\t);\n\t\t\tconst [\n\t\t\t\tcellData,\n\t\t\t\t_pendingCliSeqData,\n\t\t\t\tsetCellLwwToFwwPolicySwitchOpSeqNumber,\n\t\t\t\tcellLastWriteTracker,\n\t\t\t\t// Cast is needed since the (de)serializer returns content of type `any`.\n\t\t\t] = (await deserializeBlob(storage, SnapshotPath.cells, this.serializer)) as [\n\t\t\t\tRecurArray<MatrixItem<T>>,\n\t\t\t\tunknown,\n\t\t\t\tnumber,\n\t\t\t\tRecurArray<CellLastWriteTrackerItem>,\n\t\t\t];\n\n\t\t\tthis.cells = SparseArray2D.load(cellData);\n\t\t\t// back-compat: used -1 for disabled, also may not exist\n\t\t\tconst switchOpSeqNumber =\n\t\t\t\tsetCellLwwToFwwPolicySwitchOpSeqNumber === -1\n\t\t\t\t\t? undefined\n\t\t\t\t\t: (setCellLwwToFwwPolicySwitchOpSeqNumber ?? undefined);\n\t\t\tthis.fwwPolicy =\n\t\t\t\tswitchOpSeqNumber === undefined\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tstate: \"off\",\n\t\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tstate: \"on\",\n\t\t\t\t\t\t\tswitchOpSeqNumber,\n\t\t\t\t\t\t\tcellLastWriteTracker: SparseArray2D.load(cellLastWriteTracker),\n\t\t\t\t\t\t};\n\t\t} catch (error) {\n\t\t\tthis.logger.sendErrorEvent({ eventName: \"MatrixLoadFailed\" }, error);\n\t\t}\n\t}\n\n\t/**\n\t * Tells whether the setCell op should be applied or not based on First Write Win policy. It assumes\n\t * we are in FWW mode.\n\t */\n\tprivate shouldSetCellBasedOnFWW(\n\t\trowHandle: Handle,\n\t\tcolHandle: Handle,\n\t\tmessage: ISequencedDocumentMessage,\n\t): boolean {\n\t\tassert(\n\t\t\tthis.fwwPolicy.state === \"on\",\n\t\t\t0x85f /* should be in Fww mode when calling this method */,\n\t\t);\n\t\tassert(message.clientId !== null, 0x860 /* clientId should not be null */);\n\t\tconst lastCellModificationDetails = this.fwwPolicy.cellLastWriteTracker.getCell(\n\t\t\trowHandle,\n\t\t\tcolHandle,\n\t\t);\n\t\t// If someone tried to Overwrite the cell value or first write on this cell or\n\t\t// same client tried to modify the cell.\n\t\treturn (\n\t\t\tlastCellModificationDetails === undefined ||\n\t\t\tlastCellModificationDetails.clientId === message.clientId ||\n\t\t\tmessage.referenceSequenceNumber >= lastCellModificationDetails.seqNum\n\t\t);\n\t}\n\n\tprotected processCore(\n\t\tmsg: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t): void {\n\t\tif (local) {\n\t\t\tconst recordedRefSeq = this.inFlightRefSeqs.shift();\n\t\t\tassert(recordedRefSeq !== undefined, 0x8ba /* No pending recorded refSeq found */);\n\t\t\t// TODO: AB#7076: Some equivalent assert should be enabled. This fails some e2e stashed op tests because\n\t\t\t// the deltaManager may have seen more messages than the runtime has processed while amidst the stashed op\n\t\t\t// flow, so e.g. when `applyStashedOp` is called and the DDS is put in a state where it expects an ack for\n\t\t\t// one of its messages, the delta manager has actually already seen subsequent messages from collaborators\n\t\t\t// which the in-flight message is concurrent to.\n\t\t\t// See \"handles stashed ops created on top of sequenced local ops\" for one such test case.\n\t\t\t// assert(recordedRefSeq <= message.referenceSequenceNumber, \"RefSeq mismatch\");\n\t\t}\n\n\t\tconst contents = msg.contents as MatrixSetOrVectorOp<T>;\n\t\tconst target = contents.target;\n\n\t\tswitch (target) {\n\t\t\tcase SnapshotPath.cols: {\n\t\t\t\tthis.cols.applyMsg(msg, local);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SnapshotPath.rows: {\n\t\t\t\tthis.rows.applyMsg(msg, local);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase undefined: {\n\t\t\t\tassert(\n\t\t\t\t\tcontents.type === MatrixOp.set,\n\t\t\t\t\t0x021 /* \"SharedMatrix message contents have unexpected type!\" */,\n\t\t\t\t);\n\n\t\t\t\tconst { row, col, value, fwwMode } = contents;\n\t\t\t\t// If this is the first op notifying us of the policy change, then set the policy change seq number.\n\t\t\t\tif (fwwMode === true && this.fwwPolicy.state !== \"on\") {\n\t\t\t\t\tthis.fwwPolicy = {\n\t\t\t\t\t\tstate: \"on\",\n\t\t\t\t\t\tswitchOpSeqNumber: msg.sequenceNumber,\n\t\t\t\t\t\tcellLastWriteTracker: new SparseArray2D(),\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tassert(msg.clientId !== null, 0x861 /* clientId should not be null!! */);\n\t\t\t\tif (local) {\n\t\t\t\t\t// We are receiving the ACK for a local pending set operation.\n\t\t\t\t\tconst { rowHandle, colHandle, localSeq, rowsRef, colsRef } =\n\t\t\t\t\t\tlocalOpMetadata as ISetOpMetadata;\n\t\t\t\t\tthis.rows.removeLocalReferencePosition(rowsRef);\n\t\t\t\t\tthis.cols.removeLocalReferencePosition(colsRef);\n\n\t\t\t\t\tconst pendingCell = this.pending.getCell(rowHandle, colHandle);\n\t\t\t\t\tconst ackedChange = pendingCell?.local.shift();\n\t\t\t\t\tassert(ackedChange?.localSeq === localSeq, 0xbab /* must match */);\n\t\t\t\t\tif (pendingCell?.local.length === 0) {\n\t\t\t\t\t\tthis.pending.setCell(rowHandle, colHandle, undefined);\n\t\t\t\t\t}\n\n\t\t\t\t\t// If policy is switched and cell should be modified too based on policy, then update the tracker.\n\t\t\t\t\t// If policy is not switched, then also update the tracker in case it is the latest.\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.fwwPolicy.state === \"on\" &&\n\t\t\t\t\t\tthis.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\tpendingCell!.consensus = ackedChange.value;\n\t\t\t\t\t\tthis.fwwPolicy.cellLastWriteTracker.setCell(rowHandle, colHandle, {\n\t\t\t\t\t\t\tseqNum: msg.sequenceNumber,\n\t\t\t\t\t\t\tclientId: msg.clientId,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst adjustedRow = this.rows.adjustPosition(row, msg);\n\t\t\t\t\tconst adjustedCol = this.cols.adjustPosition(col, msg);\n\n\t\t\t\t\tconst rowHandle = adjustedRow.handle;\n\t\t\t\t\tconst colHandle = adjustedCol.handle;\n\n\t\t\t\t\tassert(\n\t\t\t\t\t\tisHandleValid(rowHandle) && isHandleValid(colHandle),\n\t\t\t\t\t\t0x022 /* \"SharedMatrix row and/or col handles are invalid!\" */,\n\t\t\t\t\t);\n\t\t\t\t\tconst pendingCell = this.pending.getCell(rowHandle, colHandle);\n\t\t\t\t\tif (this.fwwPolicy.state === \"on\") {\n\t\t\t\t\t\t// If someone tried to Overwrite the cell value or first write on this cell or\n\t\t\t\t\t\t// same client tried to modify the cell or if the previous mode was LWW, then we need to still\n\t\t\t\t\t\t// overwrite the cell and raise conflict if we have pending changes as our change is going to be lost.\n\t\t\t\t\t\tif (this.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)) {\n\t\t\t\t\t\t\tconst previousValue = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\t\t\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\t\t\t\t\t\t\tthis.fwwPolicy.cellLastWriteTracker.setCell(rowHandle, colHandle, {\n\t\t\t\t\t\t\t\tseqNum: msg.sequenceNumber,\n\t\t\t\t\t\t\t\tclientId: msg.clientId,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (pendingCell !== undefined) {\n\t\t\t\t\t\t\t\tpendingCell.consensus = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (adjustedRow.pos !== undefined && adjustedCol.pos !== undefined) {\n\t\t\t\t\t\t\t\tfor (const consumer of this.consumers.values()) {\n\t\t\t\t\t\t\t\t\tconsumer.cellsChanged(adjustedRow.pos, adjustedCol.pos, 1, 1, this);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Check is there are any pending changes, which will be rejected. If so raise conflict.\n\t\t\t\t\t\t\t\tif (pendingCell !== undefined && pendingCell.local.length > 0) {\n\t\t\t\t\t\t\t\t\t// Don't reset the pending value yet, as there maybe more fww op from same client, so we want\n\t\t\t\t\t\t\t\t\t// to raise conflict event for that op also.\n\t\t\t\t\t\t\t\t\tthis.emit(\n\t\t\t\t\t\t\t\t\t\t\"conflict\",\n\t\t\t\t\t\t\t\t\t\trow,\n\t\t\t\t\t\t\t\t\t\tcol,\n\t\t\t\t\t\t\t\t\t\tvalue, // Current value\n\t\t\t\t\t\t\t\t\t\tpreviousValue, // Ignored local value\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (pendingCell === undefined || pendingCell.local.length === 0) {\n\t\t\t\t\t\t\t// If there is a pending (unACKed) local write to the same cell, skip the current op\n\t\t\t\t\t\t\t// since it \"happened before\" the pending write.\n\t\t\t\t\t\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\t\t\t\t\t\t\tif (adjustedRow.pos !== undefined && adjustedCol.pos !== undefined) {\n\t\t\t\t\t\t\t\tfor (const consumer of this.consumers.values()) {\n\t\t\t\t\t\t\t\t\tconsumer.cellsChanged(adjustedRow.pos, adjustedCol.pos, 1, 1, this);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpendingCell.consensus = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(target, \"unknown target\");\n\t\t\t}\n\t\t}\n\t}\n\n\t// Invoked by PermutationVector to notify IMatrixConsumers of row insertion/deletions.\n\tprivate readonly onRowDelta = (\n\t\tposition: number,\n\t\tremovedCount: number,\n\t\tinsertedCount: number,\n\t): void => {\n\t\tfor (const consumer of this.consumers) {\n\t\t\tconsumer.rowsChanged(position, removedCount, insertedCount, this);\n\t\t}\n\t};\n\n\t// Invoked by PermutationVector to notify IMatrixConsumers of col insertion/deletions.\n\tprivate readonly onColDelta = (\n\t\tposition: number,\n\t\tremovedCount: number,\n\t\tinsertedCount: number,\n\t): void => {\n\t\tfor (const consumer of this.consumers) {\n\t\t\tconsumer.colsChanged(position, removedCount, insertedCount, this);\n\t\t}\n\t};\n\n\tprivate readonly onRowHandlesRecycled = (rowHandles: Handle[]): void => {\n\t\tfor (const rowHandle of rowHandles) {\n\t\t\tthis.cells.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t\tthis.pending.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t\tif (this.fwwPolicy.state === \"on\") {\n\t\t\t\tthis.fwwPolicy.cellLastWriteTracker?.clearRows(\n\t\t\t\t\t/* rowStart: */ rowHandle,\n\t\t\t\t\t/* rowCount: */ 1,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t};\n\n\tprivate readonly onColHandlesRecycled = (colHandles: Handle[]): void => {\n\t\tfor (const colHandle of colHandles) {\n\t\t\tthis.cells.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t\tthis.pending.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t\tif (this.fwwPolicy.state === \"on\") {\n\t\t\t\tthis.fwwPolicy.cellLastWriteTracker?.clearCols(\n\t\t\t\t\t/* colStart: */ colHandle,\n\t\t\t\t\t/* colCount: */ 1,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t};\n\n\tpublic switchSetCellPolicy(): void {\n\t\tif (this.fwwPolicy.state === \"off\") {\n\t\t\tthis.fwwPolicy = this.isAttached()\n\t\t\t\t? { state: \"local\" }\n\t\t\t\t: {\n\t\t\t\t\t\tstate: \"on\",\n\t\t\t\t\t\tswitchOpSeqNumber: 0,\n\t\t\t\t\t\tcellLastWriteTracker: new SparseArray2D(),\n\t\t\t\t\t};\n\t\t}\n\t}\n\n\tpublic toString(): string {\n\t\tlet s = `client:${\n\t\t\tthis.runtime.clientId\n\t\t}\\nrows: ${this.rows.toString()}\\ncols: ${this.cols.toString()}\\n\\n`;\n\n\t\tfor (let r = 0; r < this.rowCount; r++) {\n\t\t\ts += ` [`;\n\t\t\tfor (let c = 0; c < this.colCount; c++) {\n\t\t\t\tif (c > 0) {\n\t\t\t\t\ts += \", \";\n\t\t\t\t}\n\n\t\t\t\ts += `${this.serializer.stringify(this.getCell(r, c), this.handle)}`;\n\t\t\t}\n\t\t\ts += \"]\\n\";\n\t\t}\n\n\t\treturn `${s}\\n`;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}\n\t */\n\tprotected applyStashedOp(_content: unknown): void {\n\t\tconst content = _content as MatrixSetOrVectorOp<T>;\n\t\tif (content.type === MatrixOp.set && content.target === undefined) {\n\t\t\tif (content.fwwMode === true) {\n\t\t\t\tthis.switchSetCellPolicy();\n\t\t\t}\n\t\t\tthis.setCell(content.row, content.col, content.value);\n\t\t} else {\n\t\t\tconst vector = content.target === SnapshotPath.cols ? this.cols : this.rows;\n\t\t\tvector.applyStashedOp(content);\n\t\t\tif (content.target === SnapshotPath.cols) {\n\t\t\t\tthis.submitColMessage(content);\n\t\t\t} else {\n\t\t\t\tthis.submitRowMessage(content);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"matrix.js","sourceRoot":"","sources":["../src/matrix.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 {\n\tIEvent,\n\tIEventThisPlaceHolder,\n\ttype IEventProvider,\n} from \"@fluidframework/core-interfaces\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\ttype IChannel,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tClient,\n\tIJSONSegment,\n\tIMergeTreeOp,\n\ttype ISegmentInternal,\n\ttype LocalReferencePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\tsegmentIsRemoved,\n} from \"@fluidframework/merge-tree/internal\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions/internal\";\nimport {\n\tObjectStoragePartition,\n\tSummaryTreeBuilder,\n} from \"@fluidframework/runtime-utils/internal\";\nimport {\n\tIFluidSerializer,\n\tISharedObjectEvents,\n\tSharedObject,\n} from \"@fluidframework/shared-object-base/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport {\n\tIMatrixConsumer,\n\tIMatrixProducer,\n\tIMatrixReader,\n\tIMatrixWriter,\n} from \"@tiny-calc/nano\";\nimport Deque from \"double-ended-queue\";\n\nimport type { HandleCache } from \"./handlecache.js\";\nimport { Handle, isHandleValid } from \"./handletable.js\";\nimport {\n\tISetOp,\n\tMatrixItem,\n\tMatrixOp,\n\tMatrixSetOrVectorOp,\n\tSnapshotPath,\n\tVectorOp,\n} from \"./ops.js\";\nimport { PermutationVector, reinsertSegmentIntoVector } from \"./permutationvector.js\";\nimport { ensureRange } from \"./range.js\";\nimport { deserializeBlob } from \"./serialization.js\";\nimport { SparseArray2D, type RecurArray } from \"./sparsearray2d.js\";\nimport { IUndoConsumer } from \"./types.js\";\nimport { MatrixUndoProvider } from \"./undoprovider.js\";\n\ninterface ISetOpMetadata {\n\trowHandle: Handle;\n\tcolHandle: Handle;\n\tlocalSeq: number;\n\trowsRef: LocalReferencePosition;\n\tcolsRef: LocalReferencePosition;\n\treferenceSeqNumber: number;\n}\n\n/**\n * Events emitted by Shared Matrix.\n * @legacy\n * @alpha\n */\nexport interface ISharedMatrixEvents<T> extends IEvent {\n\t/**\n\t * This event is only emitted when the SetCell Resolution Policy is First Write Win(FWW).\n\t * This is emitted when two clients race and send changes without observing each other changes,\n\t * the changes that gets sequenced last would be rejected, and only client who's changes rejected\n\t * would be notified via this event, with expectation that it will merge its changes back by\n\t * accounting new information (state from winner of the race).\n\t *\n\t * @remarks Listener parameters:\n\t *\n\t * - `row` - Row number at which conflict happened.\n\t *\n\t * - `col` - Col number at which conflict happened.\n\t *\n\t * - `currentValue` - The current value of the cell.\n\t *\n\t * - `conflictingValue` - The value that this client tried to set in the cell and got ignored due to conflict.\n\t *\n\t * - `target` - The {@link ISharedMatrix} itself.\n\t */\n\t(\n\t\tevent: \"conflict\",\n\t\tlistener: (\n\t\t\trow: number,\n\t\t\tcol: number,\n\t\t\tcurrentValue: MatrixItem<T>,\n\t\t\tconflictingValue: MatrixItem<T>,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n}\n\n/**\n * This represents the item which is used to track the client which modified the cell last.\n */\ninterface CellLastWriteTrackerItem {\n\tseqNum: number; // Seq number of op which last modified this cell\n\tclientId: string; // clientId of the client which last modified this cell\n}\n\n/**\n * @legacy\n * @alpha\n */\n// Changing this to `unknown` would be a breaking change.\n// TODO: if possible, transition ISharedMatrix to not use `any`.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface ISharedMatrix<T = any>\n\textends IEventProvider<ISharedMatrixEvents<T>>,\n\t\tIMatrixProducer<MatrixItem<T>>,\n\t\tIMatrixReader<MatrixItem<T>>,\n\t\tIMatrixWriter<MatrixItem<T>>,\n\t\tIChannel {\n\t/**\n\t * Inserts columns into the matrix.\n\t * @param colStart - Index of the first column to insert.\n\t * @param count - Number of columns to insert.\n\t * @remarks\n\t * Inserting 0 columns is a noop.\n\t */\n\tinsertCols(colStart: number, count: number): void;\n\t/**\n\t * Removes columns from the matrix.\n\t * @param colStart - Index of the first column to remove.\n\t * @param count - Number of columns to remove.\n\t * @remarks\n\t * Removing 0 columns is a noop.\n\t */\n\tremoveCols(colStart: number, count: number): void;\n\t/**\n\t * Inserts rows into the matrix.\n\t * @param rowStart - Index of the first row to insert.\n\t * @param count - Number of rows to insert.\n\t * @remarks\n\t * Inserting 0 rows is a noop.\n\t */\n\tinsertRows(rowStart: number, count: number): void;\n\t/**\n\t * Removes rows from the matrix.\n\t * @param rowStart - Index of the first row to remove.\n\t * @param count - Number of rows to remove.\n\t * @remarks\n\t * Removing 0 rows is a noop.\n\t */\n\tremoveRows(rowStart: number, count: number): void;\n\n\t/**\n\t * Sets a range of cells in the matrix.\n\t * Cells are set in consecutive columns between `colStart` and `colStart + colCount - 1`.\n\t * When `values` has larger size than `colCount`, the extra values are inserted in subsequent rows\n\t * a la text-wrapping.\n\t * @param rowStart - Index of the row to start setting cells.\n\t * @param colStart - Index of the column to start setting cells.\n\t * @param colCount - Number of columns to set before wrapping to subsequent rows (if `values` has more items)\n\t * @param values - Values to insert.\n\t * @remarks\n\t * This is not currently more efficient than calling `setCell` for each cell.\n\t */\n\tsetCells(\n\t\trowStart: number,\n\t\tcolStart: number,\n\t\tcolCount: number,\n\t\tvalues: readonly MatrixItem<T>[],\n\t): void;\n\n\t/**\n\t * Attach an {@link IUndoConsumer} to the matrix.\n\t * @param consumer - Undo consumer which will receive revertibles from the matrix.\n\t */\n\topenUndo(consumer: IUndoConsumer): void;\n\n\t/**\n\t * Whether the current conflict resolution policy is first-write win (FWW).\n\t * See {@link ISharedMatrix.switchSetCellPolicy} for more details.\n\t */\n\tisSetCellConflictResolutionPolicyFWW(): boolean;\n\n\t/**\n\t * Change the conflict resolution policy for setCell operations to first-write win (FWW).\n\t *\n\t * This API only switches from LWW to FWW and not from FWW to LWW.\n\t *\n\t * @privateRemarks\n\t * The next SetOp which is sent will communicate this policy to other clients.\n\t */\n\tswitchSetCellPolicy(): void;\n}\n\ntype FirstWriterWinsPolicy =\n\t| { state: \"off\" }\n\t| { state: \"local\" }\n\t| {\n\t\t\tstate: \"on\";\n\t\t\tswitchOpSeqNumber: number;\n\t\t\tcellLastWriteTracker: SparseArray2D<CellLastWriteTrackerItem>;\n\t };\n\n/**\n * Tracks pending local changes for a cell.\n */\ninterface PendingCellChanges<T> {\n\t/**\n\t * The local changes including the local seq, and the value set at that local seq.\n\t */\n\tlocal: { localSeq: number; value: MatrixItem<T> }[];\n\t/**\n\t * The latest consensus value across all clients.\n\t * this will either be a remote value or ack'd local\n\t * value.\n\t */\n\tconsensus?: MatrixItem<T>;\n}\n\n/**\n * A SharedMatrix holds a rectangular 2D array of values. Supported operations\n * include setting values and inserting/removing rows and columns.\n *\n * Matrix values may be any Fluid serializable type, which is the set of JSON\n * serializable types extended to include IFluidHandles.\n *\n * Fluid's SharedMatrix implementation works equally well for dense and sparse\n * matrix data and physically stores data in Z-order to leverage CPU caches and\n * prefetching when reading in either row or column major order. (See README.md\n * for more details.)\n * @legacy\n * @alpha\n */\n// Changing this to `unknown` would be a breaking change.\n// TODO: if possible, transition SharedMatrix to not use `any`.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class SharedMatrix<T = any>\n\textends SharedObject<ISharedMatrixEvents<T> & ISharedObjectEvents>\n\timplements ISharedMatrix<T>\n{\n\tprivate readonly consumers = new Set<IMatrixConsumer<MatrixItem<T>>>();\n\n\t/**\n\t * Note: this field only provides a lower-bound on the reference sequence numbers for in-flight ops.\n\t * The exact reason isn't understood, but some e2e tests suggest that the runtime may sometimes process\n\t * incoming leave/join ops before putting an op that this DDS submits over the wire.\n\t *\n\t * E.g. SharedMatrix submits an op while deltaManager has lastSequenceNumber = 10, but before the runtime\n\t * puts this op over the wire, it processes a client join/leave op with sequence number 11, so the referenceSequenceNumber\n\t * on the SharedMatrix op is 11.\n\t */\n\tprivate readonly inFlightRefSeqs = new Deque<number>();\n\treadonly getMinInFlightRefSeq = (): number | undefined => this.inFlightRefSeqs.get(0);\n\n\tprivate readonly rows: PermutationVector; // Map logical row to storage handle (if any)\n\tprivate readonly cols: PermutationVector; // Map logical col to storage handle (if any)\n\n\tprivate cells = new SparseArray2D<MatrixItem<T>>(); // Stores cell values.\n\tprivate readonly pending = new SparseArray2D<PendingCellChanges<T>>(); // Tracks pending writes.\n\n\tprivate fwwPolicy: FirstWriterWinsPolicy = {\n\t\tstate: \"off\",\n\t};\n\n\t// Used to track if there is any reentrancy in setCell code.\n\tprivate reentrantCount: number = 0;\n\n\t/**\n\t * Constructor for the Shared Matrix\n\t * @param runtime - DataStore runtime.\n\t * @param id - id of the dds\n\t * @param attributes - channel attributes\n\t * @param _isSetCellConflictResolutionPolicyFWW - Conflict resolution for Matrix set op is First Writer Win in case of\n\t * race condition. Client can still overwrite values in case of no race.\n\t */\n\tconstructor(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tpublic id: string,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(id, runtime, attributes, \"fluid_matrix_\");\n\n\t\tthis.rows = new PermutationVector(\n\t\t\tSnapshotPath.rows,\n\t\t\tthis.logger,\n\t\t\truntime,\n\t\t\tthis.onRowDelta,\n\t\t\tthis.onRowHandlesRecycled,\n\t\t\tthis.getMinInFlightRefSeq,\n\t\t);\n\n\t\tthis.cols = new PermutationVector(\n\t\t\tSnapshotPath.cols,\n\t\t\tthis.logger,\n\t\t\truntime,\n\t\t\tthis.onColDelta,\n\t\t\tthis.onColHandlesRecycled,\n\t\t\tthis.getMinInFlightRefSeq,\n\t\t);\n\t}\n\n\tprivate undo?: MatrixUndoProvider<T>;\n\n\t/**\n\t * Subscribes the given IUndoConsumer to the matrix.\n\t */\n\tpublic openUndo(consumer: IUndoConsumer): void {\n\t\tassert(\n\t\t\tthis.undo === undefined,\n\t\t\t0x019 /* \"SharedMatrix.openUndo() supports at most a single IUndoConsumer.\" */,\n\t\t);\n\n\t\tthis.undo = new MatrixUndoProvider(consumer, this, this.rows, this.cols);\n\t}\n\n\t// TODO: closeUndo()?\n\n\tprivate get rowHandles(): HandleCache {\n\t\treturn this.rows.handleCache;\n\t}\n\tprivate get colHandles(): HandleCache {\n\t\treturn this.cols.handleCache;\n\t}\n\n\t// #region IMatrixProducer\n\n\topenMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): IMatrixReader<MatrixItem<T>> {\n\t\tthis.consumers.add(consumer);\n\t\treturn this;\n\t}\n\n\tcloseMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): void {\n\t\tthis.consumers.delete(consumer);\n\t}\n\n\t// #endregion IMatrixProducer\n\n\t// #region IMatrixReader\n\n\tpublic get rowCount(): number {\n\t\treturn this.rows.getLength();\n\t}\n\tpublic get colCount(): number {\n\t\treturn this.cols.getLength();\n\t}\n\n\tpublic isSetCellConflictResolutionPolicyFWW(): boolean {\n\t\treturn this.fwwPolicy.state !== \"off\";\n\t}\n\n\tpublic getCell(row: number, col: number): MatrixItem<T> {\n\t\t// Perf: When possible, bounds checking is performed inside the implementation for\n\t\t// 'getHandle()' so that it can be elided in the case of a cache hit. This\n\t\t// yields an ~40% improvement in the case of a cache hit (node v12 x64)\n\n\t\t// Map the logical (row, col) to associated storage handles.\n\t\tconst rowHandle = this.rowHandles.getHandle(row);\n\t\tif (isHandleValid(rowHandle)) {\n\t\t\tconst colHandle = this.colHandles.getHandle(col);\n\t\t\tif (isHandleValid(colHandle)) {\n\t\t\t\treturn this.cells.getCell(rowHandle, colHandle);\n\t\t\t}\n\t\t} else {\n\t\t\t// If we early exit because the given rowHandle is unallocated, we still need to\n\t\t\t// bounds-check the 'col' parameter.\n\t\t\tensureRange(col, this.cols.getLength());\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tpublic get matrixProducer(): IMatrixProducer<MatrixItem<T>> {\n\t\treturn this;\n\t}\n\n\t// #endregion IMatrixReader\n\n\tpublic setCell(row: number, col: number, value: MatrixItem<T>): void {\n\t\tif (row < 0 || row >= this.rowCount || col < 0 || col >= this.colCount) {\n\t\t\tthrow new UsageError(\"Trying to set out-of-bounds cell.\");\n\t\t}\n\n\t\tthis.setCellCore(row, col, value);\n\t}\n\n\tpublic setCells(\n\t\trowStart: number,\n\t\tcolStart: number,\n\t\tcolCount: number,\n\t\tvalues: readonly MatrixItem<T>[],\n\t): void {\n\t\tconst rowCount = Math.ceil(values.length / colCount);\n\n\t\tassert(\n\t\t\t0 <= rowStart &&\n\t\t\t\trowStart < this.rowCount &&\n\t\t\t\t0 <= colStart &&\n\t\t\t\tcolStart < this.colCount &&\n\t\t\t\t1 <= colCount &&\n\t\t\t\tcolCount <= this.colCount - colStart &&\n\t\t\t\trowCount <= this.rowCount - rowStart,\n\t\t\t0x01b /* \"Trying to set multiple out-of-bounds cells!\" */,\n\t\t);\n\n\t\tconst endCol = colStart + colCount;\n\t\tlet r = rowStart;\n\t\tlet c = colStart;\n\n\t\tfor (const value of values) {\n\t\t\tthis.setCellCore(r, c, value);\n\n\t\t\tif (++c === endCol) {\n\t\t\t\tc = colStart;\n\t\t\t\tr++;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate setCellCore(\n\t\trow: number,\n\t\tcol: number,\n\t\tvalue: MatrixItem<T>,\n\t\trowHandle = this.rows.getAllocatedHandle(row),\n\t\tcolHandle = this.cols.getAllocatedHandle(col),\n\t\trollback?: boolean,\n\t): void {\n\t\tthis.protectAgainstReentrancy(() => {\n\t\t\tconst oldValue = this.cells.getCell(rowHandle, colHandle) ?? undefined;\n\n\t\t\tif (this.undo !== undefined) {\n\t\t\t\tthis.undo.cellSet(rowHandle, colHandle, oldValue);\n\t\t\t}\n\n\t\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\n\t\t\tif (this.isAttached() && rollback !== true) {\n\t\t\t\tconst pending = this.sendSetCellOp(row, col, value, rowHandle, colHandle);\n\t\t\t\tif (pending.local.length === 1) {\n\t\t\t\t\tpending.consensus ??= oldValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Avoid reentrancy by raising change notifications after the op is queued.\n\t\t\tfor (const consumer of this.consumers.values()) {\n\t\t\t\tconsumer.cellsChanged(row, col, 1, 1, this);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate createOpMetadataLocalRef(\n\t\tvector: PermutationVector,\n\t\tpos: number,\n\t\tlocalSeq: number,\n\t): LocalReferencePosition {\n\t\tconst segoff = vector.getContainingSegment(pos, undefined, localSeq);\n\t\tassert(segoff !== undefined, 0x8b3 /* expected valid position */);\n\t\treturn vector.createLocalReferencePosition(\n\t\t\tsegoff.segment,\n\t\t\tsegoff.offset,\n\t\t\tReferenceType.StayOnRemove,\n\t\t\tundefined,\n\t\t);\n\t}\n\n\tprivate sendSetCellOp(\n\t\trow: number,\n\t\tcol: number,\n\t\tvalue: MatrixItem<T>,\n\t\trowHandle: Handle,\n\t\tcolHandle: Handle,\n\t\tlocalSeq = this.nextLocalSeq(),\n\t): PendingCellChanges<T> {\n\t\tassert(\n\t\t\tthis.isAttached(),\n\t\t\t0x1e2 /* \"Caller must ensure 'isAttached()' before calling 'sendSetCellOp'.\" */,\n\t\t);\n\n\t\tconst op: ISetOp<T> = {\n\t\t\ttype: MatrixOp.set,\n\t\t\trow,\n\t\t\tcol,\n\t\t\tvalue,\n\t\t\tfwwMode: this.fwwPolicy.state !== \"off\",\n\t\t};\n\n\t\tconst rowsRef = this.createOpMetadataLocalRef(this.rows, row, localSeq);\n\t\tconst colsRef = this.createOpMetadataLocalRef(this.cols, col, localSeq);\n\t\tconst metadata: ISetOpMetadata = {\n\t\t\trowHandle,\n\t\t\tcolHandle,\n\t\t\tlocalSeq,\n\t\t\trowsRef,\n\t\t\tcolsRef,\n\t\t\treferenceSeqNumber: this.deltaManager.lastSequenceNumber,\n\t\t};\n\n\t\tthis.submitLocalMessage(op, metadata);\n\t\tconst pendingCell: PendingCellChanges<T> = this.pending.getCell(rowHandle, colHandle) ?? {\n\t\t\tlocal: [],\n\t\t};\n\t\tpendingCell.local.push({ localSeq, value });\n\t\tthis.pending.setCell(rowHandle, colHandle, pendingCell);\n\t\treturn pendingCell;\n\t}\n\n\t/**\n\t * This makes sure that the code inside the callback is not reentrant. We need to do that because we raise notifications\n\t * to the consumers telling about these changes and they can try to change the matrix while listening to those notifications\n\t * which can make the shared matrix to be in bad state. For example, we are raising notification for a setCell changes and\n\t * a consumer tries to delete that row/col on receiving that notification which can lead to this matrix trying to setCell in\n\t * a deleted row/col.\n\t * @param callback - code that needs to protected against reentrancy.\n\t */\n\tprivate protectAgainstReentrancy(callback: () => void): void {\n\t\tif (this.reentrantCount !== 0) {\n\t\t\t// Validate that applications don't submit edits in response to matrix change notifications. This is unsupported.\n\t\t\tthrow new UsageError(\"Reentrancy detected in SharedMatrix.\");\n\t\t}\n\t\tthis.reentrantCount++;\n\t\ttry {\n\t\t\tcallback();\n\t\t} finally {\n\t\t\tthis.reentrantCount--;\n\t\t}\n\t\tassert(\n\t\t\tthis.reentrantCount === 0,\n\t\t\t0x85e /* indicates a problem with the reentrancy tracking code. */,\n\t\t);\n\t}\n\n\tprivate submitVectorMessage(\n\t\tcurrentVector: PermutationVector,\n\t\toppositeVector: PermutationVector,\n\t\ttarget: SnapshotPath.rows | SnapshotPath.cols,\n\t\tmessage: IMergeTreeOp,\n\t): void {\n\t\t// Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n\t\t// and the SharedMatrix's cell data. Instead, we externally advance each MergeTree's 'localSeq' counter\n\t\t// for each submitted op it not aware of to keep them synchronized.\n\t\tconst localSeq = currentVector.getCollabWindow().localSeq;\n\t\tconst oppositeWindow = oppositeVector.getCollabWindow();\n\n\t\t// Note that the comparison is '>=' because, in the case the MergeTree is regenerating ops for reconnection,\n\t\t// the MergeTree submits the op with the original 'localSeq'.\n\t\tassert(\n\t\t\tlocalSeq >= oppositeWindow.localSeq,\n\t\t\t0x01c /* \"The 'localSeq' of the vector submitting an op must >= the 'localSeq' of the other vector.\" */,\n\t\t);\n\n\t\toppositeWindow.localSeq = localSeq;\n\n\t\t// If the SharedMatrix is local, it's state will be submitted via a Snapshot when initially connected.\n\t\t// Do not queue a message or track the pending op, as there will never be an ACK, etc.\n\t\tif (this.isAttached()) {\n\t\t\t// Record whether this `op` targets rows or cols. (See dispatch in `processCore()`)\n\t\t\tconst targetedMessage: VectorOp = { ...message, target };\n\n\t\t\tthis.submitLocalMessage(\n\t\t\t\ttargetedMessage,\n\t\t\t\tcurrentVector.peekPendingSegmentGroups(\n\t\t\t\t\tmessage.type === MergeTreeDeltaType.GROUP ? message.ops.length : 1,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate submitColMessage(message: IMergeTreeOp): void {\n\t\tthis.submitVectorMessage(this.cols, this.rows, SnapshotPath.cols, message);\n\t}\n\n\tpublic insertCols(colStart: number, count: number): void {\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (colStart > this.colCount) {\n\t\t\tthrow new UsageError(\"insertCols: out of bounds\");\n\t\t}\n\t\tthis.protectAgainstReentrancy(() => {\n\t\t\tconst message = this.cols.insert(colStart, count);\n\t\t\tassert(message !== undefined, 0x8b4 /* must be defined */);\n\t\t\tthis.submitColMessage(message);\n\t\t});\n\t}\n\n\tpublic removeCols(colStart: number, count: number): void {\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (colStart > this.colCount) {\n\t\t\tthrow new UsageError(\"removeCols: out of bounds\");\n\t\t}\n\t\tthis.protectAgainstReentrancy(() =>\n\t\t\tthis.submitColMessage(this.cols.remove(colStart, count)),\n\t\t);\n\t}\n\n\tprivate submitRowMessage(message: IMergeTreeOp): void {\n\t\tthis.submitVectorMessage(this.rows, this.cols, SnapshotPath.rows, message);\n\t}\n\n\tpublic insertRows(rowStart: number, count: number): void {\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (rowStart > this.rowCount) {\n\t\t\tthrow new UsageError(\"insertRows: out of bounds\");\n\t\t}\n\t\tthis.protectAgainstReentrancy(() => {\n\t\t\tconst message = this.rows.insert(rowStart, count);\n\t\t\tassert(message !== undefined, 0x8b5 /* must be defined */);\n\t\t\tthis.submitRowMessage(message);\n\t\t});\n\t}\n\n\tpublic removeRows(rowStart: number, count: number): void {\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (rowStart > this.rowCount) {\n\t\t\tthrow new UsageError(\"removeRows: out of bounds\");\n\t\t}\n\t\tthis.protectAgainstReentrancy(() =>\n\t\t\tthis.submitRowMessage(this.rows.remove(rowStart, count)),\n\t\t);\n\t}\n\n\tpublic _undoRemoveRows(rowStart: number, spec: IJSONSegment): void {\n\t\tconst { op, inserted } = reinsertSegmentIntoVector(this.rows, rowStart, spec);\n\t\tassert(op !== undefined, 0x8b6 /* must be defined */);\n\t\tthis.submitRowMessage(op);\n\n\t\t// Generate setCell ops for each populated cell in the reinserted rows.\n\t\tlet rowHandle = inserted.start;\n\t\tconst rowCount = inserted.cachedLength;\n\t\tfor (let row = rowStart; row < rowStart + rowCount; row++, rowHandle++) {\n\t\t\tfor (let col = 0; col < this.colCount; col++) {\n\t\t\t\tconst colHandle = this.colHandles.getHandle(col);\n\t\t\t\tconst value = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\tif (this.isAttached() && value !== undefined && value !== null) {\n\t\t\t\t\tthis.sendSetCellOp(row, col, value, rowHandle, colHandle);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Avoid reentrancy by raising change notifications after the op is queued.\n\t\tfor (const consumer of this.consumers.values()) {\n\t\t\tconsumer.cellsChanged(rowStart, /* colStart: */ 0, rowCount, this.colCount, this);\n\t\t}\n\t}\n\n\t/***/ public _undoRemoveCols(colStart: number, spec: IJSONSegment): void {\n\t\tconst { op, inserted } = reinsertSegmentIntoVector(this.cols, colStart, spec);\n\t\tassert(op !== undefined, 0x8b7 /* must be defined */);\n\t\tthis.submitColMessage(op);\n\n\t\t// Generate setCell ops for each populated cell in the reinserted cols.\n\t\tlet colHandle = inserted.start;\n\t\tconst colCount = inserted.cachedLength;\n\t\tfor (let col = colStart; col < colStart + colCount; col++, colHandle++) {\n\t\t\tfor (let row = 0; row < this.rowCount; row++) {\n\t\t\t\tconst rowHandle = this.rowHandles.getHandle(row);\n\t\t\t\tconst value = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\tif (this.isAttached() && value !== undefined && value !== null) {\n\t\t\t\t\tthis.sendSetCellOp(row, col, value, rowHandle, colHandle);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Avoid reentrancy by raising change notifications after the op is queued.\n\t\tfor (const consumer of this.consumers.values()) {\n\t\t\tconsumer.cellsChanged(/* rowStart: */ 0, colStart, this.rowCount, colCount, this);\n\t\t}\n\t}\n\n\tprotected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tbuilder.addWithStats(\n\t\t\tSnapshotPath.rows,\n\t\t\tthis.rows.summarize(this.runtime, this.handle, serializer),\n\t\t);\n\t\tbuilder.addWithStats(\n\t\t\tSnapshotPath.cols,\n\t\t\tthis.cols.summarize(this.runtime, this.handle, serializer),\n\t\t);\n\t\tconst artifactsToSummarize: (\n\t\t\t| undefined\n\t\t\t| number\n\t\t\t| ReturnType<SparseArray2D<MatrixItem<T> | number>[\"snapshot\"]>\n\t\t)[] = [\n\t\t\tthis.cells.snapshot(),\n\t\t\t/**\n\t\t\t * we used to write this.pending.snapshot(). this should have never been done, as pending is only for local\n\t\t\t * changes, and there should never be local changes in the summarizer. This was also never used on load\n\t\t\t * as there is no way to understand a previous clients pending changes. so we just set this to a constant\n\t\t\t * which matches an empty this.pending.snapshot() for back-compat in terms of the array length\n\t\t\t */\n\t\t\t[undefined],\n\t\t];\n\n\t\t// Only need to store it in the snapshot if we have switched the policy already.\n\t\tif (this.fwwPolicy.state === \"on\") {\n\t\t\tartifactsToSummarize.push(\n\t\t\t\tthis.fwwPolicy.switchOpSeqNumber,\n\t\t\t\tthis.fwwPolicy.cellLastWriteTracker.snapshot(),\n\t\t\t);\n\t\t} else {\n\t\t\t// back-compat: used -1 for disabled\n\t\t\tartifactsToSummarize.push(\n\t\t\t\t-1,\n\t\t\t\t/*\n\t\t\t\t * we should set undefined in place of cellLastWriteTracker to ensure the number of array entries is consistent.\n\t\t\t\t * Doing that currently breaks snapshot tests. Its is probably fine, but if new elements are ever added, we need\n\t\t\t\t * ensure undefined is also set.\n\t\t\t\t */\n\t\t\t\t// undefined\n\t\t\t);\n\t\t}\n\t\tbuilder.addBlob(\n\t\t\tSnapshotPath.cells,\n\t\t\tserializer.stringify(artifactsToSummarize, this.handle),\n\t\t);\n\t\treturn builder.getSummaryTree();\n\t}\n\n\t/**\n\t * Runs serializer on the GC data for this SharedMatrix.\n\t * All the IFluidHandle's stored in the cells represent routes to other objects.\n\t */\n\tprotected processGCDataCore(serializer: IFluidSerializer): void {\n\t\tfor (let row = 0; row < this.rowCount; row++) {\n\t\t\tfor (let col = 0; col < this.colCount; col++) {\n\t\t\t\tserializer.stringify(this.getCell(row, col), this.handle);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Advances the 'localSeq' counter for the cell data operation currently being queued.\n\t *\n\t * Do not use with 'submitColMessage()/submitRowMessage()' as these helpers + the MergeTree will\n\t * automatically advance 'localSeq'.\n\t */\n\tprivate nextLocalSeq(): number {\n\t\t// Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n\t\t// and the SharedMatrix's cell data. Instead, we externally bump each MergeTree's 'localSeq' counter\n\t\t// for SharedMatrix ops it's not aware of to keep them synchronized. (For cell data operations, we\n\t\t// need to bump both counters.)\n\n\t\tthis.cols.getCollabWindow().localSeq++;\n\t\treturn ++this.rows.getCollabWindow().localSeq;\n\t}\n\n\tprotected submitLocalMessage(message: unknown, localOpMetadata?: unknown): void {\n\t\t// TODO: Recommend moving this assertion into SharedObject\n\t\t// (See https://github.com/microsoft/FluidFramework/issues/2559)\n\t\tassert(\n\t\t\tthis.isAttached() === true,\n\t\t\t0x01d /* \"Trying to submit message to runtime while detached!\" */,\n\t\t);\n\n\t\tthis.inFlightRefSeqs.push(this.deltaManager.lastSequenceNumber);\n\t\tsuper.submitLocalMessage(message, localOpMetadata);\n\n\t\t// Ensure that row/col 'localSeq' are synchronized (see 'nextLocalSeq()').\n\t\tassert(\n\t\t\tthis.rows.getCollabWindow().localSeq === this.cols.getCollabWindow().localSeq,\n\t\t\t0x01e /* \"Row and col collab window 'localSeq' desynchronized!\" */,\n\t\t);\n\t}\n\n\tprotected didAttach(): void {\n\t\t// We've attached we need to start generating and sending ops.\n\t\t// so start collaboration and provide a default client id incase we are not connected\n\t\tif (this.isAttached()) {\n\t\t\tthis.rows.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n\t\t\tthis.cols.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n\t\t}\n\t}\n\n\tprotected onConnect(): void {\n\t\tassert(\n\t\t\tthis.rows.getCollabWindow().collaborating === this.cols.getCollabWindow().collaborating,\n\t\t\t0x01f /* \"Row and col collab window 'collaborating' status desynchronized!\" */,\n\t\t);\n\n\t\t// Update merge tree collaboration information with new client ID and then resend pending ops\n\t\tthis.rows.startOrUpdateCollaboration(this.runtime.clientId as string);\n\t\tthis.cols.startOrUpdateCollaboration(this.runtime.clientId as string);\n\t}\n\n\tprivate rebasePosition(\n\t\tclient: Client,\n\t\tref: LocalReferencePosition,\n\t\tlocalSeq: number,\n\t): number | undefined {\n\t\tconst segment: ISegmentInternal | undefined = ref.getSegment();\n\t\tconst offset = ref.getOffset();\n\t\t// If the segment that contains the position is removed, then this setCell op should do nothing.\n\t\tif (segment === undefined || offset === undefined || segmentIsRemoved(segment)) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn client.findReconnectionPosition(segment, localSeq) + offset;\n\t}\n\n\tprotected reSubmitCore(incoming: unknown, localOpMetadata: unknown): void {\n\t\tconst originalRefSeq = this.inFlightRefSeqs.shift();\n\t\tassert(\n\t\t\toriginalRefSeq !== undefined,\n\t\t\t0x8b9 /* Expected a recorded refSeq when resubmitting an op */,\n\t\t);\n\t\tconst content = incoming as MatrixSetOrVectorOp<T>;\n\n\t\tif (content.type === MatrixOp.set && content.target === undefined) {\n\t\t\tconst setOp = content;\n\t\t\tconst { rowHandle, colHandle, localSeq, rowsRef, colsRef, referenceSeqNumber } =\n\t\t\t\tlocalOpMetadata as ISetOpMetadata;\n\n\t\t\t// If after rebasing the op, we get a valid row/col number, that means the row/col\n\t\t\t// handles have not been recycled and we can safely use them.\n\t\t\tconst row = this.rebasePosition(this.rows, rowsRef, localSeq);\n\t\t\tconst col = this.rebasePosition(this.cols, colsRef, localSeq);\n\t\t\tthis.rows.removeLocalReferencePosition(rowsRef);\n\t\t\tthis.cols.removeLocalReferencePosition(colsRef);\n\n\t\t\tconst pendingCell = this.pending.getCell(rowHandle, colHandle);\n\t\t\tassert(pendingCell !== undefined, 0xba4 /* local operation must have a pending array */);\n\t\t\tconst { local } = pendingCell;\n\t\t\tassert(local !== undefined, 0xba5 /* local operation must have a pending array */);\n\t\t\tconst localSeqIndex = local.findIndex((p) => p.localSeq === localSeq);\n\t\t\tassert(localSeqIndex >= 0, 0xba6 /* local operation must have a pending entry */);\n\t\t\tconst [change] = local.splice(localSeqIndex, 1);\n\t\t\tassert(change.localSeq === localSeq, 0xba7 /* must match */);\n\n\t\t\tif (\n\t\t\t\trow !== undefined &&\n\t\t\t\tcol !== undefined &&\n\t\t\t\trow >= 0 &&\n\t\t\t\tcol >= 0 && // If the mode is LWW, then send the op.\n\t\t\t\t// Otherwise if the current mode is FWW and if we generated this op, after seeing the\n\t\t\t\t// last set op, or it is the first set op for the cell, then regenerate the op,\n\t\t\t\t// otherwise raise conflict. We want to check the current mode here and not that\n\t\t\t\t// whether op was made in FWW or not.\n\t\t\t\t(this.fwwPolicy.state !== \"on\" ||\n\t\t\t\t\treferenceSeqNumber >=\n\t\t\t\t\t\t(this.fwwPolicy.cellLastWriteTracker.getCell(rowHandle, colHandle)?.seqNum ?? 0))\n\t\t\t) {\n\t\t\t\tthis.sendSetCellOp(row, col, setOp.value, rowHandle, colHandle, localSeq);\n\t\t\t}\n\t\t} else {\n\t\t\tswitch (content.target) {\n\t\t\t\tcase SnapshotPath.cols: {\n\t\t\t\t\tthis.submitColMessage(\n\t\t\t\t\t\tthis.cols.regeneratePendingOp(content, localOpMetadata, false),\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase SnapshotPath.rows: {\n\t\t\t\t\tthis.submitRowMessage(\n\t\t\t\t\t\tthis.rows.regeneratePendingOp(content, localOpMetadata, false),\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tunreachableCase(content);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected rollback(content: unknown, localOpMetadata: unknown): void {\n\t\tconst contents = content as MatrixSetOrVectorOp<T>;\n\t\tconst target = contents.target;\n\n\t\tswitch (target) {\n\t\t\tcase SnapshotPath.cols: {\n\t\t\t\tthis.cols.rollback(content, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SnapshotPath.rows: {\n\t\t\t\tthis.rows.rollback(content, localOpMetadata);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase undefined: {\n\t\t\t\tassert(contents.type === MatrixOp.set, 0xba8 /* only sets supported */);\n\t\t\t\tconst setMetadata = localOpMetadata as ISetOpMetadata;\n\n\t\t\t\tconst pendingCell = this.pending.getCell(setMetadata.rowHandle, setMetadata.colHandle);\n\t\t\t\tassert(pendingCell !== undefined, 0xba9 /* must have pending */);\n\n\t\t\t\tconst change = pendingCell.local.pop();\n\t\t\t\tassert(change?.localSeq === setMetadata.localSeq, 0xbaa /* must have change */);\n\n\t\t\t\tconst previous =\n\t\t\t\t\tpendingCell.local.length > 0\n\t\t\t\t\t\t? pendingCell.local[pendingCell.local.length - 1].value\n\t\t\t\t\t\t: pendingCell.consensus;\n\n\t\t\t\tthis.setCellCore(\n\t\t\t\t\tcontents.row,\n\t\t\t\t\tcontents.col,\n\t\t\t\t\tprevious,\n\t\t\t\t\tsetMetadata.rowHandle,\n\t\t\t\t\tsetMetadata.colHandle,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault:\n\t\t}\n\t}\n\n\tprotected onDisconnect(): void {}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\ttry {\n\t\t\tawait this.rows.load(\n\t\t\t\tthis.runtime,\n\t\t\t\tnew ObjectStoragePartition(storage, SnapshotPath.rows),\n\t\t\t\tthis.serializer,\n\t\t\t);\n\t\t\tawait this.cols.load(\n\t\t\t\tthis.runtime,\n\t\t\t\tnew ObjectStoragePartition(storage, SnapshotPath.cols),\n\t\t\t\tthis.serializer,\n\t\t\t);\n\t\t\tconst [\n\t\t\t\tcellData,\n\t\t\t\t_pendingCliSeqData,\n\t\t\t\tsetCellLwwToFwwPolicySwitchOpSeqNumber,\n\t\t\t\tcellLastWriteTracker,\n\t\t\t\t// Cast is needed since the (de)serializer returns content of type `any`.\n\t\t\t] = (await deserializeBlob(storage, SnapshotPath.cells, this.serializer)) as [\n\t\t\t\tRecurArray<MatrixItem<T>>,\n\t\t\t\tunknown,\n\t\t\t\tnumber,\n\t\t\t\tRecurArray<CellLastWriteTrackerItem>,\n\t\t\t];\n\n\t\t\tthis.cells = SparseArray2D.load(cellData);\n\t\t\t// back-compat: used -1 for disabled, also may not exist\n\t\t\tconst switchOpSeqNumber =\n\t\t\t\tsetCellLwwToFwwPolicySwitchOpSeqNumber === -1\n\t\t\t\t\t? undefined\n\t\t\t\t\t: (setCellLwwToFwwPolicySwitchOpSeqNumber ?? undefined);\n\t\t\tthis.fwwPolicy =\n\t\t\t\tswitchOpSeqNumber === undefined\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tstate: \"off\",\n\t\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tstate: \"on\",\n\t\t\t\t\t\t\tswitchOpSeqNumber,\n\t\t\t\t\t\t\tcellLastWriteTracker: SparseArray2D.load(cellLastWriteTracker),\n\t\t\t\t\t\t};\n\t\t} catch (error) {\n\t\t\tthis.logger.sendErrorEvent({ eventName: \"MatrixLoadFailed\" }, error);\n\t\t}\n\t}\n\n\t/**\n\t * Tells whether the setCell op should be applied or not based on First Write Win policy. It assumes\n\t * we are in FWW mode.\n\t */\n\tprivate shouldSetCellBasedOnFWW(\n\t\trowHandle: Handle,\n\t\tcolHandle: Handle,\n\t\tmessage: ISequencedDocumentMessage,\n\t): boolean {\n\t\tassert(\n\t\t\tthis.fwwPolicy.state === \"on\",\n\t\t\t0x85f /* should be in Fww mode when calling this method */,\n\t\t);\n\t\tassert(message.clientId !== null, 0x860 /* clientId should not be null */);\n\t\tconst lastCellModificationDetails = this.fwwPolicy.cellLastWriteTracker.getCell(\n\t\t\trowHandle,\n\t\t\tcolHandle,\n\t\t);\n\t\t// If someone tried to Overwrite the cell value or first write on this cell or\n\t\t// same client tried to modify the cell.\n\t\treturn (\n\t\t\tlastCellModificationDetails === undefined ||\n\t\t\tlastCellModificationDetails.clientId === message.clientId ||\n\t\t\tmessage.referenceSequenceNumber >= lastCellModificationDetails.seqNum\n\t\t);\n\t}\n\n\tprotected processCore(\n\t\tmsg: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t): void {\n\t\tif (local) {\n\t\t\tconst recordedRefSeq = this.inFlightRefSeqs.shift();\n\t\t\tassert(recordedRefSeq !== undefined, 0x8ba /* No pending recorded refSeq found */);\n\t\t\t// TODO: AB#7076: Some equivalent assert should be enabled. This fails some e2e stashed op tests because\n\t\t\t// the deltaManager may have seen more messages than the runtime has processed while amidst the stashed op\n\t\t\t// flow, so e.g. when `applyStashedOp` is called and the DDS is put in a state where it expects an ack for\n\t\t\t// one of its messages, the delta manager has actually already seen subsequent messages from collaborators\n\t\t\t// which the in-flight message is concurrent to.\n\t\t\t// See \"handles stashed ops created on top of sequenced local ops\" for one such test case.\n\t\t\t// assert(recordedRefSeq <= message.referenceSequenceNumber, \"RefSeq mismatch\");\n\t\t}\n\n\t\tconst contents = msg.contents as MatrixSetOrVectorOp<T>;\n\t\tconst target = contents.target;\n\n\t\tswitch (target) {\n\t\t\tcase SnapshotPath.cols: {\n\t\t\t\tthis.cols.applyMsg(msg, local);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SnapshotPath.rows: {\n\t\t\t\tthis.rows.applyMsg(msg, local);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase undefined: {\n\t\t\t\tassert(\n\t\t\t\t\tcontents.type === MatrixOp.set,\n\t\t\t\t\t0x021 /* \"SharedMatrix message contents have unexpected type!\" */,\n\t\t\t\t);\n\n\t\t\t\tconst { row, col, value, fwwMode } = contents;\n\t\t\t\t// If this is the first op notifying us of the policy change, then set the policy change seq number.\n\t\t\t\tif (fwwMode === true && this.fwwPolicy.state !== \"on\") {\n\t\t\t\t\tthis.fwwPolicy = {\n\t\t\t\t\t\tstate: \"on\",\n\t\t\t\t\t\tswitchOpSeqNumber: msg.sequenceNumber,\n\t\t\t\t\t\tcellLastWriteTracker: new SparseArray2D(),\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tassert(msg.clientId !== null, 0x861 /* clientId should not be null!! */);\n\t\t\t\tif (local) {\n\t\t\t\t\t// We are receiving the ACK for a local pending set operation.\n\t\t\t\t\tconst { rowHandle, colHandle, localSeq, rowsRef, colsRef } =\n\t\t\t\t\t\tlocalOpMetadata as ISetOpMetadata;\n\t\t\t\t\tthis.rows.removeLocalReferencePosition(rowsRef);\n\t\t\t\t\tthis.cols.removeLocalReferencePosition(colsRef);\n\n\t\t\t\t\tconst pendingCell = this.pending.getCell(rowHandle, colHandle);\n\t\t\t\t\tconst ackedChange = pendingCell?.local.shift();\n\t\t\t\t\tassert(ackedChange?.localSeq === localSeq, 0xbab /* must match */);\n\t\t\t\t\tif (pendingCell?.local.length === 0) {\n\t\t\t\t\t\tthis.pending.setCell(rowHandle, colHandle, undefined);\n\t\t\t\t\t}\n\n\t\t\t\t\t// If policy is switched and cell should be modified too based on policy, then update the tracker.\n\t\t\t\t\t// If policy is not switched, then also update the tracker in case it is the latest.\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.fwwPolicy.state === \"on\" &&\n\t\t\t\t\t\tthis.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\tpendingCell!.consensus = ackedChange.value;\n\t\t\t\t\t\tthis.fwwPolicy.cellLastWriteTracker.setCell(rowHandle, colHandle, {\n\t\t\t\t\t\t\tseqNum: msg.sequenceNumber,\n\t\t\t\t\t\t\tclientId: msg.clientId,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst adjustedRow = this.rows.adjustPosition(row, msg);\n\t\t\t\t\tconst adjustedCol = this.cols.adjustPosition(col, msg);\n\n\t\t\t\t\tconst rowHandle = adjustedRow.handle;\n\t\t\t\t\tconst colHandle = adjustedCol.handle;\n\n\t\t\t\t\tassert(\n\t\t\t\t\t\tisHandleValid(rowHandle) && isHandleValid(colHandle),\n\t\t\t\t\t\t0x022 /* \"SharedMatrix row and/or col handles are invalid!\" */,\n\t\t\t\t\t);\n\t\t\t\t\tconst pendingCell = this.pending.getCell(rowHandle, colHandle);\n\t\t\t\t\tif (this.fwwPolicy.state === \"on\") {\n\t\t\t\t\t\t// If someone tried to Overwrite the cell value or first write on this cell or\n\t\t\t\t\t\t// same client tried to modify the cell or if the previous mode was LWW, then we need to still\n\t\t\t\t\t\t// overwrite the cell and raise conflict if we have pending changes as our change is going to be lost.\n\t\t\t\t\t\tif (this.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)) {\n\t\t\t\t\t\t\tconst previousValue = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\t\t\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\t\t\t\t\t\t\tthis.fwwPolicy.cellLastWriteTracker.setCell(rowHandle, colHandle, {\n\t\t\t\t\t\t\t\tseqNum: msg.sequenceNumber,\n\t\t\t\t\t\t\t\tclientId: msg.clientId,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (pendingCell !== undefined) {\n\t\t\t\t\t\t\t\tpendingCell.consensus = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (adjustedRow.pos !== undefined && adjustedCol.pos !== undefined) {\n\t\t\t\t\t\t\t\tfor (const consumer of this.consumers.values()) {\n\t\t\t\t\t\t\t\t\tconsumer.cellsChanged(adjustedRow.pos, adjustedCol.pos, 1, 1, this);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Check is there are any pending changes, which will be rejected. If so raise conflict.\n\t\t\t\t\t\t\t\tif (pendingCell !== undefined && pendingCell.local.length > 0) {\n\t\t\t\t\t\t\t\t\t// Don't reset the pending value yet, as there maybe more fww op from same client, so we want\n\t\t\t\t\t\t\t\t\t// to raise conflict event for that op also.\n\t\t\t\t\t\t\t\t\tthis.emit(\n\t\t\t\t\t\t\t\t\t\t\"conflict\",\n\t\t\t\t\t\t\t\t\t\trow,\n\t\t\t\t\t\t\t\t\t\tcol,\n\t\t\t\t\t\t\t\t\t\tvalue, // Current value\n\t\t\t\t\t\t\t\t\t\tpreviousValue, // Ignored local value\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (pendingCell === undefined || pendingCell.local.length === 0) {\n\t\t\t\t\t\t\t// If there is a pending (unACKed) local write to the same cell, skip the current op\n\t\t\t\t\t\t\t// since it \"happened before\" the pending write.\n\t\t\t\t\t\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\t\t\t\t\t\t\tif (adjustedRow.pos !== undefined && adjustedCol.pos !== undefined) {\n\t\t\t\t\t\t\t\tfor (const consumer of this.consumers.values()) {\n\t\t\t\t\t\t\t\t\tconsumer.cellsChanged(adjustedRow.pos, adjustedCol.pos, 1, 1, this);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpendingCell.consensus = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(target, \"unknown target\");\n\t\t\t}\n\t\t}\n\t}\n\n\t// Invoked by PermutationVector to notify IMatrixConsumers of row insertion/deletions.\n\tprivate readonly onRowDelta = (\n\t\tposition: number,\n\t\tremovedCount: number,\n\t\tinsertedCount: number,\n\t): void => {\n\t\tfor (const consumer of this.consumers) {\n\t\t\tconsumer.rowsChanged(position, removedCount, insertedCount, this);\n\t\t}\n\t};\n\n\t// Invoked by PermutationVector to notify IMatrixConsumers of col insertion/deletions.\n\tprivate readonly onColDelta = (\n\t\tposition: number,\n\t\tremovedCount: number,\n\t\tinsertedCount: number,\n\t): void => {\n\t\tfor (const consumer of this.consumers) {\n\t\t\tconsumer.colsChanged(position, removedCount, insertedCount, this);\n\t\t}\n\t};\n\n\tprivate readonly onRowHandlesRecycled = (rowHandles: Handle[]): void => {\n\t\tfor (const rowHandle of rowHandles) {\n\t\t\tthis.cells.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t\tthis.pending.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t\tif (this.fwwPolicy.state === \"on\") {\n\t\t\t\tthis.fwwPolicy.cellLastWriteTracker?.clearRows(\n\t\t\t\t\t/* rowStart: */ rowHandle,\n\t\t\t\t\t/* rowCount: */ 1,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t};\n\n\tprivate readonly onColHandlesRecycled = (colHandles: Handle[]): void => {\n\t\tfor (const colHandle of colHandles) {\n\t\t\tthis.cells.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t\tthis.pending.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t\tif (this.fwwPolicy.state === \"on\") {\n\t\t\t\tthis.fwwPolicy.cellLastWriteTracker?.clearCols(\n\t\t\t\t\t/* colStart: */ colHandle,\n\t\t\t\t\t/* colCount: */ 1,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t};\n\n\tpublic switchSetCellPolicy(): void {\n\t\tif (this.fwwPolicy.state === \"off\") {\n\t\t\tthis.fwwPolicy = this.isAttached()\n\t\t\t\t? { state: \"local\" }\n\t\t\t\t: {\n\t\t\t\t\t\tstate: \"on\",\n\t\t\t\t\t\tswitchOpSeqNumber: 0,\n\t\t\t\t\t\tcellLastWriteTracker: new SparseArray2D(),\n\t\t\t\t\t};\n\t\t}\n\t}\n\n\tpublic toString(): string {\n\t\tlet s = `client:${\n\t\t\tthis.runtime.clientId\n\t\t}\\nrows: ${this.rows.toString()}\\ncols: ${this.cols.toString()}\\n\\n`;\n\n\t\tfor (let r = 0; r < this.rowCount; r++) {\n\t\t\ts += ` [`;\n\t\t\tfor (let c = 0; c < this.colCount; c++) {\n\t\t\t\tif (c > 0) {\n\t\t\t\t\ts += \", \";\n\t\t\t\t}\n\n\t\t\t\ts += `${this.serializer.stringify(this.getCell(r, c), this.handle)}`;\n\t\t\t}\n\t\t\ts += \"]\\n\";\n\t\t}\n\n\t\treturn `${s}\\n`;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}\n\t */\n\tprotected applyStashedOp(_content: unknown): void {\n\t\tconst content = _content as MatrixSetOrVectorOp<T>;\n\t\tif (content.type === MatrixOp.set && content.target === undefined) {\n\t\t\tif (content.fwwMode === true) {\n\t\t\t\tthis.switchSetCellPolicy();\n\t\t\t}\n\t\t\tthis.setCell(content.row, content.col, content.value);\n\t\t} else {\n\t\t\tconst vector = content.target === SnapshotPath.cols ? this.cols : this.rows;\n\t\t\tvector.applyStashedOp(content);\n\t\t\tif (content.target === SnapshotPath.cols) {\n\t\t\t\tthis.submitColMessage(content);\n\t\t\t} else {\n\t\t\t\tthis.submitRowMessage(content);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
package/lib/packageVersion.d.ts
CHANGED
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,QAAQ,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.
|
|
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,QAAQ,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.43.0\";\n"]}
|