@webex/plugin-meetings 3.8.0-next.82 → 3.8.0-next.83
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/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/member/index.js +45 -9
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +3 -0
- package/dist/member/types.js.map +1 -1
- package/dist/member/util.js +18 -13
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +95 -29
- package/dist/members/index.js.map +1 -1
- package/dist/types/member/index.d.ts +20 -6
- package/dist/types/member/types.d.ts +73 -14
- package/dist/types/member/util.d.ts +31 -34
- package/dist/types/members/collection.d.ts +6 -5
- package/dist/types/members/index.d.ts +17 -43
- package/dist/webinar/index.js +1 -1
- package/package.json +3 -3
- package/src/member/index.ts +58 -23
- package/src/member/types.ts +82 -16
- package/src/member/util.ts +45 -41
- package/src/members/collection.ts +4 -3
- package/src/members/index.ts +90 -18
- package/test/unit/spec/members/index.js +164 -52
@@ -12,20 +12,6 @@ export type ServerRoleShape = {
|
|
12
12
|
type: ServerRoles;
|
13
13
|
hasRole: boolean;
|
14
14
|
};
|
15
|
-
export type ParticipantWithRoles = {
|
16
|
-
controls: {
|
17
|
-
role: {
|
18
|
-
roles: Array<ServerRoleShape>;
|
19
|
-
};
|
20
|
-
};
|
21
|
-
};
|
22
|
-
export type ParticipantWithBrb = {
|
23
|
-
controls: {
|
24
|
-
brb?: {
|
25
|
-
enabled: boolean;
|
26
|
-
};
|
27
|
-
};
|
28
|
-
};
|
29
15
|
export declare enum MediaStatus {
|
30
16
|
RECVONLY = "RECVONLY",
|
31
17
|
SENDONLY = "SENDONLY",
|
@@ -37,3 +23,76 @@ export interface IMediaStatus {
|
|
37
23
|
audio: MediaStatus;
|
38
24
|
video: MediaStatus;
|
39
25
|
}
|
26
|
+
export type Csi = number;
|
27
|
+
export type Direction = 'inactive' | 'sendrecv' | 'sendonly' | 'recvonly';
|
28
|
+
export type ParticipantUrl = string;
|
29
|
+
export interface MediaSession {
|
30
|
+
csi: Csi;
|
31
|
+
direction: Direction;
|
32
|
+
mediaContent: 'main' | 'slides';
|
33
|
+
mediaType: 'audio' | 'video';
|
34
|
+
state: string;
|
35
|
+
}
|
36
|
+
export interface Intent {
|
37
|
+
associatedWith: ParticipantUrl;
|
38
|
+
id: string;
|
39
|
+
type: string;
|
40
|
+
}
|
41
|
+
export interface ParticipantDevice {
|
42
|
+
correlationId: string;
|
43
|
+
csis: Csi[];
|
44
|
+
deviceType: string;
|
45
|
+
intent?: Intent;
|
46
|
+
intents: Array<Intent | null>;
|
47
|
+
isVideoCallback: boolean;
|
48
|
+
mediaSessions: Array<MediaSession>;
|
49
|
+
mediaSessionsExternal: boolean;
|
50
|
+
state: string;
|
51
|
+
}
|
52
|
+
export interface ParticipantPerson {
|
53
|
+
id: string;
|
54
|
+
isExternal: boolean;
|
55
|
+
name: string;
|
56
|
+
orgId: string;
|
57
|
+
}
|
58
|
+
export interface ParticipantMediaStatus {
|
59
|
+
audioStatus: MediaStatus;
|
60
|
+
videoStatus: MediaStatus;
|
61
|
+
audioSlidesStatus?: MediaStatus;
|
62
|
+
videoSlidesStatus?: MediaStatus;
|
63
|
+
csis: Csi[];
|
64
|
+
}
|
65
|
+
export interface ParticipantControls {
|
66
|
+
role: {
|
67
|
+
roles: Array<ServerRoleShape>;
|
68
|
+
};
|
69
|
+
brb?: {
|
70
|
+
enabled: boolean;
|
71
|
+
};
|
72
|
+
hand: {
|
73
|
+
raised: boolean;
|
74
|
+
};
|
75
|
+
localRecord: {
|
76
|
+
recording: boolean;
|
77
|
+
};
|
78
|
+
}
|
79
|
+
export interface Participant {
|
80
|
+
canBeController: boolean;
|
81
|
+
controls: ParticipantControls;
|
82
|
+
deviceUrl: string;
|
83
|
+
devices: Array<ParticipantDevice>;
|
84
|
+
guest: boolean;
|
85
|
+
id: string;
|
86
|
+
identity: string;
|
87
|
+
identityTrustLevel: string;
|
88
|
+
isCreator: boolean;
|
89
|
+
moderator: boolean;
|
90
|
+
moderatorAssignmentNotAllowed: boolean;
|
91
|
+
presenterAssignmentNotAllowed: boolean;
|
92
|
+
person: ParticipantPerson;
|
93
|
+
resourceGuest: boolean;
|
94
|
+
state: string;
|
95
|
+
status: ParticipantMediaStatus;
|
96
|
+
type: string;
|
97
|
+
url: ParticipantUrl;
|
98
|
+
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { IExternalRoles,
|
1
|
+
import { IExternalRoles, ServerRoles, ServerRoleShape, IMediaStatus, Participant, ParticipantUrl } from './types';
|
2
2
|
declare const MemberUtil: {
|
3
3
|
/**
|
4
4
|
* @param {Object} participant - The locus participant object.
|
@@ -9,58 +9,58 @@ declare const MemberUtil: {
|
|
9
9
|
* @param {Object} participant - The locus participant object.
|
10
10
|
* @returns {[ServerRoleShape]}
|
11
11
|
*/
|
12
|
-
getControlsRoles: (participant:
|
12
|
+
getControlsRoles: (participant: Participant) => Array<ServerRoleShape>;
|
13
13
|
/**
|
14
14
|
* Checks if the participant has the brb status enabled.
|
15
15
|
*
|
16
|
-
* @param {
|
16
|
+
* @param {Participant} participant - The locus participant object.
|
17
17
|
* @returns {boolean} - True if the participant has brb enabled, false otherwise.
|
18
18
|
*/
|
19
|
-
isBrb: (participant:
|
19
|
+
isBrb: (participant: Participant) => boolean;
|
20
20
|
/**
|
21
21
|
* @param {Object} participant - The locus participant object.
|
22
22
|
* @param {ServerRoles} controlRole the search role
|
23
23
|
* @returns {Boolean}
|
24
24
|
*/
|
25
|
-
hasRole: (participant:
|
25
|
+
hasRole: (participant: Participant, controlRole: ServerRoles) => boolean;
|
26
26
|
/**
|
27
27
|
* @param {Object} participant - The locus participant object.
|
28
28
|
* @returns {Boolean}
|
29
29
|
*/
|
30
|
-
hasCohost: (participant:
|
30
|
+
hasCohost: (participant: Participant) => boolean;
|
31
31
|
/**
|
32
32
|
* @param {Object} participant - The locus participant object.
|
33
33
|
* @returns {Boolean}
|
34
34
|
*/
|
35
|
-
hasModerator: (participant:
|
35
|
+
hasModerator: (participant: Participant) => boolean;
|
36
36
|
/**
|
37
37
|
* @param {Object} participant - The locus participant object.
|
38
38
|
* @returns {Boolean}
|
39
39
|
*/
|
40
|
-
hasPresenter: (participant:
|
40
|
+
hasPresenter: (participant: Participant) => boolean;
|
41
41
|
/**
|
42
42
|
* @param {Object} participant - The locus participant object.
|
43
43
|
* @returns {IExternalRoles}
|
44
44
|
*/
|
45
|
-
extractControlRoles: (participant:
|
45
|
+
extractControlRoles: (participant: Participant) => IExternalRoles;
|
46
46
|
/**
|
47
47
|
* @param {Object} participant - The locus participant object.
|
48
48
|
* @returns {Boolean}
|
49
49
|
*/
|
50
|
-
isUser: (participant:
|
51
|
-
isModerator: (participant:
|
50
|
+
isUser: (participant: Participant) => boolean;
|
51
|
+
isModerator: (participant: Participant) => boolean;
|
52
52
|
/**
|
53
53
|
* @param {Object} participant - The locus participant object.
|
54
54
|
* @returns {Boolean}
|
55
55
|
*/
|
56
|
-
isGuest: (participant:
|
56
|
+
isGuest: (participant: Participant) => boolean;
|
57
57
|
/**
|
58
58
|
* @param {Object} participant - The locus participant object.
|
59
59
|
* @returns {Boolean}
|
60
60
|
*/
|
61
|
-
isDevice: (participant:
|
62
|
-
isModeratorAssignmentProhibited: (participant:
|
63
|
-
isPresenterAssignmentProhibited: (participant:
|
61
|
+
isDevice: (participant: Participant) => boolean;
|
62
|
+
isModeratorAssignmentProhibited: (participant: Participant) => boolean;
|
63
|
+
isPresenterAssignmentProhibited: (participant: Participant) => boolean;
|
64
64
|
/**
|
65
65
|
* checks to see if the participant id is the same as the passed id
|
66
66
|
* there are multiple ids that can be used
|
@@ -68,37 +68,29 @@ declare const MemberUtil: {
|
|
68
68
|
* @param {String} id
|
69
69
|
* @returns {Boolean}
|
70
70
|
*/
|
71
|
-
isSame: (participant:
|
72
|
-
/**
|
73
|
-
* checks to see if the participant id is the same as the passed id for associated devices
|
74
|
-
* there are multiple ids that can be used
|
75
|
-
* @param {Object} participant - The locus participant object.
|
76
|
-
* @param {String} id
|
77
|
-
* @returns {Boolean}
|
78
|
-
*/
|
79
|
-
isAssociatedSame: (participant: any, id: string) => any;
|
71
|
+
isSame: (participant: Participant, id: string) => boolean;
|
80
72
|
/**
|
81
73
|
* @param {Object} participant - The locus participant object.
|
82
74
|
* @param {Boolean} isGuest
|
83
75
|
* @param {String} status
|
84
76
|
* @returns {Boolean}
|
85
77
|
*/
|
86
|
-
isNotAdmitted: (participant:
|
78
|
+
isNotAdmitted: (participant: Participant, isGuest: boolean, status: string) => boolean;
|
87
79
|
/**
|
88
80
|
* @param {Object} participant - The locus participant object.
|
89
81
|
* @returns {Boolean}
|
90
82
|
*/
|
91
|
-
isAudioMuted: (participant:
|
83
|
+
isAudioMuted: (participant: Participant) => any;
|
92
84
|
/**
|
93
85
|
* @param {Object} participant - The locus participant object.
|
94
86
|
* @returns {Boolean}
|
95
87
|
*/
|
96
|
-
isVideoMuted: (participant:
|
88
|
+
isVideoMuted: (participant: Participant) => boolean;
|
97
89
|
/**
|
98
90
|
* @param {Object} participant - The locus participant object.
|
99
91
|
* @returns {Boolean}
|
100
92
|
*/
|
101
|
-
isHandRaised: (participant:
|
93
|
+
isHandRaised: (participant: Participant) => boolean;
|
102
94
|
/**
|
103
95
|
* @param {Object} participant - The locus participant object.
|
104
96
|
* @returns {Boolean}
|
@@ -121,7 +113,7 @@ declare const MemberUtil: {
|
|
121
113
|
* @param {String} controlsAccessor
|
122
114
|
* @returns {Boolean | undefined}
|
123
115
|
*/
|
124
|
-
isMuted: (participant:
|
116
|
+
isMuted: (participant: Participant, statusAccessor: string, controlsAccessor: string) => any;
|
125
117
|
/**
|
126
118
|
* utility method for getting the recording member for later comparison
|
127
119
|
* @param {Object} controls
|
@@ -132,29 +124,34 @@ declare const MemberUtil: {
|
|
132
124
|
* @param {Object} participant - The locus participant object.
|
133
125
|
* @returns {Boolean}
|
134
126
|
*/
|
135
|
-
isRecording: (participant:
|
127
|
+
isRecording: (participant: Participant) => boolean;
|
136
128
|
isRemovable: (isSelf: any, isGuest: any, isInMeeting: any, type: any) => boolean;
|
137
129
|
isMutable: (isSelf: any, isDevice: any, isInMeeting: any, isMuted: any, type: any) => boolean;
|
138
130
|
/**
|
139
131
|
* @param {Object} participant - The locus participant object.
|
140
132
|
* @returns {String}
|
141
133
|
*/
|
142
|
-
extractStatus: (participant:
|
134
|
+
extractStatus: (participant: Participant) => "IN_LOBBY" | "IN_MEETING" | "NOT_IN_MEETING";
|
143
135
|
/**
|
144
136
|
* @param {Object} participant - The locus participant object.
|
145
137
|
* @returns {String}
|
146
138
|
*/
|
147
|
-
extractId: (participant:
|
139
|
+
extractId: (participant: Participant) => string;
|
148
140
|
/**
|
149
141
|
* extracts the media status from nested participant object
|
150
142
|
* @param {Object} participant - The locus participant object.
|
151
143
|
* @returns {Object}
|
152
144
|
*/
|
153
|
-
extractMediaStatus: (participant:
|
145
|
+
extractMediaStatus: (participant: Participant) => IMediaStatus;
|
146
|
+
/**
|
147
|
+
* @param {Object} participant - The locus participant object.
|
148
|
+
* @returns {String}
|
149
|
+
*/
|
150
|
+
extractName: (participant: Participant) => string;
|
154
151
|
/**
|
155
152
|
* @param {Object} participant - The locus participant object.
|
156
153
|
* @returns {String}
|
157
154
|
*/
|
158
|
-
|
155
|
+
extractPairedWithParticipantUrl: (participant: Participant) => ParticipantUrl | undefined;
|
159
156
|
};
|
160
157
|
export default MemberUtil;
|
@@ -1,26 +1,27 @@
|
|
1
|
+
import Member from '../member';
|
1
2
|
/**
|
2
3
|
* @class MembersCollection
|
3
4
|
*/
|
4
5
|
export default class MembersCollection {
|
5
|
-
members:
|
6
|
+
members: Record<string, Member>;
|
6
7
|
namespace: string;
|
7
8
|
/**
|
8
9
|
* @param {Object} locus
|
9
10
|
* @memberof Members
|
10
11
|
*/
|
11
12
|
constructor();
|
12
|
-
set(id:
|
13
|
-
setAll(members:
|
13
|
+
set(id: string, member: Member): void;
|
14
|
+
setAll(members: Record<string, Member>): void;
|
14
15
|
/**
|
15
16
|
* @param {String} id
|
16
17
|
* @returns {Member}
|
17
18
|
*/
|
18
|
-
get(id: string):
|
19
|
+
get(id: string): Member;
|
19
20
|
/**
|
20
21
|
* @returns {Object} returns an object map of Member instances
|
21
22
|
* @memberof MembersCollection
|
22
23
|
*/
|
23
|
-
getAll():
|
24
|
+
getAll(): Record<string, Member>;
|
24
25
|
/**
|
25
26
|
* @returns {void}
|
26
27
|
* reset members
|
@@ -1,45 +1,9 @@
|
|
1
1
|
import { StatelessWebexPlugin } from '@webex/webex-core';
|
2
|
+
import Member from '../member';
|
3
|
+
import MembersCollection from './collection';
|
2
4
|
import { ReceiveSlotManager } from '../multistream/receiveSlotManager';
|
3
5
|
import { MediaRequestManager } from '../multistream/mediaRequestManager';
|
4
6
|
import { ServerRoleShape } from './types';
|
5
|
-
/**
|
6
|
-
* Members Update Event
|
7
|
-
* Emitted when something in the roster list needs to be updated
|
8
|
-
* @event members:update
|
9
|
-
* @instance
|
10
|
-
* @property {Object} delta the changes to the members list
|
11
|
-
* @property {Array} delta.updated array only the updates, includes removals, as they will have updated status and member properties
|
12
|
-
* @property {Array} delta.added array added members to the meeting
|
13
|
-
* @property {Array} full array the full members collection
|
14
|
-
* @memberof Members
|
15
|
-
*/
|
16
|
-
/**
|
17
|
-
* Members Content Update Event
|
18
|
-
* Emitted when who is sharing changes
|
19
|
-
* @event members:content:update
|
20
|
-
* @instance
|
21
|
-
* @property {String} activeContentSharingId
|
22
|
-
* @property {String} endedContentSharingId
|
23
|
-
* @memberof Members
|
24
|
-
*/
|
25
|
-
/**
|
26
|
-
* Members Host Update Event
|
27
|
-
* Emitted when who is the host changes
|
28
|
-
* @event members:host:update
|
29
|
-
* @instance
|
30
|
-
* @property {String} activeHostId
|
31
|
-
* @property {String} endedHostId
|
32
|
-
* @memberof Members
|
33
|
-
*/
|
34
|
-
/**
|
35
|
-
* Members Self Update Event
|
36
|
-
* Emitted when who is the self changes
|
37
|
-
* @event members:self:update
|
38
|
-
* @instance
|
39
|
-
* @property {String} activeSelfId
|
40
|
-
* @property {String} endedSelfId
|
41
|
-
* @memberof Members
|
42
|
-
*/
|
43
7
|
/**
|
44
8
|
* @class Members
|
45
9
|
*/
|
@@ -48,7 +12,7 @@ export default class Members extends StatelessWebexPlugin {
|
|
48
12
|
locusUrl: any;
|
49
13
|
mediaShareContentId: any;
|
50
14
|
mediaShareWhiteboardId: any;
|
51
|
-
membersCollection:
|
15
|
+
membersCollection: MembersCollection;
|
52
16
|
membersRequest: any;
|
53
17
|
receiveSlotManager: ReceiveSlotManager;
|
54
18
|
mediaRequestManagers: {
|
@@ -99,6 +63,15 @@ export default class Members extends StatelessWebexPlugin {
|
|
99
63
|
* @memberof Members
|
100
64
|
*/
|
101
65
|
clearMembers(): void;
|
66
|
+
/**
|
67
|
+
* Updates properties on members that rely on information from other members.
|
68
|
+
* This function MUST be called only after the membersCollection has been fully updated
|
69
|
+
* @param {UpdatedMembers} membersUpdate
|
70
|
+
* @returns {Object} membersCollection
|
71
|
+
* @private
|
72
|
+
* @memberof Members
|
73
|
+
*/
|
74
|
+
private updateRelationsBetweenMembers;
|
102
75
|
/**
|
103
76
|
* when new participant updates come in, both delta and full participants, update them in members collection
|
104
77
|
* delta object in the event will have {updated, added} and full will be the full membersCollection
|
@@ -147,7 +120,7 @@ export default class Members extends StatelessWebexPlugin {
|
|
147
120
|
}): void;
|
148
121
|
/**
|
149
122
|
* sets values in the members collection for updated and added properties from delta
|
150
|
-
* @param {
|
123
|
+
* @param {UpdatedMembers} membersUpdate
|
151
124
|
* @returns {Object} membersCollection
|
152
125
|
* @private
|
153
126
|
* @memberof Members
|
@@ -156,6 +129,7 @@ export default class Members extends StatelessWebexPlugin {
|
|
156
129
|
/**
|
157
130
|
* set members to the member collection from each updated/added lists as passed in
|
158
131
|
* @param {Array} list
|
132
|
+
* @param {boolean} isUpdate
|
159
133
|
* @returns {undefined}
|
160
134
|
* @private
|
161
135
|
* @memberof Members
|
@@ -164,7 +138,7 @@ export default class Members extends StatelessWebexPlugin {
|
|
164
138
|
/**
|
165
139
|
* Internal update the participants value
|
166
140
|
* @param {Object} payload
|
167
|
-
* @returns {
|
141
|
+
* @returns {UpdatedMembers}
|
168
142
|
* @private
|
169
143
|
* @memberof Members
|
170
144
|
*/
|
@@ -231,7 +205,7 @@ export default class Members extends StatelessWebexPlugin {
|
|
231
205
|
* Removed/left members will end up in updates
|
232
206
|
* Each array contains only members
|
233
207
|
* @param {Array} participants the locus participants
|
234
|
-
* @returns {
|
208
|
+
* @returns {UpdatedMembers} {added: {Array}, updated: {Array}}
|
235
209
|
* @private
|
236
210
|
* @memberof Members
|
237
211
|
*/
|
@@ -346,7 +320,7 @@ export default class Members extends StatelessWebexPlugin {
|
|
346
320
|
* @param {number} csi
|
347
321
|
* @returns {Member}
|
348
322
|
*/
|
349
|
-
findMemberByCsi(csi: any):
|
323
|
+
findMemberByCsi(csi: any): Member;
|
350
324
|
/**
|
351
325
|
* Returns an array of a member's CSIs matching the mediaType and mediaContent
|
352
326
|
*
|
package/dist/webinar/index.js
CHANGED
package/package.json
CHANGED
@@ -43,7 +43,7 @@
|
|
43
43
|
"@webex/eslint-config-legacy": "0.0.0",
|
44
44
|
"@webex/jest-config-legacy": "0.0.0",
|
45
45
|
"@webex/legacy-tools": "0.0.0",
|
46
|
-
"@webex/plugin-meetings": "3.8.0-next.
|
46
|
+
"@webex/plugin-meetings": "3.8.0-next.83",
|
47
47
|
"@webex/plugin-rooms": "3.8.0-next.28",
|
48
48
|
"@webex/test-helper-chai": "3.8.0-next.23",
|
49
49
|
"@webex/test-helper-mocha": "3.8.0-next.23",
|
@@ -71,7 +71,7 @@
|
|
71
71
|
"@webex/internal-plugin-metrics": "3.8.0-next.23",
|
72
72
|
"@webex/internal-plugin-support": "3.8.0-next.28",
|
73
73
|
"@webex/internal-plugin-user": "3.8.0-next.23",
|
74
|
-
"@webex/internal-plugin-voicea": "3.8.0-next.
|
74
|
+
"@webex/internal-plugin-voicea": "3.8.0-next.83",
|
75
75
|
"@webex/media-helpers": "3.8.0-next.29",
|
76
76
|
"@webex/plugin-people": "3.8.0-next.25",
|
77
77
|
"@webex/plugin-rooms": "3.8.0-next.28",
|
@@ -93,5 +93,5 @@
|
|
93
93
|
"//": [
|
94
94
|
"TODO: upgrade jwt-decode when moving to node 18"
|
95
95
|
],
|
96
|
-
"version": "3.8.0-next.
|
96
|
+
"version": "3.8.0-next.83"
|
97
97
|
}
|
package/src/member/index.ts
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
/*!
|
2
2
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
3
3
|
*/
|
4
|
-
import {MEETINGS, _IN_LOBBY_, _NOT_IN_MEETING_, _IN_MEETING_} from '../constants';
|
5
|
-
import {IExternalRoles, IMediaStatus,
|
4
|
+
import {MEETINGS, _IN_LOBBY_, _NOT_IN_MEETING_, _IN_MEETING_, _OBSERVE_} from '../constants';
|
5
|
+
import {IExternalRoles, IMediaStatus, Participant, ParticipantUrl} from './types';
|
6
6
|
|
7
7
|
import MemberUtil from './util';
|
8
8
|
|
9
|
+
export type MemberId = string;
|
9
10
|
/**
|
10
11
|
* @class Member
|
11
12
|
*/
|
12
13
|
export default class Member {
|
13
|
-
associatedUser:
|
14
|
+
associatedUser: MemberId | null; // deprecated, use associatedUsers instead
|
15
|
+
associatedUsers: Set<MemberId>; // users associated with this device, empty if this member is not a device
|
14
16
|
canReclaimHost: boolean;
|
15
|
-
id:
|
17
|
+
id: MemberId;
|
16
18
|
isAudioMuted: any;
|
17
19
|
isContentSharing: any;
|
18
20
|
isDevice: any;
|
@@ -29,6 +31,7 @@ export default class Member {
|
|
29
31
|
isRecording: any;
|
30
32
|
isRemovable: any;
|
31
33
|
isSelf: any;
|
34
|
+
isPairedWithSelf: boolean; // true for a device that we are paired with
|
32
35
|
isBrb: boolean;
|
33
36
|
isUser: any;
|
34
37
|
isVideoMuted: any;
|
@@ -42,6 +45,10 @@ export default class Member {
|
|
42
45
|
supportLiveAnnotation: boolean;
|
43
46
|
type: any;
|
44
47
|
namespace = MEETINGS;
|
48
|
+
pairedWith: {
|
49
|
+
participantUrl?: ParticipantUrl;
|
50
|
+
memberId?: MemberId;
|
51
|
+
};
|
45
52
|
|
46
53
|
/**
|
47
54
|
* @param {Object} participant - the locus participant
|
@@ -54,7 +61,7 @@ export default class Member {
|
|
54
61
|
* @memberof Member
|
55
62
|
*/
|
56
63
|
constructor(
|
57
|
-
participant:
|
64
|
+
participant: Participant,
|
58
65
|
options:
|
59
66
|
| {
|
60
67
|
selfId: string;
|
@@ -201,13 +208,23 @@ export default class Member {
|
|
201
208
|
*/
|
202
209
|
this.isUser = null;
|
203
210
|
/**
|
211
|
+
* Deprecated: use associatedUsers instead
|
204
212
|
* Is this member associated to another user by way of pairing (typical of devices)
|
205
213
|
* @instance
|
206
|
-
* @type {
|
214
|
+
* @type {MemberId|null}
|
215
|
+
* @deprecated
|
207
216
|
* @public
|
208
217
|
* @memberof Member
|
209
218
|
*/
|
210
219
|
this.associatedUser = null;
|
220
|
+
/**
|
221
|
+
* Is this member associated to another user by way of pairing (typical of devices)
|
222
|
+
* @instance
|
223
|
+
* @type {String}
|
224
|
+
* @public
|
225
|
+
* @memberof Member
|
226
|
+
*/
|
227
|
+
this.associatedUsers = new Set<MemberId>();
|
211
228
|
/**
|
212
229
|
* @instance
|
213
230
|
* @type {Boolean}
|
@@ -266,6 +283,14 @@ export default class Member {
|
|
266
283
|
*/
|
267
284
|
this.isPresenterAssignmentProhibited = null;
|
268
285
|
|
286
|
+
/**
|
287
|
+
* @instance
|
288
|
+
* @type {Boolean}
|
289
|
+
* @public
|
290
|
+
* @memberof Member
|
291
|
+
*/
|
292
|
+
this.isPairedWithSelf = false;
|
293
|
+
|
269
294
|
/**
|
270
295
|
* @instance
|
271
296
|
* @type {IExternalRoles}
|
@@ -274,6 +299,10 @@ export default class Member {
|
|
274
299
|
*/
|
275
300
|
this.roles = null;
|
276
301
|
|
302
|
+
this.pairedWith = {
|
303
|
+
participantUrl: undefined,
|
304
|
+
memberId: undefined,
|
305
|
+
};
|
277
306
|
/**
|
278
307
|
* @instance
|
279
308
|
* @type {IMediaStatus}
|
@@ -299,9 +328,10 @@ export default class Member {
|
|
299
328
|
* @private
|
300
329
|
* @memberof Member
|
301
330
|
*/
|
302
|
-
private processParticipant(participant:
|
331
|
+
private processParticipant(participant: Participant) {
|
303
332
|
this.participant = participant;
|
304
333
|
if (participant) {
|
334
|
+
this.processPairedDevice(participant);
|
305
335
|
this.canReclaimHost = MemberUtil.canReclaimHost(participant);
|
306
336
|
this.id = MemberUtil.extractId(participant);
|
307
337
|
this.name = MemberUtil.extractName(participant);
|
@@ -312,7 +342,7 @@ export default class Member {
|
|
312
342
|
this.supportsInterpretation = MemberUtil.isInterpretationSupported(participant);
|
313
343
|
this.supportLiveAnnotation = MemberUtil.isLiveAnnotationSupported(participant);
|
314
344
|
this.isGuest = MemberUtil.isGuest(participant);
|
315
|
-
this.isBrb = MemberUtil.isBrb(participant
|
345
|
+
this.isBrb = MemberUtil.isBrb(participant);
|
316
346
|
this.isUser = MemberUtil.isUser(participant);
|
317
347
|
this.isDevice = MemberUtil.isDevice(participant);
|
318
348
|
this.isModerator = MemberUtil.isModerator(participant);
|
@@ -321,12 +351,24 @@ export default class Member {
|
|
321
351
|
this.isPresenterAssignmentProhibited =
|
322
352
|
MemberUtil.isPresenterAssignmentProhibited(participant);
|
323
353
|
this.processStatus(participant);
|
324
|
-
this.processRoles(participant
|
354
|
+
this.processRoles(participant);
|
325
355
|
// must be done last
|
326
356
|
this.isNotAdmitted = MemberUtil.isNotAdmitted(participant, this.isGuest, this.status);
|
327
357
|
}
|
328
358
|
}
|
329
359
|
|
360
|
+
/**
|
361
|
+
* Checks if the participant is paired with another device
|
362
|
+
*
|
363
|
+
* @param {any} participant the locus participant object
|
364
|
+
* @returns {void}
|
365
|
+
*/
|
366
|
+
processPairedDevice(participant: Participant) {
|
367
|
+
// we can't populate this.pairedWith.memberId here because the member for that device might not yet exist
|
368
|
+
// so only populating the participantUrl and memberId will be set later
|
369
|
+
this.pairedWith.participantUrl = MemberUtil.extractPairedWithParticipantUrl(participant);
|
370
|
+
}
|
371
|
+
|
330
372
|
/**
|
331
373
|
* Use the members options and participant values to set on the member
|
332
374
|
* @param {Object} participant the locus participant object
|
@@ -335,7 +377,7 @@ export default class Member {
|
|
335
377
|
* @private
|
336
378
|
* @memberof Member
|
337
379
|
*/
|
338
|
-
private processParticipantOptions(participant:
|
380
|
+
private processParticipantOptions(participant: Participant, options: any) {
|
339
381
|
if (participant && options) {
|
340
382
|
this.processIsSelf(participant, options.selfId);
|
341
383
|
this.processIsHost(participant, options.hostId);
|
@@ -378,7 +420,7 @@ export default class Member {
|
|
378
420
|
* @private
|
379
421
|
* @memberof Member
|
380
422
|
*/
|
381
|
-
private processStatus(participant:
|
423
|
+
private processStatus(participant: Participant) {
|
382
424
|
this.status = MemberUtil.extractStatus(participant);
|
383
425
|
switch (this.status) {
|
384
426
|
case _IN_LOBBY_:
|
@@ -440,11 +482,9 @@ export default class Member {
|
|
440
482
|
* @public
|
441
483
|
* @memberof Member
|
442
484
|
*/
|
443
|
-
public processIsContentSharing(participant:
|
485
|
+
public processIsContentSharing(participant: Participant, sharingId: string) {
|
444
486
|
if (MemberUtil.isUser(participant)) {
|
445
487
|
this.isContentSharing = MemberUtil.isSame(participant, sharingId);
|
446
|
-
} else if (MemberUtil.isDevice(participant)) {
|
447
|
-
this.isContentSharing = MemberUtil.isAssociatedSame(participant, sharingId);
|
448
488
|
}
|
449
489
|
}
|
450
490
|
|
@@ -456,7 +496,7 @@ export default class Member {
|
|
456
496
|
* @public
|
457
497
|
* @memberof Member
|
458
498
|
*/
|
459
|
-
public processIsRecording(participant:
|
499
|
+
public processIsRecording(participant: Participant, recordingId: string) {
|
460
500
|
this.isRecording = MemberUtil.isSame(participant, recordingId);
|
461
501
|
}
|
462
502
|
|
@@ -468,12 +508,9 @@ export default class Member {
|
|
468
508
|
* @private
|
469
509
|
* @memberof Member
|
470
510
|
*/
|
471
|
-
private processIsSelf(participant:
|
511
|
+
private processIsSelf(participant: Participant, selfId: string) {
|
472
512
|
if (MemberUtil.isUser(participant)) {
|
473
513
|
this.isSelf = MemberUtil.isSame(participant, selfId);
|
474
|
-
} else if (MemberUtil.isDevice(participant)) {
|
475
|
-
this.isSelf = MemberUtil.isAssociatedSame(participant, selfId);
|
476
|
-
this.associatedUser = selfId;
|
477
514
|
}
|
478
515
|
}
|
479
516
|
|
@@ -485,11 +522,9 @@ export default class Member {
|
|
485
522
|
* @private
|
486
523
|
* @memberof Member
|
487
524
|
*/
|
488
|
-
private processIsHost(participant:
|
525
|
+
private processIsHost(participant: Participant, hostId: string) {
|
489
526
|
if (MemberUtil.isUser(participant)) {
|
490
527
|
this.isHost = MemberUtil.isSame(participant, hostId);
|
491
|
-
} else if (MemberUtil.isDevice(participant)) {
|
492
|
-
this.isHost = MemberUtil.isAssociatedSame(participant, hostId);
|
493
528
|
}
|
494
529
|
}
|
495
530
|
|
@@ -500,7 +535,7 @@ export default class Member {
|
|
500
535
|
* @private
|
501
536
|
* @memberof Member
|
502
537
|
*/
|
503
|
-
private processRoles(participant:
|
538
|
+
private processRoles(participant: Participant) {
|
504
539
|
this.roles = MemberUtil.extractControlRoles(participant);
|
505
540
|
}
|
506
541
|
|