@fluidframework/matrix 2.41.0-338186 → 2.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # @fluidframework/matrix
2
2
 
3
+ ## 2.41.0
4
+
5
+ Dependency updates only.
6
+
3
7
  ## 2.40.0
4
8
 
5
9
  Dependency updates only.
package/dist/matrix.d.ts CHANGED
@@ -140,9 +140,7 @@ export declare class SharedMatrix<T = any> extends SharedObject<ISharedMatrixEve
140
140
  private readonly cols;
141
141
  private cells;
142
142
  private readonly pending;
143
- private cellLastWriteTracker;
144
- private setCellLwwToFwwPolicySwitchOpSeqNumber;
145
- private userSwitchedSetCellPolicy;
143
+ private fwwPolicy;
146
144
  private reentrantCount;
147
145
  /**
148
146
  * Constructor for the Shared Matrix
@@ -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
@@ -64,8 +64,9 @@ class SharedMatrix extends internal_4.SharedObject {
64
64
  this.getMinInFlightRefSeq = () => this.inFlightRefSeqs.get(0);
65
65
  this.cells = new sparsearray2d_js_1.SparseArray2D(); // Stores cell values.
66
66
  this.pending = new sparsearray2d_js_1.SparseArray2D(); // Tracks pending writes.
67
- this.cellLastWriteTracker = new sparsearray2d_js_1.SparseArray2D(); // Tracks last writes sequence number and clientId in a cell.
68
- this.userSwitchedSetCellPolicy = false; // Set to true when the user calls switchPolicy.
67
+ this.fwwPolicy = {
68
+ state: "off",
69
+ };
69
70
  // Used to track if there is any reentrancy in setCell code.
70
71
  this.reentrantCount = 0;
71
72
  // Invoked by PermutationVector to notify IMatrixConsumers of row insertion/deletions.
@@ -84,17 +85,24 @@ class SharedMatrix extends internal_4.SharedObject {
84
85
  for (const rowHandle of rowHandles) {
85
86
  this.cells.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);
86
87
  this.pending.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);
87
- this.cellLastWriteTracker.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);
88
+ if (this.fwwPolicy.state === "on") {
89
+ this.fwwPolicy.cellLastWriteTracker?.clearRows(
90
+ /* rowStart: */ rowHandle,
91
+ /* rowCount: */ 1);
92
+ }
88
93
  }
89
94
  };
90
95
  this.onColHandlesRecycled = (colHandles) => {
91
96
  for (const colHandle of colHandles) {
92
97
  this.cells.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);
93
98
  this.pending.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);
94
- this.cellLastWriteTracker.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);
99
+ if (this.fwwPolicy.state === "on") {
100
+ this.fwwPolicy.cellLastWriteTracker?.clearCols(
101
+ /* colStart: */ colHandle,
102
+ /* colCount: */ 1);
103
+ }
95
104
  }
96
105
  };
97
- this.setCellLwwToFwwPolicySwitchOpSeqNumber = -1;
98
106
  this.rows = new permutationvector_js_1.PermutationVector(ops_js_1.SnapshotPath.rows, this.logger, runtime, this.onRowDelta, this.onRowHandlesRecycled, this.getMinInFlightRefSeq);
99
107
  this.cols = new permutationvector_js_1.PermutationVector(ops_js_1.SnapshotPath.cols, this.logger, runtime, this.onColDelta, this.onColHandlesRecycled, this.getMinInFlightRefSeq);
100
108
  }
@@ -129,7 +137,7 @@ class SharedMatrix extends internal_4.SharedObject {
129
137
  return this.cols.getLength();
130
138
  }
131
139
  isSetCellConflictResolutionPolicyFWW() {
132
- return this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1 || this.userSwitchedSetCellPolicy;
140
+ return this.fwwPolicy.state !== "off";
133
141
  }
134
142
  getCell(row, col) {
135
143
  // Perf: When possible, bounds checking is performed inside the implementation for
@@ -211,7 +219,7 @@ class SharedMatrix extends internal_4.SharedObject {
211
219
  row,
212
220
  col,
213
221
  value,
214
- fwwMode: this.userSwitchedSetCellPolicy || this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1,
222
+ fwwMode: this.fwwPolicy.state !== "off",
215
223
  };
216
224
  const rowsRef = this.createOpMetadataLocalRef(this.rows, row, localSeq);
217
225
  const colsRef = this.createOpMetadataLocalRef(this.cols, col, localSeq);
@@ -362,14 +370,14 @@ class SharedMatrix extends internal_4.SharedObject {
362
370
  const builder = new internal_3.SummaryTreeBuilder();
363
371
  builder.addWithStats(ops_js_1.SnapshotPath.rows, this.rows.summarize(this.runtime, this.handle, serializer));
364
372
  builder.addWithStats(ops_js_1.SnapshotPath.cols, this.cols.summarize(this.runtime, this.handle, serializer));
365
- const artifactsToSummarize = [
366
- this.cells.snapshot(),
367
- this.pending.snapshot(),
368
- this.setCellLwwToFwwPolicySwitchOpSeqNumber,
369
- ];
373
+ const artifactsToSummarize = [this.cells.snapshot(), this.pending.snapshot()];
370
374
  // Only need to store it in the snapshot if we have switched the policy already.
371
- if (this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1) {
372
- artifactsToSummarize.push(this.cellLastWriteTracker.snapshot());
375
+ if (this.fwwPolicy.state === "on") {
376
+ artifactsToSummarize.push(this.fwwPolicy.switchOpSeqNumber, this.fwwPolicy.cellLastWriteTracker.snapshot());
377
+ }
378
+ else {
379
+ // back-compat: used -1 for disabled
380
+ artifactsToSummarize.push(-1);
373
381
  }
374
382
  builder.addBlob(ops_js_1.SnapshotPath.cells, serializer.stringify(artifactsToSummarize, this.handle));
375
383
  return builder.getSummaryTree();
@@ -445,15 +453,14 @@ class SharedMatrix extends internal_4.SharedObject {
445
453
  this.rows.removeLocalReferencePosition(rowsRef);
446
454
  this.cols.removeLocalReferencePosition(colsRef);
447
455
  if (row !== undefined && col !== undefined && row >= 0 && col >= 0) {
448
- const lastCellModificationDetails = this.cellLastWriteTracker.getCell(rowHandle, colHandle);
449
456
  // If the mode is LWW, then send the op.
450
457
  // Otherwise if the current mode is FWW and if we generated this op, after seeing the
451
458
  // last set op, or it is the first set op for the cell, then regenerate the op,
452
459
  // otherwise raise conflict. We want to check the current mode here and not that
453
460
  // whether op was made in FWW or not.
454
- if (this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1 ||
455
- lastCellModificationDetails === undefined ||
456
- referenceSeqNumber >= lastCellModificationDetails.seqNum) {
461
+ if (this.fwwPolicy.state !== "on" ||
462
+ referenceSeqNumber >=
463
+ (this.fwwPolicy.cellLastWriteTracker.getCell(rowHandle, colHandle)?.seqNum ?? 0)) {
457
464
  this.sendSetCellOp(row, col, setOp.value, rowHandle, colHandle, localSeq);
458
465
  }
459
466
  else if (this.pending.getCell(rowHandle, colHandle) !== undefined) {
@@ -490,11 +497,20 @@ class SharedMatrix extends internal_4.SharedObject {
490
497
  // Cast is needed since the (de)serializer returns content of type `any`.
491
498
  ] = (await (0, serialization_js_1.deserializeBlob)(storage, ops_js_1.SnapshotPath.cells, this.serializer));
492
499
  this.cells = sparsearray2d_js_1.SparseArray2D.load(cellData);
493
- this.setCellLwwToFwwPolicySwitchOpSeqNumber =
494
- setCellLwwToFwwPolicySwitchOpSeqNumber ?? -1;
495
- if (cellLastWriteTracker !== undefined) {
496
- this.cellLastWriteTracker = sparsearray2d_js_1.SparseArray2D.load(cellLastWriteTracker);
497
- }
500
+ // back-compat: used -1 for disabled, also may not exist
501
+ const switchOpSeqNumber = setCellLwwToFwwPolicySwitchOpSeqNumber === -1
502
+ ? undefined
503
+ : (setCellLwwToFwwPolicySwitchOpSeqNumber ?? undefined);
504
+ this.fwwPolicy =
505
+ switchOpSeqNumber === undefined
506
+ ? {
507
+ state: "off",
508
+ }
509
+ : {
510
+ state: "on",
511
+ switchOpSeqNumber,
512
+ cellLastWriteTracker: sparsearray2d_js_1.SparseArray2D.load(cellLastWriteTracker),
513
+ };
498
514
  }
499
515
  catch (error) {
500
516
  this.logger.sendErrorEvent({ eventName: "MatrixLoadFailed" }, error);
@@ -505,9 +521,9 @@ class SharedMatrix extends internal_4.SharedObject {
505
521
  * we are in FWW mode.
506
522
  */
507
523
  shouldSetCellBasedOnFWW(rowHandle, colHandle, message) {
508
- (0, internal_1.assert)(this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1, 0x85f /* should be in Fww mode when calling this method */);
524
+ (0, internal_1.assert)(this.fwwPolicy.state === "on", 0x85f /* should be in Fww mode when calling this method */);
509
525
  (0, internal_1.assert)(message.clientId !== null, 0x860 /* clientId should not be null */);
510
- const lastCellModificationDetails = this.cellLastWriteTracker.getCell(rowHandle, colHandle);
526
+ const lastCellModificationDetails = this.fwwPolicy.cellLastWriteTracker.getCell(rowHandle, colHandle);
511
527
  // If someone tried to Overwrite the cell value or first write on this cell or
512
528
  // same client tried to modify the cell.
513
529
  return (lastCellModificationDetails === undefined ||
@@ -540,10 +556,13 @@ class SharedMatrix extends internal_4.SharedObject {
540
556
  case undefined: {
541
557
  (0, internal_1.assert)(contents.type === ops_js_1.MatrixOp.set, 0x021 /* "SharedMatrix message contents have unexpected type!" */);
542
558
  const { row, col, value, fwwMode } = contents;
543
- const isPreviousSetCellPolicyModeFWW = this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1;
544
559
  // If this is the first op notifying us of the policy change, then set the policy change seq number.
545
- if (this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1 && fwwMode === true) {
546
- this.setCellLwwToFwwPolicySwitchOpSeqNumber = msg.sequenceNumber;
560
+ if (fwwMode === true && this.fwwPolicy.state !== "on") {
561
+ this.fwwPolicy = {
562
+ state: "on",
563
+ switchOpSeqNumber: msg.sequenceNumber,
564
+ cellLastWriteTracker: new sparsearray2d_js_1.SparseArray2D(),
565
+ };
547
566
  }
548
567
  (0, internal_1.assert)(msg.clientId !== null, 0x861 /* clientId should not be null!! */);
549
568
  if (local) {
@@ -554,10 +573,9 @@ class SharedMatrix extends internal_4.SharedObject {
554
573
  this.cols.removeLocalReferencePosition(colsRef);
555
574
  // If policy is switched and cell should be modified too based on policy, then update the tracker.
556
575
  // If policy is not switched, then also update the tracker in case it is the latest.
557
- if ((this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1 &&
558
- this.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)) ||
559
- (this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1 && isLatestPendingOp)) {
560
- this.cellLastWriteTracker.setCell(rowHandle, colHandle, {
576
+ if (this.fwwPolicy.state === "on" &&
577
+ this.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)) {
578
+ this.fwwPolicy.cellLastWriteTracker.setCell(rowHandle, colHandle, {
561
579
  seqNum: msg.sequenceNumber,
562
580
  clientId: msg.clientId,
563
581
  });
@@ -574,15 +592,14 @@ class SharedMatrix extends internal_4.SharedObject {
574
592
  const rowHandle = this.rows.getAllocatedHandle(adjustedRow);
575
593
  const colHandle = this.cols.getAllocatedHandle(adjustedCol);
576
594
  (0, internal_1.assert)((0, handletable_js_1.isHandleValid)(rowHandle) && (0, handletable_js_1.isHandleValid)(colHandle), 0x022 /* "SharedMatrix row and/or col handles are invalid!" */);
577
- if (this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1) {
595
+ if (this.fwwPolicy.state === "on") {
578
596
  // If someone tried to Overwrite the cell value or first write on this cell or
579
597
  // same client tried to modify the cell or if the previous mode was LWW, then we need to still
580
598
  // overwrite the cell and raise conflict if we have pending changes as our change is going to be lost.
581
- if (!isPreviousSetCellPolicyModeFWW ||
582
- this.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)) {
599
+ if (this.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)) {
583
600
  const previousValue = this.cells.getCell(rowHandle, colHandle);
584
601
  this.cells.setCell(rowHandle, colHandle, value);
585
- this.cellLastWriteTracker.setCell(rowHandle, colHandle, {
602
+ this.fwwPolicy.cellLastWriteTracker.setCell(rowHandle, colHandle, {
586
603
  seqNum: msg.sequenceNumber,
587
604
  clientId: msg.clientId,
588
605
  });
@@ -603,10 +620,6 @@ class SharedMatrix extends internal_4.SharedObject {
603
620
  // If there is a pending (unACKed) local write to the same cell, skip the current op
604
621
  // since it "happened before" the pending write.
605
622
  this.cells.setCell(rowHandle, colHandle, value);
606
- this.cellLastWriteTracker.setCell(rowHandle, colHandle, {
607
- seqNum: msg.sequenceNumber,
608
- clientId: msg.clientId,
609
- });
610
623
  for (const consumer of this.consumers.values()) {
611
624
  consumer.cellsChanged(adjustedRow, adjustedCol, 1, 1, this);
612
625
  }
@@ -622,13 +635,14 @@ class SharedMatrix extends internal_4.SharedObject {
622
635
  }
623
636
  }
624
637
  switchSetCellPolicy() {
625
- if (this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1) {
626
- if (this.isAttached()) {
627
- this.userSwitchedSetCellPolicy = true;
628
- }
629
- else {
630
- this.setCellLwwToFwwPolicySwitchOpSeqNumber = 0;
631
- }
638
+ if (this.fwwPolicy.state === "off") {
639
+ this.fwwPolicy = this.isAttached()
640
+ ? { state: "local" }
641
+ : {
642
+ state: "on",
643
+ switchOpSeqNumber: 0,
644
+ cellLastWriteTracker: new sparsearray2d_js_1.SparseArray2D(),
645
+ };
632
646
  }
633
647
  }
634
648
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"matrix.js","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIEvent,\n\tIEventThisPlaceHolder,\n\ttype IEventProvider,\n} from \"@fluidframework/core-interfaces\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\ttype IChannel,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tClient,\n\tIJSONSegment,\n\tIMergeTreeOp,\n\ttype ISegmentInternal,\n\ttype LocalReferencePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\tsegmentIsRemoved,\n} from \"@fluidframework/merge-tree/internal\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions/internal\";\nimport {\n\tObjectStoragePartition,\n\tSummaryTreeBuilder,\n} from \"@fluidframework/runtime-utils/internal\";\nimport {\n\tIFluidSerializer,\n\tISharedObjectEvents,\n\tSharedObject,\n} from \"@fluidframework/shared-object-base/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport {\n\tIMatrixConsumer,\n\tIMatrixProducer,\n\tIMatrixReader,\n\tIMatrixWriter,\n} from \"@tiny-calc/nano\";\nimport Deque from \"double-ended-queue\";\n\nimport type { HandleCache } from \"./handlecache.js\";\nimport { Handle, isHandleValid } from \"./handletable.js\";\nimport {\n\tISetOp,\n\tMatrixItem,\n\tMatrixOp,\n\tMatrixSetOrVectorOp,\n\tSnapshotPath,\n\tVectorOp,\n} from \"./ops.js\";\nimport { PermutationVector, reinsertSegmentIntoVector } from \"./permutationvector.js\";\nimport { ensureRange } from \"./range.js\";\nimport { deserializeBlob } from \"./serialization.js\";\nimport { SparseArray2D, type RecurArray } from \"./sparsearray2d.js\";\nimport { IUndoConsumer } from \"./types.js\";\nimport { MatrixUndoProvider } from \"./undoprovider.js\";\n\ninterface ISetOpMetadata {\n\trowHandle: Handle;\n\tcolHandle: Handle;\n\tlocalSeq: number;\n\trowsRef: LocalReferencePosition;\n\tcolsRef: LocalReferencePosition;\n\treferenceSeqNumber: number;\n}\n\n/**\n * Events emitted by Shared Matrix.\n * @legacy\n * @alpha\n */\nexport interface ISharedMatrixEvents<T> extends IEvent {\n\t/**\n\t * This event is only emitted when the SetCell Resolution Policy is First Write Win(FWW).\n\t * This is emitted when two clients race and send changes without observing each other changes,\n\t * the changes that gets sequenced last would be rejected, and only client who's changes rejected\n\t * would be notified via this event, with expectation that it will merge its changes back by\n\t * accounting new information (state from winner of the race).\n\t *\n\t * @remarks Listener parameters:\n\t *\n\t * - `row` - Row number at which conflict happened.\n\t *\n\t * - `col` - Col number at which conflict happened.\n\t *\n\t * - `currentValue` - The current value of the cell.\n\t *\n\t * - `conflictingValue` - The value that this client tried to set in the cell and got ignored due to conflict.\n\t *\n\t * - `target` - The {@link ISharedMatrix} itself.\n\t */\n\t(\n\t\tevent: \"conflict\",\n\t\tlistener: (\n\t\t\trow: number,\n\t\t\tcol: number,\n\t\t\tcurrentValue: MatrixItem<T>,\n\t\t\tconflictingValue: MatrixItem<T>,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n}\n\n/**\n * This represents the item which is used to track the client which modified the cell last.\n */\ninterface CellLastWriteTrackerItem {\n\tseqNum: number; // Seq number of op which last modified this cell\n\tclientId: string; // clientId of the client which last modified this cell\n}\n\n/**\n * @legacy\n * @alpha\n */\n// Changing this to `unknown` would be a breaking change.\n// TODO: if possible, transition ISharedMatrix to not use `any`.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface ISharedMatrix<T = any>\n\textends IEventProvider<ISharedMatrixEvents<T>>,\n\t\tIMatrixProducer<MatrixItem<T>>,\n\t\tIMatrixReader<MatrixItem<T>>,\n\t\tIMatrixWriter<MatrixItem<T>>,\n\t\tIChannel {\n\t/**\n\t * Inserts columns into the matrix.\n\t * @param colStart - Index of the first column to insert.\n\t * @param count - Number of columns to insert.\n\t * @remarks\n\t * Inserting 0 columns is a noop.\n\t */\n\tinsertCols(colStart: number, count: number): void;\n\t/**\n\t * Removes columns from the matrix.\n\t * @param colStart - Index of the first column to remove.\n\t * @param count - Number of columns to remove.\n\t * @remarks\n\t * Removing 0 columns is a noop.\n\t */\n\tremoveCols(colStart: number, count: number): void;\n\t/**\n\t * Inserts rows into the matrix.\n\t * @param rowStart - Index of the first row to insert.\n\t * @param count - Number of rows to insert.\n\t * @remarks\n\t * Inserting 0 rows is a noop.\n\t */\n\tinsertRows(rowStart: number, count: number): void;\n\t/**\n\t * Removes rows from the matrix.\n\t * @param rowStart - Index of the first row to remove.\n\t * @param count - Number of rows to remove.\n\t * @remarks\n\t * Removing 0 rows is a noop.\n\t */\n\tremoveRows(rowStart: number, count: number): void;\n\n\t/**\n\t * Sets a range of cells in the matrix.\n\t * Cells are set in consecutive columns between `colStart` and `colStart + colCount - 1`.\n\t * When `values` has larger size than `colCount`, the extra values are inserted in subsequent rows\n\t * a la text-wrapping.\n\t * @param rowStart - Index of the row to start setting cells.\n\t * @param colStart - Index of the column to start setting cells.\n\t * @param colCount - Number of columns to set before wrapping to subsequent rows (if `values` has more items)\n\t * @param values - Values to insert.\n\t * @remarks\n\t * This is not currently more efficient than calling `setCell` for each cell.\n\t */\n\tsetCells(\n\t\trowStart: number,\n\t\tcolStart: number,\n\t\tcolCount: number,\n\t\tvalues: readonly MatrixItem<T>[],\n\t): void;\n\n\t/**\n\t * Attach an {@link IUndoConsumer} to the matrix.\n\t * @param consumer - Undo consumer which will receive revertibles from the matrix.\n\t */\n\topenUndo(consumer: IUndoConsumer): void;\n\n\t/**\n\t * Whether the current conflict resolution policy is first-write win (FWW).\n\t * See {@link ISharedMatrix.switchSetCellPolicy} for more details.\n\t */\n\tisSetCellConflictResolutionPolicyFWW(): boolean;\n\n\t/**\n\t * Change the conflict resolution policy for setCell operations to first-write win (FWW).\n\t *\n\t * This API only switches from LWW to FWW and not from FWW to LWW.\n\t *\n\t * @privateRemarks\n\t * The next SetOp which is sent will communicate this policy to other clients.\n\t */\n\tswitchSetCellPolicy(): void;\n}\n\n/**\n * A SharedMatrix holds a rectangular 2D array of values. Supported operations\n * include setting values and inserting/removing rows and columns.\n *\n * Matrix values may be any Fluid serializable type, which is the set of JSON\n * serializable types extended to include IFluidHandles.\n *\n * Fluid's SharedMatrix implementation works equally well for dense and sparse\n * matrix data and physically stores data in Z-order to leverage CPU caches and\n * prefetching when reading in either row or column major order. (See README.md\n * for more details.)\n * @legacy\n * @alpha\n */\n// Changing this to `unknown` would be a breaking change.\n// TODO: if possible, transition SharedMatrix to not use `any`.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class SharedMatrix<T = any>\n\textends SharedObject<ISharedMatrixEvents<T> & ISharedObjectEvents>\n\timplements ISharedMatrix<T>\n{\n\tprivate readonly consumers = new Set<IMatrixConsumer<MatrixItem<T>>>();\n\n\t/**\n\t * Note: this field only provides a lower-bound on the reference sequence numbers for in-flight ops.\n\t * The exact reason isn't understood, but some e2e tests suggest that the runtime may sometimes process\n\t * incoming leave/join ops before putting an op that this DDS submits over the wire.\n\t *\n\t * E.g. SharedMatrix submits an op while deltaManager has lastSequenceNumber = 10, but before the runtime\n\t * puts this op over the wire, it processes a client join/leave op with sequence number 11, so the referenceSequenceNumber\n\t * on the SharedMatrix op is 11.\n\t */\n\tprivate readonly inFlightRefSeqs = new Deque<number>();\n\treadonly getMinInFlightRefSeq = (): number | undefined => this.inFlightRefSeqs.get(0);\n\n\tprivate readonly rows: PermutationVector; // Map logical row to storage handle (if any)\n\tprivate readonly cols: PermutationVector; // Map logical col to storage handle (if any)\n\n\tprivate cells = new SparseArray2D<MatrixItem<T>>(); // Stores cell values.\n\tprivate readonly pending = new SparseArray2D<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\tthis.rows = new PermutationVector(\n\t\t\tSnapshotPath.rows,\n\t\t\tthis.logger,\n\t\t\truntime,\n\t\t\tthis.onRowDelta,\n\t\t\tthis.onRowHandlesRecycled,\n\t\t\tthis.getMinInFlightRefSeq,\n\t\t);\n\n\t\tthis.cols = new PermutationVector(\n\t\t\tSnapshotPath.cols,\n\t\t\tthis.logger,\n\t\t\truntime,\n\t\t\tthis.onColDelta,\n\t\t\tthis.onColHandlesRecycled,\n\t\t\tthis.getMinInFlightRefSeq,\n\t\t);\n\t}\n\n\tprivate undo?: MatrixUndoProvider<T>;\n\n\t/**\n\t * Subscribes the given IUndoConsumer to the matrix.\n\t */\n\tpublic openUndo(consumer: IUndoConsumer): void {\n\t\tassert(\n\t\t\tthis.undo === undefined,\n\t\t\t0x019 /* \"SharedMatrix.openUndo() supports at most a single IUndoConsumer.\" */,\n\t\t);\n\n\t\tthis.undo = new MatrixUndoProvider(consumer, this, this.rows, this.cols);\n\t}\n\n\t// TODO: closeUndo()?\n\n\tprivate get rowHandles(): HandleCache {\n\t\treturn this.rows.handleCache;\n\t}\n\tprivate get colHandles(): HandleCache {\n\t\treturn this.cols.handleCache;\n\t}\n\n\t// #region IMatrixProducer\n\n\topenMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): IMatrixReader<MatrixItem<T>> {\n\t\tthis.consumers.add(consumer);\n\t\treturn this;\n\t}\n\n\tcloseMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): void {\n\t\tthis.consumers.delete(consumer);\n\t}\n\n\t// #endregion IMatrixProducer\n\n\t// #region IMatrixReader\n\n\tpublic get rowCount(): number {\n\t\treturn this.rows.getLength();\n\t}\n\tpublic get colCount(): number {\n\t\treturn this.cols.getLength();\n\t}\n\n\tpublic isSetCellConflictResolutionPolicyFWW(): boolean {\n\t\treturn this.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>): void {\n\t\tif (row < 0 || row >= this.rowCount || col < 0 || col >= this.colCount) {\n\t\t\tthrow new UsageError(\"Trying to set out-of-bounds cell.\");\n\t\t}\n\n\t\tthis.setCellCore(row, col, value);\n\t}\n\n\tpublic setCells(\n\t\trowStart: number,\n\t\tcolStart: number,\n\t\tcolCount: number,\n\t\tvalues: readonly MatrixItem<T>[],\n\t): void {\n\t\tconst rowCount = Math.ceil(values.length / colCount);\n\n\t\tassert(\n\t\t\t0 <= rowStart &&\n\t\t\t\trowStart < this.rowCount &&\n\t\t\t\t0 <= colStart &&\n\t\t\t\tcolStart < this.colCount &&\n\t\t\t\t1 <= colCount &&\n\t\t\t\tcolCount <= this.colCount - colStart &&\n\t\t\t\trowCount <= this.rowCount - rowStart,\n\t\t\t0x01b /* \"Trying to set multiple out-of-bounds cells!\" */,\n\t\t);\n\n\t\tconst endCol = colStart + colCount;\n\t\tlet r = rowStart;\n\t\tlet c = colStart;\n\n\t\tfor (const value of values) {\n\t\t\tthis.setCellCore(r, c, value);\n\n\t\t\tif (++c === endCol) {\n\t\t\t\tc = colStart;\n\t\t\t\tr++;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate setCellCore(\n\t\trow: number,\n\t\tcol: number,\n\t\tvalue: MatrixItem<T>,\n\t\trowHandle = this.rows.getAllocatedHandle(row),\n\t\tcolHandle = this.cols.getAllocatedHandle(col),\n\t): void {\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(\n\t\tvector: PermutationVector,\n\t\tpos: number,\n\t\tlocalSeq: number,\n\t): LocalReferencePosition {\n\t\tconst segoff = vector.getContainingSegment(pos, undefined, localSeq);\n\t\tassert(\n\t\t\tsegoff.segment !== undefined && segoff.offset !== undefined,\n\t\t\t0x8b3 /* expected valid position */,\n\t\t);\n\t\treturn vector.createLocalReferencePosition(\n\t\t\tsegoff.segment,\n\t\t\tsegoff.offset,\n\t\t\tReferenceType.StayOnRemove,\n\t\t\tundefined,\n\t\t);\n\t}\n\n\tprivate sendSetCellOp(\n\t\trow: number,\n\t\tcol: number,\n\t\tvalue: MatrixItem<T>,\n\t\trowHandle: Handle,\n\t\tcolHandle: Handle,\n\t\tlocalSeq = this.nextLocalSeq(),\n\t): void {\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): void {\n\t\tif (this.reentrantCount !== 0) {\n\t\t\t// Validate that applications don't submit edits in response to matrix change notifications. This is unsupported.\n\t\t\tthrow new UsageError(\"Reentrancy detected in SharedMatrix.\");\n\t\t}\n\t\tthis.reentrantCount++;\n\t\ttry {\n\t\t\tcallback();\n\t\t} finally {\n\t\t\tthis.reentrantCount--;\n\t\t}\n\t\tassert(\n\t\t\tthis.reentrantCount === 0,\n\t\t\t0x85e /* indicates a problem with the reentrancy tracking code. */,\n\t\t);\n\t}\n\n\tprivate submitVectorMessage(\n\t\tcurrentVector: PermutationVector,\n\t\toppositeVector: PermutationVector,\n\t\ttarget: SnapshotPath.rows | SnapshotPath.cols,\n\t\tmessage: IMergeTreeOp,\n\t): void {\n\t\t// Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n\t\t// and the SharedMatrix's cell data. Instead, we externally advance each MergeTree's 'localSeq' counter\n\t\t// for each submitted op it not aware of to keep them synchronized.\n\t\tconst localSeq = currentVector.getCollabWindow().localSeq;\n\t\tconst oppositeWindow = oppositeVector.getCollabWindow();\n\n\t\t// Note that the comparison is '>=' because, in the case the MergeTree is regenerating ops for reconnection,\n\t\t// the MergeTree submits the op with the original 'localSeq'.\n\t\tassert(\n\t\t\tlocalSeq >= oppositeWindow.localSeq,\n\t\t\t0x01c /* \"The 'localSeq' of the vector submitting an op must >= the 'localSeq' of the other vector.\" */,\n\t\t);\n\n\t\toppositeWindow.localSeq = localSeq;\n\n\t\t// If the SharedMatrix is local, it's state will be submitted via a Snapshot when initially connected.\n\t\t// Do not queue a message or track the pending op, as there will never be an ACK, etc.\n\t\tif (this.isAttached()) {\n\t\t\t// Record whether this `op` targets rows or cols. (See dispatch in `processCore()`)\n\t\t\tconst targetedMessage: VectorOp = { ...message, target };\n\n\t\t\tthis.submitLocalMessage(\n\t\t\t\ttargetedMessage,\n\t\t\t\tcurrentVector.peekPendingSegmentGroups(\n\t\t\t\t\tmessage.type === MergeTreeDeltaType.GROUP ? message.ops.length : 1,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate submitColMessage(message: IMergeTreeOp): void {\n\t\tthis.submitVectorMessage(this.cols, this.rows, SnapshotPath.cols, message);\n\t}\n\n\tpublic insertCols(colStart: number, count: number): void {\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (colStart > this.colCount) {\n\t\t\tthrow new UsageError(\"insertCols: out of bounds\");\n\t\t}\n\t\tthis.protectAgainstReentrancy(() => {\n\t\t\tconst message = this.cols.insert(colStart, count);\n\t\t\tassert(message !== undefined, 0x8b4 /* must be defined */);\n\t\t\tthis.submitColMessage(message);\n\t\t});\n\t}\n\n\tpublic removeCols(colStart: number, count: number): void {\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (colStart > this.colCount) {\n\t\t\tthrow new UsageError(\"removeCols: out of bounds\");\n\t\t}\n\t\tthis.protectAgainstReentrancy(() =>\n\t\t\tthis.submitColMessage(this.cols.remove(colStart, count)),\n\t\t);\n\t}\n\n\tprivate submitRowMessage(message: IMergeTreeOp): void {\n\t\tthis.submitVectorMessage(this.rows, this.cols, SnapshotPath.rows, message);\n\t}\n\n\tpublic insertRows(rowStart: number, count: number): void {\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (rowStart > this.rowCount) {\n\t\t\tthrow new UsageError(\"insertRows: out of bounds\");\n\t\t}\n\t\tthis.protectAgainstReentrancy(() => {\n\t\t\tconst message = this.rows.insert(rowStart, count);\n\t\t\tassert(message !== undefined, 0x8b5 /* must be defined */);\n\t\t\tthis.submitRowMessage(message);\n\t\t});\n\t}\n\n\tpublic removeRows(rowStart: number, count: number): void {\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (rowStart > this.rowCount) {\n\t\t\tthrow new UsageError(\"removeRows: out of bounds\");\n\t\t}\n\t\tthis.protectAgainstReentrancy(() =>\n\t\t\tthis.submitRowMessage(this.rows.remove(rowStart, count)),\n\t\t);\n\t}\n\n\tpublic _undoRemoveRows(rowStart: number, spec: IJSONSegment): void {\n\t\tconst { op, inserted } = reinsertSegmentIntoVector(this.rows, rowStart, spec);\n\t\tassert(op !== undefined, 0x8b6 /* must be defined */);\n\t\tthis.submitRowMessage(op);\n\n\t\t// Generate setCell ops for each populated cell in the reinserted rows.\n\t\tlet rowHandle = inserted.start;\n\t\tconst rowCount = inserted.cachedLength;\n\t\tfor (let row = rowStart; row < rowStart + rowCount; row++, rowHandle++) {\n\t\t\tfor (let col = 0; col < this.colCount; col++) {\n\t\t\t\tconst colHandle = this.colHandles.getHandle(col);\n\t\t\t\tconst value = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\tif (this.isAttached() && value !== undefined && value !== null) {\n\t\t\t\t\tthis.sendSetCellOp(row, col, value, rowHandle, colHandle);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Avoid reentrancy by raising change notifications after the op is queued.\n\t\tfor (const consumer of this.consumers.values()) {\n\t\t\tconsumer.cellsChanged(rowStart, /* colStart: */ 0, rowCount, this.colCount, this);\n\t\t}\n\t}\n\n\t/***/ public _undoRemoveCols(colStart: number, spec: IJSONSegment): void {\n\t\tconst { op, inserted } = reinsertSegmentIntoVector(this.cols, colStart, spec);\n\t\tassert(op !== undefined, 0x8b7 /* must be defined */);\n\t\tthis.submitColMessage(op);\n\n\t\t// Generate setCell ops for each populated cell in the reinserted cols.\n\t\tlet colHandle = inserted.start;\n\t\tconst colCount = inserted.cachedLength;\n\t\tfor (let col = colStart; col < colStart + colCount; col++, colHandle++) {\n\t\t\tfor (let row = 0; row < this.rowCount; row++) {\n\t\t\t\tconst rowHandle = this.rowHandles.getHandle(row);\n\t\t\t\tconst value = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\tif (this.isAttached() && value !== undefined && value !== null) {\n\t\t\t\t\tthis.sendSetCellOp(row, col, value, rowHandle, colHandle);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Avoid reentrancy by raising change notifications after the op is queued.\n\t\tfor (const consumer of this.consumers.values()) {\n\t\t\tconsumer.cellsChanged(/* rowStart: */ 0, colStart, this.rowCount, colCount, this);\n\t\t}\n\t}\n\n\tprotected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tbuilder.addWithStats(\n\t\t\tSnapshotPath.rows,\n\t\t\tthis.rows.summarize(this.runtime, this.handle, serializer),\n\t\t);\n\t\tbuilder.addWithStats(\n\t\t\tSnapshotPath.cols,\n\t\t\tthis.cols.summarize(this.runtime, this.handle, serializer),\n\t\t);\n\t\tconst artifactsToSummarize = [\n\t\t\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): void {\n\t\tfor (let row = 0; row < this.rowCount; row++) {\n\t\t\tfor (let col = 0; col < this.colCount; col++) {\n\t\t\t\tserializer.stringify(this.getCell(row, col), this.handle);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Advances the 'localSeq' counter for the cell data operation currently being queued.\n\t *\n\t * Do not use with 'submitColMessage()/submitRowMessage()' as these helpers + the MergeTree will\n\t * automatically advance 'localSeq'.\n\t */\n\tprivate nextLocalSeq(): number {\n\t\t// Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n\t\t// and the SharedMatrix's cell data. Instead, we externally bump each MergeTree's 'localSeq' counter\n\t\t// for SharedMatrix ops it's not aware of to keep them synchronized. (For cell data operations, we\n\t\t// need to bump both counters.)\n\n\t\tthis.cols.getCollabWindow().localSeq++;\n\t\treturn ++this.rows.getCollabWindow().localSeq;\n\t}\n\n\tprotected submitLocalMessage(message: unknown, localOpMetadata?: unknown): void {\n\t\t// TODO: Recommend moving this assertion into SharedObject\n\t\t// (See https://github.com/microsoft/FluidFramework/issues/2559)\n\t\tassert(\n\t\t\tthis.isAttached() === true,\n\t\t\t0x01d /* \"Trying to submit message to runtime while detached!\" */,\n\t\t);\n\n\t\tthis.inFlightRefSeqs.push(this.deltaManager.lastSequenceNumber);\n\t\tsuper.submitLocalMessage(message, localOpMetadata);\n\n\t\t// Ensure that row/col 'localSeq' are synchronized (see 'nextLocalSeq()').\n\t\tassert(\n\t\t\tthis.rows.getCollabWindow().localSeq === this.cols.getCollabWindow().localSeq,\n\t\t\t0x01e /* \"Row and col collab window 'localSeq' desynchronized!\" */,\n\t\t);\n\t}\n\n\tprotected didAttach(): void {\n\t\t// We've attached we need to start generating and sending ops.\n\t\t// so start collaboration and provide a default client id incase we are not connected\n\t\tif (this.isAttached()) {\n\t\t\tthis.rows.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n\t\t\tthis.cols.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n\t\t}\n\t}\n\n\tprotected onConnect(): void {\n\t\tassert(\n\t\t\tthis.rows.getCollabWindow().collaborating === this.cols.getCollabWindow().collaborating,\n\t\t\t0x01f /* \"Row and col collab window 'collaborating' status desynchronized!\" */,\n\t\t);\n\n\t\t// Update merge tree collaboration information with new client ID and then resend pending ops\n\t\tthis.rows.startOrUpdateCollaboration(this.runtime.clientId as string);\n\t\tthis.cols.startOrUpdateCollaboration(this.runtime.clientId as string);\n\t}\n\n\tprivate rebasePosition(\n\t\tclient: Client,\n\t\tref: LocalReferencePosition,\n\t\tlocalSeq: number,\n\t): number | undefined {\n\t\tconst segment: ISegmentInternal | undefined = ref.getSegment();\n\t\tconst offset = ref.getOffset();\n\t\t// If the segment that contains the position is removed, then this setCell op should do nothing.\n\t\tif (segment === undefined || offset === undefined || segmentIsRemoved(segment)) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn client.findReconnectionPosition(segment, localSeq) + offset;\n\t}\n\n\tprotected reSubmitCore(incoming: unknown, localOpMetadata: unknown): void {\n\t\tconst originalRefSeq = this.inFlightRefSeqs.shift();\n\t\tassert(\n\t\t\toriginalRefSeq !== undefined,\n\t\t\t0x8b9 /* Expected a recorded refSeq when resubmitting an op */,\n\t\t);\n\t\tconst content = incoming as MatrixSetOrVectorOp<T>;\n\n\t\tif (content.type === MatrixOp.set && content.target === undefined) {\n\t\t\tconst setOp = content;\n\t\t\tconst { rowHandle, colHandle, localSeq, rowsRef, colsRef, referenceSeqNumber } =\n\t\t\t\tlocalOpMetadata as ISetOpMetadata;\n\n\t\t\t// If after rebasing the op, we get a valid row/col number, that means the row/col\n\t\t\t// handles have not been recycled and we can safely use them.\n\t\t\tconst row = this.rebasePosition(this.rows, rowsRef, localSeq);\n\t\t\tconst col = this.rebasePosition(this.cols, colsRef, localSeq);\n\t\t\tthis.rows.removeLocalReferencePosition(rowsRef);\n\t\t\tthis.cols.removeLocalReferencePosition(colsRef);\n\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(this.cols.regeneratePendingOp(content, localOpMetadata));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase SnapshotPath.rows: {\n\t\t\t\t\tthis.submitRowMessage(this.rows.regeneratePendingOp(content, localOpMetadata));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tunreachableCase(content);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected onDisconnect(): void {}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\ttry {\n\t\t\tawait this.rows.load(\n\t\t\t\tthis.runtime,\n\t\t\t\tnew ObjectStoragePartition(storage, SnapshotPath.rows),\n\t\t\t\tthis.serializer,\n\t\t\t);\n\t\t\tawait this.cols.load(\n\t\t\t\tthis.runtime,\n\t\t\t\tnew ObjectStoragePartition(storage, SnapshotPath.cols),\n\t\t\t\tthis.serializer,\n\t\t\t);\n\t\t\tconst [\n\t\t\t\tcellData,\n\t\t\t\t_pendingCliSeqData,\n\t\t\t\tsetCellLwwToFwwPolicySwitchOpSeqNumber,\n\t\t\t\tcellLastWriteTracker,\n\t\t\t\t// Cast is needed since the (de)serializer returns content of type `any`.\n\t\t\t] = (await deserializeBlob(storage, SnapshotPath.cells, this.serializer)) as [\n\t\t\t\tRecurArray<MatrixItem<T>>,\n\t\t\t\tunknown,\n\t\t\t\tnumber,\n\t\t\t\tRecurArray<CellLastWriteTrackerItem>,\n\t\t\t];\n\n\t\t\tthis.cells = SparseArray2D.load(cellData);\n\t\t\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): boolean {\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(\n\t\t\trowHandle,\n\t\t\tcolHandle,\n\t\t);\n\t\t// If someone tried to Overwrite the cell value or first write on this cell or\n\t\t// same client tried to modify the cell.\n\t\treturn (\n\t\t\tlastCellModificationDetails === undefined ||\n\t\t\tlastCellModificationDetails.clientId === message.clientId ||\n\t\t\tmessage.referenceSequenceNumber >= lastCellModificationDetails.seqNum\n\t\t);\n\t}\n\n\tprotected processCore(\n\t\tmsg: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t): void {\n\t\tif (local) {\n\t\t\tconst recordedRefSeq = this.inFlightRefSeqs.shift();\n\t\t\tassert(recordedRefSeq !== undefined, 0x8ba /* No pending recorded refSeq found */);\n\t\t\t// TODO: AB#7076: Some equivalent assert should be enabled. This fails some e2e stashed op tests because\n\t\t\t// the deltaManager may have seen more messages than the runtime has processed while amidst the stashed op\n\t\t\t// flow, so e.g. when `applyStashedOp` is called and the DDS is put in a state where it expects an ack for\n\t\t\t// one of its messages, the delta manager has actually already seen subsequent messages from collaborators\n\t\t\t// which the in-flight message is concurrent to.\n\t\t\t// See \"handles stashed ops created on top of sequenced local ops\" for one such test case.\n\t\t\t// assert(recordedRefSeq <= message.referenceSequenceNumber, \"RefSeq mismatch\");\n\t\t}\n\n\t\tconst contents = msg.contents as MatrixSetOrVectorOp<T>;\n\t\tconst target = contents.target;\n\n\t\tswitch (target) {\n\t\t\tcase SnapshotPath.cols: {\n\t\t\t\tthis.cols.applyMsg(msg, local);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SnapshotPath.rows: {\n\t\t\t\tthis.rows.applyMsg(msg, local);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase undefined: {\n\t\t\t\tassert(\n\t\t\t\t\tcontents.type === MatrixOp.set,\n\t\t\t\t\t0x021 /* \"SharedMatrix message contents have unexpected type!\" */,\n\t\t\t\t);\n\n\t\t\t\tconst { row, col, value, fwwMode } = contents;\n\t\t\t\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(rowHandle, colHandle, localSeq);\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\t}\n\t\t}\n\t}\n\n\t// Invoked by PermutationVector to notify IMatrixConsumers of row insertion/deletions.\n\tprivate readonly onRowDelta = (\n\t\tposition: number,\n\t\tremovedCount: number,\n\t\tinsertedCount: number,\n\t): void => {\n\t\tfor (const consumer of this.consumers) {\n\t\t\tconsumer.rowsChanged(position, removedCount, insertedCount, this);\n\t\t}\n\t};\n\n\t// Invoked by PermutationVector to notify IMatrixConsumers of col insertion/deletions.\n\tprivate readonly onColDelta = (\n\t\tposition: number,\n\t\tremovedCount: number,\n\t\tinsertedCount: number,\n\t): void => {\n\t\tfor (const consumer of this.consumers) {\n\t\t\tconsumer.colsChanged(position, removedCount, insertedCount, this);\n\t\t}\n\t};\n\n\tprivate readonly onRowHandlesRecycled = (rowHandles: Handle[]): void => {\n\t\tfor (const rowHandle of rowHandles) {\n\t\t\tthis.cells.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t\tthis.pending.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t\tthis.cellLastWriteTracker.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t}\n\t};\n\n\tprivate readonly onColHandlesRecycled = (colHandles: Handle[]): void => {\n\t\tfor (const colHandle of colHandles) {\n\t\t\tthis.cells.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t\tthis.pending.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t\tthis.cellLastWriteTracker.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t}\n\t};\n\n\tpublic switchSetCellPolicy(): void {\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(\n\t\trowHandle: Handle,\n\t\tcolHandle: Handle,\n\t\tlocalSeq: number,\n\t): boolean {\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(): string {\n\t\tlet s = `client:${\n\t\t\tthis.runtime.clientId\n\t\t}\\nrows: ${this.rows.toString()}\\ncols: ${this.cols.toString()}\\n\\n`;\n\n\t\tfor (let r = 0; r < this.rowCount; r++) {\n\t\t\ts += ` [`;\n\t\t\tfor (let c = 0; c < this.colCount; c++) {\n\t\t\t\tif (c > 0) {\n\t\t\t\t\ts += \", \";\n\t\t\t\t}\n\n\t\t\t\ts += `${this.serializer.stringify(this.getCell(r, c), this.handle)}`;\n\t\t\t}\n\t\t\ts += \"]\\n\";\n\t\t}\n\n\t\treturn `${s}\\n`;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}\n\t */\n\tprotected applyStashedOp(_content: unknown): void {\n\t\tconst content = _content as MatrixSetOrVectorOp<T>;\n\t\tif (content.type === MatrixOp.set && content.target === undefined) {\n\t\t\tif (content.fwwMode === true) {\n\t\t\t\tthis.switchSetCellPolicy();\n\t\t\t}\n\t\t\tthis.setCell(content.row, content.col, content.value);\n\t\t} else {\n\t\t\tconst vector = content.target === SnapshotPath.cols ? this.cols : this.rows;\n\t\t\tvector.applyStashedOp(content);\n\t\t\tif (content.target === SnapshotPath.cols) {\n\t\t\t\tthis.submitColMessage(content);\n\t\t\t} else {\n\t\t\t\tthis.submitRowMessage(content);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"matrix.js","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIEvent,\n\tIEventThisPlaceHolder,\n\ttype IEventProvider,\n} from \"@fluidframework/core-interfaces\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\ttype IChannel,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tClient,\n\tIJSONSegment,\n\tIMergeTreeOp,\n\ttype ISegmentInternal,\n\ttype LocalReferencePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\tsegmentIsRemoved,\n} from \"@fluidframework/merge-tree/internal\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions/internal\";\nimport {\n\tObjectStoragePartition,\n\tSummaryTreeBuilder,\n} from \"@fluidframework/runtime-utils/internal\";\nimport {\n\tIFluidSerializer,\n\tISharedObjectEvents,\n\tSharedObject,\n} from \"@fluidframework/shared-object-base/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport {\n\tIMatrixConsumer,\n\tIMatrixProducer,\n\tIMatrixReader,\n\tIMatrixWriter,\n} from \"@tiny-calc/nano\";\nimport Deque from \"double-ended-queue\";\n\nimport type { HandleCache } from \"./handlecache.js\";\nimport { Handle, isHandleValid } from \"./handletable.js\";\nimport {\n\tISetOp,\n\tMatrixItem,\n\tMatrixOp,\n\tMatrixSetOrVectorOp,\n\tSnapshotPath,\n\tVectorOp,\n} from \"./ops.js\";\nimport { PermutationVector, reinsertSegmentIntoVector } from \"./permutationvector.js\";\nimport { ensureRange } from \"./range.js\";\nimport { deserializeBlob } from \"./serialization.js\";\nimport { SparseArray2D, type RecurArray } from \"./sparsearray2d.js\";\nimport { IUndoConsumer } from \"./types.js\";\nimport { MatrixUndoProvider } from \"./undoprovider.js\";\n\ninterface ISetOpMetadata {\n\trowHandle: Handle;\n\tcolHandle: Handle;\n\tlocalSeq: number;\n\trowsRef: LocalReferencePosition;\n\tcolsRef: LocalReferencePosition;\n\treferenceSeqNumber: number;\n}\n\n/**\n * Events emitted by Shared Matrix.\n * @legacy\n * @alpha\n */\nexport interface ISharedMatrixEvents<T> extends IEvent {\n\t/**\n\t * This event is only emitted when the SetCell Resolution Policy is First Write Win(FWW).\n\t * This is emitted when two clients race and send changes without observing each other changes,\n\t * the changes that gets sequenced last would be rejected, and only client who's changes rejected\n\t * would be notified via this event, with expectation that it will merge its changes back by\n\t * accounting new information (state from winner of the race).\n\t *\n\t * @remarks Listener parameters:\n\t *\n\t * - `row` - Row number at which conflict happened.\n\t *\n\t * - `col` - Col number at which conflict happened.\n\t *\n\t * - `currentValue` - The current value of the cell.\n\t *\n\t * - `conflictingValue` - The value that this client tried to set in the cell and got ignored due to conflict.\n\t *\n\t * - `target` - The {@link ISharedMatrix} itself.\n\t */\n\t(\n\t\tevent: \"conflict\",\n\t\tlistener: (\n\t\t\trow: number,\n\t\t\tcol: number,\n\t\t\tcurrentValue: MatrixItem<T>,\n\t\t\tconflictingValue: MatrixItem<T>,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n}\n\n/**\n * This represents the item which is used to track the client which modified the cell last.\n */\ninterface CellLastWriteTrackerItem {\n\tseqNum: number; // Seq number of op which last modified this cell\n\tclientId: string; // clientId of the client which last modified this cell\n}\n\n/**\n * @legacy\n * @alpha\n */\n// Changing this to `unknown` would be a breaking change.\n// TODO: if possible, transition ISharedMatrix to not use `any`.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface ISharedMatrix<T = any>\n\textends IEventProvider<ISharedMatrixEvents<T>>,\n\t\tIMatrixProducer<MatrixItem<T>>,\n\t\tIMatrixReader<MatrixItem<T>>,\n\t\tIMatrixWriter<MatrixItem<T>>,\n\t\tIChannel {\n\t/**\n\t * Inserts columns into the matrix.\n\t * @param colStart - Index of the first column to insert.\n\t * @param count - Number of columns to insert.\n\t * @remarks\n\t * Inserting 0 columns is a noop.\n\t */\n\tinsertCols(colStart: number, count: number): void;\n\t/**\n\t * Removes columns from the matrix.\n\t * @param colStart - Index of the first column to remove.\n\t * @param count - Number of columns to remove.\n\t * @remarks\n\t * Removing 0 columns is a noop.\n\t */\n\tremoveCols(colStart: number, count: number): void;\n\t/**\n\t * Inserts rows into the matrix.\n\t * @param rowStart - Index of the first row to insert.\n\t * @param count - Number of rows to insert.\n\t * @remarks\n\t * Inserting 0 rows is a noop.\n\t */\n\tinsertRows(rowStart: number, count: number): void;\n\t/**\n\t * Removes rows from the matrix.\n\t * @param rowStart - Index of the first row to remove.\n\t * @param count - Number of rows to remove.\n\t * @remarks\n\t * Removing 0 rows is a noop.\n\t */\n\tremoveRows(rowStart: number, count: number): void;\n\n\t/**\n\t * Sets a range of cells in the matrix.\n\t * Cells are set in consecutive columns between `colStart` and `colStart + colCount - 1`.\n\t * When `values` has larger size than `colCount`, the extra values are inserted in subsequent rows\n\t * a la text-wrapping.\n\t * @param rowStart - Index of the row to start setting cells.\n\t * @param colStart - Index of the column to start setting cells.\n\t * @param colCount - Number of columns to set before wrapping to subsequent rows (if `values` has more items)\n\t * @param values - Values to insert.\n\t * @remarks\n\t * This is not currently more efficient than calling `setCell` for each cell.\n\t */\n\tsetCells(\n\t\trowStart: number,\n\t\tcolStart: number,\n\t\tcolCount: number,\n\t\tvalues: readonly MatrixItem<T>[],\n\t): void;\n\n\t/**\n\t * Attach an {@link IUndoConsumer} to the matrix.\n\t * @param consumer - Undo consumer which will receive revertibles from the matrix.\n\t */\n\topenUndo(consumer: IUndoConsumer): void;\n\n\t/**\n\t * Whether the current conflict resolution policy is first-write win (FWW).\n\t * See {@link ISharedMatrix.switchSetCellPolicy} for more details.\n\t */\n\tisSetCellConflictResolutionPolicyFWW(): boolean;\n\n\t/**\n\t * Change the conflict resolution policy for setCell operations to first-write win (FWW).\n\t *\n\t * This API only switches from LWW to FWW and not from FWW to LWW.\n\t *\n\t * @privateRemarks\n\t * The next SetOp which is sent will communicate this policy to other clients.\n\t */\n\tswitchSetCellPolicy(): void;\n}\n\ntype FirstWriterWinsPolicy =\n\t| { state: \"off\" }\n\t| { state: \"local\" }\n\t| {\n\t\t\tstate: \"on\";\n\t\t\tswitchOpSeqNumber: number;\n\t\t\tcellLastWriteTracker: SparseArray2D<CellLastWriteTrackerItem>;\n\t };\n\n/**\n * A SharedMatrix holds a rectangular 2D array of values. Supported operations\n * include setting values and inserting/removing rows and columns.\n *\n * Matrix values may be any Fluid serializable type, which is the set of JSON\n * serializable types extended to include IFluidHandles.\n *\n * Fluid's SharedMatrix implementation works equally well for dense and sparse\n * matrix data and physically stores data in Z-order to leverage CPU caches and\n * prefetching when reading in either row or column major order. (See README.md\n * for more details.)\n * @legacy\n * @alpha\n */\n// Changing this to `unknown` would be a breaking change.\n// TODO: if possible, transition SharedMatrix to not use `any`.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class SharedMatrix<T = any>\n\textends SharedObject<ISharedMatrixEvents<T> & ISharedObjectEvents>\n\timplements ISharedMatrix<T>\n{\n\tprivate readonly consumers = new Set<IMatrixConsumer<MatrixItem<T>>>();\n\n\t/**\n\t * Note: this field only provides a lower-bound on the reference sequence numbers for in-flight ops.\n\t * The exact reason isn't understood, but some e2e tests suggest that the runtime may sometimes process\n\t * incoming leave/join ops before putting an op that this DDS submits over the wire.\n\t *\n\t * E.g. SharedMatrix submits an op while deltaManager has lastSequenceNumber = 10, but before the runtime\n\t * puts this op over the wire, it processes a client join/leave op with sequence number 11, so the referenceSequenceNumber\n\t * on the SharedMatrix op is 11.\n\t */\n\tprivate readonly inFlightRefSeqs = new Deque<number>();\n\treadonly getMinInFlightRefSeq = (): number | undefined => this.inFlightRefSeqs.get(0);\n\n\tprivate readonly rows: PermutationVector; // Map logical row to storage handle (if any)\n\tprivate readonly cols: PermutationVector; // Map logical col to storage handle (if any)\n\n\tprivate cells = new SparseArray2D<MatrixItem<T>>(); // Stores cell values.\n\tprivate readonly pending = new SparseArray2D<number>(); // Tracks pending writes.\n\n\tprivate fwwPolicy: FirstWriterWinsPolicy = {\n\t\tstate: \"off\",\n\t};\n\n\t// Used to track if there is any reentrancy in setCell code.\n\tprivate reentrantCount: number = 0;\n\n\t/**\n\t * Constructor for the Shared Matrix\n\t * @param runtime - DataStore runtime.\n\t * @param id - id of the dds\n\t * @param attributes - channel attributes\n\t * @param _isSetCellConflictResolutionPolicyFWW - Conflict resolution for Matrix set op is First Writer Win in case of\n\t * race condition. Client can still overwrite values in case of no race.\n\t */\n\tconstructor(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tpublic id: string,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(id, runtime, attributes, \"fluid_matrix_\");\n\n\t\tthis.rows = new PermutationVector(\n\t\t\tSnapshotPath.rows,\n\t\t\tthis.logger,\n\t\t\truntime,\n\t\t\tthis.onRowDelta,\n\t\t\tthis.onRowHandlesRecycled,\n\t\t\tthis.getMinInFlightRefSeq,\n\t\t);\n\n\t\tthis.cols = new PermutationVector(\n\t\t\tSnapshotPath.cols,\n\t\t\tthis.logger,\n\t\t\truntime,\n\t\t\tthis.onColDelta,\n\t\t\tthis.onColHandlesRecycled,\n\t\t\tthis.getMinInFlightRefSeq,\n\t\t);\n\t}\n\n\tprivate undo?: MatrixUndoProvider<T>;\n\n\t/**\n\t * Subscribes the given IUndoConsumer to the matrix.\n\t */\n\tpublic openUndo(consumer: IUndoConsumer): void {\n\t\tassert(\n\t\t\tthis.undo === undefined,\n\t\t\t0x019 /* \"SharedMatrix.openUndo() supports at most a single IUndoConsumer.\" */,\n\t\t);\n\n\t\tthis.undo = new MatrixUndoProvider(consumer, this, this.rows, this.cols);\n\t}\n\n\t// TODO: closeUndo()?\n\n\tprivate get rowHandles(): HandleCache {\n\t\treturn this.rows.handleCache;\n\t}\n\tprivate get colHandles(): HandleCache {\n\t\treturn this.cols.handleCache;\n\t}\n\n\t// #region IMatrixProducer\n\n\topenMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): IMatrixReader<MatrixItem<T>> {\n\t\tthis.consumers.add(consumer);\n\t\treturn this;\n\t}\n\n\tcloseMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): void {\n\t\tthis.consumers.delete(consumer);\n\t}\n\n\t// #endregion IMatrixProducer\n\n\t// #region IMatrixReader\n\n\tpublic get rowCount(): number {\n\t\treturn this.rows.getLength();\n\t}\n\tpublic get colCount(): number {\n\t\treturn this.cols.getLength();\n\t}\n\n\tpublic isSetCellConflictResolutionPolicyFWW(): boolean {\n\t\treturn this.fwwPolicy.state !== \"off\";\n\t}\n\n\tpublic getCell(row: number, col: number): MatrixItem<T> {\n\t\t// Perf: When possible, bounds checking is performed inside the implementation for\n\t\t// 'getHandle()' so that it can be elided in the case of a cache hit. This\n\t\t// yields an ~40% improvement in the case of a cache hit (node v12 x64)\n\n\t\t// Map the logical (row, col) to associated storage handles.\n\t\tconst rowHandle = this.rowHandles.getHandle(row);\n\t\tif (isHandleValid(rowHandle)) {\n\t\t\tconst colHandle = this.colHandles.getHandle(col);\n\t\t\tif (isHandleValid(colHandle)) {\n\t\t\t\treturn this.cells.getCell(rowHandle, colHandle);\n\t\t\t}\n\t\t} else {\n\t\t\t// If we early exit because the given rowHandle is unallocated, we still need to\n\t\t\t// bounds-check the 'col' parameter.\n\t\t\tensureRange(col, this.cols.getLength());\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tpublic get matrixProducer(): IMatrixProducer<MatrixItem<T>> {\n\t\treturn this;\n\t}\n\n\t// #endregion IMatrixReader\n\n\tpublic setCell(row: number, col: number, value: MatrixItem<T>): void {\n\t\tif (row < 0 || row >= this.rowCount || col < 0 || col >= this.colCount) {\n\t\t\tthrow new UsageError(\"Trying to set out-of-bounds cell.\");\n\t\t}\n\n\t\tthis.setCellCore(row, col, value);\n\t}\n\n\tpublic setCells(\n\t\trowStart: number,\n\t\tcolStart: number,\n\t\tcolCount: number,\n\t\tvalues: readonly MatrixItem<T>[],\n\t): void {\n\t\tconst rowCount = Math.ceil(values.length / colCount);\n\n\t\tassert(\n\t\t\t0 <= rowStart &&\n\t\t\t\trowStart < this.rowCount &&\n\t\t\t\t0 <= colStart &&\n\t\t\t\tcolStart < this.colCount &&\n\t\t\t\t1 <= colCount &&\n\t\t\t\tcolCount <= this.colCount - colStart &&\n\t\t\t\trowCount <= this.rowCount - rowStart,\n\t\t\t0x01b /* \"Trying to set multiple out-of-bounds cells!\" */,\n\t\t);\n\n\t\tconst endCol = colStart + colCount;\n\t\tlet r = rowStart;\n\t\tlet c = colStart;\n\n\t\tfor (const value of values) {\n\t\t\tthis.setCellCore(r, c, value);\n\n\t\t\tif (++c === endCol) {\n\t\t\t\tc = colStart;\n\t\t\t\tr++;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate setCellCore(\n\t\trow: number,\n\t\tcol: number,\n\t\tvalue: MatrixItem<T>,\n\t\trowHandle = this.rows.getAllocatedHandle(row),\n\t\tcolHandle = this.cols.getAllocatedHandle(col),\n\t): void {\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(\n\t\tvector: PermutationVector,\n\t\tpos: number,\n\t\tlocalSeq: number,\n\t): LocalReferencePosition {\n\t\tconst segoff = vector.getContainingSegment(pos, undefined, localSeq);\n\t\tassert(\n\t\t\tsegoff.segment !== undefined && segoff.offset !== undefined,\n\t\t\t0x8b3 /* expected valid position */,\n\t\t);\n\t\treturn vector.createLocalReferencePosition(\n\t\t\tsegoff.segment,\n\t\t\tsegoff.offset,\n\t\t\tReferenceType.StayOnRemove,\n\t\t\tundefined,\n\t\t);\n\t}\n\n\tprivate sendSetCellOp(\n\t\trow: number,\n\t\tcol: number,\n\t\tvalue: MatrixItem<T>,\n\t\trowHandle: Handle,\n\t\tcolHandle: Handle,\n\t\tlocalSeq = this.nextLocalSeq(),\n\t): void {\n\t\tassert(\n\t\t\tthis.isAttached(),\n\t\t\t0x1e2 /* \"Caller must ensure 'isAttached()' before calling 'sendSetCellOp'.\" */,\n\t\t);\n\n\t\tconst op: ISetOp<T> = {\n\t\t\ttype: MatrixOp.set,\n\t\t\trow,\n\t\t\tcol,\n\t\t\tvalue,\n\t\t\tfwwMode: this.fwwPolicy.state !== \"off\",\n\t\t};\n\n\t\tconst rowsRef = this.createOpMetadataLocalRef(this.rows, row, localSeq);\n\t\tconst colsRef = this.createOpMetadataLocalRef(this.cols, col, localSeq);\n\t\tconst metadata: ISetOpMetadata = {\n\t\t\trowHandle,\n\t\t\tcolHandle,\n\t\t\tlocalSeq,\n\t\t\trowsRef,\n\t\t\tcolsRef,\n\t\t\treferenceSeqNumber: this.deltaManager.lastSequenceNumber,\n\t\t};\n\n\t\tthis.submitLocalMessage(op, metadata);\n\t\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): void {\n\t\tif (this.reentrantCount !== 0) {\n\t\t\t// Validate that applications don't submit edits in response to matrix change notifications. This is unsupported.\n\t\t\tthrow new UsageError(\"Reentrancy detected in SharedMatrix.\");\n\t\t}\n\t\tthis.reentrantCount++;\n\t\ttry {\n\t\t\tcallback();\n\t\t} finally {\n\t\t\tthis.reentrantCount--;\n\t\t}\n\t\tassert(\n\t\t\tthis.reentrantCount === 0,\n\t\t\t0x85e /* indicates a problem with the reentrancy tracking code. */,\n\t\t);\n\t}\n\n\tprivate submitVectorMessage(\n\t\tcurrentVector: PermutationVector,\n\t\toppositeVector: PermutationVector,\n\t\ttarget: SnapshotPath.rows | SnapshotPath.cols,\n\t\tmessage: IMergeTreeOp,\n\t): void {\n\t\t// Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n\t\t// and the SharedMatrix's cell data. Instead, we externally advance each MergeTree's 'localSeq' counter\n\t\t// for each submitted op it not aware of to keep them synchronized.\n\t\tconst localSeq = currentVector.getCollabWindow().localSeq;\n\t\tconst oppositeWindow = oppositeVector.getCollabWindow();\n\n\t\t// Note that the comparison is '>=' because, in the case the MergeTree is regenerating ops for reconnection,\n\t\t// the MergeTree submits the op with the original 'localSeq'.\n\t\tassert(\n\t\t\tlocalSeq >= oppositeWindow.localSeq,\n\t\t\t0x01c /* \"The 'localSeq' of the vector submitting an op must >= the 'localSeq' of the other vector.\" */,\n\t\t);\n\n\t\toppositeWindow.localSeq = localSeq;\n\n\t\t// If the SharedMatrix is local, it's state will be submitted via a Snapshot when initially connected.\n\t\t// Do not queue a message or track the pending op, as there will never be an ACK, etc.\n\t\tif (this.isAttached()) {\n\t\t\t// Record whether this `op` targets rows or cols. (See dispatch in `processCore()`)\n\t\t\tconst targetedMessage: VectorOp = { ...message, target };\n\n\t\t\tthis.submitLocalMessage(\n\t\t\t\ttargetedMessage,\n\t\t\t\tcurrentVector.peekPendingSegmentGroups(\n\t\t\t\t\tmessage.type === MergeTreeDeltaType.GROUP ? message.ops.length : 1,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate submitColMessage(message: IMergeTreeOp): void {\n\t\tthis.submitVectorMessage(this.cols, this.rows, SnapshotPath.cols, message);\n\t}\n\n\tpublic insertCols(colStart: number, count: number): void {\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (colStart > this.colCount) {\n\t\t\tthrow new UsageError(\"insertCols: out of bounds\");\n\t\t}\n\t\tthis.protectAgainstReentrancy(() => {\n\t\t\tconst message = this.cols.insert(colStart, count);\n\t\t\tassert(message !== undefined, 0x8b4 /* must be defined */);\n\t\t\tthis.submitColMessage(message);\n\t\t});\n\t}\n\n\tpublic removeCols(colStart: number, count: number): void {\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (colStart > this.colCount) {\n\t\t\tthrow new UsageError(\"removeCols: out of bounds\");\n\t\t}\n\t\tthis.protectAgainstReentrancy(() =>\n\t\t\tthis.submitColMessage(this.cols.remove(colStart, count)),\n\t\t);\n\t}\n\n\tprivate submitRowMessage(message: IMergeTreeOp): void {\n\t\tthis.submitVectorMessage(this.rows, this.cols, SnapshotPath.rows, message);\n\t}\n\n\tpublic insertRows(rowStart: number, count: number): void {\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (rowStart > this.rowCount) {\n\t\t\tthrow new UsageError(\"insertRows: out of bounds\");\n\t\t}\n\t\tthis.protectAgainstReentrancy(() => {\n\t\t\tconst message = this.rows.insert(rowStart, count);\n\t\t\tassert(message !== undefined, 0x8b5 /* must be defined */);\n\t\t\tthis.submitRowMessage(message);\n\t\t});\n\t}\n\n\tpublic removeRows(rowStart: number, count: number): void {\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (rowStart > this.rowCount) {\n\t\t\tthrow new UsageError(\"removeRows: out of bounds\");\n\t\t}\n\t\tthis.protectAgainstReentrancy(() =>\n\t\t\tthis.submitRowMessage(this.rows.remove(rowStart, count)),\n\t\t);\n\t}\n\n\tpublic _undoRemoveRows(rowStart: number, spec: IJSONSegment): void {\n\t\tconst { op, inserted } = reinsertSegmentIntoVector(this.rows, rowStart, spec);\n\t\tassert(op !== undefined, 0x8b6 /* must be defined */);\n\t\tthis.submitRowMessage(op);\n\n\t\t// Generate setCell ops for each populated cell in the reinserted rows.\n\t\tlet rowHandle = inserted.start;\n\t\tconst rowCount = inserted.cachedLength;\n\t\tfor (let row = rowStart; row < rowStart + rowCount; row++, rowHandle++) {\n\t\t\tfor (let col = 0; col < this.colCount; col++) {\n\t\t\t\tconst colHandle = this.colHandles.getHandle(col);\n\t\t\t\tconst value = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\tif (this.isAttached() && value !== undefined && value !== null) {\n\t\t\t\t\tthis.sendSetCellOp(row, col, value, rowHandle, colHandle);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Avoid reentrancy by raising change notifications after the op is queued.\n\t\tfor (const consumer of this.consumers.values()) {\n\t\t\tconsumer.cellsChanged(rowStart, /* colStart: */ 0, rowCount, this.colCount, this);\n\t\t}\n\t}\n\n\t/***/ public _undoRemoveCols(colStart: number, spec: IJSONSegment): void {\n\t\tconst { op, inserted } = reinsertSegmentIntoVector(this.cols, colStart, spec);\n\t\tassert(op !== undefined, 0x8b7 /* must be defined */);\n\t\tthis.submitColMessage(op);\n\n\t\t// Generate setCell ops for each populated cell in the reinserted cols.\n\t\tlet colHandle = inserted.start;\n\t\tconst colCount = inserted.cachedLength;\n\t\tfor (let col = colStart; col < colStart + colCount; col++, colHandle++) {\n\t\t\tfor (let row = 0; row < this.rowCount; row++) {\n\t\t\t\tconst rowHandle = this.rowHandles.getHandle(row);\n\t\t\t\tconst value = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\tif (this.isAttached() && value !== undefined && value !== null) {\n\t\t\t\t\tthis.sendSetCellOp(row, col, value, rowHandle, colHandle);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Avoid reentrancy by raising change notifications after the op is queued.\n\t\tfor (const consumer of this.consumers.values()) {\n\t\t\tconsumer.cellsChanged(/* rowStart: */ 0, colStart, this.rowCount, colCount, this);\n\t\t}\n\t}\n\n\tprotected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tbuilder.addWithStats(\n\t\t\tSnapshotPath.rows,\n\t\t\tthis.rows.summarize(this.runtime, this.handle, serializer),\n\t\t);\n\t\tbuilder.addWithStats(\n\t\t\tSnapshotPath.cols,\n\t\t\tthis.cols.summarize(this.runtime, this.handle, serializer),\n\t\t);\n\t\tconst artifactsToSummarize: (\n\t\t\t| undefined\n\t\t\t| number\n\t\t\t| ReturnType<SparseArray2D<MatrixItem<T> | number>[\"snapshot\"]>\n\t\t)[] = [this.cells.snapshot(), this.pending.snapshot()];\n\n\t\t// Only need to store it in the snapshot if we have switched the policy already.\n\t\tif (this.fwwPolicy.state === \"on\") {\n\t\t\tartifactsToSummarize.push(\n\t\t\t\tthis.fwwPolicy.switchOpSeqNumber,\n\t\t\t\tthis.fwwPolicy.cellLastWriteTracker.snapshot(),\n\t\t\t);\n\t\t} else {\n\t\t\t// back-compat: used -1 for disabled\n\t\t\tartifactsToSummarize.push(\n\t\t\t\t-1,\n\t\t\t\t/*\n\t\t\t\t * we should set undefined in place of cellLastWriteTracker to ensure the number of array entries is consistent.\n\t\t\t\t * Doing that currently breaks snapshot tests. Its is probably fine, but if new elements are ever added, we need\n\t\t\t\t * ensure undefined is also set.\n\t\t\t\t */\n\t\t\t\t// undefined\n\t\t\t);\n\t\t}\n\t\tbuilder.addBlob(\n\t\t\tSnapshotPath.cells,\n\t\t\tserializer.stringify(artifactsToSummarize, this.handle),\n\t\t);\n\t\treturn builder.getSummaryTree();\n\t}\n\n\t/**\n\t * Runs serializer on the GC data for this SharedMatrix.\n\t * All the IFluidHandle's stored in the cells represent routes to other objects.\n\t */\n\tprotected processGCDataCore(serializer: IFluidSerializer): void {\n\t\tfor (let row = 0; row < this.rowCount; row++) {\n\t\t\tfor (let col = 0; col < this.colCount; col++) {\n\t\t\t\tserializer.stringify(this.getCell(row, col), this.handle);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Advances the 'localSeq' counter for the cell data operation currently being queued.\n\t *\n\t * Do not use with 'submitColMessage()/submitRowMessage()' as these helpers + the MergeTree will\n\t * automatically advance 'localSeq'.\n\t */\n\tprivate nextLocalSeq(): number {\n\t\t// Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n\t\t// and the SharedMatrix's cell data. Instead, we externally bump each MergeTree's 'localSeq' counter\n\t\t// for SharedMatrix ops it's not aware of to keep them synchronized. (For cell data operations, we\n\t\t// need to bump both counters.)\n\n\t\tthis.cols.getCollabWindow().localSeq++;\n\t\treturn ++this.rows.getCollabWindow().localSeq;\n\t}\n\n\tprotected submitLocalMessage(message: unknown, localOpMetadata?: unknown): void {\n\t\t// TODO: Recommend moving this assertion into SharedObject\n\t\t// (See https://github.com/microsoft/FluidFramework/issues/2559)\n\t\tassert(\n\t\t\tthis.isAttached() === true,\n\t\t\t0x01d /* \"Trying to submit message to runtime while detached!\" */,\n\t\t);\n\n\t\tthis.inFlightRefSeqs.push(this.deltaManager.lastSequenceNumber);\n\t\tsuper.submitLocalMessage(message, localOpMetadata);\n\n\t\t// Ensure that row/col 'localSeq' are synchronized (see 'nextLocalSeq()').\n\t\tassert(\n\t\t\tthis.rows.getCollabWindow().localSeq === this.cols.getCollabWindow().localSeq,\n\t\t\t0x01e /* \"Row and col collab window 'localSeq' desynchronized!\" */,\n\t\t);\n\t}\n\n\tprotected didAttach(): void {\n\t\t// We've attached we need to start generating and sending ops.\n\t\t// so start collaboration and provide a default client id incase we are not connected\n\t\tif (this.isAttached()) {\n\t\t\tthis.rows.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n\t\t\tthis.cols.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n\t\t}\n\t}\n\n\tprotected onConnect(): void {\n\t\tassert(\n\t\t\tthis.rows.getCollabWindow().collaborating === this.cols.getCollabWindow().collaborating,\n\t\t\t0x01f /* \"Row and col collab window 'collaborating' status desynchronized!\" */,\n\t\t);\n\n\t\t// Update merge tree collaboration information with new client ID and then resend pending ops\n\t\tthis.rows.startOrUpdateCollaboration(this.runtime.clientId as string);\n\t\tthis.cols.startOrUpdateCollaboration(this.runtime.clientId as string);\n\t}\n\n\tprivate rebasePosition(\n\t\tclient: Client,\n\t\tref: LocalReferencePosition,\n\t\tlocalSeq: number,\n\t): number | undefined {\n\t\tconst segment: ISegmentInternal | undefined = ref.getSegment();\n\t\tconst offset = ref.getOffset();\n\t\t// If the segment that contains the position is removed, then this setCell op should do nothing.\n\t\tif (segment === undefined || offset === undefined || segmentIsRemoved(segment)) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn client.findReconnectionPosition(segment, localSeq) + offset;\n\t}\n\n\tprotected reSubmitCore(incoming: unknown, localOpMetadata: unknown): void {\n\t\tconst originalRefSeq = this.inFlightRefSeqs.shift();\n\t\tassert(\n\t\t\toriginalRefSeq !== undefined,\n\t\t\t0x8b9 /* Expected a recorded refSeq when resubmitting an op */,\n\t\t);\n\t\tconst content = incoming as MatrixSetOrVectorOp<T>;\n\n\t\tif (content.type === MatrixOp.set && content.target === undefined) {\n\t\t\tconst setOp = content;\n\t\t\tconst { rowHandle, colHandle, localSeq, rowsRef, colsRef, referenceSeqNumber } =\n\t\t\t\tlocalOpMetadata as ISetOpMetadata;\n\n\t\t\t// If after rebasing the op, we get a valid row/col number, that means the row/col\n\t\t\t// handles have not been recycled and we can safely use them.\n\t\t\tconst row = this.rebasePosition(this.rows, rowsRef, localSeq);\n\t\t\tconst col = this.rebasePosition(this.cols, colsRef, localSeq);\n\t\t\tthis.rows.removeLocalReferencePosition(rowsRef);\n\t\t\tthis.cols.removeLocalReferencePosition(colsRef);\n\t\t\tif (row !== undefined && col !== undefined && row >= 0 && col >= 0) {\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.fwwPolicy.state !== \"on\" ||\n\t\t\t\t\treferenceSeqNumber >=\n\t\t\t\t\t\t(this.fwwPolicy.cellLastWriteTracker.getCell(rowHandle, colHandle)?.seqNum ?? 0)\n\t\t\t\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(this.cols.regeneratePendingOp(content, localOpMetadata));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase SnapshotPath.rows: {\n\t\t\t\t\tthis.submitRowMessage(this.rows.regeneratePendingOp(content, localOpMetadata));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tunreachableCase(content);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected onDisconnect(): void {}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\ttry {\n\t\t\tawait this.rows.load(\n\t\t\t\tthis.runtime,\n\t\t\t\tnew ObjectStoragePartition(storage, SnapshotPath.rows),\n\t\t\t\tthis.serializer,\n\t\t\t);\n\t\t\tawait this.cols.load(\n\t\t\t\tthis.runtime,\n\t\t\t\tnew ObjectStoragePartition(storage, SnapshotPath.cols),\n\t\t\t\tthis.serializer,\n\t\t\t);\n\t\t\tconst [\n\t\t\t\tcellData,\n\t\t\t\t_pendingCliSeqData,\n\t\t\t\tsetCellLwwToFwwPolicySwitchOpSeqNumber,\n\t\t\t\tcellLastWriteTracker,\n\t\t\t\t// Cast is needed since the (de)serializer returns content of type `any`.\n\t\t\t] = (await deserializeBlob(storage, SnapshotPath.cells, this.serializer)) as [\n\t\t\t\tRecurArray<MatrixItem<T>>,\n\t\t\t\tunknown,\n\t\t\t\tnumber,\n\t\t\t\tRecurArray<CellLastWriteTrackerItem>,\n\t\t\t];\n\n\t\t\tthis.cells = SparseArray2D.load(cellData);\n\t\t\t// back-compat: used -1 for disabled, also may not exist\n\t\t\tconst switchOpSeqNumber =\n\t\t\t\tsetCellLwwToFwwPolicySwitchOpSeqNumber === -1\n\t\t\t\t\t? undefined\n\t\t\t\t\t: (setCellLwwToFwwPolicySwitchOpSeqNumber ?? undefined);\n\t\t\tthis.fwwPolicy =\n\t\t\t\tswitchOpSeqNumber === undefined\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tstate: \"off\",\n\t\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tstate: \"on\",\n\t\t\t\t\t\t\tswitchOpSeqNumber,\n\t\t\t\t\t\t\tcellLastWriteTracker: SparseArray2D.load(cellLastWriteTracker),\n\t\t\t\t\t\t};\n\t\t} catch (error) {\n\t\t\tthis.logger.sendErrorEvent({ eventName: \"MatrixLoadFailed\" }, error);\n\t\t}\n\t}\n\n\t/**\n\t * Tells whether the setCell op should be applied or not based on First Write Win policy. It assumes\n\t * we are in FWW mode.\n\t */\n\tprivate shouldSetCellBasedOnFWW(\n\t\trowHandle: Handle,\n\t\tcolHandle: Handle,\n\t\tmessage: ISequencedDocumentMessage,\n\t): boolean {\n\t\tassert(\n\t\t\tthis.fwwPolicy.state === \"on\",\n\t\t\t0x85f /* should be in Fww mode when calling this method */,\n\t\t);\n\t\tassert(message.clientId !== null, 0x860 /* clientId should not be null */);\n\t\tconst lastCellModificationDetails = this.fwwPolicy.cellLastWriteTracker.getCell(\n\t\t\trowHandle,\n\t\t\tcolHandle,\n\t\t);\n\t\t// If someone tried to Overwrite the cell value or first write on this cell or\n\t\t// same client tried to modify the cell.\n\t\treturn (\n\t\t\tlastCellModificationDetails === undefined ||\n\t\t\tlastCellModificationDetails.clientId === message.clientId ||\n\t\t\tmessage.referenceSequenceNumber >= lastCellModificationDetails.seqNum\n\t\t);\n\t}\n\n\tprotected processCore(\n\t\tmsg: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t): void {\n\t\tif (local) {\n\t\t\tconst recordedRefSeq = this.inFlightRefSeqs.shift();\n\t\t\tassert(recordedRefSeq !== undefined, 0x8ba /* No pending recorded refSeq found */);\n\t\t\t// TODO: AB#7076: Some equivalent assert should be enabled. This fails some e2e stashed op tests because\n\t\t\t// the deltaManager may have seen more messages than the runtime has processed while amidst the stashed op\n\t\t\t// flow, so e.g. when `applyStashedOp` is called and the DDS is put in a state where it expects an ack for\n\t\t\t// one of its messages, the delta manager has actually already seen subsequent messages from collaborators\n\t\t\t// which the in-flight message is concurrent to.\n\t\t\t// See \"handles stashed ops created on top of sequenced local ops\" for one such test case.\n\t\t\t// assert(recordedRefSeq <= message.referenceSequenceNumber, \"RefSeq mismatch\");\n\t\t}\n\n\t\tconst contents = msg.contents as MatrixSetOrVectorOp<T>;\n\t\tconst target = contents.target;\n\n\t\tswitch (target) {\n\t\t\tcase SnapshotPath.cols: {\n\t\t\t\tthis.cols.applyMsg(msg, local);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SnapshotPath.rows: {\n\t\t\t\tthis.rows.applyMsg(msg, local);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase undefined: {\n\t\t\t\tassert(\n\t\t\t\t\tcontents.type === MatrixOp.set,\n\t\t\t\t\t0x021 /* \"SharedMatrix message contents have unexpected type!\" */,\n\t\t\t\t);\n\n\t\t\t\tconst { row, col, value, fwwMode } = contents;\n\t\t\t\t// If this is the first op notifying us of the policy change, then set the policy change seq number.\n\t\t\t\tif (fwwMode === true && this.fwwPolicy.state !== \"on\") {\n\t\t\t\t\tthis.fwwPolicy = {\n\t\t\t\t\t\tstate: \"on\",\n\t\t\t\t\t\tswitchOpSeqNumber: msg.sequenceNumber,\n\t\t\t\t\t\tcellLastWriteTracker: new SparseArray2D(),\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tassert(msg.clientId !== null, 0x861 /* clientId should not be null!! */);\n\t\t\t\tif (local) {\n\t\t\t\t\t// We are receiving the ACK for a local pending set operation.\n\t\t\t\t\tconst { rowHandle, colHandle, localSeq, rowsRef, colsRef } =\n\t\t\t\t\t\tlocalOpMetadata as ISetOpMetadata;\n\t\t\t\t\tconst isLatestPendingOp = this.isLatestPendingWrite(rowHandle, colHandle, localSeq);\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\tthis.fwwPolicy.state === \"on\" &&\n\t\t\t\t\t\tthis.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.fwwPolicy.cellLastWriteTracker.setCell(rowHandle, colHandle, {\n\t\t\t\t\t\t\tseqNum: msg.sequenceNumber,\n\t\t\t\t\t\t\tclientId: msg.clientId,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\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.fwwPolicy.state === \"on\") {\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 (this.shouldSetCellBasedOnFWW(rowHandle, colHandle, msg)) {\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.fwwPolicy.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\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\t}\n\t\t}\n\t}\n\n\t// Invoked by PermutationVector to notify IMatrixConsumers of row insertion/deletions.\n\tprivate readonly onRowDelta = (\n\t\tposition: number,\n\t\tremovedCount: number,\n\t\tinsertedCount: number,\n\t): void => {\n\t\tfor (const consumer of this.consumers) {\n\t\t\tconsumer.rowsChanged(position, removedCount, insertedCount, this);\n\t\t}\n\t};\n\n\t// Invoked by PermutationVector to notify IMatrixConsumers of col insertion/deletions.\n\tprivate readonly onColDelta = (\n\t\tposition: number,\n\t\tremovedCount: number,\n\t\tinsertedCount: number,\n\t): void => {\n\t\tfor (const consumer of this.consumers) {\n\t\t\tconsumer.colsChanged(position, removedCount, insertedCount, this);\n\t\t}\n\t};\n\n\tprivate readonly onRowHandlesRecycled = (rowHandles: Handle[]): void => {\n\t\tfor (const rowHandle of rowHandles) {\n\t\t\tthis.cells.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t\tthis.pending.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t\tif (this.fwwPolicy.state === \"on\") {\n\t\t\t\tthis.fwwPolicy.cellLastWriteTracker?.clearRows(\n\t\t\t\t\t/* rowStart: */ rowHandle,\n\t\t\t\t\t/* rowCount: */ 1,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t};\n\n\tprivate readonly onColHandlesRecycled = (colHandles: Handle[]): void => {\n\t\tfor (const colHandle of colHandles) {\n\t\t\tthis.cells.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t\tthis.pending.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t\tif (this.fwwPolicy.state === \"on\") {\n\t\t\t\tthis.fwwPolicy.cellLastWriteTracker?.clearCols(\n\t\t\t\t\t/* colStart: */ colHandle,\n\t\t\t\t\t/* colCount: */ 1,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t};\n\n\tpublic switchSetCellPolicy(): void {\n\t\tif (this.fwwPolicy.state === \"off\") {\n\t\t\tthis.fwwPolicy = this.isAttached()\n\t\t\t\t? { state: \"local\" }\n\t\t\t\t: {\n\t\t\t\t\t\tstate: \"on\",\n\t\t\t\t\t\tswitchOpSeqNumber: 0,\n\t\t\t\t\t\tcellLastWriteTracker: new SparseArray2D(),\n\t\t\t\t\t};\n\t\t}\n\t}\n\n\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(\n\t\trowHandle: Handle,\n\t\tcolHandle: Handle,\n\t\tlocalSeq: number,\n\t): boolean {\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(): string {\n\t\tlet s = `client:${\n\t\t\tthis.runtime.clientId\n\t\t}\\nrows: ${this.rows.toString()}\\ncols: ${this.cols.toString()}\\n\\n`;\n\n\t\tfor (let r = 0; r < this.rowCount; r++) {\n\t\t\ts += ` [`;\n\t\t\tfor (let c = 0; c < this.colCount; c++) {\n\t\t\t\tif (c > 0) {\n\t\t\t\t\ts += \", \";\n\t\t\t\t}\n\n\t\t\t\ts += `${this.serializer.stringify(this.getCell(r, c), this.handle)}`;\n\t\t\t}\n\t\t\ts += \"]\\n\";\n\t\t}\n\n\t\treturn `${s}\\n`;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}\n\t */\n\tprotected applyStashedOp(_content: unknown): void {\n\t\tconst content = _content as MatrixSetOrVectorOp<T>;\n\t\tif (content.type === MatrixOp.set && content.target === undefined) {\n\t\t\tif (content.fwwMode === true) {\n\t\t\t\tthis.switchSetCellPolicy();\n\t\t\t}\n\t\t\tthis.setCell(content.row, content.col, content.value);\n\t\t} else {\n\t\t\tconst vector = content.target === SnapshotPath.cols ? this.cols : this.rows;\n\t\t\tvector.applyStashedOp(content);\n\t\t\tif (content.target === SnapshotPath.cols) {\n\t\t\t\tthis.submitColMessage(content);\n\t\t\t} else {\n\t\t\t\tthis.submitRowMessage(content);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
@@ -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.41.0-338186";
8
+ export declare const pkgVersion = "2.41.0";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,2BAA2B,CAAC;AAChD,eAAO,MAAM,UAAU,kBAAkB,CAAC"}
1
+ {"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,2BAA2B,CAAC;AAChD,eAAO,MAAM,UAAU,WAAW,CAAC"}