@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/esm/index.js CHANGED
@@ -2646,6 +2646,70 @@ class ExternalApp {
2646
2646
 
2647
2647
  //
2648
2648
 
2649
+ class MeetingAuthorization {
2650
+
2651
+
2652
+
2653
+
2654
+
2655
+
2656
+ constructor({
2657
+ meetingUuid,
2658
+ uuid,
2659
+ userUuid,
2660
+ userName,
2661
+ } = {}) {
2662
+ this.meetingUuid = meetingUuid;
2663
+ this.uuid = uuid;
2664
+ this.userUuid = userUuid;
2665
+ this.userName = userName;
2666
+ }
2667
+
2668
+ setStatus(status ) {
2669
+ this.status = status;
2670
+ }
2671
+
2672
+ getStatus() {
2673
+ return this.status;
2674
+ }
2675
+
2676
+ static parse(plain ) {
2677
+ const {
2678
+ meeting_uuid: meetingUuid,
2679
+ uuid,
2680
+ guest_uuid: userUuid,
2681
+ guest_name: userName,
2682
+ } = plain;
2683
+
2684
+ return new MeetingAuthorization({
2685
+ meetingUuid,
2686
+ uuid,
2687
+ userUuid,
2688
+ userName,
2689
+ });
2690
+ }
2691
+
2692
+ static parseMany(items ) {
2693
+ if (!items) {
2694
+ return [];
2695
+ }
2696
+ return items.map(MeetingAuthorization.parse);
2697
+ }
2698
+ }
2699
+
2700
+ //
2701
+
2702
+
2703
+
2704
+
2705
+
2706
+
2707
+
2708
+
2709
+
2710
+
2711
+
2712
+
2649
2713
 
2650
2714
 
2651
2715
 
@@ -2656,6 +2720,7 @@ class ExternalApp {
2656
2720
 
2657
2721
 
2658
2722
 
2723
+
2659
2724
 
2660
2725
 
2661
2726
  class Meeting {
@@ -2670,6 +2735,8 @@ class Meeting {
2670
2735
 
2671
2736
 
2672
2737
 
2738
+
2739
+
2673
2740
 
2674
2741
  static parse(plain ) {
2675
2742
  return new Meeting({
@@ -2682,6 +2749,7 @@ class Meeting {
2682
2749
  extension: plain.exten,
2683
2750
  persistent: plain.persistent,
2684
2751
  creationTime: moment(plain.creation_time).toDate(),
2752
+ requireAuthorization: plain.require_authorization,
2685
2753
  });
2686
2754
  }
2687
2755
 
@@ -2706,6 +2774,7 @@ class Meeting {
2706
2774
  extension,
2707
2775
  persistent,
2708
2776
  creationTime,
2777
+ requireAuthorization,
2709
2778
  } = {}) {
2710
2779
  this.guestSipAuthorization = guestSipAuthorization;
2711
2780
  this.uri = uri;
@@ -2716,6 +2785,7 @@ class Meeting {
2716
2785
  this.extension = extension;
2717
2786
  this.persistent = persistent;
2718
2787
  this.creationTime = creationTime;
2788
+ this.requireAuthorization = requireAuthorization;
2719
2789
 
2720
2790
  // Useful to compare instead of instanceof with minified code
2721
2791
  this.type = 'Meeting';
@@ -2726,8 +2796,32 @@ class Meeting {
2726
2796
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
2727
2797
  return { username, secret };
2728
2798
  }
2799
+
2729
2800
  }
2730
2801
 
2802
+ //
2803
+
2804
+ const camelToUnderscore = (key ) => {
2805
+ if (typeof key !== 'string') {
2806
+ throw new Error('Input is not a string');
2807
+ }
2808
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
2809
+ };
2810
+
2811
+ //
2812
+
2813
+ const convertKeysFromCamelToUnderscore = (args ) => {
2814
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
2815
+ throw new Error('Input is not an object');
2816
+ }
2817
+
2818
+ return Object.keys(args).reduce((acc, key) => {
2819
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
2820
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
2821
+ return acc;
2822
+ }, {});
2823
+ };
2824
+
2731
2825
  /* */
2732
2826
 
2733
2827
  var confdMethods = (client , baseUrl ) => ({
@@ -2796,8 +2890,18 @@ var confdMethods = (client , baseUrl ) => ({
2796
2890
  getMyMeetings: () =>
2797
2891
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2798
2892
 
2799
- createMyMeeting: (name , persistent ) =>
2800
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2893
+ createMyMeeting: (args ) =>
2894
+ client
2895
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
2896
+ .then(Meeting.parse),
2897
+
2898
+ updateMyMeeting: (meetingUuid , data ) =>
2899
+ client.put(
2900
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
2901
+ convertKeysFromCamelToUnderscore(data),
2902
+ null,
2903
+ ApiRequester.successResponseParser,
2904
+ ),
2801
2905
 
2802
2906
  deleteMyMeeting: (meetingUuid ) =>
2803
2907
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2805,8 +2909,36 @@ var confdMethods = (client , baseUrl ) => ({
2805
2909
  getMeeting: (meetingUuid ) =>
2806
2910
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
2807
2911
 
2912
+ meetingAuthorizations: (meetingUuid ) =>
2913
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
2914
+
2915
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
2916
+ client.put(
2917
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
2918
+ {},
2919
+ null,
2920
+ ApiRequester.successResponseParser,
2921
+ ),
2922
+
2923
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
2924
+ client.put(
2925
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
2926
+ {},
2927
+ null,
2928
+ ApiRequester.successResponseParser,
2929
+ ),
2930
+
2808
2931
  guestGetMeeting: (meetingUuid ) =>
2809
2932
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
2933
+
2934
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
2935
+ client
2936
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
2937
+ .then(MeetingAuthorization.parse),
2938
+
2939
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
2940
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
2941
+
2810
2942
  });
2811
2943
 
2812
2944
  //
@@ -3072,6 +3204,7 @@ const RECORD_STATE_ACTIVE = 'active';
3072
3204
 
3073
3205
 
3074
3206
 
3207
+
3075
3208
 
3076
3209
 
3077
3210
 
@@ -3082,6 +3215,7 @@ const RECORD_STATE_ACTIVE = 'active';
3082
3215
 
3083
3216
 
3084
3217
 
3218
+
3085
3219
 
3086
3220
 
3087
3221
 
@@ -3110,6 +3244,7 @@ class Call {
3110
3244
 
3111
3245
 
3112
3246
 
3247
+
3113
3248
 
3114
3249
 
3115
3250
 
@@ -3134,6 +3269,7 @@ class Call {
3134
3269
  calleeNumber: plain.peer_caller_id_number,
3135
3270
  dialedExtension: plain.dialed_extension,
3136
3271
  isCaller: plain.is_caller,
3272
+ isVideo: plain.is_video,
3137
3273
  muted: plain.muted,
3138
3274
  onHold: plain.on_hold,
3139
3275
  status: plain.status,
@@ -3157,6 +3293,7 @@ class Call {
3157
3293
  calleeNumber,
3158
3294
  dialedExtension,
3159
3295
  isCaller,
3296
+ isVideo,
3160
3297
  lineId,
3161
3298
  muted,
3162
3299
  onHold,
@@ -3180,6 +3317,7 @@ class Call {
3180
3317
  this.startingTime = startingTime;
3181
3318
  this.talkingToIds = talkingToIds || [];
3182
3319
  this.recording = recording;
3320
+ this.isVideo = !!isVideo;
3183
3321
 
3184
3322
  // Useful to compare instead of instanceof with minified code
3185
3323
  this.type = 'Call';
@@ -3653,7 +3791,7 @@ class CallSession {
3653
3791
  ringing: call.isRinging(),
3654
3792
  answered: call.isUp(),
3655
3793
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
3656
- cameraEnabled: false,
3794
+ cameraEnabled: call.isVideo,
3657
3795
  dialedExtension: call.dialedExtension,
3658
3796
  call,
3659
3797
  conference: false, // @FIXME?
@@ -5152,6 +5290,14 @@ var calldMethods = (client , baseUrl ) => ({
5152
5290
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
5153
5291
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
5154
5292
 
5293
+ banMeetingParticipant: (meetingUuid , participantUuid ) =>
5294
+ client.delete(
5295
+ `${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
5296
+ null,
5297
+ null,
5298
+ ApiRequester.successResponseParser,
5299
+ ),
5300
+
5155
5301
  listTrunks: () => client.get(`${baseUrl}/trunks`),
5156
5302
 
5157
5303
  mute: (callId ) =>
@@ -5719,6 +5865,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
5719
5865
  return fixed;
5720
5866
  };
5721
5867
 
5868
+ const addIcesInAllBundles = (sdp ) => {
5869
+ const parsedSdp = sdpParser.parse(sdp);
5870
+
5871
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
5872
+ if (!mediaWithCandidate) {
5873
+ return sdp;
5874
+ }
5875
+
5876
+ const { candidates } = mediaWithCandidate;
5877
+
5878
+ parsedSdp.media = parsedSdp.media.map(media => ({
5879
+ ...media,
5880
+ candidates: media.candidates || candidates,
5881
+ }));
5882
+
5883
+ return sdpParser.write(parsedSdp);
5884
+ };
5885
+
5722
5886
  /* global RTCSessionDescriptionInit, navigator */
5723
5887
 
5724
5888
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -5848,7 +6012,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
5848
6012
 
5849
6013
  // Check if we got ICEs
5850
6014
  if (sdp.indexOf('a=candidate') !== -1) {
5851
- return description;
6015
+ return {
6016
+ type: description.type,
6017
+ sdp: addIcesInAllBundles(sdp),
6018
+ };
5852
6019
  }
5853
6020
 
5854
6021
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7308,41 +7475,58 @@ class WebRTCClient extends Emitter {
7308
7475
  });
7309
7476
  }
7310
7477
 
7311
- changeAudioInputDevice(id , session ) {
7478
+ async changeAudioInputDevice(id , session , force ) {
7312
7479
  const currentId = this.getAudioDeviceId();
7313
7480
  logger$9.info('setting audio input device', { id, currentId, session: !!session });
7314
7481
 
7315
- if (id === currentId) {
7482
+ if (!force && id === currentId) {
7316
7483
  return null;
7317
7484
  }
7318
7485
 
7486
+ // in order to handle an audio track change for default devices
7487
+ // we need the actual id of the device (not 'default')
7488
+ let deviceId = id;
7489
+ if (id === 'default' && navigator.mediaDevices) {
7490
+ const devices = await navigator.mediaDevices.enumerateDevices();
7491
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
7492
+ if (defaultDevice) {
7493
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
7494
+ const targetDevice = devices.find(device => device.label === deviceLabel);
7495
+ if (targetDevice) {
7496
+ deviceId = targetDevice.deviceId;
7497
+ if (!force && deviceId === currentId) {
7498
+ return null;
7499
+ }
7500
+ }
7501
+ }
7502
+ }
7503
+
7319
7504
  // let's update the local audio value
7320
7505
  if (this.audio) {
7321
7506
  this.audio = {
7322
7507
  deviceId: {
7323
- exact: id,
7508
+ exact: deviceId,
7324
7509
  },
7325
7510
  };
7326
7511
  }
7327
7512
 
7328
- if (session) {
7513
+ if (session && navigator.mediaDevices) {
7329
7514
  const sdh = session.sessionDescriptionHandler;
7330
7515
  const pc = sdh.peerConnection;
7331
7516
 
7332
- // $FlowFixMe
7333
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7334
- const audioTrack = stream.getAudioTracks()[0];
7335
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7517
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
7518
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
7519
+ const audioTrack = stream.getAudioTracks()[0];
7520
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7336
7521
 
7337
- if (sender) {
7338
- if (sender.track) {
7339
- audioTrack.enabled = sender.track.enabled;
7340
- }
7341
- sender.replaceTrack(audioTrack);
7522
+ if (sender) {
7523
+ if (sender.track) {
7524
+ audioTrack.enabled = sender.track.enabled;
7342
7525
  }
7526
+ sender.replaceTrack(audioTrack);
7527
+ }
7343
7528
 
7344
- return stream;
7345
- });
7529
+ return stream;
7346
7530
  }
7347
7531
  }
7348
7532
 
@@ -7362,14 +7546,14 @@ class WebRTCClient extends Emitter {
7362
7546
  return null;
7363
7547
  }
7364
7548
 
7365
- // let's update the local video value
7366
- if (this.video) {
7367
- this.video = {
7368
- deviceId: {
7369
- exact: id,
7370
- },
7371
- };
7372
- }
7549
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
7550
+ const videoObject = typeof this.video === 'object' ? this.video : {};
7551
+ this.video = {
7552
+ ...videoObject,
7553
+ deviceId: {
7554
+ exact: id,
7555
+ },
7556
+ };
7373
7557
  }
7374
7558
 
7375
7559
  changeSessionVideoInputDevice(id , session ) {
@@ -8542,6 +8726,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
8542
8726
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
8543
8727
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
8544
8728
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
8729
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
8545
8730
 
8546
8731
  const BLACKLIST_EVENTS = [
8547
8732
  CHAT_MESSAGE_SENT,
@@ -8893,6 +9078,7 @@ WebSocketClient.eventLists = [
8893
9078
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
8894
9079
  CONFERENCE_ADHOC_DELETED,
8895
9080
  MEETING_USER_PROGRESS,
9081
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
8896
9082
  ];
8897
9083
 
8898
9084
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -8964,6 +9150,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
8964
9150
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
8965
9151
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
8966
9152
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
9153
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
8967
9154
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
8968
9155
  'default': WebSocketClient
8969
9156
  });
@@ -10009,10 +10196,10 @@ class WebRTCPhone extends Emitter {
10009
10196
  this.audioRingVolume = volume;
10010
10197
  }
10011
10198
 
10012
- changeAudioInputDevice(id ) {
10199
+ changeAudioInputDevice(id , force ) {
10013
10200
  logger$7.info('WebRTC phone - changeAudio input device', { deviceId: id });
10014
10201
 
10015
- return this.client.changeAudioInputDevice(id, this.currentSipSession);
10202
+ return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
10016
10203
  }
10017
10204
 
10018
10205
  changeVideoInputDevice(id ) {
@@ -12744,6 +12931,7 @@ class Participant extends Emitter {
12744
12931
 
12745
12932
 
12746
12933
 
12934
+
12747
12935
 
12748
12936
 
12749
12937
 
@@ -12761,6 +12949,7 @@ class Participant extends Emitter {
12761
12949
 
12762
12950
 
12763
12951
 
12952
+
12764
12953
 
12765
12954
  /**
12766
12955
  * @param room Room The room where the participant is
@@ -12784,6 +12973,7 @@ class Participant extends Emitter {
12784
12973
  this.screensharing = false;
12785
12974
  this.isOnHold = false;
12786
12975
  this.extra = extra;
12976
+ this.banned = false;
12787
12977
 
12788
12978
  this.ON_UPDATED = 'participant/ON_UPDATED';
12789
12979
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -12800,6 +12990,7 @@ class Participant extends Emitter {
12800
12990
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
12801
12991
  this.ON_HOLD = 'participant/ON_HOLD';
12802
12992
  this.ON_RESUME = 'participant/ON_RESUME';
12993
+ this.ON_BAN = 'participant/ON_BAN';
12803
12994
  }
12804
12995
 
12805
12996
  triggerEvent(name , ...args ) {
@@ -12840,6 +13031,10 @@ class Participant extends Emitter {
12840
13031
  status.extra = this.extra;
12841
13032
  break;
12842
13033
  }
13034
+ case this.ON_BAN: {
13035
+ status.banned = true;
13036
+ break;
13037
+ }
12843
13038
  }
12844
13039
 
12845
13040
  if (broadcast) {
@@ -12942,6 +13137,11 @@ class Participant extends Emitter {
12942
13137
  this.triggerUpdate(this.ON_RESUME, broadcast);
12943
13138
  }
12944
13139
 
13140
+ onBan(broadcast = true) {
13141
+ this.banned = true;
13142
+ this.triggerUpdate(this.ON_BAN, broadcast);
13143
+ }
13144
+
12945
13145
  getStatus() {
12946
13146
  return {
12947
13147
  callId: this.callId,
@@ -12988,6 +13188,10 @@ class Participant extends Emitter {
12988
13188
  }
12989
13189
  }
12990
13190
 
13191
+ if (status.banned) {
13192
+ this.onBan(false);
13193
+ }
13194
+
12991
13195
  // Poor man's object comparison
12992
13196
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
12993
13197
  this.extra = { ...this.extra, ...status.extra };
@@ -13015,6 +13219,28 @@ class Participant extends Emitter {
13015
13219
  this.streams = streams;
13016
13220
  this.videoStreams = streams;
13017
13221
  }
13222
+
13223
+ async ban(apiRequestDelay = null) {
13224
+ const { meetingUuid } = this.room;
13225
+ if (!meetingUuid) {
13226
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
13227
+ }
13228
+
13229
+ // this notifies all that someone is being banned
13230
+ this.onBan(true);
13231
+
13232
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
13233
+ if (apiRequestDelay) {
13234
+ await this.delay(apiRequestDelay);
13235
+ }
13236
+
13237
+ // proceed with the actual kick
13238
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
13239
+ }
13240
+
13241
+ async delay(ms ) {
13242
+ return new Promise(resolve => setTimeout(resolve, ms));
13243
+ }
13018
13244
  }
13019
13245
 
13020
13246
  //
@@ -13167,7 +13393,7 @@ class Room extends Emitter {
13167
13393
  logger$1.info('connecting to room', { extension, audioOnly, room: !!room });
13168
13394
 
13169
13395
  if (!room) {
13170
- await Wazo.Phone.connect();
13396
+ await Wazo.Phone.connect({ media: constraints });
13171
13397
 
13172
13398
  const withCamera = constraints && !!constraints.video;
13173
13399
 
@@ -13612,7 +13838,7 @@ class Room extends Emitter {
13612
13838
  const participant = this._getParticipantFromCallId(status.callId);
13613
13839
 
13614
13840
  if (participant) {
13615
- // we're received, so no need to broadcast, hence the input false arg
13841
+ // we're receiving, so no need to broadcast
13616
13842
  participant.updateStatus(status, false);
13617
13843
  }
13618
13844
  break;
@@ -13879,7 +14105,7 @@ class SipRoom extends Room {
13879
14105
  logger.info('connecting to sip room', { extension, audioOnly, room: !!room });
13880
14106
 
13881
14107
  if (!room) {
13882
- await Wazo.Phone.connect();
14108
+ await Wazo.Phone.connect({ media: constraints });
13883
14109
 
13884
14110
  const withCamera = constraints && !!constraints.video;
13885
14111
 
@@ -442,6 +442,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
442
442
  return fixed;
443
443
  };
444
444
 
445
+ const addIcesInAllBundles = (sdp ) => {
446
+ const parsedSdp = sdpParser.parse(sdp);
447
+
448
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
449
+ if (!mediaWithCandidate) {
450
+ return sdp;
451
+ }
452
+
453
+ const { candidates } = mediaWithCandidate;
454
+
455
+ parsedSdp.media = parsedSdp.media.map(media => ({
456
+ ...media,
457
+ candidates: media.candidates || candidates,
458
+ }));
459
+
460
+ return sdpParser.write(parsedSdp);
461
+ };
462
+
445
463
  /* global RTCSessionDescriptionInit, navigator */
446
464
 
447
465
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -571,7 +589,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
571
589
 
572
590
  // Check if we got ICEs
573
591
  if (sdp.indexOf('a=candidate') !== -1) {
574
- return description;
592
+ return {
593
+ type: description.type,
594
+ sdp: addIcesInAllBundles(sdp),
595
+ };
575
596
  }
576
597
 
577
598
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);