@fluidframework/fluid-static 1.4.0-121020 → 2.0.0-dev-rc.1.0.0.225277

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 (101) hide show
  1. package/.eslintrc.js +8 -10
  2. package/.mocharc.js +12 -0
  3. package/CHANGELOG.md +225 -53
  4. package/README.md +38 -0
  5. package/api-extractor-esm.json +4 -0
  6. package/api-extractor-lint.json +4 -0
  7. package/api-extractor.json +2 -2
  8. package/api-report/fluid-static.api.md +141 -0
  9. package/dist/fluid-static-alpha.d.ts +408 -0
  10. package/dist/fluid-static-beta.d.ts +412 -0
  11. package/dist/fluid-static-public.d.ts +412 -0
  12. package/dist/fluid-static-untrimmed.d.ts +452 -0
  13. package/dist/{fluidContainer.js → fluidContainer.cjs} +39 -12
  14. package/dist/fluidContainer.cjs.map +1 -0
  15. package/dist/fluidContainer.d.ts +95 -142
  16. package/dist/fluidContainer.d.ts.map +1 -1
  17. package/dist/index.cjs +19 -0
  18. package/dist/index.cjs.map +1 -0
  19. package/dist/index.d.ts +4 -4
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/{rootDataObject.js → rootDataObject.cjs} +59 -23
  22. package/dist/rootDataObject.cjs.map +1 -0
  23. package/dist/rootDataObject.d.ts +9 -59
  24. package/dist/rootDataObject.d.ts.map +1 -1
  25. package/dist/{serviceAudience.js → serviceAudience.cjs} +44 -20
  26. package/dist/serviceAudience.cjs.map +1 -0
  27. package/dist/serviceAudience.d.ts +7 -54
  28. package/dist/serviceAudience.d.ts.map +1 -1
  29. package/dist/tsdoc-metadata.json +11 -0
  30. package/dist/{types.js → types.cjs} +1 -1
  31. package/dist/types.cjs.map +1 -0
  32. package/dist/types.d.ts +130 -80
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/{utils.js → utils.cjs} +7 -9
  35. package/dist/utils.cjs.map +1 -0
  36. package/dist/utils.d.ts +10 -2
  37. package/dist/utils.d.ts.map +1 -1
  38. package/lib/fluid-static-alpha.d.mts +402 -0
  39. package/lib/fluid-static-beta.d.mts +406 -0
  40. package/lib/fluid-static-public.d.mts +406 -0
  41. package/lib/fluid-static-untrimmed.d.mts +446 -0
  42. package/lib/fluidContainer.d.mts +188 -0
  43. package/lib/fluidContainer.d.mts.map +1 -0
  44. package/lib/{fluidContainer.js → fluidContainer.mjs} +36 -13
  45. package/lib/fluidContainer.mjs.map +1 -0
  46. package/lib/index.d.mts +9 -0
  47. package/lib/index.d.mts.map +1 -0
  48. package/lib/index.mjs +8 -0
  49. package/lib/index.mjs.map +1 -0
  50. package/lib/rootDataObject.d.mts +20 -0
  51. package/lib/rootDataObject.d.mts.map +1 -0
  52. package/lib/{rootDataObject.js → rootDataObject.mjs} +61 -28
  53. package/lib/rootDataObject.mjs.map +1 -0
  54. package/lib/serviceAudience.d.mts +15 -0
  55. package/lib/serviceAudience.d.mts.map +1 -0
  56. package/lib/{serviceAudience.js → serviceAudience.mjs} +42 -18
  57. package/lib/serviceAudience.mjs.map +1 -0
  58. package/lib/types.d.mts +223 -0
  59. package/lib/types.d.mts.map +1 -0
  60. package/lib/{types.js → types.mjs} +1 -1
  61. package/lib/types.mjs.map +1 -0
  62. package/lib/{utils.d.ts → utils.d.mts} +12 -4
  63. package/lib/utils.d.mts.map +1 -0
  64. package/lib/{utils.js → utils.mjs} +7 -9
  65. package/lib/utils.mjs.map +1 -0
  66. package/package.json +151 -60
  67. package/prettier.config.cjs +8 -0
  68. package/src/fluidContainer.ts +316 -250
  69. package/src/index.ts +25 -4
  70. package/src/rootDataObject.ts +203 -157
  71. package/src/serviceAudience.ts +152 -124
  72. package/src/types.ts +190 -132
  73. package/src/utils.ts +44 -39
  74. package/tsc-multi.test.json +4 -0
  75. package/tsconfig.json +12 -16
  76. package/dist/fluidContainer.js.map +0 -1
  77. package/dist/index.js +0 -26
  78. package/dist/index.js.map +0 -1
  79. package/dist/rootDataObject.js.map +0 -1
  80. package/dist/serviceAudience.js.map +0 -1
  81. package/dist/types.js.map +0 -1
  82. package/dist/utils.js.map +0 -1
  83. package/lib/fluidContainer.d.ts +0 -235
  84. package/lib/fluidContainer.d.ts.map +0 -1
  85. package/lib/fluidContainer.js.map +0 -1
  86. package/lib/index.d.ts +0 -14
  87. package/lib/index.d.ts.map +0 -1
  88. package/lib/index.js +0 -14
  89. package/lib/index.js.map +0 -1
  90. package/lib/rootDataObject.d.ts +0 -70
  91. package/lib/rootDataObject.d.ts.map +0 -1
  92. package/lib/rootDataObject.js.map +0 -1
  93. package/lib/serviceAudience.d.ts +0 -62
  94. package/lib/serviceAudience.d.ts.map +0 -1
  95. package/lib/serviceAudience.js.map +0 -1
  96. package/lib/types.d.ts +0 -173
  97. package/lib/types.d.ts.map +0 -1
  98. package/lib/types.js.map +0 -1
  99. package/lib/utils.d.ts.map +0 -1
  100. package/lib/utils.js.map +0 -1
  101. package/tsconfig.esnext.json +0 -7
@@ -3,134 +3,162 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { TypedEventEmitter } from "@fluidframework/common-utils";
6
+ import { TypedEventEmitter } from "@fluid-internal/client-utils";
7
7
  import { IAudience, IContainer } from "@fluidframework/container-definitions";
8
8
  import { IClient } from "@fluidframework/protocol-definitions";
9
- import { IServiceAudience, IServiceAudienceEvents, IMember } from "./types";
9
+ import { IServiceAudience, IServiceAudienceEvents, IMember, Myself } from "./types";
10
10
 
11
11
  /**
12
- * Base class for providing audience information for sessions interacting with FluidContainer
12
+ * @internal
13
+ */
14
+ export function createServiceAudience<M extends IMember = IMember>(props: {
15
+ container: IContainer;
16
+ createServiceMember: (audienceMember: IClient) => M;
17
+ }): IServiceAudience<M> {
18
+ return new ServiceAudience(props.container, props.createServiceMember);
19
+ }
20
+
21
+ /**
22
+ * Base class for providing audience information for sessions interacting with {@link IFluidContainer}
23
+ *
24
+ * @remarks
25
+ *
13
26
  * This can be extended by different service-specific client packages to additional parameters to
14
- * the user and client details returned in IMember
15
- * @typeParam M - A service-specific member type.
27
+ * the user and client details returned in {@link IMember}.
28
+ *
29
+ * @typeParam M - A service-specific {@link IMember} implementation.
30
+ * @internal
16
31
  */
17
- export abstract class ServiceAudience<M extends IMember = IMember>
18
- extends TypedEventEmitter<IServiceAudienceEvents<M>>
19
- implements IServiceAudience<M> {
20
- /**
21
- * Audience object which includes all the existing members of the container.
22
- */
23
- protected readonly audience: IAudience;
24
-
25
- /**
26
- * Retain the most recent member list. This is so we have more information about a member
27
- * leaving the audience in the removeMember event. It allows us to match the behavior of the
28
- * addMember event where it only fires on a change to the members this class exposes (and would
29
- * actually produce a change in what getMembers returns). It also allows us to provide the
30
- * client details in the event which makes it easier to find that client connection in a map
31
- * keyed on the userId and not clientId.
32
- * This map will always be up-to-date in a removeMember event because it is set once at
33
- * construction and in every addMember event.
34
- * It is mapped clientId to M to be better work with what the IAudience event provides
35
- */
36
- protected lastMembers: Map<string, M> = new Map();
37
-
38
- constructor(
39
- /**
40
- * Fluid Container to read the audience from.
41
- */
42
- protected readonly container: IContainer,
43
- ) {
44
- super();
45
- this.audience = container.audience;
46
-
47
- // getMembers will assign lastMembers so the removeMember event has what it needs
48
- // in case it would fire before getMembers otherwise gets called the first time
49
- this.getMembers();
50
-
51
- this.audience.on("addMember", (clientId: string, details: IClient) => {
52
- if (this.shouldIncludeAsMember(details)) {
53
- const member = this.getMember(clientId);
54
- this.emit("memberAdded", clientId, member);
55
- this.emit("membersChanged");
56
- }
57
- });
58
-
59
- this.audience.on("removeMember", (clientId: string) => {
60
- if (this.lastMembers.has(clientId)) {
61
- this.emit("memberRemoved", clientId, this.lastMembers.get(clientId));
62
- this.emit("membersChanged");
63
- }
64
- });
65
-
66
- this.container.on("connected", () => this.emit("membersChanged"));
67
- }
68
-
69
- /**
70
- * Provides ability for inheriting class to modify/extend the audience object.
71
- * @param audienceMember - Record of a specific audience member.
72
- */
73
- protected abstract createServiceMember(audienceMember: IClient): M;
74
-
75
- /**
76
- * {@inheritDoc IServiceAudience.getMembers}
77
- */
78
- public getMembers(): Map<string, M> {
79
- const users = new Map<string, M>();
80
- const clientMemberMap = new Map<string, M>();
81
- // Iterate through the members and get the user specifics.
82
- this.audience.getMembers().forEach((member: IClient, clientId: string) => {
83
- if (this.shouldIncludeAsMember(member)) {
84
- const userId = member.user.id;
85
- // Ensure we're tracking the user
86
- let user = users.get(userId);
87
- if (user === undefined) {
88
- user = this.createServiceMember(member);
89
- users.set(userId, user);
90
- }
91
-
92
- // Add this connection to their collection
93
- user.connections.push({ id: clientId, mode: member.mode });
94
- clientMemberMap.set(clientId, user);
95
- }
96
- });
97
- this.lastMembers = clientMemberMap;
98
- return users;
99
- }
100
-
101
- /**
102
- * {@inheritDoc IServiceAudience.getMyself}
103
- */
104
- public getMyself(): M | undefined {
105
- const clientId = this.container.clientId;
106
- if (clientId === undefined) {
107
- return undefined;
108
- }
109
- return this.getMember(clientId);
110
- }
111
-
112
- private getMember(clientId: string): M | undefined {
113
- // Fetch the user ID assoicated with this client ID from the runtime
114
- const internalAudienceMember = this.audience.getMember(clientId);
115
- if (internalAudienceMember === undefined) {
116
- return undefined;
117
- }
118
- // Return the member object with any other clients associated for this user
119
- const allMembers = this.getMembers();
120
- const member = allMembers.get(internalAudienceMember?.user.id);
121
- if (member === undefined) {
122
- throw Error(`Attempted to fetch client ${clientId} that is not part of the current member list`);
123
- }
124
- return member;
125
- }
126
-
127
- /**
128
- * Provides ability for the inheriting class to include/omit specific members.
129
- * An example use case is omitting the summarizer client.
130
- * @param member - Member to be included/omitted.
131
- */
132
- protected shouldIncludeAsMember(member: IClient): boolean {
133
- // Include only human members
134
- return member.details.capabilities.interactive;
135
- }
32
+ class ServiceAudience<M extends IMember = IMember>
33
+ extends TypedEventEmitter<IServiceAudienceEvents<M>>
34
+ implements IServiceAudience<M>
35
+ {
36
+ /**
37
+ * Audience object which includes all the existing members of the {@link IFluidContainer | container}.
38
+ */
39
+ private readonly audience: IAudience;
40
+
41
+ /**
42
+ * Retain the most recent member list.
43
+ *
44
+ * @remarks
45
+ *
46
+ * This is so we have more information about a member leaving the audience in the `removeMember` event.
47
+ *
48
+ * It allows us to match the behavior of the `addMember` event where it only fires on a change to the members this
49
+ * class exposes (and would actually produce a change in what `getMembers` returns).
50
+ *
51
+ * It also allows us to provide the client details in the event which makes it easier to find that client connection
52
+ * in a map keyed on the `userId` and not `clientId`.
53
+ *
54
+ * This map will always be up-to-date in a `removeMember` event because it is set once at construction and in
55
+ * every `addMember` event. It is mapped `clientId` to `M` to be better work with what the {@link IServiceAudience}
56
+ * events provide.
57
+ */
58
+ private lastMembers = new Map<string, M>();
59
+
60
+ constructor(
61
+ /**
62
+ * Fluid Container to read the audience from.
63
+ */
64
+ private readonly container: IContainer,
65
+ private readonly createServiceMember: (audienceMember: IClient) => M,
66
+ ) {
67
+ super();
68
+ this.audience = container.audience;
69
+
70
+ // getMembers will assign lastMembers so the removeMember event has what it needs
71
+ // in case it would fire before getMembers otherwise gets called the first time
72
+ this.getMembers();
73
+
74
+ this.audience.on("addMember", (clientId: string, details: IClient) => {
75
+ if (this.shouldIncludeAsMember(details)) {
76
+ const member = this.getMember(clientId);
77
+ this.emit("memberAdded", clientId, member);
78
+ this.emit("membersChanged");
79
+ }
80
+ });
81
+
82
+ this.audience.on("removeMember", (clientId: string) => {
83
+ if (this.lastMembers.has(clientId)) {
84
+ this.emit("memberRemoved", clientId, this.lastMembers.get(clientId));
85
+ this.emit("membersChanged");
86
+ }
87
+ });
88
+
89
+ this.container.on("connected", () => this.emit("membersChanged"));
90
+ }
91
+
92
+ /**
93
+ * {@inheritDoc IServiceAudience.getMembers}
94
+ */
95
+ public getMembers(): Map<string, M> {
96
+ const users = new Map<string, M>();
97
+ const clientMemberMap = new Map<string, M>();
98
+ // Iterate through the members and get the user specifics.
99
+ this.audience.getMembers().forEach((member: IClient, clientId: string) => {
100
+ if (this.shouldIncludeAsMember(member)) {
101
+ const userId = member.user.id;
102
+ // Ensure we're tracking the user
103
+ let user = users.get(userId);
104
+ if (user === undefined) {
105
+ user = this.createServiceMember(member);
106
+ users.set(userId, user);
107
+ }
108
+
109
+ // Add this connection to their collection
110
+ user.connections.push({ id: clientId, mode: member.mode });
111
+ clientMemberMap.set(clientId, user);
112
+ }
113
+ });
114
+ this.lastMembers = clientMemberMap;
115
+ return users;
116
+ }
117
+
118
+ /**
119
+ * {@inheritDoc IServiceAudience.getMyself}
120
+ */
121
+ public getMyself(): Myself<M> | undefined {
122
+ const clientId = this.container.clientId;
123
+ if (clientId === undefined) {
124
+ return undefined;
125
+ }
126
+
127
+ const member = this.getMember(clientId);
128
+ if (member === undefined) {
129
+ return undefined;
130
+ }
131
+
132
+ const myself: Myself<M> = { ...member, currentConnection: clientId };
133
+
134
+ return myself;
135
+ }
136
+
137
+ private getMember(clientId: string): M | undefined {
138
+ // Fetch the user ID assoicated with this client ID from the runtime
139
+ const internalAudienceMember = this.audience.getMember(clientId);
140
+ if (internalAudienceMember === undefined) {
141
+ return undefined;
142
+ }
143
+ // Return the member object with any other clients associated for this user
144
+ const allMembers = this.getMembers();
145
+ const member = allMembers.get(internalAudienceMember?.user.id);
146
+ if (member === undefined) {
147
+ throw Error(
148
+ `Attempted to fetch client ${clientId} that is not part of the current member list`,
149
+ );
150
+ }
151
+ return member;
152
+ }
153
+
154
+ /**
155
+ * Provides ability for the inheriting class to include/omit specific members.
156
+ * An example use case is omitting the summarizer client.
157
+ *
158
+ * @param member - Member to be included/omitted.
159
+ */
160
+ private shouldIncludeAsMember(member: IClient): boolean {
161
+ // Include only human members
162
+ return member.details.capabilities.interactive;
163
+ }
136
164
  }