@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
package/lib/index.js CHANGED
@@ -2657,6 +2657,70 @@ class ExternalApp {
2657
2657
 
2658
2658
  //
2659
2659
 
2660
+ class MeetingAuthorization {
2661
+
2662
+
2663
+
2664
+
2665
+
2666
+
2667
+ constructor({
2668
+ meetingUuid,
2669
+ uuid,
2670
+ userUuid,
2671
+ userName,
2672
+ } = {}) {
2673
+ this.meetingUuid = meetingUuid;
2674
+ this.uuid = uuid;
2675
+ this.userUuid = userUuid;
2676
+ this.userName = userName;
2677
+ }
2678
+
2679
+ setStatus(status ) {
2680
+ this.status = status;
2681
+ }
2682
+
2683
+ getStatus() {
2684
+ return this.status;
2685
+ }
2686
+
2687
+ static parse(plain ) {
2688
+ const {
2689
+ meeting_uuid: meetingUuid,
2690
+ uuid,
2691
+ guest_uuid: userUuid,
2692
+ guest_name: userName,
2693
+ } = plain;
2694
+
2695
+ return new MeetingAuthorization({
2696
+ meetingUuid,
2697
+ uuid,
2698
+ userUuid,
2699
+ userName,
2700
+ });
2701
+ }
2702
+
2703
+ static parseMany(items ) {
2704
+ if (!items) {
2705
+ return [];
2706
+ }
2707
+ return items.map(MeetingAuthorization.parse);
2708
+ }
2709
+ }
2710
+
2711
+ //
2712
+
2713
+
2714
+
2715
+
2716
+
2717
+
2718
+
2719
+
2720
+
2721
+
2722
+
2723
+
2660
2724
 
2661
2725
 
2662
2726
 
@@ -2667,6 +2731,7 @@ class ExternalApp {
2667
2731
 
2668
2732
 
2669
2733
 
2734
+
2670
2735
 
2671
2736
 
2672
2737
  class Meeting {
@@ -2681,6 +2746,8 @@ class Meeting {
2681
2746
 
2682
2747
 
2683
2748
 
2749
+
2750
+
2684
2751
 
2685
2752
  static parse(plain ) {
2686
2753
  return new Meeting({
@@ -2693,6 +2760,7 @@ class Meeting {
2693
2760
  extension: plain.exten,
2694
2761
  persistent: plain.persistent,
2695
2762
  creationTime: moment__default['default'](plain.creation_time).toDate(),
2763
+ requireAuthorization: plain.require_authorization,
2696
2764
  });
2697
2765
  }
2698
2766
 
@@ -2717,6 +2785,7 @@ class Meeting {
2717
2785
  extension,
2718
2786
  persistent,
2719
2787
  creationTime,
2788
+ requireAuthorization,
2720
2789
  } = {}) {
2721
2790
  this.guestSipAuthorization = guestSipAuthorization;
2722
2791
  this.uri = uri;
@@ -2727,6 +2796,7 @@ class Meeting {
2727
2796
  this.extension = extension;
2728
2797
  this.persistent = persistent;
2729
2798
  this.creationTime = creationTime;
2799
+ this.requireAuthorization = requireAuthorization;
2730
2800
 
2731
2801
  // Useful to compare instead of instanceof with minified code
2732
2802
  this.type = 'Meeting';
@@ -2737,8 +2807,32 @@ class Meeting {
2737
2807
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
2738
2808
  return { username, secret };
2739
2809
  }
2810
+
2740
2811
  }
2741
2812
 
2813
+ //
2814
+
2815
+ const camelToUnderscore = (key ) => {
2816
+ if (typeof key !== 'string') {
2817
+ throw new Error('Input is not a string');
2818
+ }
2819
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
2820
+ };
2821
+
2822
+ //
2823
+
2824
+ const convertKeysFromCamelToUnderscore = (args ) => {
2825
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
2826
+ throw new Error('Input is not an object');
2827
+ }
2828
+
2829
+ return Object.keys(args).reduce((acc, key) => {
2830
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
2831
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
2832
+ return acc;
2833
+ }, {});
2834
+ };
2835
+
2742
2836
  /* */
2743
2837
 
2744
2838
  var confdMethods = (client , baseUrl ) => ({
@@ -2807,8 +2901,18 @@ var confdMethods = (client , baseUrl ) => ({
2807
2901
  getMyMeetings: () =>
2808
2902
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2809
2903
 
2810
- createMyMeeting: (name , persistent ) =>
2811
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2904
+ createMyMeeting: (args ) =>
2905
+ client
2906
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
2907
+ .then(Meeting.parse),
2908
+
2909
+ updateMyMeeting: (meetingUuid , data ) =>
2910
+ client.put(
2911
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
2912
+ convertKeysFromCamelToUnderscore(data),
2913
+ null,
2914
+ ApiRequester.successResponseParser,
2915
+ ),
2812
2916
 
2813
2917
  deleteMyMeeting: (meetingUuid ) =>
2814
2918
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2816,8 +2920,36 @@ var confdMethods = (client , baseUrl ) => ({
2816
2920
  getMeeting: (meetingUuid ) =>
2817
2921
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
2818
2922
 
2923
+ meetingAuthorizations: (meetingUuid ) =>
2924
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
2925
+
2926
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
2927
+ client.put(
2928
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
2929
+ {},
2930
+ null,
2931
+ ApiRequester.successResponseParser,
2932
+ ),
2933
+
2934
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
2935
+ client.put(
2936
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
2937
+ {},
2938
+ null,
2939
+ ApiRequester.successResponseParser,
2940
+ ),
2941
+
2819
2942
  guestGetMeeting: (meetingUuid ) =>
2820
2943
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
2944
+
2945
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
2946
+ client
2947
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
2948
+ .then(MeetingAuthorization.parse),
2949
+
2950
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
2951
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
2952
+
2821
2953
  });
2822
2954
 
2823
2955
  //
@@ -3083,6 +3215,7 @@ const RECORD_STATE_ACTIVE = 'active';
3083
3215
 
3084
3216
 
3085
3217
 
3218
+
3086
3219
 
3087
3220
 
3088
3221
 
@@ -3093,6 +3226,7 @@ const RECORD_STATE_ACTIVE = 'active';
3093
3226
 
3094
3227
 
3095
3228
 
3229
+
3096
3230
 
3097
3231
 
3098
3232
 
@@ -3121,6 +3255,7 @@ class Call {
3121
3255
 
3122
3256
 
3123
3257
 
3258
+
3124
3259
 
3125
3260
 
3126
3261
 
@@ -3145,6 +3280,7 @@ class Call {
3145
3280
  calleeNumber: plain.peer_caller_id_number,
3146
3281
  dialedExtension: plain.dialed_extension,
3147
3282
  isCaller: plain.is_caller,
3283
+ isVideo: plain.is_video,
3148
3284
  muted: plain.muted,
3149
3285
  onHold: plain.on_hold,
3150
3286
  status: plain.status,
@@ -3168,6 +3304,7 @@ class Call {
3168
3304
  calleeNumber,
3169
3305
  dialedExtension,
3170
3306
  isCaller,
3307
+ isVideo,
3171
3308
  lineId,
3172
3309
  muted,
3173
3310
  onHold,
@@ -3191,6 +3328,7 @@ class Call {
3191
3328
  this.startingTime = startingTime;
3192
3329
  this.talkingToIds = talkingToIds || [];
3193
3330
  this.recording = recording;
3331
+ this.isVideo = !!isVideo;
3194
3332
 
3195
3333
  // Useful to compare instead of instanceof with minified code
3196
3334
  this.type = 'Call';
@@ -3664,7 +3802,7 @@ class CallSession {
3664
3802
  ringing: call.isRinging(),
3665
3803
  answered: call.isUp(),
3666
3804
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
3667
- cameraEnabled: false,
3805
+ cameraEnabled: call.isVideo,
3668
3806
  dialedExtension: call.dialedExtension,
3669
3807
  call,
3670
3808
  conference: false, // @FIXME?
@@ -5163,6 +5301,14 @@ var calldMethods = (client , baseUrl ) => ({
5163
5301
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
5164
5302
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
5165
5303
 
5304
+ banMeetingParticipant: (meetingUuid , participantUuid ) =>
5305
+ client.delete(
5306
+ `${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
5307
+ null,
5308
+ null,
5309
+ ApiRequester.successResponseParser,
5310
+ ),
5311
+
5166
5312
  listTrunks: () => client.get(`${baseUrl}/trunks`),
5167
5313
 
5168
5314
  mute: (callId ) =>
@@ -5730,6 +5876,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
5730
5876
  return fixed;
5731
5877
  };
5732
5878
 
5879
+ const addIcesInAllBundles = (sdp ) => {
5880
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5881
+
5882
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
5883
+ if (!mediaWithCandidate) {
5884
+ return sdp;
5885
+ }
5886
+
5887
+ const { candidates } = mediaWithCandidate;
5888
+
5889
+ parsedSdp.media = parsedSdp.media.map(media => ({
5890
+ ...media,
5891
+ candidates: media.candidates || candidates,
5892
+ }));
5893
+
5894
+ return sdpParser__default['default'].write(parsedSdp);
5895
+ };
5896
+
5733
5897
  /* global RTCSessionDescriptionInit, navigator */
5734
5898
 
5735
5899
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -5859,7 +6023,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
5859
6023
 
5860
6024
  // Check if we got ICEs
5861
6025
  if (sdp.indexOf('a=candidate') !== -1) {
5862
- return description;
6026
+ return {
6027
+ type: description.type,
6028
+ sdp: addIcesInAllBundles(sdp),
6029
+ };
5863
6030
  }
5864
6031
 
5865
6032
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7319,41 +7486,58 @@ class WebRTCClient extends Emitter {
7319
7486
  });
7320
7487
  }
7321
7488
 
7322
- changeAudioInputDevice(id , session ) {
7489
+ async changeAudioInputDevice(id , session , force ) {
7323
7490
  const currentId = this.getAudioDeviceId();
7324
7491
  logger$9.info('setting audio input device', { id, currentId, session: !!session });
7325
7492
 
7326
- if (id === currentId) {
7493
+ if (!force && id === currentId) {
7327
7494
  return null;
7328
7495
  }
7329
7496
 
7497
+ // in order to handle an audio track change for default devices
7498
+ // we need the actual id of the device (not 'default')
7499
+ let deviceId = id;
7500
+ if (id === 'default' && navigator.mediaDevices) {
7501
+ const devices = await navigator.mediaDevices.enumerateDevices();
7502
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
7503
+ if (defaultDevice) {
7504
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
7505
+ const targetDevice = devices.find(device => device.label === deviceLabel);
7506
+ if (targetDevice) {
7507
+ deviceId = targetDevice.deviceId;
7508
+ if (!force && deviceId === currentId) {
7509
+ return null;
7510
+ }
7511
+ }
7512
+ }
7513
+ }
7514
+
7330
7515
  // let's update the local audio value
7331
7516
  if (this.audio) {
7332
7517
  this.audio = {
7333
7518
  deviceId: {
7334
- exact: id,
7519
+ exact: deviceId,
7335
7520
  },
7336
7521
  };
7337
7522
  }
7338
7523
 
7339
- if (session) {
7524
+ if (session && navigator.mediaDevices) {
7340
7525
  const sdh = session.sessionDescriptionHandler;
7341
7526
  const pc = sdh.peerConnection;
7342
7527
 
7343
- // $FlowFixMe
7344
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7345
- const audioTrack = stream.getAudioTracks()[0];
7346
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7528
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
7529
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
7530
+ const audioTrack = stream.getAudioTracks()[0];
7531
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7347
7532
 
7348
- if (sender) {
7349
- if (sender.track) {
7350
- audioTrack.enabled = sender.track.enabled;
7351
- }
7352
- sender.replaceTrack(audioTrack);
7533
+ if (sender) {
7534
+ if (sender.track) {
7535
+ audioTrack.enabled = sender.track.enabled;
7353
7536
  }
7537
+ sender.replaceTrack(audioTrack);
7538
+ }
7354
7539
 
7355
- return stream;
7356
- });
7540
+ return stream;
7357
7541
  }
7358
7542
  }
7359
7543
 
@@ -7373,14 +7557,14 @@ class WebRTCClient extends Emitter {
7373
7557
  return null;
7374
7558
  }
7375
7559
 
7376
- // let's update the local video value
7377
- if (this.video) {
7378
- this.video = {
7379
- deviceId: {
7380
- exact: id,
7381
- },
7382
- };
7383
- }
7560
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
7561
+ const videoObject = typeof this.video === 'object' ? this.video : {};
7562
+ this.video = {
7563
+ ...videoObject,
7564
+ deviceId: {
7565
+ exact: id,
7566
+ },
7567
+ };
7384
7568
  }
7385
7569
 
7386
7570
  changeSessionVideoInputDevice(id , session ) {
@@ -8553,6 +8737,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
8553
8737
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
8554
8738
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
8555
8739
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
8740
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
8556
8741
 
8557
8742
  const BLACKLIST_EVENTS = [
8558
8743
  CHAT_MESSAGE_SENT,
@@ -8904,6 +9089,7 @@ WebSocketClient.eventLists = [
8904
9089
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
8905
9090
  CONFERENCE_ADHOC_DELETED,
8906
9091
  MEETING_USER_PROGRESS,
9092
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
8907
9093
  ];
8908
9094
 
8909
9095
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -8975,6 +9161,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
8975
9161
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
8976
9162
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
8977
9163
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
9164
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
8978
9165
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
8979
9166
  'default': WebSocketClient
8980
9167
  });
@@ -10020,10 +10207,10 @@ class WebRTCPhone extends Emitter {
10020
10207
  this.audioRingVolume = volume;
10021
10208
  }
10022
10209
 
10023
- changeAudioInputDevice(id ) {
10210
+ changeAudioInputDevice(id , force ) {
10024
10211
  logger$7.info('WebRTC phone - changeAudio input device', { deviceId: id });
10025
10212
 
10026
- return this.client.changeAudioInputDevice(id, this.currentSipSession);
10213
+ return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
10027
10214
  }
10028
10215
 
10029
10216
  changeVideoInputDevice(id ) {
@@ -12755,6 +12942,7 @@ class Participant extends Emitter {
12755
12942
 
12756
12943
 
12757
12944
 
12945
+
12758
12946
 
12759
12947
 
12760
12948
 
@@ -12772,6 +12960,7 @@ class Participant extends Emitter {
12772
12960
 
12773
12961
 
12774
12962
 
12963
+
12775
12964
 
12776
12965
  /**
12777
12966
  * @param room Room The room where the participant is
@@ -12795,6 +12984,7 @@ class Participant extends Emitter {
12795
12984
  this.screensharing = false;
12796
12985
  this.isOnHold = false;
12797
12986
  this.extra = extra;
12987
+ this.banned = false;
12798
12988
 
12799
12989
  this.ON_UPDATED = 'participant/ON_UPDATED';
12800
12990
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -12811,6 +13001,7 @@ class Participant extends Emitter {
12811
13001
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
12812
13002
  this.ON_HOLD = 'participant/ON_HOLD';
12813
13003
  this.ON_RESUME = 'participant/ON_RESUME';
13004
+ this.ON_BAN = 'participant/ON_BAN';
12814
13005
  }
12815
13006
 
12816
13007
  triggerEvent(name , ...args ) {
@@ -12851,6 +13042,10 @@ class Participant extends Emitter {
12851
13042
  status.extra = this.extra;
12852
13043
  break;
12853
13044
  }
13045
+ case this.ON_BAN: {
13046
+ status.banned = true;
13047
+ break;
13048
+ }
12854
13049
  }
12855
13050
 
12856
13051
  if (broadcast) {
@@ -12953,6 +13148,11 @@ class Participant extends Emitter {
12953
13148
  this.triggerUpdate(this.ON_RESUME, broadcast);
12954
13149
  }
12955
13150
 
13151
+ onBan(broadcast = true) {
13152
+ this.banned = true;
13153
+ this.triggerUpdate(this.ON_BAN, broadcast);
13154
+ }
13155
+
12956
13156
  getStatus() {
12957
13157
  return {
12958
13158
  callId: this.callId,
@@ -12999,6 +13199,10 @@ class Participant extends Emitter {
12999
13199
  }
13000
13200
  }
13001
13201
 
13202
+ if (status.banned) {
13203
+ this.onBan(false);
13204
+ }
13205
+
13002
13206
  // Poor man's object comparison
13003
13207
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
13004
13208
  this.extra = { ...this.extra, ...status.extra };
@@ -13026,6 +13230,28 @@ class Participant extends Emitter {
13026
13230
  this.streams = streams;
13027
13231
  this.videoStreams = streams;
13028
13232
  }
13233
+
13234
+ async ban(apiRequestDelay = null) {
13235
+ const { meetingUuid } = this.room;
13236
+ if (!meetingUuid) {
13237
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
13238
+ }
13239
+
13240
+ // this notifies all that someone is being banned
13241
+ this.onBan(true);
13242
+
13243
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
13244
+ if (apiRequestDelay) {
13245
+ await this.delay(apiRequestDelay);
13246
+ }
13247
+
13248
+ // proceed with the actual kick
13249
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
13250
+ }
13251
+
13252
+ async delay(ms ) {
13253
+ return new Promise(resolve => setTimeout(resolve, ms));
13254
+ }
13029
13255
  }
13030
13256
 
13031
13257
  //
@@ -13178,7 +13404,7 @@ class Room extends Emitter {
13178
13404
  logger$1.info('connecting to room', { extension, audioOnly, room: !!room });
13179
13405
 
13180
13406
  if (!room) {
13181
- await Wazo.Phone.connect();
13407
+ await Wazo.Phone.connect({ media: constraints });
13182
13408
 
13183
13409
  const withCamera = constraints && !!constraints.video;
13184
13410
 
@@ -13623,7 +13849,7 @@ class Room extends Emitter {
13623
13849
  const participant = this._getParticipantFromCallId(status.callId);
13624
13850
 
13625
13851
  if (participant) {
13626
- // we're received, so no need to broadcast, hence the input false arg
13852
+ // we're receiving, so no need to broadcast
13627
13853
  participant.updateStatus(status, false);
13628
13854
  }
13629
13855
  break;
@@ -13890,7 +14116,7 @@ class SipRoom extends Room {
13890
14116
  logger.info('connecting to sip room', { extension, audioOnly, room: !!room });
13891
14117
 
13892
14118
  if (!room) {
13893
- await Wazo.Phone.connect();
14119
+ await Wazo.Phone.connect({ media: constraints });
13894
14120
 
13895
14121
  const withCamera = constraints && !!constraints.video;
13896
14122
 
@@ -452,6 +452,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
452
452
  return fixed;
453
453
  };
454
454
 
455
+ const addIcesInAllBundles = (sdp ) => {
456
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
457
+
458
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
459
+ if (!mediaWithCandidate) {
460
+ return sdp;
461
+ }
462
+
463
+ const { candidates } = mediaWithCandidate;
464
+
465
+ parsedSdp.media = parsedSdp.media.map(media => ({
466
+ ...media,
467
+ candidates: media.candidates || candidates,
468
+ }));
469
+
470
+ return sdpParser__default['default'].write(parsedSdp);
471
+ };
472
+
455
473
  /* global RTCSessionDescriptionInit, navigator */
456
474
 
457
475
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -581,7 +599,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
581
599
 
582
600
  // Check if we got ICEs
583
601
  if (sdp.indexOf('a=candidate') !== -1) {
584
- return description;
602
+ return {
603
+ type: description.type,
604
+ sdp: addIcesInAllBundles(sdp),
605
+ };
585
606
  }
586
607
 
587
608
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);