@wazo/sdk 0.38.5 → 0.38.8

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 (135) hide show
  1. package/README.md +1 -1
  2. package/dist/wazo-sdk.js +2 -2
  3. package/esm/__tests__/api-client.test.js +148 -2
  4. package/esm/__tests__/web-rtc-client.test.js +303 -26
  5. package/esm/api/calld.js +14 -0
  6. package/esm/api/confd.js +134 -2
  7. package/esm/api/ctid-ng.js +6 -0
  8. package/esm/api-client.js +148 -2
  9. package/esm/checker/Checker.js +212 -26
  10. package/esm/checker/checks/aor.js +148 -2
  11. package/esm/checker/checks/api.js +148 -2
  12. package/esm/checker/checks/index.js +212 -26
  13. package/esm/checker/checks/wazo-websocket.js +2 -0
  14. package/esm/checker/checks/webrtc-transport.js +210 -26
  15. package/esm/checker/checks/webrtc.js +210 -26
  16. package/esm/domain/AdHocAPIConference.js +148 -2
  17. package/esm/domain/Call.js +6 -0
  18. package/esm/domain/CallSession.js +1 -1
  19. package/esm/domain/Features.js +148 -2
  20. package/esm/domain/Meeting.js +18 -0
  21. package/esm/domain/MeetingAuthorization.js +70 -0
  22. package/esm/domain/Phone/CTIPhone.js +149 -3
  23. package/esm/domain/Phone/WebRTCPhone.js +3 -3
  24. package/esm/domain/__tests__/Call.test.js +6 -0
  25. package/esm/domain/__tests__/CallSession.test.js +1 -1
  26. package/esm/domain/__tests__/IndirectTransfer.test.js +1 -1
  27. package/esm/domain/__tests__/Meeting.test.js +87 -1
  28. package/esm/domain/__tests__/MeetingAuthorization.test.js +109 -0
  29. package/esm/domain/__tests__/Room.test.js +1 -1
  30. package/esm/index.js +258 -32
  31. package/esm/lib/WazoSessionDescriptionHandler.js +22 -1
  32. package/esm/service/CallApi.js +148 -2
  33. package/esm/service/getApiClient.js +148 -2
  34. package/esm/simple/Auth.js +258 -32
  35. package/esm/simple/Configuration.js +258 -32
  36. package/esm/simple/Directory.js +148 -2
  37. package/esm/simple/Phone.js +258 -32
  38. package/esm/simple/Websocket.js +3 -0
  39. package/esm/simple/index.js +258 -32
  40. package/esm/simple/room/LocalParticipant.js +258 -32
  41. package/esm/simple/room/Participant.js +258 -32
  42. package/esm/simple/room/RemoteParticipant.js +258 -32
  43. package/esm/simple/room/Room.js +258 -32
  44. package/esm/simple/room/SipRoom.js +258 -32
  45. package/esm/simple/room/Stream.js +258 -32
  46. package/esm/simple/room/__tests__/Participant.test.js +14747 -0
  47. package/esm/simple/room/__tests__/RemoteParticipant.test.js +258 -32
  48. package/esm/simple/utils.js +258 -32
  49. package/esm/utils/__tests__/object.test.js +57 -0
  50. package/esm/utils/__tests__/sdp.test.js +50 -0
  51. package/esm/utils/__tests__/string.test.js +30 -0
  52. package/esm/utils/object.js +24 -0
  53. package/esm/utils/sdp.js +19 -1
  54. package/esm/utils/string.js +10 -0
  55. package/esm/web-rtc-client.js +210 -26
  56. package/esm/websocket-client.js +3 -1
  57. package/lib/__tests__/api-client.test.js +148 -2
  58. package/lib/__tests__/web-rtc-client.test.js +303 -26
  59. package/lib/api/calld.js +14 -0
  60. package/lib/api/confd.js +134 -2
  61. package/lib/api/ctid-ng.js +6 -0
  62. package/lib/api-client.js +148 -2
  63. package/lib/checker/Checker.js +212 -26
  64. package/lib/checker/checks/aor.js +148 -2
  65. package/lib/checker/checks/api.js +148 -2
  66. package/lib/checker/checks/index.js +212 -26
  67. package/lib/checker/checks/wazo-websocket.js +2 -0
  68. package/lib/checker/checks/webrtc-transport.js +210 -26
  69. package/lib/checker/checks/webrtc.js +210 -26
  70. package/lib/domain/AdHocAPIConference.js +148 -2
  71. package/lib/domain/Call.js +6 -0
  72. package/lib/domain/CallSession.js +1 -1
  73. package/lib/domain/Features.js +148 -2
  74. package/lib/domain/Meeting.js +18 -0
  75. package/lib/domain/MeetingAuthorization.js +79 -0
  76. package/lib/domain/Phone/CTIPhone.js +149 -3
  77. package/lib/domain/Phone/WebRTCPhone.js +3 -3
  78. package/lib/domain/__tests__/Call.test.js +6 -0
  79. package/lib/domain/__tests__/CallSession.test.js +1 -1
  80. package/lib/domain/__tests__/IndirectTransfer.test.js +1 -1
  81. package/lib/domain/__tests__/Meeting.test.js +87 -1
  82. package/lib/domain/__tests__/MeetingAuthorization.test.js +111 -0
  83. package/lib/domain/__tests__/Room.test.js +1 -1
  84. package/lib/index.js +258 -32
  85. package/lib/lib/WazoSessionDescriptionHandler.js +22 -1
  86. package/lib/service/CallApi.js +148 -2
  87. package/lib/service/getApiClient.js +148 -2
  88. package/lib/simple/Auth.js +258 -32
  89. package/lib/simple/Configuration.js +258 -32
  90. package/lib/simple/Directory.js +148 -2
  91. package/lib/simple/Phone.js +258 -32
  92. package/lib/simple/Websocket.js +3 -0
  93. package/lib/simple/index.js +258 -32
  94. package/lib/simple/room/LocalParticipant.js +258 -32
  95. package/lib/simple/room/Participant.js +258 -32
  96. package/lib/simple/room/RemoteParticipant.js +258 -32
  97. package/lib/simple/room/Room.js +258 -32
  98. package/lib/simple/room/SipRoom.js +258 -32
  99. package/lib/simple/room/Stream.js +258 -32
  100. package/lib/simple/room/__tests__/Participant.test.js +14757 -0
  101. package/lib/simple/room/__tests__/RemoteParticipant.test.js +258 -32
  102. package/lib/simple/utils.js +258 -32
  103. package/lib/utils/__tests__/object.test.js +59 -0
  104. package/lib/utils/__tests__/sdp.test.js +50 -0
  105. package/lib/utils/__tests__/string.test.js +32 -0
  106. package/lib/utils/object.js +28 -0
  107. package/lib/utils/sdp.js +19 -0
  108. package/lib/utils/string.js +14 -0
  109. package/lib/web-rtc-client.js +210 -26
  110. package/lib/websocket-client.js +3 -0
  111. package/package.json +2 -2
  112. package/src/__tests__/web-rtc-client.test.js +93 -0
  113. package/src/api/calld.js +8 -0
  114. package/src/api/confd.js +43 -2
  115. package/src/domain/Call.js +6 -0
  116. package/src/domain/CallSession.js +1 -1
  117. package/src/domain/Meeting.js +20 -0
  118. package/src/domain/MeetingAuthorization.js +67 -0
  119. package/src/domain/Phone/WebRTCPhone.js +2 -2
  120. package/src/domain/__tests__/Meeting.test.js +70 -1
  121. package/src/domain/__tests__/MeetingAuthorization.test.js +58 -0
  122. package/src/lib/WazoSessionDescriptionHandler.js +5 -2
  123. package/src/simple/room/Participant.js +40 -0
  124. package/src/simple/room/Room.js +2 -2
  125. package/src/simple/room/SipRoom.js +1 -1
  126. package/src/simple/room/__tests__/Participant.test.js +81 -0
  127. package/src/types/WebSocketMessage.js +7 -1
  128. package/src/utils/__tests__/object.test.js +35 -0
  129. package/src/utils/__tests__/sdp.test.js +33 -1
  130. package/src/utils/__tests__/string.test.js +23 -0
  131. package/src/utils/object.js +15 -0
  132. package/src/utils/sdp.js +18 -0
  133. package/src/utils/string.js +8 -0
  134. package/src/web-rtc-client.js +40 -23
  135. package/src/websocket-client.js +2 -0
@@ -2657,6 +2657,70 @@ class ExternalApp {
2657
2657
 
2658
2658
  //
2659
2659
 
2660
+ class MeetingAuthorization {
2661
+
2662
+
2663
+
2664
+
2665
+
2666
+
2667
+ constructor({
2668
+ meetingUuid,
2669
+ uuid,
2670
+ userUuid,
2671
+ userName,
2672
+ } = {}) {
2673
+ this.meetingUuid = meetingUuid;
2674
+ this.uuid = uuid;
2675
+ this.userUuid = userUuid;
2676
+ this.userName = userName;
2677
+ }
2678
+
2679
+ setStatus(status ) {
2680
+ this.status = status;
2681
+ }
2682
+
2683
+ getStatus() {
2684
+ return this.status;
2685
+ }
2686
+
2687
+ static parse(plain ) {
2688
+ const {
2689
+ meeting_uuid: meetingUuid,
2690
+ uuid,
2691
+ guest_uuid: userUuid,
2692
+ guest_name: userName,
2693
+ } = plain;
2694
+
2695
+ return new MeetingAuthorization({
2696
+ meetingUuid,
2697
+ uuid,
2698
+ userUuid,
2699
+ userName,
2700
+ });
2701
+ }
2702
+
2703
+ static parseMany(items ) {
2704
+ if (!items) {
2705
+ return [];
2706
+ }
2707
+ return items.map(MeetingAuthorization.parse);
2708
+ }
2709
+ }
2710
+
2711
+ //
2712
+
2713
+
2714
+
2715
+
2716
+
2717
+
2718
+
2719
+
2720
+
2721
+
2722
+
2723
+
2660
2724
 
2661
2725
 
2662
2726
 
@@ -2667,6 +2731,7 @@ class ExternalApp {
2667
2731
 
2668
2732
 
2669
2733
 
2734
+
2670
2735
 
2671
2736
 
2672
2737
  class Meeting {
@@ -2681,6 +2746,8 @@ class Meeting {
2681
2746
 
2682
2747
 
2683
2748
 
2749
+
2750
+
2684
2751
 
2685
2752
  static parse(plain ) {
2686
2753
  return new Meeting({
@@ -2693,6 +2760,7 @@ class Meeting {
2693
2760
  extension: plain.exten,
2694
2761
  persistent: plain.persistent,
2695
2762
  creationTime: moment__default['default'](plain.creation_time).toDate(),
2763
+ requireAuthorization: plain.require_authorization,
2696
2764
  });
2697
2765
  }
2698
2766
 
@@ -2717,6 +2785,7 @@ class Meeting {
2717
2785
  extension,
2718
2786
  persistent,
2719
2787
  creationTime,
2788
+ requireAuthorization,
2720
2789
  } = {}) {
2721
2790
  this.guestSipAuthorization = guestSipAuthorization;
2722
2791
  this.uri = uri;
@@ -2727,6 +2796,7 @@ class Meeting {
2727
2796
  this.extension = extension;
2728
2797
  this.persistent = persistent;
2729
2798
  this.creationTime = creationTime;
2799
+ this.requireAuthorization = requireAuthorization;
2730
2800
 
2731
2801
  // Useful to compare instead of instanceof with minified code
2732
2802
  this.type = 'Meeting';
@@ -2737,8 +2807,32 @@ class Meeting {
2737
2807
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
2738
2808
  return { username, secret };
2739
2809
  }
2810
+
2740
2811
  }
2741
2812
 
2813
+ //
2814
+
2815
+ const camelToUnderscore = (key ) => {
2816
+ if (typeof key !== 'string') {
2817
+ throw new Error('Input is not a string');
2818
+ }
2819
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
2820
+ };
2821
+
2822
+ //
2823
+
2824
+ const convertKeysFromCamelToUnderscore = (args ) => {
2825
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
2826
+ throw new Error('Input is not an object');
2827
+ }
2828
+
2829
+ return Object.keys(args).reduce((acc, key) => {
2830
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
2831
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
2832
+ return acc;
2833
+ }, {});
2834
+ };
2835
+
2742
2836
  /* */
2743
2837
 
2744
2838
  var confdMethods = (client , baseUrl ) => ({
@@ -2807,8 +2901,18 @@ var confdMethods = (client , baseUrl ) => ({
2807
2901
  getMyMeetings: () =>
2808
2902
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2809
2903
 
2810
- createMyMeeting: (name , persistent ) =>
2811
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2904
+ createMyMeeting: (args ) =>
2905
+ client
2906
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
2907
+ .then(Meeting.parse),
2908
+
2909
+ updateMyMeeting: (meetingUuid , data ) =>
2910
+ client.put(
2911
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
2912
+ convertKeysFromCamelToUnderscore(data),
2913
+ null,
2914
+ ApiRequester.successResponseParser,
2915
+ ),
2812
2916
 
2813
2917
  deleteMyMeeting: (meetingUuid ) =>
2814
2918
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2816,8 +2920,36 @@ var confdMethods = (client , baseUrl ) => ({
2816
2920
  getMeeting: (meetingUuid ) =>
2817
2921
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
2818
2922
 
2923
+ meetingAuthorizations: (meetingUuid ) =>
2924
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
2925
+
2926
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
2927
+ client.put(
2928
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
2929
+ {},
2930
+ null,
2931
+ ApiRequester.successResponseParser,
2932
+ ),
2933
+
2934
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
2935
+ client.put(
2936
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
2937
+ {},
2938
+ null,
2939
+ ApiRequester.successResponseParser,
2940
+ ),
2941
+
2819
2942
  guestGetMeeting: (meetingUuid ) =>
2820
2943
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
2944
+
2945
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
2946
+ client
2947
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
2948
+ .then(MeetingAuthorization.parse),
2949
+
2950
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
2951
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
2952
+
2821
2953
  });
2822
2954
 
2823
2955
  //
@@ -3083,6 +3215,7 @@ const RECORD_STATE_ACTIVE = 'active';
3083
3215
 
3084
3216
 
3085
3217
 
3218
+
3086
3219
 
3087
3220
 
3088
3221
 
@@ -3093,6 +3226,7 @@ const RECORD_STATE_ACTIVE = 'active';
3093
3226
 
3094
3227
 
3095
3228
 
3229
+
3096
3230
 
3097
3231
 
3098
3232
 
@@ -3121,6 +3255,7 @@ class Call {
3121
3255
 
3122
3256
 
3123
3257
 
3258
+
3124
3259
 
3125
3260
 
3126
3261
 
@@ -3145,6 +3280,7 @@ class Call {
3145
3280
  calleeNumber: plain.peer_caller_id_number,
3146
3281
  dialedExtension: plain.dialed_extension,
3147
3282
  isCaller: plain.is_caller,
3283
+ isVideo: plain.is_video,
3148
3284
  muted: plain.muted,
3149
3285
  onHold: plain.on_hold,
3150
3286
  status: plain.status,
@@ -3168,6 +3304,7 @@ class Call {
3168
3304
  calleeNumber,
3169
3305
  dialedExtension,
3170
3306
  isCaller,
3307
+ isVideo,
3171
3308
  lineId,
3172
3309
  muted,
3173
3310
  onHold,
@@ -3191,6 +3328,7 @@ class Call {
3191
3328
  this.startingTime = startingTime;
3192
3329
  this.talkingToIds = talkingToIds || [];
3193
3330
  this.recording = recording;
3331
+ this.isVideo = !!isVideo;
3194
3332
 
3195
3333
  // Useful to compare instead of instanceof with minified code
3196
3334
  this.type = 'Call';
@@ -3664,7 +3802,7 @@ class CallSession {
3664
3802
  ringing: call.isRinging(),
3665
3803
  answered: call.isUp(),
3666
3804
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
3667
- cameraEnabled: false,
3805
+ cameraEnabled: call.isVideo,
3668
3806
  dialedExtension: call.dialedExtension,
3669
3807
  call,
3670
3808
  conference: false, // @FIXME?
@@ -5062,6 +5200,14 @@ var calldMethods = (client , baseUrl ) => ({
5062
5200
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
5063
5201
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
5064
5202
 
5203
+ banMeetingParticipant: (meetingUuid , participantUuid ) =>
5204
+ client.delete(
5205
+ `${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
5206
+ null,
5207
+ null,
5208
+ ApiRequester.successResponseParser,
5209
+ ),
5210
+
5065
5211
  listTrunks: () => client.get(`${baseUrl}/trunks`),
5066
5212
 
5067
5213
  mute: (callId ) =>
@@ -5909,6 +6055,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
5909
6055
  return fixed;
5910
6056
  };
5911
6057
 
6058
+ const addIcesInAllBundles = (sdp ) => {
6059
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
6060
+
6061
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
6062
+ if (!mediaWithCandidate) {
6063
+ return sdp;
6064
+ }
6065
+
6066
+ const { candidates } = mediaWithCandidate;
6067
+
6068
+ parsedSdp.media = parsedSdp.media.map(media => ({
6069
+ ...media,
6070
+ candidates: media.candidates || candidates,
6071
+ }));
6072
+
6073
+ return sdpParser__default['default'].write(parsedSdp);
6074
+ };
6075
+
5912
6076
  /* global RTCSessionDescriptionInit, navigator */
5913
6077
 
5914
6078
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -6038,7 +6202,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
6038
6202
 
6039
6203
  // Check if we got ICEs
6040
6204
  if (sdp.indexOf('a=candidate') !== -1) {
6041
- return description;
6205
+ return {
6206
+ type: description.type,
6207
+ sdp: addIcesInAllBundles(sdp),
6208
+ };
6042
6209
  }
6043
6210
 
6044
6211
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7498,41 +7665,58 @@ class WebRTCClient extends Emitter {
7498
7665
  });
7499
7666
  }
7500
7667
 
7501
- changeAudioInputDevice(id , session ) {
7668
+ async changeAudioInputDevice(id , session , force ) {
7502
7669
  const currentId = this.getAudioDeviceId();
7503
7670
  logger$9.info('setting audio input device', { id, currentId, session: !!session });
7504
7671
 
7505
- if (id === currentId) {
7672
+ if (!force && id === currentId) {
7506
7673
  return null;
7507
7674
  }
7508
7675
 
7676
+ // in order to handle an audio track change for default devices
7677
+ // we need the actual id of the device (not 'default')
7678
+ let deviceId = id;
7679
+ if (id === 'default' && navigator.mediaDevices) {
7680
+ const devices = await navigator.mediaDevices.enumerateDevices();
7681
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
7682
+ if (defaultDevice) {
7683
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
7684
+ const targetDevice = devices.find(device => device.label === deviceLabel);
7685
+ if (targetDevice) {
7686
+ deviceId = targetDevice.deviceId;
7687
+ if (!force && deviceId === currentId) {
7688
+ return null;
7689
+ }
7690
+ }
7691
+ }
7692
+ }
7693
+
7509
7694
  // let's update the local audio value
7510
7695
  if (this.audio) {
7511
7696
  this.audio = {
7512
7697
  deviceId: {
7513
- exact: id,
7698
+ exact: deviceId,
7514
7699
  },
7515
7700
  };
7516
7701
  }
7517
7702
 
7518
- if (session) {
7703
+ if (session && navigator.mediaDevices) {
7519
7704
  const sdh = session.sessionDescriptionHandler;
7520
7705
  const pc = sdh.peerConnection;
7521
7706
 
7522
- // $FlowFixMe
7523
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7524
- const audioTrack = stream.getAudioTracks()[0];
7525
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7707
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
7708
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
7709
+ const audioTrack = stream.getAudioTracks()[0];
7710
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7526
7711
 
7527
- if (sender) {
7528
- if (sender.track) {
7529
- audioTrack.enabled = sender.track.enabled;
7530
- }
7531
- sender.replaceTrack(audioTrack);
7712
+ if (sender) {
7713
+ if (sender.track) {
7714
+ audioTrack.enabled = sender.track.enabled;
7532
7715
  }
7716
+ sender.replaceTrack(audioTrack);
7717
+ }
7533
7718
 
7534
- return stream;
7535
- });
7719
+ return stream;
7536
7720
  }
7537
7721
  }
7538
7722
 
@@ -7552,14 +7736,14 @@ class WebRTCClient extends Emitter {
7552
7736
  return null;
7553
7737
  }
7554
7738
 
7555
- // let's update the local video value
7556
- if (this.video) {
7557
- this.video = {
7558
- deviceId: {
7559
- exact: id,
7560
- },
7561
- };
7562
- }
7739
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
7740
+ const videoObject = typeof this.video === 'object' ? this.video : {};
7741
+ this.video = {
7742
+ ...videoObject,
7743
+ deviceId: {
7744
+ exact: id,
7745
+ },
7746
+ };
7563
7747
  }
7564
7748
 
7565
7749
  changeSessionVideoInputDevice(id , session ) {
@@ -9298,10 +9482,10 @@ class WebRTCPhone extends Emitter {
9298
9482
  this.audioRingVolume = volume;
9299
9483
  }
9300
9484
 
9301
- changeAudioInputDevice(id ) {
9485
+ changeAudioInputDevice(id , force ) {
9302
9486
  logger$8.info('WebRTC phone - changeAudio input device', { deviceId: id });
9303
9487
 
9304
- return this.client.changeAudioInputDevice(id, this.currentSipSession);
9488
+ return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
9305
9489
  }
9306
9490
 
9307
9491
  changeVideoInputDevice(id ) {
@@ -10954,6 +11138,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
10954
11138
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
10955
11139
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
10956
11140
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
11141
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
10957
11142
 
10958
11143
  const BLACKLIST_EVENTS = [
10959
11144
  CHAT_MESSAGE_SENT,
@@ -11305,6 +11490,7 @@ WebSocketClient.eventLists = [
11305
11490
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11306
11491
  CONFERENCE_ADHOC_DELETED,
11307
11492
  MEETING_USER_PROGRESS,
11493
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11308
11494
  ];
11309
11495
 
11310
11496
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11376,6 +11562,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11376
11562
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11377
11563
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11378
11564
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11565
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11379
11566
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11380
11567
  'default': WebSocketClient
11381
11568
  });
@@ -11480,6 +11667,7 @@ class Participant extends Emitter {
11480
11667
 
11481
11668
 
11482
11669
 
11670
+
11483
11671
 
11484
11672
 
11485
11673
 
@@ -11497,6 +11685,7 @@ class Participant extends Emitter {
11497
11685
 
11498
11686
 
11499
11687
 
11688
+
11500
11689
 
11501
11690
  /**
11502
11691
  * @param room Room The room where the participant is
@@ -11520,6 +11709,7 @@ class Participant extends Emitter {
11520
11709
  this.screensharing = false;
11521
11710
  this.isOnHold = false;
11522
11711
  this.extra = extra;
11712
+ this.banned = false;
11523
11713
 
11524
11714
  this.ON_UPDATED = 'participant/ON_UPDATED';
11525
11715
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -11536,6 +11726,7 @@ class Participant extends Emitter {
11536
11726
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
11537
11727
  this.ON_HOLD = 'participant/ON_HOLD';
11538
11728
  this.ON_RESUME = 'participant/ON_RESUME';
11729
+ this.ON_BAN = 'participant/ON_BAN';
11539
11730
  }
11540
11731
 
11541
11732
  triggerEvent(name , ...args ) {
@@ -11576,6 +11767,10 @@ class Participant extends Emitter {
11576
11767
  status.extra = this.extra;
11577
11768
  break;
11578
11769
  }
11770
+ case this.ON_BAN: {
11771
+ status.banned = true;
11772
+ break;
11773
+ }
11579
11774
  }
11580
11775
 
11581
11776
  if (broadcast) {
@@ -11678,6 +11873,11 @@ class Participant extends Emitter {
11678
11873
  this.triggerUpdate(this.ON_RESUME, broadcast);
11679
11874
  }
11680
11875
 
11876
+ onBan(broadcast = true) {
11877
+ this.banned = true;
11878
+ this.triggerUpdate(this.ON_BAN, broadcast);
11879
+ }
11880
+
11681
11881
  getStatus() {
11682
11882
  return {
11683
11883
  callId: this.callId,
@@ -11724,6 +11924,10 @@ class Participant extends Emitter {
11724
11924
  }
11725
11925
  }
11726
11926
 
11927
+ if (status.banned) {
11928
+ this.onBan(false);
11929
+ }
11930
+
11727
11931
  // Poor man's object comparison
11728
11932
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
11729
11933
  this.extra = { ...this.extra, ...status.extra };
@@ -11751,6 +11955,28 @@ class Participant extends Emitter {
11751
11955
  this.streams = streams;
11752
11956
  this.videoStreams = streams;
11753
11957
  }
11958
+
11959
+ async ban(apiRequestDelay = null) {
11960
+ const { meetingUuid } = this.room;
11961
+ if (!meetingUuid) {
11962
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
11963
+ }
11964
+
11965
+ // this notifies all that someone is being banned
11966
+ this.onBan(true);
11967
+
11968
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
11969
+ if (apiRequestDelay) {
11970
+ await this.delay(apiRequestDelay);
11971
+ }
11972
+
11973
+ // proceed with the actual kick
11974
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
11975
+ }
11976
+
11977
+ async delay(ms ) {
11978
+ return new Promise(resolve => setTimeout(resolve, ms));
11979
+ }
11754
11980
  }
11755
11981
 
11756
11982
  //
@@ -11903,7 +12129,7 @@ class Room$1 extends Emitter {
11903
12129
  logger$3.info('connecting to room', { extension, audioOnly, room: !!room });
11904
12130
 
11905
12131
  if (!room) {
11906
- await Wazo.Phone.connect();
12132
+ await Wazo.Phone.connect({ media: constraints });
11907
12133
 
11908
12134
  const withCamera = constraints && !!constraints.video;
11909
12135
 
@@ -12348,7 +12574,7 @@ class Room$1 extends Emitter {
12348
12574
  const participant = this._getParticipantFromCallId(status.callId);
12349
12575
 
12350
12576
  if (participant) {
12351
- // we're received, so no need to broadcast, hence the input false arg
12577
+ // we're receiving, so no need to broadcast
12352
12578
  participant.updateStatus(status, false);
12353
12579
  }
12354
12580
  break;
@@ -12615,7 +12841,7 @@ class SipRoom extends Room$1 {
12615
12841
  logger$2.info('connecting to sip room', { extension, audioOnly, room: !!room });
12616
12842
 
12617
12843
  if (!room) {
12618
- await Wazo.Phone.connect();
12844
+ await Wazo.Phone.connect({ media: constraints });
12619
12845
 
12620
12846
  const withCamera = constraints && !!constraints.video;
12621
12847