@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
 
@@ -13450,7 +13629,7 @@ class Room extends Emitter {
13450
13629
  logger$1.info('connecting to room', { extension, audioOnly, room: !!room });
13451
13630
 
13452
13631
  if (!room) {
13453
- await Wazo.Phone.connect();
13632
+ await Wazo.Phone.connect({ media: constraints });
13454
13633
 
13455
13634
  const withCamera = constraints && !!constraints.video;
13456
13635
 
@@ -13895,7 +14074,7 @@ class Room extends Emitter {
13895
14074
  const participant = this._getParticipantFromCallId(status.callId);
13896
14075
 
13897
14076
  if (participant) {
13898
- // we're received, so no need to broadcast, hence the input false arg
14077
+ // we're receiving, so no need to broadcast
13899
14078
  participant.updateStatus(status, false);
13900
14079
  }
13901
14080
  break;
@@ -14169,6 +14348,7 @@ class Participant extends Emitter {
14169
14348
 
14170
14349
 
14171
14350
 
14351
+
14172
14352
 
14173
14353
 
14174
14354
 
@@ -14186,6 +14366,7 @@ class Participant extends Emitter {
14186
14366
 
14187
14367
 
14188
14368
 
14369
+
14189
14370
 
14190
14371
  /**
14191
14372
  * @param room Room The room where the participant is
@@ -14209,6 +14390,7 @@ class Participant extends Emitter {
14209
14390
  this.screensharing = false;
14210
14391
  this.isOnHold = false;
14211
14392
  this.extra = extra;
14393
+ this.banned = false;
14212
14394
 
14213
14395
  this.ON_UPDATED = 'participant/ON_UPDATED';
14214
14396
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -14225,6 +14407,7 @@ class Participant extends Emitter {
14225
14407
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
14226
14408
  this.ON_HOLD = 'participant/ON_HOLD';
14227
14409
  this.ON_RESUME = 'participant/ON_RESUME';
14410
+ this.ON_BAN = 'participant/ON_BAN';
14228
14411
  }
14229
14412
 
14230
14413
  triggerEvent(name , ...args ) {
@@ -14265,6 +14448,10 @@ class Participant extends Emitter {
14265
14448
  status.extra = this.extra;
14266
14449
  break;
14267
14450
  }
14451
+ case this.ON_BAN: {
14452
+ status.banned = true;
14453
+ break;
14454
+ }
14268
14455
  }
14269
14456
 
14270
14457
  if (broadcast) {
@@ -14367,6 +14554,11 @@ class Participant extends Emitter {
14367
14554
  this.triggerUpdate(this.ON_RESUME, broadcast);
14368
14555
  }
14369
14556
 
14557
+ onBan(broadcast = true) {
14558
+ this.banned = true;
14559
+ this.triggerUpdate(this.ON_BAN, broadcast);
14560
+ }
14561
+
14370
14562
  getStatus() {
14371
14563
  return {
14372
14564
  callId: this.callId,
@@ -14413,6 +14605,10 @@ class Participant extends Emitter {
14413
14605
  }
14414
14606
  }
14415
14607
 
14608
+ if (status.banned) {
14609
+ this.onBan(false);
14610
+ }
14611
+
14416
14612
  // Poor man's object comparison
14417
14613
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
14418
14614
  this.extra = { ...this.extra, ...status.extra };
@@ -14440,6 +14636,28 @@ class Participant extends Emitter {
14440
14636
  this.streams = streams;
14441
14637
  this.videoStreams = streams;
14442
14638
  }
14639
+
14640
+ async ban(apiRequestDelay = null) {
14641
+ const { meetingUuid } = this.room;
14642
+ if (!meetingUuid) {
14643
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
14644
+ }
14645
+
14646
+ // this notifies all that someone is being banned
14647
+ this.onBan(true);
14648
+
14649
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
14650
+ if (apiRequestDelay) {
14651
+ await this.delay(apiRequestDelay);
14652
+ }
14653
+
14654
+ // proceed with the actual kick
14655
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
14656
+ }
14657
+
14658
+ async delay(ms ) {
14659
+ return new Promise(resolve => setTimeout(resolve, ms));
14660
+ }
14443
14661
  }
14444
14662
 
14445
14663
  //