@wazo/sdk 0.38.6 → 0.38.9

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 (118) hide show
  1. package/dist/wazo-sdk.js +2 -2
  2. package/esm/__tests__/api-client.test.js +142 -2
  3. package/esm/__tests__/web-rtc-client.test.js +249 -28
  4. package/esm/api/calld.js +8 -0
  5. package/esm/api/confd.js +134 -2
  6. package/esm/api-client.js +142 -2
  7. package/esm/checker/Checker.js +205 -25
  8. package/esm/checker/checks/aor.js +142 -2
  9. package/esm/checker/checks/api.js +142 -2
  10. package/esm/checker/checks/index.js +205 -25
  11. package/esm/checker/checks/wazo-websocket.js +2 -0
  12. package/esm/checker/checks/webrtc-transport.js +203 -25
  13. package/esm/checker/checks/webrtc.js +203 -25
  14. package/esm/domain/AdHocAPIConference.js +142 -2
  15. package/esm/domain/Features.js +142 -2
  16. package/esm/domain/Meeting.js +18 -0
  17. package/esm/domain/MeetingAuthorization.js +70 -0
  18. package/esm/domain/Phone/CTIPhone.js +142 -2
  19. package/esm/domain/Phone/WebRTCPhone.js +1 -3
  20. package/esm/domain/__tests__/Meeting.test.js +87 -1
  21. package/esm/domain/__tests__/MeetingAuthorization.test.js +109 -0
  22. package/esm/index.js +249 -31
  23. package/esm/lib/WazoSessionDescriptionHandler.js +22 -1
  24. package/esm/service/CallApi.js +142 -2
  25. package/esm/service/getApiClient.js +142 -2
  26. package/esm/simple/Auth.js +249 -31
  27. package/esm/simple/Configuration.js +249 -31
  28. package/esm/simple/Directory.js +142 -2
  29. package/esm/simple/Phone.js +249 -31
  30. package/esm/simple/Websocket.js +3 -0
  31. package/esm/simple/index.js +249 -31
  32. package/esm/simple/room/LocalParticipant.js +249 -31
  33. package/esm/simple/room/Participant.js +249 -31
  34. package/esm/simple/room/RemoteParticipant.js +249 -31
  35. package/esm/simple/room/Room.js +249 -31
  36. package/esm/simple/room/SipRoom.js +249 -31
  37. package/esm/simple/room/Stream.js +249 -31
  38. package/esm/simple/room/__tests__/Participant.test.js +14745 -0
  39. package/esm/simple/room/__tests__/RemoteParticipant.test.js +249 -31
  40. package/esm/simple/utils.js +249 -31
  41. package/esm/utils/__tests__/object.test.js +57 -0
  42. package/esm/utils/__tests__/sdp.test.js +50 -0
  43. package/esm/utils/__tests__/string.test.js +30 -0
  44. package/esm/utils/object.js +24 -0
  45. package/esm/utils/sdp.js +19 -1
  46. package/esm/utils/string.js +10 -0
  47. package/esm/web-rtc-client.js +203 -25
  48. package/esm/websocket-client.js +3 -1
  49. package/lib/__tests__/api-client.test.js +142 -2
  50. package/lib/__tests__/web-rtc-client.test.js +249 -28
  51. package/lib/api/calld.js +8 -0
  52. package/lib/api/confd.js +134 -2
  53. package/lib/api-client.js +142 -2
  54. package/lib/checker/Checker.js +205 -25
  55. package/lib/checker/checks/aor.js +142 -2
  56. package/lib/checker/checks/api.js +142 -2
  57. package/lib/checker/checks/index.js +205 -25
  58. package/lib/checker/checks/wazo-websocket.js +2 -0
  59. package/lib/checker/checks/webrtc-transport.js +203 -25
  60. package/lib/checker/checks/webrtc.js +203 -25
  61. package/lib/domain/AdHocAPIConference.js +142 -2
  62. package/lib/domain/Features.js +142 -2
  63. package/lib/domain/Meeting.js +18 -0
  64. package/lib/domain/MeetingAuthorization.js +79 -0
  65. package/lib/domain/Phone/CTIPhone.js +142 -2
  66. package/lib/domain/Phone/WebRTCPhone.js +1 -3
  67. package/lib/domain/__tests__/Meeting.test.js +87 -1
  68. package/lib/domain/__tests__/MeetingAuthorization.test.js +111 -0
  69. package/lib/index.js +249 -31
  70. package/lib/lib/WazoSessionDescriptionHandler.js +22 -1
  71. package/lib/service/CallApi.js +142 -2
  72. package/lib/service/getApiClient.js +142 -2
  73. package/lib/simple/Auth.js +249 -31
  74. package/lib/simple/Configuration.js +249 -31
  75. package/lib/simple/Directory.js +142 -2
  76. package/lib/simple/Phone.js +249 -31
  77. package/lib/simple/Websocket.js +3 -0
  78. package/lib/simple/index.js +249 -31
  79. package/lib/simple/room/LocalParticipant.js +249 -31
  80. package/lib/simple/room/Participant.js +249 -31
  81. package/lib/simple/room/RemoteParticipant.js +249 -31
  82. package/lib/simple/room/Room.js +249 -31
  83. package/lib/simple/room/SipRoom.js +249 -31
  84. package/lib/simple/room/Stream.js +249 -31
  85. package/lib/simple/room/__tests__/Participant.test.js +14755 -0
  86. package/lib/simple/room/__tests__/RemoteParticipant.test.js +249 -31
  87. package/lib/simple/utils.js +249 -31
  88. package/lib/utils/__tests__/object.test.js +59 -0
  89. package/lib/utils/__tests__/sdp.test.js +50 -0
  90. package/lib/utils/__tests__/string.test.js +32 -0
  91. package/lib/utils/object.js +28 -0
  92. package/lib/utils/sdp.js +19 -0
  93. package/lib/utils/string.js +14 -0
  94. package/lib/web-rtc-client.js +203 -25
  95. package/lib/websocket-client.js +3 -0
  96. package/package.json +2 -2
  97. package/src/__tests__/web-rtc-client.test.js +46 -3
  98. package/src/api/calld.js +8 -0
  99. package/src/api/confd.js +43 -2
  100. package/src/domain/Meeting.js +20 -0
  101. package/src/domain/MeetingAuthorization.js +67 -0
  102. package/src/domain/Phone/WebRTCPhone.js +1 -3
  103. package/src/domain/__tests__/Meeting.test.js +70 -1
  104. package/src/domain/__tests__/MeetingAuthorization.test.js +58 -0
  105. package/src/lib/WazoSessionDescriptionHandler.js +5 -2
  106. package/src/simple/room/Participant.js +40 -0
  107. package/src/simple/room/Room.js +2 -2
  108. package/src/simple/room/SipRoom.js +1 -1
  109. package/src/simple/room/__tests__/Participant.test.js +81 -0
  110. package/src/types/WebSocketMessage.js +7 -1
  111. package/src/utils/__tests__/object.test.js +35 -0
  112. package/src/utils/__tests__/sdp.test.js +33 -1
  113. package/src/utils/__tests__/string.test.js +23 -0
  114. package/src/utils/object.js +15 -0
  115. package/src/utils/sdp.js +18 -0
  116. package/src/utils/string.js +8 -0
  117. package/src/web-rtc-client.js +39 -22
  118. 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
  //
@@ -5169,6 +5301,14 @@ var calldMethods = (client , baseUrl ) => ({
5169
5301
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
5170
5302
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
5171
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
+
5172
5312
  listTrunks: () => client.get(`${baseUrl}/trunks`),
5173
5313
 
5174
5314
  mute: (callId ) =>
@@ -5736,6 +5876,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
5736
5876
  return fixed;
5737
5877
  };
5738
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
+
5739
5897
  /* global RTCSessionDescriptionInit, navigator */
5740
5898
 
5741
5899
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -5865,7 +6023,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
5865
6023
 
5866
6024
  // Check if we got ICEs
5867
6025
  if (sdp.indexOf('a=candidate') !== -1) {
5868
- return description;
6026
+ return {
6027
+ type: description.type,
6028
+ sdp: addIcesInAllBundles(sdp),
6029
+ };
5869
6030
  }
5870
6031
 
5871
6032
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7325,7 +7486,7 @@ class WebRTCClient extends Emitter {
7325
7486
  });
7326
7487
  }
7327
7488
 
7328
- changeAudioInputDevice(id , session , force ) {
7489
+ async changeAudioInputDevice(id , session , force ) {
7329
7490
  const currentId = this.getAudioDeviceId();
7330
7491
  logger$9.info('setting audio input device', { id, currentId, session: !!session });
7331
7492
 
@@ -7333,33 +7494,50 @@ class WebRTCClient extends Emitter {
7333
7494
  return null;
7334
7495
  }
7335
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
+
7336
7515
  // let's update the local audio value
7337
7516
  if (this.audio) {
7338
7517
  this.audio = {
7339
7518
  deviceId: {
7340
- exact: id,
7519
+ exact: deviceId,
7341
7520
  },
7342
7521
  };
7343
7522
  }
7344
7523
 
7345
- if (session) {
7524
+ if (session && navigator.mediaDevices) {
7346
7525
  const sdh = session.sessionDescriptionHandler;
7347
7526
  const pc = sdh.peerConnection;
7348
7527
 
7349
- // $FlowFixMe
7350
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7351
- const audioTrack = stream.getAudioTracks()[0];
7352
- 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);
7353
7532
 
7354
- if (sender) {
7355
- if (sender.track) {
7356
- audioTrack.enabled = sender.track.enabled;
7357
- }
7358
- sender.replaceTrack(audioTrack);
7533
+ if (sender) {
7534
+ if (sender.track) {
7535
+ audioTrack.enabled = sender.track.enabled;
7359
7536
  }
7537
+ sender.replaceTrack(audioTrack);
7538
+ }
7360
7539
 
7361
- return stream;
7362
- });
7540
+ return stream;
7363
7541
  }
7364
7542
  }
7365
7543
 
@@ -7379,14 +7557,14 @@ class WebRTCClient extends Emitter {
7379
7557
  return null;
7380
7558
  }
7381
7559
 
7382
- // let's update the local video value
7383
- if (this.video) {
7384
- this.video = {
7385
- deviceId: {
7386
- exact: id,
7387
- },
7388
- };
7389
- }
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
+ };
7390
7568
  }
7391
7569
 
7392
7570
  changeSessionVideoInputDevice(id , session ) {
@@ -8559,6 +8737,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
8559
8737
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
8560
8738
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
8561
8739
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
8740
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
8562
8741
 
8563
8742
  const BLACKLIST_EVENTS = [
8564
8743
  CHAT_MESSAGE_SENT,
@@ -8910,6 +9089,7 @@ WebSocketClient.eventLists = [
8910
9089
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
8911
9090
  CONFERENCE_ADHOC_DELETED,
8912
9091
  MEETING_USER_PROGRESS,
9092
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
8913
9093
  ];
8914
9094
 
8915
9095
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -8981,6 +9161,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
8981
9161
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
8982
9162
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
8983
9163
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
9164
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
8984
9165
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
8985
9166
  'default': WebSocketClient
8986
9167
  });
@@ -9889,9 +10070,7 @@ class WebRTCPhone extends Emitter {
9889
10070
 
9890
10071
  try {
9891
10072
  if (this.currentScreenShare.stream) {
9892
- this.currentScreenShare.stream.getTracks()
9893
- .filter(track => track.kind === 'video')
9894
- .forEach(track => track.stop());
10073
+ this.currentScreenShare.stream.getTracks().forEach(track => track.stop());
9895
10074
  }
9896
10075
 
9897
10076
  if (restoreLocalStream) {
@@ -12761,6 +12940,7 @@ class Participant extends Emitter {
12761
12940
 
12762
12941
 
12763
12942
 
12943
+
12764
12944
 
12765
12945
 
12766
12946
 
@@ -12778,6 +12958,7 @@ class Participant extends Emitter {
12778
12958
 
12779
12959
 
12780
12960
 
12961
+
12781
12962
 
12782
12963
  /**
12783
12964
  * @param room Room The room where the participant is
@@ -12801,6 +12982,7 @@ class Participant extends Emitter {
12801
12982
  this.screensharing = false;
12802
12983
  this.isOnHold = false;
12803
12984
  this.extra = extra;
12985
+ this.banned = false;
12804
12986
 
12805
12987
  this.ON_UPDATED = 'participant/ON_UPDATED';
12806
12988
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -12817,6 +12999,7 @@ class Participant extends Emitter {
12817
12999
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
12818
13000
  this.ON_HOLD = 'participant/ON_HOLD';
12819
13001
  this.ON_RESUME = 'participant/ON_RESUME';
13002
+ this.ON_BAN = 'participant/ON_BAN';
12820
13003
  }
12821
13004
 
12822
13005
  triggerEvent(name , ...args ) {
@@ -12857,6 +13040,10 @@ class Participant extends Emitter {
12857
13040
  status.extra = this.extra;
12858
13041
  break;
12859
13042
  }
13043
+ case this.ON_BAN: {
13044
+ status.banned = true;
13045
+ break;
13046
+ }
12860
13047
  }
12861
13048
 
12862
13049
  if (broadcast) {
@@ -12959,6 +13146,11 @@ class Participant extends Emitter {
12959
13146
  this.triggerUpdate(this.ON_RESUME, broadcast);
12960
13147
  }
12961
13148
 
13149
+ onBan(broadcast = true) {
13150
+ this.banned = true;
13151
+ this.triggerUpdate(this.ON_BAN, broadcast);
13152
+ }
13153
+
12962
13154
  getStatus() {
12963
13155
  return {
12964
13156
  callId: this.callId,
@@ -13005,6 +13197,10 @@ class Participant extends Emitter {
13005
13197
  }
13006
13198
  }
13007
13199
 
13200
+ if (status.banned) {
13201
+ this.onBan(false);
13202
+ }
13203
+
13008
13204
  // Poor man's object comparison
13009
13205
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
13010
13206
  this.extra = { ...this.extra, ...status.extra };
@@ -13032,6 +13228,28 @@ class Participant extends Emitter {
13032
13228
  this.streams = streams;
13033
13229
  this.videoStreams = streams;
13034
13230
  }
13231
+
13232
+ async ban(apiRequestDelay = null) {
13233
+ const { meetingUuid } = this.room;
13234
+ if (!meetingUuid) {
13235
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
13236
+ }
13237
+
13238
+ // this notifies all that someone is being banned
13239
+ this.onBan(true);
13240
+
13241
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
13242
+ if (apiRequestDelay) {
13243
+ await this.delay(apiRequestDelay);
13244
+ }
13245
+
13246
+ // proceed with the actual kick
13247
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
13248
+ }
13249
+
13250
+ async delay(ms ) {
13251
+ return new Promise(resolve => setTimeout(resolve, ms));
13252
+ }
13035
13253
  }
13036
13254
 
13037
13255
  //
@@ -13184,7 +13402,7 @@ class Room extends Emitter {
13184
13402
  logger$1.info('connecting to room', { extension, audioOnly, room: !!room });
13185
13403
 
13186
13404
  if (!room) {
13187
- await Wazo.Phone.connect();
13405
+ await Wazo.Phone.connect({ media: constraints });
13188
13406
 
13189
13407
  const withCamera = constraints && !!constraints.video;
13190
13408
 
@@ -13629,7 +13847,7 @@ class Room extends Emitter {
13629
13847
  const participant = this._getParticipantFromCallId(status.callId);
13630
13848
 
13631
13849
  if (participant) {
13632
- // we're received, so no need to broadcast, hence the input false arg
13850
+ // we're receiving, so no need to broadcast
13633
13851
  participant.updateStatus(status, false);
13634
13852
  }
13635
13853
  break;
@@ -13896,7 +14114,7 @@ class SipRoom extends Room {
13896
14114
  logger.info('connecting to sip room', { extension, audioOnly, room: !!room });
13897
14115
 
13898
14116
  if (!room) {
13899
- await Wazo.Phone.connect();
14117
+ await Wazo.Phone.connect({ media: constraints });
13900
14118
 
13901
14119
  const withCamera = constraints && !!constraints.video;
13902
14120
 
@@ -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);