@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
  });
@@ -11785,6 +11964,7 @@ class Participant extends Emitter {
11785
11964
 
11786
11965
 
11787
11966
 
11967
+
11788
11968
 
11789
11969
 
11790
11970
 
@@ -11802,6 +11982,7 @@ class Participant extends Emitter {
11802
11982
 
11803
11983
 
11804
11984
 
11985
+
11805
11986
 
11806
11987
  /**
11807
11988
  * @param room Room The room where the participant is
@@ -11825,6 +12006,7 @@ class Participant extends Emitter {
11825
12006
  this.screensharing = false;
11826
12007
  this.isOnHold = false;
11827
12008
  this.extra = extra;
12009
+ this.banned = false;
11828
12010
 
11829
12011
  this.ON_UPDATED = 'participant/ON_UPDATED';
11830
12012
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -11841,6 +12023,7 @@ class Participant extends Emitter {
11841
12023
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
11842
12024
  this.ON_HOLD = 'participant/ON_HOLD';
11843
12025
  this.ON_RESUME = 'participant/ON_RESUME';
12026
+ this.ON_BAN = 'participant/ON_BAN';
11844
12027
  }
11845
12028
 
11846
12029
  triggerEvent(name , ...args ) {
@@ -11881,6 +12064,10 @@ class Participant extends Emitter {
11881
12064
  status.extra = this.extra;
11882
12065
  break;
11883
12066
  }
12067
+ case this.ON_BAN: {
12068
+ status.banned = true;
12069
+ break;
12070
+ }
11884
12071
  }
11885
12072
 
11886
12073
  if (broadcast) {
@@ -11983,6 +12170,11 @@ class Participant extends Emitter {
11983
12170
  this.triggerUpdate(this.ON_RESUME, broadcast);
11984
12171
  }
11985
12172
 
12173
+ onBan(broadcast = true) {
12174
+ this.banned = true;
12175
+ this.triggerUpdate(this.ON_BAN, broadcast);
12176
+ }
12177
+
11986
12178
  getStatus() {
11987
12179
  return {
11988
12180
  callId: this.callId,
@@ -12029,6 +12221,10 @@ class Participant extends Emitter {
12029
12221
  }
12030
12222
  }
12031
12223
 
12224
+ if (status.banned) {
12225
+ this.onBan(false);
12226
+ }
12227
+
12032
12228
  // Poor man's object comparison
12033
12229
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
12034
12230
  this.extra = { ...this.extra, ...status.extra };
@@ -12056,6 +12252,28 @@ class Participant extends Emitter {
12056
12252
  this.streams = streams;
12057
12253
  this.videoStreams = streams;
12058
12254
  }
12255
+
12256
+ async ban(apiRequestDelay = null) {
12257
+ const { meetingUuid } = this.room;
12258
+ if (!meetingUuid) {
12259
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
12260
+ }
12261
+
12262
+ // this notifies all that someone is being banned
12263
+ this.onBan(true);
12264
+
12265
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
12266
+ if (apiRequestDelay) {
12267
+ await this.delay(apiRequestDelay);
12268
+ }
12269
+
12270
+ // proceed with the actual kick
12271
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
12272
+ }
12273
+
12274
+ async delay(ms ) {
12275
+ return new Promise(resolve => setTimeout(resolve, ms));
12276
+ }
12059
12277
  }
12060
12278
 
12061
12279
  //
@@ -12208,7 +12426,7 @@ class Room$1 extends Emitter {
12208
12426
  logger$2.info('connecting to room', { extension, audioOnly, room: !!room });
12209
12427
 
12210
12428
  if (!room) {
12211
- await Wazo.Phone.connect();
12429
+ await Wazo.Phone.connect({ media: constraints });
12212
12430
 
12213
12431
  const withCamera = constraints && !!constraints.video;
12214
12432
 
@@ -12653,7 +12871,7 @@ class Room$1 extends Emitter {
12653
12871
  const participant = this._getParticipantFromCallId(status.callId);
12654
12872
 
12655
12873
  if (participant) {
12656
- // we're received, so no need to broadcast, hence the input false arg
12874
+ // we're receiving, so no need to broadcast
12657
12875
  participant.updateStatus(status, false);
12658
12876
  }
12659
12877
  break;
@@ -14328,7 +14546,7 @@ class SipRoom extends Room$1 {
14328
14546
  logger.info('connecting to sip room', { extension, audioOnly, room: !!room });
14329
14547
 
14330
14548
  if (!room) {
14331
- await Wazo.Phone.connect();
14549
+ await Wazo.Phone.connect({ media: constraints });
14332
14550
 
14333
14551
  const withCamera = constraints && !!constraints.video;
14334
14552