@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
@@ -2655,6 +2655,70 @@ class ExternalApp {
2655
2655
 
2656
2656
  //
2657
2657
 
2658
+ class MeetingAuthorization {
2659
+
2660
+
2661
+
2662
+
2663
+
2664
+
2665
+ constructor({
2666
+ meetingUuid,
2667
+ uuid,
2668
+ userUuid,
2669
+ userName,
2670
+ } = {}) {
2671
+ this.meetingUuid = meetingUuid;
2672
+ this.uuid = uuid;
2673
+ this.userUuid = userUuid;
2674
+ this.userName = userName;
2675
+ }
2676
+
2677
+ setStatus(status ) {
2678
+ this.status = status;
2679
+ }
2680
+
2681
+ getStatus() {
2682
+ return this.status;
2683
+ }
2684
+
2685
+ static parse(plain ) {
2686
+ const {
2687
+ meeting_uuid: meetingUuid,
2688
+ uuid,
2689
+ guest_uuid: userUuid,
2690
+ guest_name: userName,
2691
+ } = plain;
2692
+
2693
+ return new MeetingAuthorization({
2694
+ meetingUuid,
2695
+ uuid,
2696
+ userUuid,
2697
+ userName,
2698
+ });
2699
+ }
2700
+
2701
+ static parseMany(items ) {
2702
+ if (!items) {
2703
+ return [];
2704
+ }
2705
+ return items.map(MeetingAuthorization.parse);
2706
+ }
2707
+ }
2708
+
2709
+ //
2710
+
2711
+
2712
+
2713
+
2714
+
2715
+
2716
+
2717
+
2718
+
2719
+
2720
+
2721
+
2658
2722
 
2659
2723
 
2660
2724
 
@@ -2665,6 +2729,7 @@ class ExternalApp {
2665
2729
 
2666
2730
 
2667
2731
 
2732
+
2668
2733
 
2669
2734
 
2670
2735
  class Meeting {
@@ -2679,6 +2744,8 @@ class Meeting {
2679
2744
 
2680
2745
 
2681
2746
 
2747
+
2748
+
2682
2749
 
2683
2750
  static parse(plain ) {
2684
2751
  return new Meeting({
@@ -2691,6 +2758,7 @@ class Meeting {
2691
2758
  extension: plain.exten,
2692
2759
  persistent: plain.persistent,
2693
2760
  creationTime: moment__default['default'](plain.creation_time).toDate(),
2761
+ requireAuthorization: plain.require_authorization,
2694
2762
  });
2695
2763
  }
2696
2764
 
@@ -2715,6 +2783,7 @@ class Meeting {
2715
2783
  extension,
2716
2784
  persistent,
2717
2785
  creationTime,
2786
+ requireAuthorization,
2718
2787
  } = {}) {
2719
2788
  this.guestSipAuthorization = guestSipAuthorization;
2720
2789
  this.uri = uri;
@@ -2725,6 +2794,7 @@ class Meeting {
2725
2794
  this.extension = extension;
2726
2795
  this.persistent = persistent;
2727
2796
  this.creationTime = creationTime;
2797
+ this.requireAuthorization = requireAuthorization;
2728
2798
 
2729
2799
  // Useful to compare instead of instanceof with minified code
2730
2800
  this.type = 'Meeting';
@@ -2735,8 +2805,32 @@ class Meeting {
2735
2805
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
2736
2806
  return { username, secret };
2737
2807
  }
2808
+
2738
2809
  }
2739
2810
 
2811
+ //
2812
+
2813
+ const camelToUnderscore = (key ) => {
2814
+ if (typeof key !== 'string') {
2815
+ throw new Error('Input is not a string');
2816
+ }
2817
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
2818
+ };
2819
+
2820
+ //
2821
+
2822
+ const convertKeysFromCamelToUnderscore = (args ) => {
2823
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
2824
+ throw new Error('Input is not an object');
2825
+ }
2826
+
2827
+ return Object.keys(args).reduce((acc, key) => {
2828
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
2829
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
2830
+ return acc;
2831
+ }, {});
2832
+ };
2833
+
2740
2834
  /* */
2741
2835
 
2742
2836
  var confdMethods = (client , baseUrl ) => ({
@@ -2805,8 +2899,18 @@ var confdMethods = (client , baseUrl ) => ({
2805
2899
  getMyMeetings: () =>
2806
2900
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2807
2901
 
2808
- createMyMeeting: (name , persistent ) =>
2809
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2902
+ createMyMeeting: (args ) =>
2903
+ client
2904
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
2905
+ .then(Meeting.parse),
2906
+
2907
+ updateMyMeeting: (meetingUuid , data ) =>
2908
+ client.put(
2909
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
2910
+ convertKeysFromCamelToUnderscore(data),
2911
+ null,
2912
+ ApiRequester.successResponseParser,
2913
+ ),
2810
2914
 
2811
2915
  deleteMyMeeting: (meetingUuid ) =>
2812
2916
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2814,8 +2918,36 @@ var confdMethods = (client , baseUrl ) => ({
2814
2918
  getMeeting: (meetingUuid ) =>
2815
2919
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
2816
2920
 
2921
+ meetingAuthorizations: (meetingUuid ) =>
2922
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
2923
+
2924
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
2925
+ client.put(
2926
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
2927
+ {},
2928
+ null,
2929
+ ApiRequester.successResponseParser,
2930
+ ),
2931
+
2932
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
2933
+ client.put(
2934
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
2935
+ {},
2936
+ null,
2937
+ ApiRequester.successResponseParser,
2938
+ ),
2939
+
2817
2940
  guestGetMeeting: (meetingUuid ) =>
2818
2941
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
2942
+
2943
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
2944
+ client
2945
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
2946
+ .then(MeetingAuthorization.parse),
2947
+
2948
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
2949
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
2950
+
2819
2951
  });
2820
2952
 
2821
2953
  //
@@ -5066,6 +5198,14 @@ var calldMethods = (client , baseUrl ) => ({
5066
5198
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
5067
5199
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
5068
5200
 
5201
+ banMeetingParticipant: (meetingUuid , participantUuid ) =>
5202
+ client.delete(
5203
+ `${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
5204
+ null,
5205
+ null,
5206
+ ApiRequester.successResponseParser,
5207
+ ),
5208
+
5069
5209
  listTrunks: () => client.get(`${baseUrl}/trunks`),
5070
5210
 
5071
5211
  mute: (callId ) =>
@@ -6214,6 +6354,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
6214
6354
  return fixed;
6215
6355
  };
6216
6356
 
6357
+ const addIcesInAllBundles = (sdp ) => {
6358
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
6359
+
6360
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
6361
+ if (!mediaWithCandidate) {
6362
+ return sdp;
6363
+ }
6364
+
6365
+ const { candidates } = mediaWithCandidate;
6366
+
6367
+ parsedSdp.media = parsedSdp.media.map(media => ({
6368
+ ...media,
6369
+ candidates: media.candidates || candidates,
6370
+ }));
6371
+
6372
+ return sdpParser__default['default'].write(parsedSdp);
6373
+ };
6374
+
6217
6375
  /* global RTCSessionDescriptionInit, navigator */
6218
6376
 
6219
6377
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -6343,7 +6501,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
6343
6501
 
6344
6502
  // Check if we got ICEs
6345
6503
  if (sdp.indexOf('a=candidate') !== -1) {
6346
- return description;
6504
+ return {
6505
+ type: description.type,
6506
+ sdp: addIcesInAllBundles(sdp),
6507
+ };
6347
6508
  }
6348
6509
 
6349
6510
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7803,7 +7964,7 @@ class WebRTCClient extends Emitter {
7803
7964
  });
7804
7965
  }
7805
7966
 
7806
- changeAudioInputDevice(id , session , force ) {
7967
+ async changeAudioInputDevice(id , session , force ) {
7807
7968
  const currentId = this.getAudioDeviceId();
7808
7969
  logger$8.info('setting audio input device', { id, currentId, session: !!session });
7809
7970
 
@@ -7811,33 +7972,50 @@ class WebRTCClient extends Emitter {
7811
7972
  return null;
7812
7973
  }
7813
7974
 
7975
+ // in order to handle an audio track change for default devices
7976
+ // we need the actual id of the device (not 'default')
7977
+ let deviceId = id;
7978
+ if (id === 'default' && navigator.mediaDevices) {
7979
+ const devices = await navigator.mediaDevices.enumerateDevices();
7980
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
7981
+ if (defaultDevice) {
7982
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
7983
+ const targetDevice = devices.find(device => device.label === deviceLabel);
7984
+ if (targetDevice) {
7985
+ deviceId = targetDevice.deviceId;
7986
+ if (!force && deviceId === currentId) {
7987
+ return null;
7988
+ }
7989
+ }
7990
+ }
7991
+ }
7992
+
7814
7993
  // let's update the local audio value
7815
7994
  if (this.audio) {
7816
7995
  this.audio = {
7817
7996
  deviceId: {
7818
- exact: id,
7997
+ exact: deviceId,
7819
7998
  },
7820
7999
  };
7821
8000
  }
7822
8001
 
7823
- if (session) {
8002
+ if (session && navigator.mediaDevices) {
7824
8003
  const sdh = session.sessionDescriptionHandler;
7825
8004
  const pc = sdh.peerConnection;
7826
8005
 
7827
- // $FlowFixMe
7828
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7829
- const audioTrack = stream.getAudioTracks()[0];
7830
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
8006
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
8007
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
8008
+ const audioTrack = stream.getAudioTracks()[0];
8009
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7831
8010
 
7832
- if (sender) {
7833
- if (sender.track) {
7834
- audioTrack.enabled = sender.track.enabled;
7835
- }
7836
- sender.replaceTrack(audioTrack);
8011
+ if (sender) {
8012
+ if (sender.track) {
8013
+ audioTrack.enabled = sender.track.enabled;
7837
8014
  }
8015
+ sender.replaceTrack(audioTrack);
8016
+ }
7838
8017
 
7839
- return stream;
7840
- });
8018
+ return stream;
7841
8019
  }
7842
8020
  }
7843
8021
 
@@ -7857,14 +8035,14 @@ class WebRTCClient extends Emitter {
7857
8035
  return null;
7858
8036
  }
7859
8037
 
7860
- // let's update the local video value
7861
- if (this.video) {
7862
- this.video = {
7863
- deviceId: {
7864
- exact: id,
7865
- },
7866
- };
7867
- }
8038
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
8039
+ const videoObject = typeof this.video === 'object' ? this.video : {};
8040
+ this.video = {
8041
+ ...videoObject,
8042
+ deviceId: {
8043
+ exact: id,
8044
+ },
8045
+ };
7868
8046
  }
7869
8047
 
7870
8048
  changeSessionVideoInputDevice(id , session ) {
@@ -9466,9 +9644,7 @@ class WebRTCPhone extends Emitter {
9466
9644
 
9467
9645
  try {
9468
9646
  if (this.currentScreenShare.stream) {
9469
- this.currentScreenShare.stream.getTracks()
9470
- .filter(track => track.kind === 'video')
9471
- .forEach(track => track.stop());
9647
+ this.currentScreenShare.stream.getTracks().forEach(track => track.stop());
9472
9648
  }
9473
9649
 
9474
9650
  if (restoreLocalStream) {
@@ -11259,6 +11435,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
11259
11435
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
11260
11436
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
11261
11437
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
11438
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
11262
11439
 
11263
11440
  const BLACKLIST_EVENTS = [
11264
11441
  CHAT_MESSAGE_SENT,
@@ -11610,6 +11787,7 @@ WebSocketClient.eventLists = [
11610
11787
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11611
11788
  CONFERENCE_ADHOC_DELETED,
11612
11789
  MEETING_USER_PROGRESS,
11790
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11613
11791
  ];
11614
11792
 
11615
11793
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11681,6 +11859,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11681
11859
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11682
11860
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11683
11861
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11862
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11684
11863
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11685
11864
  'default': WebSocketClient
11686
11865
  });
@@ -11778,7 +11957,7 @@ class SipRoom extends Room {
11778
11957
  logger$3.info('connecting to sip room', { extension, audioOnly, room: !!room });
11779
11958
 
11780
11959
  if (!room) {
11781
- await Wazo.Phone.connect();
11960
+ await Wazo.Phone.connect({ media: constraints });
11782
11961
 
11783
11962
  const withCamera = constraints && !!constraints.video;
11784
11963
 
@@ -11924,6 +12103,7 @@ class Participant extends Emitter {
11924
12103
 
11925
12104
 
11926
12105
 
12106
+
11927
12107
 
11928
12108
 
11929
12109
 
@@ -11941,6 +12121,7 @@ class Participant extends Emitter {
11941
12121
 
11942
12122
 
11943
12123
 
12124
+
11944
12125
 
11945
12126
  /**
11946
12127
  * @param room Room The room where the participant is
@@ -11964,6 +12145,7 @@ class Participant extends Emitter {
11964
12145
  this.screensharing = false;
11965
12146
  this.isOnHold = false;
11966
12147
  this.extra = extra;
12148
+ this.banned = false;
11967
12149
 
11968
12150
  this.ON_UPDATED = 'participant/ON_UPDATED';
11969
12151
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -11980,6 +12162,7 @@ class Participant extends Emitter {
11980
12162
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
11981
12163
  this.ON_HOLD = 'participant/ON_HOLD';
11982
12164
  this.ON_RESUME = 'participant/ON_RESUME';
12165
+ this.ON_BAN = 'participant/ON_BAN';
11983
12166
  }
11984
12167
 
11985
12168
  triggerEvent(name , ...args ) {
@@ -12020,6 +12203,10 @@ class Participant extends Emitter {
12020
12203
  status.extra = this.extra;
12021
12204
  break;
12022
12205
  }
12206
+ case this.ON_BAN: {
12207
+ status.banned = true;
12208
+ break;
12209
+ }
12023
12210
  }
12024
12211
 
12025
12212
  if (broadcast) {
@@ -12122,6 +12309,11 @@ class Participant extends Emitter {
12122
12309
  this.triggerUpdate(this.ON_RESUME, broadcast);
12123
12310
  }
12124
12311
 
12312
+ onBan(broadcast = true) {
12313
+ this.banned = true;
12314
+ this.triggerUpdate(this.ON_BAN, broadcast);
12315
+ }
12316
+
12125
12317
  getStatus() {
12126
12318
  return {
12127
12319
  callId: this.callId,
@@ -12168,6 +12360,10 @@ class Participant extends Emitter {
12168
12360
  }
12169
12361
  }
12170
12362
 
12363
+ if (status.banned) {
12364
+ this.onBan(false);
12365
+ }
12366
+
12171
12367
  // Poor man's object comparison
12172
12368
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
12173
12369
  this.extra = { ...this.extra, ...status.extra };
@@ -12195,6 +12391,28 @@ class Participant extends Emitter {
12195
12391
  this.streams = streams;
12196
12392
  this.videoStreams = streams;
12197
12393
  }
12394
+
12395
+ async ban(apiRequestDelay = null) {
12396
+ const { meetingUuid } = this.room;
12397
+ if (!meetingUuid) {
12398
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
12399
+ }
12400
+
12401
+ // this notifies all that someone is being banned
12402
+ this.onBan(true);
12403
+
12404
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
12405
+ if (apiRequestDelay) {
12406
+ await this.delay(apiRequestDelay);
12407
+ }
12408
+
12409
+ // proceed with the actual kick
12410
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
12411
+ }
12412
+
12413
+ async delay(ms ) {
12414
+ return new Promise(resolve => setTimeout(resolve, ms));
12415
+ }
12198
12416
  }
12199
12417
 
12200
12418
  //
@@ -13744,7 +13962,7 @@ class Room extends Emitter {
13744
13962
  logger.info('connecting to room', { extension, audioOnly, room: !!room });
13745
13963
 
13746
13964
  if (!room) {
13747
- await Wazo.Phone.connect();
13965
+ await Wazo.Phone.connect({ media: constraints });
13748
13966
 
13749
13967
  const withCamera = constraints && !!constraints.video;
13750
13968
 
@@ -14189,7 +14407,7 @@ class Room extends Emitter {
14189
14407
  const participant = this._getParticipantFromCallId(status.callId);
14190
14408
 
14191
14409
  if (participant) {
14192
- // we're received, so no need to broadcast, hence the input false arg
14410
+ // we're receiving, so no need to broadcast
14193
14411
  participant.updateStatus(status, false);
14194
14412
  }
14195
14413
  break;