@fluidframework/fluid-static 1.4.0-121020 → 2.0.0-dev-rc.1.0.0.224419
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +8 -10
- package/.mocharc.js +12 -0
- package/CHANGELOG.md +225 -53
- package/README.md +38 -0
- package/api-extractor-lint.json +4 -0
- package/api-extractor.json +2 -2
- package/api-report/fluid-static.api.md +141 -0
- package/dist/fluid-static-alpha.d.ts +408 -0
- package/dist/fluid-static-beta.d.ts +412 -0
- package/dist/fluid-static-public.d.ts +412 -0
- package/dist/fluid-static-untrimmed.d.ts +452 -0
- package/dist/{fluidContainer.js → fluidContainer.cjs} +39 -12
- package/dist/fluidContainer.cjs.map +1 -0
- package/dist/fluidContainer.d.ts +95 -142
- package/dist/fluidContainer.d.ts.map +1 -1
- package/dist/index.cjs +19 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/{rootDataObject.js → rootDataObject.cjs} +59 -23
- package/dist/rootDataObject.cjs.map +1 -0
- package/dist/rootDataObject.d.ts +9 -59
- package/dist/rootDataObject.d.ts.map +1 -1
- package/dist/{serviceAudience.js → serviceAudience.cjs} +44 -20
- package/dist/serviceAudience.cjs.map +1 -0
- package/dist/serviceAudience.d.ts +7 -54
- package/dist/serviceAudience.d.ts.map +1 -1
- package/dist/tsdoc-metadata.json +11 -0
- package/dist/{types.js → types.cjs} +1 -1
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.ts +130 -80
- package/dist/types.d.ts.map +1 -1
- package/dist/{utils.js → utils.cjs} +7 -9
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.ts +10 -2
- package/dist/utils.d.ts.map +1 -1
- package/lib/fluid-static-alpha.d.mts +408 -0
- package/lib/fluid-static-beta.d.mts +412 -0
- package/lib/fluid-static-public.d.mts +412 -0
- package/lib/fluid-static-untrimmed.d.mts +452 -0
- package/lib/fluidContainer.d.mts +188 -0
- package/lib/fluidContainer.d.mts.map +1 -0
- package/lib/{fluidContainer.js → fluidContainer.mjs} +36 -13
- package/lib/fluidContainer.mjs.map +1 -0
- package/lib/index.d.mts +9 -0
- package/lib/index.d.mts.map +1 -0
- package/lib/index.mjs +8 -0
- package/lib/index.mjs.map +1 -0
- package/lib/rootDataObject.d.mts +20 -0
- package/lib/rootDataObject.d.mts.map +1 -0
- package/lib/{rootDataObject.js → rootDataObject.mjs} +61 -28
- package/lib/rootDataObject.mjs.map +1 -0
- package/lib/serviceAudience.d.mts +15 -0
- package/lib/serviceAudience.d.mts.map +1 -0
- package/lib/{serviceAudience.js → serviceAudience.mjs} +42 -18
- package/lib/serviceAudience.mjs.map +1 -0
- package/lib/types.d.mts +223 -0
- package/lib/types.d.mts.map +1 -0
- package/lib/{types.js → types.mjs} +1 -1
- package/lib/types.mjs.map +1 -0
- package/lib/{utils.d.ts → utils.d.mts} +11 -3
- package/lib/utils.d.mts.map +1 -0
- package/lib/{utils.js → utils.mjs} +7 -9
- package/lib/utils.mjs.map +1 -0
- package/package.json +130 -61
- package/prettier.config.cjs +8 -0
- package/src/fluidContainer.ts +316 -250
- package/src/index.ts +25 -4
- package/src/rootDataObject.ts +203 -157
- package/src/serviceAudience.ts +152 -124
- package/src/types.ts +190 -132
- package/src/utils.ts +44 -39
- package/tsc-multi.test.json +4 -0
- package/tsconfig.json +12 -16
- package/dist/fluidContainer.js.map +0 -1
- package/dist/index.js +0 -26
- package/dist/index.js.map +0 -1
- package/dist/rootDataObject.js.map +0 -1
- package/dist/serviceAudience.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils.js.map +0 -1
- package/lib/fluidContainer.d.ts +0 -235
- package/lib/fluidContainer.d.ts.map +0 -1
- package/lib/fluidContainer.js.map +0 -1
- package/lib/index.d.ts +0 -14
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -14
- package/lib/index.js.map +0 -1
- package/lib/rootDataObject.d.ts +0 -70
- package/lib/rootDataObject.d.ts.map +0 -1
- package/lib/rootDataObject.js.map +0 -1
- package/lib/serviceAudience.d.ts +0 -62
- package/lib/serviceAudience.d.ts.map +0 -1
- package/lib/serviceAudience.js.map +0 -1
- package/lib/types.d.ts +0 -173
- package/lib/types.d.ts.map +0 -1
- package/lib/types.js.map +0 -1
- package/lib/utils.d.ts.map +0 -1
- package/lib/utils.js.map +0 -1
- package/tsconfig.esnext.json +0 -7
package/src/serviceAudience.ts
CHANGED
|
@@ -3,134 +3,162 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { TypedEventEmitter } from "@
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
}
|