@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
@@ -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
  //
@@ -5068,6 +5200,14 @@ var calldMethods = (client , baseUrl ) => ({
5068
5200
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
5069
5201
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
5070
5202
 
5203
+ banMeetingParticipant: (meetingUuid , participantUuid ) =>
5204
+ client.delete(
5205
+ `${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
5206
+ null,
5207
+ null,
5208
+ ApiRequester.successResponseParser,
5209
+ ),
5210
+
5071
5211
  listTrunks: () => client.get(`${baseUrl}/trunks`),
5072
5212
 
5073
5213
  mute: (callId ) =>
@@ -5915,6 +6055,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
5915
6055
  return fixed;
5916
6056
  };
5917
6057
 
6058
+ const addIcesInAllBundles = (sdp ) => {
6059
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
6060
+
6061
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
6062
+ if (!mediaWithCandidate) {
6063
+ return sdp;
6064
+ }
6065
+
6066
+ const { candidates } = mediaWithCandidate;
6067
+
6068
+ parsedSdp.media = parsedSdp.media.map(media => ({
6069
+ ...media,
6070
+ candidates: media.candidates || candidates,
6071
+ }));
6072
+
6073
+ return sdpParser__default['default'].write(parsedSdp);
6074
+ };
6075
+
5918
6076
  /* global RTCSessionDescriptionInit, navigator */
5919
6077
 
5920
6078
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -6044,7 +6202,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
6044
6202
 
6045
6203
  // Check if we got ICEs
6046
6204
  if (sdp.indexOf('a=candidate') !== -1) {
6047
- return description;
6205
+ return {
6206
+ type: description.type,
6207
+ sdp: addIcesInAllBundles(sdp),
6208
+ };
6048
6209
  }
6049
6210
 
6050
6211
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7504,7 +7665,7 @@ class WebRTCClient extends Emitter {
7504
7665
  });
7505
7666
  }
7506
7667
 
7507
- changeAudioInputDevice(id , session , force ) {
7668
+ async changeAudioInputDevice(id , session , force ) {
7508
7669
  const currentId = this.getAudioDeviceId();
7509
7670
  logger$9.info('setting audio input device', { id, currentId, session: !!session });
7510
7671
 
@@ -7512,33 +7673,50 @@ class WebRTCClient extends Emitter {
7512
7673
  return null;
7513
7674
  }
7514
7675
 
7676
+ // in order to handle an audio track change for default devices
7677
+ // we need the actual id of the device (not 'default')
7678
+ let deviceId = id;
7679
+ if (id === 'default' && navigator.mediaDevices) {
7680
+ const devices = await navigator.mediaDevices.enumerateDevices();
7681
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
7682
+ if (defaultDevice) {
7683
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
7684
+ const targetDevice = devices.find(device => device.label === deviceLabel);
7685
+ if (targetDevice) {
7686
+ deviceId = targetDevice.deviceId;
7687
+ if (!force && deviceId === currentId) {
7688
+ return null;
7689
+ }
7690
+ }
7691
+ }
7692
+ }
7693
+
7515
7694
  // let's update the local audio value
7516
7695
  if (this.audio) {
7517
7696
  this.audio = {
7518
7697
  deviceId: {
7519
- exact: id,
7698
+ exact: deviceId,
7520
7699
  },
7521
7700
  };
7522
7701
  }
7523
7702
 
7524
- if (session) {
7703
+ if (session && navigator.mediaDevices) {
7525
7704
  const sdh = session.sessionDescriptionHandler;
7526
7705
  const pc = sdh.peerConnection;
7527
7706
 
7528
- // $FlowFixMe
7529
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7530
- const audioTrack = stream.getAudioTracks()[0];
7531
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7707
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
7708
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
7709
+ const audioTrack = stream.getAudioTracks()[0];
7710
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7532
7711
 
7533
- if (sender) {
7534
- if (sender.track) {
7535
- audioTrack.enabled = sender.track.enabled;
7536
- }
7537
- sender.replaceTrack(audioTrack);
7712
+ if (sender) {
7713
+ if (sender.track) {
7714
+ audioTrack.enabled = sender.track.enabled;
7538
7715
  }
7716
+ sender.replaceTrack(audioTrack);
7717
+ }
7539
7718
 
7540
- return stream;
7541
- });
7719
+ return stream;
7542
7720
  }
7543
7721
  }
7544
7722
 
@@ -7558,14 +7736,14 @@ class WebRTCClient extends Emitter {
7558
7736
  return null;
7559
7737
  }
7560
7738
 
7561
- // let's update the local video value
7562
- if (this.video) {
7563
- this.video = {
7564
- deviceId: {
7565
- exact: id,
7566
- },
7567
- };
7568
- }
7739
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
7740
+ const videoObject = typeof this.video === 'object' ? this.video : {};
7741
+ this.video = {
7742
+ ...videoObject,
7743
+ deviceId: {
7744
+ exact: id,
7745
+ },
7746
+ };
7569
7747
  }
7570
7748
 
7571
7749
  changeSessionVideoInputDevice(id , session ) {
@@ -9167,9 +9345,7 @@ class WebRTCPhone extends Emitter {
9167
9345
 
9168
9346
  try {
9169
9347
  if (this.currentScreenShare.stream) {
9170
- this.currentScreenShare.stream.getTracks()
9171
- .filter(track => track.kind === 'video')
9172
- .forEach(track => track.stop());
9348
+ this.currentScreenShare.stream.getTracks().forEach(track => track.stop());
9173
9349
  }
9174
9350
 
9175
9351
  if (restoreLocalStream) {
@@ -10960,6 +11136,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
10960
11136
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
10961
11137
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
10962
11138
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
11139
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
10963
11140
 
10964
11141
  const BLACKLIST_EVENTS = [
10965
11142
  CHAT_MESSAGE_SENT,
@@ -11311,6 +11488,7 @@ WebSocketClient.eventLists = [
11311
11488
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11312
11489
  CONFERENCE_ADHOC_DELETED,
11313
11490
  MEETING_USER_PROGRESS,
11491
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11314
11492
  ];
11315
11493
 
11316
11494
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11382,6 +11560,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11382
11560
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11383
11561
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11384
11562
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11563
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11385
11564
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11386
11565
  'default': WebSocketClient
11387
11566
  });
@@ -11486,6 +11665,7 @@ class Participant extends Emitter {
11486
11665
 
11487
11666
 
11488
11667
 
11668
+
11489
11669
 
11490
11670
 
11491
11671
 
@@ -11503,6 +11683,7 @@ class Participant extends Emitter {
11503
11683
 
11504
11684
 
11505
11685
 
11686
+
11506
11687
 
11507
11688
  /**
11508
11689
  * @param room Room The room where the participant is
@@ -11526,6 +11707,7 @@ class Participant extends Emitter {
11526
11707
  this.screensharing = false;
11527
11708
  this.isOnHold = false;
11528
11709
  this.extra = extra;
11710
+ this.banned = false;
11529
11711
 
11530
11712
  this.ON_UPDATED = 'participant/ON_UPDATED';
11531
11713
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -11542,6 +11724,7 @@ class Participant extends Emitter {
11542
11724
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
11543
11725
  this.ON_HOLD = 'participant/ON_HOLD';
11544
11726
  this.ON_RESUME = 'participant/ON_RESUME';
11727
+ this.ON_BAN = 'participant/ON_BAN';
11545
11728
  }
11546
11729
 
11547
11730
  triggerEvent(name , ...args ) {
@@ -11582,6 +11765,10 @@ class Participant extends Emitter {
11582
11765
  status.extra = this.extra;
11583
11766
  break;
11584
11767
  }
11768
+ case this.ON_BAN: {
11769
+ status.banned = true;
11770
+ break;
11771
+ }
11585
11772
  }
11586
11773
 
11587
11774
  if (broadcast) {
@@ -11684,6 +11871,11 @@ class Participant extends Emitter {
11684
11871
  this.triggerUpdate(this.ON_RESUME, broadcast);
11685
11872
  }
11686
11873
 
11874
+ onBan(broadcast = true) {
11875
+ this.banned = true;
11876
+ this.triggerUpdate(this.ON_BAN, broadcast);
11877
+ }
11878
+
11687
11879
  getStatus() {
11688
11880
  return {
11689
11881
  callId: this.callId,
@@ -11730,6 +11922,10 @@ class Participant extends Emitter {
11730
11922
  }
11731
11923
  }
11732
11924
 
11925
+ if (status.banned) {
11926
+ this.onBan(false);
11927
+ }
11928
+
11733
11929
  // Poor man's object comparison
11734
11930
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
11735
11931
  this.extra = { ...this.extra, ...status.extra };
@@ -11757,6 +11953,28 @@ class Participant extends Emitter {
11757
11953
  this.streams = streams;
11758
11954
  this.videoStreams = streams;
11759
11955
  }
11956
+
11957
+ async ban(apiRequestDelay = null) {
11958
+ const { meetingUuid } = this.room;
11959
+ if (!meetingUuid) {
11960
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
11961
+ }
11962
+
11963
+ // this notifies all that someone is being banned
11964
+ this.onBan(true);
11965
+
11966
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
11967
+ if (apiRequestDelay) {
11968
+ await this.delay(apiRequestDelay);
11969
+ }
11970
+
11971
+ // proceed with the actual kick
11972
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
11973
+ }
11974
+
11975
+ async delay(ms ) {
11976
+ return new Promise(resolve => setTimeout(resolve, ms));
11977
+ }
11760
11978
  }
11761
11979
 
11762
11980
  //
@@ -11909,7 +12127,7 @@ class Room$1 extends Emitter {
11909
12127
  logger$3.info('connecting to room', { extension, audioOnly, room: !!room });
11910
12128
 
11911
12129
  if (!room) {
11912
- await Wazo.Phone.connect();
12130
+ await Wazo.Phone.connect({ media: constraints });
11913
12131
 
11914
12132
  const withCamera = constraints && !!constraints.video;
11915
12133
 
@@ -12354,7 +12572,7 @@ class Room$1 extends Emitter {
12354
12572
  const participant = this._getParticipantFromCallId(status.callId);
12355
12573
 
12356
12574
  if (participant) {
12357
- // we're received, so no need to broadcast, hence the input false arg
12575
+ // we're receiving, so no need to broadcast
12358
12576
  participant.updateStatus(status, false);
12359
12577
  }
12360
12578
  break;
@@ -12621,7 +12839,7 @@ class SipRoom extends Room$1 {
12621
12839
  logger$2.info('connecting to sip room', { extension, audioOnly, room: !!room });
12622
12840
 
12623
12841
  if (!room) {
12624
- await Wazo.Phone.connect();
12842
+ await Wazo.Phone.connect({ media: constraints });
12625
12843
 
12626
12844
  const withCamera = constraints && !!constraints.video;
12627
12845