@wazo/sdk 0.38.5 → 0.38.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +1 -1
  2. package/dist/wazo-sdk.js +2 -2
  3. package/esm/__tests__/api-client.test.js +148 -2
  4. package/esm/__tests__/web-rtc-client.test.js +303 -26
  5. package/esm/api/calld.js +14 -0
  6. package/esm/api/confd.js +134 -2
  7. package/esm/api/ctid-ng.js +6 -0
  8. package/esm/api-client.js +148 -2
  9. package/esm/checker/Checker.js +212 -26
  10. package/esm/checker/checks/aor.js +148 -2
  11. package/esm/checker/checks/api.js +148 -2
  12. package/esm/checker/checks/index.js +212 -26
  13. package/esm/checker/checks/wazo-websocket.js +2 -0
  14. package/esm/checker/checks/webrtc-transport.js +210 -26
  15. package/esm/checker/checks/webrtc.js +210 -26
  16. package/esm/domain/AdHocAPIConference.js +148 -2
  17. package/esm/domain/Call.js +6 -0
  18. package/esm/domain/CallSession.js +1 -1
  19. package/esm/domain/Features.js +148 -2
  20. package/esm/domain/Meeting.js +18 -0
  21. package/esm/domain/MeetingAuthorization.js +70 -0
  22. package/esm/domain/Phone/CTIPhone.js +149 -3
  23. package/esm/domain/Phone/WebRTCPhone.js +3 -3
  24. package/esm/domain/__tests__/Call.test.js +6 -0
  25. package/esm/domain/__tests__/CallSession.test.js +1 -1
  26. package/esm/domain/__tests__/IndirectTransfer.test.js +1 -1
  27. package/esm/domain/__tests__/Meeting.test.js +87 -1
  28. package/esm/domain/__tests__/MeetingAuthorization.test.js +109 -0
  29. package/esm/domain/__tests__/Room.test.js +1 -1
  30. package/esm/index.js +258 -32
  31. package/esm/lib/WazoSessionDescriptionHandler.js +22 -1
  32. package/esm/service/CallApi.js +148 -2
  33. package/esm/service/getApiClient.js +148 -2
  34. package/esm/simple/Auth.js +258 -32
  35. package/esm/simple/Configuration.js +258 -32
  36. package/esm/simple/Directory.js +148 -2
  37. package/esm/simple/Phone.js +258 -32
  38. package/esm/simple/Websocket.js +3 -0
  39. package/esm/simple/index.js +258 -32
  40. package/esm/simple/room/LocalParticipant.js +258 -32
  41. package/esm/simple/room/Participant.js +258 -32
  42. package/esm/simple/room/RemoteParticipant.js +258 -32
  43. package/esm/simple/room/Room.js +258 -32
  44. package/esm/simple/room/SipRoom.js +258 -32
  45. package/esm/simple/room/Stream.js +258 -32
  46. package/esm/simple/room/__tests__/Participant.test.js +14747 -0
  47. package/esm/simple/room/__tests__/RemoteParticipant.test.js +258 -32
  48. package/esm/simple/utils.js +258 -32
  49. package/esm/utils/__tests__/object.test.js +57 -0
  50. package/esm/utils/__tests__/sdp.test.js +50 -0
  51. package/esm/utils/__tests__/string.test.js +30 -0
  52. package/esm/utils/object.js +24 -0
  53. package/esm/utils/sdp.js +19 -1
  54. package/esm/utils/string.js +10 -0
  55. package/esm/web-rtc-client.js +210 -26
  56. package/esm/websocket-client.js +3 -1
  57. package/lib/__tests__/api-client.test.js +148 -2
  58. package/lib/__tests__/web-rtc-client.test.js +303 -26
  59. package/lib/api/calld.js +14 -0
  60. package/lib/api/confd.js +134 -2
  61. package/lib/api/ctid-ng.js +6 -0
  62. package/lib/api-client.js +148 -2
  63. package/lib/checker/Checker.js +212 -26
  64. package/lib/checker/checks/aor.js +148 -2
  65. package/lib/checker/checks/api.js +148 -2
  66. package/lib/checker/checks/index.js +212 -26
  67. package/lib/checker/checks/wazo-websocket.js +2 -0
  68. package/lib/checker/checks/webrtc-transport.js +210 -26
  69. package/lib/checker/checks/webrtc.js +210 -26
  70. package/lib/domain/AdHocAPIConference.js +148 -2
  71. package/lib/domain/Call.js +6 -0
  72. package/lib/domain/CallSession.js +1 -1
  73. package/lib/domain/Features.js +148 -2
  74. package/lib/domain/Meeting.js +18 -0
  75. package/lib/domain/MeetingAuthorization.js +79 -0
  76. package/lib/domain/Phone/CTIPhone.js +149 -3
  77. package/lib/domain/Phone/WebRTCPhone.js +3 -3
  78. package/lib/domain/__tests__/Call.test.js +6 -0
  79. package/lib/domain/__tests__/CallSession.test.js +1 -1
  80. package/lib/domain/__tests__/IndirectTransfer.test.js +1 -1
  81. package/lib/domain/__tests__/Meeting.test.js +87 -1
  82. package/lib/domain/__tests__/MeetingAuthorization.test.js +111 -0
  83. package/lib/domain/__tests__/Room.test.js +1 -1
  84. package/lib/index.js +258 -32
  85. package/lib/lib/WazoSessionDescriptionHandler.js +22 -1
  86. package/lib/service/CallApi.js +148 -2
  87. package/lib/service/getApiClient.js +148 -2
  88. package/lib/simple/Auth.js +258 -32
  89. package/lib/simple/Configuration.js +258 -32
  90. package/lib/simple/Directory.js +148 -2
  91. package/lib/simple/Phone.js +258 -32
  92. package/lib/simple/Websocket.js +3 -0
  93. package/lib/simple/index.js +258 -32
  94. package/lib/simple/room/LocalParticipant.js +258 -32
  95. package/lib/simple/room/Participant.js +258 -32
  96. package/lib/simple/room/RemoteParticipant.js +258 -32
  97. package/lib/simple/room/Room.js +258 -32
  98. package/lib/simple/room/SipRoom.js +258 -32
  99. package/lib/simple/room/Stream.js +258 -32
  100. package/lib/simple/room/__tests__/Participant.test.js +14757 -0
  101. package/lib/simple/room/__tests__/RemoteParticipant.test.js +258 -32
  102. package/lib/simple/utils.js +258 -32
  103. package/lib/utils/__tests__/object.test.js +59 -0
  104. package/lib/utils/__tests__/sdp.test.js +50 -0
  105. package/lib/utils/__tests__/string.test.js +32 -0
  106. package/lib/utils/object.js +28 -0
  107. package/lib/utils/sdp.js +19 -0
  108. package/lib/utils/string.js +14 -0
  109. package/lib/web-rtc-client.js +210 -26
  110. package/lib/websocket-client.js +3 -0
  111. package/package.json +2 -2
  112. package/src/__tests__/web-rtc-client.test.js +93 -0
  113. package/src/api/calld.js +8 -0
  114. package/src/api/confd.js +43 -2
  115. package/src/domain/Call.js +6 -0
  116. package/src/domain/CallSession.js +1 -1
  117. package/src/domain/Meeting.js +20 -0
  118. package/src/domain/MeetingAuthorization.js +67 -0
  119. package/src/domain/Phone/WebRTCPhone.js +2 -2
  120. package/src/domain/__tests__/Meeting.test.js +70 -1
  121. package/src/domain/__tests__/MeetingAuthorization.test.js +58 -0
  122. package/src/lib/WazoSessionDescriptionHandler.js +5 -2
  123. package/src/simple/room/Participant.js +40 -0
  124. package/src/simple/room/Room.js +2 -2
  125. package/src/simple/room/SipRoom.js +1 -1
  126. package/src/simple/room/__tests__/Participant.test.js +81 -0
  127. package/src/types/WebSocketMessage.js +7 -1
  128. package/src/utils/__tests__/object.test.js +35 -0
  129. package/src/utils/__tests__/sdp.test.js +33 -1
  130. package/src/utils/__tests__/string.test.js +23 -0
  131. package/src/utils/object.js +15 -0
  132. package/src/utils/sdp.js +18 -0
  133. package/src/utils/string.js +8 -0
  134. package/src/web-rtc-client.js +40 -23
  135. package/src/websocket-client.js +2 -0
@@ -2655,6 +2655,70 @@ class ExternalApp {
2655
2655
 
2656
2656
  //
2657
2657
 
2658
+ class MeetingAuthorization {
2659
+
2660
+
2661
+
2662
+
2663
+
2664
+
2665
+ constructor({
2666
+ meetingUuid,
2667
+ uuid,
2668
+ userUuid,
2669
+ userName,
2670
+ } = {}) {
2671
+ this.meetingUuid = meetingUuid;
2672
+ this.uuid = uuid;
2673
+ this.userUuid = userUuid;
2674
+ this.userName = userName;
2675
+ }
2676
+
2677
+ setStatus(status ) {
2678
+ this.status = status;
2679
+ }
2680
+
2681
+ getStatus() {
2682
+ return this.status;
2683
+ }
2684
+
2685
+ static parse(plain ) {
2686
+ const {
2687
+ meeting_uuid: meetingUuid,
2688
+ uuid,
2689
+ guest_uuid: userUuid,
2690
+ guest_name: userName,
2691
+ } = plain;
2692
+
2693
+ return new MeetingAuthorization({
2694
+ meetingUuid,
2695
+ uuid,
2696
+ userUuid,
2697
+ userName,
2698
+ });
2699
+ }
2700
+
2701
+ static parseMany(items ) {
2702
+ if (!items) {
2703
+ return [];
2704
+ }
2705
+ return items.map(MeetingAuthorization.parse);
2706
+ }
2707
+ }
2708
+
2709
+ //
2710
+
2711
+
2712
+
2713
+
2714
+
2715
+
2716
+
2717
+
2718
+
2719
+
2720
+
2721
+
2658
2722
 
2659
2723
 
2660
2724
 
@@ -2665,6 +2729,7 @@ class ExternalApp {
2665
2729
 
2666
2730
 
2667
2731
 
2732
+
2668
2733
 
2669
2734
 
2670
2735
  class Meeting {
@@ -2679,6 +2744,8 @@ class Meeting {
2679
2744
 
2680
2745
 
2681
2746
 
2747
+
2748
+
2682
2749
 
2683
2750
  static parse(plain ) {
2684
2751
  return new Meeting({
@@ -2691,6 +2758,7 @@ class Meeting {
2691
2758
  extension: plain.exten,
2692
2759
  persistent: plain.persistent,
2693
2760
  creationTime: moment__default['default'](plain.creation_time).toDate(),
2761
+ requireAuthorization: plain.require_authorization,
2694
2762
  });
2695
2763
  }
2696
2764
 
@@ -2715,6 +2783,7 @@ class Meeting {
2715
2783
  extension,
2716
2784
  persistent,
2717
2785
  creationTime,
2786
+ requireAuthorization,
2718
2787
  } = {}) {
2719
2788
  this.guestSipAuthorization = guestSipAuthorization;
2720
2789
  this.uri = uri;
@@ -2725,6 +2794,7 @@ class Meeting {
2725
2794
  this.extension = extension;
2726
2795
  this.persistent = persistent;
2727
2796
  this.creationTime = creationTime;
2797
+ this.requireAuthorization = requireAuthorization;
2728
2798
 
2729
2799
  // Useful to compare instead of instanceof with minified code
2730
2800
  this.type = 'Meeting';
@@ -2735,8 +2805,32 @@ class Meeting {
2735
2805
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
2736
2806
  return { username, secret };
2737
2807
  }
2808
+
2738
2809
  }
2739
2810
 
2811
+ //
2812
+
2813
+ const camelToUnderscore = (key ) => {
2814
+ if (typeof key !== 'string') {
2815
+ throw new Error('Input is not a string');
2816
+ }
2817
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
2818
+ };
2819
+
2820
+ //
2821
+
2822
+ const convertKeysFromCamelToUnderscore = (args ) => {
2823
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
2824
+ throw new Error('Input is not an object');
2825
+ }
2826
+
2827
+ return Object.keys(args).reduce((acc, key) => {
2828
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
2829
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
2830
+ return acc;
2831
+ }, {});
2832
+ };
2833
+
2740
2834
  /* */
2741
2835
 
2742
2836
  var confdMethods = (client , baseUrl ) => ({
@@ -2805,8 +2899,18 @@ var confdMethods = (client , baseUrl ) => ({
2805
2899
  getMyMeetings: () =>
2806
2900
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2807
2901
 
2808
- createMyMeeting: (name , persistent ) =>
2809
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2902
+ createMyMeeting: (args ) =>
2903
+ client
2904
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
2905
+ .then(Meeting.parse),
2906
+
2907
+ updateMyMeeting: (meetingUuid , data ) =>
2908
+ client.put(
2909
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
2910
+ convertKeysFromCamelToUnderscore(data),
2911
+ null,
2912
+ ApiRequester.successResponseParser,
2913
+ ),
2810
2914
 
2811
2915
  deleteMyMeeting: (meetingUuid ) =>
2812
2916
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2814,8 +2918,36 @@ var confdMethods = (client , baseUrl ) => ({
2814
2918
  getMeeting: (meetingUuid ) =>
2815
2919
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
2816
2920
 
2921
+ meetingAuthorizations: (meetingUuid ) =>
2922
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
2923
+
2924
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
2925
+ client.put(
2926
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
2927
+ {},
2928
+ null,
2929
+ ApiRequester.successResponseParser,
2930
+ ),
2931
+
2932
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
2933
+ client.put(
2934
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
2935
+ {},
2936
+ null,
2937
+ ApiRequester.successResponseParser,
2938
+ ),
2939
+
2817
2940
  guestGetMeeting: (meetingUuid ) =>
2818
2941
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
2942
+
2943
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
2944
+ client
2945
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
2946
+ .then(MeetingAuthorization.parse),
2947
+
2948
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
2949
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
2950
+
2819
2951
  });
2820
2952
 
2821
2953
  //
@@ -3081,6 +3213,7 @@ const RECORD_STATE_ACTIVE = 'active';
3081
3213
 
3082
3214
 
3083
3215
 
3216
+
3084
3217
 
3085
3218
 
3086
3219
 
@@ -3091,6 +3224,7 @@ const RECORD_STATE_ACTIVE = 'active';
3091
3224
 
3092
3225
 
3093
3226
 
3227
+
3094
3228
 
3095
3229
 
3096
3230
 
@@ -3119,6 +3253,7 @@ class Call {
3119
3253
 
3120
3254
 
3121
3255
 
3256
+
3122
3257
 
3123
3258
 
3124
3259
 
@@ -3143,6 +3278,7 @@ class Call {
3143
3278
  calleeNumber: plain.peer_caller_id_number,
3144
3279
  dialedExtension: plain.dialed_extension,
3145
3280
  isCaller: plain.is_caller,
3281
+ isVideo: plain.is_video,
3146
3282
  muted: plain.muted,
3147
3283
  onHold: plain.on_hold,
3148
3284
  status: plain.status,
@@ -3166,6 +3302,7 @@ class Call {
3166
3302
  calleeNumber,
3167
3303
  dialedExtension,
3168
3304
  isCaller,
3305
+ isVideo,
3169
3306
  lineId,
3170
3307
  muted,
3171
3308
  onHold,
@@ -3189,6 +3326,7 @@ class Call {
3189
3326
  this.startingTime = startingTime;
3190
3327
  this.talkingToIds = talkingToIds || [];
3191
3328
  this.recording = recording;
3329
+ this.isVideo = !!isVideo;
3192
3330
 
3193
3331
  // Useful to compare instead of instanceof with minified code
3194
3332
  this.type = 'Call';
@@ -3662,7 +3800,7 @@ class CallSession {
3662
3800
  ringing: call.isRinging(),
3663
3801
  answered: call.isUp(),
3664
3802
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
3665
- cameraEnabled: false,
3803
+ cameraEnabled: call.isVideo,
3666
3804
  dialedExtension: call.dialedExtension,
3667
3805
  call,
3668
3806
  conference: false, // @FIXME?
@@ -5060,6 +5198,14 @@ var calldMethods = (client , baseUrl ) => ({
5060
5198
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
5061
5199
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
5062
5200
 
5201
+ banMeetingParticipant: (meetingUuid , participantUuid ) =>
5202
+ client.delete(
5203
+ `${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
5204
+ null,
5205
+ null,
5206
+ ApiRequester.successResponseParser,
5207
+ ),
5208
+
5063
5209
  listTrunks: () => client.get(`${baseUrl}/trunks`),
5064
5210
 
5065
5211
  mute: (callId ) =>
@@ -6208,6 +6354,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
6208
6354
  return fixed;
6209
6355
  };
6210
6356
 
6357
+ const addIcesInAllBundles = (sdp ) => {
6358
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
6359
+
6360
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
6361
+ if (!mediaWithCandidate) {
6362
+ return sdp;
6363
+ }
6364
+
6365
+ const { candidates } = mediaWithCandidate;
6366
+
6367
+ parsedSdp.media = parsedSdp.media.map(media => ({
6368
+ ...media,
6369
+ candidates: media.candidates || candidates,
6370
+ }));
6371
+
6372
+ return sdpParser__default['default'].write(parsedSdp);
6373
+ };
6374
+
6211
6375
  /* global RTCSessionDescriptionInit, navigator */
6212
6376
 
6213
6377
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -6337,7 +6501,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
6337
6501
 
6338
6502
  // Check if we got ICEs
6339
6503
  if (sdp.indexOf('a=candidate') !== -1) {
6340
- return description;
6504
+ return {
6505
+ type: description.type,
6506
+ sdp: addIcesInAllBundles(sdp),
6507
+ };
6341
6508
  }
6342
6509
 
6343
6510
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7797,41 +7964,58 @@ class WebRTCClient extends Emitter {
7797
7964
  });
7798
7965
  }
7799
7966
 
7800
- changeAudioInputDevice(id , session ) {
7967
+ async changeAudioInputDevice(id , session , force ) {
7801
7968
  const currentId = this.getAudioDeviceId();
7802
7969
  logger$8.info('setting audio input device', { id, currentId, session: !!session });
7803
7970
 
7804
- if (id === currentId) {
7971
+ if (!force && id === currentId) {
7805
7972
  return null;
7806
7973
  }
7807
7974
 
7975
+ // in order to handle an audio track change for default devices
7976
+ // we need the actual id of the device (not 'default')
7977
+ let deviceId = id;
7978
+ if (id === 'default' && navigator.mediaDevices) {
7979
+ const devices = await navigator.mediaDevices.enumerateDevices();
7980
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
7981
+ if (defaultDevice) {
7982
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
7983
+ const targetDevice = devices.find(device => device.label === deviceLabel);
7984
+ if (targetDevice) {
7985
+ deviceId = targetDevice.deviceId;
7986
+ if (!force && deviceId === currentId) {
7987
+ return null;
7988
+ }
7989
+ }
7990
+ }
7991
+ }
7992
+
7808
7993
  // let's update the local audio value
7809
7994
  if (this.audio) {
7810
7995
  this.audio = {
7811
7996
  deviceId: {
7812
- exact: id,
7997
+ exact: deviceId,
7813
7998
  },
7814
7999
  };
7815
8000
  }
7816
8001
 
7817
- if (session) {
8002
+ if (session && navigator.mediaDevices) {
7818
8003
  const sdh = session.sessionDescriptionHandler;
7819
8004
  const pc = sdh.peerConnection;
7820
8005
 
7821
- // $FlowFixMe
7822
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7823
- const audioTrack = stream.getAudioTracks()[0];
7824
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
8006
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
8007
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
8008
+ const audioTrack = stream.getAudioTracks()[0];
8009
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7825
8010
 
7826
- if (sender) {
7827
- if (sender.track) {
7828
- audioTrack.enabled = sender.track.enabled;
7829
- }
7830
- sender.replaceTrack(audioTrack);
8011
+ if (sender) {
8012
+ if (sender.track) {
8013
+ audioTrack.enabled = sender.track.enabled;
7831
8014
  }
8015
+ sender.replaceTrack(audioTrack);
8016
+ }
7832
8017
 
7833
- return stream;
7834
- });
8018
+ return stream;
7835
8019
  }
7836
8020
  }
7837
8021
 
@@ -7851,14 +8035,14 @@ class WebRTCClient extends Emitter {
7851
8035
  return null;
7852
8036
  }
7853
8037
 
7854
- // let's update the local video value
7855
- if (this.video) {
7856
- this.video = {
7857
- deviceId: {
7858
- exact: id,
7859
- },
7860
- };
7861
- }
8038
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
8039
+ const videoObject = typeof this.video === 'object' ? this.video : {};
8040
+ this.video = {
8041
+ ...videoObject,
8042
+ deviceId: {
8043
+ exact: id,
8044
+ },
8045
+ };
7862
8046
  }
7863
8047
 
7864
8048
  changeSessionVideoInputDevice(id , session ) {
@@ -9597,10 +9781,10 @@ class WebRTCPhone extends Emitter {
9597
9781
  this.audioRingVolume = volume;
9598
9782
  }
9599
9783
 
9600
- changeAudioInputDevice(id ) {
9784
+ changeAudioInputDevice(id , force ) {
9601
9785
  logger$7.info('WebRTC phone - changeAudio input device', { deviceId: id });
9602
9786
 
9603
- return this.client.changeAudioInputDevice(id, this.currentSipSession);
9787
+ return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
9604
9788
  }
9605
9789
 
9606
9790
  changeVideoInputDevice(id ) {
@@ -11253,6 +11437,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
11253
11437
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
11254
11438
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
11255
11439
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
11440
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
11256
11441
 
11257
11442
  const BLACKLIST_EVENTS = [
11258
11443
  CHAT_MESSAGE_SENT,
@@ -11604,6 +11789,7 @@ WebSocketClient.eventLists = [
11604
11789
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11605
11790
  CONFERENCE_ADHOC_DELETED,
11606
11791
  MEETING_USER_PROGRESS,
11792
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11607
11793
  ];
11608
11794
 
11609
11795
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11675,6 +11861,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11675
11861
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11676
11862
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11677
11863
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11864
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11678
11865
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11679
11866
  'default': WebSocketClient
11680
11867
  });
@@ -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
 
@@ -11918,6 +12105,7 @@ class Participant extends Emitter {
11918
12105
 
11919
12106
 
11920
12107
 
12108
+
11921
12109
 
11922
12110
 
11923
12111
 
@@ -11935,6 +12123,7 @@ class Participant extends Emitter {
11935
12123
 
11936
12124
 
11937
12125
 
12126
+
11938
12127
 
11939
12128
  /**
11940
12129
  * @param room Room The room where the participant is
@@ -11958,6 +12147,7 @@ class Participant extends Emitter {
11958
12147
  this.screensharing = false;
11959
12148
  this.isOnHold = false;
11960
12149
  this.extra = extra;
12150
+ this.banned = false;
11961
12151
 
11962
12152
  this.ON_UPDATED = 'participant/ON_UPDATED';
11963
12153
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -11974,6 +12164,7 @@ class Participant extends Emitter {
11974
12164
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
11975
12165
  this.ON_HOLD = 'participant/ON_HOLD';
11976
12166
  this.ON_RESUME = 'participant/ON_RESUME';
12167
+ this.ON_BAN = 'participant/ON_BAN';
11977
12168
  }
11978
12169
 
11979
12170
  triggerEvent(name , ...args ) {
@@ -12014,6 +12205,10 @@ class Participant extends Emitter {
12014
12205
  status.extra = this.extra;
12015
12206
  break;
12016
12207
  }
12208
+ case this.ON_BAN: {
12209
+ status.banned = true;
12210
+ break;
12211
+ }
12017
12212
  }
12018
12213
 
12019
12214
  if (broadcast) {
@@ -12116,6 +12311,11 @@ class Participant extends Emitter {
12116
12311
  this.triggerUpdate(this.ON_RESUME, broadcast);
12117
12312
  }
12118
12313
 
12314
+ onBan(broadcast = true) {
12315
+ this.banned = true;
12316
+ this.triggerUpdate(this.ON_BAN, broadcast);
12317
+ }
12318
+
12119
12319
  getStatus() {
12120
12320
  return {
12121
12321
  callId: this.callId,
@@ -12162,6 +12362,10 @@ class Participant extends Emitter {
12162
12362
  }
12163
12363
  }
12164
12364
 
12365
+ if (status.banned) {
12366
+ this.onBan(false);
12367
+ }
12368
+
12165
12369
  // Poor man's object comparison
12166
12370
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
12167
12371
  this.extra = { ...this.extra, ...status.extra };
@@ -12189,6 +12393,28 @@ class Participant extends Emitter {
12189
12393
  this.streams = streams;
12190
12394
  this.videoStreams = streams;
12191
12395
  }
12396
+
12397
+ async ban(apiRequestDelay = null) {
12398
+ const { meetingUuid } = this.room;
12399
+ if (!meetingUuid) {
12400
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
12401
+ }
12402
+
12403
+ // this notifies all that someone is being banned
12404
+ this.onBan(true);
12405
+
12406
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
12407
+ if (apiRequestDelay) {
12408
+ await this.delay(apiRequestDelay);
12409
+ }
12410
+
12411
+ // proceed with the actual kick
12412
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
12413
+ }
12414
+
12415
+ async delay(ms ) {
12416
+ return new Promise(resolve => setTimeout(resolve, ms));
12417
+ }
12192
12418
  }
12193
12419
 
12194
12420
  //
@@ -13738,7 +13964,7 @@ class Room extends Emitter {
13738
13964
  logger.info('connecting to room', { extension, audioOnly, room: !!room });
13739
13965
 
13740
13966
  if (!room) {
13741
- await Wazo.Phone.connect();
13967
+ await Wazo.Phone.connect({ media: constraints });
13742
13968
 
13743
13969
  const withCamera = constraints && !!constraints.video;
13744
13970
 
@@ -14183,7 +14409,7 @@ class Room extends Emitter {
14183
14409
  const participant = this._getParticipantFromCallId(status.callId);
14184
14410
 
14185
14411
  if (participant) {
14186
- // we're received, so no need to broadcast, hence the input false arg
14412
+ // we're receiving, so no need to broadcast
14187
14413
  participant.updateStatus(status, false);
14188
14414
  }
14189
14415
  break;