@fluidframework/matrix 2.0.0-dev-rc.4.0.0.261659 → 2.0.0-dev-rc.5.0.0.263932
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 +26 -0
- package/dist/matrix.d.ts.map +1 -1
- package/dist/matrix.js +13 -6
- 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/lib/matrix.d.ts.map +1 -1
- package/lib/matrix.js +13 -6
- 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/tsdoc-metadata.json +1 -1
- package/package.json +21 -20
- package/src/matrix.ts +15 -6
- package/src/packageVersion.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# @fluidframework/matrix
|
|
2
2
|
|
|
3
|
+
## 2.0.0-rc.4.0.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Deprecated members of IFluidHandle are split off into new IFluidHandleInternal interface [96872186d0](https://github.com/microsoft/FluidFramework/commit/96872186d0d0f245c1fece7d19b3743e501679b6)
|
|
8
|
+
|
|
9
|
+
Split IFluidHandle into two interfaces, `IFluidHandle` and `IFluidHandleInternal`.
|
|
10
|
+
Code depending on the previously deprecated members of IFluidHandle can access them by using `toFluidHandleInternal` from `@fluidframework/runtime-utils/legacy`.
|
|
11
|
+
|
|
12
|
+
External implementation of the `IFluidHandle` interface are not supported: this change makes the typing better convey this using the `ErasedType` pattern.
|
|
13
|
+
Any existing and previously working, and now broken, external implementations of `IFluidHandle` should still work at runtime, but will need some unsafe type casts to compile.
|
|
14
|
+
Such handle implementation may break in the future and thus should be replaced with use of handles produced by the Fluid Framework client packages.
|
|
15
|
+
|
|
16
|
+
- matrix: SharedMatrix class hidden [96872186d0](https://github.com/microsoft/FluidFramework/commit/96872186d0d0f245c1fece7d19b3743e501679b6)
|
|
17
|
+
|
|
18
|
+
The `SharedMatrix` class has been hidden from the alpha API.
|
|
19
|
+
In its place:
|
|
20
|
+
|
|
21
|
+
- The constant `SharedMatrix` is exposed as the entrypoint for `SharedMatrix` creation. See documentation on `ISharedObjectKind`.
|
|
22
|
+
- The type `SharedMatrix` is aliased to `ISharedMatrix`, which contains matrix's public API. This API has no semantic changes from previous versions.
|
|
23
|
+
|
|
24
|
+
Additionally, `SharedMatrixFactory` has been deprecated. Rather than construct the factory directly, use `SharedMatrix.getFactory()` (e.g. for usage in `DataObject` registries).
|
|
25
|
+
|
|
26
|
+
This change is part of a larger effort to clean up the API surface of various DDSes we have to leak less implementation details. See e.g. #20030.
|
|
27
|
+
Most code which uses `SharedMatrix` should continue to function without changes.
|
|
28
|
+
|
|
3
29
|
## 2.0.0-rc.3.0.0
|
|
4
30
|
|
|
5
31
|
### Major Changes
|
package/dist/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/dist/matrix.js
CHANGED
|
@@ -217,7 +217,7 @@ class SharedMatrix extends internal_4.SharedObject {
|
|
|
217
217
|
localSeq,
|
|
218
218
|
rowsRef,
|
|
219
219
|
colsRef,
|
|
220
|
-
referenceSeqNumber: this.
|
|
220
|
+
referenceSeqNumber: this.deltaManager.lastSequenceNumber,
|
|
221
221
|
};
|
|
222
222
|
this.submitLocalMessage(op, metadata);
|
|
223
223
|
this.pending.setCell(rowHandle, colHandle, localSeq);
|
|
@@ -231,11 +231,18 @@ class SharedMatrix extends internal_4.SharedObject {
|
|
|
231
231
|
* @param callback - code that needs to protected against reentrancy.
|
|
232
232
|
*/
|
|
233
233
|
protectAgainstReentrancy(callback) {
|
|
234
|
-
|
|
234
|
+
if (this.reentrantCount !== 0) {
|
|
235
|
+
// Validate that applications don't submit edits in response to matrix change notifications. This is unsupported.
|
|
236
|
+
throw new internal_5.UsageError("Reentrancy detected in SharedMatrix.");
|
|
237
|
+
}
|
|
235
238
|
this.reentrantCount++;
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
+
try {
|
|
240
|
+
callback();
|
|
241
|
+
}
|
|
242
|
+
finally {
|
|
243
|
+
this.reentrantCount--;
|
|
244
|
+
}
|
|
245
|
+
(0, internal_1.assert)(this.reentrantCount === 0, 0x85e /* indicates a problem with the reentrancy tracking code. */);
|
|
239
246
|
}
|
|
240
247
|
submitVectorMessage(currentVector, oppositeVector, target, message) {
|
|
241
248
|
// Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors
|
|
@@ -392,7 +399,7 @@ class SharedMatrix extends internal_4.SharedObject {
|
|
|
392
399
|
// TODO: Recommend moving this assertion into SharedObject
|
|
393
400
|
// (See https://github.com/microsoft/FluidFramework/issues/2559)
|
|
394
401
|
(0, internal_1.assert)(this.isAttached() === true, 0x01d /* "Trying to submit message to runtime while detached!" */);
|
|
395
|
-
this.inFlightRefSeqs.push(this.
|
|
402
|
+
this.inFlightRefSeqs.push(this.deltaManager.lastSequenceNumber);
|
|
396
403
|
super.submitLocalMessage(message, localOpMetadata);
|
|
397
404
|
// Ensure that row/col 'localSeq' are synchronized (see 'nextLocalSeq()').
|
|
398
405
|
(0, internal_1.assert)(this.rows.getCollabWindow().localSeq === this.cols.getCollabWindow().localSeq, 0x01e /* "Row and col collab window 'localSeq' desynchronized!" */);
|
package/dist/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\tIChannelStorageService,\n\tIFluidDataStoreRuntime,\n\ttype IChannel,\n} from \"@fluidframework/datastore-definitions\";\nimport {\n\t// eslint-disable-next-line import/no-deprecated\n\tClient,\n\tIJSONSegment,\n\tIMergeTreeOp,\n\ttype LocalReferencePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\t// eslint-disable-next-line import/no-deprecated\n\tSegmentGroup,\n} from \"@fluidframework/merge-tree/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ObjectStoragePartition, SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport { IFluidSerializer, ISharedObjectEvents } from \"@fluidframework/shared-object-base\";\nimport { SharedObject } from \"@fluidframework/shared-object-base/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport { IMatrixConsumer, IMatrixProducer, IMatrixReader, IMatrixWriter } from \"@tiny-calc/nano\";\nimport Deque from \"double-ended-queue\";\n\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 } 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 * @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/** @alpha */\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\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 * @alpha\n */\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\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<number>(); // Tracks pending writes.\n\tprivate cellLastWriteTracker = new SparseArray2D<CellLastWriteTrackerItem>(); // Tracks last writes sequence number and clientId in a cell.\n\t// Tracks the seq number of Op at which policy switch happens from Last Write Win to First Write Win.\n\tprivate setCellLwwToFwwPolicySwitchOpSeqNumber: number;\n\tprivate userSwitchedSetCellPolicy = false; // Set to true when the user calls switchPolicy.\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.setCellLwwToFwwPolicySwitchOpSeqNumber = -1;\n\t\tconst getMinInFlightRefSeq = () => this.inFlightRefSeqs.get(0);\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\tgetMinInFlightRefSeq,\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\tgetMinInFlightRefSeq,\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) {\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() {\n\t\treturn this.rows.handleCache;\n\t}\n\tprivate get colHandles() {\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() {\n\t\treturn this.rows.getLength();\n\t}\n\tpublic get colCount() {\n\t\treturn this.cols.getLength();\n\t}\n\n\tpublic isSetCellConflictResolutionPolicyFWW() {\n\t\treturn this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1 || this.userSwitchedSetCellPolicy;\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>) {\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) {\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) {\n\t\tthis.protectAgainstReentrancy(() => {\n\t\t\tif (this.undo !== undefined) {\n\t\t\t\tlet oldValue = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\tif (oldValue === null) {\n\t\t\t\t\toldValue = undefined;\n\t\t\t\t}\n\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()) {\n\t\t\t\tthis.sendSetCellOp(row, col, value, rowHandle, colHandle);\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(vector: PermutationVector, pos: number, localSeq: number) {\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) {\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:\n\t\t\t\tthis.userSwitchedSetCellPolicy || this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1,\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.runtime.deltaManager.lastSequenceNumber,\n\t\t};\n\n\t\tthis.submitLocalMessage(op, metadata);\n\t\tthis.pending.setCell(rowHandle, colHandle, localSeq);\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) {\n\t\tassert(this.reentrantCount === 0, 0x85d /* reentrant code */);\n\t\tthis.reentrantCount++;\n\t\tcallback();\n\t\tthis.reentrantCount--;\n\t\tassert(this.reentrantCount === 0, 0x85e /* reentrant code on exit */);\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) {\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) {\n\t\tthis.submitVectorMessage(this.cols, this.rows, SnapshotPath.cols, message);\n\t}\n\n\tpublic insertCols(colStart: number, count: number) {\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) {\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) {\n\t\tthis.submitVectorMessage(this.rows, this.cols, SnapshotPath.rows, message);\n\t}\n\n\tpublic insertRows(rowStart: number, count: number) {\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) {\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) {\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) {\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\tthis.cells.snapshot(),\n\t\t\tthis.pending.snapshot(),\n\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber,\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.setCellLwwToFwwPolicySwitchOpSeqNumber > -1) {\n\t\t\tartifactsToSummarize.push(this.cellLastWriteTracker.snapshot());\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) {\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() {\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: any, localOpMetadata?: any) {\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.runtime.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() {\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() {\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\t// eslint-disable-next-line import/no-deprecated\n\t\tclient: Client,\n\t\tref: LocalReferencePosition,\n\t\tlocalSeq: number,\n\t): number | undefined {\n\t\tconst segment = 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 || segment.removedSeq !== undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tassert(\n\t\t\tsegment.localRemovedSeq === undefined ||\n\t\t\t\t(segment.localRemovedSeq !== undefined && segment.localRemovedSeq > localSeq),\n\t\t\t0x8b8 /* Attempted to set a cell which was removed locally before the original op applied. */,\n\t\t);\n\n\t\treturn client.findReconnectionPosition(segment, localSeq) + offset;\n\t}\n\n\tprotected reSubmitCore(incoming: unknown, localOpMetadata: unknown) {\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\t\t\tif (row !== undefined && col !== undefined && row >= 0 && col >= 0) {\n\t\t\t\tconst lastCellModificationDetails = this.cellLastWriteTracker.getCell(\n\t\t\t\t\trowHandle,\n\t\t\t\t\tcolHandle,\n\t\t\t\t);\n\t\t\t\t// 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\tif (\n\t\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber === -1 ||\n\t\t\t\t\tlastCellModificationDetails === undefined ||\n\t\t\t\t\treferenceSeqNumber >= lastCellModificationDetails.seqNum\n\t\t\t\t) {\n\t\t\t\t\tthis.sendSetCellOp(row, col, setOp.value, rowHandle, colHandle, localSeq);\n\t\t\t\t} else if (this.pending.getCell(rowHandle, colHandle) !== undefined) {\n\t\t\t\t\t// Clear the pending changes if any as we are not sending the op.\n\t\t\t\t\tthis.pending.setCell(rowHandle, colHandle, undefined);\n\t\t\t\t}\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(\n\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t\t\t\t\tlocalOpMetadata as SegmentGroup | SegmentGroup[],\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase SnapshotPath.rows:\n\t\t\t\t\tthis.submitRowMessage(\n\t\t\t\t\t\tthis.rows.regeneratePendingOp(\n\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t\t\t\t\tlocalOpMetadata as SegmentGroup | SegmentGroup[],\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\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 onDisconnect() {}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService) {\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] = await deserializeBlob(storage, SnapshotPath.cells, this.serializer);\n\n\t\t\tthis.cells = SparseArray2D.load(cellData);\n\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber =\n\t\t\t\tsetCellLwwToFwwPolicySwitchOpSeqNumber ?? -1;\n\t\t\tif (cellLastWriteTracker !== undefined) {\n\t\t\t\tthis.cellLastWriteTracker = SparseArray2D.load(cellLastWriteTracker);\n\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) {\n\t\tassert(\n\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber > -1,\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.cellLastWriteTracker.getCell(rowHandle, colHandle);\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) {\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\tcase SnapshotPath.rows:\n\t\t\t\tthis.rows.applyMsg(msg, local);\n\t\t\t\tbreak;\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\tconst isPreviousSetCellPolicyModeFWW =\n\t\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber > -1;\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 (this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1 && fwwMode === true) {\n\t\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber = msg.sequenceNumber;\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\tconst isLatestPendingOp = this.isLatestPendingWrite(\n\t\t\t\t\t\trowHandle,\n\t\t\t\t\t\tcolHandle,\n\t\t\t\t\t\tlocalSeq,\n\t\t\t\t\t);\n\t\t\t\t\tthis.rows.removeLocalReferencePosition(rowsRef);\n\t\t\t\t\tthis.cols.removeLocalReferencePosition(colsRef);\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\t(this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1 &&\n\t\t\t\t\t\t\tthis.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)) ||\n\t\t\t\t\t\t(this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1 && isLatestPendingOp)\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.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\n\t\t\t\t\tif (isLatestPendingOp) {\n\t\t\t\t\t\tthis.pending.setCell(rowHandle, colHandle, undefined);\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\tif (adjustedRow !== undefined) {\n\t\t\t\t\t\tconst adjustedCol = this.cols.adjustPosition(col, msg);\n\n\t\t\t\t\t\tif (adjustedCol !== undefined) {\n\t\t\t\t\t\t\tconst rowHandle = this.rows.getAllocatedHandle(adjustedRow);\n\t\t\t\t\t\t\tconst colHandle = this.cols.getAllocatedHandle(adjustedCol);\n\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tisHandleValid(rowHandle) && isHandleValid(colHandle),\n\t\t\t\t\t\t\t\t0x022 /* \"SharedMatrix row and/or col handles are invalid!\" */,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1) {\n\t\t\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\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\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\t\t\tif (\n\t\t\t\t\t\t\t\t\t!isPreviousSetCellPolicyModeFWW ||\n\t\t\t\t\t\t\t\t\tthis.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst previousValue = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\t\t\t\t\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\t\t\t\t\t\t\t\t\tthis.cellLastWriteTracker.setCell(rowHandle, colHandle, {\n\t\t\t\t\t\t\t\t\t\tseqNum: msg.sequenceNumber,\n\t\t\t\t\t\t\t\t\t\tclientId: msg.clientId,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tfor (const consumer of this.consumers.values()) {\n\t\t\t\t\t\t\t\t\t\tconsumer.cellsChanged(adjustedRow, adjustedCol, 1, 1, this);\n\t\t\t\t\t\t\t\t\t}\n\t\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\t\tif (this.pending.getCell(rowHandle, colHandle) !== undefined) {\n\t\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\t// to raise conflict event for that op also.\n\t\t\t\t\t\t\t\t\t\tthis.emit(\n\t\t\t\t\t\t\t\t\t\t\t\"conflict\",\n\t\t\t\t\t\t\t\t\t\t\trow,\n\t\t\t\t\t\t\t\t\t\t\tcol,\n\t\t\t\t\t\t\t\t\t\t\tvalue, // Current value\n\t\t\t\t\t\t\t\t\t\t\tpreviousValue, // Ignored local value\n\t\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\t);\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} else if (this.pending.getCell(rowHandle, colHandle) === undefined) {\n\t\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\t// since it \"happened before\" the pending write.\n\t\t\t\t\t\t\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\t\t\t\t\t\t\t\tthis.cellLastWriteTracker.setCell(rowHandle, colHandle, {\n\t\t\t\t\t\t\t\t\tseqNum: msg.sequenceNumber,\n\t\t\t\t\t\t\t\t\tclientId: msg.clientId,\n\t\t\t\t\t\t\t\t});\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, adjustedCol, 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}\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}\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) => {\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) => {\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[]) => {\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\tthis.cellLastWriteTracker.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t}\n\t};\n\n\tprivate readonly onColHandlesRecycled = (colHandles: Handle[]) => {\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\tthis.cellLastWriteTracker.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t}\n\t};\n\n\tpublic switchSetCellPolicy() {\n\t\tif (this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1) {\n\t\t\tif (this.isAttached()) {\n\t\t\t\tthis.userSwitchedSetCellPolicy = true;\n\t\t\t} else {\n\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns true if the latest pending write to the cell indicated by the given row/col handles\n\t * matches the given 'localSeq'.\n\t *\n\t * A return value of `true` indicates that there are no later local operations queued that will\n\t * clobber the write op at the given 'localSeq'. This includes later ops that overwrite the cell\n\t * with a different value as well as row/col removals that might recycled the given row/col handles.\n\t */\n\tprivate isLatestPendingWrite(rowHandle: Handle, colHandle: Handle, localSeq: number) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst pendingLocalSeq = this.pending.getCell(rowHandle, colHandle)!;\n\n\t\t// Note while we're awaiting the ACK for a local set, it's possible for the row/col to be\n\t\t// locally removed and the row/col handles recycled. If this happens, the pendingLocalSeq will\n\t\t// be 'undefined' or > 'localSeq'.\n\t\tassert(\n\t\t\t!(pendingLocalSeq < localSeq),\n\t\t\t0x023 /* \"The 'localSeq' of pending write (if any) must be <= the localSeq of the currently processed op.\" */,\n\t\t);\n\n\t\t// If this is the most recent write to the cell by the local client, the stored localSeq\n\t\t// will be an exact match for the given 'localSeq'.\n\t\treturn pendingLocalSeq === localSeq;\n\t}\n\n\tpublic toString() {\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\tIChannelStorageService,\n\tIFluidDataStoreRuntime,\n\ttype IChannel,\n} from \"@fluidframework/datastore-definitions\";\nimport {\n\t// eslint-disable-next-line import/no-deprecated\n\tClient,\n\tIJSONSegment,\n\tIMergeTreeOp,\n\ttype LocalReferencePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\t// eslint-disable-next-line import/no-deprecated\n\tSegmentGroup,\n} from \"@fluidframework/merge-tree/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ObjectStoragePartition, SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport { IFluidSerializer, ISharedObjectEvents } from \"@fluidframework/shared-object-base\";\nimport { SharedObject } from \"@fluidframework/shared-object-base/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport { IMatrixConsumer, IMatrixProducer, IMatrixReader, IMatrixWriter } from \"@tiny-calc/nano\";\nimport Deque from \"double-ended-queue\";\n\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 } 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 * @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/** @alpha */\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\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 * @alpha\n */\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\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<number>(); // Tracks pending writes.\n\tprivate cellLastWriteTracker = new SparseArray2D<CellLastWriteTrackerItem>(); // Tracks last writes sequence number and clientId in a cell.\n\t// Tracks the seq number of Op at which policy switch happens from Last Write Win to First Write Win.\n\tprivate setCellLwwToFwwPolicySwitchOpSeqNumber: number;\n\tprivate userSwitchedSetCellPolicy = false; // Set to true when the user calls switchPolicy.\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.setCellLwwToFwwPolicySwitchOpSeqNumber = -1;\n\t\tconst getMinInFlightRefSeq = () => this.inFlightRefSeqs.get(0);\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\tgetMinInFlightRefSeq,\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\tgetMinInFlightRefSeq,\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) {\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() {\n\t\treturn this.rows.handleCache;\n\t}\n\tprivate get colHandles() {\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() {\n\t\treturn this.rows.getLength();\n\t}\n\tpublic get colCount() {\n\t\treturn this.cols.getLength();\n\t}\n\n\tpublic isSetCellConflictResolutionPolicyFWW() {\n\t\treturn this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1 || this.userSwitchedSetCellPolicy;\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>) {\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) {\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) {\n\t\tthis.protectAgainstReentrancy(() => {\n\t\t\tif (this.undo !== undefined) {\n\t\t\t\tlet oldValue = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\tif (oldValue === null) {\n\t\t\t\t\toldValue = undefined;\n\t\t\t\t}\n\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()) {\n\t\t\t\tthis.sendSetCellOp(row, col, value, rowHandle, colHandle);\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(vector: PermutationVector, pos: number, localSeq: number) {\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) {\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:\n\t\t\t\tthis.userSwitchedSetCellPolicy || this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1,\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\tthis.pending.setCell(rowHandle, colHandle, localSeq);\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) {\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) {\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) {\n\t\tthis.submitVectorMessage(this.cols, this.rows, SnapshotPath.cols, message);\n\t}\n\n\tpublic insertCols(colStart: number, count: number) {\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) {\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) {\n\t\tthis.submitVectorMessage(this.rows, this.cols, SnapshotPath.rows, message);\n\t}\n\n\tpublic insertRows(rowStart: number, count: number) {\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) {\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) {\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) {\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\tthis.cells.snapshot(),\n\t\t\tthis.pending.snapshot(),\n\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber,\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.setCellLwwToFwwPolicySwitchOpSeqNumber > -1) {\n\t\t\tartifactsToSummarize.push(this.cellLastWriteTracker.snapshot());\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) {\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() {\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: any, localOpMetadata?: any) {\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() {\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() {\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\t// eslint-disable-next-line import/no-deprecated\n\t\tclient: Client,\n\t\tref: LocalReferencePosition,\n\t\tlocalSeq: number,\n\t): number | undefined {\n\t\tconst segment = 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 || segment.removedSeq !== undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tassert(\n\t\t\tsegment.localRemovedSeq === undefined ||\n\t\t\t\t(segment.localRemovedSeq !== undefined && segment.localRemovedSeq > localSeq),\n\t\t\t0x8b8 /* Attempted to set a cell which was removed locally before the original op applied. */,\n\t\t);\n\n\t\treturn client.findReconnectionPosition(segment, localSeq) + offset;\n\t}\n\n\tprotected reSubmitCore(incoming: unknown, localOpMetadata: unknown) {\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\t\t\tif (row !== undefined && col !== undefined && row >= 0 && col >= 0) {\n\t\t\t\tconst lastCellModificationDetails = this.cellLastWriteTracker.getCell(\n\t\t\t\t\trowHandle,\n\t\t\t\t\tcolHandle,\n\t\t\t\t);\n\t\t\t\t// 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\tif (\n\t\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber === -1 ||\n\t\t\t\t\tlastCellModificationDetails === undefined ||\n\t\t\t\t\treferenceSeqNumber >= lastCellModificationDetails.seqNum\n\t\t\t\t) {\n\t\t\t\t\tthis.sendSetCellOp(row, col, setOp.value, rowHandle, colHandle, localSeq);\n\t\t\t\t} else if (this.pending.getCell(rowHandle, colHandle) !== undefined) {\n\t\t\t\t\t// Clear the pending changes if any as we are not sending the op.\n\t\t\t\t\tthis.pending.setCell(rowHandle, colHandle, undefined);\n\t\t\t\t}\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(\n\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t\t\t\t\tlocalOpMetadata as SegmentGroup | SegmentGroup[],\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase SnapshotPath.rows:\n\t\t\t\t\tthis.submitRowMessage(\n\t\t\t\t\t\tthis.rows.regeneratePendingOp(\n\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t\t\t\t\tlocalOpMetadata as SegmentGroup | SegmentGroup[],\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\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 onDisconnect() {}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService) {\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] = await deserializeBlob(storage, SnapshotPath.cells, this.serializer);\n\n\t\t\tthis.cells = SparseArray2D.load(cellData);\n\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber =\n\t\t\t\tsetCellLwwToFwwPolicySwitchOpSeqNumber ?? -1;\n\t\t\tif (cellLastWriteTracker !== undefined) {\n\t\t\t\tthis.cellLastWriteTracker = SparseArray2D.load(cellLastWriteTracker);\n\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) {\n\t\tassert(\n\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber > -1,\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.cellLastWriteTracker.getCell(rowHandle, colHandle);\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) {\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\tcase SnapshotPath.rows:\n\t\t\t\tthis.rows.applyMsg(msg, local);\n\t\t\t\tbreak;\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\tconst isPreviousSetCellPolicyModeFWW =\n\t\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber > -1;\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 (this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1 && fwwMode === true) {\n\t\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber = msg.sequenceNumber;\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\tconst isLatestPendingOp = this.isLatestPendingWrite(\n\t\t\t\t\t\trowHandle,\n\t\t\t\t\t\tcolHandle,\n\t\t\t\t\t\tlocalSeq,\n\t\t\t\t\t);\n\t\t\t\t\tthis.rows.removeLocalReferencePosition(rowsRef);\n\t\t\t\t\tthis.cols.removeLocalReferencePosition(colsRef);\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\t(this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1 &&\n\t\t\t\t\t\t\tthis.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)) ||\n\t\t\t\t\t\t(this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1 && isLatestPendingOp)\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.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\n\t\t\t\t\tif (isLatestPendingOp) {\n\t\t\t\t\t\tthis.pending.setCell(rowHandle, colHandle, undefined);\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\tif (adjustedRow !== undefined) {\n\t\t\t\t\t\tconst adjustedCol = this.cols.adjustPosition(col, msg);\n\n\t\t\t\t\t\tif (adjustedCol !== undefined) {\n\t\t\t\t\t\t\tconst rowHandle = this.rows.getAllocatedHandle(adjustedRow);\n\t\t\t\t\t\t\tconst colHandle = this.cols.getAllocatedHandle(adjustedCol);\n\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tisHandleValid(rowHandle) && isHandleValid(colHandle),\n\t\t\t\t\t\t\t\t0x022 /* \"SharedMatrix row and/or col handles are invalid!\" */,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1) {\n\t\t\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\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\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\t\t\tif (\n\t\t\t\t\t\t\t\t\t!isPreviousSetCellPolicyModeFWW ||\n\t\t\t\t\t\t\t\t\tthis.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst previousValue = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\t\t\t\t\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\t\t\t\t\t\t\t\t\tthis.cellLastWriteTracker.setCell(rowHandle, colHandle, {\n\t\t\t\t\t\t\t\t\t\tseqNum: msg.sequenceNumber,\n\t\t\t\t\t\t\t\t\t\tclientId: msg.clientId,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tfor (const consumer of this.consumers.values()) {\n\t\t\t\t\t\t\t\t\t\tconsumer.cellsChanged(adjustedRow, adjustedCol, 1, 1, this);\n\t\t\t\t\t\t\t\t\t}\n\t\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\t\tif (this.pending.getCell(rowHandle, colHandle) !== undefined) {\n\t\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\t// to raise conflict event for that op also.\n\t\t\t\t\t\t\t\t\t\tthis.emit(\n\t\t\t\t\t\t\t\t\t\t\t\"conflict\",\n\t\t\t\t\t\t\t\t\t\t\trow,\n\t\t\t\t\t\t\t\t\t\t\tcol,\n\t\t\t\t\t\t\t\t\t\t\tvalue, // Current value\n\t\t\t\t\t\t\t\t\t\t\tpreviousValue, // Ignored local value\n\t\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\t);\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} else if (this.pending.getCell(rowHandle, colHandle) === undefined) {\n\t\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\t// since it \"happened before\" the pending write.\n\t\t\t\t\t\t\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\t\t\t\t\t\t\t\tthis.cellLastWriteTracker.setCell(rowHandle, colHandle, {\n\t\t\t\t\t\t\t\t\tseqNum: msg.sequenceNumber,\n\t\t\t\t\t\t\t\t\tclientId: msg.clientId,\n\t\t\t\t\t\t\t\t});\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, adjustedCol, 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}\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}\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) => {\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) => {\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[]) => {\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\tthis.cellLastWriteTracker.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t}\n\t};\n\n\tprivate readonly onColHandlesRecycled = (colHandles: Handle[]) => {\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\tthis.cellLastWriteTracker.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t}\n\t};\n\n\tpublic switchSetCellPolicy() {\n\t\tif (this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1) {\n\t\t\tif (this.isAttached()) {\n\t\t\t\tthis.userSwitchedSetCellPolicy = true;\n\t\t\t} else {\n\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns true if the latest pending write to the cell indicated by the given row/col handles\n\t * matches the given 'localSeq'.\n\t *\n\t * A return value of `true` indicates that there are no later local operations queued that will\n\t * clobber the write op at the given 'localSeq'. This includes later ops that overwrite the cell\n\t * with a different value as well as row/col removals that might recycled the given row/col handles.\n\t */\n\tprivate isLatestPendingWrite(rowHandle: Handle, colHandle: Handle, localSeq: number) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst pendingLocalSeq = this.pending.getCell(rowHandle, colHandle)!;\n\n\t\t// Note while we're awaiting the ACK for a local set, it's possible for the row/col to be\n\t\t// locally removed and the row/col handles recycled. If this happens, the pendingLocalSeq will\n\t\t// be 'undefined' or > 'localSeq'.\n\t\tassert(\n\t\t\t!(pendingLocalSeq < localSeq),\n\t\t\t0x023 /* \"The 'localSeq' of pending write (if any) must be <= the localSeq of the currently processed op.\" */,\n\t\t);\n\n\t\t// If this is the most recent write to the cell by the local client, the stored localSeq\n\t\t// will be an exact match for the given 'localSeq'.\n\t\treturn pendingLocalSeq === localSeq;\n\t}\n\n\tpublic toString() {\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/dist/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/matrix";
|
|
8
|
-
export declare const pkgVersion = "2.0.0-dev-rc.
|
|
8
|
+
export declare const pkgVersion = "2.0.0-dev-rc.5.0.0.263932";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/dist/packageVersion.js
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.pkgVersion = exports.pkgName = void 0;
|
|
10
10
|
exports.pkgName = "@fluidframework/matrix";
|
|
11
|
-
exports.pkgVersion = "2.0.0-dev-rc.
|
|
11
|
+
exports.pkgVersion = "2.0.0-dev-rc.5.0.0.263932";
|
|
12
12
|
//# sourceMappingURL=packageVersion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,wBAAwB,CAAC;AACnC,QAAA,UAAU,GAAG,2BAA2B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/matrix\";\nexport const pkgVersion = \"2.0.0-dev-rc.
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,wBAAwB,CAAC;AACnC,QAAA,UAAU,GAAG,2BAA2B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/matrix\";\nexport const pkgVersion = \"2.0.0-dev-rc.5.0.0.263932\";\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
|
@@ -211,7 +211,7 @@ export class SharedMatrix extends SharedObject {
|
|
|
211
211
|
localSeq,
|
|
212
212
|
rowsRef,
|
|
213
213
|
colsRef,
|
|
214
|
-
referenceSeqNumber: this.
|
|
214
|
+
referenceSeqNumber: this.deltaManager.lastSequenceNumber,
|
|
215
215
|
};
|
|
216
216
|
this.submitLocalMessage(op, metadata);
|
|
217
217
|
this.pending.setCell(rowHandle, colHandle, localSeq);
|
|
@@ -225,11 +225,18 @@ export class SharedMatrix extends SharedObject {
|
|
|
225
225
|
* @param callback - code that needs to protected against reentrancy.
|
|
226
226
|
*/
|
|
227
227
|
protectAgainstReentrancy(callback) {
|
|
228
|
-
|
|
228
|
+
if (this.reentrantCount !== 0) {
|
|
229
|
+
// Validate that applications don't submit edits in response to matrix change notifications. This is unsupported.
|
|
230
|
+
throw new UsageError("Reentrancy detected in SharedMatrix.");
|
|
231
|
+
}
|
|
229
232
|
this.reentrantCount++;
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
+
try {
|
|
234
|
+
callback();
|
|
235
|
+
}
|
|
236
|
+
finally {
|
|
237
|
+
this.reentrantCount--;
|
|
238
|
+
}
|
|
239
|
+
assert(this.reentrantCount === 0, 0x85e /* indicates a problem with the reentrancy tracking code. */);
|
|
233
240
|
}
|
|
234
241
|
submitVectorMessage(currentVector, oppositeVector, target, message) {
|
|
235
242
|
// Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors
|
|
@@ -386,7 +393,7 @@ export class SharedMatrix extends SharedObject {
|
|
|
386
393
|
// TODO: Recommend moving this assertion into SharedObject
|
|
387
394
|
// (See https://github.com/microsoft/FluidFramework/issues/2559)
|
|
388
395
|
assert(this.isAttached() === true, 0x01d /* "Trying to submit message to runtime while detached!" */);
|
|
389
|
-
this.inFlightRefSeqs.push(this.
|
|
396
|
+
this.inFlightRefSeqs.push(this.deltaManager.lastSequenceNumber);
|
|
390
397
|
super.submitLocalMessage(message, localOpMetadata);
|
|
391
398
|
// Ensure that row/col 'localSeq' are synchronized (see 'nextLocalSeq()').
|
|
392
399
|
assert(this.rows.getCollabWindow().localSeq === this.cols.getCollabWindow().localSeq, 0x01e /* "Row and col collab window 'localSeq' desynchronized!" */);
|
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\tIChannelStorageService,\n\tIFluidDataStoreRuntime,\n\ttype IChannel,\n} from \"@fluidframework/datastore-definitions\";\nimport {\n\t// eslint-disable-next-line import/no-deprecated\n\tClient,\n\tIJSONSegment,\n\tIMergeTreeOp,\n\ttype LocalReferencePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\t// eslint-disable-next-line import/no-deprecated\n\tSegmentGroup,\n} from \"@fluidframework/merge-tree/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ObjectStoragePartition, SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport { IFluidSerializer, ISharedObjectEvents } from \"@fluidframework/shared-object-base\";\nimport { SharedObject } from \"@fluidframework/shared-object-base/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport { IMatrixConsumer, IMatrixProducer, IMatrixReader, IMatrixWriter } from \"@tiny-calc/nano\";\nimport Deque from \"double-ended-queue\";\n\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 } 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 * @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/** @alpha */\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\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 * @alpha\n */\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\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<number>(); // Tracks pending writes.\n\tprivate cellLastWriteTracker = new SparseArray2D<CellLastWriteTrackerItem>(); // Tracks last writes sequence number and clientId in a cell.\n\t// Tracks the seq number of Op at which policy switch happens from Last Write Win to First Write Win.\n\tprivate setCellLwwToFwwPolicySwitchOpSeqNumber: number;\n\tprivate userSwitchedSetCellPolicy = false; // Set to true when the user calls switchPolicy.\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.setCellLwwToFwwPolicySwitchOpSeqNumber = -1;\n\t\tconst getMinInFlightRefSeq = () => this.inFlightRefSeqs.get(0);\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\tgetMinInFlightRefSeq,\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\tgetMinInFlightRefSeq,\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) {\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() {\n\t\treturn this.rows.handleCache;\n\t}\n\tprivate get colHandles() {\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() {\n\t\treturn this.rows.getLength();\n\t}\n\tpublic get colCount() {\n\t\treturn this.cols.getLength();\n\t}\n\n\tpublic isSetCellConflictResolutionPolicyFWW() {\n\t\treturn this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1 || this.userSwitchedSetCellPolicy;\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>) {\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) {\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) {\n\t\tthis.protectAgainstReentrancy(() => {\n\t\t\tif (this.undo !== undefined) {\n\t\t\t\tlet oldValue = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\tif (oldValue === null) {\n\t\t\t\t\toldValue = undefined;\n\t\t\t\t}\n\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()) {\n\t\t\t\tthis.sendSetCellOp(row, col, value, rowHandle, colHandle);\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(vector: PermutationVector, pos: number, localSeq: number) {\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) {\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:\n\t\t\t\tthis.userSwitchedSetCellPolicy || this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1,\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.runtime.deltaManager.lastSequenceNumber,\n\t\t};\n\n\t\tthis.submitLocalMessage(op, metadata);\n\t\tthis.pending.setCell(rowHandle, colHandle, localSeq);\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) {\n\t\tassert(this.reentrantCount === 0, 0x85d /* reentrant code */);\n\t\tthis.reentrantCount++;\n\t\tcallback();\n\t\tthis.reentrantCount--;\n\t\tassert(this.reentrantCount === 0, 0x85e /* reentrant code on exit */);\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) {\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) {\n\t\tthis.submitVectorMessage(this.cols, this.rows, SnapshotPath.cols, message);\n\t}\n\n\tpublic insertCols(colStart: number, count: number) {\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) {\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) {\n\t\tthis.submitVectorMessage(this.rows, this.cols, SnapshotPath.rows, message);\n\t}\n\n\tpublic insertRows(rowStart: number, count: number) {\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) {\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) {\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) {\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\tthis.cells.snapshot(),\n\t\t\tthis.pending.snapshot(),\n\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber,\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.setCellLwwToFwwPolicySwitchOpSeqNumber > -1) {\n\t\t\tartifactsToSummarize.push(this.cellLastWriteTracker.snapshot());\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) {\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() {\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: any, localOpMetadata?: any) {\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.runtime.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() {\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() {\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\t// eslint-disable-next-line import/no-deprecated\n\t\tclient: Client,\n\t\tref: LocalReferencePosition,\n\t\tlocalSeq: number,\n\t): number | undefined {\n\t\tconst segment = 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 || segment.removedSeq !== undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tassert(\n\t\t\tsegment.localRemovedSeq === undefined ||\n\t\t\t\t(segment.localRemovedSeq !== undefined && segment.localRemovedSeq > localSeq),\n\t\t\t0x8b8 /* Attempted to set a cell which was removed locally before the original op applied. */,\n\t\t);\n\n\t\treturn client.findReconnectionPosition(segment, localSeq) + offset;\n\t}\n\n\tprotected reSubmitCore(incoming: unknown, localOpMetadata: unknown) {\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\t\t\tif (row !== undefined && col !== undefined && row >= 0 && col >= 0) {\n\t\t\t\tconst lastCellModificationDetails = this.cellLastWriteTracker.getCell(\n\t\t\t\t\trowHandle,\n\t\t\t\t\tcolHandle,\n\t\t\t\t);\n\t\t\t\t// 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\tif (\n\t\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber === -1 ||\n\t\t\t\t\tlastCellModificationDetails === undefined ||\n\t\t\t\t\treferenceSeqNumber >= lastCellModificationDetails.seqNum\n\t\t\t\t) {\n\t\t\t\t\tthis.sendSetCellOp(row, col, setOp.value, rowHandle, colHandle, localSeq);\n\t\t\t\t} else if (this.pending.getCell(rowHandle, colHandle) !== undefined) {\n\t\t\t\t\t// Clear the pending changes if any as we are not sending the op.\n\t\t\t\t\tthis.pending.setCell(rowHandle, colHandle, undefined);\n\t\t\t\t}\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(\n\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t\t\t\t\tlocalOpMetadata as SegmentGroup | SegmentGroup[],\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase SnapshotPath.rows:\n\t\t\t\t\tthis.submitRowMessage(\n\t\t\t\t\t\tthis.rows.regeneratePendingOp(\n\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t\t\t\t\tlocalOpMetadata as SegmentGroup | SegmentGroup[],\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\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 onDisconnect() {}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService) {\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] = await deserializeBlob(storage, SnapshotPath.cells, this.serializer);\n\n\t\t\tthis.cells = SparseArray2D.load(cellData);\n\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber =\n\t\t\t\tsetCellLwwToFwwPolicySwitchOpSeqNumber ?? -1;\n\t\t\tif (cellLastWriteTracker !== undefined) {\n\t\t\t\tthis.cellLastWriteTracker = SparseArray2D.load(cellLastWriteTracker);\n\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) {\n\t\tassert(\n\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber > -1,\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.cellLastWriteTracker.getCell(rowHandle, colHandle);\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) {\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\tcase SnapshotPath.rows:\n\t\t\t\tthis.rows.applyMsg(msg, local);\n\t\t\t\tbreak;\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\tconst isPreviousSetCellPolicyModeFWW =\n\t\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber > -1;\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 (this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1 && fwwMode === true) {\n\t\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber = msg.sequenceNumber;\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\tconst isLatestPendingOp = this.isLatestPendingWrite(\n\t\t\t\t\t\trowHandle,\n\t\t\t\t\t\tcolHandle,\n\t\t\t\t\t\tlocalSeq,\n\t\t\t\t\t);\n\t\t\t\t\tthis.rows.removeLocalReferencePosition(rowsRef);\n\t\t\t\t\tthis.cols.removeLocalReferencePosition(colsRef);\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\t(this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1 &&\n\t\t\t\t\t\t\tthis.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)) ||\n\t\t\t\t\t\t(this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1 && isLatestPendingOp)\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.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\n\t\t\t\t\tif (isLatestPendingOp) {\n\t\t\t\t\t\tthis.pending.setCell(rowHandle, colHandle, undefined);\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\tif (adjustedRow !== undefined) {\n\t\t\t\t\t\tconst adjustedCol = this.cols.adjustPosition(col, msg);\n\n\t\t\t\t\t\tif (adjustedCol !== undefined) {\n\t\t\t\t\t\t\tconst rowHandle = this.rows.getAllocatedHandle(adjustedRow);\n\t\t\t\t\t\t\tconst colHandle = this.cols.getAllocatedHandle(adjustedCol);\n\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tisHandleValid(rowHandle) && isHandleValid(colHandle),\n\t\t\t\t\t\t\t\t0x022 /* \"SharedMatrix row and/or col handles are invalid!\" */,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1) {\n\t\t\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\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\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\t\t\tif (\n\t\t\t\t\t\t\t\t\t!isPreviousSetCellPolicyModeFWW ||\n\t\t\t\t\t\t\t\t\tthis.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst previousValue = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\t\t\t\t\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\t\t\t\t\t\t\t\t\tthis.cellLastWriteTracker.setCell(rowHandle, colHandle, {\n\t\t\t\t\t\t\t\t\t\tseqNum: msg.sequenceNumber,\n\t\t\t\t\t\t\t\t\t\tclientId: msg.clientId,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tfor (const consumer of this.consumers.values()) {\n\t\t\t\t\t\t\t\t\t\tconsumer.cellsChanged(adjustedRow, adjustedCol, 1, 1, this);\n\t\t\t\t\t\t\t\t\t}\n\t\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\t\tif (this.pending.getCell(rowHandle, colHandle) !== undefined) {\n\t\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\t// to raise conflict event for that op also.\n\t\t\t\t\t\t\t\t\t\tthis.emit(\n\t\t\t\t\t\t\t\t\t\t\t\"conflict\",\n\t\t\t\t\t\t\t\t\t\t\trow,\n\t\t\t\t\t\t\t\t\t\t\tcol,\n\t\t\t\t\t\t\t\t\t\t\tvalue, // Current value\n\t\t\t\t\t\t\t\t\t\t\tpreviousValue, // Ignored local value\n\t\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\t);\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} else if (this.pending.getCell(rowHandle, colHandle) === undefined) {\n\t\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\t// since it \"happened before\" the pending write.\n\t\t\t\t\t\t\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\t\t\t\t\t\t\t\tthis.cellLastWriteTracker.setCell(rowHandle, colHandle, {\n\t\t\t\t\t\t\t\t\tseqNum: msg.sequenceNumber,\n\t\t\t\t\t\t\t\t\tclientId: msg.clientId,\n\t\t\t\t\t\t\t\t});\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, adjustedCol, 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}\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}\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) => {\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) => {\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[]) => {\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\tthis.cellLastWriteTracker.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t}\n\t};\n\n\tprivate readonly onColHandlesRecycled = (colHandles: Handle[]) => {\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\tthis.cellLastWriteTracker.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t}\n\t};\n\n\tpublic switchSetCellPolicy() {\n\t\tif (this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1) {\n\t\t\tif (this.isAttached()) {\n\t\t\t\tthis.userSwitchedSetCellPolicy = true;\n\t\t\t} else {\n\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns true if the latest pending write to the cell indicated by the given row/col handles\n\t * matches the given 'localSeq'.\n\t *\n\t * A return value of `true` indicates that there are no later local operations queued that will\n\t * clobber the write op at the given 'localSeq'. This includes later ops that overwrite the cell\n\t * with a different value as well as row/col removals that might recycled the given row/col handles.\n\t */\n\tprivate isLatestPendingWrite(rowHandle: Handle, colHandle: Handle, localSeq: number) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst pendingLocalSeq = this.pending.getCell(rowHandle, colHandle)!;\n\n\t\t// Note while we're awaiting the ACK for a local set, it's possible for the row/col to be\n\t\t// locally removed and the row/col handles recycled. If this happens, the pendingLocalSeq will\n\t\t// be 'undefined' or > 'localSeq'.\n\t\tassert(\n\t\t\t!(pendingLocalSeq < localSeq),\n\t\t\t0x023 /* \"The 'localSeq' of pending write (if any) must be <= the localSeq of the currently processed op.\" */,\n\t\t);\n\n\t\t// If this is the most recent write to the cell by the local client, the stored localSeq\n\t\t// will be an exact match for the given 'localSeq'.\n\t\treturn pendingLocalSeq === localSeq;\n\t}\n\n\tpublic toString() {\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\tIChannelStorageService,\n\tIFluidDataStoreRuntime,\n\ttype IChannel,\n} from \"@fluidframework/datastore-definitions\";\nimport {\n\t// eslint-disable-next-line import/no-deprecated\n\tClient,\n\tIJSONSegment,\n\tIMergeTreeOp,\n\ttype LocalReferencePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\t// eslint-disable-next-line import/no-deprecated\n\tSegmentGroup,\n} from \"@fluidframework/merge-tree/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ObjectStoragePartition, SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport { IFluidSerializer, ISharedObjectEvents } from \"@fluidframework/shared-object-base\";\nimport { SharedObject } from \"@fluidframework/shared-object-base/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport { IMatrixConsumer, IMatrixProducer, IMatrixReader, IMatrixWriter } from \"@tiny-calc/nano\";\nimport Deque from \"double-ended-queue\";\n\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 } 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 * @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/** @alpha */\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\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 * @alpha\n */\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\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<number>(); // Tracks pending writes.\n\tprivate cellLastWriteTracker = new SparseArray2D<CellLastWriteTrackerItem>(); // Tracks last writes sequence number and clientId in a cell.\n\t// Tracks the seq number of Op at which policy switch happens from Last Write Win to First Write Win.\n\tprivate setCellLwwToFwwPolicySwitchOpSeqNumber: number;\n\tprivate userSwitchedSetCellPolicy = false; // Set to true when the user calls switchPolicy.\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.setCellLwwToFwwPolicySwitchOpSeqNumber = -1;\n\t\tconst getMinInFlightRefSeq = () => this.inFlightRefSeqs.get(0);\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\tgetMinInFlightRefSeq,\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\tgetMinInFlightRefSeq,\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) {\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() {\n\t\treturn this.rows.handleCache;\n\t}\n\tprivate get colHandles() {\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() {\n\t\treturn this.rows.getLength();\n\t}\n\tpublic get colCount() {\n\t\treturn this.cols.getLength();\n\t}\n\n\tpublic isSetCellConflictResolutionPolicyFWW() {\n\t\treturn this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1 || this.userSwitchedSetCellPolicy;\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>) {\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) {\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) {\n\t\tthis.protectAgainstReentrancy(() => {\n\t\t\tif (this.undo !== undefined) {\n\t\t\t\tlet oldValue = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\tif (oldValue === null) {\n\t\t\t\t\toldValue = undefined;\n\t\t\t\t}\n\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()) {\n\t\t\t\tthis.sendSetCellOp(row, col, value, rowHandle, colHandle);\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(vector: PermutationVector, pos: number, localSeq: number) {\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) {\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:\n\t\t\t\tthis.userSwitchedSetCellPolicy || this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1,\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\tthis.pending.setCell(rowHandle, colHandle, localSeq);\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) {\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) {\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) {\n\t\tthis.submitVectorMessage(this.cols, this.rows, SnapshotPath.cols, message);\n\t}\n\n\tpublic insertCols(colStart: number, count: number) {\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) {\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) {\n\t\tthis.submitVectorMessage(this.rows, this.cols, SnapshotPath.rows, message);\n\t}\n\n\tpublic insertRows(rowStart: number, count: number) {\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) {\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) {\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) {\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\tthis.cells.snapshot(),\n\t\t\tthis.pending.snapshot(),\n\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber,\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.setCellLwwToFwwPolicySwitchOpSeqNumber > -1) {\n\t\t\tartifactsToSummarize.push(this.cellLastWriteTracker.snapshot());\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) {\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() {\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: any, localOpMetadata?: any) {\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() {\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() {\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\t// eslint-disable-next-line import/no-deprecated\n\t\tclient: Client,\n\t\tref: LocalReferencePosition,\n\t\tlocalSeq: number,\n\t): number | undefined {\n\t\tconst segment = 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 || segment.removedSeq !== undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tassert(\n\t\t\tsegment.localRemovedSeq === undefined ||\n\t\t\t\t(segment.localRemovedSeq !== undefined && segment.localRemovedSeq > localSeq),\n\t\t\t0x8b8 /* Attempted to set a cell which was removed locally before the original op applied. */,\n\t\t);\n\n\t\treturn client.findReconnectionPosition(segment, localSeq) + offset;\n\t}\n\n\tprotected reSubmitCore(incoming: unknown, localOpMetadata: unknown) {\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\t\t\tif (row !== undefined && col !== undefined && row >= 0 && col >= 0) {\n\t\t\t\tconst lastCellModificationDetails = this.cellLastWriteTracker.getCell(\n\t\t\t\t\trowHandle,\n\t\t\t\t\tcolHandle,\n\t\t\t\t);\n\t\t\t\t// 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\tif (\n\t\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber === -1 ||\n\t\t\t\t\tlastCellModificationDetails === undefined ||\n\t\t\t\t\treferenceSeqNumber >= lastCellModificationDetails.seqNum\n\t\t\t\t) {\n\t\t\t\t\tthis.sendSetCellOp(row, col, setOp.value, rowHandle, colHandle, localSeq);\n\t\t\t\t} else if (this.pending.getCell(rowHandle, colHandle) !== undefined) {\n\t\t\t\t\t// Clear the pending changes if any as we are not sending the op.\n\t\t\t\t\tthis.pending.setCell(rowHandle, colHandle, undefined);\n\t\t\t\t}\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(\n\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t\t\t\t\tlocalOpMetadata as SegmentGroup | SegmentGroup[],\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase SnapshotPath.rows:\n\t\t\t\t\tthis.submitRowMessage(\n\t\t\t\t\t\tthis.rows.regeneratePendingOp(\n\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t\t\t\t\tlocalOpMetadata as SegmentGroup | SegmentGroup[],\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\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 onDisconnect() {}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService) {\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] = await deserializeBlob(storage, SnapshotPath.cells, this.serializer);\n\n\t\t\tthis.cells = SparseArray2D.load(cellData);\n\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber =\n\t\t\t\tsetCellLwwToFwwPolicySwitchOpSeqNumber ?? -1;\n\t\t\tif (cellLastWriteTracker !== undefined) {\n\t\t\t\tthis.cellLastWriteTracker = SparseArray2D.load(cellLastWriteTracker);\n\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) {\n\t\tassert(\n\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber > -1,\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.cellLastWriteTracker.getCell(rowHandle, colHandle);\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) {\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\tcase SnapshotPath.rows:\n\t\t\t\tthis.rows.applyMsg(msg, local);\n\t\t\t\tbreak;\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\tconst isPreviousSetCellPolicyModeFWW =\n\t\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber > -1;\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 (this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1 && fwwMode === true) {\n\t\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber = msg.sequenceNumber;\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\tconst isLatestPendingOp = this.isLatestPendingWrite(\n\t\t\t\t\t\trowHandle,\n\t\t\t\t\t\tcolHandle,\n\t\t\t\t\t\tlocalSeq,\n\t\t\t\t\t);\n\t\t\t\t\tthis.rows.removeLocalReferencePosition(rowsRef);\n\t\t\t\t\tthis.cols.removeLocalReferencePosition(colsRef);\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\t(this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1 &&\n\t\t\t\t\t\t\tthis.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)) ||\n\t\t\t\t\t\t(this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1 && isLatestPendingOp)\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.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\n\t\t\t\t\tif (isLatestPendingOp) {\n\t\t\t\t\t\tthis.pending.setCell(rowHandle, colHandle, undefined);\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\tif (adjustedRow !== undefined) {\n\t\t\t\t\t\tconst adjustedCol = this.cols.adjustPosition(col, msg);\n\n\t\t\t\t\t\tif (adjustedCol !== undefined) {\n\t\t\t\t\t\t\tconst rowHandle = this.rows.getAllocatedHandle(adjustedRow);\n\t\t\t\t\t\t\tconst colHandle = this.cols.getAllocatedHandle(adjustedCol);\n\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tisHandleValid(rowHandle) && isHandleValid(colHandle),\n\t\t\t\t\t\t\t\t0x022 /* \"SharedMatrix row and/or col handles are invalid!\" */,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1) {\n\t\t\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\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\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\t\t\tif (\n\t\t\t\t\t\t\t\t\t!isPreviousSetCellPolicyModeFWW ||\n\t\t\t\t\t\t\t\t\tthis.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst previousValue = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\t\t\t\t\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\t\t\t\t\t\t\t\t\tthis.cellLastWriteTracker.setCell(rowHandle, colHandle, {\n\t\t\t\t\t\t\t\t\t\tseqNum: msg.sequenceNumber,\n\t\t\t\t\t\t\t\t\t\tclientId: msg.clientId,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tfor (const consumer of this.consumers.values()) {\n\t\t\t\t\t\t\t\t\t\tconsumer.cellsChanged(adjustedRow, adjustedCol, 1, 1, this);\n\t\t\t\t\t\t\t\t\t}\n\t\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\t\tif (this.pending.getCell(rowHandle, colHandle) !== undefined) {\n\t\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\t// to raise conflict event for that op also.\n\t\t\t\t\t\t\t\t\t\tthis.emit(\n\t\t\t\t\t\t\t\t\t\t\t\"conflict\",\n\t\t\t\t\t\t\t\t\t\t\trow,\n\t\t\t\t\t\t\t\t\t\t\tcol,\n\t\t\t\t\t\t\t\t\t\t\tvalue, // Current value\n\t\t\t\t\t\t\t\t\t\t\tpreviousValue, // Ignored local value\n\t\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\t);\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} else if (this.pending.getCell(rowHandle, colHandle) === undefined) {\n\t\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\t// since it \"happened before\" the pending write.\n\t\t\t\t\t\t\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\t\t\t\t\t\t\t\tthis.cellLastWriteTracker.setCell(rowHandle, colHandle, {\n\t\t\t\t\t\t\t\t\tseqNum: msg.sequenceNumber,\n\t\t\t\t\t\t\t\t\tclientId: msg.clientId,\n\t\t\t\t\t\t\t\t});\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, adjustedCol, 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}\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}\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) => {\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) => {\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[]) => {\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\tthis.cellLastWriteTracker.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t}\n\t};\n\n\tprivate readonly onColHandlesRecycled = (colHandles: Handle[]) => {\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\tthis.cellLastWriteTracker.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t}\n\t};\n\n\tpublic switchSetCellPolicy() {\n\t\tif (this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1) {\n\t\t\tif (this.isAttached()) {\n\t\t\t\tthis.userSwitchedSetCellPolicy = true;\n\t\t\t} else {\n\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns true if the latest pending write to the cell indicated by the given row/col handles\n\t * matches the given 'localSeq'.\n\t *\n\t * A return value of `true` indicates that there are no later local operations queued that will\n\t * clobber the write op at the given 'localSeq'. This includes later ops that overwrite the cell\n\t * with a different value as well as row/col removals that might recycled the given row/col handles.\n\t */\n\tprivate isLatestPendingWrite(rowHandle: Handle, colHandle: Handle, localSeq: number) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst pendingLocalSeq = this.pending.getCell(rowHandle, colHandle)!;\n\n\t\t// Note while we're awaiting the ACK for a local set, it's possible for the row/col to be\n\t\t// locally removed and the row/col handles recycled. If this happens, the pendingLocalSeq will\n\t\t// be 'undefined' or > 'localSeq'.\n\t\tassert(\n\t\t\t!(pendingLocalSeq < localSeq),\n\t\t\t0x023 /* \"The 'localSeq' of pending write (if any) must be <= the localSeq of the currently processed op.\" */,\n\t\t);\n\n\t\t// If this is the most recent write to the cell by the local client, the stored localSeq\n\t\t// will be an exact match for the given 'localSeq'.\n\t\treturn pendingLocalSeq === localSeq;\n\t}\n\n\tpublic toString() {\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
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/matrix";
|
|
8
|
-
export declare const pkgVersion = "2.0.0-dev-rc.
|
|
8
|
+
export declare const pkgVersion = "2.0.0-dev-rc.5.0.0.263932";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/lib/packageVersion.js
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export const pkgName = "@fluidframework/matrix";
|
|
8
|
-
export const pkgVersion = "2.0.0-dev-rc.
|
|
8
|
+
export const pkgVersion = "2.0.0-dev-rc.5.0.0.263932";
|
|
9
9
|
//# sourceMappingURL=packageVersion.js.map
|
|
@@ -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,2BAA2B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/matrix\";\nexport const pkgVersion = \"2.0.0-dev-rc.
|
|
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,2BAA2B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/matrix\";\nexport const pkgVersion = \"2.0.0-dev-rc.5.0.0.263932\";\n"]}
|
package/lib/tsdoc-metadata.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/matrix",
|
|
3
|
-
"version": "2.0.0-dev-rc.
|
|
3
|
+
"version": "2.0.0-dev-rc.5.0.0.263932",
|
|
4
4
|
"description": "Distributed matrix",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -63,17 +63,17 @@
|
|
|
63
63
|
"temp-directory": "nyc/.nyc_output"
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
|
-
"@fluid-internal/client-utils": "2.0.0-dev-rc.
|
|
67
|
-
"@fluidframework/core-interfaces": "2.0.0-dev-rc.
|
|
68
|
-
"@fluidframework/core-utils": "2.0.0-dev-rc.
|
|
69
|
-
"@fluidframework/datastore-definitions": "2.0.0-dev-rc.
|
|
70
|
-
"@fluidframework/driver-utils": "2.0.0-dev-rc.
|
|
71
|
-
"@fluidframework/merge-tree": "2.0.0-dev-rc.
|
|
66
|
+
"@fluid-internal/client-utils": "2.0.0-dev-rc.5.0.0.263932",
|
|
67
|
+
"@fluidframework/core-interfaces": "2.0.0-dev-rc.5.0.0.263932",
|
|
68
|
+
"@fluidframework/core-utils": "2.0.0-dev-rc.5.0.0.263932",
|
|
69
|
+
"@fluidframework/datastore-definitions": "2.0.0-dev-rc.5.0.0.263932",
|
|
70
|
+
"@fluidframework/driver-utils": "2.0.0-dev-rc.5.0.0.263932",
|
|
71
|
+
"@fluidframework/merge-tree": "2.0.0-dev-rc.5.0.0.263932",
|
|
72
72
|
"@fluidframework/protocol-definitions": "^3.2.0",
|
|
73
|
-
"@fluidframework/runtime-definitions": "2.0.0-dev-rc.
|
|
74
|
-
"@fluidframework/runtime-utils": "2.0.0-dev-rc.
|
|
75
|
-
"@fluidframework/shared-object-base": "2.0.0-dev-rc.
|
|
76
|
-
"@fluidframework/telemetry-utils": "2.0.0-dev-rc.
|
|
73
|
+
"@fluidframework/runtime-definitions": "2.0.0-dev-rc.5.0.0.263932",
|
|
74
|
+
"@fluidframework/runtime-utils": "2.0.0-dev-rc.5.0.0.263932",
|
|
75
|
+
"@fluidframework/shared-object-base": "2.0.0-dev-rc.5.0.0.263932",
|
|
76
|
+
"@fluidframework/telemetry-utils": "2.0.0-dev-rc.5.0.0.263932",
|
|
77
77
|
"@tiny-calc/nano": "0.0.0-alpha.5",
|
|
78
78
|
"double-ended-queue": "^2.1.0-0",
|
|
79
79
|
"tslib": "^1.10.0"
|
|
@@ -81,18 +81,18 @@
|
|
|
81
81
|
"devDependencies": {
|
|
82
82
|
"@arethetypeswrong/cli": "^0.15.2",
|
|
83
83
|
"@biomejs/biome": "^1.6.2",
|
|
84
|
-
"@fluid-internal/mocha-test-setup": "2.0.0-dev-rc.
|
|
85
|
-
"@fluid-private/stochastic-test-utils": "2.0.0-dev-rc.
|
|
86
|
-
"@fluid-private/test-dds-utils": "2.0.0-dev-rc.
|
|
84
|
+
"@fluid-internal/mocha-test-setup": "2.0.0-dev-rc.5.0.0.263932",
|
|
85
|
+
"@fluid-private/stochastic-test-utils": "2.0.0-dev-rc.5.0.0.263932",
|
|
86
|
+
"@fluid-private/test-dds-utils": "2.0.0-dev-rc.5.0.0.263932",
|
|
87
87
|
"@fluid-tools/benchmark": "^0.48.0",
|
|
88
|
-
"@fluid-tools/build-cli": "0.38.0
|
|
88
|
+
"@fluid-tools/build-cli": "^0.38.0",
|
|
89
89
|
"@fluidframework/build-common": "^2.0.3",
|
|
90
|
-
"@fluidframework/build-tools": "0.38.0
|
|
91
|
-
"@fluidframework/container-definitions": "2.0.0-dev-rc.
|
|
90
|
+
"@fluidframework/build-tools": "^0.38.0",
|
|
91
|
+
"@fluidframework/container-definitions": "2.0.0-dev-rc.5.0.0.263932",
|
|
92
92
|
"@fluidframework/eslint-config-fluid": "^5.1.0",
|
|
93
93
|
"@fluidframework/matrix-previous": "npm:@fluidframework/matrix@2.0.0-rc.3.0.0",
|
|
94
|
-
"@fluidframework/test-runtime-utils": "2.0.0-dev-rc.
|
|
95
|
-
"@microsoft/api-extractor": "^7.
|
|
94
|
+
"@fluidframework/test-runtime-utils": "2.0.0-dev-rc.5.0.0.263932",
|
|
95
|
+
"@microsoft/api-extractor": "^7.43.1",
|
|
96
96
|
"@tiny-calc/micro": "0.0.0-alpha.5",
|
|
97
97
|
"@types/double-ended-queue": "^2.1.0",
|
|
98
98
|
"@types/mocha": "^9.1.1",
|
|
@@ -119,7 +119,8 @@
|
|
|
119
119
|
"forwardCompat": false
|
|
120
120
|
},
|
|
121
121
|
"RemovedClassDeclaration_SharedMatrix": {
|
|
122
|
-
"backCompat": false
|
|
122
|
+
"backCompat": false,
|
|
123
|
+
"forwardCompat": false
|
|
123
124
|
}
|
|
124
125
|
}
|
|
125
126
|
},
|
package/src/matrix.ts
CHANGED
|
@@ -456,7 +456,7 @@ export class SharedMatrix<T = any>
|
|
|
456
456
|
localSeq,
|
|
457
457
|
rowsRef,
|
|
458
458
|
colsRef,
|
|
459
|
-
referenceSeqNumber: this.
|
|
459
|
+
referenceSeqNumber: this.deltaManager.lastSequenceNumber,
|
|
460
460
|
};
|
|
461
461
|
|
|
462
462
|
this.submitLocalMessage(op, metadata);
|
|
@@ -472,11 +472,20 @@ export class SharedMatrix<T = any>
|
|
|
472
472
|
* @param callback - code that needs to protected against reentrancy.
|
|
473
473
|
*/
|
|
474
474
|
private protectAgainstReentrancy(callback: () => void) {
|
|
475
|
-
|
|
475
|
+
if (this.reentrantCount !== 0) {
|
|
476
|
+
// Validate that applications don't submit edits in response to matrix change notifications. This is unsupported.
|
|
477
|
+
throw new UsageError("Reentrancy detected in SharedMatrix.");
|
|
478
|
+
}
|
|
476
479
|
this.reentrantCount++;
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
+
try {
|
|
481
|
+
callback();
|
|
482
|
+
} finally {
|
|
483
|
+
this.reentrantCount--;
|
|
484
|
+
}
|
|
485
|
+
assert(
|
|
486
|
+
this.reentrantCount === 0,
|
|
487
|
+
0x85e /* indicates a problem with the reentrancy tracking code. */,
|
|
488
|
+
);
|
|
480
489
|
}
|
|
481
490
|
|
|
482
491
|
private submitVectorMessage(
|
|
@@ -686,7 +695,7 @@ export class SharedMatrix<T = any>
|
|
|
686
695
|
0x01d /* "Trying to submit message to runtime while detached!" */,
|
|
687
696
|
);
|
|
688
697
|
|
|
689
|
-
this.inFlightRefSeqs.push(this.
|
|
698
|
+
this.inFlightRefSeqs.push(this.deltaManager.lastSequenceNumber);
|
|
690
699
|
super.submitLocalMessage(message, localOpMetadata);
|
|
691
700
|
|
|
692
701
|
// Ensure that row/col 'localSeq' are synchronized (see 'nextLocalSeq()').
|
package/src/packageVersion.ts
CHANGED