@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
@@ -2681,6 +2681,70 @@ class ExternalApp {
2681
2681
 
2682
2682
  //
2683
2683
 
2684
+ class MeetingAuthorization {
2685
+
2686
+
2687
+
2688
+
2689
+
2690
+
2691
+ constructor({
2692
+ meetingUuid,
2693
+ uuid,
2694
+ userUuid,
2695
+ userName,
2696
+ } = {}) {
2697
+ this.meetingUuid = meetingUuid;
2698
+ this.uuid = uuid;
2699
+ this.userUuid = userUuid;
2700
+ this.userName = userName;
2701
+ }
2702
+
2703
+ setStatus(status ) {
2704
+ this.status = status;
2705
+ }
2706
+
2707
+ getStatus() {
2708
+ return this.status;
2709
+ }
2710
+
2711
+ static parse(plain ) {
2712
+ const {
2713
+ meeting_uuid: meetingUuid,
2714
+ uuid,
2715
+ guest_uuid: userUuid,
2716
+ guest_name: userName,
2717
+ } = plain;
2718
+
2719
+ return new MeetingAuthorization({
2720
+ meetingUuid,
2721
+ uuid,
2722
+ userUuid,
2723
+ userName,
2724
+ });
2725
+ }
2726
+
2727
+ static parseMany(items ) {
2728
+ if (!items) {
2729
+ return [];
2730
+ }
2731
+ return items.map(MeetingAuthorization.parse);
2732
+ }
2733
+ }
2734
+
2735
+ //
2736
+
2737
+
2738
+
2739
+
2740
+
2741
+
2742
+
2743
+
2744
+
2745
+
2746
+
2747
+
2684
2748
 
2685
2749
 
2686
2750
 
@@ -2691,6 +2755,7 @@ class ExternalApp {
2691
2755
 
2692
2756
 
2693
2757
 
2758
+
2694
2759
 
2695
2760
 
2696
2761
  class Meeting {
@@ -2705,6 +2770,8 @@ class Meeting {
2705
2770
 
2706
2771
 
2707
2772
 
2773
+
2774
+
2708
2775
 
2709
2776
  static parse(plain ) {
2710
2777
  return new Meeting({
@@ -2717,6 +2784,7 @@ class Meeting {
2717
2784
  extension: plain.exten,
2718
2785
  persistent: plain.persistent,
2719
2786
  creationTime: moment__default['default'](plain.creation_time).toDate(),
2787
+ requireAuthorization: plain.require_authorization,
2720
2788
  });
2721
2789
  }
2722
2790
 
@@ -2741,6 +2809,7 @@ class Meeting {
2741
2809
  extension,
2742
2810
  persistent,
2743
2811
  creationTime,
2812
+ requireAuthorization,
2744
2813
  } = {}) {
2745
2814
  this.guestSipAuthorization = guestSipAuthorization;
2746
2815
  this.uri = uri;
@@ -2751,6 +2820,7 @@ class Meeting {
2751
2820
  this.extension = extension;
2752
2821
  this.persistent = persistent;
2753
2822
  this.creationTime = creationTime;
2823
+ this.requireAuthorization = requireAuthorization;
2754
2824
 
2755
2825
  // Useful to compare instead of instanceof with minified code
2756
2826
  this.type = 'Meeting';
@@ -2761,8 +2831,32 @@ class Meeting {
2761
2831
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
2762
2832
  return { username, secret };
2763
2833
  }
2834
+
2764
2835
  }
2765
2836
 
2837
+ //
2838
+
2839
+ const camelToUnderscore = (key ) => {
2840
+ if (typeof key !== 'string') {
2841
+ throw new Error('Input is not a string');
2842
+ }
2843
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
2844
+ };
2845
+
2846
+ //
2847
+
2848
+ const convertKeysFromCamelToUnderscore = (args ) => {
2849
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
2850
+ throw new Error('Input is not an object');
2851
+ }
2852
+
2853
+ return Object.keys(args).reduce((acc, key) => {
2854
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
2855
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
2856
+ return acc;
2857
+ }, {});
2858
+ };
2859
+
2766
2860
  /* */
2767
2861
 
2768
2862
  var confdMethods = (client , baseUrl ) => ({
@@ -2831,8 +2925,18 @@ var confdMethods = (client , baseUrl ) => ({
2831
2925
  getMyMeetings: () =>
2832
2926
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2833
2927
 
2834
- createMyMeeting: (name , persistent ) =>
2835
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2928
+ createMyMeeting: (args ) =>
2929
+ client
2930
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
2931
+ .then(Meeting.parse),
2932
+
2933
+ updateMyMeeting: (meetingUuid , data ) =>
2934
+ client.put(
2935
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
2936
+ convertKeysFromCamelToUnderscore(data),
2937
+ null,
2938
+ ApiRequester.successResponseParser,
2939
+ ),
2836
2940
 
2837
2941
  deleteMyMeeting: (meetingUuid ) =>
2838
2942
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2840,8 +2944,36 @@ var confdMethods = (client , baseUrl ) => ({
2840
2944
  getMeeting: (meetingUuid ) =>
2841
2945
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
2842
2946
 
2947
+ meetingAuthorizations: (meetingUuid ) =>
2948
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
2949
+
2950
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
2951
+ client.put(
2952
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
2953
+ {},
2954
+ null,
2955
+ ApiRequester.successResponseParser,
2956
+ ),
2957
+
2958
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
2959
+ client.put(
2960
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
2961
+ {},
2962
+ null,
2963
+ ApiRequester.successResponseParser,
2964
+ ),
2965
+
2843
2966
  guestGetMeeting: (meetingUuid ) =>
2844
2967
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
2968
+
2969
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
2970
+ client
2971
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
2972
+ .then(MeetingAuthorization.parse),
2973
+
2974
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
2975
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
2976
+
2845
2977
  });
2846
2978
 
2847
2979
  //
@@ -3107,6 +3239,7 @@ const RECORD_STATE_ACTIVE = 'active';
3107
3239
 
3108
3240
 
3109
3241
 
3242
+
3110
3243
 
3111
3244
 
3112
3245
 
@@ -3117,6 +3250,7 @@ const RECORD_STATE_ACTIVE = 'active';
3117
3250
 
3118
3251
 
3119
3252
 
3253
+
3120
3254
 
3121
3255
 
3122
3256
 
@@ -3145,6 +3279,7 @@ class Call {
3145
3279
 
3146
3280
 
3147
3281
 
3282
+
3148
3283
 
3149
3284
 
3150
3285
 
@@ -3169,6 +3304,7 @@ class Call {
3169
3304
  calleeNumber: plain.peer_caller_id_number,
3170
3305
  dialedExtension: plain.dialed_extension,
3171
3306
  isCaller: plain.is_caller,
3307
+ isVideo: plain.is_video,
3172
3308
  muted: plain.muted,
3173
3309
  onHold: plain.on_hold,
3174
3310
  status: plain.status,
@@ -3192,6 +3328,7 @@ class Call {
3192
3328
  calleeNumber,
3193
3329
  dialedExtension,
3194
3330
  isCaller,
3331
+ isVideo,
3195
3332
  lineId,
3196
3333
  muted,
3197
3334
  onHold,
@@ -3215,6 +3352,7 @@ class Call {
3215
3352
  this.startingTime = startingTime;
3216
3353
  this.talkingToIds = talkingToIds || [];
3217
3354
  this.recording = recording;
3355
+ this.isVideo = !!isVideo;
3218
3356
 
3219
3357
  // Useful to compare instead of instanceof with minified code
3220
3358
  this.type = 'Call';
@@ -3688,7 +3826,7 @@ class CallSession {
3688
3826
  ringing: call.isRinging(),
3689
3827
  answered: call.isUp(),
3690
3828
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
3691
- cameraEnabled: false,
3829
+ cameraEnabled: call.isVideo,
3692
3830
  dialedExtension: call.dialedExtension,
3693
3831
  call,
3694
3832
  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
  });
@@ -11772,7 +11959,7 @@ class SipRoom extends Room {
11772
11959
  logger$3.info('connecting to sip room', { extension, audioOnly, room: !!room });
11773
11960
 
11774
11961
  if (!room) {
11775
- await Wazo.Phone.connect();
11962
+ await Wazo.Phone.connect({ media: constraints });
11776
11963
 
11777
11964
  const withCamera = constraints && !!constraints.video;
11778
11965
 
@@ -13454,7 +13641,7 @@ class Room extends Emitter {
13454
13641
  logger$1.info('connecting to room', { extension, audioOnly, room: !!room });
13455
13642
 
13456
13643
  if (!room) {
13457
- await Wazo.Phone.connect();
13644
+ await Wazo.Phone.connect({ media: constraints });
13458
13645
 
13459
13646
  const withCamera = constraints && !!constraints.video;
13460
13647
 
@@ -13899,7 +14086,7 @@ class Room extends Emitter {
13899
14086
  const participant = this._getParticipantFromCallId(status.callId);
13900
14087
 
13901
14088
  if (participant) {
13902
- // we're received, so no need to broadcast, hence the input false arg
14089
+ // we're receiving, so no need to broadcast
13903
14090
  participant.updateStatus(status, false);
13904
14091
  }
13905
14092
  break;
@@ -14173,6 +14360,7 @@ class Participant extends Emitter {
14173
14360
 
14174
14361
 
14175
14362
 
14363
+
14176
14364
 
14177
14365
 
14178
14366
 
@@ -14190,6 +14378,7 @@ class Participant extends Emitter {
14190
14378
 
14191
14379
 
14192
14380
 
14381
+
14193
14382
 
14194
14383
  /**
14195
14384
  * @param room Room The room where the participant is
@@ -14213,6 +14402,7 @@ class Participant extends Emitter {
14213
14402
  this.screensharing = false;
14214
14403
  this.isOnHold = false;
14215
14404
  this.extra = extra;
14405
+ this.banned = false;
14216
14406
 
14217
14407
  this.ON_UPDATED = 'participant/ON_UPDATED';
14218
14408
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -14229,6 +14419,7 @@ class Participant extends Emitter {
14229
14419
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
14230
14420
  this.ON_HOLD = 'participant/ON_HOLD';
14231
14421
  this.ON_RESUME = 'participant/ON_RESUME';
14422
+ this.ON_BAN = 'participant/ON_BAN';
14232
14423
  }
14233
14424
 
14234
14425
  triggerEvent(name , ...args ) {
@@ -14269,6 +14460,10 @@ class Participant extends Emitter {
14269
14460
  status.extra = this.extra;
14270
14461
  break;
14271
14462
  }
14463
+ case this.ON_BAN: {
14464
+ status.banned = true;
14465
+ break;
14466
+ }
14272
14467
  }
14273
14468
 
14274
14469
  if (broadcast) {
@@ -14371,6 +14566,11 @@ class Participant extends Emitter {
14371
14566
  this.triggerUpdate(this.ON_RESUME, broadcast);
14372
14567
  }
14373
14568
 
14569
+ onBan(broadcast = true) {
14570
+ this.banned = true;
14571
+ this.triggerUpdate(this.ON_BAN, broadcast);
14572
+ }
14573
+
14374
14574
  getStatus() {
14375
14575
  return {
14376
14576
  callId: this.callId,
@@ -14417,6 +14617,10 @@ class Participant extends Emitter {
14417
14617
  }
14418
14618
  }
14419
14619
 
14620
+ if (status.banned) {
14621
+ this.onBan(false);
14622
+ }
14623
+
14420
14624
  // Poor man's object comparison
14421
14625
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
14422
14626
  this.extra = { ...this.extra, ...status.extra };
@@ -14444,6 +14648,28 @@ class Participant extends Emitter {
14444
14648
  this.streams = streams;
14445
14649
  this.videoStreams = streams;
14446
14650
  }
14651
+
14652
+ async ban(apiRequestDelay = null) {
14653
+ const { meetingUuid } = this.room;
14654
+ if (!meetingUuid) {
14655
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
14656
+ }
14657
+
14658
+ // this notifies all that someone is being banned
14659
+ this.onBan(true);
14660
+
14661
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
14662
+ if (apiRequestDelay) {
14663
+ await this.delay(apiRequestDelay);
14664
+ }
14665
+
14666
+ // proceed with the actual kick
14667
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
14668
+ }
14669
+
14670
+ async delay(ms ) {
14671
+ return new Promise(resolve => setTimeout(resolve, ms));
14672
+ }
14447
14673
  }
14448
14674
 
14449
14675
  //