@fluidframework/register-collection 2.90.0-378676 → 2.91.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @fluidframework/register-collection
2
2
 
3
+ ## 2.91.0
4
+
5
+ Dependency updates only.
6
+
7
+ ## 2.90.0
8
+
9
+ ### Minor Changes
10
+
11
+ - Deprecated DDS implementation classes ([#26501](https://github.com/microsoft/FluidFramework/pull/26501)) [583a96c3d44](https://github.com/microsoft/FluidFramework/commit/583a96c3d44fa47095a0858d7da981afc574f64e)
12
+
13
+ The following DDS implementation classes are now deprecated and will be removed in a future release:
14
+ - `ConsensusRegisterCollectionClass` — use `ConsensusRegisterCollectionFactory` to create instances and `IConsensusRegisterCollection` for typing
15
+ - `ConsensusOrderedCollection` — use `IConsensusOrderedCollection` for typing
16
+ - `ConsensusQueueClass` — use the `ConsensusQueue` singleton to create instances and `IConsensusOrderedCollection` for typing
17
+
3
18
  ## 2.83.0
4
19
 
5
20
  Dependency updates only.
@@ -10,7 +10,7 @@ export const ConsensusRegisterCollection: ISharedObjectKind<IConsensusRegisterCo
10
10
  // @beta @legacy
11
11
  export type ConsensusRegisterCollection<T> = IConsensusRegisterCollection<T>;
12
12
 
13
- // @beta @legacy
13
+ // @beta @deprecated @legacy
14
14
  export class ConsensusRegisterCollectionClass<T> extends SharedObject<IConsensusRegisterCollectionEvents> implements IConsensusRegisterCollection<T> {
15
15
  constructor(id: string, runtime: IFluidDataStoreRuntime, attributes: IChannelAttributes);
16
16
  // (undocumented)
@@ -20,6 +20,7 @@ export class ConsensusRegisterCollectionClass<T> extends SharedObject<IConsensus
20
20
  protected loadCore(storage: IChannelStorageService): Promise<void>;
21
21
  // (undocumented)
22
22
  protected onDisconnect(): void;
23
+ // (undocumented)
23
24
  protected processMessagesCore(messagesCollection: IRuntimeMessageCollection): void;
24
25
  read(key: string, readPolicy?: ReadPolicy): T | undefined;
25
26
  // (undocumented)
@@ -8,6 +8,7 @@ import { IFluidSerializer, SharedObject } from "@fluidframework/shared-object-ba
8
8
  import { IConsensusRegisterCollection, IConsensusRegisterCollectionEvents, ReadPolicy } from "./interfaces.js";
9
9
  /**
10
10
  * {@inheritDoc IConsensusRegisterCollection}
11
+ * @deprecated Use {@link IConsensusRegisterCollection} for typing and {@link ConsensusRegisterCollectionFactory} to create instances. This implementation class will be removed in a future release.
11
12
  * @legacy @beta
12
13
  */
13
14
  export declare class ConsensusRegisterCollection<T> extends SharedObject<IConsensusRegisterCollectionEvents> implements IConsensusRegisterCollection<T> {
@@ -40,9 +41,6 @@ export declare class ConsensusRegisterCollection<T> extends SharedObject<IConsen
40
41
  */
41
42
  protected loadCore(storage: IChannelStorageService): Promise<void>;
42
43
  protected onDisconnect(): void;
43
- /**
44
- * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}
45
- */
46
44
  protected processMessagesCore(messagesCollection: IRuntimeMessageCollection): void;
47
45
  private processMessage;
48
46
  private readAtomic;
@@ -1 +1 @@
1
- {"version":3,"file":"consensusRegisterCollection.d.ts","sourceRoot":"","sources":["../src/consensusRegisterCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,MAAM,gDAAgD,CAAC;AAExD,OAAO,EACN,qBAAqB,EACrB,yBAAyB,EAGzB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACN,gBAAgB,EAChB,YAAY,EAEZ,MAAM,6CAA6C,CAAC;AAErD,OAAO,EACN,4BAA4B,EAC5B,kCAAkC,EAClC,UAAU,EACV,MAAM,iBAAiB,CAAC;AA6FzB;;;GAGG;AACH,qBAAa,2BAA2B,CAAC,CAAC,CACzC,SAAQ,YAAY,CAAC,kCAAkC,CACvD,YAAW,4BAA4B,CAAC,CAAC,CAAC;IAE1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAC8B;IAE7D,OAAO,CAAC,oBAAoB,CAAa;IAEzC;;;OAGG;gBAEF,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB;IAK/B;;;;;OAKG;IACU,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAgE3D;;;;OAIG;IACI,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,UAA8B,GAAG,CAAC,GAAG,SAAS;IAe5E,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,SAAS;IAK1C,IAAI,IAAI,MAAM,EAAE;IAIvB,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,qBAAqB;IAS5E;;OAEG;cACa,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAexE,SAAS,CAAC,YAAY,IAAI,IAAI;IAE9B;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,yBAAyB,GAAG,IAAI;IAOlF,OAAO,CAAC,cAAc;IAqDtB,OAAO,CAAC,UAAU;IAKlB;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IA2D3B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,KAAK;IAIb;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,GAAG,IAAI;IAWpE,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAQhD"}
1
+ {"version":3,"file":"consensusRegisterCollection.d.ts","sourceRoot":"","sources":["../src/consensusRegisterCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,MAAM,gDAAgD,CAAC;AAExD,OAAO,EACN,qBAAqB,EACrB,yBAAyB,EAGzB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACN,gBAAgB,EAChB,YAAY,EAEZ,MAAM,6CAA6C,CAAC;AAErD,OAAO,EACN,4BAA4B,EAC5B,kCAAkC,EAClC,UAAU,EACV,MAAM,iBAAiB,CAAC;AA6FzB;;;;GAIG;AACH,qBAAa,2BAA2B,CAAC,CAAC,CACzC,SAAQ,YAAY,CAAC,kCAAkC,CACvD,YAAW,4BAA4B,CAAC,CAAC,CAAC;IAE1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAC8B;IAE7D,OAAO,CAAC,oBAAoB,CAAa;IAEzC;;;OAGG;gBAEF,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB;IAK/B;;;;;OAKG;IACU,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAgE3D;;;;OAIG;IACI,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,UAA8B,GAAG,CAAC,GAAG,SAAS;IAe5E,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,SAAS;IAK1C,IAAI,IAAI,MAAM,EAAE;IAIvB,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,qBAAqB;IAS5E;;OAEG;cACa,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAexE,SAAS,CAAC,YAAY,IAAI,IAAI;cAEX,mBAAmB,CAAC,kBAAkB,EAAE,yBAAyB,GAAG,IAAI;IAO3F,OAAO,CAAC,cAAc;IAqDtB,OAAO,CAAC,UAAU;IAKlB;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IA2D3B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,KAAK;IAIb;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,GAAG,IAAI;IAWpE,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAQhD"}
@@ -22,6 +22,7 @@ const incomingOpMatchesPlainFormat = (op) => "value" in op;
22
22
  const snapshotFileName = "header";
23
23
  /**
24
24
  * {@inheritDoc IConsensusRegisterCollection}
25
+ * @deprecated Use {@link IConsensusRegisterCollection} for typing and {@link ConsensusRegisterCollectionFactory} to create instances. This implementation class will be removed in a future release.
25
26
  * @legacy @beta
26
27
  */
27
28
  class ConsensusRegisterCollection extends internal_3.SharedObject {
@@ -138,9 +139,6 @@ class ConsensusRegisterCollection extends internal_3.SharedObject {
138
139
  }
139
140
  }
140
141
  onDisconnect() { }
141
- /**
142
- * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}
143
- */
144
142
  processMessagesCore(messagesCollection) {
145
143
  const { envelope, local, messagesContent } = messagesCollection;
146
144
  for (const messageContent of messagesContent) {
@@ -1 +1 @@
1
- {"version":3,"file":"consensusRegisterCollection.js","sourceRoot":"","sources":["../src/consensusRegisterCollection.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 { bufferToString, createEmitter } from \"@fluid-internal/client-utils\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { MessageType } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tISummaryTreeWithStats,\n\tIRuntimeMessageCollection,\n\tIRuntimeMessagesContent,\n\tISequencedMessageEnvelope,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport {\n\tIFluidSerializer,\n\tSharedObject,\n\tcreateSingleBlobSummary,\n} from \"@fluidframework/shared-object-base/internal\";\n\nimport {\n\tIConsensusRegisterCollection,\n\tIConsensusRegisterCollectionEvents,\n\tReadPolicy,\n} from \"./interfaces.js\";\n\ninterface ILocalData<T> {\n\t// Atomic version\n\tatomic: ILocalRegister<T>;\n\n\t// All concurrent versions awaiting consensus\n\tversions: ILocalRegister<T>[];\n}\n\ninterface ILocalRegister<T> {\n\t// Register value, wrapped for backwards compatibility with < 0.17\n\tvalue: {\n\t\ttype: \"Plain\";\n\t\tvalue: T;\n\t};\n\n\t// The sequence number when last consensus was reached\n\tsequenceNumber: number;\n}\n\nconst newLocalRegister = <T>(sequenceNumber: number, value: T): ILocalRegister<T> => ({\n\tsequenceNumber,\n\tvalue: {\n\t\ttype: \"Plain\",\n\t\tvalue,\n\t},\n});\n\n/**\n * An operation for consensus register collection\n *\n * The value stored in this op is serialized as a string and must be deserialized\n */\ninterface IRegisterOperationSerialized {\n\tkey: string;\n\ttype: \"write\";\n\tserializedValue: string;\n\n\t// Message can be delivered with delay - resubmitted on reconnect.\n\t// As such, refSeq needs to reference seq # at the time op was created,\n\t// not when op was actually sent over wire (ISequencedDocumentMessage.referenceSequenceNumber),\n\t// as client can ingest ops in between.\n\trefSeq: number | undefined;\n}\n\n/**\n * IRegisterOperation format in versions \\< 0.17 and \\>=2.0.0-rc.2.0.0\n *\n * The value stored in this op is _not_ serialized and is stored literally as `T`\n */\ninterface IRegisterOperationPlain<T> {\n\tkey: string;\n\ttype: \"write\";\n\n\tvalue: {\n\t\ttype: \"Plain\";\n\t\tvalue: T;\n\t};\n\n\t// back-compat: for clients prior to 2.0.0-rc.2.0.0, we must also pass in\n\t// the serialized value for them to parse handles correctly. we do not have\n\t// to pay the cost of deserializing this value in newer clients\n\tserializedValue: string;\n\n\t// back-compat: files at rest written with runtime <= 0.13 do not have refSeq\n\trefSeq: number | undefined;\n}\n\n/** Incoming ops could match any of these types */\ntype IIncomingRegisterOperation<T> = IRegisterOperationSerialized | IRegisterOperationPlain<T>;\n\n/** Distinguish between incoming op formats so we know which type it is */\nconst incomingOpMatchesPlainFormat = <T>(op): op is IRegisterOperationPlain<T> =>\n\t\"value\" in op;\n\nconst snapshotFileName = \"header\";\n\ninterface IConsensusRegisterCollectionInternalEvents {\n\t/**\n\t * Emitted when a pending message is rolled back.\n\t * @param rollbackMessageId - A unique identifying number for the pending message.\n\t */\n\tpendingMessageRollback: (rollbackMessageId: number) => void;\n\n\t/**\n\t * Emitted when a pending message is acknowledged.\n\t * @param ackMessageId - A unique identifying number for the pending message.\n\t * @param isWinner - Whether the message won the FWW race to modify the value.\n\t */\n\tpendingMessageAck: (ackMessageId: number, isWinner: boolean) => void;\n}\n\n/**\n * {@inheritDoc IConsensusRegisterCollection}\n * @legacy @beta\n */\nexport class ConsensusRegisterCollection<T>\n\textends SharedObject<IConsensusRegisterCollectionEvents>\n\timplements IConsensusRegisterCollection<T>\n{\n\tprivate readonly data = new Map<string, ILocalData<T>>();\n\tprivate readonly internalEvents =\n\t\tcreateEmitter<IConsensusRegisterCollectionInternalEvents>();\n\n\tprivate nextPendingMessageId: number = 0;\n\n\t/**\n\t * Constructs a new consensus register collection. If the object is non-local an id and service interfaces will\n\t * be provided\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, \"fluid_consensusRegisterCollection_\");\n\t}\n\n\t/**\n\t * Creates a new register or writes a new value.\n\t * Returns a promise that will resolve when the write is acked.\n\t *\n\t * @returns Promise<true> if write was non-concurrent\n\t */\n\tpublic async write(key: string, value: T): Promise<boolean> {\n\t\tif (this.runtime.disposed) {\n\t\t\t// Return false if disposed to signify that we did not write.\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!this.isAttached()) {\n\t\t\tthis.processInboundWrite(key, value, 0, 0, true);\n\t\t\treturn true;\n\t\t}\n\n\t\tconst message: IRegisterOperationPlain<T> = {\n\t\t\tkey,\n\t\t\ttype: \"write\",\n\t\t\tserializedValue: this.stringify(value, this.serializer),\n\t\t\tvalue: {\n\t\t\t\ttype: \"Plain\",\n\t\t\t\tvalue,\n\t\t\t},\n\t\t\trefSeq: this.deltaManager.lastSequenceNumber,\n\t\t};\n\n\t\tconst pendingMessageId = this.nextPendingMessageId++;\n\n\t\t// There are three ways the write promise can resolve:\n\t\t// 1. The write is acked\n\t\t// 2. The write is rolled back\n\t\t// 3. The runtime is disposed\n\t\t// The boolean value returned by the promise is true if the attempted write was ack'd and won, false otherwise.\n\t\treturn new Promise<boolean>((resolve) => {\n\t\t\tconst handleAck = (ackMessageId: number, isWinner: boolean): void => {\n\t\t\t\tif (ackMessageId === pendingMessageId) {\n\t\t\t\t\tresolve(isWinner);\n\t\t\t\t\tremoveListeners();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst handleRollback = (rollbackMessageId: number): void => {\n\t\t\t\tif (rollbackMessageId === pendingMessageId) {\n\t\t\t\t\t// If we rolled back the pending message, resolve the promise with false.\n\t\t\t\t\tresolve(false);\n\t\t\t\t\tremoveListeners();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst handleDisposed = (): void => {\n\t\t\t\tresolve(false);\n\t\t\t\tremoveListeners();\n\t\t\t};\n\n\t\t\tconst removeListeners = (): void => {\n\t\t\t\tthis.internalEvents.off(\"pendingMessageAck\", handleAck);\n\t\t\t\tthis.internalEvents.off(\"pendingMessageRollback\", handleRollback);\n\t\t\t\tthis.runtime.off(\"dispose\", handleDisposed);\n\t\t\t};\n\n\t\t\tthis.internalEvents.on(\"pendingMessageAck\", handleAck);\n\t\t\tthis.internalEvents.on(\"pendingMessageRollback\", handleRollback);\n\t\t\tthis.runtime.on(\"dispose\", handleDisposed);\n\n\t\t\tthis.submitLocalMessage(message, pendingMessageId);\n\t\t});\n\t}\n\n\t/**\n\t * Returns the most recent local value of a register.\n\t * @param key - The key to read\n\t * @param readPolicy - The ReadPolicy to apply. Defaults to Atomic.\n\t */\n\tpublic read(key: string, readPolicy: ReadPolicy = ReadPolicy.Atomic): T | undefined {\n\t\tif (readPolicy === ReadPolicy.Atomic) {\n\t\t\treturn this.readAtomic(key);\n\t\t}\n\n\t\tconst versions = this.readVersions(key);\n\n\t\tif (versions !== undefined) {\n\t\t\t// We don't support deletion. So there should be at least one value.\n\t\t\tassert(versions.length > 0, 0x06c /* \"Value should be undefined or non-empty\" */);\n\n\t\t\treturn versions[versions.length - 1];\n\t\t}\n\t}\n\n\tpublic readVersions(key: string): T[] | undefined {\n\t\tconst data = this.data.get(key);\n\t\treturn data?.versions.map((element: ILocalRegister<T>) => element.value.value);\n\t}\n\n\tpublic keys(): string[] {\n\t\treturn [...this.data.keys()];\n\t}\n\n\tprotected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tconst dataObj: { [key: string]: ILocalData<T> } = {};\n\t\tthis.data.forEach((v, k) => {\n\t\t\tdataObj[k] = v;\n\t\t});\n\n\t\treturn createSingleBlobSummary(snapshotFileName, this.stringify(dataObj, serializer));\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst blob = await storage.readBlob(snapshotFileName);\n\t\tconst header = bufferToString(blob, \"utf8\");\n\t\tconst dataObj = this.parse(header, this.serializer);\n\n\t\tfor (const key of Object.keys(dataObj)) {\n\t\t\tassert(\n\t\t\t\tdataObj[key].atomic?.value.type !== \"Shared\",\n\t\t\t\t0x06d /* \"SharedObjects contained in ConsensusRegisterCollection can no longer be deserialized as of 0.17\" */,\n\t\t\t);\n\n\t\t\tthis.data.set(key, dataObj[key]);\n\t\t}\n\t}\n\n\tprotected onDisconnect(): void {}\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\tif (messageEnvelope.type === MessageType.Operation) {\n\t\t\tconst op = messageContent.contents as IIncomingRegisterOperation<T>;\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"write\": {\n\t\t\t\t\t// backward compatibility: File at rest written with runtime <= 0.13 do not have refSeq\n\t\t\t\t\t// when the refSeq property didn't exist\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\t\t\t\tif (op.refSeq === undefined) {\n\t\t\t\t\t\top.refSeq = messageEnvelope.referenceSequenceNumber;\n\t\t\t\t\t}\n\t\t\t\t\t// Message can be delivered with delay - e.g. resubmitted on reconnect.\n\t\t\t\t\t// Use the refSeq from when the op was created, not when it was transmitted\n\t\t\t\t\tconst refSeqWhenCreated = op.refSeq;\n\t\t\t\t\tassert(\n\t\t\t\t\t\trefSeqWhenCreated <= messageEnvelope.referenceSequenceNumber,\n\t\t\t\t\t\t0x06e /* \"Message's reference sequence number < op's reference sequence number!\" */,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst value = incomingOpMatchesPlainFormat<T>(op)\n\t\t\t\t\t\t? op.value.value\n\t\t\t\t\t\t: (this.parse(op.serializedValue, this.serializer) as T);\n\t\t\t\t\tconst isWinner = this.processInboundWrite(\n\t\t\t\t\t\top.key,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\trefSeqWhenCreated,\n\t\t\t\t\t\tmessageEnvelope.sequenceNumber,\n\t\t\t\t\t\tlocal,\n\t\t\t\t\t);\n\t\t\t\t\tif (local) {\n\t\t\t\t\t\t// Resolve the pending promise for this operation now that we have received an ack for it.\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\ttypeof messageContent.localOpMetadata === \"number\",\n\t\t\t\t\t\t\t0xc0e /* Expect localOpMetadata to be a number */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.internalEvents.emit(\n\t\t\t\t\t\t\t\"pendingMessageAck\",\n\t\t\t\t\t\t\tmessageContent.localOpMetadata,\n\t\t\t\t\t\t\tisWinner,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(op.type);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate readAtomic(key: string): T | undefined {\n\t\tconst data = this.data.get(key);\n\t\treturn data?.atomic.value.value;\n\t}\n\n\t/**\n\t * Process an inbound write op\n\t * @param key - Key that was written to\n\t * @param value - Incoming value\n\t * @param refSeq - RefSeq at the time of write on the remote client\n\t * @param sequenceNumber - Sequence Number of this write op\n\t * @param local - Did this write originate on this client\n\t */\n\tprivate processInboundWrite(\n\t\tkey: string,\n\t\tvalue: T,\n\t\trefSeq: number,\n\t\tsequenceNumber: number,\n\t\tlocal: boolean,\n\t): boolean {\n\t\tlet data = this.data.get(key);\n\t\t// Atomic update if it's a new register or the write was not concurrent,\n\t\t// meaning our state was known to the remote client at the time of write\n\t\tconst isWinner = data === undefined || refSeq >= data.atomic.sequenceNumber;\n\t\tif (isWinner) {\n\t\t\tconst atomicUpdate = newLocalRegister<T>(sequenceNumber, value);\n\t\t\tif (data === undefined) {\n\t\t\t\tdata = {\n\t\t\t\t\tatomic: atomicUpdate,\n\t\t\t\t\tversions: [], // we'll update versions next, leave it empty for now\n\t\t\t\t};\n\t\t\t\tthis.data.set(key, data);\n\t\t\t} else {\n\t\t\t\tdata.atomic = atomicUpdate;\n\t\t\t}\n\t\t} else {\n\t\t\tassert(!!data, 0x06f /* \"data missing for non-atomic inbound update!\" */);\n\t\t}\n\n\t\t// Remove versions that were known to the remote client at the time of write\n\t\twhile (data.versions.length > 0 && refSeq >= data.versions[0].sequenceNumber) {\n\t\t\tdata.versions.shift();\n\t\t}\n\n\t\tconst versionUpdate = newLocalRegister<T>(sequenceNumber, value);\n\n\t\t// Asserts for data integrity\n\t\tif (!this.isAttached()) {\n\t\t\tassert(\n\t\t\t\trefSeq === 0 && sequenceNumber === 0,\n\t\t\t\t0x070 /* \"sequence numbers are expected to be 0 when unattached\" */,\n\t\t\t);\n\t\t} else if (data.versions.length > 0) {\n\t\t\tassert(\n\t\t\t\t// seqNum should always be increasing, except for the case of grouped batches (seqNum will be the same)\n\t\t\t\tsequenceNumber >= data.versions[data.versions.length - 1].sequenceNumber,\n\t\t\t\t0x071 /* \"Versions should naturally be ordered by sequenceNumber\" */,\n\t\t\t);\n\t\t}\n\n\t\t// Push the new element.\n\t\tdata.versions.push(versionUpdate);\n\n\t\t// Raise events at the end, to avoid reentrancy issues\n\t\tif (isWinner) {\n\t\t\tthis.emit(\"atomicChanged\", key, value, local);\n\t\t}\n\t\tthis.emit(\"versionChanged\", key, value, local);\n\n\t\treturn isWinner;\n\t}\n\n\tprivate stringify(value: any, serializer: IFluidSerializer): string {\n\t\treturn serializer.stringify(value, this.handle);\n\t}\n\n\tprivate parse(content: string, serializer: IFluidSerializer): any {\n\t\treturn serializer.parse(content);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.rollback}\n\t * @sealed\n\t */\n\tprotected rollback(content: unknown, localOpMetadata: unknown): void {\n\t\t// We don't need to do anything to roll back CRC, it's safe to just drop\n\t\t// the op on the floor since we don't modify the DDS until the ack.\n\t\t// We emit an internal event so we know to resolve the pending promise.\n\t\tassert(\n\t\t\ttypeof localOpMetadata === \"number\",\n\t\t\t0xc0f /* Expect localOpMetadata to be a number */,\n\t\t);\n\t\tthis.internalEvents.emit(\"pendingMessageRollback\", localOpMetadata);\n\t}\n\n\tprotected applyStashedOp(content: unknown): void {\n\t\tconst op = content as IIncomingRegisterOperation<T>;\n\t\tassert(op.type === \"write\", 0xccc /* Only write ops should be stashed */);\n\t\t// Submit the original op (preserving its refSeq) so we can match the ACK\n\t\t// when it arrives during remote op processing.\n\t\tconst pendingMessageId = this.nextPendingMessageId++;\n\t\tthis.submitLocalMessage(op, pendingMessageId);\n\t}\n}\n"]}
1
+ {"version":3,"file":"consensusRegisterCollection.js","sourceRoot":"","sources":["../src/consensusRegisterCollection.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 { bufferToString, createEmitter } from \"@fluid-internal/client-utils\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { MessageType } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tISummaryTreeWithStats,\n\tIRuntimeMessageCollection,\n\tIRuntimeMessagesContent,\n\tISequencedMessageEnvelope,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport {\n\tIFluidSerializer,\n\tSharedObject,\n\tcreateSingleBlobSummary,\n} from \"@fluidframework/shared-object-base/internal\";\n\nimport {\n\tIConsensusRegisterCollection,\n\tIConsensusRegisterCollectionEvents,\n\tReadPolicy,\n} from \"./interfaces.js\";\n\ninterface ILocalData<T> {\n\t// Atomic version\n\tatomic: ILocalRegister<T>;\n\n\t// All concurrent versions awaiting consensus\n\tversions: ILocalRegister<T>[];\n}\n\ninterface ILocalRegister<T> {\n\t// Register value, wrapped for backwards compatibility with < 0.17\n\tvalue: {\n\t\ttype: \"Plain\";\n\t\tvalue: T;\n\t};\n\n\t// The sequence number when last consensus was reached\n\tsequenceNumber: number;\n}\n\nconst newLocalRegister = <T>(sequenceNumber: number, value: T): ILocalRegister<T> => ({\n\tsequenceNumber,\n\tvalue: {\n\t\ttype: \"Plain\",\n\t\tvalue,\n\t},\n});\n\n/**\n * An operation for consensus register collection\n *\n * The value stored in this op is serialized as a string and must be deserialized\n */\ninterface IRegisterOperationSerialized {\n\tkey: string;\n\ttype: \"write\";\n\tserializedValue: string;\n\n\t// Message can be delivered with delay - resubmitted on reconnect.\n\t// As such, refSeq needs to reference seq # at the time op was created,\n\t// not when op was actually sent over wire (ISequencedDocumentMessage.referenceSequenceNumber),\n\t// as client can ingest ops in between.\n\trefSeq: number | undefined;\n}\n\n/**\n * IRegisterOperation format in versions \\< 0.17 and \\>=2.0.0-rc.2.0.0\n *\n * The value stored in this op is _not_ serialized and is stored literally as `T`\n */\ninterface IRegisterOperationPlain<T> {\n\tkey: string;\n\ttype: \"write\";\n\n\tvalue: {\n\t\ttype: \"Plain\";\n\t\tvalue: T;\n\t};\n\n\t// back-compat: for clients prior to 2.0.0-rc.2.0.0, we must also pass in\n\t// the serialized value for them to parse handles correctly. we do not have\n\t// to pay the cost of deserializing this value in newer clients\n\tserializedValue: string;\n\n\t// back-compat: files at rest written with runtime <= 0.13 do not have refSeq\n\trefSeq: number | undefined;\n}\n\n/** Incoming ops could match any of these types */\ntype IIncomingRegisterOperation<T> = IRegisterOperationSerialized | IRegisterOperationPlain<T>;\n\n/** Distinguish between incoming op formats so we know which type it is */\nconst incomingOpMatchesPlainFormat = <T>(op): op is IRegisterOperationPlain<T> =>\n\t\"value\" in op;\n\nconst snapshotFileName = \"header\";\n\ninterface IConsensusRegisterCollectionInternalEvents {\n\t/**\n\t * Emitted when a pending message is rolled back.\n\t * @param rollbackMessageId - A unique identifying number for the pending message.\n\t */\n\tpendingMessageRollback: (rollbackMessageId: number) => void;\n\n\t/**\n\t * Emitted when a pending message is acknowledged.\n\t * @param ackMessageId - A unique identifying number for the pending message.\n\t * @param isWinner - Whether the message won the FWW race to modify the value.\n\t */\n\tpendingMessageAck: (ackMessageId: number, isWinner: boolean) => void;\n}\n\n/**\n * {@inheritDoc IConsensusRegisterCollection}\n * @deprecated Use {@link IConsensusRegisterCollection} for typing and {@link ConsensusRegisterCollectionFactory} to create instances. This implementation class will be removed in a future release.\n * @legacy @beta\n */\nexport class ConsensusRegisterCollection<T>\n\textends SharedObject<IConsensusRegisterCollectionEvents>\n\timplements IConsensusRegisterCollection<T>\n{\n\tprivate readonly data = new Map<string, ILocalData<T>>();\n\tprivate readonly internalEvents =\n\t\tcreateEmitter<IConsensusRegisterCollectionInternalEvents>();\n\n\tprivate nextPendingMessageId: number = 0;\n\n\t/**\n\t * Constructs a new consensus register collection. If the object is non-local an id and service interfaces will\n\t * be provided\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, \"fluid_consensusRegisterCollection_\");\n\t}\n\n\t/**\n\t * Creates a new register or writes a new value.\n\t * Returns a promise that will resolve when the write is acked.\n\t *\n\t * @returns Promise<true> if write was non-concurrent\n\t */\n\tpublic async write(key: string, value: T): Promise<boolean> {\n\t\tif (this.runtime.disposed) {\n\t\t\t// Return false if disposed to signify that we did not write.\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!this.isAttached()) {\n\t\t\tthis.processInboundWrite(key, value, 0, 0, true);\n\t\t\treturn true;\n\t\t}\n\n\t\tconst message: IRegisterOperationPlain<T> = {\n\t\t\tkey,\n\t\t\ttype: \"write\",\n\t\t\tserializedValue: this.stringify(value, this.serializer),\n\t\t\tvalue: {\n\t\t\t\ttype: \"Plain\",\n\t\t\t\tvalue,\n\t\t\t},\n\t\t\trefSeq: this.deltaManager.lastSequenceNumber,\n\t\t};\n\n\t\tconst pendingMessageId = this.nextPendingMessageId++;\n\n\t\t// There are three ways the write promise can resolve:\n\t\t// 1. The write is acked\n\t\t// 2. The write is rolled back\n\t\t// 3. The runtime is disposed\n\t\t// The boolean value returned by the promise is true if the attempted write was ack'd and won, false otherwise.\n\t\treturn new Promise<boolean>((resolve) => {\n\t\t\tconst handleAck = (ackMessageId: number, isWinner: boolean): void => {\n\t\t\t\tif (ackMessageId === pendingMessageId) {\n\t\t\t\t\tresolve(isWinner);\n\t\t\t\t\tremoveListeners();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst handleRollback = (rollbackMessageId: number): void => {\n\t\t\t\tif (rollbackMessageId === pendingMessageId) {\n\t\t\t\t\t// If we rolled back the pending message, resolve the promise with false.\n\t\t\t\t\tresolve(false);\n\t\t\t\t\tremoveListeners();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst handleDisposed = (): void => {\n\t\t\t\tresolve(false);\n\t\t\t\tremoveListeners();\n\t\t\t};\n\n\t\t\tconst removeListeners = (): void => {\n\t\t\t\tthis.internalEvents.off(\"pendingMessageAck\", handleAck);\n\t\t\t\tthis.internalEvents.off(\"pendingMessageRollback\", handleRollback);\n\t\t\t\tthis.runtime.off(\"dispose\", handleDisposed);\n\t\t\t};\n\n\t\t\tthis.internalEvents.on(\"pendingMessageAck\", handleAck);\n\t\t\tthis.internalEvents.on(\"pendingMessageRollback\", handleRollback);\n\t\t\tthis.runtime.on(\"dispose\", handleDisposed);\n\n\t\t\tthis.submitLocalMessage(message, pendingMessageId);\n\t\t});\n\t}\n\n\t/**\n\t * Returns the most recent local value of a register.\n\t * @param key - The key to read\n\t * @param readPolicy - The ReadPolicy to apply. Defaults to Atomic.\n\t */\n\tpublic read(key: string, readPolicy: ReadPolicy = ReadPolicy.Atomic): T | undefined {\n\t\tif (readPolicy === ReadPolicy.Atomic) {\n\t\t\treturn this.readAtomic(key);\n\t\t}\n\n\t\tconst versions = this.readVersions(key);\n\n\t\tif (versions !== undefined) {\n\t\t\t// We don't support deletion. So there should be at least one value.\n\t\t\tassert(versions.length > 0, 0x06c /* \"Value should be undefined or non-empty\" */);\n\n\t\t\treturn versions[versions.length - 1];\n\t\t}\n\t}\n\n\tpublic readVersions(key: string): T[] | undefined {\n\t\tconst data = this.data.get(key);\n\t\treturn data?.versions.map((element: ILocalRegister<T>) => element.value.value);\n\t}\n\n\tpublic keys(): string[] {\n\t\treturn [...this.data.keys()];\n\t}\n\n\tprotected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tconst dataObj: { [key: string]: ILocalData<T> } = {};\n\t\tthis.data.forEach((v, k) => {\n\t\t\tdataObj[k] = v;\n\t\t});\n\n\t\treturn createSingleBlobSummary(snapshotFileName, this.stringify(dataObj, serializer));\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst blob = await storage.readBlob(snapshotFileName);\n\t\tconst header = bufferToString(blob, \"utf8\");\n\t\tconst dataObj = this.parse(header, this.serializer);\n\n\t\tfor (const key of Object.keys(dataObj)) {\n\t\t\tassert(\n\t\t\t\tdataObj[key].atomic?.value.type !== \"Shared\",\n\t\t\t\t0x06d /* \"SharedObjects contained in ConsensusRegisterCollection can no longer be deserialized as of 0.17\" */,\n\t\t\t);\n\n\t\t\tthis.data.set(key, dataObj[key]);\n\t\t}\n\t}\n\n\tprotected onDisconnect(): void {}\n\n\tprotected override 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\tif (messageEnvelope.type === MessageType.Operation) {\n\t\t\tconst op = messageContent.contents as IIncomingRegisterOperation<T>;\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"write\": {\n\t\t\t\t\t// backward compatibility: File at rest written with runtime <= 0.13 do not have refSeq\n\t\t\t\t\t// when the refSeq property didn't exist\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\t\t\t\tif (op.refSeq === undefined) {\n\t\t\t\t\t\top.refSeq = messageEnvelope.referenceSequenceNumber;\n\t\t\t\t\t}\n\t\t\t\t\t// Message can be delivered with delay - e.g. resubmitted on reconnect.\n\t\t\t\t\t// Use the refSeq from when the op was created, not when it was transmitted\n\t\t\t\t\tconst refSeqWhenCreated = op.refSeq;\n\t\t\t\t\tassert(\n\t\t\t\t\t\trefSeqWhenCreated <= messageEnvelope.referenceSequenceNumber,\n\t\t\t\t\t\t0x06e /* \"Message's reference sequence number < op's reference sequence number!\" */,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst value = incomingOpMatchesPlainFormat<T>(op)\n\t\t\t\t\t\t? op.value.value\n\t\t\t\t\t\t: (this.parse(op.serializedValue, this.serializer) as T);\n\t\t\t\t\tconst isWinner = this.processInboundWrite(\n\t\t\t\t\t\top.key,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\trefSeqWhenCreated,\n\t\t\t\t\t\tmessageEnvelope.sequenceNumber,\n\t\t\t\t\t\tlocal,\n\t\t\t\t\t);\n\t\t\t\t\tif (local) {\n\t\t\t\t\t\t// Resolve the pending promise for this operation now that we have received an ack for it.\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\ttypeof messageContent.localOpMetadata === \"number\",\n\t\t\t\t\t\t\t0xc0e /* Expect localOpMetadata to be a number */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.internalEvents.emit(\n\t\t\t\t\t\t\t\"pendingMessageAck\",\n\t\t\t\t\t\t\tmessageContent.localOpMetadata,\n\t\t\t\t\t\t\tisWinner,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(op.type);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate readAtomic(key: string): T | undefined {\n\t\tconst data = this.data.get(key);\n\t\treturn data?.atomic.value.value;\n\t}\n\n\t/**\n\t * Process an inbound write op\n\t * @param key - Key that was written to\n\t * @param value - Incoming value\n\t * @param refSeq - RefSeq at the time of write on the remote client\n\t * @param sequenceNumber - Sequence Number of this write op\n\t * @param local - Did this write originate on this client\n\t */\n\tprivate processInboundWrite(\n\t\tkey: string,\n\t\tvalue: T,\n\t\trefSeq: number,\n\t\tsequenceNumber: number,\n\t\tlocal: boolean,\n\t): boolean {\n\t\tlet data = this.data.get(key);\n\t\t// Atomic update if it's a new register or the write was not concurrent,\n\t\t// meaning our state was known to the remote client at the time of write\n\t\tconst isWinner = data === undefined || refSeq >= data.atomic.sequenceNumber;\n\t\tif (isWinner) {\n\t\t\tconst atomicUpdate = newLocalRegister<T>(sequenceNumber, value);\n\t\t\tif (data === undefined) {\n\t\t\t\tdata = {\n\t\t\t\t\tatomic: atomicUpdate,\n\t\t\t\t\tversions: [], // we'll update versions next, leave it empty for now\n\t\t\t\t};\n\t\t\t\tthis.data.set(key, data);\n\t\t\t} else {\n\t\t\t\tdata.atomic = atomicUpdate;\n\t\t\t}\n\t\t} else {\n\t\t\tassert(!!data, 0x06f /* \"data missing for non-atomic inbound update!\" */);\n\t\t}\n\n\t\t// Remove versions that were known to the remote client at the time of write\n\t\twhile (data.versions.length > 0 && refSeq >= data.versions[0].sequenceNumber) {\n\t\t\tdata.versions.shift();\n\t\t}\n\n\t\tconst versionUpdate = newLocalRegister<T>(sequenceNumber, value);\n\n\t\t// Asserts for data integrity\n\t\tif (!this.isAttached()) {\n\t\t\tassert(\n\t\t\t\trefSeq === 0 && sequenceNumber === 0,\n\t\t\t\t0x070 /* \"sequence numbers are expected to be 0 when unattached\" */,\n\t\t\t);\n\t\t} else if (data.versions.length > 0) {\n\t\t\tassert(\n\t\t\t\t// seqNum should always be increasing, except for the case of grouped batches (seqNum will be the same)\n\t\t\t\tsequenceNumber >= data.versions[data.versions.length - 1].sequenceNumber,\n\t\t\t\t0x071 /* \"Versions should naturally be ordered by sequenceNumber\" */,\n\t\t\t);\n\t\t}\n\n\t\t// Push the new element.\n\t\tdata.versions.push(versionUpdate);\n\n\t\t// Raise events at the end, to avoid reentrancy issues\n\t\tif (isWinner) {\n\t\t\tthis.emit(\"atomicChanged\", key, value, local);\n\t\t}\n\t\tthis.emit(\"versionChanged\", key, value, local);\n\n\t\treturn isWinner;\n\t}\n\n\tprivate stringify(value: any, serializer: IFluidSerializer): string {\n\t\treturn serializer.stringify(value, this.handle);\n\t}\n\n\tprivate parse(content: string, serializer: IFluidSerializer): any {\n\t\treturn serializer.parse(content);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.rollback}\n\t * @sealed\n\t */\n\tprotected rollback(content: unknown, localOpMetadata: unknown): void {\n\t\t// We don't need to do anything to roll back CRC, it's safe to just drop\n\t\t// the op on the floor since we don't modify the DDS until the ack.\n\t\t// We emit an internal event so we know to resolve the pending promise.\n\t\tassert(\n\t\t\ttypeof localOpMetadata === \"number\",\n\t\t\t0xc0f /* Expect localOpMetadata to be a number */,\n\t\t);\n\t\tthis.internalEvents.emit(\"pendingMessageRollback\", localOpMetadata);\n\t}\n\n\tprotected applyStashedOp(content: unknown): void {\n\t\tconst op = content as IIncomingRegisterOperation<T>;\n\t\tassert(op.type === \"write\", 0xccc /* Only write ops should be stashed */);\n\t\t// Submit the original op (preserving its refSeq) so we can match the ACK\n\t\t// when it arrives during remote op processing.\n\t\tconst pendingMessageId = this.nextPendingMessageId++;\n\t\tthis.submitLocalMessage(op, pendingMessageId);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"consensusRegisterCollectionFactory.d.ts","sourceRoot":"","sources":["../src/consensusRegisterCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,KAAK,eAAe,EACpB,gBAAgB,EAChB,MAAM,gDAAgD,CAAC;AAIxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAG/D;;;GAGG;AACH,qBAAa,kCACZ,YAAW,eAAe,CAAC,4BAA4B,CAAC;IAExD,OAAc,IAAI,SAAqE;IAEvF,gBAAuB,UAAU,EAAE,kBAAkB,CAInD;IAEF,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,UAAU,IAAI,kBAAkB,CAE1C;IAED;;OAEG;IACU,IAAI,CAChB,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,4BAA4B,CAAC;IAMjC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,4BAA4B;CASzF;AAED;;;GAGG;AACH,eAAO,MAAM,2BAA2B,wNAEvC,CAAC;AACF;;;GAGG;AACH,MAAM,MAAM,2BAA2B,CAAC,CAAC,IAAI,4BAA4B,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"consensusRegisterCollectionFactory.d.ts","sourceRoot":"","sources":["../src/consensusRegisterCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,KAAK,eAAe,EACpB,gBAAgB,EAChB,MAAM,gDAAgD,CAAC;AAKxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAG/D;;;GAGG;AACH,qBAAa,kCACZ,YAAW,eAAe,CAAC,4BAA4B,CAAC;IAExD,OAAc,IAAI,SAAqE;IAEvF,gBAAuB,UAAU,EAAE,kBAAkB,CAInD;IAEF,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,UAAU,IAAI,kBAAkB,CAE1C;IAED;;OAEG;IACU,IAAI,CAChB,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,4BAA4B,CAAC;IAOjC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,4BAA4B;CAUzF;AAED;;;GAGG;AACH,eAAO,MAAM,2BAA2B,wNAEvC,CAAC;AACF;;;GAGG;AACH,MAAM,MAAM,2BAA2B,CAAC,CAAC,IAAI,4BAA4B,CAAC,CAAC,CAAC,CAAC"}
@@ -6,6 +6,7 @@
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.ConsensusRegisterCollection = exports.ConsensusRegisterCollectionFactory = void 0;
8
8
  const internal_1 = require("@fluidframework/shared-object-base/internal");
9
+ // eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class in factory
9
10
  const consensusRegisterCollection_js_1 = require("./consensusRegisterCollection.js");
10
11
  const packageVersion_js_1 = require("./packageVersion.js");
11
12
  /**
@@ -23,11 +24,13 @@ class ConsensusRegisterCollectionFactory {
23
24
  * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}
24
25
  */
25
26
  async load(runtime, id, services, attributes) {
27
+ // eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class
26
28
  const collection = new consensusRegisterCollection_js_1.ConsensusRegisterCollection(id, runtime, attributes);
27
29
  await collection.load(services);
28
30
  return collection;
29
31
  }
30
32
  create(document, id) {
33
+ // eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class
31
34
  const collection = new consensusRegisterCollection_js_1.ConsensusRegisterCollection(id, document, ConsensusRegisterCollectionFactory.Attributes);
32
35
  collection.initializeLocal();
33
36
  return collection;
@@ -1 +1 @@
1
- {"version":3,"file":"consensusRegisterCollectionFactory.js","sourceRoot":"","sources":["../src/consensusRegisterCollectionFactory.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAQH,0EAAqF;AAErF,qFAAmH;AAEnH,2DAAiD;AAEjD;;;GAGG;AACH,MAAa,kCAAkC;IAW9C,IAAW,IAAI;QACd,OAAO,kCAAkC,CAAC,IAAI,CAAC;IAChD,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,kCAAkC,CAAC,UAAU,CAAC;IACtD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI,CAChB,OAA+B,EAC/B,EAAU,EACV,QAA0B,EAC1B,UAA8B;QAE9B,MAAM,UAAU,GAAG,IAAI,4DAAgC,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACjF,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,UAAU,CAAC;IACnB,CAAC;IAEM,MAAM,CAAC,QAAgC,EAAE,EAAU;QACzD,MAAM,UAAU,GAAG,IAAI,4DAAgC,CACtD,EAAE,EACF,QAAQ,EACR,kCAAkC,CAAC,UAAU,CAC7C,CAAC;QACF,UAAU,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC;IACnB,CAAC;;AAzCF,gFA0CC;AAvCc,uCAAI,GAAG,iEAAiE,CAAC;AAEhE,6CAAU,GAAuB;IACvD,IAAI,EAAE,kCAAkC,CAAC,IAAI;IAC7C,qBAAqB,EAAE,KAAK;IAC5B,cAAc,EAAE,8BAAU;CAC1B,CAAC;AAmCH;;;GAGG;AACU,QAAA,2BAA2B,GAAG,IAAA,iCAAsB,EAChE,kCAAkC,CAClC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\ttype IChannelFactory,\n\tIChannelServices,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { createSharedObjectKind } from \"@fluidframework/shared-object-base/internal\";\n\nimport { ConsensusRegisterCollection as ConsensusRegisterCollectionClass } from \"./consensusRegisterCollection.js\";\nimport { IConsensusRegisterCollection } from \"./interfaces.js\";\nimport { pkgVersion } from \"./packageVersion.js\";\n\n/**\n * The factory that defines the consensus queue.\n * @legacy @beta\n */\nexport class ConsensusRegisterCollectionFactory\n\timplements IChannelFactory<IConsensusRegisterCollection>\n{\n\tpublic static Type = \"https://graph.microsoft.com/types/consensus-register-collection\";\n\n\tpublic static readonly Attributes: IChannelAttributes = {\n\t\ttype: ConsensusRegisterCollectionFactory.Type,\n\t\tsnapshotFormatVersion: \"0.1\",\n\t\tpackageVersion: pkgVersion,\n\t};\n\n\tpublic get type(): string {\n\t\treturn ConsensusRegisterCollectionFactory.Type;\n\t}\n\n\tpublic get attributes(): IChannelAttributes {\n\t\treturn ConsensusRegisterCollectionFactory.Attributes;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}\n\t */\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IConsensusRegisterCollection> {\n\t\tconst collection = new ConsensusRegisterCollectionClass(id, runtime, attributes);\n\t\tawait collection.load(services);\n\t\treturn collection;\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): IConsensusRegisterCollection {\n\t\tconst collection = new ConsensusRegisterCollectionClass(\n\t\t\tid,\n\t\t\tdocument,\n\t\t\tConsensusRegisterCollectionFactory.Attributes,\n\t\t);\n\t\tcollection.initializeLocal();\n\t\treturn collection;\n\t}\n}\n\n/**\n * {@inheritDoc IConsensusRegisterCollection}\n * @legacy @beta\n */\nexport const ConsensusRegisterCollection = createSharedObjectKind(\n\tConsensusRegisterCollectionFactory,\n);\n/**\n * Compatibility alias for {@link IConsensusRegisterCollection}.\n * @legacy @beta\n */\nexport type ConsensusRegisterCollection<T> = IConsensusRegisterCollection<T>;\n"]}
1
+ {"version":3,"file":"consensusRegisterCollectionFactory.js","sourceRoot":"","sources":["../src/consensusRegisterCollectionFactory.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAQH,0EAAqF;AAErF,mGAAmG;AACnG,qFAAmH;AAEnH,2DAAiD;AAEjD;;;GAGG;AACH,MAAa,kCAAkC;IAW9C,IAAW,IAAI;QACd,OAAO,kCAAkC,CAAC,IAAI,CAAC;IAChD,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,kCAAkC,CAAC,UAAU,CAAC;IACtD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI,CAChB,OAA+B,EAC/B,EAAU,EACV,QAA0B,EAC1B,UAA8B;QAE9B,wFAAwF;QACxF,MAAM,UAAU,GAAG,IAAI,4DAAgC,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACjF,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,UAAU,CAAC;IACnB,CAAC;IAEM,MAAM,CAAC,QAAgC,EAAE,EAAU;QACzD,wFAAwF;QACxF,MAAM,UAAU,GAAG,IAAI,4DAAgC,CACtD,EAAE,EACF,QAAQ,EACR,kCAAkC,CAAC,UAAU,CAC7C,CAAC;QACF,UAAU,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC;IACnB,CAAC;;AA3CF,gFA4CC;AAzCc,uCAAI,GAAG,iEAAiE,CAAC;AAEhE,6CAAU,GAAuB;IACvD,IAAI,EAAE,kCAAkC,CAAC,IAAI;IAC7C,qBAAqB,EAAE,KAAK;IAC5B,cAAc,EAAE,8BAAU;CAC1B,CAAC;AAqCH;;;GAGG;AACU,QAAA,2BAA2B,GAAG,IAAA,iCAAsB,EAChE,kCAAkC,CAClC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\ttype IChannelFactory,\n\tIChannelServices,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { createSharedObjectKind } from \"@fluidframework/shared-object-base/internal\";\n\n// eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class in factory\nimport { ConsensusRegisterCollection as ConsensusRegisterCollectionClass } from \"./consensusRegisterCollection.js\";\nimport { IConsensusRegisterCollection } from \"./interfaces.js\";\nimport { pkgVersion } from \"./packageVersion.js\";\n\n/**\n * The factory that defines the consensus queue.\n * @legacy @beta\n */\nexport class ConsensusRegisterCollectionFactory\n\timplements IChannelFactory<IConsensusRegisterCollection>\n{\n\tpublic static Type = \"https://graph.microsoft.com/types/consensus-register-collection\";\n\n\tpublic static readonly Attributes: IChannelAttributes = {\n\t\ttype: ConsensusRegisterCollectionFactory.Type,\n\t\tsnapshotFormatVersion: \"0.1\",\n\t\tpackageVersion: pkgVersion,\n\t};\n\n\tpublic get type(): string {\n\t\treturn ConsensusRegisterCollectionFactory.Type;\n\t}\n\n\tpublic get attributes(): IChannelAttributes {\n\t\treturn ConsensusRegisterCollectionFactory.Attributes;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}\n\t */\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IConsensusRegisterCollection> {\n\t\t// eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class\n\t\tconst collection = new ConsensusRegisterCollectionClass(id, runtime, attributes);\n\t\tawait collection.load(services);\n\t\treturn collection;\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): IConsensusRegisterCollection {\n\t\t// eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class\n\t\tconst collection = new ConsensusRegisterCollectionClass(\n\t\t\tid,\n\t\t\tdocument,\n\t\t\tConsensusRegisterCollectionFactory.Attributes,\n\t\t);\n\t\tcollection.initializeLocal();\n\t\treturn collection;\n\t}\n}\n\n/**\n * {@inheritDoc IConsensusRegisterCollection}\n * @legacy @beta\n */\nexport const ConsensusRegisterCollection = createSharedObjectKind(\n\tConsensusRegisterCollectionFactory,\n);\n/**\n * Compatibility alias for {@link IConsensusRegisterCollection}.\n * @legacy @beta\n */\nexport type ConsensusRegisterCollection<T> = IConsensusRegisterCollection<T>;\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/register-collection";
8
- export declare const pkgVersion = "2.90.0-378676";
8
+ export declare const pkgVersion = "2.91.0";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,wCAAwC,CAAC;AAC7D,eAAO,MAAM,UAAU,kBAAkB,CAAC"}
1
+ {"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,wCAAwC,CAAC;AAC7D,eAAO,MAAM,UAAU,WAAW,CAAC"}
@@ -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/register-collection";
11
- exports.pkgVersion = "2.90.0-378676";
11
+ exports.pkgVersion = "2.91.0";
12
12
  //# sourceMappingURL=packageVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,qCAAqC,CAAC;AAChD,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/register-collection\";\nexport const pkgVersion = \"2.90.0-378676\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,qCAAqC,CAAC;AAChD,QAAA,UAAU,GAAG,QAAQ,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/register-collection\";\nexport const pkgVersion = \"2.91.0\";\n"]}
@@ -8,6 +8,7 @@ import { IFluidSerializer, SharedObject } from "@fluidframework/shared-object-ba
8
8
  import { IConsensusRegisterCollection, IConsensusRegisterCollectionEvents, ReadPolicy } from "./interfaces.js";
9
9
  /**
10
10
  * {@inheritDoc IConsensusRegisterCollection}
11
+ * @deprecated Use {@link IConsensusRegisterCollection} for typing and {@link ConsensusRegisterCollectionFactory} to create instances. This implementation class will be removed in a future release.
11
12
  * @legacy @beta
12
13
  */
13
14
  export declare class ConsensusRegisterCollection<T> extends SharedObject<IConsensusRegisterCollectionEvents> implements IConsensusRegisterCollection<T> {
@@ -40,9 +41,6 @@ export declare class ConsensusRegisterCollection<T> extends SharedObject<IConsen
40
41
  */
41
42
  protected loadCore(storage: IChannelStorageService): Promise<void>;
42
43
  protected onDisconnect(): void;
43
- /**
44
- * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}
45
- */
46
44
  protected processMessagesCore(messagesCollection: IRuntimeMessageCollection): void;
47
45
  private processMessage;
48
46
  private readAtomic;
@@ -1 +1 @@
1
- {"version":3,"file":"consensusRegisterCollection.d.ts","sourceRoot":"","sources":["../src/consensusRegisterCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,MAAM,gDAAgD,CAAC;AAExD,OAAO,EACN,qBAAqB,EACrB,yBAAyB,EAGzB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACN,gBAAgB,EAChB,YAAY,EAEZ,MAAM,6CAA6C,CAAC;AAErD,OAAO,EACN,4BAA4B,EAC5B,kCAAkC,EAClC,UAAU,EACV,MAAM,iBAAiB,CAAC;AA6FzB;;;GAGG;AACH,qBAAa,2BAA2B,CAAC,CAAC,CACzC,SAAQ,YAAY,CAAC,kCAAkC,CACvD,YAAW,4BAA4B,CAAC,CAAC,CAAC;IAE1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAC8B;IAE7D,OAAO,CAAC,oBAAoB,CAAa;IAEzC;;;OAGG;gBAEF,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB;IAK/B;;;;;OAKG;IACU,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAgE3D;;;;OAIG;IACI,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,UAA8B,GAAG,CAAC,GAAG,SAAS;IAe5E,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,SAAS;IAK1C,IAAI,IAAI,MAAM,EAAE;IAIvB,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,qBAAqB;IAS5E;;OAEG;cACa,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAexE,SAAS,CAAC,YAAY,IAAI,IAAI;IAE9B;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,yBAAyB,GAAG,IAAI;IAOlF,OAAO,CAAC,cAAc;IAqDtB,OAAO,CAAC,UAAU;IAKlB;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IA2D3B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,KAAK;IAIb;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,GAAG,IAAI;IAWpE,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAQhD"}
1
+ {"version":3,"file":"consensusRegisterCollection.d.ts","sourceRoot":"","sources":["../src/consensusRegisterCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,MAAM,gDAAgD,CAAC;AAExD,OAAO,EACN,qBAAqB,EACrB,yBAAyB,EAGzB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACN,gBAAgB,EAChB,YAAY,EAEZ,MAAM,6CAA6C,CAAC;AAErD,OAAO,EACN,4BAA4B,EAC5B,kCAAkC,EAClC,UAAU,EACV,MAAM,iBAAiB,CAAC;AA6FzB;;;;GAIG;AACH,qBAAa,2BAA2B,CAAC,CAAC,CACzC,SAAQ,YAAY,CAAC,kCAAkC,CACvD,YAAW,4BAA4B,CAAC,CAAC,CAAC;IAE1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAC8B;IAE7D,OAAO,CAAC,oBAAoB,CAAa;IAEzC;;;OAGG;gBAEF,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB;IAK/B;;;;;OAKG;IACU,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAgE3D;;;;OAIG;IACI,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,UAA8B,GAAG,CAAC,GAAG,SAAS;IAe5E,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,SAAS;IAK1C,IAAI,IAAI,MAAM,EAAE;IAIvB,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,qBAAqB;IAS5E;;OAEG;cACa,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAexE,SAAS,CAAC,YAAY,IAAI,IAAI;cAEX,mBAAmB,CAAC,kBAAkB,EAAE,yBAAyB,GAAG,IAAI;IAO3F,OAAO,CAAC,cAAc;IAqDtB,OAAO,CAAC,UAAU;IAKlB;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IA2D3B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,KAAK;IAIb;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,GAAG,IAAI;IAWpE,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAQhD"}
@@ -19,6 +19,7 @@ const incomingOpMatchesPlainFormat = (op) => "value" in op;
19
19
  const snapshotFileName = "header";
20
20
  /**
21
21
  * {@inheritDoc IConsensusRegisterCollection}
22
+ * @deprecated Use {@link IConsensusRegisterCollection} for typing and {@link ConsensusRegisterCollectionFactory} to create instances. This implementation class will be removed in a future release.
22
23
  * @legacy @beta
23
24
  */
24
25
  export class ConsensusRegisterCollection extends SharedObject {
@@ -135,9 +136,6 @@ export class ConsensusRegisterCollection extends SharedObject {
135
136
  }
136
137
  }
137
138
  onDisconnect() { }
138
- /**
139
- * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}
140
- */
141
139
  processMessagesCore(messagesCollection) {
142
140
  const { envelope, local, messagesContent } = messagesCollection;
143
141
  for (const messageContent of messagesContent) {
@@ -1 +1 @@
1
- {"version":3,"file":"consensusRegisterCollection.js","sourceRoot":"","sources":["../src/consensusRegisterCollection.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 { bufferToString, createEmitter } from \"@fluid-internal/client-utils\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { MessageType } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tISummaryTreeWithStats,\n\tIRuntimeMessageCollection,\n\tIRuntimeMessagesContent,\n\tISequencedMessageEnvelope,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport {\n\tIFluidSerializer,\n\tSharedObject,\n\tcreateSingleBlobSummary,\n} from \"@fluidframework/shared-object-base/internal\";\n\nimport {\n\tIConsensusRegisterCollection,\n\tIConsensusRegisterCollectionEvents,\n\tReadPolicy,\n} from \"./interfaces.js\";\n\ninterface ILocalData<T> {\n\t// Atomic version\n\tatomic: ILocalRegister<T>;\n\n\t// All concurrent versions awaiting consensus\n\tversions: ILocalRegister<T>[];\n}\n\ninterface ILocalRegister<T> {\n\t// Register value, wrapped for backwards compatibility with < 0.17\n\tvalue: {\n\t\ttype: \"Plain\";\n\t\tvalue: T;\n\t};\n\n\t// The sequence number when last consensus was reached\n\tsequenceNumber: number;\n}\n\nconst newLocalRegister = <T>(sequenceNumber: number, value: T): ILocalRegister<T> => ({\n\tsequenceNumber,\n\tvalue: {\n\t\ttype: \"Plain\",\n\t\tvalue,\n\t},\n});\n\n/**\n * An operation for consensus register collection\n *\n * The value stored in this op is serialized as a string and must be deserialized\n */\ninterface IRegisterOperationSerialized {\n\tkey: string;\n\ttype: \"write\";\n\tserializedValue: string;\n\n\t// Message can be delivered with delay - resubmitted on reconnect.\n\t// As such, refSeq needs to reference seq # at the time op was created,\n\t// not when op was actually sent over wire (ISequencedDocumentMessage.referenceSequenceNumber),\n\t// as client can ingest ops in between.\n\trefSeq: number | undefined;\n}\n\n/**\n * IRegisterOperation format in versions \\< 0.17 and \\>=2.0.0-rc.2.0.0\n *\n * The value stored in this op is _not_ serialized and is stored literally as `T`\n */\ninterface IRegisterOperationPlain<T> {\n\tkey: string;\n\ttype: \"write\";\n\n\tvalue: {\n\t\ttype: \"Plain\";\n\t\tvalue: T;\n\t};\n\n\t// back-compat: for clients prior to 2.0.0-rc.2.0.0, we must also pass in\n\t// the serialized value for them to parse handles correctly. we do not have\n\t// to pay the cost of deserializing this value in newer clients\n\tserializedValue: string;\n\n\t// back-compat: files at rest written with runtime <= 0.13 do not have refSeq\n\trefSeq: number | undefined;\n}\n\n/** Incoming ops could match any of these types */\ntype IIncomingRegisterOperation<T> = IRegisterOperationSerialized | IRegisterOperationPlain<T>;\n\n/** Distinguish between incoming op formats so we know which type it is */\nconst incomingOpMatchesPlainFormat = <T>(op): op is IRegisterOperationPlain<T> =>\n\t\"value\" in op;\n\nconst snapshotFileName = \"header\";\n\ninterface IConsensusRegisterCollectionInternalEvents {\n\t/**\n\t * Emitted when a pending message is rolled back.\n\t * @param rollbackMessageId - A unique identifying number for the pending message.\n\t */\n\tpendingMessageRollback: (rollbackMessageId: number) => void;\n\n\t/**\n\t * Emitted when a pending message is acknowledged.\n\t * @param ackMessageId - A unique identifying number for the pending message.\n\t * @param isWinner - Whether the message won the FWW race to modify the value.\n\t */\n\tpendingMessageAck: (ackMessageId: number, isWinner: boolean) => void;\n}\n\n/**\n * {@inheritDoc IConsensusRegisterCollection}\n * @legacy @beta\n */\nexport class ConsensusRegisterCollection<T>\n\textends SharedObject<IConsensusRegisterCollectionEvents>\n\timplements IConsensusRegisterCollection<T>\n{\n\tprivate readonly data = new Map<string, ILocalData<T>>();\n\tprivate readonly internalEvents =\n\t\tcreateEmitter<IConsensusRegisterCollectionInternalEvents>();\n\n\tprivate nextPendingMessageId: number = 0;\n\n\t/**\n\t * Constructs a new consensus register collection. If the object is non-local an id and service interfaces will\n\t * be provided\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, \"fluid_consensusRegisterCollection_\");\n\t}\n\n\t/**\n\t * Creates a new register or writes a new value.\n\t * Returns a promise that will resolve when the write is acked.\n\t *\n\t * @returns Promise<true> if write was non-concurrent\n\t */\n\tpublic async write(key: string, value: T): Promise<boolean> {\n\t\tif (this.runtime.disposed) {\n\t\t\t// Return false if disposed to signify that we did not write.\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!this.isAttached()) {\n\t\t\tthis.processInboundWrite(key, value, 0, 0, true);\n\t\t\treturn true;\n\t\t}\n\n\t\tconst message: IRegisterOperationPlain<T> = {\n\t\t\tkey,\n\t\t\ttype: \"write\",\n\t\t\tserializedValue: this.stringify(value, this.serializer),\n\t\t\tvalue: {\n\t\t\t\ttype: \"Plain\",\n\t\t\t\tvalue,\n\t\t\t},\n\t\t\trefSeq: this.deltaManager.lastSequenceNumber,\n\t\t};\n\n\t\tconst pendingMessageId = this.nextPendingMessageId++;\n\n\t\t// There are three ways the write promise can resolve:\n\t\t// 1. The write is acked\n\t\t// 2. The write is rolled back\n\t\t// 3. The runtime is disposed\n\t\t// The boolean value returned by the promise is true if the attempted write was ack'd and won, false otherwise.\n\t\treturn new Promise<boolean>((resolve) => {\n\t\t\tconst handleAck = (ackMessageId: number, isWinner: boolean): void => {\n\t\t\t\tif (ackMessageId === pendingMessageId) {\n\t\t\t\t\tresolve(isWinner);\n\t\t\t\t\tremoveListeners();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst handleRollback = (rollbackMessageId: number): void => {\n\t\t\t\tif (rollbackMessageId === pendingMessageId) {\n\t\t\t\t\t// If we rolled back the pending message, resolve the promise with false.\n\t\t\t\t\tresolve(false);\n\t\t\t\t\tremoveListeners();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst handleDisposed = (): void => {\n\t\t\t\tresolve(false);\n\t\t\t\tremoveListeners();\n\t\t\t};\n\n\t\t\tconst removeListeners = (): void => {\n\t\t\t\tthis.internalEvents.off(\"pendingMessageAck\", handleAck);\n\t\t\t\tthis.internalEvents.off(\"pendingMessageRollback\", handleRollback);\n\t\t\t\tthis.runtime.off(\"dispose\", handleDisposed);\n\t\t\t};\n\n\t\t\tthis.internalEvents.on(\"pendingMessageAck\", handleAck);\n\t\t\tthis.internalEvents.on(\"pendingMessageRollback\", handleRollback);\n\t\t\tthis.runtime.on(\"dispose\", handleDisposed);\n\n\t\t\tthis.submitLocalMessage(message, pendingMessageId);\n\t\t});\n\t}\n\n\t/**\n\t * Returns the most recent local value of a register.\n\t * @param key - The key to read\n\t * @param readPolicy - The ReadPolicy to apply. Defaults to Atomic.\n\t */\n\tpublic read(key: string, readPolicy: ReadPolicy = ReadPolicy.Atomic): T | undefined {\n\t\tif (readPolicy === ReadPolicy.Atomic) {\n\t\t\treturn this.readAtomic(key);\n\t\t}\n\n\t\tconst versions = this.readVersions(key);\n\n\t\tif (versions !== undefined) {\n\t\t\t// We don't support deletion. So there should be at least one value.\n\t\t\tassert(versions.length > 0, 0x06c /* \"Value should be undefined or non-empty\" */);\n\n\t\t\treturn versions[versions.length - 1];\n\t\t}\n\t}\n\n\tpublic readVersions(key: string): T[] | undefined {\n\t\tconst data = this.data.get(key);\n\t\treturn data?.versions.map((element: ILocalRegister<T>) => element.value.value);\n\t}\n\n\tpublic keys(): string[] {\n\t\treturn [...this.data.keys()];\n\t}\n\n\tprotected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tconst dataObj: { [key: string]: ILocalData<T> } = {};\n\t\tthis.data.forEach((v, k) => {\n\t\t\tdataObj[k] = v;\n\t\t});\n\n\t\treturn createSingleBlobSummary(snapshotFileName, this.stringify(dataObj, serializer));\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst blob = await storage.readBlob(snapshotFileName);\n\t\tconst header = bufferToString(blob, \"utf8\");\n\t\tconst dataObj = this.parse(header, this.serializer);\n\n\t\tfor (const key of Object.keys(dataObj)) {\n\t\t\tassert(\n\t\t\t\tdataObj[key].atomic?.value.type !== \"Shared\",\n\t\t\t\t0x06d /* \"SharedObjects contained in ConsensusRegisterCollection can no longer be deserialized as of 0.17\" */,\n\t\t\t);\n\n\t\t\tthis.data.set(key, dataObj[key]);\n\t\t}\n\t}\n\n\tprotected onDisconnect(): void {}\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\tif (messageEnvelope.type === MessageType.Operation) {\n\t\t\tconst op = messageContent.contents as IIncomingRegisterOperation<T>;\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"write\": {\n\t\t\t\t\t// backward compatibility: File at rest written with runtime <= 0.13 do not have refSeq\n\t\t\t\t\t// when the refSeq property didn't exist\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\t\t\t\tif (op.refSeq === undefined) {\n\t\t\t\t\t\top.refSeq = messageEnvelope.referenceSequenceNumber;\n\t\t\t\t\t}\n\t\t\t\t\t// Message can be delivered with delay - e.g. resubmitted on reconnect.\n\t\t\t\t\t// Use the refSeq from when the op was created, not when it was transmitted\n\t\t\t\t\tconst refSeqWhenCreated = op.refSeq;\n\t\t\t\t\tassert(\n\t\t\t\t\t\trefSeqWhenCreated <= messageEnvelope.referenceSequenceNumber,\n\t\t\t\t\t\t0x06e /* \"Message's reference sequence number < op's reference sequence number!\" */,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst value = incomingOpMatchesPlainFormat<T>(op)\n\t\t\t\t\t\t? op.value.value\n\t\t\t\t\t\t: (this.parse(op.serializedValue, this.serializer) as T);\n\t\t\t\t\tconst isWinner = this.processInboundWrite(\n\t\t\t\t\t\top.key,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\trefSeqWhenCreated,\n\t\t\t\t\t\tmessageEnvelope.sequenceNumber,\n\t\t\t\t\t\tlocal,\n\t\t\t\t\t);\n\t\t\t\t\tif (local) {\n\t\t\t\t\t\t// Resolve the pending promise for this operation now that we have received an ack for it.\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\ttypeof messageContent.localOpMetadata === \"number\",\n\t\t\t\t\t\t\t0xc0e /* Expect localOpMetadata to be a number */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.internalEvents.emit(\n\t\t\t\t\t\t\t\"pendingMessageAck\",\n\t\t\t\t\t\t\tmessageContent.localOpMetadata,\n\t\t\t\t\t\t\tisWinner,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(op.type);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate readAtomic(key: string): T | undefined {\n\t\tconst data = this.data.get(key);\n\t\treturn data?.atomic.value.value;\n\t}\n\n\t/**\n\t * Process an inbound write op\n\t * @param key - Key that was written to\n\t * @param value - Incoming value\n\t * @param refSeq - RefSeq at the time of write on the remote client\n\t * @param sequenceNumber - Sequence Number of this write op\n\t * @param local - Did this write originate on this client\n\t */\n\tprivate processInboundWrite(\n\t\tkey: string,\n\t\tvalue: T,\n\t\trefSeq: number,\n\t\tsequenceNumber: number,\n\t\tlocal: boolean,\n\t): boolean {\n\t\tlet data = this.data.get(key);\n\t\t// Atomic update if it's a new register or the write was not concurrent,\n\t\t// meaning our state was known to the remote client at the time of write\n\t\tconst isWinner = data === undefined || refSeq >= data.atomic.sequenceNumber;\n\t\tif (isWinner) {\n\t\t\tconst atomicUpdate = newLocalRegister<T>(sequenceNumber, value);\n\t\t\tif (data === undefined) {\n\t\t\t\tdata = {\n\t\t\t\t\tatomic: atomicUpdate,\n\t\t\t\t\tversions: [], // we'll update versions next, leave it empty for now\n\t\t\t\t};\n\t\t\t\tthis.data.set(key, data);\n\t\t\t} else {\n\t\t\t\tdata.atomic = atomicUpdate;\n\t\t\t}\n\t\t} else {\n\t\t\tassert(!!data, 0x06f /* \"data missing for non-atomic inbound update!\" */);\n\t\t}\n\n\t\t// Remove versions that were known to the remote client at the time of write\n\t\twhile (data.versions.length > 0 && refSeq >= data.versions[0].sequenceNumber) {\n\t\t\tdata.versions.shift();\n\t\t}\n\n\t\tconst versionUpdate = newLocalRegister<T>(sequenceNumber, value);\n\n\t\t// Asserts for data integrity\n\t\tif (!this.isAttached()) {\n\t\t\tassert(\n\t\t\t\trefSeq === 0 && sequenceNumber === 0,\n\t\t\t\t0x070 /* \"sequence numbers are expected to be 0 when unattached\" */,\n\t\t\t);\n\t\t} else if (data.versions.length > 0) {\n\t\t\tassert(\n\t\t\t\t// seqNum should always be increasing, except for the case of grouped batches (seqNum will be the same)\n\t\t\t\tsequenceNumber >= data.versions[data.versions.length - 1].sequenceNumber,\n\t\t\t\t0x071 /* \"Versions should naturally be ordered by sequenceNumber\" */,\n\t\t\t);\n\t\t}\n\n\t\t// Push the new element.\n\t\tdata.versions.push(versionUpdate);\n\n\t\t// Raise events at the end, to avoid reentrancy issues\n\t\tif (isWinner) {\n\t\t\tthis.emit(\"atomicChanged\", key, value, local);\n\t\t}\n\t\tthis.emit(\"versionChanged\", key, value, local);\n\n\t\treturn isWinner;\n\t}\n\n\tprivate stringify(value: any, serializer: IFluidSerializer): string {\n\t\treturn serializer.stringify(value, this.handle);\n\t}\n\n\tprivate parse(content: string, serializer: IFluidSerializer): any {\n\t\treturn serializer.parse(content);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.rollback}\n\t * @sealed\n\t */\n\tprotected rollback(content: unknown, localOpMetadata: unknown): void {\n\t\t// We don't need to do anything to roll back CRC, it's safe to just drop\n\t\t// the op on the floor since we don't modify the DDS until the ack.\n\t\t// We emit an internal event so we know to resolve the pending promise.\n\t\tassert(\n\t\t\ttypeof localOpMetadata === \"number\",\n\t\t\t0xc0f /* Expect localOpMetadata to be a number */,\n\t\t);\n\t\tthis.internalEvents.emit(\"pendingMessageRollback\", localOpMetadata);\n\t}\n\n\tprotected applyStashedOp(content: unknown): void {\n\t\tconst op = content as IIncomingRegisterOperation<T>;\n\t\tassert(op.type === \"write\", 0xccc /* Only write ops should be stashed */);\n\t\t// Submit the original op (preserving its refSeq) so we can match the ACK\n\t\t// when it arrives during remote op processing.\n\t\tconst pendingMessageId = this.nextPendingMessageId++;\n\t\tthis.submitLocalMessage(op, pendingMessageId);\n\t}\n}\n"]}
1
+ {"version":3,"file":"consensusRegisterCollection.js","sourceRoot":"","sources":["../src/consensusRegisterCollection.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 { bufferToString, createEmitter } from \"@fluid-internal/client-utils\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { MessageType } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tISummaryTreeWithStats,\n\tIRuntimeMessageCollection,\n\tIRuntimeMessagesContent,\n\tISequencedMessageEnvelope,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport {\n\tIFluidSerializer,\n\tSharedObject,\n\tcreateSingleBlobSummary,\n} from \"@fluidframework/shared-object-base/internal\";\n\nimport {\n\tIConsensusRegisterCollection,\n\tIConsensusRegisterCollectionEvents,\n\tReadPolicy,\n} from \"./interfaces.js\";\n\ninterface ILocalData<T> {\n\t// Atomic version\n\tatomic: ILocalRegister<T>;\n\n\t// All concurrent versions awaiting consensus\n\tversions: ILocalRegister<T>[];\n}\n\ninterface ILocalRegister<T> {\n\t// Register value, wrapped for backwards compatibility with < 0.17\n\tvalue: {\n\t\ttype: \"Plain\";\n\t\tvalue: T;\n\t};\n\n\t// The sequence number when last consensus was reached\n\tsequenceNumber: number;\n}\n\nconst newLocalRegister = <T>(sequenceNumber: number, value: T): ILocalRegister<T> => ({\n\tsequenceNumber,\n\tvalue: {\n\t\ttype: \"Plain\",\n\t\tvalue,\n\t},\n});\n\n/**\n * An operation for consensus register collection\n *\n * The value stored in this op is serialized as a string and must be deserialized\n */\ninterface IRegisterOperationSerialized {\n\tkey: string;\n\ttype: \"write\";\n\tserializedValue: string;\n\n\t// Message can be delivered with delay - resubmitted on reconnect.\n\t// As such, refSeq needs to reference seq # at the time op was created,\n\t// not when op was actually sent over wire (ISequencedDocumentMessage.referenceSequenceNumber),\n\t// as client can ingest ops in between.\n\trefSeq: number | undefined;\n}\n\n/**\n * IRegisterOperation format in versions \\< 0.17 and \\>=2.0.0-rc.2.0.0\n *\n * The value stored in this op is _not_ serialized and is stored literally as `T`\n */\ninterface IRegisterOperationPlain<T> {\n\tkey: string;\n\ttype: \"write\";\n\n\tvalue: {\n\t\ttype: \"Plain\";\n\t\tvalue: T;\n\t};\n\n\t// back-compat: for clients prior to 2.0.0-rc.2.0.0, we must also pass in\n\t// the serialized value for them to parse handles correctly. we do not have\n\t// to pay the cost of deserializing this value in newer clients\n\tserializedValue: string;\n\n\t// back-compat: files at rest written with runtime <= 0.13 do not have refSeq\n\trefSeq: number | undefined;\n}\n\n/** Incoming ops could match any of these types */\ntype IIncomingRegisterOperation<T> = IRegisterOperationSerialized | IRegisterOperationPlain<T>;\n\n/** Distinguish between incoming op formats so we know which type it is */\nconst incomingOpMatchesPlainFormat = <T>(op): op is IRegisterOperationPlain<T> =>\n\t\"value\" in op;\n\nconst snapshotFileName = \"header\";\n\ninterface IConsensusRegisterCollectionInternalEvents {\n\t/**\n\t * Emitted when a pending message is rolled back.\n\t * @param rollbackMessageId - A unique identifying number for the pending message.\n\t */\n\tpendingMessageRollback: (rollbackMessageId: number) => void;\n\n\t/**\n\t * Emitted when a pending message is acknowledged.\n\t * @param ackMessageId - A unique identifying number for the pending message.\n\t * @param isWinner - Whether the message won the FWW race to modify the value.\n\t */\n\tpendingMessageAck: (ackMessageId: number, isWinner: boolean) => void;\n}\n\n/**\n * {@inheritDoc IConsensusRegisterCollection}\n * @deprecated Use {@link IConsensusRegisterCollection} for typing and {@link ConsensusRegisterCollectionFactory} to create instances. This implementation class will be removed in a future release.\n * @legacy @beta\n */\nexport class ConsensusRegisterCollection<T>\n\textends SharedObject<IConsensusRegisterCollectionEvents>\n\timplements IConsensusRegisterCollection<T>\n{\n\tprivate readonly data = new Map<string, ILocalData<T>>();\n\tprivate readonly internalEvents =\n\t\tcreateEmitter<IConsensusRegisterCollectionInternalEvents>();\n\n\tprivate nextPendingMessageId: number = 0;\n\n\t/**\n\t * Constructs a new consensus register collection. If the object is non-local an id and service interfaces will\n\t * be provided\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, \"fluid_consensusRegisterCollection_\");\n\t}\n\n\t/**\n\t * Creates a new register or writes a new value.\n\t * Returns a promise that will resolve when the write is acked.\n\t *\n\t * @returns Promise<true> if write was non-concurrent\n\t */\n\tpublic async write(key: string, value: T): Promise<boolean> {\n\t\tif (this.runtime.disposed) {\n\t\t\t// Return false if disposed to signify that we did not write.\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!this.isAttached()) {\n\t\t\tthis.processInboundWrite(key, value, 0, 0, true);\n\t\t\treturn true;\n\t\t}\n\n\t\tconst message: IRegisterOperationPlain<T> = {\n\t\t\tkey,\n\t\t\ttype: \"write\",\n\t\t\tserializedValue: this.stringify(value, this.serializer),\n\t\t\tvalue: {\n\t\t\t\ttype: \"Plain\",\n\t\t\t\tvalue,\n\t\t\t},\n\t\t\trefSeq: this.deltaManager.lastSequenceNumber,\n\t\t};\n\n\t\tconst pendingMessageId = this.nextPendingMessageId++;\n\n\t\t// There are three ways the write promise can resolve:\n\t\t// 1. The write is acked\n\t\t// 2. The write is rolled back\n\t\t// 3. The runtime is disposed\n\t\t// The boolean value returned by the promise is true if the attempted write was ack'd and won, false otherwise.\n\t\treturn new Promise<boolean>((resolve) => {\n\t\t\tconst handleAck = (ackMessageId: number, isWinner: boolean): void => {\n\t\t\t\tif (ackMessageId === pendingMessageId) {\n\t\t\t\t\tresolve(isWinner);\n\t\t\t\t\tremoveListeners();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst handleRollback = (rollbackMessageId: number): void => {\n\t\t\t\tif (rollbackMessageId === pendingMessageId) {\n\t\t\t\t\t// If we rolled back the pending message, resolve the promise with false.\n\t\t\t\t\tresolve(false);\n\t\t\t\t\tremoveListeners();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst handleDisposed = (): void => {\n\t\t\t\tresolve(false);\n\t\t\t\tremoveListeners();\n\t\t\t};\n\n\t\t\tconst removeListeners = (): void => {\n\t\t\t\tthis.internalEvents.off(\"pendingMessageAck\", handleAck);\n\t\t\t\tthis.internalEvents.off(\"pendingMessageRollback\", handleRollback);\n\t\t\t\tthis.runtime.off(\"dispose\", handleDisposed);\n\t\t\t};\n\n\t\t\tthis.internalEvents.on(\"pendingMessageAck\", handleAck);\n\t\t\tthis.internalEvents.on(\"pendingMessageRollback\", handleRollback);\n\t\t\tthis.runtime.on(\"dispose\", handleDisposed);\n\n\t\t\tthis.submitLocalMessage(message, pendingMessageId);\n\t\t});\n\t}\n\n\t/**\n\t * Returns the most recent local value of a register.\n\t * @param key - The key to read\n\t * @param readPolicy - The ReadPolicy to apply. Defaults to Atomic.\n\t */\n\tpublic read(key: string, readPolicy: ReadPolicy = ReadPolicy.Atomic): T | undefined {\n\t\tif (readPolicy === ReadPolicy.Atomic) {\n\t\t\treturn this.readAtomic(key);\n\t\t}\n\n\t\tconst versions = this.readVersions(key);\n\n\t\tif (versions !== undefined) {\n\t\t\t// We don't support deletion. So there should be at least one value.\n\t\t\tassert(versions.length > 0, 0x06c /* \"Value should be undefined or non-empty\" */);\n\n\t\t\treturn versions[versions.length - 1];\n\t\t}\n\t}\n\n\tpublic readVersions(key: string): T[] | undefined {\n\t\tconst data = this.data.get(key);\n\t\treturn data?.versions.map((element: ILocalRegister<T>) => element.value.value);\n\t}\n\n\tpublic keys(): string[] {\n\t\treturn [...this.data.keys()];\n\t}\n\n\tprotected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tconst dataObj: { [key: string]: ILocalData<T> } = {};\n\t\tthis.data.forEach((v, k) => {\n\t\t\tdataObj[k] = v;\n\t\t});\n\n\t\treturn createSingleBlobSummary(snapshotFileName, this.stringify(dataObj, serializer));\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst blob = await storage.readBlob(snapshotFileName);\n\t\tconst header = bufferToString(blob, \"utf8\");\n\t\tconst dataObj = this.parse(header, this.serializer);\n\n\t\tfor (const key of Object.keys(dataObj)) {\n\t\t\tassert(\n\t\t\t\tdataObj[key].atomic?.value.type !== \"Shared\",\n\t\t\t\t0x06d /* \"SharedObjects contained in ConsensusRegisterCollection can no longer be deserialized as of 0.17\" */,\n\t\t\t);\n\n\t\t\tthis.data.set(key, dataObj[key]);\n\t\t}\n\t}\n\n\tprotected onDisconnect(): void {}\n\n\tprotected override 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\tif (messageEnvelope.type === MessageType.Operation) {\n\t\t\tconst op = messageContent.contents as IIncomingRegisterOperation<T>;\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"write\": {\n\t\t\t\t\t// backward compatibility: File at rest written with runtime <= 0.13 do not have refSeq\n\t\t\t\t\t// when the refSeq property didn't exist\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\t\t\t\tif (op.refSeq === undefined) {\n\t\t\t\t\t\top.refSeq = messageEnvelope.referenceSequenceNumber;\n\t\t\t\t\t}\n\t\t\t\t\t// Message can be delivered with delay - e.g. resubmitted on reconnect.\n\t\t\t\t\t// Use the refSeq from when the op was created, not when it was transmitted\n\t\t\t\t\tconst refSeqWhenCreated = op.refSeq;\n\t\t\t\t\tassert(\n\t\t\t\t\t\trefSeqWhenCreated <= messageEnvelope.referenceSequenceNumber,\n\t\t\t\t\t\t0x06e /* \"Message's reference sequence number < op's reference sequence number!\" */,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst value = incomingOpMatchesPlainFormat<T>(op)\n\t\t\t\t\t\t? op.value.value\n\t\t\t\t\t\t: (this.parse(op.serializedValue, this.serializer) as T);\n\t\t\t\t\tconst isWinner = this.processInboundWrite(\n\t\t\t\t\t\top.key,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\trefSeqWhenCreated,\n\t\t\t\t\t\tmessageEnvelope.sequenceNumber,\n\t\t\t\t\t\tlocal,\n\t\t\t\t\t);\n\t\t\t\t\tif (local) {\n\t\t\t\t\t\t// Resolve the pending promise for this operation now that we have received an ack for it.\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\ttypeof messageContent.localOpMetadata === \"number\",\n\t\t\t\t\t\t\t0xc0e /* Expect localOpMetadata to be a number */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.internalEvents.emit(\n\t\t\t\t\t\t\t\"pendingMessageAck\",\n\t\t\t\t\t\t\tmessageContent.localOpMetadata,\n\t\t\t\t\t\t\tisWinner,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(op.type);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate readAtomic(key: string): T | undefined {\n\t\tconst data = this.data.get(key);\n\t\treturn data?.atomic.value.value;\n\t}\n\n\t/**\n\t * Process an inbound write op\n\t * @param key - Key that was written to\n\t * @param value - Incoming value\n\t * @param refSeq - RefSeq at the time of write on the remote client\n\t * @param sequenceNumber - Sequence Number of this write op\n\t * @param local - Did this write originate on this client\n\t */\n\tprivate processInboundWrite(\n\t\tkey: string,\n\t\tvalue: T,\n\t\trefSeq: number,\n\t\tsequenceNumber: number,\n\t\tlocal: boolean,\n\t): boolean {\n\t\tlet data = this.data.get(key);\n\t\t// Atomic update if it's a new register or the write was not concurrent,\n\t\t// meaning our state was known to the remote client at the time of write\n\t\tconst isWinner = data === undefined || refSeq >= data.atomic.sequenceNumber;\n\t\tif (isWinner) {\n\t\t\tconst atomicUpdate = newLocalRegister<T>(sequenceNumber, value);\n\t\t\tif (data === undefined) {\n\t\t\t\tdata = {\n\t\t\t\t\tatomic: atomicUpdate,\n\t\t\t\t\tversions: [], // we'll update versions next, leave it empty for now\n\t\t\t\t};\n\t\t\t\tthis.data.set(key, data);\n\t\t\t} else {\n\t\t\t\tdata.atomic = atomicUpdate;\n\t\t\t}\n\t\t} else {\n\t\t\tassert(!!data, 0x06f /* \"data missing for non-atomic inbound update!\" */);\n\t\t}\n\n\t\t// Remove versions that were known to the remote client at the time of write\n\t\twhile (data.versions.length > 0 && refSeq >= data.versions[0].sequenceNumber) {\n\t\t\tdata.versions.shift();\n\t\t}\n\n\t\tconst versionUpdate = newLocalRegister<T>(sequenceNumber, value);\n\n\t\t// Asserts for data integrity\n\t\tif (!this.isAttached()) {\n\t\t\tassert(\n\t\t\t\trefSeq === 0 && sequenceNumber === 0,\n\t\t\t\t0x070 /* \"sequence numbers are expected to be 0 when unattached\" */,\n\t\t\t);\n\t\t} else if (data.versions.length > 0) {\n\t\t\tassert(\n\t\t\t\t// seqNum should always be increasing, except for the case of grouped batches (seqNum will be the same)\n\t\t\t\tsequenceNumber >= data.versions[data.versions.length - 1].sequenceNumber,\n\t\t\t\t0x071 /* \"Versions should naturally be ordered by sequenceNumber\" */,\n\t\t\t);\n\t\t}\n\n\t\t// Push the new element.\n\t\tdata.versions.push(versionUpdate);\n\n\t\t// Raise events at the end, to avoid reentrancy issues\n\t\tif (isWinner) {\n\t\t\tthis.emit(\"atomicChanged\", key, value, local);\n\t\t}\n\t\tthis.emit(\"versionChanged\", key, value, local);\n\n\t\treturn isWinner;\n\t}\n\n\tprivate stringify(value: any, serializer: IFluidSerializer): string {\n\t\treturn serializer.stringify(value, this.handle);\n\t}\n\n\tprivate parse(content: string, serializer: IFluidSerializer): any {\n\t\treturn serializer.parse(content);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.rollback}\n\t * @sealed\n\t */\n\tprotected rollback(content: unknown, localOpMetadata: unknown): void {\n\t\t// We don't need to do anything to roll back CRC, it's safe to just drop\n\t\t// the op on the floor since we don't modify the DDS until the ack.\n\t\t// We emit an internal event so we know to resolve the pending promise.\n\t\tassert(\n\t\t\ttypeof localOpMetadata === \"number\",\n\t\t\t0xc0f /* Expect localOpMetadata to be a number */,\n\t\t);\n\t\tthis.internalEvents.emit(\"pendingMessageRollback\", localOpMetadata);\n\t}\n\n\tprotected applyStashedOp(content: unknown): void {\n\t\tconst op = content as IIncomingRegisterOperation<T>;\n\t\tassert(op.type === \"write\", 0xccc /* Only write ops should be stashed */);\n\t\t// Submit the original op (preserving its refSeq) so we can match the ACK\n\t\t// when it arrives during remote op processing.\n\t\tconst pendingMessageId = this.nextPendingMessageId++;\n\t\tthis.submitLocalMessage(op, pendingMessageId);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"consensusRegisterCollectionFactory.d.ts","sourceRoot":"","sources":["../src/consensusRegisterCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,KAAK,eAAe,EACpB,gBAAgB,EAChB,MAAM,gDAAgD,CAAC;AAIxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAG/D;;;GAGG;AACH,qBAAa,kCACZ,YAAW,eAAe,CAAC,4BAA4B,CAAC;IAExD,OAAc,IAAI,SAAqE;IAEvF,gBAAuB,UAAU,EAAE,kBAAkB,CAInD;IAEF,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,UAAU,IAAI,kBAAkB,CAE1C;IAED;;OAEG;IACU,IAAI,CAChB,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,4BAA4B,CAAC;IAMjC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,4BAA4B;CASzF;AAED;;;GAGG;AACH,eAAO,MAAM,2BAA2B,wNAEvC,CAAC;AACF;;;GAGG;AACH,MAAM,MAAM,2BAA2B,CAAC,CAAC,IAAI,4BAA4B,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"consensusRegisterCollectionFactory.d.ts","sourceRoot":"","sources":["../src/consensusRegisterCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,KAAK,eAAe,EACpB,gBAAgB,EAChB,MAAM,gDAAgD,CAAC;AAKxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAG/D;;;GAGG;AACH,qBAAa,kCACZ,YAAW,eAAe,CAAC,4BAA4B,CAAC;IAExD,OAAc,IAAI,SAAqE;IAEvF,gBAAuB,UAAU,EAAE,kBAAkB,CAInD;IAEF,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,UAAU,IAAI,kBAAkB,CAE1C;IAED;;OAEG;IACU,IAAI,CAChB,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,4BAA4B,CAAC;IAOjC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,4BAA4B;CAUzF;AAED;;;GAGG;AACH,eAAO,MAAM,2BAA2B,wNAEvC,CAAC;AACF;;;GAGG;AACH,MAAM,MAAM,2BAA2B,CAAC,CAAC,IAAI,4BAA4B,CAAC,CAAC,CAAC,CAAC"}
@@ -3,6 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { createSharedObjectKind } from "@fluidframework/shared-object-base/internal";
6
+ // eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class in factory
6
7
  import { ConsensusRegisterCollection as ConsensusRegisterCollectionClass } from "./consensusRegisterCollection.js";
7
8
  import { pkgVersion } from "./packageVersion.js";
8
9
  /**
@@ -20,11 +21,13 @@ export class ConsensusRegisterCollectionFactory {
20
21
  * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}
21
22
  */
22
23
  async load(runtime, id, services, attributes) {
24
+ // eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class
23
25
  const collection = new ConsensusRegisterCollectionClass(id, runtime, attributes);
24
26
  await collection.load(services);
25
27
  return collection;
26
28
  }
27
29
  create(document, id) {
30
+ // eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class
28
31
  const collection = new ConsensusRegisterCollectionClass(id, document, ConsensusRegisterCollectionFactory.Attributes);
29
32
  collection.initializeLocal();
30
33
  return collection;
@@ -1 +1 @@
1
- {"version":3,"file":"consensusRegisterCollectionFactory.js","sourceRoot":"","sources":["../src/consensusRegisterCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAErF,OAAO,EAAE,2BAA2B,IAAI,gCAAgC,EAAE,MAAM,kCAAkC,CAAC;AAEnH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;GAGG;AACH,MAAM,OAAO,kCAAkC;IAW9C,IAAW,IAAI;QACd,OAAO,kCAAkC,CAAC,IAAI,CAAC;IAChD,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,kCAAkC,CAAC,UAAU,CAAC;IACtD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI,CAChB,OAA+B,EAC/B,EAAU,EACV,QAA0B,EAC1B,UAA8B;QAE9B,MAAM,UAAU,GAAG,IAAI,gCAAgC,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACjF,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,UAAU,CAAC;IACnB,CAAC;IAEM,MAAM,CAAC,QAAgC,EAAE,EAAU;QACzD,MAAM,UAAU,GAAG,IAAI,gCAAgC,CACtD,EAAE,EACF,QAAQ,EACR,kCAAkC,CAAC,UAAU,CAC7C,CAAC;QACF,UAAU,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC;IACnB,CAAC;;AAtCa,uCAAI,GAAG,iEAAiE,CAAC;AAEhE,6CAAU,GAAuB;IACvD,IAAI,EAAE,kCAAkC,CAAC,IAAI;IAC7C,qBAAqB,EAAE,KAAK;IAC5B,cAAc,EAAE,UAAU;CAC1B,CAAC;AAmCH;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,sBAAsB,CAChE,kCAAkC,CAClC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\ttype IChannelFactory,\n\tIChannelServices,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { createSharedObjectKind } from \"@fluidframework/shared-object-base/internal\";\n\nimport { ConsensusRegisterCollection as ConsensusRegisterCollectionClass } from \"./consensusRegisterCollection.js\";\nimport { IConsensusRegisterCollection } from \"./interfaces.js\";\nimport { pkgVersion } from \"./packageVersion.js\";\n\n/**\n * The factory that defines the consensus queue.\n * @legacy @beta\n */\nexport class ConsensusRegisterCollectionFactory\n\timplements IChannelFactory<IConsensusRegisterCollection>\n{\n\tpublic static Type = \"https://graph.microsoft.com/types/consensus-register-collection\";\n\n\tpublic static readonly Attributes: IChannelAttributes = {\n\t\ttype: ConsensusRegisterCollectionFactory.Type,\n\t\tsnapshotFormatVersion: \"0.1\",\n\t\tpackageVersion: pkgVersion,\n\t};\n\n\tpublic get type(): string {\n\t\treturn ConsensusRegisterCollectionFactory.Type;\n\t}\n\n\tpublic get attributes(): IChannelAttributes {\n\t\treturn ConsensusRegisterCollectionFactory.Attributes;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}\n\t */\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IConsensusRegisterCollection> {\n\t\tconst collection = new ConsensusRegisterCollectionClass(id, runtime, attributes);\n\t\tawait collection.load(services);\n\t\treturn collection;\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): IConsensusRegisterCollection {\n\t\tconst collection = new ConsensusRegisterCollectionClass(\n\t\t\tid,\n\t\t\tdocument,\n\t\t\tConsensusRegisterCollectionFactory.Attributes,\n\t\t);\n\t\tcollection.initializeLocal();\n\t\treturn collection;\n\t}\n}\n\n/**\n * {@inheritDoc IConsensusRegisterCollection}\n * @legacy @beta\n */\nexport const ConsensusRegisterCollection = createSharedObjectKind(\n\tConsensusRegisterCollectionFactory,\n);\n/**\n * Compatibility alias for {@link IConsensusRegisterCollection}.\n * @legacy @beta\n */\nexport type ConsensusRegisterCollection<T> = IConsensusRegisterCollection<T>;\n"]}
1
+ {"version":3,"file":"consensusRegisterCollectionFactory.js","sourceRoot":"","sources":["../src/consensusRegisterCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAErF,mGAAmG;AACnG,OAAO,EAAE,2BAA2B,IAAI,gCAAgC,EAAE,MAAM,kCAAkC,CAAC;AAEnH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;GAGG;AACH,MAAM,OAAO,kCAAkC;IAW9C,IAAW,IAAI;QACd,OAAO,kCAAkC,CAAC,IAAI,CAAC;IAChD,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,kCAAkC,CAAC,UAAU,CAAC;IACtD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI,CAChB,OAA+B,EAC/B,EAAU,EACV,QAA0B,EAC1B,UAA8B;QAE9B,wFAAwF;QACxF,MAAM,UAAU,GAAG,IAAI,gCAAgC,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACjF,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,UAAU,CAAC;IACnB,CAAC;IAEM,MAAM,CAAC,QAAgC,EAAE,EAAU;QACzD,wFAAwF;QACxF,MAAM,UAAU,GAAG,IAAI,gCAAgC,CACtD,EAAE,EACF,QAAQ,EACR,kCAAkC,CAAC,UAAU,CAC7C,CAAC;QACF,UAAU,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC;IACnB,CAAC;;AAxCa,uCAAI,GAAG,iEAAiE,CAAC;AAEhE,6CAAU,GAAuB;IACvD,IAAI,EAAE,kCAAkC,CAAC,IAAI;IAC7C,qBAAqB,EAAE,KAAK;IAC5B,cAAc,EAAE,UAAU;CAC1B,CAAC;AAqCH;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,sBAAsB,CAChE,kCAAkC,CAClC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\ttype IChannelFactory,\n\tIChannelServices,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { createSharedObjectKind } from \"@fluidframework/shared-object-base/internal\";\n\n// eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class in factory\nimport { ConsensusRegisterCollection as ConsensusRegisterCollectionClass } from \"./consensusRegisterCollection.js\";\nimport { IConsensusRegisterCollection } from \"./interfaces.js\";\nimport { pkgVersion } from \"./packageVersion.js\";\n\n/**\n * The factory that defines the consensus queue.\n * @legacy @beta\n */\nexport class ConsensusRegisterCollectionFactory\n\timplements IChannelFactory<IConsensusRegisterCollection>\n{\n\tpublic static Type = \"https://graph.microsoft.com/types/consensus-register-collection\";\n\n\tpublic static readonly Attributes: IChannelAttributes = {\n\t\ttype: ConsensusRegisterCollectionFactory.Type,\n\t\tsnapshotFormatVersion: \"0.1\",\n\t\tpackageVersion: pkgVersion,\n\t};\n\n\tpublic get type(): string {\n\t\treturn ConsensusRegisterCollectionFactory.Type;\n\t}\n\n\tpublic get attributes(): IChannelAttributes {\n\t\treturn ConsensusRegisterCollectionFactory.Attributes;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}\n\t */\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IConsensusRegisterCollection> {\n\t\t// eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class\n\t\tconst collection = new ConsensusRegisterCollectionClass(id, runtime, attributes);\n\t\tawait collection.load(services);\n\t\treturn collection;\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): IConsensusRegisterCollection {\n\t\t// eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class\n\t\tconst collection = new ConsensusRegisterCollectionClass(\n\t\t\tid,\n\t\t\tdocument,\n\t\t\tConsensusRegisterCollectionFactory.Attributes,\n\t\t);\n\t\tcollection.initializeLocal();\n\t\treturn collection;\n\t}\n}\n\n/**\n * {@inheritDoc IConsensusRegisterCollection}\n * @legacy @beta\n */\nexport const ConsensusRegisterCollection = createSharedObjectKind(\n\tConsensusRegisterCollectionFactory,\n);\n/**\n * Compatibility alias for {@link IConsensusRegisterCollection}.\n * @legacy @beta\n */\nexport type ConsensusRegisterCollection<T> = IConsensusRegisterCollection<T>;\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/register-collection";
8
- export declare const pkgVersion = "2.90.0-378676";
8
+ export declare const pkgVersion = "2.91.0";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,wCAAwC,CAAC;AAC7D,eAAO,MAAM,UAAU,kBAAkB,CAAC"}
1
+ {"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,wCAAwC,CAAC;AAC7D,eAAO,MAAM,UAAU,WAAW,CAAC"}
@@ -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/register-collection";
8
- export const pkgVersion = "2.90.0-378676";
8
+ export const pkgVersion = "2.91.0";
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,qCAAqC,CAAC;AAC7D,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/register-collection\";\nexport const pkgVersion = \"2.90.0-378676\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,qCAAqC,CAAC;AAC7D,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,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/register-collection\";\nexport const pkgVersion = \"2.91.0\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/register-collection",
3
- "version": "2.90.0-378676",
3
+ "version": "2.91.0",
4
4
  "description": "Consensus Register",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -81,27 +81,27 @@
81
81
  "temp-directory": "nyc/.nyc_output"
82
82
  },
83
83
  "dependencies": {
84
- "@fluid-internal/client-utils": "2.90.0-378676",
85
- "@fluidframework/core-interfaces": "2.90.0-378676",
86
- "@fluidframework/core-utils": "2.90.0-378676",
87
- "@fluidframework/datastore-definitions": "2.90.0-378676",
88
- "@fluidframework/driver-definitions": "2.90.0-378676",
89
- "@fluidframework/driver-utils": "2.90.0-378676",
90
- "@fluidframework/runtime-definitions": "2.90.0-378676",
91
- "@fluidframework/shared-object-base": "2.90.0-378676"
84
+ "@fluid-internal/client-utils": "~2.91.0",
85
+ "@fluidframework/core-interfaces": "~2.91.0",
86
+ "@fluidframework/core-utils": "~2.91.0",
87
+ "@fluidframework/datastore-definitions": "~2.91.0",
88
+ "@fluidframework/driver-definitions": "~2.91.0",
89
+ "@fluidframework/driver-utils": "~2.91.0",
90
+ "@fluidframework/runtime-definitions": "~2.91.0",
91
+ "@fluidframework/shared-object-base": "~2.91.0"
92
92
  },
93
93
  "devDependencies": {
94
94
  "@arethetypeswrong/cli": "^0.18.2",
95
- "@biomejs/biome": "~1.9.3",
96
- "@fluid-internal/mocha-test-setup": "2.90.0-378676",
97
- "@fluid-private/stochastic-test-utils": "2.90.0-378676",
98
- "@fluid-private/test-dds-utils": "2.90.0-378676",
95
+ "@biomejs/biome": "~2.4.5",
96
+ "@fluid-internal/mocha-test-setup": "~2.91.0",
97
+ "@fluid-private/stochastic-test-utils": "~2.91.0",
98
+ "@fluid-private/test-dds-utils": "~2.91.0",
99
99
  "@fluid-tools/build-cli": "^0.63.0",
100
100
  "@fluidframework/build-common": "^2.0.3",
101
101
  "@fluidframework/build-tools": "^0.63.0",
102
- "@fluidframework/eslint-config-fluid": "2.90.0-378676",
103
- "@fluidframework/register-collection-previous": "npm:@fluidframework/register-collection@2.82.0",
104
- "@fluidframework/test-runtime-utils": "2.90.0-378676",
102
+ "@fluidframework/eslint-config-fluid": "~2.91.0",
103
+ "@fluidframework/register-collection-previous": "npm:@fluidframework/register-collection@2.83.0",
104
+ "@fluidframework/test-runtime-utils": "~2.91.0",
105
105
  "@microsoft/api-extractor": "7.52.11",
106
106
  "@types/mocha": "^10.0.10",
107
107
  "@types/node": "~20.19.30",
@@ -111,9 +111,9 @@
111
111
  "cross-env": "^10.1.0",
112
112
  "eslint": "~9.39.1",
113
113
  "jiti": "^2.6.1",
114
- "mocha": "^10.8.2",
114
+ "mocha": "^11.7.5",
115
115
  "mocha-multi-reporters": "^1.5.1",
116
- "rimraf": "^6.1.2",
116
+ "rimraf": "^6.1.3",
117
117
  "typescript": "~5.4.5"
118
118
  },
119
119
  "typeValidation": {
@@ -122,6 +122,7 @@ interface IConsensusRegisterCollectionInternalEvents {
122
122
 
123
123
  /**
124
124
  * {@inheritDoc IConsensusRegisterCollection}
125
+ * @deprecated Use {@link IConsensusRegisterCollection} for typing and {@link ConsensusRegisterCollectionFactory} to create instances. This implementation class will be removed in a future release.
125
126
  * @legacy @beta
126
127
  */
127
128
  export class ConsensusRegisterCollection<T>
@@ -274,10 +275,7 @@ export class ConsensusRegisterCollection<T>
274
275
 
275
276
  protected onDisconnect(): void {}
276
277
 
277
- /**
278
- * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processMessagesCore}
279
- */
280
- protected processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {
278
+ protected override processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {
281
279
  const { envelope, local, messagesContent } = messagesCollection;
282
280
  for (const messageContent of messagesContent) {
283
281
  this.processMessage(envelope, messageContent, local);
@@ -11,6 +11,7 @@ import {
11
11
  } from "@fluidframework/datastore-definitions/internal";
12
12
  import { createSharedObjectKind } from "@fluidframework/shared-object-base/internal";
13
13
 
14
+ // eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class in factory
14
15
  import { ConsensusRegisterCollection as ConsensusRegisterCollectionClass } from "./consensusRegisterCollection.js";
15
16
  import { IConsensusRegisterCollection } from "./interfaces.js";
16
17
  import { pkgVersion } from "./packageVersion.js";
@@ -47,12 +48,14 @@ export class ConsensusRegisterCollectionFactory
47
48
  services: IChannelServices,
48
49
  attributes: IChannelAttributes,
49
50
  ): Promise<IConsensusRegisterCollection> {
51
+ // eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class
50
52
  const collection = new ConsensusRegisterCollectionClass(id, runtime, attributes);
51
53
  await collection.load(services);
52
54
  return collection;
53
55
  }
54
56
 
55
57
  public create(document: IFluidDataStoreRuntime, id: string): IConsensusRegisterCollection {
58
+ // eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class
56
59
  const collection = new ConsensusRegisterCollectionClass(
57
60
  id,
58
61
  document,
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/register-collection";
9
- export const pkgVersion = "2.90.0-378676";
9
+ export const pkgVersion = "2.91.0";