@fluidframework/fluid-static 2.0.0-rc.1.0.3 → 2.0.0-rc.2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/{.eslintrc.js → .eslintrc.cjs} +1 -1
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +10 -0
  4. package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
  5. package/api-extractor.json +1 -1
  6. package/api-report/fluid-static.api.md +17 -14
  7. package/dist/fluid-static-alpha.d.ts +29 -13
  8. package/dist/fluid-static-beta.d.ts +29 -13
  9. package/dist/fluid-static-public.d.ts +29 -13
  10. package/dist/fluid-static-untrimmed.d.ts +44 -16
  11. package/dist/fluidContainer.d.ts +9 -6
  12. package/dist/fluidContainer.d.ts.map +1 -1
  13. package/dist/fluidContainer.js +3 -1
  14. package/dist/fluidContainer.js.map +1 -1
  15. package/dist/index.d.ts +4 -4
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +6 -6
  18. package/dist/index.js.map +1 -1
  19. package/dist/package.json +3 -0
  20. package/dist/rootDataObject.d.ts +5 -2
  21. package/dist/rootDataObject.d.ts.map +1 -1
  22. package/dist/rootDataObject.js +12 -8
  23. package/dist/rootDataObject.js.map +1 -1
  24. package/dist/serviceAudience.d.ts +13 -6
  25. package/dist/serviceAudience.d.ts.map +1 -1
  26. package/dist/serviceAudience.js +12 -4
  27. package/dist/serviceAudience.js.map +1 -1
  28. package/dist/tsdoc-metadata.json +1 -1
  29. package/dist/types.d.ts +26 -12
  30. package/dist/types.d.ts.map +1 -1
  31. package/dist/types.js.map +1 -1
  32. package/dist/utils.d.ts +13 -9
  33. package/dist/utils.d.ts.map +1 -1
  34. package/dist/utils.js +11 -8
  35. package/dist/utils.js.map +1 -1
  36. package/lib/{fluid-static-alpha.d.mts → fluid-static-alpha.d.ts} +35 -13
  37. package/lib/{fluid-static-beta.d.mts → fluid-static-beta.d.ts} +35 -13
  38. package/lib/{fluid-static-public.d.mts → fluid-static-public.d.ts} +35 -13
  39. package/lib/{fluid-static-untrimmed.d.mts → fluid-static-untrimmed.d.ts} +50 -16
  40. package/lib/{fluidContainer.d.mts → fluidContainer.d.ts} +10 -7
  41. package/lib/fluidContainer.d.ts.map +1 -0
  42. package/lib/{fluidContainer.mjs → fluidContainer.js} +8 -2
  43. package/lib/fluidContainer.js.map +1 -0
  44. package/lib/index.d.ts +14 -0
  45. package/lib/index.d.ts.map +1 -0
  46. package/lib/index.js +13 -0
  47. package/lib/index.js.map +1 -0
  48. package/lib/{rootDataObject.d.mts → rootDataObject.d.ts} +6 -3
  49. package/lib/rootDataObject.d.ts.map +1 -0
  50. package/lib/{rootDataObject.mjs → rootDataObject.js} +14 -6
  51. package/lib/rootDataObject.js.map +1 -0
  52. package/lib/serviceAudience.d.ts +22 -0
  53. package/lib/serviceAudience.d.ts.map +1 -0
  54. package/lib/{serviceAudience.mjs → serviceAudience.js} +13 -5
  55. package/lib/serviceAudience.js.map +1 -0
  56. package/lib/test/fluidContainer.spec.js +21 -0
  57. package/lib/test/fluidContainer.spec.js.map +1 -0
  58. package/lib/test/types/validateFluidStaticPrevious.generated.js +46 -0
  59. package/lib/test/types/validateFluidStaticPrevious.generated.js.map +1 -0
  60. package/lib/test/utils.spec.js +86 -0
  61. package/lib/test/utils.spec.js.map +1 -0
  62. package/lib/{types.d.mts → types.d.ts} +27 -13
  63. package/lib/types.d.ts.map +1 -0
  64. package/lib/{types.mjs → types.js} +1 -1
  65. package/lib/types.js.map +1 -0
  66. package/lib/utils.d.ts +34 -0
  67. package/lib/utils.d.ts.map +1 -0
  68. package/lib/{utils.mjs → utils.js} +11 -8
  69. package/lib/utils.js.map +1 -0
  70. package/package.json +45 -58
  71. package/src/fluidContainer.ts +29 -17
  72. package/src/index.ts +23 -22
  73. package/src/rootDataObject.ts +48 -29
  74. package/src/serviceAudience.ts +35 -22
  75. package/src/types.ts +34 -14
  76. package/src/utils.ts +36 -16
  77. package/tsconfig.cjs.json +7 -0
  78. package/tsconfig.json +4 -8
  79. package/lib/fluidContainer.d.mts.map +0 -1
  80. package/lib/fluidContainer.mjs.map +0 -1
  81. package/lib/index.d.mts +0 -9
  82. package/lib/index.d.mts.map +0 -1
  83. package/lib/index.mjs +0 -8
  84. package/lib/index.mjs.map +0 -1
  85. package/lib/rootDataObject.d.mts.map +0 -1
  86. package/lib/rootDataObject.mjs.map +0 -1
  87. package/lib/serviceAudience.d.mts +0 -15
  88. package/lib/serviceAudience.d.mts.map +0 -1
  89. package/lib/serviceAudience.mjs.map +0 -1
  90. package/lib/types.d.mts.map +0 -1
  91. package/lib/types.mjs.map +0 -1
  92. package/lib/utils.d.mts +0 -30
  93. package/lib/utils.d.mts.map +0 -1
  94. package/lib/utils.mjs.map +0 -1
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Provides a simple and powerful way to consume collaborative Fluid data.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+
1
7
  import { AttachState } from '@fluidframework/container-definitions';
2
8
  import { ConnectionState } from '@fluidframework/container-definitions';
3
9
  import { IChannelFactory } from '@fluidframework/datastore-definitions';
@@ -9,6 +15,12 @@ import { IEventProvider } from '@fluidframework/core-interfaces';
9
15
  import { IFluidLoadable } from '@fluidframework/core-interfaces';
10
16
  import { IRuntimeFactory } from '@fluidframework/container-definitions';
11
17
 
18
+ /**
19
+ * Represents properties that can be attached to a container.
20
+ * @public
21
+ */
22
+ export declare type ContainerAttachProps<T = unknown> = T;
23
+
12
24
  /**
13
25
  * Declares the Fluid objects that will be available in the {@link IFluidContainer | Container}.
14
26
  *
@@ -37,7 +49,7 @@ export declare interface ContainerSchema {
37
49
  * }
38
50
  * ```
39
51
  */
40
- initialObjects: LoadableObjectClassRecord;
52
+ readonly initialObjects: LoadableObjectClassRecord;
41
53
  /**
42
54
  * Loadable objects that can be created after the initial {@link IFluidContainer | Container} creation.
43
55
  *
@@ -48,10 +60,13 @@ export declare interface ContainerSchema {
48
60
  * For best practice it's recommended to define all the dynamic types you create even if they are
49
61
  * included via initialObjects.
50
62
  */
51
- dynamicObjectTypes?: LoadableObjectClass<any>[];
63
+ readonly dynamicObjectTypes?: readonly LoadableObjectClass[];
52
64
  }
53
65
 
54
66
  /**
67
+ * Creates an {@link @fluidframework/aqueduct#BaseContainerRuntimeFactory} for a container with a single
68
+ * {@link IRootDataObject}, which is constructed from the provided schema.
69
+ *
55
70
  * @internal
56
71
  */
57
72
  export declare function createDOProviderContainerRuntimeFactory(props: {
@@ -59,6 +74,8 @@ export declare function createDOProviderContainerRuntimeFactory(props: {
59
74
  }): IRuntimeFactory;
60
75
 
61
76
  /**
77
+ * Creates an {@link IFluidContainer} from the provided `container` and `rootDataObject`.
78
+ *
62
79
  * @internal
63
80
  */
64
81
  export declare function createFluidContainer<TContainerSchema extends ContainerSchema = ContainerSchema>(props: {
@@ -67,12 +84,19 @@ export declare function createFluidContainer<TContainerSchema extends ContainerS
67
84
  }): IFluidContainer<TContainerSchema>;
68
85
 
69
86
  /**
87
+ * Creates a service audience for the provided container.
88
+ *
89
+ * @param container - The container with which the audience is associated.
90
+ * @param createServiceMember - A function for creating audience members.
91
+ *
92
+ * @typeParam TMember - The {@link IMember} representation used by the audience.
93
+ *
70
94
  * @internal
71
95
  */
72
- export declare function createServiceAudience<M extends IMember = IMember>(props: {
96
+ export declare function createServiceAudience<TMember extends IMember = IMember>(props: {
73
97
  container: IContainer;
74
- createServiceMember: (audienceMember: IClient) => M;
75
- }): IServiceAudience<M>;
98
+ createServiceMember: (audienceMember: IClient) => TMember;
99
+ }): IServiceAudience<TMember>;
76
100
 
77
101
  /**
78
102
  * A class that has a factory that can create a `DataObject` and a
@@ -111,6 +135,7 @@ export declare interface IConnection {
111
135
  * @typeparam TContainerSchema - Used to determine the type of 'initialObjects'.
112
136
  *
113
137
  * @remarks Note: external implementations of this interface are not supported.
138
+ *
114
139
  * @sealed
115
140
  * @public
116
141
  */
@@ -172,7 +197,7 @@ export declare interface IFluidContainer<TContainerSchema extends ContainerSchem
172
197
  *
173
198
  * @returns A promise which resolves when the attach is complete, with the string identifier of the container.
174
199
  */
175
- attach(): Promise<string>;
200
+ attach(props?: ContainerAttachProps): Promise<string>;
176
201
  /**
177
202
  * Attempts to connect the container to the delta stream and process operations.
178
203
  *
@@ -181,7 +206,7 @@ export declare interface IFluidContainer<TContainerSchema extends ContainerSchem
181
206
  * @remarks
182
207
  *
183
208
  * This should only be called when the container is in the
184
- * {@link @fluidframework/container-definitions#ConnectionState.Disconnected} state.
209
+ * {@link @fluidframework/container-definitions#(ConnectionState:namespace).Disconnected} state.
185
210
  *
186
211
  * This can be determined by observing {@link IFluidContainer.connectionState}.
187
212
  */
@@ -192,7 +217,7 @@ export declare interface IFluidContainer<TContainerSchema extends ContainerSchem
192
217
  * @remarks
193
218
  *
194
219
  * This should only be called when the container is in the
195
- * {@link @fluidframework/container-definitions#ConnectionState.Connected} state.
220
+ * {@link @fluidframework/container-definitions#(ConnectionState:namespace).Connected} state.
196
221
  *
197
222
  * This can be determined by observing {@link IFluidContainer.connectionState}.
198
223
  */
@@ -389,15 +414,22 @@ export declare interface IServiceAudienceEvents<M extends IMember> extends IEven
389
414
  *
390
415
  * @typeParam T - The class of the `DataObject` or `SharedObject`.
391
416
  * @public
417
+ *
418
+ * @privateRemarks
419
+ * There are some edge cases in TypeScript where the order of the members in a union matter.
420
+ * Once such edge case is when multiple members of a generic union partially match, and the type parameter is being inferred.
421
+ * In this case, its better to have the desired match and/or the simpler type first.
422
+ * In this case placing SharedObjectClass fixed one usage and didn't break anything, and generally seems more likely to work than the reverse, so this is the order being used.
423
+ * This is likely (a bug in TypeScript)[https://github.com/microsoft/TypeScript/issues/45809].
392
424
  */
393
- export declare type LoadableObjectClass<T extends IFluidLoadable> = DataObjectClass<T> | SharedObjectClass<T>;
425
+ export declare type LoadableObjectClass<T extends IFluidLoadable = IFluidLoadable> = SharedObjectClass<T> | DataObjectClass<T>;
394
426
 
395
427
  /**
396
428
  * A mapping of string identifiers to classes that will later be used to instantiate a corresponding `DataObject`
397
- * or `SharedObject` in a {@link LoadableObjectRecord}.
429
+ * or `SharedObject`.
398
430
  * @public
399
431
  */
400
- export declare type LoadableObjectClassRecord = Record<string, LoadableObjectClass<any>>;
432
+ export declare type LoadableObjectClassRecord = Record<string, LoadableObjectClass>;
401
433
 
402
434
  /**
403
435
  * An object with a constructor that will return an {@link @fluidframework/core-interfaces#IFluidLoadable}.
@@ -433,14 +465,16 @@ export declare type Myself<M extends IMember = IMember> = M & {
433
465
  };
434
466
 
435
467
  /**
436
- * A class that has a factory that can create a DDSes (`SharedObject`s) and a
437
- * constructor that will return the type of the `DataObject`.
468
+ * A factory that produces a factory that can create a DDSes (`SharedObject`s).
438
469
  *
439
470
  * @typeParam T - The class of the `SharedObject`.
440
471
  * @public
441
472
  */
442
- export declare type SharedObjectClass<T extends IFluidLoadable> = {
443
- readonly getFactory: () => IChannelFactory;
444
- } & LoadableObjectCtor<T>;
473
+ export declare interface SharedObjectClass<T extends IFluidLoadable> {
474
+ /**
475
+ * Gets the factory this factory is a wrapper for.
476
+ */
477
+ readonly getFactory: () => IChannelFactory<T>;
478
+ }
445
479
 
446
480
  export { }
@@ -1,6 +1,6 @@
1
- import { IEvent, IEventProvider, IFluidLoadable } from "@fluidframework/core-interfaces";
2
- import { AttachState, IContainer, ICriticalContainerError, ConnectionState } from "@fluidframework/container-definitions";
3
- import type { ContainerSchema, IRootDataObject, LoadableObjectClass } from "./types.mjs";
1
+ import { type IEvent, type IEventProvider, type IFluidLoadable } from "@fluidframework/core-interfaces";
2
+ import { AttachState, type IContainer, type ICriticalContainerError, type ConnectionState } from "@fluidframework/container-definitions";
3
+ import type { ContainerSchema, ContainerAttachProps, IRootDataObject, LoadableObjectClass } from "./types.js";
4
4
  /**
5
5
  * Extract the type of 'initialObjects' from the given {@link ContainerSchema} type.
6
6
  * @public
@@ -73,6 +73,7 @@ export interface IFluidContainerEvents extends IEvent {
73
73
  * @typeparam TContainerSchema - Used to determine the type of 'initialObjects'.
74
74
  *
75
75
  * @remarks Note: external implementations of this interface are not supported.
76
+ *
76
77
  * @sealed
77
78
  * @public
78
79
  */
@@ -134,7 +135,7 @@ export interface IFluidContainer<TContainerSchema extends ContainerSchema = Cont
134
135
  *
135
136
  * @returns A promise which resolves when the attach is complete, with the string identifier of the container.
136
137
  */
137
- attach(): Promise<string>;
138
+ attach(props?: ContainerAttachProps): Promise<string>;
138
139
  /**
139
140
  * Attempts to connect the container to the delta stream and process operations.
140
141
  *
@@ -143,7 +144,7 @@ export interface IFluidContainer<TContainerSchema extends ContainerSchema = Cont
143
144
  * @remarks
144
145
  *
145
146
  * This should only be called when the container is in the
146
- * {@link @fluidframework/container-definitions#ConnectionState.Disconnected} state.
147
+ * {@link @fluidframework/container-definitions#(ConnectionState:namespace).Disconnected} state.
147
148
  *
148
149
  * This can be determined by observing {@link IFluidContainer.connectionState}.
149
150
  */
@@ -154,7 +155,7 @@ export interface IFluidContainer<TContainerSchema extends ContainerSchema = Cont
154
155
  * @remarks
155
156
  *
156
157
  * This should only be called when the container is in the
157
- * {@link @fluidframework/container-definitions#ConnectionState.Connected} state.
158
+ * {@link @fluidframework/container-definitions#(ConnectionState:namespace).Connected} state.
158
159
  *
159
160
  * This can be determined by observing {@link IFluidContainer.connectionState}.
160
161
  */
@@ -179,10 +180,12 @@ export interface IFluidContainer<TContainerSchema extends ContainerSchema = Cont
179
180
  dispose(): void;
180
181
  }
181
182
  /**
183
+ * Creates an {@link IFluidContainer} from the provided `container` and `rootDataObject`.
184
+ *
182
185
  * @internal
183
186
  */
184
187
  export declare function createFluidContainer<TContainerSchema extends ContainerSchema = ContainerSchema>(props: {
185
188
  container: IContainer;
186
189
  rootDataObject: IRootDataObject;
187
190
  }): IFluidContainer<TContainerSchema>;
188
- //# sourceMappingURL=fluidContainer.d.mts.map
191
+ //# sourceMappingURL=fluidContainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fluidContainer.d.ts","sourceRoot":"","sources":["../src/fluidContainer.ts"],"names":[],"mappings":"AAKA,OAAO,EACN,KAAK,MAAM,EACX,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACN,WAAW,EACX,KAAK,UAAU,EACf,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EACX,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,eAAe,IAAI;KAMtD,CAAC,IAAI,MAAM,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,mBAAmB,CACnF,MAAM,QAAQ,CACd,GACE,QAAQ,GACR,KAAK;CACR,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,WAAW,qBAAsB,SAAQ,MAAM;IACpD;;;;;;;;;;OAUG;IACH,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAEjD;;;;;;;;;;OAUG;IACH,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAEpD;;;;;;OAMG;IACH,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAE7C;;;;;;OAMG;IACH,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAE7C;;;;;;;OAOG;IACH,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,uBAAuB,KAAK,IAAI,OAAE;CACzE;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAe,CAAC,gBAAgB,SAAS,eAAe,GAAG,eAAe,CAC1F,SAAQ,cAAc,CAAC,qBAAqB,CAAC;IAC7C;;OAEG;IACH,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAE1C;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAE3B;;;;OAIG;IACH,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAE1D;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAElC;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,KAAK,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtD;;;;;;;;;;;OAWG;IACH,OAAO,IAAI,IAAI,CAAC;IAEhB;;;;;;;;;OASG;IACH,UAAU,IAAI,IAAI,CAAC;IAEnB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,CAAC,SAAS,cAAc,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAElF;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CACnC,gBAAgB,SAAS,eAAe,GAAG,eAAe,EACzD,KAAK,EAAE;IACR,SAAS,EAAE,UAAU,CAAC;IACtB,cAAc,EAAE,eAAe,CAAC;CAChC,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAEpC"}
@@ -1,6 +1,12 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
1
5
  import { TypedEventEmitter } from "@fluid-internal/client-utils";
2
6
  import { AttachState, } from "@fluidframework/container-definitions";
3
7
  /**
8
+ * Creates an {@link IFluidContainer} from the provided `container` and `rootDataObject`.
9
+ *
4
10
  * @internal
5
11
  */
6
12
  export function createFluidContainer(props) {
@@ -86,7 +92,7 @@ class FluidContainer extends TypedEventEmitter {
86
92
  * The reason is because externally we are presenting a separation between the service and the `FluidContainer`,
87
93
  * but internally this separation is not there.
88
94
  */
89
- async attach() {
95
+ async attach(props) {
90
96
  if (this.container.attachState !== AttachState.Detached) {
91
97
  throw new Error("Cannot attach container. Container is not in detached state.");
92
98
  }
@@ -122,4 +128,4 @@ class FluidContainer extends TypedEventEmitter {
122
128
  this.container.off("dirty", this.dirtyHandler);
123
129
  }
124
130
  }
125
- //# sourceMappingURL=fluidContainer.mjs.map
131
+ //# sourceMappingURL=fluidContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fluidContainer.js","sourceRoot":"","sources":["../src/fluidContainer.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 */\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport {\n\ttype IEvent,\n\ttype IEventProvider,\n\ttype IFluidLoadable,\n} from \"@fluidframework/core-interfaces\";\nimport {\n\tAttachState,\n\ttype IContainer,\n\ttype ICriticalContainerError,\n\ttype ConnectionState,\n} from \"@fluidframework/container-definitions\";\nimport type {\n\tContainerSchema,\n\tContainerAttachProps,\n\tIRootDataObject,\n\tLoadableObjectClass,\n} from \"./types.js\";\n\n/**\n * Extract the type of 'initialObjects' from the given {@link ContainerSchema} type.\n * @public\n */\nexport type InitialObjects<T extends ContainerSchema> = {\n\t// Construct a LoadableObjectRecord type by enumerating the keys of\n\t// 'ContainerSchema.initialObjects' and inferring the value type of each key.\n\t//\n\t// The '? TChannel : never' is required because infer can only be used in\n\t// a conditional 'extends' expression.\n\t[K in keyof T[\"initialObjects\"]]: T[\"initialObjects\"][K] extends LoadableObjectClass<\n\t\tinfer TChannel\n\t>\n\t\t? TChannel\n\t\t: never;\n};\n\n/**\n * Events emitted from {@link IFluidContainer}.\n *\n * @remarks Note: external implementations of this interface are not supported.\n * @sealed\n * @public\n */\nexport interface IFluidContainerEvents extends IEvent {\n\t/**\n\t * Emitted when the {@link IFluidContainer} completes connecting to the Fluid service.\n\t *\n\t * @remarks Reflects connection state changes against the (delta) service acknowledging ops/edits.\n\t *\n\t * @see\n\t *\n\t * - {@link IFluidContainer.connectionState}\n\t *\n\t * - {@link IFluidContainer.connect}\n\t */\n\t(event: \"connected\", listener: () => void): void;\n\n\t/**\n\t * Emitted when the {@link IFluidContainer} becomes disconnected from the Fluid service.\n\t *\n\t * @remarks Reflects connection state changes against the (delta) service acknowledging ops/edits.\n\t *\n\t * @see\n\t *\n\t * - {@link IFluidContainer.connectionState}\n\t *\n\t * - {@link IFluidContainer.disconnect}\n\t */\n\t(event: \"disconnected\", listener: () => void): void;\n\n\t/**\n\t * Emitted when all local changes/edits have been acknowledged by the service.\n\t *\n\t * @remarks \"dirty\" event will be emitted when the next local change has been made.\n\t *\n\t * @see {@link IFluidContainer.isDirty}\n\t */\n\t(event: \"saved\", listener: () => void): void;\n\n\t/**\n\t * Emitted when the first local change has been made, following a \"saved\" event.\n\t *\n\t * @remarks \"saved\" event will be emitted once all local changes have been acknowledged by the service.\n\t *\n\t * @see {@link IFluidContainer.isDirty}\n\t */\n\t(event: \"dirty\", listener: () => void): void;\n\n\t/**\n\t * Emitted when the {@link IFluidContainer} is closed, which permanently disables it.\n\t *\n\t * @remarks Listener parameters:\n\t *\n\t * - `error`: If the container was closed due to error (as opposed to an explicit call to\n\t * {@link IFluidContainer.dispose}), this will contain details about the error that caused it.\n\t */\n\t(event: \"disposed\", listener: (error?: ICriticalContainerError) => void);\n}\n\n/**\n * Provides an entrypoint into the client side of collaborative Fluid data.\n * Provides access to the data as well as status on the collaboration session.\n *\n * @typeparam TContainerSchema - Used to determine the type of 'initialObjects'.\n *\n * @remarks Note: external implementations of this interface are not supported.\n *\n * @sealed\n * @public\n */\nexport interface IFluidContainer<TContainerSchema extends ContainerSchema = ContainerSchema>\n\textends IEventProvider<IFluidContainerEvents> {\n\t/**\n\t * Provides the current connected state of the container\n\t */\n\treadonly connectionState: ConnectionState;\n\n\t/**\n\t * A container is considered **dirty** if it has local changes that have not yet been acknowledged by the service.\n\t *\n\t * @remarks\n\t *\n\t * You should always check the `isDirty` flag before closing the container or navigating away from the page.\n\t * Closing the container while `isDirty === true` may result in the loss of operations that have not yet been\n\t * acknowledged by the service.\n\t *\n\t * A container is considered dirty in the following cases:\n\t *\n\t * 1. The container has been created in the detached state, and either it has not been attached yet or it is\n\t * in the process of being attached (container is in `attaching` state). If container is closed prior to being\n\t * attached, host may never know if the file was created or not.\n\t *\n\t * 2. The container was attached, but it has local changes that have not yet been saved to service endpoint.\n\t * This occurs as part of normal op flow where pending operation (changes) are awaiting acknowledgement from the\n\t * service. In some cases this can be due to lack of network connection. If the network connection is down,\n\t * it needs to be restored for the pending changes to be acknowledged.\n\t */\n\treadonly isDirty: boolean;\n\n\t/**\n\t * Whether or not the container is disposed, which permanently disables it.\n\t */\n\treadonly disposed: boolean;\n\n\t/**\n\t * The collection of data objects and Distributed Data Stores (DDSes) that were specified by the schema.\n\t *\n\t * @remarks These data objects and DDSes exist for the lifetime of the container.\n\t */\n\treadonly initialObjects: InitialObjects<TContainerSchema>;\n\n\t/**\n\t * The current attachment state of the container.\n\t *\n\t * @remarks\n\t *\n\t * Once a container has been attached, it remains attached.\n\t * When loading an existing container, it will already be attached.\n\t */\n\treadonly attachState: AttachState;\n\n\t/**\n\t * A newly created container starts detached from the collaborative service.\n\t * Calling `attach()` uploads the new container to the service and connects to the collaborative service.\n\t *\n\t * @remarks\n\t *\n\t * This should only be called when the container is in the\n\t * {@link @fluidframework/container-definitions#AttachState.Detatched} state.\n\t *\n\t * This can be determined by observing {@link IFluidContainer.attachState}.\n\t *\n\t * @returns A promise which resolves when the attach is complete, with the string identifier of the container.\n\t */\n\tattach(props?: ContainerAttachProps): Promise<string>;\n\n\t/**\n\t * Attempts to connect the container to the delta stream and process operations.\n\t *\n\t * @throws Will throw an error if connection is unsuccessful.\n\t *\n\t * @remarks\n\t *\n\t * This should only be called when the container is in the\n\t * {@link @fluidframework/container-definitions#(ConnectionState:namespace).Disconnected} state.\n\t *\n\t * This can be determined by observing {@link IFluidContainer.connectionState}.\n\t */\n\tconnect(): void;\n\n\t/**\n\t * Disconnects the container from the delta stream and stops processing operations.\n\t *\n\t * @remarks\n\t *\n\t * This should only be called when the container is in the\n\t * {@link @fluidframework/container-definitions#(ConnectionState:namespace).Connected} state.\n\t *\n\t * This can be determined by observing {@link IFluidContainer.connectionState}.\n\t */\n\tdisconnect(): void;\n\n\t/**\n\t * Create a new data object or Distributed Data Store (DDS) of the specified type.\n\t *\n\t * @remarks\n\t *\n\t * In order to share the data object or DDS with other\n\t * collaborators and retrieve it later, store its handle in a collection like a SharedDirectory from your\n\t * initialObjects.\n\t *\n\t * @param objectClass - The class of the `DataObject` or `SharedObject` to create.\n\t *\n\t * @typeParam T - The class of the `DataObject` or `SharedObject`.\n\t */\n\tcreate<T extends IFluidLoadable>(objectClass: LoadableObjectClass<T>): Promise<T>;\n\n\t/**\n\t * Dispose of the container instance, permanently disabling it.\n\t */\n\tdispose(): void;\n}\n\n/**\n * Creates an {@link IFluidContainer} from the provided `container` and `rootDataObject`.\n *\n * @internal\n */\nexport function createFluidContainer<\n\tTContainerSchema extends ContainerSchema = ContainerSchema,\n>(props: {\n\tcontainer: IContainer;\n\trootDataObject: IRootDataObject;\n}): IFluidContainer<TContainerSchema> {\n\treturn new FluidContainer<TContainerSchema>(props.container, props.rootDataObject);\n}\n\n/**\n * Base {@link IFluidContainer} implementation.\n *\n * @typeparam TContainerSchema - Used to determine the type of 'initialObjects'.\n * @remarks\n *\n * Note: this implementation is not complete. Consumers who rely on {@link IFluidContainer.attach}\n * will need to utilize or provide a service-specific implementation of this type that implements that method.\n * @deprecated use {@link createFluidContainer} and {@link IFluidContainer} instead\n * @internal\n */\nclass FluidContainer<TContainerSchema extends ContainerSchema = ContainerSchema>\n\textends TypedEventEmitter<IFluidContainerEvents>\n\timplements IFluidContainer<TContainerSchema>\n{\n\tprivate readonly connectedHandler = (): boolean => this.emit(\"connected\");\n\tprivate readonly disconnectedHandler = (): boolean => this.emit(\"disconnected\");\n\tprivate readonly disposedHandler = (error?: ICriticalContainerError): boolean =>\n\t\tthis.emit(\"disposed\", error);\n\tprivate readonly savedHandler = (): boolean => this.emit(\"saved\");\n\tprivate readonly dirtyHandler = (): boolean => this.emit(\"dirty\");\n\n\tpublic constructor(\n\t\tprivate readonly container: IContainer,\n\t\tprivate readonly rootDataObject: IRootDataObject,\n\t) {\n\t\tsuper();\n\t\tcontainer.on(\"connected\", this.connectedHandler);\n\t\tcontainer.on(\"closed\", this.disposedHandler);\n\t\tcontainer.on(\"disconnected\", this.disconnectedHandler);\n\t\tcontainer.on(\"saved\", this.savedHandler);\n\t\tcontainer.on(\"dirty\", this.dirtyHandler);\n\t}\n\n\t/**\n\t * {@inheritDoc IFluidContainer.isDirty}\n\t */\n\tpublic get isDirty(): boolean {\n\t\treturn this.container.isDirty;\n\t}\n\n\t/**\n\t * {@inheritDoc IFluidContainer.attachState}\n\t */\n\tpublic get attachState(): AttachState {\n\t\treturn this.container.attachState;\n\t}\n\n\t/**\n\t * {@inheritDoc IFluidContainer.disposed}\n\t */\n\tpublic get disposed(): boolean {\n\t\treturn this.container.closed;\n\t}\n\n\t/**\n\t * {@inheritDoc IFluidContainer.connectionState}\n\t */\n\tpublic get connectionState(): ConnectionState {\n\t\treturn this.container.connectionState;\n\t}\n\n\t/**\n\t * {@inheritDoc IFluidContainer.initialObjects}\n\t */\n\tpublic get initialObjects(): InitialObjects<TContainerSchema> {\n\t\treturn this.rootDataObject.initialObjects as InitialObjects<TContainerSchema>;\n\t}\n\n\t/**\n\t * Incomplete base implementation of {@link IFluidContainer.attach}.\n\t *\n\t * @remarks\n\t *\n\t * Note: this implementation will unconditionally throw.\n\t * Consumers who rely on this will need to utilize or provide a service specific implementation of this base type\n\t * that provides an implementation of this method.\n\t *\n\t * The reason is because externally we are presenting a separation between the service and the `FluidContainer`,\n\t * but internally this separation is not there.\n\t */\n\tpublic async attach(props?: ContainerAttachProps): Promise<string> {\n\t\tif (this.container.attachState !== AttachState.Detached) {\n\t\t\tthrow new Error(\"Cannot attach container. Container is not in detached state.\");\n\t\t}\n\t\tthrow new Error(\"Cannot attach container. Attach method not provided.\");\n\t}\n\n\t/**\n\t * {@inheritDoc IFluidContainer.connect}\n\t */\n\tpublic async connect(): Promise<void> {\n\t\tthis.container.connect?.();\n\t}\n\n\t/**\n\t * {@inheritDoc IFluidContainer.connect}\n\t */\n\tpublic async disconnect(): Promise<void> {\n\t\tthis.container.disconnect?.();\n\t}\n\n\t/**\n\t * {@inheritDoc IFluidContainer.create}\n\t */\n\tpublic async create<T extends IFluidLoadable>(objectClass: LoadableObjectClass<T>): Promise<T> {\n\t\treturn this.rootDataObject.create(objectClass);\n\t}\n\n\t/**\n\t * {@inheritDoc IFluidContainer.dispose}\n\t */\n\tpublic dispose(): void {\n\t\tthis.container.close();\n\t\tthis.container.off(\"connected\", this.connectedHandler);\n\t\tthis.container.off(\"closed\", this.disposedHandler);\n\t\tthis.container.off(\"disconnected\", this.disconnectedHandler);\n\t\tthis.container.off(\"saved\", this.savedHandler);\n\t\tthis.container.off(\"dirty\", this.dirtyHandler);\n\t}\n\n\t/**\n\t * FOR INTERNAL USE ONLY. NOT FOR EXTERNAL USE.\n\t * We make no stability guarantees here whatsoever.\n\t *\n\t * Gets the underlying {@link @fluidframework/container-definitions#IContainer}.\n\t *\n\t * @remarks Used to power debug tooling.\n\t */\n\tpublic readonly INTERNAL_CONTAINER_DO_NOT_USE?: () => IContainer = () => {\n\t\treturn this.container;\n\t};\n}\n"]}
package/lib/index.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ /**
6
+ * Provides a simple and powerful way to consume collaborative Fluid data.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ export { createFluidContainer, type IFluidContainer, type IFluidContainerEvents, type InitialObjects, } from "./fluidContainer.js";
11
+ export { createDOProviderContainerRuntimeFactory } from "./rootDataObject.js";
12
+ export { createServiceAudience } from "./serviceAudience.js";
13
+ export { type ContainerSchema, type ContainerAttachProps, type DataObjectClass, type IConnection, type IMember, type IRootDataObject, type IServiceAudience, type IServiceAudienceEvents, type LoadableObjectClass, type LoadableObjectClassRecord, type LoadableObjectCtor, type LoadableObjectRecord, type MemberChangedListener, type Myself, type SharedObjectClass, type IProvideRootDataObject, } from "./types.js";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AAEH,OAAO,EACN,oBAAoB,EACpB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,uCAAuC,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EACN,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,MAAM,EACX,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,GAC3B,MAAM,YAAY,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,13 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ /**
6
+ * Provides a simple and powerful way to consume collaborative Fluid data.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ export { createFluidContainer, } from "./fluidContainer.js";
11
+ export { createDOProviderContainerRuntimeFactory } from "./rootDataObject.js";
12
+ export { createServiceAudience } from "./serviceAudience.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AAEH,OAAO,EACN,oBAAoB,GAIpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,uCAAuC,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * Provides a simple and powerful way to consume collaborative Fluid data.\n *\n * @packageDocumentation\n */\n\nexport {\n\tcreateFluidContainer,\n\ttype IFluidContainer,\n\ttype IFluidContainerEvents,\n\ttype InitialObjects,\n} from \"./fluidContainer.js\";\nexport { createDOProviderContainerRuntimeFactory } from \"./rootDataObject.js\";\nexport { createServiceAudience } from \"./serviceAudience.js\";\nexport {\n\ttype ContainerSchema,\n\ttype ContainerAttachProps,\n\ttype DataObjectClass,\n\ttype IConnection,\n\ttype IMember,\n\ttype IRootDataObject,\n\ttype IServiceAudience,\n\ttype IServiceAudienceEvents,\n\ttype LoadableObjectClass,\n\ttype LoadableObjectClassRecord,\n\ttype LoadableObjectCtor,\n\ttype LoadableObjectRecord,\n\ttype MemberChangedListener,\n\ttype Myself,\n\ttype SharedObjectClass,\n\ttype IProvideRootDataObject,\n} from \"./types.js\";\n"]}
@@ -1,5 +1,5 @@
1
- import { IRuntimeFactory } from "@fluidframework/container-definitions";
2
- import { ContainerSchema, LoadableObjectClassRecord } from "./types.mjs";
1
+ import { type IRuntimeFactory } from "@fluidframework/container-definitions";
2
+ import { type ContainerSchema, type LoadableObjectClassRecord } from "./types.js";
3
3
  /**
4
4
  * Input props for {@link RootDataObject.initializingFirstTime}.
5
5
  */
@@ -12,9 +12,12 @@ export interface RootDataObjectProps {
12
12
  initialObjects: LoadableObjectClassRecord;
13
13
  }
14
14
  /**
15
+ * Creates an {@link @fluidframework/aqueduct#BaseContainerRuntimeFactory} for a container with a single
16
+ * {@link IRootDataObject}, which is constructed from the provided schema.
17
+ *
15
18
  * @internal
16
19
  */
17
20
  export declare function createDOProviderContainerRuntimeFactory(props: {
18
21
  schema: ContainerSchema;
19
22
  }): IRuntimeFactory;
20
- //# sourceMappingURL=rootDataObject.d.mts.map
23
+ //# sourceMappingURL=rootDataObject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rootDataObject.d.ts","sourceRoot":"","sources":["../src/rootDataObject.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAK7E,OAAO,EACN,KAAK,eAAe,EAGpB,KAAK,yBAAyB,EAG9B,MAAM,YAAY,CAAC;AAQpB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC;;;;OAIG;IACH,cAAc,EAAE,yBAAyB,CAAC;CAC1C;AA+GD;;;;;GAKG;AACH,wBAAgB,uCAAuC,CAAC,KAAK,EAAE;IAC9D,MAAM,EAAE,eAAe,CAAC;CACxB,GAAG,eAAe,CAElB"}
@@ -1,7 +1,11 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
1
5
  import { BaseContainerRuntimeFactory, DataObject, DataObjectFactory, } from "@fluidframework/aqueduct";
2
6
  import { FlushMode } from "@fluidframework/runtime-definitions";
3
7
  import { RequestParser } from "@fluidframework/runtime-utils";
4
- import { isDataObjectClass, isSharedObjectClass, parseDataObjectsFromSharedObjects, } from "./utils.mjs";
8
+ import { isDataObjectClass, isSharedObjectClass, parseDataObjectsFromSharedObjects, } from "./utils.js";
5
9
  /**
6
10
  * The entry-point/root collaborative object of the {@link IFluidContainer | Fluid Container}.
7
11
  * Abstracts the dynamic code required to build a Fluid Container into a static representation for end customers.
@@ -32,13 +36,13 @@ class RootDataObject extends DataObject {
32
36
  this.root.createSubDirectory(this.initialObjectsDirKey);
33
37
  // Create initial objects provided by the developer
34
38
  const initialObjectsP = [];
35
- Object.entries(props.initialObjects).forEach(([id, objectClass]) => {
39
+ for (const [id, objectClass] of Object.entries(props.initialObjects)) {
36
40
  const createObject = async () => {
37
41
  const obj = await this.create(objectClass);
38
42
  this.initialObjectsDir.set(id, obj.handle);
39
43
  };
40
44
  initialObjectsP.push(createObject());
41
- });
45
+ }
42
46
  await Promise.all(initialObjectsP);
43
47
  }
44
48
  /**
@@ -50,8 +54,9 @@ class RootDataObject extends DataObject {
50
54
  async hasInitialized() {
51
55
  // We will always load the initial objects so they are available to the developer
52
56
  const loadInitialObjectsP = [];
53
- for (const [key, value] of Array.from(this.initialObjectsDir.entries())) {
57
+ for (const [key, value] of this.initialObjectsDir.entries()) {
54
58
  const loadDir = async () => {
59
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
55
60
  const obj = await value.get();
56
61
  Object.assign(this._initialObjects, { [key]: obj });
57
62
  };
@@ -95,6 +100,9 @@ class RootDataObject extends DataObject {
95
100
  }
96
101
  const rootDataStoreId = "rootDOId";
97
102
  /**
103
+ * Creates an {@link @fluidframework/aqueduct#BaseContainerRuntimeFactory} for a container with a single
104
+ * {@link IRootDataObject}, which is constructed from the provided schema.
105
+ *
98
106
  * @internal
99
107
  */
100
108
  export function createDOProviderContainerRuntimeFactory(props) {
@@ -140,7 +148,7 @@ class DOProviderContainerRuntimeFactory extends BaseContainerRuntimeFactory {
140
148
  // resolution progress is tracked by the Feature 465 work item in AzDO
141
149
  flushMode: FlushMode.Immediate,
142
150
  // The runtime compressor is required to be on to use @fluidframework/tree.
143
- enableRuntimeIdCompressor: true,
151
+ enableRuntimeIdCompressor: "on",
144
152
  },
145
153
  provideEntryPoint,
146
154
  });
@@ -157,4 +165,4 @@ class DOProviderContainerRuntimeFactory extends BaseContainerRuntimeFactory {
157
165
  });
158
166
  }
159
167
  }
160
- //# sourceMappingURL=rootDataObject.mjs.map
168
+ //# sourceMappingURL=rootDataObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rootDataObject.js","sourceRoot":"","sources":["../src/rootDataObject.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 */\nimport {\n\tBaseContainerRuntimeFactory,\n\tDataObject,\n\tDataObjectFactory,\n} from \"@fluidframework/aqueduct\";\nimport { type IContainerRuntime } from \"@fluidframework/container-runtime-definitions\";\nimport {\n\ttype FluidObject,\n\ttype IFluidLoadable,\n\ttype IRequest,\n\ttype IResponse,\n} from \"@fluidframework/core-interfaces\";\nimport { FlushMode } from \"@fluidframework/runtime-definitions\";\nimport { type IRuntimeFactory } from \"@fluidframework/container-definitions\";\nimport { RequestParser } from \"@fluidframework/runtime-utils\";\nimport { type ContainerRuntime } from \"@fluidframework/container-runtime\";\nimport { type IDirectory } from \"@fluidframework/map\";\n\nimport {\n\ttype ContainerSchema,\n\ttype IRootDataObject,\n\ttype LoadableObjectClass,\n\ttype LoadableObjectClassRecord,\n\ttype LoadableObjectRecord,\n\ttype SharedObjectClass,\n} from \"./types.js\";\nimport {\n\ttype InternalDataObjectClass,\n\tisDataObjectClass,\n\tisSharedObjectClass,\n\tparseDataObjectsFromSharedObjects,\n} from \"./utils.js\";\n\n/**\n * Input props for {@link RootDataObject.initializingFirstTime}.\n */\nexport interface RootDataObjectProps {\n\t/**\n\t * Initial object structure with which the {@link RootDataObject} will be first-time initialized.\n\t *\n\t * @see {@link RootDataObject.initializingFirstTime}\n\t */\n\tinitialObjects: LoadableObjectClassRecord;\n}\n\n/**\n * The entry-point/root collaborative object of the {@link IFluidContainer | Fluid Container}.\n * Abstracts the dynamic code required to build a Fluid Container into a static representation for end customers.\n */\nclass RootDataObject\n\textends DataObject<{ InitialState: RootDataObjectProps }>\n\timplements IRootDataObject\n{\n\tprivate readonly initialObjectsDirKey = \"initial-objects-key\";\n\tprivate readonly _initialObjects: LoadableObjectRecord = {};\n\n\tpublic get IRootDataObject(): IRootDataObject {\n\t\treturn this;\n\t}\n\n\tprivate get initialObjectsDir(): IDirectory {\n\t\tconst dir = this.root.getSubDirectory(this.initialObjectsDirKey);\n\t\tif (dir === undefined) {\n\t\t\tthrow new Error(\"InitialObjects sub-directory was not initialized\");\n\t\t}\n\t\treturn dir;\n\t}\n\n\t/**\n\t * The first time this object is initialized, creates each object identified in\n\t * {@link RootDataObjectProps.initialObjects} and stores them as unique values in the root directory.\n\t *\n\t * @see {@link @fluidframework/aqueduct#PureDataObject.initializingFirstTime}\n\t */\n\tprotected async initializingFirstTime(props: RootDataObjectProps): Promise<void> {\n\t\tthis.root.createSubDirectory(this.initialObjectsDirKey);\n\n\t\t// Create initial objects provided by the developer\n\t\tconst initialObjectsP: Promise<void>[] = [];\n\t\tfor (const [id, objectClass] of Object.entries(props.initialObjects)) {\n\t\t\tconst createObject = async (): Promise<void> => {\n\t\t\t\tconst obj = await this.create<IFluidLoadable>(objectClass);\n\t\t\t\tthis.initialObjectsDir.set(id, obj.handle);\n\t\t\t};\n\t\t\tinitialObjectsP.push(createObject());\n\t\t}\n\n\t\tawait Promise.all(initialObjectsP);\n\t}\n\n\t/**\n\t * Every time an instance is initialized, loads all of the initial objects in the root directory so they can be\n\t * accessed immediately.\n\t *\n\t * @see {@link @fluidframework/aqueduct#PureDataObject.hasInitialized}\n\t */\n\tprotected async hasInitialized(): Promise<void> {\n\t\t// We will always load the initial objects so they are available to the developer\n\t\tconst loadInitialObjectsP: Promise<void>[] = [];\n\t\tfor (const [key, value] of this.initialObjectsDir.entries()) {\n\t\t\tconst loadDir = async (): Promise<void> => {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\t\t\tconst obj: unknown = await value.get();\n\t\t\t\tObject.assign(this._initialObjects, { [key]: obj });\n\t\t\t};\n\t\t\tloadInitialObjectsP.push(loadDir());\n\t\t}\n\n\t\tawait Promise.all(loadInitialObjectsP);\n\t}\n\n\t/**\n\t * {@inheritDoc IRootDataObject.initialObjects}\n\t */\n\tpublic get initialObjects(): LoadableObjectRecord {\n\t\tif (Object.keys(this._initialObjects).length === 0) {\n\t\t\tthrow new Error(\"Initial Objects were not correctly initialized\");\n\t\t}\n\t\treturn this._initialObjects;\n\t}\n\n\t/**\n\t * {@inheritDoc IRootDataObject.create}\n\t */\n\tpublic async create<T extends IFluidLoadable>(objectClass: LoadableObjectClass<T>): Promise<T> {\n\t\tif (isDataObjectClass(objectClass)) {\n\t\t\treturn this.createDataObject<T>(objectClass);\n\t\t} else if (isSharedObjectClass(objectClass)) {\n\t\t\treturn this.createSharedObject<T>(objectClass);\n\t\t}\n\t\tthrow new Error(\"Could not create new Fluid object because an unknown object was passed\");\n\t}\n\n\tprivate async createDataObject<T extends IFluidLoadable>(\n\t\tdataObjectClass: InternalDataObjectClass<T>,\n\t): Promise<T> {\n\t\tconst factory = dataObjectClass.factory;\n\t\tconst packagePath = [...this.context.packagePath, factory.type];\n\t\tconst dataStore = await this.context.containerRuntime.createDataStore(packagePath);\n\t\tconst entryPoint = await dataStore.entryPoint.get();\n\t\treturn entryPoint as unknown as T;\n\t}\n\n\tprivate createSharedObject<T extends IFluidLoadable>(\n\t\tsharedObjectClass: SharedObjectClass<T>,\n\t): T {\n\t\tconst factory = sharedObjectClass.getFactory();\n\t\tconst obj = this.runtime.createChannel(undefined, factory.type);\n\t\treturn obj as unknown as T;\n\t}\n}\n\nconst rootDataStoreId = \"rootDOId\";\n\n/**\n * Creates an {@link @fluidframework/aqueduct#BaseContainerRuntimeFactory} for a container with a single\n * {@link IRootDataObject}, which is constructed from the provided schema.\n *\n * @internal\n */\nexport function createDOProviderContainerRuntimeFactory(props: {\n\tschema: ContainerSchema;\n}): IRuntimeFactory {\n\treturn new DOProviderContainerRuntimeFactory(props.schema);\n}\n\n/**\n * Container code that provides a single {@link IRootDataObject}.\n *\n * @remarks\n *\n * This data object is dynamically customized (registry and initial objects) based on the schema provided.\n * to the container runtime factory.\n *\n * @internal\n */\nclass DOProviderContainerRuntimeFactory extends BaseContainerRuntimeFactory {\n\tprivate readonly rootDataObjectFactory: DataObjectFactory<\n\t\tRootDataObject,\n\t\t{\n\t\t\tInitialState: RootDataObjectProps;\n\t\t}\n\t>;\n\n\tprivate readonly initialObjects: LoadableObjectClassRecord;\n\n\tpublic constructor(schema: ContainerSchema) {\n\t\tconst [registryEntries, sharedObjects] = parseDataObjectsFromSharedObjects(schema);\n\t\tconst rootDataObjectFactory = new DataObjectFactory(\n\t\t\t\"rootDO\",\n\t\t\tRootDataObject,\n\t\t\tsharedObjects,\n\t\t\t{},\n\t\t\tregistryEntries,\n\t\t);\n\t\tconst provideEntryPoint = async (\n\t\t\tcontainerRuntime: IContainerRuntime,\n\t\t\t// eslint-disable-next-line unicorn/consistent-function-scoping\n\t\t): Promise<FluidObject> => {\n\t\t\tconst entryPoint =\n\t\t\t\tawait containerRuntime.getAliasedDataStoreEntryPoint(rootDataStoreId);\n\t\t\tif (entryPoint === undefined) {\n\t\t\t\tthrow new Error(`default dataStore [${rootDataStoreId}] must exist`);\n\t\t\t}\n\t\t\treturn entryPoint.get();\n\t\t};\n\t\tconst getDefaultObject = async (\n\t\t\trequest: IRequest,\n\t\t\truntime: IContainerRuntime,\n\t\t\t// eslint-disable-next-line unicorn/consistent-function-scoping\n\t\t): Promise<IResponse | undefined> => {\n\t\t\tconst parser = RequestParser.create(request);\n\t\t\tif (parser.pathParts.length === 0) {\n\t\t\t\t// This cast is safe as ContainerRuntime.loadRuntime is called in the base class\n\t\t\t\treturn (runtime as ContainerRuntime).resolveHandle({\n\t\t\t\t\turl: `/${rootDataStoreId}${parser.query}`,\n\t\t\t\t\theaders: request.headers,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn undefined; // continue search\n\t\t};\n\t\tsuper({\n\t\t\tregistryEntries: [rootDataObjectFactory.registryEntry],\n\t\t\trequestHandlers: [getDefaultObject],\n\t\t\truntimeOptions: {\n\t\t\t\t// temporary workaround to disable message batching until the message batch size issue is resolved\n\t\t\t\t// resolution progress is tracked by the Feature 465 work item in AzDO\n\t\t\t\tflushMode: FlushMode.Immediate,\n\t\t\t\t// The runtime compressor is required to be on to use @fluidframework/tree.\n\t\t\t\tenableRuntimeIdCompressor: \"on\",\n\t\t\t},\n\t\t\tprovideEntryPoint,\n\t\t});\n\t\tthis.rootDataObjectFactory = rootDataObjectFactory;\n\t\tthis.initialObjects = schema.initialObjects;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/aqueduct#BaseContainerRuntimeFactory.containerInitializingFirstTime}\n\t */\n\tprotected async containerInitializingFirstTime(runtime: IContainerRuntime): Promise<void> {\n\t\t// The first time we create the container we create the RootDataObject\n\t\tawait this.rootDataObjectFactory.createRootInstance(rootDataStoreId, runtime, {\n\t\t\tinitialObjects: this.initialObjects,\n\t\t});\n\t}\n}\n"]}
@@ -0,0 +1,22 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { type IContainer } from "@fluidframework/container-definitions";
6
+ import { type IClient } from "@fluidframework/protocol-definitions";
7
+ import { type IServiceAudience, type IMember } from "./types.js";
8
+ /**
9
+ * Creates a service audience for the provided container.
10
+ *
11
+ * @param container - The container with which the audience is associated.
12
+ * @param createServiceMember - A function for creating audience members.
13
+ *
14
+ * @typeParam TMember - The {@link IMember} representation used by the audience.
15
+ *
16
+ * @internal
17
+ */
18
+ export declare function createServiceAudience<TMember extends IMember = IMember>(props: {
19
+ container: IContainer;
20
+ createServiceMember: (audienceMember: IClient) => TMember;
21
+ }): IServiceAudience<TMember>;
22
+ //# sourceMappingURL=serviceAudience.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceAudience.d.ts","sourceRoot":"","sources":["../src/serviceAudience.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACxF,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EACN,KAAK,gBAAgB,EAErB,KAAK,OAAO,EAEZ,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,SAAS,OAAO,GAAG,OAAO,EAAE,KAAK,EAAE;IAC/E,SAAS,EAAE,UAAU,CAAC;IACtB,mBAAmB,EAAE,CAAC,cAAc,EAAE,OAAO,KAAK,OAAO,CAAC;CAC1D,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAE5B"}
@@ -4,6 +4,13 @@
4
4
  */
5
5
  import { TypedEventEmitter } from "@fluid-internal/client-utils";
6
6
  /**
7
+ * Creates a service audience for the provided container.
8
+ *
9
+ * @param container - The container with which the audience is associated.
10
+ * @param createServiceMember - A function for creating audience members.
11
+ *
12
+ * @typeParam TMember - The {@link IMember} representation used by the audience.
13
+ *
7
14
  * @internal
8
15
  */
9
16
  export function createServiceAudience(props) {
@@ -17,7 +24,8 @@ export function createServiceAudience(props) {
17
24
  * This can be extended by different service-specific client packages to additional parameters to
18
25
  * the user and client details returned in {@link IMember}.
19
26
  *
20
- * @typeParam M - A service-specific {@link IMember} implementation.
27
+ * @typeParam TMember - A service-specific {@link IMember} implementation.
28
+ *
21
29
  * @internal
22
30
  */
23
31
  class ServiceAudience extends TypedEventEmitter {
@@ -73,7 +81,7 @@ class ServiceAudience extends TypedEventEmitter {
73
81
  const users = new Map();
74
82
  const clientMemberMap = new Map();
75
83
  // Iterate through the members and get the user specifics.
76
- this.audience.getMembers().forEach((member, clientId) => {
84
+ for (const [clientId, member] of this.audience.getMembers()) {
77
85
  if (this.shouldIncludeAsMember(member)) {
78
86
  const userId = member.user.id;
79
87
  // Ensure we're tracking the user
@@ -86,7 +94,7 @@ class ServiceAudience extends TypedEventEmitter {
86
94
  user.connections.push({ id: clientId, mode: member.mode });
87
95
  clientMemberMap.set(clientId, user);
88
96
  }
89
- });
97
+ }
90
98
  this.lastMembers = clientMemberMap;
91
99
  return users;
92
100
  }
@@ -115,7 +123,7 @@ class ServiceAudience extends TypedEventEmitter {
115
123
  const allMembers = this.getMembers();
116
124
  const member = allMembers.get(internalAudienceMember?.user.id);
117
125
  if (member === undefined) {
118
- throw Error(`Attempted to fetch client ${clientId} that is not part of the current member list`);
126
+ throw new Error(`Attempted to fetch client ${clientId} that is not part of the current member list`);
119
127
  }
120
128
  return member;
121
129
  }
@@ -130,4 +138,4 @@ class ServiceAudience extends TypedEventEmitter {
130
138
  return member.details.capabilities.interactive;
131
139
  }
132
140
  }
133
- //# sourceMappingURL=serviceAudience.mjs.map
141
+ //# sourceMappingURL=serviceAudience.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceAudience.js","sourceRoot":"","sources":["../src/serviceAudience.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 { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { type IAudience, type IContainer } from \"@fluidframework/container-definitions\";\nimport { type IClient } from \"@fluidframework/protocol-definitions\";\nimport {\n\ttype IServiceAudience,\n\ttype IServiceAudienceEvents,\n\ttype IMember,\n\ttype Myself,\n} from \"./types.js\";\n\n/**\n * Creates a service audience for the provided container.\n *\n * @param container - The container with which the audience is associated.\n * @param createServiceMember - A function for creating audience members.\n *\n * @typeParam TMember - The {@link IMember} representation used by the audience.\n *\n * @internal\n */\nexport function createServiceAudience<TMember extends IMember = IMember>(props: {\n\tcontainer: IContainer;\n\tcreateServiceMember: (audienceMember: IClient) => TMember;\n}): IServiceAudience<TMember> {\n\treturn new ServiceAudience(props.container, props.createServiceMember);\n}\n\n/**\n * Base class for providing audience information for sessions interacting with {@link IFluidContainer}\n *\n * @remarks\n *\n * This can be extended by different service-specific client packages to additional parameters to\n * the user and client details returned in {@link IMember}.\n *\n * @typeParam TMember - A service-specific {@link IMember} implementation.\n *\n * @internal\n */\nclass ServiceAudience<TMember extends IMember = IMember>\n\textends TypedEventEmitter<IServiceAudienceEvents<TMember>>\n\timplements IServiceAudience<TMember>\n{\n\t/**\n\t * Audience object which includes all the existing members of the {@link IFluidContainer | container}.\n\t */\n\tprivate readonly audience: IAudience;\n\n\t/**\n\t * Retain the most recent member list.\n\t *\n\t * @remarks\n\t *\n\t * This is so we have more information about a member leaving the audience in the `removeMember` event.\n\t *\n\t * It allows us to match the behavior of the `addMember` event where it only fires on a change to the members this\n\t * class exposes (and would actually produce a change in what `getMembers` returns).\n\t *\n\t * It also allows us to provide the client details in the event which makes it easier to find that client connection\n\t * in a map keyed on the `userId` and not `clientId`.\n\t *\n\t * This map will always be up-to-date in a `removeMember` event because it is set once at construction and in\n\t * every `addMember` event. It is mapped `clientId` to `M` to be better work with what the {@link IServiceAudience}\n\t * events provide.\n\t */\n\tprivate lastMembers = new Map<string, TMember>();\n\n\tpublic constructor(\n\t\t/**\n\t\t * Fluid Container to read the audience from.\n\t\t */\n\t\tprivate readonly container: IContainer,\n\t\tprivate readonly createServiceMember: (audienceMember: IClient) => TMember,\n\t) {\n\t\tsuper();\n\t\tthis.audience = container.audience;\n\n\t\t// getMembers will assign lastMembers so the removeMember event has what it needs\n\t\t// in case it would fire before getMembers otherwise gets called the first time\n\t\tthis.getMembers();\n\n\t\tthis.audience.on(\"addMember\", (clientId: string, details: IClient) => {\n\t\t\tif (this.shouldIncludeAsMember(details)) {\n\t\t\t\tconst member = this.getMember(clientId);\n\t\t\t\tthis.emit(\"memberAdded\", clientId, member);\n\t\t\t\tthis.emit(\"membersChanged\");\n\t\t\t}\n\t\t});\n\n\t\tthis.audience.on(\"removeMember\", (clientId: string) => {\n\t\t\tif (this.lastMembers.has(clientId)) {\n\t\t\t\tthis.emit(\"memberRemoved\", clientId, this.lastMembers.get(clientId));\n\t\t\t\tthis.emit(\"membersChanged\");\n\t\t\t}\n\t\t});\n\n\t\tthis.container.on(\"connected\", () => this.emit(\"membersChanged\"));\n\t}\n\n\t/**\n\t * {@inheritDoc IServiceAudience.getMembers}\n\t */\n\tpublic getMembers(): Map<string, TMember> {\n\t\tconst users = new Map<string, TMember>();\n\t\tconst clientMemberMap = new Map<string, TMember>();\n\t\t// Iterate through the members and get the user specifics.\n\t\tfor (const [clientId, member] of this.audience.getMembers()) {\n\t\t\tif (this.shouldIncludeAsMember(member)) {\n\t\t\t\tconst userId = member.user.id;\n\t\t\t\t// Ensure we're tracking the user\n\t\t\t\tlet user = users.get(userId);\n\t\t\t\tif (user === undefined) {\n\t\t\t\t\tuser = this.createServiceMember(member);\n\t\t\t\t\tusers.set(userId, user);\n\t\t\t\t}\n\n\t\t\t\t// Add this connection to their collection\n\t\t\t\tuser.connections.push({ id: clientId, mode: member.mode });\n\t\t\t\tclientMemberMap.set(clientId, user);\n\t\t\t}\n\t\t}\n\t\tthis.lastMembers = clientMemberMap;\n\t\treturn users;\n\t}\n\n\t/**\n\t * {@inheritDoc IServiceAudience.getMyself}\n\t */\n\tpublic getMyself(): Myself<TMember> | undefined {\n\t\tconst clientId = this.container.clientId;\n\t\tif (clientId === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst member = this.getMember(clientId);\n\t\tif (member === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst myself: Myself<TMember> = { ...member, currentConnection: clientId };\n\n\t\treturn myself;\n\t}\n\n\tprivate getMember(clientId: string): TMember | undefined {\n\t\t// Fetch the user ID assoicated with this client ID from the runtime\n\t\tconst internalAudienceMember = this.audience.getMember(clientId);\n\t\tif (internalAudienceMember === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\t// Return the member object with any other clients associated for this user\n\t\tconst allMembers = this.getMembers();\n\t\tconst member = allMembers.get(internalAudienceMember?.user.id);\n\t\tif (member === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`Attempted to fetch client ${clientId} that is not part of the current member list`,\n\t\t\t);\n\t\t}\n\t\treturn member;\n\t}\n\n\t/**\n\t * Provides ability for the inheriting class to include/omit specific members.\n\t * An example use case is omitting the summarizer client.\n\t *\n\t * @param member - Member to be included/omitted.\n\t */\n\tprivate shouldIncludeAsMember(member: IClient): boolean {\n\t\t// Include only human members\n\t\treturn member.details.capabilities.interactive;\n\t}\n}\n"]}
@@ -0,0 +1,21 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ // Type tests for InitialObjects
6
+ {
7
+ // ContainerSchema case
8
+ {
9
+ }
10
+ // LoadableObjectClass case
11
+ {
12
+ }
13
+ // SharedObject case
14
+ {
15
+ }
16
+ // DataObject case
17
+ {
18
+ }
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=fluidContainer.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fluidContainer.spec.js","sourceRoot":"","sources":["../../src/test/fluidContainer.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,gCAAgC;AAChC;IACC,uBAAuB;IACvB;KAIC;IAgBD,2BAA2B;IAC3B;KAIC;IAED,oBAAoB;IACpB;KAIC;IAED,kBAAkB;IAClB;KAIC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { IFluidLoadable } from \"@fluidframework/core-interfaces\";\nimport type { IChannel } from \"@fluidframework/datastore-definitions\";\nimport type { InitialObjects } from \"../index.js\";\nimport type {\n\tContainerSchema,\n\tDataObjectClass,\n\tLoadableObjectClass,\n\tSharedObjectClass,\n} from \"../types.js\";\n\n/**\n * Compile time assert that A is assignable to (extends) B.\n * To use, simply define a type:\n * `type _check = requireAssignableTo<T, Expected>;`\n */\nexport type requireAssignableTo<_A extends B, B> = true;\n\n// Type tests for InitialObjects\n{\n\t// ContainerSchema case\n\t{\n\t\ttype _a = InitialObjects<ContainerSchema>;\n\t\ttype _b = requireAssignableTo<_a, Record<string, IFluidLoadable>>;\n\t\ttype _c = requireAssignableTo<Record<string, IFluidLoadable>, _a>;\n\t}\n\ttype ContainerSchemaWith<T> = ContainerSchema & { initialObjects: { item: T } };\n\tinterface TestSharedObject extends IChannel {\n\t\tx: number;\n\t}\n\tinterface TestSharedObjectFactory extends SharedObjectClass<TestSharedObject> {\n\t\ty: number;\n\t}\n\n\tinterface TestDataObject extends IFluidLoadable {\n\t\tx: number;\n\t}\n\tinterface TestDataObjectFactory extends DataObjectClass<TestDataObject> {\n\t\ty: number;\n\t}\n\n\t// LoadableObjectClass case\n\t{\n\t\ttype _a = InitialObjects<ContainerSchemaWith<LoadableObjectClass>>[\"item\"];\n\t\ttype _b = requireAssignableTo<_a, IFluidLoadable>;\n\t\ttype _c = requireAssignableTo<IFluidLoadable, _a>;\n\t}\n\n\t// SharedObject case\n\t{\n\t\ttype _a = InitialObjects<ContainerSchemaWith<TestSharedObjectFactory>>[\"item\"];\n\t\ttype _b = requireAssignableTo<_a, TestSharedObject>;\n\t\ttype _c = requireAssignableTo<TestSharedObject, _a>;\n\t}\n\n\t// DataObject case\n\t{\n\t\ttype _a = InitialObjects<ContainerSchemaWith<TestDataObjectFactory>>[\"item\"];\n\t\ttype _b = requireAssignableTo<_a, TestDataObject>;\n\t\ttype _c = requireAssignableTo<TestDataObject, _a>;\n\t}\n}\n"]}