@wazo/sdk 0.38.7 → 0.38.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) 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 +227 -27
  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 +183 -24
  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 +183 -24
  11. package/esm/checker/checks/wazo-websocket.js +2 -0
  12. package/esm/checker/checks/webrtc-transport.js +181 -24
  13. package/esm/checker/checks/webrtc.js +181 -24
  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/__tests__/Meeting.test.js +87 -1
  20. package/esm/domain/__tests__/MeetingAuthorization.test.js +109 -0
  21. package/esm/index.js +226 -27
  22. package/esm/service/CallApi.js +142 -2
  23. package/esm/service/getApiClient.js +142 -2
  24. package/esm/simple/Auth.js +226 -27
  25. package/esm/simple/Configuration.js +226 -27
  26. package/esm/simple/Directory.js +142 -2
  27. package/esm/simple/Phone.js +226 -27
  28. package/esm/simple/Websocket.js +3 -0
  29. package/esm/simple/index.js +226 -27
  30. package/esm/simple/room/LocalParticipant.js +226 -27
  31. package/esm/simple/room/Participant.js +226 -27
  32. package/esm/simple/room/RemoteParticipant.js +226 -27
  33. package/esm/simple/room/Room.js +226 -27
  34. package/esm/simple/room/SipRoom.js +226 -27
  35. package/esm/simple/room/Stream.js +226 -27
  36. package/esm/simple/room/__tests__/Participant.test.js +14747 -0
  37. package/esm/simple/room/__tests__/RemoteParticipant.test.js +226 -27
  38. package/esm/simple/utils.js +226 -27
  39. package/esm/utils/__tests__/object.test.js +57 -0
  40. package/esm/utils/__tests__/string.test.js +30 -0
  41. package/esm/utils/object.js +24 -0
  42. package/esm/utils/string.js +10 -0
  43. package/esm/web-rtc-client.js +181 -24
  44. package/esm/websocket-client.js +3 -1
  45. package/lib/__tests__/api-client.test.js +142 -2
  46. package/lib/__tests__/web-rtc-client.test.js +227 -27
  47. package/lib/api/calld.js +8 -0
  48. package/lib/api/confd.js +134 -2
  49. package/lib/api-client.js +142 -2
  50. package/lib/checker/Checker.js +183 -24
  51. package/lib/checker/checks/aor.js +142 -2
  52. package/lib/checker/checks/api.js +142 -2
  53. package/lib/checker/checks/index.js +183 -24
  54. package/lib/checker/checks/wazo-websocket.js +2 -0
  55. package/lib/checker/checks/webrtc-transport.js +181 -24
  56. package/lib/checker/checks/webrtc.js +181 -24
  57. package/lib/domain/AdHocAPIConference.js +142 -2
  58. package/lib/domain/Features.js +142 -2
  59. package/lib/domain/Meeting.js +18 -0
  60. package/lib/domain/MeetingAuthorization.js +79 -0
  61. package/lib/domain/Phone/CTIPhone.js +142 -2
  62. package/lib/domain/__tests__/Meeting.test.js +87 -1
  63. package/lib/domain/__tests__/MeetingAuthorization.test.js +111 -0
  64. package/lib/index.js +226 -27
  65. package/lib/service/CallApi.js +142 -2
  66. package/lib/service/getApiClient.js +142 -2
  67. package/lib/simple/Auth.js +226 -27
  68. package/lib/simple/Configuration.js +226 -27
  69. package/lib/simple/Directory.js +142 -2
  70. package/lib/simple/Phone.js +226 -27
  71. package/lib/simple/Websocket.js +3 -0
  72. package/lib/simple/index.js +226 -27
  73. package/lib/simple/room/LocalParticipant.js +226 -27
  74. package/lib/simple/room/Participant.js +226 -27
  75. package/lib/simple/room/RemoteParticipant.js +226 -27
  76. package/lib/simple/room/Room.js +226 -27
  77. package/lib/simple/room/SipRoom.js +226 -27
  78. package/lib/simple/room/Stream.js +226 -27
  79. package/lib/simple/room/__tests__/Participant.test.js +14757 -0
  80. package/lib/simple/room/__tests__/RemoteParticipant.test.js +226 -27
  81. package/lib/simple/utils.js +226 -27
  82. package/lib/utils/__tests__/object.test.js +59 -0
  83. package/lib/utils/__tests__/string.test.js +32 -0
  84. package/lib/utils/object.js +28 -0
  85. package/lib/utils/string.js +14 -0
  86. package/lib/web-rtc-client.js +181 -24
  87. package/lib/websocket-client.js +3 -0
  88. package/package.json +2 -2
  89. package/src/__tests__/web-rtc-client.test.js +46 -3
  90. package/src/api/calld.js +8 -0
  91. package/src/api/confd.js +43 -2
  92. package/src/domain/Meeting.js +20 -0
  93. package/src/domain/MeetingAuthorization.js +67 -0
  94. package/src/domain/__tests__/Meeting.test.js +70 -1
  95. package/src/domain/__tests__/MeetingAuthorization.test.js +58 -0
  96. package/src/simple/room/Participant.js +40 -0
  97. package/src/simple/room/Room.js +2 -2
  98. package/src/simple/room/SipRoom.js +1 -1
  99. package/src/simple/room/__tests__/Participant.test.js +81 -0
  100. package/src/types/WebSocketMessage.js +7 -1
  101. package/src/utils/__tests__/object.test.js +35 -0
  102. package/src/utils/__tests__/string.test.js +23 -0
  103. package/src/utils/object.js +15 -0
  104. package/src/utils/string.js +8 -0
  105. package/src/web-rtc-client.js +39 -22
  106. 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 ) =>
@@ -7824,7 +7964,7 @@ class WebRTCClient extends Emitter {
7824
7964
  });
7825
7965
  }
7826
7966
 
7827
- changeAudioInputDevice(id , session , force ) {
7967
+ async changeAudioInputDevice(id , session , force ) {
7828
7968
  const currentId = this.getAudioDeviceId();
7829
7969
  logger$8.info('setting audio input device', { id, currentId, session: !!session });
7830
7970
 
@@ -7832,33 +7972,50 @@ class WebRTCClient extends Emitter {
7832
7972
  return null;
7833
7973
  }
7834
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
+
7835
7993
  // let's update the local audio value
7836
7994
  if (this.audio) {
7837
7995
  this.audio = {
7838
7996
  deviceId: {
7839
- exact: id,
7997
+ exact: deviceId,
7840
7998
  },
7841
7999
  };
7842
8000
  }
7843
8001
 
7844
- if (session) {
8002
+ if (session && navigator.mediaDevices) {
7845
8003
  const sdh = session.sessionDescriptionHandler;
7846
8004
  const pc = sdh.peerConnection;
7847
8005
 
7848
- // $FlowFixMe
7849
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7850
- const audioTrack = stream.getAudioTracks()[0];
7851
- 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);
7852
8010
 
7853
- if (sender) {
7854
- if (sender.track) {
7855
- audioTrack.enabled = sender.track.enabled;
7856
- }
7857
- sender.replaceTrack(audioTrack);
8011
+ if (sender) {
8012
+ if (sender.track) {
8013
+ audioTrack.enabled = sender.track.enabled;
7858
8014
  }
8015
+ sender.replaceTrack(audioTrack);
8016
+ }
7859
8017
 
7860
- return stream;
7861
- });
8018
+ return stream;
7862
8019
  }
7863
8020
  }
7864
8021
 
@@ -7878,14 +8035,14 @@ class WebRTCClient extends Emitter {
7878
8035
  return null;
7879
8036
  }
7880
8037
 
7881
- // let's update the local video value
7882
- if (this.video) {
7883
- this.video = {
7884
- deviceId: {
7885
- exact: id,
7886
- },
7887
- };
7888
- }
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
+ };
7889
8046
  }
7890
8047
 
7891
8048
  changeSessionVideoInputDevice(id , session ) {
@@ -11280,6 +11437,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
11280
11437
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
11281
11438
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
11282
11439
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
11440
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
11283
11441
 
11284
11442
  const BLACKLIST_EVENTS = [
11285
11443
  CHAT_MESSAGE_SENT,
@@ -11631,6 +11789,7 @@ WebSocketClient.eventLists = [
11631
11789
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11632
11790
  CONFERENCE_ADHOC_DELETED,
11633
11791
  MEETING_USER_PROGRESS,
11792
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11634
11793
  ];
11635
11794
 
11636
11795
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11702,6 +11861,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11702
11861
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11703
11862
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11704
11863
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11864
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11705
11865
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11706
11866
  'default': WebSocketClient
11707
11867
  });
@@ -11799,7 +11959,7 @@ class SipRoom extends Room {
11799
11959
  logger$3.info('connecting to sip room', { extension, audioOnly, room: !!room });
11800
11960
 
11801
11961
  if (!room) {
11802
- await Wazo.Phone.connect();
11962
+ await Wazo.Phone.connect({ media: constraints });
11803
11963
 
11804
11964
  const withCamera = constraints && !!constraints.video;
11805
11965
 
@@ -11945,6 +12105,7 @@ class Participant extends Emitter {
11945
12105
 
11946
12106
 
11947
12107
 
12108
+
11948
12109
 
11949
12110
 
11950
12111
 
@@ -11962,6 +12123,7 @@ class Participant extends Emitter {
11962
12123
 
11963
12124
 
11964
12125
 
12126
+
11965
12127
 
11966
12128
  /**
11967
12129
  * @param room Room The room where the participant is
@@ -11985,6 +12147,7 @@ class Participant extends Emitter {
11985
12147
  this.screensharing = false;
11986
12148
  this.isOnHold = false;
11987
12149
  this.extra = extra;
12150
+ this.banned = false;
11988
12151
 
11989
12152
  this.ON_UPDATED = 'participant/ON_UPDATED';
11990
12153
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -12001,6 +12164,7 @@ class Participant extends Emitter {
12001
12164
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
12002
12165
  this.ON_HOLD = 'participant/ON_HOLD';
12003
12166
  this.ON_RESUME = 'participant/ON_RESUME';
12167
+ this.ON_BAN = 'participant/ON_BAN';
12004
12168
  }
12005
12169
 
12006
12170
  triggerEvent(name , ...args ) {
@@ -12041,6 +12205,10 @@ class Participant extends Emitter {
12041
12205
  status.extra = this.extra;
12042
12206
  break;
12043
12207
  }
12208
+ case this.ON_BAN: {
12209
+ status.banned = true;
12210
+ break;
12211
+ }
12044
12212
  }
12045
12213
 
12046
12214
  if (broadcast) {
@@ -12143,6 +12311,11 @@ class Participant extends Emitter {
12143
12311
  this.triggerUpdate(this.ON_RESUME, broadcast);
12144
12312
  }
12145
12313
 
12314
+ onBan(broadcast = true) {
12315
+ this.banned = true;
12316
+ this.triggerUpdate(this.ON_BAN, broadcast);
12317
+ }
12318
+
12146
12319
  getStatus() {
12147
12320
  return {
12148
12321
  callId: this.callId,
@@ -12189,6 +12362,10 @@ class Participant extends Emitter {
12189
12362
  }
12190
12363
  }
12191
12364
 
12365
+ if (status.banned) {
12366
+ this.onBan(false);
12367
+ }
12368
+
12192
12369
  // Poor man's object comparison
12193
12370
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
12194
12371
  this.extra = { ...this.extra, ...status.extra };
@@ -12216,6 +12393,28 @@ class Participant extends Emitter {
12216
12393
  this.streams = streams;
12217
12394
  this.videoStreams = streams;
12218
12395
  }
12396
+
12397
+ async ban(apiRequestDelay = null) {
12398
+ const { meetingUuid } = this.room;
12399
+ if (!meetingUuid) {
12400
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
12401
+ }
12402
+
12403
+ // this notifies all that someone is being banned
12404
+ this.onBan(true);
12405
+
12406
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
12407
+ if (apiRequestDelay) {
12408
+ await this.delay(apiRequestDelay);
12409
+ }
12410
+
12411
+ // proceed with the actual kick
12412
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
12413
+ }
12414
+
12415
+ async delay(ms ) {
12416
+ return new Promise(resolve => setTimeout(resolve, ms));
12417
+ }
12219
12418
  }
12220
12419
 
12221
12420
  //
@@ -13765,7 +13964,7 @@ class Room extends Emitter {
13765
13964
  logger.info('connecting to room', { extension, audioOnly, room: !!room });
13766
13965
 
13767
13966
  if (!room) {
13768
- await Wazo.Phone.connect();
13967
+ await Wazo.Phone.connect({ media: constraints });
13769
13968
 
13770
13969
  const withCamera = constraints && !!constraints.video;
13771
13970
 
@@ -14210,7 +14409,7 @@ class Room extends Emitter {
14210
14409
  const participant = this._getParticipantFromCallId(status.callId);
14211
14410
 
14212
14411
  if (participant) {
14213
- // we're received, so no need to broadcast, hence the input false arg
14412
+ // we're receiving, so no need to broadcast
14214
14413
  participant.updateStatus(status, false);
14215
14414
  }
14216
14415
  break;