@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 ) =>
@@ -5907,6 +6053,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
5907
6053
  return fixed;
5908
6054
  };
5909
6055
 
6056
+ const addIcesInAllBundles = (sdp ) => {
6057
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
6058
+
6059
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
6060
+ if (!mediaWithCandidate) {
6061
+ return sdp;
6062
+ }
6063
+
6064
+ const { candidates } = mediaWithCandidate;
6065
+
6066
+ parsedSdp.media = parsedSdp.media.map(media => ({
6067
+ ...media,
6068
+ candidates: media.candidates || candidates,
6069
+ }));
6070
+
6071
+ return sdpParser__default['default'].write(parsedSdp);
6072
+ };
6073
+
5910
6074
  /* global RTCSessionDescriptionInit, navigator */
5911
6075
 
5912
6076
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -6036,7 +6200,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
6036
6200
 
6037
6201
  // Check if we got ICEs
6038
6202
  if (sdp.indexOf('a=candidate') !== -1) {
6039
- return description;
6203
+ return {
6204
+ type: description.type,
6205
+ sdp: addIcesInAllBundles(sdp),
6206
+ };
6040
6207
  }
6041
6208
 
6042
6209
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7496,41 +7663,58 @@ class WebRTCClient extends Emitter {
7496
7663
  });
7497
7664
  }
7498
7665
 
7499
- changeAudioInputDevice(id , session ) {
7666
+ async changeAudioInputDevice(id , session , force ) {
7500
7667
  const currentId = this.getAudioDeviceId();
7501
7668
  logger$9.info('setting audio input device', { id, currentId, session: !!session });
7502
7669
 
7503
- if (id === currentId) {
7670
+ if (!force && id === currentId) {
7504
7671
  return null;
7505
7672
  }
7506
7673
 
7674
+ // in order to handle an audio track change for default devices
7675
+ // we need the actual id of the device (not 'default')
7676
+ let deviceId = id;
7677
+ if (id === 'default' && navigator.mediaDevices) {
7678
+ const devices = await navigator.mediaDevices.enumerateDevices();
7679
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
7680
+ if (defaultDevice) {
7681
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
7682
+ const targetDevice = devices.find(device => device.label === deviceLabel);
7683
+ if (targetDevice) {
7684
+ deviceId = targetDevice.deviceId;
7685
+ if (!force && deviceId === currentId) {
7686
+ return null;
7687
+ }
7688
+ }
7689
+ }
7690
+ }
7691
+
7507
7692
  // let's update the local audio value
7508
7693
  if (this.audio) {
7509
7694
  this.audio = {
7510
7695
  deviceId: {
7511
- exact: id,
7696
+ exact: deviceId,
7512
7697
  },
7513
7698
  };
7514
7699
  }
7515
7700
 
7516
- if (session) {
7701
+ if (session && navigator.mediaDevices) {
7517
7702
  const sdh = session.sessionDescriptionHandler;
7518
7703
  const pc = sdh.peerConnection;
7519
7704
 
7520
- // $FlowFixMe
7521
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7522
- const audioTrack = stream.getAudioTracks()[0];
7523
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7705
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
7706
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
7707
+ const audioTrack = stream.getAudioTracks()[0];
7708
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7524
7709
 
7525
- if (sender) {
7526
- if (sender.track) {
7527
- audioTrack.enabled = sender.track.enabled;
7528
- }
7529
- sender.replaceTrack(audioTrack);
7710
+ if (sender) {
7711
+ if (sender.track) {
7712
+ audioTrack.enabled = sender.track.enabled;
7530
7713
  }
7714
+ sender.replaceTrack(audioTrack);
7715
+ }
7531
7716
 
7532
- return stream;
7533
- });
7717
+ return stream;
7534
7718
  }
7535
7719
  }
7536
7720
 
@@ -7550,14 +7734,14 @@ class WebRTCClient extends Emitter {
7550
7734
  return null;
7551
7735
  }
7552
7736
 
7553
- // let's update the local video value
7554
- if (this.video) {
7555
- this.video = {
7556
- deviceId: {
7557
- exact: id,
7558
- },
7559
- };
7560
- }
7737
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
7738
+ const videoObject = typeof this.video === 'object' ? this.video : {};
7739
+ this.video = {
7740
+ ...videoObject,
7741
+ deviceId: {
7742
+ exact: id,
7743
+ },
7744
+ };
7561
7745
  }
7562
7746
 
7563
7747
  changeSessionVideoInputDevice(id , session ) {
@@ -9296,10 +9480,10 @@ class WebRTCPhone extends Emitter {
9296
9480
  this.audioRingVolume = volume;
9297
9481
  }
9298
9482
 
9299
- changeAudioInputDevice(id ) {
9483
+ changeAudioInputDevice(id , force ) {
9300
9484
  logger$8.info('WebRTC phone - changeAudio input device', { deviceId: id });
9301
9485
 
9302
- return this.client.changeAudioInputDevice(id, this.currentSipSession);
9486
+ return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
9303
9487
  }
9304
9488
 
9305
9489
  changeVideoInputDevice(id ) {
@@ -10952,6 +11136,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
10952
11136
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
10953
11137
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
10954
11138
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
11139
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
10955
11140
 
10956
11141
  const BLACKLIST_EVENTS = [
10957
11142
  CHAT_MESSAGE_SENT,
@@ -11303,6 +11488,7 @@ WebSocketClient.eventLists = [
11303
11488
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11304
11489
  CONFERENCE_ADHOC_DELETED,
11305
11490
  MEETING_USER_PROGRESS,
11491
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11306
11492
  ];
11307
11493
 
11308
11494
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11374,6 +11560,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11374
11560
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11375
11561
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11376
11562
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11563
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11377
11564
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11378
11565
  'default': WebSocketClient
11379
11566
  });
@@ -11478,6 +11665,7 @@ class Participant extends Emitter {
11478
11665
 
11479
11666
 
11480
11667
 
11668
+
11481
11669
 
11482
11670
 
11483
11671
 
@@ -11495,6 +11683,7 @@ class Participant extends Emitter {
11495
11683
 
11496
11684
 
11497
11685
 
11686
+
11498
11687
 
11499
11688
  /**
11500
11689
  * @param room Room The room where the participant is
@@ -11518,6 +11707,7 @@ class Participant extends Emitter {
11518
11707
  this.screensharing = false;
11519
11708
  this.isOnHold = false;
11520
11709
  this.extra = extra;
11710
+ this.banned = false;
11521
11711
 
11522
11712
  this.ON_UPDATED = 'participant/ON_UPDATED';
11523
11713
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -11534,6 +11724,7 @@ class Participant extends Emitter {
11534
11724
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
11535
11725
  this.ON_HOLD = 'participant/ON_HOLD';
11536
11726
  this.ON_RESUME = 'participant/ON_RESUME';
11727
+ this.ON_BAN = 'participant/ON_BAN';
11537
11728
  }
11538
11729
 
11539
11730
  triggerEvent(name , ...args ) {
@@ -11574,6 +11765,10 @@ class Participant extends Emitter {
11574
11765
  status.extra = this.extra;
11575
11766
  break;
11576
11767
  }
11768
+ case this.ON_BAN: {
11769
+ status.banned = true;
11770
+ break;
11771
+ }
11577
11772
  }
11578
11773
 
11579
11774
  if (broadcast) {
@@ -11676,6 +11871,11 @@ class Participant extends Emitter {
11676
11871
  this.triggerUpdate(this.ON_RESUME, broadcast);
11677
11872
  }
11678
11873
 
11874
+ onBan(broadcast = true) {
11875
+ this.banned = true;
11876
+ this.triggerUpdate(this.ON_BAN, broadcast);
11877
+ }
11878
+
11679
11879
  getStatus() {
11680
11880
  return {
11681
11881
  callId: this.callId,
@@ -11722,6 +11922,10 @@ class Participant extends Emitter {
11722
11922
  }
11723
11923
  }
11724
11924
 
11925
+ if (status.banned) {
11926
+ this.onBan(false);
11927
+ }
11928
+
11725
11929
  // Poor man's object comparison
11726
11930
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
11727
11931
  this.extra = { ...this.extra, ...status.extra };
@@ -11749,6 +11953,28 @@ class Participant extends Emitter {
11749
11953
  this.streams = streams;
11750
11954
  this.videoStreams = streams;
11751
11955
  }
11956
+
11957
+ async ban(apiRequestDelay = null) {
11958
+ const { meetingUuid } = this.room;
11959
+ if (!meetingUuid) {
11960
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
11961
+ }
11962
+
11963
+ // this notifies all that someone is being banned
11964
+ this.onBan(true);
11965
+
11966
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
11967
+ if (apiRequestDelay) {
11968
+ await this.delay(apiRequestDelay);
11969
+ }
11970
+
11971
+ // proceed with the actual kick
11972
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
11973
+ }
11974
+
11975
+ async delay(ms ) {
11976
+ return new Promise(resolve => setTimeout(resolve, ms));
11977
+ }
11752
11978
  }
11753
11979
 
11754
11980
  //
@@ -11901,7 +12127,7 @@ class Room$1 extends Emitter {
11901
12127
  logger$3.info('connecting to room', { extension, audioOnly, room: !!room });
11902
12128
 
11903
12129
  if (!room) {
11904
- await Wazo.Phone.connect();
12130
+ await Wazo.Phone.connect({ media: constraints });
11905
12131
 
11906
12132
  const withCamera = constraints && !!constraints.video;
11907
12133
 
@@ -12346,7 +12572,7 @@ class Room$1 extends Emitter {
12346
12572
  const participant = this._getParticipantFromCallId(status.callId);
12347
12573
 
12348
12574
  if (participant) {
12349
- // we're received, so no need to broadcast, hence the input false arg
12575
+ // we're receiving, so no need to broadcast
12350
12576
  participant.updateStatus(status, false);
12351
12577
  }
12352
12578
  break;
@@ -12613,7 +12839,7 @@ class SipRoom extends Room$1 {
12613
12839
  logger$2.info('connecting to sip room', { extension, audioOnly, room: !!room });
12614
12840
 
12615
12841
  if (!room) {
12616
- await Wazo.Phone.connect();
12842
+ await Wazo.Phone.connect({ media: constraints });
12617
12843
 
12618
12844
  const withCamera = constraints && !!constraints.video;
12619
12845