@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
@@ -2645,6 +2645,70 @@ class ExternalApp {
2645
2645
 
2646
2646
  //
2647
2647
 
2648
+ class MeetingAuthorization {
2649
+
2650
+
2651
+
2652
+
2653
+
2654
+
2655
+ constructor({
2656
+ meetingUuid,
2657
+ uuid,
2658
+ userUuid,
2659
+ userName,
2660
+ } = {}) {
2661
+ this.meetingUuid = meetingUuid;
2662
+ this.uuid = uuid;
2663
+ this.userUuid = userUuid;
2664
+ this.userName = userName;
2665
+ }
2666
+
2667
+ setStatus(status ) {
2668
+ this.status = status;
2669
+ }
2670
+
2671
+ getStatus() {
2672
+ return this.status;
2673
+ }
2674
+
2675
+ static parse(plain ) {
2676
+ const {
2677
+ meeting_uuid: meetingUuid,
2678
+ uuid,
2679
+ guest_uuid: userUuid,
2680
+ guest_name: userName,
2681
+ } = plain;
2682
+
2683
+ return new MeetingAuthorization({
2684
+ meetingUuid,
2685
+ uuid,
2686
+ userUuid,
2687
+ userName,
2688
+ });
2689
+ }
2690
+
2691
+ static parseMany(items ) {
2692
+ if (!items) {
2693
+ return [];
2694
+ }
2695
+ return items.map(MeetingAuthorization.parse);
2696
+ }
2697
+ }
2698
+
2699
+ //
2700
+
2701
+
2702
+
2703
+
2704
+
2705
+
2706
+
2707
+
2708
+
2709
+
2710
+
2711
+
2648
2712
 
2649
2713
 
2650
2714
 
@@ -2655,6 +2719,7 @@ class ExternalApp {
2655
2719
 
2656
2720
 
2657
2721
 
2722
+
2658
2723
 
2659
2724
 
2660
2725
  class Meeting {
@@ -2669,6 +2734,8 @@ class Meeting {
2669
2734
 
2670
2735
 
2671
2736
 
2737
+
2738
+
2672
2739
 
2673
2740
  static parse(plain ) {
2674
2741
  return new Meeting({
@@ -2681,6 +2748,7 @@ class Meeting {
2681
2748
  extension: plain.exten,
2682
2749
  persistent: plain.persistent,
2683
2750
  creationTime: moment(plain.creation_time).toDate(),
2751
+ requireAuthorization: plain.require_authorization,
2684
2752
  });
2685
2753
  }
2686
2754
 
@@ -2705,6 +2773,7 @@ class Meeting {
2705
2773
  extension,
2706
2774
  persistent,
2707
2775
  creationTime,
2776
+ requireAuthorization,
2708
2777
  } = {}) {
2709
2778
  this.guestSipAuthorization = guestSipAuthorization;
2710
2779
  this.uri = uri;
@@ -2715,6 +2784,7 @@ class Meeting {
2715
2784
  this.extension = extension;
2716
2785
  this.persistent = persistent;
2717
2786
  this.creationTime = creationTime;
2787
+ this.requireAuthorization = requireAuthorization;
2718
2788
 
2719
2789
  // Useful to compare instead of instanceof with minified code
2720
2790
  this.type = 'Meeting';
@@ -2725,8 +2795,32 @@ class Meeting {
2725
2795
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
2726
2796
  return { username, secret };
2727
2797
  }
2798
+
2728
2799
  }
2729
2800
 
2801
+ //
2802
+
2803
+ const camelToUnderscore = (key ) => {
2804
+ if (typeof key !== 'string') {
2805
+ throw new Error('Input is not a string');
2806
+ }
2807
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
2808
+ };
2809
+
2810
+ //
2811
+
2812
+ const convertKeysFromCamelToUnderscore = (args ) => {
2813
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
2814
+ throw new Error('Input is not an object');
2815
+ }
2816
+
2817
+ return Object.keys(args).reduce((acc, key) => {
2818
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
2819
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
2820
+ return acc;
2821
+ }, {});
2822
+ };
2823
+
2730
2824
  /* */
2731
2825
 
2732
2826
  var confdMethods = (client , baseUrl ) => ({
@@ -2795,8 +2889,18 @@ var confdMethods = (client , baseUrl ) => ({
2795
2889
  getMyMeetings: () =>
2796
2890
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2797
2891
 
2798
- createMyMeeting: (name , persistent ) =>
2799
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2892
+ createMyMeeting: (args ) =>
2893
+ client
2894
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
2895
+ .then(Meeting.parse),
2896
+
2897
+ updateMyMeeting: (meetingUuid , data ) =>
2898
+ client.put(
2899
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
2900
+ convertKeysFromCamelToUnderscore(data),
2901
+ null,
2902
+ ApiRequester.successResponseParser,
2903
+ ),
2800
2904
 
2801
2905
  deleteMyMeeting: (meetingUuid ) =>
2802
2906
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2804,8 +2908,36 @@ var confdMethods = (client , baseUrl ) => ({
2804
2908
  getMeeting: (meetingUuid ) =>
2805
2909
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
2806
2910
 
2911
+ meetingAuthorizations: (meetingUuid ) =>
2912
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
2913
+
2914
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
2915
+ client.put(
2916
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
2917
+ {},
2918
+ null,
2919
+ ApiRequester.successResponseParser,
2920
+ ),
2921
+
2922
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
2923
+ client.put(
2924
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
2925
+ {},
2926
+ null,
2927
+ ApiRequester.successResponseParser,
2928
+ ),
2929
+
2807
2930
  guestGetMeeting: (meetingUuid ) =>
2808
2931
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
2932
+
2933
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
2934
+ client
2935
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
2936
+ .then(MeetingAuthorization.parse),
2937
+
2938
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
2939
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
2940
+
2809
2941
  });
2810
2942
 
2811
2943
  //
@@ -3071,6 +3203,7 @@ const RECORD_STATE_ACTIVE = 'active';
3071
3203
 
3072
3204
 
3073
3205
 
3206
+
3074
3207
 
3075
3208
 
3076
3209
 
@@ -3081,6 +3214,7 @@ const RECORD_STATE_ACTIVE = 'active';
3081
3214
 
3082
3215
 
3083
3216
 
3217
+
3084
3218
 
3085
3219
 
3086
3220
 
@@ -3109,6 +3243,7 @@ class Call {
3109
3243
 
3110
3244
 
3111
3245
 
3246
+
3112
3247
 
3113
3248
 
3114
3249
 
@@ -3133,6 +3268,7 @@ class Call {
3133
3268
  calleeNumber: plain.peer_caller_id_number,
3134
3269
  dialedExtension: plain.dialed_extension,
3135
3270
  isCaller: plain.is_caller,
3271
+ isVideo: plain.is_video,
3136
3272
  muted: plain.muted,
3137
3273
  onHold: plain.on_hold,
3138
3274
  status: plain.status,
@@ -3156,6 +3292,7 @@ class Call {
3156
3292
  calleeNumber,
3157
3293
  dialedExtension,
3158
3294
  isCaller,
3295
+ isVideo,
3159
3296
  lineId,
3160
3297
  muted,
3161
3298
  onHold,
@@ -3179,6 +3316,7 @@ class Call {
3179
3316
  this.startingTime = startingTime;
3180
3317
  this.talkingToIds = talkingToIds || [];
3181
3318
  this.recording = recording;
3319
+ this.isVideo = !!isVideo;
3182
3320
 
3183
3321
  // Useful to compare instead of instanceof with minified code
3184
3322
  this.type = 'Call';
@@ -3652,7 +3790,7 @@ class CallSession {
3652
3790
  ringing: call.isRinging(),
3653
3791
  answered: call.isUp(),
3654
3792
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
3655
- cameraEnabled: false,
3793
+ cameraEnabled: call.isVideo,
3656
3794
  dialedExtension: call.dialedExtension,
3657
3795
  call,
3658
3796
  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 ) =>
@@ -5897,6 +6043,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
5897
6043
  return fixed;
5898
6044
  };
5899
6045
 
6046
+ const addIcesInAllBundles = (sdp ) => {
6047
+ const parsedSdp = sdpParser.parse(sdp);
6048
+
6049
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
6050
+ if (!mediaWithCandidate) {
6051
+ return sdp;
6052
+ }
6053
+
6054
+ const { candidates } = mediaWithCandidate;
6055
+
6056
+ parsedSdp.media = parsedSdp.media.map(media => ({
6057
+ ...media,
6058
+ candidates: media.candidates || candidates,
6059
+ }));
6060
+
6061
+ return sdpParser.write(parsedSdp);
6062
+ };
6063
+
5900
6064
  /* global RTCSessionDescriptionInit, navigator */
5901
6065
 
5902
6066
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -6026,7 +6190,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
6026
6190
 
6027
6191
  // Check if we got ICEs
6028
6192
  if (sdp.indexOf('a=candidate') !== -1) {
6029
- return description;
6193
+ return {
6194
+ type: description.type,
6195
+ sdp: addIcesInAllBundles(sdp),
6196
+ };
6030
6197
  }
6031
6198
 
6032
6199
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7486,41 +7653,58 @@ class WebRTCClient extends Emitter {
7486
7653
  });
7487
7654
  }
7488
7655
 
7489
- changeAudioInputDevice(id , session ) {
7656
+ async changeAudioInputDevice(id , session , force ) {
7490
7657
  const currentId = this.getAudioDeviceId();
7491
7658
  logger$9.info('setting audio input device', { id, currentId, session: !!session });
7492
7659
 
7493
- if (id === currentId) {
7660
+ if (!force && id === currentId) {
7494
7661
  return null;
7495
7662
  }
7496
7663
 
7664
+ // in order to handle an audio track change for default devices
7665
+ // we need the actual id of the device (not 'default')
7666
+ let deviceId = id;
7667
+ if (id === 'default' && navigator.mediaDevices) {
7668
+ const devices = await navigator.mediaDevices.enumerateDevices();
7669
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
7670
+ if (defaultDevice) {
7671
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
7672
+ const targetDevice = devices.find(device => device.label === deviceLabel);
7673
+ if (targetDevice) {
7674
+ deviceId = targetDevice.deviceId;
7675
+ if (!force && deviceId === currentId) {
7676
+ return null;
7677
+ }
7678
+ }
7679
+ }
7680
+ }
7681
+
7497
7682
  // let's update the local audio value
7498
7683
  if (this.audio) {
7499
7684
  this.audio = {
7500
7685
  deviceId: {
7501
- exact: id,
7686
+ exact: deviceId,
7502
7687
  },
7503
7688
  };
7504
7689
  }
7505
7690
 
7506
- if (session) {
7691
+ if (session && navigator.mediaDevices) {
7507
7692
  const sdh = session.sessionDescriptionHandler;
7508
7693
  const pc = sdh.peerConnection;
7509
7694
 
7510
- // $FlowFixMe
7511
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7512
- const audioTrack = stream.getAudioTracks()[0];
7513
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7695
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
7696
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
7697
+ const audioTrack = stream.getAudioTracks()[0];
7698
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7514
7699
 
7515
- if (sender) {
7516
- if (sender.track) {
7517
- audioTrack.enabled = sender.track.enabled;
7518
- }
7519
- sender.replaceTrack(audioTrack);
7700
+ if (sender) {
7701
+ if (sender.track) {
7702
+ audioTrack.enabled = sender.track.enabled;
7520
7703
  }
7704
+ sender.replaceTrack(audioTrack);
7705
+ }
7521
7706
 
7522
- return stream;
7523
- });
7707
+ return stream;
7524
7708
  }
7525
7709
  }
7526
7710
 
@@ -7540,14 +7724,14 @@ class WebRTCClient extends Emitter {
7540
7724
  return null;
7541
7725
  }
7542
7726
 
7543
- // let's update the local video value
7544
- if (this.video) {
7545
- this.video = {
7546
- deviceId: {
7547
- exact: id,
7548
- },
7549
- };
7550
- }
7727
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
7728
+ const videoObject = typeof this.video === 'object' ? this.video : {};
7729
+ this.video = {
7730
+ ...videoObject,
7731
+ deviceId: {
7732
+ exact: id,
7733
+ },
7734
+ };
7551
7735
  }
7552
7736
 
7553
7737
  changeSessionVideoInputDevice(id , session ) {
@@ -9286,10 +9470,10 @@ class WebRTCPhone extends Emitter {
9286
9470
  this.audioRingVolume = volume;
9287
9471
  }
9288
9472
 
9289
- changeAudioInputDevice(id ) {
9473
+ changeAudioInputDevice(id , force ) {
9290
9474
  logger$8.info('WebRTC phone - changeAudio input device', { deviceId: id });
9291
9475
 
9292
- return this.client.changeAudioInputDevice(id, this.currentSipSession);
9476
+ return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
9293
9477
  }
9294
9478
 
9295
9479
  changeVideoInputDevice(id ) {
@@ -10942,6 +11126,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
10942
11126
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
10943
11127
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
10944
11128
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
11129
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
10945
11130
 
10946
11131
  const BLACKLIST_EVENTS = [
10947
11132
  CHAT_MESSAGE_SENT,
@@ -11293,6 +11478,7 @@ WebSocketClient.eventLists = [
11293
11478
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11294
11479
  CONFERENCE_ADHOC_DELETED,
11295
11480
  MEETING_USER_PROGRESS,
11481
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11296
11482
  ];
11297
11483
 
11298
11484
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11364,6 +11550,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11364
11550
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11365
11551
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11366
11552
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11553
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11367
11554
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11368
11555
  'default': WebSocketClient
11369
11556
  });
@@ -11468,6 +11655,7 @@ class Participant extends Emitter {
11468
11655
 
11469
11656
 
11470
11657
 
11658
+
11471
11659
 
11472
11660
 
11473
11661
 
@@ -11485,6 +11673,7 @@ class Participant extends Emitter {
11485
11673
 
11486
11674
 
11487
11675
 
11676
+
11488
11677
 
11489
11678
  /**
11490
11679
  * @param room Room The room where the participant is
@@ -11508,6 +11697,7 @@ class Participant extends Emitter {
11508
11697
  this.screensharing = false;
11509
11698
  this.isOnHold = false;
11510
11699
  this.extra = extra;
11700
+ this.banned = false;
11511
11701
 
11512
11702
  this.ON_UPDATED = 'participant/ON_UPDATED';
11513
11703
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -11524,6 +11714,7 @@ class Participant extends Emitter {
11524
11714
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
11525
11715
  this.ON_HOLD = 'participant/ON_HOLD';
11526
11716
  this.ON_RESUME = 'participant/ON_RESUME';
11717
+ this.ON_BAN = 'participant/ON_BAN';
11527
11718
  }
11528
11719
 
11529
11720
  triggerEvent(name , ...args ) {
@@ -11564,6 +11755,10 @@ class Participant extends Emitter {
11564
11755
  status.extra = this.extra;
11565
11756
  break;
11566
11757
  }
11758
+ case this.ON_BAN: {
11759
+ status.banned = true;
11760
+ break;
11761
+ }
11567
11762
  }
11568
11763
 
11569
11764
  if (broadcast) {
@@ -11666,6 +11861,11 @@ class Participant extends Emitter {
11666
11861
  this.triggerUpdate(this.ON_RESUME, broadcast);
11667
11862
  }
11668
11863
 
11864
+ onBan(broadcast = true) {
11865
+ this.banned = true;
11866
+ this.triggerUpdate(this.ON_BAN, broadcast);
11867
+ }
11868
+
11669
11869
  getStatus() {
11670
11870
  return {
11671
11871
  callId: this.callId,
@@ -11712,6 +11912,10 @@ class Participant extends Emitter {
11712
11912
  }
11713
11913
  }
11714
11914
 
11915
+ if (status.banned) {
11916
+ this.onBan(false);
11917
+ }
11918
+
11715
11919
  // Poor man's object comparison
11716
11920
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
11717
11921
  this.extra = { ...this.extra, ...status.extra };
@@ -11739,6 +11943,28 @@ class Participant extends Emitter {
11739
11943
  this.streams = streams;
11740
11944
  this.videoStreams = streams;
11741
11945
  }
11946
+
11947
+ async ban(apiRequestDelay = null) {
11948
+ const { meetingUuid } = this.room;
11949
+ if (!meetingUuid) {
11950
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
11951
+ }
11952
+
11953
+ // this notifies all that someone is being banned
11954
+ this.onBan(true);
11955
+
11956
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
11957
+ if (apiRequestDelay) {
11958
+ await this.delay(apiRequestDelay);
11959
+ }
11960
+
11961
+ // proceed with the actual kick
11962
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
11963
+ }
11964
+
11965
+ async delay(ms ) {
11966
+ return new Promise(resolve => setTimeout(resolve, ms));
11967
+ }
11742
11968
  }
11743
11969
 
11744
11970
  //
@@ -11891,7 +12117,7 @@ class Room$1 extends Emitter {
11891
12117
  logger$3.info('connecting to room', { extension, audioOnly, room: !!room });
11892
12118
 
11893
12119
  if (!room) {
11894
- await Wazo.Phone.connect();
12120
+ await Wazo.Phone.connect({ media: constraints });
11895
12121
 
11896
12122
  const withCamera = constraints && !!constraints.video;
11897
12123
 
@@ -12336,7 +12562,7 @@ class Room$1 extends Emitter {
12336
12562
  const participant = this._getParticipantFromCallId(status.callId);
12337
12563
 
12338
12564
  if (participant) {
12339
- // we're received, so no need to broadcast, hence the input false arg
12565
+ // we're receiving, so no need to broadcast
12340
12566
  participant.updateStatus(status, false);
12341
12567
  }
12342
12568
  break;
@@ -12603,7 +12829,7 @@ class SipRoom extends Room$1 {
12603
12829
  logger$2.info('connecting to sip room', { extension, audioOnly, room: !!room });
12604
12830
 
12605
12831
  if (!room) {
12606
- await Wazo.Phone.connect();
12832
+ await Wazo.Phone.connect({ media: constraints });
12607
12833
 
12608
12834
  const withCamera = constraints && !!constraints.video;
12609
12835