@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.
@@ -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, ParticipantWithRoles, ServerRoles, ServerRoleShape, IMediaStatus, ParticipantWithBrb } from './types';
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: ParticipantWithRoles) => Array<ServerRoleShape>;
12
+ getControlsRoles: (participant: Participant) => Array<ServerRoleShape>;
13
13
  /**
14
14
  * Checks if the participant has the brb status enabled.
15
15
  *
16
- * @param {ParticipantWithBrb} participant - The locus participant object.
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: ParticipantWithBrb) => boolean;
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: any, controlRole: ServerRoles) => boolean;
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: ParticipantWithRoles) => boolean;
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: ParticipantWithRoles) => boolean;
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: ParticipantWithRoles) => boolean;
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: ParticipantWithRoles) => IExternalRoles;
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: any) => boolean;
51
- isModerator: (participant: any) => any;
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: any) => any;
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: any) => boolean;
62
- isModeratorAssignmentProhibited: (participant: any) => any;
63
- isPresenterAssignmentProhibited: (participant: any) => any;
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: any, id: string) => boolean;
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: any, isGuest: boolean, status: string) => boolean;
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: any) => any;
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: any) => boolean;
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: any) => any;
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: any, statusAccessor: string, controlsAccessor: string) => any;
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: any) => any;
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: any) => "IN_LOBBY" | "IN_MEETING" | "NOT_IN_MEETING";
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: any) => any;
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: any) => IMediaStatus;
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
- extractName: (participant: any) => any;
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: any;
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: any, member: any): void;
13
- setAll(members: any): void;
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): any;
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(): any;
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: any;
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 {Object} membersUpdate {updated: [], added: []}
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 {Object}
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 {Object} {added: {Array}, updated: {Array}}
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): unknown;
323
+ findMemberByCsi(csi: any): Member;
350
324
  /**
351
325
  * Returns an array of a member's CSIs matching the mediaType and mediaContent
352
326
  *
@@ -458,7 +458,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
458
458
  }, _callee7);
459
459
  }))();
460
460
  },
461
- version: "3.8.0-next.82"
461
+ version: "3.8.0-next.83"
462
462
  });
463
463
  var _default = exports.default = Webinar;
464
464
  //# sourceMappingURL=index.js.map
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.82",
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.82",
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.82"
96
+ "version": "3.8.0-next.83"
97
97
  }
@@ -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, ParticipantWithBrb, ParticipantWithRoles} from './types';
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: any;
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: any;
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: object,
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 {String}
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: object) {
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 as ParticipantWithBrb);
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 as ParticipantWithRoles);
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: object, options: any) {
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: object) {
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: object, sharingId: string) {
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: object, recordingId: string) {
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: object, selfId: string) {
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: object, hostId: string) {
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: ParticipantWithRoles) {
538
+ private processRoles(participant: Participant) {
504
539
  this.roles = MemberUtil.extractControlRoles(participant);
505
540
  }
506
541