@fluidframework/matrix 2.0.0-internal.7.3.0 → 2.0.0-internal.7.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/README.md +39 -0
- package/api-extractor-lint.json +13 -0
- package/api-extractor.json +8 -3
- package/api-report/matrix.api.md +19 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/matrix-alpha.d.ts +71 -11
- package/dist/matrix-beta.d.ts +41 -134
- package/dist/matrix-public.d.ts +41 -134
- package/dist/matrix-untrimmed.d.ts +71 -11
- package/dist/matrix.cjs +175 -46
- package/dist/matrix.cjs.map +1 -1
- package/dist/matrix.d.ts +67 -9
- package/dist/matrix.d.ts.map +1 -1
- package/dist/ops.cjs +1 -0
- package/dist/ops.cjs.map +1 -1
- package/dist/ops.d.ts +5 -1
- package/dist/ops.d.ts.map +1 -1
- package/dist/packageVersion.cjs +1 -1
- package/dist/packageVersion.cjs.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/runtime.cjs +1 -1
- package/dist/runtime.cjs.map +1 -1
- package/dist/runtime.d.ts +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.ts +2 -2
- package/lib/handlecache.d.ts +2 -2
- package/lib/handlecache.d.ts.map +1 -1
- package/lib/index.d.ts +3 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.mjs.map +1 -1
- package/lib/matrix-alpha.d.ts +71 -11
- package/lib/matrix-beta.d.ts +41 -134
- package/lib/matrix-public.d.ts +41 -134
- package/lib/matrix-untrimmed.d.ts +71 -11
- package/lib/matrix.d.ts +69 -11
- package/lib/matrix.d.ts.map +1 -1
- package/lib/matrix.mjs +175 -46
- package/lib/matrix.mjs.map +1 -1
- package/lib/ops.d.ts +5 -1
- package/lib/ops.d.ts.map +1 -1
- package/lib/ops.mjs +1 -0
- package/lib/ops.mjs.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.mjs +1 -1
- package/lib/packageVersion.mjs.map +1 -1
- package/lib/permutationvector.d.ts +3 -3
- package/lib/permutationvector.d.ts.map +1 -1
- package/lib/runtime.d.ts +1 -1
- package/lib/runtime.d.ts.map +1 -1
- package/lib/runtime.mjs +1 -1
- package/lib/runtime.mjs.map +1 -1
- package/lib/serialization.d.ts.map +1 -1
- package/lib/sparsearray2d.d.ts.map +1 -1
- package/lib/types.d.ts +2 -2
- package/lib/types.mjs.map +1 -1
- package/lib/undoprovider.d.ts +4 -4
- package/lib/undoprovider.d.ts.map +1 -1
- package/matrix.test-files.tar +0 -0
- package/package.json +26 -31
- package/src/index.ts +1 -1
- package/src/matrix.ts +282 -60
- package/src/ops.ts +5 -0
- package/src/packageVersion.ts +1 -1
- package/src/runtime.ts +1 -1
- package/src/types.ts +2 -2
package/dist/matrix.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matrix.cjs","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\n/* eslint-disable import/no-deprecated */\n\nimport { assert } from \"@fluidframework/core-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tSerializable,\n\tIChannelAttributes,\n} from \"@fluidframework/datastore-definitions\";\nimport {\n\tIFluidSerializer,\n\tmakeHandlesSerializable,\n\tparseHandles,\n\tSharedObject,\n\tSummarySerializer,\n} from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ObjectStoragePartition, SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { IMatrixProducer, IMatrixConsumer, IMatrixReader, IMatrixWriter } from \"@tiny-calc/nano\";\nimport {\n\tMergeTreeDeltaType,\n\tIMergeTreeOp,\n\tSegmentGroup,\n\tClient,\n\tIJSONSegment,\n} from \"@fluidframework/merge-tree\";\nimport { MatrixOp } from \"./ops\";\nimport { PermutationVector, reinsertSegmentIntoVector } from \"./permutationvector\";\nimport { SparseArray2D } from \"./sparsearray2d\";\nimport { SharedMatrixFactory } from \"./runtime\";\nimport { Handle, isHandleValid } from \"./handletable\";\nimport { deserializeBlob } from \"./serialization\";\nimport { ensureRange } from \"./range\";\nimport { IUndoConsumer } from \"./types\";\nimport { MatrixUndoProvider } from \"./undoprovider\";\n\nconst enum SnapshotPath {\n\trows = \"rows\",\n\tcols = \"cols\",\n\tcells = \"cells\",\n}\n\ninterface ISetOp<T> {\n\ttype: MatrixOp.set;\n\trow: number;\n\tcol: number;\n\tvalue: MatrixItem<T>;\n}\n\ninterface ISetOpMetadata {\n\trowHandle: Handle;\n\tcolHandle: Handle;\n\tlocalSeq: number;\n\trowsRefSeq: number;\n\tcolsRefSeq: number;\n}\n\n/**\n * A matrix cell value may be undefined (indicating an empty cell) or any serializable type,\n * excluding null. (However, nulls may be embedded inside objects and arrays.)\n * @public\n */\n// eslint-disable-next-line @rushstack/no-new-null -- Using 'null' to disallow 'null'.\nexport type MatrixItem<T> = Serializable<Exclude<T, null>> | undefined;\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 *\n * @public\n */\nexport class SharedMatrix<T = any>\n\textends SharedObject\n\timplements\n\t\tIMatrixProducer<MatrixItem<T>>,\n\t\tIMatrixReader<MatrixItem<T>>,\n\t\tIMatrixWriter<MatrixItem<T>>\n{\n\tprivate readonly consumers = new Set<IMatrixConsumer<MatrixItem<T>>>();\n\n\tpublic static getFactory() {\n\t\treturn new SharedMatrixFactory();\n\t}\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 pending = new SparseArray2D<number>(); // Tracks pending writes.\n\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);\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);\n\t}\n\n\tprivate undo?: MatrixUndoProvider<T>;\n\n\t/**\n\t * Subscribes the given IUndoConsumer to the matrix.\n\t */\n\tpublic openUndo(consumer: IUndoConsumer) {\n\t\tassert(\n\t\t\tthis.undo === undefined,\n\t\t\t0x019 /* \"SharedMatrix.openUndo() supports at most a single IUndoConsumer.\" */,\n\t\t);\n\n\t\tthis.undo = new MatrixUndoProvider(consumer, this, this.rows, this.cols);\n\t}\n\n\t// TODO: closeUndo()?\n\n\tprivate get rowHandles() {\n\t\treturn this.rows.handleCache;\n\t}\n\tprivate get colHandles() {\n\t\treturn this.cols.handleCache;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.create}\n\t */\n\tpublic static create<T>(runtime: IFluidDataStoreRuntime, id?: string) {\n\t\treturn runtime.createChannel(id, SharedMatrixFactory.Type) as SharedMatrix<T>;\n\t}\n\n\t// #region IMatrixProducer\n\n\topenMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): IMatrixReader<MatrixItem<T>> {\n\t\tthis.consumers.add(consumer);\n\t\treturn this;\n\t}\n\n\tcloseMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): void {\n\t\tthis.consumers.delete(consumer);\n\t}\n\n\t// #endregion IMatrixProducer\n\n\t// #region IMatrixReader\n\n\tpublic get rowCount() {\n\t\treturn this.rows.getLength();\n\t}\n\tpublic get colCount() {\n\t\treturn this.cols.getLength();\n\t}\n\n\tpublic getCell(row: number, col: number): MatrixItem<T> {\n\t\t// Perf: When possible, bounds checking is performed inside the implementation for\n\t\t// 'getHandle()' so that it can be elided in the case of a cache hit. This\n\t\t// yields an ~40% improvement in the case of a cache hit (node v12 x64)\n\n\t\t// Map the logical (row, col) to associated storage handles.\n\t\tconst rowHandle = this.rowHandles.getHandle(row);\n\t\tif (isHandleValid(rowHandle)) {\n\t\t\tconst colHandle = this.colHandles.getHandle(col);\n\t\t\tif (isHandleValid(colHandle)) {\n\t\t\t\treturn this.cells.getCell(rowHandle, colHandle);\n\t\t\t}\n\t\t} else {\n\t\t\t// If we early exit because the given rowHandle is unallocated, we still need to\n\t\t\t// bounds-check the 'col' parameter.\n\t\t\tensureRange(col, this.cols.getLength());\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tpublic get matrixProducer(): IMatrixProducer<MatrixItem<T>> {\n\t\treturn this;\n\t}\n\n\t// #endregion IMatrixReader\n\n\tpublic setCell(row: number, col: number, value: MatrixItem<T>) {\n\t\tassert(\n\t\t\t0 <= row && row < this.rowCount && 0 <= col && col < this.colCount,\n\t\t\t0x01a /* \"Trying to set out-of-bounds cell!\" */,\n\t\t);\n\n\t\tthis.setCellCore(row, col, value);\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(row, col, 1, 1, this);\n\t\t}\n\t}\n\n\tpublic setCells(\n\t\trowStart: number,\n\t\tcolStart: number,\n\t\tcolCount: number,\n\t\tvalues: readonly MatrixItem<T>[],\n\t) {\n\t\tconst rowCount = Math.ceil(values.length / colCount);\n\n\t\tassert(\n\t\t\t0 <= rowStart &&\n\t\t\t\trowStart < this.rowCount &&\n\t\t\t\t0 <= colStart &&\n\t\t\t\tcolStart < this.colCount &&\n\t\t\t\t1 <= colCount &&\n\t\t\t\tcolCount <= this.colCount - colStart &&\n\t\t\t\trowCount <= this.rowCount - rowStart,\n\t\t\t0x01b /* \"Trying to set multiple out-of-bounds cells!\" */,\n\t\t);\n\n\t\tconst endCol = colStart + colCount;\n\t\tlet r = rowStart;\n\t\tlet c = colStart;\n\n\t\tfor (const value of values) {\n\t\t\tthis.setCellCore(r, c, value);\n\n\t\t\tif (++c === endCol) {\n\t\t\t\tc = colStart;\n\t\t\t\tr++;\n\t\t\t}\n\t\t}\n\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, rowCount, colCount, this);\n\t\t}\n\t}\n\n\tprivate setCellCore(\n\t\trow: number,\n\t\tcol: number,\n\t\tvalue: MatrixItem<T>,\n\t\trowHandle = this.rows.getAllocatedHandle(row),\n\t\tcolHandle = this.cols.getAllocatedHandle(col),\n\t) {\n\t\tif (this.undo !== undefined) {\n\t\t\tlet oldValue = this.cells.getCell(rowHandle, colHandle);\n\t\t\tif (oldValue === null) {\n\t\t\t\toldValue = undefined;\n\t\t\t}\n\n\t\t\tthis.undo.cellSet(rowHandle, colHandle, oldValue);\n\t\t}\n\n\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\n\t\tif (this.isAttached()) {\n\t\t\tthis.sendSetCellOp(row, col, value, rowHandle, colHandle);\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\trowsRefSeq = this.rows.getCollabWindow().currentSeq,\n\t\tcolsRefSeq = this.cols.getCollabWindow().currentSeq,\n\t) {\n\t\tassert(\n\t\t\tthis.isAttached(),\n\t\t\t0x1e2 /* \"Caller must ensure 'isAttached()' before calling 'sendSetCellOp'.\" */,\n\t\t);\n\n\t\tconst op: ISetOp<T> = {\n\t\t\ttype: MatrixOp.set,\n\t\t\trow,\n\t\t\tcol,\n\t\t\tvalue,\n\t\t};\n\n\t\tconst metadata: ISetOpMetadata = {\n\t\t\trowHandle,\n\t\t\tcolHandle,\n\t\t\tlocalSeq,\n\t\t\trowsRefSeq,\n\t\t\tcolsRefSeq,\n\t\t};\n\n\t\tthis.submitLocalMessage(op, metadata);\n\t\tthis.pending.setCell(rowHandle, colHandle, localSeq);\n\t}\n\n\tprivate submitVectorMessage(\n\t\tcurrentVector: PermutationVector,\n\t\toppositeVector: PermutationVector,\n\t\tdimension: SnapshotPath.rows | SnapshotPath.cols,\n\t\tmessage: any,\n\t) {\n\t\t// Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n\t\t// and the SharedMatrix's cell data. Instead, we externally advance each MergeTree's 'localSeq' counter\n\t\t// for each submitted op it not aware of to keep them synchronized.\n\t\tconst localSeq = currentVector.getCollabWindow().localSeq;\n\t\tconst oppositeWindow = oppositeVector.getCollabWindow();\n\n\t\t// Note that the comparison is '>=' because, in the case the MergeTree is regenerating ops for reconnection,\n\t\t// the MergeTree submits the op with the original 'localSeq'.\n\t\tassert(\n\t\t\tlocalSeq >= oppositeWindow.localSeq,\n\t\t\t0x01c /* \"The 'localSeq' of the vector submitting an op must >= the 'localSeq' of the other vector.\" */,\n\t\t);\n\n\t\toppositeWindow.localSeq = localSeq;\n\n\t\t// If the SharedMatrix is local, it's state will be submitted via a Snapshot when initially connected.\n\t\t// Do not queue a message or track the pending op, as there will never be an ACK, etc.\n\t\tif (this.isAttached()) {\n\t\t\t// Record whether this `op` targets rows or cols. (See dispatch in `processCore()`)\n\t\t\tmessage.target = dimension;\n\n\t\t\tthis.submitLocalMessage(\n\t\t\t\tmessage,\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: any) {\n\t\tthis.submitVectorMessage(this.cols, this.rows, SnapshotPath.cols, message);\n\t}\n\n\tpublic insertCols(colStart: number, count: number) {\n\t\tthis.submitColMessage(this.cols.insert(colStart, count));\n\t}\n\n\tpublic removeCols(colStart: number, count: number) {\n\t\tthis.submitColMessage(this.cols.remove(colStart, count));\n\t}\n\n\tprivate submitRowMessage(message: any) {\n\t\tthis.submitVectorMessage(this.rows, this.cols, SnapshotPath.rows, message);\n\t}\n\n\tpublic insertRows(rowStart: number, count: number) {\n\t\tthis.submitRowMessage(this.rows.insert(rowStart, count));\n\t}\n\n\tpublic removeRows(rowStart: number, count: number) {\n\t\tthis.submitRowMessage(this.rows.remove(rowStart, count));\n\t}\n\n\t/** @internal */ public _undoRemoveRows(rowStart: number, spec: IJSONSegment) {\n\t\tconst { op, inserted } = reinsertSegmentIntoVector(this.rows, rowStart, spec);\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/** @internal */ public _undoRemoveCols(colStart: number, spec: IJSONSegment) {\n\t\tconst { op, inserted } = reinsertSegmentIntoVector(this.cols, colStart, spec);\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\tbuilder.addBlob(\n\t\t\tSnapshotPath.cells,\n\t\t\tserializer.stringify([this.cells.snapshot(), this.pending.snapshot()], 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: SummarySerializer) {\n\t\tfor (let row = 0; row < this.rowCount; row++) {\n\t\t\tfor (let col = 0; col < this.colCount; col++) {\n\t\t\t\tserializer.stringify(this.getCell(row, col), this.handle);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Advances the 'localSeq' counter for the cell data operation currently being queued.\n\t *\n\t * Do not use with 'submitColMessage()/submitRowMessage()' as these helpers + the MergeTree will\n\t * automatically advance 'localSeq'.\n\t */\n\tprivate nextLocalSeq() {\n\t\t// Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n\t\t// and the SharedMatrix's cell data. Instead, we externally bump each MergeTree's 'localSeq' counter\n\t\t// for SharedMatrix ops it's not aware of to keep them synchronized. (For cell data operations, we\n\t\t// need to bump both counters.)\n\n\t\tthis.cols.getCollabWindow().localSeq++;\n\t\treturn ++this.rows.getCollabWindow().localSeq;\n\t}\n\n\tprotected submitLocalMessage(message: any, localOpMetadata?: any) {\n\t\t// TODO: Recommend moving this assertion into SharedObject\n\t\t// (See https://github.com/microsoft/FluidFramework/issues/2559)\n\t\tassert(\n\t\t\tthis.isAttached() === true,\n\t\t\t0x01d /* \"Trying to submit message to runtime while detached!\" */,\n\t\t);\n\n\t\tsuper.submitLocalMessage(\n\t\t\tmakeHandlesSerializable(message, this.serializer, this.handle),\n\t\t\tlocalOpMetadata,\n\t\t);\n\n\t\t// Ensure that row/col 'localSeq' are synchronized (see 'nextLocalSeq()').\n\t\tassert(\n\t\t\tthis.rows.getCollabWindow().localSeq === this.cols.getCollabWindow().localSeq,\n\t\t\t0x01e /* \"Row and col collab window 'localSeq' desynchronized!\" */,\n\t\t);\n\t}\n\n\tprotected didAttach() {\n\t\t// We've attached we need to start generating and sending ops.\n\t\t// so start collaboration and provide a default client id incase we are not connected\n\t\tif (this.isAttached()) {\n\t\t\tthis.rows.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n\t\t\tthis.cols.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n\t\t}\n\t}\n\n\tprotected onConnect() {\n\t\tassert(\n\t\t\tthis.rows.getCollabWindow().collaborating === this.cols.getCollabWindow().collaborating,\n\t\t\t0x01f /* \"Row and col collab window 'collaborating' status desynchronized!\" */,\n\t\t);\n\n\t\t// Update merge tree collaboration information with new client ID and then resend pending ops\n\t\tthis.rows.startOrUpdateCollaboration(this.runtime.clientId as string);\n\t\tthis.cols.startOrUpdateCollaboration(this.runtime.clientId as string);\n\t}\n\n\tprivate rebasePosition(\n\t\tclient: Client,\n\t\tpos: number,\n\t\treferenceSequenceNumber: number,\n\t\tlocalSeq: number,\n\t): number | undefined {\n\t\tconst { clientId } = client.getCollabWindow();\n\t\tconst { segment, offset } = client.getContainingSegment(\n\t\t\tpos,\n\t\t\t{ referenceSequenceNumber, clientId: client.getLongClientId(clientId) },\n\t\t\tlocalSeq,\n\t\t);\n\t\tif (segment === undefined || offset === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn client.findReconnectionPosition(segment, localSeq) + offset;\n\t}\n\n\tprotected reSubmitCore(content: any, localOpMetadata: unknown) {\n\t\tswitch (content.target) {\n\t\t\tcase SnapshotPath.cols:\n\t\t\t\tthis.submitColMessage(\n\t\t\t\t\tthis.cols.regeneratePendingOp(\n\t\t\t\t\t\tcontent as IMergeTreeOp,\n\t\t\t\t\t\tlocalOpMetadata as SegmentGroup | SegmentGroup[],\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase SnapshotPath.rows:\n\t\t\t\tthis.submitRowMessage(\n\t\t\t\t\tthis.rows.regeneratePendingOp(\n\t\t\t\t\t\tcontent as IMergeTreeOp,\n\t\t\t\t\t\tlocalOpMetadata as SegmentGroup | SegmentGroup[],\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tdefault: {\n\t\t\t\tassert(\n\t\t\t\t\tcontent.type === MatrixOp.set,\n\t\t\t\t\t0x020 /* \"Unknown SharedMatrix 'op' type.\" */,\n\t\t\t\t);\n\n\t\t\t\tconst setOp = content as ISetOp<T>;\n\t\t\t\tconst { rowHandle, colHandle, localSeq, rowsRefSeq, colsRefSeq } =\n\t\t\t\t\tlocalOpMetadata as ISetOpMetadata;\n\n\t\t\t\t// If there are more pending local writes to the same row/col handle, it is important\n\t\t\t\t// to skip resubmitting this op since it is possible the row/col handle has been recycled\n\t\t\t\t// and now refers to a different position than when this op was originally submitted.\n\t\t\t\tif (this.isLatestPendingWrite(rowHandle, colHandle, localSeq)) {\n\t\t\t\t\tconst row = this.rebasePosition(this.rows, setOp.row, rowsRefSeq, localSeq);\n\t\t\t\t\tconst col = this.rebasePosition(this.cols, setOp.col, colsRefSeq, localSeq);\n\n\t\t\t\t\tif (row !== undefined && col !== undefined && row >= 0 && col >= 0) {\n\t\t\t\t\t\tthis.sendSetCellOp(\n\t\t\t\t\t\t\trow,\n\t\t\t\t\t\t\tcol,\n\t\t\t\t\t\t\tsetOp.value,\n\t\t\t\t\t\t\trowHandle,\n\t\t\t\t\t\t\tcolHandle,\n\t\t\t\t\t\t\tlocalSeq,\n\t\t\t\t\t\t\trowsRefSeq,\n\t\t\t\t\t\t\tcolsRefSeq,\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}\n\t}\n\n\tprotected onDisconnect() {}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService) {\n\t\ttry {\n\t\t\tawait this.rows.load(\n\t\t\t\tthis.runtime,\n\t\t\t\tnew ObjectStoragePartition(storage, SnapshotPath.rows),\n\t\t\t\tthis.serializer,\n\t\t\t);\n\t\t\tawait this.cols.load(\n\t\t\t\tthis.runtime,\n\t\t\t\tnew ObjectStoragePartition(storage, SnapshotPath.cols),\n\t\t\t\tthis.serializer,\n\t\t\t);\n\t\t\tconst [cellData, pendingCliSeqData] = await deserializeBlob(\n\t\t\t\tstorage,\n\t\t\t\tSnapshotPath.cells,\n\t\t\t\tthis.serializer,\n\t\t\t);\n\n\t\t\tthis.cells = SparseArray2D.load(cellData);\n\t\t\tthis.pending = SparseArray2D.load(pendingCliSeqData);\n\t\t} catch (error) {\n\t\t\tthis.logger.sendErrorEvent({ eventName: \"MatrixLoadFailed\" }, error);\n\t\t}\n\t}\n\n\tprotected processCore(\n\t\trawMessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t) {\n\t\tconst msg = parseHandles(rawMessage, this.serializer);\n\n\t\tconst contents = msg.contents;\n\n\t\tswitch (contents.target) {\n\t\t\tcase SnapshotPath.cols:\n\t\t\t\tthis.cols.applyMsg(msg, local);\n\t\t\t\tbreak;\n\t\t\tcase SnapshotPath.rows:\n\t\t\t\tthis.rows.applyMsg(msg, local);\n\t\t\t\tbreak;\n\t\t\tdefault: {\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 } = contents;\n\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 } = localOpMetadata as ISetOpMetadata;\n\n\t\t\t\t\t// If this is the most recent write to the cell by the local client, remove our\n\t\t\t\t\t// entry from 'pendingCliSeqs' to resume allowing remote writes.\n\t\t\t\t\tif (this.isLatestPendingWrite(rowHandle, colHandle, localSeq)) {\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, rawMessage);\n\n\t\t\t\t\tif (adjustedRow !== undefined) {\n\t\t\t\t\t\tconst adjustedCol = this.cols.adjustPosition(col, rawMessage);\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\n\t\t\t\t\t\t\t// If there is a pending (unACKed) local write to the same cell, skip the current op\n\t\t\t\t\t\t\t// since it \"happened before\" the pending write.\n\t\t\t\t\t\t\tif (this.pending.getCell(rowHandle, colHandle) === undefined) {\n\t\t\t\t\t\t\t\tconst { value } = contents;\n\t\t\t\t\t\t\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\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}\n\t\t}\n\t}\n\n\t// Invoked by PermutationVector to notify IMatrixConsumers of row insertion/deletions.\n\tprivate readonly onRowDelta = (\n\t\tposition: number,\n\t\tremovedCount: number,\n\t\tinsertedCount: number,\n\t) => {\n\t\tfor (const consumer of this.consumers) {\n\t\t\tconsumer.rowsChanged(position, removedCount, insertedCount, this);\n\t\t}\n\t};\n\n\t// Invoked by PermutationVector to notify IMatrixConsumers of col insertion/deletions.\n\tprivate readonly onColDelta = (\n\t\tposition: number,\n\t\tremovedCount: number,\n\t\tinsertedCount: number,\n\t) => {\n\t\tfor (const consumer of this.consumers) {\n\t\t\tconsumer.colsChanged(position, removedCount, insertedCount, this);\n\t\t}\n\t};\n\n\tprivate readonly onRowHandlesRecycled = (rowHandles: Handle[]) => {\n\t\tfor (const rowHandle of rowHandles) {\n\t\t\tthis.cells.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t\tthis.pending.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t}\n\t};\n\n\tprivate readonly onColHandlesRecycled = (colHandles: Handle[]) => {\n\t\tfor (const colHandle of colHandles) {\n\t\t\tthis.cells.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t\tthis.pending.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t}\n\t};\n\n\t/**\n\t * Returns true if the latest pending write to the cell indicated by the given row/col handles\n\t * matches the given 'localSeq'.\n\t *\n\t * A return value of `true` indicates that there are no later local operations queued that will\n\t * clobber the write op at the given 'localSeq'. This includes later ops that overwrite the cell\n\t * with a different value as well as row/col removals that might recycled the given row/col handles.\n\t */\n\tprivate isLatestPendingWrite(rowHandle: Handle, colHandle: Handle, localSeq: number) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst pendingLocalSeq = this.pending.getCell(rowHandle, colHandle)!;\n\n\t\t// Note while we're awaiting the ACK for a local set, it's possible for the row/col to be\n\t\t// locally removed and the row/col handles recycled. If this happens, the pendingLocalSeq will\n\t\t// be 'undefined' or > 'localSeq'.\n\t\tassert(\n\t\t\t!(pendingLocalSeq < localSeq),\n\t\t\t0x023 /* \"The 'localSeq' of pending write (if any) must be <= the localSeq of the currently processed op.\" */,\n\t\t);\n\n\t\t// If this is the most recent write to the cell by the local client, the stored localSeq\n\t\t// will be an exact match for the given 'localSeq'.\n\t\treturn pendingLocalSeq === localSeq;\n\t}\n\n\tpublic toString() {\n\t\tlet s = `client:${\n\t\t\tthis.runtime.clientId\n\t\t}\\nrows: ${this.rows.toString()}\\ncols: ${this.cols.toString()}\\n\\n`;\n\n\t\tfor (let r = 0; r < this.rowCount; r++) {\n\t\t\ts += ` [`;\n\t\t\tfor (let c = 0; c < this.colCount; c++) {\n\t\t\t\tif (c > 0) {\n\t\t\t\t\ts += \", \";\n\t\t\t\t}\n\n\t\t\t\ts += `${this.serializer.stringify(this.getCell(r, c), this.handle)}`;\n\t\t\t}\n\t\t\ts += \"]\\n\";\n\t\t}\n\n\t\treturn `${s}\\n`;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}\n\t */\n\tprotected applyStashedOp(content: any): unknown {\n\t\tconst parsedContent = parseHandles(content, this.serializer);\n\t\tif (\n\t\t\tparsedContent.target === SnapshotPath.cols ||\n\t\t\tparsedContent.target === SnapshotPath.rows\n\t\t) {\n\t\t\tconst op = parsedContent as IMergeTreeOp;\n\t\t\tconst currentVector =\n\t\t\t\tparsedContent.target === SnapshotPath.cols ? this.cols : this.rows;\n\t\t\tconst oppositeVector =\n\t\t\t\tparsedContent.target === SnapshotPath.cols ? this.rows : this.cols;\n\t\t\tconst metadata = currentVector.applyStashedOp(op);\n\t\t\tconst localSeq = currentVector.getCollabWindow().localSeq;\n\t\t\tconst oppositeWindow = oppositeVector.getCollabWindow();\n\n\t\t\tassert(\n\t\t\t\tlocalSeq > oppositeWindow.localSeq,\n\t\t\t\t0x2d9,\n\t\t\t\t/* \"The 'localSeq' of the vector applying stashed op must > the 'localSeq' of the other vector.\" */\n\t\t\t);\n\n\t\t\toppositeWindow.localSeq = localSeq;\n\n\t\t\treturn metadata;\n\t\t} else {\n\t\t\tassert(\n\t\t\t\tparsedContent.type === MatrixOp.set,\n\t\t\t\t0x2da /* \"Unknown SharedMatrix 'op' type.\" */,\n\t\t\t);\n\n\t\t\tconst setOp = parsedContent as ISetOp<T>;\n\t\t\tconst rowHandle = this.rows.getAllocatedHandle(setOp.row);\n\t\t\tconst colHandle = this.cols.getAllocatedHandle(setOp.col);\n\t\t\tconst rowsRefSeq = this.rows.getCollabWindow().currentSeq;\n\t\t\tconst colsRefSeq = this.cols.getCollabWindow().currentSeq;\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, setOp.value);\n\t\t\tconst localSeq = this.nextLocalSeq();\n\t\t\tconst metadata: ISetOpMetadata = {\n\t\t\t\trowHandle,\n\t\t\t\tcolHandle,\n\t\t\t\tlocalSeq,\n\t\t\t\trowsRefSeq,\n\t\t\t\tcolsRefSeq,\n\t\t\t};\n\n\t\t\tthis.pending.setCell(rowHandle, colHandle, localSeq);\n\t\t\treturn metadata;\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"matrix.cjs","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\n/* eslint-disable import/no-deprecated */\n\nimport { assert } from \"@fluidframework/core-utils\";\nimport { IEventThisPlaceHolder } from \"@fluidframework/core-interfaces\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tSerializable,\n\tIChannelAttributes,\n} from \"@fluidframework/datastore-definitions\";\nimport {\n\tIFluidSerializer,\n\tISharedObjectEvents,\n\tmakeHandlesSerializable,\n\tparseHandles,\n\tSharedObject,\n\tSummarySerializer,\n} from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ObjectStoragePartition, SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { IMatrixProducer, IMatrixConsumer, IMatrixReader, IMatrixWriter } from \"@tiny-calc/nano\";\nimport {\n\tMergeTreeDeltaType,\n\tIMergeTreeOp,\n\tSegmentGroup,\n\tClient,\n\tIJSONSegment,\n} from \"@fluidframework/merge-tree\";\nimport { MatrixOp } from \"./ops\";\nimport { PermutationVector, reinsertSegmentIntoVector } from \"./permutationvector\";\nimport { SparseArray2D } from \"./sparsearray2d\";\nimport { SharedMatrixFactory } from \"./runtime\";\nimport { Handle, isHandleValid } from \"./handletable\";\nimport { deserializeBlob } from \"./serialization\";\nimport { ensureRange } from \"./range\";\nimport { IUndoConsumer } from \"./types\";\nimport { MatrixUndoProvider } from \"./undoprovider\";\n\nconst enum SnapshotPath {\n\trows = \"rows\",\n\tcols = \"cols\",\n\tcells = \"cells\",\n}\n\ninterface ISetOp<T> {\n\ttype: MatrixOp.set;\n\trow: number;\n\tcol: number;\n\tvalue: MatrixItem<T>;\n\tfwwMode?: boolean;\n}\n\ninterface ISetOpMetadata {\n\trowHandle: Handle;\n\tcolHandle: Handle;\n\tlocalSeq: number;\n\trowsRefSeq: number;\n\tcolsRefSeq: number;\n\treferenceSeqNumber: number;\n}\n\n/**\n * Events emitted by Shared Matrix.\n * @alpha\n */\nexport interface ISharedMatrixEvents<T> extends ISharedObjectEvents {\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 SharedMatrix} 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);\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 * A matrix cell value may be undefined (indicating an empty cell) or any serializable type,\n * excluding null. (However, nulls may be embedded inside objects and arrays.)\n * @alpha\n */\n// eslint-disable-next-line @rushstack/no-new-null -- Using 'null' to disallow 'null'.\nexport type MatrixItem<T> = Serializable<Exclude<T, null>> | undefined;\n\n/**\n * A SharedMatrix holds a rectangular 2D array of values. Supported operations\n * include setting values and inserting/removing rows and columns.\n *\n * Matrix values may be any Fluid serializable type, which is the set of JSON\n * serializable types extended to include IFluidHandles.\n *\n * Fluid's SharedMatrix implementation works equally well for dense and sparse\n * matrix data and physically stores data in Z-order to leverage CPU caches and\n * prefetching when reading in either row or column major order. (See README.md\n * for more details.)\n * @alpha\n */\nexport class SharedMatrix<T = any>\n\textends SharedObject<ISharedMatrixEvents<T>>\n\timplements\n\t\tIMatrixProducer<MatrixItem<T>>,\n\t\tIMatrixReader<MatrixItem<T>>,\n\t\tIMatrixWriter<MatrixItem<T>>\n{\n\tprivate readonly consumers = new Set<IMatrixConsumer<MatrixItem<T>>>();\n\n\tpublic static getFactory() {\n\t\treturn new SharedMatrixFactory();\n\t}\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\t_isSetCellConflictResolutionPolicyFWW?: boolean,\n\t) {\n\t\tsuper(id, runtime, attributes, \"fluid_matrix_\");\n\n\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber =\n\t\t\t_isSetCellConflictResolutionPolicyFWW === true ? 0 : -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);\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);\n\t}\n\n\tprivate undo?: MatrixUndoProvider<T>;\n\n\t/**\n\t * Subscribes the given IUndoConsumer to the matrix.\n\t */\n\tpublic openUndo(consumer: IUndoConsumer) {\n\t\tassert(\n\t\t\tthis.undo === undefined,\n\t\t\t0x019 /* \"SharedMatrix.openUndo() supports at most a single IUndoConsumer.\" */,\n\t\t);\n\n\t\tthis.undo = new MatrixUndoProvider(consumer, this, this.rows, this.cols);\n\t}\n\n\t// TODO: closeUndo()?\n\n\tprivate get rowHandles() {\n\t\treturn this.rows.handleCache;\n\t}\n\tprivate get colHandles() {\n\t\treturn this.cols.handleCache;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.create}\n\t */\n\tpublic static create<T>(runtime: IFluidDataStoreRuntime, id?: string) {\n\t\treturn runtime.createChannel(id, SharedMatrixFactory.Type) as SharedMatrix<T>;\n\t}\n\n\t// #region IMatrixProducer\n\n\topenMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): IMatrixReader<MatrixItem<T>> {\n\t\tthis.consumers.add(consumer);\n\t\treturn this;\n\t}\n\n\tcloseMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): void {\n\t\tthis.consumers.delete(consumer);\n\t}\n\n\t// #endregion IMatrixProducer\n\n\t// #region IMatrixReader\n\n\tpublic get rowCount() {\n\t\treturn this.rows.getLength();\n\t}\n\tpublic get colCount() {\n\t\treturn this.cols.getLength();\n\t}\n\n\tpublic isSetCellConflictResolutionPolicyFWW() {\n\t\treturn this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1 || this.userSwitchedSetCellPolicy;\n\t}\n\n\tpublic getCell(row: number, col: number): MatrixItem<T> {\n\t\t// Perf: When possible, bounds checking is performed inside the implementation for\n\t\t// 'getHandle()' so that it can be elided in the case of a cache hit. This\n\t\t// yields an ~40% improvement in the case of a cache hit (node v12 x64)\n\n\t\t// Map the logical (row, col) to associated storage handles.\n\t\tconst rowHandle = this.rowHandles.getHandle(row);\n\t\tif (isHandleValid(rowHandle)) {\n\t\t\tconst colHandle = this.colHandles.getHandle(col);\n\t\t\tif (isHandleValid(colHandle)) {\n\t\t\t\treturn this.cells.getCell(rowHandle, colHandle);\n\t\t\t}\n\t\t} else {\n\t\t\t// If we early exit because the given rowHandle is unallocated, we still need to\n\t\t\t// bounds-check the 'col' parameter.\n\t\t\tensureRange(col, this.cols.getLength());\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tpublic get matrixProducer(): IMatrixProducer<MatrixItem<T>> {\n\t\treturn this;\n\t}\n\n\t// #endregion IMatrixReader\n\n\tpublic setCell(row: number, col: number, value: MatrixItem<T>) {\n\t\tassert(\n\t\t\t0 <= row && row < this.rowCount && 0 <= col && col < this.colCount,\n\t\t\t0x01a /* \"Trying to set out-of-bounds cell!\" */,\n\t\t);\n\n\t\tthis.setCellCore(row, col, value);\n\t}\n\n\tpublic setCells(\n\t\trowStart: number,\n\t\tcolStart: number,\n\t\tcolCount: number,\n\t\tvalues: readonly MatrixItem<T>[],\n\t) {\n\t\tconst rowCount = Math.ceil(values.length / colCount);\n\n\t\tassert(\n\t\t\t0 <= rowStart &&\n\t\t\t\trowStart < this.rowCount &&\n\t\t\t\t0 <= colStart &&\n\t\t\t\tcolStart < this.colCount &&\n\t\t\t\t1 <= colCount &&\n\t\t\t\tcolCount <= this.colCount - colStart &&\n\t\t\t\trowCount <= this.rowCount - rowStart,\n\t\t\t0x01b /* \"Trying to set multiple out-of-bounds cells!\" */,\n\t\t);\n\n\t\tconst endCol = colStart + colCount;\n\t\tlet r = rowStart;\n\t\tlet c = colStart;\n\n\t\tfor (const value of values) {\n\t\t\tthis.setCellCore(r, c, value);\n\n\t\t\tif (++c === endCol) {\n\t\t\t\tc = colStart;\n\t\t\t\tr++;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate setCellCore(\n\t\trow: number,\n\t\tcol: number,\n\t\tvalue: MatrixItem<T>,\n\t\trowHandle = this.rows.getAllocatedHandle(row),\n\t\tcolHandle = this.cols.getAllocatedHandle(col),\n\t) {\n\t\tthis.protectAgainstReentrancy(() => {\n\t\t\tif (this.undo !== undefined) {\n\t\t\t\tlet oldValue = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\tif (oldValue === null) {\n\t\t\t\t\toldValue = undefined;\n\t\t\t\t}\n\n\t\t\t\tthis.undo.cellSet(rowHandle, colHandle, oldValue);\n\t\t\t}\n\n\t\t\tthis.cells.setCell(rowHandle, colHandle, value);\n\n\t\t\tif (this.isAttached()) {\n\t\t\t\tthis.sendSetCellOp(row, col, value, rowHandle, colHandle);\n\t\t\t}\n\n\t\t\t// Avoid reentrancy by raising change notifications after the op is queued.\n\t\t\tfor (const consumer of this.consumers.values()) {\n\t\t\t\tconsumer.cellsChanged(row, col, 1, 1, this);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate 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\trowsRefSeq = this.rows.getCollabWindow().currentSeq,\n\t\tcolsRefSeq = this.cols.getCollabWindow().currentSeq,\n\t) {\n\t\tassert(\n\t\t\tthis.isAttached(),\n\t\t\t0x1e2 /* \"Caller must ensure 'isAttached()' before calling 'sendSetCellOp'.\" */,\n\t\t);\n\n\t\tconst op: ISetOp<T> = {\n\t\t\ttype: MatrixOp.set,\n\t\t\trow,\n\t\t\tcol,\n\t\t\tvalue,\n\t\t\tfwwMode:\n\t\t\t\tthis.userSwitchedSetCellPolicy || this.setCellLwwToFwwPolicySwitchOpSeqNumber > -1,\n\t\t};\n\n\t\tconst metadata: ISetOpMetadata = {\n\t\t\trowHandle,\n\t\t\tcolHandle,\n\t\t\tlocalSeq,\n\t\t\trowsRefSeq,\n\t\t\tcolsRefSeq,\n\t\t\treferenceSeqNumber: this.runtime.deltaManager.lastSequenceNumber,\n\t\t};\n\n\t\tthis.submitLocalMessage(op, metadata);\n\t\tthis.pending.setCell(rowHandle, colHandle, localSeq);\n\t}\n\n\t/**\n\t * This makes sure that the code inside the callback is not reentrant. We need to do that because we raise notifications\n\t * to the consumers telling about these changes and they can try to change the matrix while listening to those notifications\n\t * which can make the shared matrix to be in bad state. For example, we are raising notification for a setCell changes and\n\t * a consumer tries to delete that row/col on receiving that notification which can lead to this matrix trying to setCell in\n\t * a deleted row/col.\n\t * @param callback - code that needs to protected against reentrancy.\n\t */\n\tprivate protectAgainstReentrancy(callback: () => void) {\n\t\tassert(this.reentrantCount === 0, 0x85d /* reentrant code */);\n\t\tthis.reentrantCount++;\n\t\tcallback();\n\t\tthis.reentrantCount--;\n\t\tassert(this.reentrantCount === 0, 0x85e /* reentrant code on exit */);\n\t}\n\n\tprivate submitVectorMessage(\n\t\tcurrentVector: PermutationVector,\n\t\toppositeVector: PermutationVector,\n\t\tdimension: SnapshotPath.rows | SnapshotPath.cols,\n\t\tmessage: any,\n\t) {\n\t\t// Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n\t\t// and the SharedMatrix's cell data. Instead, we externally advance each MergeTree's 'localSeq' counter\n\t\t// for each submitted op it not aware of to keep them synchronized.\n\t\tconst localSeq = currentVector.getCollabWindow().localSeq;\n\t\tconst oppositeWindow = oppositeVector.getCollabWindow();\n\n\t\t// Note that the comparison is '>=' because, in the case the MergeTree is regenerating ops for reconnection,\n\t\t// the MergeTree submits the op with the original 'localSeq'.\n\t\tassert(\n\t\t\tlocalSeq >= oppositeWindow.localSeq,\n\t\t\t0x01c /* \"The 'localSeq' of the vector submitting an op must >= the 'localSeq' of the other vector.\" */,\n\t\t);\n\n\t\toppositeWindow.localSeq = localSeq;\n\n\t\t// If the SharedMatrix is local, it's state will be submitted via a Snapshot when initially connected.\n\t\t// Do not queue a message or track the pending op, as there will never be an ACK, etc.\n\t\tif (this.isAttached()) {\n\t\t\t// Record whether this `op` targets rows or cols. (See dispatch in `processCore()`)\n\t\t\tmessage.target = dimension;\n\n\t\t\tthis.submitLocalMessage(\n\t\t\t\tmessage,\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: any) {\n\t\tthis.submitVectorMessage(this.cols, this.rows, SnapshotPath.cols, message);\n\t}\n\n\tpublic insertCols(colStart: number, count: number) {\n\t\tthis.protectAgainstReentrancy(() =>\n\t\t\tthis.submitColMessage(this.cols.insert(colStart, count)),\n\t\t);\n\t}\n\n\tpublic removeCols(colStart: number, count: number) {\n\t\tthis.protectAgainstReentrancy(() =>\n\t\t\tthis.submitColMessage(this.cols.remove(colStart, count)),\n\t\t);\n\t}\n\n\tprivate submitRowMessage(message: any) {\n\t\tthis.submitVectorMessage(this.rows, this.cols, SnapshotPath.rows, message);\n\t}\n\n\tpublic insertRows(rowStart: number, count: number) {\n\t\tthis.protectAgainstReentrancy(() =>\n\t\t\tthis.submitRowMessage(this.rows.insert(rowStart, count)),\n\t\t);\n\t}\n\n\tpublic removeRows(rowStart: number, count: number) {\n\t\tthis.protectAgainstReentrancy(() =>\n\t\t\tthis.submitRowMessage(this.rows.remove(rowStart, count)),\n\t\t);\n\t}\n\n\t/***/ public _undoRemoveRows(rowStart: number, spec: IJSONSegment) {\n\t\tconst { op, inserted } = reinsertSegmentIntoVector(this.rows, rowStart, spec);\n\t\tthis.submitRowMessage(op);\n\n\t\t// Generate setCell ops for each populated cell in the reinserted rows.\n\t\tlet rowHandle = inserted.start;\n\t\tconst rowCount = inserted.cachedLength;\n\t\tfor (let row = rowStart; row < rowStart + rowCount; row++, rowHandle++) {\n\t\t\tfor (let col = 0; col < this.colCount; col++) {\n\t\t\t\tconst colHandle = this.colHandles.getHandle(col);\n\t\t\t\tconst value = this.cells.getCell(rowHandle, colHandle);\n\t\t\t\tif (this.isAttached() && value !== undefined && value !== null) {\n\t\t\t\t\tthis.sendSetCellOp(row, col, value, rowHandle, colHandle);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Avoid reentrancy by raising change notifications after the op is queued.\n\t\tfor (const consumer of this.consumers.values()) {\n\t\t\tconsumer.cellsChanged(rowStart, /* colStart: */ 0, rowCount, this.colCount, this);\n\t\t}\n\t}\n\n\t/***/ public _undoRemoveCols(colStart: number, spec: IJSONSegment) {\n\t\tconst { op, inserted } = reinsertSegmentIntoVector(this.cols, colStart, spec);\n\t\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: SummarySerializer) {\n\t\tfor (let row = 0; row < this.rowCount; row++) {\n\t\t\tfor (let col = 0; col < this.colCount; col++) {\n\t\t\t\tserializer.stringify(this.getCell(row, col), this.handle);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Advances the 'localSeq' counter for the cell data operation currently being queued.\n\t *\n\t * Do not use with 'submitColMessage()/submitRowMessage()' as these helpers + the MergeTree will\n\t * automatically advance 'localSeq'.\n\t */\n\tprivate nextLocalSeq() {\n\t\t// Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n\t\t// and the SharedMatrix's cell data. Instead, we externally bump each MergeTree's 'localSeq' counter\n\t\t// for SharedMatrix ops it's not aware of to keep them synchronized. (For cell data operations, we\n\t\t// need to bump both counters.)\n\n\t\tthis.cols.getCollabWindow().localSeq++;\n\t\treturn ++this.rows.getCollabWindow().localSeq;\n\t}\n\n\tprotected submitLocalMessage(message: any, localOpMetadata?: any) {\n\t\t// TODO: Recommend moving this assertion into SharedObject\n\t\t// (See https://github.com/microsoft/FluidFramework/issues/2559)\n\t\tassert(\n\t\t\tthis.isAttached() === true,\n\t\t\t0x01d /* \"Trying to submit message to runtime while detached!\" */,\n\t\t);\n\n\t\tsuper.submitLocalMessage(\n\t\t\tmakeHandlesSerializable(message, this.serializer, this.handle),\n\t\t\tlocalOpMetadata,\n\t\t);\n\n\t\t// Ensure that row/col 'localSeq' are synchronized (see 'nextLocalSeq()').\n\t\tassert(\n\t\t\tthis.rows.getCollabWindow().localSeq === this.cols.getCollabWindow().localSeq,\n\t\t\t0x01e /* \"Row and col collab window 'localSeq' desynchronized!\" */,\n\t\t);\n\t}\n\n\tprotected didAttach() {\n\t\t// We've attached we need to start generating and sending ops.\n\t\t// so start collaboration and provide a default client id incase we are not connected\n\t\tif (this.isAttached()) {\n\t\t\tthis.rows.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n\t\t\tthis.cols.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n\t\t}\n\t}\n\n\tprotected onConnect() {\n\t\tassert(\n\t\t\tthis.rows.getCollabWindow().collaborating === this.cols.getCollabWindow().collaborating,\n\t\t\t0x01f /* \"Row and col collab window 'collaborating' status desynchronized!\" */,\n\t\t);\n\n\t\t// Update merge tree collaboration information with new client ID and then resend pending ops\n\t\tthis.rows.startOrUpdateCollaboration(this.runtime.clientId as string);\n\t\tthis.cols.startOrUpdateCollaboration(this.runtime.clientId as string);\n\t}\n\n\tprivate rebasePosition(\n\t\tclient: Client,\n\t\tpos: number,\n\t\treferenceSequenceNumber: number,\n\t\tlocalSeq: number,\n\t): number | undefined {\n\t\tconst { clientId } = client.getCollabWindow();\n\t\tconst { segment, offset } = client.getContainingSegment(\n\t\t\tpos,\n\t\t\t{ referenceSequenceNumber, clientId: client.getLongClientId(clientId) },\n\t\t\tlocalSeq,\n\t\t);\n\t\tif (segment === undefined || offset === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn client.findReconnectionPosition(segment, localSeq) + offset;\n\t}\n\n\tprotected reSubmitCore(content: any, localOpMetadata: unknown) {\n\t\tswitch (content.target) {\n\t\t\tcase SnapshotPath.cols:\n\t\t\t\tthis.submitColMessage(\n\t\t\t\t\tthis.cols.regeneratePendingOp(\n\t\t\t\t\t\tcontent as IMergeTreeOp,\n\t\t\t\t\t\tlocalOpMetadata as SegmentGroup | SegmentGroup[],\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase SnapshotPath.rows:\n\t\t\t\tthis.submitRowMessage(\n\t\t\t\t\tthis.rows.regeneratePendingOp(\n\t\t\t\t\t\tcontent as IMergeTreeOp,\n\t\t\t\t\t\tlocalOpMetadata as SegmentGroup | SegmentGroup[],\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tdefault: {\n\t\t\t\tassert(\n\t\t\t\t\tcontent.type === MatrixOp.set,\n\t\t\t\t\t0x020 /* \"Unknown SharedMatrix 'op' type.\" */,\n\t\t\t\t);\n\n\t\t\t\tconst setOp = content as ISetOp<T>;\n\t\t\t\tconst {\n\t\t\t\t\trowHandle,\n\t\t\t\t\tcolHandle,\n\t\t\t\t\tlocalSeq,\n\t\t\t\t\trowsRefSeq,\n\t\t\t\t\tcolsRefSeq,\n\t\t\t\t\treferenceSeqNumber,\n\t\t\t\t} = localOpMetadata as ISetOpMetadata;\n\n\t\t\t\t// If after rebasing the op, we get a valid row/col number, that means the row/col\n\t\t\t\t// handles have not been recycled and we can safely use them.\n\t\t\t\tconst row = this.rebasePosition(this.rows, setOp.row, rowsRefSeq, localSeq);\n\t\t\t\tconst col = this.rebasePosition(this.cols, setOp.col, colsRefSeq, localSeq);\n\t\t\t\tif (row !== undefined && col !== undefined && row >= 0 && col >= 0) {\n\t\t\t\t\tconst lastCellModificationDetails = this.cellLastWriteTracker.getCell(\n\t\t\t\t\t\trowHandle,\n\t\t\t\t\t\tcolHandle,\n\t\t\t\t\t);\n\t\t\t\t\t// If the mode is LWW, then send the op.\n\t\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\t// last set op, or it is the first set op for the cell, then regenerate the op,\n\t\t\t\t\t// otherwise raise conflict. We want to check the current mode here and not that\n\t\t\t\t\t// whether op was made in FWW or not.\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber === -1 ||\n\t\t\t\t\t\tlastCellModificationDetails === undefined ||\n\t\t\t\t\t\treferenceSeqNumber >= lastCellModificationDetails.seqNum\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.sendSetCellOp(\n\t\t\t\t\t\t\trow,\n\t\t\t\t\t\t\tcol,\n\t\t\t\t\t\t\tsetOp.value,\n\t\t\t\t\t\t\trowHandle,\n\t\t\t\t\t\t\tcolHandle,\n\t\t\t\t\t\t\tlocalSeq,\n\t\t\t\t\t\t\trowsRefSeq,\n\t\t\t\t\t\t\tcolsRefSeq,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (this.pending.getCell(rowHandle, colHandle) !== undefined) {\n\t\t\t\t\t\t// Clear the pending changes if any as we are not sending the op.\n\t\t\t\t\t\tthis.pending.setCell(rowHandle, colHandle, undefined);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected onDisconnect() {}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService) {\n\t\ttry {\n\t\t\tawait this.rows.load(\n\t\t\t\tthis.runtime,\n\t\t\t\tnew ObjectStoragePartition(storage, SnapshotPath.rows),\n\t\t\t\tthis.serializer,\n\t\t\t);\n\t\t\tawait this.cols.load(\n\t\t\t\tthis.runtime,\n\t\t\t\tnew ObjectStoragePartition(storage, SnapshotPath.cols),\n\t\t\t\tthis.serializer,\n\t\t\t);\n\t\t\tconst [\n\t\t\t\tcellData,\n\t\t\t\t_pendingCliSeqData,\n\t\t\t\tsetCellLwwToFwwPolicySwitchOpSeqNumber,\n\t\t\t\tcellLastWriteTracker,\n\t\t\t] = await deserializeBlob(storage, SnapshotPath.cells, this.serializer);\n\n\t\t\tthis.cells = SparseArray2D.load(cellData);\n\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber =\n\t\t\t\tsetCellLwwToFwwPolicySwitchOpSeqNumber ?? -1;\n\t\t\tif (cellLastWriteTracker !== undefined) {\n\t\t\t\tthis.cellLastWriteTracker = SparseArray2D.load(cellLastWriteTracker);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.logger.sendErrorEvent({ eventName: \"MatrixLoadFailed\" }, error);\n\t\t}\n\t}\n\n\t/**\n\t * Tells whether the setCell op should be applied or not based on First Write Win policy. It assumes\n\t * we are in FWW mode.\n\t */\n\tprivate shouldSetCellBasedOnFWW(\n\t\trowHandle: Handle,\n\t\tcolHandle: Handle,\n\t\tmessage: ISequencedDocumentMessage,\n\t) {\n\t\tassert(\n\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber > -1,\n\t\t\t0x85f /* should be in Fww mode when calling this method */,\n\t\t);\n\t\tassert(message.clientId !== null, 0x860 /* clientId should not be null */);\n\t\tconst lastCellModificationDetails = this.cellLastWriteTracker.getCell(rowHandle, colHandle);\n\t\t// If someone tried to Overwrite the cell value or first write on this cell or\n\t\t// same client tried to modify the cell.\n\t\treturn (\n\t\t\tlastCellModificationDetails === undefined ||\n\t\t\tlastCellModificationDetails.clientId === message.clientId ||\n\t\t\tmessage.referenceSequenceNumber >= lastCellModificationDetails.seqNum\n\t\t);\n\t}\n\n\tprotected processCore(\n\t\trawMessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t) {\n\t\tconst msg = parseHandles(rawMessage, this.serializer);\n\n\t\tconst contents = msg.contents;\n\n\t\tswitch (contents.target) {\n\t\t\tcase SnapshotPath.cols:\n\t\t\t\tthis.cols.applyMsg(msg, local);\n\t\t\t\tbreak;\n\t\t\tcase SnapshotPath.rows:\n\t\t\t\tthis.rows.applyMsg(msg, local);\n\t\t\t\tbreak;\n\t\t\tdefault: {\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 = rawMessage.sequenceNumber;\n\t\t\t\t}\n\n\t\t\t\tassert(rawMessage.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 } = localOpMetadata as ISetOpMetadata;\n\t\t\t\t\tconst isLatestPendingOp = this.isLatestPendingWrite(\n\t\t\t\t\t\trowHandle,\n\t\t\t\t\t\tcolHandle,\n\t\t\t\t\t\tlocalSeq,\n\t\t\t\t\t);\n\t\t\t\t\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, rawMessage)) ||\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: rawMessage.sequenceNumber,\n\t\t\t\t\t\t\tclientId: rawMessage.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, rawMessage);\n\t\t\t\t\tif (adjustedRow !== undefined) {\n\t\t\t\t\t\tconst adjustedCol = this.cols.adjustPosition(col, rawMessage);\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, rawMessage)\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: rawMessage.sequenceNumber,\n\t\t\t\t\t\t\t\t\t\tclientId: rawMessage.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: rawMessage.sequenceNumber,\n\t\t\t\t\t\t\t\t\tclientId: rawMessage.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}\n\t\t}\n\t}\n\n\t// Invoked by PermutationVector to notify IMatrixConsumers of row insertion/deletions.\n\tprivate readonly onRowDelta = (\n\t\tposition: number,\n\t\tremovedCount: number,\n\t\tinsertedCount: number,\n\t) => {\n\t\tfor (const consumer of this.consumers) {\n\t\t\tconsumer.rowsChanged(position, removedCount, insertedCount, this);\n\t\t}\n\t};\n\n\t// Invoked by PermutationVector to notify IMatrixConsumers of col insertion/deletions.\n\tprivate readonly onColDelta = (\n\t\tposition: number,\n\t\tremovedCount: number,\n\t\tinsertedCount: number,\n\t) => {\n\t\tfor (const consumer of this.consumers) {\n\t\t\tconsumer.colsChanged(position, removedCount, insertedCount, this);\n\t\t}\n\t};\n\n\tprivate readonly onRowHandlesRecycled = (rowHandles: Handle[]) => {\n\t\tfor (const rowHandle of rowHandles) {\n\t\t\tthis.cells.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t\tthis.pending.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t\tthis.cellLastWriteTracker.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n\t\t}\n\t};\n\n\tprivate readonly onColHandlesRecycled = (colHandles: Handle[]) => {\n\t\tfor (const colHandle of colHandles) {\n\t\t\tthis.cells.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t\tthis.pending.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t\tthis.cellLastWriteTracker.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n\t\t}\n\t};\n\n\t/**\n\t * Api to switch Set Op policy from Last Writer Win to First Writer Win. It only switches from LWW to FWW\n\t * and not from FWW to LWW. The next SetOp which is sent will communicate this policy to other clients.\n\t */\n\tpublic switchSetCellPolicy() {\n\t\tif (this.setCellLwwToFwwPolicySwitchOpSeqNumber === -1) {\n\t\t\tif (this.isAttached()) {\n\t\t\t\tthis.userSwitchedSetCellPolicy = true;\n\t\t\t} else {\n\t\t\t\tthis.setCellLwwToFwwPolicySwitchOpSeqNumber = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns true if the latest pending write to the cell indicated by the given row/col handles\n\t * matches the given 'localSeq'.\n\t *\n\t * A return value of `true` indicates that there are no later local operations queued that will\n\t * clobber the write op at the given 'localSeq'. This includes later ops that overwrite the cell\n\t * with a different value as well as row/col removals that might recycled the given row/col handles.\n\t */\n\tprivate isLatestPendingWrite(rowHandle: Handle, colHandle: Handle, localSeq: number) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst pendingLocalSeq = this.pending.getCell(rowHandle, colHandle)!;\n\n\t\t// Note while we're awaiting the ACK for a local set, it's possible for the row/col to be\n\t\t// locally removed and the row/col handles recycled. If this happens, the pendingLocalSeq will\n\t\t// be 'undefined' or > 'localSeq'.\n\t\tassert(\n\t\t\t!(pendingLocalSeq < localSeq),\n\t\t\t0x023 /* \"The 'localSeq' of pending write (if any) must be <= the localSeq of the currently processed op.\" */,\n\t\t);\n\n\t\t// If this is the most recent write to the cell by the local client, the stored localSeq\n\t\t// will be an exact match for the given 'localSeq'.\n\t\treturn pendingLocalSeq === localSeq;\n\t}\n\n\tpublic toString() {\n\t\tlet s = `client:${\n\t\t\tthis.runtime.clientId\n\t\t}\\nrows: ${this.rows.toString()}\\ncols: ${this.cols.toString()}\\n\\n`;\n\n\t\tfor (let r = 0; r < this.rowCount; r++) {\n\t\t\ts += ` [`;\n\t\t\tfor (let c = 0; c < this.colCount; c++) {\n\t\t\t\tif (c > 0) {\n\t\t\t\t\ts += \", \";\n\t\t\t\t}\n\n\t\t\t\ts += `${this.serializer.stringify(this.getCell(r, c), this.handle)}`;\n\t\t\t}\n\t\t\ts += \"]\\n\";\n\t\t}\n\n\t\treturn `${s}\\n`;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}\n\t */\n\tprotected applyStashedOp(content: any): unknown {\n\t\tconst parsedContent = parseHandles(content, this.serializer);\n\t\tif (\n\t\t\tparsedContent.target === SnapshotPath.cols ||\n\t\t\tparsedContent.target === SnapshotPath.rows\n\t\t) {\n\t\t\tconst op = parsedContent as IMergeTreeOp;\n\t\t\tconst currentVector =\n\t\t\t\tparsedContent.target === SnapshotPath.cols ? this.cols : this.rows;\n\t\t\tconst oppositeVector =\n\t\t\t\tparsedContent.target === SnapshotPath.cols ? this.rows : this.cols;\n\t\t\tconst metadata = currentVector.applyStashedOp(op);\n\t\t\tconst localSeq = currentVector.getCollabWindow().localSeq;\n\t\t\tconst oppositeWindow = oppositeVector.getCollabWindow();\n\n\t\t\tassert(\n\t\t\t\tlocalSeq > oppositeWindow.localSeq,\n\t\t\t\t0x2d9,\n\t\t\t\t/* \"The 'localSeq' of the vector applying stashed op must > the 'localSeq' of the other vector.\" */\n\t\t\t);\n\n\t\t\toppositeWindow.localSeq = localSeq;\n\n\t\t\treturn metadata;\n\t\t} else {\n\t\t\tassert(\n\t\t\t\tparsedContent.type === MatrixOp.set,\n\t\t\t\t0x2da /* \"Unknown SharedMatrix 'op' type.\" */,\n\t\t\t);\n\n\t\t\tconst setOp = parsedContent as ISetOp<T>;\n\t\t\tconst rowHandle = this.rows.getAllocatedHandle(setOp.row);\n\t\t\tconst colHandle = this.cols.getAllocatedHandle(setOp.col);\n\t\t\tconst rowsRefSeq = this.rows.getCollabWindow().currentSeq;\n\t\t\tconst colsRefSeq = this.cols.getCollabWindow().currentSeq;\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, setOp.value);\n\t\t\tconst localSeq = this.nextLocalSeq();\n\t\t\tconst metadata: ISetOpMetadata = {\n\t\t\t\trowHandle,\n\t\t\t\tcolHandle,\n\t\t\t\tlocalSeq,\n\t\t\t\trowsRefSeq,\n\t\t\t\tcolsRefSeq,\n\t\t\t\treferenceSeqNumber: this.runtime.deltaManager.lastSequenceNumber,\n\t\t\t};\n\n\t\t\tthis.pending.setCell(rowHandle, colHandle, localSeq);\n\t\t\treturn metadata;\n\t\t}\n\t}\n}\n"]}
|
package/dist/matrix.d.ts
CHANGED
|
@@ -2,18 +2,45 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
+
import { IEventThisPlaceHolder } from "@fluidframework/core-interfaces";
|
|
5
6
|
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
6
7
|
import { IFluidDataStoreRuntime, IChannelStorageService, Serializable, IChannelAttributes } from "@fluidframework/datastore-definitions";
|
|
7
|
-
import { IFluidSerializer, SharedObject, SummarySerializer } from "@fluidframework/shared-object-base";
|
|
8
|
+
import { IFluidSerializer, ISharedObjectEvents, SharedObject, SummarySerializer } from "@fluidframework/shared-object-base";
|
|
8
9
|
import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
|
|
9
10
|
import { IMatrixProducer, IMatrixConsumer, IMatrixReader, IMatrixWriter } from "@tiny-calc/nano";
|
|
10
11
|
import { IJSONSegment } from "@fluidframework/merge-tree";
|
|
11
12
|
import { SharedMatrixFactory } from "./runtime";
|
|
12
13
|
import { IUndoConsumer } from "./types";
|
|
14
|
+
/**
|
|
15
|
+
* Events emitted by Shared Matrix.
|
|
16
|
+
* @alpha
|
|
17
|
+
*/
|
|
18
|
+
export interface ISharedMatrixEvents<T> extends ISharedObjectEvents {
|
|
19
|
+
/**
|
|
20
|
+
* This event is only emitted when the SetCell Resolution Policy is First Write Win(FWW).
|
|
21
|
+
* This is emitted when two clients race and send changes without observing each other changes,
|
|
22
|
+
* the changes that gets sequenced last would be rejected, and only client who's changes rejected
|
|
23
|
+
* would be notified via this event, with expectation that it will merge its changes back by
|
|
24
|
+
* accounting new information (state from winner of the race).
|
|
25
|
+
*
|
|
26
|
+
* @remarks Listener parameters:
|
|
27
|
+
*
|
|
28
|
+
* - `row` - Row number at which conflict happened.
|
|
29
|
+
*
|
|
30
|
+
* - `col` - Col number at which conflict happened.
|
|
31
|
+
*
|
|
32
|
+
* - `currentValue` - The current value of the cell.
|
|
33
|
+
*
|
|
34
|
+
* - `conflictingValue` - The value that this client tried to set in the cell and got ignored due to conflict.
|
|
35
|
+
*
|
|
36
|
+
* - `target` - The {@link SharedMatrix} itself.
|
|
37
|
+
*/
|
|
38
|
+
(event: "conflict", listener: (row: number, col: number, currentValue: MatrixItem<T>, conflictingValue: MatrixItem<T>, target: IEventThisPlaceHolder) => void): any;
|
|
39
|
+
}
|
|
13
40
|
/**
|
|
14
41
|
* A matrix cell value may be undefined (indicating an empty cell) or any serializable type,
|
|
15
42
|
* excluding null. (However, nulls may be embedded inside objects and arrays.)
|
|
16
|
-
* @
|
|
43
|
+
* @alpha
|
|
17
44
|
*/
|
|
18
45
|
export type MatrixItem<T> = Serializable<Exclude<T, null>> | undefined;
|
|
19
46
|
/**
|
|
@@ -27,18 +54,29 @@ export type MatrixItem<T> = Serializable<Exclude<T, null>> | undefined;
|
|
|
27
54
|
* matrix data and physically stores data in Z-order to leverage CPU caches and
|
|
28
55
|
* prefetching when reading in either row or column major order. (See README.md
|
|
29
56
|
* for more details.)
|
|
30
|
-
*
|
|
31
|
-
* @public
|
|
57
|
+
* @alpha
|
|
32
58
|
*/
|
|
33
|
-
export declare class SharedMatrix<T = any> extends SharedObject implements IMatrixProducer<MatrixItem<T>>, IMatrixReader<MatrixItem<T>>, IMatrixWriter<MatrixItem<T>> {
|
|
59
|
+
export declare class SharedMatrix<T = any> extends SharedObject<ISharedMatrixEvents<T>> implements IMatrixProducer<MatrixItem<T>>, IMatrixReader<MatrixItem<T>>, IMatrixWriter<MatrixItem<T>> {
|
|
34
60
|
id: string;
|
|
35
61
|
private readonly consumers;
|
|
36
62
|
static getFactory(): SharedMatrixFactory;
|
|
37
63
|
private readonly rows;
|
|
38
64
|
private readonly cols;
|
|
39
65
|
private cells;
|
|
40
|
-
private pending;
|
|
41
|
-
|
|
66
|
+
private readonly pending;
|
|
67
|
+
private cellLastWriteTracker;
|
|
68
|
+
private setCellLwwToFwwPolicySwitchOpSeqNumber;
|
|
69
|
+
private userSwitchedSetCellPolicy;
|
|
70
|
+
private reentrantCount;
|
|
71
|
+
/**
|
|
72
|
+
* Constructor for the Shared Matrix
|
|
73
|
+
* @param runtime - DataStore runtime.
|
|
74
|
+
* @param id - id of the dds
|
|
75
|
+
* @param attributes - channel attributes
|
|
76
|
+
* @param _isSetCellConflictResolutionPolicyFWW - Conflict resolution for Matrix set op is First Writer Win in case of
|
|
77
|
+
* race condition. Client can still overwrite values in case of no race.
|
|
78
|
+
*/
|
|
79
|
+
constructor(runtime: IFluidDataStoreRuntime, id: string, attributes: IChannelAttributes, _isSetCellConflictResolutionPolicyFWW?: boolean);
|
|
42
80
|
private undo?;
|
|
43
81
|
/**
|
|
44
82
|
* Subscribes the given IUndoConsumer to the matrix.
|
|
@@ -54,12 +92,22 @@ export declare class SharedMatrix<T = any> extends SharedObject implements IMatr
|
|
|
54
92
|
closeMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): void;
|
|
55
93
|
get rowCount(): number;
|
|
56
94
|
get colCount(): number;
|
|
95
|
+
isSetCellConflictResolutionPolicyFWW(): boolean;
|
|
57
96
|
getCell(row: number, col: number): MatrixItem<T>;
|
|
58
97
|
get matrixProducer(): IMatrixProducer<MatrixItem<T>>;
|
|
59
98
|
setCell(row: number, col: number, value: MatrixItem<T>): void;
|
|
60
99
|
setCells(rowStart: number, colStart: number, colCount: number, values: readonly MatrixItem<T>[]): void;
|
|
61
100
|
private setCellCore;
|
|
62
101
|
private sendSetCellOp;
|
|
102
|
+
/**
|
|
103
|
+
* This makes sure that the code inside the callback is not reentrant. We need to do that because we raise notifications
|
|
104
|
+
* to the consumers telling about these changes and they can try to change the matrix while listening to those notifications
|
|
105
|
+
* which can make the shared matrix to be in bad state. For example, we are raising notification for a setCell changes and
|
|
106
|
+
* a consumer tries to delete that row/col on receiving that notification which can lead to this matrix trying to setCell in
|
|
107
|
+
* a deleted row/col.
|
|
108
|
+
* @param callback - code that needs to protected against reentrancy.
|
|
109
|
+
*/
|
|
110
|
+
private protectAgainstReentrancy;
|
|
63
111
|
private submitVectorMessage;
|
|
64
112
|
private submitColMessage;
|
|
65
113
|
insertCols(colStart: number, count: number): void;
|
|
@@ -67,8 +115,8 @@ export declare class SharedMatrix<T = any> extends SharedObject implements IMatr
|
|
|
67
115
|
private submitRowMessage;
|
|
68
116
|
insertRows(rowStart: number, count: number): void;
|
|
69
117
|
removeRows(rowStart: number, count: number): void;
|
|
70
|
-
|
|
71
|
-
|
|
118
|
+
/***/ _undoRemoveRows(rowStart: number, spec: IJSONSegment): void;
|
|
119
|
+
/***/ _undoRemoveCols(colStart: number, spec: IJSONSegment): void;
|
|
72
120
|
protected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats;
|
|
73
121
|
/**
|
|
74
122
|
* Runs serializer on the GC data for this SharedMatrix.
|
|
@@ -92,11 +140,21 @@ export declare class SharedMatrix<T = any> extends SharedObject implements IMatr
|
|
|
92
140
|
* {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}
|
|
93
141
|
*/
|
|
94
142
|
protected loadCore(storage: IChannelStorageService): Promise<void>;
|
|
143
|
+
/**
|
|
144
|
+
* Tells whether the setCell op should be applied or not based on First Write Win policy. It assumes
|
|
145
|
+
* we are in FWW mode.
|
|
146
|
+
*/
|
|
147
|
+
private shouldSetCellBasedOnFWW;
|
|
95
148
|
protected processCore(rawMessage: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown): void;
|
|
96
149
|
private readonly onRowDelta;
|
|
97
150
|
private readonly onColDelta;
|
|
98
151
|
private readonly onRowHandlesRecycled;
|
|
99
152
|
private readonly onColHandlesRecycled;
|
|
153
|
+
/**
|
|
154
|
+
* Api to switch Set Op policy from Last Writer Win to First Writer Win. It only switches from LWW to FWW
|
|
155
|
+
* and not from FWW to LWW. The next SetOp which is sent will communicate this policy to other clients.
|
|
156
|
+
*/
|
|
157
|
+
switchSetCellPolicy(): void;
|
|
100
158
|
/**
|
|
101
159
|
* Returns true if the latest pending write to the cell indicated by the given row/col handles
|
|
102
160
|
* matches the given 'localSeq'.
|
package/dist/matrix.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matrix.d.ts","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EACN,sBAAsB,EACtB,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACN,gBAAgB,
|
|
1
|
+
{"version":3,"file":"matrix.d.ts","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"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"}
|
package/dist/ops.cjs
CHANGED
|
@@ -10,5 +10,6 @@ var MatrixOp;
|
|
|
10
10
|
MatrixOp[MatrixOp["spliceCols"] = 0] = "spliceCols";
|
|
11
11
|
MatrixOp[MatrixOp["spliceRows"] = 1] = "spliceRows";
|
|
12
12
|
MatrixOp[MatrixOp["set"] = 2] = "set";
|
|
13
|
+
MatrixOp[MatrixOp["changeSetCellPolicy"] = 3] = "changeSetCellPolicy";
|
|
13
14
|
})(MatrixOp || (exports.MatrixOp = MatrixOp = {}));
|
|
14
15
|
//# sourceMappingURL=ops.cjs.map
|
package/dist/ops.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ops.cjs","sourceRoot":"","sources":["../src/ops.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,IAAY,
|
|
1
|
+
{"version":3,"file":"ops.cjs","sourceRoot":"","sources":["../src/ops.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,IAAY,QAKX;AALD,WAAY,QAAQ;IACnB,mDAAU,CAAA;IACV,mDAAU,CAAA;IACV,qCAAG,CAAA;IACH,qEAAmB,CAAA;AACpB,CAAC,EALW,QAAQ,wBAAR,QAAQ,QAKnB","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Serializable } from \"@fluidframework/datastore-definitions\";\n\nexport enum MatrixOp {\n\tspliceCols,\n\tspliceRows,\n\tset,\n\tchangeSetCellPolicy,\n}\n\nexport interface IMatrixMsg {\n\ttype: MatrixOp;\n}\n\nexport interface IMatrixSpliceMsg extends IMatrixMsg {\n\ttype: MatrixOp.spliceCols | MatrixOp.spliceRows;\n\tstart: number;\n\tcount: number;\n}\n\nexport interface IMatrixCellMsg extends IMatrixMsg {\n\ttype: MatrixOp.set;\n\trow: number;\n\tcol: number;\n\tvalue: Serializable;\n}\n\nexport interface IMatrixSwitchSetCellPolicy extends IMatrixMsg {\n\ttype: MatrixOp.changeSetCellPolicy;\n}\n"]}
|
package/dist/ops.d.ts
CHANGED
|
@@ -6,7 +6,8 @@ import { Serializable } from "@fluidframework/datastore-definitions";
|
|
|
6
6
|
export declare enum MatrixOp {
|
|
7
7
|
spliceCols = 0,
|
|
8
8
|
spliceRows = 1,
|
|
9
|
-
set = 2
|
|
9
|
+
set = 2,
|
|
10
|
+
changeSetCellPolicy = 3
|
|
10
11
|
}
|
|
11
12
|
export interface IMatrixMsg {
|
|
12
13
|
type: MatrixOp;
|
|
@@ -22,4 +23,7 @@ export interface IMatrixCellMsg extends IMatrixMsg {
|
|
|
22
23
|
col: number;
|
|
23
24
|
value: Serializable;
|
|
24
25
|
}
|
|
26
|
+
export interface IMatrixSwitchSetCellPolicy extends IMatrixMsg {
|
|
27
|
+
type: MatrixOp.changeSetCellPolicy;
|
|
28
|
+
}
|
|
25
29
|
//# sourceMappingURL=ops.d.ts.map
|
package/dist/ops.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ops.d.ts","sourceRoot":"","sources":["../src/ops.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAErE,oBAAY,QAAQ;IACnB,UAAU,IAAA;IACV,UAAU,IAAA;IACV,GAAG,IAAA;
|
|
1
|
+
{"version":3,"file":"ops.d.ts","sourceRoot":"","sources":["../src/ops.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAErE,oBAAY,QAAQ;IACnB,UAAU,IAAA;IACV,UAAU,IAAA;IACV,GAAG,IAAA;IACH,mBAAmB,IAAA;CACnB;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,QAAQ,CAAC;CACf;AAED,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IACnD,IAAI,EAAE,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAe,SAAQ,UAAU;IACjD,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,YAAY,CAAC;CACpB;AAED,MAAM,WAAW,0BAA2B,SAAQ,UAAU;IAC7D,IAAI,EAAE,QAAQ,CAAC,mBAAmB,CAAC;CACnC"}
|
package/dist/packageVersion.cjs
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.pkgVersion = exports.pkgName = void 0;
|
|
10
10
|
exports.pkgName = "@fluidframework/matrix";
|
|
11
|
-
exports.pkgVersion = "2.0.0-internal.7.
|
|
11
|
+
exports.pkgVersion = "2.0.0-internal.7.4.0";
|
|
12
12
|
//# sourceMappingURL=packageVersion.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.cjs","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,wBAAwB,CAAC;AACnC,QAAA,UAAU,GAAG,sBAAsB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/matrix\";\nexport const pkgVersion = \"2.0.0-internal.7.
|
|
1
|
+
{"version":3,"file":"packageVersion.cjs","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,wBAAwB,CAAC;AACnC,QAAA,UAAU,GAAG,sBAAsB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/matrix\";\nexport const pkgVersion = \"2.0.0-internal.7.4.0\";\n"]}
|
package/dist/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/matrix";
|
|
8
|
-
export declare const pkgVersion = "2.0.0-internal.7.
|
|
8
|
+
export declare const pkgVersion = "2.0.0-internal.7.4.0";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/dist/runtime.cjs
CHANGED
|
@@ -9,7 +9,7 @@ const packageVersion_1 = require("./packageVersion.cjs");
|
|
|
9
9
|
const matrix_1 = require("./matrix.cjs");
|
|
10
10
|
/**
|
|
11
11
|
* {@link @fluidframework/datastore-definitions#IChannelFactory} for {@link SharedMatrix}.
|
|
12
|
-
* @
|
|
12
|
+
* @alpha
|
|
13
13
|
*/
|
|
14
14
|
class SharedMatrixFactory {
|
|
15
15
|
get type() {
|
package/dist/runtime.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.cjs","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AASH,yDAA8C;AAC9C,yCAAwC;AAExC;;;GAGG;AACH,MAAa,mBAAmB;IAS/B,IAAW,IAAI;QACd,OAAO,mBAAmB,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,mBAAmB,CAAC,UAAU,CAAC;IACvC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI,CAChB,OAA+B,EAC/B,EAAU,EACV,QAA0B,EAC1B,UAA8B;QAE9B,MAAM,MAAM,GAAG,IAAI,qBAAY,CAAC,OAAO,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;QACzD,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC;IACf,CAAC;IAEM,MAAM,CAAC,QAAgC,EAAE,EAAU;QACzD,MAAM,MAAM,GAAG,IAAI,qBAAY,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,CAAC,eAAe,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IACf,CAAC;;AAnCF,kDAoCC;AAnCc,wBAAI,GAAG,gDAAgD,CAAC;AAE/C,8BAAU,GAAuB;IACvD,IAAI,EAAE,mBAAmB,CAAC,IAAI;IAC9B,qBAAqB,EAAE,KAAK;IAC5B,cAAc,EAAE,2BAAU;CAC1B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelServices,\n\tIChannel,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\nimport { pkgVersion } from \"./packageVersion\";\nimport { SharedMatrix } from \"./matrix\";\n\n/**\n * {@link @fluidframework/datastore-definitions#IChannelFactory} for {@link SharedMatrix}.\n * @
|
|
1
|
+
{"version":3,"file":"runtime.cjs","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AASH,yDAA8C;AAC9C,yCAAwC;AAExC;;;GAGG;AACH,MAAa,mBAAmB;IAS/B,IAAW,IAAI;QACd,OAAO,mBAAmB,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,mBAAmB,CAAC,UAAU,CAAC;IACvC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI,CAChB,OAA+B,EAC/B,EAAU,EACV,QAA0B,EAC1B,UAA8B;QAE9B,MAAM,MAAM,GAAG,IAAI,qBAAY,CAAC,OAAO,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;QACzD,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC;IACf,CAAC;IAEM,MAAM,CAAC,QAAgC,EAAE,EAAU;QACzD,MAAM,MAAM,GAAG,IAAI,qBAAY,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,CAAC,eAAe,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IACf,CAAC;;AAnCF,kDAoCC;AAnCc,wBAAI,GAAG,gDAAgD,CAAC;AAE/C,8BAAU,GAAuB;IACvD,IAAI,EAAE,mBAAmB,CAAC,IAAI;IAC9B,qBAAqB,EAAE,KAAK;IAC5B,cAAc,EAAE,2BAAU;CAC1B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelServices,\n\tIChannel,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\nimport { pkgVersion } from \"./packageVersion\";\nimport { SharedMatrix } from \"./matrix\";\n\n/**\n * {@link @fluidframework/datastore-definitions#IChannelFactory} for {@link SharedMatrix}.\n * @alpha\n */\nexport class SharedMatrixFactory implements IChannelFactory {\n\tpublic static Type = \"https://graph.microsoft.com/types/sharedmatrix\";\n\n\tpublic static readonly Attributes: IChannelAttributes = {\n\t\ttype: SharedMatrixFactory.Type,\n\t\tsnapshotFormatVersion: \"0.1\",\n\t\tpackageVersion: pkgVersion,\n\t};\n\n\tpublic get type() {\n\t\treturn SharedMatrixFactory.Type;\n\t}\n\n\tpublic get attributes() {\n\t\treturn SharedMatrixFactory.Attributes;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}\n\t */\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IChannel> {\n\t\tconst matrix = new SharedMatrix(runtime, id, attributes);\n\t\tawait matrix.load(services);\n\t\treturn matrix;\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): IChannel {\n\t\tconst matrix = new SharedMatrix(document, id, this.attributes);\n\t\tmatrix.initializeLocal();\n\t\treturn matrix;\n\t}\n}\n"]}
|
package/dist/runtime.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { IChannelAttributes, IFluidDataStoreRuntime, IChannelServices, IChannel, IChannelFactory } from "@fluidframework/datastore-definitions";
|
|
6
6
|
/**
|
|
7
7
|
* {@link @fluidframework/datastore-definitions#IChannelFactory} for {@link SharedMatrix}.
|
|
8
|
-
* @
|
|
8
|
+
* @alpha
|
|
9
9
|
*/
|
|
10
10
|
export declare class SharedMatrixFactory implements IChannelFactory {
|
|
11
11
|
static Type: string;
|
package/dist/types.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.cjs","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n// TODO: We temporarily duplicate these contracts from 'framework/undo-redo' to unblock development\n// of SharedMatrix undo while we decide on the correct layering for undo.\n\n/**\n * @
|
|
1
|
+
{"version":3,"file":"types.cjs","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n// TODO: We temporarily duplicate these contracts from 'framework/undo-redo' to unblock development\n// of SharedMatrix undo while we decide on the correct layering for undo.\n\n/**\n * @alpha\n */\nexport interface IRevertible {\n\trevert();\n\tdiscard();\n}\n\n/**\n * @alpha\n */\nexport interface IUndoConsumer {\n\tpushToCurrentOperation(revertible: IRevertible);\n}\n"]}
|
package/dist/types.d.ts
CHANGED
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
/**
|
|
6
|
-
* @
|
|
6
|
+
* @alpha
|
|
7
7
|
*/
|
|
8
8
|
export interface IRevertible {
|
|
9
9
|
revert(): any;
|
|
10
10
|
discard(): any;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
|
-
* @
|
|
13
|
+
* @alpha
|
|
14
14
|
*/
|
|
15
15
|
export interface IUndoConsumer {
|
|
16
16
|
pushToCurrentOperation(revertible: IRevertible): any;
|
package/lib/handlecache.d.ts
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
import { IVectorConsumer } from "@tiny-calc/nano";
|
|
6
|
-
import { Handle } from "./handletable";
|
|
7
|
-
import { PermutationVector } from "./permutationvector";
|
|
6
|
+
import { Handle } from "./handletable.mjs";
|
|
7
|
+
import { PermutationVector } from "./permutationvector.mjs";
|
|
8
8
|
/**
|
|
9
9
|
* Used by PermutationVector to cache position -\> handle lookups.
|
|
10
10
|
*
|
package/lib/handlecache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlecache.d.ts","sourceRoot":"","sources":["../src/handlecache.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"handlecache.d.ts","sourceRoot":"","sources":["../src/handlecache.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAKI,EAAE,eAAe,EAAE,MAAM,iBAAiB;OAC1C,EAAE,MAAM,EAAiB;OACzB,EAAE,iBAAiB,EAAsB;AAGhD;;;;;GAKG;AACH,qBAAa,WAAY,YAAW,eAAe,CAAC,MAAM,CAAC;aAI9B,MAAM,EAAE,iBAAiB;IAHrD,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,KAAK,CAAK;gBAEU,MAAM,EAAE,iBAAiB;IAErD;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAIhB;;;;;;;OAOG;IACI,SAAS,CAAC,QAAQ,EAAE,MAAM;IAajC,8EAA8E;IACvE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAajD,0EAA0E;IAC1E,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,SAAS;IA4BjB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;CAoB9E"}
|
package/lib/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
export { SharedMatrix, MatrixItem } from "./matrix";
|
|
6
|
-
export { SharedMatrixFactory } from "./runtime";
|
|
7
|
-
export { IUndoConsumer, IRevertible } from "./types";
|
|
5
|
+
export { ISharedMatrixEvents, SharedMatrix, MatrixItem } from "./matrix.mjs";
|
|
6
|
+
export { SharedMatrixFactory } from "./runtime.mjs";
|
|
7
|
+
export { IUndoConsumer, IRevertible } from "./types.mjs";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,EAAE,mBAAmB,EAAE,YAAY,EAAE,UAAU,EAAE;OACjD,EAAE,mBAAmB,EAAE;OAIvB,EAAE,aAAa,EAAE,WAAW,EAAE"}
|
package/lib/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,EAAuB,YAAY,EAAc;OACjD,EAAE,mBAAmB,EAAE","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { ISharedMatrixEvents, SharedMatrix, MatrixItem } from \"./matrix\";\nexport { SharedMatrixFactory } from \"./runtime\";\n\n// TODO: We temporarily duplicate these contracts from 'framework/undo-redo' to unblock development\n// of SharedMatrix undo while we decide on the correct layering for undo.\nexport { IUndoConsumer, IRevertible } from \"./types\";\n"]}
|