@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
 
@@ -13444,7 +13631,7 @@ class Room extends Emitter {
13444
13631
  logger$1.info('connecting to room', { extension, audioOnly, room: !!room });
13445
13632
 
13446
13633
  if (!room) {
13447
- await Wazo.Phone.connect();
13634
+ await Wazo.Phone.connect({ media: constraints });
13448
13635
 
13449
13636
  const withCamera = constraints && !!constraints.video;
13450
13637
 
@@ -13889,7 +14076,7 @@ class Room extends Emitter {
13889
14076
  const participant = this._getParticipantFromCallId(status.callId);
13890
14077
 
13891
14078
  if (participant) {
13892
- // we're received, so no need to broadcast, hence the input false arg
14079
+ // we're receiving, so no need to broadcast
13893
14080
  participant.updateStatus(status, false);
13894
14081
  }
13895
14082
  break;
@@ -14163,6 +14350,7 @@ class Participant extends Emitter {
14163
14350
 
14164
14351
 
14165
14352
 
14353
+
14166
14354
 
14167
14355
 
14168
14356
 
@@ -14180,6 +14368,7 @@ class Participant extends Emitter {
14180
14368
 
14181
14369
 
14182
14370
 
14371
+
14183
14372
 
14184
14373
  /**
14185
14374
  * @param room Room The room where the participant is
@@ -14203,6 +14392,7 @@ class Participant extends Emitter {
14203
14392
  this.screensharing = false;
14204
14393
  this.isOnHold = false;
14205
14394
  this.extra = extra;
14395
+ this.banned = false;
14206
14396
 
14207
14397
  this.ON_UPDATED = 'participant/ON_UPDATED';
14208
14398
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -14219,6 +14409,7 @@ class Participant extends Emitter {
14219
14409
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
14220
14410
  this.ON_HOLD = 'participant/ON_HOLD';
14221
14411
  this.ON_RESUME = 'participant/ON_RESUME';
14412
+ this.ON_BAN = 'participant/ON_BAN';
14222
14413
  }
14223
14414
 
14224
14415
  triggerEvent(name , ...args ) {
@@ -14259,6 +14450,10 @@ class Participant extends Emitter {
14259
14450
  status.extra = this.extra;
14260
14451
  break;
14261
14452
  }
14453
+ case this.ON_BAN: {
14454
+ status.banned = true;
14455
+ break;
14456
+ }
14262
14457
  }
14263
14458
 
14264
14459
  if (broadcast) {
@@ -14361,6 +14556,11 @@ class Participant extends Emitter {
14361
14556
  this.triggerUpdate(this.ON_RESUME, broadcast);
14362
14557
  }
14363
14558
 
14559
+ onBan(broadcast = true) {
14560
+ this.banned = true;
14561
+ this.triggerUpdate(this.ON_BAN, broadcast);
14562
+ }
14563
+
14364
14564
  getStatus() {
14365
14565
  return {
14366
14566
  callId: this.callId,
@@ -14407,6 +14607,10 @@ class Participant extends Emitter {
14407
14607
  }
14408
14608
  }
14409
14609
 
14610
+ if (status.banned) {
14611
+ this.onBan(false);
14612
+ }
14613
+
14410
14614
  // Poor man's object comparison
14411
14615
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
14412
14616
  this.extra = { ...this.extra, ...status.extra };
@@ -14434,6 +14638,28 @@ class Participant extends Emitter {
14434
14638
  this.streams = streams;
14435
14639
  this.videoStreams = streams;
14436
14640
  }
14641
+
14642
+ async ban(apiRequestDelay = null) {
14643
+ const { meetingUuid } = this.room;
14644
+ if (!meetingUuid) {
14645
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
14646
+ }
14647
+
14648
+ // this notifies all that someone is being banned
14649
+ this.onBan(true);
14650
+
14651
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
14652
+ if (apiRequestDelay) {
14653
+ await this.delay(apiRequestDelay);
14654
+ }
14655
+
14656
+ // proceed with the actual kick
14657
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
14658
+ }
14659
+
14660
+ async delay(ms ) {
14661
+ return new Promise(resolve => setTimeout(resolve, ms));
14662
+ }
14437
14663
  }
14438
14664
 
14439
14665
  //