@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
@@ -2681,6 +2681,70 @@ class ExternalApp {
2681
2681
 
2682
2682
  //
2683
2683
 
2684
+ class MeetingAuthorization {
2685
+
2686
+
2687
+
2688
+
2689
+
2690
+
2691
+ constructor({
2692
+ meetingUuid,
2693
+ uuid,
2694
+ userUuid,
2695
+ userName,
2696
+ } = {}) {
2697
+ this.meetingUuid = meetingUuid;
2698
+ this.uuid = uuid;
2699
+ this.userUuid = userUuid;
2700
+ this.userName = userName;
2701
+ }
2702
+
2703
+ setStatus(status ) {
2704
+ this.status = status;
2705
+ }
2706
+
2707
+ getStatus() {
2708
+ return this.status;
2709
+ }
2710
+
2711
+ static parse(plain ) {
2712
+ const {
2713
+ meeting_uuid: meetingUuid,
2714
+ uuid,
2715
+ guest_uuid: userUuid,
2716
+ guest_name: userName,
2717
+ } = plain;
2718
+
2719
+ return new MeetingAuthorization({
2720
+ meetingUuid,
2721
+ uuid,
2722
+ userUuid,
2723
+ userName,
2724
+ });
2725
+ }
2726
+
2727
+ static parseMany(items ) {
2728
+ if (!items) {
2729
+ return [];
2730
+ }
2731
+ return items.map(MeetingAuthorization.parse);
2732
+ }
2733
+ }
2734
+
2735
+ //
2736
+
2737
+
2738
+
2739
+
2740
+
2741
+
2742
+
2743
+
2744
+
2745
+
2746
+
2747
+
2684
2748
 
2685
2749
 
2686
2750
 
@@ -2691,6 +2755,7 @@ class ExternalApp {
2691
2755
 
2692
2756
 
2693
2757
 
2758
+
2694
2759
 
2695
2760
 
2696
2761
  class Meeting {
@@ -2705,6 +2770,8 @@ class Meeting {
2705
2770
 
2706
2771
 
2707
2772
 
2773
+
2774
+
2708
2775
 
2709
2776
  static parse(plain ) {
2710
2777
  return new Meeting({
@@ -2717,6 +2784,7 @@ class Meeting {
2717
2784
  extension: plain.exten,
2718
2785
  persistent: plain.persistent,
2719
2786
  creationTime: moment__default['default'](plain.creation_time).toDate(),
2787
+ requireAuthorization: plain.require_authorization,
2720
2788
  });
2721
2789
  }
2722
2790
 
@@ -2741,6 +2809,7 @@ class Meeting {
2741
2809
  extension,
2742
2810
  persistent,
2743
2811
  creationTime,
2812
+ requireAuthorization,
2744
2813
  } = {}) {
2745
2814
  this.guestSipAuthorization = guestSipAuthorization;
2746
2815
  this.uri = uri;
@@ -2751,6 +2820,7 @@ class Meeting {
2751
2820
  this.extension = extension;
2752
2821
  this.persistent = persistent;
2753
2822
  this.creationTime = creationTime;
2823
+ this.requireAuthorization = requireAuthorization;
2754
2824
 
2755
2825
  // Useful to compare instead of instanceof with minified code
2756
2826
  this.type = 'Meeting';
@@ -2761,8 +2831,32 @@ class Meeting {
2761
2831
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
2762
2832
  return { username, secret };
2763
2833
  }
2834
+
2764
2835
  }
2765
2836
 
2837
+ //
2838
+
2839
+ const camelToUnderscore = (key ) => {
2840
+ if (typeof key !== 'string') {
2841
+ throw new Error('Input is not a string');
2842
+ }
2843
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
2844
+ };
2845
+
2846
+ //
2847
+
2848
+ const convertKeysFromCamelToUnderscore = (args ) => {
2849
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
2850
+ throw new Error('Input is not an object');
2851
+ }
2852
+
2853
+ return Object.keys(args).reduce((acc, key) => {
2854
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
2855
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
2856
+ return acc;
2857
+ }, {});
2858
+ };
2859
+
2766
2860
  /* */
2767
2861
 
2768
2862
  var confdMethods = (client , baseUrl ) => ({
@@ -2831,8 +2925,18 @@ var confdMethods = (client , baseUrl ) => ({
2831
2925
  getMyMeetings: () =>
2832
2926
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2833
2927
 
2834
- createMyMeeting: (name , persistent ) =>
2835
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2928
+ createMyMeeting: (args ) =>
2929
+ client
2930
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
2931
+ .then(Meeting.parse),
2932
+
2933
+ updateMyMeeting: (meetingUuid , data ) =>
2934
+ client.put(
2935
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
2936
+ convertKeysFromCamelToUnderscore(data),
2937
+ null,
2938
+ ApiRequester.successResponseParser,
2939
+ ),
2836
2940
 
2837
2941
  deleteMyMeeting: (meetingUuid ) =>
2838
2942
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2840,8 +2944,36 @@ var confdMethods = (client , baseUrl ) => ({
2840
2944
  getMeeting: (meetingUuid ) =>
2841
2945
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
2842
2946
 
2947
+ meetingAuthorizations: (meetingUuid ) =>
2948
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
2949
+
2950
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
2951
+ client.put(
2952
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
2953
+ {},
2954
+ null,
2955
+ ApiRequester.successResponseParser,
2956
+ ),
2957
+
2958
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
2959
+ client.put(
2960
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
2961
+ {},
2962
+ null,
2963
+ ApiRequester.successResponseParser,
2964
+ ),
2965
+
2843
2966
  guestGetMeeting: (meetingUuid ) =>
2844
2967
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
2968
+
2969
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
2970
+ client
2971
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
2972
+ .then(MeetingAuthorization.parse),
2973
+
2974
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
2975
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
2976
+
2845
2977
  });
2846
2978
 
2847
2979
  //
@@ -5066,6 +5198,14 @@ var calldMethods = (client , baseUrl ) => ({
5066
5198
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
5067
5199
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
5068
5200
 
5201
+ banMeetingParticipant: (meetingUuid , participantUuid ) =>
5202
+ client.delete(
5203
+ `${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
5204
+ null,
5205
+ null,
5206
+ ApiRequester.successResponseParser,
5207
+ ),
5208
+
5069
5209
  listTrunks: () => client.get(`${baseUrl}/trunks`),
5070
5210
 
5071
5211
  mute: (callId ) =>
@@ -6214,6 +6354,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
6214
6354
  return fixed;
6215
6355
  };
6216
6356
 
6357
+ const addIcesInAllBundles = (sdp ) => {
6358
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
6359
+
6360
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
6361
+ if (!mediaWithCandidate) {
6362
+ return sdp;
6363
+ }
6364
+
6365
+ const { candidates } = mediaWithCandidate;
6366
+
6367
+ parsedSdp.media = parsedSdp.media.map(media => ({
6368
+ ...media,
6369
+ candidates: media.candidates || candidates,
6370
+ }));
6371
+
6372
+ return sdpParser__default['default'].write(parsedSdp);
6373
+ };
6374
+
6217
6375
  /* global RTCSessionDescriptionInit, navigator */
6218
6376
 
6219
6377
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -6343,7 +6501,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
6343
6501
 
6344
6502
  // Check if we got ICEs
6345
6503
  if (sdp.indexOf('a=candidate') !== -1) {
6346
- return description;
6504
+ return {
6505
+ type: description.type,
6506
+ sdp: addIcesInAllBundles(sdp),
6507
+ };
6347
6508
  }
6348
6509
 
6349
6510
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7803,7 +7964,7 @@ class WebRTCClient extends Emitter {
7803
7964
  });
7804
7965
  }
7805
7966
 
7806
- changeAudioInputDevice(id , session , force ) {
7967
+ async changeAudioInputDevice(id , session , force ) {
7807
7968
  const currentId = this.getAudioDeviceId();
7808
7969
  logger$8.info('setting audio input device', { id, currentId, session: !!session });
7809
7970
 
@@ -7811,33 +7972,50 @@ class WebRTCClient extends Emitter {
7811
7972
  return null;
7812
7973
  }
7813
7974
 
7975
+ // in order to handle an audio track change for default devices
7976
+ // we need the actual id of the device (not 'default')
7977
+ let deviceId = id;
7978
+ if (id === 'default' && navigator.mediaDevices) {
7979
+ const devices = await navigator.mediaDevices.enumerateDevices();
7980
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
7981
+ if (defaultDevice) {
7982
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
7983
+ const targetDevice = devices.find(device => device.label === deviceLabel);
7984
+ if (targetDevice) {
7985
+ deviceId = targetDevice.deviceId;
7986
+ if (!force && deviceId === currentId) {
7987
+ return null;
7988
+ }
7989
+ }
7990
+ }
7991
+ }
7992
+
7814
7993
  // let's update the local audio value
7815
7994
  if (this.audio) {
7816
7995
  this.audio = {
7817
7996
  deviceId: {
7818
- exact: id,
7997
+ exact: deviceId,
7819
7998
  },
7820
7999
  };
7821
8000
  }
7822
8001
 
7823
- if (session) {
8002
+ if (session && navigator.mediaDevices) {
7824
8003
  const sdh = session.sessionDescriptionHandler;
7825
8004
  const pc = sdh.peerConnection;
7826
8005
 
7827
- // $FlowFixMe
7828
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7829
- const audioTrack = stream.getAudioTracks()[0];
7830
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
8006
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
8007
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
8008
+ const audioTrack = stream.getAudioTracks()[0];
8009
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7831
8010
 
7832
- if (sender) {
7833
- if (sender.track) {
7834
- audioTrack.enabled = sender.track.enabled;
7835
- }
7836
- sender.replaceTrack(audioTrack);
8011
+ if (sender) {
8012
+ if (sender.track) {
8013
+ audioTrack.enabled = sender.track.enabled;
7837
8014
  }
8015
+ sender.replaceTrack(audioTrack);
8016
+ }
7838
8017
 
7839
- return stream;
7840
- });
8018
+ return stream;
7841
8019
  }
7842
8020
  }
7843
8021
 
@@ -7857,14 +8035,14 @@ class WebRTCClient extends Emitter {
7857
8035
  return null;
7858
8036
  }
7859
8037
 
7860
- // let's update the local video value
7861
- if (this.video) {
7862
- this.video = {
7863
- deviceId: {
7864
- exact: id,
7865
- },
7866
- };
7867
- }
8038
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
8039
+ const videoObject = typeof this.video === 'object' ? this.video : {};
8040
+ this.video = {
8041
+ ...videoObject,
8042
+ deviceId: {
8043
+ exact: id,
8044
+ },
8045
+ };
7868
8046
  }
7869
8047
 
7870
8048
  changeSessionVideoInputDevice(id , session ) {
@@ -9466,9 +9644,7 @@ class WebRTCPhone extends Emitter {
9466
9644
 
9467
9645
  try {
9468
9646
  if (this.currentScreenShare.stream) {
9469
- this.currentScreenShare.stream.getTracks()
9470
- .filter(track => track.kind === 'video')
9471
- .forEach(track => track.stop());
9647
+ this.currentScreenShare.stream.getTracks().forEach(track => track.stop());
9472
9648
  }
9473
9649
 
9474
9650
  if (restoreLocalStream) {
@@ -11259,6 +11435,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
11259
11435
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
11260
11436
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
11261
11437
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
11438
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
11262
11439
 
11263
11440
  const BLACKLIST_EVENTS = [
11264
11441
  CHAT_MESSAGE_SENT,
@@ -11610,6 +11787,7 @@ WebSocketClient.eventLists = [
11610
11787
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11611
11788
  CONFERENCE_ADHOC_DELETED,
11612
11789
  MEETING_USER_PROGRESS,
11790
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11613
11791
  ];
11614
11792
 
11615
11793
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11681,6 +11859,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11681
11859
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11682
11860
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11683
11861
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11862
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11684
11863
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11685
11864
  'default': WebSocketClient
11686
11865
  });
@@ -11778,7 +11957,7 @@ class SipRoom extends Room {
11778
11957
  logger$3.info('connecting to sip room', { extension, audioOnly, room: !!room });
11779
11958
 
11780
11959
  if (!room) {
11781
- await Wazo.Phone.connect();
11960
+ await Wazo.Phone.connect({ media: constraints });
11782
11961
 
11783
11962
  const withCamera = constraints && !!constraints.video;
11784
11963
 
@@ -13465,7 +13644,7 @@ class Room extends Emitter {
13465
13644
  logger$1.info('connecting to room', { extension, audioOnly, room: !!room });
13466
13645
 
13467
13646
  if (!room) {
13468
- await Wazo.Phone.connect();
13647
+ await Wazo.Phone.connect({ media: constraints });
13469
13648
 
13470
13649
  const withCamera = constraints && !!constraints.video;
13471
13650
 
@@ -13910,7 +14089,7 @@ class Room extends Emitter {
13910
14089
  const participant = this._getParticipantFromCallId(status.callId);
13911
14090
 
13912
14091
  if (participant) {
13913
- // we're received, so no need to broadcast, hence the input false arg
14092
+ // we're receiving, so no need to broadcast
13914
14093
  participant.updateStatus(status, false);
13915
14094
  }
13916
14095
  break;
@@ -14184,6 +14363,7 @@ class Participant extends Emitter {
14184
14363
 
14185
14364
 
14186
14365
 
14366
+
14187
14367
 
14188
14368
 
14189
14369
 
@@ -14201,6 +14381,7 @@ class Participant extends Emitter {
14201
14381
 
14202
14382
 
14203
14383
 
14384
+
14204
14385
 
14205
14386
  /**
14206
14387
  * @param room Room The room where the participant is
@@ -14224,6 +14405,7 @@ class Participant extends Emitter {
14224
14405
  this.screensharing = false;
14225
14406
  this.isOnHold = false;
14226
14407
  this.extra = extra;
14408
+ this.banned = false;
14227
14409
 
14228
14410
  this.ON_UPDATED = 'participant/ON_UPDATED';
14229
14411
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -14240,6 +14422,7 @@ class Participant extends Emitter {
14240
14422
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
14241
14423
  this.ON_HOLD = 'participant/ON_HOLD';
14242
14424
  this.ON_RESUME = 'participant/ON_RESUME';
14425
+ this.ON_BAN = 'participant/ON_BAN';
14243
14426
  }
14244
14427
 
14245
14428
  triggerEvent(name , ...args ) {
@@ -14280,6 +14463,10 @@ class Participant extends Emitter {
14280
14463
  status.extra = this.extra;
14281
14464
  break;
14282
14465
  }
14466
+ case this.ON_BAN: {
14467
+ status.banned = true;
14468
+ break;
14469
+ }
14283
14470
  }
14284
14471
 
14285
14472
  if (broadcast) {
@@ -14382,6 +14569,11 @@ class Participant extends Emitter {
14382
14569
  this.triggerUpdate(this.ON_RESUME, broadcast);
14383
14570
  }
14384
14571
 
14572
+ onBan(broadcast = true) {
14573
+ this.banned = true;
14574
+ this.triggerUpdate(this.ON_BAN, broadcast);
14575
+ }
14576
+
14385
14577
  getStatus() {
14386
14578
  return {
14387
14579
  callId: this.callId,
@@ -14428,6 +14620,10 @@ class Participant extends Emitter {
14428
14620
  }
14429
14621
  }
14430
14622
 
14623
+ if (status.banned) {
14624
+ this.onBan(false);
14625
+ }
14626
+
14431
14627
  // Poor man's object comparison
14432
14628
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
14433
14629
  this.extra = { ...this.extra, ...status.extra };
@@ -14455,6 +14651,28 @@ class Participant extends Emitter {
14455
14651
  this.streams = streams;
14456
14652
  this.videoStreams = streams;
14457
14653
  }
14654
+
14655
+ async ban(apiRequestDelay = null) {
14656
+ const { meetingUuid } = this.room;
14657
+ if (!meetingUuid) {
14658
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
14659
+ }
14660
+
14661
+ // this notifies all that someone is being banned
14662
+ this.onBan(true);
14663
+
14664
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
14665
+ if (apiRequestDelay) {
14666
+ await this.delay(apiRequestDelay);
14667
+ }
14668
+
14669
+ // proceed with the actual kick
14670
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
14671
+ }
14672
+
14673
+ async delay(ms ) {
14674
+ return new Promise(resolve => setTimeout(resolve, ms));
14675
+ }
14458
14676
  }
14459
14677
 
14460
14678
  module.exports = Participant;