@fluidframework/register-collection 2.0.0-rc.3.0.3 → 2.0.0-rc.4.0.1

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 (47) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/api-report/register-collection.api.md +11 -10
  3. package/dist/consensusRegisterCollection.d.ts +0 -15
  4. package/dist/consensusRegisterCollection.d.ts.map +1 -1
  5. package/dist/consensusRegisterCollection.js +1 -20
  6. package/dist/consensusRegisterCollection.js.map +1 -1
  7. package/dist/consensusRegisterCollectionFactory.d.ts +13 -3
  8. package/dist/consensusRegisterCollectionFactory.d.ts.map +1 -1
  9. package/dist/consensusRegisterCollectionFactory.js +7 -1
  10. package/dist/consensusRegisterCollectionFactory.js.map +1 -1
  11. package/dist/index.d.ts +2 -2
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +3 -2
  14. package/dist/index.js.map +1 -1
  15. package/dist/interfaces.d.ts +3 -8
  16. package/dist/interfaces.d.ts.map +1 -1
  17. package/dist/interfaces.js.map +1 -1
  18. package/dist/legacy.d.ts +2 -1
  19. package/dist/packageVersion.d.ts +1 -1
  20. package/dist/packageVersion.js +1 -1
  21. package/dist/packageVersion.js.map +1 -1
  22. package/lib/consensusRegisterCollection.d.ts +0 -15
  23. package/lib/consensusRegisterCollection.d.ts.map +1 -1
  24. package/lib/consensusRegisterCollection.js +1 -20
  25. package/lib/consensusRegisterCollection.js.map +1 -1
  26. package/lib/consensusRegisterCollectionFactory.d.ts +13 -3
  27. package/lib/consensusRegisterCollectionFactory.d.ts.map +1 -1
  28. package/lib/consensusRegisterCollectionFactory.js +9 -3
  29. package/lib/consensusRegisterCollectionFactory.js.map +1 -1
  30. package/lib/index.d.ts +2 -2
  31. package/lib/index.d.ts.map +1 -1
  32. package/lib/index.js +2 -2
  33. package/lib/index.js.map +1 -1
  34. package/lib/interfaces.d.ts +3 -8
  35. package/lib/interfaces.d.ts.map +1 -1
  36. package/lib/interfaces.js.map +1 -1
  37. package/lib/legacy.d.ts +2 -1
  38. package/lib/packageVersion.d.ts +1 -1
  39. package/lib/packageVersion.js +1 -1
  40. package/lib/packageVersion.js.map +1 -1
  41. package/lib/tsdoc-metadata.json +1 -1
  42. package/package.json +26 -17
  43. package/src/consensusRegisterCollection.ts +1 -25
  44. package/src/consensusRegisterCollectionFactory.ts +22 -5
  45. package/src/index.ts +5 -2
  46. package/src/interfaces.ts +3 -19
  47. package/src/packageVersion.ts +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @fluidframework/register-collection
2
2
 
3
+ ## 2.0.0-rc.4.0.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Deprecated members of IFluidHandle are split off into new IFluidHandleInternal interface [96872186d0](https://github.com/microsoft/FluidFramework/commit/96872186d0d0f245c1fece7d19b3743e501679b6)
8
+
9
+ Split IFluidHandle into two interfaces, `IFluidHandle` and `IFluidHandleInternal`.
10
+ Code depending on the previously deprecated members of IFluidHandle can access them by using `toFluidHandleInternal` from `@fluidframework/runtime-utils/legacy`.
11
+
12
+ External implementation of the `IFluidHandle` interface are not supported: this change makes the typing better convey this using the `ErasedType` pattern.
13
+ Any existing and previously working, and now broken, external implementations of `IFluidHandle` should still work at runtime, but will need some unsafe type casts to compile.
14
+ Such handle implementation may break in the future and thus should be replaced with use of handles produced by the Fluid Framework client packages.
15
+
3
16
  ## 2.0.0-rc.3.0.0
4
17
 
5
18
  ### Major Changes
@@ -13,16 +13,21 @@ import { IFluidSerializer } from '@fluidframework/shared-object-base';
13
13
  import { ISequencedDocumentMessage } from '@fluidframework/protocol-definitions';
14
14
  import { ISharedObject } from '@fluidframework/shared-object-base';
15
15
  import { ISharedObjectEvents } from '@fluidframework/shared-object-base';
16
+ import { ISharedObjectKind } from '@fluidframework/shared-object-base/internal';
16
17
  import { ISummaryTreeWithStats } from '@fluidframework/runtime-definitions';
17
18
  import { SharedObject } from '@fluidframework/shared-object-base/internal';
18
19
 
19
20
  // @alpha
20
- export class ConsensusRegisterCollection<T> extends SharedObject<IConsensusRegisterCollectionEvents> implements IConsensusRegisterCollection<T> {
21
+ export const ConsensusRegisterCollection: ISharedObjectKind<IConsensusRegisterCollection<any>>;
22
+
23
+ // @alpha
24
+ export type ConsensusRegisterCollection<T> = IConsensusRegisterCollection<T>;
25
+
26
+ // @alpha
27
+ export class ConsensusRegisterCollectionClass<T> extends SharedObject<IConsensusRegisterCollectionEvents> implements IConsensusRegisterCollection<T> {
21
28
  constructor(id: string, runtime: IFluidDataStoreRuntime, attributes: IChannelAttributes);
22
29
  // (undocumented)
23
30
  protected applyStashedOp(): void;
24
- static create<T>(runtime: IFluidDataStoreRuntime, id?: string): ConsensusRegisterCollection<T>;
25
- static getFactory(): ConsensusRegisterCollectionFactory;
26
31
  // (undocumented)
27
32
  keys(): string[];
28
33
  protected loadCore(storage: IChannelStorageService): Promise<void>;
@@ -39,7 +44,7 @@ export class ConsensusRegisterCollection<T> extends SharedObject<IConsensusRegis
39
44
  }
40
45
 
41
46
  // @alpha
42
- export class ConsensusRegisterCollectionFactory implements IConsensusRegisterCollectionFactory {
47
+ export class ConsensusRegisterCollectionFactory implements IChannelFactory<IConsensusRegisterCollection> {
43
48
  // (undocumented)
44
49
  static readonly Attributes: IChannelAttributes;
45
50
  // (undocumented)
@@ -67,12 +72,8 @@ export interface IConsensusRegisterCollectionEvents extends ISharedObjectEvents
67
72
  (event: "atomicChanged" | "versionChanged", listener: (key: string, value: any, local: boolean) => void): any;
68
73
  }
69
74
 
70
- // @alpha
71
- export interface IConsensusRegisterCollectionFactory extends IChannelFactory {
72
- // (undocumented)
73
- create(document: IFluidDataStoreRuntime, id: string): IConsensusRegisterCollection;
74
- load(document: IFluidDataStoreRuntime, id: string, services: IChannelServices, attributes: IChannelAttributes): Promise<IConsensusRegisterCollection>;
75
- }
75
+ // @alpha @deprecated
76
+ export type IConsensusRegisterCollectionFactory = IChannelFactory<IConsensusRegisterCollection>;
76
77
 
77
78
  // @alpha
78
79
  export enum ReadPolicy {
@@ -7,27 +7,12 @@ import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions"
7
7
  import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
8
8
  import { IFluidSerializer } from "@fluidframework/shared-object-base";
9
9
  import { SharedObject } from "@fluidframework/shared-object-base/internal";
10
- import { ConsensusRegisterCollectionFactory } from "./consensusRegisterCollectionFactory.js";
11
10
  import { IConsensusRegisterCollection, IConsensusRegisterCollectionEvents, ReadPolicy } from "./interfaces.js";
12
11
  /**
13
12
  * {@inheritDoc IConsensusRegisterCollection}
14
13
  * @alpha
15
14
  */
16
15
  export declare class ConsensusRegisterCollection<T> extends SharedObject<IConsensusRegisterCollectionEvents> implements IConsensusRegisterCollection<T> {
17
- /**
18
- * Create a new consensus register collection
19
- *
20
- * @param runtime - data store runtime the new consensus register collection belongs to
21
- * @param id - optional name of the consensus register collection
22
- * @returns newly create consensus register collection (but not attached yet)
23
- */
24
- static create<T>(runtime: IFluidDataStoreRuntime, id?: string): ConsensusRegisterCollection<T>;
25
- /**
26
- * Get a factory for ConsensusRegisterCollection to register with the data store.
27
- *
28
- * @returns a factory that creates and load ConsensusRegisterCollection
29
- */
30
- static getFactory(): ConsensusRegisterCollectionFactory;
31
16
  private readonly data;
32
17
  /**
33
18
  * Constructs a new consensus register collection. If the object is non-local an id and service interfaces will
@@ -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,uCAAuC,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,YAAY,EAA2B,MAAM,6CAA6C,CAAC;AAEpG,OAAO,EAAE,kCAAkC,EAAE,MAAM,yCAAyC,CAAC;AAC7F,OAAO,EACN,4BAA4B,EAC5B,kCAAkC,EAClC,UAAU,EACV,MAAM,iBAAiB,CAAC;AAgFzB;;;GAGG;AACH,qBAAa,2BAA2B,CAAC,CAAC,CACzC,SAAQ,YAAY,CAAC,kCAAkC,CACvD,YAAW,4BAA4B,CAAC,CAAC,CAAC;IAE1C;;;;;;OAMG;WACW,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC,EAAE,MAAM;IAOpE;;;;OAIG;WACW,UAAU;IAIxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IAEzD;;;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;IAyB3D;;;;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;IA0CzB,OAAO,CAAC,UAAU;IAKlB;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IA2D3B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,KAAK;IAIb,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,uCAAuC,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,YAAY,EAA2B,MAAM,6CAA6C,CAAC;AAEpG,OAAO,EACN,4BAA4B,EAC5B,kCAAkC,EAClC,UAAU,EACV,MAAM,iBAAiB,CAAC;AAgFzB;;;GAGG;AACH,qBAAa,2BAA2B,CAAC,CAAC,CACzC,SAAQ,YAAY,CAAC,kCAAkC,CACvD,YAAW,4BAA4B,CAAC,CAAC,CAAC;IAE1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IAEzD;;;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;IAyB3D;;;;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;IA0CzB,OAAO,CAAC,UAAU;IAKlB;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IA2D3B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,KAAK;IAIb,SAAS,CAAC,cAAc,IAAI,IAAI;CAGhC"}
@@ -9,7 +9,6 @@ const client_utils_1 = require("@fluid-internal/client-utils");
9
9
  const internal_1 = require("@fluidframework/core-utils/internal");
10
10
  const protocol_definitions_1 = require("@fluidframework/protocol-definitions");
11
11
  const internal_2 = require("@fluidframework/shared-object-base/internal");
12
- const consensusRegisterCollectionFactory_js_1 = require("./consensusRegisterCollectionFactory.js");
13
12
  const interfaces_js_1 = require("./interfaces.js");
14
13
  const newLocalRegister = (sequenceNumber, value) => ({
15
14
  sequenceNumber,
@@ -26,24 +25,6 @@ const snapshotFileName = "header";
26
25
  * @alpha
27
26
  */
28
27
  class ConsensusRegisterCollection extends internal_2.SharedObject {
29
- /**
30
- * Create a new consensus register collection
31
- *
32
- * @param runtime - data store runtime the new consensus register collection belongs to
33
- * @param id - optional name of the consensus register collection
34
- * @returns newly create consensus register collection (but not attached yet)
35
- */
36
- static create(runtime, id) {
37
- return runtime.createChannel(id, consensusRegisterCollectionFactory_js_1.ConsensusRegisterCollectionFactory.Type);
38
- }
39
- /**
40
- * Get a factory for ConsensusRegisterCollection to register with the data store.
41
- *
42
- * @returns a factory that creates and load ConsensusRegisterCollection
43
- */
44
- static getFactory() {
45
- return new consensusRegisterCollectionFactory_js_1.ConsensusRegisterCollectionFactory();
46
- }
47
28
  /**
48
29
  * Constructs a new consensus register collection. If the object is non-local an id and service interfaces will
49
30
  * be provided
@@ -71,7 +52,7 @@ class ConsensusRegisterCollection extends internal_2.SharedObject {
71
52
  type: "Plain",
72
53
  value,
73
54
  },
74
- refSeq: this.runtime.deltaManager.lastSequenceNumber,
55
+ refSeq: this.deltaManager.lastSequenceNumber,
75
56
  };
76
57
  return this.newAckBasedPromise((resolve) => {
77
58
  // Send the resolve function as the localOpMetadata. This will be provided back to us when the
@@ -1 +1 @@
1
- {"version":3,"file":"consensusRegisterCollection.js","sourceRoot":"","sources":["../src/consensusRegisterCollection.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+DAA8D;AAC9D,kEAA8E;AAM9E,+EAA8F;AAG9F,0EAAoG;AAEpG,mGAA6F;AAC7F,mDAIyB;AAqBzB,MAAM,gBAAgB,GAAG,CAAI,cAAsB,EAAE,KAAQ,EAAqB,EAAE,CAAC,CAAC;IACrF,cAAc;IACd,KAAK,EAAE;QACN,IAAI,EAAE,OAAO;QACb,KAAK;KACL;CACD,CAAC,CAAC;AA6CH,0EAA0E;AAC1E,MAAM,4BAA4B,GAAG,CAAI,EAAE,EAAoC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC;AAKhG,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAElC;;;GAGG;AACH,MAAa,2BACZ,SAAQ,uBAAgD;IAGxD;;;;;;OAMG;IACI,MAAM,CAAC,MAAM,CAAI,OAA+B,EAAE,EAAW;QACnE,OAAO,OAAO,CAAC,aAAa,CAC3B,EAAE,EACF,0EAAkC,CAAC,IAAI,CACL,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,UAAU;QACvB,OAAO,IAAI,0EAAkC,EAAE,CAAC;IACjD,CAAC;IAID;;;OAGG;IACH,YACC,EAAU,EACV,OAA+B,EAC/B,UAA8B;QAE9B,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,oCAAoC,CAAC,CAAC;QAXrD,SAAI,GAAG,IAAI,GAAG,EAAyB,CAAC;IAYzD,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,KAAQ;QACvC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;YACvB,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC;SACZ;QAED,MAAM,OAAO,GAA+B;YAC3C,GAAG;YACH,IAAI,EAAE,OAAO;YACb,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;YACvD,KAAK,EAAE;gBACN,IAAI,EAAE,OAAO;gBACb,KAAK;aACL;YACD,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,kBAAkB;SACpD,CAAC;QAEF,OAAO,IAAI,CAAC,kBAAkB,CAAU,CAAC,OAAO,EAAE,EAAE;YACnD,8FAA8F;YAC9F,eAAe;YACf,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1C,kGAAkG;QACnG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACI,IAAI,CAAC,GAAW,EAAE,aAAyB,0BAAU,CAAC,MAAM;QAClE,IAAI,UAAU,KAAK,0BAAU,CAAC,MAAM,EAAE;YACrC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SAC5B;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC3B,oEAAoE;YACpE,IAAA,iBAAM,EAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAElF,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SACrC;IACF,CAAC;IAEM,YAAY,CAAC,GAAW;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAA0B,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC;IAEM,IAAI;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;IAES,aAAa,CAAC,UAA4B;QACnD,MAAM,OAAO,GAAqC,EAAE,CAAC;QACrD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,OAAO,IAAA,kCAAuB,EAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IACvF,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,QAAQ,CAAC,OAA+B;QACvD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAA,6BAAc,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAEpD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YACvC,IAAA,iBAAM,EACL,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,QAAQ,EAC5C,KAAK,CAAC,uGAAuG,CAC7G,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;SACjC;IACF,CAAC;IAES,YAAY,KAAI,CAAC;IAEjB,WAAW,CACpB,OAAkC,EAClC,KAAc,EACd,eAAwB;QAExB,IAAI,OAAO,CAAC,IAAI,KAAK,kCAAW,CAAC,SAAS,EAAE;YAC3C,MAAM,EAAE,GAAG,OAAO,CAAC,QAAyC,CAAC;YAC7D,QAAQ,EAAE,CAAC,IAAI,EAAE;gBAChB,KAAK,OAAO,CAAC,CAAC;oBACb,uFAAuF;oBACvF,wCAAwC;oBACxC,IAAI,EAAE,CAAC,MAAM,KAAK,SAAS,EAAE;wBAC5B,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;qBAC5C;oBACD,uEAAuE;oBACvE,2EAA2E;oBAC3E,MAAM,iBAAiB,GAAG,EAAE,CAAC,MAAM,CAAC;oBACpC,IAAA,iBAAM,EACL,iBAAiB,IAAI,OAAO,CAAC,uBAAuB,EACpD,KAAK,CAAC,6EAA6E,CACnF,CAAC;oBAEF,MAAM,KAAK,GAAG,4BAA4B,CAAI,EAAE,CAAC;wBAChD,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK;wBAChB,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,CAAO,CAAC;oBAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CACtC,EAAE,CAAC,GAAG,EACN,KAAK,EACL,iBAAiB,EACjB,OAAO,CAAC,cAAc,EACtB,KAAK,CACL,CAAC;oBACF,IAAI,KAAK,EAAE;wBACV,0FAA0F;wBAC1F,MAAM,OAAO,GAAG,eAAiC,CAAC;wBAClD,OAAO,CAAC,MAAM,CAAC,CAAC;qBAChB;oBACD,MAAM;iBACN;gBACD;oBACC,IAAA,0BAAe,EAAC,EAAE,CAAC,IAAI,CAAC,CAAC;aAC1B;SACD;IACF,CAAC;IAEO,UAAU,CAAC,GAAW;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;IACjC,CAAC;IAED;;;;;;;OAOG;IACK,mBAAmB,CAC1B,GAAW,EACX,KAAQ,EACR,MAAc,EACd,cAAsB,EACtB,KAAc;QAEd,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,wEAAwE;QACxE,wEAAwE;QACxE,MAAM,MAAM,GAAG,IAAI,KAAK,SAAS,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;QAC1E,IAAI,MAAM,EAAE;YACX,MAAM,YAAY,GAAG,gBAAgB,CAAI,cAAc,EAAE,KAAK,CAAC,CAAC;YAChE,IAAI,IAAI,KAAK,SAAS,EAAE;gBACvB,IAAI,GAAG;oBACN,MAAM,EAAE,YAAY;oBACpB,QAAQ,EAAE,EAAE,EAAE,qDAAqD;iBACnE,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;aACzB;iBAAM;gBACN,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;aAC3B;SACD;aAAM;YACN,IAAA,iBAAM,EAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,mDAAmD,CAAC,CAAC;SAC1E;QAED,4EAA4E;QAC5E,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE;YAC7E,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;SACtB;QAED,MAAM,aAAa,GAAG,gBAAgB,CAAI,cAAc,EAAE,KAAK,CAAC,CAAC;QAEjE,6BAA6B;QAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;YACvB,IAAA,iBAAM,EACL,MAAM,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,EACpC,KAAK,CAAC,6DAA6D,CACnE,CAAC;SACF;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACpC,IAAA,iBAAM;YACL,uGAAuG;YACvG,cAAc,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc,EACxE,KAAK,CAAC,8DAA8D,CACpE,CAAC;SACF;QAED,wBAAwB;QACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAElC,sDAAsD;QACtD,IAAI,MAAM,EAAE;YACX,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SAC9C;QACD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAE/C,OAAO,MAAM,CAAC;IACf,CAAC;IAEO,SAAS,CAAC,KAAU,EAAE,UAA4B;QACzD,OAAO,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAEO,KAAK,CAAC,OAAe,EAAE,UAA4B;QAC1D,OAAO,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAES,cAAc;QACvB,uBAAuB;IACxB,CAAC;CACD;AAlQD,kEAkQC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { bufferToString } from \"@fluid-internal/client-utils\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelAttributes,\n\tIChannelStorageService,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { SharedObject, createSingleBlobSummary } from \"@fluidframework/shared-object-base/internal\";\n\nimport { ConsensusRegisterCollectionFactory } from \"./consensusRegisterCollectionFactory.js\";\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> => \"value\" in op;\n\n/** The type of the resolve function to call after the local operation is ack'd */\ntype PendingResolve = (winner: boolean) => void;\n\nconst snapshotFileName = \"header\";\n\n/**\n * {@inheritDoc IConsensusRegisterCollection}\n * @alpha\n */\nexport class ConsensusRegisterCollection<T>\n\textends SharedObject<IConsensusRegisterCollectionEvents>\n\timplements IConsensusRegisterCollection<T>\n{\n\t/**\n\t * Create a new consensus register collection\n\t *\n\t * @param runtime - data store runtime the new consensus register collection belongs to\n\t * @param id - optional name of the consensus register collection\n\t * @returns newly create consensus register collection (but not attached yet)\n\t */\n\tpublic static create<T>(runtime: IFluidDataStoreRuntime, id?: string) {\n\t\treturn runtime.createChannel(\n\t\t\tid,\n\t\t\tConsensusRegisterCollectionFactory.Type,\n\t\t) as ConsensusRegisterCollection<T>;\n\t}\n\n\t/**\n\t * Get a factory for ConsensusRegisterCollection to register with the data store.\n\t *\n\t * @returns a factory that creates and load ConsensusRegisterCollection\n\t */\n\tpublic static getFactory() {\n\t\treturn new ConsensusRegisterCollectionFactory();\n\t}\n\n\tprivate readonly data = new Map<string, ILocalData<T>>();\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.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.runtime.deltaManager.lastSequenceNumber,\n\t\t};\n\n\t\treturn this.newAckBasedPromise<boolean>((resolve) => {\n\t\t\t// Send the resolve function as the localOpMetadata. This will be provided back to us when the\n\t\t\t// op is ack'd.\n\t\t\tthis.submitLocalMessage(message, resolve);\n\t\t\t// If we fail due to runtime being disposed, it's better to return false then unhandled exception.\n\t\t}).catch((error) => false);\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 winner = 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\tconst resolve = localOpMetadata as PendingResolve;\n\t\t\t\t\t\tresolve(winner);\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 winner = data === undefined || refSeq >= data.atomic.sequenceNumber;\n\t\tif (winner) {\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 (winner) {\n\t\t\tthis.emit(\"atomicChanged\", key, value, local);\n\t\t}\n\t\tthis.emit(\"versionChanged\", key, value, local);\n\n\t\treturn winner;\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\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 } from \"@fluid-internal/client-utils\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelAttributes,\n\tIChannelStorageService,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { SharedObject, createSingleBlobSummary } 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> => \"value\" in op;\n\n/** The type of the resolve function to call after the local operation is ack'd */\ntype PendingResolve = (winner: boolean) => void;\n\nconst snapshotFileName = \"header\";\n\n/**\n * {@inheritDoc IConsensusRegisterCollection}\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\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.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\treturn this.newAckBasedPromise<boolean>((resolve) => {\n\t\t\t// Send the resolve function as the localOpMetadata. This will be provided back to us when the\n\t\t\t// op is ack'd.\n\t\t\tthis.submitLocalMessage(message, resolve);\n\t\t\t// If we fail due to runtime being disposed, it's better to return false then unhandled exception.\n\t\t}).catch((error) => false);\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 winner = 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\tconst resolve = localOpMetadata as PendingResolve;\n\t\t\t\t\t\tresolve(winner);\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 winner = data === undefined || refSeq >= data.atomic.sequenceNumber;\n\t\tif (winner) {\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 (winner) {\n\t\t\tthis.emit(\"atomicChanged\", key, value, local);\n\t\t}\n\t\tthis.emit(\"versionChanged\", key, value, local);\n\n\t\treturn winner;\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\tprotected applyStashedOp(): void {\n\t\t// empty implementation\n\t}\n}\n"]}
@@ -2,13 +2,13 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IChannelAttributes, IChannelServices, IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
6
- import { IConsensusRegisterCollection, IConsensusRegisterCollectionFactory } from "./interfaces.js";
5
+ import { IChannelAttributes, IChannelServices, IFluidDataStoreRuntime, type IChannelFactory } from "@fluidframework/datastore-definitions";
6
+ import { IConsensusRegisterCollection } from "./interfaces.js";
7
7
  /**
8
8
  * The factory that defines the consensus queue.
9
9
  * @alpha
10
10
  */
11
- export declare class ConsensusRegisterCollectionFactory implements IConsensusRegisterCollectionFactory {
11
+ export declare class ConsensusRegisterCollectionFactory implements IChannelFactory<IConsensusRegisterCollection> {
12
12
  static Type: string;
13
13
  static readonly Attributes: IChannelAttributes;
14
14
  get type(): string;
@@ -19,4 +19,14 @@ export declare class ConsensusRegisterCollectionFactory implements IConsensusReg
19
19
  load(runtime: IFluidDataStoreRuntime, id: string, services: IChannelServices, attributes: IChannelAttributes): Promise<IConsensusRegisterCollection>;
20
20
  create(document: IFluidDataStoreRuntime, id: string): IConsensusRegisterCollection;
21
21
  }
22
+ /**
23
+ * {@inheritDoc IConsensusRegisterCollection}
24
+ * @alpha
25
+ */
26
+ export declare const ConsensusRegisterCollection: import("@fluidframework/shared-object-base/internal").ISharedObjectKind<IConsensusRegisterCollection<any>>;
27
+ /**
28
+ * Compatibility alias for {@link IConsensusRegisterCollection}.
29
+ * @alpha
30
+ */
31
+ export type ConsensusRegisterCollection<T> = IConsensusRegisterCollection<T>;
22
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,gBAAgB,EAChB,sBAAsB,EACtB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EAAE,4BAA4B,EAAE,mCAAmC,EAAE,MAAM,iBAAiB,CAAC;AAGpG;;;GAGG;AACH,qBAAa,kCAAmC,YAAW,mCAAmC;IAC7F,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"}
1
+ {"version":3,"file":"consensusRegisterCollectionFactory.d.ts","sourceRoot":"","sources":["../src/consensusRegisterCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,eAAe,EACpB,MAAM,uCAAuC,CAAC;AAI/C,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,4GAEvC,CAAC;AACF;;;GAGG;AACH,MAAM,MAAM,2BAA2B,CAAC,CAAC,IAAI,4BAA4B,CAAC,CAAC,CAAC,CAAC"}
@@ -4,7 +4,8 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.ConsensusRegisterCollectionFactory = void 0;
7
+ exports.ConsensusRegisterCollection = exports.ConsensusRegisterCollectionFactory = void 0;
8
+ const internal_1 = require("@fluidframework/shared-object-base/internal");
8
9
  const consensusRegisterCollection_js_1 = require("./consensusRegisterCollection.js");
9
10
  const packageVersion_js_1 = require("./packageVersion.js");
10
11
  /**
@@ -39,4 +40,9 @@ ConsensusRegisterCollectionFactory.Attributes = {
39
40
  snapshotFormatVersion: "0.1",
40
41
  packageVersion: packageVersion_js_1.pkgVersion,
41
42
  };
43
+ /**
44
+ * {@inheritDoc IConsensusRegisterCollection}
45
+ * @alpha
46
+ */
47
+ exports.ConsensusRegisterCollection = (0, internal_1.createSharedObjectKind)(ConsensusRegisterCollectionFactory);
42
48
  //# sourceMappingURL=consensusRegisterCollectionFactory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"consensusRegisterCollectionFactory.js","sourceRoot":"","sources":["../src/consensusRegisterCollectionFactory.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAQH,qFAA+E;AAE/E,2DAAiD;AAEjD;;;GAGG;AACH,MAAa,kCAAkC;IAS9C,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,4DAA2B,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAC5E,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,4DAA2B,CACjD,EAAE,EACF,QAAQ,EACR,kCAAkC,CAAC,UAAU,CAC7C,CAAC;QACF,UAAU,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC;IACnB,CAAC;;AAvCF,gFAwCC;AAvCc,uCAAI,GAAG,iEAAiE,CAAC;AAEhE,6CAAU,GAAuB;IACvD,IAAI,EAAE,kCAAkC,CAAC,IAAI;IAC7C,qBAAqB,EAAE,KAAK;IAC5B,cAAc,EAAE,8BAAU;CAC1B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIChannelAttributes,\n\tIChannelServices,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\n\nimport { ConsensusRegisterCollection } from \"./consensusRegisterCollection.js\";\nimport { IConsensusRegisterCollection, IConsensusRegisterCollectionFactory } from \"./interfaces.js\";\nimport { pkgVersion } from \"./packageVersion.js\";\n\n/**\n * The factory that defines the consensus queue.\n * @alpha\n */\nexport class ConsensusRegisterCollectionFactory implements IConsensusRegisterCollectionFactory {\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 ConsensusRegisterCollection(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 ConsensusRegisterCollection(\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"]}
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\tIChannelServices,\n\tIFluidDataStoreRuntime,\n\ttype IChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\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 * @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 * @alpha\n */\nexport const ConsensusRegisterCollection = createSharedObjectKind(\n\tConsensusRegisterCollectionFactory,\n);\n/**\n * Compatibility alias for {@link IConsensusRegisterCollection}.\n * @alpha\n */\nexport type ConsensusRegisterCollection<T> = IConsensusRegisterCollection<T>;\n"]}
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- export { ConsensusRegisterCollection } from "./consensusRegisterCollection.js";
6
- export { ConsensusRegisterCollectionFactory } from "./consensusRegisterCollectionFactory.js";
5
+ export { ConsensusRegisterCollection as ConsensusRegisterCollectionClass } from "./consensusRegisterCollection.js";
6
+ export { ConsensusRegisterCollectionFactory, ConsensusRegisterCollection, } from "./consensusRegisterCollectionFactory.js";
7
7
  export { IConsensusRegisterCollection, IConsensusRegisterCollectionEvents, IConsensusRegisterCollectionFactory, ReadPolicy, } from "./interfaces.js";
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,kCAAkC,EAAE,MAAM,yCAAyC,CAAC;AAC7F,OAAO,EACN,4BAA4B,EAC5B,kCAAkC,EAClC,mCAAmC,EACnC,UAAU,GACV,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,2BAA2B,IAAI,gCAAgC,EAAE,MAAM,kCAAkC,CAAC;AACnH,OAAO,EACN,kCAAkC,EAClC,2BAA2B,GAC3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACN,4BAA4B,EAC5B,kCAAkC,EAClC,mCAAmC,EACnC,UAAU,GACV,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -4,11 +4,12 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.ReadPolicy = exports.ConsensusRegisterCollectionFactory = exports.ConsensusRegisterCollection = void 0;
7
+ exports.ReadPolicy = exports.ConsensusRegisterCollection = exports.ConsensusRegisterCollectionFactory = exports.ConsensusRegisterCollectionClass = void 0;
8
8
  var consensusRegisterCollection_js_1 = require("./consensusRegisterCollection.js");
9
- Object.defineProperty(exports, "ConsensusRegisterCollection", { enumerable: true, get: function () { return consensusRegisterCollection_js_1.ConsensusRegisterCollection; } });
9
+ Object.defineProperty(exports, "ConsensusRegisterCollectionClass", { enumerable: true, get: function () { return consensusRegisterCollection_js_1.ConsensusRegisterCollection; } });
10
10
  var consensusRegisterCollectionFactory_js_1 = require("./consensusRegisterCollectionFactory.js");
11
11
  Object.defineProperty(exports, "ConsensusRegisterCollectionFactory", { enumerable: true, get: function () { return consensusRegisterCollectionFactory_js_1.ConsensusRegisterCollectionFactory; } });
12
+ Object.defineProperty(exports, "ConsensusRegisterCollection", { enumerable: true, get: function () { return consensusRegisterCollectionFactory_js_1.ConsensusRegisterCollection; } });
12
13
  var interfaces_js_1 = require("./interfaces.js");
13
14
  Object.defineProperty(exports, "ReadPolicy", { enumerable: true, get: function () { return interfaces_js_1.ReadPolicy; } });
14
15
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,mFAA+E;AAAtE,6IAAA,2BAA2B,OAAA;AACpC,iGAA6F;AAApF,2JAAA,kCAAkC,OAAA;AAC3C,iDAKyB;AADxB,2GAAA,UAAU,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { ConsensusRegisterCollection } from \"./consensusRegisterCollection.js\";\nexport { ConsensusRegisterCollectionFactory } from \"./consensusRegisterCollectionFactory.js\";\nexport {\n\tIConsensusRegisterCollection,\n\tIConsensusRegisterCollectionEvents,\n\tIConsensusRegisterCollectionFactory,\n\tReadPolicy,\n} from \"./interfaces.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,mFAAmH;AAA1G,kJAAA,2BAA2B,OAAoC;AACxE,iGAGiD;AAFhD,2JAAA,kCAAkC,OAAA;AAClC,oJAAA,2BAA2B,OAAA;AAE5B,iDAKyB;AADxB,2GAAA,UAAU,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { ConsensusRegisterCollection as ConsensusRegisterCollectionClass } from \"./consensusRegisterCollection.js\";\nexport {\n\tConsensusRegisterCollectionFactory,\n\tConsensusRegisterCollection,\n} from \"./consensusRegisterCollectionFactory.js\";\nexport {\n\tIConsensusRegisterCollection,\n\tIConsensusRegisterCollectionEvents,\n\tIConsensusRegisterCollectionFactory,\n\tReadPolicy,\n} from \"./interfaces.js\";\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IChannelAttributes, IChannelFactory, IChannelServices, IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
5
+ import { IChannelFactory } from "@fluidframework/datastore-definitions";
6
6
  import { ISharedObject, ISharedObjectEvents } from "@fluidframework/shared-object-base";
7
7
  /**
8
8
  * Consensus Register Collection channel factory interface
@@ -10,14 +10,9 @@ import { ISharedObject, ISharedObjectEvents } from "@fluidframework/shared-objec
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
12
  * @alpha
13
+ * @deprecated Use `IChannelFactory<IConsensusRegisterCollection>`.
13
14
  */
14
- export interface IConsensusRegisterCollectionFactory extends IChannelFactory {
15
- /**
16
- * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}
17
- */
18
- load(document: IFluidDataStoreRuntime, id: string, services: IChannelServices, attributes: IChannelAttributes): Promise<IConsensusRegisterCollection>;
19
- create(document: IFluidDataStoreRuntime, id: string): IConsensusRegisterCollection;
20
- }
15
+ export type IConsensusRegisterCollectionFactory = IChannelFactory<IConsensusRegisterCollection>;
21
16
  /**
22
17
  * Events emitted by {@link IConsensusRegisterCollection}.
23
18
  * @alpha
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAExF;;;;;;GAMG;AACH,MAAM,WAAW,mCAAoC,SAAQ,eAAe;IAC3E;;OAEG;IACH,IAAI,CACH,QAAQ,EAAE,sBAAsB,EAChC,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAEzC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,4BAA4B,CAAC;CACnF;AAED;;;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"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAExF;;;;;;;GAOG;AACH,MAAM,MAAM,mCAAmC,GAAG,eAAe,CAAC,4BAA4B,CAAC,CAAC;AAEhG;;;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"}
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAsFH;;;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 {\n\tIChannelAttributes,\n\tIChannelFactory,\n\tIChannelServices,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISharedObject, ISharedObjectEvents } from \"@fluidframework/shared-object-base\";\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 * @alpha\n */\nexport interface IConsensusRegisterCollectionFactory extends IChannelFactory {\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}\n\t */\n\tload(\n\t\tdocument: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IConsensusRegisterCollection>;\n\n\tcreate(document: IFluidDataStoreRuntime, id: string): IConsensusRegisterCollection;\n}\n\n/**\n * Events emitted by {@link IConsensusRegisterCollection}.\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 * @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 * @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;;;AAsEH;;;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\";\nimport { ISharedObject, ISharedObjectEvents } from \"@fluidframework/shared-object-base\";\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 * @alpha\n * @deprecated Use `IChannelFactory<IConsensusRegisterCollection>`.\n */\nexport type IConsensusRegisterCollectionFactory = IChannelFactory<IConsensusRegisterCollection>;\n\n/**\n * Events emitted by {@link IConsensusRegisterCollection}.\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 * @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 * @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"]}
package/dist/legacy.d.ts CHANGED
@@ -9,8 +9,9 @@
9
9
  */
10
10
 
11
11
  export {
12
- // alpha APIs
12
+ // @alpha APIs
13
13
  ConsensusRegisterCollection,
14
+ ConsensusRegisterCollectionClass,
14
15
  ConsensusRegisterCollectionFactory,
15
16
  IConsensusRegisterCollection,
16
17
  IConsensusRegisterCollectionEvents,
@@ -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.0.0-rc.3.0.3";
8
+ export declare const pkgVersion = "2.0.0-rc.4.0.1";
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.0.0-rc.3.0.3";
11
+ exports.pkgVersion = "2.0.0-rc.4.0.1";
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,gBAAgB,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.0.0-rc.3.0.3\";\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,gBAAgB,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.0.0-rc.4.0.1\";\n"]}
@@ -7,27 +7,12 @@ import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions"
7
7
  import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
8
8
  import { IFluidSerializer } from "@fluidframework/shared-object-base";
9
9
  import { SharedObject } from "@fluidframework/shared-object-base/internal";
10
- import { ConsensusRegisterCollectionFactory } from "./consensusRegisterCollectionFactory.js";
11
10
  import { IConsensusRegisterCollection, IConsensusRegisterCollectionEvents, ReadPolicy } from "./interfaces.js";
12
11
  /**
13
12
  * {@inheritDoc IConsensusRegisterCollection}
14
13
  * @alpha
15
14
  */
16
15
  export declare class ConsensusRegisterCollection<T> extends SharedObject<IConsensusRegisterCollectionEvents> implements IConsensusRegisterCollection<T> {
17
- /**
18
- * Create a new consensus register collection
19
- *
20
- * @param runtime - data store runtime the new consensus register collection belongs to
21
- * @param id - optional name of the consensus register collection
22
- * @returns newly create consensus register collection (but not attached yet)
23
- */
24
- static create<T>(runtime: IFluidDataStoreRuntime, id?: string): ConsensusRegisterCollection<T>;
25
- /**
26
- * Get a factory for ConsensusRegisterCollection to register with the data store.
27
- *
28
- * @returns a factory that creates and load ConsensusRegisterCollection
29
- */
30
- static getFactory(): ConsensusRegisterCollectionFactory;
31
16
  private readonly data;
32
17
  /**
33
18
  * Constructs a new consensus register collection. If the object is non-local an id and service interfaces will
@@ -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,uCAAuC,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,YAAY,EAA2B,MAAM,6CAA6C,CAAC;AAEpG,OAAO,EAAE,kCAAkC,EAAE,MAAM,yCAAyC,CAAC;AAC7F,OAAO,EACN,4BAA4B,EAC5B,kCAAkC,EAClC,UAAU,EACV,MAAM,iBAAiB,CAAC;AAgFzB;;;GAGG;AACH,qBAAa,2BAA2B,CAAC,CAAC,CACzC,SAAQ,YAAY,CAAC,kCAAkC,CACvD,YAAW,4BAA4B,CAAC,CAAC,CAAC;IAE1C;;;;;;OAMG;WACW,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC,EAAE,MAAM;IAOpE;;;;OAIG;WACW,UAAU;IAIxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IAEzD;;;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;IAyB3D;;;;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;IA0CzB,OAAO,CAAC,UAAU;IAKlB;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IA2D3B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,KAAK;IAIb,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,uCAAuC,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,YAAY,EAA2B,MAAM,6CAA6C,CAAC;AAEpG,OAAO,EACN,4BAA4B,EAC5B,kCAAkC,EAClC,UAAU,EACV,MAAM,iBAAiB,CAAC;AAgFzB;;;GAGG;AACH,qBAAa,2BAA2B,CAAC,CAAC,CACzC,SAAQ,YAAY,CAAC,kCAAkC,CACvD,YAAW,4BAA4B,CAAC,CAAC,CAAC;IAE1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IAEzD;;;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;IAyB3D;;;;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;IA0CzB,OAAO,CAAC,UAAU;IAKlB;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IA2D3B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,KAAK;IAIb,SAAS,CAAC,cAAc,IAAI,IAAI;CAGhC"}
@@ -6,7 +6,6 @@ import { bufferToString } from "@fluid-internal/client-utils";
6
6
  import { assert, unreachableCase } from "@fluidframework/core-utils/internal";
7
7
  import { MessageType } from "@fluidframework/protocol-definitions";
8
8
  import { SharedObject, createSingleBlobSummary } from "@fluidframework/shared-object-base/internal";
9
- import { ConsensusRegisterCollectionFactory } from "./consensusRegisterCollectionFactory.js";
10
9
  import { ReadPolicy, } from "./interfaces.js";
11
10
  const newLocalRegister = (sequenceNumber, value) => ({
12
11
  sequenceNumber,
@@ -23,24 +22,6 @@ const snapshotFileName = "header";
23
22
  * @alpha
24
23
  */
25
24
  export class ConsensusRegisterCollection extends SharedObject {
26
- /**
27
- * Create a new consensus register collection
28
- *
29
- * @param runtime - data store runtime the new consensus register collection belongs to
30
- * @param id - optional name of the consensus register collection
31
- * @returns newly create consensus register collection (but not attached yet)
32
- */
33
- static create(runtime, id) {
34
- return runtime.createChannel(id, ConsensusRegisterCollectionFactory.Type);
35
- }
36
- /**
37
- * Get a factory for ConsensusRegisterCollection to register with the data store.
38
- *
39
- * @returns a factory that creates and load ConsensusRegisterCollection
40
- */
41
- static getFactory() {
42
- return new ConsensusRegisterCollectionFactory();
43
- }
44
25
  /**
45
26
  * Constructs a new consensus register collection. If the object is non-local an id and service interfaces will
46
27
  * be provided
@@ -68,7 +49,7 @@ export class ConsensusRegisterCollection extends SharedObject {
68
49
  type: "Plain",
69
50
  value,
70
51
  },
71
- refSeq: this.runtime.deltaManager.lastSequenceNumber,
52
+ refSeq: this.deltaManager.lastSequenceNumber,
72
53
  };
73
54
  return this.newAckBasedPromise((resolve) => {
74
55
  // Send the resolve function as the localOpMetadata. This will be provided back to us when the
@@ -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 } from \"@fluid-internal/client-utils\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelAttributes,\n\tIChannelStorageService,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { SharedObject, createSingleBlobSummary } from \"@fluidframework/shared-object-base/internal\";\n\nimport { ConsensusRegisterCollectionFactory } from \"./consensusRegisterCollectionFactory.js\";\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> => \"value\" in op;\n\n/** The type of the resolve function to call after the local operation is ack'd */\ntype PendingResolve = (winner: boolean) => void;\n\nconst snapshotFileName = \"header\";\n\n/**\n * {@inheritDoc IConsensusRegisterCollection}\n * @alpha\n */\nexport class ConsensusRegisterCollection<T>\n\textends SharedObject<IConsensusRegisterCollectionEvents>\n\timplements IConsensusRegisterCollection<T>\n{\n\t/**\n\t * Create a new consensus register collection\n\t *\n\t * @param runtime - data store runtime the new consensus register collection belongs to\n\t * @param id - optional name of the consensus register collection\n\t * @returns newly create consensus register collection (but not attached yet)\n\t */\n\tpublic static create<T>(runtime: IFluidDataStoreRuntime, id?: string) {\n\t\treturn runtime.createChannel(\n\t\t\tid,\n\t\t\tConsensusRegisterCollectionFactory.Type,\n\t\t) as ConsensusRegisterCollection<T>;\n\t}\n\n\t/**\n\t * Get a factory for ConsensusRegisterCollection to register with the data store.\n\t *\n\t * @returns a factory that creates and load ConsensusRegisterCollection\n\t */\n\tpublic static getFactory() {\n\t\treturn new ConsensusRegisterCollectionFactory();\n\t}\n\n\tprivate readonly data = new Map<string, ILocalData<T>>();\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.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.runtime.deltaManager.lastSequenceNumber,\n\t\t};\n\n\t\treturn this.newAckBasedPromise<boolean>((resolve) => {\n\t\t\t// Send the resolve function as the localOpMetadata. This will be provided back to us when the\n\t\t\t// op is ack'd.\n\t\t\tthis.submitLocalMessage(message, resolve);\n\t\t\t// If we fail due to runtime being disposed, it's better to return false then unhandled exception.\n\t\t}).catch((error) => false);\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 winner = 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\tconst resolve = localOpMetadata as PendingResolve;\n\t\t\t\t\t\tresolve(winner);\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 winner = data === undefined || refSeq >= data.atomic.sequenceNumber;\n\t\tif (winner) {\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 (winner) {\n\t\t\tthis.emit(\"atomicChanged\", key, value, local);\n\t\t}\n\t\tthis.emit(\"versionChanged\", key, value, local);\n\n\t\treturn winner;\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\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 } from \"@fluid-internal/client-utils\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelAttributes,\n\tIChannelStorageService,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { SharedObject, createSingleBlobSummary } 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> => \"value\" in op;\n\n/** The type of the resolve function to call after the local operation is ack'd */\ntype PendingResolve = (winner: boolean) => void;\n\nconst snapshotFileName = \"header\";\n\n/**\n * {@inheritDoc IConsensusRegisterCollection}\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\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.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\treturn this.newAckBasedPromise<boolean>((resolve) => {\n\t\t\t// Send the resolve function as the localOpMetadata. This will be provided back to us when the\n\t\t\t// op is ack'd.\n\t\t\tthis.submitLocalMessage(message, resolve);\n\t\t\t// If we fail due to runtime being disposed, it's better to return false then unhandled exception.\n\t\t}).catch((error) => false);\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 winner = 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\tconst resolve = localOpMetadata as PendingResolve;\n\t\t\t\t\t\tresolve(winner);\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 winner = data === undefined || refSeq >= data.atomic.sequenceNumber;\n\t\tif (winner) {\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 (winner) {\n\t\t\tthis.emit(\"atomicChanged\", key, value, local);\n\t\t}\n\t\tthis.emit(\"versionChanged\", key, value, local);\n\n\t\treturn winner;\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\tprotected applyStashedOp(): void {\n\t\t// empty implementation\n\t}\n}\n"]}
@@ -2,13 +2,13 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IChannelAttributes, IChannelServices, IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
6
- import { IConsensusRegisterCollection, IConsensusRegisterCollectionFactory } from "./interfaces.js";
5
+ import { IChannelAttributes, IChannelServices, IFluidDataStoreRuntime, type IChannelFactory } from "@fluidframework/datastore-definitions";
6
+ import { IConsensusRegisterCollection } from "./interfaces.js";
7
7
  /**
8
8
  * The factory that defines the consensus queue.
9
9
  * @alpha
10
10
  */
11
- export declare class ConsensusRegisterCollectionFactory implements IConsensusRegisterCollectionFactory {
11
+ export declare class ConsensusRegisterCollectionFactory implements IChannelFactory<IConsensusRegisterCollection> {
12
12
  static Type: string;
13
13
  static readonly Attributes: IChannelAttributes;
14
14
  get type(): string;
@@ -19,4 +19,14 @@ export declare class ConsensusRegisterCollectionFactory implements IConsensusReg
19
19
  load(runtime: IFluidDataStoreRuntime, id: string, services: IChannelServices, attributes: IChannelAttributes): Promise<IConsensusRegisterCollection>;
20
20
  create(document: IFluidDataStoreRuntime, id: string): IConsensusRegisterCollection;
21
21
  }
22
+ /**
23
+ * {@inheritDoc IConsensusRegisterCollection}
24
+ * @alpha
25
+ */
26
+ export declare const ConsensusRegisterCollection: import("@fluidframework/shared-object-base/internal").ISharedObjectKind<IConsensusRegisterCollection<any>>;
27
+ /**
28
+ * Compatibility alias for {@link IConsensusRegisterCollection}.
29
+ * @alpha
30
+ */
31
+ export type ConsensusRegisterCollection<T> = IConsensusRegisterCollection<T>;
22
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,gBAAgB,EAChB,sBAAsB,EACtB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EAAE,4BAA4B,EAAE,mCAAmC,EAAE,MAAM,iBAAiB,CAAC;AAGpG;;;GAGG;AACH,qBAAa,kCAAmC,YAAW,mCAAmC;IAC7F,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"}
1
+ {"version":3,"file":"consensusRegisterCollectionFactory.d.ts","sourceRoot":"","sources":["../src/consensusRegisterCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,eAAe,EACpB,MAAM,uCAAuC,CAAC;AAI/C,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,4GAEvC,CAAC;AACF;;;GAGG;AACH,MAAM,MAAM,2BAA2B,CAAC,CAAC,IAAI,4BAA4B,CAAC,CAAC,CAAC,CAAC"}
@@ -2,7 +2,8 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { ConsensusRegisterCollection } from "./consensusRegisterCollection.js";
5
+ import { createSharedObjectKind } from "@fluidframework/shared-object-base/internal";
6
+ import { ConsensusRegisterCollection as ConsensusRegisterCollectionClass } from "./consensusRegisterCollection.js";
6
7
  import { pkgVersion } from "./packageVersion.js";
7
8
  /**
8
9
  * The factory that defines the consensus queue.
@@ -19,12 +20,12 @@ export class ConsensusRegisterCollectionFactory {
19
20
  * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}
20
21
  */
21
22
  async load(runtime, id, services, attributes) {
22
- const collection = new ConsensusRegisterCollection(id, runtime, attributes);
23
+ const collection = new ConsensusRegisterCollectionClass(id, runtime, attributes);
23
24
  await collection.load(services);
24
25
  return collection;
25
26
  }
26
27
  create(document, id) {
27
- const collection = new ConsensusRegisterCollection(id, document, ConsensusRegisterCollectionFactory.Attributes);
28
+ const collection = new ConsensusRegisterCollectionClass(id, document, ConsensusRegisterCollectionFactory.Attributes);
28
29
  collection.initializeLocal();
29
30
  return collection;
30
31
  }
@@ -35,4 +36,9 @@ ConsensusRegisterCollectionFactory.Attributes = {
35
36
  snapshotFormatVersion: "0.1",
36
37
  packageVersion: pkgVersion,
37
38
  };
39
+ /**
40
+ * {@inheritDoc IConsensusRegisterCollection}
41
+ * @alpha
42
+ */
43
+ export const ConsensusRegisterCollection = createSharedObjectKind(ConsensusRegisterCollectionFactory);
38
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,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAE/E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;GAGG;AACH,MAAM,OAAO,kCAAkC;IAS9C,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,2BAA2B,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAC5E,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,2BAA2B,CACjD,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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIChannelAttributes,\n\tIChannelServices,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\n\nimport { ConsensusRegisterCollection } from \"./consensusRegisterCollection.js\";\nimport { IConsensusRegisterCollection, IConsensusRegisterCollectionFactory } from \"./interfaces.js\";\nimport { pkgVersion } from \"./packageVersion.js\";\n\n/**\n * The factory that defines the consensus queue.\n * @alpha\n */\nexport class ConsensusRegisterCollectionFactory implements IConsensusRegisterCollectionFactory {\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 ConsensusRegisterCollection(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 ConsensusRegisterCollection(\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"]}
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\tIChannelServices,\n\tIFluidDataStoreRuntime,\n\ttype IChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\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 * @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 * @alpha\n */\nexport const ConsensusRegisterCollection = createSharedObjectKind(\n\tConsensusRegisterCollectionFactory,\n);\n/**\n * Compatibility alias for {@link IConsensusRegisterCollection}.\n * @alpha\n */\nexport type ConsensusRegisterCollection<T> = IConsensusRegisterCollection<T>;\n"]}
package/lib/index.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- export { ConsensusRegisterCollection } from "./consensusRegisterCollection.js";
6
- export { ConsensusRegisterCollectionFactory } from "./consensusRegisterCollectionFactory.js";
5
+ export { ConsensusRegisterCollection as ConsensusRegisterCollectionClass } from "./consensusRegisterCollection.js";
6
+ export { ConsensusRegisterCollectionFactory, ConsensusRegisterCollection, } from "./consensusRegisterCollectionFactory.js";
7
7
  export { IConsensusRegisterCollection, IConsensusRegisterCollectionEvents, IConsensusRegisterCollectionFactory, ReadPolicy, } from "./interfaces.js";
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,kCAAkC,EAAE,MAAM,yCAAyC,CAAC;AAC7F,OAAO,EACN,4BAA4B,EAC5B,kCAAkC,EAClC,mCAAmC,EACnC,UAAU,GACV,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,2BAA2B,IAAI,gCAAgC,EAAE,MAAM,kCAAkC,CAAC;AACnH,OAAO,EACN,kCAAkC,EAClC,2BAA2B,GAC3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACN,4BAA4B,EAC5B,kCAAkC,EAClC,mCAAmC,EACnC,UAAU,GACV,MAAM,iBAAiB,CAAC"}
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- export { ConsensusRegisterCollection } from "./consensusRegisterCollection.js";
6
- export { ConsensusRegisterCollectionFactory } from "./consensusRegisterCollectionFactory.js";
5
+ export { ConsensusRegisterCollection as ConsensusRegisterCollectionClass } from "./consensusRegisterCollection.js";
6
+ export { ConsensusRegisterCollectionFactory, ConsensusRegisterCollection, } from "./consensusRegisterCollectionFactory.js";
7
7
  export { ReadPolicy, } from "./interfaces.js";
8
8
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,kCAAkC,EAAE,MAAM,yCAAyC,CAAC;AAC7F,OAAO,EAIN,UAAU,GACV,MAAM,iBAAiB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { ConsensusRegisterCollection } from \"./consensusRegisterCollection.js\";\nexport { ConsensusRegisterCollectionFactory } from \"./consensusRegisterCollectionFactory.js\";\nexport {\n\tIConsensusRegisterCollection,\n\tIConsensusRegisterCollectionEvents,\n\tIConsensusRegisterCollectionFactory,\n\tReadPolicy,\n} from \"./interfaces.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,2BAA2B,IAAI,gCAAgC,EAAE,MAAM,kCAAkC,CAAC;AACnH,OAAO,EACN,kCAAkC,EAClC,2BAA2B,GAC3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAIN,UAAU,GACV,MAAM,iBAAiB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { ConsensusRegisterCollection as ConsensusRegisterCollectionClass } from \"./consensusRegisterCollection.js\";\nexport {\n\tConsensusRegisterCollectionFactory,\n\tConsensusRegisterCollection,\n} from \"./consensusRegisterCollectionFactory.js\";\nexport {\n\tIConsensusRegisterCollection,\n\tIConsensusRegisterCollectionEvents,\n\tIConsensusRegisterCollectionFactory,\n\tReadPolicy,\n} from \"./interfaces.js\";\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IChannelAttributes, IChannelFactory, IChannelServices, IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
5
+ import { IChannelFactory } from "@fluidframework/datastore-definitions";
6
6
  import { ISharedObject, ISharedObjectEvents } from "@fluidframework/shared-object-base";
7
7
  /**
8
8
  * Consensus Register Collection channel factory interface
@@ -10,14 +10,9 @@ import { ISharedObject, ISharedObjectEvents } from "@fluidframework/shared-objec
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
12
  * @alpha
13
+ * @deprecated Use `IChannelFactory<IConsensusRegisterCollection>`.
13
14
  */
14
- export interface IConsensusRegisterCollectionFactory extends IChannelFactory {
15
- /**
16
- * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}
17
- */
18
- load(document: IFluidDataStoreRuntime, id: string, services: IChannelServices, attributes: IChannelAttributes): Promise<IConsensusRegisterCollection>;
19
- create(document: IFluidDataStoreRuntime, id: string): IConsensusRegisterCollection;
20
- }
15
+ export type IConsensusRegisterCollectionFactory = IChannelFactory<IConsensusRegisterCollection>;
21
16
  /**
22
17
  * Events emitted by {@link IConsensusRegisterCollection}.
23
18
  * @alpha
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAExF;;;;;;GAMG;AACH,MAAM,WAAW,mCAAoC,SAAQ,eAAe;IAC3E;;OAEG;IACH,IAAI,CACH,QAAQ,EAAE,sBAAsB,EAChC,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAEzC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,4BAA4B,CAAC;CACnF;AAED;;;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"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAExF;;;;;;;GAOG;AACH,MAAM,MAAM,mCAAmC,GAAG,eAAe,CAAC,4BAA4B,CAAC,CAAC;AAEhG;;;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"}
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsFH;;;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 {\n\tIChannelAttributes,\n\tIChannelFactory,\n\tIChannelServices,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISharedObject, ISharedObjectEvents } from \"@fluidframework/shared-object-base\";\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 * @alpha\n */\nexport interface IConsensusRegisterCollectionFactory extends IChannelFactory {\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}\n\t */\n\tload(\n\t\tdocument: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IConsensusRegisterCollection>;\n\n\tcreate(document: IFluidDataStoreRuntime, id: string): IConsensusRegisterCollection;\n}\n\n/**\n * Events emitted by {@link IConsensusRegisterCollection}.\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 * @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 * @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;AAsEH;;;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\";\nimport { ISharedObject, ISharedObjectEvents } from \"@fluidframework/shared-object-base\";\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 * @alpha\n * @deprecated Use `IChannelFactory<IConsensusRegisterCollection>`.\n */\nexport type IConsensusRegisterCollectionFactory = IChannelFactory<IConsensusRegisterCollection>;\n\n/**\n * Events emitted by {@link IConsensusRegisterCollection}.\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 * @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 * @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"]}
package/lib/legacy.d.ts CHANGED
@@ -9,8 +9,9 @@
9
9
  */
10
10
 
11
11
  export {
12
- // alpha APIs
12
+ // @alpha APIs
13
13
  ConsensusRegisterCollection,
14
+ ConsensusRegisterCollectionClass,
14
15
  ConsensusRegisterCollectionFactory,
15
16
  IConsensusRegisterCollection,
16
17
  IConsensusRegisterCollectionEvents,
@@ -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.0.0-rc.3.0.3";
8
+ export declare const pkgVersion = "2.0.0-rc.4.0.1";
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.0.0-rc.3.0.3";
8
+ export const pkgVersion = "2.0.0-rc.4.0.1";
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,gBAAgB,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.0.0-rc.3.0.3\";\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,gBAAgB,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.0.0-rc.4.0.1\";\n"]}
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.42.3"
8
+ "packageVersion": "7.43.1"
9
9
  }
10
10
  ]
11
11
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/register-collection",
3
- "version": "2.0.0-rc.3.0.3",
3
+ "version": "2.0.0-rc.4.0.1",
4
4
  "description": "Consensus Register",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -67,27 +67,27 @@
67
67
  "temp-directory": "nyc/.nyc_output"
68
68
  },
69
69
  "dependencies": {
70
- "@fluid-internal/client-utils": ">=2.0.0-rc.3.0.3 <2.0.0-rc.3.1.0",
71
- "@fluidframework/core-interfaces": ">=2.0.0-rc.3.0.3 <2.0.0-rc.3.1.0",
72
- "@fluidframework/core-utils": ">=2.0.0-rc.3.0.3 <2.0.0-rc.3.1.0",
73
- "@fluidframework/datastore-definitions": ">=2.0.0-rc.3.0.3 <2.0.0-rc.3.1.0",
74
- "@fluidframework/driver-utils": ">=2.0.0-rc.3.0.3 <2.0.0-rc.3.1.0",
70
+ "@fluid-internal/client-utils": ">=2.0.0-rc.4.0.1 <2.0.0-rc.4.1.0",
71
+ "@fluidframework/core-interfaces": ">=2.0.0-rc.4.0.1 <2.0.0-rc.4.1.0",
72
+ "@fluidframework/core-utils": ">=2.0.0-rc.4.0.1 <2.0.0-rc.4.1.0",
73
+ "@fluidframework/datastore-definitions": ">=2.0.0-rc.4.0.1 <2.0.0-rc.4.1.0",
74
+ "@fluidframework/driver-utils": ">=2.0.0-rc.4.0.1 <2.0.0-rc.4.1.0",
75
75
  "@fluidframework/protocol-definitions": "^3.2.0",
76
- "@fluidframework/runtime-definitions": ">=2.0.0-rc.3.0.3 <2.0.0-rc.3.1.0",
77
- "@fluidframework/shared-object-base": ">=2.0.0-rc.3.0.3 <2.0.0-rc.3.1.0"
76
+ "@fluidframework/runtime-definitions": ">=2.0.0-rc.4.0.1 <2.0.0-rc.4.1.0",
77
+ "@fluidframework/shared-object-base": ">=2.0.0-rc.4.0.1 <2.0.0-rc.4.1.0"
78
78
  },
79
79
  "devDependencies": {
80
80
  "@arethetypeswrong/cli": "^0.15.2",
81
81
  "@biomejs/biome": "^1.6.2",
82
- "@fluid-internal/mocha-test-setup": ">=2.0.0-rc.3.0.3 <2.0.0-rc.3.1.0",
83
- "@fluid-private/test-dds-utils": ">=2.0.0-rc.3.0.3 <2.0.0-rc.3.1.0",
84
- "@fluid-tools/build-cli": "^0.37.0",
82
+ "@fluid-internal/mocha-test-setup": ">=2.0.0-rc.4.0.1 <2.0.0-rc.4.1.0",
83
+ "@fluid-private/test-dds-utils": ">=2.0.0-rc.4.0.1 <2.0.0-rc.4.1.0",
84
+ "@fluid-tools/build-cli": "^0.38.0",
85
85
  "@fluidframework/build-common": "^2.0.3",
86
- "@fluidframework/build-tools": "^0.37.0",
86
+ "@fluidframework/build-tools": "^0.38.0",
87
87
  "@fluidframework/eslint-config-fluid": "^5.1.0",
88
- "@fluidframework/register-collection-previous": "npm:@fluidframework/register-collection@2.0.0-internal.8.0.0",
89
- "@fluidframework/test-runtime-utils": ">=2.0.0-rc.3.0.3 <2.0.0-rc.3.1.0",
90
- "@microsoft/api-extractor": "^7.42.3",
88
+ "@fluidframework/register-collection-previous": "npm:@fluidframework/register-collection@2.0.0-rc.3.0.0",
89
+ "@fluidframework/test-runtime-utils": ">=2.0.0-rc.4.0.1 <2.0.0-rc.4.1.0",
90
+ "@microsoft/api-extractor": "^7.43.1",
91
91
  "@types/mocha": "^9.1.1",
92
92
  "@types/node": "^18.19.0",
93
93
  "c8": "^8.0.1",
@@ -104,7 +104,16 @@
104
104
  "typescript": "~5.1.6"
105
105
  },
106
106
  "typeValidation": {
107
- "broken": {}
107
+ "broken": {
108
+ "ClassDeclaration_ConsensusRegisterCollection": {
109
+ "forwardCompat": false,
110
+ "backCompat": false
111
+ },
112
+ "InterfaceDeclaration_IConsensusRegisterCollection": {
113
+ "forwardCompat": false,
114
+ "backCompat": false
115
+ }
116
+ }
108
117
  },
109
118
  "scripts": {
110
119
  "api": "fluid-build . --task api",
@@ -137,7 +146,7 @@
137
146
  "test:mocha:esm": "mocha --recursive \"lib/test/**/*.spec.*js\" --exit",
138
147
  "test:mocha:verbose": "cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha",
139
148
  "tsc": "fluid-tsc commonjs --project ./tsconfig.cjs.json && copyfiles -f ../../../common/build/build-common/src/cjs/package.json ./dist",
140
- "typetests:gen": "fluid-type-test-generator",
149
+ "typetests:gen": "flub generate typetests --dir . -v --publicFallback",
141
150
  "typetests:prepare": "flub typetests --dir . --reset --previous --normalize"
142
151
  }
143
152
  }
@@ -15,7 +15,6 @@ import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
15
15
  import { IFluidSerializer } from "@fluidframework/shared-object-base";
16
16
  import { SharedObject, createSingleBlobSummary } from "@fluidframework/shared-object-base/internal";
17
17
 
18
- import { ConsensusRegisterCollectionFactory } from "./consensusRegisterCollectionFactory.js";
19
18
  import {
20
19
  IConsensusRegisterCollection,
21
20
  IConsensusRegisterCollectionEvents,
@@ -108,29 +107,6 @@ export class ConsensusRegisterCollection<T>
108
107
  extends SharedObject<IConsensusRegisterCollectionEvents>
109
108
  implements IConsensusRegisterCollection<T>
110
109
  {
111
- /**
112
- * Create a new consensus register collection
113
- *
114
- * @param runtime - data store runtime the new consensus register collection belongs to
115
- * @param id - optional name of the consensus register collection
116
- * @returns newly create consensus register collection (but not attached yet)
117
- */
118
- public static create<T>(runtime: IFluidDataStoreRuntime, id?: string) {
119
- return runtime.createChannel(
120
- id,
121
- ConsensusRegisterCollectionFactory.Type,
122
- ) as ConsensusRegisterCollection<T>;
123
- }
124
-
125
- /**
126
- * Get a factory for ConsensusRegisterCollection to register with the data store.
127
- *
128
- * @returns a factory that creates and load ConsensusRegisterCollection
129
- */
130
- public static getFactory() {
131
- return new ConsensusRegisterCollectionFactory();
132
- }
133
-
134
110
  private readonly data = new Map<string, ILocalData<T>>();
135
111
 
136
112
  /**
@@ -165,7 +141,7 @@ export class ConsensusRegisterCollection<T>
165
141
  type: "Plain",
166
142
  value,
167
143
  },
168
- refSeq: this.runtime.deltaManager.lastSequenceNumber,
144
+ refSeq: this.deltaManager.lastSequenceNumber,
169
145
  };
170
146
 
171
147
  return this.newAckBasedPromise<boolean>((resolve) => {
@@ -7,17 +7,21 @@ import {
7
7
  IChannelAttributes,
8
8
  IChannelServices,
9
9
  IFluidDataStoreRuntime,
10
+ type IChannelFactory,
10
11
  } from "@fluidframework/datastore-definitions";
12
+ import { createSharedObjectKind } from "@fluidframework/shared-object-base/internal";
11
13
 
12
- import { ConsensusRegisterCollection } from "./consensusRegisterCollection.js";
13
- import { IConsensusRegisterCollection, IConsensusRegisterCollectionFactory } from "./interfaces.js";
14
+ import { ConsensusRegisterCollection as ConsensusRegisterCollectionClass } from "./consensusRegisterCollection.js";
15
+ import { IConsensusRegisterCollection } from "./interfaces.js";
14
16
  import { pkgVersion } from "./packageVersion.js";
15
17
 
16
18
  /**
17
19
  * The factory that defines the consensus queue.
18
20
  * @alpha
19
21
  */
20
- export class ConsensusRegisterCollectionFactory implements IConsensusRegisterCollectionFactory {
22
+ export class ConsensusRegisterCollectionFactory
23
+ implements IChannelFactory<IConsensusRegisterCollection>
24
+ {
21
25
  public static Type = "https://graph.microsoft.com/types/consensus-register-collection";
22
26
 
23
27
  public static readonly Attributes: IChannelAttributes = {
@@ -43,13 +47,13 @@ export class ConsensusRegisterCollectionFactory implements IConsensusRegisterCol
43
47
  services: IChannelServices,
44
48
  attributes: IChannelAttributes,
45
49
  ): Promise<IConsensusRegisterCollection> {
46
- const collection = new ConsensusRegisterCollection(id, runtime, attributes);
50
+ const collection = new ConsensusRegisterCollectionClass(id, runtime, attributes);
47
51
  await collection.load(services);
48
52
  return collection;
49
53
  }
50
54
 
51
55
  public create(document: IFluidDataStoreRuntime, id: string): IConsensusRegisterCollection {
52
- const collection = new ConsensusRegisterCollection(
56
+ const collection = new ConsensusRegisterCollectionClass(
53
57
  id,
54
58
  document,
55
59
  ConsensusRegisterCollectionFactory.Attributes,
@@ -58,3 +62,16 @@ export class ConsensusRegisterCollectionFactory implements IConsensusRegisterCol
58
62
  return collection;
59
63
  }
60
64
  }
65
+
66
+ /**
67
+ * {@inheritDoc IConsensusRegisterCollection}
68
+ * @alpha
69
+ */
70
+ export const ConsensusRegisterCollection = createSharedObjectKind(
71
+ ConsensusRegisterCollectionFactory,
72
+ );
73
+ /**
74
+ * Compatibility alias for {@link IConsensusRegisterCollection}.
75
+ * @alpha
76
+ */
77
+ export type ConsensusRegisterCollection<T> = IConsensusRegisterCollection<T>;
package/src/index.ts CHANGED
@@ -3,8 +3,11 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- export { ConsensusRegisterCollection } from "./consensusRegisterCollection.js";
7
- export { ConsensusRegisterCollectionFactory } from "./consensusRegisterCollectionFactory.js";
6
+ export { ConsensusRegisterCollection as ConsensusRegisterCollectionClass } from "./consensusRegisterCollection.js";
7
+ export {
8
+ ConsensusRegisterCollectionFactory,
9
+ ConsensusRegisterCollection,
10
+ } from "./consensusRegisterCollectionFactory.js";
8
11
  export {
9
12
  IConsensusRegisterCollection,
10
13
  IConsensusRegisterCollectionEvents,
package/src/interfaces.ts CHANGED
@@ -3,12 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import {
7
- IChannelAttributes,
8
- IChannelFactory,
9
- IChannelServices,
10
- IFluidDataStoreRuntime,
11
- } from "@fluidframework/datastore-definitions";
6
+ import { IChannelFactory } from "@fluidframework/datastore-definitions";
12
7
  import { ISharedObject, ISharedObjectEvents } from "@fluidframework/shared-object-base";
13
8
 
14
9
  /**
@@ -17,20 +12,9 @@ import { ISharedObject, ISharedObjectEvents } from "@fluidframework/shared-objec
17
12
  * Extends the base IChannelFactory to return a more definite type of IConsensusRegisterCollection
18
13
  * Use for the runtime to create and load distributed data structure by type name of each channel.
19
14
  * @alpha
15
+ * @deprecated Use `IChannelFactory<IConsensusRegisterCollection>`.
20
16
  */
21
- export interface IConsensusRegisterCollectionFactory extends IChannelFactory {
22
- /**
23
- * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}
24
- */
25
- load(
26
- document: IFluidDataStoreRuntime,
27
- id: string,
28
- services: IChannelServices,
29
- attributes: IChannelAttributes,
30
- ): Promise<IConsensusRegisterCollection>;
31
-
32
- create(document: IFluidDataStoreRuntime, id: string): IConsensusRegisterCollection;
33
- }
17
+ export type IConsensusRegisterCollectionFactory = IChannelFactory<IConsensusRegisterCollection>;
34
18
 
35
19
  /**
36
20
  * Events emitted by {@link IConsensusRegisterCollection}.
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/register-collection";
9
- export const pkgVersion = "2.0.0-rc.3.0.3";
9
+ export const pkgVersion = "2.0.0-rc.4.0.1";