@fluidframework/register-collection 2.53.1 → 2.60.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.
Files changed (37) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/api-report/{register-collection.legacy.alpha.api.md → register-collection.legacy.beta.api.md} +9 -9
  3. package/dist/consensusRegisterCollection.d.ts +1 -2
  4. package/dist/consensusRegisterCollection.d.ts.map +1 -1
  5. package/dist/consensusRegisterCollection.js +1 -2
  6. package/dist/consensusRegisterCollection.js.map +1 -1
  7. package/dist/consensusRegisterCollectionFactory.d.ts +3 -6
  8. package/dist/consensusRegisterCollectionFactory.d.ts.map +1 -1
  9. package/dist/consensusRegisterCollectionFactory.js +2 -4
  10. package/dist/consensusRegisterCollectionFactory.js.map +1 -1
  11. package/dist/interfaces.d.ts +4 -8
  12. package/dist/interfaces.d.ts.map +1 -1
  13. package/dist/interfaces.js +1 -2
  14. package/dist/interfaces.js.map +1 -1
  15. package/dist/packageVersion.d.ts +1 -1
  16. package/dist/packageVersion.js +1 -1
  17. package/dist/packageVersion.js.map +1 -1
  18. package/lib/consensusRegisterCollection.d.ts +1 -2
  19. package/lib/consensusRegisterCollection.d.ts.map +1 -1
  20. package/lib/consensusRegisterCollection.js +1 -2
  21. package/lib/consensusRegisterCollection.js.map +1 -1
  22. package/lib/consensusRegisterCollectionFactory.d.ts +3 -6
  23. package/lib/consensusRegisterCollectionFactory.d.ts.map +1 -1
  24. package/lib/consensusRegisterCollectionFactory.js +2 -4
  25. package/lib/consensusRegisterCollectionFactory.js.map +1 -1
  26. package/lib/interfaces.d.ts +4 -8
  27. package/lib/interfaces.d.ts.map +1 -1
  28. package/lib/interfaces.js +1 -2
  29. package/lib/interfaces.js.map +1 -1
  30. package/lib/packageVersion.d.ts +1 -1
  31. package/lib/packageVersion.js +1 -1
  32. package/lib/packageVersion.js.map +1 -1
  33. package/package.json +13 -13
  34. package/src/consensusRegisterCollection.ts +1 -2
  35. package/src/consensusRegisterCollectionFactory.ts +3 -6
  36. package/src/interfaces.ts +4 -8
  37. package/src/packageVersion.ts +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # @fluidframework/register-collection
2
2
 
3
+ ## 2.60.0
4
+
5
+ Dependency updates only.
6
+
3
7
  ## 2.53.0
4
8
 
5
9
  Dependency updates only.
@@ -1,16 +1,16 @@
1
- ## Alpha API Report File for "@fluidframework/register-collection"
1
+ ## Beta API Report File for "@fluidframework/register-collection"
2
2
 
3
3
  > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
4
4
 
5
5
  ```ts
6
6
 
7
- // @alpha @legacy
7
+ // @beta @legacy
8
8
  export const ConsensusRegisterCollection: ISharedObjectKind<IConsensusRegisterCollection<any>> & SharedObjectKind<IConsensusRegisterCollection<any>>;
9
9
 
10
- // @alpha @legacy
10
+ // @beta @legacy
11
11
  export type ConsensusRegisterCollection<T> = IConsensusRegisterCollection<T>;
12
12
 
13
- // @alpha @legacy
13
+ // @beta @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)
@@ -32,7 +32,7 @@ export class ConsensusRegisterCollectionClass<T> extends SharedObject<IConsensus
32
32
  write(key: string, value: T): Promise<boolean>;
33
33
  }
34
34
 
35
- // @alpha @legacy
35
+ // @beta @legacy
36
36
  export class ConsensusRegisterCollectionFactory implements IChannelFactory<IConsensusRegisterCollection> {
37
37
  // (undocumented)
38
38
  static readonly Attributes: IChannelAttributes;
@@ -47,7 +47,7 @@ export class ConsensusRegisterCollectionFactory implements IChannelFactory<ICons
47
47
  get type(): string;
48
48
  }
49
49
 
50
- // @alpha @legacy
50
+ // @beta @legacy
51
51
  export interface IConsensusRegisterCollection<T = any> extends ISharedObject<IConsensusRegisterCollectionEvents> {
52
52
  keys(): string[];
53
53
  read(key: string, policy?: ReadPolicy): T | undefined;
@@ -55,16 +55,16 @@ export interface IConsensusRegisterCollection<T = any> extends ISharedObject<ICo
55
55
  write(key: string, value: T): Promise<boolean>;
56
56
  }
57
57
 
58
- // @alpha @legacy
58
+ // @beta @legacy
59
59
  export interface IConsensusRegisterCollectionEvents extends ISharedObjectEvents {
60
60
  // (undocumented)
61
61
  (event: "atomicChanged" | "versionChanged", listener: (key: string, value: any, local: boolean) => void): any;
62
62
  }
63
63
 
64
- // @alpha @deprecated @legacy
64
+ // @beta @deprecated @legacy
65
65
  export type IConsensusRegisterCollectionFactory = IChannelFactory<IConsensusRegisterCollection>;
66
66
 
67
- // @alpha @legacy
67
+ // @beta @legacy
68
68
  export enum ReadPolicy {
69
69
  // (undocumented)
70
70
  Atomic = 0,
@@ -9,8 +9,7 @@ import { IFluidSerializer, SharedObject } from "@fluidframework/shared-object-ba
9
9
  import { IConsensusRegisterCollection, IConsensusRegisterCollectionEvents, ReadPolicy } from "./interfaces.js";
10
10
  /**
11
11
  * {@inheritDoc IConsensusRegisterCollection}
12
- * @legacy
13
- * @alpha
12
+ * @legacy @beta
14
13
  */
15
14
  export declare class ConsensusRegisterCollection<T> extends SharedObject<IConsensusRegisterCollectionEvents> implements IConsensusRegisterCollection<T> {
16
15
  private readonly data;
@@ -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;AACxD,OAAO,EAEN,yBAAyB,EACzB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,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;IAEtB,SAAS,CAAC,WAAW,CACpB,OAAO,EAAE,yBAAyB,EAClC,KAAK,EAAE,OAAO,EACd,eAAe,EAAE,OAAO;IA6CzB,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,IAAI,IAAI;CAGhC"}
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;AACxD,OAAO,EAEN,yBAAyB,EACzB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,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;IAEtB,SAAS,CAAC,WAAW,CACpB,OAAO,EAAE,yBAAyB,EAClC,KAAK,EAAE,OAAO,EACd,eAAe,EAAE,OAAO;IA6CzB,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,IAAI,IAAI;CAGhC"}
@@ -22,8 +22,7 @@ const incomingOpMatchesPlainFormat = (op) => "value" in op;
22
22
  const snapshotFileName = "header";
23
23
  /**
24
24
  * {@inheritDoc IConsensusRegisterCollection}
25
- * @legacy
26
- * @alpha
25
+ * @legacy @beta
27
26
  */
28
27
  class ConsensusRegisterCollection extends internal_3.SharedObject {
29
28
  /**
@@ -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 {\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { ISummaryTreeWithStats } 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\n * @alpha\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) => {\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) => {\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 = () => {\n\t\t\t\tresolve(false);\n\t\t\t\tremoveListeners();\n\t\t\t};\n\n\t\t\tconst removeListeners = () => {\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() {}\n\n\tprotected processCore(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t) {\n\t\tif (message.type === MessageType.Operation) {\n\t\t\tconst op = message.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\tif (op.refSeq === undefined) {\n\t\t\t\t\t\top.refSeq = message.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 <= message.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\tmessage.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 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(\"pendingMessageAck\", localOpMetadata, isWinner);\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(): void {\n\t\t// empty implementation\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 {\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { ISummaryTreeWithStats } 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) => {\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) => {\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 = () => {\n\t\t\t\tresolve(false);\n\t\t\t\tremoveListeners();\n\t\t\t};\n\n\t\t\tconst removeListeners = () => {\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() {}\n\n\tprotected processCore(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t) {\n\t\tif (message.type === MessageType.Operation) {\n\t\t\tconst op = message.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\tif (op.refSeq === undefined) {\n\t\t\t\t\t\top.refSeq = message.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 <= message.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\tmessage.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 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(\"pendingMessageAck\", localOpMetadata, isWinner);\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(): void {\n\t\t// empty implementation\n\t}\n}\n"]}
@@ -6,8 +6,7 @@ import { IChannelAttributes, IFluidDataStoreRuntime, type IChannelFactory, IChan
6
6
  import { IConsensusRegisterCollection } from "./interfaces.js";
7
7
  /**
8
8
  * The factory that defines the consensus queue.
9
- * @legacy
10
- * @alpha
9
+ * @legacy @beta
11
10
  */
12
11
  export declare class ConsensusRegisterCollectionFactory implements IChannelFactory<IConsensusRegisterCollection> {
13
12
  static Type: string;
@@ -22,14 +21,12 @@ export declare class ConsensusRegisterCollectionFactory implements IChannelFacto
22
21
  }
23
22
  /**
24
23
  * {@inheritDoc IConsensusRegisterCollection}
25
- * @legacy
26
- * @alpha
24
+ * @legacy @beta
27
25
  */
28
26
  export declare const ConsensusRegisterCollection: import("@fluidframework/shared-object-base/internal").ISharedObjectKind<IConsensusRegisterCollection<any>> & import("@fluidframework/shared-object-base/internal").SharedObjectKind<IConsensusRegisterCollection<any>>;
29
27
  /**
30
28
  * Compatibility alias for {@link IConsensusRegisterCollection}.
31
- * @legacy
32
- * @alpha
29
+ * @legacy @beta
33
30
  */
34
31
  export type ConsensusRegisterCollection<T> = IConsensusRegisterCollection<T>;
35
32
  //# sourceMappingURL=consensusRegisterCollectionFactory.d.ts.map
@@ -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;;;;GAIG;AACH,qBAAa,kCACZ,YAAW,eAAe,CAAC,4BAA4B,CAAC;IAExD,OAAc,IAAI,SAAqE;IAEvF,gBAAuB,UAAU,EAAE,kBAAkB,CAInD;IAEF,IAAW,IAAI,WAEd;IAED,IAAW,UAAU,uBAEpB;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;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,wNAEvC,CAAC;AACF;;;;GAIG;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;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,WAEd;IAED,IAAW,UAAU,uBAEpB;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"}
@@ -10,8 +10,7 @@ const consensusRegisterCollection_js_1 = require("./consensusRegisterCollection.
10
10
  const packageVersion_js_1 = require("./packageVersion.js");
11
11
  /**
12
12
  * The factory that defines the consensus queue.
13
- * @legacy
14
- * @alpha
13
+ * @legacy @beta
15
14
  */
16
15
  class ConsensusRegisterCollectionFactory {
17
16
  get type() {
@@ -43,8 +42,7 @@ ConsensusRegisterCollectionFactory.Attributes = {
43
42
  };
44
43
  /**
45
44
  * {@inheritDoc IConsensusRegisterCollection}
46
- * @legacy
47
- * @alpha
45
+ * @legacy @beta
48
46
  */
49
47
  exports.ConsensusRegisterCollection = (0, internal_1.createSharedObjectKind)(ConsensusRegisterCollectionFactory);
50
48
  //# sourceMappingURL=consensusRegisterCollectionFactory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"consensusRegisterCollectionFactory.js","sourceRoot":"","sources":["../src/consensusRegisterCollectionFactory.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAQH,0EAAqF;AAErF,qFAAmH;AAEnH,2DAAiD;AAEjD;;;;GAIG;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;;;;GAIG;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\n * @alpha\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() {\n\t\treturn ConsensusRegisterCollectionFactory.Type;\n\t}\n\n\tpublic get attributes() {\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\n * @alpha\n */\nexport const ConsensusRegisterCollection = createSharedObjectKind(\n\tConsensusRegisterCollectionFactory,\n);\n/**\n * Compatibility alias for {@link IConsensusRegisterCollection}.\n * @legacy\n * @alpha\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,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() {\n\t\treturn ConsensusRegisterCollectionFactory.Type;\n\t}\n\n\tpublic get attributes() {\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"]}
@@ -9,15 +9,13 @@ import { ISharedObject, ISharedObjectEvents } from "@fluidframework/shared-objec
9
9
  *
10
10
  * Extends the base IChannelFactory to return a more definite type of IConsensusRegisterCollection
11
11
  * Use for the runtime to create and load distributed data structure by type name of each channel.
12
- * @legacy
13
- * @alpha
12
+ * @legacy @beta
14
13
  * @deprecated Use `IChannelFactory<IConsensusRegisterCollection>`.
15
14
  */
16
15
  export type IConsensusRegisterCollectionFactory = IChannelFactory<IConsensusRegisterCollection>;
17
16
  /**
18
17
  * Events emitted by {@link IConsensusRegisterCollection}.
19
- * @legacy
20
- * @alpha
18
+ * @legacy @beta
21
19
  */
22
20
  export interface IConsensusRegisterCollectionEvents extends ISharedObjectEvents {
23
21
  (event: "atomicChanged" | "versionChanged", listener: (key: string, value: any, local: boolean) => void): any;
@@ -38,8 +36,7 @@ export interface IConsensusRegisterCollectionEvents extends ISharedObjectEvents
38
36
  * the value. So we can safely return the first value.
39
37
  *
40
38
  * LWW: The last write to a key always wins.
41
- * @legacy
42
- * @alpha
39
+ * @legacy @beta
43
40
  */
44
41
  export interface IConsensusRegisterCollection<T = any> extends ISharedObject<IConsensusRegisterCollectionEvents> {
45
42
  /**
@@ -64,8 +61,7 @@ export interface IConsensusRegisterCollection<T = any> extends ISharedObject<ICo
64
61
  }
65
62
  /**
66
63
  * Read policies used when reading the map value.
67
- * @legacy
68
- * @alpha
64
+ * @legacy @beta
69
65
  */
70
66
  export declare enum ReadPolicy {
71
67
  Atomic = 0,
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AACjF,OAAO,EACN,aAAa,EACb,mBAAmB,EACnB,MAAM,6CAA6C,CAAC;AAErD;;;;;;;;GAQG;AACH,MAAM,MAAM,mCAAmC,GAC9C,eAAe,CAAC,4BAA4B,CAAC,CAAC;AAE/C;;;;GAIG;AACH,MAAM,WAAW,kCAAmC,SAAQ,mBAAmB;IAC9E,CACC,KAAK,EAAE,eAAe,GAAG,gBAAgB,EACzC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,OAC1D;CACF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,4BAA4B,CAAC,CAAC,GAAG,GAAG,CACpD,SAAQ,aAAa,CAAC,kCAAkC,CAAC;IACzD;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/C;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC,GAAG,SAAS,CAAC;IAEtD;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;IAE3C;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE,CAAC;CACjB;AAED;;;;GAIG;AACH,oBAAY,UAAU;IAErB,MAAM,IAAA;IAGN,GAAG,IAAA;CACH"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AACjF,OAAO,EACN,aAAa,EACb,mBAAmB,EACnB,MAAM,6CAA6C,CAAC;AAErD;;;;;;;GAOG;AACH,MAAM,MAAM,mCAAmC,GAC9C,eAAe,CAAC,4BAA4B,CAAC,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,kCAAmC,SAAQ,mBAAmB;IAC9E,CACC,KAAK,EAAE,eAAe,GAAG,gBAAgB,EACzC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,OAC1D;CACF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,4BAA4B,CAAC,CAAC,GAAG,GAAG,CACpD,SAAQ,aAAa,CAAC,kCAAkC,CAAC;IACzD;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/C;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC,GAAG,SAAS,CAAC;IAEtD;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;IAE3C;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,oBAAY,UAAU;IAErB,MAAM,IAAA;IAGN,GAAG,IAAA;CACH"}
@@ -7,8 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.ReadPolicy = void 0;
8
8
  /**
9
9
  * Read policies used when reading the map value.
10
- * @legacy
11
- * @alpha
10
+ * @legacy @beta
12
11
  */
13
12
  var ReadPolicy;
14
13
  (function (ReadPolicy) {
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA6EH;;;;GAIG;AACH,IAAY,UAMX;AAND,WAAY,UAAU;IACrB,mFAAmF;IACnF,+CAAM,CAAA;IAEN,2DAA2D;IAC3D,yCAAG,CAAA;AACJ,CAAC,EANW,UAAU,0BAAV,UAAU,QAMrB","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IChannelFactory } from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tISharedObject,\n\tISharedObjectEvents,\n} from \"@fluidframework/shared-object-base/internal\";\n\n/**\n * Consensus Register Collection channel factory interface\n *\n * Extends the base IChannelFactory to return a more definite type of IConsensusRegisterCollection\n * Use for the runtime to create and load distributed data structure by type name of each channel.\n * @legacy\n * @alpha\n * @deprecated Use `IChannelFactory<IConsensusRegisterCollection>`.\n */\nexport type IConsensusRegisterCollectionFactory =\n\tIChannelFactory<IConsensusRegisterCollection>;\n\n/**\n * Events emitted by {@link IConsensusRegisterCollection}.\n * @legacy\n * @alpha\n */\nexport interface IConsensusRegisterCollectionEvents extends ISharedObjectEvents {\n\t(\n\t\tevent: \"atomicChanged\" | \"versionChanged\",\n\t\tlistener: (key: string, value: any, local: boolean) => void,\n\t);\n}\n\n/**\n * A distributed data structure that holds a set of registers with update\n * versions. On concurrent updates, a register internally stores all possible versions of a value by using reference\n * sequence number of the incoming update.\n *\n * Using all the stored versions, we can then distinguish amongst different read policies. Below are the policies\n * we support:\n *\n * Atomic: Atomicity requires a linearizable register. A linearizable register behaves as if there is only a single\n * copy of the data, and that every operation appears to take effect atomically at one point in time. This definition\n * implies that operations are executed in an well-defined order. On a concurrent update, we perform a compare-and-set\n * operation, where we compare a register sequence number with the incoming reference sequence number.\n * The earliest operation overwriting prior sequence numbers wins since every client reaches to an agreement on\n * the value. So we can safely return the first value.\n *\n * LWW: The last write to a key always wins.\n * @legacy\n * @alpha\n */\nexport interface IConsensusRegisterCollection<T = any>\n\textends ISharedObject<IConsensusRegisterCollectionEvents> {\n\t/**\n\t * Attempts to write a register with a value. Returns a promise to indicate the roundtrip completion.\n\t * For a non existent register, it will attempt to create a new register with the specified value.\n\t *\n\t * @returns Promise<true> if write was non-concurrent\n\t */\n\twrite(key: string, value: T): Promise<boolean>;\n\n\t/**\n\t * Retrieves the agreed upon value for the register based on policy. Returns undefined if not present.\n\t */\n\tread(key: string, policy?: ReadPolicy): T | undefined;\n\n\t/**\n\t * Retrives all concurrent versions. Undefined if not present.\n\t */\n\treadVersions(key: string): T[] | undefined;\n\n\t/**\n\t * Returns the keys.\n\t */\n\tkeys(): string[];\n}\n\n/**\n * Read policies used when reading the map value.\n * @legacy\n * @alpha\n */\nexport enum ReadPolicy {\n\t// On a concurrent update, returns the first agreed upon value amongst all clients.\n\tAtomic,\n\n\t// Last writer wins. Simply returns the last written value.\n\tLWW,\n}\n"]}
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA0EH;;;GAGG;AACH,IAAY,UAMX;AAND,WAAY,UAAU;IACrB,mFAAmF;IACnF,+CAAM,CAAA;IAEN,2DAA2D;IAC3D,yCAAG,CAAA;AACJ,CAAC,EANW,UAAU,0BAAV,UAAU,QAMrB","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IChannelFactory } from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tISharedObject,\n\tISharedObjectEvents,\n} from \"@fluidframework/shared-object-base/internal\";\n\n/**\n * Consensus Register Collection channel factory interface\n *\n * Extends the base IChannelFactory to return a more definite type of IConsensusRegisterCollection\n * Use for the runtime to create and load distributed data structure by type name of each channel.\n * @legacy @beta\n * @deprecated Use `IChannelFactory<IConsensusRegisterCollection>`.\n */\nexport type IConsensusRegisterCollectionFactory =\n\tIChannelFactory<IConsensusRegisterCollection>;\n\n/**\n * Events emitted by {@link IConsensusRegisterCollection}.\n * @legacy @beta\n */\nexport interface IConsensusRegisterCollectionEvents extends ISharedObjectEvents {\n\t(\n\t\tevent: \"atomicChanged\" | \"versionChanged\",\n\t\tlistener: (key: string, value: any, local: boolean) => void,\n\t);\n}\n\n/**\n * A distributed data structure that holds a set of registers with update\n * versions. On concurrent updates, a register internally stores all possible versions of a value by using reference\n * sequence number of the incoming update.\n *\n * Using all the stored versions, we can then distinguish amongst different read policies. Below are the policies\n * we support:\n *\n * Atomic: Atomicity requires a linearizable register. A linearizable register behaves as if there is only a single\n * copy of the data, and that every operation appears to take effect atomically at one point in time. This definition\n * implies that operations are executed in an well-defined order. On a concurrent update, we perform a compare-and-set\n * operation, where we compare a register sequence number with the incoming reference sequence number.\n * The earliest operation overwriting prior sequence numbers wins since every client reaches to an agreement on\n * the value. So we can safely return the first value.\n *\n * LWW: The last write to a key always wins.\n * @legacy @beta\n */\nexport interface IConsensusRegisterCollection<T = any>\n\textends ISharedObject<IConsensusRegisterCollectionEvents> {\n\t/**\n\t * Attempts to write a register with a value. Returns a promise to indicate the roundtrip completion.\n\t * For a non existent register, it will attempt to create a new register with the specified value.\n\t *\n\t * @returns Promise<true> if write was non-concurrent\n\t */\n\twrite(key: string, value: T): Promise<boolean>;\n\n\t/**\n\t * Retrieves the agreed upon value for the register based on policy. Returns undefined if not present.\n\t */\n\tread(key: string, policy?: ReadPolicy): T | undefined;\n\n\t/**\n\t * Retrives all concurrent versions. Undefined if not present.\n\t */\n\treadVersions(key: string): T[] | undefined;\n\n\t/**\n\t * Returns the keys.\n\t */\n\tkeys(): string[];\n}\n\n/**\n * Read policies used when reading the map value.\n * @legacy @beta\n */\nexport enum ReadPolicy {\n\t// On a concurrent update, returns the first agreed upon value amongst all clients.\n\tAtomic,\n\n\t// Last writer wins. Simply returns the last written value.\n\tLWW,\n}\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/register-collection";
8
- export declare const pkgVersion = "2.53.1";
8
+ export declare const pkgVersion = "2.60.0";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -8,5 +8,5 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.pkgVersion = exports.pkgName = void 0;
10
10
  exports.pkgName = "@fluidframework/register-collection";
11
- exports.pkgVersion = "2.53.1";
11
+ exports.pkgVersion = "2.60.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,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.53.1\";\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.60.0\";\n"]}
@@ -9,8 +9,7 @@ import { IFluidSerializer, SharedObject } from "@fluidframework/shared-object-ba
9
9
  import { IConsensusRegisterCollection, IConsensusRegisterCollectionEvents, ReadPolicy } from "./interfaces.js";
10
10
  /**
11
11
  * {@inheritDoc IConsensusRegisterCollection}
12
- * @legacy
13
- * @alpha
12
+ * @legacy @beta
14
13
  */
15
14
  export declare class ConsensusRegisterCollection<T> extends SharedObject<IConsensusRegisterCollectionEvents> implements IConsensusRegisterCollection<T> {
16
15
  private readonly data;
@@ -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;AACxD,OAAO,EAEN,yBAAyB,EACzB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,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;IAEtB,SAAS,CAAC,WAAW,CACpB,OAAO,EAAE,yBAAyB,EAClC,KAAK,EAAE,OAAO,EACd,eAAe,EAAE,OAAO;IA6CzB,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,IAAI,IAAI;CAGhC"}
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;AACxD,OAAO,EAEN,yBAAyB,EACzB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,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;IAEtB,SAAS,CAAC,WAAW,CACpB,OAAO,EAAE,yBAAyB,EAClC,KAAK,EAAE,OAAO,EACd,eAAe,EAAE,OAAO;IA6CzB,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,IAAI,IAAI;CAGhC"}
@@ -19,8 +19,7 @@ const incomingOpMatchesPlainFormat = (op) => "value" in op;
19
19
  const snapshotFileName = "header";
20
20
  /**
21
21
  * {@inheritDoc IConsensusRegisterCollection}
22
- * @legacy
23
- * @alpha
22
+ * @legacy @beta
24
23
  */
25
24
  export class ConsensusRegisterCollection extends SharedObject {
26
25
  /**
@@ -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 {\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { ISummaryTreeWithStats } 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\n * @alpha\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) => {\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) => {\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 = () => {\n\t\t\t\tresolve(false);\n\t\t\t\tremoveListeners();\n\t\t\t};\n\n\t\t\tconst removeListeners = () => {\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() {}\n\n\tprotected processCore(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t) {\n\t\tif (message.type === MessageType.Operation) {\n\t\t\tconst op = message.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\tif (op.refSeq === undefined) {\n\t\t\t\t\t\top.refSeq = message.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 <= message.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\tmessage.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 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(\"pendingMessageAck\", localOpMetadata, isWinner);\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(): void {\n\t\t// empty implementation\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 {\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { ISummaryTreeWithStats } 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) => {\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) => {\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 = () => {\n\t\t\t\tresolve(false);\n\t\t\t\tremoveListeners();\n\t\t\t};\n\n\t\t\tconst removeListeners = () => {\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() {}\n\n\tprotected processCore(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t) {\n\t\tif (message.type === MessageType.Operation) {\n\t\t\tconst op = message.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\tif (op.refSeq === undefined) {\n\t\t\t\t\t\top.refSeq = message.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 <= message.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\tmessage.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 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(\"pendingMessageAck\", localOpMetadata, isWinner);\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(): void {\n\t\t// empty implementation\n\t}\n}\n"]}
@@ -6,8 +6,7 @@ import { IChannelAttributes, IFluidDataStoreRuntime, type IChannelFactory, IChan
6
6
  import { IConsensusRegisterCollection } from "./interfaces.js";
7
7
  /**
8
8
  * The factory that defines the consensus queue.
9
- * @legacy
10
- * @alpha
9
+ * @legacy @beta
11
10
  */
12
11
  export declare class ConsensusRegisterCollectionFactory implements IChannelFactory<IConsensusRegisterCollection> {
13
12
  static Type: string;
@@ -22,14 +21,12 @@ export declare class ConsensusRegisterCollectionFactory implements IChannelFacto
22
21
  }
23
22
  /**
24
23
  * {@inheritDoc IConsensusRegisterCollection}
25
- * @legacy
26
- * @alpha
24
+ * @legacy @beta
27
25
  */
28
26
  export declare const ConsensusRegisterCollection: import("@fluidframework/shared-object-base/internal").ISharedObjectKind<IConsensusRegisterCollection<any>> & import("@fluidframework/shared-object-base/internal").SharedObjectKind<IConsensusRegisterCollection<any>>;
29
27
  /**
30
28
  * Compatibility alias for {@link IConsensusRegisterCollection}.
31
- * @legacy
32
- * @alpha
29
+ * @legacy @beta
33
30
  */
34
31
  export type ConsensusRegisterCollection<T> = IConsensusRegisterCollection<T>;
35
32
  //# sourceMappingURL=consensusRegisterCollectionFactory.d.ts.map
@@ -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;;;;GAIG;AACH,qBAAa,kCACZ,YAAW,eAAe,CAAC,4BAA4B,CAAC;IAExD,OAAc,IAAI,SAAqE;IAEvF,gBAAuB,UAAU,EAAE,kBAAkB,CAInD;IAEF,IAAW,IAAI,WAEd;IAED,IAAW,UAAU,uBAEpB;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;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,wNAEvC,CAAC;AACF;;;;GAIG;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;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,WAEd;IAED,IAAW,UAAU,uBAEpB;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"}
@@ -7,8 +7,7 @@ import { ConsensusRegisterCollection as ConsensusRegisterCollectionClass } from
7
7
  import { pkgVersion } from "./packageVersion.js";
8
8
  /**
9
9
  * The factory that defines the consensus queue.
10
- * @legacy
11
- * @alpha
10
+ * @legacy @beta
12
11
  */
13
12
  export class ConsensusRegisterCollectionFactory {
14
13
  get type() {
@@ -39,8 +38,7 @@ ConsensusRegisterCollectionFactory.Attributes = {
39
38
  };
40
39
  /**
41
40
  * {@inheritDoc IConsensusRegisterCollection}
42
- * @legacy
43
- * @alpha
41
+ * @legacy @beta
44
42
  */
45
43
  export const ConsensusRegisterCollection = createSharedObjectKind(ConsensusRegisterCollectionFactory);
46
44
  //# sourceMappingURL=consensusRegisterCollectionFactory.js.map
@@ -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;;;;GAIG;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;;;;GAIG;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\n * @alpha\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() {\n\t\treturn ConsensusRegisterCollectionFactory.Type;\n\t}\n\n\tpublic get attributes() {\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\n * @alpha\n */\nexport const ConsensusRegisterCollection = createSharedObjectKind(\n\tConsensusRegisterCollectionFactory,\n);\n/**\n * Compatibility alias for {@link IConsensusRegisterCollection}.\n * @legacy\n * @alpha\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,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() {\n\t\treturn ConsensusRegisterCollectionFactory.Type;\n\t}\n\n\tpublic get attributes() {\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"]}
@@ -9,15 +9,13 @@ import { ISharedObject, ISharedObjectEvents } from "@fluidframework/shared-objec
9
9
  *
10
10
  * Extends the base IChannelFactory to return a more definite type of IConsensusRegisterCollection
11
11
  * Use for the runtime to create and load distributed data structure by type name of each channel.
12
- * @legacy
13
- * @alpha
12
+ * @legacy @beta
14
13
  * @deprecated Use `IChannelFactory<IConsensusRegisterCollection>`.
15
14
  */
16
15
  export type IConsensusRegisterCollectionFactory = IChannelFactory<IConsensusRegisterCollection>;
17
16
  /**
18
17
  * Events emitted by {@link IConsensusRegisterCollection}.
19
- * @legacy
20
- * @alpha
18
+ * @legacy @beta
21
19
  */
22
20
  export interface IConsensusRegisterCollectionEvents extends ISharedObjectEvents {
23
21
  (event: "atomicChanged" | "versionChanged", listener: (key: string, value: any, local: boolean) => void): any;
@@ -38,8 +36,7 @@ export interface IConsensusRegisterCollectionEvents extends ISharedObjectEvents
38
36
  * the value. So we can safely return the first value.
39
37
  *
40
38
  * LWW: The last write to a key always wins.
41
- * @legacy
42
- * @alpha
39
+ * @legacy @beta
43
40
  */
44
41
  export interface IConsensusRegisterCollection<T = any> extends ISharedObject<IConsensusRegisterCollectionEvents> {
45
42
  /**
@@ -64,8 +61,7 @@ export interface IConsensusRegisterCollection<T = any> extends ISharedObject<ICo
64
61
  }
65
62
  /**
66
63
  * Read policies used when reading the map value.
67
- * @legacy
68
- * @alpha
64
+ * @legacy @beta
69
65
  */
70
66
  export declare enum ReadPolicy {
71
67
  Atomic = 0,
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AACjF,OAAO,EACN,aAAa,EACb,mBAAmB,EACnB,MAAM,6CAA6C,CAAC;AAErD;;;;;;;;GAQG;AACH,MAAM,MAAM,mCAAmC,GAC9C,eAAe,CAAC,4BAA4B,CAAC,CAAC;AAE/C;;;;GAIG;AACH,MAAM,WAAW,kCAAmC,SAAQ,mBAAmB;IAC9E,CACC,KAAK,EAAE,eAAe,GAAG,gBAAgB,EACzC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,OAC1D;CACF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,4BAA4B,CAAC,CAAC,GAAG,GAAG,CACpD,SAAQ,aAAa,CAAC,kCAAkC,CAAC;IACzD;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/C;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC,GAAG,SAAS,CAAC;IAEtD;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;IAE3C;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE,CAAC;CACjB;AAED;;;;GAIG;AACH,oBAAY,UAAU;IAErB,MAAM,IAAA;IAGN,GAAG,IAAA;CACH"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AACjF,OAAO,EACN,aAAa,EACb,mBAAmB,EACnB,MAAM,6CAA6C,CAAC;AAErD;;;;;;;GAOG;AACH,MAAM,MAAM,mCAAmC,GAC9C,eAAe,CAAC,4BAA4B,CAAC,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,kCAAmC,SAAQ,mBAAmB;IAC9E,CACC,KAAK,EAAE,eAAe,GAAG,gBAAgB,EACzC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,OAC1D;CACF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,4BAA4B,CAAC,CAAC,GAAG,GAAG,CACpD,SAAQ,aAAa,CAAC,kCAAkC,CAAC;IACzD;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/C;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC,GAAG,SAAS,CAAC;IAEtD;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;IAE3C;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,oBAAY,UAAU;IAErB,MAAM,IAAA;IAGN,GAAG,IAAA;CACH"}
package/lib/interfaces.js CHANGED
@@ -4,8 +4,7 @@
4
4
  */
5
5
  /**
6
6
  * Read policies used when reading the map value.
7
- * @legacy
8
- * @alpha
7
+ * @legacy @beta
9
8
  */
10
9
  export var ReadPolicy;
11
10
  (function (ReadPolicy) {
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6EH;;;;GAIG;AACH,MAAM,CAAN,IAAY,UAMX;AAND,WAAY,UAAU;IACrB,mFAAmF;IACnF,+CAAM,CAAA;IAEN,2DAA2D;IAC3D,yCAAG,CAAA;AACJ,CAAC,EANW,UAAU,KAAV,UAAU,QAMrB","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IChannelFactory } from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tISharedObject,\n\tISharedObjectEvents,\n} from \"@fluidframework/shared-object-base/internal\";\n\n/**\n * Consensus Register Collection channel factory interface\n *\n * Extends the base IChannelFactory to return a more definite type of IConsensusRegisterCollection\n * Use for the runtime to create and load distributed data structure by type name of each channel.\n * @legacy\n * @alpha\n * @deprecated Use `IChannelFactory<IConsensusRegisterCollection>`.\n */\nexport type IConsensusRegisterCollectionFactory =\n\tIChannelFactory<IConsensusRegisterCollection>;\n\n/**\n * Events emitted by {@link IConsensusRegisterCollection}.\n * @legacy\n * @alpha\n */\nexport interface IConsensusRegisterCollectionEvents extends ISharedObjectEvents {\n\t(\n\t\tevent: \"atomicChanged\" | \"versionChanged\",\n\t\tlistener: (key: string, value: any, local: boolean) => void,\n\t);\n}\n\n/**\n * A distributed data structure that holds a set of registers with update\n * versions. On concurrent updates, a register internally stores all possible versions of a value by using reference\n * sequence number of the incoming update.\n *\n * Using all the stored versions, we can then distinguish amongst different read policies. Below are the policies\n * we support:\n *\n * Atomic: Atomicity requires a linearizable register. A linearizable register behaves as if there is only a single\n * copy of the data, and that every operation appears to take effect atomically at one point in time. This definition\n * implies that operations are executed in an well-defined order. On a concurrent update, we perform a compare-and-set\n * operation, where we compare a register sequence number with the incoming reference sequence number.\n * The earliest operation overwriting prior sequence numbers wins since every client reaches to an agreement on\n * the value. So we can safely return the first value.\n *\n * LWW: The last write to a key always wins.\n * @legacy\n * @alpha\n */\nexport interface IConsensusRegisterCollection<T = any>\n\textends ISharedObject<IConsensusRegisterCollectionEvents> {\n\t/**\n\t * Attempts to write a register with a value. Returns a promise to indicate the roundtrip completion.\n\t * For a non existent register, it will attempt to create a new register with the specified value.\n\t *\n\t * @returns Promise<true> if write was non-concurrent\n\t */\n\twrite(key: string, value: T): Promise<boolean>;\n\n\t/**\n\t * Retrieves the agreed upon value for the register based on policy. Returns undefined if not present.\n\t */\n\tread(key: string, policy?: ReadPolicy): T | undefined;\n\n\t/**\n\t * Retrives all concurrent versions. Undefined if not present.\n\t */\n\treadVersions(key: string): T[] | undefined;\n\n\t/**\n\t * Returns the keys.\n\t */\n\tkeys(): string[];\n}\n\n/**\n * Read policies used when reading the map value.\n * @legacy\n * @alpha\n */\nexport enum ReadPolicy {\n\t// On a concurrent update, returns the first agreed upon value amongst all clients.\n\tAtomic,\n\n\t// Last writer wins. Simply returns the last written value.\n\tLWW,\n}\n"]}
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA0EH;;;GAGG;AACH,MAAM,CAAN,IAAY,UAMX;AAND,WAAY,UAAU;IACrB,mFAAmF;IACnF,+CAAM,CAAA;IAEN,2DAA2D;IAC3D,yCAAG,CAAA;AACJ,CAAC,EANW,UAAU,KAAV,UAAU,QAMrB","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IChannelFactory } from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tISharedObject,\n\tISharedObjectEvents,\n} from \"@fluidframework/shared-object-base/internal\";\n\n/**\n * Consensus Register Collection channel factory interface\n *\n * Extends the base IChannelFactory to return a more definite type of IConsensusRegisterCollection\n * Use for the runtime to create and load distributed data structure by type name of each channel.\n * @legacy @beta\n * @deprecated Use `IChannelFactory<IConsensusRegisterCollection>`.\n */\nexport type IConsensusRegisterCollectionFactory =\n\tIChannelFactory<IConsensusRegisterCollection>;\n\n/**\n * Events emitted by {@link IConsensusRegisterCollection}.\n * @legacy @beta\n */\nexport interface IConsensusRegisterCollectionEvents extends ISharedObjectEvents {\n\t(\n\t\tevent: \"atomicChanged\" | \"versionChanged\",\n\t\tlistener: (key: string, value: any, local: boolean) => void,\n\t);\n}\n\n/**\n * A distributed data structure that holds a set of registers with update\n * versions. On concurrent updates, a register internally stores all possible versions of a value by using reference\n * sequence number of the incoming update.\n *\n * Using all the stored versions, we can then distinguish amongst different read policies. Below are the policies\n * we support:\n *\n * Atomic: Atomicity requires a linearizable register. A linearizable register behaves as if there is only a single\n * copy of the data, and that every operation appears to take effect atomically at one point in time. This definition\n * implies that operations are executed in an well-defined order. On a concurrent update, we perform a compare-and-set\n * operation, where we compare a register sequence number with the incoming reference sequence number.\n * The earliest operation overwriting prior sequence numbers wins since every client reaches to an agreement on\n * the value. So we can safely return the first value.\n *\n * LWW: The last write to a key always wins.\n * @legacy @beta\n */\nexport interface IConsensusRegisterCollection<T = any>\n\textends ISharedObject<IConsensusRegisterCollectionEvents> {\n\t/**\n\t * Attempts to write a register with a value. Returns a promise to indicate the roundtrip completion.\n\t * For a non existent register, it will attempt to create a new register with the specified value.\n\t *\n\t * @returns Promise<true> if write was non-concurrent\n\t */\n\twrite(key: string, value: T): Promise<boolean>;\n\n\t/**\n\t * Retrieves the agreed upon value for the register based on policy. Returns undefined if not present.\n\t */\n\tread(key: string, policy?: ReadPolicy): T | undefined;\n\n\t/**\n\t * Retrives all concurrent versions. Undefined if not present.\n\t */\n\treadVersions(key: string): T[] | undefined;\n\n\t/**\n\t * Returns the keys.\n\t */\n\tkeys(): string[];\n}\n\n/**\n * Read policies used when reading the map value.\n * @legacy @beta\n */\nexport enum ReadPolicy {\n\t// On a concurrent update, returns the first agreed upon value amongst all clients.\n\tAtomic,\n\n\t// Last writer wins. Simply returns the last written value.\n\tLWW,\n}\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/register-collection";
8
- export declare const pkgVersion = "2.53.1";
8
+ export declare const pkgVersion = "2.60.0";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export const pkgName = "@fluidframework/register-collection";
8
- export const pkgVersion = "2.53.1";
8
+ export const pkgVersion = "2.60.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,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.53.1\";\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.60.0\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/register-collection",
3
- "version": "2.53.1",
3
+ "version": "2.60.0",
4
4
  "description": "Consensus Register",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -69,26 +69,26 @@
69
69
  "temp-directory": "nyc/.nyc_output"
70
70
  },
71
71
  "dependencies": {
72
- "@fluid-internal/client-utils": "~2.53.1",
73
- "@fluidframework/core-interfaces": "~2.53.1",
74
- "@fluidframework/core-utils": "~2.53.1",
75
- "@fluidframework/datastore-definitions": "~2.53.1",
76
- "@fluidframework/driver-definitions": "~2.53.1",
77
- "@fluidframework/driver-utils": "~2.53.1",
78
- "@fluidframework/runtime-definitions": "~2.53.1",
79
- "@fluidframework/shared-object-base": "~2.53.1"
72
+ "@fluid-internal/client-utils": "~2.60.0",
73
+ "@fluidframework/core-interfaces": "~2.60.0",
74
+ "@fluidframework/core-utils": "~2.60.0",
75
+ "@fluidframework/datastore-definitions": "~2.60.0",
76
+ "@fluidframework/driver-definitions": "~2.60.0",
77
+ "@fluidframework/driver-utils": "~2.60.0",
78
+ "@fluidframework/runtime-definitions": "~2.60.0",
79
+ "@fluidframework/shared-object-base": "~2.60.0"
80
80
  },
81
81
  "devDependencies": {
82
82
  "@arethetypeswrong/cli": "^0.17.1",
83
83
  "@biomejs/biome": "~1.9.3",
84
- "@fluid-internal/mocha-test-setup": "~2.53.1",
85
- "@fluid-private/test-dds-utils": "~2.53.1",
84
+ "@fluid-internal/mocha-test-setup": "~2.60.0",
85
+ "@fluid-private/test-dds-utils": "~2.60.0",
86
86
  "@fluid-tools/build-cli": "^0.57.0",
87
87
  "@fluidframework/build-common": "^2.0.3",
88
88
  "@fluidframework/build-tools": "^0.57.0",
89
- "@fluidframework/eslint-config-fluid": "^5.7.4",
89
+ "@fluidframework/eslint-config-fluid": "^6.0.0",
90
90
  "@fluidframework/register-collection-previous": "npm:@fluidframework/register-collection@2.53.0",
91
- "@fluidframework/test-runtime-utils": "~2.53.1",
91
+ "@fluidframework/test-runtime-utils": "~2.60.0",
92
92
  "@microsoft/api-extractor": "7.52.8",
93
93
  "@types/mocha": "^10.0.10",
94
94
  "@types/node": "^18.19.0",
@@ -120,8 +120,7 @@ interface IConsensusRegisterCollectionInternalEvents {
120
120
 
121
121
  /**
122
122
  * {@inheritDoc IConsensusRegisterCollection}
123
- * @legacy
124
- * @alpha
123
+ * @legacy @beta
125
124
  */
126
125
  export class ConsensusRegisterCollection<T>
127
126
  extends SharedObject<IConsensusRegisterCollectionEvents>
@@ -17,8 +17,7 @@ import { pkgVersion } from "./packageVersion.js";
17
17
 
18
18
  /**
19
19
  * The factory that defines the consensus queue.
20
- * @legacy
21
- * @alpha
20
+ * @legacy @beta
22
21
  */
23
22
  export class ConsensusRegisterCollectionFactory
24
23
  implements IChannelFactory<IConsensusRegisterCollection>
@@ -66,15 +65,13 @@ export class ConsensusRegisterCollectionFactory
66
65
 
67
66
  /**
68
67
  * {@inheritDoc IConsensusRegisterCollection}
69
- * @legacy
70
- * @alpha
68
+ * @legacy @beta
71
69
  */
72
70
  export const ConsensusRegisterCollection = createSharedObjectKind(
73
71
  ConsensusRegisterCollectionFactory,
74
72
  );
75
73
  /**
76
74
  * Compatibility alias for {@link IConsensusRegisterCollection}.
77
- * @legacy
78
- * @alpha
75
+ * @legacy @beta
79
76
  */
80
77
  export type ConsensusRegisterCollection<T> = IConsensusRegisterCollection<T>;
package/src/interfaces.ts CHANGED
@@ -14,8 +14,7 @@ import {
14
14
  *
15
15
  * Extends the base IChannelFactory to return a more definite type of IConsensusRegisterCollection
16
16
  * Use for the runtime to create and load distributed data structure by type name of each channel.
17
- * @legacy
18
- * @alpha
17
+ * @legacy @beta
19
18
  * @deprecated Use `IChannelFactory<IConsensusRegisterCollection>`.
20
19
  */
21
20
  export type IConsensusRegisterCollectionFactory =
@@ -23,8 +22,7 @@ export type IConsensusRegisterCollectionFactory =
23
22
 
24
23
  /**
25
24
  * Events emitted by {@link IConsensusRegisterCollection}.
26
- * @legacy
27
- * @alpha
25
+ * @legacy @beta
28
26
  */
29
27
  export interface IConsensusRegisterCollectionEvents extends ISharedObjectEvents {
30
28
  (
@@ -49,8 +47,7 @@ export interface IConsensusRegisterCollectionEvents extends ISharedObjectEvents
49
47
  * the value. So we can safely return the first value.
50
48
  *
51
49
  * LWW: The last write to a key always wins.
52
- * @legacy
53
- * @alpha
50
+ * @legacy @beta
54
51
  */
55
52
  export interface IConsensusRegisterCollection<T = any>
56
53
  extends ISharedObject<IConsensusRegisterCollectionEvents> {
@@ -80,8 +77,7 @@ export interface IConsensusRegisterCollection<T = any>
80
77
 
81
78
  /**
82
79
  * Read policies used when reading the map value.
83
- * @legacy
84
- * @alpha
80
+ * @legacy @beta
85
81
  */
86
82
  export enum ReadPolicy {
87
83
  // On a concurrent update, returns the first agreed upon value amongst all clients.
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/register-collection";
9
- export const pkgVersion = "2.53.1";
9
+ export const pkgVersion = "2.60.0";