@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
@@ -2645,6 +2645,70 @@ class ExternalApp {
2645
2645
 
2646
2646
  //
2647
2647
 
2648
+ class MeetingAuthorization {
2649
+
2650
+
2651
+
2652
+
2653
+
2654
+
2655
+ constructor({
2656
+ meetingUuid,
2657
+ uuid,
2658
+ userUuid,
2659
+ userName,
2660
+ } = {}) {
2661
+ this.meetingUuid = meetingUuid;
2662
+ this.uuid = uuid;
2663
+ this.userUuid = userUuid;
2664
+ this.userName = userName;
2665
+ }
2666
+
2667
+ setStatus(status ) {
2668
+ this.status = status;
2669
+ }
2670
+
2671
+ getStatus() {
2672
+ return this.status;
2673
+ }
2674
+
2675
+ static parse(plain ) {
2676
+ const {
2677
+ meeting_uuid: meetingUuid,
2678
+ uuid,
2679
+ guest_uuid: userUuid,
2680
+ guest_name: userName,
2681
+ } = plain;
2682
+
2683
+ return new MeetingAuthorization({
2684
+ meetingUuid,
2685
+ uuid,
2686
+ userUuid,
2687
+ userName,
2688
+ });
2689
+ }
2690
+
2691
+ static parseMany(items ) {
2692
+ if (!items) {
2693
+ return [];
2694
+ }
2695
+ return items.map(MeetingAuthorization.parse);
2696
+ }
2697
+ }
2698
+
2699
+ //
2700
+
2701
+
2702
+
2703
+
2704
+
2705
+
2706
+
2707
+
2708
+
2709
+
2710
+
2711
+
2648
2712
 
2649
2713
 
2650
2714
 
@@ -2655,6 +2719,7 @@ class ExternalApp {
2655
2719
 
2656
2720
 
2657
2721
 
2722
+
2658
2723
 
2659
2724
 
2660
2725
  class Meeting {
@@ -2669,6 +2734,8 @@ class Meeting {
2669
2734
 
2670
2735
 
2671
2736
 
2737
+
2738
+
2672
2739
 
2673
2740
  static parse(plain ) {
2674
2741
  return new Meeting({
@@ -2681,6 +2748,7 @@ class Meeting {
2681
2748
  extension: plain.exten,
2682
2749
  persistent: plain.persistent,
2683
2750
  creationTime: moment(plain.creation_time).toDate(),
2751
+ requireAuthorization: plain.require_authorization,
2684
2752
  });
2685
2753
  }
2686
2754
 
@@ -2705,6 +2773,7 @@ class Meeting {
2705
2773
  extension,
2706
2774
  persistent,
2707
2775
  creationTime,
2776
+ requireAuthorization,
2708
2777
  } = {}) {
2709
2778
  this.guestSipAuthorization = guestSipAuthorization;
2710
2779
  this.uri = uri;
@@ -2715,6 +2784,7 @@ class Meeting {
2715
2784
  this.extension = extension;
2716
2785
  this.persistent = persistent;
2717
2786
  this.creationTime = creationTime;
2787
+ this.requireAuthorization = requireAuthorization;
2718
2788
 
2719
2789
  // Useful to compare instead of instanceof with minified code
2720
2790
  this.type = 'Meeting';
@@ -2725,8 +2795,32 @@ class Meeting {
2725
2795
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
2726
2796
  return { username, secret };
2727
2797
  }
2798
+
2728
2799
  }
2729
2800
 
2801
+ //
2802
+
2803
+ const camelToUnderscore = (key ) => {
2804
+ if (typeof key !== 'string') {
2805
+ throw new Error('Input is not a string');
2806
+ }
2807
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
2808
+ };
2809
+
2810
+ //
2811
+
2812
+ const convertKeysFromCamelToUnderscore = (args ) => {
2813
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
2814
+ throw new Error('Input is not an object');
2815
+ }
2816
+
2817
+ return Object.keys(args).reduce((acc, key) => {
2818
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
2819
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
2820
+ return acc;
2821
+ }, {});
2822
+ };
2823
+
2730
2824
  /* */
2731
2825
 
2732
2826
  var confdMethods = (client , baseUrl ) => ({
@@ -2795,8 +2889,18 @@ var confdMethods = (client , baseUrl ) => ({
2795
2889
  getMyMeetings: () =>
2796
2890
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2797
2891
 
2798
- createMyMeeting: (name , persistent ) =>
2799
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2892
+ createMyMeeting: (args ) =>
2893
+ client
2894
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
2895
+ .then(Meeting.parse),
2896
+
2897
+ updateMyMeeting: (meetingUuid , data ) =>
2898
+ client.put(
2899
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
2900
+ convertKeysFromCamelToUnderscore(data),
2901
+ null,
2902
+ ApiRequester.successResponseParser,
2903
+ ),
2800
2904
 
2801
2905
  deleteMyMeeting: (meetingUuid ) =>
2802
2906
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2804,8 +2908,36 @@ var confdMethods = (client , baseUrl ) => ({
2804
2908
  getMeeting: (meetingUuid ) =>
2805
2909
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
2806
2910
 
2911
+ meetingAuthorizations: (meetingUuid ) =>
2912
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
2913
+
2914
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
2915
+ client.put(
2916
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
2917
+ {},
2918
+ null,
2919
+ ApiRequester.successResponseParser,
2920
+ ),
2921
+
2922
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
2923
+ client.put(
2924
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
2925
+ {},
2926
+ null,
2927
+ ApiRequester.successResponseParser,
2928
+ ),
2929
+
2807
2930
  guestGetMeeting: (meetingUuid ) =>
2808
2931
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
2932
+
2933
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
2934
+ client
2935
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
2936
+ .then(MeetingAuthorization.parse),
2937
+
2938
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
2939
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
2940
+
2809
2941
  });
2810
2942
 
2811
2943
  //
@@ -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 ) =>
@@ -5903,6 +6043,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
5903
6043
  return fixed;
5904
6044
  };
5905
6045
 
6046
+ const addIcesInAllBundles = (sdp ) => {
6047
+ const parsedSdp = sdpParser.parse(sdp);
6048
+
6049
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
6050
+ if (!mediaWithCandidate) {
6051
+ return sdp;
6052
+ }
6053
+
6054
+ const { candidates } = mediaWithCandidate;
6055
+
6056
+ parsedSdp.media = parsedSdp.media.map(media => ({
6057
+ ...media,
6058
+ candidates: media.candidates || candidates,
6059
+ }));
6060
+
6061
+ return sdpParser.write(parsedSdp);
6062
+ };
6063
+
5906
6064
  /* global RTCSessionDescriptionInit, navigator */
5907
6065
 
5908
6066
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -6032,7 +6190,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
6032
6190
 
6033
6191
  // Check if we got ICEs
6034
6192
  if (sdp.indexOf('a=candidate') !== -1) {
6035
- return description;
6193
+ return {
6194
+ type: description.type,
6195
+ sdp: addIcesInAllBundles(sdp),
6196
+ };
6036
6197
  }
6037
6198
 
6038
6199
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7492,7 +7653,7 @@ class WebRTCClient extends Emitter {
7492
7653
  });
7493
7654
  }
7494
7655
 
7495
- changeAudioInputDevice(id , session , force ) {
7656
+ async changeAudioInputDevice(id , session , force ) {
7496
7657
  const currentId = this.getAudioDeviceId();
7497
7658
  logger$9.info('setting audio input device', { id, currentId, session: !!session });
7498
7659
 
@@ -7500,33 +7661,50 @@ class WebRTCClient extends Emitter {
7500
7661
  return null;
7501
7662
  }
7502
7663
 
7664
+ // in order to handle an audio track change for default devices
7665
+ // we need the actual id of the device (not 'default')
7666
+ let deviceId = id;
7667
+ if (id === 'default' && navigator.mediaDevices) {
7668
+ const devices = await navigator.mediaDevices.enumerateDevices();
7669
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
7670
+ if (defaultDevice) {
7671
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
7672
+ const targetDevice = devices.find(device => device.label === deviceLabel);
7673
+ if (targetDevice) {
7674
+ deviceId = targetDevice.deviceId;
7675
+ if (!force && deviceId === currentId) {
7676
+ return null;
7677
+ }
7678
+ }
7679
+ }
7680
+ }
7681
+
7503
7682
  // let's update the local audio value
7504
7683
  if (this.audio) {
7505
7684
  this.audio = {
7506
7685
  deviceId: {
7507
- exact: id,
7686
+ exact: deviceId,
7508
7687
  },
7509
7688
  };
7510
7689
  }
7511
7690
 
7512
- if (session) {
7691
+ if (session && navigator.mediaDevices) {
7513
7692
  const sdh = session.sessionDescriptionHandler;
7514
7693
  const pc = sdh.peerConnection;
7515
7694
 
7516
- // $FlowFixMe
7517
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7518
- const audioTrack = stream.getAudioTracks()[0];
7519
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7695
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
7696
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
7697
+ const audioTrack = stream.getAudioTracks()[0];
7698
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7520
7699
 
7521
- if (sender) {
7522
- if (sender.track) {
7523
- audioTrack.enabled = sender.track.enabled;
7524
- }
7525
- sender.replaceTrack(audioTrack);
7700
+ if (sender) {
7701
+ if (sender.track) {
7702
+ audioTrack.enabled = sender.track.enabled;
7526
7703
  }
7704
+ sender.replaceTrack(audioTrack);
7705
+ }
7527
7706
 
7528
- return stream;
7529
- });
7707
+ return stream;
7530
7708
  }
7531
7709
  }
7532
7710
 
@@ -7546,14 +7724,14 @@ class WebRTCClient extends Emitter {
7546
7724
  return null;
7547
7725
  }
7548
7726
 
7549
- // let's update the local video value
7550
- if (this.video) {
7551
- this.video = {
7552
- deviceId: {
7553
- exact: id,
7554
- },
7555
- };
7556
- }
7727
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
7728
+ const videoObject = typeof this.video === 'object' ? this.video : {};
7729
+ this.video = {
7730
+ ...videoObject,
7731
+ deviceId: {
7732
+ exact: id,
7733
+ },
7734
+ };
7557
7735
  }
7558
7736
 
7559
7737
  changeSessionVideoInputDevice(id , session ) {
@@ -9155,9 +9333,7 @@ class WebRTCPhone extends Emitter {
9155
9333
 
9156
9334
  try {
9157
9335
  if (this.currentScreenShare.stream) {
9158
- this.currentScreenShare.stream.getTracks()
9159
- .filter(track => track.kind === 'video')
9160
- .forEach(track => track.stop());
9336
+ this.currentScreenShare.stream.getTracks().forEach(track => track.stop());
9161
9337
  }
9162
9338
 
9163
9339
  if (restoreLocalStream) {
@@ -10948,6 +11124,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
10948
11124
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
10949
11125
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
10950
11126
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
11127
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
10951
11128
 
10952
11129
  const BLACKLIST_EVENTS = [
10953
11130
  CHAT_MESSAGE_SENT,
@@ -11299,6 +11476,7 @@ WebSocketClient.eventLists = [
11299
11476
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11300
11477
  CONFERENCE_ADHOC_DELETED,
11301
11478
  MEETING_USER_PROGRESS,
11479
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11302
11480
  ];
11303
11481
 
11304
11482
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11370,6 +11548,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11370
11548
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11371
11549
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11372
11550
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11551
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11373
11552
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11374
11553
  'default': WebSocketClient
11375
11554
  });
@@ -11474,6 +11653,7 @@ class Participant extends Emitter {
11474
11653
 
11475
11654
 
11476
11655
 
11656
+
11477
11657
 
11478
11658
 
11479
11659
 
@@ -11491,6 +11671,7 @@ class Participant extends Emitter {
11491
11671
 
11492
11672
 
11493
11673
 
11674
+
11494
11675
 
11495
11676
  /**
11496
11677
  * @param room Room The room where the participant is
@@ -11514,6 +11695,7 @@ class Participant extends Emitter {
11514
11695
  this.screensharing = false;
11515
11696
  this.isOnHold = false;
11516
11697
  this.extra = extra;
11698
+ this.banned = false;
11517
11699
 
11518
11700
  this.ON_UPDATED = 'participant/ON_UPDATED';
11519
11701
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -11530,6 +11712,7 @@ class Participant extends Emitter {
11530
11712
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
11531
11713
  this.ON_HOLD = 'participant/ON_HOLD';
11532
11714
  this.ON_RESUME = 'participant/ON_RESUME';
11715
+ this.ON_BAN = 'participant/ON_BAN';
11533
11716
  }
11534
11717
 
11535
11718
  triggerEvent(name , ...args ) {
@@ -11570,6 +11753,10 @@ class Participant extends Emitter {
11570
11753
  status.extra = this.extra;
11571
11754
  break;
11572
11755
  }
11756
+ case this.ON_BAN: {
11757
+ status.banned = true;
11758
+ break;
11759
+ }
11573
11760
  }
11574
11761
 
11575
11762
  if (broadcast) {
@@ -11672,6 +11859,11 @@ class Participant extends Emitter {
11672
11859
  this.triggerUpdate(this.ON_RESUME, broadcast);
11673
11860
  }
11674
11861
 
11862
+ onBan(broadcast = true) {
11863
+ this.banned = true;
11864
+ this.triggerUpdate(this.ON_BAN, broadcast);
11865
+ }
11866
+
11675
11867
  getStatus() {
11676
11868
  return {
11677
11869
  callId: this.callId,
@@ -11718,6 +11910,10 @@ class Participant extends Emitter {
11718
11910
  }
11719
11911
  }
11720
11912
 
11913
+ if (status.banned) {
11914
+ this.onBan(false);
11915
+ }
11916
+
11721
11917
  // Poor man's object comparison
11722
11918
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
11723
11919
  this.extra = { ...this.extra, ...status.extra };
@@ -11745,6 +11941,28 @@ class Participant extends Emitter {
11745
11941
  this.streams = streams;
11746
11942
  this.videoStreams = streams;
11747
11943
  }
11944
+
11945
+ async ban(apiRequestDelay = null) {
11946
+ const { meetingUuid } = this.room;
11947
+ if (!meetingUuid) {
11948
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
11949
+ }
11950
+
11951
+ // this notifies all that someone is being banned
11952
+ this.onBan(true);
11953
+
11954
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
11955
+ if (apiRequestDelay) {
11956
+ await this.delay(apiRequestDelay);
11957
+ }
11958
+
11959
+ // proceed with the actual kick
11960
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
11961
+ }
11962
+
11963
+ async delay(ms ) {
11964
+ return new Promise(resolve => setTimeout(resolve, ms));
11965
+ }
11748
11966
  }
11749
11967
 
11750
11968
  //
@@ -11897,7 +12115,7 @@ class Room$1 extends Emitter {
11897
12115
  logger$3.info('connecting to room', { extension, audioOnly, room: !!room });
11898
12116
 
11899
12117
  if (!room) {
11900
- await Wazo.Phone.connect();
12118
+ await Wazo.Phone.connect({ media: constraints });
11901
12119
 
11902
12120
  const withCamera = constraints && !!constraints.video;
11903
12121
 
@@ -12342,7 +12560,7 @@ class Room$1 extends Emitter {
12342
12560
  const participant = this._getParticipantFromCallId(status.callId);
12343
12561
 
12344
12562
  if (participant) {
12345
- // we're received, so no need to broadcast, hence the input false arg
12563
+ // we're receiving, so no need to broadcast
12346
12564
  participant.updateStatus(status, false);
12347
12565
  }
12348
12566
  break;
@@ -12609,7 +12827,7 @@ class SipRoom extends Room$1 {
12609
12827
  logger$2.info('connecting to sip room', { extension, audioOnly, room: !!room });
12610
12828
 
12611
12829
  if (!room) {
12612
- await Wazo.Phone.connect();
12830
+ await Wazo.Phone.connect({ media: constraints });
12613
12831
 
12614
12832
  const withCamera = constraints && !!constraints.video;
12615
12833