@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
@@ -2671,6 +2671,70 @@ class ExternalApp {
2671
2671
 
2672
2672
  //
2673
2673
 
2674
+ class MeetingAuthorization {
2675
+
2676
+
2677
+
2678
+
2679
+
2680
+
2681
+ constructor({
2682
+ meetingUuid,
2683
+ uuid,
2684
+ userUuid,
2685
+ userName,
2686
+ } = {}) {
2687
+ this.meetingUuid = meetingUuid;
2688
+ this.uuid = uuid;
2689
+ this.userUuid = userUuid;
2690
+ this.userName = userName;
2691
+ }
2692
+
2693
+ setStatus(status ) {
2694
+ this.status = status;
2695
+ }
2696
+
2697
+ getStatus() {
2698
+ return this.status;
2699
+ }
2700
+
2701
+ static parse(plain ) {
2702
+ const {
2703
+ meeting_uuid: meetingUuid,
2704
+ uuid,
2705
+ guest_uuid: userUuid,
2706
+ guest_name: userName,
2707
+ } = plain;
2708
+
2709
+ return new MeetingAuthorization({
2710
+ meetingUuid,
2711
+ uuid,
2712
+ userUuid,
2713
+ userName,
2714
+ });
2715
+ }
2716
+
2717
+ static parseMany(items ) {
2718
+ if (!items) {
2719
+ return [];
2720
+ }
2721
+ return items.map(MeetingAuthorization.parse);
2722
+ }
2723
+ }
2724
+
2725
+ //
2726
+
2727
+
2728
+
2729
+
2730
+
2731
+
2732
+
2733
+
2734
+
2735
+
2736
+
2737
+
2674
2738
 
2675
2739
 
2676
2740
 
@@ -2681,6 +2745,7 @@ class ExternalApp {
2681
2745
 
2682
2746
 
2683
2747
 
2748
+
2684
2749
 
2685
2750
 
2686
2751
  class Meeting {
@@ -2695,6 +2760,8 @@ class Meeting {
2695
2760
 
2696
2761
 
2697
2762
 
2763
+
2764
+
2698
2765
 
2699
2766
  static parse(plain ) {
2700
2767
  return new Meeting({
@@ -2707,6 +2774,7 @@ class Meeting {
2707
2774
  extension: plain.exten,
2708
2775
  persistent: plain.persistent,
2709
2776
  creationTime: moment(plain.creation_time).toDate(),
2777
+ requireAuthorization: plain.require_authorization,
2710
2778
  });
2711
2779
  }
2712
2780
 
@@ -2731,6 +2799,7 @@ class Meeting {
2731
2799
  extension,
2732
2800
  persistent,
2733
2801
  creationTime,
2802
+ requireAuthorization,
2734
2803
  } = {}) {
2735
2804
  this.guestSipAuthorization = guestSipAuthorization;
2736
2805
  this.uri = uri;
@@ -2741,6 +2810,7 @@ class Meeting {
2741
2810
  this.extension = extension;
2742
2811
  this.persistent = persistent;
2743
2812
  this.creationTime = creationTime;
2813
+ this.requireAuthorization = requireAuthorization;
2744
2814
 
2745
2815
  // Useful to compare instead of instanceof with minified code
2746
2816
  this.type = 'Meeting';
@@ -2751,8 +2821,32 @@ class Meeting {
2751
2821
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
2752
2822
  return { username, secret };
2753
2823
  }
2824
+
2754
2825
  }
2755
2826
 
2827
+ //
2828
+
2829
+ const camelToUnderscore = (key ) => {
2830
+ if (typeof key !== 'string') {
2831
+ throw new Error('Input is not a string');
2832
+ }
2833
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
2834
+ };
2835
+
2836
+ //
2837
+
2838
+ const convertKeysFromCamelToUnderscore = (args ) => {
2839
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
2840
+ throw new Error('Input is not an object');
2841
+ }
2842
+
2843
+ return Object.keys(args).reduce((acc, key) => {
2844
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
2845
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
2846
+ return acc;
2847
+ }, {});
2848
+ };
2849
+
2756
2850
  /* */
2757
2851
 
2758
2852
  var confdMethods = (client , baseUrl ) => ({
@@ -2821,8 +2915,18 @@ var confdMethods = (client , baseUrl ) => ({
2821
2915
  getMyMeetings: () =>
2822
2916
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2823
2917
 
2824
- createMyMeeting: (name , persistent ) =>
2825
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2918
+ createMyMeeting: (args ) =>
2919
+ client
2920
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
2921
+ .then(Meeting.parse),
2922
+
2923
+ updateMyMeeting: (meetingUuid , data ) =>
2924
+ client.put(
2925
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
2926
+ convertKeysFromCamelToUnderscore(data),
2927
+ null,
2928
+ ApiRequester.successResponseParser,
2929
+ ),
2826
2930
 
2827
2931
  deleteMyMeeting: (meetingUuid ) =>
2828
2932
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2830,8 +2934,36 @@ var confdMethods = (client , baseUrl ) => ({
2830
2934
  getMeeting: (meetingUuid ) =>
2831
2935
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
2832
2936
 
2937
+ meetingAuthorizations: (meetingUuid ) =>
2938
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
2939
+
2940
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
2941
+ client.put(
2942
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
2943
+ {},
2944
+ null,
2945
+ ApiRequester.successResponseParser,
2946
+ ),
2947
+
2948
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
2949
+ client.put(
2950
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
2951
+ {},
2952
+ null,
2953
+ ApiRequester.successResponseParser,
2954
+ ),
2955
+
2833
2956
  guestGetMeeting: (meetingUuid ) =>
2834
2957
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
2958
+
2959
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
2960
+ client
2961
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
2962
+ .then(MeetingAuthorization.parse),
2963
+
2964
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
2965
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
2966
+
2835
2967
  });
2836
2968
 
2837
2969
  //
@@ -3097,6 +3229,7 @@ const RECORD_STATE_ACTIVE = 'active';
3097
3229
 
3098
3230
 
3099
3231
 
3232
+
3100
3233
 
3101
3234
 
3102
3235
 
@@ -3107,6 +3240,7 @@ const RECORD_STATE_ACTIVE = 'active';
3107
3240
 
3108
3241
 
3109
3242
 
3243
+
3110
3244
 
3111
3245
 
3112
3246
 
@@ -3135,6 +3269,7 @@ class Call {
3135
3269
 
3136
3270
 
3137
3271
 
3272
+
3138
3273
 
3139
3274
 
3140
3275
 
@@ -3159,6 +3294,7 @@ class Call {
3159
3294
  calleeNumber: plain.peer_caller_id_number,
3160
3295
  dialedExtension: plain.dialed_extension,
3161
3296
  isCaller: plain.is_caller,
3297
+ isVideo: plain.is_video,
3162
3298
  muted: plain.muted,
3163
3299
  onHold: plain.on_hold,
3164
3300
  status: plain.status,
@@ -3182,6 +3318,7 @@ class Call {
3182
3318
  calleeNumber,
3183
3319
  dialedExtension,
3184
3320
  isCaller,
3321
+ isVideo,
3185
3322
  lineId,
3186
3323
  muted,
3187
3324
  onHold,
@@ -3205,6 +3342,7 @@ class Call {
3205
3342
  this.startingTime = startingTime;
3206
3343
  this.talkingToIds = talkingToIds || [];
3207
3344
  this.recording = recording;
3345
+ this.isVideo = !!isVideo;
3208
3346
 
3209
3347
  // Useful to compare instead of instanceof with minified code
3210
3348
  this.type = 'Call';
@@ -3678,7 +3816,7 @@ class CallSession {
3678
3816
  ringing: call.isRinging(),
3679
3817
  answered: call.isUp(),
3680
3818
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
3681
- cameraEnabled: false,
3819
+ cameraEnabled: call.isVideo,
3682
3820
  dialedExtension: call.dialedExtension,
3683
3821
  call,
3684
3822
  conference: false, // @FIXME?
@@ -5050,6 +5188,14 @@ var calldMethods = (client , baseUrl ) => ({
5050
5188
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
5051
5189
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
5052
5190
 
5191
+ banMeetingParticipant: (meetingUuid , participantUuid ) =>
5192
+ client.delete(
5193
+ `${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
5194
+ null,
5195
+ null,
5196
+ ApiRequester.successResponseParser,
5197
+ ),
5198
+
5053
5199
  listTrunks: () => client.get(`${baseUrl}/trunks`),
5054
5200
 
5055
5201
  mute: (callId ) =>
@@ -6198,6 +6344,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
6198
6344
  return fixed;
6199
6345
  };
6200
6346
 
6347
+ const addIcesInAllBundles = (sdp ) => {
6348
+ const parsedSdp = sdpParser.parse(sdp);
6349
+
6350
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
6351
+ if (!mediaWithCandidate) {
6352
+ return sdp;
6353
+ }
6354
+
6355
+ const { candidates } = mediaWithCandidate;
6356
+
6357
+ parsedSdp.media = parsedSdp.media.map(media => ({
6358
+ ...media,
6359
+ candidates: media.candidates || candidates,
6360
+ }));
6361
+
6362
+ return sdpParser.write(parsedSdp);
6363
+ };
6364
+
6201
6365
  /* global RTCSessionDescriptionInit, navigator */
6202
6366
 
6203
6367
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -6327,7 +6491,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
6327
6491
 
6328
6492
  // Check if we got ICEs
6329
6493
  if (sdp.indexOf('a=candidate') !== -1) {
6330
- return description;
6494
+ return {
6495
+ type: description.type,
6496
+ sdp: addIcesInAllBundles(sdp),
6497
+ };
6331
6498
  }
6332
6499
 
6333
6500
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7787,41 +7954,58 @@ class WebRTCClient extends Emitter {
7787
7954
  });
7788
7955
  }
7789
7956
 
7790
- changeAudioInputDevice(id , session ) {
7957
+ async changeAudioInputDevice(id , session , force ) {
7791
7958
  const currentId = this.getAudioDeviceId();
7792
7959
  logger$8.info('setting audio input device', { id, currentId, session: !!session });
7793
7960
 
7794
- if (id === currentId) {
7961
+ if (!force && id === currentId) {
7795
7962
  return null;
7796
7963
  }
7797
7964
 
7965
+ // in order to handle an audio track change for default devices
7966
+ // we need the actual id of the device (not 'default')
7967
+ let deviceId = id;
7968
+ if (id === 'default' && navigator.mediaDevices) {
7969
+ const devices = await navigator.mediaDevices.enumerateDevices();
7970
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
7971
+ if (defaultDevice) {
7972
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
7973
+ const targetDevice = devices.find(device => device.label === deviceLabel);
7974
+ if (targetDevice) {
7975
+ deviceId = targetDevice.deviceId;
7976
+ if (!force && deviceId === currentId) {
7977
+ return null;
7978
+ }
7979
+ }
7980
+ }
7981
+ }
7982
+
7798
7983
  // let's update the local audio value
7799
7984
  if (this.audio) {
7800
7985
  this.audio = {
7801
7986
  deviceId: {
7802
- exact: id,
7987
+ exact: deviceId,
7803
7988
  },
7804
7989
  };
7805
7990
  }
7806
7991
 
7807
- if (session) {
7992
+ if (session && navigator.mediaDevices) {
7808
7993
  const sdh = session.sessionDescriptionHandler;
7809
7994
  const pc = sdh.peerConnection;
7810
7995
 
7811
- // $FlowFixMe
7812
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7813
- const audioTrack = stream.getAudioTracks()[0];
7814
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7996
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
7997
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
7998
+ const audioTrack = stream.getAudioTracks()[0];
7999
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7815
8000
 
7816
- if (sender) {
7817
- if (sender.track) {
7818
- audioTrack.enabled = sender.track.enabled;
7819
- }
7820
- sender.replaceTrack(audioTrack);
8001
+ if (sender) {
8002
+ if (sender.track) {
8003
+ audioTrack.enabled = sender.track.enabled;
7821
8004
  }
8005
+ sender.replaceTrack(audioTrack);
8006
+ }
7822
8007
 
7823
- return stream;
7824
- });
8008
+ return stream;
7825
8009
  }
7826
8010
  }
7827
8011
 
@@ -7841,14 +8025,14 @@ class WebRTCClient extends Emitter {
7841
8025
  return null;
7842
8026
  }
7843
8027
 
7844
- // let's update the local video value
7845
- if (this.video) {
7846
- this.video = {
7847
- deviceId: {
7848
- exact: id,
7849
- },
7850
- };
7851
- }
8028
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
8029
+ const videoObject = typeof this.video === 'object' ? this.video : {};
8030
+ this.video = {
8031
+ ...videoObject,
8032
+ deviceId: {
8033
+ exact: id,
8034
+ },
8035
+ };
7852
8036
  }
7853
8037
 
7854
8038
  changeSessionVideoInputDevice(id , session ) {
@@ -9587,10 +9771,10 @@ class WebRTCPhone extends Emitter {
9587
9771
  this.audioRingVolume = volume;
9588
9772
  }
9589
9773
 
9590
- changeAudioInputDevice(id ) {
9774
+ changeAudioInputDevice(id , force ) {
9591
9775
  logger$7.info('WebRTC phone - changeAudio input device', { deviceId: id });
9592
9776
 
9593
- return this.client.changeAudioInputDevice(id, this.currentSipSession);
9777
+ return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
9594
9778
  }
9595
9779
 
9596
9780
  changeVideoInputDevice(id ) {
@@ -11243,6 +11427,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
11243
11427
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
11244
11428
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
11245
11429
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
11430
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
11246
11431
 
11247
11432
  const BLACKLIST_EVENTS = [
11248
11433
  CHAT_MESSAGE_SENT,
@@ -11594,6 +11779,7 @@ WebSocketClient.eventLists = [
11594
11779
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11595
11780
  CONFERENCE_ADHOC_DELETED,
11596
11781
  MEETING_USER_PROGRESS,
11782
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11597
11783
  ];
11598
11784
 
11599
11785
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11665,6 +11851,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11665
11851
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11666
11852
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11667
11853
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11854
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11668
11855
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11669
11856
  'default': WebSocketClient
11670
11857
  });
@@ -11762,7 +11949,7 @@ class SipRoom extends Room {
11762
11949
  logger$3.info('connecting to sip room', { extension, audioOnly, room: !!room });
11763
11950
 
11764
11951
  if (!room) {
11765
- await Wazo.Phone.connect();
11952
+ await Wazo.Phone.connect({ media: constraints });
11766
11953
 
11767
11954
  const withCamera = constraints && !!constraints.video;
11768
11955
 
@@ -13449,7 +13636,7 @@ class Room extends Emitter {
13449
13636
  logger$1.info('connecting to room', { extension, audioOnly, room: !!room });
13450
13637
 
13451
13638
  if (!room) {
13452
- await Wazo.Phone.connect();
13639
+ await Wazo.Phone.connect({ media: constraints });
13453
13640
 
13454
13641
  const withCamera = constraints && !!constraints.video;
13455
13642
 
@@ -13894,7 +14081,7 @@ class Room extends Emitter {
13894
14081
  const participant = this._getParticipantFromCallId(status.callId);
13895
14082
 
13896
14083
  if (participant) {
13897
- // we're received, so no need to broadcast, hence the input false arg
14084
+ // we're receiving, so no need to broadcast
13898
14085
  participant.updateStatus(status, false);
13899
14086
  }
13900
14087
  break;
@@ -14168,6 +14355,7 @@ class Participant extends Emitter {
14168
14355
 
14169
14356
 
14170
14357
 
14358
+
14171
14359
 
14172
14360
 
14173
14361
 
@@ -14185,6 +14373,7 @@ class Participant extends Emitter {
14185
14373
 
14186
14374
 
14187
14375
 
14376
+
14188
14377
 
14189
14378
  /**
14190
14379
  * @param room Room The room where the participant is
@@ -14208,6 +14397,7 @@ class Participant extends Emitter {
14208
14397
  this.screensharing = false;
14209
14398
  this.isOnHold = false;
14210
14399
  this.extra = extra;
14400
+ this.banned = false;
14211
14401
 
14212
14402
  this.ON_UPDATED = 'participant/ON_UPDATED';
14213
14403
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -14224,6 +14414,7 @@ class Participant extends Emitter {
14224
14414
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
14225
14415
  this.ON_HOLD = 'participant/ON_HOLD';
14226
14416
  this.ON_RESUME = 'participant/ON_RESUME';
14417
+ this.ON_BAN = 'participant/ON_BAN';
14227
14418
  }
14228
14419
 
14229
14420
  triggerEvent(name , ...args ) {
@@ -14264,6 +14455,10 @@ class Participant extends Emitter {
14264
14455
  status.extra = this.extra;
14265
14456
  break;
14266
14457
  }
14458
+ case this.ON_BAN: {
14459
+ status.banned = true;
14460
+ break;
14461
+ }
14267
14462
  }
14268
14463
 
14269
14464
  if (broadcast) {
@@ -14366,6 +14561,11 @@ class Participant extends Emitter {
14366
14561
  this.triggerUpdate(this.ON_RESUME, broadcast);
14367
14562
  }
14368
14563
 
14564
+ onBan(broadcast = true) {
14565
+ this.banned = true;
14566
+ this.triggerUpdate(this.ON_BAN, broadcast);
14567
+ }
14568
+
14369
14569
  getStatus() {
14370
14570
  return {
14371
14571
  callId: this.callId,
@@ -14412,6 +14612,10 @@ class Participant extends Emitter {
14412
14612
  }
14413
14613
  }
14414
14614
 
14615
+ if (status.banned) {
14616
+ this.onBan(false);
14617
+ }
14618
+
14415
14619
  // Poor man's object comparison
14416
14620
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
14417
14621
  this.extra = { ...this.extra, ...status.extra };
@@ -14439,6 +14643,28 @@ class Participant extends Emitter {
14439
14643
  this.streams = streams;
14440
14644
  this.videoStreams = streams;
14441
14645
  }
14646
+
14647
+ async ban(apiRequestDelay = null) {
14648
+ const { meetingUuid } = this.room;
14649
+ if (!meetingUuid) {
14650
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
14651
+ }
14652
+
14653
+ // this notifies all that someone is being banned
14654
+ this.onBan(true);
14655
+
14656
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
14657
+ if (apiRequestDelay) {
14658
+ await this.delay(apiRequestDelay);
14659
+ }
14660
+
14661
+ // proceed with the actual kick
14662
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
14663
+ }
14664
+
14665
+ async delay(ms ) {
14666
+ return new Promise(resolve => setTimeout(resolve, ms));
14667
+ }
14442
14668
  }
14443
14669
 
14444
14670
  export default Participant;