@fluidframework/matrix 2.0.0-internal.1.4.2 → 2.0.0-internal.2.0.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/dist/matrix.d.ts.map +1 -1
- package/dist/matrix.js +2 -5
- package/dist/matrix.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/permutationvector.d.ts +4 -3
- package/dist/permutationvector.d.ts.map +1 -1
- package/dist/permutationvector.js +5 -5
- package/dist/permutationvector.js.map +1 -1
- package/lib/matrix.d.ts.map +1 -1
- package/lib/matrix.js +2 -5
- package/lib/matrix.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/permutationvector.d.ts +4 -3
- package/lib/permutationvector.d.ts.map +1 -1
- package/lib/permutationvector.js +5 -5
- package/lib/permutationvector.js.map +1 -1
- package/package.json +15 -15
- package/src/matrix.ts +2 -5
- package/src/packageVersion.ts +1 -1
- package/src/permutationvector.ts +6 -6
package/dist/matrix.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matrix.d.ts","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"matrix.d.ts","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"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"}
|
package/dist/matrix.js
CHANGED
|
@@ -384,7 +384,6 @@ class SharedMatrix extends shared_object_base_1.SharedObject {
|
|
|
384
384
|
break;
|
|
385
385
|
default: {
|
|
386
386
|
(0, common_utils_1.assert)(contents.type === ops_1.MatrixOp.set, 0x021 /* "SharedMatrix message contents have unexpected type!" */);
|
|
387
|
-
const { referenceSequenceNumber: refSeq, clientId } = rawMessage;
|
|
388
387
|
const { row, col } = contents;
|
|
389
388
|
if (local) {
|
|
390
389
|
// We are receiving the ACK for a local pending set operation.
|
|
@@ -396,11 +395,9 @@ class SharedMatrix extends shared_object_base_1.SharedObject {
|
|
|
396
395
|
}
|
|
397
396
|
}
|
|
398
397
|
else {
|
|
399
|
-
const
|
|
400
|
-
const adjustedRow = this.rows.adjustPosition(row, refSeq, rowClientId);
|
|
398
|
+
const adjustedRow = this.rows.adjustPosition(row, rawMessage);
|
|
401
399
|
if (adjustedRow !== undefined) {
|
|
402
|
-
const
|
|
403
|
-
const adjustedCol = this.cols.adjustPosition(col, refSeq, colClientId);
|
|
400
|
+
const adjustedCol = this.cols.adjustPosition(col, rawMessage);
|
|
404
401
|
if (adjustedCol !== undefined) {
|
|
405
402
|
const rowHandle = this.rows.getAllocatedHandle(adjustedRow);
|
|
406
403
|
const colHandle = this.cols.getAllocatedHandle(adjustedCol);
|
package/dist/matrix.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matrix.js","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n IFluidDataStoreRuntime,\n IChannelStorageService,\n Serializable,\n IChannelAttributes,\n} from \"@fluidframework/datastore-definitions\";\nimport {\n IFluidSerializer,\n makeHandlesSerializable,\n parseHandles,\n SharedObject,\n SummarySerializer,\n} from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ObjectStoragePartition, SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport {\n IMatrixProducer,\n IMatrixConsumer,\n IMatrixReader,\n IMatrixWriter,\n} from \"@tiny-calc/nano\";\nimport { MergeTreeDeltaType, IMergeTreeOp, SegmentGroup, ISegment } from \"@fluidframework/merge-tree\";\nimport { MatrixOp } from \"./ops\";\nimport { PermutationVector, PermutationSegment } 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 rows = \"rows\",\n cols = \"cols\",\n cells = \"cells\",\n}\n\ninterface ISetOp<T> {\n type: MatrixOp.set;\n row: number;\n col: number;\n value: MatrixItem<T>;\n}\n\ninterface ISetOpMetadata {\n rowHandle: Handle;\n colHandle: Handle;\n localSeq: 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 */\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 */\nexport class SharedMatrix<T = any>\n extends SharedObject\n implements IMatrixProducer<MatrixItem<T>>,\n IMatrixReader<MatrixItem<T>>,\n IMatrixWriter<MatrixItem<T>> {\n private readonly consumers = new Set<IMatrixConsumer<MatrixItem<T>>>();\n\n public static getFactory() { return new SharedMatrixFactory(); }\n\n private readonly rows: PermutationVector; // Map logical row to storage handle (if any)\n private readonly cols: PermutationVector; // Map logical col to storage handle (if any)\n\n private cells = new SparseArray2D<MatrixItem<T>>(); // Stores cell values.\n private pending = new SparseArray2D<number>(); // Tracks pending writes.\n\n constructor(runtime: IFluidDataStoreRuntime, public id: string, attributes: IChannelAttributes) {\n super(id, runtime, attributes, \"fluid_matrix_\");\n\n this.rows = new PermutationVector(\n SnapshotPath.rows,\n this.logger,\n runtime,\n this.onRowDelta,\n this.onRowHandlesRecycled);\n\n this.cols = new PermutationVector(\n SnapshotPath.cols,\n this.logger,\n runtime,\n this.onColDelta,\n this.onColHandlesRecycled);\n }\n\n private undo?: MatrixUndoProvider<T>;\n\n /**\n * Subscribes the given IUndoConsumer to the matrix.\n */\n public openUndo(consumer: IUndoConsumer) {\n assert(this.undo === undefined,\n 0x019 /* \"SharedMatrix.openUndo() supports at most a single IUndoConsumer.\" */);\n\n this.undo = new MatrixUndoProvider(consumer, this, this.rows, this.cols);\n }\n\n // TODO: closeUndo()?\n\n private get rowHandles() { return this.rows.handleCache; }\n private get colHandles() { return this.cols.handleCache; }\n\n /**\n * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.create}\n */\n public static create<T>(runtime: IFluidDataStoreRuntime, id?: string) {\n return runtime.createChannel(id, SharedMatrixFactory.Type) as SharedMatrix<T>;\n }\n\n // #region IMatrixProducer\n\n openMatrix(\n consumer: IMatrixConsumer<MatrixItem<T>>,\n ): IMatrixReader<MatrixItem<T>> {\n this.consumers.add(consumer);\n return this;\n }\n\n closeMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): void {\n this.consumers.delete(consumer);\n }\n\n // #endregion IMatrixProducer\n\n // #region IMatrixReader\n\n public get rowCount() { return this.rows.getLength(); }\n public get colCount() { return this.cols.getLength(); }\n\n public getCell(row: number, col: number): MatrixItem<T> {\n // Perf: When possible, bounds checking is performed inside the implementation for\n // 'getHandle()' so that it can be elided in the case of a cache hit. This\n // yields an ~40% improvement in the case of a cache hit (node v12 x64)\n\n // Map the logical (row, col) to associated storage handles.\n const rowHandle = this.rowHandles.getHandle(row);\n if (isHandleValid(rowHandle)) {\n const colHandle = this.colHandles.getHandle(col);\n if (isHandleValid(colHandle)) {\n return this.cells.getCell(rowHandle, colHandle);\n }\n } else {\n // If we early exit because the given rowHandle is unallocated, we still need to\n // bounds-check the 'col' parameter.\n ensureRange(col, this.cols.getLength());\n }\n\n return undefined;\n }\n\n public get matrixProducer(): IMatrixProducer<MatrixItem<T>> { return this; }\n\n // #endregion IMatrixReader\n\n public setCell(row: number, col: number, value: MatrixItem<T>) {\n assert(0 <= row && row < this.rowCount\n && 0 <= col && col < this.colCount,\n 0x01a /* \"Trying to set out-of-bounds cell!\" */);\n\n this.setCellCore(row, col, value);\n\n // Avoid reentrancy by raising change notifications after the op is queued.\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(row, col, 1, 1, this);\n }\n }\n\n public setCells(\n rowStart: number,\n colStart: number,\n colCount: number,\n values: readonly (MatrixItem<T>)[],\n ) {\n const rowCount = Math.ceil(values.length / colCount);\n\n assert((0 <= rowStart && rowStart < this.rowCount)\n && (0 <= colStart && colStart < this.colCount)\n && (1 <= colCount && colCount <= (this.colCount - colStart))\n && (rowCount <= (this.rowCount - rowStart)),\n 0x01b /* \"Trying to set multiple out-of-bounds cells!\" */);\n\n const endCol = colStart + colCount;\n let r = rowStart;\n let c = colStart;\n\n for (const value of values) {\n this.setCellCore(r, c, value);\n\n if (++c === endCol) {\n c = colStart;\n r++;\n }\n }\n\n // Avoid reentrancy by raising change notifications after the op is queued.\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(rowStart, colStart, rowCount, colCount, this);\n }\n }\n\n private setCellCore(\n row: number,\n col: number,\n value: MatrixItem<T>,\n rowHandle = this.rows.getAllocatedHandle(row),\n colHandle = this.cols.getAllocatedHandle(col),\n ) {\n if (this.undo !== undefined) {\n let oldValue = this.cells.getCell(rowHandle, colHandle);\n if (oldValue === null) {\n oldValue = undefined;\n }\n\n this.undo.cellSet(\n rowHandle,\n colHandle,\n oldValue);\n }\n\n this.cells.setCell(rowHandle, colHandle, value);\n\n if (this.isAttached()) {\n this.sendSetCellOp(row, col, value, rowHandle, colHandle);\n }\n }\n\n private sendSetCellOp(\n row: number,\n col: number,\n value: MatrixItem<T>,\n rowHandle: Handle,\n colHandle: Handle,\n localSeq = this.nextLocalSeq(),\n ) {\n assert(this.isAttached(), 0x1e2 /* \"Caller must ensure 'isAttached()' before calling 'sendSetCellOp'.\" */);\n\n const op: ISetOp<T> = {\n type: MatrixOp.set,\n row,\n col,\n value,\n };\n\n const metadata: ISetOpMetadata = {\n rowHandle,\n colHandle,\n localSeq,\n };\n\n this.submitLocalMessage(op, metadata);\n this.pending.setCell(rowHandle, colHandle, localSeq);\n }\n\n private submitVectorMessage(\n currentVector: PermutationVector,\n oppositeVector: PermutationVector,\n dimension: SnapshotPath.rows | SnapshotPath.cols,\n message: any,\n ) {\n // Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n // and the SharedMatrix's cell data. Instead, we externally advance each MergeTree's 'localSeq' counter\n // for each submitted op it not aware of to keep them synchronized.\n const localSeq = currentVector.getCollabWindow().localSeq;\n const oppositeWindow = oppositeVector.getCollabWindow();\n\n // Note that the comparison is '>=' because, in the case the MergeTree is regenerating ops for reconnection,\n // the MergeTree submits the op with the original 'localSeq'.\n assert(localSeq >= oppositeWindow.localSeq,\n 0x01c /* \"The 'localSeq' of the vector submitting an op must >= the 'localSeq' of the other vector.\" */);\n\n oppositeWindow.localSeq = localSeq;\n\n // If the SharedMatrix is local, it's state will be submitted via a Snapshot when initially connected.\n // Do not queue a message or track the pending op, as there will never be an ACK, etc.\n if (this.isAttached()) {\n // Record whether this `op` targets rows or cols. (See dispatch in `processCore()`)\n message.target = dimension;\n\n this.submitLocalMessage(\n message,\n currentVector.peekPendingSegmentGroups(\n message.type === MergeTreeDeltaType.GROUP\n ? message.ops.length\n : 1));\n }\n }\n\n private submitColMessage(message: any) {\n this.submitVectorMessage(this.cols, this.rows, SnapshotPath.cols, message);\n }\n\n public insertCols(colStart: number, count: number) {\n this.submitColMessage(this.cols.insert(colStart, count));\n }\n\n public removeCols(colStart: number, count: number) {\n this.submitColMessage(this.cols.remove(colStart, count));\n }\n\n private submitRowMessage(message: any) {\n this.submitVectorMessage(this.rows, this.cols, SnapshotPath.rows, message);\n }\n\n public insertRows(rowStart: number, count: number) {\n this.submitRowMessage(this.rows.insert(rowStart, count));\n }\n\n public removeRows(rowStart: number, count: number) {\n this.submitRowMessage(this.rows.remove(rowStart, count));\n }\n\n /** @internal */ public _undoRemoveRows(segment: ISegment) {\n const original = segment as PermutationSegment;\n\n // (Re)insert the removed number of rows at the original position.\n const { op, inserted } = this.rows.insertRelative(original, original.cachedLength);\n this.submitRowMessage(op);\n\n // Transfer handles and undo/redo tracking groups from the original segment to the\n // newly inserted segment.\n original.transferToReplacement(inserted);\n\n // Invalidate the handleCache in case it was populated during the 'rowsChanged'\n // callback, which occurs before the handle span is populated.\n const rowStart = this.rows.getPosition(inserted);\n this.rows.handleCache.itemsChanged(\n rowStart,\n /* removedCount: */ 0,\n /* insertedCount: */ inserted.cachedLength);\n\n // Generate setCell ops for each populated cell in the reinserted rows.\n let rowHandle = inserted.start;\n const rowCount = inserted.cachedLength;\n for (let row = rowStart; row < rowStart + rowCount; row++, rowHandle++) {\n for (let col = 0; col < this.colCount; col++) {\n const colHandle = this.colHandles.getHandle(col);\n const value = this.cells.getCell(rowHandle, colHandle);\n if (this.isAttached() && value !== undefined && value !== null) {\n this.sendSetCellOp(\n row,\n col,\n value,\n rowHandle,\n colHandle);\n }\n }\n }\n\n // Avoid reentrancy by raising change notifications after the op is queued.\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(rowStart, /* colStart: */ 0, rowCount, this.colCount, this);\n }\n }\n\n /** @internal */ public _undoRemoveCols(segment: ISegment) {\n const original = segment as PermutationSegment;\n\n // (Re)insert the removed number of columns at the original position.\n const { op, inserted } = this.cols.insertRelative(original, original.cachedLength);\n this.submitColMessage(op);\n\n // Transfer handles and undo/redo tracking groups from the original segment to the\n // newly inserted segment.\n original.transferToReplacement(inserted);\n\n // Invalidate the handleCache in case it was populated during the 'colsChanged'\n // callback, which occurs before the handle span is populated.\n const colStart = this.cols.getPosition(inserted);\n this.cols.handleCache.itemsChanged(\n colStart,\n /* removedCount: */ 0,\n /* insertedCount: */ inserted.cachedLength);\n\n // Generate setCell ops for each populated cell in the reinserted cols.\n let colHandle = inserted.start;\n const colCount = inserted.cachedLength;\n for (let col = colStart; col < colStart + colCount; col++, colHandle++) {\n for (let row = 0; row < this.rowCount; row++) {\n const rowHandle = this.rowHandles.getHandle(row);\n const value = this.cells.getCell(rowHandle, colHandle);\n if (this.isAttached() && value !== undefined && value !== null) {\n this.sendSetCellOp(\n row,\n col,\n value,\n rowHandle,\n colHandle);\n }\n }\n }\n\n // Avoid reentrancy by raising change notifications after the op is queued.\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(/* rowStart: */ 0, colStart, this.rowCount, colCount, this);\n }\n }\n\n protected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n const builder = new SummaryTreeBuilder();\n builder.addWithStats(SnapshotPath.rows, this.rows.summarize(this.runtime, this.handle, serializer));\n builder.addWithStats(SnapshotPath.cols, this.cols.summarize(this.runtime, this.handle, serializer));\n builder.addBlob(SnapshotPath.cells,\n serializer.stringify([\n this.cells.snapshot(),\n this.pending.snapshot(),\n ], this.handle));\n return builder.getSummaryTree();\n }\n\n /**\n * Runs serializer on the GC data for this SharedMatrix.\n * All the IFluidHandle's stored in the cells represent routes to other objects.\n */\n protected processGCDataCore(serializer: SummarySerializer) {\n for (let row = 0; row < this.rowCount; row++) {\n for (let col = 0; col < this.colCount; col++) {\n serializer.stringify(this.getCell(row, col), this.handle);\n }\n }\n }\n\n /**\n * Advances the 'localSeq' counter for the cell data operation currently being queued.\n *\n * Do not use with 'submitColMessage()/submitRowMessage()' as these helpers + the MergeTree will\n * automatically advance 'localSeq'.\n */\n private nextLocalSeq() {\n // Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n // and the SharedMatrix's cell data. Instead, we externally bump each MergeTree's 'localSeq' counter\n // for SharedMatrix ops it's not aware of to keep them synchronized. (For cell data operations, we\n // need to bump both counters.)\n\n this.cols.getCollabWindow().localSeq++;\n return ++this.rows.getCollabWindow().localSeq;\n }\n\n protected submitLocalMessage(message: any, localOpMetadata?: any) {\n // TODO: Recommend moving this assertion into SharedObject\n // (See https://github.com/microsoft/FluidFramework/issues/2559)\n assert(this.isAttached() === true, 0x01d /* \"Trying to submit message to runtime while detached!\" */);\n\n super.submitLocalMessage(makeHandlesSerializable(message, this.serializer, this.handle), localOpMetadata);\n\n // Ensure that row/col 'localSeq' are synchronized (see 'nextLocalSeq()').\n assert(\n this.rows.getCollabWindow().localSeq === this.cols.getCollabWindow().localSeq,\n 0x01e /* \"Row and col collab window 'localSeq' desynchronized!\" */,\n );\n }\n\n protected didAttach() {\n // We've attached we need to start generating and sending ops.\n // so start collaboration and provide a default client id incase we are not connected\n if (this.isAttached()) {\n this.rows.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n this.cols.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n }\n }\n\n protected onConnect() {\n assert(this.rows.getCollabWindow().collaborating === this.cols.getCollabWindow().collaborating,\n 0x01f /* \"Row and col collab window 'collaborating' status desynchronized!\" */);\n\n // Update merge tree collaboration information with new client ID and then resend pending ops\n this.rows.startOrUpdateCollaboration(this.runtime.clientId as string);\n this.cols.startOrUpdateCollaboration(this.runtime.clientId as string);\n }\n\n protected reSubmitCore(content: any, localOpMetadata: unknown) {\n switch (content.target) {\n case SnapshotPath.cols:\n this.submitColMessage(this.cols.regeneratePendingOp(\n content as IMergeTreeOp,\n localOpMetadata as SegmentGroup | SegmentGroup[]));\n break;\n case SnapshotPath.rows:\n this.submitRowMessage(this.rows.regeneratePendingOp(\n content as IMergeTreeOp,\n localOpMetadata as SegmentGroup | SegmentGroup[]));\n break;\n default: {\n assert(content.type === MatrixOp.set, 0x020 /* \"Unknown SharedMatrix 'op' type.\" */);\n\n const setOp = content as ISetOp<T>;\n const { rowHandle, colHandle, localSeq } = localOpMetadata as ISetOpMetadata;\n\n // If there are more pending local writes to the same row/col handle, it is important\n // to skip resubmitting this op since it is possible the row/col handle has been recycled\n // and now refers to a different position than when this op was originally submitted.\n if (this.isLatestPendingWrite(rowHandle, colHandle, localSeq)) {\n const row = this.rows.handleToPosition(rowHandle, localSeq);\n const col = this.cols.handleToPosition(colHandle, localSeq);\n\n if (row >= 0 && col >= 0) {\n this.sendSetCellOp(\n row,\n col,\n setOp.value,\n rowHandle,\n colHandle,\n localSeq,\n );\n }\n }\n break;\n }\n }\n }\n\n protected onDisconnect() {}\n\n /**\n * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n */\n protected async loadCore(storage: IChannelStorageService) {\n try {\n await this.rows.load(\n this.runtime,\n new ObjectStoragePartition(storage, SnapshotPath.rows),\n this.serializer);\n await this.cols.load(\n this.runtime,\n new ObjectStoragePartition(storage, SnapshotPath.cols),\n this.serializer);\n const [cellData, pendingCliSeqData] = await deserializeBlob(storage, SnapshotPath.cells, this.serializer);\n\n this.cells = SparseArray2D.load(cellData);\n this.pending = SparseArray2D.load(pendingCliSeqData);\n } catch (error) {\n this.logger.sendErrorEvent({ eventName: \"MatrixLoadFailed\" }, error);\n }\n }\n\n protected processCore(rawMessage: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n const msg = parseHandles(rawMessage, this.serializer);\n\n const contents = msg.contents;\n\n switch (contents.target) {\n case SnapshotPath.cols:\n this.cols.applyMsg(msg, local);\n break;\n case SnapshotPath.rows:\n this.rows.applyMsg(msg, local);\n break;\n default: {\n assert(contents.type === MatrixOp.set,\n 0x021 /* \"SharedMatrix message contents have unexpected type!\" */);\n\n const { referenceSequenceNumber: refSeq, clientId } = rawMessage;\n const { row, col } = contents;\n\n if (local) {\n // We are receiving the ACK for a local pending set operation.\n const { rowHandle, colHandle, localSeq } = localOpMetadata as ISetOpMetadata;\n\n // If this is the most recent write to the cell by the local client, remove our\n // entry from 'pendingCliSeqs' to resume allowing remote writes.\n if (this.isLatestPendingWrite(rowHandle, colHandle, localSeq)) {\n this.pending.setCell(rowHandle, colHandle, undefined);\n }\n } else {\n const rowClientId = this.rows.getOrAddShortClientId(clientId);\n const adjustedRow = this.rows.adjustPosition(row, refSeq, rowClientId);\n\n if (adjustedRow !== undefined) {\n const colClientId = this.cols.getOrAddShortClientId(clientId);\n const adjustedCol = this.cols.adjustPosition(col, refSeq, colClientId);\n\n if (adjustedCol !== undefined) {\n const rowHandle = this.rows.getAllocatedHandle(adjustedRow);\n const colHandle = this.cols.getAllocatedHandle(adjustedCol);\n\n assert(isHandleValid(rowHandle) && isHandleValid(colHandle),\n 0x022 /* \"SharedMatrix row and/or col handles are invalid!\" */);\n\n // If there is a pending (unACKed) local write to the same cell, skip the current op\n // since it \"happened before\" the pending write.\n if (this.pending.getCell(rowHandle, colHandle) === undefined) {\n const { value } = contents;\n this.cells.setCell(rowHandle, colHandle, value);\n\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(adjustedRow, adjustedCol, 1, 1, this);\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Invoked by PermutationVector to notify IMatrixConsumers of row insertion/deletions.\n private readonly onRowDelta = (position: number, removedCount: number, insertedCount: number) => {\n for (const consumer of this.consumers) {\n consumer.rowsChanged(position, removedCount, insertedCount, this);\n }\n };\n\n // Invoked by PermutationVector to notify IMatrixConsumers of col insertion/deletions.\n private readonly onColDelta = (position: number, removedCount: number, insertedCount: number) => {\n for (const consumer of this.consumers) {\n consumer.colsChanged(position, removedCount, insertedCount, this);\n }\n };\n\n private readonly onRowHandlesRecycled = (rowHandles: Handle[]) => {\n for (const rowHandle of rowHandles) {\n this.cells.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n this.pending.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n }\n };\n\n private readonly onColHandlesRecycled = (colHandles: Handle[]) => {\n for (const colHandle of colHandles) {\n this.cells.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n this.pending.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n }\n };\n\n /**\n * Returns true if the latest pending write to the cell indicated by the given row/col handles\n * matches the given 'localSeq'.\n *\n * A return value of `true` indicates that there are no later local operations queued that will\n * clobber the write op at the given 'localSeq'. This includes later ops that overwrite the cell\n * with a different value as well as row/col removals that might recycled the given row/col handles.\n */\n private isLatestPendingWrite(rowHandle: Handle, colHandle: Handle, localSeq: number) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const pendingLocalSeq = this.pending.getCell(rowHandle, colHandle)!;\n\n // Note while we're awaiting the ACK for a local set, it's possible for the row/col to be\n // locally removed and the row/col handles recycled. If this happens, the pendingLocalSeq will\n // be 'undefined' or > 'localSeq'.\n assert(!(pendingLocalSeq < localSeq),\n // eslint-disable-next-line max-len\n 0x023 /* \"The 'localSeq' of pending write (if any) must be <= the localSeq of the currently processed op.\" */);\n\n // If this is the most recent write to the cell by the local client, the stored localSeq\n // will be an exact match for the given 'localSeq'.\n return pendingLocalSeq === localSeq;\n }\n\n public toString() {\n let s = `client:${this.runtime.clientId}\\nrows: ${this.rows.toString()}\\ncols: ${this.cols.toString()}\\n\\n`;\n\n for (let r = 0; r < this.rowCount; r++) {\n s += ` [`;\n for (let c = 0; c < this.colCount; c++) {\n if (c > 0) {\n s += \", \";\n }\n\n s += `${this.serializer.stringify(this.getCell(r, c), this.handle)}`;\n }\n s += \"]\\n\";\n }\n\n return `${s}\\n`;\n }\n\n /**\n * {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}\n */\n protected applyStashedOp(content: any): unknown {\n if (content.target === SnapshotPath.cols || content.target === SnapshotPath.rows) {\n const op = content as IMergeTreeOp;\n const currentVector = content.target === SnapshotPath.cols ? this.cols : this.rows;\n const oppositeVector = content.target === SnapshotPath.cols ? this.rows : this.cols;\n const metadata = currentVector.applyStashedOp(op);\n const localSeq = currentVector.getCollabWindow().localSeq;\n const oppositeWindow = oppositeVector.getCollabWindow();\n\n assert(\n localSeq > oppositeWindow.localSeq,\n 0x2d9,\n /* \"The 'localSeq' of the vector applying stashed op must > the 'localSeq' of the other vector.\" */\n );\n\n oppositeWindow.localSeq = localSeq;\n\n return metadata;\n } else {\n assert(content.type === MatrixOp.set, 0x2da /* \"Unknown SharedMatrix 'op' type.\" */);\n\n const setOp = content as ISetOp<T>;\n const rowHandle = this.rows.getAllocatedHandle(setOp.row);\n const colHandle = this.cols.getAllocatedHandle(setOp.col);\n if (this.undo !== undefined) {\n let oldValue = this.cells.getCell(rowHandle, colHandle);\n if (oldValue === null) {\n oldValue = undefined;\n }\n\n this.undo.cellSet(\n rowHandle,\n colHandle,\n oldValue);\n }\n\n this.cells.setCell(rowHandle, colHandle, setOp.value);\n const localSeq = this.nextLocalSeq();\n const metadata: ISetOpMetadata = {\n rowHandle,\n colHandle,\n localSeq,\n };\n\n this.pending.setCell(rowHandle, colHandle, localSeq);\n return metadata;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"matrix.js","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n IFluidDataStoreRuntime,\n IChannelStorageService,\n Serializable,\n IChannelAttributes,\n} from \"@fluidframework/datastore-definitions\";\nimport {\n IFluidSerializer,\n makeHandlesSerializable,\n parseHandles,\n SharedObject,\n SummarySerializer,\n} from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ObjectStoragePartition, SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport {\n IMatrixProducer,\n IMatrixConsumer,\n IMatrixReader,\n IMatrixWriter,\n} from \"@tiny-calc/nano\";\nimport { MergeTreeDeltaType, IMergeTreeOp, SegmentGroup, ISegment } from \"@fluidframework/merge-tree\";\nimport { MatrixOp } from \"./ops\";\nimport { PermutationVector, PermutationSegment } 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 rows = \"rows\",\n cols = \"cols\",\n cells = \"cells\",\n}\n\ninterface ISetOp<T> {\n type: MatrixOp.set;\n row: number;\n col: number;\n value: MatrixItem<T>;\n}\n\ninterface ISetOpMetadata {\n rowHandle: Handle;\n colHandle: Handle;\n localSeq: 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 */\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 */\nexport class SharedMatrix<T = any>\n extends SharedObject\n implements IMatrixProducer<MatrixItem<T>>,\n IMatrixReader<MatrixItem<T>>,\n IMatrixWriter<MatrixItem<T>> {\n private readonly consumers = new Set<IMatrixConsumer<MatrixItem<T>>>();\n\n public static getFactory() { return new SharedMatrixFactory(); }\n\n private readonly rows: PermutationVector; // Map logical row to storage handle (if any)\n private readonly cols: PermutationVector; // Map logical col to storage handle (if any)\n\n private cells = new SparseArray2D<MatrixItem<T>>(); // Stores cell values.\n private pending = new SparseArray2D<number>(); // Tracks pending writes.\n\n constructor(runtime: IFluidDataStoreRuntime, public id: string, attributes: IChannelAttributes) {\n super(id, runtime, attributes, \"fluid_matrix_\");\n\n this.rows = new PermutationVector(\n SnapshotPath.rows,\n this.logger,\n runtime,\n this.onRowDelta,\n this.onRowHandlesRecycled);\n\n this.cols = new PermutationVector(\n SnapshotPath.cols,\n this.logger,\n runtime,\n this.onColDelta,\n this.onColHandlesRecycled);\n }\n\n private undo?: MatrixUndoProvider<T>;\n\n /**\n * Subscribes the given IUndoConsumer to the matrix.\n */\n public openUndo(consumer: IUndoConsumer) {\n assert(this.undo === undefined,\n 0x019 /* \"SharedMatrix.openUndo() supports at most a single IUndoConsumer.\" */);\n\n this.undo = new MatrixUndoProvider(consumer, this, this.rows, this.cols);\n }\n\n // TODO: closeUndo()?\n\n private get rowHandles() { return this.rows.handleCache; }\n private get colHandles() { return this.cols.handleCache; }\n\n /**\n * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.create}\n */\n public static create<T>(runtime: IFluidDataStoreRuntime, id?: string) {\n return runtime.createChannel(id, SharedMatrixFactory.Type) as SharedMatrix<T>;\n }\n\n // #region IMatrixProducer\n\n openMatrix(\n consumer: IMatrixConsumer<MatrixItem<T>>,\n ): IMatrixReader<MatrixItem<T>> {\n this.consumers.add(consumer);\n return this;\n }\n\n closeMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): void {\n this.consumers.delete(consumer);\n }\n\n // #endregion IMatrixProducer\n\n // #region IMatrixReader\n\n public get rowCount() { return this.rows.getLength(); }\n public get colCount() { return this.cols.getLength(); }\n\n public getCell(row: number, col: number): MatrixItem<T> {\n // Perf: When possible, bounds checking is performed inside the implementation for\n // 'getHandle()' so that it can be elided in the case of a cache hit. This\n // yields an ~40% improvement in the case of a cache hit (node v12 x64)\n\n // Map the logical (row, col) to associated storage handles.\n const rowHandle = this.rowHandles.getHandle(row);\n if (isHandleValid(rowHandle)) {\n const colHandle = this.colHandles.getHandle(col);\n if (isHandleValid(colHandle)) {\n return this.cells.getCell(rowHandle, colHandle);\n }\n } else {\n // If we early exit because the given rowHandle is unallocated, we still need to\n // bounds-check the 'col' parameter.\n ensureRange(col, this.cols.getLength());\n }\n\n return undefined;\n }\n\n public get matrixProducer(): IMatrixProducer<MatrixItem<T>> { return this; }\n\n // #endregion IMatrixReader\n\n public setCell(row: number, col: number, value: MatrixItem<T>) {\n assert(0 <= row && row < this.rowCount\n && 0 <= col && col < this.colCount,\n 0x01a /* \"Trying to set out-of-bounds cell!\" */);\n\n this.setCellCore(row, col, value);\n\n // Avoid reentrancy by raising change notifications after the op is queued.\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(row, col, 1, 1, this);\n }\n }\n\n public setCells(\n rowStart: number,\n colStart: number,\n colCount: number,\n values: readonly (MatrixItem<T>)[],\n ) {\n const rowCount = Math.ceil(values.length / colCount);\n\n assert((0 <= rowStart && rowStart < this.rowCount)\n && (0 <= colStart && colStart < this.colCount)\n && (1 <= colCount && colCount <= (this.colCount - colStart))\n && (rowCount <= (this.rowCount - rowStart)),\n 0x01b /* \"Trying to set multiple out-of-bounds cells!\" */);\n\n const endCol = colStart + colCount;\n let r = rowStart;\n let c = colStart;\n\n for (const value of values) {\n this.setCellCore(r, c, value);\n\n if (++c === endCol) {\n c = colStart;\n r++;\n }\n }\n\n // Avoid reentrancy by raising change notifications after the op is queued.\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(rowStart, colStart, rowCount, colCount, this);\n }\n }\n\n private setCellCore(\n row: number,\n col: number,\n value: MatrixItem<T>,\n rowHandle = this.rows.getAllocatedHandle(row),\n colHandle = this.cols.getAllocatedHandle(col),\n ) {\n if (this.undo !== undefined) {\n let oldValue = this.cells.getCell(rowHandle, colHandle);\n if (oldValue === null) {\n oldValue = undefined;\n }\n\n this.undo.cellSet(\n rowHandle,\n colHandle,\n oldValue);\n }\n\n this.cells.setCell(rowHandle, colHandle, value);\n\n if (this.isAttached()) {\n this.sendSetCellOp(row, col, value, rowHandle, colHandle);\n }\n }\n\n private sendSetCellOp(\n row: number,\n col: number,\n value: MatrixItem<T>,\n rowHandle: Handle,\n colHandle: Handle,\n localSeq = this.nextLocalSeq(),\n ) {\n assert(this.isAttached(), 0x1e2 /* \"Caller must ensure 'isAttached()' before calling 'sendSetCellOp'.\" */);\n\n const op: ISetOp<T> = {\n type: MatrixOp.set,\n row,\n col,\n value,\n };\n\n const metadata: ISetOpMetadata = {\n rowHandle,\n colHandle,\n localSeq,\n };\n\n this.submitLocalMessage(op, metadata);\n this.pending.setCell(rowHandle, colHandle, localSeq);\n }\n\n private submitVectorMessage(\n currentVector: PermutationVector,\n oppositeVector: PermutationVector,\n dimension: SnapshotPath.rows | SnapshotPath.cols,\n message: any,\n ) {\n // Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n // and the SharedMatrix's cell data. Instead, we externally advance each MergeTree's 'localSeq' counter\n // for each submitted op it not aware of to keep them synchronized.\n const localSeq = currentVector.getCollabWindow().localSeq;\n const oppositeWindow = oppositeVector.getCollabWindow();\n\n // Note that the comparison is '>=' because, in the case the MergeTree is regenerating ops for reconnection,\n // the MergeTree submits the op with the original 'localSeq'.\n assert(localSeq >= oppositeWindow.localSeq,\n 0x01c /* \"The 'localSeq' of the vector submitting an op must >= the 'localSeq' of the other vector.\" */);\n\n oppositeWindow.localSeq = localSeq;\n\n // If the SharedMatrix is local, it's state will be submitted via a Snapshot when initially connected.\n // Do not queue a message or track the pending op, as there will never be an ACK, etc.\n if (this.isAttached()) {\n // Record whether this `op` targets rows or cols. (See dispatch in `processCore()`)\n message.target = dimension;\n\n this.submitLocalMessage(\n message,\n currentVector.peekPendingSegmentGroups(\n message.type === MergeTreeDeltaType.GROUP\n ? message.ops.length\n : 1));\n }\n }\n\n private submitColMessage(message: any) {\n this.submitVectorMessage(this.cols, this.rows, SnapshotPath.cols, message);\n }\n\n public insertCols(colStart: number, count: number) {\n this.submitColMessage(this.cols.insert(colStart, count));\n }\n\n public removeCols(colStart: number, count: number) {\n this.submitColMessage(this.cols.remove(colStart, count));\n }\n\n private submitRowMessage(message: any) {\n this.submitVectorMessage(this.rows, this.cols, SnapshotPath.rows, message);\n }\n\n public insertRows(rowStart: number, count: number) {\n this.submitRowMessage(this.rows.insert(rowStart, count));\n }\n\n public removeRows(rowStart: number, count: number) {\n this.submitRowMessage(this.rows.remove(rowStart, count));\n }\n\n /** @internal */ public _undoRemoveRows(segment: ISegment) {\n const original = segment as PermutationSegment;\n\n // (Re)insert the removed number of rows at the original position.\n const { op, inserted } = this.rows.insertRelative(original, original.cachedLength);\n this.submitRowMessage(op);\n\n // Transfer handles and undo/redo tracking groups from the original segment to the\n // newly inserted segment.\n original.transferToReplacement(inserted);\n\n // Invalidate the handleCache in case it was populated during the 'rowsChanged'\n // callback, which occurs before the handle span is populated.\n const rowStart = this.rows.getPosition(inserted);\n this.rows.handleCache.itemsChanged(\n rowStart,\n /* removedCount: */ 0,\n /* insertedCount: */ inserted.cachedLength);\n\n // Generate setCell ops for each populated cell in the reinserted rows.\n let rowHandle = inserted.start;\n const rowCount = inserted.cachedLength;\n for (let row = rowStart; row < rowStart + rowCount; row++, rowHandle++) {\n for (let col = 0; col < this.colCount; col++) {\n const colHandle = this.colHandles.getHandle(col);\n const value = this.cells.getCell(rowHandle, colHandle);\n if (this.isAttached() && value !== undefined && value !== null) {\n this.sendSetCellOp(\n row,\n col,\n value,\n rowHandle,\n colHandle);\n }\n }\n }\n\n // Avoid reentrancy by raising change notifications after the op is queued.\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(rowStart, /* colStart: */ 0, rowCount, this.colCount, this);\n }\n }\n\n /** @internal */ public _undoRemoveCols(segment: ISegment) {\n const original = segment as PermutationSegment;\n\n // (Re)insert the removed number of columns at the original position.\n const { op, inserted } = this.cols.insertRelative(original, original.cachedLength);\n this.submitColMessage(op);\n\n // Transfer handles and undo/redo tracking groups from the original segment to the\n // newly inserted segment.\n original.transferToReplacement(inserted);\n\n // Invalidate the handleCache in case it was populated during the 'colsChanged'\n // callback, which occurs before the handle span is populated.\n const colStart = this.cols.getPosition(inserted);\n this.cols.handleCache.itemsChanged(\n colStart,\n /* removedCount: */ 0,\n /* insertedCount: */ inserted.cachedLength);\n\n // Generate setCell ops for each populated cell in the reinserted cols.\n let colHandle = inserted.start;\n const colCount = inserted.cachedLength;\n for (let col = colStart; col < colStart + colCount; col++, colHandle++) {\n for (let row = 0; row < this.rowCount; row++) {\n const rowHandle = this.rowHandles.getHandle(row);\n const value = this.cells.getCell(rowHandle, colHandle);\n if (this.isAttached() && value !== undefined && value !== null) {\n this.sendSetCellOp(\n row,\n col,\n value,\n rowHandle,\n colHandle);\n }\n }\n }\n\n // Avoid reentrancy by raising change notifications after the op is queued.\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(/* rowStart: */ 0, colStart, this.rowCount, colCount, this);\n }\n }\n\n protected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n const builder = new SummaryTreeBuilder();\n builder.addWithStats(SnapshotPath.rows, this.rows.summarize(this.runtime, this.handle, serializer));\n builder.addWithStats(SnapshotPath.cols, this.cols.summarize(this.runtime, this.handle, serializer));\n builder.addBlob(SnapshotPath.cells,\n serializer.stringify([\n this.cells.snapshot(),\n this.pending.snapshot(),\n ], this.handle));\n return builder.getSummaryTree();\n }\n\n /**\n * Runs serializer on the GC data for this SharedMatrix.\n * All the IFluidHandle's stored in the cells represent routes to other objects.\n */\n protected processGCDataCore(serializer: SummarySerializer) {\n for (let row = 0; row < this.rowCount; row++) {\n for (let col = 0; col < this.colCount; col++) {\n serializer.stringify(this.getCell(row, col), this.handle);\n }\n }\n }\n\n /**\n * Advances the 'localSeq' counter for the cell data operation currently being queued.\n *\n * Do not use with 'submitColMessage()/submitRowMessage()' as these helpers + the MergeTree will\n * automatically advance 'localSeq'.\n */\n private nextLocalSeq() {\n // Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n // and the SharedMatrix's cell data. Instead, we externally bump each MergeTree's 'localSeq' counter\n // for SharedMatrix ops it's not aware of to keep them synchronized. (For cell data operations, we\n // need to bump both counters.)\n\n this.cols.getCollabWindow().localSeq++;\n return ++this.rows.getCollabWindow().localSeq;\n }\n\n protected submitLocalMessage(message: any, localOpMetadata?: any) {\n // TODO: Recommend moving this assertion into SharedObject\n // (See https://github.com/microsoft/FluidFramework/issues/2559)\n assert(this.isAttached() === true, 0x01d /* \"Trying to submit message to runtime while detached!\" */);\n\n super.submitLocalMessage(makeHandlesSerializable(message, this.serializer, this.handle), localOpMetadata);\n\n // Ensure that row/col 'localSeq' are synchronized (see 'nextLocalSeq()').\n assert(\n this.rows.getCollabWindow().localSeq === this.cols.getCollabWindow().localSeq,\n 0x01e /* \"Row and col collab window 'localSeq' desynchronized!\" */,\n );\n }\n\n protected didAttach() {\n // We've attached we need to start generating and sending ops.\n // so start collaboration and provide a default client id incase we are not connected\n if (this.isAttached()) {\n this.rows.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n this.cols.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n }\n }\n\n protected onConnect() {\n assert(this.rows.getCollabWindow().collaborating === this.cols.getCollabWindow().collaborating,\n 0x01f /* \"Row and col collab window 'collaborating' status desynchronized!\" */);\n\n // Update merge tree collaboration information with new client ID and then resend pending ops\n this.rows.startOrUpdateCollaboration(this.runtime.clientId as string);\n this.cols.startOrUpdateCollaboration(this.runtime.clientId as string);\n }\n\n protected reSubmitCore(content: any, localOpMetadata: unknown) {\n switch (content.target) {\n case SnapshotPath.cols:\n this.submitColMessage(this.cols.regeneratePendingOp(\n content as IMergeTreeOp,\n localOpMetadata as SegmentGroup | SegmentGroup[]));\n break;\n case SnapshotPath.rows:\n this.submitRowMessage(this.rows.regeneratePendingOp(\n content as IMergeTreeOp,\n localOpMetadata as SegmentGroup | SegmentGroup[]));\n break;\n default: {\n assert(content.type === MatrixOp.set, 0x020 /* \"Unknown SharedMatrix 'op' type.\" */);\n\n const setOp = content as ISetOp<T>;\n const { rowHandle, colHandle, localSeq } = localOpMetadata as ISetOpMetadata;\n\n // If there are more pending local writes to the same row/col handle, it is important\n // to skip resubmitting this op since it is possible the row/col handle has been recycled\n // and now refers to a different position than when this op was originally submitted.\n if (this.isLatestPendingWrite(rowHandle, colHandle, localSeq)) {\n const row = this.rows.handleToPosition(rowHandle, localSeq);\n const col = this.cols.handleToPosition(colHandle, localSeq);\n\n if (row >= 0 && col >= 0) {\n this.sendSetCellOp(\n row,\n col,\n setOp.value,\n rowHandle,\n colHandle,\n localSeq,\n );\n }\n }\n break;\n }\n }\n }\n\n protected onDisconnect() {}\n\n /**\n * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n */\n protected async loadCore(storage: IChannelStorageService) {\n try {\n await this.rows.load(\n this.runtime,\n new ObjectStoragePartition(storage, SnapshotPath.rows),\n this.serializer);\n await this.cols.load(\n this.runtime,\n new ObjectStoragePartition(storage, SnapshotPath.cols),\n this.serializer);\n const [cellData, pendingCliSeqData] = await deserializeBlob(storage, SnapshotPath.cells, this.serializer);\n\n this.cells = SparseArray2D.load(cellData);\n this.pending = SparseArray2D.load(pendingCliSeqData);\n } catch (error) {\n this.logger.sendErrorEvent({ eventName: \"MatrixLoadFailed\" }, error);\n }\n }\n\n protected processCore(rawMessage: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n const msg = parseHandles(rawMessage, this.serializer);\n\n const contents = msg.contents;\n\n switch (contents.target) {\n case SnapshotPath.cols:\n this.cols.applyMsg(msg, local);\n break;\n case SnapshotPath.rows:\n this.rows.applyMsg(msg, local);\n break;\n default: {\n assert(contents.type === MatrixOp.set,\n 0x021 /* \"SharedMatrix message contents have unexpected type!\" */);\n\n const { row, col } = contents;\n\n if (local) {\n // We are receiving the ACK for a local pending set operation.\n const { rowHandle, colHandle, localSeq } = localOpMetadata as ISetOpMetadata;\n\n // If this is the most recent write to the cell by the local client, remove our\n // entry from 'pendingCliSeqs' to resume allowing remote writes.\n if (this.isLatestPendingWrite(rowHandle, colHandle, localSeq)) {\n this.pending.setCell(rowHandle, colHandle, undefined);\n }\n } else {\n const adjustedRow = this.rows.adjustPosition(row, rawMessage);\n\n if (adjustedRow !== undefined) {\n const adjustedCol = this.cols.adjustPosition(col, rawMessage);\n\n if (adjustedCol !== undefined) {\n const rowHandle = this.rows.getAllocatedHandle(adjustedRow);\n const colHandle = this.cols.getAllocatedHandle(adjustedCol);\n\n assert(isHandleValid(rowHandle) && isHandleValid(colHandle),\n 0x022 /* \"SharedMatrix row and/or col handles are invalid!\" */);\n\n // If there is a pending (unACKed) local write to the same cell, skip the current op\n // since it \"happened before\" the pending write.\n if (this.pending.getCell(rowHandle, colHandle) === undefined) {\n const { value } = contents;\n this.cells.setCell(rowHandle, colHandle, value);\n\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(adjustedRow, adjustedCol, 1, 1, this);\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Invoked by PermutationVector to notify IMatrixConsumers of row insertion/deletions.\n private readonly onRowDelta = (position: number, removedCount: number, insertedCount: number) => {\n for (const consumer of this.consumers) {\n consumer.rowsChanged(position, removedCount, insertedCount, this);\n }\n };\n\n // Invoked by PermutationVector to notify IMatrixConsumers of col insertion/deletions.\n private readonly onColDelta = (position: number, removedCount: number, insertedCount: number) => {\n for (const consumer of this.consumers) {\n consumer.colsChanged(position, removedCount, insertedCount, this);\n }\n };\n\n private readonly onRowHandlesRecycled = (rowHandles: Handle[]) => {\n for (const rowHandle of rowHandles) {\n this.cells.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n this.pending.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n }\n };\n\n private readonly onColHandlesRecycled = (colHandles: Handle[]) => {\n for (const colHandle of colHandles) {\n this.cells.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n this.pending.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n }\n };\n\n /**\n * Returns true if the latest pending write to the cell indicated by the given row/col handles\n * matches the given 'localSeq'.\n *\n * A return value of `true` indicates that there are no later local operations queued that will\n * clobber the write op at the given 'localSeq'. This includes later ops that overwrite the cell\n * with a different value as well as row/col removals that might recycled the given row/col handles.\n */\n private isLatestPendingWrite(rowHandle: Handle, colHandle: Handle, localSeq: number) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const pendingLocalSeq = this.pending.getCell(rowHandle, colHandle)!;\n\n // Note while we're awaiting the ACK for a local set, it's possible for the row/col to be\n // locally removed and the row/col handles recycled. If this happens, the pendingLocalSeq will\n // be 'undefined' or > 'localSeq'.\n assert(!(pendingLocalSeq < localSeq),\n // eslint-disable-next-line max-len\n 0x023 /* \"The 'localSeq' of pending write (if any) must be <= the localSeq of the currently processed op.\" */);\n\n // If this is the most recent write to the cell by the local client, the stored localSeq\n // will be an exact match for the given 'localSeq'.\n return pendingLocalSeq === localSeq;\n }\n\n public toString() {\n let s = `client:${this.runtime.clientId}\\nrows: ${this.rows.toString()}\\ncols: ${this.cols.toString()}\\n\\n`;\n\n for (let r = 0; r < this.rowCount; r++) {\n s += ` [`;\n for (let c = 0; c < this.colCount; c++) {\n if (c > 0) {\n s += \", \";\n }\n\n s += `${this.serializer.stringify(this.getCell(r, c), this.handle)}`;\n }\n s += \"]\\n\";\n }\n\n return `${s}\\n`;\n }\n\n /**\n * {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}\n */\n protected applyStashedOp(content: any): unknown {\n if (content.target === SnapshotPath.cols || content.target === SnapshotPath.rows) {\n const op = content as IMergeTreeOp;\n const currentVector = content.target === SnapshotPath.cols ? this.cols : this.rows;\n const oppositeVector = content.target === SnapshotPath.cols ? this.rows : this.cols;\n const metadata = currentVector.applyStashedOp(op);\n const localSeq = currentVector.getCollabWindow().localSeq;\n const oppositeWindow = oppositeVector.getCollabWindow();\n\n assert(\n localSeq > oppositeWindow.localSeq,\n 0x2d9,\n /* \"The 'localSeq' of the vector applying stashed op must > the 'localSeq' of the other vector.\" */\n );\n\n oppositeWindow.localSeq = localSeq;\n\n return metadata;\n } else {\n assert(content.type === MatrixOp.set, 0x2da /* \"Unknown SharedMatrix 'op' type.\" */);\n\n const setOp = content as ISetOp<T>;\n const rowHandle = this.rows.getAllocatedHandle(setOp.row);\n const colHandle = this.cols.getAllocatedHandle(setOp.col);\n if (this.undo !== undefined) {\n let oldValue = this.cells.getCell(rowHandle, colHandle);\n if (oldValue === null) {\n oldValue = undefined;\n }\n\n this.undo.cellSet(\n rowHandle,\n colHandle,\n oldValue);\n }\n\n this.cells.setCell(rowHandle, colHandle, setOp.value);\n const localSeq = this.nextLocalSeq();\n const metadata: ISetOpMetadata = {\n rowHandle,\n colHandle,\n localSeq,\n };\n\n this.pending.setCell(rowHandle, colHandle, localSeq);\n return metadata;\n }\n }\n}\n"]}
|
package/dist/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/matrix";
|
|
8
|
-
export declare const pkgVersion = "2.0.0-internal.
|
|
8
|
+
export declare const pkgVersion = "2.0.0-internal.2.0.0";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/dist/packageVersion.js
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.pkgVersion = exports.pkgName = void 0;
|
|
10
10
|
exports.pkgName = "@fluidframework/matrix";
|
|
11
|
-
exports.pkgVersion = "2.0.0-internal.
|
|
11
|
+
exports.pkgVersion = "2.0.0-internal.2.0.0";
|
|
12
12
|
//# sourceMappingURL=packageVersion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,wBAAwB,CAAC;AACnC,QAAA,UAAU,GAAG,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.
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,wBAAwB,CAAC;AACnC,QAAA,UAAU,GAAG,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.2.0.0\";\n"]}
|
|
@@ -8,6 +8,7 @@ import { BaseSegment, ISegment, Client } from "@fluidframework/merge-tree";
|
|
|
8
8
|
import { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
9
9
|
import { IFluidSerializer } from "@fluidframework/shared-object-base";
|
|
10
10
|
import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
|
|
11
|
+
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
11
12
|
import { Handle } from "./handletable";
|
|
12
13
|
import { HandleCache } from "./handlecache";
|
|
13
14
|
import { VectorUndoProvider } from "./undoprovider";
|
|
@@ -46,14 +47,14 @@ export declare class PermutationVector extends Client {
|
|
|
46
47
|
op: import("@fluidframework/merge-tree").IMergeTreeInsertMsg | undefined;
|
|
47
48
|
inserted: PermutationSegment;
|
|
48
49
|
};
|
|
49
|
-
remove(start: number, length: number): import("@fluidframework/merge-tree").IMergeTreeRemoveMsg
|
|
50
|
+
remove(start: number, length: number): import("@fluidframework/merge-tree").IMergeTreeRemoveMsg;
|
|
50
51
|
getMaybeHandle(pos: number): Handle;
|
|
51
52
|
getAllocatedHandle(pos: number): Handle;
|
|
52
|
-
adjustPosition(pos: number,
|
|
53
|
+
adjustPosition(pos: number, op: ISequencedDocumentMessage): number | undefined;
|
|
53
54
|
handleToPosition(handle: Handle, localSeq?: number): number;
|
|
54
55
|
summarize(runtime: IFluidDataStoreRuntime, handle: IFluidHandle, serializer: IFluidSerializer): ISummaryTreeWithStats;
|
|
55
56
|
load(runtime: IFluidDataStoreRuntime, storage: IChannelStorageService, serializer: IFluidSerializer): Promise<{
|
|
56
|
-
catchupOpsP: Promise<
|
|
57
|
+
catchupOpsP: Promise<ISequencedDocumentMessage[]>;
|
|
57
58
|
}>;
|
|
58
59
|
private readonly onDelta;
|
|
59
60
|
private readonly onMaintenance;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permutationvector.d.ts","sourceRoot":"","sources":["../src/permutationvector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACvG,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EACH,WAAW,EACX,QAAQ,EAER,MAAM,EAOT,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,OAAO,EAAe,MAAM,EAAiB,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AASpD,qBAAa,kBAAmB,SAAQ,WAAW;IAC/C,gBAAuB,UAAU,EAAE,MAAM,CAAwB;IACjE,OAAO,CAAC,MAAM,CAAsB;WAEtB,cAAc,CAAC,IAAI,EAAE,GAAG;IAKtC,SAAgB,IAAI,SAAiC;gBAEzC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAqB;IAMtD,IAAW,KAAK,IACQ,MAAM,CADY;IAC1C,IAAW,KAAK,CAAC,KAAK,EAAE,MAAM,EAK7B;IAED;;;;;OAKG;IACI,qBAAqB,CAAC,WAAW,EAAE,kBAAkB;IAuBrD,KAAK;IAIL,YAAY;IAIZ,KAAK,CAAC,KAAK,SAAI,EAAE,GAAG,SAAoB;IAQxC,SAAS,CAAC,OAAO,EAAE,QAAQ;IAQ3B,MAAM,CAAC,OAAO,EAAE,QAAQ;IAQ/B,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM;IAcnC,QAAQ;CAKlB;AAED,qBAAa,iBAAkB,SAAQ,MAAM;IASrC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IAT5C,OAAO,CAAC,WAAW,CAA4B;IAC/C,SAAgB,WAAW,cAAyB;IAC7C,IAAI,EAAE,kBAAkB,GAAG,SAAS,CAAC;gBAGxC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,sBAAsB,EACd,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,EAClF,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI;IAalE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMpC,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;;;;IAWhD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAIpC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAMnC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAsBvC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"permutationvector.d.ts","sourceRoot":"","sources":["../src/permutationvector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACvG,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EACH,WAAW,EACX,QAAQ,EAER,MAAM,EAOT,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAe,MAAM,EAAiB,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AASpD,qBAAa,kBAAmB,SAAQ,WAAW;IAC/C,gBAAuB,UAAU,EAAE,MAAM,CAAwB;IACjE,OAAO,CAAC,MAAM,CAAsB;WAEtB,cAAc,CAAC,IAAI,EAAE,GAAG;IAKtC,SAAgB,IAAI,SAAiC;gBAEzC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAqB;IAMtD,IAAW,KAAK,IACQ,MAAM,CADY;IAC1C,IAAW,KAAK,CAAC,KAAK,EAAE,MAAM,EAK7B;IAED;;;;;OAKG;IACI,qBAAqB,CAAC,WAAW,EAAE,kBAAkB;IAuBrD,KAAK;IAIL,YAAY;IAIZ,KAAK,CAAC,KAAK,SAAI,EAAE,GAAG,SAAoB;IAQxC,SAAS,CAAC,OAAO,EAAE,QAAQ;IAQ3B,MAAM,CAAC,OAAO,EAAE,QAAQ;IAQ/B,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM;IAcnC,QAAQ;CAKlB;AAED,qBAAa,iBAAkB,SAAQ,MAAM;IASrC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IAT5C,OAAO,CAAC,WAAW,CAA4B;IAC/C,SAAgB,WAAW,cAAyB;IAC7C,IAAI,EAAE,kBAAkB,GAAG,SAAS,CAAC;gBAGxC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,sBAAsB,EACd,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,EAClF,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI;IAalE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMpC,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;;;;IAWhD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAIpC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAMnC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAsBvC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,yBAAyB;IAczD,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAkC;IAyD3E,SAAS,CAAC,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,GAChG,qBAAqB;IAOZ,IAAI,CACb,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,gBAAgB;;;IAShC,OAAO,CAAC,QAAQ,CAAC,OAAO,CA2DtB;IAEF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAyB5B;IAEK,QAAQ;CAUlB"}
|
|
@@ -209,8 +209,8 @@ class PermutationVector extends merge_tree_1.Client {
|
|
|
209
209
|
this.handleCache.addHandle(pos, handle);
|
|
210
210
|
return handle;
|
|
211
211
|
}
|
|
212
|
-
adjustPosition(pos,
|
|
213
|
-
const { segment, offset } = this.
|
|
212
|
+
adjustPosition(pos, op) {
|
|
213
|
+
const { segment, offset } = this.getContainingSegment(pos, op);
|
|
214
214
|
// Note that until the MergeTree GCs, the segment is still reachable via `getContainingSegment()` with
|
|
215
215
|
// a `refSeq` in the past. Prevent remote ops from accidentally allocating or using recycled handles
|
|
216
216
|
// by checking for the presence of 'removedSeq'.
|
|
@@ -220,8 +220,8 @@ class PermutationVector extends merge_tree_1.Client {
|
|
|
220
220
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
221
221
|
return this.getPosition(segment) + offset;
|
|
222
222
|
}
|
|
223
|
-
handleToPosition(handle, localSeq = this.
|
|
224
|
-
(0, common_utils_1.assert)(localSeq <= this.
|
|
223
|
+
handleToPosition(handle, localSeq = this.getCollabWindow().localSeq) {
|
|
224
|
+
(0, common_utils_1.assert)(localSeq <= this.getCollabWindow().localSeq, 0x028 /* "'localSeq' for op being resubmitted must be <= the 'localSeq' of the last submitted op." */);
|
|
225
225
|
// TODO: In theory, the MergeTree should be able to map the (position, refSeq, localSeq) from
|
|
226
226
|
// the original operation to the current position for resubmitting. This is probably the
|
|
227
227
|
// ideal solution, as we would no longer need to store row/col handles in the op metadata.
|
|
@@ -235,7 +235,7 @@ class PermutationVector extends merge_tree_1.Client {
|
|
|
235
235
|
// one using the Tiny-Calc adjust tree.
|
|
236
236
|
let containingSegment;
|
|
237
237
|
let containingOffset;
|
|
238
|
-
this.
|
|
238
|
+
this.walkAllSegments((segment) => {
|
|
239
239
|
const { start, cachedLength } = segment;
|
|
240
240
|
// If the segment is unallocated, skip it.
|
|
241
241
|
if (!(0, handletable_1.isHandleValid)(start)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permutationvector.js","sourceRoot":"","sources":["../src/permutationvector.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { IFluidDataStoreRuntime, IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ITelemetryBaseLogger } from \"@fluidframework/common-definitions\";\nimport {\n BaseSegment,\n ISegment,\n LocalReferenceCollection,\n Client,\n IMergeTreeDeltaOpArgs,\n IMergeTreeDeltaCallbackArgs,\n MergeTreeDeltaType,\n IMergeTreeMaintenanceCallbackArgs,\n MergeTreeMaintenanceType,\n ReferenceType,\n} from \"@fluidframework/merge-tree\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ObjectStoragePartition, SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { HandleTable, Handle, isHandleValid } from \"./handletable\";\nimport { deserializeBlob } from \"./serialization\";\nimport { HandleCache } from \"./handlecache\";\nimport { VectorUndoProvider } from \"./undoprovider\";\n\nconst enum SnapshotPath {\n segments = \"segments\",\n handleTable = \"handleTable\",\n}\n\ntype PermutationSegmentSpec = [number, number];\n\nexport class PermutationSegment extends BaseSegment {\n public static readonly typeString: string = \"PermutationSegment\";\n private _start = Handle.unallocated;\n\n public static fromJSONObject(spec: any) {\n const [length, start] = spec as PermutationSegmentSpec;\n return new PermutationSegment(length, start);\n }\n\n public readonly type = PermutationSegment.typeString;\n\n constructor(length: number, start = Handle.unallocated) {\n super();\n this._start = start;\n this.cachedLength = length;\n }\n\n public get start() { return this._start; }\n public set start(value: Handle) {\n assert(this._start === Handle.unallocated, 0x024 /* \"Start of PermutationSegment already allocated!\" */);\n assert(isHandleValid(value), 0x025 /* \"Trying to set start of PermutationSegment to invalid handle!\" */);\n\n this._start = value;\n }\n\n /**\n * Invoked by '_undoRow/ColRemove' to prepare the newly inserted destination\n * segment to serve as the replacement for this removed segment. This moves handle\n * allocations from this segment to the replacement as well as maintains tracking\n * groups for the undo/redo stack.\n */\n public transferToReplacement(destination: PermutationSegment) {\n // When this segment was removed, it may have been split from a larger original\n // segment. In this case, it will have been added to an undo/redo tracking group\n // that associates all of the fragments from the original insertion.\n //\n // Move this association from the this removed segment to its replacement so that\n // it is included if the undo stack continues to unwind to the original insertion.\n //\n // Out of paranoia we link and unlink in separate loops to avoid mutating the underlying\n // set during enumeration. In practice, this is unlikely to matter since there should be\n // exactly 0 or 1 items in the enumeration.\n for (const group of this.trackingCollection.trackingGroups) {\n group.link(destination);\n }\n for (const group of this.trackingCollection.trackingGroups) {\n group.unlink(this);\n }\n\n // Move handle allocations from this segment to its replacement.\n destination._start = this._start;\n this.reset();\n }\n\n public reset() {\n this._start = Handle.unallocated;\n }\n\n public toJSONObject() {\n return [this.cachedLength, this.start];\n }\n\n public clone(start = 0, end = this.cachedLength) {\n const b = new PermutationSegment(\n /* length: */ end - start,\n /* start: */ this.start + start);\n this.cloneInto(b);\n return b;\n }\n\n public canAppend(segment: ISegment) {\n const asPerm = segment as PermutationSegment;\n\n return this.start === Handle.unallocated\n ? asPerm.start === Handle.unallocated\n : asPerm.start === this.start + this.cachedLength;\n }\n\n public append(segment: ISegment) {\n // Note: Must call 'LocalReferenceCollection.append(..)' before modifying this segment's length as\n // 'this.cachedLength' is used to adjust the offsets of the local refs.\n LocalReferenceCollection.append(this, segment);\n\n this.cachedLength += segment.cachedLength;\n }\n\n protected createSplitSegmentAt(pos: number) {\n assert(0 < pos && pos < this.cachedLength, 0x026 /* \"Trying to split segment at out-of-bounds position!\" */);\n\n const leafSegment = new PermutationSegment(\n /* length: */ this.cachedLength - pos,\n /* start: */ this.start === Handle.unallocated\n ? Handle.unallocated\n : this.start + pos);\n\n this.cachedLength = pos;\n\n return leafSegment;\n }\n\n public toString() {\n return this.start === Handle.unallocated\n ? `<${this.cachedLength} empty>`\n : `<${this.cachedLength}: ${this.start}..${this.start + this.cachedLength - 1}>`;\n }\n}\n\nexport class PermutationVector extends Client {\n private handleTable = new HandleTable<never>(); // Tracks available storage handles for rows.\n public readonly handleCache = new HandleCache(this);\n public undo: VectorUndoProvider | undefined;\n\n constructor(\n path: string,\n logger: ITelemetryBaseLogger,\n runtime: IFluidDataStoreRuntime,\n private readonly deltaCallback: (position: number, numRemoved: number, numInserted: number) => void,\n private readonly handlesRecycledCallback: (handles: Handle[]) => void,\n ) {\n super(\n PermutationSegment.fromJSONObject,\n ChildLogger.create(logger, `Matrix.${path}.MergeTreeClient`), {\n ...runtime.options,\n newMergeTreeSnapshotFormat: true, // Temporarily force new snapshot format until it is the default.\n }); // (See https://github.com/microsoft/FluidFramework/issues/84)\n\n this.mergeTreeDeltaCallback = this.onDelta;\n this.mergeTreeMaintenanceCallback = this.onMaintenance;\n }\n\n public insert(start: number, length: number) {\n return this.insertSegmentLocal(\n start,\n new PermutationSegment(length));\n }\n\n public insertRelative(segment: ISegment, length: number) {\n const inserted = new PermutationSegment(length);\n\n return {\n op: this.insertAtReferencePositionLocal(\n this.createLocalReferencePosition(segment, 0, ReferenceType.Transient, undefined),\n inserted),\n inserted,\n };\n }\n\n public remove(start: number, length: number) {\n return this.removeRangeLocal(start, start + length);\n }\n\n public getMaybeHandle(pos: number): Handle {\n assert(0 <= pos && pos < this.getLength(), 0x027 /* \"Trying to get handle of out-of-bounds position!\" */);\n\n return this.handleCache.getHandle(pos);\n }\n\n public getAllocatedHandle(pos: number): Handle {\n let handle = this.getMaybeHandle(pos);\n if (isHandleValid(handle)) {\n return handle;\n }\n\n this.walkSegments(\n (segment) => {\n const asPerm = segment as PermutationSegment;\n asPerm.start = handle = this.handleTable.allocate();\n return true;\n },\n pos,\n pos + 1,\n /* accum: */ undefined,\n /* splitRange: */ true);\n\n this.handleCache.addHandle(pos, handle);\n\n return handle;\n }\n\n public adjustPosition(pos: number, fromSeq: number, clientId: number) {\n const { segment, offset } = this.mergeTree.getContainingSegment(pos, fromSeq, clientId);\n\n // Note that until the MergeTree GCs, the segment is still reachable via `getContainingSegment()` with\n // a `refSeq` in the past. Prevent remote ops from accidentally allocating or using recycled handles\n // by checking for the presence of 'removedSeq'.\n if (segment === undefined || segment.removedSeq !== undefined) {\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.getPosition(segment) + offset!;\n }\n\n public handleToPosition(handle: Handle, localSeq = this.mergeTree.collabWindow.localSeq) {\n assert(localSeq <= this.mergeTree.collabWindow.localSeq,\n 0x028 /* \"'localSeq' for op being resubmitted must be <= the 'localSeq' of the last submitted op.\" */);\n\n // TODO: In theory, the MergeTree should be able to map the (position, refSeq, localSeq) from\n // the original operation to the current position for resubmitting. This is probably the\n // ideal solution, as we would no longer need to store row/col handles in the op metadata.\n //\n // Failing that, we could avoid the O(n) search below by building a temporary map in the\n // opposite direction from the handle to either it's current position or segment + offset\n // and reuse it for the duration of resubmission. (Ideally, we would know when resubmission\n // ended so we could discard this map.)\n //\n // If we find that we frequently need a reverse handle -> position lookup, we could maintain\n // one using the Tiny-Calc adjust tree.\n let containingSegment!: PermutationSegment;\n let containingOffset: number;\n\n this.mergeTree.walkAllSegments(\n this.mergeTree.root,\n (segment) => {\n const { start, cachedLength } = segment as PermutationSegment;\n\n // If the segment is unallocated, skip it.\n if (!isHandleValid(start)) {\n return true;\n }\n\n const end = start + cachedLength;\n\n if (start <= handle && handle < end) {\n containingSegment = segment as PermutationSegment;\n containingOffset = handle - start;\n return false;\n }\n\n return true;\n });\n\n // We are guaranteed to find the handle in the PermutationVector, even if the corresponding\n // row/col has been removed, because handles are not recycled until the containing segment\n // is unlinked from the MergeTree.\n //\n // Therefore, either a row/col removal has been ACKed, in which case there will be no pending\n // ops that reference the stale handle, or the removal is unACKed, in which case the handle\n // has not yet been recycled.\n\n assert(isHandleValid(containingSegment.start), 0x029 /* \"Invalid handle at start of containing segment!\" */);\n\n // Once we know the current position of the handle, we can use the MergeTree to get the segment\n // containing this position and use 'findReconnectionPosition' to adjust for the local ops that\n // have not yet been submitted.\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.findReconnectionPosition(containingSegment, localSeq) + containingOffset!;\n }\n\n // Constructs an ISummaryTreeWithStats for the cell data.\n public summarize(runtime: IFluidDataStoreRuntime, handle: IFluidHandle, serializer: IFluidSerializer):\n ISummaryTreeWithStats {\n const builder = new SummaryTreeBuilder();\n builder.addWithStats(SnapshotPath.segments, super.summarize(runtime, handle, serializer, /* catchUpMsgs: */[]));\n builder.addBlob(SnapshotPath.handleTable, serializer.stringify(this.handleTable.getSummaryContent(), handle));\n return builder.getSummaryTree();\n }\n\n public async load(\n runtime: IFluidDataStoreRuntime,\n storage: IChannelStorageService,\n serializer: IFluidSerializer,\n ) {\n const handleTableData = await deserializeBlob(storage, SnapshotPath.handleTable, serializer);\n\n this.handleTable = HandleTable.load<never>(handleTableData);\n\n return super.load(runtime, new ObjectStoragePartition(storage, SnapshotPath.segments), serializer);\n }\n\n private readonly onDelta = (\n opArgs: IMergeTreeDeltaOpArgs,\n { operation, deltaSegments }: IMergeTreeDeltaCallbackArgs,\n ) => {\n // Apply deltas in descending order to prevent positions from shifting.\n const ranges = deltaSegments\n .map(({ segment }) => ({\n segment: segment as PermutationSegment,\n position: this.getPosition(segment),\n }))\n .sort((left, right) => left.position - right.position);\n\n const isLocal = opArgs.sequencedMessage === undefined;\n\n // Notify the undo provider, if any is attached.\n if (this.undo !== undefined && isLocal) {\n this.undo.record(operation, ranges);\n }\n\n switch (operation) {\n case MergeTreeDeltaType.INSERT:\n // Pass 1: Perform any internal maintenance first to avoid reentrancy.\n for (const { segment, position } of ranges) {\n // HACK: We need to include the allocated handle in the segment's JSON representation\n // for snapshots, but need to ignore the remote client's handle allocations when\n // processing remote ops.\n segment.reset();\n\n this.handleCache.itemsChanged(\n position,\n /* deleteCount: */ 0,\n /* insertCount: */ segment.cachedLength);\n }\n\n // Pass 2: Notify the 'deltaCallback', which may involve callbacks into user code.\n for (const { segment, position } of ranges) {\n this.deltaCallback(position, /* numRemoved: */ 0, /* numInserted: */ segment.cachedLength);\n }\n break;\n\n case MergeTreeDeltaType.REMOVE: {\n // Pass 1: Perform any internal maintenance first to avoid reentrancy.\n for (const { segment, position } of ranges) {\n this.handleCache.itemsChanged(\n position, /* deleteCount: */\n segment.cachedLength,\n /* insertCount: */ 0);\n }\n\n // Pass 2: Notify the 'deltaCallback', which may involve callbacks into user code.\n for (const { segment, position } of ranges) {\n this.deltaCallback(position, /* numRemoved: */ segment.cachedLength, /* numInsert: */ 0);\n }\n break;\n }\n\n default:\n throw new Error(\"Unhandled MergeTreeDeltaType\");\n }\n };\n\n private readonly onMaintenance = (args: IMergeTreeMaintenanceCallbackArgs) => {\n if (args.operation === MergeTreeMaintenanceType.UNLINK) {\n let freed: number[] = [];\n\n for (const { segment } of args.deltaSegments) {\n const asPerm = segment as PermutationSegment;\n if (isHandleValid(asPerm.start)) {\n // Note: Using the spread operator with `.splice()` can exhaust the stack.\n freed = freed.concat(\n new Array(asPerm.cachedLength)\n .fill(0)\n .map((value, index) => index + asPerm.start),\n );\n }\n }\n\n // Notify matrix that handles are about to be freed. The matrix is responsible for clearing\n // the rows/cols prior to free to ensure recycled row/cols are initially empty.\n this.handlesRecycledCallback(freed);\n\n // Now that the physical storage has been cleared, add the recycled handles back to the free pool.\n for (const handle of freed) {\n this.handleTable.free(handle);\n }\n }\n };\n\n public toString() {\n const s: string[] = [];\n\n this.walkSegments((segment) => {\n s.push(`${segment}`);\n return true;\n });\n\n return s.join(\"\");\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"permutationvector.js","sourceRoot":"","sources":["../src/permutationvector.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { IFluidDataStoreRuntime, IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ITelemetryBaseLogger } from \"@fluidframework/common-definitions\";\nimport {\n BaseSegment,\n ISegment,\n LocalReferenceCollection,\n Client,\n IMergeTreeDeltaOpArgs,\n IMergeTreeDeltaCallbackArgs,\n MergeTreeDeltaType,\n IMergeTreeMaintenanceCallbackArgs,\n MergeTreeMaintenanceType,\n ReferenceType,\n} from \"@fluidframework/merge-tree\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ObjectStoragePartition, SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { HandleTable, Handle, isHandleValid } from \"./handletable\";\nimport { deserializeBlob } from \"./serialization\";\nimport { HandleCache } from \"./handlecache\";\nimport { VectorUndoProvider } from \"./undoprovider\";\n\nconst enum SnapshotPath {\n segments = \"segments\",\n handleTable = \"handleTable\",\n}\n\ntype PermutationSegmentSpec = [number, number];\n\nexport class PermutationSegment extends BaseSegment {\n public static readonly typeString: string = \"PermutationSegment\";\n private _start = Handle.unallocated;\n\n public static fromJSONObject(spec: any) {\n const [length, start] = spec as PermutationSegmentSpec;\n return new PermutationSegment(length, start);\n }\n\n public readonly type = PermutationSegment.typeString;\n\n constructor(length: number, start = Handle.unallocated) {\n super();\n this._start = start;\n this.cachedLength = length;\n }\n\n public get start() { return this._start; }\n public set start(value: Handle) {\n assert(this._start === Handle.unallocated, 0x024 /* \"Start of PermutationSegment already allocated!\" */);\n assert(isHandleValid(value), 0x025 /* \"Trying to set start of PermutationSegment to invalid handle!\" */);\n\n this._start = value;\n }\n\n /**\n * Invoked by '_undoRow/ColRemove' to prepare the newly inserted destination\n * segment to serve as the replacement for this removed segment. This moves handle\n * allocations from this segment to the replacement as well as maintains tracking\n * groups for the undo/redo stack.\n */\n public transferToReplacement(destination: PermutationSegment) {\n // When this segment was removed, it may have been split from a larger original\n // segment. In this case, it will have been added to an undo/redo tracking group\n // that associates all of the fragments from the original insertion.\n //\n // Move this association from the this removed segment to its replacement so that\n // it is included if the undo stack continues to unwind to the original insertion.\n //\n // Out of paranoia we link and unlink in separate loops to avoid mutating the underlying\n // set during enumeration. In practice, this is unlikely to matter since there should be\n // exactly 0 or 1 items in the enumeration.\n for (const group of this.trackingCollection.trackingGroups) {\n group.link(destination);\n }\n for (const group of this.trackingCollection.trackingGroups) {\n group.unlink(this);\n }\n\n // Move handle allocations from this segment to its replacement.\n destination._start = this._start;\n this.reset();\n }\n\n public reset() {\n this._start = Handle.unallocated;\n }\n\n public toJSONObject() {\n return [this.cachedLength, this.start];\n }\n\n public clone(start = 0, end = this.cachedLength) {\n const b = new PermutationSegment(\n /* length: */ end - start,\n /* start: */ this.start + start);\n this.cloneInto(b);\n return b;\n }\n\n public canAppend(segment: ISegment) {\n const asPerm = segment as PermutationSegment;\n\n return this.start === Handle.unallocated\n ? asPerm.start === Handle.unallocated\n : asPerm.start === this.start + this.cachedLength;\n }\n\n public append(segment: ISegment) {\n // Note: Must call 'LocalReferenceCollection.append(..)' before modifying this segment's length as\n // 'this.cachedLength' is used to adjust the offsets of the local refs.\n LocalReferenceCollection.append(this, segment);\n\n this.cachedLength += segment.cachedLength;\n }\n\n protected createSplitSegmentAt(pos: number) {\n assert(0 < pos && pos < this.cachedLength, 0x026 /* \"Trying to split segment at out-of-bounds position!\" */);\n\n const leafSegment = new PermutationSegment(\n /* length: */ this.cachedLength - pos,\n /* start: */ this.start === Handle.unallocated\n ? Handle.unallocated\n : this.start + pos);\n\n this.cachedLength = pos;\n\n return leafSegment;\n }\n\n public toString() {\n return this.start === Handle.unallocated\n ? `<${this.cachedLength} empty>`\n : `<${this.cachedLength}: ${this.start}..${this.start + this.cachedLength - 1}>`;\n }\n}\n\nexport class PermutationVector extends Client {\n private handleTable = new HandleTable<never>(); // Tracks available storage handles for rows.\n public readonly handleCache = new HandleCache(this);\n public undo: VectorUndoProvider | undefined;\n\n constructor(\n path: string,\n logger: ITelemetryBaseLogger,\n runtime: IFluidDataStoreRuntime,\n private readonly deltaCallback: (position: number, numRemoved: number, numInserted: number) => void,\n private readonly handlesRecycledCallback: (handles: Handle[]) => void,\n ) {\n super(\n PermutationSegment.fromJSONObject,\n ChildLogger.create(logger, `Matrix.${path}.MergeTreeClient`), {\n ...runtime.options,\n newMergeTreeSnapshotFormat: true, // Temporarily force new snapshot format until it is the default.\n }); // (See https://github.com/microsoft/FluidFramework/issues/84)\n\n this.mergeTreeDeltaCallback = this.onDelta;\n this.mergeTreeMaintenanceCallback = this.onMaintenance;\n }\n\n public insert(start: number, length: number) {\n return this.insertSegmentLocal(\n start,\n new PermutationSegment(length));\n }\n\n public insertRelative(segment: ISegment, length: number) {\n const inserted = new PermutationSegment(length);\n\n return {\n op: this.insertAtReferencePositionLocal(\n this.createLocalReferencePosition(segment, 0, ReferenceType.Transient, undefined),\n inserted),\n inserted,\n };\n }\n\n public remove(start: number, length: number) {\n return this.removeRangeLocal(start, start + length);\n }\n\n public getMaybeHandle(pos: number): Handle {\n assert(0 <= pos && pos < this.getLength(), 0x027 /* \"Trying to get handle of out-of-bounds position!\" */);\n\n return this.handleCache.getHandle(pos);\n }\n\n public getAllocatedHandle(pos: number): Handle {\n let handle = this.getMaybeHandle(pos);\n if (isHandleValid(handle)) {\n return handle;\n }\n\n this.walkSegments(\n (segment) => {\n const asPerm = segment as PermutationSegment;\n asPerm.start = handle = this.handleTable.allocate();\n return true;\n },\n pos,\n pos + 1,\n /* accum: */ undefined,\n /* splitRange: */ true);\n\n this.handleCache.addHandle(pos, handle);\n\n return handle;\n }\n\n public adjustPosition(pos: number, op: ISequencedDocumentMessage) {\n const { segment, offset } = this.getContainingSegment(pos, op);\n\n // Note that until the MergeTree GCs, the segment is still reachable via `getContainingSegment()` with\n // a `refSeq` in the past. Prevent remote ops from accidentally allocating or using recycled handles\n // by checking for the presence of 'removedSeq'.\n if (segment === undefined || segment.removedSeq !== undefined) {\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.getPosition(segment) + offset!;\n }\n\n public handleToPosition(handle: Handle, localSeq = this.getCollabWindow().localSeq) {\n assert(localSeq <= this.getCollabWindow().localSeq,\n 0x028 /* \"'localSeq' for op being resubmitted must be <= the 'localSeq' of the last submitted op.\" */);\n\n // TODO: In theory, the MergeTree should be able to map the (position, refSeq, localSeq) from\n // the original operation to the current position for resubmitting. This is probably the\n // ideal solution, as we would no longer need to store row/col handles in the op metadata.\n //\n // Failing that, we could avoid the O(n) search below by building a temporary map in the\n // opposite direction from the handle to either it's current position or segment + offset\n // and reuse it for the duration of resubmission. (Ideally, we would know when resubmission\n // ended so we could discard this map.)\n //\n // If we find that we frequently need a reverse handle -> position lookup, we could maintain\n // one using the Tiny-Calc adjust tree.\n let containingSegment!: PermutationSegment;\n let containingOffset: number;\n\n this.walkAllSegments(\n (segment) => {\n const { start, cachedLength } = segment as PermutationSegment;\n\n // If the segment is unallocated, skip it.\n if (!isHandleValid(start)) {\n return true;\n }\n\n const end = start + cachedLength;\n\n if (start <= handle && handle < end) {\n containingSegment = segment as PermutationSegment;\n containingOffset = handle - start;\n return false;\n }\n\n return true;\n });\n\n // We are guaranteed to find the handle in the PermutationVector, even if the corresponding\n // row/col has been removed, because handles are not recycled until the containing segment\n // is unlinked from the MergeTree.\n //\n // Therefore, either a row/col removal has been ACKed, in which case there will be no pending\n // ops that reference the stale handle, or the removal is unACKed, in which case the handle\n // has not yet been recycled.\n\n assert(isHandleValid(containingSegment.start), 0x029 /* \"Invalid handle at start of containing segment!\" */);\n\n // Once we know the current position of the handle, we can use the MergeTree to get the segment\n // containing this position and use 'findReconnectionPosition' to adjust for the local ops that\n // have not yet been submitted.\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.findReconnectionPosition(containingSegment, localSeq) + containingOffset!;\n }\n\n // Constructs an ISummaryTreeWithStats for the cell data.\n public summarize(runtime: IFluidDataStoreRuntime, handle: IFluidHandle, serializer: IFluidSerializer):\n ISummaryTreeWithStats {\n const builder = new SummaryTreeBuilder();\n builder.addWithStats(SnapshotPath.segments, super.summarize(runtime, handle, serializer, /* catchUpMsgs: */[]));\n builder.addBlob(SnapshotPath.handleTable, serializer.stringify(this.handleTable.getSummaryContent(), handle));\n return builder.getSummaryTree();\n }\n\n public async load(\n runtime: IFluidDataStoreRuntime,\n storage: IChannelStorageService,\n serializer: IFluidSerializer,\n ) {\n const handleTableData = await deserializeBlob(storage, SnapshotPath.handleTable, serializer);\n\n this.handleTable = HandleTable.load<never>(handleTableData);\n\n return super.load(runtime, new ObjectStoragePartition(storage, SnapshotPath.segments), serializer);\n }\n\n private readonly onDelta = (\n opArgs: IMergeTreeDeltaOpArgs,\n { operation, deltaSegments }: IMergeTreeDeltaCallbackArgs,\n ) => {\n // Apply deltas in descending order to prevent positions from shifting.\n const ranges = deltaSegments\n .map(({ segment }) => ({\n segment: segment as PermutationSegment,\n position: this.getPosition(segment),\n }))\n .sort((left, right) => left.position - right.position);\n\n const isLocal = opArgs.sequencedMessage === undefined;\n\n // Notify the undo provider, if any is attached.\n if (this.undo !== undefined && isLocal) {\n this.undo.record(operation, ranges);\n }\n\n switch (operation) {\n case MergeTreeDeltaType.INSERT:\n // Pass 1: Perform any internal maintenance first to avoid reentrancy.\n for (const { segment, position } of ranges) {\n // HACK: We need to include the allocated handle in the segment's JSON representation\n // for snapshots, but need to ignore the remote client's handle allocations when\n // processing remote ops.\n segment.reset();\n\n this.handleCache.itemsChanged(\n position,\n /* deleteCount: */ 0,\n /* insertCount: */ segment.cachedLength);\n }\n\n // Pass 2: Notify the 'deltaCallback', which may involve callbacks into user code.\n for (const { segment, position } of ranges) {\n this.deltaCallback(position, /* numRemoved: */ 0, /* numInserted: */ segment.cachedLength);\n }\n break;\n\n case MergeTreeDeltaType.REMOVE: {\n // Pass 1: Perform any internal maintenance first to avoid reentrancy.\n for (const { segment, position } of ranges) {\n this.handleCache.itemsChanged(\n position, /* deleteCount: */\n segment.cachedLength,\n /* insertCount: */ 0);\n }\n\n // Pass 2: Notify the 'deltaCallback', which may involve callbacks into user code.\n for (const { segment, position } of ranges) {\n this.deltaCallback(position, /* numRemoved: */ segment.cachedLength, /* numInsert: */ 0);\n }\n break;\n }\n\n default:\n throw new Error(\"Unhandled MergeTreeDeltaType\");\n }\n };\n\n private readonly onMaintenance = (args: IMergeTreeMaintenanceCallbackArgs) => {\n if (args.operation === MergeTreeMaintenanceType.UNLINK) {\n let freed: number[] = [];\n\n for (const { segment } of args.deltaSegments) {\n const asPerm = segment as PermutationSegment;\n if (isHandleValid(asPerm.start)) {\n // Note: Using the spread operator with `.splice()` can exhaust the stack.\n freed = freed.concat(\n new Array(asPerm.cachedLength)\n .fill(0)\n .map((value, index) => index + asPerm.start),\n );\n }\n }\n\n // Notify matrix that handles are about to be freed. The matrix is responsible for clearing\n // the rows/cols prior to free to ensure recycled row/cols are initially empty.\n this.handlesRecycledCallback(freed);\n\n // Now that the physical storage has been cleared, add the recycled handles back to the free pool.\n for (const handle of freed) {\n this.handleTable.free(handle);\n }\n }\n };\n\n public toString() {\n const s: string[] = [];\n\n this.walkSegments((segment) => {\n s.push(`${segment}`);\n return true;\n });\n\n return s.join(\"\");\n }\n}\n"]}
|
package/lib/matrix.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matrix.d.ts","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"matrix.d.ts","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"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"}
|
package/lib/matrix.js
CHANGED
|
@@ -381,7 +381,6 @@ export class SharedMatrix extends SharedObject {
|
|
|
381
381
|
break;
|
|
382
382
|
default: {
|
|
383
383
|
assert(contents.type === MatrixOp.set, 0x021 /* "SharedMatrix message contents have unexpected type!" */);
|
|
384
|
-
const { referenceSequenceNumber: refSeq, clientId } = rawMessage;
|
|
385
384
|
const { row, col } = contents;
|
|
386
385
|
if (local) {
|
|
387
386
|
// We are receiving the ACK for a local pending set operation.
|
|
@@ -393,11 +392,9 @@ export class SharedMatrix extends SharedObject {
|
|
|
393
392
|
}
|
|
394
393
|
}
|
|
395
394
|
else {
|
|
396
|
-
const
|
|
397
|
-
const adjustedRow = this.rows.adjustPosition(row, refSeq, rowClientId);
|
|
395
|
+
const adjustedRow = this.rows.adjustPosition(row, rawMessage);
|
|
398
396
|
if (adjustedRow !== undefined) {
|
|
399
|
-
const
|
|
400
|
-
const adjustedCol = this.cols.adjustPosition(col, refSeq, colClientId);
|
|
397
|
+
const adjustedCol = this.cols.adjustPosition(col, rawMessage);
|
|
401
398
|
if (adjustedCol !== undefined) {
|
|
402
399
|
const rowHandle = this.rows.getAllocatedHandle(adjustedRow);
|
|
403
400
|
const colHandle = this.cols.getAllocatedHandle(adjustedCol);
|
package/lib/matrix.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matrix.js","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAQtD,OAAO,EAEH,uBAAuB,EACvB,YAAY,EACZ,YAAY,GAEf,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAO3F,OAAO,EAAE,kBAAkB,EAAwC,MAAM,4BAA4B,CAAC;AACtG,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAsB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAU,aAAa,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AA2BpD;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,YACT,SAAQ,YAAY;IAcpB,YAAY,OAA+B,EAAS,EAAU,EAAE,UAA8B;QAC1F,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QADA,OAAE,GAAF,EAAE,CAAQ;QAV7C,cAAS,GAAG,IAAI,GAAG,EAAkC,CAAC;QAO/D,UAAK,GAAG,IAAI,aAAa,EAAiB,CAAC,CAAK,sBAAsB;QACtE,YAAO,GAAG,IAAI,aAAa,EAAU,CAAC,CAAU,yBAAyB;QAihBjF,sFAAsF;QACrE,eAAU,GAAG,CAAC,QAAgB,EAAE,YAAoB,EAAE,aAAqB,EAAE,EAAE;YAC5F,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;gBACnC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;aACrE;QACL,CAAC,CAAC;QAEF,sFAAsF;QACrE,eAAU,GAAG,CAAC,QAAgB,EAAE,YAAoB,EAAE,aAAqB,EAAE,EAAE;YAC5F,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;gBACnC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;aACrE;QACL,CAAC,CAAC;QAEe,yBAAoB,GAAG,CAAC,UAAoB,EAAE,EAAE;YAC7D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;gBAChC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;gBACnE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;aACxE;QACL,CAAC,CAAC;QAEe,yBAAoB,GAAG,CAAC,UAAoB,EAAE,EAAE;YAC7D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;gBAChC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;gBACnE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;aACxE;QACL,CAAC,CAAC;QAtiBE,IAAI,CAAC,IAAI,GAAG,IAAI,iBAAiB,oBAE7B,IAAI,CAAC,MAAM,EACX,OAAO,EACP,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAE/B,IAAI,CAAC,IAAI,GAAG,IAAI,iBAAiB,oBAE7B,IAAI,CAAC,MAAM,EACX,OAAO,EACP,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACnC,CAAC;IAxBM,MAAM,CAAC,UAAU,KAAK,OAAO,IAAI,mBAAmB,EAAE,CAAC,CAAC,CAAC;IA4BhE;;OAEG;IACI,QAAQ,CAAC,QAAuB;QACnC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,EAC1B,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAEpF,IAAI,CAAC,IAAI,GAAG,IAAI,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC;IAED,qBAAqB;IAErB,IAAY,UAAU,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1D,IAAY,UAAU,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAE1D;;OAEG;IACI,MAAM,CAAC,MAAM,CAAI,OAA+B,EAAE,EAAW;QAChE,OAAO,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,mBAAmB,CAAC,IAAI,CAAoB,CAAC;IAClF,CAAC;IAED,0BAA0B;IAE1B,UAAU,CACN,QAAwC;QAExC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,WAAW,CAAC,QAAwC;QAChD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,6BAA6B;IAE7B,wBAAwB;IAExB,IAAW,QAAQ,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACvD,IAAW,QAAQ,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAEhD,OAAO,CAAC,GAAW,EAAE,GAAW;QACnC,kFAAkF;QAClF,iFAAiF;QACjF,6EAA6E;QAE7E,4DAA4D;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE;YAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACjD,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE;gBAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aACnD;SACJ;aAAM;YACH,gFAAgF;YAChF,oCAAoC;YACpC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;SAC3C;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAW,cAAc,KAAqC,OAAO,IAAI,CAAC,CAAC,CAAC;IAE5E,2BAA2B;IAEpB,OAAO,CAAC,GAAW,EAAE,GAAW,EAAE,KAAoB;QACzD,MAAM,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ;eAC/B,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,EAClC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAErD,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAElC,2EAA2E;QAC3E,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;YAC5C,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;SAC/C;IACL,CAAC;IAEM,QAAQ,CACX,QAAgB,EAChB,QAAgB,EAChB,QAAgB,EAChB,MAAkC;QAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;QAErD,MAAM,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;eAC3C,CAAC,CAAC,IAAI,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;eAC3C,CAAC,CAAC,IAAI,QAAQ,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;eACzD,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,EAC3C,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACnC,IAAI,CAAC,GAAG,QAAQ,CAAC;QACjB,IAAI,CAAC,GAAG,QAAQ,CAAC;QAEjB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YACxB,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAE9B,IAAI,EAAE,CAAC,KAAK,MAAM,EAAE;gBAChB,CAAC,GAAG,QAAQ,CAAC;gBACb,CAAC,EAAE,CAAC;aACP;SACJ;QAED,2EAA2E;QAC3E,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;YAC5C,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;SACvE;IACL,CAAC;IAEO,WAAW,CACf,GAAW,EACX,GAAW,EACX,KAAoB,EACpB,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAC7C,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;QAE7C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;YACzB,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACxD,IAAI,QAAQ,KAAK,IAAI,EAAE;gBACnB,QAAQ,GAAG,SAAS,CAAC;aACxB;YAED,IAAI,CAAC,IAAI,CAAC,OAAO,CACb,SAAS,EACT,SAAS,EACT,QAAQ,CAAC,CAAC;SACjB;QAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAEhD,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACnB,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;SAC7D;IACL,CAAC;IAEO,aAAa,CACjB,GAAW,EACX,GAAW,EACX,KAAoB,EACpB,SAAiB,EACjB,SAAiB,EACjB,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;QAE9B,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,yEAAyE,CAAC,CAAC;QAE3G,MAAM,EAAE,GAAc;YAClB,IAAI,EAAE,QAAQ,CAAC,GAAG;YAClB,GAAG;YACH,GAAG;YACH,KAAK;SACR,CAAC;QAEF,MAAM,QAAQ,GAAmB;YAC7B,SAAS;YACT,SAAS;YACT,QAAQ;SACX,CAAC;QAEF,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;IAEO,mBAAmB,CACvB,aAAgC,EAChC,cAAiC,EACjC,SAAgD,EAChD,OAAY;QAEZ,oGAAoG;QACpG,wGAAwG;QACxG,mEAAmE;QACnE,MAAM,QAAQ,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;QAC1D,MAAM,cAAc,GAAG,cAAc,CAAC,eAAe,EAAE,CAAC;QAExD,4GAA4G;QAC5G,6DAA6D;QAC7D,MAAM,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ,EACtC,KAAK,CAAC,iGAAiG,CAAC,CAAC;QAE7G,cAAc,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEnC,sGAAsG;QACtG,sFAAsF;QACtF,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACnB,oFAAoF;YACpF,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;YAE3B,IAAI,CAAC,kBAAkB,CACnB,OAAO,EACP,aAAa,CAAC,wBAAwB,CAClC,OAAO,CAAC,IAAI,KAAK,kBAAkB,CAAC,KAAK;gBACrC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM;gBACpB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACrB;IACL,CAAC;IAEO,gBAAgB,CAAC,OAAY;QACjC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,qBAAqB,OAAO,CAAC,CAAC;IAC/E,CAAC;IAEM,UAAU,CAAC,QAAgB,EAAE,KAAa;QAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;IAEM,UAAU,CAAC,QAAgB,EAAE,KAAa;QAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;IAEO,gBAAgB,CAAC,OAAY;QACjC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,qBAAqB,OAAO,CAAC,CAAC;IAC/E,CAAC;IAEM,UAAU,CAAC,QAAgB,EAAE,KAAa;QAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;IAEM,UAAU,CAAC,QAAgB,EAAE,KAAa;QAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,gBAAgB,CAAQ,eAAe,CAAC,OAAiB;QACrD,MAAM,QAAQ,GAAG,OAA6B,CAAC;QAE/C,kEAAkE;QAClE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;QACnF,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAE1B,kFAAkF;QAClF,0BAA0B;QAC1B,QAAQ,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAEzC,+EAA+E;QAC/E,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAC9B,QAAQ;QACR,mBAAmB,CAAC,CAAC;QACrB,oBAAoB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEhD,uEAAuE;QACvE,IAAI,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC;QACvC,KAAK,IAAI,GAAG,GAAG,QAAQ,EAAE,GAAG,GAAG,QAAQ,GAAG,QAAQ,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE;YACpE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;gBAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBACvD,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;oBAC5D,IAAI,CAAC,aAAa,CACd,GAAG,EACH,GAAG,EACH,KAAK,EACL,SAAS,EACT,SAAS,CAAC,CAAC;iBAClB;aACJ;SACJ;QAED,2EAA2E;QAC3E,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;YAC5C,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;SACrF;IACL,CAAC;IAED,gBAAgB,CAAQ,eAAe,CAAC,OAAiB;QACrD,MAAM,QAAQ,GAAG,OAA6B,CAAC;QAE/C,qEAAqE;QACrE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;QACnF,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAE1B,kFAAkF;QAClF,0BAA0B;QAC1B,QAAQ,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAEzC,+EAA+E;QAC/E,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAC9B,QAAQ;QACR,mBAAmB,CAAC,CAAC;QACrB,oBAAoB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEhD,uEAAuE;QACvE,IAAI,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC;QACvC,KAAK,IAAI,GAAG,GAAG,QAAQ,EAAE,GAAG,GAAG,QAAQ,GAAG,QAAQ,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE;YACpE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;gBAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBACvD,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;oBAC5D,IAAI,CAAC,aAAa,CACd,GAAG,EACH,GAAG,EACH,KAAK,EACL,SAAS,EACT,SAAS,CAAC,CAAC;iBAClB;aACJ;SACJ;QAED,2EAA2E;QAC3E,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;YAC5C,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;SACrF;IACL,CAAC;IAES,aAAa,CAAC,UAA4B;QAChD,MAAM,OAAO,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACzC,OAAO,CAAC,YAAY,oBAAoB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,YAAY,oBAAoB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,OAAO,sBACX,UAAU,CAAC,SAAS,CAAC;YACjB,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YACrB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;SAC1B,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACrB,OAAO,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,CAAC;IAED;;;OAGG;IACO,iBAAiB,CAAC,UAA6B;QACrD,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;YAC1C,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;gBAC1C,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;aAC7D;SACJ;IACL,CAAC;IAED;;;;;OAKG;IACK,YAAY;QAChB,oGAAoG;QACpG,qGAAqG;QACrG,mGAAmG;QACnG,+BAA+B;QAE/B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,CAAC;QACvC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;IAClD,CAAC;IAES,kBAAkB,CAAC,OAAY,EAAE,eAAqB;QAC5D,0DAA0D;QAC1D,sEAAsE;QACtE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAEtG,KAAK,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,CAAC;QAE1G,0EAA0E;QAC1E,MAAM,CACF,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,EAC7E,KAAK,CAAC,4DAA4D,CACrE,CAAC;IACN,CAAC;IAES,SAAS;;QACf,8DAA8D;QAC9D,qFAAqF;QACrF,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACnB,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,MAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,mCAAI,UAAU,CAAC,CAAC;YAC1E,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,MAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,mCAAI,UAAU,CAAC,CAAC;SAC7E;IACL,CAAC;IAES,SAAS;QACf,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,aAAa,KAAK,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,aAAa,EAC1F,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAEpF,6FAA6F;QAC7F,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,QAAkB,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,QAAkB,CAAC,CAAC;IAC1E,CAAC;IAES,YAAY,CAAC,OAAY,EAAE,eAAwB;QACzD,QAAQ,OAAO,CAAC,MAAM,EAAE;YACpB;gBACI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAC/C,OAAuB,EACvB,eAAgD,CAAC,CAAC,CAAC;gBACvD,MAAM;YACV;gBACI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAC/C,OAAuB,EACvB,eAAgD,CAAC,CAAC,CAAC;gBACvD,MAAM;YACV,OAAO,CAAC,CAAC;gBACL,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAErF,MAAM,KAAK,GAAG,OAAoB,CAAC;gBACnC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,eAAiC,CAAC;gBAE7E,qFAAqF;gBACrF,yFAAyF;gBACzF,qFAAqF;gBACrF,IAAI,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE;oBAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;oBAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;oBAE5D,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;wBACtB,IAAI,CAAC,aAAa,CACd,GAAG,EACH,GAAG,EACH,KAAK,CAAC,KAAK,EACX,SAAS,EACT,SAAS,EACT,QAAQ,CACX,CAAC;qBACL;iBACJ;gBACD,MAAM;aACT;SACJ;IACL,CAAC;IAES,YAAY,KAAI,CAAC;IAE3B;;OAEG;IACO,KAAK,CAAC,QAAQ,CAAC,OAA+B;QACpD,IAAI;YACA,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAChB,IAAI,CAAC,OAAO,EACZ,IAAI,sBAAsB,CAAC,OAAO,oBAAoB,EACtD,IAAI,CAAC,UAAU,CAAC,CAAC;YACrB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAChB,IAAI,CAAC,OAAO,EACZ,IAAI,sBAAsB,CAAC,OAAO,oBAAoB,EACtD,IAAI,CAAC,UAAU,CAAC,CAAC;YACrB,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,GAAG,MAAM,eAAe,CAAC,OAAO,uBAAsB,IAAI,CAAC,UAAU,CAAC,CAAC;YAE1G,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;SACxD;QAAC,OAAO,KAAK,EAAE;YACZ,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,KAAK,CAAC,CAAC;SACxE;IACL,CAAC;IAES,WAAW,CAAC,UAAqC,EAAE,KAAc,EAAE,eAAwB;QACjG,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAEtD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAE9B,QAAQ,QAAQ,CAAC,MAAM,EAAE;YACrB;gBACI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC/B,MAAM;YACV;gBACI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC/B,MAAM;YACV,OAAO,CAAC,CAAC;gBACL,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,GAAG,EACjC,KAAK,CAAC,2DAA2D,CAAC,CAAC;gBAEvE,MAAM,EAAE,uBAAuB,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC;gBACjE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC;gBAE9B,IAAI,KAAK,EAAE;oBACP,8DAA8D;oBAC9D,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,eAAiC,CAAC;oBAE7E,+EAA+E;oBAC/E,gEAAgE;oBAChE,IAAI,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE;wBAC3D,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;qBACzD;iBACJ;qBAAM;oBACH,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;oBAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;oBAEvE,IAAI,WAAW,KAAK,SAAS,EAAE;wBAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;wBAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;wBAEvE,IAAI,WAAW,KAAK,SAAS,EAAE;4BAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;4BAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;4BAE5D,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC,SAAS,CAAC,EACvD,KAAK,CAAC,wDAAwD,CAAC,CAAC;4BAEpE,oFAAoF;4BACpF,gDAAgD;4BAChD,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,SAAS,EAAE;gCAC1D,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;gCAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;gCAEhD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;oCAC5C,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;iCAC/D;6BACJ;yBACJ;qBACJ;iBACJ;aACJ;SACJ;IACL,CAAC;IA8BD;;;;;;;OAOG;IACK,oBAAoB,CAAC,SAAiB,EAAE,SAAiB,EAAE,QAAgB;QAC/E,oEAAoE;QACpE,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAE,CAAC;QAEpE,yFAAyF;QACzF,+FAA+F;QAC/F,kCAAkC;QAClC,MAAM,CAAC,CAAC,CAAC,eAAe,GAAG,QAAQ,CAAC;QAChC,mCAAmC;QACnC,KAAK,CAAC,uGAAuG,CAAC,CAAC;QAEnH,wFAAwF;QACxF,mDAAmD;QACnD,OAAO,eAAe,KAAK,QAAQ,CAAC;IACxC,CAAC;IAEM,QAAQ;QACX,IAAI,CAAC,GAAG,UAAU,IAAI,CAAC,OAAO,CAAC,QAAQ,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;QAE5G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;YACpC,CAAC,IAAI,KAAK,CAAC;YACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;gBACpC,IAAI,CAAC,GAAG,CAAC,EAAE;oBACP,CAAC,IAAI,IAAI,CAAC;iBACb;gBAED,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;aACxE;YACD,CAAC,IAAI,KAAK,CAAC;SACd;QAED,OAAO,GAAG,CAAC,IAAI,CAAC;IACpB,CAAC;IAED;;OAEG;IACO,cAAc,CAAC,OAAY;QACjC,IAAI,OAAO,CAAC,MAAM,sBAAsB,IAAI,OAAO,CAAC,MAAM,sBAAsB,EAAE;YAC9E,MAAM,EAAE,GAAG,OAAuB,CAAC;YACnC,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACnF,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACpF,MAAM,QAAQ,GAAG,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;YAC1D,MAAM,cAAc,GAAG,cAAc,CAAC,eAAe,EAAE,CAAC;YAExD,MAAM,CACF,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAClC,KAAK,CAER,CAAC;YAEF,cAAc,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAEnC,OAAO,QAAQ,CAAC;SACnB;aAAM;YACH,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAErF,MAAM,KAAK,GAAG,OAAoB,CAAC;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;gBACzB,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBACxD,IAAI,QAAQ,KAAK,IAAI,EAAE;oBACnB,QAAQ,GAAG,SAAS,CAAC;iBACxB;gBAED,IAAI,CAAC,IAAI,CAAC,OAAO,CACb,SAAS,EACT,SAAS,EACT,QAAQ,CAAC,CAAC;aACjB;YAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAmB;gBAC7B,SAAS;gBACT,SAAS;gBACT,QAAQ;aACX,CAAC;YAEF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YACrD,OAAO,QAAQ,CAAC;SACnB;IACL,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n IFluidDataStoreRuntime,\n IChannelStorageService,\n Serializable,\n IChannelAttributes,\n} from \"@fluidframework/datastore-definitions\";\nimport {\n IFluidSerializer,\n makeHandlesSerializable,\n parseHandles,\n SharedObject,\n SummarySerializer,\n} from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ObjectStoragePartition, SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport {\n IMatrixProducer,\n IMatrixConsumer,\n IMatrixReader,\n IMatrixWriter,\n} from \"@tiny-calc/nano\";\nimport { MergeTreeDeltaType, IMergeTreeOp, SegmentGroup, ISegment } from \"@fluidframework/merge-tree\";\nimport { MatrixOp } from \"./ops\";\nimport { PermutationVector, PermutationSegment } 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 rows = \"rows\",\n cols = \"cols\",\n cells = \"cells\",\n}\n\ninterface ISetOp<T> {\n type: MatrixOp.set;\n row: number;\n col: number;\n value: MatrixItem<T>;\n}\n\ninterface ISetOpMetadata {\n rowHandle: Handle;\n colHandle: Handle;\n localSeq: 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 */\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 */\nexport class SharedMatrix<T = any>\n extends SharedObject\n implements IMatrixProducer<MatrixItem<T>>,\n IMatrixReader<MatrixItem<T>>,\n IMatrixWriter<MatrixItem<T>> {\n private readonly consumers = new Set<IMatrixConsumer<MatrixItem<T>>>();\n\n public static getFactory() { return new SharedMatrixFactory(); }\n\n private readonly rows: PermutationVector; // Map logical row to storage handle (if any)\n private readonly cols: PermutationVector; // Map logical col to storage handle (if any)\n\n private cells = new SparseArray2D<MatrixItem<T>>(); // Stores cell values.\n private pending = new SparseArray2D<number>(); // Tracks pending writes.\n\n constructor(runtime: IFluidDataStoreRuntime, public id: string, attributes: IChannelAttributes) {\n super(id, runtime, attributes, \"fluid_matrix_\");\n\n this.rows = new PermutationVector(\n SnapshotPath.rows,\n this.logger,\n runtime,\n this.onRowDelta,\n this.onRowHandlesRecycled);\n\n this.cols = new PermutationVector(\n SnapshotPath.cols,\n this.logger,\n runtime,\n this.onColDelta,\n this.onColHandlesRecycled);\n }\n\n private undo?: MatrixUndoProvider<T>;\n\n /**\n * Subscribes the given IUndoConsumer to the matrix.\n */\n public openUndo(consumer: IUndoConsumer) {\n assert(this.undo === undefined,\n 0x019 /* \"SharedMatrix.openUndo() supports at most a single IUndoConsumer.\" */);\n\n this.undo = new MatrixUndoProvider(consumer, this, this.rows, this.cols);\n }\n\n // TODO: closeUndo()?\n\n private get rowHandles() { return this.rows.handleCache; }\n private get colHandles() { return this.cols.handleCache; }\n\n /**\n * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.create}\n */\n public static create<T>(runtime: IFluidDataStoreRuntime, id?: string) {\n return runtime.createChannel(id, SharedMatrixFactory.Type) as SharedMatrix<T>;\n }\n\n // #region IMatrixProducer\n\n openMatrix(\n consumer: IMatrixConsumer<MatrixItem<T>>,\n ): IMatrixReader<MatrixItem<T>> {\n this.consumers.add(consumer);\n return this;\n }\n\n closeMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): void {\n this.consumers.delete(consumer);\n }\n\n // #endregion IMatrixProducer\n\n // #region IMatrixReader\n\n public get rowCount() { return this.rows.getLength(); }\n public get colCount() { return this.cols.getLength(); }\n\n public getCell(row: number, col: number): MatrixItem<T> {\n // Perf: When possible, bounds checking is performed inside the implementation for\n // 'getHandle()' so that it can be elided in the case of a cache hit. This\n // yields an ~40% improvement in the case of a cache hit (node v12 x64)\n\n // Map the logical (row, col) to associated storage handles.\n const rowHandle = this.rowHandles.getHandle(row);\n if (isHandleValid(rowHandle)) {\n const colHandle = this.colHandles.getHandle(col);\n if (isHandleValid(colHandle)) {\n return this.cells.getCell(rowHandle, colHandle);\n }\n } else {\n // If we early exit because the given rowHandle is unallocated, we still need to\n // bounds-check the 'col' parameter.\n ensureRange(col, this.cols.getLength());\n }\n\n return undefined;\n }\n\n public get matrixProducer(): IMatrixProducer<MatrixItem<T>> { return this; }\n\n // #endregion IMatrixReader\n\n public setCell(row: number, col: number, value: MatrixItem<T>) {\n assert(0 <= row && row < this.rowCount\n && 0 <= col && col < this.colCount,\n 0x01a /* \"Trying to set out-of-bounds cell!\" */);\n\n this.setCellCore(row, col, value);\n\n // Avoid reentrancy by raising change notifications after the op is queued.\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(row, col, 1, 1, this);\n }\n }\n\n public setCells(\n rowStart: number,\n colStart: number,\n colCount: number,\n values: readonly (MatrixItem<T>)[],\n ) {\n const rowCount = Math.ceil(values.length / colCount);\n\n assert((0 <= rowStart && rowStart < this.rowCount)\n && (0 <= colStart && colStart < this.colCount)\n && (1 <= colCount && colCount <= (this.colCount - colStart))\n && (rowCount <= (this.rowCount - rowStart)),\n 0x01b /* \"Trying to set multiple out-of-bounds cells!\" */);\n\n const endCol = colStart + colCount;\n let r = rowStart;\n let c = colStart;\n\n for (const value of values) {\n this.setCellCore(r, c, value);\n\n if (++c === endCol) {\n c = colStart;\n r++;\n }\n }\n\n // Avoid reentrancy by raising change notifications after the op is queued.\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(rowStart, colStart, rowCount, colCount, this);\n }\n }\n\n private setCellCore(\n row: number,\n col: number,\n value: MatrixItem<T>,\n rowHandle = this.rows.getAllocatedHandle(row),\n colHandle = this.cols.getAllocatedHandle(col),\n ) {\n if (this.undo !== undefined) {\n let oldValue = this.cells.getCell(rowHandle, colHandle);\n if (oldValue === null) {\n oldValue = undefined;\n }\n\n this.undo.cellSet(\n rowHandle,\n colHandle,\n oldValue);\n }\n\n this.cells.setCell(rowHandle, colHandle, value);\n\n if (this.isAttached()) {\n this.sendSetCellOp(row, col, value, rowHandle, colHandle);\n }\n }\n\n private sendSetCellOp(\n row: number,\n col: number,\n value: MatrixItem<T>,\n rowHandle: Handle,\n colHandle: Handle,\n localSeq = this.nextLocalSeq(),\n ) {\n assert(this.isAttached(), 0x1e2 /* \"Caller must ensure 'isAttached()' before calling 'sendSetCellOp'.\" */);\n\n const op: ISetOp<T> = {\n type: MatrixOp.set,\n row,\n col,\n value,\n };\n\n const metadata: ISetOpMetadata = {\n rowHandle,\n colHandle,\n localSeq,\n };\n\n this.submitLocalMessage(op, metadata);\n this.pending.setCell(rowHandle, colHandle, localSeq);\n }\n\n private submitVectorMessage(\n currentVector: PermutationVector,\n oppositeVector: PermutationVector,\n dimension: SnapshotPath.rows | SnapshotPath.cols,\n message: any,\n ) {\n // Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n // and the SharedMatrix's cell data. Instead, we externally advance each MergeTree's 'localSeq' counter\n // for each submitted op it not aware of to keep them synchronized.\n const localSeq = currentVector.getCollabWindow().localSeq;\n const oppositeWindow = oppositeVector.getCollabWindow();\n\n // Note that the comparison is '>=' because, in the case the MergeTree is regenerating ops for reconnection,\n // the MergeTree submits the op with the original 'localSeq'.\n assert(localSeq >= oppositeWindow.localSeq,\n 0x01c /* \"The 'localSeq' of the vector submitting an op must >= the 'localSeq' of the other vector.\" */);\n\n oppositeWindow.localSeq = localSeq;\n\n // If the SharedMatrix is local, it's state will be submitted via a Snapshot when initially connected.\n // Do not queue a message or track the pending op, as there will never be an ACK, etc.\n if (this.isAttached()) {\n // Record whether this `op` targets rows or cols. (See dispatch in `processCore()`)\n message.target = dimension;\n\n this.submitLocalMessage(\n message,\n currentVector.peekPendingSegmentGroups(\n message.type === MergeTreeDeltaType.GROUP\n ? message.ops.length\n : 1));\n }\n }\n\n private submitColMessage(message: any) {\n this.submitVectorMessage(this.cols, this.rows, SnapshotPath.cols, message);\n }\n\n public insertCols(colStart: number, count: number) {\n this.submitColMessage(this.cols.insert(colStart, count));\n }\n\n public removeCols(colStart: number, count: number) {\n this.submitColMessage(this.cols.remove(colStart, count));\n }\n\n private submitRowMessage(message: any) {\n this.submitVectorMessage(this.rows, this.cols, SnapshotPath.rows, message);\n }\n\n public insertRows(rowStart: number, count: number) {\n this.submitRowMessage(this.rows.insert(rowStart, count));\n }\n\n public removeRows(rowStart: number, count: number) {\n this.submitRowMessage(this.rows.remove(rowStart, count));\n }\n\n /** @internal */ public _undoRemoveRows(segment: ISegment) {\n const original = segment as PermutationSegment;\n\n // (Re)insert the removed number of rows at the original position.\n const { op, inserted } = this.rows.insertRelative(original, original.cachedLength);\n this.submitRowMessage(op);\n\n // Transfer handles and undo/redo tracking groups from the original segment to the\n // newly inserted segment.\n original.transferToReplacement(inserted);\n\n // Invalidate the handleCache in case it was populated during the 'rowsChanged'\n // callback, which occurs before the handle span is populated.\n const rowStart = this.rows.getPosition(inserted);\n this.rows.handleCache.itemsChanged(\n rowStart,\n /* removedCount: */ 0,\n /* insertedCount: */ inserted.cachedLength);\n\n // Generate setCell ops for each populated cell in the reinserted rows.\n let rowHandle = inserted.start;\n const rowCount = inserted.cachedLength;\n for (let row = rowStart; row < rowStart + rowCount; row++, rowHandle++) {\n for (let col = 0; col < this.colCount; col++) {\n const colHandle = this.colHandles.getHandle(col);\n const value = this.cells.getCell(rowHandle, colHandle);\n if (this.isAttached() && value !== undefined && value !== null) {\n this.sendSetCellOp(\n row,\n col,\n value,\n rowHandle,\n colHandle);\n }\n }\n }\n\n // Avoid reentrancy by raising change notifications after the op is queued.\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(rowStart, /* colStart: */ 0, rowCount, this.colCount, this);\n }\n }\n\n /** @internal */ public _undoRemoveCols(segment: ISegment) {\n const original = segment as PermutationSegment;\n\n // (Re)insert the removed number of columns at the original position.\n const { op, inserted } = this.cols.insertRelative(original, original.cachedLength);\n this.submitColMessage(op);\n\n // Transfer handles and undo/redo tracking groups from the original segment to the\n // newly inserted segment.\n original.transferToReplacement(inserted);\n\n // Invalidate the handleCache in case it was populated during the 'colsChanged'\n // callback, which occurs before the handle span is populated.\n const colStart = this.cols.getPosition(inserted);\n this.cols.handleCache.itemsChanged(\n colStart,\n /* removedCount: */ 0,\n /* insertedCount: */ inserted.cachedLength);\n\n // Generate setCell ops for each populated cell in the reinserted cols.\n let colHandle = inserted.start;\n const colCount = inserted.cachedLength;\n for (let col = colStart; col < colStart + colCount; col++, colHandle++) {\n for (let row = 0; row < this.rowCount; row++) {\n const rowHandle = this.rowHandles.getHandle(row);\n const value = this.cells.getCell(rowHandle, colHandle);\n if (this.isAttached() && value !== undefined && value !== null) {\n this.sendSetCellOp(\n row,\n col,\n value,\n rowHandle,\n colHandle);\n }\n }\n }\n\n // Avoid reentrancy by raising change notifications after the op is queued.\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(/* rowStart: */ 0, colStart, this.rowCount, colCount, this);\n }\n }\n\n protected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n const builder = new SummaryTreeBuilder();\n builder.addWithStats(SnapshotPath.rows, this.rows.summarize(this.runtime, this.handle, serializer));\n builder.addWithStats(SnapshotPath.cols, this.cols.summarize(this.runtime, this.handle, serializer));\n builder.addBlob(SnapshotPath.cells,\n serializer.stringify([\n this.cells.snapshot(),\n this.pending.snapshot(),\n ], this.handle));\n return builder.getSummaryTree();\n }\n\n /**\n * Runs serializer on the GC data for this SharedMatrix.\n * All the IFluidHandle's stored in the cells represent routes to other objects.\n */\n protected processGCDataCore(serializer: SummarySerializer) {\n for (let row = 0; row < this.rowCount; row++) {\n for (let col = 0; col < this.colCount; col++) {\n serializer.stringify(this.getCell(row, col), this.handle);\n }\n }\n }\n\n /**\n * Advances the 'localSeq' counter for the cell data operation currently being queued.\n *\n * Do not use with 'submitColMessage()/submitRowMessage()' as these helpers + the MergeTree will\n * automatically advance 'localSeq'.\n */\n private nextLocalSeq() {\n // Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n // and the SharedMatrix's cell data. Instead, we externally bump each MergeTree's 'localSeq' counter\n // for SharedMatrix ops it's not aware of to keep them synchronized. (For cell data operations, we\n // need to bump both counters.)\n\n this.cols.getCollabWindow().localSeq++;\n return ++this.rows.getCollabWindow().localSeq;\n }\n\n protected submitLocalMessage(message: any, localOpMetadata?: any) {\n // TODO: Recommend moving this assertion into SharedObject\n // (See https://github.com/microsoft/FluidFramework/issues/2559)\n assert(this.isAttached() === true, 0x01d /* \"Trying to submit message to runtime while detached!\" */);\n\n super.submitLocalMessage(makeHandlesSerializable(message, this.serializer, this.handle), localOpMetadata);\n\n // Ensure that row/col 'localSeq' are synchronized (see 'nextLocalSeq()').\n assert(\n this.rows.getCollabWindow().localSeq === this.cols.getCollabWindow().localSeq,\n 0x01e /* \"Row and col collab window 'localSeq' desynchronized!\" */,\n );\n }\n\n protected didAttach() {\n // We've attached we need to start generating and sending ops.\n // so start collaboration and provide a default client id incase we are not connected\n if (this.isAttached()) {\n this.rows.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n this.cols.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n }\n }\n\n protected onConnect() {\n assert(this.rows.getCollabWindow().collaborating === this.cols.getCollabWindow().collaborating,\n 0x01f /* \"Row and col collab window 'collaborating' status desynchronized!\" */);\n\n // Update merge tree collaboration information with new client ID and then resend pending ops\n this.rows.startOrUpdateCollaboration(this.runtime.clientId as string);\n this.cols.startOrUpdateCollaboration(this.runtime.clientId as string);\n }\n\n protected reSubmitCore(content: any, localOpMetadata: unknown) {\n switch (content.target) {\n case SnapshotPath.cols:\n this.submitColMessage(this.cols.regeneratePendingOp(\n content as IMergeTreeOp,\n localOpMetadata as SegmentGroup | SegmentGroup[]));\n break;\n case SnapshotPath.rows:\n this.submitRowMessage(this.rows.regeneratePendingOp(\n content as IMergeTreeOp,\n localOpMetadata as SegmentGroup | SegmentGroup[]));\n break;\n default: {\n assert(content.type === MatrixOp.set, 0x020 /* \"Unknown SharedMatrix 'op' type.\" */);\n\n const setOp = content as ISetOp<T>;\n const { rowHandle, colHandle, localSeq } = localOpMetadata as ISetOpMetadata;\n\n // If there are more pending local writes to the same row/col handle, it is important\n // to skip resubmitting this op since it is possible the row/col handle has been recycled\n // and now refers to a different position than when this op was originally submitted.\n if (this.isLatestPendingWrite(rowHandle, colHandle, localSeq)) {\n const row = this.rows.handleToPosition(rowHandle, localSeq);\n const col = this.cols.handleToPosition(colHandle, localSeq);\n\n if (row >= 0 && col >= 0) {\n this.sendSetCellOp(\n row,\n col,\n setOp.value,\n rowHandle,\n colHandle,\n localSeq,\n );\n }\n }\n break;\n }\n }\n }\n\n protected onDisconnect() {}\n\n /**\n * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n */\n protected async loadCore(storage: IChannelStorageService) {\n try {\n await this.rows.load(\n this.runtime,\n new ObjectStoragePartition(storage, SnapshotPath.rows),\n this.serializer);\n await this.cols.load(\n this.runtime,\n new ObjectStoragePartition(storage, SnapshotPath.cols),\n this.serializer);\n const [cellData, pendingCliSeqData] = await deserializeBlob(storage, SnapshotPath.cells, this.serializer);\n\n this.cells = SparseArray2D.load(cellData);\n this.pending = SparseArray2D.load(pendingCliSeqData);\n } catch (error) {\n this.logger.sendErrorEvent({ eventName: \"MatrixLoadFailed\" }, error);\n }\n }\n\n protected processCore(rawMessage: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n const msg = parseHandles(rawMessage, this.serializer);\n\n const contents = msg.contents;\n\n switch (contents.target) {\n case SnapshotPath.cols:\n this.cols.applyMsg(msg, local);\n break;\n case SnapshotPath.rows:\n this.rows.applyMsg(msg, local);\n break;\n default: {\n assert(contents.type === MatrixOp.set,\n 0x021 /* \"SharedMatrix message contents have unexpected type!\" */);\n\n const { referenceSequenceNumber: refSeq, clientId } = rawMessage;\n const { row, col } = contents;\n\n if (local) {\n // We are receiving the ACK for a local pending set operation.\n const { rowHandle, colHandle, localSeq } = localOpMetadata as ISetOpMetadata;\n\n // If this is the most recent write to the cell by the local client, remove our\n // entry from 'pendingCliSeqs' to resume allowing remote writes.\n if (this.isLatestPendingWrite(rowHandle, colHandle, localSeq)) {\n this.pending.setCell(rowHandle, colHandle, undefined);\n }\n } else {\n const rowClientId = this.rows.getOrAddShortClientId(clientId);\n const adjustedRow = this.rows.adjustPosition(row, refSeq, rowClientId);\n\n if (adjustedRow !== undefined) {\n const colClientId = this.cols.getOrAddShortClientId(clientId);\n const adjustedCol = this.cols.adjustPosition(col, refSeq, colClientId);\n\n if (adjustedCol !== undefined) {\n const rowHandle = this.rows.getAllocatedHandle(adjustedRow);\n const colHandle = this.cols.getAllocatedHandle(adjustedCol);\n\n assert(isHandleValid(rowHandle) && isHandleValid(colHandle),\n 0x022 /* \"SharedMatrix row and/or col handles are invalid!\" */);\n\n // If there is a pending (unACKed) local write to the same cell, skip the current op\n // since it \"happened before\" the pending write.\n if (this.pending.getCell(rowHandle, colHandle) === undefined) {\n const { value } = contents;\n this.cells.setCell(rowHandle, colHandle, value);\n\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(adjustedRow, adjustedCol, 1, 1, this);\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Invoked by PermutationVector to notify IMatrixConsumers of row insertion/deletions.\n private readonly onRowDelta = (position: number, removedCount: number, insertedCount: number) => {\n for (const consumer of this.consumers) {\n consumer.rowsChanged(position, removedCount, insertedCount, this);\n }\n };\n\n // Invoked by PermutationVector to notify IMatrixConsumers of col insertion/deletions.\n private readonly onColDelta = (position: number, removedCount: number, insertedCount: number) => {\n for (const consumer of this.consumers) {\n consumer.colsChanged(position, removedCount, insertedCount, this);\n }\n };\n\n private readonly onRowHandlesRecycled = (rowHandles: Handle[]) => {\n for (const rowHandle of rowHandles) {\n this.cells.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n this.pending.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n }\n };\n\n private readonly onColHandlesRecycled = (colHandles: Handle[]) => {\n for (const colHandle of colHandles) {\n this.cells.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n this.pending.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n }\n };\n\n /**\n * Returns true if the latest pending write to the cell indicated by the given row/col handles\n * matches the given 'localSeq'.\n *\n * A return value of `true` indicates that there are no later local operations queued that will\n * clobber the write op at the given 'localSeq'. This includes later ops that overwrite the cell\n * with a different value as well as row/col removals that might recycled the given row/col handles.\n */\n private isLatestPendingWrite(rowHandle: Handle, colHandle: Handle, localSeq: number) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const pendingLocalSeq = this.pending.getCell(rowHandle, colHandle)!;\n\n // Note while we're awaiting the ACK for a local set, it's possible for the row/col to be\n // locally removed and the row/col handles recycled. If this happens, the pendingLocalSeq will\n // be 'undefined' or > 'localSeq'.\n assert(!(pendingLocalSeq < localSeq),\n // eslint-disable-next-line max-len\n 0x023 /* \"The 'localSeq' of pending write (if any) must be <= the localSeq of the currently processed op.\" */);\n\n // If this is the most recent write to the cell by the local client, the stored localSeq\n // will be an exact match for the given 'localSeq'.\n return pendingLocalSeq === localSeq;\n }\n\n public toString() {\n let s = `client:${this.runtime.clientId}\\nrows: ${this.rows.toString()}\\ncols: ${this.cols.toString()}\\n\\n`;\n\n for (let r = 0; r < this.rowCount; r++) {\n s += ` [`;\n for (let c = 0; c < this.colCount; c++) {\n if (c > 0) {\n s += \", \";\n }\n\n s += `${this.serializer.stringify(this.getCell(r, c), this.handle)}`;\n }\n s += \"]\\n\";\n }\n\n return `${s}\\n`;\n }\n\n /**\n * {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}\n */\n protected applyStashedOp(content: any): unknown {\n if (content.target === SnapshotPath.cols || content.target === SnapshotPath.rows) {\n const op = content as IMergeTreeOp;\n const currentVector = content.target === SnapshotPath.cols ? this.cols : this.rows;\n const oppositeVector = content.target === SnapshotPath.cols ? this.rows : this.cols;\n const metadata = currentVector.applyStashedOp(op);\n const localSeq = currentVector.getCollabWindow().localSeq;\n const oppositeWindow = oppositeVector.getCollabWindow();\n\n assert(\n localSeq > oppositeWindow.localSeq,\n 0x2d9,\n /* \"The 'localSeq' of the vector applying stashed op must > the 'localSeq' of the other vector.\" */\n );\n\n oppositeWindow.localSeq = localSeq;\n\n return metadata;\n } else {\n assert(content.type === MatrixOp.set, 0x2da /* \"Unknown SharedMatrix 'op' type.\" */);\n\n const setOp = content as ISetOp<T>;\n const rowHandle = this.rows.getAllocatedHandle(setOp.row);\n const colHandle = this.cols.getAllocatedHandle(setOp.col);\n if (this.undo !== undefined) {\n let oldValue = this.cells.getCell(rowHandle, colHandle);\n if (oldValue === null) {\n oldValue = undefined;\n }\n\n this.undo.cellSet(\n rowHandle,\n colHandle,\n oldValue);\n }\n\n this.cells.setCell(rowHandle, colHandle, setOp.value);\n const localSeq = this.nextLocalSeq();\n const metadata: ISetOpMetadata = {\n rowHandle,\n colHandle,\n localSeq,\n };\n\n this.pending.setCell(rowHandle, colHandle, localSeq);\n return metadata;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"matrix.js","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAQtD,OAAO,EAEH,uBAAuB,EACvB,YAAY,EACZ,YAAY,GAEf,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAO3F,OAAO,EAAE,kBAAkB,EAAwC,MAAM,4BAA4B,CAAC;AACtG,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAsB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAU,aAAa,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AA2BpD;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,YACT,SAAQ,YAAY;IAcpB,YAAY,OAA+B,EAAS,EAAU,EAAE,UAA8B;QAC1F,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QADA,OAAE,GAAF,EAAE,CAAQ;QAV7C,cAAS,GAAG,IAAI,GAAG,EAAkC,CAAC;QAO/D,UAAK,GAAG,IAAI,aAAa,EAAiB,CAAC,CAAK,sBAAsB;QACtE,YAAO,GAAG,IAAI,aAAa,EAAU,CAAC,CAAU,yBAAyB;QA8gBjF,sFAAsF;QACrE,eAAU,GAAG,CAAC,QAAgB,EAAE,YAAoB,EAAE,aAAqB,EAAE,EAAE;YAC5F,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;gBACnC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;aACrE;QACL,CAAC,CAAC;QAEF,sFAAsF;QACrE,eAAU,GAAG,CAAC,QAAgB,EAAE,YAAoB,EAAE,aAAqB,EAAE,EAAE;YAC5F,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;gBACnC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;aACrE;QACL,CAAC,CAAC;QAEe,yBAAoB,GAAG,CAAC,UAAoB,EAAE,EAAE;YAC7D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;gBAChC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;gBACnE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;aACxE;QACL,CAAC,CAAC;QAEe,yBAAoB,GAAG,CAAC,UAAoB,EAAE,EAAE;YAC7D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;gBAChC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;gBACnE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;aACxE;QACL,CAAC,CAAC;QAniBE,IAAI,CAAC,IAAI,GAAG,IAAI,iBAAiB,oBAE7B,IAAI,CAAC,MAAM,EACX,OAAO,EACP,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAE/B,IAAI,CAAC,IAAI,GAAG,IAAI,iBAAiB,oBAE7B,IAAI,CAAC,MAAM,EACX,OAAO,EACP,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACnC,CAAC;IAxBM,MAAM,CAAC,UAAU,KAAK,OAAO,IAAI,mBAAmB,EAAE,CAAC,CAAC,CAAC;IA4BhE;;OAEG;IACI,QAAQ,CAAC,QAAuB;QACnC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,EAC1B,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAEpF,IAAI,CAAC,IAAI,GAAG,IAAI,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC;IAED,qBAAqB;IAErB,IAAY,UAAU,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1D,IAAY,UAAU,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAE1D;;OAEG;IACI,MAAM,CAAC,MAAM,CAAI,OAA+B,EAAE,EAAW;QAChE,OAAO,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,mBAAmB,CAAC,IAAI,CAAoB,CAAC;IAClF,CAAC;IAED,0BAA0B;IAE1B,UAAU,CACN,QAAwC;QAExC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,WAAW,CAAC,QAAwC;QAChD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,6BAA6B;IAE7B,wBAAwB;IAExB,IAAW,QAAQ,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACvD,IAAW,QAAQ,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAEhD,OAAO,CAAC,GAAW,EAAE,GAAW;QACnC,kFAAkF;QAClF,iFAAiF;QACjF,6EAA6E;QAE7E,4DAA4D;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE;YAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACjD,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE;gBAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aACnD;SACJ;aAAM;YACH,gFAAgF;YAChF,oCAAoC;YACpC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;SAC3C;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAW,cAAc,KAAqC,OAAO,IAAI,CAAC,CAAC,CAAC;IAE5E,2BAA2B;IAEpB,OAAO,CAAC,GAAW,EAAE,GAAW,EAAE,KAAoB;QACzD,MAAM,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ;eAC/B,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,EAClC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAErD,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAElC,2EAA2E;QAC3E,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;YAC5C,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;SAC/C;IACL,CAAC;IAEM,QAAQ,CACX,QAAgB,EAChB,QAAgB,EAChB,QAAgB,EAChB,MAAkC;QAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;QAErD,MAAM,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;eAC3C,CAAC,CAAC,IAAI,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;eAC3C,CAAC,CAAC,IAAI,QAAQ,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;eACzD,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,EAC3C,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACnC,IAAI,CAAC,GAAG,QAAQ,CAAC;QACjB,IAAI,CAAC,GAAG,QAAQ,CAAC;QAEjB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YACxB,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAE9B,IAAI,EAAE,CAAC,KAAK,MAAM,EAAE;gBAChB,CAAC,GAAG,QAAQ,CAAC;gBACb,CAAC,EAAE,CAAC;aACP;SACJ;QAED,2EAA2E;QAC3E,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;YAC5C,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;SACvE;IACL,CAAC;IAEO,WAAW,CACf,GAAW,EACX,GAAW,EACX,KAAoB,EACpB,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAC7C,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;QAE7C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;YACzB,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACxD,IAAI,QAAQ,KAAK,IAAI,EAAE;gBACnB,QAAQ,GAAG,SAAS,CAAC;aACxB;YAED,IAAI,CAAC,IAAI,CAAC,OAAO,CACb,SAAS,EACT,SAAS,EACT,QAAQ,CAAC,CAAC;SACjB;QAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAEhD,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACnB,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;SAC7D;IACL,CAAC;IAEO,aAAa,CACjB,GAAW,EACX,GAAW,EACX,KAAoB,EACpB,SAAiB,EACjB,SAAiB,EACjB,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;QAE9B,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,yEAAyE,CAAC,CAAC;QAE3G,MAAM,EAAE,GAAc;YAClB,IAAI,EAAE,QAAQ,CAAC,GAAG;YAClB,GAAG;YACH,GAAG;YACH,KAAK;SACR,CAAC;QAEF,MAAM,QAAQ,GAAmB;YAC7B,SAAS;YACT,SAAS;YACT,QAAQ;SACX,CAAC;QAEF,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;IAEO,mBAAmB,CACvB,aAAgC,EAChC,cAAiC,EACjC,SAAgD,EAChD,OAAY;QAEZ,oGAAoG;QACpG,wGAAwG;QACxG,mEAAmE;QACnE,MAAM,QAAQ,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;QAC1D,MAAM,cAAc,GAAG,cAAc,CAAC,eAAe,EAAE,CAAC;QAExD,4GAA4G;QAC5G,6DAA6D;QAC7D,MAAM,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ,EACtC,KAAK,CAAC,iGAAiG,CAAC,CAAC;QAE7G,cAAc,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEnC,sGAAsG;QACtG,sFAAsF;QACtF,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACnB,oFAAoF;YACpF,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;YAE3B,IAAI,CAAC,kBAAkB,CACnB,OAAO,EACP,aAAa,CAAC,wBAAwB,CAClC,OAAO,CAAC,IAAI,KAAK,kBAAkB,CAAC,KAAK;gBACrC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM;gBACpB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACrB;IACL,CAAC;IAEO,gBAAgB,CAAC,OAAY;QACjC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,qBAAqB,OAAO,CAAC,CAAC;IAC/E,CAAC;IAEM,UAAU,CAAC,QAAgB,EAAE,KAAa;QAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;IAEM,UAAU,CAAC,QAAgB,EAAE,KAAa;QAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;IAEO,gBAAgB,CAAC,OAAY;QACjC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,qBAAqB,OAAO,CAAC,CAAC;IAC/E,CAAC;IAEM,UAAU,CAAC,QAAgB,EAAE,KAAa;QAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;IAEM,UAAU,CAAC,QAAgB,EAAE,KAAa;QAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,gBAAgB,CAAQ,eAAe,CAAC,OAAiB;QACrD,MAAM,QAAQ,GAAG,OAA6B,CAAC;QAE/C,kEAAkE;QAClE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;QACnF,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAE1B,kFAAkF;QAClF,0BAA0B;QAC1B,QAAQ,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAEzC,+EAA+E;QAC/E,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAC9B,QAAQ;QACR,mBAAmB,CAAC,CAAC;QACrB,oBAAoB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEhD,uEAAuE;QACvE,IAAI,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC;QACvC,KAAK,IAAI,GAAG,GAAG,QAAQ,EAAE,GAAG,GAAG,QAAQ,GAAG,QAAQ,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE;YACpE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;gBAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBACvD,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;oBAC5D,IAAI,CAAC,aAAa,CACd,GAAG,EACH,GAAG,EACH,KAAK,EACL,SAAS,EACT,SAAS,CAAC,CAAC;iBAClB;aACJ;SACJ;QAED,2EAA2E;QAC3E,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;YAC5C,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;SACrF;IACL,CAAC;IAED,gBAAgB,CAAQ,eAAe,CAAC,OAAiB;QACrD,MAAM,QAAQ,GAAG,OAA6B,CAAC;QAE/C,qEAAqE;QACrE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;QACnF,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAE1B,kFAAkF;QAClF,0BAA0B;QAC1B,QAAQ,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAEzC,+EAA+E;QAC/E,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAC9B,QAAQ;QACR,mBAAmB,CAAC,CAAC;QACrB,oBAAoB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEhD,uEAAuE;QACvE,IAAI,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC;QACvC,KAAK,IAAI,GAAG,GAAG,QAAQ,EAAE,GAAG,GAAG,QAAQ,GAAG,QAAQ,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE;YACpE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;gBAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBACvD,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;oBAC5D,IAAI,CAAC,aAAa,CACd,GAAG,EACH,GAAG,EACH,KAAK,EACL,SAAS,EACT,SAAS,CAAC,CAAC;iBAClB;aACJ;SACJ;QAED,2EAA2E;QAC3E,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;YAC5C,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;SACrF;IACL,CAAC;IAES,aAAa,CAAC,UAA4B;QAChD,MAAM,OAAO,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACzC,OAAO,CAAC,YAAY,oBAAoB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,YAAY,oBAAoB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,OAAO,sBACX,UAAU,CAAC,SAAS,CAAC;YACjB,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YACrB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;SAC1B,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACrB,OAAO,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,CAAC;IAED;;;OAGG;IACO,iBAAiB,CAAC,UAA6B;QACrD,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;YAC1C,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;gBAC1C,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;aAC7D;SACJ;IACL,CAAC;IAED;;;;;OAKG;IACK,YAAY;QAChB,oGAAoG;QACpG,qGAAqG;QACrG,mGAAmG;QACnG,+BAA+B;QAE/B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,CAAC;QACvC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;IAClD,CAAC;IAES,kBAAkB,CAAC,OAAY,EAAE,eAAqB;QAC5D,0DAA0D;QAC1D,sEAAsE;QACtE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAEtG,KAAK,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,CAAC;QAE1G,0EAA0E;QAC1E,MAAM,CACF,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,EAC7E,KAAK,CAAC,4DAA4D,CACrE,CAAC;IACN,CAAC;IAES,SAAS;;QACf,8DAA8D;QAC9D,qFAAqF;QACrF,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACnB,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,MAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,mCAAI,UAAU,CAAC,CAAC;YAC1E,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,MAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,mCAAI,UAAU,CAAC,CAAC;SAC7E;IACL,CAAC;IAES,SAAS;QACf,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,aAAa,KAAK,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,aAAa,EAC1F,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAEpF,6FAA6F;QAC7F,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,QAAkB,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,QAAkB,CAAC,CAAC;IAC1E,CAAC;IAES,YAAY,CAAC,OAAY,EAAE,eAAwB;QACzD,QAAQ,OAAO,CAAC,MAAM,EAAE;YACpB;gBACI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAC/C,OAAuB,EACvB,eAAgD,CAAC,CAAC,CAAC;gBACvD,MAAM;YACV;gBACI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAC/C,OAAuB,EACvB,eAAgD,CAAC,CAAC,CAAC;gBACvD,MAAM;YACV,OAAO,CAAC,CAAC;gBACL,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAErF,MAAM,KAAK,GAAG,OAAoB,CAAC;gBACnC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,eAAiC,CAAC;gBAE7E,qFAAqF;gBACrF,yFAAyF;gBACzF,qFAAqF;gBACrF,IAAI,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE;oBAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;oBAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;oBAE5D,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;wBACtB,IAAI,CAAC,aAAa,CACd,GAAG,EACH,GAAG,EACH,KAAK,CAAC,KAAK,EACX,SAAS,EACT,SAAS,EACT,QAAQ,CACX,CAAC;qBACL;iBACJ;gBACD,MAAM;aACT;SACJ;IACL,CAAC;IAES,YAAY,KAAI,CAAC;IAE3B;;OAEG;IACO,KAAK,CAAC,QAAQ,CAAC,OAA+B;QACpD,IAAI;YACA,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAChB,IAAI,CAAC,OAAO,EACZ,IAAI,sBAAsB,CAAC,OAAO,oBAAoB,EACtD,IAAI,CAAC,UAAU,CAAC,CAAC;YACrB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAChB,IAAI,CAAC,OAAO,EACZ,IAAI,sBAAsB,CAAC,OAAO,oBAAoB,EACtD,IAAI,CAAC,UAAU,CAAC,CAAC;YACrB,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,GAAG,MAAM,eAAe,CAAC,OAAO,uBAAsB,IAAI,CAAC,UAAU,CAAC,CAAC;YAE1G,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;SACxD;QAAC,OAAO,KAAK,EAAE;YACZ,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,KAAK,CAAC,CAAC;SACxE;IACL,CAAC;IAES,WAAW,CAAC,UAAqC,EAAE,KAAc,EAAE,eAAwB;QACjG,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAEtD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAE9B,QAAQ,QAAQ,CAAC,MAAM,EAAE;YACrB;gBACI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC/B,MAAM;YACV;gBACI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC/B,MAAM;YACV,OAAO,CAAC,CAAC;gBACL,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,GAAG,EACjC,KAAK,CAAC,2DAA2D,CAAC,CAAC;gBAEvE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC;gBAE9B,IAAI,KAAK,EAAE;oBACP,8DAA8D;oBAC9D,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,eAAiC,CAAC;oBAE7E,+EAA+E;oBAC/E,gEAAgE;oBAChE,IAAI,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE;wBAC3D,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;qBACzD;iBACJ;qBAAM;oBACH,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;oBAE9D,IAAI,WAAW,KAAK,SAAS,EAAE;wBAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;wBAE9D,IAAI,WAAW,KAAK,SAAS,EAAE;4BAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;4BAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;4BAE5D,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC,SAAS,CAAC,EACvD,KAAK,CAAC,wDAAwD,CAAC,CAAC;4BAEpE,oFAAoF;4BACpF,gDAAgD;4BAChD,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,SAAS,EAAE;gCAC1D,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;gCAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;gCAEhD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;oCAC5C,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;iCAC/D;6BACJ;yBACJ;qBACJ;iBACJ;aACJ;SACJ;IACL,CAAC;IA8BD;;;;;;;OAOG;IACK,oBAAoB,CAAC,SAAiB,EAAE,SAAiB,EAAE,QAAgB;QAC/E,oEAAoE;QACpE,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAE,CAAC;QAEpE,yFAAyF;QACzF,+FAA+F;QAC/F,kCAAkC;QAClC,MAAM,CAAC,CAAC,CAAC,eAAe,GAAG,QAAQ,CAAC;QAChC,mCAAmC;QACnC,KAAK,CAAC,uGAAuG,CAAC,CAAC;QAEnH,wFAAwF;QACxF,mDAAmD;QACnD,OAAO,eAAe,KAAK,QAAQ,CAAC;IACxC,CAAC;IAEM,QAAQ;QACX,IAAI,CAAC,GAAG,UAAU,IAAI,CAAC,OAAO,CAAC,QAAQ,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;QAE5G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;YACpC,CAAC,IAAI,KAAK,CAAC;YACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;gBACpC,IAAI,CAAC,GAAG,CAAC,EAAE;oBACP,CAAC,IAAI,IAAI,CAAC;iBACb;gBAED,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;aACxE;YACD,CAAC,IAAI,KAAK,CAAC;SACd;QAED,OAAO,GAAG,CAAC,IAAI,CAAC;IACpB,CAAC;IAED;;OAEG;IACO,cAAc,CAAC,OAAY;QACjC,IAAI,OAAO,CAAC,MAAM,sBAAsB,IAAI,OAAO,CAAC,MAAM,sBAAsB,EAAE;YAC9E,MAAM,EAAE,GAAG,OAAuB,CAAC;YACnC,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACnF,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACpF,MAAM,QAAQ,GAAG,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;YAC1D,MAAM,cAAc,GAAG,cAAc,CAAC,eAAe,EAAE,CAAC;YAExD,MAAM,CACF,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAClC,KAAK,CAER,CAAC;YAEF,cAAc,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAEnC,OAAO,QAAQ,CAAC;SACnB;aAAM;YACH,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAErF,MAAM,KAAK,GAAG,OAAoB,CAAC;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;gBACzB,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBACxD,IAAI,QAAQ,KAAK,IAAI,EAAE;oBACnB,QAAQ,GAAG,SAAS,CAAC;iBACxB;gBAED,IAAI,CAAC,IAAI,CAAC,OAAO,CACb,SAAS,EACT,SAAS,EACT,QAAQ,CAAC,CAAC;aACjB;YAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAmB;gBAC7B,SAAS;gBACT,SAAS;gBACT,QAAQ;aACX,CAAC;YAEF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YACrD,OAAO,QAAQ,CAAC;SACnB;IACL,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n IFluidDataStoreRuntime,\n IChannelStorageService,\n Serializable,\n IChannelAttributes,\n} from \"@fluidframework/datastore-definitions\";\nimport {\n IFluidSerializer,\n makeHandlesSerializable,\n parseHandles,\n SharedObject,\n SummarySerializer,\n} from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ObjectStoragePartition, SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport {\n IMatrixProducer,\n IMatrixConsumer,\n IMatrixReader,\n IMatrixWriter,\n} from \"@tiny-calc/nano\";\nimport { MergeTreeDeltaType, IMergeTreeOp, SegmentGroup, ISegment } from \"@fluidframework/merge-tree\";\nimport { MatrixOp } from \"./ops\";\nimport { PermutationVector, PermutationSegment } 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 rows = \"rows\",\n cols = \"cols\",\n cells = \"cells\",\n}\n\ninterface ISetOp<T> {\n type: MatrixOp.set;\n row: number;\n col: number;\n value: MatrixItem<T>;\n}\n\ninterface ISetOpMetadata {\n rowHandle: Handle;\n colHandle: Handle;\n localSeq: 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 */\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 */\nexport class SharedMatrix<T = any>\n extends SharedObject\n implements IMatrixProducer<MatrixItem<T>>,\n IMatrixReader<MatrixItem<T>>,\n IMatrixWriter<MatrixItem<T>> {\n private readonly consumers = new Set<IMatrixConsumer<MatrixItem<T>>>();\n\n public static getFactory() { return new SharedMatrixFactory(); }\n\n private readonly rows: PermutationVector; // Map logical row to storage handle (if any)\n private readonly cols: PermutationVector; // Map logical col to storage handle (if any)\n\n private cells = new SparseArray2D<MatrixItem<T>>(); // Stores cell values.\n private pending = new SparseArray2D<number>(); // Tracks pending writes.\n\n constructor(runtime: IFluidDataStoreRuntime, public id: string, attributes: IChannelAttributes) {\n super(id, runtime, attributes, \"fluid_matrix_\");\n\n this.rows = new PermutationVector(\n SnapshotPath.rows,\n this.logger,\n runtime,\n this.onRowDelta,\n this.onRowHandlesRecycled);\n\n this.cols = new PermutationVector(\n SnapshotPath.cols,\n this.logger,\n runtime,\n this.onColDelta,\n this.onColHandlesRecycled);\n }\n\n private undo?: MatrixUndoProvider<T>;\n\n /**\n * Subscribes the given IUndoConsumer to the matrix.\n */\n public openUndo(consumer: IUndoConsumer) {\n assert(this.undo === undefined,\n 0x019 /* \"SharedMatrix.openUndo() supports at most a single IUndoConsumer.\" */);\n\n this.undo = new MatrixUndoProvider(consumer, this, this.rows, this.cols);\n }\n\n // TODO: closeUndo()?\n\n private get rowHandles() { return this.rows.handleCache; }\n private get colHandles() { return this.cols.handleCache; }\n\n /**\n * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.create}\n */\n public static create<T>(runtime: IFluidDataStoreRuntime, id?: string) {\n return runtime.createChannel(id, SharedMatrixFactory.Type) as SharedMatrix<T>;\n }\n\n // #region IMatrixProducer\n\n openMatrix(\n consumer: IMatrixConsumer<MatrixItem<T>>,\n ): IMatrixReader<MatrixItem<T>> {\n this.consumers.add(consumer);\n return this;\n }\n\n closeMatrix(consumer: IMatrixConsumer<MatrixItem<T>>): void {\n this.consumers.delete(consumer);\n }\n\n // #endregion IMatrixProducer\n\n // #region IMatrixReader\n\n public get rowCount() { return this.rows.getLength(); }\n public get colCount() { return this.cols.getLength(); }\n\n public getCell(row: number, col: number): MatrixItem<T> {\n // Perf: When possible, bounds checking is performed inside the implementation for\n // 'getHandle()' so that it can be elided in the case of a cache hit. This\n // yields an ~40% improvement in the case of a cache hit (node v12 x64)\n\n // Map the logical (row, col) to associated storage handles.\n const rowHandle = this.rowHandles.getHandle(row);\n if (isHandleValid(rowHandle)) {\n const colHandle = this.colHandles.getHandle(col);\n if (isHandleValid(colHandle)) {\n return this.cells.getCell(rowHandle, colHandle);\n }\n } else {\n // If we early exit because the given rowHandle is unallocated, we still need to\n // bounds-check the 'col' parameter.\n ensureRange(col, this.cols.getLength());\n }\n\n return undefined;\n }\n\n public get matrixProducer(): IMatrixProducer<MatrixItem<T>> { return this; }\n\n // #endregion IMatrixReader\n\n public setCell(row: number, col: number, value: MatrixItem<T>) {\n assert(0 <= row && row < this.rowCount\n && 0 <= col && col < this.colCount,\n 0x01a /* \"Trying to set out-of-bounds cell!\" */);\n\n this.setCellCore(row, col, value);\n\n // Avoid reentrancy by raising change notifications after the op is queued.\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(row, col, 1, 1, this);\n }\n }\n\n public setCells(\n rowStart: number,\n colStart: number,\n colCount: number,\n values: readonly (MatrixItem<T>)[],\n ) {\n const rowCount = Math.ceil(values.length / colCount);\n\n assert((0 <= rowStart && rowStart < this.rowCount)\n && (0 <= colStart && colStart < this.colCount)\n && (1 <= colCount && colCount <= (this.colCount - colStart))\n && (rowCount <= (this.rowCount - rowStart)),\n 0x01b /* \"Trying to set multiple out-of-bounds cells!\" */);\n\n const endCol = colStart + colCount;\n let r = rowStart;\n let c = colStart;\n\n for (const value of values) {\n this.setCellCore(r, c, value);\n\n if (++c === endCol) {\n c = colStart;\n r++;\n }\n }\n\n // Avoid reentrancy by raising change notifications after the op is queued.\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(rowStart, colStart, rowCount, colCount, this);\n }\n }\n\n private setCellCore(\n row: number,\n col: number,\n value: MatrixItem<T>,\n rowHandle = this.rows.getAllocatedHandle(row),\n colHandle = this.cols.getAllocatedHandle(col),\n ) {\n if (this.undo !== undefined) {\n let oldValue = this.cells.getCell(rowHandle, colHandle);\n if (oldValue === null) {\n oldValue = undefined;\n }\n\n this.undo.cellSet(\n rowHandle,\n colHandle,\n oldValue);\n }\n\n this.cells.setCell(rowHandle, colHandle, value);\n\n if (this.isAttached()) {\n this.sendSetCellOp(row, col, value, rowHandle, colHandle);\n }\n }\n\n private sendSetCellOp(\n row: number,\n col: number,\n value: MatrixItem<T>,\n rowHandle: Handle,\n colHandle: Handle,\n localSeq = this.nextLocalSeq(),\n ) {\n assert(this.isAttached(), 0x1e2 /* \"Caller must ensure 'isAttached()' before calling 'sendSetCellOp'.\" */);\n\n const op: ISetOp<T> = {\n type: MatrixOp.set,\n row,\n col,\n value,\n };\n\n const metadata: ISetOpMetadata = {\n rowHandle,\n colHandle,\n localSeq,\n };\n\n this.submitLocalMessage(op, metadata);\n this.pending.setCell(rowHandle, colHandle, localSeq);\n }\n\n private submitVectorMessage(\n currentVector: PermutationVector,\n oppositeVector: PermutationVector,\n dimension: SnapshotPath.rows | SnapshotPath.cols,\n message: any,\n ) {\n // Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n // and the SharedMatrix's cell data. Instead, we externally advance each MergeTree's 'localSeq' counter\n // for each submitted op it not aware of to keep them synchronized.\n const localSeq = currentVector.getCollabWindow().localSeq;\n const oppositeWindow = oppositeVector.getCollabWindow();\n\n // Note that the comparison is '>=' because, in the case the MergeTree is regenerating ops for reconnection,\n // the MergeTree submits the op with the original 'localSeq'.\n assert(localSeq >= oppositeWindow.localSeq,\n 0x01c /* \"The 'localSeq' of the vector submitting an op must >= the 'localSeq' of the other vector.\" */);\n\n oppositeWindow.localSeq = localSeq;\n\n // If the SharedMatrix is local, it's state will be submitted via a Snapshot when initially connected.\n // Do not queue a message or track the pending op, as there will never be an ACK, etc.\n if (this.isAttached()) {\n // Record whether this `op` targets rows or cols. (See dispatch in `processCore()`)\n message.target = dimension;\n\n this.submitLocalMessage(\n message,\n currentVector.peekPendingSegmentGroups(\n message.type === MergeTreeDeltaType.GROUP\n ? message.ops.length\n : 1));\n }\n }\n\n private submitColMessage(message: any) {\n this.submitVectorMessage(this.cols, this.rows, SnapshotPath.cols, message);\n }\n\n public insertCols(colStart: number, count: number) {\n this.submitColMessage(this.cols.insert(colStart, count));\n }\n\n public removeCols(colStart: number, count: number) {\n this.submitColMessage(this.cols.remove(colStart, count));\n }\n\n private submitRowMessage(message: any) {\n this.submitVectorMessage(this.rows, this.cols, SnapshotPath.rows, message);\n }\n\n public insertRows(rowStart: number, count: number) {\n this.submitRowMessage(this.rows.insert(rowStart, count));\n }\n\n public removeRows(rowStart: number, count: number) {\n this.submitRowMessage(this.rows.remove(rowStart, count));\n }\n\n /** @internal */ public _undoRemoveRows(segment: ISegment) {\n const original = segment as PermutationSegment;\n\n // (Re)insert the removed number of rows at the original position.\n const { op, inserted } = this.rows.insertRelative(original, original.cachedLength);\n this.submitRowMessage(op);\n\n // Transfer handles and undo/redo tracking groups from the original segment to the\n // newly inserted segment.\n original.transferToReplacement(inserted);\n\n // Invalidate the handleCache in case it was populated during the 'rowsChanged'\n // callback, which occurs before the handle span is populated.\n const rowStart = this.rows.getPosition(inserted);\n this.rows.handleCache.itemsChanged(\n rowStart,\n /* removedCount: */ 0,\n /* insertedCount: */ inserted.cachedLength);\n\n // Generate setCell ops for each populated cell in the reinserted rows.\n let rowHandle = inserted.start;\n const rowCount = inserted.cachedLength;\n for (let row = rowStart; row < rowStart + rowCount; row++, rowHandle++) {\n for (let col = 0; col < this.colCount; col++) {\n const colHandle = this.colHandles.getHandle(col);\n const value = this.cells.getCell(rowHandle, colHandle);\n if (this.isAttached() && value !== undefined && value !== null) {\n this.sendSetCellOp(\n row,\n col,\n value,\n rowHandle,\n colHandle);\n }\n }\n }\n\n // Avoid reentrancy by raising change notifications after the op is queued.\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(rowStart, /* colStart: */ 0, rowCount, this.colCount, this);\n }\n }\n\n /** @internal */ public _undoRemoveCols(segment: ISegment) {\n const original = segment as PermutationSegment;\n\n // (Re)insert the removed number of columns at the original position.\n const { op, inserted } = this.cols.insertRelative(original, original.cachedLength);\n this.submitColMessage(op);\n\n // Transfer handles and undo/redo tracking groups from the original segment to the\n // newly inserted segment.\n original.transferToReplacement(inserted);\n\n // Invalidate the handleCache in case it was populated during the 'colsChanged'\n // callback, which occurs before the handle span is populated.\n const colStart = this.cols.getPosition(inserted);\n this.cols.handleCache.itemsChanged(\n colStart,\n /* removedCount: */ 0,\n /* insertedCount: */ inserted.cachedLength);\n\n // Generate setCell ops for each populated cell in the reinserted cols.\n let colHandle = inserted.start;\n const colCount = inserted.cachedLength;\n for (let col = colStart; col < colStart + colCount; col++, colHandle++) {\n for (let row = 0; row < this.rowCount; row++) {\n const rowHandle = this.rowHandles.getHandle(row);\n const value = this.cells.getCell(rowHandle, colHandle);\n if (this.isAttached() && value !== undefined && value !== null) {\n this.sendSetCellOp(\n row,\n col,\n value,\n rowHandle,\n colHandle);\n }\n }\n }\n\n // Avoid reentrancy by raising change notifications after the op is queued.\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(/* rowStart: */ 0, colStart, this.rowCount, colCount, this);\n }\n }\n\n protected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n const builder = new SummaryTreeBuilder();\n builder.addWithStats(SnapshotPath.rows, this.rows.summarize(this.runtime, this.handle, serializer));\n builder.addWithStats(SnapshotPath.cols, this.cols.summarize(this.runtime, this.handle, serializer));\n builder.addBlob(SnapshotPath.cells,\n serializer.stringify([\n this.cells.snapshot(),\n this.pending.snapshot(),\n ], this.handle));\n return builder.getSummaryTree();\n }\n\n /**\n * Runs serializer on the GC data for this SharedMatrix.\n * All the IFluidHandle's stored in the cells represent routes to other objects.\n */\n protected processGCDataCore(serializer: SummarySerializer) {\n for (let row = 0; row < this.rowCount; row++) {\n for (let col = 0; col < this.colCount; col++) {\n serializer.stringify(this.getCell(row, col), this.handle);\n }\n }\n }\n\n /**\n * Advances the 'localSeq' counter for the cell data operation currently being queued.\n *\n * Do not use with 'submitColMessage()/submitRowMessage()' as these helpers + the MergeTree will\n * automatically advance 'localSeq'.\n */\n private nextLocalSeq() {\n // Ideally, we would have a single 'localSeq' counter that is shared between both PermutationVectors\n // and the SharedMatrix's cell data. Instead, we externally bump each MergeTree's 'localSeq' counter\n // for SharedMatrix ops it's not aware of to keep them synchronized. (For cell data operations, we\n // need to bump both counters.)\n\n this.cols.getCollabWindow().localSeq++;\n return ++this.rows.getCollabWindow().localSeq;\n }\n\n protected submitLocalMessage(message: any, localOpMetadata?: any) {\n // TODO: Recommend moving this assertion into SharedObject\n // (See https://github.com/microsoft/FluidFramework/issues/2559)\n assert(this.isAttached() === true, 0x01d /* \"Trying to submit message to runtime while detached!\" */);\n\n super.submitLocalMessage(makeHandlesSerializable(message, this.serializer, this.handle), localOpMetadata);\n\n // Ensure that row/col 'localSeq' are synchronized (see 'nextLocalSeq()').\n assert(\n this.rows.getCollabWindow().localSeq === this.cols.getCollabWindow().localSeq,\n 0x01e /* \"Row and col collab window 'localSeq' desynchronized!\" */,\n );\n }\n\n protected didAttach() {\n // We've attached we need to start generating and sending ops.\n // so start collaboration and provide a default client id incase we are not connected\n if (this.isAttached()) {\n this.rows.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n this.cols.startOrUpdateCollaboration(this.runtime.clientId ?? \"attached\");\n }\n }\n\n protected onConnect() {\n assert(this.rows.getCollabWindow().collaborating === this.cols.getCollabWindow().collaborating,\n 0x01f /* \"Row and col collab window 'collaborating' status desynchronized!\" */);\n\n // Update merge tree collaboration information with new client ID and then resend pending ops\n this.rows.startOrUpdateCollaboration(this.runtime.clientId as string);\n this.cols.startOrUpdateCollaboration(this.runtime.clientId as string);\n }\n\n protected reSubmitCore(content: any, localOpMetadata: unknown) {\n switch (content.target) {\n case SnapshotPath.cols:\n this.submitColMessage(this.cols.regeneratePendingOp(\n content as IMergeTreeOp,\n localOpMetadata as SegmentGroup | SegmentGroup[]));\n break;\n case SnapshotPath.rows:\n this.submitRowMessage(this.rows.regeneratePendingOp(\n content as IMergeTreeOp,\n localOpMetadata as SegmentGroup | SegmentGroup[]));\n break;\n default: {\n assert(content.type === MatrixOp.set, 0x020 /* \"Unknown SharedMatrix 'op' type.\" */);\n\n const setOp = content as ISetOp<T>;\n const { rowHandle, colHandle, localSeq } = localOpMetadata as ISetOpMetadata;\n\n // If there are more pending local writes to the same row/col handle, it is important\n // to skip resubmitting this op since it is possible the row/col handle has been recycled\n // and now refers to a different position than when this op was originally submitted.\n if (this.isLatestPendingWrite(rowHandle, colHandle, localSeq)) {\n const row = this.rows.handleToPosition(rowHandle, localSeq);\n const col = this.cols.handleToPosition(colHandle, localSeq);\n\n if (row >= 0 && col >= 0) {\n this.sendSetCellOp(\n row,\n col,\n setOp.value,\n rowHandle,\n colHandle,\n localSeq,\n );\n }\n }\n break;\n }\n }\n }\n\n protected onDisconnect() {}\n\n /**\n * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n */\n protected async loadCore(storage: IChannelStorageService) {\n try {\n await this.rows.load(\n this.runtime,\n new ObjectStoragePartition(storage, SnapshotPath.rows),\n this.serializer);\n await this.cols.load(\n this.runtime,\n new ObjectStoragePartition(storage, SnapshotPath.cols),\n this.serializer);\n const [cellData, pendingCliSeqData] = await deserializeBlob(storage, SnapshotPath.cells, this.serializer);\n\n this.cells = SparseArray2D.load(cellData);\n this.pending = SparseArray2D.load(pendingCliSeqData);\n } catch (error) {\n this.logger.sendErrorEvent({ eventName: \"MatrixLoadFailed\" }, error);\n }\n }\n\n protected processCore(rawMessage: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n const msg = parseHandles(rawMessage, this.serializer);\n\n const contents = msg.contents;\n\n switch (contents.target) {\n case SnapshotPath.cols:\n this.cols.applyMsg(msg, local);\n break;\n case SnapshotPath.rows:\n this.rows.applyMsg(msg, local);\n break;\n default: {\n assert(contents.type === MatrixOp.set,\n 0x021 /* \"SharedMatrix message contents have unexpected type!\" */);\n\n const { row, col } = contents;\n\n if (local) {\n // We are receiving the ACK for a local pending set operation.\n const { rowHandle, colHandle, localSeq } = localOpMetadata as ISetOpMetadata;\n\n // If this is the most recent write to the cell by the local client, remove our\n // entry from 'pendingCliSeqs' to resume allowing remote writes.\n if (this.isLatestPendingWrite(rowHandle, colHandle, localSeq)) {\n this.pending.setCell(rowHandle, colHandle, undefined);\n }\n } else {\n const adjustedRow = this.rows.adjustPosition(row, rawMessage);\n\n if (adjustedRow !== undefined) {\n const adjustedCol = this.cols.adjustPosition(col, rawMessage);\n\n if (adjustedCol !== undefined) {\n const rowHandle = this.rows.getAllocatedHandle(adjustedRow);\n const colHandle = this.cols.getAllocatedHandle(adjustedCol);\n\n assert(isHandleValid(rowHandle) && isHandleValid(colHandle),\n 0x022 /* \"SharedMatrix row and/or col handles are invalid!\" */);\n\n // If there is a pending (unACKed) local write to the same cell, skip the current op\n // since it \"happened before\" the pending write.\n if (this.pending.getCell(rowHandle, colHandle) === undefined) {\n const { value } = contents;\n this.cells.setCell(rowHandle, colHandle, value);\n\n for (const consumer of this.consumers.values()) {\n consumer.cellsChanged(adjustedRow, adjustedCol, 1, 1, this);\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Invoked by PermutationVector to notify IMatrixConsumers of row insertion/deletions.\n private readonly onRowDelta = (position: number, removedCount: number, insertedCount: number) => {\n for (const consumer of this.consumers) {\n consumer.rowsChanged(position, removedCount, insertedCount, this);\n }\n };\n\n // Invoked by PermutationVector to notify IMatrixConsumers of col insertion/deletions.\n private readonly onColDelta = (position: number, removedCount: number, insertedCount: number) => {\n for (const consumer of this.consumers) {\n consumer.colsChanged(position, removedCount, insertedCount, this);\n }\n };\n\n private readonly onRowHandlesRecycled = (rowHandles: Handle[]) => {\n for (const rowHandle of rowHandles) {\n this.cells.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n this.pending.clearRows(/* rowStart: */ rowHandle, /* rowCount: */ 1);\n }\n };\n\n private readonly onColHandlesRecycled = (colHandles: Handle[]) => {\n for (const colHandle of colHandles) {\n this.cells.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n this.pending.clearCols(/* colStart: */ colHandle, /* colCount: */ 1);\n }\n };\n\n /**\n * Returns true if the latest pending write to the cell indicated by the given row/col handles\n * matches the given 'localSeq'.\n *\n * A return value of `true` indicates that there are no later local operations queued that will\n * clobber the write op at the given 'localSeq'. This includes later ops that overwrite the cell\n * with a different value as well as row/col removals that might recycled the given row/col handles.\n */\n private isLatestPendingWrite(rowHandle: Handle, colHandle: Handle, localSeq: number) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const pendingLocalSeq = this.pending.getCell(rowHandle, colHandle)!;\n\n // Note while we're awaiting the ACK for a local set, it's possible for the row/col to be\n // locally removed and the row/col handles recycled. If this happens, the pendingLocalSeq will\n // be 'undefined' or > 'localSeq'.\n assert(!(pendingLocalSeq < localSeq),\n // eslint-disable-next-line max-len\n 0x023 /* \"The 'localSeq' of pending write (if any) must be <= the localSeq of the currently processed op.\" */);\n\n // If this is the most recent write to the cell by the local client, the stored localSeq\n // will be an exact match for the given 'localSeq'.\n return pendingLocalSeq === localSeq;\n }\n\n public toString() {\n let s = `client:${this.runtime.clientId}\\nrows: ${this.rows.toString()}\\ncols: ${this.cols.toString()}\\n\\n`;\n\n for (let r = 0; r < this.rowCount; r++) {\n s += ` [`;\n for (let c = 0; c < this.colCount; c++) {\n if (c > 0) {\n s += \", \";\n }\n\n s += `${this.serializer.stringify(this.getCell(r, c), this.handle)}`;\n }\n s += \"]\\n\";\n }\n\n return `${s}\\n`;\n }\n\n /**\n * {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}\n */\n protected applyStashedOp(content: any): unknown {\n if (content.target === SnapshotPath.cols || content.target === SnapshotPath.rows) {\n const op = content as IMergeTreeOp;\n const currentVector = content.target === SnapshotPath.cols ? this.cols : this.rows;\n const oppositeVector = content.target === SnapshotPath.cols ? this.rows : this.cols;\n const metadata = currentVector.applyStashedOp(op);\n const localSeq = currentVector.getCollabWindow().localSeq;\n const oppositeWindow = oppositeVector.getCollabWindow();\n\n assert(\n localSeq > oppositeWindow.localSeq,\n 0x2d9,\n /* \"The 'localSeq' of the vector applying stashed op must > the 'localSeq' of the other vector.\" */\n );\n\n oppositeWindow.localSeq = localSeq;\n\n return metadata;\n } else {\n assert(content.type === MatrixOp.set, 0x2da /* \"Unknown SharedMatrix 'op' type.\" */);\n\n const setOp = content as ISetOp<T>;\n const rowHandle = this.rows.getAllocatedHandle(setOp.row);\n const colHandle = this.cols.getAllocatedHandle(setOp.col);\n if (this.undo !== undefined) {\n let oldValue = this.cells.getCell(rowHandle, colHandle);\n if (oldValue === null) {\n oldValue = undefined;\n }\n\n this.undo.cellSet(\n rowHandle,\n colHandle,\n oldValue);\n }\n\n this.cells.setCell(rowHandle, colHandle, setOp.value);\n const localSeq = this.nextLocalSeq();\n const metadata: ISetOpMetadata = {\n rowHandle,\n colHandle,\n localSeq,\n };\n\n this.pending.setCell(rowHandle, colHandle, localSeq);\n return metadata;\n }\n }\n}\n"]}
|
package/lib/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/matrix";
|
|
8
|
-
export declare const pkgVersion = "2.0.0-internal.
|
|
8
|
+
export declare const pkgVersion = "2.0.0-internal.2.0.0";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/lib/packageVersion.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,wBAAwB,CAAC;AAChD,MAAM,CAAC,MAAM,UAAU,GAAG,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.
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,wBAAwB,CAAC;AAChD,MAAM,CAAC,MAAM,UAAU,GAAG,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.2.0.0\";\n"]}
|
|
@@ -8,6 +8,7 @@ import { BaseSegment, ISegment, Client } from "@fluidframework/merge-tree";
|
|
|
8
8
|
import { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
9
9
|
import { IFluidSerializer } from "@fluidframework/shared-object-base";
|
|
10
10
|
import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
|
|
11
|
+
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
11
12
|
import { Handle } from "./handletable";
|
|
12
13
|
import { HandleCache } from "./handlecache";
|
|
13
14
|
import { VectorUndoProvider } from "./undoprovider";
|
|
@@ -46,14 +47,14 @@ export declare class PermutationVector extends Client {
|
|
|
46
47
|
op: import("@fluidframework/merge-tree").IMergeTreeInsertMsg | undefined;
|
|
47
48
|
inserted: PermutationSegment;
|
|
48
49
|
};
|
|
49
|
-
remove(start: number, length: number): import("@fluidframework/merge-tree").IMergeTreeRemoveMsg
|
|
50
|
+
remove(start: number, length: number): import("@fluidframework/merge-tree").IMergeTreeRemoveMsg;
|
|
50
51
|
getMaybeHandle(pos: number): Handle;
|
|
51
52
|
getAllocatedHandle(pos: number): Handle;
|
|
52
|
-
adjustPosition(pos: number,
|
|
53
|
+
adjustPosition(pos: number, op: ISequencedDocumentMessage): number | undefined;
|
|
53
54
|
handleToPosition(handle: Handle, localSeq?: number): number;
|
|
54
55
|
summarize(runtime: IFluidDataStoreRuntime, handle: IFluidHandle, serializer: IFluidSerializer): ISummaryTreeWithStats;
|
|
55
56
|
load(runtime: IFluidDataStoreRuntime, storage: IChannelStorageService, serializer: IFluidSerializer): Promise<{
|
|
56
|
-
catchupOpsP: Promise<
|
|
57
|
+
catchupOpsP: Promise<ISequencedDocumentMessage[]>;
|
|
57
58
|
}>;
|
|
58
59
|
private readonly onDelta;
|
|
59
60
|
private readonly onMaintenance;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permutationvector.d.ts","sourceRoot":"","sources":["../src/permutationvector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACvG,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EACH,WAAW,EACX,QAAQ,EAER,MAAM,EAOT,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,OAAO,EAAe,MAAM,EAAiB,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AASpD,qBAAa,kBAAmB,SAAQ,WAAW;IAC/C,gBAAuB,UAAU,EAAE,MAAM,CAAwB;IACjE,OAAO,CAAC,MAAM,CAAsB;WAEtB,cAAc,CAAC,IAAI,EAAE,GAAG;IAKtC,SAAgB,IAAI,SAAiC;gBAEzC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAqB;IAMtD,IAAW,KAAK,IACQ,MAAM,CADY;IAC1C,IAAW,KAAK,CAAC,KAAK,EAAE,MAAM,EAK7B;IAED;;;;;OAKG;IACI,qBAAqB,CAAC,WAAW,EAAE,kBAAkB;IAuBrD,KAAK;IAIL,YAAY;IAIZ,KAAK,CAAC,KAAK,SAAI,EAAE,GAAG,SAAoB;IAQxC,SAAS,CAAC,OAAO,EAAE,QAAQ;IAQ3B,MAAM,CAAC,OAAO,EAAE,QAAQ;IAQ/B,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM;IAcnC,QAAQ;CAKlB;AAED,qBAAa,iBAAkB,SAAQ,MAAM;IASrC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IAT5C,OAAO,CAAC,WAAW,CAA4B;IAC/C,SAAgB,WAAW,cAAyB;IAC7C,IAAI,EAAE,kBAAkB,GAAG,SAAS,CAAC;gBAGxC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,sBAAsB,EACd,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,EAClF,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI;IAalE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMpC,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;;;;IAWhD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAIpC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAMnC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAsBvC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"permutationvector.d.ts","sourceRoot":"","sources":["../src/permutationvector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACvG,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EACH,WAAW,EACX,QAAQ,EAER,MAAM,EAOT,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAe,MAAM,EAAiB,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AASpD,qBAAa,kBAAmB,SAAQ,WAAW;IAC/C,gBAAuB,UAAU,EAAE,MAAM,CAAwB;IACjE,OAAO,CAAC,MAAM,CAAsB;WAEtB,cAAc,CAAC,IAAI,EAAE,GAAG;IAKtC,SAAgB,IAAI,SAAiC;gBAEzC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAqB;IAMtD,IAAW,KAAK,IACQ,MAAM,CADY;IAC1C,IAAW,KAAK,CAAC,KAAK,EAAE,MAAM,EAK7B;IAED;;;;;OAKG;IACI,qBAAqB,CAAC,WAAW,EAAE,kBAAkB;IAuBrD,KAAK;IAIL,YAAY;IAIZ,KAAK,CAAC,KAAK,SAAI,EAAE,GAAG,SAAoB;IAQxC,SAAS,CAAC,OAAO,EAAE,QAAQ;IAQ3B,MAAM,CAAC,OAAO,EAAE,QAAQ;IAQ/B,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM;IAcnC,QAAQ;CAKlB;AAED,qBAAa,iBAAkB,SAAQ,MAAM;IASrC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IAT5C,OAAO,CAAC,WAAW,CAA4B;IAC/C,SAAgB,WAAW,cAAyB;IAC7C,IAAI,EAAE,kBAAkB,GAAG,SAAS,CAAC;gBAGxC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,sBAAsB,EACd,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,EAClF,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI;IAalE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMpC,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;;;;IAWhD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAIpC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAMnC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAsBvC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,yBAAyB;IAczD,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAkC;IAyD3E,SAAS,CAAC,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,GAChG,qBAAqB;IAOZ,IAAI,CACb,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,gBAAgB;;;IAShC,OAAO,CAAC,QAAQ,CAAC,OAAO,CA2DtB;IAEF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAyB5B;IAEK,QAAQ;CAUlB"}
|
package/lib/permutationvector.js
CHANGED
|
@@ -205,8 +205,8 @@ export class PermutationVector extends Client {
|
|
|
205
205
|
this.handleCache.addHandle(pos, handle);
|
|
206
206
|
return handle;
|
|
207
207
|
}
|
|
208
|
-
adjustPosition(pos,
|
|
209
|
-
const { segment, offset } = this.
|
|
208
|
+
adjustPosition(pos, op) {
|
|
209
|
+
const { segment, offset } = this.getContainingSegment(pos, op);
|
|
210
210
|
// Note that until the MergeTree GCs, the segment is still reachable via `getContainingSegment()` with
|
|
211
211
|
// a `refSeq` in the past. Prevent remote ops from accidentally allocating or using recycled handles
|
|
212
212
|
// by checking for the presence of 'removedSeq'.
|
|
@@ -216,8 +216,8 @@ export class PermutationVector extends Client {
|
|
|
216
216
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
217
217
|
return this.getPosition(segment) + offset;
|
|
218
218
|
}
|
|
219
|
-
handleToPosition(handle, localSeq = this.
|
|
220
|
-
assert(localSeq <= this.
|
|
219
|
+
handleToPosition(handle, localSeq = this.getCollabWindow().localSeq) {
|
|
220
|
+
assert(localSeq <= this.getCollabWindow().localSeq, 0x028 /* "'localSeq' for op being resubmitted must be <= the 'localSeq' of the last submitted op." */);
|
|
221
221
|
// TODO: In theory, the MergeTree should be able to map the (position, refSeq, localSeq) from
|
|
222
222
|
// the original operation to the current position for resubmitting. This is probably the
|
|
223
223
|
// ideal solution, as we would no longer need to store row/col handles in the op metadata.
|
|
@@ -231,7 +231,7 @@ export class PermutationVector extends Client {
|
|
|
231
231
|
// one using the Tiny-Calc adjust tree.
|
|
232
232
|
let containingSegment;
|
|
233
233
|
let containingOffset;
|
|
234
|
-
this.
|
|
234
|
+
this.walkAllSegments((segment) => {
|
|
235
235
|
const { start, cachedLength } = segment;
|
|
236
236
|
// If the segment is unallocated, skip it.
|
|
237
237
|
if (!isHandleValid(start)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permutationvector.js","sourceRoot":"","sources":["../src/permutationvector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAG9D,OAAO,EACH,WAAW,EAEX,wBAAwB,EACxB,MAAM,EAGN,kBAAkB,EAElB,wBAAwB,EACxB,aAAa,GAChB,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAU,aAAa,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAU5C,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IAW/C,YAAY,MAAc,EAAE,KAAK,gCAAqB;QAClD,KAAK,EAAE,CAAC;QAVJ,WAAM,iCAAsB;QAOpB,SAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC;QAIjD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;IAC/B,CAAC;IAXM,MAAM,CAAC,cAAc,CAAC,IAAS;QAClC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,IAA8B,CAAC;QACvD,OAAO,IAAI,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IAUD,IAAW,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1C,IAAW,KAAK,CAAC,KAAa;QAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,kCAAuB,EAAE,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACzG,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,oEAAoE,CAAC,CAAC;QAEzG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAED;;;;;OAKG;IACI,qBAAqB,CAAC,WAA+B;QACxD,+EAA+E;QAC/E,iFAAiF;QACjF,oEAAoE;QACpE,EAAE;QACF,iFAAiF;QACjF,kFAAkF;QAClF,EAAE;QACF,wFAAwF;QACxF,yFAAyF;QACzF,2CAA2C;QAC3C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE;YACxD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SAC3B;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE;YACxD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SACtB;QAED,gEAAgE;QAChE,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACjC,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAEM,KAAK;QACR,IAAI,CAAC,MAAM,gCAAqB,CAAC;IACrC,CAAC;IAEM,YAAY;QACf,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAEM,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,YAAY;QAC3C,MAAM,CAAC,GAAG,IAAI,kBAAkB;QAC5B,aAAa,CAAC,GAAG,GAAG,KAAK;QACzB,YAAY,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAClB,OAAO,CAAC,CAAC;IACb,CAAC;IAEM,SAAS,CAAC,OAAiB;QAC9B,MAAM,MAAM,GAAG,OAA6B,CAAC;QAE7C,OAAO,IAAI,CAAC,KAAK,kCAAuB;YACpC,CAAC,CAAC,MAAM,CAAC,KAAK,kCAAuB;YACrC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;IAC1D,CAAC;IAEM,MAAM,CAAC,OAAiB;QAC3B,kGAAkG;QAClG,6EAA6E;QAC7E,wBAAwB,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAE/C,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC;IAC9C,CAAC;IAES,oBAAoB,CAAC,GAAW;QACtC,MAAM,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAE7G,MAAM,WAAW,GAAG,IAAI,kBAAkB;QACtC,aAAa,CAAC,IAAI,CAAC,YAAY,GAAG,GAAG;QACrC,YAAY,CAAC,IAAI,CAAC,KAAK,kCAAuB;YAC1C,CAAC;YACD,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;QAE5B,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC;QAExB,OAAO,WAAW,CAAC;IACvB,CAAC;IAEM,QAAQ;QACX,OAAO,IAAI,CAAC,KAAK,kCAAuB;YACpC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,SAAS;YAChC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC;IACzF,CAAC;;AAvGsB,6BAAU,GAAW,oBAAoB,CAAC;AA0GrE,MAAM,OAAO,iBAAkB,SAAQ,MAAM;IAKzC,YACI,IAAY,EACZ,MAA4B,EAC5B,OAA+B,EACd,aAAkF,EAClF,uBAAoD;QAErE,KAAK,CACD,kBAAkB,CAAC,cAAc,EACjC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,IAAI,kBAAkB,CAAC,kCACzD,OAAO,CAAC,OAAO,KAClB,0BAA0B,EAAE,IAAI,IAClC,CAAC,CAAqC,8DAA8D;QARrF,kBAAa,GAAb,aAAa,CAAqE;QAClF,4BAAuB,GAAvB,uBAAuB,CAA6B;QATjE,gBAAW,GAAG,IAAI,WAAW,EAAS,CAAC,CAAC,6CAA6C;QAC7E,gBAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;QAkKnC,YAAO,GAAG,CACvB,MAA6B,EAC7B,EAAE,SAAS,EAAE,aAAa,EAA+B,EAC3D,EAAE;YACA,uEAAuE;YACvE,MAAM,MAAM,GAAG,aAAa;iBACvB,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;gBACnB,OAAO,EAAE,OAA6B;gBACtC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;aACtC,CAAC,CAAC;iBACF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;YAE3D,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,KAAK,SAAS,CAAC;YAEtD,gDAAgD;YAChD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,EAAE;gBACpC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;aACvC;YAED,QAAQ,SAAS,EAAE;gBACf,KAAK,kBAAkB,CAAC,MAAM;oBAC1B,sEAAsE;oBACtE,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,MAAM,EAAE;wBACxC,qFAAqF;wBACrF,sFAAsF;wBACtF,+BAA+B;wBAC/B,OAAO,CAAC,KAAK,EAAE,CAAC;wBAEhB,IAAI,CAAC,WAAW,CAAC,YAAY,CACzB,QAAQ;wBACR,kBAAkB,CAAC,CAAC;wBACpB,kBAAkB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;qBAChD;oBAED,kFAAkF;oBAClF,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,MAAM,EAAE;wBACxC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,EAAE,kBAAkB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;qBAC9F;oBACD,MAAM;gBAEV,KAAK,kBAAkB,CAAC,MAAM,CAAC,CAAC;oBAC5B,sEAAsE;oBACtE,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,MAAM,EAAE;wBACxC,IAAI,CAAC,WAAW,CAAC,YAAY,CACzB,QAAQ,EAAE,kBAAkB,CAC5B,OAAO,CAAC,YAAY;wBACpB,kBAAkB,CAAC,CAAC,CAAC,CAAC;qBAC7B;oBAED,kFAAkF;oBAClF,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,MAAM,EAAE;wBACxC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,iBAAiB,CAAC,OAAO,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;qBAC5F;oBACD,MAAM;iBACT;gBAED;oBACI,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;aACvD;QACL,CAAC,CAAC;QAEe,kBAAa,GAAG,CAAC,IAAuC,EAAE,EAAE;YACzE,IAAI,IAAI,CAAC,SAAS,KAAK,wBAAwB,CAAC,MAAM,EAAE;gBACpD,IAAI,KAAK,GAAa,EAAE,CAAC;gBAEzB,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE;oBAC1C,MAAM,MAAM,GAAG,OAA6B,CAAC;oBAC7C,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;wBAC7B,0EAA0E;wBAC1E,KAAK,GAAG,KAAK,CAAC,MAAM,CAChB,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC;6BACzB,IAAI,CAAC,CAAC,CAAC;6BACP,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CACnD,CAAC;qBACL;iBACJ;gBAED,4FAA4F;gBAC5F,+EAA+E;gBAC/E,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;gBAEpC,kGAAkG;gBAClG,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE;oBACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;iBACjC;aACJ;QACL,CAAC,CAAC;QAvOE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC;QAC3C,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,aAAa,CAAC;IAC3D,CAAC;IAEM,MAAM,CAAC,KAAa,EAAE,MAAc;QACvC,OAAO,IAAI,CAAC,kBAAkB,CAC1B,KAAK,EACL,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,CAAC;IAEM,cAAc,CAAC,OAAiB,EAAE,MAAc;QACnD,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAEhD,OAAO;YACH,EAAE,EAAE,IAAI,CAAC,8BAA8B,CAC/B,IAAI,CAAC,4BAA4B,CAAC,OAAO,EAAE,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,EACjF,QAAQ,CAAC;YACjB,QAAQ;SACX,CAAC;IACN,CAAC;IAEM,MAAM,CAAC,KAAa,EAAE,MAAc;QACvC,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;IACxD,CAAC;IAEM,cAAc,CAAC,GAAW;QAC7B,MAAM,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAE1G,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IAEM,kBAAkB,CAAC,GAAW;QACjC,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE;YACvB,OAAO,MAAM,CAAC;SACjB;QAED,IAAI,CAAC,YAAY,CACb,CAAC,OAAO,EAAE,EAAE;YACR,MAAM,MAAM,GAAG,OAA6B,CAAC;YAC7C,MAAM,CAAC,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC;QAChB,CAAC,EACD,GAAG,EACH,GAAG,GAAG,CAAC;QACP,YAAY,CAAC,SAAS;QACtB,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAE5B,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAExC,OAAO,MAAM,CAAC;IAClB,CAAC;IAEM,cAAc,CAAC,GAAW,EAAE,OAAe,EAAE,QAAgB;QAChE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAExF,sGAAsG;QACtG,qGAAqG;QACrG,gDAAgD;QAChD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE;YAC3D,OAAO,SAAS,CAAC;SACpB;QAED,oEAAoE;QACpE,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,MAAO,CAAC;IAC/C,CAAC;IAEM,gBAAgB,CAAC,MAAc,EAAE,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ;QACnF,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EACnD,KAAK,CAAC,+FAA+F,CAAC,CAAC;QAE3G,6FAA6F;QAC7F,+FAA+F;QAC/F,gGAAgG;QAChG,EAAE;QACF,8FAA8F;QAC9F,+FAA+F;QAC/F,kGAAkG;QAClG,6CAA6C;QAC7C,EAAE;QACF,kGAAkG;QAClG,6CAA6C;QAC7C,IAAI,iBAAsC,CAAC;QAC3C,IAAI,gBAAwB,CAAC;QAE7B,IAAI,CAAC,SAAS,CAAC,eAAe,CAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,EACnB,CAAC,OAAO,EAAE,EAAE;YACR,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,OAA6B,CAAC;YAE9D,0CAA0C;YAC1C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;gBACvB,OAAO,IAAI,CAAC;aACf;YAED,MAAM,GAAG,GAAG,KAAK,GAAG,YAAY,CAAC;YAEjC,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,GAAG,GAAG,EAAE;gBACjC,iBAAiB,GAAG,OAA6B,CAAC;gBAClD,gBAAgB,GAAG,MAAM,GAAG,KAAK,CAAC;gBAClC,OAAO,KAAK,CAAC;aAChB;YAED,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;QAEP,2FAA2F;QAC3F,0FAA0F;QAC1F,kCAAkC;QAClC,EAAE;QACF,6FAA6F;QAC7F,2FAA2F;QAC3F,6BAA6B;QAE7B,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAE7G,+FAA+F;QAC/F,+FAA+F;QAC/F,+BAA+B;QAE/B,oEAAoE;QACpE,OAAO,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG,gBAAiB,CAAC;IAC1F,CAAC;IAED,yDAAyD;IAClD,SAAS,CAAC,OAA+B,EAAE,MAAoB,EAAE,UAA4B;QAEhG,MAAM,OAAO,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACzC,OAAO,CAAC,YAAY,4BAAwB,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,CAAA,EAAE,CAAC,CAAC,CAAC;QAChH,OAAO,CAAC,OAAO,kCAA2B,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9G,OAAO,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,CAAC;IAEM,KAAK,CAAC,IAAI,CACb,OAA+B,EAC/B,OAA+B,EAC/B,UAA4B;QAE5B,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,OAAO,mCAA4B,UAAU,CAAC,CAAC;QAE7F,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAQ,eAAe,CAAC,CAAC;QAE5D,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,sBAAsB,CAAC,OAAO,4BAAwB,EAAE,UAAU,CAAC,CAAC;IACvG,CAAC;IA0FM,QAAQ;QACX,MAAM,CAAC,GAAa,EAAE,CAAC;QAEvB,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE;YAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { IFluidDataStoreRuntime, IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ITelemetryBaseLogger } from \"@fluidframework/common-definitions\";\nimport {\n BaseSegment,\n ISegment,\n LocalReferenceCollection,\n Client,\n IMergeTreeDeltaOpArgs,\n IMergeTreeDeltaCallbackArgs,\n MergeTreeDeltaType,\n IMergeTreeMaintenanceCallbackArgs,\n MergeTreeMaintenanceType,\n ReferenceType,\n} from \"@fluidframework/merge-tree\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ObjectStoragePartition, SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { HandleTable, Handle, isHandleValid } from \"./handletable\";\nimport { deserializeBlob } from \"./serialization\";\nimport { HandleCache } from \"./handlecache\";\nimport { VectorUndoProvider } from \"./undoprovider\";\n\nconst enum SnapshotPath {\n segments = \"segments\",\n handleTable = \"handleTable\",\n}\n\ntype PermutationSegmentSpec = [number, number];\n\nexport class PermutationSegment extends BaseSegment {\n public static readonly typeString: string = \"PermutationSegment\";\n private _start = Handle.unallocated;\n\n public static fromJSONObject(spec: any) {\n const [length, start] = spec as PermutationSegmentSpec;\n return new PermutationSegment(length, start);\n }\n\n public readonly type = PermutationSegment.typeString;\n\n constructor(length: number, start = Handle.unallocated) {\n super();\n this._start = start;\n this.cachedLength = length;\n }\n\n public get start() { return this._start; }\n public set start(value: Handle) {\n assert(this._start === Handle.unallocated, 0x024 /* \"Start of PermutationSegment already allocated!\" */);\n assert(isHandleValid(value), 0x025 /* \"Trying to set start of PermutationSegment to invalid handle!\" */);\n\n this._start = value;\n }\n\n /**\n * Invoked by '_undoRow/ColRemove' to prepare the newly inserted destination\n * segment to serve as the replacement for this removed segment. This moves handle\n * allocations from this segment to the replacement as well as maintains tracking\n * groups for the undo/redo stack.\n */\n public transferToReplacement(destination: PermutationSegment) {\n // When this segment was removed, it may have been split from a larger original\n // segment. In this case, it will have been added to an undo/redo tracking group\n // that associates all of the fragments from the original insertion.\n //\n // Move this association from the this removed segment to its replacement so that\n // it is included if the undo stack continues to unwind to the original insertion.\n //\n // Out of paranoia we link and unlink in separate loops to avoid mutating the underlying\n // set during enumeration. In practice, this is unlikely to matter since there should be\n // exactly 0 or 1 items in the enumeration.\n for (const group of this.trackingCollection.trackingGroups) {\n group.link(destination);\n }\n for (const group of this.trackingCollection.trackingGroups) {\n group.unlink(this);\n }\n\n // Move handle allocations from this segment to its replacement.\n destination._start = this._start;\n this.reset();\n }\n\n public reset() {\n this._start = Handle.unallocated;\n }\n\n public toJSONObject() {\n return [this.cachedLength, this.start];\n }\n\n public clone(start = 0, end = this.cachedLength) {\n const b = new PermutationSegment(\n /* length: */ end - start,\n /* start: */ this.start + start);\n this.cloneInto(b);\n return b;\n }\n\n public canAppend(segment: ISegment) {\n const asPerm = segment as PermutationSegment;\n\n return this.start === Handle.unallocated\n ? asPerm.start === Handle.unallocated\n : asPerm.start === this.start + this.cachedLength;\n }\n\n public append(segment: ISegment) {\n // Note: Must call 'LocalReferenceCollection.append(..)' before modifying this segment's length as\n // 'this.cachedLength' is used to adjust the offsets of the local refs.\n LocalReferenceCollection.append(this, segment);\n\n this.cachedLength += segment.cachedLength;\n }\n\n protected createSplitSegmentAt(pos: number) {\n assert(0 < pos && pos < this.cachedLength, 0x026 /* \"Trying to split segment at out-of-bounds position!\" */);\n\n const leafSegment = new PermutationSegment(\n /* length: */ this.cachedLength - pos,\n /* start: */ this.start === Handle.unallocated\n ? Handle.unallocated\n : this.start + pos);\n\n this.cachedLength = pos;\n\n return leafSegment;\n }\n\n public toString() {\n return this.start === Handle.unallocated\n ? `<${this.cachedLength} empty>`\n : `<${this.cachedLength}: ${this.start}..${this.start + this.cachedLength - 1}>`;\n }\n}\n\nexport class PermutationVector extends Client {\n private handleTable = new HandleTable<never>(); // Tracks available storage handles for rows.\n public readonly handleCache = new HandleCache(this);\n public undo: VectorUndoProvider | undefined;\n\n constructor(\n path: string,\n logger: ITelemetryBaseLogger,\n runtime: IFluidDataStoreRuntime,\n private readonly deltaCallback: (position: number, numRemoved: number, numInserted: number) => void,\n private readonly handlesRecycledCallback: (handles: Handle[]) => void,\n ) {\n super(\n PermutationSegment.fromJSONObject,\n ChildLogger.create(logger, `Matrix.${path}.MergeTreeClient`), {\n ...runtime.options,\n newMergeTreeSnapshotFormat: true, // Temporarily force new snapshot format until it is the default.\n }); // (See https://github.com/microsoft/FluidFramework/issues/84)\n\n this.mergeTreeDeltaCallback = this.onDelta;\n this.mergeTreeMaintenanceCallback = this.onMaintenance;\n }\n\n public insert(start: number, length: number) {\n return this.insertSegmentLocal(\n start,\n new PermutationSegment(length));\n }\n\n public insertRelative(segment: ISegment, length: number) {\n const inserted = new PermutationSegment(length);\n\n return {\n op: this.insertAtReferencePositionLocal(\n this.createLocalReferencePosition(segment, 0, ReferenceType.Transient, undefined),\n inserted),\n inserted,\n };\n }\n\n public remove(start: number, length: number) {\n return this.removeRangeLocal(start, start + length);\n }\n\n public getMaybeHandle(pos: number): Handle {\n assert(0 <= pos && pos < this.getLength(), 0x027 /* \"Trying to get handle of out-of-bounds position!\" */);\n\n return this.handleCache.getHandle(pos);\n }\n\n public getAllocatedHandle(pos: number): Handle {\n let handle = this.getMaybeHandle(pos);\n if (isHandleValid(handle)) {\n return handle;\n }\n\n this.walkSegments(\n (segment) => {\n const asPerm = segment as PermutationSegment;\n asPerm.start = handle = this.handleTable.allocate();\n return true;\n },\n pos,\n pos + 1,\n /* accum: */ undefined,\n /* splitRange: */ true);\n\n this.handleCache.addHandle(pos, handle);\n\n return handle;\n }\n\n public adjustPosition(pos: number, fromSeq: number, clientId: number) {\n const { segment, offset } = this.mergeTree.getContainingSegment(pos, fromSeq, clientId);\n\n // Note that until the MergeTree GCs, the segment is still reachable via `getContainingSegment()` with\n // a `refSeq` in the past. Prevent remote ops from accidentally allocating or using recycled handles\n // by checking for the presence of 'removedSeq'.\n if (segment === undefined || segment.removedSeq !== undefined) {\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.getPosition(segment) + offset!;\n }\n\n public handleToPosition(handle: Handle, localSeq = this.mergeTree.collabWindow.localSeq) {\n assert(localSeq <= this.mergeTree.collabWindow.localSeq,\n 0x028 /* \"'localSeq' for op being resubmitted must be <= the 'localSeq' of the last submitted op.\" */);\n\n // TODO: In theory, the MergeTree should be able to map the (position, refSeq, localSeq) from\n // the original operation to the current position for resubmitting. This is probably the\n // ideal solution, as we would no longer need to store row/col handles in the op metadata.\n //\n // Failing that, we could avoid the O(n) search below by building a temporary map in the\n // opposite direction from the handle to either it's current position or segment + offset\n // and reuse it for the duration of resubmission. (Ideally, we would know when resubmission\n // ended so we could discard this map.)\n //\n // If we find that we frequently need a reverse handle -> position lookup, we could maintain\n // one using the Tiny-Calc adjust tree.\n let containingSegment!: PermutationSegment;\n let containingOffset: number;\n\n this.mergeTree.walkAllSegments(\n this.mergeTree.root,\n (segment) => {\n const { start, cachedLength } = segment as PermutationSegment;\n\n // If the segment is unallocated, skip it.\n if (!isHandleValid(start)) {\n return true;\n }\n\n const end = start + cachedLength;\n\n if (start <= handle && handle < end) {\n containingSegment = segment as PermutationSegment;\n containingOffset = handle - start;\n return false;\n }\n\n return true;\n });\n\n // We are guaranteed to find the handle in the PermutationVector, even if the corresponding\n // row/col has been removed, because handles are not recycled until the containing segment\n // is unlinked from the MergeTree.\n //\n // Therefore, either a row/col removal has been ACKed, in which case there will be no pending\n // ops that reference the stale handle, or the removal is unACKed, in which case the handle\n // has not yet been recycled.\n\n assert(isHandleValid(containingSegment.start), 0x029 /* \"Invalid handle at start of containing segment!\" */);\n\n // Once we know the current position of the handle, we can use the MergeTree to get the segment\n // containing this position and use 'findReconnectionPosition' to adjust for the local ops that\n // have not yet been submitted.\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.findReconnectionPosition(containingSegment, localSeq) + containingOffset!;\n }\n\n // Constructs an ISummaryTreeWithStats for the cell data.\n public summarize(runtime: IFluidDataStoreRuntime, handle: IFluidHandle, serializer: IFluidSerializer):\n ISummaryTreeWithStats {\n const builder = new SummaryTreeBuilder();\n builder.addWithStats(SnapshotPath.segments, super.summarize(runtime, handle, serializer, /* catchUpMsgs: */[]));\n builder.addBlob(SnapshotPath.handleTable, serializer.stringify(this.handleTable.getSummaryContent(), handle));\n return builder.getSummaryTree();\n }\n\n public async load(\n runtime: IFluidDataStoreRuntime,\n storage: IChannelStorageService,\n serializer: IFluidSerializer,\n ) {\n const handleTableData = await deserializeBlob(storage, SnapshotPath.handleTable, serializer);\n\n this.handleTable = HandleTable.load<never>(handleTableData);\n\n return super.load(runtime, new ObjectStoragePartition(storage, SnapshotPath.segments), serializer);\n }\n\n private readonly onDelta = (\n opArgs: IMergeTreeDeltaOpArgs,\n { operation, deltaSegments }: IMergeTreeDeltaCallbackArgs,\n ) => {\n // Apply deltas in descending order to prevent positions from shifting.\n const ranges = deltaSegments\n .map(({ segment }) => ({\n segment: segment as PermutationSegment,\n position: this.getPosition(segment),\n }))\n .sort((left, right) => left.position - right.position);\n\n const isLocal = opArgs.sequencedMessage === undefined;\n\n // Notify the undo provider, if any is attached.\n if (this.undo !== undefined && isLocal) {\n this.undo.record(operation, ranges);\n }\n\n switch (operation) {\n case MergeTreeDeltaType.INSERT:\n // Pass 1: Perform any internal maintenance first to avoid reentrancy.\n for (const { segment, position } of ranges) {\n // HACK: We need to include the allocated handle in the segment's JSON representation\n // for snapshots, but need to ignore the remote client's handle allocations when\n // processing remote ops.\n segment.reset();\n\n this.handleCache.itemsChanged(\n position,\n /* deleteCount: */ 0,\n /* insertCount: */ segment.cachedLength);\n }\n\n // Pass 2: Notify the 'deltaCallback', which may involve callbacks into user code.\n for (const { segment, position } of ranges) {\n this.deltaCallback(position, /* numRemoved: */ 0, /* numInserted: */ segment.cachedLength);\n }\n break;\n\n case MergeTreeDeltaType.REMOVE: {\n // Pass 1: Perform any internal maintenance first to avoid reentrancy.\n for (const { segment, position } of ranges) {\n this.handleCache.itemsChanged(\n position, /* deleteCount: */\n segment.cachedLength,\n /* insertCount: */ 0);\n }\n\n // Pass 2: Notify the 'deltaCallback', which may involve callbacks into user code.\n for (const { segment, position } of ranges) {\n this.deltaCallback(position, /* numRemoved: */ segment.cachedLength, /* numInsert: */ 0);\n }\n break;\n }\n\n default:\n throw new Error(\"Unhandled MergeTreeDeltaType\");\n }\n };\n\n private readonly onMaintenance = (args: IMergeTreeMaintenanceCallbackArgs) => {\n if (args.operation === MergeTreeMaintenanceType.UNLINK) {\n let freed: number[] = [];\n\n for (const { segment } of args.deltaSegments) {\n const asPerm = segment as PermutationSegment;\n if (isHandleValid(asPerm.start)) {\n // Note: Using the spread operator with `.splice()` can exhaust the stack.\n freed = freed.concat(\n new Array(asPerm.cachedLength)\n .fill(0)\n .map((value, index) => index + asPerm.start),\n );\n }\n }\n\n // Notify matrix that handles are about to be freed. The matrix is responsible for clearing\n // the rows/cols prior to free to ensure recycled row/cols are initially empty.\n this.handlesRecycledCallback(freed);\n\n // Now that the physical storage has been cleared, add the recycled handles back to the free pool.\n for (const handle of freed) {\n this.handleTable.free(handle);\n }\n }\n };\n\n public toString() {\n const s: string[] = [];\n\n this.walkSegments((segment) => {\n s.push(`${segment}`);\n return true;\n });\n\n return s.join(\"\");\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"permutationvector.js","sourceRoot":"","sources":["../src/permutationvector.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { IFluidDataStoreRuntime, IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ITelemetryBaseLogger } from \"@fluidframework/common-definitions\";\nimport {\n BaseSegment,\n ISegment,\n LocalReferenceCollection,\n Client,\n IMergeTreeDeltaOpArgs,\n IMergeTreeDeltaCallbackArgs,\n MergeTreeDeltaType,\n IMergeTreeMaintenanceCallbackArgs,\n MergeTreeMaintenanceType,\n ReferenceType,\n} from \"@fluidframework/merge-tree\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ObjectStoragePartition, SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { HandleTable, Handle, isHandleValid } from \"./handletable\";\nimport { deserializeBlob } from \"./serialization\";\nimport { HandleCache } from \"./handlecache\";\nimport { VectorUndoProvider } from \"./undoprovider\";\n\nconst enum SnapshotPath {\n segments = \"segments\",\n handleTable = \"handleTable\",\n}\n\ntype PermutationSegmentSpec = [number, number];\n\nexport class PermutationSegment extends BaseSegment {\n public static readonly typeString: string = \"PermutationSegment\";\n private _start = Handle.unallocated;\n\n public static fromJSONObject(spec: any) {\n const [length, start] = spec as PermutationSegmentSpec;\n return new PermutationSegment(length, start);\n }\n\n public readonly type = PermutationSegment.typeString;\n\n constructor(length: number, start = Handle.unallocated) {\n super();\n this._start = start;\n this.cachedLength = length;\n }\n\n public get start() { return this._start; }\n public set start(value: Handle) {\n assert(this._start === Handle.unallocated, 0x024 /* \"Start of PermutationSegment already allocated!\" */);\n assert(isHandleValid(value), 0x025 /* \"Trying to set start of PermutationSegment to invalid handle!\" */);\n\n this._start = value;\n }\n\n /**\n * Invoked by '_undoRow/ColRemove' to prepare the newly inserted destination\n * segment to serve as the replacement for this removed segment. This moves handle\n * allocations from this segment to the replacement as well as maintains tracking\n * groups for the undo/redo stack.\n */\n public transferToReplacement(destination: PermutationSegment) {\n // When this segment was removed, it may have been split from a larger original\n // segment. In this case, it will have been added to an undo/redo tracking group\n // that associates all of the fragments from the original insertion.\n //\n // Move this association from the this removed segment to its replacement so that\n // it is included if the undo stack continues to unwind to the original insertion.\n //\n // Out of paranoia we link and unlink in separate loops to avoid mutating the underlying\n // set during enumeration. In practice, this is unlikely to matter since there should be\n // exactly 0 or 1 items in the enumeration.\n for (const group of this.trackingCollection.trackingGroups) {\n group.link(destination);\n }\n for (const group of this.trackingCollection.trackingGroups) {\n group.unlink(this);\n }\n\n // Move handle allocations from this segment to its replacement.\n destination._start = this._start;\n this.reset();\n }\n\n public reset() {\n this._start = Handle.unallocated;\n }\n\n public toJSONObject() {\n return [this.cachedLength, this.start];\n }\n\n public clone(start = 0, end = this.cachedLength) {\n const b = new PermutationSegment(\n /* length: */ end - start,\n /* start: */ this.start + start);\n this.cloneInto(b);\n return b;\n }\n\n public canAppend(segment: ISegment) {\n const asPerm = segment as PermutationSegment;\n\n return this.start === Handle.unallocated\n ? asPerm.start === Handle.unallocated\n : asPerm.start === this.start + this.cachedLength;\n }\n\n public append(segment: ISegment) {\n // Note: Must call 'LocalReferenceCollection.append(..)' before modifying this segment's length as\n // 'this.cachedLength' is used to adjust the offsets of the local refs.\n LocalReferenceCollection.append(this, segment);\n\n this.cachedLength += segment.cachedLength;\n }\n\n protected createSplitSegmentAt(pos: number) {\n assert(0 < pos && pos < this.cachedLength, 0x026 /* \"Trying to split segment at out-of-bounds position!\" */);\n\n const leafSegment = new PermutationSegment(\n /* length: */ this.cachedLength - pos,\n /* start: */ this.start === Handle.unallocated\n ? Handle.unallocated\n : this.start + pos);\n\n this.cachedLength = pos;\n\n return leafSegment;\n }\n\n public toString() {\n return this.start === Handle.unallocated\n ? `<${this.cachedLength} empty>`\n : `<${this.cachedLength}: ${this.start}..${this.start + this.cachedLength - 1}>`;\n }\n}\n\nexport class PermutationVector extends Client {\n private handleTable = new HandleTable<never>(); // Tracks available storage handles for rows.\n public readonly handleCache = new HandleCache(this);\n public undo: VectorUndoProvider | undefined;\n\n constructor(\n path: string,\n logger: ITelemetryBaseLogger,\n runtime: IFluidDataStoreRuntime,\n private readonly deltaCallback: (position: number, numRemoved: number, numInserted: number) => void,\n private readonly handlesRecycledCallback: (handles: Handle[]) => void,\n ) {\n super(\n PermutationSegment.fromJSONObject,\n ChildLogger.create(logger, `Matrix.${path}.MergeTreeClient`), {\n ...runtime.options,\n newMergeTreeSnapshotFormat: true, // Temporarily force new snapshot format until it is the default.\n }); // (See https://github.com/microsoft/FluidFramework/issues/84)\n\n this.mergeTreeDeltaCallback = this.onDelta;\n this.mergeTreeMaintenanceCallback = this.onMaintenance;\n }\n\n public insert(start: number, length: number) {\n return this.insertSegmentLocal(\n start,\n new PermutationSegment(length));\n }\n\n public insertRelative(segment: ISegment, length: number) {\n const inserted = new PermutationSegment(length);\n\n return {\n op: this.insertAtReferencePositionLocal(\n this.createLocalReferencePosition(segment, 0, ReferenceType.Transient, undefined),\n inserted),\n inserted,\n };\n }\n\n public remove(start: number, length: number) {\n return this.removeRangeLocal(start, start + length);\n }\n\n public getMaybeHandle(pos: number): Handle {\n assert(0 <= pos && pos < this.getLength(), 0x027 /* \"Trying to get handle of out-of-bounds position!\" */);\n\n return this.handleCache.getHandle(pos);\n }\n\n public getAllocatedHandle(pos: number): Handle {\n let handle = this.getMaybeHandle(pos);\n if (isHandleValid(handle)) {\n return handle;\n }\n\n this.walkSegments(\n (segment) => {\n const asPerm = segment as PermutationSegment;\n asPerm.start = handle = this.handleTable.allocate();\n return true;\n },\n pos,\n pos + 1,\n /* accum: */ undefined,\n /* splitRange: */ true);\n\n this.handleCache.addHandle(pos, handle);\n\n return handle;\n }\n\n public adjustPosition(pos: number, op: ISequencedDocumentMessage) {\n const { segment, offset } = this.getContainingSegment(pos, op);\n\n // Note that until the MergeTree GCs, the segment is still reachable via `getContainingSegment()` with\n // a `refSeq` in the past. Prevent remote ops from accidentally allocating or using recycled handles\n // by checking for the presence of 'removedSeq'.\n if (segment === undefined || segment.removedSeq !== undefined) {\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.getPosition(segment) + offset!;\n }\n\n public handleToPosition(handle: Handle, localSeq = this.getCollabWindow().localSeq) {\n assert(localSeq <= this.getCollabWindow().localSeq,\n 0x028 /* \"'localSeq' for op being resubmitted must be <= the 'localSeq' of the last submitted op.\" */);\n\n // TODO: In theory, the MergeTree should be able to map the (position, refSeq, localSeq) from\n // the original operation to the current position for resubmitting. This is probably the\n // ideal solution, as we would no longer need to store row/col handles in the op metadata.\n //\n // Failing that, we could avoid the O(n) search below by building a temporary map in the\n // opposite direction from the handle to either it's current position or segment + offset\n // and reuse it for the duration of resubmission. (Ideally, we would know when resubmission\n // ended so we could discard this map.)\n //\n // If we find that we frequently need a reverse handle -> position lookup, we could maintain\n // one using the Tiny-Calc adjust tree.\n let containingSegment!: PermutationSegment;\n let containingOffset: number;\n\n this.walkAllSegments(\n (segment) => {\n const { start, cachedLength } = segment as PermutationSegment;\n\n // If the segment is unallocated, skip it.\n if (!isHandleValid(start)) {\n return true;\n }\n\n const end = start + cachedLength;\n\n if (start <= handle && handle < end) {\n containingSegment = segment as PermutationSegment;\n containingOffset = handle - start;\n return false;\n }\n\n return true;\n });\n\n // We are guaranteed to find the handle in the PermutationVector, even if the corresponding\n // row/col has been removed, because handles are not recycled until the containing segment\n // is unlinked from the MergeTree.\n //\n // Therefore, either a row/col removal has been ACKed, in which case there will be no pending\n // ops that reference the stale handle, or the removal is unACKed, in which case the handle\n // has not yet been recycled.\n\n assert(isHandleValid(containingSegment.start), 0x029 /* \"Invalid handle at start of containing segment!\" */);\n\n // Once we know the current position of the handle, we can use the MergeTree to get the segment\n // containing this position and use 'findReconnectionPosition' to adjust for the local ops that\n // have not yet been submitted.\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.findReconnectionPosition(containingSegment, localSeq) + containingOffset!;\n }\n\n // Constructs an ISummaryTreeWithStats for the cell data.\n public summarize(runtime: IFluidDataStoreRuntime, handle: IFluidHandle, serializer: IFluidSerializer):\n ISummaryTreeWithStats {\n const builder = new SummaryTreeBuilder();\n builder.addWithStats(SnapshotPath.segments, super.summarize(runtime, handle, serializer, /* catchUpMsgs: */[]));\n builder.addBlob(SnapshotPath.handleTable, serializer.stringify(this.handleTable.getSummaryContent(), handle));\n return builder.getSummaryTree();\n }\n\n public async load(\n runtime: IFluidDataStoreRuntime,\n storage: IChannelStorageService,\n serializer: IFluidSerializer,\n ) {\n const handleTableData = await deserializeBlob(storage, SnapshotPath.handleTable, serializer);\n\n this.handleTable = HandleTable.load<never>(handleTableData);\n\n return super.load(runtime, new ObjectStoragePartition(storage, SnapshotPath.segments), serializer);\n }\n\n private readonly onDelta = (\n opArgs: IMergeTreeDeltaOpArgs,\n { operation, deltaSegments }: IMergeTreeDeltaCallbackArgs,\n ) => {\n // Apply deltas in descending order to prevent positions from shifting.\n const ranges = deltaSegments\n .map(({ segment }) => ({\n segment: segment as PermutationSegment,\n position: this.getPosition(segment),\n }))\n .sort((left, right) => left.position - right.position);\n\n const isLocal = opArgs.sequencedMessage === undefined;\n\n // Notify the undo provider, if any is attached.\n if (this.undo !== undefined && isLocal) {\n this.undo.record(operation, ranges);\n }\n\n switch (operation) {\n case MergeTreeDeltaType.INSERT:\n // Pass 1: Perform any internal maintenance first to avoid reentrancy.\n for (const { segment, position } of ranges) {\n // HACK: We need to include the allocated handle in the segment's JSON representation\n // for snapshots, but need to ignore the remote client's handle allocations when\n // processing remote ops.\n segment.reset();\n\n this.handleCache.itemsChanged(\n position,\n /* deleteCount: */ 0,\n /* insertCount: */ segment.cachedLength);\n }\n\n // Pass 2: Notify the 'deltaCallback', which may involve callbacks into user code.\n for (const { segment, position } of ranges) {\n this.deltaCallback(position, /* numRemoved: */ 0, /* numInserted: */ segment.cachedLength);\n }\n break;\n\n case MergeTreeDeltaType.REMOVE: {\n // Pass 1: Perform any internal maintenance first to avoid reentrancy.\n for (const { segment, position } of ranges) {\n this.handleCache.itemsChanged(\n position, /* deleteCount: */\n segment.cachedLength,\n /* insertCount: */ 0);\n }\n\n // Pass 2: Notify the 'deltaCallback', which may involve callbacks into user code.\n for (const { segment, position } of ranges) {\n this.deltaCallback(position, /* numRemoved: */ segment.cachedLength, /* numInsert: */ 0);\n }\n break;\n }\n\n default:\n throw new Error(\"Unhandled MergeTreeDeltaType\");\n }\n };\n\n private readonly onMaintenance = (args: IMergeTreeMaintenanceCallbackArgs) => {\n if (args.operation === MergeTreeMaintenanceType.UNLINK) {\n let freed: number[] = [];\n\n for (const { segment } of args.deltaSegments) {\n const asPerm = segment as PermutationSegment;\n if (isHandleValid(asPerm.start)) {\n // Note: Using the spread operator with `.splice()` can exhaust the stack.\n freed = freed.concat(\n new Array(asPerm.cachedLength)\n .fill(0)\n .map((value, index) => index + asPerm.start),\n );\n }\n }\n\n // Notify matrix that handles are about to be freed. The matrix is responsible for clearing\n // the rows/cols prior to free to ensure recycled row/cols are initially empty.\n this.handlesRecycledCallback(freed);\n\n // Now that the physical storage has been cleared, add the recycled handles back to the free pool.\n for (const handle of freed) {\n this.handleTable.free(handle);\n }\n }\n };\n\n public toString() {\n const s: string[] = [];\n\n this.walkSegments((segment) => {\n s.push(`${segment}`);\n return true;\n });\n\n return s.join(\"\");\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/matrix",
|
|
3
|
-
"version": "2.0.0-internal.
|
|
3
|
+
"version": "2.0.0-internal.2.0.0",
|
|
4
4
|
"description": "Distributed matrix",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -63,27 +63,27 @@
|
|
|
63
63
|
"dependencies": {
|
|
64
64
|
"@fluidframework/common-definitions": "^0.20.1",
|
|
65
65
|
"@fluidframework/common-utils": "^1.0.0",
|
|
66
|
-
"@fluidframework/core-interfaces": "^2.0.0-internal.
|
|
67
|
-
"@fluidframework/datastore-definitions": "^2.0.0-internal.
|
|
68
|
-
"@fluidframework/merge-tree": "^2.0.0-internal.
|
|
69
|
-
"@fluidframework/protocol-base": "^0.
|
|
70
|
-
"@fluidframework/protocol-definitions": "^1.
|
|
71
|
-
"@fluidframework/runtime-definitions": "^2.0.0-internal.
|
|
72
|
-
"@fluidframework/runtime-utils": "^2.0.0-internal.
|
|
73
|
-
"@fluidframework/shared-object-base": "^2.0.0-internal.
|
|
74
|
-
"@fluidframework/telemetry-utils": "^2.0.0-internal.
|
|
66
|
+
"@fluidframework/core-interfaces": "^2.0.0-internal.2.0.0",
|
|
67
|
+
"@fluidframework/datastore-definitions": "^2.0.0-internal.2.0.0",
|
|
68
|
+
"@fluidframework/merge-tree": "^2.0.0-internal.2.0.0",
|
|
69
|
+
"@fluidframework/protocol-base": "^0.1038.2000",
|
|
70
|
+
"@fluidframework/protocol-definitions": "^1.1.0",
|
|
71
|
+
"@fluidframework/runtime-definitions": "^2.0.0-internal.2.0.0",
|
|
72
|
+
"@fluidframework/runtime-utils": "^2.0.0-internal.2.0.0",
|
|
73
|
+
"@fluidframework/shared-object-base": "^2.0.0-internal.2.0.0",
|
|
74
|
+
"@fluidframework/telemetry-utils": "^2.0.0-internal.2.0.0",
|
|
75
75
|
"@tiny-calc/nano": "0.0.0-alpha.5",
|
|
76
76
|
"tslib": "^1.10.0"
|
|
77
77
|
},
|
|
78
78
|
"devDependencies": {
|
|
79
|
-
"@fluid-internal/test-dds-utils": "^2.0.0-internal.
|
|
79
|
+
"@fluid-internal/test-dds-utils": "^2.0.0-internal.2.0.0",
|
|
80
80
|
"@fluid-tools/benchmark": "^0.43.0",
|
|
81
81
|
"@fluidframework/build-common": "^1.0.0",
|
|
82
|
-
"@fluidframework/build-tools": "^0.4.
|
|
82
|
+
"@fluidframework/build-tools": "^0.4.6000",
|
|
83
83
|
"@fluidframework/eslint-config-fluid": "^1.0.0",
|
|
84
|
-
"@fluidframework/matrix-previous": "npm:@fluidframework/matrix
|
|
85
|
-
"@fluidframework/mocha-test-setup": "^2.0.0-internal.
|
|
86
|
-
"@fluidframework/test-runtime-utils": "^2.0.0-internal.
|
|
84
|
+
"@fluidframework/matrix-previous": "npm:@fluidframework/matrix@>=2.0.0-internal.1.4.0 <2.0.0-internal.2.0.0",
|
|
85
|
+
"@fluidframework/mocha-test-setup": "^2.0.0-internal.2.0.0",
|
|
86
|
+
"@fluidframework/test-runtime-utils": "^2.0.0-internal.2.0.0",
|
|
87
87
|
"@microsoft/api-extractor": "^7.22.2",
|
|
88
88
|
"@rushstack/eslint-config": "^2.5.1",
|
|
89
89
|
"@tiny-calc/micro": "0.0.0-alpha.5",
|
package/src/matrix.ts
CHANGED
|
@@ -572,7 +572,6 @@ export class SharedMatrix<T = any>
|
|
|
572
572
|
assert(contents.type === MatrixOp.set,
|
|
573
573
|
0x021 /* "SharedMatrix message contents have unexpected type!" */);
|
|
574
574
|
|
|
575
|
-
const { referenceSequenceNumber: refSeq, clientId } = rawMessage;
|
|
576
575
|
const { row, col } = contents;
|
|
577
576
|
|
|
578
577
|
if (local) {
|
|
@@ -585,12 +584,10 @@ export class SharedMatrix<T = any>
|
|
|
585
584
|
this.pending.setCell(rowHandle, colHandle, undefined);
|
|
586
585
|
}
|
|
587
586
|
} else {
|
|
588
|
-
const
|
|
589
|
-
const adjustedRow = this.rows.adjustPosition(row, refSeq, rowClientId);
|
|
587
|
+
const adjustedRow = this.rows.adjustPosition(row, rawMessage);
|
|
590
588
|
|
|
591
589
|
if (adjustedRow !== undefined) {
|
|
592
|
-
const
|
|
593
|
-
const adjustedCol = this.cols.adjustPosition(col, refSeq, colClientId);
|
|
590
|
+
const adjustedCol = this.cols.adjustPosition(col, rawMessage);
|
|
594
591
|
|
|
595
592
|
if (adjustedCol !== undefined) {
|
|
596
593
|
const rowHandle = this.rows.getAllocatedHandle(adjustedRow);
|
package/src/packageVersion.ts
CHANGED
package/src/permutationvector.ts
CHANGED
|
@@ -23,6 +23,7 @@ import { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
|
23
23
|
import { IFluidSerializer } from "@fluidframework/shared-object-base";
|
|
24
24
|
import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
|
|
25
25
|
import { ObjectStoragePartition, SummaryTreeBuilder } from "@fluidframework/runtime-utils";
|
|
26
|
+
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
26
27
|
import { HandleTable, Handle, isHandleValid } from "./handletable";
|
|
27
28
|
import { deserializeBlob } from "./serialization";
|
|
28
29
|
import { HandleCache } from "./handlecache";
|
|
@@ -214,8 +215,8 @@ export class PermutationVector extends Client {
|
|
|
214
215
|
return handle;
|
|
215
216
|
}
|
|
216
217
|
|
|
217
|
-
public adjustPosition(pos: number,
|
|
218
|
-
const { segment, offset } = this.
|
|
218
|
+
public adjustPosition(pos: number, op: ISequencedDocumentMessage) {
|
|
219
|
+
const { segment, offset } = this.getContainingSegment(pos, op);
|
|
219
220
|
|
|
220
221
|
// Note that until the MergeTree GCs, the segment is still reachable via `getContainingSegment()` with
|
|
221
222
|
// a `refSeq` in the past. Prevent remote ops from accidentally allocating or using recycled handles
|
|
@@ -228,8 +229,8 @@ export class PermutationVector extends Client {
|
|
|
228
229
|
return this.getPosition(segment) + offset!;
|
|
229
230
|
}
|
|
230
231
|
|
|
231
|
-
public handleToPosition(handle: Handle, localSeq = this.
|
|
232
|
-
assert(localSeq <= this.
|
|
232
|
+
public handleToPosition(handle: Handle, localSeq = this.getCollabWindow().localSeq) {
|
|
233
|
+
assert(localSeq <= this.getCollabWindow().localSeq,
|
|
233
234
|
0x028 /* "'localSeq' for op being resubmitted must be <= the 'localSeq' of the last submitted op." */);
|
|
234
235
|
|
|
235
236
|
// TODO: In theory, the MergeTree should be able to map the (position, refSeq, localSeq) from
|
|
@@ -246,8 +247,7 @@ export class PermutationVector extends Client {
|
|
|
246
247
|
let containingSegment!: PermutationSegment;
|
|
247
248
|
let containingOffset: number;
|
|
248
249
|
|
|
249
|
-
this.
|
|
250
|
-
this.mergeTree.root,
|
|
250
|
+
this.walkAllSegments(
|
|
251
251
|
(segment) => {
|
|
252
252
|
const { start, cachedLength } = segment as PermutationSegment;
|
|
253
253
|
|