@webex/plugin-meetings 2.29.3 → 2.30.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.
- package/README.md +214 -143
- package/dist/common/collection.js +1 -1
- package/dist/common/collection.js.map +1 -1
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +2 -0
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +3 -1
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/util.js +4 -0
- package/dist/meeting/util.js.map +1 -1
- package/dist/metrics/index.js +4 -0
- package/dist/metrics/index.js.map +1 -1
- package/dist/peer-connection-manager/index.js +3 -3
- package/dist/peer-connection-manager/index.js.map +1 -1
- package/internal-README.md +18 -9
- package/package.json +59 -41
- package/src/common/collection.ts +1 -1
- package/src/constants.ts +2 -0
- package/src/meeting/in-meeting-actions.ts +4 -0
- package/src/meeting/index.js +2 -1
- package/src/meeting/util.js +2 -0
- package/src/metrics/index.js +3 -0
- package/src/peer-connection-manager/index.js +3 -3
- package/test/integration/spec/journey.js +2 -0
- package/test/integration/spec/space-meeting.js +1 -1
- package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
- package/test/unit/spec/meeting/index.js +6 -3
- package/test/unit/spec/meeting/utils.js +9 -1
- package/test/.eslintrc.json +0 -6
- package/test/unit/spec/reachability/request.ts +0 -84
package/README.md
CHANGED
|
@@ -29,6 +29,7 @@ This is a plugin for the Cisco Webex JS SDK . Please see our [developer portal](
|
|
|
29
29
|
- Version `0.109.0` - Participant email has been removed to reduce PII. Please use participant identity (`members.membersCollection.members[id].participant.identity`) to lookup participant details via the [/people](https://developer.webex.com/docs/api/v1/people/get-person-details) endpoint.
|
|
30
30
|
|
|
31
31
|
## API Docs and Sample App
|
|
32
|
+
|
|
32
33
|
API Docs: https://webex.github.io/webex-js-sdk/api/
|
|
33
34
|
Hosted Sample App: https://webex.github.io/webex-js-sdk/samples/browser-plugin-meetings/
|
|
34
35
|
See https://github.com/webex/webex-js-sdk/tree/master/docs/samples/browser-plugin-meetings for the sample app code vs the readme
|
|
@@ -42,7 +43,7 @@ These setup actions are handled with the `register` function.
|
|
|
42
43
|
This function registers the device, connects web sockets, and listens for meeting events.
|
|
43
44
|
|
|
44
45
|
```js
|
|
45
|
-
webex.meetings.register()
|
|
46
|
+
webex.meetings.register();
|
|
46
47
|
```
|
|
47
48
|
|
|
48
49
|
#### Device Unregistration
|
|
@@ -51,7 +52,7 @@ The inverse of the `register()` function is available as well.
|
|
|
51
52
|
This function stops listening for meeting events, disconnects from web sockets and unregisters the device.
|
|
52
53
|
|
|
53
54
|
```js
|
|
54
|
-
webex.meetings.unregister()
|
|
55
|
+
webex.meetings.unregister();
|
|
55
56
|
```
|
|
56
57
|
|
|
57
58
|
#### Creating a basic meeting
|
|
@@ -94,6 +95,7 @@ return webex.meetings.create(locusObj, 'LOCUS_ID').then((meeting) ==> {...});
|
|
|
94
95
|
#### Meetings
|
|
95
96
|
|
|
96
97
|
##### List Active Meetings
|
|
98
|
+
|
|
97
99
|
We want to sync our meetings collection with the server.
|
|
98
100
|
|
|
99
101
|
```js
|
|
@@ -108,15 +110,16 @@ webex.meetings.syncMeetings().then(() => {
|
|
|
108
110
|
##### Get a Meeting
|
|
109
111
|
|
|
110
112
|
```js
|
|
111
|
-
webex.meetings.getMeetingByType('SIP_URI', sipUri)
|
|
113
|
+
webex.meetings.getMeetingByType('SIP_URI', sipUri);
|
|
112
114
|
```
|
|
113
115
|
|
|
114
116
|
##### Properties
|
|
117
|
+
|
|
115
118
|
```js
|
|
116
|
-
webex.meetings.personalMeetingRoom // the personal meeting room instance
|
|
117
|
-
webex.meetings.reachability // the reachability instance, not initialized until after setReachability is called
|
|
118
|
-
webex.meetings.meetingCollection // the collection of meetings instance
|
|
119
|
-
webex.meetings.meetingInfo // the meeting info instance
|
|
119
|
+
webex.meetings.personalMeetingRoom; // the personal meeting room instance
|
|
120
|
+
webex.meetings.reachability; // the reachability instance, not initialized until after setReachability is called
|
|
121
|
+
webex.meetings.meetingCollection; // the collection of meetings instance
|
|
122
|
+
webex.meetings.meetingInfo; // the meeting info instance
|
|
120
123
|
```
|
|
121
124
|
|
|
122
125
|
##### Media
|
|
@@ -134,16 +137,19 @@ const mediaSettings = {
|
|
|
134
137
|
receiveShare: true,
|
|
135
138
|
sendVideo: true,
|
|
136
139
|
sendAudio: true,
|
|
137
|
-
sendShare: false
|
|
140
|
+
sendShare: false,
|
|
138
141
|
};
|
|
139
142
|
|
|
140
|
-
const myStreams = {}
|
|
141
|
-
meeting
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
143
|
+
const myStreams = {};
|
|
144
|
+
meeting
|
|
145
|
+
.getMediaStreams(mediaSettings)
|
|
146
|
+
.then(([localStream, localShare]) => {
|
|
147
|
+
return {localStream, localShare};
|
|
148
|
+
})
|
|
149
|
+
.then((streams) => {
|
|
150
|
+
myStreams.localStream = streams.localStream;
|
|
151
|
+
myStreams.localShare = streams.localShare;
|
|
152
|
+
});
|
|
147
153
|
```
|
|
148
154
|
|
|
149
155
|
This local stream is now ready to be added to the DOM for a self preview via:
|
|
@@ -161,32 +167,34 @@ document.getElementById('localvideo').srcObject = myStreams.localStream;
|
|
|
161
167
|
Once you have your local streams and shares, you need to add the media to the meeting with the `addMedia` function.
|
|
162
168
|
|
|
163
169
|
```js
|
|
164
|
-
meeting
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
170
|
+
meeting
|
|
171
|
+
.addMedia({
|
|
172
|
+
localShare,
|
|
173
|
+
localStream,
|
|
174
|
+
mediaSettings,
|
|
175
|
+
})
|
|
176
|
+
.then((mediaResponse) => {
|
|
177
|
+
// do something once you know media has been completed
|
|
178
|
+
});
|
|
171
179
|
```
|
|
172
180
|
|
|
173
181
|
#### Join a meeting
|
|
174
182
|
|
|
175
183
|
##### Basic Join
|
|
184
|
+
|
|
176
185
|
One can join a meeting without adding a media to just be present in the meeting without send/receive
|
|
177
186
|
Once a meeting object has been created, to start it, simply `join` it.
|
|
187
|
+
|
|
178
188
|
```javascript
|
|
179
189
|
let destination = `obiwan@example.com`; // email example
|
|
180
|
-
return webex.meetings
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
//
|
|
185
|
-
|
|
186
|
-
// now the meeting is joined!
|
|
187
|
-
// now you can addMedia
|
|
188
|
-
});
|
|
190
|
+
return webex.meetings.create(destination).then((meeting) => {
|
|
191
|
+
activeMeeting = meeting;
|
|
192
|
+
// attach listeners or other actions
|
|
193
|
+
activeMeeting.join().then(() => {
|
|
194
|
+
// now the meeting is joined!
|
|
195
|
+
// now you can addMedia
|
|
189
196
|
});
|
|
197
|
+
});
|
|
190
198
|
```
|
|
191
199
|
|
|
192
200
|
##### Full Example
|
|
@@ -351,7 +359,9 @@ meeting.on('meeting:receiveTranscription:stopped', () => {});
|
|
|
351
359
|
|
|
352
360
|
await meeting.join({receiveTranscription: true});
|
|
353
361
|
```
|
|
362
|
+
|
|
354
363
|
##### Microphone, Speaker and Camera
|
|
364
|
+
|
|
355
365
|
Select a different device than the default:
|
|
356
366
|
|
|
357
367
|
```js
|
|
@@ -418,11 +428,13 @@ meeting.getMediaStreams(media, {audio, video}).then(...)
|
|
|
418
428
|
```
|
|
419
429
|
|
|
420
430
|
###### Changing remote audio output
|
|
431
|
+
|
|
421
432
|
```js
|
|
422
433
|
// Attach audio output device to video element using device/sink ID.
|
|
423
434
|
function attachSinkId(element, sinkId) {
|
|
424
435
|
if (typeof element.sinkId !== 'undefined') {
|
|
425
|
-
element
|
|
436
|
+
element
|
|
437
|
+
.setSinkId(sinkId)
|
|
426
438
|
.then(() => {
|
|
427
439
|
console.log(`Success, audio output device attached: ${sinkId}`);
|
|
428
440
|
})
|
|
@@ -436,8 +448,7 @@ function attachSinkId(element, sinkId) {
|
|
|
436
448
|
// Jump back to first output device in the list as it's the default.
|
|
437
449
|
audioOutputSelect.selectedIndex = 0;
|
|
438
450
|
});
|
|
439
|
-
}
|
|
440
|
-
else {
|
|
451
|
+
} else {
|
|
441
452
|
console.warn('Browser does not support output device selection.');
|
|
442
453
|
}
|
|
443
454
|
}
|
|
@@ -448,6 +459,7 @@ audioOutputSelect.onchange = function () {
|
|
|
448
459
|
```
|
|
449
460
|
|
|
450
461
|
##### Record
|
|
462
|
+
|
|
451
463
|
```js
|
|
452
464
|
// you can only pause if recording
|
|
453
465
|
// you can only start recording if not recording
|
|
@@ -465,71 +477,87 @@ meeting.stopRecording();
|
|
|
465
477
|
```
|
|
466
478
|
|
|
467
479
|
##### Mute Audio or Video
|
|
480
|
+
|
|
468
481
|
```js
|
|
469
482
|
meeting.muteAudio();
|
|
470
483
|
meeting.muteVideo();
|
|
471
484
|
```
|
|
472
485
|
|
|
473
486
|
##### Unmute Audio or Video
|
|
487
|
+
|
|
474
488
|
```js
|
|
475
489
|
meeting.unmuteAudio();
|
|
476
490
|
meeting.unmuteVideo();
|
|
477
491
|
```
|
|
478
492
|
|
|
479
493
|
##### Start Sending a Share
|
|
494
|
+
|
|
480
495
|
```js
|
|
481
496
|
meeting.shareScreen();
|
|
482
497
|
```
|
|
483
498
|
|
|
484
499
|
##### Stop Sending a Share
|
|
500
|
+
|
|
485
501
|
```js
|
|
486
502
|
meeting.stopShare();
|
|
487
503
|
```
|
|
488
504
|
|
|
489
505
|
##### Update Audio/Video Streams
|
|
506
|
+
|
|
490
507
|
Use this if you want to change the actual streams send and receive for audio or video component separately; `updateAudio` and `updateVideo` is for the developer to add and remove the streams completely.
|
|
508
|
+
|
|
491
509
|
```js
|
|
492
510
|
//video
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
511
|
+
if (media.sendVideo) {
|
|
512
|
+
meeting
|
|
513
|
+
.getMediaStreams(
|
|
514
|
+
{sendVideo: true},
|
|
515
|
+
{video: videoSelect.value ? {deviceId: {exact: videoSelect.value}} : media.sendVideo}
|
|
516
|
+
)
|
|
517
|
+
.then(([localStream]) =>
|
|
518
|
+
meeting.updateVideo({
|
|
496
519
|
stream: localStream,
|
|
497
520
|
sendVideo: media.sendVideo,
|
|
498
|
-
receiveVideo: media.receiveVideo
|
|
499
|
-
})
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
521
|
+
receiveVideo: media.receiveVideo,
|
|
522
|
+
})
|
|
523
|
+
);
|
|
524
|
+
} else {
|
|
525
|
+
meeting.updateVideo({
|
|
526
|
+
sendVideo: media.sendVideo,
|
|
527
|
+
receiveVideo: media.receiveVideo,
|
|
528
|
+
});
|
|
529
|
+
}
|
|
507
530
|
//audio
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
531
|
+
if (media.sendAudio) {
|
|
532
|
+
meeting
|
|
533
|
+
.getMediaStreams(media, {
|
|
534
|
+
audio: audioInputSelect.value ? {deviceId: {exact: audioInputSelect.value}} : media.sendAudio,
|
|
535
|
+
})
|
|
536
|
+
.then(([localStream]) =>
|
|
537
|
+
meeting.updateAudio({
|
|
511
538
|
stream: localStream,
|
|
512
539
|
sendAudio: media.sendAudio,
|
|
513
|
-
receiveAudio: media.receiveAudio
|
|
514
|
-
})
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
540
|
+
receiveAudio: media.receiveAudio,
|
|
541
|
+
})
|
|
542
|
+
);
|
|
543
|
+
} else {
|
|
544
|
+
meeting.updateAudio({
|
|
545
|
+
sendAudio: media.sendAudio,
|
|
546
|
+
receiveAudio: media.receiveAudio,
|
|
547
|
+
});
|
|
548
|
+
}
|
|
522
549
|
//all in one
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
550
|
+
meeting.getMediaStreams(media, {audio, video}).then(([localStream, localShare]) =>
|
|
551
|
+
meeting.updateMedia({
|
|
552
|
+
mediaSettings: media,
|
|
553
|
+
localStream,
|
|
554
|
+
localShare,
|
|
555
|
+
})
|
|
556
|
+
);
|
|
529
557
|
```
|
|
530
558
|
|
|
531
|
-
|
|
532
559
|
##### Accessing media directly (outside of a meeting)
|
|
560
|
+
|
|
533
561
|
You can also directly access the following media properties that are not on a meeting instance
|
|
534
562
|
|
|
535
563
|
```
|
|
@@ -539,24 +567,29 @@ this.media.getUserMedia(mediaSetting, audioVideo, sharePreferences, config)
|
|
|
539
567
|
See the [Media](https://github.com/webex/webex-js-sdk/blob/master/packages/node_modules/%40webex/plugin-meetings/src/media/index.js) util file for method signatures.
|
|
540
568
|
|
|
541
569
|
##### Leave a Meeting
|
|
570
|
+
|
|
542
571
|
To leave a meeting, simply call leave
|
|
572
|
+
|
|
543
573
|
```js
|
|
544
574
|
myMeeting.leave();
|
|
545
575
|
```
|
|
546
576
|
|
|
547
577
|
##### Lock/Unlock a Meeting
|
|
578
|
+
|
|
548
579
|
```js
|
|
549
580
|
meeting.lockMeeting();
|
|
550
581
|
meeting.unlockMeeting();
|
|
551
582
|
```
|
|
552
583
|
|
|
553
584
|
##### Transfer Host
|
|
585
|
+
|
|
554
586
|
```js
|
|
555
587
|
const hostMemberId = ...;
|
|
556
588
|
meeting.transfer(hostMemberId);
|
|
557
589
|
```
|
|
558
590
|
|
|
559
591
|
##### Check User Actions
|
|
592
|
+
|
|
560
593
|
```js
|
|
561
594
|
meeting.inMeetingActions.get();
|
|
562
595
|
{
|
|
@@ -572,6 +605,7 @@ meeting.inMeetingActions.get();
|
|
|
572
605
|
canRaiseHand: boolean,
|
|
573
606
|
canLowerAllHands: boolean,
|
|
574
607
|
canLowerSomeoneElsesHand: boolean,
|
|
608
|
+
bothLeaveAndEndMeetingAvailable: boolean,
|
|
575
609
|
}
|
|
576
610
|
```
|
|
577
611
|
|
|
@@ -604,9 +638,11 @@ webex.meetings.personalMeetingRoom.get().then((pmr) => {
|
|
|
604
638
|
```
|
|
605
639
|
|
|
606
640
|
#### Usage of Webex Devices
|
|
641
|
+
|
|
607
642
|
For details on how to use the devices see https://github.com/webex/webex-js-sdk/tree/master/packages/node_modules/%40webex/plugin-device-manager
|
|
608
643
|
|
|
609
644
|
##### Leave a Meeting Using a Device
|
|
645
|
+
|
|
610
646
|
```js
|
|
611
647
|
const resourceId = ...;
|
|
612
648
|
|
|
@@ -616,6 +652,7 @@ meeting.leave({resourceId}).then((res) => {
|
|
|
616
652
|
```
|
|
617
653
|
|
|
618
654
|
##### Leave a Meeting While Paired to the Device, Keep Device in Meeting
|
|
655
|
+
|
|
619
656
|
```js
|
|
620
657
|
meeting.leave().then((res) => {
|
|
621
658
|
console.log(`successful leave, ${res}`);
|
|
@@ -623,6 +660,7 @@ meeting.leave().then((res) => {
|
|
|
623
660
|
```
|
|
624
661
|
|
|
625
662
|
##### Move Meeting To Paired Device
|
|
663
|
+
|
|
626
664
|
```js
|
|
627
665
|
const resourceId = ...
|
|
628
666
|
|
|
@@ -633,6 +671,7 @@ meeting.moveTo(resourceId).then((res) => {
|
|
|
633
671
|
```
|
|
634
672
|
|
|
635
673
|
##### Move Meeting from Paired Device
|
|
674
|
+
|
|
636
675
|
```js
|
|
637
676
|
const resourceId = ...
|
|
638
677
|
|
|
@@ -642,6 +681,7 @@ meeting.moveFrom(resourceId).then((res) => {
|
|
|
642
681
|
```
|
|
643
682
|
|
|
644
683
|
##### Start Wireless Share
|
|
684
|
+
|
|
645
685
|
```js
|
|
646
686
|
const deviceId = ...
|
|
647
687
|
// create the meeting
|
|
@@ -674,23 +714,27 @@ meeting.getMediaStreams({
|
|
|
674
714
|
```
|
|
675
715
|
|
|
676
716
|
##### End Wireless Share
|
|
717
|
+
|
|
677
718
|
```js
|
|
678
719
|
meeting.leave();
|
|
679
720
|
```
|
|
680
721
|
|
|
681
722
|
##### Reconnect a Meeting Media
|
|
723
|
+
|
|
682
724
|
Warning: not necessary to use manually, internally the sdk listens to mercury reconnect events to determine for a reconnection
|
|
725
|
+
|
|
683
726
|
```js
|
|
684
727
|
meeting.reconnect();
|
|
685
728
|
```
|
|
686
729
|
|
|
687
730
|
#### Scheduled Meetings
|
|
688
|
-
For scheduled meetings see https://github.com/webex/webex-js-sdk/tree/master/packages/node_modules/%40webex/internal-plugin-calendar
|
|
689
731
|
|
|
732
|
+
For scheduled meetings see https://github.com/webex/webex-js-sdk/tree/master/packages/node_modules/%40webex/internal-plugin-calendar
|
|
690
733
|
|
|
691
734
|
#### Member
|
|
692
735
|
|
|
693
736
|
##### Properties
|
|
737
|
+
|
|
694
738
|
```javascript
|
|
695
739
|
member.participant ... // Object server participant object, advanced use only
|
|
696
740
|
member.id ... // String key for storing
|
|
@@ -718,9 +762,11 @@ member.isModeratorAssignmentProhibited ... // Boolean
|
|
|
718
762
|
```
|
|
719
763
|
|
|
720
764
|
#### Members
|
|
721
|
-
|
|
765
|
+
|
|
766
|
+
You can access the members object on each individual meeting instance. It has some key events to listen to, and maintains what happens for members of a meeting with some key properties.
|
|
722
767
|
|
|
723
768
|
##### Properties
|
|
769
|
+
|
|
724
770
|
```javascript
|
|
725
771
|
meeting.members.membersCollection.members ... // the members collection, object {id0: member0, ... idN: memberN}
|
|
726
772
|
meeting.members.locusUrl ... // current locusUrl being used
|
|
@@ -730,38 +776,40 @@ meeting.members.mediaShareContentId ... // active content sharer id for the meet
|
|
|
730
776
|
```
|
|
731
777
|
|
|
732
778
|
##### Functions
|
|
779
|
+
|
|
733
780
|
```javascript
|
|
734
781
|
// You can add a guest to the meeting by inviting them, this is proxied by meeting.invite
|
|
735
782
|
// use an emailAddress and a boolean value alertIfActive to notify server side (usually true)
|
|
736
|
-
meeting.members.addMember(emailAddress, alertIfActive)
|
|
783
|
+
meeting.members.addMember(emailAddress, alertIfActive);
|
|
737
784
|
|
|
738
785
|
// You can admit the guest to the meeting once they are waiting in the lobby, you can do this in bulk, proxied by meeting.admit
|
|
739
786
|
// use member ids, can be singular, but has to be put into an array
|
|
740
|
-
meeting.members.admitMembers([memberIds])
|
|
787
|
+
meeting.members.admitMembers([memberIds]);
|
|
741
788
|
|
|
742
789
|
// You can remove a member from the meeting by booting them, this is proxied by meeting.remove
|
|
743
790
|
// use a memberId string
|
|
744
|
-
meeting.members.removeMember(memberId)
|
|
791
|
+
meeting.members.removeMember(memberId);
|
|
745
792
|
|
|
746
793
|
// You can audio mute a member from the meeting by calling to mute them, this is proxied by meeting.mute
|
|
747
794
|
// use a memberId string and a boolean to mute or not, default to true
|
|
748
795
|
// mute them
|
|
749
|
-
meeting.members.muteMember(memberId)
|
|
796
|
+
meeting.members.muteMember(memberId);
|
|
750
797
|
|
|
751
798
|
// You can raise or lower the hand of a member from the meeting
|
|
752
799
|
// use a memberId string and a "raise" boolean to raise or lower, default to true ("raise the hand")
|
|
753
|
-
meeting.members.raiseOrLowerHand(memberId)
|
|
800
|
+
meeting.members.raiseOrLowerHand(memberId);
|
|
754
801
|
|
|
755
802
|
// You can lower all hands in a meeting
|
|
756
803
|
// use a memberId string to indicate who is requesting lowering all hands
|
|
757
|
-
meeting.members.lowerAllHands(requestingMemberId)
|
|
804
|
+
meeting.members.lowerAllHands(requestingMemberId);
|
|
758
805
|
|
|
759
806
|
// You can transfer the host role to another member in the meeting, this is proxied by meeting.transfer
|
|
760
807
|
// use a memberId string and a moderator boolean to transfer or not, default to true
|
|
761
|
-
meeting.members.transferHostToMember(memberId)
|
|
808
|
+
meeting.members.transferHostToMember(memberId);
|
|
762
809
|
```
|
|
763
810
|
|
|
764
811
|
##### Events
|
|
812
|
+
|
|
765
813
|
```javascript
|
|
766
814
|
// members collection updated
|
|
767
815
|
meeting.members.on('members:update', (payload) => {
|
|
@@ -791,44 +839,48 @@ meeting.members.on('members:content:update', (payload) => {
|
|
|
791
839
|
meeting.members.on('members:host:update', (payload) => {
|
|
792
840
|
console.log(`who started hosting: ${payload.activeHostId};`);
|
|
793
841
|
console.log(`who stopped hosting: ${payload.endedHostId};`);
|
|
794
|
-
})
|
|
842
|
+
});
|
|
795
843
|
// self updates, not typically used
|
|
796
844
|
meeting.members.on('members:self:update', (payload) => {
|
|
797
845
|
console.log(`active self id: ${payload.activeSelfId};`);
|
|
798
846
|
console.log(`ended self Id: ${payload.endedSelfId};`);
|
|
799
|
-
})
|
|
847
|
+
});
|
|
800
848
|
```
|
|
801
849
|
|
|
802
850
|
## Events
|
|
803
851
|
|
|
804
852
|
### Meetings Events
|
|
853
|
+
|
|
805
854
|
```js
|
|
806
855
|
webex.meetings.on(...)
|
|
807
856
|
```
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
|
811
|
-
| `
|
|
812
|
-
| `meeting:
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
857
|
+
|
|
858
|
+
| Event Name | Description |
|
|
859
|
+
| --------------------- | -------------------------------------------------------------------------------------------------- |
|
|
860
|
+
| `meetings:ready` | Fired when the plugin has been instantiated and is ready for action! |
|
|
861
|
+
| `meeting:added` | Fired when a meeting has been added to the collection, either incoming, or outgoing, can be joined |
|
|
862
|
+
| `meeting:removed` | Fired when a meeting has been deleted from the collection, this meeting cannot be rejoined |
|
|
863
|
+
| `media:codec:loaded` | Fired when H.264 media codec has been loaded in the browser. Does not have a payload. |
|
|
864
|
+
| `media:codec:missing` | Fired when H.264 media codec appears to be missing from the browser. Does not have a payload. |
|
|
865
|
+
| --- | --- |
|
|
816
866
|
|
|
817
867
|
`meetings:ready` does not have a payload
|
|
818
868
|
|
|
819
869
|
`meeting:added` has the following payload
|
|
870
|
+
|
|
820
871
|
```js
|
|
821
872
|
{
|
|
822
|
-
meetingId // the uuid of the meeting removed
|
|
823
|
-
type // string type can be INCOMING, JOIN, or MEETING
|
|
873
|
+
meetingId; // the uuid of the meeting removed
|
|
874
|
+
type; // string type can be INCOMING, JOIN, or MEETING
|
|
824
875
|
}
|
|
825
876
|
```
|
|
826
877
|
|
|
827
878
|
`meeting:removed` has the following payload
|
|
879
|
+
|
|
828
880
|
```js
|
|
829
881
|
{
|
|
830
|
-
meetingId // the uuid of the meeting removed
|
|
831
|
-
response // a propagated server response
|
|
882
|
+
meetingId; // the uuid of the meeting removed
|
|
883
|
+
response; // a propagated server response
|
|
832
884
|
}
|
|
833
885
|
```
|
|
834
886
|
|
|
@@ -838,41 +890,41 @@ webex.meetings.on(...)
|
|
|
838
890
|
meeting.on(...)
|
|
839
891
|
```
|
|
840
892
|
|
|
841
|
-
| Event Name
|
|
842
|
-
|
|
843
|
-
| `meetings:ready`
|
|
844
|
-
| `meetings:registered`
|
|
845
|
-
| `meetings:unregistered`
|
|
846
|
-
| `media:ready`
|
|
847
|
-
| `media:stopped`
|
|
848
|
-
| `meeting:media:local:start`
|
|
849
|
-
| `meeting:media:remote:start`
|
|
850
|
-
| `meeting:alerted`
|
|
851
|
-
| `meeting:ringing`
|
|
852
|
-
| `meeting:ringingStop`
|
|
853
|
-
| `meeting:startedSharingLocal`
|
|
854
|
-
| `meeting:stoppedSharingLocal`
|
|
855
|
-
| `meeting:startedSharingRemote`
|
|
856
|
-
| `meeting:stoppedSharingRemote`
|
|
857
|
-
| `meeting:self:lobbyWaiting`
|
|
858
|
-
| `meeting:self:guestAdmitted`
|
|
859
|
-
| `meeting:self:mutedByOthers`
|
|
860
|
-
| `meeting:reconnectionStarting`
|
|
861
|
-
| `meeting:reconnectionSuccess`
|
|
862
|
-
| `meeting:reconnectionFailure`
|
|
863
|
-
| `meeting:unlocked`
|
|
864
|
-
| `meeting:locked`
|
|
865
|
-
| `meeting:actionsUpdate`
|
|
866
|
-
| `meeting:logUpload:success`
|
|
867
|
-
| `meeting:logUpload:failure`
|
|
868
|
-
| `meeting:recording:started`
|
|
869
|
-
| `meeting:recording:stopped`
|
|
870
|
-
| `meeting:recording:paused`
|
|
871
|
-
| `meeting:recording:resumed`
|
|
872
|
-
| `meeting:receiveTranscription:started` | Fired when transcription is received
|
|
873
|
-
| `meeting:receiveTranscription:stopped` | Fired when transcription has stopped from being received
|
|
874
|
-
| `meeting:meetingContainer:update`
|
|
875
|
-
|
|
893
|
+
| Event Name | Description |
|
|
894
|
+
| -------------------------------------- | ------------------------------------------------------------------------------------------------- |
|
|
895
|
+
| `meetings:ready` | Fired when the meetings plugin has been successfully initialized |
|
|
896
|
+
| `meetings:registered` | Fired when the meetings plugin has registered the device and is listening to websocket events |
|
|
897
|
+
| `meetings:unregistered` | Fired when the meetings plugin has been disconnected from websockets and unregistered as a device |
|
|
898
|
+
| `media:ready` | Fired when remote or local media has been acquired |
|
|
899
|
+
| `media:stopped` | Fired when remote or local media has been torn down |
|
|
900
|
+
| `meeting:media:local:start` | Fired when local media has started sending bytes |
|
|
901
|
+
| `meeting:media:remote:start` | Fired when local media has started receiving bytes from the remote audio or video streams |
|
|
902
|
+
| `meeting:alerted` | Fired when locus was notified that user received meeting |
|
|
903
|
+
| `meeting:ringing` | Fired when meeting should have a ringing sound on repeat |
|
|
904
|
+
| `meeting:ringingStop` | Fired when meeting should stop a ringing sound |
|
|
905
|
+
| `meeting:startedSharingLocal` | Fired when local screen sharing was started |
|
|
906
|
+
| `meeting:stoppedSharingLocal` | Fired when local screen sharing ends |
|
|
907
|
+
| `meeting:startedSharingRemote` | Fired when remote screen sharing was started |
|
|
908
|
+
| `meeting:stoppedSharingRemote` | Fired when remote screen sharing ends |
|
|
909
|
+
| `meeting:self:lobbyWaiting` | Fired when user has entered the lobby for a PMR or the like |
|
|
910
|
+
| `meeting:self:guestAdmitted` | Fired when user has entered the meeting after waiting to be admitted from join |
|
|
911
|
+
| `meeting:self:mutedByOthers` | Fired when user has been audio muted by another in the muting |
|
|
912
|
+
| `meeting:reconnectionStarting` | Fired when a reconnect begins |
|
|
913
|
+
| `meeting:reconnectionSuccess` | Fired when the media was reconnected successfully |
|
|
914
|
+
| `meeting:reconnectionFailure` | Fired when the media failed to reconnect, user will have to rejoin and connect |
|
|
915
|
+
| `meeting:unlocked` | Fired when the meeting was unlocked by the host, for webex type meetings only |
|
|
916
|
+
| `meeting:locked` | Fired when the meeting was locked by the host, for webex type meetings only |
|
|
917
|
+
| `meeting:actionsUpdate` | Fired when the user has new actions they can take, such as lock, unlock, transferHost |
|
|
918
|
+
| `meeting:logUpload:success` | Fired when the meeting logs were successfully uploaded |
|
|
919
|
+
| `meeting:logUpload:failure` | Fired when the meeting logs failed to upload |
|
|
920
|
+
| `meeting:recording:started` | Fired when member starts recording |
|
|
921
|
+
| `meeting:recording:stopped` | Fired when member stops recording |
|
|
922
|
+
| `meeting:recording:paused` | Fired when member pauses recording |
|
|
923
|
+
| `meeting:recording:resumed` | Fired when member resumes recording |
|
|
924
|
+
| `meeting:receiveTranscription:started` | Fired when transcription is received |
|
|
925
|
+
| `meeting:receiveTranscription:stopped` | Fired when transcription has stopped from being received |
|
|
926
|
+
| `meeting:meetingContainer:update` | Fired when the meetingContainerUrl is updated |
|
|
927
|
+
| --- | --- |
|
|
876
928
|
|
|
877
929
|
`meetings:ready` does not have a payload
|
|
878
930
|
|
|
@@ -881,10 +933,11 @@ meeting.on(...)
|
|
|
881
933
|
`meetings:unregistered` does not have a payload
|
|
882
934
|
|
|
883
935
|
`media:ready` has the following payload
|
|
936
|
+
|
|
884
937
|
```javascript
|
|
885
938
|
{
|
|
886
939
|
type, // local or remote
|
|
887
|
-
|
|
940
|
+
stream; // the MediaStream
|
|
888
941
|
}
|
|
889
942
|
// usage
|
|
890
943
|
meeting.on('media:ready', (media) => {
|
|
@@ -910,6 +963,7 @@ meeting.on('media:ready', (media) => {
|
|
|
910
963
|
```
|
|
911
964
|
|
|
912
965
|
`media:stopped` has the following payload
|
|
966
|
+
|
|
913
967
|
```javascript
|
|
914
968
|
{
|
|
915
969
|
type, // local or remote
|
|
@@ -937,6 +991,7 @@ meeting.on('media:stopped', (media) => {
|
|
|
937
991
|
`meeting:alerted` does not have a payload
|
|
938
992
|
|
|
939
993
|
`meeting:ringing` has the following payload
|
|
994
|
+
|
|
940
995
|
```js
|
|
941
996
|
{
|
|
942
997
|
type // INCOMING or JOIN
|
|
@@ -945,6 +1000,7 @@ meeting.on('media:stopped', (media) => {
|
|
|
945
1000
|
```
|
|
946
1001
|
|
|
947
1002
|
`meeting:ringingStop` has the following payload
|
|
1003
|
+
|
|
948
1004
|
```js
|
|
949
1005
|
{
|
|
950
1006
|
type // Object {remoteAnswered: boolean, remoteDeclined: boolean}
|
|
@@ -957,57 +1013,65 @@ meeting.on('media:stopped', (media) => {
|
|
|
957
1013
|
`meeting:stoppedSharingLocal` does not have a payload
|
|
958
1014
|
|
|
959
1015
|
`meeting:self:lobbyWaiting` has the following payload
|
|
1016
|
+
|
|
960
1017
|
```js
|
|
961
1018
|
{
|
|
962
|
-
payload // self object
|
|
1019
|
+
payload; // self object
|
|
963
1020
|
}
|
|
964
1021
|
```
|
|
965
1022
|
|
|
966
1023
|
`meeting:self:guestAdmitted` has the following payload
|
|
1024
|
+
|
|
967
1025
|
```js
|
|
968
1026
|
{
|
|
969
|
-
payload // self object
|
|
1027
|
+
payload; // self object
|
|
970
1028
|
}
|
|
971
1029
|
```
|
|
972
1030
|
|
|
973
1031
|
`meeting:self:mutedByOthers` has the following payload
|
|
1032
|
+
|
|
974
1033
|
```js
|
|
975
1034
|
{
|
|
976
|
-
payload // self object
|
|
1035
|
+
payload; // self object
|
|
977
1036
|
}
|
|
978
1037
|
```
|
|
979
1038
|
|
|
980
1039
|
`meeting:reconnectionStarting` does not have a payload
|
|
981
1040
|
|
|
982
1041
|
`meeting:reconnectionSuccess` has the following payload
|
|
1042
|
+
|
|
983
1043
|
```js
|
|
984
1044
|
{
|
|
985
|
-
reconnect // the media promise resolution
|
|
1045
|
+
reconnect; // the media promise resolution
|
|
986
1046
|
}
|
|
987
1047
|
```
|
|
988
1048
|
|
|
989
1049
|
`meeting:reconnectionFailure` has the following payload
|
|
1050
|
+
|
|
990
1051
|
```js
|
|
991
1052
|
{
|
|
992
|
-
error // the forwarded error from media
|
|
1053
|
+
error; // the forwarded error from media
|
|
993
1054
|
}
|
|
994
1055
|
```
|
|
995
1056
|
|
|
996
1057
|
`meeting:unlocked` has the following payload
|
|
1058
|
+
|
|
997
1059
|
```js
|
|
998
1060
|
{
|
|
999
|
-
info // info object
|
|
1061
|
+
info; // info object
|
|
1000
1062
|
}
|
|
1001
1063
|
```
|
|
1002
1064
|
|
|
1003
1065
|
`meeting:locked` has the following payload
|
|
1066
|
+
|
|
1004
1067
|
```js
|
|
1005
1068
|
{
|
|
1006
|
-
info // info object
|
|
1069
|
+
info; // info object
|
|
1007
1070
|
}
|
|
1008
1071
|
```
|
|
1009
1072
|
|
|
1010
1073
|
`meeting:actionsUpdate` has the following payload
|
|
1074
|
+
|
|
1011
1075
|
```js
|
|
1012
1076
|
{
|
|
1013
1077
|
canInviteNewParticipants, // boolean
|
|
@@ -1022,6 +1086,7 @@ meeting.on('media:stopped', (media) => {
|
|
|
1022
1086
|
canRaiseHand, //boolean
|
|
1023
1087
|
canLowerAllHands, //boolean
|
|
1024
1088
|
canLowerSomeoneElsesHand, //boolean
|
|
1089
|
+
bothLeaveAndEndMeetingAvailable, //boolean
|
|
1025
1090
|
}
|
|
1026
1091
|
```
|
|
1027
1092
|
|
|
@@ -1029,27 +1094,30 @@ meeting.on('media:stopped', (media) => {
|
|
|
1029
1094
|
`meeting:recording:stopped`
|
|
1030
1095
|
`meeting:recording:paused`
|
|
1031
1096
|
`meeting:recording:resumed` have the following payload
|
|
1097
|
+
|
|
1032
1098
|
```js
|
|
1033
1099
|
{
|
|
1034
|
-
state // could be etiher `recording`, `idle` or `paused`
|
|
1035
|
-
modifiedBy // user's decrypted ID who made an action
|
|
1036
|
-
lastModified // when the action was made
|
|
1100
|
+
state; // could be etiher `recording`, `idle` or `paused`
|
|
1101
|
+
modifiedBy; // user's decrypted ID who made an action
|
|
1102
|
+
lastModified; // when the action was made
|
|
1037
1103
|
}
|
|
1038
1104
|
```
|
|
1039
1105
|
|
|
1040
1106
|
### Event Caveats
|
|
1107
|
+
|
|
1041
1108
|
##### Remote screen share is not displayed if started before participant joins
|
|
1042
1109
|
|
|
1043
1110
|
If you notice that the remote screen share is not being displayed to a participant when they join
|
|
1044
1111
|
after a screen has already been shared, double-check that you are following the standard plugin-meeting workflow.
|
|
1045
1112
|
|
|
1046
1113
|
Standard plugin-meeting workflow is as follows:
|
|
1114
|
+
|
|
1047
1115
|
1. Set event listener for `media:ready`
|
|
1048
1116
|
2. Call `join()`
|
|
1049
1117
|
3. Call `addMedia()` with `options.mediaSettings.receiveShare=true`
|
|
1050
1118
|
4. Wait to receive an event from `media:ready` with payload `type=remoteShare` that contains the remote share media stream
|
|
1051
1119
|
5. Set `srcObject` of a `video` element in the application to the previously obtained media stream
|
|
1052
|
-
(e.g. `document.getElementById('remote-screen').srcObject = media.stream`)
|
|
1120
|
+
(e.g. `document.getElementById('remote-screen').srcObject = media.stream`)
|
|
1053
1121
|
|
|
1054
1122
|
In most cases this will resolve the issue though an extra step could be to
|
|
1055
1123
|
use `meeting.shareStatus` to control whether to show the video element or not.
|
|
@@ -1076,8 +1144,8 @@ There are several events submitted by this package that you can subscribe to.
|
|
|
1076
1144
|
| `members:self:update` | Fired when a member in the collection has a changed self value |
|
|
1077
1145
|
|---|---|
|
|
1078
1146
|
|
|
1079
|
-
|
|
1080
1147
|
`members:update` has the following payload
|
|
1148
|
+
|
|
1081
1149
|
```js
|
|
1082
1150
|
{
|
|
1083
1151
|
delta: { // the changes to the members list
|
|
@@ -1089,32 +1157,35 @@ There are several events submitted by this package that you can subscribe to.
|
|
|
1089
1157
|
```
|
|
1090
1158
|
|
|
1091
1159
|
`members:content:update` has the following payload
|
|
1160
|
+
|
|
1092
1161
|
```js
|
|
1093
1162
|
{
|
|
1094
|
-
activeContentSharingId // the member id
|
|
1095
|
-
endedContentSharingId // the member id
|
|
1163
|
+
activeContentSharingId; // the member id
|
|
1164
|
+
endedContentSharingId; // the member id
|
|
1096
1165
|
}
|
|
1097
1166
|
```
|
|
1098
1167
|
|
|
1099
1168
|
`members:host:update` has the following payload
|
|
1169
|
+
|
|
1100
1170
|
```js
|
|
1101
1171
|
{
|
|
1102
|
-
activeHostId // the member id
|
|
1103
|
-
endedHostId // the member id
|
|
1172
|
+
activeHostId; // the member id
|
|
1173
|
+
endedHostId; // the member id
|
|
1104
1174
|
}
|
|
1105
1175
|
```
|
|
1106
1176
|
|
|
1107
1177
|
`members:self:update` has the following payload
|
|
1178
|
+
|
|
1108
1179
|
```js
|
|
1109
1180
|
{
|
|
1110
|
-
activeSelfId // the member id
|
|
1111
|
-
endedSelfId // the member id
|
|
1181
|
+
activeSelfId; // the member id
|
|
1182
|
+
endedSelfId; // the member id
|
|
1112
1183
|
}
|
|
1113
1184
|
```
|
|
1114
1185
|
|
|
1115
1186
|
## Development
|
|
1116
1187
|
|
|
1117
|
-
To use `webpack-dev-server` to load this package, run `
|
|
1188
|
+
To use `webpack-dev-server` to load this package, run `yarn run samples:serve`.
|
|
1118
1189
|
|
|
1119
1190
|
Files placed in the `docs/samples/browser-plugin-meetings` folder will be served statically.
|
|
1120
1191
|
|