@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
@@ -2655,6 +2655,70 @@ class ExternalApp {
2655
2655
 
2656
2656
  //
2657
2657
 
2658
+ class MeetingAuthorization {
2659
+
2660
+
2661
+
2662
+
2663
+
2664
+
2665
+ constructor({
2666
+ meetingUuid,
2667
+ uuid,
2668
+ userUuid,
2669
+ userName,
2670
+ } = {}) {
2671
+ this.meetingUuid = meetingUuid;
2672
+ this.uuid = uuid;
2673
+ this.userUuid = userUuid;
2674
+ this.userName = userName;
2675
+ }
2676
+
2677
+ setStatus(status ) {
2678
+ this.status = status;
2679
+ }
2680
+
2681
+ getStatus() {
2682
+ return this.status;
2683
+ }
2684
+
2685
+ static parse(plain ) {
2686
+ const {
2687
+ meeting_uuid: meetingUuid,
2688
+ uuid,
2689
+ guest_uuid: userUuid,
2690
+ guest_name: userName,
2691
+ } = plain;
2692
+
2693
+ return new MeetingAuthorization({
2694
+ meetingUuid,
2695
+ uuid,
2696
+ userUuid,
2697
+ userName,
2698
+ });
2699
+ }
2700
+
2701
+ static parseMany(items ) {
2702
+ if (!items) {
2703
+ return [];
2704
+ }
2705
+ return items.map(MeetingAuthorization.parse);
2706
+ }
2707
+ }
2708
+
2709
+ //
2710
+
2711
+
2712
+
2713
+
2714
+
2715
+
2716
+
2717
+
2718
+
2719
+
2720
+
2721
+
2658
2722
 
2659
2723
 
2660
2724
 
@@ -2665,6 +2729,7 @@ class ExternalApp {
2665
2729
 
2666
2730
 
2667
2731
 
2732
+
2668
2733
 
2669
2734
 
2670
2735
  class Meeting {
@@ -2679,6 +2744,8 @@ class Meeting {
2679
2744
 
2680
2745
 
2681
2746
 
2747
+
2748
+
2682
2749
 
2683
2750
  static parse(plain ) {
2684
2751
  return new Meeting({
@@ -2691,6 +2758,7 @@ class Meeting {
2691
2758
  extension: plain.exten,
2692
2759
  persistent: plain.persistent,
2693
2760
  creationTime: moment__default['default'](plain.creation_time).toDate(),
2761
+ requireAuthorization: plain.require_authorization,
2694
2762
  });
2695
2763
  }
2696
2764
 
@@ -2715,6 +2783,7 @@ class Meeting {
2715
2783
  extension,
2716
2784
  persistent,
2717
2785
  creationTime,
2786
+ requireAuthorization,
2718
2787
  } = {}) {
2719
2788
  this.guestSipAuthorization = guestSipAuthorization;
2720
2789
  this.uri = uri;
@@ -2725,6 +2794,7 @@ class Meeting {
2725
2794
  this.extension = extension;
2726
2795
  this.persistent = persistent;
2727
2796
  this.creationTime = creationTime;
2797
+ this.requireAuthorization = requireAuthorization;
2728
2798
 
2729
2799
  // Useful to compare instead of instanceof with minified code
2730
2800
  this.type = 'Meeting';
@@ -2735,8 +2805,32 @@ class Meeting {
2735
2805
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
2736
2806
  return { username, secret };
2737
2807
  }
2808
+
2738
2809
  }
2739
2810
 
2811
+ //
2812
+
2813
+ const camelToUnderscore = (key ) => {
2814
+ if (typeof key !== 'string') {
2815
+ throw new Error('Input is not a string');
2816
+ }
2817
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
2818
+ };
2819
+
2820
+ //
2821
+
2822
+ const convertKeysFromCamelToUnderscore = (args ) => {
2823
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
2824
+ throw new Error('Input is not an object');
2825
+ }
2826
+
2827
+ return Object.keys(args).reduce((acc, key) => {
2828
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
2829
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
2830
+ return acc;
2831
+ }, {});
2832
+ };
2833
+
2740
2834
  /* */
2741
2835
 
2742
2836
  var confdMethods = (client , baseUrl ) => ({
@@ -2805,8 +2899,18 @@ var confdMethods = (client , baseUrl ) => ({
2805
2899
  getMyMeetings: () =>
2806
2900
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2807
2901
 
2808
- createMyMeeting: (name , persistent ) =>
2809
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2902
+ createMyMeeting: (args ) =>
2903
+ client
2904
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
2905
+ .then(Meeting.parse),
2906
+
2907
+ updateMyMeeting: (meetingUuid , data ) =>
2908
+ client.put(
2909
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
2910
+ convertKeysFromCamelToUnderscore(data),
2911
+ null,
2912
+ ApiRequester.successResponseParser,
2913
+ ),
2810
2914
 
2811
2915
  deleteMyMeeting: (meetingUuid ) =>
2812
2916
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2814,8 +2918,36 @@ var confdMethods = (client , baseUrl ) => ({
2814
2918
  getMeeting: (meetingUuid ) =>
2815
2919
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
2816
2920
 
2921
+ meetingAuthorizations: (meetingUuid ) =>
2922
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
2923
+
2924
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
2925
+ client.put(
2926
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
2927
+ {},
2928
+ null,
2929
+ ApiRequester.successResponseParser,
2930
+ ),
2931
+
2932
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
2933
+ client.put(
2934
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
2935
+ {},
2936
+ null,
2937
+ ApiRequester.successResponseParser,
2938
+ ),
2939
+
2817
2940
  guestGetMeeting: (meetingUuid ) =>
2818
2941
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
2942
+
2943
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
2944
+ client
2945
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
2946
+ .then(MeetingAuthorization.parse),
2947
+
2948
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
2949
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
2950
+
2819
2951
  });
2820
2952
 
2821
2953
  //
@@ -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 ) =>
@@ -5913,6 +6053,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
5913
6053
  return fixed;
5914
6054
  };
5915
6055
 
6056
+ const addIcesInAllBundles = (sdp ) => {
6057
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
6058
+
6059
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
6060
+ if (!mediaWithCandidate) {
6061
+ return sdp;
6062
+ }
6063
+
6064
+ const { candidates } = mediaWithCandidate;
6065
+
6066
+ parsedSdp.media = parsedSdp.media.map(media => ({
6067
+ ...media,
6068
+ candidates: media.candidates || candidates,
6069
+ }));
6070
+
6071
+ return sdpParser__default['default'].write(parsedSdp);
6072
+ };
6073
+
5916
6074
  /* global RTCSessionDescriptionInit, navigator */
5917
6075
 
5918
6076
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -6042,7 +6200,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
6042
6200
 
6043
6201
  // Check if we got ICEs
6044
6202
  if (sdp.indexOf('a=candidate') !== -1) {
6045
- return description;
6203
+ return {
6204
+ type: description.type,
6205
+ sdp: addIcesInAllBundles(sdp),
6206
+ };
6046
6207
  }
6047
6208
 
6048
6209
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7502,7 +7663,7 @@ class WebRTCClient extends Emitter {
7502
7663
  });
7503
7664
  }
7504
7665
 
7505
- changeAudioInputDevice(id , session , force ) {
7666
+ async changeAudioInputDevice(id , session , force ) {
7506
7667
  const currentId = this.getAudioDeviceId();
7507
7668
  logger$9.info('setting audio input device', { id, currentId, session: !!session });
7508
7669
 
@@ -7510,33 +7671,50 @@ class WebRTCClient extends Emitter {
7510
7671
  return null;
7511
7672
  }
7512
7673
 
7674
+ // in order to handle an audio track change for default devices
7675
+ // we need the actual id of the device (not 'default')
7676
+ let deviceId = id;
7677
+ if (id === 'default' && navigator.mediaDevices) {
7678
+ const devices = await navigator.mediaDevices.enumerateDevices();
7679
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
7680
+ if (defaultDevice) {
7681
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
7682
+ const targetDevice = devices.find(device => device.label === deviceLabel);
7683
+ if (targetDevice) {
7684
+ deviceId = targetDevice.deviceId;
7685
+ if (!force && deviceId === currentId) {
7686
+ return null;
7687
+ }
7688
+ }
7689
+ }
7690
+ }
7691
+
7513
7692
  // let's update the local audio value
7514
7693
  if (this.audio) {
7515
7694
  this.audio = {
7516
7695
  deviceId: {
7517
- exact: id,
7696
+ exact: deviceId,
7518
7697
  },
7519
7698
  };
7520
7699
  }
7521
7700
 
7522
- if (session) {
7701
+ if (session && navigator.mediaDevices) {
7523
7702
  const sdh = session.sessionDescriptionHandler;
7524
7703
  const pc = sdh.peerConnection;
7525
7704
 
7526
- // $FlowFixMe
7527
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7528
- const audioTrack = stream.getAudioTracks()[0];
7529
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7705
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
7706
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
7707
+ const audioTrack = stream.getAudioTracks()[0];
7708
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7530
7709
 
7531
- if (sender) {
7532
- if (sender.track) {
7533
- audioTrack.enabled = sender.track.enabled;
7534
- }
7535
- sender.replaceTrack(audioTrack);
7710
+ if (sender) {
7711
+ if (sender.track) {
7712
+ audioTrack.enabled = sender.track.enabled;
7536
7713
  }
7714
+ sender.replaceTrack(audioTrack);
7715
+ }
7537
7716
 
7538
- return stream;
7539
- });
7717
+ return stream;
7540
7718
  }
7541
7719
  }
7542
7720
 
@@ -7556,14 +7734,14 @@ class WebRTCClient extends Emitter {
7556
7734
  return null;
7557
7735
  }
7558
7736
 
7559
- // let's update the local video value
7560
- if (this.video) {
7561
- this.video = {
7562
- deviceId: {
7563
- exact: id,
7564
- },
7565
- };
7566
- }
7737
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
7738
+ const videoObject = typeof this.video === 'object' ? this.video : {};
7739
+ this.video = {
7740
+ ...videoObject,
7741
+ deviceId: {
7742
+ exact: id,
7743
+ },
7744
+ };
7567
7745
  }
7568
7746
 
7569
7747
  changeSessionVideoInputDevice(id , session ) {
@@ -9165,9 +9343,7 @@ class WebRTCPhone extends Emitter {
9165
9343
 
9166
9344
  try {
9167
9345
  if (this.currentScreenShare.stream) {
9168
- this.currentScreenShare.stream.getTracks()
9169
- .filter(track => track.kind === 'video')
9170
- .forEach(track => track.stop());
9346
+ this.currentScreenShare.stream.getTracks().forEach(track => track.stop());
9171
9347
  }
9172
9348
 
9173
9349
  if (restoreLocalStream) {
@@ -10958,6 +11134,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
10958
11134
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
10959
11135
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
10960
11136
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
11137
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
10961
11138
 
10962
11139
  const BLACKLIST_EVENTS = [
10963
11140
  CHAT_MESSAGE_SENT,
@@ -11309,6 +11486,7 @@ WebSocketClient.eventLists = [
11309
11486
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11310
11487
  CONFERENCE_ADHOC_DELETED,
11311
11488
  MEETING_USER_PROGRESS,
11489
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11312
11490
  ];
11313
11491
 
11314
11492
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11380,6 +11558,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11380
11558
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11381
11559
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11382
11560
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11561
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11383
11562
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11384
11563
  'default': WebSocketClient
11385
11564
  });
@@ -11484,6 +11663,7 @@ class Participant extends Emitter {
11484
11663
 
11485
11664
 
11486
11665
 
11666
+
11487
11667
 
11488
11668
 
11489
11669
 
@@ -11501,6 +11681,7 @@ class Participant extends Emitter {
11501
11681
 
11502
11682
 
11503
11683
 
11684
+
11504
11685
 
11505
11686
  /**
11506
11687
  * @param room Room The room where the participant is
@@ -11524,6 +11705,7 @@ class Participant extends Emitter {
11524
11705
  this.screensharing = false;
11525
11706
  this.isOnHold = false;
11526
11707
  this.extra = extra;
11708
+ this.banned = false;
11527
11709
 
11528
11710
  this.ON_UPDATED = 'participant/ON_UPDATED';
11529
11711
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -11540,6 +11722,7 @@ class Participant extends Emitter {
11540
11722
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
11541
11723
  this.ON_HOLD = 'participant/ON_HOLD';
11542
11724
  this.ON_RESUME = 'participant/ON_RESUME';
11725
+ this.ON_BAN = 'participant/ON_BAN';
11543
11726
  }
11544
11727
 
11545
11728
  triggerEvent(name , ...args ) {
@@ -11580,6 +11763,10 @@ class Participant extends Emitter {
11580
11763
  status.extra = this.extra;
11581
11764
  break;
11582
11765
  }
11766
+ case this.ON_BAN: {
11767
+ status.banned = true;
11768
+ break;
11769
+ }
11583
11770
  }
11584
11771
 
11585
11772
  if (broadcast) {
@@ -11682,6 +11869,11 @@ class Participant extends Emitter {
11682
11869
  this.triggerUpdate(this.ON_RESUME, broadcast);
11683
11870
  }
11684
11871
 
11872
+ onBan(broadcast = true) {
11873
+ this.banned = true;
11874
+ this.triggerUpdate(this.ON_BAN, broadcast);
11875
+ }
11876
+
11685
11877
  getStatus() {
11686
11878
  return {
11687
11879
  callId: this.callId,
@@ -11728,6 +11920,10 @@ class Participant extends Emitter {
11728
11920
  }
11729
11921
  }
11730
11922
 
11923
+ if (status.banned) {
11924
+ this.onBan(false);
11925
+ }
11926
+
11731
11927
  // Poor man's object comparison
11732
11928
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
11733
11929
  this.extra = { ...this.extra, ...status.extra };
@@ -11755,6 +11951,28 @@ class Participant extends Emitter {
11755
11951
  this.streams = streams;
11756
11952
  this.videoStreams = streams;
11757
11953
  }
11954
+
11955
+ async ban(apiRequestDelay = null) {
11956
+ const { meetingUuid } = this.room;
11957
+ if (!meetingUuid) {
11958
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
11959
+ }
11960
+
11961
+ // this notifies all that someone is being banned
11962
+ this.onBan(true);
11963
+
11964
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
11965
+ if (apiRequestDelay) {
11966
+ await this.delay(apiRequestDelay);
11967
+ }
11968
+
11969
+ // proceed with the actual kick
11970
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
11971
+ }
11972
+
11973
+ async delay(ms ) {
11974
+ return new Promise(resolve => setTimeout(resolve, ms));
11975
+ }
11758
11976
  }
11759
11977
 
11760
11978
  //
@@ -11907,7 +12125,7 @@ class Room$1 extends Emitter {
11907
12125
  logger$3.info('connecting to room', { extension, audioOnly, room: !!room });
11908
12126
 
11909
12127
  if (!room) {
11910
- await Wazo.Phone.connect();
12128
+ await Wazo.Phone.connect({ media: constraints });
11911
12129
 
11912
12130
  const withCamera = constraints && !!constraints.video;
11913
12131
 
@@ -12352,7 +12570,7 @@ class Room$1 extends Emitter {
12352
12570
  const participant = this._getParticipantFromCallId(status.callId);
12353
12571
 
12354
12572
  if (participant) {
12355
- // we're received, so no need to broadcast, hence the input false arg
12573
+ // we're receiving, so no need to broadcast
12356
12574
  participant.updateStatus(status, false);
12357
12575
  }
12358
12576
  break;
@@ -12619,7 +12837,7 @@ class SipRoom extends Room$1 {
12619
12837
  logger$2.info('connecting to sip room', { extension, audioOnly, room: !!room });
12620
12838
 
12621
12839
  if (!room) {
12622
- await Wazo.Phone.connect();
12840
+ await Wazo.Phone.connect({ media: constraints });
12623
12841
 
12624
12842
  const withCamera = constraints && !!constraints.video;
12625
12843