@wazo/sdk 0.38.6 → 0.38.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/dist/wazo-sdk.js +2 -2
  2. package/esm/__tests__/api-client.test.js +142 -2
  3. package/esm/__tests__/web-rtc-client.test.js +249 -28
  4. package/esm/api/calld.js +8 -0
  5. package/esm/api/confd.js +134 -2
  6. package/esm/api-client.js +142 -2
  7. package/esm/checker/Checker.js +205 -25
  8. package/esm/checker/checks/aor.js +142 -2
  9. package/esm/checker/checks/api.js +142 -2
  10. package/esm/checker/checks/index.js +205 -25
  11. package/esm/checker/checks/wazo-websocket.js +2 -0
  12. package/esm/checker/checks/webrtc-transport.js +203 -25
  13. package/esm/checker/checks/webrtc.js +203 -25
  14. package/esm/domain/AdHocAPIConference.js +142 -2
  15. package/esm/domain/Features.js +142 -2
  16. package/esm/domain/Meeting.js +18 -0
  17. package/esm/domain/MeetingAuthorization.js +70 -0
  18. package/esm/domain/Phone/CTIPhone.js +142 -2
  19. package/esm/domain/Phone/WebRTCPhone.js +1 -3
  20. package/esm/domain/__tests__/Meeting.test.js +87 -1
  21. package/esm/domain/__tests__/MeetingAuthorization.test.js +109 -0
  22. package/esm/index.js +249 -31
  23. package/esm/lib/WazoSessionDescriptionHandler.js +22 -1
  24. package/esm/service/CallApi.js +142 -2
  25. package/esm/service/getApiClient.js +142 -2
  26. package/esm/simple/Auth.js +249 -31
  27. package/esm/simple/Configuration.js +249 -31
  28. package/esm/simple/Directory.js +142 -2
  29. package/esm/simple/Phone.js +249 -31
  30. package/esm/simple/Websocket.js +3 -0
  31. package/esm/simple/index.js +249 -31
  32. package/esm/simple/room/LocalParticipant.js +249 -31
  33. package/esm/simple/room/Participant.js +249 -31
  34. package/esm/simple/room/RemoteParticipant.js +249 -31
  35. package/esm/simple/room/Room.js +249 -31
  36. package/esm/simple/room/SipRoom.js +249 -31
  37. package/esm/simple/room/Stream.js +249 -31
  38. package/esm/simple/room/__tests__/Participant.test.js +14745 -0
  39. package/esm/simple/room/__tests__/RemoteParticipant.test.js +249 -31
  40. package/esm/simple/utils.js +249 -31
  41. package/esm/utils/__tests__/object.test.js +57 -0
  42. package/esm/utils/__tests__/sdp.test.js +50 -0
  43. package/esm/utils/__tests__/string.test.js +30 -0
  44. package/esm/utils/object.js +24 -0
  45. package/esm/utils/sdp.js +19 -1
  46. package/esm/utils/string.js +10 -0
  47. package/esm/web-rtc-client.js +203 -25
  48. package/esm/websocket-client.js +3 -1
  49. package/lib/__tests__/api-client.test.js +142 -2
  50. package/lib/__tests__/web-rtc-client.test.js +249 -28
  51. package/lib/api/calld.js +8 -0
  52. package/lib/api/confd.js +134 -2
  53. package/lib/api-client.js +142 -2
  54. package/lib/checker/Checker.js +205 -25
  55. package/lib/checker/checks/aor.js +142 -2
  56. package/lib/checker/checks/api.js +142 -2
  57. package/lib/checker/checks/index.js +205 -25
  58. package/lib/checker/checks/wazo-websocket.js +2 -0
  59. package/lib/checker/checks/webrtc-transport.js +203 -25
  60. package/lib/checker/checks/webrtc.js +203 -25
  61. package/lib/domain/AdHocAPIConference.js +142 -2
  62. package/lib/domain/Features.js +142 -2
  63. package/lib/domain/Meeting.js +18 -0
  64. package/lib/domain/MeetingAuthorization.js +79 -0
  65. package/lib/domain/Phone/CTIPhone.js +142 -2
  66. package/lib/domain/Phone/WebRTCPhone.js +1 -3
  67. package/lib/domain/__tests__/Meeting.test.js +87 -1
  68. package/lib/domain/__tests__/MeetingAuthorization.test.js +111 -0
  69. package/lib/index.js +249 -31
  70. package/lib/lib/WazoSessionDescriptionHandler.js +22 -1
  71. package/lib/service/CallApi.js +142 -2
  72. package/lib/service/getApiClient.js +142 -2
  73. package/lib/simple/Auth.js +249 -31
  74. package/lib/simple/Configuration.js +249 -31
  75. package/lib/simple/Directory.js +142 -2
  76. package/lib/simple/Phone.js +249 -31
  77. package/lib/simple/Websocket.js +3 -0
  78. package/lib/simple/index.js +249 -31
  79. package/lib/simple/room/LocalParticipant.js +249 -31
  80. package/lib/simple/room/Participant.js +249 -31
  81. package/lib/simple/room/RemoteParticipant.js +249 -31
  82. package/lib/simple/room/Room.js +249 -31
  83. package/lib/simple/room/SipRoom.js +249 -31
  84. package/lib/simple/room/Stream.js +249 -31
  85. package/lib/simple/room/__tests__/Participant.test.js +14755 -0
  86. package/lib/simple/room/__tests__/RemoteParticipant.test.js +249 -31
  87. package/lib/simple/utils.js +249 -31
  88. package/lib/utils/__tests__/object.test.js +59 -0
  89. package/lib/utils/__tests__/sdp.test.js +50 -0
  90. package/lib/utils/__tests__/string.test.js +32 -0
  91. package/lib/utils/object.js +28 -0
  92. package/lib/utils/sdp.js +19 -0
  93. package/lib/utils/string.js +14 -0
  94. package/lib/web-rtc-client.js +203 -25
  95. package/lib/websocket-client.js +3 -0
  96. package/package.json +2 -2
  97. package/src/__tests__/web-rtc-client.test.js +46 -3
  98. package/src/api/calld.js +8 -0
  99. package/src/api/confd.js +43 -2
  100. package/src/domain/Meeting.js +20 -0
  101. package/src/domain/MeetingAuthorization.js +67 -0
  102. package/src/domain/Phone/WebRTCPhone.js +1 -3
  103. package/src/domain/__tests__/Meeting.test.js +70 -1
  104. package/src/domain/__tests__/MeetingAuthorization.test.js +58 -0
  105. package/src/lib/WazoSessionDescriptionHandler.js +5 -2
  106. package/src/simple/room/Participant.js +40 -0
  107. package/src/simple/room/Room.js +2 -2
  108. package/src/simple/room/SipRoom.js +1 -1
  109. package/src/simple/room/__tests__/Participant.test.js +81 -0
  110. package/src/types/WebSocketMessage.js +7 -1
  111. package/src/utils/__tests__/object.test.js +35 -0
  112. package/src/utils/__tests__/sdp.test.js +33 -1
  113. package/src/utils/__tests__/string.test.js +23 -0
  114. package/src/utils/object.js +15 -0
  115. package/src/utils/sdp.js +18 -0
  116. package/src/utils/string.js +8 -0
  117. package/src/web-rtc-client.js +39 -22
  118. package/src/websocket-client.js +2 -0
@@ -2671,6 +2671,70 @@ class ExternalApp {
2671
2671
 
2672
2672
  //
2673
2673
 
2674
+ class MeetingAuthorization {
2675
+
2676
+
2677
+
2678
+
2679
+
2680
+
2681
+ constructor({
2682
+ meetingUuid,
2683
+ uuid,
2684
+ userUuid,
2685
+ userName,
2686
+ } = {}) {
2687
+ this.meetingUuid = meetingUuid;
2688
+ this.uuid = uuid;
2689
+ this.userUuid = userUuid;
2690
+ this.userName = userName;
2691
+ }
2692
+
2693
+ setStatus(status ) {
2694
+ this.status = status;
2695
+ }
2696
+
2697
+ getStatus() {
2698
+ return this.status;
2699
+ }
2700
+
2701
+ static parse(plain ) {
2702
+ const {
2703
+ meeting_uuid: meetingUuid,
2704
+ uuid,
2705
+ guest_uuid: userUuid,
2706
+ guest_name: userName,
2707
+ } = plain;
2708
+
2709
+ return new MeetingAuthorization({
2710
+ meetingUuid,
2711
+ uuid,
2712
+ userUuid,
2713
+ userName,
2714
+ });
2715
+ }
2716
+
2717
+ static parseMany(items ) {
2718
+ if (!items) {
2719
+ return [];
2720
+ }
2721
+ return items.map(MeetingAuthorization.parse);
2722
+ }
2723
+ }
2724
+
2725
+ //
2726
+
2727
+
2728
+
2729
+
2730
+
2731
+
2732
+
2733
+
2734
+
2735
+
2736
+
2737
+
2674
2738
 
2675
2739
 
2676
2740
 
@@ -2681,6 +2745,7 @@ class ExternalApp {
2681
2745
 
2682
2746
 
2683
2747
 
2748
+
2684
2749
 
2685
2750
 
2686
2751
  class Meeting {
@@ -2695,6 +2760,8 @@ class Meeting {
2695
2760
 
2696
2761
 
2697
2762
 
2763
+
2764
+
2698
2765
 
2699
2766
  static parse(plain ) {
2700
2767
  return new Meeting({
@@ -2707,6 +2774,7 @@ class Meeting {
2707
2774
  extension: plain.exten,
2708
2775
  persistent: plain.persistent,
2709
2776
  creationTime: moment(plain.creation_time).toDate(),
2777
+ requireAuthorization: plain.require_authorization,
2710
2778
  });
2711
2779
  }
2712
2780
 
@@ -2731,6 +2799,7 @@ class Meeting {
2731
2799
  extension,
2732
2800
  persistent,
2733
2801
  creationTime,
2802
+ requireAuthorization,
2734
2803
  } = {}) {
2735
2804
  this.guestSipAuthorization = guestSipAuthorization;
2736
2805
  this.uri = uri;
@@ -2741,6 +2810,7 @@ class Meeting {
2741
2810
  this.extension = extension;
2742
2811
  this.persistent = persistent;
2743
2812
  this.creationTime = creationTime;
2813
+ this.requireAuthorization = requireAuthorization;
2744
2814
 
2745
2815
  // Useful to compare instead of instanceof with minified code
2746
2816
  this.type = 'Meeting';
@@ -2751,8 +2821,32 @@ class Meeting {
2751
2821
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
2752
2822
  return { username, secret };
2753
2823
  }
2824
+
2754
2825
  }
2755
2826
 
2827
+ //
2828
+
2829
+ const camelToUnderscore = (key ) => {
2830
+ if (typeof key !== 'string') {
2831
+ throw new Error('Input is not a string');
2832
+ }
2833
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
2834
+ };
2835
+
2836
+ //
2837
+
2838
+ const convertKeysFromCamelToUnderscore = (args ) => {
2839
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
2840
+ throw new Error('Input is not an object');
2841
+ }
2842
+
2843
+ return Object.keys(args).reduce((acc, key) => {
2844
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
2845
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
2846
+ return acc;
2847
+ }, {});
2848
+ };
2849
+
2756
2850
  /* */
2757
2851
 
2758
2852
  var confdMethods = (client , baseUrl ) => ({
@@ -2821,8 +2915,18 @@ var confdMethods = (client , baseUrl ) => ({
2821
2915
  getMyMeetings: () =>
2822
2916
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2823
2917
 
2824
- createMyMeeting: (name , persistent ) =>
2825
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2918
+ createMyMeeting: (args ) =>
2919
+ client
2920
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
2921
+ .then(Meeting.parse),
2922
+
2923
+ updateMyMeeting: (meetingUuid , data ) =>
2924
+ client.put(
2925
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
2926
+ convertKeysFromCamelToUnderscore(data),
2927
+ null,
2928
+ ApiRequester.successResponseParser,
2929
+ ),
2826
2930
 
2827
2931
  deleteMyMeeting: (meetingUuid ) =>
2828
2932
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2830,8 +2934,36 @@ var confdMethods = (client , baseUrl ) => ({
2830
2934
  getMeeting: (meetingUuid ) =>
2831
2935
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
2832
2936
 
2937
+ meetingAuthorizations: (meetingUuid ) =>
2938
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
2939
+
2940
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
2941
+ client.put(
2942
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
2943
+ {},
2944
+ null,
2945
+ ApiRequester.successResponseParser,
2946
+ ),
2947
+
2948
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
2949
+ client.put(
2950
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
2951
+ {},
2952
+ null,
2953
+ ApiRequester.successResponseParser,
2954
+ ),
2955
+
2833
2956
  guestGetMeeting: (meetingUuid ) =>
2834
2957
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
2958
+
2959
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
2960
+ client
2961
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
2962
+ .then(MeetingAuthorization.parse),
2963
+
2964
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
2965
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
2966
+
2835
2967
  });
2836
2968
 
2837
2969
  //
@@ -5056,6 +5188,14 @@ var calldMethods = (client , baseUrl ) => ({
5056
5188
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
5057
5189
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
5058
5190
 
5191
+ banMeetingParticipant: (meetingUuid , participantUuid ) =>
5192
+ client.delete(
5193
+ `${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
5194
+ null,
5195
+ null,
5196
+ ApiRequester.successResponseParser,
5197
+ ),
5198
+
5059
5199
  listTrunks: () => client.get(`${baseUrl}/trunks`),
5060
5200
 
5061
5201
  mute: (callId ) =>
@@ -6204,6 +6344,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
6204
6344
  return fixed;
6205
6345
  };
6206
6346
 
6347
+ const addIcesInAllBundles = (sdp ) => {
6348
+ const parsedSdp = sdpParser.parse(sdp);
6349
+
6350
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
6351
+ if (!mediaWithCandidate) {
6352
+ return sdp;
6353
+ }
6354
+
6355
+ const { candidates } = mediaWithCandidate;
6356
+
6357
+ parsedSdp.media = parsedSdp.media.map(media => ({
6358
+ ...media,
6359
+ candidates: media.candidates || candidates,
6360
+ }));
6361
+
6362
+ return sdpParser.write(parsedSdp);
6363
+ };
6364
+
6207
6365
  /* global RTCSessionDescriptionInit, navigator */
6208
6366
 
6209
6367
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -6333,7 +6491,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
6333
6491
 
6334
6492
  // Check if we got ICEs
6335
6493
  if (sdp.indexOf('a=candidate') !== -1) {
6336
- return description;
6494
+ return {
6495
+ type: description.type,
6496
+ sdp: addIcesInAllBundles(sdp),
6497
+ };
6337
6498
  }
6338
6499
 
6339
6500
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7793,7 +7954,7 @@ class WebRTCClient extends Emitter {
7793
7954
  });
7794
7955
  }
7795
7956
 
7796
- changeAudioInputDevice(id , session , force ) {
7957
+ async changeAudioInputDevice(id , session , force ) {
7797
7958
  const currentId = this.getAudioDeviceId();
7798
7959
  logger$8.info('setting audio input device', { id, currentId, session: !!session });
7799
7960
 
@@ -7801,33 +7962,50 @@ class WebRTCClient extends Emitter {
7801
7962
  return null;
7802
7963
  }
7803
7964
 
7965
+ // in order to handle an audio track change for default devices
7966
+ // we need the actual id of the device (not 'default')
7967
+ let deviceId = id;
7968
+ if (id === 'default' && navigator.mediaDevices) {
7969
+ const devices = await navigator.mediaDevices.enumerateDevices();
7970
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
7971
+ if (defaultDevice) {
7972
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
7973
+ const targetDevice = devices.find(device => device.label === deviceLabel);
7974
+ if (targetDevice) {
7975
+ deviceId = targetDevice.deviceId;
7976
+ if (!force && deviceId === currentId) {
7977
+ return null;
7978
+ }
7979
+ }
7980
+ }
7981
+ }
7982
+
7804
7983
  // let's update the local audio value
7805
7984
  if (this.audio) {
7806
7985
  this.audio = {
7807
7986
  deviceId: {
7808
- exact: id,
7987
+ exact: deviceId,
7809
7988
  },
7810
7989
  };
7811
7990
  }
7812
7991
 
7813
- if (session) {
7992
+ if (session && navigator.mediaDevices) {
7814
7993
  const sdh = session.sessionDescriptionHandler;
7815
7994
  const pc = sdh.peerConnection;
7816
7995
 
7817
- // $FlowFixMe
7818
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7819
- const audioTrack = stream.getAudioTracks()[0];
7820
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7996
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
7997
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
7998
+ const audioTrack = stream.getAudioTracks()[0];
7999
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7821
8000
 
7822
- if (sender) {
7823
- if (sender.track) {
7824
- audioTrack.enabled = sender.track.enabled;
7825
- }
7826
- sender.replaceTrack(audioTrack);
8001
+ if (sender) {
8002
+ if (sender.track) {
8003
+ audioTrack.enabled = sender.track.enabled;
7827
8004
  }
8005
+ sender.replaceTrack(audioTrack);
8006
+ }
7828
8007
 
7829
- return stream;
7830
- });
8008
+ return stream;
7831
8009
  }
7832
8010
  }
7833
8011
 
@@ -7847,14 +8025,14 @@ class WebRTCClient extends Emitter {
7847
8025
  return null;
7848
8026
  }
7849
8027
 
7850
- // let's update the local video value
7851
- if (this.video) {
7852
- this.video = {
7853
- deviceId: {
7854
- exact: id,
7855
- },
7856
- };
7857
- }
8028
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
8029
+ const videoObject = typeof this.video === 'object' ? this.video : {};
8030
+ this.video = {
8031
+ ...videoObject,
8032
+ deviceId: {
8033
+ exact: id,
8034
+ },
8035
+ };
7858
8036
  }
7859
8037
 
7860
8038
  changeSessionVideoInputDevice(id , session ) {
@@ -9456,9 +9634,7 @@ class WebRTCPhone extends Emitter {
9456
9634
 
9457
9635
  try {
9458
9636
  if (this.currentScreenShare.stream) {
9459
- this.currentScreenShare.stream.getTracks()
9460
- .filter(track => track.kind === 'video')
9461
- .forEach(track => track.stop());
9637
+ this.currentScreenShare.stream.getTracks().forEach(track => track.stop());
9462
9638
  }
9463
9639
 
9464
9640
  if (restoreLocalStream) {
@@ -11249,6 +11425,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
11249
11425
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
11250
11426
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
11251
11427
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
11428
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
11252
11429
 
11253
11430
  const BLACKLIST_EVENTS = [
11254
11431
  CHAT_MESSAGE_SENT,
@@ -11600,6 +11777,7 @@ WebSocketClient.eventLists = [
11600
11777
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11601
11778
  CONFERENCE_ADHOC_DELETED,
11602
11779
  MEETING_USER_PROGRESS,
11780
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11603
11781
  ];
11604
11782
 
11605
11783
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11671,6 +11849,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11671
11849
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11672
11850
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11673
11851
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11852
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11674
11853
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11675
11854
  'default': WebSocketClient
11676
11855
  });
@@ -11768,7 +11947,7 @@ class SipRoom extends Room {
11768
11947
  logger$3.info('connecting to sip room', { extension, audioOnly, room: !!room });
11769
11948
 
11770
11949
  if (!room) {
11771
- await Wazo.Phone.connect();
11950
+ await Wazo.Phone.connect({ media: constraints });
11772
11951
 
11773
11952
  const withCamera = constraints && !!constraints.video;
11774
11953
 
@@ -13455,7 +13634,7 @@ class Room extends Emitter {
13455
13634
  logger$1.info('connecting to room', { extension, audioOnly, room: !!room });
13456
13635
 
13457
13636
  if (!room) {
13458
- await Wazo.Phone.connect();
13637
+ await Wazo.Phone.connect({ media: constraints });
13459
13638
 
13460
13639
  const withCamera = constraints && !!constraints.video;
13461
13640
 
@@ -13900,7 +14079,7 @@ class Room extends Emitter {
13900
14079
  const participant = this._getParticipantFromCallId(status.callId);
13901
14080
 
13902
14081
  if (participant) {
13903
- // we're received, so no need to broadcast, hence the input false arg
14082
+ // we're receiving, so no need to broadcast
13904
14083
  participant.updateStatus(status, false);
13905
14084
  }
13906
14085
  break;
@@ -14174,6 +14353,7 @@ class Participant extends Emitter {
14174
14353
 
14175
14354
 
14176
14355
 
14356
+
14177
14357
 
14178
14358
 
14179
14359
 
@@ -14191,6 +14371,7 @@ class Participant extends Emitter {
14191
14371
 
14192
14372
 
14193
14373
 
14374
+
14194
14375
 
14195
14376
  /**
14196
14377
  * @param room Room The room where the participant is
@@ -14214,6 +14395,7 @@ class Participant extends Emitter {
14214
14395
  this.screensharing = false;
14215
14396
  this.isOnHold = false;
14216
14397
  this.extra = extra;
14398
+ this.banned = false;
14217
14399
 
14218
14400
  this.ON_UPDATED = 'participant/ON_UPDATED';
14219
14401
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -14230,6 +14412,7 @@ class Participant extends Emitter {
14230
14412
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
14231
14413
  this.ON_HOLD = 'participant/ON_HOLD';
14232
14414
  this.ON_RESUME = 'participant/ON_RESUME';
14415
+ this.ON_BAN = 'participant/ON_BAN';
14233
14416
  }
14234
14417
 
14235
14418
  triggerEvent(name , ...args ) {
@@ -14270,6 +14453,10 @@ class Participant extends Emitter {
14270
14453
  status.extra = this.extra;
14271
14454
  break;
14272
14455
  }
14456
+ case this.ON_BAN: {
14457
+ status.banned = true;
14458
+ break;
14459
+ }
14273
14460
  }
14274
14461
 
14275
14462
  if (broadcast) {
@@ -14372,6 +14559,11 @@ class Participant extends Emitter {
14372
14559
  this.triggerUpdate(this.ON_RESUME, broadcast);
14373
14560
  }
14374
14561
 
14562
+ onBan(broadcast = true) {
14563
+ this.banned = true;
14564
+ this.triggerUpdate(this.ON_BAN, broadcast);
14565
+ }
14566
+
14375
14567
  getStatus() {
14376
14568
  return {
14377
14569
  callId: this.callId,
@@ -14418,6 +14610,10 @@ class Participant extends Emitter {
14418
14610
  }
14419
14611
  }
14420
14612
 
14613
+ if (status.banned) {
14614
+ this.onBan(false);
14615
+ }
14616
+
14421
14617
  // Poor man's object comparison
14422
14618
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
14423
14619
  this.extra = { ...this.extra, ...status.extra };
@@ -14445,6 +14641,28 @@ class Participant extends Emitter {
14445
14641
  this.streams = streams;
14446
14642
  this.videoStreams = streams;
14447
14643
  }
14644
+
14645
+ async ban(apiRequestDelay = null) {
14646
+ const { meetingUuid } = this.room;
14647
+ if (!meetingUuid) {
14648
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
14649
+ }
14650
+
14651
+ // this notifies all that someone is being banned
14652
+ this.onBan(true);
14653
+
14654
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
14655
+ if (apiRequestDelay) {
14656
+ await this.delay(apiRequestDelay);
14657
+ }
14658
+
14659
+ // proceed with the actual kick
14660
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
14661
+ }
14662
+
14663
+ async delay(ms ) {
14664
+ return new Promise(resolve => setTimeout(resolve, ms));
14665
+ }
14448
14666
  }
14449
14667
 
14450
14668
  export default Participant;