@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
 
@@ -13459,7 +13646,7 @@ class Room extends Emitter {
13459
13646
  logger$1.info('connecting to room', { extension, audioOnly, room: !!room });
13460
13647
 
13461
13648
  if (!room) {
13462
- await Wazo.Phone.connect();
13649
+ await Wazo.Phone.connect({ media: constraints });
13463
13650
 
13464
13651
  const withCamera = constraints && !!constraints.video;
13465
13652
 
@@ -13904,7 +14091,7 @@ class Room extends Emitter {
13904
14091
  const participant = this._getParticipantFromCallId(status.callId);
13905
14092
 
13906
14093
  if (participant) {
13907
- // we're received, so no need to broadcast, hence the input false arg
14094
+ // we're receiving, so no need to broadcast
13908
14095
  participant.updateStatus(status, false);
13909
14096
  }
13910
14097
  break;
@@ -14178,6 +14365,7 @@ class Participant extends Emitter {
14178
14365
 
14179
14366
 
14180
14367
 
14368
+
14181
14369
 
14182
14370
 
14183
14371
 
@@ -14195,6 +14383,7 @@ class Participant extends Emitter {
14195
14383
 
14196
14384
 
14197
14385
 
14386
+
14198
14387
 
14199
14388
  /**
14200
14389
  * @param room Room The room where the participant is
@@ -14218,6 +14407,7 @@ class Participant extends Emitter {
14218
14407
  this.screensharing = false;
14219
14408
  this.isOnHold = false;
14220
14409
  this.extra = extra;
14410
+ this.banned = false;
14221
14411
 
14222
14412
  this.ON_UPDATED = 'participant/ON_UPDATED';
14223
14413
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -14234,6 +14424,7 @@ class Participant extends Emitter {
14234
14424
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
14235
14425
  this.ON_HOLD = 'participant/ON_HOLD';
14236
14426
  this.ON_RESUME = 'participant/ON_RESUME';
14427
+ this.ON_BAN = 'participant/ON_BAN';
14237
14428
  }
14238
14429
 
14239
14430
  triggerEvent(name , ...args ) {
@@ -14274,6 +14465,10 @@ class Participant extends Emitter {
14274
14465
  status.extra = this.extra;
14275
14466
  break;
14276
14467
  }
14468
+ case this.ON_BAN: {
14469
+ status.banned = true;
14470
+ break;
14471
+ }
14277
14472
  }
14278
14473
 
14279
14474
  if (broadcast) {
@@ -14376,6 +14571,11 @@ class Participant extends Emitter {
14376
14571
  this.triggerUpdate(this.ON_RESUME, broadcast);
14377
14572
  }
14378
14573
 
14574
+ onBan(broadcast = true) {
14575
+ this.banned = true;
14576
+ this.triggerUpdate(this.ON_BAN, broadcast);
14577
+ }
14578
+
14379
14579
  getStatus() {
14380
14580
  return {
14381
14581
  callId: this.callId,
@@ -14422,6 +14622,10 @@ class Participant extends Emitter {
14422
14622
  }
14423
14623
  }
14424
14624
 
14625
+ if (status.banned) {
14626
+ this.onBan(false);
14627
+ }
14628
+
14425
14629
  // Poor man's object comparison
14426
14630
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
14427
14631
  this.extra = { ...this.extra, ...status.extra };
@@ -14449,6 +14653,28 @@ class Participant extends Emitter {
14449
14653
  this.streams = streams;
14450
14654
  this.videoStreams = streams;
14451
14655
  }
14656
+
14657
+ async ban(apiRequestDelay = null) {
14658
+ const { meetingUuid } = this.room;
14659
+ if (!meetingUuid) {
14660
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
14661
+ }
14662
+
14663
+ // this notifies all that someone is being banned
14664
+ this.onBan(true);
14665
+
14666
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
14667
+ if (apiRequestDelay) {
14668
+ await this.delay(apiRequestDelay);
14669
+ }
14670
+
14671
+ // proceed with the actual kick
14672
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
14673
+ }
14674
+
14675
+ async delay(ms ) {
14676
+ return new Promise(resolve => setTimeout(resolve, ms));
14677
+ }
14452
14678
  }
14453
14679
 
14454
14680
  module.exports = Participant;