@fluidframework/legacy-dds 2.74.0-365691 → 2.74.0-370705

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.
@@ -89,6 +89,13 @@ export interface SharedArrayEntry<T extends SerializableTypeForSharedArray> exte
89
89
  * being if there is a remote delete, we will have to respect that
90
90
  */
91
91
  isLocalPendingMove: number;
92
+ /**
93
+ * Optional flag indicating that this entry has been rolled back
94
+ *
95
+ * Used to prevent undo/redo operations that have already been rolled back.
96
+ *
97
+ */
98
+ isRollback?: boolean;
92
99
  }
93
100
  /**
94
101
  * Interface defining the core entry attributes
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/array/interfaces.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/array/interfaces.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/array/interfaces.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { IEventThisPlaceHolder, IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport type { Serializable } from \"@fluidframework/datastore-definitions/internal\";\nimport type {\n\tISharedObjectEvents,\n\tISharedObject,\n} from \"@fluidframework/shared-object-base/internal\";\n\nimport type { ISharedArrayOperation } from \"./sharedArrayOperations.js\";\n/**\n * Basic types for the SharedArray DDS\n * It can be used as a generic constraint (`extends SerializableTypeForSharedArray`) but is\n * *never* meant to be a concrete/real type on its own.\n *\n * @legacy @beta\n */\nexport type SerializableTypeForSharedArray = boolean | number | string | object | IFluidHandle;\n\n/**\n * Interface defining the events that can be emitted by the SharedArray DDS\n * and the events that can be listened to by the SharedArray DDS\n *\n * @legacy @beta\n */\nexport interface ISharedArrayEvents extends ISharedObjectEvents {\n\t/**\n\t *\n\t * @param event - The event name.\n\t * @param listener - An event listener.\n\t *\n\t * @eventProperty\n\t */\n\t(\n\t\tevent: \"valueChanged\",\n\t\tlistener: (\n\t\t\top: ISharedArrayOperation,\n\t\t\tisLocal: boolean,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n\n\t/**\n\t *\n\t * @param event - The event name.\n\t * @param listener - An event listener.\n\t *\n\t * @eventProperty\n\t */\n\t(event: \"revertible\", listener: (revertible: IRevertible) => void): void;\n}\n\n/**\n * Interface defining the SharedArray DDS\n * It is a generic interface that can be used to create a SharedArray of any type\n * The type of the SharedArray is defined by the type parameter T\n *\n * @typeParam T - The type of the SharedArray\n *\n * @legacy @beta\n */\nexport interface ISharedArray<T extends SerializableTypeForSharedArray>\n\textends ISharedObject<ISharedArrayEvents> {\n\tget(): readonly T[];\n\tinsert<TWrite>(index: number, value: Serializable<TWrite> & T): void;\n\tdelete(index: number): void;\n\tmove(oldIndex: number, newIndex: number): void;\n\ttoggle(entryId: string): void;\n\ttoggleMove(oldEntryId: string, newEntryId: string): void;\n\tinsertBulkAfter<TWrite>(ref: T | undefined, values: (Serializable<TWrite> & T)[]): void;\n}\n\n/**\n *\n * @internal\n */\nexport interface ISharedArrayRevertible extends ISharedObject<ISharedArrayEvents> {\n\ttoggle(entryId: string): void;\n\ttoggleMove(oldEntryId: string, newEntryId: string): void;\n}\n\n/**\n * Interface defining the in memory shared array entry of the DDS\n *\n * @internal\n */\nexport interface SharedArrayEntry<T extends SerializableTypeForSharedArray>\n\textends SharedArrayEntryCore<T> {\n\t/**\n\t * Flag that tracks whether an ack from the server has been received for a local insert.\n\t * True for local changes.\n\t */\n\tisAckPending: boolean;\n\n\t/**\n\t * Counter is shared by delete and undo/redo (of delete and insert) as undo/redo simply\n\t * operates on the isDeleted flag of the DDS. This flag will help us skip local op acks as\n\t * they have already inflicted state change. The flag helps us ignore remote ops if there is a\n\t * local pending delete as we would be getting the pending op after server stamping\n\t */\n\tisLocalPendingDelete: number;\n\n\t/**\n\t * Counter is for move and its undo/redo. This flag will be used to skip local op acks as\n\t * they have already inflicted state change. The flag helps us ignore remote ops if there is a\n\t * local pending delete as we would be getting the pending op after server stamping. Only exception\n\t * being if there is a remote delete, we will have to respect that\n\t */\n\tisLocalPendingMove: number;\n}\n\n/**\n * Interface defining the core entry attributes\n *\n * @internal\n */\nexport interface SharedArrayEntryCore<T extends SerializableTypeForSharedArray> {\n\t/**\n\t * a unique ID for this particular entry\n\t */\n\tentryId: string;\n\n\t/**\n\t * the value stored in this entry, may not be unique\n\t */\n\tvalue: T;\n\n\t/**\n\t * Flag to track whether this entry is deleted or not.\n\t */\n\tisDeleted: boolean;\n\n\t/**\n\t * Primarily used for move op and tracks the old entry id from which this entry was changed from.\n\t */\n\tprevEntryId?: string;\n\n\t/**\n\t * Primarily used for move op and tracks the new entry id to which this entry was changed to.\n\t */\n\tnextEntryId?: string;\n}\n\n/**\n * Format of the snapshot for the DDS\n *\n * @internal\n */\nexport interface SnapshotFormat<T> {\n\t/**\n\t * Array of the data entries that represent the DDS in-memory representation\n\t */\n\tdataArray: T[];\n}\n\n/**\n * @legacy @beta\n */\nexport interface IRevertible {\n\trevert(): void;\n\tdispose(): void;\n}\n"]}
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/array/interfaces.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { IEventThisPlaceHolder, IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport type { Serializable } from \"@fluidframework/datastore-definitions/internal\";\nimport type {\n\tISharedObjectEvents,\n\tISharedObject,\n} from \"@fluidframework/shared-object-base/internal\";\n\nimport type { ISharedArrayOperation } from \"./sharedArrayOperations.js\";\n/**\n * Basic types for the SharedArray DDS\n * It can be used as a generic constraint (`extends SerializableTypeForSharedArray`) but is\n * *never* meant to be a concrete/real type on its own.\n *\n * @legacy @beta\n */\nexport type SerializableTypeForSharedArray = boolean | number | string | object | IFluidHandle;\n\n/**\n * Interface defining the events that can be emitted by the SharedArray DDS\n * and the events that can be listened to by the SharedArray DDS\n *\n * @legacy @beta\n */\nexport interface ISharedArrayEvents extends ISharedObjectEvents {\n\t/**\n\t *\n\t * @param event - The event name.\n\t * @param listener - An event listener.\n\t *\n\t * @eventProperty\n\t */\n\t(\n\t\tevent: \"valueChanged\",\n\t\tlistener: (\n\t\t\top: ISharedArrayOperation,\n\t\t\tisLocal: boolean,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n\n\t/**\n\t *\n\t * @param event - The event name.\n\t * @param listener - An event listener.\n\t *\n\t * @eventProperty\n\t */\n\t(event: \"revertible\", listener: (revertible: IRevertible) => void): void;\n}\n\n/**\n * Interface defining the SharedArray DDS\n * It is a generic interface that can be used to create a SharedArray of any type\n * The type of the SharedArray is defined by the type parameter T\n *\n * @typeParam T - The type of the SharedArray\n *\n * @legacy @beta\n */\nexport interface ISharedArray<T extends SerializableTypeForSharedArray>\n\textends ISharedObject<ISharedArrayEvents> {\n\tget(): readonly T[];\n\tinsert<TWrite>(index: number, value: Serializable<TWrite> & T): void;\n\tdelete(index: number): void;\n\tmove(oldIndex: number, newIndex: number): void;\n\ttoggle(entryId: string): void;\n\ttoggleMove(oldEntryId: string, newEntryId: string): void;\n\tinsertBulkAfter<TWrite>(ref: T | undefined, values: (Serializable<TWrite> & T)[]): void;\n}\n\n/**\n *\n * @internal\n */\nexport interface ISharedArrayRevertible extends ISharedObject<ISharedArrayEvents> {\n\ttoggle(entryId: string): void;\n\ttoggleMove(oldEntryId: string, newEntryId: string): void;\n}\n\n/**\n * Interface defining the in memory shared array entry of the DDS\n *\n * @internal\n */\nexport interface SharedArrayEntry<T extends SerializableTypeForSharedArray>\n\textends SharedArrayEntryCore<T> {\n\t/**\n\t * Flag that tracks whether an ack from the server has been received for a local insert.\n\t * True for local changes.\n\t */\n\tisAckPending: boolean;\n\n\t/**\n\t * Counter is shared by delete and undo/redo (of delete and insert) as undo/redo simply\n\t * operates on the isDeleted flag of the DDS. This flag will help us skip local op acks as\n\t * they have already inflicted state change. The flag helps us ignore remote ops if there is a\n\t * local pending delete as we would be getting the pending op after server stamping\n\t */\n\tisLocalPendingDelete: number;\n\n\t/**\n\t * Counter is for move and its undo/redo. This flag will be used to skip local op acks as\n\t * they have already inflicted state change. The flag helps us ignore remote ops if there is a\n\t * local pending delete as we would be getting the pending op after server stamping. Only exception\n\t * being if there is a remote delete, we will have to respect that\n\t */\n\tisLocalPendingMove: number;\n\n\t/**\n\t * Optional flag indicating that this entry has been rolled back\n\t *\n\t * Used to prevent undo/redo operations that have already been rolled back.\n\t *\n\t */\n\tisRollback?: boolean;\n}\n\n/**\n * Interface defining the core entry attributes\n *\n * @internal\n */\nexport interface SharedArrayEntryCore<T extends SerializableTypeForSharedArray> {\n\t/**\n\t * a unique ID for this particular entry\n\t */\n\tentryId: string;\n\n\t/**\n\t * the value stored in this entry, may not be unique\n\t */\n\tvalue: T;\n\n\t/**\n\t * Flag to track whether this entry is deleted or not.\n\t */\n\tisDeleted: boolean;\n\n\t/**\n\t * Primarily used for move op and tracks the old entry id from which this entry was changed from.\n\t */\n\tprevEntryId?: string;\n\n\t/**\n\t * Primarily used for move op and tracks the new entry id to which this entry was changed to.\n\t */\n\tnextEntryId?: string;\n}\n\n/**\n * Format of the snapshot for the DDS\n *\n * @internal\n */\nexport interface SnapshotFormat<T> {\n\t/**\n\t * Array of the data entries that represent the DDS in-memory representation\n\t */\n\tdataArray: T[];\n}\n\n/**\n * @legacy @beta\n */\nexport interface IRevertible {\n\trevert(): void;\n\tdispose(): void;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sharedArray.d.ts","sourceRoot":"","sources":["../../src/array/sharedArray.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sharedArray.d.ts","sourceRoot":"","sources":["../../src/array/sharedArray.ts"],"names":[],"mappings":"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"}
@@ -239,6 +239,9 @@ class SharedArrayClass extends internal_4.SharedObject {
239
239
  */
240
240
  toggle(entryId) {
241
241
  const liveEntry = this.getLiveEntry(entryId);
242
+ if (liveEntry?.isRollback === true) {
243
+ return;
244
+ }
242
245
  const isDeleted = !liveEntry.isDeleted;
243
246
  // Adding local pending counter
244
247
  this.getEntryForId(entryId).isLocalPendingDelete += 1;
@@ -267,6 +270,10 @@ class SharedArrayClass extends internal_4.SharedObject {
267
270
  * @param newEntryId - EntryId of the to be live entry
268
271
  */
269
272
  toggleMove(oldEntryId, newEntryId) {
273
+ const liveEntry = this.getLiveEntry(newEntryId);
274
+ if (liveEntry?.isRollback === true) {
275
+ return;
276
+ }
270
277
  if (this.getEntryForId(newEntryId).isDeleted) {
271
278
  return;
272
279
  }
@@ -292,6 +299,7 @@ class SharedArrayClass extends internal_4.SharedObject {
292
299
  case sharedArrayOperations_js_1.OperationType.insertEntry: {
293
300
  const liveEntry = this.getLiveEntry(arrayOp.entryId);
294
301
  liveEntry.isDeleted = true;
302
+ liveEntry.isRollback = true;
295
303
  const deleteOp = {
296
304
  type: sharedArrayOperations_js_1.OperationType.deleteEntry,
297
305
  entryId: arrayOp.entryId,
@@ -308,6 +316,7 @@ class SharedArrayClass extends internal_4.SharedObject {
308
316
  else {
309
317
  const liveEntry = this.getLiveEntry(arrayOp.entryId);
310
318
  liveEntry.isDeleted = false;
319
+ liveEntry.isRollback = true;
311
320
  const insertOp = {
312
321
  type: sharedArrayOperations_js_1.OperationType.insertEntry,
313
322
  entryId: arrayOp.entryId,
@@ -326,6 +335,7 @@ class SharedArrayClass extends internal_4.SharedObject {
326
335
  if (this.getEntryForId(newEntryId).isDeleted) {
327
336
  return;
328
337
  }
338
+ this.getEntryForId(oldEntryId).isRollback = true;
329
339
  this.updateLiveEntry(newEntryId, oldEntryId);
330
340
  const inputEntry = this.getEntryForId(oldEntryId);
331
341
  inputEntry.prevEntryId = undefined;
@@ -346,6 +356,7 @@ class SharedArrayClass extends internal_4.SharedObject {
346
356
  // Toggling the isDeleted flag to undo the last operation for the skip list payload/value
347
357
  liveEntry.isDeleted = !isDeleted;
348
358
  liveEntry.isLocalPendingDelete -= 1;
359
+ liveEntry.isRollback = true;
349
360
  const toggleOp = {
350
361
  type: sharedArrayOperations_js_1.OperationType.toggle,
351
362
  entryId,
@@ -357,6 +368,7 @@ class SharedArrayClass extends internal_4.SharedObject {
357
368
  case sharedArrayOperations_js_1.OperationType.toggleMove: {
358
369
  const { entryId: oldEntryId, changedToEntryId: newEntryId } = arrayOp;
359
370
  this.getEntryForId(oldEntryId).isLocalPendingMove -= 1;
371
+ this.getEntryForId(newEntryId).isRollback = true;
360
372
  this.updateLiveEntry(oldEntryId, newEntryId);
361
373
  const toggleMoveOp = {
362
374
  type: sharedArrayOperations_js_1.OperationType.toggleMove,
@@ -1 +1 @@
1
- {"version":3,"file":"sharedArray.js","sourceRoot":"","sources":["../../src/array/sharedArray.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, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport type {\n\tSerializable,\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelFactory,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport type { ITree } from \"@fluidframework/driver-definitions/internal\";\nimport { FileMode, MessageType, TreeEntry } from \"@fluidframework/driver-definitions/internal\";\nimport type {\n\tISummaryTreeWithStats,\n\tIRuntimeMessageCollection,\n\tIRuntimeMessagesContent,\n\tISequencedMessageEnvelope,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { convertToSummaryTreeWithStats } from \"@fluidframework/runtime-utils/internal\";\nimport type { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport { SharedObject } from \"@fluidframework/shared-object-base/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport type {\n\tISharedArrayEvents,\n\tISharedArray,\n\tISharedArrayRevertible,\n\tSerializableTypeForSharedArray,\n\tSharedArrayEntry,\n\tSnapshotFormat,\n\tSharedArrayEntryCore,\n} from \"./interfaces.js\";\nimport { SharedArrayFactory } from \"./sharedArrayFactory.js\";\nimport type {\n\tISharedArrayOperation,\n\tIDeleteOperation,\n\tIMoveOperation,\n\tIToggleMoveOperation,\n\tIToggleOperation,\n} from \"./sharedArrayOperations.js\";\nimport { OperationType } from \"./sharedArrayOperations.js\";\nimport { SharedArrayRevertible } from \"./sharedArrayRevertible.js\";\n\nconst snapshotFileName = \"header\";\n\n/**\n * Represents a shared array that allows communication between distributed clients.\n *\n * @internal\n */\nexport class SharedArrayClass<T extends SerializableTypeForSharedArray>\n\textends SharedObject<ISharedArrayEvents>\n\timplements ISharedArray<T>, ISharedArrayRevertible\n{\n\t/**\n\t * Stores the data held by this shared array.\n\t */\n\tprivate sharedArray: SharedArrayEntry<T>[];\n\n\t/**\n\t * Stores a map of entryid to entries of the sharedArray. This is meant of search optimizations and\n\t * so shouldn't be snapshotted.\n\t * Note: This map needs to be updated only when the sharedArray is being deserialized and when new entries are\n\t * being added. New entries are added upon insert ops and the second leg of the move op.\n\t * As we don't delete the entries once created, deletion or move to another position needs no special\n\t * handling for this data structure\n\t */\n\tprivate readonly idToEntryMap: Map<string, SharedArrayEntry<T>>;\n\n\t/**\n\t * Set of entry IDs that are marked for deletion by remote clients, but have local pending deletes.\n\t * Used to prevent resuscitating entries while rolling back a delete operation.\n\t * We should not rollback to life an entry that was deleted by remote clients.\n\t */\n\tprivate readonly remoteDeleteWithLocalPendingDelete: Set<string> = new Set<string>();\n\n\t/**\n\t * Create a new shared array\n\t *\n\t * @param runtime - data store runtime the new shared array belongs to\n\t * @param id - optional name of the shared array\n\t * @returns newly create shared array (but not attached yet)\n\t */\n\tpublic static create<T extends SerializableTypeForSharedArray>(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid?: string,\n\t): SharedArrayClass<T> {\n\t\treturn runtime.createChannel(id, SharedArrayFactory.Type) as SharedArrayClass<T>;\n\t}\n\n\t/**\n\t * Get a factory for SharedArray to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedArray\n\t */\n\tpublic static getFactory<T extends SerializableTypeForSharedArray>(): IChannelFactory {\n\t\treturn new SharedArrayFactory<T>();\n\t}\n\n\t/**\n\t * Constructs a new shared array. If the object is non-local an id and service interfaces will\n\t * be provided\n\t *\n\t * @param id - optional name of the shared array\n\t * @param runtime - data store runtime the shared array belongs to\n\t * @param attributes - represents the attributes of a channel/DDS.\n\t */\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(id, runtime, attributes, \"loop_sharedArray_\" /* telemetryContextPrefix */);\n\t\tthis.sharedArray = [];\n\t\tthis.idToEntryMap = new Map<string, SharedArrayEntry<T>>();\n\t}\n\n\t/**\n\t * Method that returns the ordered list of the items held in the DDS at this point in time.\n\t * Note: This is only a snapshot of the array\n\t */\n\tpublic get(): readonly T[] {\n\t\treturn this.sharedArray.filter((item) => !item.isDeleted).map((entry) => entry.value);\n\t}\n\n\tprotected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\t// Deep copy and unset the local flags. Needed when snapshotting is happening for runtime not attached\n\t\tconst dataArrayCopy: SharedArrayEntryCore<T>[] = [];\n\t\tfor (const entry of this.sharedArray) {\n\t\t\tdataArrayCopy.push({\n\t\t\t\tentryId: entry.entryId,\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\tvalue: JSON.parse(serializer.stringify(entry.value, this.handle)),\n\t\t\t\tisDeleted: entry.isDeleted,\n\t\t\t\tprevEntryId: entry.prevEntryId,\n\t\t\t\tnextEntryId: entry.nextEntryId,\n\t\t\t});\n\t\t}\n\n\t\t// We are snapshotting current client data so autoacking pending local.\n\t\t// Assumption : This should happen only for offline client creating the array. All other scenarios should\n\t\t// get to MSN - where there can be no local pending possible.\n\t\tfor (const entry of this.sharedArray) {\n\t\t\tthis.unsetLocalFlags(entry);\n\t\t}\n\t\tconst contents: SnapshotFormat<SharedArrayEntryCore<T>> = {\n\t\t\tdataArray: dataArrayCopy,\n\t\t};\n\t\tconst tree: ITree = {\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tmode: FileMode.File,\n\t\t\t\t\tpath: snapshotFileName,\n\t\t\t\t\ttype: TreeEntry[TreeEntry.Blob],\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\tcontents: serializer.stringify(contents, this.handle),\n\t\t\t\t\t\t// eslint-disable-next-line unicorn/text-encoding-identifier-case\n\t\t\t\t\t\tencoding: \"utf-8\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t\tconst summaryTreeWithStats = convertToSummaryTreeWithStats(tree);\n\n\t\treturn summaryTreeWithStats;\n\t}\n\n\tpublic insertBulkAfter<TWrite>(\n\t\tref: T | undefined,\n\t\tvalues: (Serializable<TWrite> & T)[],\n\t): void {\n\t\tlet itemIndex: number = 0;\n\n\t\tif (ref !== undefined) {\n\t\t\tfor (itemIndex = this.sharedArray.length - 1; itemIndex > 0; itemIndex -= 1) {\n\t\t\t\tconst item = this.sharedArray[itemIndex];\n\t\t\t\tif (item && !item.isDeleted && item.value === ref) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Add one since we're inserting it after this rowId. If rowId is not found, we will get -1, which after\n\t\t\t// adding one, will be 0, which will place the new rows at the right place too\n\t\t\titemIndex += 1;\n\t\t}\n\n\t\t// Insert new elements\n\t\tfor (const value of values) {\n\t\t\tthis.insertCore(itemIndex, value);\n\t\t\titemIndex += 1;\n\t\t}\n\t}\n\n\tpublic insert<TWrite>(index: number, value: Serializable<TWrite> & T): void {\n\t\tif (index < 0) {\n\t\t\tthrow new Error(\"Invalid input: Insertion index provided is less than 0.\");\n\t\t}\n\t\tthis.insertCore(this.findInternalInsertionIndex(index), value);\n\t}\n\n\tprivate insertCore<TWrite>(indexInternal: number, value: Serializable<TWrite> & T): void {\n\t\tconst insertAfterEntryId =\n\t\t\tindexInternal >= 1 ? this.sharedArray[indexInternal - 1]?.entryId : undefined;\n\t\tconst newEntryId = this.createAddEntry(indexInternal, value);\n\n\t\tconst op = {\n\t\t\ttype: OperationType.insertEntry,\n\t\t\tentryId: newEntryId,\n\t\t\tvalue,\n\t\t\tinsertAfterEntryId,\n\t\t};\n\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\tpublic delete(index: number): void {\n\t\tif (index < 0) {\n\t\t\tthrow new Error(\"Invalid input: Deletion index provided is less than 0.\");\n\t\t}\n\n\t\tconst indexInternal: number = this.findInternalDeletionIndex(index);\n\n\t\tconst entry = this.sharedArray[indexInternal];\n\t\tassert(entry !== undefined, 0xb90 /* Invalid index */);\n\t\tconst entryId = entry.entryId;\n\t\tthis.deleteCore(indexInternal);\n\n\t\tconst op: IDeleteOperation = {\n\t\t\ttype: OperationType.deleteEntry,\n\t\t\tentryId,\n\t\t};\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\tpublic rearrangeToFront(values: T[]): void {\n\t\tfor (let toIndex = 0; toIndex < values.length; toIndex += 1) {\n\t\t\tconst value = values[toIndex];\n\t\t\t// Can skip searching first <toIndex> indices, as they contain elements we already moved.\n\t\t\tfor (let fromIndex = toIndex; fromIndex < this.sharedArray.length; fromIndex += 1) {\n\t\t\t\tconst item = this.sharedArray[fromIndex];\n\t\t\t\tassert(item !== undefined, 0xb91 /* Invalid index */);\n\t\t\t\tif (item.value !== value) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\t!item.isDeleted &&\n\t\t\t\t\t// Moving to and from the same index makes no sense, so noOp\n\t\t\t\t\tfromIndex !== toIndex &&\n\t\t\t\t\t// Moving the same entry from current location to its immediate next makes no sense so noOp\n\t\t\t\t\ttoIndex !== fromIndex + 1\n\t\t\t\t) {\n\t\t\t\t\tthis.moveCore(fromIndex, toIndex);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Moves the DDS entry from one index to another\n\t *\n\t * @param fromIndex - User index of the element to be moved\n\t * @param toIndex - User index to which the element should move to\n\t */\n\tpublic move(fromIndex: number, toIndex: number): void {\n\t\tif (fromIndex < 0) {\n\t\t\tthrow new Error(\"Invalid input: fromIndex value provided is less than 0\");\n\t\t}\n\n\t\tif (toIndex < 0) {\n\t\t\tthrow new Error(\"Invalid input: toIndex value provided is less than 0\");\n\t\t}\n\n\t\tif (\n\t\t\t// Moving to and from the same index makes no sense, so noOp\n\t\t\tfromIndex === toIndex ||\n\t\t\t// Moving the same entry from current location to its immediate next makes no sense so noOp\n\t\t\ttoIndex === fromIndex + 1\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tconst fromIndexInternal: number = this.findInternalDeletionIndex(fromIndex);\n\t\tconst toIndexInternal: number = this.findInternalInsertionIndex(toIndex);\n\n\t\tthis.moveCore(fromIndexInternal, toIndexInternal);\n\t}\n\n\tprivate moveCore(fromIndexInternal: number, toIndexInternal: number): void {\n\t\tconst insertAfterEntryId =\n\t\t\ttoIndexInternal >= 1 ? this.sharedArray[toIndexInternal - 1]?.entryId : undefined;\n\t\tconst entryId = this.sharedArray[fromIndexInternal]?.entryId;\n\t\tassert(entryId !== undefined, 0xb92 /* Invalid index */);\n\t\tconst changedToEntryId = this.createMoveEntry(fromIndexInternal, toIndexInternal);\n\n\t\tconst op: IMoveOperation = {\n\t\t\ttype: OperationType.moveEntry,\n\t\t\tentryId,\n\t\t\tinsertAfterEntryId,\n\t\t\tchangedToEntryId,\n\t\t};\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\t/**\n\t * Method used to do undo/redo operation for the given entry id. This method is\n\t * used for undo/redo of only insert and delete operations. Move operation is NOT handled\n\t * by this method\n\t *\n\t * @param entryId - Entry Id for which the the undo/redo operation is to be applied\n\t */\n\tpublic toggle(entryId: string): void {\n\t\tconst liveEntry = this.getLiveEntry(entryId);\n\t\tconst isDeleted = !liveEntry.isDeleted;\n\n\t\t// Adding local pending counter\n\t\tthis.getEntryForId(entryId).isLocalPendingDelete += 1;\n\n\t\t// Toggling the isDeleted flag to undo the last operation for the skip list payload/value\n\t\tliveEntry.isDeleted = isDeleted;\n\n\t\tconst op: IToggleOperation = {\n\t\t\ttype: OperationType.toggle,\n\t\t\tentryId,\n\t\t\tisDeleted,\n\t\t};\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\t/**\n\t * Method to do undo/redo of move operation. All entries of the same payload/value are stored\n\t * in the same doubly linked skip list. This skip list is updated upon every move by adding the\n\t * new location as a new entry in the skip list and update the isDeleted flag to indicate the new\n\t * entry is the cuurent live location for the user.\n\t *\n\t * @param oldEntryId - EntryId of the last live entry\n\t * @param newEntryId - EntryId of the to be live entry\n\t */\n\tpublic toggleMove(oldEntryId: string, newEntryId: string): void {\n\t\tif (this.getEntryForId(newEntryId).isDeleted) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Adding local pending counter\n\t\tthis.getEntryForId(oldEntryId).isLocalPendingMove += 1;\n\n\t\tthis.updateLiveEntry(newEntryId, oldEntryId);\n\n\t\tconst op: IToggleMoveOperation = {\n\t\t\ttype: OperationType.toggleMove,\n\t\t\tentryId: oldEntryId,\n\t\t\tchangedToEntryId: newEntryId,\n\t\t};\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\tpublic rollback(op: unknown, _localOpMetadata: unknown): void {\n\t\tconst arrayOp = op as ISharedArrayOperation<T>;\n\t\tswitch (arrayOp.type) {\n\t\t\tcase OperationType.insertEntry: {\n\t\t\t\tconst liveEntry = this.getLiveEntry(arrayOp.entryId);\n\t\t\t\tliveEntry.isDeleted = true;\n\t\t\t\tconst deleteOp: IDeleteOperation = {\n\t\t\t\t\ttype: OperationType.deleteEntry,\n\t\t\t\t\tentryId: arrayOp.entryId,\n\t\t\t\t};\n\t\t\t\tthis.emitValueChangedEvent(deleteOp, true /* isLocal */);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.deleteEntry: {\n\t\t\t\tif (this.remoteDeleteWithLocalPendingDelete.has(arrayOp.entryId)) {\n\t\t\t\t\t// If remote already deleted the entry, we should not resurrect it.\n\t\t\t\t\t// Just remove the local pending delete.\n\t\t\t\t\tthis.remoteDeleteWithLocalPendingDelete.delete(arrayOp.entryId);\n\t\t\t\t} else {\n\t\t\t\t\tconst liveEntry = this.getLiveEntry(arrayOp.entryId);\n\t\t\t\t\tliveEntry.isDeleted = false;\n\t\t\t\t\tconst insertOp = {\n\t\t\t\t\t\ttype: OperationType.insertEntry,\n\t\t\t\t\t\tentryId: arrayOp.entryId,\n\t\t\t\t\t\tvalue: liveEntry.value,\n\t\t\t\t\t};\n\t\t\t\t\tthis.emitValueChangedEvent(insertOp, true /* isLocal */);\n\t\t\t\t\tconst entry = this.getEntryForId(arrayOp.entryId);\n\t\t\t\t\tif (entry !== undefined && entry.isLocalPendingDelete > 0) {\n\t\t\t\t\t\tentry.isLocalPendingDelete -= 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.moveEntry: {\n\t\t\t\tconst { entryId: oldEntryId, changedToEntryId: newEntryId } = arrayOp;\n\t\t\t\tif (this.getEntryForId(newEntryId).isDeleted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.updateLiveEntry(newEntryId, oldEntryId);\n\t\t\t\tconst inputEntry = this.getEntryForId(oldEntryId);\n\t\t\t\tinputEntry.prevEntryId = undefined;\n\t\t\t\tinputEntry.nextEntryId = undefined;\n\t\t\t\tinputEntry.isLocalPendingMove = 0;\n\t\t\t\tconst moveOp: IMoveOperation = {\n\t\t\t\t\ttype: OperationType.moveEntry,\n\t\t\t\t\tentryId: newEntryId,\n\t\t\t\t\tchangedToEntryId: oldEntryId,\n\t\t\t\t};\n\t\t\t\tthis.emitValueChangedEvent(moveOp, true /* isLocal */);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.toggle: {\n\t\t\t\tconst entryId = arrayOp.entryId;\n\t\t\t\tconst liveEntry = this.getLiveEntry(entryId);\n\t\t\t\tconst isDeleted = liveEntry.isDeleted;\n\n\t\t\t\t// Toggling the isDeleted flag to undo the last operation for the skip list payload/value\n\t\t\t\tliveEntry.isDeleted = !isDeleted;\n\t\t\t\tliveEntry.isLocalPendingDelete -= 1;\n\n\t\t\t\tconst toggleOp: IToggleOperation = {\n\t\t\t\t\ttype: OperationType.toggle,\n\t\t\t\t\tentryId,\n\t\t\t\t\tisDeleted: liveEntry.isDeleted,\n\t\t\t\t};\n\t\t\t\tthis.emitValueChangedEvent(toggleOp, true /* isLocal */);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.toggleMove: {\n\t\t\t\tconst { entryId: oldEntryId, changedToEntryId: newEntryId } = arrayOp;\n\t\t\t\tthis.getEntryForId(oldEntryId).isLocalPendingMove -= 1;\n\t\t\t\tthis.updateLiveEntry(oldEntryId, newEntryId);\n\n\t\t\t\tconst toggleMoveOp: IToggleMoveOperation = {\n\t\t\t\t\ttype: OperationType.toggleMove,\n\t\t\t\t\tentryId: newEntryId,\n\t\t\t\t\tchangedToEntryId: oldEntryId,\n\t\t\t\t};\n\t\t\t\tthis.emitValueChangedEvent(toggleMoveOp, true /* isLocal */);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(arrayOp);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Load share array from snapshot\n\t *\n\t * @param storage - the storage to get the snapshot from\n\t * @returns promise that resolved when the load is completed\n\t */\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst header = await storage.readBlob(snapshotFileName);\n\t\t// eslint-disable-next-line unicorn/text-encoding-identifier-case\n\t\tconst utf8 = new TextDecoder(\"utf-8\").decode(header);\n\t\t// Note: IFluidSerializer.parse() doesn't guarantee any typing; the explicit typing here is based on this code's\n\t\t// knowledge of what it is deserializing.\n\t\tconst deserializedSharedArray = this.serializer.parse(utf8) as {\n\t\t\tdataArray: SharedArrayEntry<T>[];\n\t\t};\n\t\tthis.sharedArray = deserializedSharedArray.dataArray;\n\t\t// Initializing the idToEntryMap optimizer data set\n\t\tfor (const entry of this.sharedArray) {\n\t\t\tthis.idToEntryMap.set(entry.entryId, entry);\n\t\t\tthis.unsetLocalFlags(entry);\n\t\t}\n\t}\n\n\t/**\n\t * Callback on disconnect\n\t */\n\tprotected onDisconnect(): void {}\n\n\t/**\n\t * Tracks the doubly linked skip list for the given entry to identify local pending counter attribute.\n\t * It signifies if a local pending operation exists for the payload/value being tracked in the skip list\n\t *\n\t * returns true if counterAttribute's count \\> 0\n\t * @param entryId - id for which counter attribute is to be tracked in chian.\n\t * @param counterAttribute - flag or property name from SharedArrayEntry whose counter is to be tracked.\n\t */\n\tprivate isLocalPending(\n\t\tentryId: string,\n\t\tcounterAttribute: keyof SharedArrayEntry<T>,\n\t): boolean {\n\t\tconst getCounterAttributeValue = (\n\t\t\tentry: SharedArrayEntry<T>,\n\t\t\tcounterAttr: keyof SharedArrayEntry<T>,\n\t\t): number => {\n\t\t\treturn entry[counterAttr] as number;\n\t\t};\n\n\t\tconst inputEntry = this.getEntryForId(entryId);\n\t\tlet prevEntryId = inputEntry.prevEntryId;\n\t\tlet nextEntryId = inputEntry.nextEntryId;\n\t\tif (getCounterAttributeValue(inputEntry, counterAttribute) > 0) {\n\t\t\treturn true;\n\t\t}\n\t\t// track back in chain\n\t\twhile (prevEntryId !== undefined && prevEntryId) {\n\t\t\tconst prevEntry = this.getEntryForId(prevEntryId);\n\t\t\tif (getCounterAttributeValue(prevEntry, counterAttribute)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tprevEntryId = prevEntry.prevEntryId;\n\t\t}\n\n\t\t// track forward in the chain\n\t\twhile (nextEntryId !== undefined && nextEntryId) {\n\t\t\tconst nextEntry = this.getEntryForId(nextEntryId);\n\t\t\tif (getCounterAttributeValue(nextEntry, counterAttribute)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tnextEntryId = nextEntry.nextEntryId;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate getEntryForId(entryId: string): SharedArrayEntry<T> {\n\t\treturn this.idToEntryMap.get(entryId) as SharedArrayEntry<T>;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}\n\t */\n\tprotected processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {\n\t\tconst { envelope, local, messagesContent } = messagesCollection;\n\t\tfor (const messageContent of messagesContent) {\n\t\t\tthis.processMessage(envelope, messageContent, local);\n\t\t}\n\t}\n\n\tprivate processMessage(\n\t\tmessageEnvelope: ISequencedMessageEnvelope,\n\t\tmessageContent: IRuntimeMessagesContent,\n\t\tlocal: boolean,\n\t): void {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison\n\t\tif (messageEnvelope.type === MessageType.Operation) {\n\t\t\tconst op = messageContent.contents as ISharedArrayOperation<T>;\n\t\t\tswitch (op.type) {\n\t\t\t\tcase OperationType.insertEntry: {\n\t\t\t\t\tthis.handleInsertOp<SerializableTypeForSharedArray>(\n\t\t\t\t\t\top.entryId,\n\t\t\t\t\t\top.insertAfterEntryId,\n\t\t\t\t\t\tlocal,\n\t\t\t\t\t\top.value,\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase OperationType.deleteEntry: {\n\t\t\t\t\tthis.handleDeleteOp(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase OperationType.moveEntry: {\n\t\t\t\t\tthis.handleMoveOp(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase OperationType.toggle: {\n\t\t\t\t\tthis.handleToggleOp(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase OperationType.toggleMove: {\n\t\t\t\t\tthis.handleToggleMoveOp(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\tthrow new Error(\"Unknown operation\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!local) {\n\t\t\t\tthis.emitValueChangedEvent(op, local);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleInsertOp<TWrite>(\n\t\tentryId: string,\n\t\tinsertAfterEntryId: string | undefined,\n\t\tlocal: boolean,\n\t\tvalue: Serializable<TWrite> & T,\n\t): void {\n\t\tlet index = 0;\n\t\tif (local) {\n\t\t\tthis.getEntryForId(entryId).isAckPending = false;\n\t\t} else {\n\t\t\tif (insertAfterEntryId !== undefined) {\n\t\t\t\tindex = this.findIndexOfEntryId(insertAfterEntryId) + 1;\n\t\t\t}\n\t\t\tconst newEntry = this.createNewEntry(entryId, value);\n\t\t\tnewEntry.isAckPending = false;\n\t\t\tthis.addEntry(this.getInternalInsertIndexByIgnoringLocalPendingInserts(index), newEntry);\n\t\t}\n\t}\n\n\tprivate handleDeleteOp(op: IDeleteOperation, local: boolean): void {\n\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\tif (local) {\n\t\t\t// Decrementing local pending counter as op is already applied to local state\n\t\t\topEntry.isLocalPendingDelete -= 1;\n\t\t\tthis.remoteDeleteWithLocalPendingDelete.delete(op.entryId);\n\t\t} else {\n\t\t\tif (this.isLocalPending(op.entryId, \"isLocalPendingDelete\")) {\n\t\t\t\tthis.remoteDeleteWithLocalPendingDelete.add(op.entryId);\n\t\t\t} else {\n\t\t\t\t// last element in skip list is the most recent and live entry, so marking it deleted\n\t\t\t\tthis.getLiveEntry(op.entryId).isDeleted = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleMoveOp(op: IMoveOperation, local: boolean): void {\n\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\tthis.handleInsertOp<SerializableTypeForSharedArray>(\n\t\t\top.changedToEntryId,\n\t\t\top.insertAfterEntryId,\n\t\t\tlocal,\n\t\t\topEntry.value,\n\t\t);\n\t\tif (local) {\n\t\t\t// decrement the local pending move op as its already applied to local state\n\t\t\topEntry.isLocalPendingMove -= 1;\n\t\t} else {\n\t\t\tconst newElementEntryId = op.changedToEntryId;\n\t\t\tconst newElement = this.getEntryForId(newElementEntryId);\n\t\t\t// If local pending then simply mark the new location dead as finally the local op will win\n\t\t\tif (\n\t\t\t\tthis.isLocalPending(op.entryId, \"isLocalPendingDelete\") ||\n\t\t\t\tthis.isLocalPending(op.entryId, \"isLocalPendingMove\")\n\t\t\t) {\n\t\t\t\tthis.updateDeadEntry(op.entryId, newElementEntryId);\n\t\t\t} else {\n\t\t\t\t// move the element\n\t\t\t\tconst liveEntry = this.getLiveEntry(op.entryId);\n\t\t\t\tconst isDeleted = liveEntry.isDeleted;\n\t\t\t\tthis.updateLiveEntry(liveEntry.entryId, newElementEntryId);\n\t\t\t\t// mark newly added element as deleted if existing live element was already deleted\n\t\t\t\tif (isDeleted) {\n\t\t\t\t\tnewElement.isDeleted = isDeleted;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleToggleOp(op: IToggleOperation, local: boolean): void {\n\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\tif (local) {\n\t\t\t// decrement the local pending delete op as its already applied to local state\n\t\t\tif (opEntry.isLocalPendingDelete) {\n\t\t\t\topEntry.isLocalPendingDelete -= 1;\n\t\t\t}\n\t\t} else {\n\t\t\tif (!this.isLocalPending(op.entryId, \"isLocalPendingDelete\")) {\n\t\t\t\tthis.getLiveEntry(op.entryId).isDeleted = op.isDeleted;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleToggleMoveOp(op: IToggleMoveOperation, local: boolean): void {\n\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\tif (local) {\n\t\t\t// decrement the local pending move op as its already applied to local state\n\t\t\tif (opEntry.isLocalPendingMove) {\n\t\t\t\topEntry.isLocalPendingMove -= 1;\n\t\t\t}\n\t\t} else if (\n\t\t\t!this.isLocalPending(op.entryId, \"isLocalPendingDelete\") &&\n\t\t\t!this.isLocalPending(op.entryId, \"isLocalPendingMove\") &&\n\t\t\tthis.getLiveEntry(op.entryId).isDeleted === false\n\t\t) {\n\t\t\tthis.updateLiveEntry(this.getLiveEntry(op.entryId).entryId, op.entryId);\n\t\t}\n\t}\n\n\tprivate findInternalIndex(countEntries: number): number {\n\t\tif (countEntries < 0) {\n\t\t\tthrow new Error(\"Input count is zero\");\n\t\t}\n\n\t\tlet countDown = countEntries;\n\t\tlet entriesIterator = 0;\n\t\tfor (; entriesIterator < this.sharedArray.length; entriesIterator = entriesIterator + 1) {\n\t\t\tconst entry = this.sharedArray[entriesIterator];\n\t\t\tassert(entry !== undefined, 0xb93 /* Invalid index */);\n\t\t\tif (entry.isDeleted === false) {\n\t\t\t\tif (countDown === 0) {\n\t\t\t\t\treturn entriesIterator;\n\t\t\t\t}\n\t\t\t\tcountDown = countDown - 1;\n\t\t\t}\n\t\t}\n\t\tthrow new Error(`Count of live entries is less than required`);\n\t}\n\n\tprivate findInternalInsertionIndex(index: number): number {\n\t\treturn index === 0 ? index : this.findInternalIndex(index - 1) + 1;\n\t}\n\n\tprivate findInternalDeletionIndex(index: number): number {\n\t\treturn this.findInternalIndex(index);\n\t}\n\n\tprivate createAddEntry<TWrite>(index: number, value: Serializable<TWrite> & T): string {\n\t\tconst newEntry = this.createNewEntry(uuid(), value);\n\t\tthis.addEntry(index, newEntry);\n\t\treturn newEntry.entryId;\n\t}\n\n\tprivate addEntry(insertIndex: number, newEntry: SharedArrayEntry<T>): void {\n\t\t// in scenario where we populate 100K rows, we insert them all at the end of array.\n\t\t// slicing array is way slower than pushing elements.\n\t\tif (insertIndex === this.sharedArray.length) {\n\t\t\tthis.sharedArray.push(newEntry);\n\t\t} else {\n\t\t\tthis.sharedArray.splice(insertIndex, 0 /* deleteCount */, newEntry);\n\t\t}\n\n\t\t// Updating the idToEntryMap optimizer data set as new entry has been added\n\t\tthis.idToEntryMap.set(newEntry.entryId, newEntry);\n\t}\n\n\tprivate emitValueChangedEvent(op: ISharedArrayOperation, isLocal: boolean): void {\n\t\tthis.emit(\"valueChanged\", op, isLocal, this);\n\t}\n\n\tprivate emitRevertibleEvent(op: ISharedArrayOperation): void {\n\t\tconst revertible = new SharedArrayRevertible(this, op);\n\t\tthis.emit(\"revertible\", revertible);\n\t}\n\n\tprivate deleteCore(index: number): void {\n\t\tconst entry = this.sharedArray[index];\n\t\tassert(entry !== undefined, 0xb94 /* Invalid index */);\n\n\t\tif (entry.isDeleted) {\n\t\t\tthrow new Error(\"Entry already deleted.\");\n\t\t}\n\t\tentry.isDeleted = true;\n\n\t\t// Adding local pending counter\n\t\tentry.isLocalPendingDelete += 1;\n\t}\n\n\tprivate createMoveEntry(oldIndex: number, newIndex: number): string {\n\t\tconst oldEntry = this.sharedArray[oldIndex];\n\t\tassert(oldEntry !== undefined, 0xb95 /* Invalid index */);\n\t\tconst newEntry = this.createNewEntry<SerializableTypeForSharedArray>(\n\t\t\tuuid(),\n\t\t\toldEntry.value,\n\t\t\toldEntry.entryId,\n\t\t);\n\n\t\toldEntry.isDeleted = true;\n\t\toldEntry.nextEntryId = newEntry.entryId;\n\n\t\t// Adding local pending counter\n\t\toldEntry.isLocalPendingMove += 1;\n\n\t\tthis.addEntry(newIndex /* insertIndex */, newEntry);\n\n\t\treturn newEntry.entryId;\n\t}\n\n\t/**\n\t * Creates new entry of type SharedArrayEntry interface.\n\t * @param entryId - id for which new entry is created\n\t * @param value - value for the new entry\n\t * @param prevEntryId - prevEntryId if exists to update the previous pointer of double ended linked list\n\t */\n\tprivate createNewEntry<TWrite>(\n\t\tentryId: string,\n\t\tvalue: Serializable<TWrite> & T,\n\t\tprevEntryId?: string,\n\t): SharedArrayEntry<T> {\n\t\treturn {\n\t\t\tentryId,\n\t\t\tvalue,\n\t\t\tisAckPending: true,\n\t\t\tisDeleted: false,\n\t\t\tprevEntryId,\n\t\t\tnextEntryId: undefined,\n\t\t\tisLocalPendingDelete: 0,\n\t\t\tisLocalPendingMove: 0,\n\t\t};\n\t}\n\n\t/**\n\t * Unsets all local flags used by the DDS. This method can be used after reading from snapshott to ensure\n\t * local flags are initialized for use by the DDS.\n\t * @param entry - Entry for which the local flags have to be cleaned up\n\t */\n\tprivate unsetLocalFlags(entry: SharedArrayEntry<T>): void {\n\t\tentry.isAckPending = false;\n\t\tentry.isLocalPendingDelete = 0;\n\t\tentry.isLocalPendingMove = 0;\n\t}\n\n\t/**\n\t * Returns the index of the first entry starting with startIndex that does not have the isAckPending flag\n\t */\n\tprivate getInternalInsertIndexByIgnoringLocalPendingInserts(startIndex: number): number {\n\t\tlet localOpsIterator = startIndex;\n\t\tfor (\n\t\t\t;\n\t\t\tlocalOpsIterator < this.sharedArray.length;\n\t\t\tlocalOpsIterator = localOpsIterator + 1\n\t\t) {\n\t\t\tconst entry = this.sharedArray[localOpsIterator];\n\t\t\tassert(entry !== undefined, 0xb96 /* Invalid index */);\n\t\t\tif (!entry.isAckPending) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn localOpsIterator;\n\t}\n\n\tprivate findIndexOfEntryId(entryId: string | undefined): number {\n\t\tfor (let index = 0; index < this.sharedArray.length; index = index + 1) {\n\t\t\tif (this.sharedArray[index]?.entryId === entryId) {\n\t\t\t\treturn index;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\tprivate prepareToMakeEntryIdLive(entry: SharedArrayEntry<T>): void {\n\t\tconst prevIndex = this.findIndexOfEntryId(entry.prevEntryId);\n\t\tconst nextIndex = this.findIndexOfEntryId(entry.nextEntryId);\n\t\tif (prevIndex !== -1) {\n\t\t\tconst prevEntry = this.sharedArray[prevIndex];\n\t\t\tassert(prevEntry !== undefined, 0xb97 /* Invalid index */);\n\t\t\tprevEntry.nextEntryId = entry.nextEntryId;\n\t\t}\n\t\tif (nextIndex !== -1) {\n\t\t\tconst nextEntry = this.sharedArray[nextIndex];\n\t\t\tassert(nextEntry !== undefined, 0xb98 /* Invalid index */);\n\t\t\tnextEntry.prevEntryId = entry.prevEntryId;\n\t\t}\n\t\tentry.prevEntryId = undefined;\n\t\tentry.nextEntryId = undefined;\n\t}\n\n\t/**\n\t * Method that returns the live entry.\n\t * The shared array internally can store a skip list of all related entries which got created\n\t * due to move operations for the same payload/value. However, all elements except for one element\n\t * can have isDeleted flag as false indicating this is the live entry for the value.\n\t * Current implementation ensures that the last element in the skip list of entries is the liveEntry/\n\t * last live entry\n\t *\n\t * @param entryId - Entry id of any node in the skip list for the same payload/value\n\t */\n\tprivate getLiveEntry(entryId: string): SharedArrayEntry<T> {\n\t\tlet liveEntry = this.getEntryForId(entryId);\n\t\twhile (liveEntry.nextEntryId !== undefined && liveEntry.nextEntryId) {\n\t\t\tliveEntry = this.getEntryForId(liveEntry.nextEntryId);\n\t\t}\n\t\treturn liveEntry;\n\t}\n\n\t/**\n\t * We track sequence of moves for a entry in the shared array using doubly linked skip list.\n\t * This utility function helps us keep track of the current position of an entry.value by marking the entry\n\t * at previous position deleted and appending the entry at the new position at the end of the double linked\n\t * list for that entry.value.\n\t */\n\tprivate updateLiveEntry(oldLiveEntryEntryId: string, newLiveEntryEntryId: string): void {\n\t\tconst oldLiveEntry = this.getEntryForId(oldLiveEntryEntryId);\n\t\tconst newLiveEntry = this.getEntryForId(newLiveEntryEntryId);\n\t\tif (oldLiveEntryEntryId === newLiveEntryEntryId) {\n\t\t\toldLiveEntry.isDeleted = false;\n\t\t} else {\n\t\t\tthis.prepareToMakeEntryIdLive(newLiveEntry);\n\t\t\t// Make entryId live\n\t\t\toldLiveEntry.nextEntryId = newLiveEntryEntryId;\n\t\t\tnewLiveEntry.prevEntryId = oldLiveEntryEntryId;\n\t\t\tnewLiveEntry.isDeleted = false;\n\t\t\toldLiveEntry.isDeleted = true;\n\t\t}\n\t}\n\n\t/**\n\t * We track sequence of moves for a entry in the shared array using doubly linked skip list.\n\t * This utility function helps to insert the new entry as dead entry and reconnecting the double linked list with\n\t * existingEntry -\\> deadeEntry(appended) -\\> existing chain(if any).\n\t */\n\tprivate updateDeadEntry(existingEntryId: string, deadEntryId: string): void {\n\t\tconst existingEntry = this.getEntryForId(existingEntryId);\n\t\tconst deadEntry = this.getEntryForId(deadEntryId);\n\n\t\t// update dead entry's next to existingEntry's next, if existingEntry's next entry exists.\n\t\t// It can be undefined if the exiting element is the last element (or only element) of chain.\n\t\tif (existingEntry.nextEntryId !== undefined) {\n\t\t\tdeadEntry.nextEntryId = existingEntry.nextEntryId;\n\t\t\tthis.getEntryForId(existingEntry.nextEntryId).prevEntryId = deadEntryId;\n\t\t}\n\n\t\t// update current entry's next pointer to dead entry and vice versa.\n\t\texistingEntry.nextEntryId = deadEntryId;\n\t\tdeadEntry.prevEntryId = existingEntryId;\n\t\tdeadEntry.isDeleted = true;\n\t}\n\n\tprivate handleStashedInsert(\n\t\tentryId: string,\n\t\tinsertAfterEntryId: string | undefined,\n\t\tvalue: Serializable<SerializableTypeForSharedArray> & T,\n\t): void {\n\t\tlet index = 0;\n\t\tif (insertAfterEntryId !== undefined) {\n\t\t\tindex = this.findIndexOfEntryId(insertAfterEntryId) + 1;\n\t\t}\n\t\tconst newEntry = this.createNewEntry<SerializableTypeForSharedArray>(entryId, value);\n\t\tnewEntry.isAckPending = true;\n\t\tthis.addEntry(index, newEntry);\n\t}\n\n\tprotected applyStashedOp(content: unknown): void {\n\t\tconst op = content as ISharedArrayOperation<T>;\n\n\t\tswitch (op.type) {\n\t\t\tcase OperationType.insertEntry: {\n\t\t\t\tthis.handleStashedInsert(\n\t\t\t\t\top.entryId,\n\t\t\t\t\top.insertAfterEntryId,\n\t\t\t\t\top.value as Serializable<SerializableTypeForSharedArray> & T,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.deleteEntry: {\n\t\t\t\tthis.getLiveEntry(op.entryId).isDeleted = true;\n\t\t\t\tthis.getEntryForId(op.entryId).isLocalPendingDelete += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.moveEntry: {\n\t\t\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\t\t\tthis.handleStashedInsert(\n\t\t\t\t\top.changedToEntryId,\n\t\t\t\t\top.insertAfterEntryId,\n\t\t\t\t\topEntry.value as Serializable<SerializableTypeForSharedArray> & T,\n\t\t\t\t);\n\n\t\t\t\tconst newElementEntryId = op.changedToEntryId;\n\t\t\t\tconst newElement = this.getEntryForId(newElementEntryId);\n\t\t\t\tif (\n\t\t\t\t\tthis.isLocalPending(op.entryId, \"isLocalPendingDelete\") ||\n\t\t\t\t\tthis.isLocalPending(op.entryId, \"isLocalPendingMove\")\n\t\t\t\t) {\n\t\t\t\t\tthis.updateDeadEntry(op.entryId, newElementEntryId);\n\t\t\t\t} else {\n\t\t\t\t\t// move the element\n\t\t\t\t\tconst liveEntry = this.getLiveEntry(op.entryId);\n\t\t\t\t\tconst isDeleted = liveEntry.isDeleted;\n\t\t\t\t\tthis.updateLiveEntry(liveEntry.entryId, newElementEntryId);\n\t\t\t\t\t// mark newly added element as deleted if existing live element was already deleted\n\t\t\t\t\tif (isDeleted) {\n\t\t\t\t\t\tnewElement.isDeleted = isDeleted;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\topEntry.isLocalPendingMove += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.toggle: {\n\t\t\t\tthis.getLiveEntry(op.entryId).isDeleted = op.isDeleted;\n\t\t\t\tthis.getEntryForId(op.entryId).isLocalPendingDelete += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.toggleMove: {\n\t\t\t\tthis.updateLiveEntry(this.getLiveEntry(op.entryId).entryId, op.entryId);\n\t\t\t\tthis.getEntryForId(op.entryId).isLocalPendingMove += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(op);\n\t\t\t}\n\t\t}\n\t\tthis.submitLocalMessage(op);\n\t}\n}\n"]}
1
+ {"version":3,"file":"sharedArray.js","sourceRoot":"","sources":["../../src/array/sharedArray.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, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport type {\n\tSerializable,\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelFactory,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport type { ITree } from \"@fluidframework/driver-definitions/internal\";\nimport { FileMode, MessageType, TreeEntry } from \"@fluidframework/driver-definitions/internal\";\nimport type {\n\tISummaryTreeWithStats,\n\tIRuntimeMessageCollection,\n\tIRuntimeMessagesContent,\n\tISequencedMessageEnvelope,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { convertToSummaryTreeWithStats } from \"@fluidframework/runtime-utils/internal\";\nimport type { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport { SharedObject } from \"@fluidframework/shared-object-base/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport type {\n\tISharedArrayEvents,\n\tISharedArray,\n\tISharedArrayRevertible,\n\tSerializableTypeForSharedArray,\n\tSharedArrayEntry,\n\tSnapshotFormat,\n\tSharedArrayEntryCore,\n} from \"./interfaces.js\";\nimport { SharedArrayFactory } from \"./sharedArrayFactory.js\";\nimport type {\n\tISharedArrayOperation,\n\tIDeleteOperation,\n\tIMoveOperation,\n\tIToggleMoveOperation,\n\tIToggleOperation,\n} from \"./sharedArrayOperations.js\";\nimport { OperationType } from \"./sharedArrayOperations.js\";\nimport { SharedArrayRevertible } from \"./sharedArrayRevertible.js\";\n\nconst snapshotFileName = \"header\";\n\n/**\n * Represents a shared array that allows communication between distributed clients.\n *\n * @internal\n */\nexport class SharedArrayClass<T extends SerializableTypeForSharedArray>\n\textends SharedObject<ISharedArrayEvents>\n\timplements ISharedArray<T>, ISharedArrayRevertible\n{\n\t/**\n\t * Stores the data held by this shared array.\n\t */\n\tprivate sharedArray: SharedArrayEntry<T>[];\n\n\t/**\n\t * Stores a map of entryid to entries of the sharedArray. This is meant of search optimizations and\n\t * so shouldn't be snapshotted.\n\t * Note: This map needs to be updated only when the sharedArray is being deserialized and when new entries are\n\t * being added. New entries are added upon insert ops and the second leg of the move op.\n\t * As we don't delete the entries once created, deletion or move to another position needs no special\n\t * handling for this data structure\n\t */\n\tprivate readonly idToEntryMap: Map<string, SharedArrayEntry<T>>;\n\n\t/**\n\t * Set of entry IDs that are marked for deletion by remote clients, but have local pending deletes.\n\t * Used to prevent resuscitating entries while rolling back a delete operation.\n\t * We should not rollback to life an entry that was deleted by remote clients.\n\t */\n\tprivate readonly remoteDeleteWithLocalPendingDelete: Set<string> = new Set<string>();\n\n\t/**\n\t * Create a new shared array\n\t *\n\t * @param runtime - data store runtime the new shared array belongs to\n\t * @param id - optional name of the shared array\n\t * @returns newly create shared array (but not attached yet)\n\t */\n\tpublic static create<T extends SerializableTypeForSharedArray>(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid?: string,\n\t): SharedArrayClass<T> {\n\t\treturn runtime.createChannel(id, SharedArrayFactory.Type) as SharedArrayClass<T>;\n\t}\n\n\t/**\n\t * Get a factory for SharedArray to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedArray\n\t */\n\tpublic static getFactory<T extends SerializableTypeForSharedArray>(): IChannelFactory {\n\t\treturn new SharedArrayFactory<T>();\n\t}\n\n\t/**\n\t * Constructs a new shared array. If the object is non-local an id and service interfaces will\n\t * be provided\n\t *\n\t * @param id - optional name of the shared array\n\t * @param runtime - data store runtime the shared array belongs to\n\t * @param attributes - represents the attributes of a channel/DDS.\n\t */\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(id, runtime, attributes, \"loop_sharedArray_\" /* telemetryContextPrefix */);\n\t\tthis.sharedArray = [];\n\t\tthis.idToEntryMap = new Map<string, SharedArrayEntry<T>>();\n\t}\n\n\t/**\n\t * Method that returns the ordered list of the items held in the DDS at this point in time.\n\t * Note: This is only a snapshot of the array\n\t */\n\tpublic get(): readonly T[] {\n\t\treturn this.sharedArray.filter((item) => !item.isDeleted).map((entry) => entry.value);\n\t}\n\n\tprotected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\t// Deep copy and unset the local flags. Needed when snapshotting is happening for runtime not attached\n\t\tconst dataArrayCopy: SharedArrayEntryCore<T>[] = [];\n\t\tfor (const entry of this.sharedArray) {\n\t\t\tdataArrayCopy.push({\n\t\t\t\tentryId: entry.entryId,\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\tvalue: JSON.parse(serializer.stringify(entry.value, this.handle)),\n\t\t\t\tisDeleted: entry.isDeleted,\n\t\t\t\tprevEntryId: entry.prevEntryId,\n\t\t\t\tnextEntryId: entry.nextEntryId,\n\t\t\t});\n\t\t}\n\n\t\t// We are snapshotting current client data so autoacking pending local.\n\t\t// Assumption : This should happen only for offline client creating the array. All other scenarios should\n\t\t// get to MSN - where there can be no local pending possible.\n\t\tfor (const entry of this.sharedArray) {\n\t\t\tthis.unsetLocalFlags(entry);\n\t\t}\n\t\tconst contents: SnapshotFormat<SharedArrayEntryCore<T>> = {\n\t\t\tdataArray: dataArrayCopy,\n\t\t};\n\t\tconst tree: ITree = {\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tmode: FileMode.File,\n\t\t\t\t\tpath: snapshotFileName,\n\t\t\t\t\ttype: TreeEntry[TreeEntry.Blob],\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\tcontents: serializer.stringify(contents, this.handle),\n\t\t\t\t\t\t// eslint-disable-next-line unicorn/text-encoding-identifier-case\n\t\t\t\t\t\tencoding: \"utf-8\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t\tconst summaryTreeWithStats = convertToSummaryTreeWithStats(tree);\n\n\t\treturn summaryTreeWithStats;\n\t}\n\n\tpublic insertBulkAfter<TWrite>(\n\t\tref: T | undefined,\n\t\tvalues: (Serializable<TWrite> & T)[],\n\t): void {\n\t\tlet itemIndex: number = 0;\n\n\t\tif (ref !== undefined) {\n\t\t\tfor (itemIndex = this.sharedArray.length - 1; itemIndex > 0; itemIndex -= 1) {\n\t\t\t\tconst item = this.sharedArray[itemIndex];\n\t\t\t\tif (item && !item.isDeleted && item.value === ref) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Add one since we're inserting it after this rowId. If rowId is not found, we will get -1, which after\n\t\t\t// adding one, will be 0, which will place the new rows at the right place too\n\t\t\titemIndex += 1;\n\t\t}\n\n\t\t// Insert new elements\n\t\tfor (const value of values) {\n\t\t\tthis.insertCore(itemIndex, value);\n\t\t\titemIndex += 1;\n\t\t}\n\t}\n\n\tpublic insert<TWrite>(index: number, value: Serializable<TWrite> & T): void {\n\t\tif (index < 0) {\n\t\t\tthrow new Error(\"Invalid input: Insertion index provided is less than 0.\");\n\t\t}\n\t\tthis.insertCore(this.findInternalInsertionIndex(index), value);\n\t}\n\n\tprivate insertCore<TWrite>(indexInternal: number, value: Serializable<TWrite> & T): void {\n\t\tconst insertAfterEntryId =\n\t\t\tindexInternal >= 1 ? this.sharedArray[indexInternal - 1]?.entryId : undefined;\n\t\tconst newEntryId = this.createAddEntry(indexInternal, value);\n\n\t\tconst op = {\n\t\t\ttype: OperationType.insertEntry,\n\t\t\tentryId: newEntryId,\n\t\t\tvalue,\n\t\t\tinsertAfterEntryId,\n\t\t};\n\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\tpublic delete(index: number): void {\n\t\tif (index < 0) {\n\t\t\tthrow new Error(\"Invalid input: Deletion index provided is less than 0.\");\n\t\t}\n\n\t\tconst indexInternal: number = this.findInternalDeletionIndex(index);\n\n\t\tconst entry = this.sharedArray[indexInternal];\n\t\tassert(entry !== undefined, 0xb90 /* Invalid index */);\n\t\tconst entryId = entry.entryId;\n\t\tthis.deleteCore(indexInternal);\n\n\t\tconst op: IDeleteOperation = {\n\t\t\ttype: OperationType.deleteEntry,\n\t\t\tentryId,\n\t\t};\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\tpublic rearrangeToFront(values: T[]): void {\n\t\tfor (let toIndex = 0; toIndex < values.length; toIndex += 1) {\n\t\t\tconst value = values[toIndex];\n\t\t\t// Can skip searching first <toIndex> indices, as they contain elements we already moved.\n\t\t\tfor (let fromIndex = toIndex; fromIndex < this.sharedArray.length; fromIndex += 1) {\n\t\t\t\tconst item = this.sharedArray[fromIndex];\n\t\t\t\tassert(item !== undefined, 0xb91 /* Invalid index */);\n\t\t\t\tif (item.value !== value) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\t!item.isDeleted &&\n\t\t\t\t\t// Moving to and from the same index makes no sense, so noOp\n\t\t\t\t\tfromIndex !== toIndex &&\n\t\t\t\t\t// Moving the same entry from current location to its immediate next makes no sense so noOp\n\t\t\t\t\ttoIndex !== fromIndex + 1\n\t\t\t\t) {\n\t\t\t\t\tthis.moveCore(fromIndex, toIndex);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Moves the DDS entry from one index to another\n\t *\n\t * @param fromIndex - User index of the element to be moved\n\t * @param toIndex - User index to which the element should move to\n\t */\n\tpublic move(fromIndex: number, toIndex: number): void {\n\t\tif (fromIndex < 0) {\n\t\t\tthrow new Error(\"Invalid input: fromIndex value provided is less than 0\");\n\t\t}\n\n\t\tif (toIndex < 0) {\n\t\t\tthrow new Error(\"Invalid input: toIndex value provided is less than 0\");\n\t\t}\n\n\t\tif (\n\t\t\t// Moving to and from the same index makes no sense, so noOp\n\t\t\tfromIndex === toIndex ||\n\t\t\t// Moving the same entry from current location to its immediate next makes no sense so noOp\n\t\t\ttoIndex === fromIndex + 1\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tconst fromIndexInternal: number = this.findInternalDeletionIndex(fromIndex);\n\t\tconst toIndexInternal: number = this.findInternalInsertionIndex(toIndex);\n\n\t\tthis.moveCore(fromIndexInternal, toIndexInternal);\n\t}\n\n\tprivate moveCore(fromIndexInternal: number, toIndexInternal: number): void {\n\t\tconst insertAfterEntryId =\n\t\t\ttoIndexInternal >= 1 ? this.sharedArray[toIndexInternal - 1]?.entryId : undefined;\n\t\tconst entryId = this.sharedArray[fromIndexInternal]?.entryId;\n\t\tassert(entryId !== undefined, 0xb92 /* Invalid index */);\n\t\tconst changedToEntryId = this.createMoveEntry(fromIndexInternal, toIndexInternal);\n\n\t\tconst op: IMoveOperation = {\n\t\t\ttype: OperationType.moveEntry,\n\t\t\tentryId,\n\t\t\tinsertAfterEntryId,\n\t\t\tchangedToEntryId,\n\t\t};\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\t/**\n\t * Method used to do undo/redo operation for the given entry id. This method is\n\t * used for undo/redo of only insert and delete operations. Move operation is NOT handled\n\t * by this method\n\t *\n\t * @param entryId - Entry Id for which the the undo/redo operation is to be applied\n\t */\n\tpublic toggle(entryId: string): void {\n\t\tconst liveEntry = this.getLiveEntry(entryId);\n\t\tif (liveEntry?.isRollback === true) {\n\t\t\treturn;\n\t\t}\n\t\tconst isDeleted = !liveEntry.isDeleted;\n\n\t\t// Adding local pending counter\n\t\tthis.getEntryForId(entryId).isLocalPendingDelete += 1;\n\n\t\t// Toggling the isDeleted flag to undo the last operation for the skip list payload/value\n\t\tliveEntry.isDeleted = isDeleted;\n\n\t\tconst op: IToggleOperation = {\n\t\t\ttype: OperationType.toggle,\n\t\t\tentryId,\n\t\t\tisDeleted,\n\t\t};\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\t/**\n\t * Method to do undo/redo of move operation. All entries of the same payload/value are stored\n\t * in the same doubly linked skip list. This skip list is updated upon every move by adding the\n\t * new location as a new entry in the skip list and update the isDeleted flag to indicate the new\n\t * entry is the cuurent live location for the user.\n\t *\n\t * @param oldEntryId - EntryId of the last live entry\n\t * @param newEntryId - EntryId of the to be live entry\n\t */\n\tpublic toggleMove(oldEntryId: string, newEntryId: string): void {\n\t\tconst liveEntry = this.getLiveEntry(newEntryId);\n\t\tif (liveEntry?.isRollback === true) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.getEntryForId(newEntryId).isDeleted) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Adding local pending counter\n\t\tthis.getEntryForId(oldEntryId).isLocalPendingMove += 1;\n\n\t\tthis.updateLiveEntry(newEntryId, oldEntryId);\n\n\t\tconst op: IToggleMoveOperation = {\n\t\t\ttype: OperationType.toggleMove,\n\t\t\tentryId: oldEntryId,\n\t\t\tchangedToEntryId: newEntryId,\n\t\t};\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\tpublic rollback(op: unknown, _localOpMetadata: unknown): void {\n\t\tconst arrayOp = op as ISharedArrayOperation<T>;\n\t\tswitch (arrayOp.type) {\n\t\t\tcase OperationType.insertEntry: {\n\t\t\t\tconst liveEntry = this.getLiveEntry(arrayOp.entryId);\n\t\t\t\tliveEntry.isDeleted = true;\n\t\t\t\tliveEntry.isRollback = true;\n\t\t\t\tconst deleteOp: IDeleteOperation = {\n\t\t\t\t\ttype: OperationType.deleteEntry,\n\t\t\t\t\tentryId: arrayOp.entryId,\n\t\t\t\t};\n\t\t\t\tthis.emitValueChangedEvent(deleteOp, true /* isLocal */);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.deleteEntry: {\n\t\t\t\tif (this.remoteDeleteWithLocalPendingDelete.has(arrayOp.entryId)) {\n\t\t\t\t\t// If remote already deleted the entry, we should not resurrect it.\n\t\t\t\t\t// Just remove the local pending delete.\n\t\t\t\t\tthis.remoteDeleteWithLocalPendingDelete.delete(arrayOp.entryId);\n\t\t\t\t} else {\n\t\t\t\t\tconst liveEntry = this.getLiveEntry(arrayOp.entryId);\n\t\t\t\t\tliveEntry.isDeleted = false;\n\t\t\t\t\tliveEntry.isRollback = true;\n\t\t\t\t\tconst insertOp = {\n\t\t\t\t\t\ttype: OperationType.insertEntry,\n\t\t\t\t\t\tentryId: arrayOp.entryId,\n\t\t\t\t\t\tvalue: liveEntry.value,\n\t\t\t\t\t};\n\t\t\t\t\tthis.emitValueChangedEvent(insertOp, true /* isLocal */);\n\t\t\t\t\tconst entry = this.getEntryForId(arrayOp.entryId);\n\t\t\t\t\tif (entry !== undefined && entry.isLocalPendingDelete > 0) {\n\t\t\t\t\t\tentry.isLocalPendingDelete -= 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.moveEntry: {\n\t\t\t\tconst { entryId: oldEntryId, changedToEntryId: newEntryId } = arrayOp;\n\t\t\t\tif (this.getEntryForId(newEntryId).isDeleted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.getEntryForId(oldEntryId).isRollback = true;\n\t\t\t\tthis.updateLiveEntry(newEntryId, oldEntryId);\n\t\t\t\tconst inputEntry = this.getEntryForId(oldEntryId);\n\t\t\t\tinputEntry.prevEntryId = undefined;\n\t\t\t\tinputEntry.nextEntryId = undefined;\n\t\t\t\tinputEntry.isLocalPendingMove = 0;\n\t\t\t\tconst moveOp: IMoveOperation = {\n\t\t\t\t\ttype: OperationType.moveEntry,\n\t\t\t\t\tentryId: newEntryId,\n\t\t\t\t\tchangedToEntryId: oldEntryId,\n\t\t\t\t};\n\t\t\t\tthis.emitValueChangedEvent(moveOp, true /* isLocal */);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.toggle: {\n\t\t\t\tconst entryId = arrayOp.entryId;\n\t\t\t\tconst liveEntry = this.getLiveEntry(entryId);\n\t\t\t\tconst isDeleted = liveEntry.isDeleted;\n\n\t\t\t\t// Toggling the isDeleted flag to undo the last operation for the skip list payload/value\n\t\t\t\tliveEntry.isDeleted = !isDeleted;\n\t\t\t\tliveEntry.isLocalPendingDelete -= 1;\n\t\t\t\tliveEntry.isRollback = true;\n\n\t\t\t\tconst toggleOp: IToggleOperation = {\n\t\t\t\t\ttype: OperationType.toggle,\n\t\t\t\t\tentryId,\n\t\t\t\t\tisDeleted: liveEntry.isDeleted,\n\t\t\t\t};\n\t\t\t\tthis.emitValueChangedEvent(toggleOp, true /* isLocal */);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.toggleMove: {\n\t\t\t\tconst { entryId: oldEntryId, changedToEntryId: newEntryId } = arrayOp;\n\t\t\t\tthis.getEntryForId(oldEntryId).isLocalPendingMove -= 1;\n\t\t\t\tthis.getEntryForId(newEntryId).isRollback = true;\n\t\t\t\tthis.updateLiveEntry(oldEntryId, newEntryId);\n\n\t\t\t\tconst toggleMoveOp: IToggleMoveOperation = {\n\t\t\t\t\ttype: OperationType.toggleMove,\n\t\t\t\t\tentryId: newEntryId,\n\t\t\t\t\tchangedToEntryId: oldEntryId,\n\t\t\t\t};\n\t\t\t\tthis.emitValueChangedEvent(toggleMoveOp, true /* isLocal */);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(arrayOp);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Load share array from snapshot\n\t *\n\t * @param storage - the storage to get the snapshot from\n\t * @returns promise that resolved when the load is completed\n\t */\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst header = await storage.readBlob(snapshotFileName);\n\t\t// eslint-disable-next-line unicorn/text-encoding-identifier-case\n\t\tconst utf8 = new TextDecoder(\"utf-8\").decode(header);\n\t\t// Note: IFluidSerializer.parse() doesn't guarantee any typing; the explicit typing here is based on this code's\n\t\t// knowledge of what it is deserializing.\n\t\tconst deserializedSharedArray = this.serializer.parse(utf8) as {\n\t\t\tdataArray: SharedArrayEntry<T>[];\n\t\t};\n\t\tthis.sharedArray = deserializedSharedArray.dataArray;\n\t\t// Initializing the idToEntryMap optimizer data set\n\t\tfor (const entry of this.sharedArray) {\n\t\t\tthis.idToEntryMap.set(entry.entryId, entry);\n\t\t\tthis.unsetLocalFlags(entry);\n\t\t}\n\t}\n\n\t/**\n\t * Callback on disconnect\n\t */\n\tprotected onDisconnect(): void {}\n\n\t/**\n\t * Tracks the doubly linked skip list for the given entry to identify local pending counter attribute.\n\t * It signifies if a local pending operation exists for the payload/value being tracked in the skip list\n\t *\n\t * returns true if counterAttribute's count \\> 0\n\t * @param entryId - id for which counter attribute is to be tracked in chian.\n\t * @param counterAttribute - flag or property name from SharedArrayEntry whose counter is to be tracked.\n\t */\n\tprivate isLocalPending(\n\t\tentryId: string,\n\t\tcounterAttribute: keyof SharedArrayEntry<T>,\n\t): boolean {\n\t\tconst getCounterAttributeValue = (\n\t\t\tentry: SharedArrayEntry<T>,\n\t\t\tcounterAttr: keyof SharedArrayEntry<T>,\n\t\t): number => {\n\t\t\treturn entry[counterAttr] as number;\n\t\t};\n\n\t\tconst inputEntry = this.getEntryForId(entryId);\n\t\tlet prevEntryId = inputEntry.prevEntryId;\n\t\tlet nextEntryId = inputEntry.nextEntryId;\n\t\tif (getCounterAttributeValue(inputEntry, counterAttribute) > 0) {\n\t\t\treturn true;\n\t\t}\n\t\t// track back in chain\n\t\twhile (prevEntryId !== undefined && prevEntryId) {\n\t\t\tconst prevEntry = this.getEntryForId(prevEntryId);\n\t\t\tif (getCounterAttributeValue(prevEntry, counterAttribute)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tprevEntryId = prevEntry.prevEntryId;\n\t\t}\n\n\t\t// track forward in the chain\n\t\twhile (nextEntryId !== undefined && nextEntryId) {\n\t\t\tconst nextEntry = this.getEntryForId(nextEntryId);\n\t\t\tif (getCounterAttributeValue(nextEntry, counterAttribute)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tnextEntryId = nextEntry.nextEntryId;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate getEntryForId(entryId: string): SharedArrayEntry<T> {\n\t\treturn this.idToEntryMap.get(entryId) as SharedArrayEntry<T>;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}\n\t */\n\tprotected processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {\n\t\tconst { envelope, local, messagesContent } = messagesCollection;\n\t\tfor (const messageContent of messagesContent) {\n\t\t\tthis.processMessage(envelope, messageContent, local);\n\t\t}\n\t}\n\n\tprivate processMessage(\n\t\tmessageEnvelope: ISequencedMessageEnvelope,\n\t\tmessageContent: IRuntimeMessagesContent,\n\t\tlocal: boolean,\n\t): void {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison\n\t\tif (messageEnvelope.type === MessageType.Operation) {\n\t\t\tconst op = messageContent.contents as ISharedArrayOperation<T>;\n\t\t\tswitch (op.type) {\n\t\t\t\tcase OperationType.insertEntry: {\n\t\t\t\t\tthis.handleInsertOp<SerializableTypeForSharedArray>(\n\t\t\t\t\t\top.entryId,\n\t\t\t\t\t\top.insertAfterEntryId,\n\t\t\t\t\t\tlocal,\n\t\t\t\t\t\top.value,\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase OperationType.deleteEntry: {\n\t\t\t\t\tthis.handleDeleteOp(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase OperationType.moveEntry: {\n\t\t\t\t\tthis.handleMoveOp(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase OperationType.toggle: {\n\t\t\t\t\tthis.handleToggleOp(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase OperationType.toggleMove: {\n\t\t\t\t\tthis.handleToggleMoveOp(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\tthrow new Error(\"Unknown operation\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!local) {\n\t\t\t\tthis.emitValueChangedEvent(op, local);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleInsertOp<TWrite>(\n\t\tentryId: string,\n\t\tinsertAfterEntryId: string | undefined,\n\t\tlocal: boolean,\n\t\tvalue: Serializable<TWrite> & T,\n\t): void {\n\t\tlet index = 0;\n\t\tif (local) {\n\t\t\tthis.getEntryForId(entryId).isAckPending = false;\n\t\t} else {\n\t\t\tif (insertAfterEntryId !== undefined) {\n\t\t\t\tindex = this.findIndexOfEntryId(insertAfterEntryId) + 1;\n\t\t\t}\n\t\t\tconst newEntry = this.createNewEntry(entryId, value);\n\t\t\tnewEntry.isAckPending = false;\n\t\t\tthis.addEntry(this.getInternalInsertIndexByIgnoringLocalPendingInserts(index), newEntry);\n\t\t}\n\t}\n\n\tprivate handleDeleteOp(op: IDeleteOperation, local: boolean): void {\n\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\tif (local) {\n\t\t\t// Decrementing local pending counter as op is already applied to local state\n\t\t\topEntry.isLocalPendingDelete -= 1;\n\t\t\tthis.remoteDeleteWithLocalPendingDelete.delete(op.entryId);\n\t\t} else {\n\t\t\tif (this.isLocalPending(op.entryId, \"isLocalPendingDelete\")) {\n\t\t\t\tthis.remoteDeleteWithLocalPendingDelete.add(op.entryId);\n\t\t\t} else {\n\t\t\t\t// last element in skip list is the most recent and live entry, so marking it deleted\n\t\t\t\tthis.getLiveEntry(op.entryId).isDeleted = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleMoveOp(op: IMoveOperation, local: boolean): void {\n\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\tthis.handleInsertOp<SerializableTypeForSharedArray>(\n\t\t\top.changedToEntryId,\n\t\t\top.insertAfterEntryId,\n\t\t\tlocal,\n\t\t\topEntry.value,\n\t\t);\n\t\tif (local) {\n\t\t\t// decrement the local pending move op as its already applied to local state\n\t\t\topEntry.isLocalPendingMove -= 1;\n\t\t} else {\n\t\t\tconst newElementEntryId = op.changedToEntryId;\n\t\t\tconst newElement = this.getEntryForId(newElementEntryId);\n\t\t\t// If local pending then simply mark the new location dead as finally the local op will win\n\t\t\tif (\n\t\t\t\tthis.isLocalPending(op.entryId, \"isLocalPendingDelete\") ||\n\t\t\t\tthis.isLocalPending(op.entryId, \"isLocalPendingMove\")\n\t\t\t) {\n\t\t\t\tthis.updateDeadEntry(op.entryId, newElementEntryId);\n\t\t\t} else {\n\t\t\t\t// move the element\n\t\t\t\tconst liveEntry = this.getLiveEntry(op.entryId);\n\t\t\t\tconst isDeleted = liveEntry.isDeleted;\n\t\t\t\tthis.updateLiveEntry(liveEntry.entryId, newElementEntryId);\n\t\t\t\t// mark newly added element as deleted if existing live element was already deleted\n\t\t\t\tif (isDeleted) {\n\t\t\t\t\tnewElement.isDeleted = isDeleted;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleToggleOp(op: IToggleOperation, local: boolean): void {\n\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\tif (local) {\n\t\t\t// decrement the local pending delete op as its already applied to local state\n\t\t\tif (opEntry.isLocalPendingDelete) {\n\t\t\t\topEntry.isLocalPendingDelete -= 1;\n\t\t\t}\n\t\t} else {\n\t\t\tif (!this.isLocalPending(op.entryId, \"isLocalPendingDelete\")) {\n\t\t\t\tthis.getLiveEntry(op.entryId).isDeleted = op.isDeleted;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleToggleMoveOp(op: IToggleMoveOperation, local: boolean): void {\n\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\tif (local) {\n\t\t\t// decrement the local pending move op as its already applied to local state\n\t\t\tif (opEntry.isLocalPendingMove) {\n\t\t\t\topEntry.isLocalPendingMove -= 1;\n\t\t\t}\n\t\t} else if (\n\t\t\t!this.isLocalPending(op.entryId, \"isLocalPendingDelete\") &&\n\t\t\t!this.isLocalPending(op.entryId, \"isLocalPendingMove\") &&\n\t\t\tthis.getLiveEntry(op.entryId).isDeleted === false\n\t\t) {\n\t\t\tthis.updateLiveEntry(this.getLiveEntry(op.entryId).entryId, op.entryId);\n\t\t}\n\t}\n\n\tprivate findInternalIndex(countEntries: number): number {\n\t\tif (countEntries < 0) {\n\t\t\tthrow new Error(\"Input count is zero\");\n\t\t}\n\n\t\tlet countDown = countEntries;\n\t\tlet entriesIterator = 0;\n\t\tfor (; entriesIterator < this.sharedArray.length; entriesIterator = entriesIterator + 1) {\n\t\t\tconst entry = this.sharedArray[entriesIterator];\n\t\t\tassert(entry !== undefined, 0xb93 /* Invalid index */);\n\t\t\tif (entry.isDeleted === false) {\n\t\t\t\tif (countDown === 0) {\n\t\t\t\t\treturn entriesIterator;\n\t\t\t\t}\n\t\t\t\tcountDown = countDown - 1;\n\t\t\t}\n\t\t}\n\t\tthrow new Error(`Count of live entries is less than required`);\n\t}\n\n\tprivate findInternalInsertionIndex(index: number): number {\n\t\treturn index === 0 ? index : this.findInternalIndex(index - 1) + 1;\n\t}\n\n\tprivate findInternalDeletionIndex(index: number): number {\n\t\treturn this.findInternalIndex(index);\n\t}\n\n\tprivate createAddEntry<TWrite>(index: number, value: Serializable<TWrite> & T): string {\n\t\tconst newEntry = this.createNewEntry(uuid(), value);\n\t\tthis.addEntry(index, newEntry);\n\t\treturn newEntry.entryId;\n\t}\n\n\tprivate addEntry(insertIndex: number, newEntry: SharedArrayEntry<T>): void {\n\t\t// in scenario where we populate 100K rows, we insert them all at the end of array.\n\t\t// slicing array is way slower than pushing elements.\n\t\tif (insertIndex === this.sharedArray.length) {\n\t\t\tthis.sharedArray.push(newEntry);\n\t\t} else {\n\t\t\tthis.sharedArray.splice(insertIndex, 0 /* deleteCount */, newEntry);\n\t\t}\n\n\t\t// Updating the idToEntryMap optimizer data set as new entry has been added\n\t\tthis.idToEntryMap.set(newEntry.entryId, newEntry);\n\t}\n\n\tprivate emitValueChangedEvent(op: ISharedArrayOperation, isLocal: boolean): void {\n\t\tthis.emit(\"valueChanged\", op, isLocal, this);\n\t}\n\n\tprivate emitRevertibleEvent(op: ISharedArrayOperation): void {\n\t\tconst revertible = new SharedArrayRevertible(this, op);\n\t\tthis.emit(\"revertible\", revertible);\n\t}\n\n\tprivate deleteCore(index: number): void {\n\t\tconst entry = this.sharedArray[index];\n\t\tassert(entry !== undefined, 0xb94 /* Invalid index */);\n\n\t\tif (entry.isDeleted) {\n\t\t\tthrow new Error(\"Entry already deleted.\");\n\t\t}\n\t\tentry.isDeleted = true;\n\n\t\t// Adding local pending counter\n\t\tentry.isLocalPendingDelete += 1;\n\t}\n\n\tprivate createMoveEntry(oldIndex: number, newIndex: number): string {\n\t\tconst oldEntry = this.sharedArray[oldIndex];\n\t\tassert(oldEntry !== undefined, 0xb95 /* Invalid index */);\n\t\tconst newEntry = this.createNewEntry<SerializableTypeForSharedArray>(\n\t\t\tuuid(),\n\t\t\toldEntry.value,\n\t\t\toldEntry.entryId,\n\t\t);\n\n\t\toldEntry.isDeleted = true;\n\t\toldEntry.nextEntryId = newEntry.entryId;\n\n\t\t// Adding local pending counter\n\t\toldEntry.isLocalPendingMove += 1;\n\n\t\tthis.addEntry(newIndex /* insertIndex */, newEntry);\n\n\t\treturn newEntry.entryId;\n\t}\n\n\t/**\n\t * Creates new entry of type SharedArrayEntry interface.\n\t * @param entryId - id for which new entry is created\n\t * @param value - value for the new entry\n\t * @param prevEntryId - prevEntryId if exists to update the previous pointer of double ended linked list\n\t */\n\tprivate createNewEntry<TWrite>(\n\t\tentryId: string,\n\t\tvalue: Serializable<TWrite> & T,\n\t\tprevEntryId?: string,\n\t): SharedArrayEntry<T> {\n\t\treturn {\n\t\t\tentryId,\n\t\t\tvalue,\n\t\t\tisAckPending: true,\n\t\t\tisDeleted: false,\n\t\t\tprevEntryId,\n\t\t\tnextEntryId: undefined,\n\t\t\tisLocalPendingDelete: 0,\n\t\t\tisLocalPendingMove: 0,\n\t\t};\n\t}\n\n\t/**\n\t * Unsets all local flags used by the DDS. This method can be used after reading from snapshott to ensure\n\t * local flags are initialized for use by the DDS.\n\t * @param entry - Entry for which the local flags have to be cleaned up\n\t */\n\tprivate unsetLocalFlags(entry: SharedArrayEntry<T>): void {\n\t\tentry.isAckPending = false;\n\t\tentry.isLocalPendingDelete = 0;\n\t\tentry.isLocalPendingMove = 0;\n\t}\n\n\t/**\n\t * Returns the index of the first entry starting with startIndex that does not have the isAckPending flag\n\t */\n\tprivate getInternalInsertIndexByIgnoringLocalPendingInserts(startIndex: number): number {\n\t\tlet localOpsIterator = startIndex;\n\t\tfor (\n\t\t\t;\n\t\t\tlocalOpsIterator < this.sharedArray.length;\n\t\t\tlocalOpsIterator = localOpsIterator + 1\n\t\t) {\n\t\t\tconst entry = this.sharedArray[localOpsIterator];\n\t\t\tassert(entry !== undefined, 0xb96 /* Invalid index */);\n\t\t\tif (!entry.isAckPending) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn localOpsIterator;\n\t}\n\n\tprivate findIndexOfEntryId(entryId: string | undefined): number {\n\t\tfor (let index = 0; index < this.sharedArray.length; index = index + 1) {\n\t\t\tif (this.sharedArray[index]?.entryId === entryId) {\n\t\t\t\treturn index;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\tprivate prepareToMakeEntryIdLive(entry: SharedArrayEntry<T>): void {\n\t\tconst prevIndex = this.findIndexOfEntryId(entry.prevEntryId);\n\t\tconst nextIndex = this.findIndexOfEntryId(entry.nextEntryId);\n\t\tif (prevIndex !== -1) {\n\t\t\tconst prevEntry = this.sharedArray[prevIndex];\n\t\t\tassert(prevEntry !== undefined, 0xb97 /* Invalid index */);\n\t\t\tprevEntry.nextEntryId = entry.nextEntryId;\n\t\t}\n\t\tif (nextIndex !== -1) {\n\t\t\tconst nextEntry = this.sharedArray[nextIndex];\n\t\t\tassert(nextEntry !== undefined, 0xb98 /* Invalid index */);\n\t\t\tnextEntry.prevEntryId = entry.prevEntryId;\n\t\t}\n\t\tentry.prevEntryId = undefined;\n\t\tentry.nextEntryId = undefined;\n\t}\n\n\t/**\n\t * Method that returns the live entry.\n\t * The shared array internally can store a skip list of all related entries which got created\n\t * due to move operations for the same payload/value. However, all elements except for one element\n\t * can have isDeleted flag as false indicating this is the live entry for the value.\n\t * Current implementation ensures that the last element in the skip list of entries is the liveEntry/\n\t * last live entry\n\t *\n\t * @param entryId - Entry id of any node in the skip list for the same payload/value\n\t */\n\tprivate getLiveEntry(entryId: string): SharedArrayEntry<T> {\n\t\tlet liveEntry = this.getEntryForId(entryId);\n\t\twhile (liveEntry.nextEntryId !== undefined && liveEntry.nextEntryId) {\n\t\t\tliveEntry = this.getEntryForId(liveEntry.nextEntryId);\n\t\t}\n\t\treturn liveEntry;\n\t}\n\n\t/**\n\t * We track sequence of moves for a entry in the shared array using doubly linked skip list.\n\t * This utility function helps us keep track of the current position of an entry.value by marking the entry\n\t * at previous position deleted and appending the entry at the new position at the end of the double linked\n\t * list for that entry.value.\n\t */\n\tprivate updateLiveEntry(oldLiveEntryEntryId: string, newLiveEntryEntryId: string): void {\n\t\tconst oldLiveEntry = this.getEntryForId(oldLiveEntryEntryId);\n\t\tconst newLiveEntry = this.getEntryForId(newLiveEntryEntryId);\n\t\tif (oldLiveEntryEntryId === newLiveEntryEntryId) {\n\t\t\toldLiveEntry.isDeleted = false;\n\t\t} else {\n\t\t\tthis.prepareToMakeEntryIdLive(newLiveEntry);\n\t\t\t// Make entryId live\n\t\t\toldLiveEntry.nextEntryId = newLiveEntryEntryId;\n\t\t\tnewLiveEntry.prevEntryId = oldLiveEntryEntryId;\n\t\t\tnewLiveEntry.isDeleted = false;\n\t\t\toldLiveEntry.isDeleted = true;\n\t\t}\n\t}\n\n\t/**\n\t * We track sequence of moves for a entry in the shared array using doubly linked skip list.\n\t * This utility function helps to insert the new entry as dead entry and reconnecting the double linked list with\n\t * existingEntry -\\> deadeEntry(appended) -\\> existing chain(if any).\n\t */\n\tprivate updateDeadEntry(existingEntryId: string, deadEntryId: string): void {\n\t\tconst existingEntry = this.getEntryForId(existingEntryId);\n\t\tconst deadEntry = this.getEntryForId(deadEntryId);\n\n\t\t// update dead entry's next to existingEntry's next, if existingEntry's next entry exists.\n\t\t// It can be undefined if the exiting element is the last element (or only element) of chain.\n\t\tif (existingEntry.nextEntryId !== undefined) {\n\t\t\tdeadEntry.nextEntryId = existingEntry.nextEntryId;\n\t\t\tthis.getEntryForId(existingEntry.nextEntryId).prevEntryId = deadEntryId;\n\t\t}\n\n\t\t// update current entry's next pointer to dead entry and vice versa.\n\t\texistingEntry.nextEntryId = deadEntryId;\n\t\tdeadEntry.prevEntryId = existingEntryId;\n\t\tdeadEntry.isDeleted = true;\n\t}\n\n\tprivate handleStashedInsert(\n\t\tentryId: string,\n\t\tinsertAfterEntryId: string | undefined,\n\t\tvalue: Serializable<SerializableTypeForSharedArray> & T,\n\t): void {\n\t\tlet index = 0;\n\t\tif (insertAfterEntryId !== undefined) {\n\t\t\tindex = this.findIndexOfEntryId(insertAfterEntryId) + 1;\n\t\t}\n\t\tconst newEntry = this.createNewEntry<SerializableTypeForSharedArray>(entryId, value);\n\t\tnewEntry.isAckPending = true;\n\t\tthis.addEntry(index, newEntry);\n\t}\n\n\tprotected applyStashedOp(content: unknown): void {\n\t\tconst op = content as ISharedArrayOperation<T>;\n\n\t\tswitch (op.type) {\n\t\t\tcase OperationType.insertEntry: {\n\t\t\t\tthis.handleStashedInsert(\n\t\t\t\t\top.entryId,\n\t\t\t\t\top.insertAfterEntryId,\n\t\t\t\t\top.value as Serializable<SerializableTypeForSharedArray> & T,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.deleteEntry: {\n\t\t\t\tthis.getLiveEntry(op.entryId).isDeleted = true;\n\t\t\t\tthis.getEntryForId(op.entryId).isLocalPendingDelete += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.moveEntry: {\n\t\t\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\t\t\tthis.handleStashedInsert(\n\t\t\t\t\top.changedToEntryId,\n\t\t\t\t\top.insertAfterEntryId,\n\t\t\t\t\topEntry.value as Serializable<SerializableTypeForSharedArray> & T,\n\t\t\t\t);\n\n\t\t\t\tconst newElementEntryId = op.changedToEntryId;\n\t\t\t\tconst newElement = this.getEntryForId(newElementEntryId);\n\t\t\t\tif (\n\t\t\t\t\tthis.isLocalPending(op.entryId, \"isLocalPendingDelete\") ||\n\t\t\t\t\tthis.isLocalPending(op.entryId, \"isLocalPendingMove\")\n\t\t\t\t) {\n\t\t\t\t\tthis.updateDeadEntry(op.entryId, newElementEntryId);\n\t\t\t\t} else {\n\t\t\t\t\t// move the element\n\t\t\t\t\tconst liveEntry = this.getLiveEntry(op.entryId);\n\t\t\t\t\tconst isDeleted = liveEntry.isDeleted;\n\t\t\t\t\tthis.updateLiveEntry(liveEntry.entryId, newElementEntryId);\n\t\t\t\t\t// mark newly added element as deleted if existing live element was already deleted\n\t\t\t\t\tif (isDeleted) {\n\t\t\t\t\t\tnewElement.isDeleted = isDeleted;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\topEntry.isLocalPendingMove += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.toggle: {\n\t\t\t\tthis.getLiveEntry(op.entryId).isDeleted = op.isDeleted;\n\t\t\t\tthis.getEntryForId(op.entryId).isLocalPendingDelete += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.toggleMove: {\n\t\t\t\tthis.updateLiveEntry(this.getLiveEntry(op.entryId).entryId, op.entryId);\n\t\t\t\tthis.getEntryForId(op.entryId).isLocalPendingMove += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(op);\n\t\t\t}\n\t\t}\n\t\tthis.submitLocalMessage(op);\n\t}\n}\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/legacy-dds";
8
- export declare const pkgVersion = "2.74.0-365691";
8
+ export declare const pkgVersion = "2.74.0-370705";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -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/legacy-dds";
11
- exports.pkgVersion = "2.74.0-365691";
11
+ exports.pkgVersion = "2.74.0-370705";
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,4BAA4B,CAAC;AACvC,QAAA,UAAU,GAAG,eAAe,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/legacy-dds\";\nexport const pkgVersion = \"2.74.0-365691\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,4BAA4B,CAAC;AACvC,QAAA,UAAU,GAAG,eAAe,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/legacy-dds\";\nexport const pkgVersion = \"2.74.0-370705\";\n"]}
@@ -89,6 +89,13 @@ export interface SharedArrayEntry<T extends SerializableTypeForSharedArray> exte
89
89
  * being if there is a remote delete, we will have to respect that
90
90
  */
91
91
  isLocalPendingMove: number;
92
+ /**
93
+ * Optional flag indicating that this entry has been rolled back
94
+ *
95
+ * Used to prevent undo/redo operations that have already been rolled back.
96
+ *
97
+ */
98
+ isRollback?: boolean;
92
99
  }
93
100
  /**
94
101
  * Interface defining the core entry attributes
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/array/interfaces.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/array/interfaces.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/array/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { IEventThisPlaceHolder, IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport type { Serializable } from \"@fluidframework/datastore-definitions/internal\";\nimport type {\n\tISharedObjectEvents,\n\tISharedObject,\n} from \"@fluidframework/shared-object-base/internal\";\n\nimport type { ISharedArrayOperation } from \"./sharedArrayOperations.js\";\n/**\n * Basic types for the SharedArray DDS\n * It can be used as a generic constraint (`extends SerializableTypeForSharedArray`) but is\n * *never* meant to be a concrete/real type on its own.\n *\n * @legacy @beta\n */\nexport type SerializableTypeForSharedArray = boolean | number | string | object | IFluidHandle;\n\n/**\n * Interface defining the events that can be emitted by the SharedArray DDS\n * and the events that can be listened to by the SharedArray DDS\n *\n * @legacy @beta\n */\nexport interface ISharedArrayEvents extends ISharedObjectEvents {\n\t/**\n\t *\n\t * @param event - The event name.\n\t * @param listener - An event listener.\n\t *\n\t * @eventProperty\n\t */\n\t(\n\t\tevent: \"valueChanged\",\n\t\tlistener: (\n\t\t\top: ISharedArrayOperation,\n\t\t\tisLocal: boolean,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n\n\t/**\n\t *\n\t * @param event - The event name.\n\t * @param listener - An event listener.\n\t *\n\t * @eventProperty\n\t */\n\t(event: \"revertible\", listener: (revertible: IRevertible) => void): void;\n}\n\n/**\n * Interface defining the SharedArray DDS\n * It is a generic interface that can be used to create a SharedArray of any type\n * The type of the SharedArray is defined by the type parameter T\n *\n * @typeParam T - The type of the SharedArray\n *\n * @legacy @beta\n */\nexport interface ISharedArray<T extends SerializableTypeForSharedArray>\n\textends ISharedObject<ISharedArrayEvents> {\n\tget(): readonly T[];\n\tinsert<TWrite>(index: number, value: Serializable<TWrite> & T): void;\n\tdelete(index: number): void;\n\tmove(oldIndex: number, newIndex: number): void;\n\ttoggle(entryId: string): void;\n\ttoggleMove(oldEntryId: string, newEntryId: string): void;\n\tinsertBulkAfter<TWrite>(ref: T | undefined, values: (Serializable<TWrite> & T)[]): void;\n}\n\n/**\n *\n * @internal\n */\nexport interface ISharedArrayRevertible extends ISharedObject<ISharedArrayEvents> {\n\ttoggle(entryId: string): void;\n\ttoggleMove(oldEntryId: string, newEntryId: string): void;\n}\n\n/**\n * Interface defining the in memory shared array entry of the DDS\n *\n * @internal\n */\nexport interface SharedArrayEntry<T extends SerializableTypeForSharedArray>\n\textends SharedArrayEntryCore<T> {\n\t/**\n\t * Flag that tracks whether an ack from the server has been received for a local insert.\n\t * True for local changes.\n\t */\n\tisAckPending: boolean;\n\n\t/**\n\t * Counter is shared by delete and undo/redo (of delete and insert) as undo/redo simply\n\t * operates on the isDeleted flag of the DDS. This flag will help us skip local op acks as\n\t * they have already inflicted state change. The flag helps us ignore remote ops if there is a\n\t * local pending delete as we would be getting the pending op after server stamping\n\t */\n\tisLocalPendingDelete: number;\n\n\t/**\n\t * Counter is for move and its undo/redo. This flag will be used to skip local op acks as\n\t * they have already inflicted state change. The flag helps us ignore remote ops if there is a\n\t * local pending delete as we would be getting the pending op after server stamping. Only exception\n\t * being if there is a remote delete, we will have to respect that\n\t */\n\tisLocalPendingMove: number;\n}\n\n/**\n * Interface defining the core entry attributes\n *\n * @internal\n */\nexport interface SharedArrayEntryCore<T extends SerializableTypeForSharedArray> {\n\t/**\n\t * a unique ID for this particular entry\n\t */\n\tentryId: string;\n\n\t/**\n\t * the value stored in this entry, may not be unique\n\t */\n\tvalue: T;\n\n\t/**\n\t * Flag to track whether this entry is deleted or not.\n\t */\n\tisDeleted: boolean;\n\n\t/**\n\t * Primarily used for move op and tracks the old entry id from which this entry was changed from.\n\t */\n\tprevEntryId?: string;\n\n\t/**\n\t * Primarily used for move op and tracks the new entry id to which this entry was changed to.\n\t */\n\tnextEntryId?: string;\n}\n\n/**\n * Format of the snapshot for the DDS\n *\n * @internal\n */\nexport interface SnapshotFormat<T> {\n\t/**\n\t * Array of the data entries that represent the DDS in-memory representation\n\t */\n\tdataArray: T[];\n}\n\n/**\n * @legacy @beta\n */\nexport interface IRevertible {\n\trevert(): void;\n\tdispose(): void;\n}\n"]}
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/array/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { IEventThisPlaceHolder, IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport type { Serializable } from \"@fluidframework/datastore-definitions/internal\";\nimport type {\n\tISharedObjectEvents,\n\tISharedObject,\n} from \"@fluidframework/shared-object-base/internal\";\n\nimport type { ISharedArrayOperation } from \"./sharedArrayOperations.js\";\n/**\n * Basic types for the SharedArray DDS\n * It can be used as a generic constraint (`extends SerializableTypeForSharedArray`) but is\n * *never* meant to be a concrete/real type on its own.\n *\n * @legacy @beta\n */\nexport type SerializableTypeForSharedArray = boolean | number | string | object | IFluidHandle;\n\n/**\n * Interface defining the events that can be emitted by the SharedArray DDS\n * and the events that can be listened to by the SharedArray DDS\n *\n * @legacy @beta\n */\nexport interface ISharedArrayEvents extends ISharedObjectEvents {\n\t/**\n\t *\n\t * @param event - The event name.\n\t * @param listener - An event listener.\n\t *\n\t * @eventProperty\n\t */\n\t(\n\t\tevent: \"valueChanged\",\n\t\tlistener: (\n\t\t\top: ISharedArrayOperation,\n\t\t\tisLocal: boolean,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n\n\t/**\n\t *\n\t * @param event - The event name.\n\t * @param listener - An event listener.\n\t *\n\t * @eventProperty\n\t */\n\t(event: \"revertible\", listener: (revertible: IRevertible) => void): void;\n}\n\n/**\n * Interface defining the SharedArray DDS\n * It is a generic interface that can be used to create a SharedArray of any type\n * The type of the SharedArray is defined by the type parameter T\n *\n * @typeParam T - The type of the SharedArray\n *\n * @legacy @beta\n */\nexport interface ISharedArray<T extends SerializableTypeForSharedArray>\n\textends ISharedObject<ISharedArrayEvents> {\n\tget(): readonly T[];\n\tinsert<TWrite>(index: number, value: Serializable<TWrite> & T): void;\n\tdelete(index: number): void;\n\tmove(oldIndex: number, newIndex: number): void;\n\ttoggle(entryId: string): void;\n\ttoggleMove(oldEntryId: string, newEntryId: string): void;\n\tinsertBulkAfter<TWrite>(ref: T | undefined, values: (Serializable<TWrite> & T)[]): void;\n}\n\n/**\n *\n * @internal\n */\nexport interface ISharedArrayRevertible extends ISharedObject<ISharedArrayEvents> {\n\ttoggle(entryId: string): void;\n\ttoggleMove(oldEntryId: string, newEntryId: string): void;\n}\n\n/**\n * Interface defining the in memory shared array entry of the DDS\n *\n * @internal\n */\nexport interface SharedArrayEntry<T extends SerializableTypeForSharedArray>\n\textends SharedArrayEntryCore<T> {\n\t/**\n\t * Flag that tracks whether an ack from the server has been received for a local insert.\n\t * True for local changes.\n\t */\n\tisAckPending: boolean;\n\n\t/**\n\t * Counter is shared by delete and undo/redo (of delete and insert) as undo/redo simply\n\t * operates on the isDeleted flag of the DDS. This flag will help us skip local op acks as\n\t * they have already inflicted state change. The flag helps us ignore remote ops if there is a\n\t * local pending delete as we would be getting the pending op after server stamping\n\t */\n\tisLocalPendingDelete: number;\n\n\t/**\n\t * Counter is for move and its undo/redo. This flag will be used to skip local op acks as\n\t * they have already inflicted state change. The flag helps us ignore remote ops if there is a\n\t * local pending delete as we would be getting the pending op after server stamping. Only exception\n\t * being if there is a remote delete, we will have to respect that\n\t */\n\tisLocalPendingMove: number;\n\n\t/**\n\t * Optional flag indicating that this entry has been rolled back\n\t *\n\t * Used to prevent undo/redo operations that have already been rolled back.\n\t *\n\t */\n\tisRollback?: boolean;\n}\n\n/**\n * Interface defining the core entry attributes\n *\n * @internal\n */\nexport interface SharedArrayEntryCore<T extends SerializableTypeForSharedArray> {\n\t/**\n\t * a unique ID for this particular entry\n\t */\n\tentryId: string;\n\n\t/**\n\t * the value stored in this entry, may not be unique\n\t */\n\tvalue: T;\n\n\t/**\n\t * Flag to track whether this entry is deleted or not.\n\t */\n\tisDeleted: boolean;\n\n\t/**\n\t * Primarily used for move op and tracks the old entry id from which this entry was changed from.\n\t */\n\tprevEntryId?: string;\n\n\t/**\n\t * Primarily used for move op and tracks the new entry id to which this entry was changed to.\n\t */\n\tnextEntryId?: string;\n}\n\n/**\n * Format of the snapshot for the DDS\n *\n * @internal\n */\nexport interface SnapshotFormat<T> {\n\t/**\n\t * Array of the data entries that represent the DDS in-memory representation\n\t */\n\tdataArray: T[];\n}\n\n/**\n * @legacy @beta\n */\nexport interface IRevertible {\n\trevert(): void;\n\tdispose(): void;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sharedArray.d.ts","sourceRoot":"","sources":["../../src/array/sharedArray.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sharedArray.d.ts","sourceRoot":"","sources":["../../src/array/sharedArray.ts"],"names":[],"mappings":"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"}
@@ -236,6 +236,9 @@ export class SharedArrayClass extends SharedObject {
236
236
  */
237
237
  toggle(entryId) {
238
238
  const liveEntry = this.getLiveEntry(entryId);
239
+ if (liveEntry?.isRollback === true) {
240
+ return;
241
+ }
239
242
  const isDeleted = !liveEntry.isDeleted;
240
243
  // Adding local pending counter
241
244
  this.getEntryForId(entryId).isLocalPendingDelete += 1;
@@ -264,6 +267,10 @@ export class SharedArrayClass extends SharedObject {
264
267
  * @param newEntryId - EntryId of the to be live entry
265
268
  */
266
269
  toggleMove(oldEntryId, newEntryId) {
270
+ const liveEntry = this.getLiveEntry(newEntryId);
271
+ if (liveEntry?.isRollback === true) {
272
+ return;
273
+ }
267
274
  if (this.getEntryForId(newEntryId).isDeleted) {
268
275
  return;
269
276
  }
@@ -289,6 +296,7 @@ export class SharedArrayClass extends SharedObject {
289
296
  case OperationType.insertEntry: {
290
297
  const liveEntry = this.getLiveEntry(arrayOp.entryId);
291
298
  liveEntry.isDeleted = true;
299
+ liveEntry.isRollback = true;
292
300
  const deleteOp = {
293
301
  type: OperationType.deleteEntry,
294
302
  entryId: arrayOp.entryId,
@@ -305,6 +313,7 @@ export class SharedArrayClass extends SharedObject {
305
313
  else {
306
314
  const liveEntry = this.getLiveEntry(arrayOp.entryId);
307
315
  liveEntry.isDeleted = false;
316
+ liveEntry.isRollback = true;
308
317
  const insertOp = {
309
318
  type: OperationType.insertEntry,
310
319
  entryId: arrayOp.entryId,
@@ -323,6 +332,7 @@ export class SharedArrayClass extends SharedObject {
323
332
  if (this.getEntryForId(newEntryId).isDeleted) {
324
333
  return;
325
334
  }
335
+ this.getEntryForId(oldEntryId).isRollback = true;
326
336
  this.updateLiveEntry(newEntryId, oldEntryId);
327
337
  const inputEntry = this.getEntryForId(oldEntryId);
328
338
  inputEntry.prevEntryId = undefined;
@@ -343,6 +353,7 @@ export class SharedArrayClass extends SharedObject {
343
353
  // Toggling the isDeleted flag to undo the last operation for the skip list payload/value
344
354
  liveEntry.isDeleted = !isDeleted;
345
355
  liveEntry.isLocalPendingDelete -= 1;
356
+ liveEntry.isRollback = true;
346
357
  const toggleOp = {
347
358
  type: OperationType.toggle,
348
359
  entryId,
@@ -354,6 +365,7 @@ export class SharedArrayClass extends SharedObject {
354
365
  case OperationType.toggleMove: {
355
366
  const { entryId: oldEntryId, changedToEntryId: newEntryId } = arrayOp;
356
367
  this.getEntryForId(oldEntryId).isLocalPendingMove -= 1;
368
+ this.getEntryForId(newEntryId).isRollback = true;
357
369
  this.updateLiveEntry(oldEntryId, newEntryId);
358
370
  const toggleMoveOp = {
359
371
  type: OperationType.toggleMove,
@@ -1 +1 @@
1
- {"version":3,"file":"sharedArray.js","sourceRoot":"","sources":["../../src/array/sharedArray.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, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport type {\n\tSerializable,\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelFactory,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport type { ITree } from \"@fluidframework/driver-definitions/internal\";\nimport { FileMode, MessageType, TreeEntry } from \"@fluidframework/driver-definitions/internal\";\nimport type {\n\tISummaryTreeWithStats,\n\tIRuntimeMessageCollection,\n\tIRuntimeMessagesContent,\n\tISequencedMessageEnvelope,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { convertToSummaryTreeWithStats } from \"@fluidframework/runtime-utils/internal\";\nimport type { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport { SharedObject } from \"@fluidframework/shared-object-base/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport type {\n\tISharedArrayEvents,\n\tISharedArray,\n\tISharedArrayRevertible,\n\tSerializableTypeForSharedArray,\n\tSharedArrayEntry,\n\tSnapshotFormat,\n\tSharedArrayEntryCore,\n} from \"./interfaces.js\";\nimport { SharedArrayFactory } from \"./sharedArrayFactory.js\";\nimport type {\n\tISharedArrayOperation,\n\tIDeleteOperation,\n\tIMoveOperation,\n\tIToggleMoveOperation,\n\tIToggleOperation,\n} from \"./sharedArrayOperations.js\";\nimport { OperationType } from \"./sharedArrayOperations.js\";\nimport { SharedArrayRevertible } from \"./sharedArrayRevertible.js\";\n\nconst snapshotFileName = \"header\";\n\n/**\n * Represents a shared array that allows communication between distributed clients.\n *\n * @internal\n */\nexport class SharedArrayClass<T extends SerializableTypeForSharedArray>\n\textends SharedObject<ISharedArrayEvents>\n\timplements ISharedArray<T>, ISharedArrayRevertible\n{\n\t/**\n\t * Stores the data held by this shared array.\n\t */\n\tprivate sharedArray: SharedArrayEntry<T>[];\n\n\t/**\n\t * Stores a map of entryid to entries of the sharedArray. This is meant of search optimizations and\n\t * so shouldn't be snapshotted.\n\t * Note: This map needs to be updated only when the sharedArray is being deserialized and when new entries are\n\t * being added. New entries are added upon insert ops and the second leg of the move op.\n\t * As we don't delete the entries once created, deletion or move to another position needs no special\n\t * handling for this data structure\n\t */\n\tprivate readonly idToEntryMap: Map<string, SharedArrayEntry<T>>;\n\n\t/**\n\t * Set of entry IDs that are marked for deletion by remote clients, but have local pending deletes.\n\t * Used to prevent resuscitating entries while rolling back a delete operation.\n\t * We should not rollback to life an entry that was deleted by remote clients.\n\t */\n\tprivate readonly remoteDeleteWithLocalPendingDelete: Set<string> = new Set<string>();\n\n\t/**\n\t * Create a new shared array\n\t *\n\t * @param runtime - data store runtime the new shared array belongs to\n\t * @param id - optional name of the shared array\n\t * @returns newly create shared array (but not attached yet)\n\t */\n\tpublic static create<T extends SerializableTypeForSharedArray>(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid?: string,\n\t): SharedArrayClass<T> {\n\t\treturn runtime.createChannel(id, SharedArrayFactory.Type) as SharedArrayClass<T>;\n\t}\n\n\t/**\n\t * Get a factory for SharedArray to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedArray\n\t */\n\tpublic static getFactory<T extends SerializableTypeForSharedArray>(): IChannelFactory {\n\t\treturn new SharedArrayFactory<T>();\n\t}\n\n\t/**\n\t * Constructs a new shared array. If the object is non-local an id and service interfaces will\n\t * be provided\n\t *\n\t * @param id - optional name of the shared array\n\t * @param runtime - data store runtime the shared array belongs to\n\t * @param attributes - represents the attributes of a channel/DDS.\n\t */\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(id, runtime, attributes, \"loop_sharedArray_\" /* telemetryContextPrefix */);\n\t\tthis.sharedArray = [];\n\t\tthis.idToEntryMap = new Map<string, SharedArrayEntry<T>>();\n\t}\n\n\t/**\n\t * Method that returns the ordered list of the items held in the DDS at this point in time.\n\t * Note: This is only a snapshot of the array\n\t */\n\tpublic get(): readonly T[] {\n\t\treturn this.sharedArray.filter((item) => !item.isDeleted).map((entry) => entry.value);\n\t}\n\n\tprotected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\t// Deep copy and unset the local flags. Needed when snapshotting is happening for runtime not attached\n\t\tconst dataArrayCopy: SharedArrayEntryCore<T>[] = [];\n\t\tfor (const entry of this.sharedArray) {\n\t\t\tdataArrayCopy.push({\n\t\t\t\tentryId: entry.entryId,\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\tvalue: JSON.parse(serializer.stringify(entry.value, this.handle)),\n\t\t\t\tisDeleted: entry.isDeleted,\n\t\t\t\tprevEntryId: entry.prevEntryId,\n\t\t\t\tnextEntryId: entry.nextEntryId,\n\t\t\t});\n\t\t}\n\n\t\t// We are snapshotting current client data so autoacking pending local.\n\t\t// Assumption : This should happen only for offline client creating the array. All other scenarios should\n\t\t// get to MSN - where there can be no local pending possible.\n\t\tfor (const entry of this.sharedArray) {\n\t\t\tthis.unsetLocalFlags(entry);\n\t\t}\n\t\tconst contents: SnapshotFormat<SharedArrayEntryCore<T>> = {\n\t\t\tdataArray: dataArrayCopy,\n\t\t};\n\t\tconst tree: ITree = {\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tmode: FileMode.File,\n\t\t\t\t\tpath: snapshotFileName,\n\t\t\t\t\ttype: TreeEntry[TreeEntry.Blob],\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\tcontents: serializer.stringify(contents, this.handle),\n\t\t\t\t\t\t// eslint-disable-next-line unicorn/text-encoding-identifier-case\n\t\t\t\t\t\tencoding: \"utf-8\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t\tconst summaryTreeWithStats = convertToSummaryTreeWithStats(tree);\n\n\t\treturn summaryTreeWithStats;\n\t}\n\n\tpublic insertBulkAfter<TWrite>(\n\t\tref: T | undefined,\n\t\tvalues: (Serializable<TWrite> & T)[],\n\t): void {\n\t\tlet itemIndex: number = 0;\n\n\t\tif (ref !== undefined) {\n\t\t\tfor (itemIndex = this.sharedArray.length - 1; itemIndex > 0; itemIndex -= 1) {\n\t\t\t\tconst item = this.sharedArray[itemIndex];\n\t\t\t\tif (item && !item.isDeleted && item.value === ref) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Add one since we're inserting it after this rowId. If rowId is not found, we will get -1, which after\n\t\t\t// adding one, will be 0, which will place the new rows at the right place too\n\t\t\titemIndex += 1;\n\t\t}\n\n\t\t// Insert new elements\n\t\tfor (const value of values) {\n\t\t\tthis.insertCore(itemIndex, value);\n\t\t\titemIndex += 1;\n\t\t}\n\t}\n\n\tpublic insert<TWrite>(index: number, value: Serializable<TWrite> & T): void {\n\t\tif (index < 0) {\n\t\t\tthrow new Error(\"Invalid input: Insertion index provided is less than 0.\");\n\t\t}\n\t\tthis.insertCore(this.findInternalInsertionIndex(index), value);\n\t}\n\n\tprivate insertCore<TWrite>(indexInternal: number, value: Serializable<TWrite> & T): void {\n\t\tconst insertAfterEntryId =\n\t\t\tindexInternal >= 1 ? this.sharedArray[indexInternal - 1]?.entryId : undefined;\n\t\tconst newEntryId = this.createAddEntry(indexInternal, value);\n\n\t\tconst op = {\n\t\t\ttype: OperationType.insertEntry,\n\t\t\tentryId: newEntryId,\n\t\t\tvalue,\n\t\t\tinsertAfterEntryId,\n\t\t};\n\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\tpublic delete(index: number): void {\n\t\tif (index < 0) {\n\t\t\tthrow new Error(\"Invalid input: Deletion index provided is less than 0.\");\n\t\t}\n\n\t\tconst indexInternal: number = this.findInternalDeletionIndex(index);\n\n\t\tconst entry = this.sharedArray[indexInternal];\n\t\tassert(entry !== undefined, 0xb90 /* Invalid index */);\n\t\tconst entryId = entry.entryId;\n\t\tthis.deleteCore(indexInternal);\n\n\t\tconst op: IDeleteOperation = {\n\t\t\ttype: OperationType.deleteEntry,\n\t\t\tentryId,\n\t\t};\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\tpublic rearrangeToFront(values: T[]): void {\n\t\tfor (let toIndex = 0; toIndex < values.length; toIndex += 1) {\n\t\t\tconst value = values[toIndex];\n\t\t\t// Can skip searching first <toIndex> indices, as they contain elements we already moved.\n\t\t\tfor (let fromIndex = toIndex; fromIndex < this.sharedArray.length; fromIndex += 1) {\n\t\t\t\tconst item = this.sharedArray[fromIndex];\n\t\t\t\tassert(item !== undefined, 0xb91 /* Invalid index */);\n\t\t\t\tif (item.value !== value) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\t!item.isDeleted &&\n\t\t\t\t\t// Moving to and from the same index makes no sense, so noOp\n\t\t\t\t\tfromIndex !== toIndex &&\n\t\t\t\t\t// Moving the same entry from current location to its immediate next makes no sense so noOp\n\t\t\t\t\ttoIndex !== fromIndex + 1\n\t\t\t\t) {\n\t\t\t\t\tthis.moveCore(fromIndex, toIndex);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Moves the DDS entry from one index to another\n\t *\n\t * @param fromIndex - User index of the element to be moved\n\t * @param toIndex - User index to which the element should move to\n\t */\n\tpublic move(fromIndex: number, toIndex: number): void {\n\t\tif (fromIndex < 0) {\n\t\t\tthrow new Error(\"Invalid input: fromIndex value provided is less than 0\");\n\t\t}\n\n\t\tif (toIndex < 0) {\n\t\t\tthrow new Error(\"Invalid input: toIndex value provided is less than 0\");\n\t\t}\n\n\t\tif (\n\t\t\t// Moving to and from the same index makes no sense, so noOp\n\t\t\tfromIndex === toIndex ||\n\t\t\t// Moving the same entry from current location to its immediate next makes no sense so noOp\n\t\t\ttoIndex === fromIndex + 1\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tconst fromIndexInternal: number = this.findInternalDeletionIndex(fromIndex);\n\t\tconst toIndexInternal: number = this.findInternalInsertionIndex(toIndex);\n\n\t\tthis.moveCore(fromIndexInternal, toIndexInternal);\n\t}\n\n\tprivate moveCore(fromIndexInternal: number, toIndexInternal: number): void {\n\t\tconst insertAfterEntryId =\n\t\t\ttoIndexInternal >= 1 ? this.sharedArray[toIndexInternal - 1]?.entryId : undefined;\n\t\tconst entryId = this.sharedArray[fromIndexInternal]?.entryId;\n\t\tassert(entryId !== undefined, 0xb92 /* Invalid index */);\n\t\tconst changedToEntryId = this.createMoveEntry(fromIndexInternal, toIndexInternal);\n\n\t\tconst op: IMoveOperation = {\n\t\t\ttype: OperationType.moveEntry,\n\t\t\tentryId,\n\t\t\tinsertAfterEntryId,\n\t\t\tchangedToEntryId,\n\t\t};\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\t/**\n\t * Method used to do undo/redo operation for the given entry id. This method is\n\t * used for undo/redo of only insert and delete operations. Move operation is NOT handled\n\t * by this method\n\t *\n\t * @param entryId - Entry Id for which the the undo/redo operation is to be applied\n\t */\n\tpublic toggle(entryId: string): void {\n\t\tconst liveEntry = this.getLiveEntry(entryId);\n\t\tconst isDeleted = !liveEntry.isDeleted;\n\n\t\t// Adding local pending counter\n\t\tthis.getEntryForId(entryId).isLocalPendingDelete += 1;\n\n\t\t// Toggling the isDeleted flag to undo the last operation for the skip list payload/value\n\t\tliveEntry.isDeleted = isDeleted;\n\n\t\tconst op: IToggleOperation = {\n\t\t\ttype: OperationType.toggle,\n\t\t\tentryId,\n\t\t\tisDeleted,\n\t\t};\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\t/**\n\t * Method to do undo/redo of move operation. All entries of the same payload/value are stored\n\t * in the same doubly linked skip list. This skip list is updated upon every move by adding the\n\t * new location as a new entry in the skip list and update the isDeleted flag to indicate the new\n\t * entry is the cuurent live location for the user.\n\t *\n\t * @param oldEntryId - EntryId of the last live entry\n\t * @param newEntryId - EntryId of the to be live entry\n\t */\n\tpublic toggleMove(oldEntryId: string, newEntryId: string): void {\n\t\tif (this.getEntryForId(newEntryId).isDeleted) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Adding local pending counter\n\t\tthis.getEntryForId(oldEntryId).isLocalPendingMove += 1;\n\n\t\tthis.updateLiveEntry(newEntryId, oldEntryId);\n\n\t\tconst op: IToggleMoveOperation = {\n\t\t\ttype: OperationType.toggleMove,\n\t\t\tentryId: oldEntryId,\n\t\t\tchangedToEntryId: newEntryId,\n\t\t};\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\tpublic rollback(op: unknown, _localOpMetadata: unknown): void {\n\t\tconst arrayOp = op as ISharedArrayOperation<T>;\n\t\tswitch (arrayOp.type) {\n\t\t\tcase OperationType.insertEntry: {\n\t\t\t\tconst liveEntry = this.getLiveEntry(arrayOp.entryId);\n\t\t\t\tliveEntry.isDeleted = true;\n\t\t\t\tconst deleteOp: IDeleteOperation = {\n\t\t\t\t\ttype: OperationType.deleteEntry,\n\t\t\t\t\tentryId: arrayOp.entryId,\n\t\t\t\t};\n\t\t\t\tthis.emitValueChangedEvent(deleteOp, true /* isLocal */);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.deleteEntry: {\n\t\t\t\tif (this.remoteDeleteWithLocalPendingDelete.has(arrayOp.entryId)) {\n\t\t\t\t\t// If remote already deleted the entry, we should not resurrect it.\n\t\t\t\t\t// Just remove the local pending delete.\n\t\t\t\t\tthis.remoteDeleteWithLocalPendingDelete.delete(arrayOp.entryId);\n\t\t\t\t} else {\n\t\t\t\t\tconst liveEntry = this.getLiveEntry(arrayOp.entryId);\n\t\t\t\t\tliveEntry.isDeleted = false;\n\t\t\t\t\tconst insertOp = {\n\t\t\t\t\t\ttype: OperationType.insertEntry,\n\t\t\t\t\t\tentryId: arrayOp.entryId,\n\t\t\t\t\t\tvalue: liveEntry.value,\n\t\t\t\t\t};\n\t\t\t\t\tthis.emitValueChangedEvent(insertOp, true /* isLocal */);\n\t\t\t\t\tconst entry = this.getEntryForId(arrayOp.entryId);\n\t\t\t\t\tif (entry !== undefined && entry.isLocalPendingDelete > 0) {\n\t\t\t\t\t\tentry.isLocalPendingDelete -= 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.moveEntry: {\n\t\t\t\tconst { entryId: oldEntryId, changedToEntryId: newEntryId } = arrayOp;\n\t\t\t\tif (this.getEntryForId(newEntryId).isDeleted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.updateLiveEntry(newEntryId, oldEntryId);\n\t\t\t\tconst inputEntry = this.getEntryForId(oldEntryId);\n\t\t\t\tinputEntry.prevEntryId = undefined;\n\t\t\t\tinputEntry.nextEntryId = undefined;\n\t\t\t\tinputEntry.isLocalPendingMove = 0;\n\t\t\t\tconst moveOp: IMoveOperation = {\n\t\t\t\t\ttype: OperationType.moveEntry,\n\t\t\t\t\tentryId: newEntryId,\n\t\t\t\t\tchangedToEntryId: oldEntryId,\n\t\t\t\t};\n\t\t\t\tthis.emitValueChangedEvent(moveOp, true /* isLocal */);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.toggle: {\n\t\t\t\tconst entryId = arrayOp.entryId;\n\t\t\t\tconst liveEntry = this.getLiveEntry(entryId);\n\t\t\t\tconst isDeleted = liveEntry.isDeleted;\n\n\t\t\t\t// Toggling the isDeleted flag to undo the last operation for the skip list payload/value\n\t\t\t\tliveEntry.isDeleted = !isDeleted;\n\t\t\t\tliveEntry.isLocalPendingDelete -= 1;\n\n\t\t\t\tconst toggleOp: IToggleOperation = {\n\t\t\t\t\ttype: OperationType.toggle,\n\t\t\t\t\tentryId,\n\t\t\t\t\tisDeleted: liveEntry.isDeleted,\n\t\t\t\t};\n\t\t\t\tthis.emitValueChangedEvent(toggleOp, true /* isLocal */);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.toggleMove: {\n\t\t\t\tconst { entryId: oldEntryId, changedToEntryId: newEntryId } = arrayOp;\n\t\t\t\tthis.getEntryForId(oldEntryId).isLocalPendingMove -= 1;\n\t\t\t\tthis.updateLiveEntry(oldEntryId, newEntryId);\n\n\t\t\t\tconst toggleMoveOp: IToggleMoveOperation = {\n\t\t\t\t\ttype: OperationType.toggleMove,\n\t\t\t\t\tentryId: newEntryId,\n\t\t\t\t\tchangedToEntryId: oldEntryId,\n\t\t\t\t};\n\t\t\t\tthis.emitValueChangedEvent(toggleMoveOp, true /* isLocal */);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(arrayOp);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Load share array from snapshot\n\t *\n\t * @param storage - the storage to get the snapshot from\n\t * @returns promise that resolved when the load is completed\n\t */\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst header = await storage.readBlob(snapshotFileName);\n\t\t// eslint-disable-next-line unicorn/text-encoding-identifier-case\n\t\tconst utf8 = new TextDecoder(\"utf-8\").decode(header);\n\t\t// Note: IFluidSerializer.parse() doesn't guarantee any typing; the explicit typing here is based on this code's\n\t\t// knowledge of what it is deserializing.\n\t\tconst deserializedSharedArray = this.serializer.parse(utf8) as {\n\t\t\tdataArray: SharedArrayEntry<T>[];\n\t\t};\n\t\tthis.sharedArray = deserializedSharedArray.dataArray;\n\t\t// Initializing the idToEntryMap optimizer data set\n\t\tfor (const entry of this.sharedArray) {\n\t\t\tthis.idToEntryMap.set(entry.entryId, entry);\n\t\t\tthis.unsetLocalFlags(entry);\n\t\t}\n\t}\n\n\t/**\n\t * Callback on disconnect\n\t */\n\tprotected onDisconnect(): void {}\n\n\t/**\n\t * Tracks the doubly linked skip list for the given entry to identify local pending counter attribute.\n\t * It signifies if a local pending operation exists for the payload/value being tracked in the skip list\n\t *\n\t * returns true if counterAttribute's count \\> 0\n\t * @param entryId - id for which counter attribute is to be tracked in chian.\n\t * @param counterAttribute - flag or property name from SharedArrayEntry whose counter is to be tracked.\n\t */\n\tprivate isLocalPending(\n\t\tentryId: string,\n\t\tcounterAttribute: keyof SharedArrayEntry<T>,\n\t): boolean {\n\t\tconst getCounterAttributeValue = (\n\t\t\tentry: SharedArrayEntry<T>,\n\t\t\tcounterAttr: keyof SharedArrayEntry<T>,\n\t\t): number => {\n\t\t\treturn entry[counterAttr] as number;\n\t\t};\n\n\t\tconst inputEntry = this.getEntryForId(entryId);\n\t\tlet prevEntryId = inputEntry.prevEntryId;\n\t\tlet nextEntryId = inputEntry.nextEntryId;\n\t\tif (getCounterAttributeValue(inputEntry, counterAttribute) > 0) {\n\t\t\treturn true;\n\t\t}\n\t\t// track back in chain\n\t\twhile (prevEntryId !== undefined && prevEntryId) {\n\t\t\tconst prevEntry = this.getEntryForId(prevEntryId);\n\t\t\tif (getCounterAttributeValue(prevEntry, counterAttribute)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tprevEntryId = prevEntry.prevEntryId;\n\t\t}\n\n\t\t// track forward in the chain\n\t\twhile (nextEntryId !== undefined && nextEntryId) {\n\t\t\tconst nextEntry = this.getEntryForId(nextEntryId);\n\t\t\tif (getCounterAttributeValue(nextEntry, counterAttribute)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tnextEntryId = nextEntry.nextEntryId;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate getEntryForId(entryId: string): SharedArrayEntry<T> {\n\t\treturn this.idToEntryMap.get(entryId) as SharedArrayEntry<T>;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}\n\t */\n\tprotected processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {\n\t\tconst { envelope, local, messagesContent } = messagesCollection;\n\t\tfor (const messageContent of messagesContent) {\n\t\t\tthis.processMessage(envelope, messageContent, local);\n\t\t}\n\t}\n\n\tprivate processMessage(\n\t\tmessageEnvelope: ISequencedMessageEnvelope,\n\t\tmessageContent: IRuntimeMessagesContent,\n\t\tlocal: boolean,\n\t): void {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison\n\t\tif (messageEnvelope.type === MessageType.Operation) {\n\t\t\tconst op = messageContent.contents as ISharedArrayOperation<T>;\n\t\t\tswitch (op.type) {\n\t\t\t\tcase OperationType.insertEntry: {\n\t\t\t\t\tthis.handleInsertOp<SerializableTypeForSharedArray>(\n\t\t\t\t\t\top.entryId,\n\t\t\t\t\t\top.insertAfterEntryId,\n\t\t\t\t\t\tlocal,\n\t\t\t\t\t\top.value,\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase OperationType.deleteEntry: {\n\t\t\t\t\tthis.handleDeleteOp(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase OperationType.moveEntry: {\n\t\t\t\t\tthis.handleMoveOp(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase OperationType.toggle: {\n\t\t\t\t\tthis.handleToggleOp(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase OperationType.toggleMove: {\n\t\t\t\t\tthis.handleToggleMoveOp(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\tthrow new Error(\"Unknown operation\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!local) {\n\t\t\t\tthis.emitValueChangedEvent(op, local);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleInsertOp<TWrite>(\n\t\tentryId: string,\n\t\tinsertAfterEntryId: string | undefined,\n\t\tlocal: boolean,\n\t\tvalue: Serializable<TWrite> & T,\n\t): void {\n\t\tlet index = 0;\n\t\tif (local) {\n\t\t\tthis.getEntryForId(entryId).isAckPending = false;\n\t\t} else {\n\t\t\tif (insertAfterEntryId !== undefined) {\n\t\t\t\tindex = this.findIndexOfEntryId(insertAfterEntryId) + 1;\n\t\t\t}\n\t\t\tconst newEntry = this.createNewEntry(entryId, value);\n\t\t\tnewEntry.isAckPending = false;\n\t\t\tthis.addEntry(this.getInternalInsertIndexByIgnoringLocalPendingInserts(index), newEntry);\n\t\t}\n\t}\n\n\tprivate handleDeleteOp(op: IDeleteOperation, local: boolean): void {\n\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\tif (local) {\n\t\t\t// Decrementing local pending counter as op is already applied to local state\n\t\t\topEntry.isLocalPendingDelete -= 1;\n\t\t\tthis.remoteDeleteWithLocalPendingDelete.delete(op.entryId);\n\t\t} else {\n\t\t\tif (this.isLocalPending(op.entryId, \"isLocalPendingDelete\")) {\n\t\t\t\tthis.remoteDeleteWithLocalPendingDelete.add(op.entryId);\n\t\t\t} else {\n\t\t\t\t// last element in skip list is the most recent and live entry, so marking it deleted\n\t\t\t\tthis.getLiveEntry(op.entryId).isDeleted = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleMoveOp(op: IMoveOperation, local: boolean): void {\n\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\tthis.handleInsertOp<SerializableTypeForSharedArray>(\n\t\t\top.changedToEntryId,\n\t\t\top.insertAfterEntryId,\n\t\t\tlocal,\n\t\t\topEntry.value,\n\t\t);\n\t\tif (local) {\n\t\t\t// decrement the local pending move op as its already applied to local state\n\t\t\topEntry.isLocalPendingMove -= 1;\n\t\t} else {\n\t\t\tconst newElementEntryId = op.changedToEntryId;\n\t\t\tconst newElement = this.getEntryForId(newElementEntryId);\n\t\t\t// If local pending then simply mark the new location dead as finally the local op will win\n\t\t\tif (\n\t\t\t\tthis.isLocalPending(op.entryId, \"isLocalPendingDelete\") ||\n\t\t\t\tthis.isLocalPending(op.entryId, \"isLocalPendingMove\")\n\t\t\t) {\n\t\t\t\tthis.updateDeadEntry(op.entryId, newElementEntryId);\n\t\t\t} else {\n\t\t\t\t// move the element\n\t\t\t\tconst liveEntry = this.getLiveEntry(op.entryId);\n\t\t\t\tconst isDeleted = liveEntry.isDeleted;\n\t\t\t\tthis.updateLiveEntry(liveEntry.entryId, newElementEntryId);\n\t\t\t\t// mark newly added element as deleted if existing live element was already deleted\n\t\t\t\tif (isDeleted) {\n\t\t\t\t\tnewElement.isDeleted = isDeleted;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleToggleOp(op: IToggleOperation, local: boolean): void {\n\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\tif (local) {\n\t\t\t// decrement the local pending delete op as its already applied to local state\n\t\t\tif (opEntry.isLocalPendingDelete) {\n\t\t\t\topEntry.isLocalPendingDelete -= 1;\n\t\t\t}\n\t\t} else {\n\t\t\tif (!this.isLocalPending(op.entryId, \"isLocalPendingDelete\")) {\n\t\t\t\tthis.getLiveEntry(op.entryId).isDeleted = op.isDeleted;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleToggleMoveOp(op: IToggleMoveOperation, local: boolean): void {\n\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\tif (local) {\n\t\t\t// decrement the local pending move op as its already applied to local state\n\t\t\tif (opEntry.isLocalPendingMove) {\n\t\t\t\topEntry.isLocalPendingMove -= 1;\n\t\t\t}\n\t\t} else if (\n\t\t\t!this.isLocalPending(op.entryId, \"isLocalPendingDelete\") &&\n\t\t\t!this.isLocalPending(op.entryId, \"isLocalPendingMove\") &&\n\t\t\tthis.getLiveEntry(op.entryId).isDeleted === false\n\t\t) {\n\t\t\tthis.updateLiveEntry(this.getLiveEntry(op.entryId).entryId, op.entryId);\n\t\t}\n\t}\n\n\tprivate findInternalIndex(countEntries: number): number {\n\t\tif (countEntries < 0) {\n\t\t\tthrow new Error(\"Input count is zero\");\n\t\t}\n\n\t\tlet countDown = countEntries;\n\t\tlet entriesIterator = 0;\n\t\tfor (; entriesIterator < this.sharedArray.length; entriesIterator = entriesIterator + 1) {\n\t\t\tconst entry = this.sharedArray[entriesIterator];\n\t\t\tassert(entry !== undefined, 0xb93 /* Invalid index */);\n\t\t\tif (entry.isDeleted === false) {\n\t\t\t\tif (countDown === 0) {\n\t\t\t\t\treturn entriesIterator;\n\t\t\t\t}\n\t\t\t\tcountDown = countDown - 1;\n\t\t\t}\n\t\t}\n\t\tthrow new Error(`Count of live entries is less than required`);\n\t}\n\n\tprivate findInternalInsertionIndex(index: number): number {\n\t\treturn index === 0 ? index : this.findInternalIndex(index - 1) + 1;\n\t}\n\n\tprivate findInternalDeletionIndex(index: number): number {\n\t\treturn this.findInternalIndex(index);\n\t}\n\n\tprivate createAddEntry<TWrite>(index: number, value: Serializable<TWrite> & T): string {\n\t\tconst newEntry = this.createNewEntry(uuid(), value);\n\t\tthis.addEntry(index, newEntry);\n\t\treturn newEntry.entryId;\n\t}\n\n\tprivate addEntry(insertIndex: number, newEntry: SharedArrayEntry<T>): void {\n\t\t// in scenario where we populate 100K rows, we insert them all at the end of array.\n\t\t// slicing array is way slower than pushing elements.\n\t\tif (insertIndex === this.sharedArray.length) {\n\t\t\tthis.sharedArray.push(newEntry);\n\t\t} else {\n\t\t\tthis.sharedArray.splice(insertIndex, 0 /* deleteCount */, newEntry);\n\t\t}\n\n\t\t// Updating the idToEntryMap optimizer data set as new entry has been added\n\t\tthis.idToEntryMap.set(newEntry.entryId, newEntry);\n\t}\n\n\tprivate emitValueChangedEvent(op: ISharedArrayOperation, isLocal: boolean): void {\n\t\tthis.emit(\"valueChanged\", op, isLocal, this);\n\t}\n\n\tprivate emitRevertibleEvent(op: ISharedArrayOperation): void {\n\t\tconst revertible = new SharedArrayRevertible(this, op);\n\t\tthis.emit(\"revertible\", revertible);\n\t}\n\n\tprivate deleteCore(index: number): void {\n\t\tconst entry = this.sharedArray[index];\n\t\tassert(entry !== undefined, 0xb94 /* Invalid index */);\n\n\t\tif (entry.isDeleted) {\n\t\t\tthrow new Error(\"Entry already deleted.\");\n\t\t}\n\t\tentry.isDeleted = true;\n\n\t\t// Adding local pending counter\n\t\tentry.isLocalPendingDelete += 1;\n\t}\n\n\tprivate createMoveEntry(oldIndex: number, newIndex: number): string {\n\t\tconst oldEntry = this.sharedArray[oldIndex];\n\t\tassert(oldEntry !== undefined, 0xb95 /* Invalid index */);\n\t\tconst newEntry = this.createNewEntry<SerializableTypeForSharedArray>(\n\t\t\tuuid(),\n\t\t\toldEntry.value,\n\t\t\toldEntry.entryId,\n\t\t);\n\n\t\toldEntry.isDeleted = true;\n\t\toldEntry.nextEntryId = newEntry.entryId;\n\n\t\t// Adding local pending counter\n\t\toldEntry.isLocalPendingMove += 1;\n\n\t\tthis.addEntry(newIndex /* insertIndex */, newEntry);\n\n\t\treturn newEntry.entryId;\n\t}\n\n\t/**\n\t * Creates new entry of type SharedArrayEntry interface.\n\t * @param entryId - id for which new entry is created\n\t * @param value - value for the new entry\n\t * @param prevEntryId - prevEntryId if exists to update the previous pointer of double ended linked list\n\t */\n\tprivate createNewEntry<TWrite>(\n\t\tentryId: string,\n\t\tvalue: Serializable<TWrite> & T,\n\t\tprevEntryId?: string,\n\t): SharedArrayEntry<T> {\n\t\treturn {\n\t\t\tentryId,\n\t\t\tvalue,\n\t\t\tisAckPending: true,\n\t\t\tisDeleted: false,\n\t\t\tprevEntryId,\n\t\t\tnextEntryId: undefined,\n\t\t\tisLocalPendingDelete: 0,\n\t\t\tisLocalPendingMove: 0,\n\t\t};\n\t}\n\n\t/**\n\t * Unsets all local flags used by the DDS. This method can be used after reading from snapshott to ensure\n\t * local flags are initialized for use by the DDS.\n\t * @param entry - Entry for which the local flags have to be cleaned up\n\t */\n\tprivate unsetLocalFlags(entry: SharedArrayEntry<T>): void {\n\t\tentry.isAckPending = false;\n\t\tentry.isLocalPendingDelete = 0;\n\t\tentry.isLocalPendingMove = 0;\n\t}\n\n\t/**\n\t * Returns the index of the first entry starting with startIndex that does not have the isAckPending flag\n\t */\n\tprivate getInternalInsertIndexByIgnoringLocalPendingInserts(startIndex: number): number {\n\t\tlet localOpsIterator = startIndex;\n\t\tfor (\n\t\t\t;\n\t\t\tlocalOpsIterator < this.sharedArray.length;\n\t\t\tlocalOpsIterator = localOpsIterator + 1\n\t\t) {\n\t\t\tconst entry = this.sharedArray[localOpsIterator];\n\t\t\tassert(entry !== undefined, 0xb96 /* Invalid index */);\n\t\t\tif (!entry.isAckPending) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn localOpsIterator;\n\t}\n\n\tprivate findIndexOfEntryId(entryId: string | undefined): number {\n\t\tfor (let index = 0; index < this.sharedArray.length; index = index + 1) {\n\t\t\tif (this.sharedArray[index]?.entryId === entryId) {\n\t\t\t\treturn index;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\tprivate prepareToMakeEntryIdLive(entry: SharedArrayEntry<T>): void {\n\t\tconst prevIndex = this.findIndexOfEntryId(entry.prevEntryId);\n\t\tconst nextIndex = this.findIndexOfEntryId(entry.nextEntryId);\n\t\tif (prevIndex !== -1) {\n\t\t\tconst prevEntry = this.sharedArray[prevIndex];\n\t\t\tassert(prevEntry !== undefined, 0xb97 /* Invalid index */);\n\t\t\tprevEntry.nextEntryId = entry.nextEntryId;\n\t\t}\n\t\tif (nextIndex !== -1) {\n\t\t\tconst nextEntry = this.sharedArray[nextIndex];\n\t\t\tassert(nextEntry !== undefined, 0xb98 /* Invalid index */);\n\t\t\tnextEntry.prevEntryId = entry.prevEntryId;\n\t\t}\n\t\tentry.prevEntryId = undefined;\n\t\tentry.nextEntryId = undefined;\n\t}\n\n\t/**\n\t * Method that returns the live entry.\n\t * The shared array internally can store a skip list of all related entries which got created\n\t * due to move operations for the same payload/value. However, all elements except for one element\n\t * can have isDeleted flag as false indicating this is the live entry for the value.\n\t * Current implementation ensures that the last element in the skip list of entries is the liveEntry/\n\t * last live entry\n\t *\n\t * @param entryId - Entry id of any node in the skip list for the same payload/value\n\t */\n\tprivate getLiveEntry(entryId: string): SharedArrayEntry<T> {\n\t\tlet liveEntry = this.getEntryForId(entryId);\n\t\twhile (liveEntry.nextEntryId !== undefined && liveEntry.nextEntryId) {\n\t\t\tliveEntry = this.getEntryForId(liveEntry.nextEntryId);\n\t\t}\n\t\treturn liveEntry;\n\t}\n\n\t/**\n\t * We track sequence of moves for a entry in the shared array using doubly linked skip list.\n\t * This utility function helps us keep track of the current position of an entry.value by marking the entry\n\t * at previous position deleted and appending the entry at the new position at the end of the double linked\n\t * list for that entry.value.\n\t */\n\tprivate updateLiveEntry(oldLiveEntryEntryId: string, newLiveEntryEntryId: string): void {\n\t\tconst oldLiveEntry = this.getEntryForId(oldLiveEntryEntryId);\n\t\tconst newLiveEntry = this.getEntryForId(newLiveEntryEntryId);\n\t\tif (oldLiveEntryEntryId === newLiveEntryEntryId) {\n\t\t\toldLiveEntry.isDeleted = false;\n\t\t} else {\n\t\t\tthis.prepareToMakeEntryIdLive(newLiveEntry);\n\t\t\t// Make entryId live\n\t\t\toldLiveEntry.nextEntryId = newLiveEntryEntryId;\n\t\t\tnewLiveEntry.prevEntryId = oldLiveEntryEntryId;\n\t\t\tnewLiveEntry.isDeleted = false;\n\t\t\toldLiveEntry.isDeleted = true;\n\t\t}\n\t}\n\n\t/**\n\t * We track sequence of moves for a entry in the shared array using doubly linked skip list.\n\t * This utility function helps to insert the new entry as dead entry and reconnecting the double linked list with\n\t * existingEntry -\\> deadeEntry(appended) -\\> existing chain(if any).\n\t */\n\tprivate updateDeadEntry(existingEntryId: string, deadEntryId: string): void {\n\t\tconst existingEntry = this.getEntryForId(existingEntryId);\n\t\tconst deadEntry = this.getEntryForId(deadEntryId);\n\n\t\t// update dead entry's next to existingEntry's next, if existingEntry's next entry exists.\n\t\t// It can be undefined if the exiting element is the last element (or only element) of chain.\n\t\tif (existingEntry.nextEntryId !== undefined) {\n\t\t\tdeadEntry.nextEntryId = existingEntry.nextEntryId;\n\t\t\tthis.getEntryForId(existingEntry.nextEntryId).prevEntryId = deadEntryId;\n\t\t}\n\n\t\t// update current entry's next pointer to dead entry and vice versa.\n\t\texistingEntry.nextEntryId = deadEntryId;\n\t\tdeadEntry.prevEntryId = existingEntryId;\n\t\tdeadEntry.isDeleted = true;\n\t}\n\n\tprivate handleStashedInsert(\n\t\tentryId: string,\n\t\tinsertAfterEntryId: string | undefined,\n\t\tvalue: Serializable<SerializableTypeForSharedArray> & T,\n\t): void {\n\t\tlet index = 0;\n\t\tif (insertAfterEntryId !== undefined) {\n\t\t\tindex = this.findIndexOfEntryId(insertAfterEntryId) + 1;\n\t\t}\n\t\tconst newEntry = this.createNewEntry<SerializableTypeForSharedArray>(entryId, value);\n\t\tnewEntry.isAckPending = true;\n\t\tthis.addEntry(index, newEntry);\n\t}\n\n\tprotected applyStashedOp(content: unknown): void {\n\t\tconst op = content as ISharedArrayOperation<T>;\n\n\t\tswitch (op.type) {\n\t\t\tcase OperationType.insertEntry: {\n\t\t\t\tthis.handleStashedInsert(\n\t\t\t\t\top.entryId,\n\t\t\t\t\top.insertAfterEntryId,\n\t\t\t\t\top.value as Serializable<SerializableTypeForSharedArray> & T,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.deleteEntry: {\n\t\t\t\tthis.getLiveEntry(op.entryId).isDeleted = true;\n\t\t\t\tthis.getEntryForId(op.entryId).isLocalPendingDelete += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.moveEntry: {\n\t\t\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\t\t\tthis.handleStashedInsert(\n\t\t\t\t\top.changedToEntryId,\n\t\t\t\t\top.insertAfterEntryId,\n\t\t\t\t\topEntry.value as Serializable<SerializableTypeForSharedArray> & T,\n\t\t\t\t);\n\n\t\t\t\tconst newElementEntryId = op.changedToEntryId;\n\t\t\t\tconst newElement = this.getEntryForId(newElementEntryId);\n\t\t\t\tif (\n\t\t\t\t\tthis.isLocalPending(op.entryId, \"isLocalPendingDelete\") ||\n\t\t\t\t\tthis.isLocalPending(op.entryId, \"isLocalPendingMove\")\n\t\t\t\t) {\n\t\t\t\t\tthis.updateDeadEntry(op.entryId, newElementEntryId);\n\t\t\t\t} else {\n\t\t\t\t\t// move the element\n\t\t\t\t\tconst liveEntry = this.getLiveEntry(op.entryId);\n\t\t\t\t\tconst isDeleted = liveEntry.isDeleted;\n\t\t\t\t\tthis.updateLiveEntry(liveEntry.entryId, newElementEntryId);\n\t\t\t\t\t// mark newly added element as deleted if existing live element was already deleted\n\t\t\t\t\tif (isDeleted) {\n\t\t\t\t\t\tnewElement.isDeleted = isDeleted;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\topEntry.isLocalPendingMove += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.toggle: {\n\t\t\t\tthis.getLiveEntry(op.entryId).isDeleted = op.isDeleted;\n\t\t\t\tthis.getEntryForId(op.entryId).isLocalPendingDelete += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.toggleMove: {\n\t\t\t\tthis.updateLiveEntry(this.getLiveEntry(op.entryId).entryId, op.entryId);\n\t\t\t\tthis.getEntryForId(op.entryId).isLocalPendingMove += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(op);\n\t\t\t}\n\t\t}\n\t\tthis.submitLocalMessage(op);\n\t}\n}\n"]}
1
+ {"version":3,"file":"sharedArray.js","sourceRoot":"","sources":["../../src/array/sharedArray.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, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport type {\n\tSerializable,\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelFactory,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport type { ITree } from \"@fluidframework/driver-definitions/internal\";\nimport { FileMode, MessageType, TreeEntry } from \"@fluidframework/driver-definitions/internal\";\nimport type {\n\tISummaryTreeWithStats,\n\tIRuntimeMessageCollection,\n\tIRuntimeMessagesContent,\n\tISequencedMessageEnvelope,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { convertToSummaryTreeWithStats } from \"@fluidframework/runtime-utils/internal\";\nimport type { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport { SharedObject } from \"@fluidframework/shared-object-base/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport type {\n\tISharedArrayEvents,\n\tISharedArray,\n\tISharedArrayRevertible,\n\tSerializableTypeForSharedArray,\n\tSharedArrayEntry,\n\tSnapshotFormat,\n\tSharedArrayEntryCore,\n} from \"./interfaces.js\";\nimport { SharedArrayFactory } from \"./sharedArrayFactory.js\";\nimport type {\n\tISharedArrayOperation,\n\tIDeleteOperation,\n\tIMoveOperation,\n\tIToggleMoveOperation,\n\tIToggleOperation,\n} from \"./sharedArrayOperations.js\";\nimport { OperationType } from \"./sharedArrayOperations.js\";\nimport { SharedArrayRevertible } from \"./sharedArrayRevertible.js\";\n\nconst snapshotFileName = \"header\";\n\n/**\n * Represents a shared array that allows communication between distributed clients.\n *\n * @internal\n */\nexport class SharedArrayClass<T extends SerializableTypeForSharedArray>\n\textends SharedObject<ISharedArrayEvents>\n\timplements ISharedArray<T>, ISharedArrayRevertible\n{\n\t/**\n\t * Stores the data held by this shared array.\n\t */\n\tprivate sharedArray: SharedArrayEntry<T>[];\n\n\t/**\n\t * Stores a map of entryid to entries of the sharedArray. This is meant of search optimizations and\n\t * so shouldn't be snapshotted.\n\t * Note: This map needs to be updated only when the sharedArray is being deserialized and when new entries are\n\t * being added. New entries are added upon insert ops and the second leg of the move op.\n\t * As we don't delete the entries once created, deletion or move to another position needs no special\n\t * handling for this data structure\n\t */\n\tprivate readonly idToEntryMap: Map<string, SharedArrayEntry<T>>;\n\n\t/**\n\t * Set of entry IDs that are marked for deletion by remote clients, but have local pending deletes.\n\t * Used to prevent resuscitating entries while rolling back a delete operation.\n\t * We should not rollback to life an entry that was deleted by remote clients.\n\t */\n\tprivate readonly remoteDeleteWithLocalPendingDelete: Set<string> = new Set<string>();\n\n\t/**\n\t * Create a new shared array\n\t *\n\t * @param runtime - data store runtime the new shared array belongs to\n\t * @param id - optional name of the shared array\n\t * @returns newly create shared array (but not attached yet)\n\t */\n\tpublic static create<T extends SerializableTypeForSharedArray>(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid?: string,\n\t): SharedArrayClass<T> {\n\t\treturn runtime.createChannel(id, SharedArrayFactory.Type) as SharedArrayClass<T>;\n\t}\n\n\t/**\n\t * Get a factory for SharedArray to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedArray\n\t */\n\tpublic static getFactory<T extends SerializableTypeForSharedArray>(): IChannelFactory {\n\t\treturn new SharedArrayFactory<T>();\n\t}\n\n\t/**\n\t * Constructs a new shared array. If the object is non-local an id and service interfaces will\n\t * be provided\n\t *\n\t * @param id - optional name of the shared array\n\t * @param runtime - data store runtime the shared array belongs to\n\t * @param attributes - represents the attributes of a channel/DDS.\n\t */\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(id, runtime, attributes, \"loop_sharedArray_\" /* telemetryContextPrefix */);\n\t\tthis.sharedArray = [];\n\t\tthis.idToEntryMap = new Map<string, SharedArrayEntry<T>>();\n\t}\n\n\t/**\n\t * Method that returns the ordered list of the items held in the DDS at this point in time.\n\t * Note: This is only a snapshot of the array\n\t */\n\tpublic get(): readonly T[] {\n\t\treturn this.sharedArray.filter((item) => !item.isDeleted).map((entry) => entry.value);\n\t}\n\n\tprotected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\t// Deep copy and unset the local flags. Needed when snapshotting is happening for runtime not attached\n\t\tconst dataArrayCopy: SharedArrayEntryCore<T>[] = [];\n\t\tfor (const entry of this.sharedArray) {\n\t\t\tdataArrayCopy.push({\n\t\t\t\tentryId: entry.entryId,\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\tvalue: JSON.parse(serializer.stringify(entry.value, this.handle)),\n\t\t\t\tisDeleted: entry.isDeleted,\n\t\t\t\tprevEntryId: entry.prevEntryId,\n\t\t\t\tnextEntryId: entry.nextEntryId,\n\t\t\t});\n\t\t}\n\n\t\t// We are snapshotting current client data so autoacking pending local.\n\t\t// Assumption : This should happen only for offline client creating the array. All other scenarios should\n\t\t// get to MSN - where there can be no local pending possible.\n\t\tfor (const entry of this.sharedArray) {\n\t\t\tthis.unsetLocalFlags(entry);\n\t\t}\n\t\tconst contents: SnapshotFormat<SharedArrayEntryCore<T>> = {\n\t\t\tdataArray: dataArrayCopy,\n\t\t};\n\t\tconst tree: ITree = {\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tmode: FileMode.File,\n\t\t\t\t\tpath: snapshotFileName,\n\t\t\t\t\ttype: TreeEntry[TreeEntry.Blob],\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\tcontents: serializer.stringify(contents, this.handle),\n\t\t\t\t\t\t// eslint-disable-next-line unicorn/text-encoding-identifier-case\n\t\t\t\t\t\tencoding: \"utf-8\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t\tconst summaryTreeWithStats = convertToSummaryTreeWithStats(tree);\n\n\t\treturn summaryTreeWithStats;\n\t}\n\n\tpublic insertBulkAfter<TWrite>(\n\t\tref: T | undefined,\n\t\tvalues: (Serializable<TWrite> & T)[],\n\t): void {\n\t\tlet itemIndex: number = 0;\n\n\t\tif (ref !== undefined) {\n\t\t\tfor (itemIndex = this.sharedArray.length - 1; itemIndex > 0; itemIndex -= 1) {\n\t\t\t\tconst item = this.sharedArray[itemIndex];\n\t\t\t\tif (item && !item.isDeleted && item.value === ref) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Add one since we're inserting it after this rowId. If rowId is not found, we will get -1, which after\n\t\t\t// adding one, will be 0, which will place the new rows at the right place too\n\t\t\titemIndex += 1;\n\t\t}\n\n\t\t// Insert new elements\n\t\tfor (const value of values) {\n\t\t\tthis.insertCore(itemIndex, value);\n\t\t\titemIndex += 1;\n\t\t}\n\t}\n\n\tpublic insert<TWrite>(index: number, value: Serializable<TWrite> & T): void {\n\t\tif (index < 0) {\n\t\t\tthrow new Error(\"Invalid input: Insertion index provided is less than 0.\");\n\t\t}\n\t\tthis.insertCore(this.findInternalInsertionIndex(index), value);\n\t}\n\n\tprivate insertCore<TWrite>(indexInternal: number, value: Serializable<TWrite> & T): void {\n\t\tconst insertAfterEntryId =\n\t\t\tindexInternal >= 1 ? this.sharedArray[indexInternal - 1]?.entryId : undefined;\n\t\tconst newEntryId = this.createAddEntry(indexInternal, value);\n\n\t\tconst op = {\n\t\t\ttype: OperationType.insertEntry,\n\t\t\tentryId: newEntryId,\n\t\t\tvalue,\n\t\t\tinsertAfterEntryId,\n\t\t};\n\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\tpublic delete(index: number): void {\n\t\tif (index < 0) {\n\t\t\tthrow new Error(\"Invalid input: Deletion index provided is less than 0.\");\n\t\t}\n\n\t\tconst indexInternal: number = this.findInternalDeletionIndex(index);\n\n\t\tconst entry = this.sharedArray[indexInternal];\n\t\tassert(entry !== undefined, 0xb90 /* Invalid index */);\n\t\tconst entryId = entry.entryId;\n\t\tthis.deleteCore(indexInternal);\n\n\t\tconst op: IDeleteOperation = {\n\t\t\ttype: OperationType.deleteEntry,\n\t\t\tentryId,\n\t\t};\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\tpublic rearrangeToFront(values: T[]): void {\n\t\tfor (let toIndex = 0; toIndex < values.length; toIndex += 1) {\n\t\t\tconst value = values[toIndex];\n\t\t\t// Can skip searching first <toIndex> indices, as they contain elements we already moved.\n\t\t\tfor (let fromIndex = toIndex; fromIndex < this.sharedArray.length; fromIndex += 1) {\n\t\t\t\tconst item = this.sharedArray[fromIndex];\n\t\t\t\tassert(item !== undefined, 0xb91 /* Invalid index */);\n\t\t\t\tif (item.value !== value) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\t!item.isDeleted &&\n\t\t\t\t\t// Moving to and from the same index makes no sense, so noOp\n\t\t\t\t\tfromIndex !== toIndex &&\n\t\t\t\t\t// Moving the same entry from current location to its immediate next makes no sense so noOp\n\t\t\t\t\ttoIndex !== fromIndex + 1\n\t\t\t\t) {\n\t\t\t\t\tthis.moveCore(fromIndex, toIndex);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Moves the DDS entry from one index to another\n\t *\n\t * @param fromIndex - User index of the element to be moved\n\t * @param toIndex - User index to which the element should move to\n\t */\n\tpublic move(fromIndex: number, toIndex: number): void {\n\t\tif (fromIndex < 0) {\n\t\t\tthrow new Error(\"Invalid input: fromIndex value provided is less than 0\");\n\t\t}\n\n\t\tif (toIndex < 0) {\n\t\t\tthrow new Error(\"Invalid input: toIndex value provided is less than 0\");\n\t\t}\n\n\t\tif (\n\t\t\t// Moving to and from the same index makes no sense, so noOp\n\t\t\tfromIndex === toIndex ||\n\t\t\t// Moving the same entry from current location to its immediate next makes no sense so noOp\n\t\t\ttoIndex === fromIndex + 1\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tconst fromIndexInternal: number = this.findInternalDeletionIndex(fromIndex);\n\t\tconst toIndexInternal: number = this.findInternalInsertionIndex(toIndex);\n\n\t\tthis.moveCore(fromIndexInternal, toIndexInternal);\n\t}\n\n\tprivate moveCore(fromIndexInternal: number, toIndexInternal: number): void {\n\t\tconst insertAfterEntryId =\n\t\t\ttoIndexInternal >= 1 ? this.sharedArray[toIndexInternal - 1]?.entryId : undefined;\n\t\tconst entryId = this.sharedArray[fromIndexInternal]?.entryId;\n\t\tassert(entryId !== undefined, 0xb92 /* Invalid index */);\n\t\tconst changedToEntryId = this.createMoveEntry(fromIndexInternal, toIndexInternal);\n\n\t\tconst op: IMoveOperation = {\n\t\t\ttype: OperationType.moveEntry,\n\t\t\tentryId,\n\t\t\tinsertAfterEntryId,\n\t\t\tchangedToEntryId,\n\t\t};\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\t/**\n\t * Method used to do undo/redo operation for the given entry id. This method is\n\t * used for undo/redo of only insert and delete operations. Move operation is NOT handled\n\t * by this method\n\t *\n\t * @param entryId - Entry Id for which the the undo/redo operation is to be applied\n\t */\n\tpublic toggle(entryId: string): void {\n\t\tconst liveEntry = this.getLiveEntry(entryId);\n\t\tif (liveEntry?.isRollback === true) {\n\t\t\treturn;\n\t\t}\n\t\tconst isDeleted = !liveEntry.isDeleted;\n\n\t\t// Adding local pending counter\n\t\tthis.getEntryForId(entryId).isLocalPendingDelete += 1;\n\n\t\t// Toggling the isDeleted flag to undo the last operation for the skip list payload/value\n\t\tliveEntry.isDeleted = isDeleted;\n\n\t\tconst op: IToggleOperation = {\n\t\t\ttype: OperationType.toggle,\n\t\t\tentryId,\n\t\t\tisDeleted,\n\t\t};\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\t/**\n\t * Method to do undo/redo of move operation. All entries of the same payload/value are stored\n\t * in the same doubly linked skip list. This skip list is updated upon every move by adding the\n\t * new location as a new entry in the skip list and update the isDeleted flag to indicate the new\n\t * entry is the cuurent live location for the user.\n\t *\n\t * @param oldEntryId - EntryId of the last live entry\n\t * @param newEntryId - EntryId of the to be live entry\n\t */\n\tpublic toggleMove(oldEntryId: string, newEntryId: string): void {\n\t\tconst liveEntry = this.getLiveEntry(newEntryId);\n\t\tif (liveEntry?.isRollback === true) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.getEntryForId(newEntryId).isDeleted) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Adding local pending counter\n\t\tthis.getEntryForId(oldEntryId).isLocalPendingMove += 1;\n\n\t\tthis.updateLiveEntry(newEntryId, oldEntryId);\n\n\t\tconst op: IToggleMoveOperation = {\n\t\t\ttype: OperationType.toggleMove,\n\t\t\tentryId: oldEntryId,\n\t\t\tchangedToEntryId: newEntryId,\n\t\t};\n\t\tthis.emitValueChangedEvent(op, true /* isLocal */);\n\t\tthis.emitRevertibleEvent(op);\n\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\tpublic rollback(op: unknown, _localOpMetadata: unknown): void {\n\t\tconst arrayOp = op as ISharedArrayOperation<T>;\n\t\tswitch (arrayOp.type) {\n\t\t\tcase OperationType.insertEntry: {\n\t\t\t\tconst liveEntry = this.getLiveEntry(arrayOp.entryId);\n\t\t\t\tliveEntry.isDeleted = true;\n\t\t\t\tliveEntry.isRollback = true;\n\t\t\t\tconst deleteOp: IDeleteOperation = {\n\t\t\t\t\ttype: OperationType.deleteEntry,\n\t\t\t\t\tentryId: arrayOp.entryId,\n\t\t\t\t};\n\t\t\t\tthis.emitValueChangedEvent(deleteOp, true /* isLocal */);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.deleteEntry: {\n\t\t\t\tif (this.remoteDeleteWithLocalPendingDelete.has(arrayOp.entryId)) {\n\t\t\t\t\t// If remote already deleted the entry, we should not resurrect it.\n\t\t\t\t\t// Just remove the local pending delete.\n\t\t\t\t\tthis.remoteDeleteWithLocalPendingDelete.delete(arrayOp.entryId);\n\t\t\t\t} else {\n\t\t\t\t\tconst liveEntry = this.getLiveEntry(arrayOp.entryId);\n\t\t\t\t\tliveEntry.isDeleted = false;\n\t\t\t\t\tliveEntry.isRollback = true;\n\t\t\t\t\tconst insertOp = {\n\t\t\t\t\t\ttype: OperationType.insertEntry,\n\t\t\t\t\t\tentryId: arrayOp.entryId,\n\t\t\t\t\t\tvalue: liveEntry.value,\n\t\t\t\t\t};\n\t\t\t\t\tthis.emitValueChangedEvent(insertOp, true /* isLocal */);\n\t\t\t\t\tconst entry = this.getEntryForId(arrayOp.entryId);\n\t\t\t\t\tif (entry !== undefined && entry.isLocalPendingDelete > 0) {\n\t\t\t\t\t\tentry.isLocalPendingDelete -= 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.moveEntry: {\n\t\t\t\tconst { entryId: oldEntryId, changedToEntryId: newEntryId } = arrayOp;\n\t\t\t\tif (this.getEntryForId(newEntryId).isDeleted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.getEntryForId(oldEntryId).isRollback = true;\n\t\t\t\tthis.updateLiveEntry(newEntryId, oldEntryId);\n\t\t\t\tconst inputEntry = this.getEntryForId(oldEntryId);\n\t\t\t\tinputEntry.prevEntryId = undefined;\n\t\t\t\tinputEntry.nextEntryId = undefined;\n\t\t\t\tinputEntry.isLocalPendingMove = 0;\n\t\t\t\tconst moveOp: IMoveOperation = {\n\t\t\t\t\ttype: OperationType.moveEntry,\n\t\t\t\t\tentryId: newEntryId,\n\t\t\t\t\tchangedToEntryId: oldEntryId,\n\t\t\t\t};\n\t\t\t\tthis.emitValueChangedEvent(moveOp, true /* isLocal */);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.toggle: {\n\t\t\t\tconst entryId = arrayOp.entryId;\n\t\t\t\tconst liveEntry = this.getLiveEntry(entryId);\n\t\t\t\tconst isDeleted = liveEntry.isDeleted;\n\n\t\t\t\t// Toggling the isDeleted flag to undo the last operation for the skip list payload/value\n\t\t\t\tliveEntry.isDeleted = !isDeleted;\n\t\t\t\tliveEntry.isLocalPendingDelete -= 1;\n\t\t\t\tliveEntry.isRollback = true;\n\n\t\t\t\tconst toggleOp: IToggleOperation = {\n\t\t\t\t\ttype: OperationType.toggle,\n\t\t\t\t\tentryId,\n\t\t\t\t\tisDeleted: liveEntry.isDeleted,\n\t\t\t\t};\n\t\t\t\tthis.emitValueChangedEvent(toggleOp, true /* isLocal */);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.toggleMove: {\n\t\t\t\tconst { entryId: oldEntryId, changedToEntryId: newEntryId } = arrayOp;\n\t\t\t\tthis.getEntryForId(oldEntryId).isLocalPendingMove -= 1;\n\t\t\t\tthis.getEntryForId(newEntryId).isRollback = true;\n\t\t\t\tthis.updateLiveEntry(oldEntryId, newEntryId);\n\n\t\t\t\tconst toggleMoveOp: IToggleMoveOperation = {\n\t\t\t\t\ttype: OperationType.toggleMove,\n\t\t\t\t\tentryId: newEntryId,\n\t\t\t\t\tchangedToEntryId: oldEntryId,\n\t\t\t\t};\n\t\t\t\tthis.emitValueChangedEvent(toggleMoveOp, true /* isLocal */);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(arrayOp);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Load share array from snapshot\n\t *\n\t * @param storage - the storage to get the snapshot from\n\t * @returns promise that resolved when the load is completed\n\t */\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst header = await storage.readBlob(snapshotFileName);\n\t\t// eslint-disable-next-line unicorn/text-encoding-identifier-case\n\t\tconst utf8 = new TextDecoder(\"utf-8\").decode(header);\n\t\t// Note: IFluidSerializer.parse() doesn't guarantee any typing; the explicit typing here is based on this code's\n\t\t// knowledge of what it is deserializing.\n\t\tconst deserializedSharedArray = this.serializer.parse(utf8) as {\n\t\t\tdataArray: SharedArrayEntry<T>[];\n\t\t};\n\t\tthis.sharedArray = deserializedSharedArray.dataArray;\n\t\t// Initializing the idToEntryMap optimizer data set\n\t\tfor (const entry of this.sharedArray) {\n\t\t\tthis.idToEntryMap.set(entry.entryId, entry);\n\t\t\tthis.unsetLocalFlags(entry);\n\t\t}\n\t}\n\n\t/**\n\t * Callback on disconnect\n\t */\n\tprotected onDisconnect(): void {}\n\n\t/**\n\t * Tracks the doubly linked skip list for the given entry to identify local pending counter attribute.\n\t * It signifies if a local pending operation exists for the payload/value being tracked in the skip list\n\t *\n\t * returns true if counterAttribute's count \\> 0\n\t * @param entryId - id for which counter attribute is to be tracked in chian.\n\t * @param counterAttribute - flag or property name from SharedArrayEntry whose counter is to be tracked.\n\t */\n\tprivate isLocalPending(\n\t\tentryId: string,\n\t\tcounterAttribute: keyof SharedArrayEntry<T>,\n\t): boolean {\n\t\tconst getCounterAttributeValue = (\n\t\t\tentry: SharedArrayEntry<T>,\n\t\t\tcounterAttr: keyof SharedArrayEntry<T>,\n\t\t): number => {\n\t\t\treturn entry[counterAttr] as number;\n\t\t};\n\n\t\tconst inputEntry = this.getEntryForId(entryId);\n\t\tlet prevEntryId = inputEntry.prevEntryId;\n\t\tlet nextEntryId = inputEntry.nextEntryId;\n\t\tif (getCounterAttributeValue(inputEntry, counterAttribute) > 0) {\n\t\t\treturn true;\n\t\t}\n\t\t// track back in chain\n\t\twhile (prevEntryId !== undefined && prevEntryId) {\n\t\t\tconst prevEntry = this.getEntryForId(prevEntryId);\n\t\t\tif (getCounterAttributeValue(prevEntry, counterAttribute)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tprevEntryId = prevEntry.prevEntryId;\n\t\t}\n\n\t\t// track forward in the chain\n\t\twhile (nextEntryId !== undefined && nextEntryId) {\n\t\t\tconst nextEntry = this.getEntryForId(nextEntryId);\n\t\t\tif (getCounterAttributeValue(nextEntry, counterAttribute)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tnextEntryId = nextEntry.nextEntryId;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate getEntryForId(entryId: string): SharedArrayEntry<T> {\n\t\treturn this.idToEntryMap.get(entryId) as SharedArrayEntry<T>;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}\n\t */\n\tprotected processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {\n\t\tconst { envelope, local, messagesContent } = messagesCollection;\n\t\tfor (const messageContent of messagesContent) {\n\t\t\tthis.processMessage(envelope, messageContent, local);\n\t\t}\n\t}\n\n\tprivate processMessage(\n\t\tmessageEnvelope: ISequencedMessageEnvelope,\n\t\tmessageContent: IRuntimeMessagesContent,\n\t\tlocal: boolean,\n\t): void {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison\n\t\tif (messageEnvelope.type === MessageType.Operation) {\n\t\t\tconst op = messageContent.contents as ISharedArrayOperation<T>;\n\t\t\tswitch (op.type) {\n\t\t\t\tcase OperationType.insertEntry: {\n\t\t\t\t\tthis.handleInsertOp<SerializableTypeForSharedArray>(\n\t\t\t\t\t\top.entryId,\n\t\t\t\t\t\top.insertAfterEntryId,\n\t\t\t\t\t\tlocal,\n\t\t\t\t\t\top.value,\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase OperationType.deleteEntry: {\n\t\t\t\t\tthis.handleDeleteOp(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase OperationType.moveEntry: {\n\t\t\t\t\tthis.handleMoveOp(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase OperationType.toggle: {\n\t\t\t\t\tthis.handleToggleOp(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase OperationType.toggleMove: {\n\t\t\t\t\tthis.handleToggleMoveOp(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\tthrow new Error(\"Unknown operation\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!local) {\n\t\t\t\tthis.emitValueChangedEvent(op, local);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleInsertOp<TWrite>(\n\t\tentryId: string,\n\t\tinsertAfterEntryId: string | undefined,\n\t\tlocal: boolean,\n\t\tvalue: Serializable<TWrite> & T,\n\t): void {\n\t\tlet index = 0;\n\t\tif (local) {\n\t\t\tthis.getEntryForId(entryId).isAckPending = false;\n\t\t} else {\n\t\t\tif (insertAfterEntryId !== undefined) {\n\t\t\t\tindex = this.findIndexOfEntryId(insertAfterEntryId) + 1;\n\t\t\t}\n\t\t\tconst newEntry = this.createNewEntry(entryId, value);\n\t\t\tnewEntry.isAckPending = false;\n\t\t\tthis.addEntry(this.getInternalInsertIndexByIgnoringLocalPendingInserts(index), newEntry);\n\t\t}\n\t}\n\n\tprivate handleDeleteOp(op: IDeleteOperation, local: boolean): void {\n\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\tif (local) {\n\t\t\t// Decrementing local pending counter as op is already applied to local state\n\t\t\topEntry.isLocalPendingDelete -= 1;\n\t\t\tthis.remoteDeleteWithLocalPendingDelete.delete(op.entryId);\n\t\t} else {\n\t\t\tif (this.isLocalPending(op.entryId, \"isLocalPendingDelete\")) {\n\t\t\t\tthis.remoteDeleteWithLocalPendingDelete.add(op.entryId);\n\t\t\t} else {\n\t\t\t\t// last element in skip list is the most recent and live entry, so marking it deleted\n\t\t\t\tthis.getLiveEntry(op.entryId).isDeleted = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleMoveOp(op: IMoveOperation, local: boolean): void {\n\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\tthis.handleInsertOp<SerializableTypeForSharedArray>(\n\t\t\top.changedToEntryId,\n\t\t\top.insertAfterEntryId,\n\t\t\tlocal,\n\t\t\topEntry.value,\n\t\t);\n\t\tif (local) {\n\t\t\t// decrement the local pending move op as its already applied to local state\n\t\t\topEntry.isLocalPendingMove -= 1;\n\t\t} else {\n\t\t\tconst newElementEntryId = op.changedToEntryId;\n\t\t\tconst newElement = this.getEntryForId(newElementEntryId);\n\t\t\t// If local pending then simply mark the new location dead as finally the local op will win\n\t\t\tif (\n\t\t\t\tthis.isLocalPending(op.entryId, \"isLocalPendingDelete\") ||\n\t\t\t\tthis.isLocalPending(op.entryId, \"isLocalPendingMove\")\n\t\t\t) {\n\t\t\t\tthis.updateDeadEntry(op.entryId, newElementEntryId);\n\t\t\t} else {\n\t\t\t\t// move the element\n\t\t\t\tconst liveEntry = this.getLiveEntry(op.entryId);\n\t\t\t\tconst isDeleted = liveEntry.isDeleted;\n\t\t\t\tthis.updateLiveEntry(liveEntry.entryId, newElementEntryId);\n\t\t\t\t// mark newly added element as deleted if existing live element was already deleted\n\t\t\t\tif (isDeleted) {\n\t\t\t\t\tnewElement.isDeleted = isDeleted;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleToggleOp(op: IToggleOperation, local: boolean): void {\n\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\tif (local) {\n\t\t\t// decrement the local pending delete op as its already applied to local state\n\t\t\tif (opEntry.isLocalPendingDelete) {\n\t\t\t\topEntry.isLocalPendingDelete -= 1;\n\t\t\t}\n\t\t} else {\n\t\t\tif (!this.isLocalPending(op.entryId, \"isLocalPendingDelete\")) {\n\t\t\t\tthis.getLiveEntry(op.entryId).isDeleted = op.isDeleted;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleToggleMoveOp(op: IToggleMoveOperation, local: boolean): void {\n\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\tif (local) {\n\t\t\t// decrement the local pending move op as its already applied to local state\n\t\t\tif (opEntry.isLocalPendingMove) {\n\t\t\t\topEntry.isLocalPendingMove -= 1;\n\t\t\t}\n\t\t} else if (\n\t\t\t!this.isLocalPending(op.entryId, \"isLocalPendingDelete\") &&\n\t\t\t!this.isLocalPending(op.entryId, \"isLocalPendingMove\") &&\n\t\t\tthis.getLiveEntry(op.entryId).isDeleted === false\n\t\t) {\n\t\t\tthis.updateLiveEntry(this.getLiveEntry(op.entryId).entryId, op.entryId);\n\t\t}\n\t}\n\n\tprivate findInternalIndex(countEntries: number): number {\n\t\tif (countEntries < 0) {\n\t\t\tthrow new Error(\"Input count is zero\");\n\t\t}\n\n\t\tlet countDown = countEntries;\n\t\tlet entriesIterator = 0;\n\t\tfor (; entriesIterator < this.sharedArray.length; entriesIterator = entriesIterator + 1) {\n\t\t\tconst entry = this.sharedArray[entriesIterator];\n\t\t\tassert(entry !== undefined, 0xb93 /* Invalid index */);\n\t\t\tif (entry.isDeleted === false) {\n\t\t\t\tif (countDown === 0) {\n\t\t\t\t\treturn entriesIterator;\n\t\t\t\t}\n\t\t\t\tcountDown = countDown - 1;\n\t\t\t}\n\t\t}\n\t\tthrow new Error(`Count of live entries is less than required`);\n\t}\n\n\tprivate findInternalInsertionIndex(index: number): number {\n\t\treturn index === 0 ? index : this.findInternalIndex(index - 1) + 1;\n\t}\n\n\tprivate findInternalDeletionIndex(index: number): number {\n\t\treturn this.findInternalIndex(index);\n\t}\n\n\tprivate createAddEntry<TWrite>(index: number, value: Serializable<TWrite> & T): string {\n\t\tconst newEntry = this.createNewEntry(uuid(), value);\n\t\tthis.addEntry(index, newEntry);\n\t\treturn newEntry.entryId;\n\t}\n\n\tprivate addEntry(insertIndex: number, newEntry: SharedArrayEntry<T>): void {\n\t\t// in scenario where we populate 100K rows, we insert them all at the end of array.\n\t\t// slicing array is way slower than pushing elements.\n\t\tif (insertIndex === this.sharedArray.length) {\n\t\t\tthis.sharedArray.push(newEntry);\n\t\t} else {\n\t\t\tthis.sharedArray.splice(insertIndex, 0 /* deleteCount */, newEntry);\n\t\t}\n\n\t\t// Updating the idToEntryMap optimizer data set as new entry has been added\n\t\tthis.idToEntryMap.set(newEntry.entryId, newEntry);\n\t}\n\n\tprivate emitValueChangedEvent(op: ISharedArrayOperation, isLocal: boolean): void {\n\t\tthis.emit(\"valueChanged\", op, isLocal, this);\n\t}\n\n\tprivate emitRevertibleEvent(op: ISharedArrayOperation): void {\n\t\tconst revertible = new SharedArrayRevertible(this, op);\n\t\tthis.emit(\"revertible\", revertible);\n\t}\n\n\tprivate deleteCore(index: number): void {\n\t\tconst entry = this.sharedArray[index];\n\t\tassert(entry !== undefined, 0xb94 /* Invalid index */);\n\n\t\tif (entry.isDeleted) {\n\t\t\tthrow new Error(\"Entry already deleted.\");\n\t\t}\n\t\tentry.isDeleted = true;\n\n\t\t// Adding local pending counter\n\t\tentry.isLocalPendingDelete += 1;\n\t}\n\n\tprivate createMoveEntry(oldIndex: number, newIndex: number): string {\n\t\tconst oldEntry = this.sharedArray[oldIndex];\n\t\tassert(oldEntry !== undefined, 0xb95 /* Invalid index */);\n\t\tconst newEntry = this.createNewEntry<SerializableTypeForSharedArray>(\n\t\t\tuuid(),\n\t\t\toldEntry.value,\n\t\t\toldEntry.entryId,\n\t\t);\n\n\t\toldEntry.isDeleted = true;\n\t\toldEntry.nextEntryId = newEntry.entryId;\n\n\t\t// Adding local pending counter\n\t\toldEntry.isLocalPendingMove += 1;\n\n\t\tthis.addEntry(newIndex /* insertIndex */, newEntry);\n\n\t\treturn newEntry.entryId;\n\t}\n\n\t/**\n\t * Creates new entry of type SharedArrayEntry interface.\n\t * @param entryId - id for which new entry is created\n\t * @param value - value for the new entry\n\t * @param prevEntryId - prevEntryId if exists to update the previous pointer of double ended linked list\n\t */\n\tprivate createNewEntry<TWrite>(\n\t\tentryId: string,\n\t\tvalue: Serializable<TWrite> & T,\n\t\tprevEntryId?: string,\n\t): SharedArrayEntry<T> {\n\t\treturn {\n\t\t\tentryId,\n\t\t\tvalue,\n\t\t\tisAckPending: true,\n\t\t\tisDeleted: false,\n\t\t\tprevEntryId,\n\t\t\tnextEntryId: undefined,\n\t\t\tisLocalPendingDelete: 0,\n\t\t\tisLocalPendingMove: 0,\n\t\t};\n\t}\n\n\t/**\n\t * Unsets all local flags used by the DDS. This method can be used after reading from snapshott to ensure\n\t * local flags are initialized for use by the DDS.\n\t * @param entry - Entry for which the local flags have to be cleaned up\n\t */\n\tprivate unsetLocalFlags(entry: SharedArrayEntry<T>): void {\n\t\tentry.isAckPending = false;\n\t\tentry.isLocalPendingDelete = 0;\n\t\tentry.isLocalPendingMove = 0;\n\t}\n\n\t/**\n\t * Returns the index of the first entry starting with startIndex that does not have the isAckPending flag\n\t */\n\tprivate getInternalInsertIndexByIgnoringLocalPendingInserts(startIndex: number): number {\n\t\tlet localOpsIterator = startIndex;\n\t\tfor (\n\t\t\t;\n\t\t\tlocalOpsIterator < this.sharedArray.length;\n\t\t\tlocalOpsIterator = localOpsIterator + 1\n\t\t) {\n\t\t\tconst entry = this.sharedArray[localOpsIterator];\n\t\t\tassert(entry !== undefined, 0xb96 /* Invalid index */);\n\t\t\tif (!entry.isAckPending) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn localOpsIterator;\n\t}\n\n\tprivate findIndexOfEntryId(entryId: string | undefined): number {\n\t\tfor (let index = 0; index < this.sharedArray.length; index = index + 1) {\n\t\t\tif (this.sharedArray[index]?.entryId === entryId) {\n\t\t\t\treturn index;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\tprivate prepareToMakeEntryIdLive(entry: SharedArrayEntry<T>): void {\n\t\tconst prevIndex = this.findIndexOfEntryId(entry.prevEntryId);\n\t\tconst nextIndex = this.findIndexOfEntryId(entry.nextEntryId);\n\t\tif (prevIndex !== -1) {\n\t\t\tconst prevEntry = this.sharedArray[prevIndex];\n\t\t\tassert(prevEntry !== undefined, 0xb97 /* Invalid index */);\n\t\t\tprevEntry.nextEntryId = entry.nextEntryId;\n\t\t}\n\t\tif (nextIndex !== -1) {\n\t\t\tconst nextEntry = this.sharedArray[nextIndex];\n\t\t\tassert(nextEntry !== undefined, 0xb98 /* Invalid index */);\n\t\t\tnextEntry.prevEntryId = entry.prevEntryId;\n\t\t}\n\t\tentry.prevEntryId = undefined;\n\t\tentry.nextEntryId = undefined;\n\t}\n\n\t/**\n\t * Method that returns the live entry.\n\t * The shared array internally can store a skip list of all related entries which got created\n\t * due to move operations for the same payload/value. However, all elements except for one element\n\t * can have isDeleted flag as false indicating this is the live entry for the value.\n\t * Current implementation ensures that the last element in the skip list of entries is the liveEntry/\n\t * last live entry\n\t *\n\t * @param entryId - Entry id of any node in the skip list for the same payload/value\n\t */\n\tprivate getLiveEntry(entryId: string): SharedArrayEntry<T> {\n\t\tlet liveEntry = this.getEntryForId(entryId);\n\t\twhile (liveEntry.nextEntryId !== undefined && liveEntry.nextEntryId) {\n\t\t\tliveEntry = this.getEntryForId(liveEntry.nextEntryId);\n\t\t}\n\t\treturn liveEntry;\n\t}\n\n\t/**\n\t * We track sequence of moves for a entry in the shared array using doubly linked skip list.\n\t * This utility function helps us keep track of the current position of an entry.value by marking the entry\n\t * at previous position deleted and appending the entry at the new position at the end of the double linked\n\t * list for that entry.value.\n\t */\n\tprivate updateLiveEntry(oldLiveEntryEntryId: string, newLiveEntryEntryId: string): void {\n\t\tconst oldLiveEntry = this.getEntryForId(oldLiveEntryEntryId);\n\t\tconst newLiveEntry = this.getEntryForId(newLiveEntryEntryId);\n\t\tif (oldLiveEntryEntryId === newLiveEntryEntryId) {\n\t\t\toldLiveEntry.isDeleted = false;\n\t\t} else {\n\t\t\tthis.prepareToMakeEntryIdLive(newLiveEntry);\n\t\t\t// Make entryId live\n\t\t\toldLiveEntry.nextEntryId = newLiveEntryEntryId;\n\t\t\tnewLiveEntry.prevEntryId = oldLiveEntryEntryId;\n\t\t\tnewLiveEntry.isDeleted = false;\n\t\t\toldLiveEntry.isDeleted = true;\n\t\t}\n\t}\n\n\t/**\n\t * We track sequence of moves for a entry in the shared array using doubly linked skip list.\n\t * This utility function helps to insert the new entry as dead entry and reconnecting the double linked list with\n\t * existingEntry -\\> deadeEntry(appended) -\\> existing chain(if any).\n\t */\n\tprivate updateDeadEntry(existingEntryId: string, deadEntryId: string): void {\n\t\tconst existingEntry = this.getEntryForId(existingEntryId);\n\t\tconst deadEntry = this.getEntryForId(deadEntryId);\n\n\t\t// update dead entry's next to existingEntry's next, if existingEntry's next entry exists.\n\t\t// It can be undefined if the exiting element is the last element (or only element) of chain.\n\t\tif (existingEntry.nextEntryId !== undefined) {\n\t\t\tdeadEntry.nextEntryId = existingEntry.nextEntryId;\n\t\t\tthis.getEntryForId(existingEntry.nextEntryId).prevEntryId = deadEntryId;\n\t\t}\n\n\t\t// update current entry's next pointer to dead entry and vice versa.\n\t\texistingEntry.nextEntryId = deadEntryId;\n\t\tdeadEntry.prevEntryId = existingEntryId;\n\t\tdeadEntry.isDeleted = true;\n\t}\n\n\tprivate handleStashedInsert(\n\t\tentryId: string,\n\t\tinsertAfterEntryId: string | undefined,\n\t\tvalue: Serializable<SerializableTypeForSharedArray> & T,\n\t): void {\n\t\tlet index = 0;\n\t\tif (insertAfterEntryId !== undefined) {\n\t\t\tindex = this.findIndexOfEntryId(insertAfterEntryId) + 1;\n\t\t}\n\t\tconst newEntry = this.createNewEntry<SerializableTypeForSharedArray>(entryId, value);\n\t\tnewEntry.isAckPending = true;\n\t\tthis.addEntry(index, newEntry);\n\t}\n\n\tprotected applyStashedOp(content: unknown): void {\n\t\tconst op = content as ISharedArrayOperation<T>;\n\n\t\tswitch (op.type) {\n\t\t\tcase OperationType.insertEntry: {\n\t\t\t\tthis.handleStashedInsert(\n\t\t\t\t\top.entryId,\n\t\t\t\t\top.insertAfterEntryId,\n\t\t\t\t\top.value as Serializable<SerializableTypeForSharedArray> & T,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.deleteEntry: {\n\t\t\t\tthis.getLiveEntry(op.entryId).isDeleted = true;\n\t\t\t\tthis.getEntryForId(op.entryId).isLocalPendingDelete += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.moveEntry: {\n\t\t\t\tconst opEntry = this.getEntryForId(op.entryId);\n\t\t\t\tthis.handleStashedInsert(\n\t\t\t\t\top.changedToEntryId,\n\t\t\t\t\top.insertAfterEntryId,\n\t\t\t\t\topEntry.value as Serializable<SerializableTypeForSharedArray> & T,\n\t\t\t\t);\n\n\t\t\t\tconst newElementEntryId = op.changedToEntryId;\n\t\t\t\tconst newElement = this.getEntryForId(newElementEntryId);\n\t\t\t\tif (\n\t\t\t\t\tthis.isLocalPending(op.entryId, \"isLocalPendingDelete\") ||\n\t\t\t\t\tthis.isLocalPending(op.entryId, \"isLocalPendingMove\")\n\t\t\t\t) {\n\t\t\t\t\tthis.updateDeadEntry(op.entryId, newElementEntryId);\n\t\t\t\t} else {\n\t\t\t\t\t// move the element\n\t\t\t\t\tconst liveEntry = this.getLiveEntry(op.entryId);\n\t\t\t\t\tconst isDeleted = liveEntry.isDeleted;\n\t\t\t\t\tthis.updateLiveEntry(liveEntry.entryId, newElementEntryId);\n\t\t\t\t\t// mark newly added element as deleted if existing live element was already deleted\n\t\t\t\t\tif (isDeleted) {\n\t\t\t\t\t\tnewElement.isDeleted = isDeleted;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\topEntry.isLocalPendingMove += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.toggle: {\n\t\t\t\tthis.getLiveEntry(op.entryId).isDeleted = op.isDeleted;\n\t\t\t\tthis.getEntryForId(op.entryId).isLocalPendingDelete += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase OperationType.toggleMove: {\n\t\t\t\tthis.updateLiveEntry(this.getLiveEntry(op.entryId).entryId, op.entryId);\n\t\t\t\tthis.getEntryForId(op.entryId).isLocalPendingMove += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(op);\n\t\t\t}\n\t\t}\n\t\tthis.submitLocalMessage(op);\n\t}\n}\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/legacy-dds";
8
- export declare const pkgVersion = "2.74.0-365691";
8
+ export declare const pkgVersion = "2.74.0-370705";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export const pkgName = "@fluidframework/legacy-dds";
8
- export const pkgVersion = "2.74.0-365691";
8
+ export const pkgVersion = "2.74.0-370705";
9
9
  //# sourceMappingURL=packageVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,4BAA4B,CAAC;AACpD,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,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/legacy-dds\";\nexport const pkgVersion = \"2.74.0-365691\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,4BAA4B,CAAC;AACpD,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,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/legacy-dds\";\nexport const pkgVersion = \"2.74.0-370705\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/legacy-dds",
3
- "version": "2.74.0-365691",
3
+ "version": "2.74.0-370705",
4
4
  "description": "Legacy DDSs for the Fluid Framework. These are not intended for use in new code.",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -81,29 +81,29 @@
81
81
  "temp-directory": "nyc/.nyc_output"
82
82
  },
83
83
  "dependencies": {
84
- "@fluid-internal/client-utils": "2.74.0-365691",
85
- "@fluidframework/core-interfaces": "2.74.0-365691",
86
- "@fluidframework/core-utils": "2.74.0-365691",
87
- "@fluidframework/datastore-definitions": "2.74.0-365691",
88
- "@fluidframework/driver-definitions": "2.74.0-365691",
89
- "@fluidframework/driver-utils": "2.74.0-365691",
90
- "@fluidframework/runtime-definitions": "2.74.0-365691",
91
- "@fluidframework/runtime-utils": "2.74.0-365691",
92
- "@fluidframework/shared-object-base": "2.74.0-365691",
84
+ "@fluid-internal/client-utils": "2.74.0-370705",
85
+ "@fluidframework/core-interfaces": "2.74.0-370705",
86
+ "@fluidframework/core-utils": "2.74.0-370705",
87
+ "@fluidframework/datastore-definitions": "2.74.0-370705",
88
+ "@fluidframework/driver-definitions": "2.74.0-370705",
89
+ "@fluidframework/driver-utils": "2.74.0-370705",
90
+ "@fluidframework/runtime-definitions": "2.74.0-370705",
91
+ "@fluidframework/runtime-utils": "2.74.0-370705",
92
+ "@fluidframework/shared-object-base": "2.74.0-370705",
93
93
  "uuid": "^11.1.0"
94
94
  },
95
95
  "devDependencies": {
96
96
  "@arethetypeswrong/cli": "^0.17.1",
97
97
  "@biomejs/biome": "~1.9.3",
98
- "@fluid-internal/mocha-test-setup": "2.74.0-365691",
99
- "@fluid-private/stochastic-test-utils": "2.74.0-365691",
100
- "@fluid-private/test-dds-utils": "2.74.0-365691",
98
+ "@fluid-internal/mocha-test-setup": "2.74.0-370705",
99
+ "@fluid-private/stochastic-test-utils": "2.74.0-370705",
100
+ "@fluid-private/test-dds-utils": "2.74.0-370705",
101
101
  "@fluid-tools/build-cli": "^0.60.0",
102
102
  "@fluidframework/build-common": "^2.0.3",
103
103
  "@fluidframework/build-tools": "^0.60.0",
104
- "@fluidframework/container-definitions": "2.74.0-365691",
105
- "@fluidframework/eslint-config-fluid": "2.74.0-365691",
106
- "@fluidframework/test-runtime-utils": "2.74.0-365691",
104
+ "@fluidframework/container-definitions": "2.74.0-370705",
105
+ "@fluidframework/eslint-config-fluid": "2.74.0-370705",
106
+ "@fluidframework/test-runtime-utils": "2.74.0-370705",
107
107
  "@microsoft/api-extractor": "7.52.11",
108
108
  "@types/jest": "29.5.3",
109
109
  "@types/mocha": "^10.0.10",
@@ -110,6 +110,14 @@ export interface SharedArrayEntry<T extends SerializableTypeForSharedArray>
110
110
  * being if there is a remote delete, we will have to respect that
111
111
  */
112
112
  isLocalPendingMove: number;
113
+
114
+ /**
115
+ * Optional flag indicating that this entry has been rolled back
116
+ *
117
+ * Used to prevent undo/redo operations that have already been rolled back.
118
+ *
119
+ */
120
+ isRollback?: boolean;
113
121
  }
114
122
 
115
123
  /**
@@ -336,6 +336,9 @@ export class SharedArrayClass<T extends SerializableTypeForSharedArray>
336
336
  */
337
337
  public toggle(entryId: string): void {
338
338
  const liveEntry = this.getLiveEntry(entryId);
339
+ if (liveEntry?.isRollback === true) {
340
+ return;
341
+ }
339
342
  const isDeleted = !liveEntry.isDeleted;
340
343
 
341
344
  // Adding local pending counter
@@ -369,6 +372,10 @@ export class SharedArrayClass<T extends SerializableTypeForSharedArray>
369
372
  * @param newEntryId - EntryId of the to be live entry
370
373
  */
371
374
  public toggleMove(oldEntryId: string, newEntryId: string): void {
375
+ const liveEntry = this.getLiveEntry(newEntryId);
376
+ if (liveEntry?.isRollback === true) {
377
+ return;
378
+ }
372
379
  if (this.getEntryForId(newEntryId).isDeleted) {
373
380
  return;
374
381
  }
@@ -400,6 +407,7 @@ export class SharedArrayClass<T extends SerializableTypeForSharedArray>
400
407
  case OperationType.insertEntry: {
401
408
  const liveEntry = this.getLiveEntry(arrayOp.entryId);
402
409
  liveEntry.isDeleted = true;
410
+ liveEntry.isRollback = true;
403
411
  const deleteOp: IDeleteOperation = {
404
412
  type: OperationType.deleteEntry,
405
413
  entryId: arrayOp.entryId,
@@ -415,6 +423,7 @@ export class SharedArrayClass<T extends SerializableTypeForSharedArray>
415
423
  } else {
416
424
  const liveEntry = this.getLiveEntry(arrayOp.entryId);
417
425
  liveEntry.isDeleted = false;
426
+ liveEntry.isRollback = true;
418
427
  const insertOp = {
419
428
  type: OperationType.insertEntry,
420
429
  entryId: arrayOp.entryId,
@@ -433,6 +442,7 @@ export class SharedArrayClass<T extends SerializableTypeForSharedArray>
433
442
  if (this.getEntryForId(newEntryId).isDeleted) {
434
443
  return;
435
444
  }
445
+ this.getEntryForId(oldEntryId).isRollback = true;
436
446
  this.updateLiveEntry(newEntryId, oldEntryId);
437
447
  const inputEntry = this.getEntryForId(oldEntryId);
438
448
  inputEntry.prevEntryId = undefined;
@@ -454,6 +464,7 @@ export class SharedArrayClass<T extends SerializableTypeForSharedArray>
454
464
  // Toggling the isDeleted flag to undo the last operation for the skip list payload/value
455
465
  liveEntry.isDeleted = !isDeleted;
456
466
  liveEntry.isLocalPendingDelete -= 1;
467
+ liveEntry.isRollback = true;
457
468
 
458
469
  const toggleOp: IToggleOperation = {
459
470
  type: OperationType.toggle,
@@ -466,6 +477,7 @@ export class SharedArrayClass<T extends SerializableTypeForSharedArray>
466
477
  case OperationType.toggleMove: {
467
478
  const { entryId: oldEntryId, changedToEntryId: newEntryId } = arrayOp;
468
479
  this.getEntryForId(oldEntryId).isLocalPendingMove -= 1;
480
+ this.getEntryForId(newEntryId).isRollback = true;
469
481
  this.updateLiveEntry(oldEntryId, newEntryId);
470
482
 
471
483
  const toggleMoveOp: IToggleMoveOperation = {
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/legacy-dds";
9
- export const pkgVersion = "2.74.0-365691";
9
+ export const pkgVersion = "2.74.0-370705";