@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
@@ -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
  //
@@ -3081,6 +3213,7 @@ const RECORD_STATE_ACTIVE = 'active';
3081
3213
 
3082
3214
 
3083
3215
 
3216
+
3084
3217
 
3085
3218
 
3086
3219
 
@@ -3091,6 +3224,7 @@ const RECORD_STATE_ACTIVE = 'active';
3091
3224
 
3092
3225
 
3093
3226
 
3227
+
3094
3228
 
3095
3229
 
3096
3230
 
@@ -3119,6 +3253,7 @@ class Call {
3119
3253
 
3120
3254
 
3121
3255
 
3256
+
3122
3257
 
3123
3258
 
3124
3259
 
@@ -3143,6 +3278,7 @@ class Call {
3143
3278
  calleeNumber: plain.peer_caller_id_number,
3144
3279
  dialedExtension: plain.dialed_extension,
3145
3280
  isCaller: plain.is_caller,
3281
+ isVideo: plain.is_video,
3146
3282
  muted: plain.muted,
3147
3283
  onHold: plain.on_hold,
3148
3284
  status: plain.status,
@@ -3166,6 +3302,7 @@ class Call {
3166
3302
  calleeNumber,
3167
3303
  dialedExtension,
3168
3304
  isCaller,
3305
+ isVideo,
3169
3306
  lineId,
3170
3307
  muted,
3171
3308
  onHold,
@@ -3189,6 +3326,7 @@ class Call {
3189
3326
  this.startingTime = startingTime;
3190
3327
  this.talkingToIds = talkingToIds || [];
3191
3328
  this.recording = recording;
3329
+ this.isVideo = !!isVideo;
3192
3330
 
3193
3331
  // Useful to compare instead of instanceof with minified code
3194
3332
  this.type = 'Call';
@@ -3662,7 +3800,7 @@ class CallSession {
3662
3800
  ringing: call.isRinging(),
3663
3801
  answered: call.isUp(),
3664
3802
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
3665
- cameraEnabled: false,
3803
+ cameraEnabled: call.isVideo,
3666
3804
  dialedExtension: call.dialedExtension,
3667
3805
  call,
3668
3806
  conference: false, // @FIXME?
@@ -5060,6 +5198,14 @@ var calldMethods = (client , baseUrl ) => ({
5060
5198
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
5061
5199
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
5062
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
+
5063
5209
  listTrunks: () => client.get(`${baseUrl}/trunks`),
5064
5210
 
5065
5211
  mute: (callId ) =>
@@ -6208,6 +6354,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
6208
6354
  return fixed;
6209
6355
  };
6210
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
+
6211
6375
  /* global RTCSessionDescriptionInit, navigator */
6212
6376
 
6213
6377
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -6337,7 +6501,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
6337
6501
 
6338
6502
  // Check if we got ICEs
6339
6503
  if (sdp.indexOf('a=candidate') !== -1) {
6340
- return description;
6504
+ return {
6505
+ type: description.type,
6506
+ sdp: addIcesInAllBundles(sdp),
6507
+ };
6341
6508
  }
6342
6509
 
6343
6510
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7797,41 +7964,58 @@ class WebRTCClient extends Emitter {
7797
7964
  });
7798
7965
  }
7799
7966
 
7800
- changeAudioInputDevice(id , session ) {
7967
+ async changeAudioInputDevice(id , session , force ) {
7801
7968
  const currentId = this.getAudioDeviceId();
7802
7969
  logger$8.info('setting audio input device', { id, currentId, session: !!session });
7803
7970
 
7804
- if (id === currentId) {
7971
+ if (!force && id === currentId) {
7805
7972
  return null;
7806
7973
  }
7807
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
+
7808
7993
  // let's update the local audio value
7809
7994
  if (this.audio) {
7810
7995
  this.audio = {
7811
7996
  deviceId: {
7812
- exact: id,
7997
+ exact: deviceId,
7813
7998
  },
7814
7999
  };
7815
8000
  }
7816
8001
 
7817
- if (session) {
8002
+ if (session && navigator.mediaDevices) {
7818
8003
  const sdh = session.sessionDescriptionHandler;
7819
8004
  const pc = sdh.peerConnection;
7820
8005
 
7821
- // $FlowFixMe
7822
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7823
- const audioTrack = stream.getAudioTracks()[0];
7824
- 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);
7825
8010
 
7826
- if (sender) {
7827
- if (sender.track) {
7828
- audioTrack.enabled = sender.track.enabled;
7829
- }
7830
- sender.replaceTrack(audioTrack);
8011
+ if (sender) {
8012
+ if (sender.track) {
8013
+ audioTrack.enabled = sender.track.enabled;
7831
8014
  }
8015
+ sender.replaceTrack(audioTrack);
8016
+ }
7832
8017
 
7833
- return stream;
7834
- });
8018
+ return stream;
7835
8019
  }
7836
8020
  }
7837
8021
 
@@ -7851,14 +8035,14 @@ class WebRTCClient extends Emitter {
7851
8035
  return null;
7852
8036
  }
7853
8037
 
7854
- // let's update the local video value
7855
- if (this.video) {
7856
- this.video = {
7857
- deviceId: {
7858
- exact: id,
7859
- },
7860
- };
7861
- }
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
+ };
7862
8046
  }
7863
8047
 
7864
8048
  changeSessionVideoInputDevice(id , session ) {
@@ -9597,10 +9781,10 @@ class WebRTCPhone extends Emitter {
9597
9781
  this.audioRingVolume = volume;
9598
9782
  }
9599
9783
 
9600
- changeAudioInputDevice(id ) {
9784
+ changeAudioInputDevice(id , force ) {
9601
9785
  logger$7.info('WebRTC phone - changeAudio input device', { deviceId: id });
9602
9786
 
9603
- return this.client.changeAudioInputDevice(id, this.currentSipSession);
9787
+ return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
9604
9788
  }
9605
9789
 
9606
9790
  changeVideoInputDevice(id ) {
@@ -11253,6 +11437,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
11253
11437
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
11254
11438
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
11255
11439
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
11440
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
11256
11441
 
11257
11442
  const BLACKLIST_EVENTS = [
11258
11443
  CHAT_MESSAGE_SENT,
@@ -11604,6 +11789,7 @@ WebSocketClient.eventLists = [
11604
11789
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11605
11790
  CONFERENCE_ADHOC_DELETED,
11606
11791
  MEETING_USER_PROGRESS,
11792
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11607
11793
  ];
11608
11794
 
11609
11795
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11675,6 +11861,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11675
11861
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11676
11862
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11677
11863
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11864
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11678
11865
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11679
11866
  'default': WebSocketClient
11680
11867
  });
@@ -11779,6 +11966,7 @@ class Participant extends Emitter {
11779
11966
 
11780
11967
 
11781
11968
 
11969
+
11782
11970
 
11783
11971
 
11784
11972
 
@@ -11796,6 +11984,7 @@ class Participant extends Emitter {
11796
11984
 
11797
11985
 
11798
11986
 
11987
+
11799
11988
 
11800
11989
  /**
11801
11990
  * @param room Room The room where the participant is
@@ -11819,6 +12008,7 @@ class Participant extends Emitter {
11819
12008
  this.screensharing = false;
11820
12009
  this.isOnHold = false;
11821
12010
  this.extra = extra;
12011
+ this.banned = false;
11822
12012
 
11823
12013
  this.ON_UPDATED = 'participant/ON_UPDATED';
11824
12014
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -11835,6 +12025,7 @@ class Participant extends Emitter {
11835
12025
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
11836
12026
  this.ON_HOLD = 'participant/ON_HOLD';
11837
12027
  this.ON_RESUME = 'participant/ON_RESUME';
12028
+ this.ON_BAN = 'participant/ON_BAN';
11838
12029
  }
11839
12030
 
11840
12031
  triggerEvent(name , ...args ) {
@@ -11875,6 +12066,10 @@ class Participant extends Emitter {
11875
12066
  status.extra = this.extra;
11876
12067
  break;
11877
12068
  }
12069
+ case this.ON_BAN: {
12070
+ status.banned = true;
12071
+ break;
12072
+ }
11878
12073
  }
11879
12074
 
11880
12075
  if (broadcast) {
@@ -11977,6 +12172,11 @@ class Participant extends Emitter {
11977
12172
  this.triggerUpdate(this.ON_RESUME, broadcast);
11978
12173
  }
11979
12174
 
12175
+ onBan(broadcast = true) {
12176
+ this.banned = true;
12177
+ this.triggerUpdate(this.ON_BAN, broadcast);
12178
+ }
12179
+
11980
12180
  getStatus() {
11981
12181
  return {
11982
12182
  callId: this.callId,
@@ -12023,6 +12223,10 @@ class Participant extends Emitter {
12023
12223
  }
12024
12224
  }
12025
12225
 
12226
+ if (status.banned) {
12227
+ this.onBan(false);
12228
+ }
12229
+
12026
12230
  // Poor man's object comparison
12027
12231
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
12028
12232
  this.extra = { ...this.extra, ...status.extra };
@@ -12050,6 +12254,28 @@ class Participant extends Emitter {
12050
12254
  this.streams = streams;
12051
12255
  this.videoStreams = streams;
12052
12256
  }
12257
+
12258
+ async ban(apiRequestDelay = null) {
12259
+ const { meetingUuid } = this.room;
12260
+ if (!meetingUuid) {
12261
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
12262
+ }
12263
+
12264
+ // this notifies all that someone is being banned
12265
+ this.onBan(true);
12266
+
12267
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
12268
+ if (apiRequestDelay) {
12269
+ await this.delay(apiRequestDelay);
12270
+ }
12271
+
12272
+ // proceed with the actual kick
12273
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
12274
+ }
12275
+
12276
+ async delay(ms ) {
12277
+ return new Promise(resolve => setTimeout(resolve, ms));
12278
+ }
12053
12279
  }
12054
12280
 
12055
12281
  //
@@ -12202,7 +12428,7 @@ class Room$1 extends Emitter {
12202
12428
  logger$2.info('connecting to room', { extension, audioOnly, room: !!room });
12203
12429
 
12204
12430
  if (!room) {
12205
- await Wazo.Phone.connect();
12431
+ await Wazo.Phone.connect({ media: constraints });
12206
12432
 
12207
12433
  const withCamera = constraints && !!constraints.video;
12208
12434
 
@@ -12647,7 +12873,7 @@ class Room$1 extends Emitter {
12647
12873
  const participant = this._getParticipantFromCallId(status.callId);
12648
12874
 
12649
12875
  if (participant) {
12650
- // we're received, so no need to broadcast, hence the input false arg
12876
+ // we're receiving, so no need to broadcast
12651
12877
  participant.updateStatus(status, false);
12652
12878
  }
12653
12879
  break;
@@ -14322,7 +14548,7 @@ class SipRoom extends Room$1 {
14322
14548
  logger.info('connecting to sip room', { extension, audioOnly, room: !!room });
14323
14549
 
14324
14550
  if (!room) {
14325
- await Wazo.Phone.connect();
14551
+ await Wazo.Phone.connect({ media: constraints });
14326
14552
 
14327
14553
  const withCamera = constraints && !!constraints.video;
14328
14554