@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
@@ -2653,6 +2653,70 @@ class ExternalApp {
2653
2653
 
2654
2654
  //
2655
2655
 
2656
+ class MeetingAuthorization {
2657
+
2658
+
2659
+
2660
+
2661
+
2662
+
2663
+ constructor({
2664
+ meetingUuid,
2665
+ uuid,
2666
+ userUuid,
2667
+ userName,
2668
+ } = {}) {
2669
+ this.meetingUuid = meetingUuid;
2670
+ this.uuid = uuid;
2671
+ this.userUuid = userUuid;
2672
+ this.userName = userName;
2673
+ }
2674
+
2675
+ setStatus(status ) {
2676
+ this.status = status;
2677
+ }
2678
+
2679
+ getStatus() {
2680
+ return this.status;
2681
+ }
2682
+
2683
+ static parse(plain ) {
2684
+ const {
2685
+ meeting_uuid: meetingUuid,
2686
+ uuid,
2687
+ guest_uuid: userUuid,
2688
+ guest_name: userName,
2689
+ } = plain;
2690
+
2691
+ return new MeetingAuthorization({
2692
+ meetingUuid,
2693
+ uuid,
2694
+ userUuid,
2695
+ userName,
2696
+ });
2697
+ }
2698
+
2699
+ static parseMany(items ) {
2700
+ if (!items) {
2701
+ return [];
2702
+ }
2703
+ return items.map(MeetingAuthorization.parse);
2704
+ }
2705
+ }
2706
+
2707
+ //
2708
+
2709
+
2710
+
2711
+
2712
+
2713
+
2714
+
2715
+
2716
+
2717
+
2718
+
2719
+
2656
2720
 
2657
2721
 
2658
2722
 
@@ -2663,6 +2727,7 @@ class ExternalApp {
2663
2727
 
2664
2728
 
2665
2729
 
2730
+
2666
2731
 
2667
2732
 
2668
2733
  class Meeting {
@@ -2677,6 +2742,8 @@ class Meeting {
2677
2742
 
2678
2743
 
2679
2744
 
2745
+
2746
+
2680
2747
 
2681
2748
  static parse(plain ) {
2682
2749
  return new Meeting({
@@ -2689,6 +2756,7 @@ class Meeting {
2689
2756
  extension: plain.exten,
2690
2757
  persistent: plain.persistent,
2691
2758
  creationTime: moment__default['default'](plain.creation_time).toDate(),
2759
+ requireAuthorization: plain.require_authorization,
2692
2760
  });
2693
2761
  }
2694
2762
 
@@ -2713,6 +2781,7 @@ class Meeting {
2713
2781
  extension,
2714
2782
  persistent,
2715
2783
  creationTime,
2784
+ requireAuthorization,
2716
2785
  } = {}) {
2717
2786
  this.guestSipAuthorization = guestSipAuthorization;
2718
2787
  this.uri = uri;
@@ -2723,6 +2792,7 @@ class Meeting {
2723
2792
  this.extension = extension;
2724
2793
  this.persistent = persistent;
2725
2794
  this.creationTime = creationTime;
2795
+ this.requireAuthorization = requireAuthorization;
2726
2796
 
2727
2797
  // Useful to compare instead of instanceof with minified code
2728
2798
  this.type = 'Meeting';
@@ -2733,8 +2803,32 @@ class Meeting {
2733
2803
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
2734
2804
  return { username, secret };
2735
2805
  }
2806
+
2736
2807
  }
2737
2808
 
2809
+ //
2810
+
2811
+ const camelToUnderscore = (key ) => {
2812
+ if (typeof key !== 'string') {
2813
+ throw new Error('Input is not a string');
2814
+ }
2815
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
2816
+ };
2817
+
2818
+ //
2819
+
2820
+ const convertKeysFromCamelToUnderscore = (args ) => {
2821
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
2822
+ throw new Error('Input is not an object');
2823
+ }
2824
+
2825
+ return Object.keys(args).reduce((acc, key) => {
2826
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
2827
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
2828
+ return acc;
2829
+ }, {});
2830
+ };
2831
+
2738
2832
  /* */
2739
2833
 
2740
2834
  var confdMethods = (client , baseUrl ) => ({
@@ -2803,8 +2897,18 @@ var confdMethods = (client , baseUrl ) => ({
2803
2897
  getMyMeetings: () =>
2804
2898
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2805
2899
 
2806
- createMyMeeting: (name , persistent ) =>
2807
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2900
+ createMyMeeting: (args ) =>
2901
+ client
2902
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
2903
+ .then(Meeting.parse),
2904
+
2905
+ updateMyMeeting: (meetingUuid , data ) =>
2906
+ client.put(
2907
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
2908
+ convertKeysFromCamelToUnderscore(data),
2909
+ null,
2910
+ ApiRequester.successResponseParser,
2911
+ ),
2808
2912
 
2809
2913
  deleteMyMeeting: (meetingUuid ) =>
2810
2914
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2812,8 +2916,36 @@ var confdMethods = (client , baseUrl ) => ({
2812
2916
  getMeeting: (meetingUuid ) =>
2813
2917
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
2814
2918
 
2919
+ meetingAuthorizations: (meetingUuid ) =>
2920
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
2921
+
2922
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
2923
+ client.put(
2924
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
2925
+ {},
2926
+ null,
2927
+ ApiRequester.successResponseParser,
2928
+ ),
2929
+
2930
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
2931
+ client.put(
2932
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
2933
+ {},
2934
+ null,
2935
+ ApiRequester.successResponseParser,
2936
+ ),
2937
+
2815
2938
  guestGetMeeting: (meetingUuid ) =>
2816
2939
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
2940
+
2941
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
2942
+ client
2943
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
2944
+ .then(MeetingAuthorization.parse),
2945
+
2946
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
2947
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
2948
+
2817
2949
  });
2818
2950
 
2819
2951
  //
@@ -4278,6 +4410,14 @@ var calldMethods = (client , baseUrl ) => ({
4278
4410
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
4279
4411
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
4280
4412
 
4413
+ banMeetingParticipant: (meetingUuid , participantUuid ) =>
4414
+ client.delete(
4415
+ `${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
4416
+ null,
4417
+ null,
4418
+ ApiRequester.successResponseParser,
4419
+ ),
4420
+
4281
4421
  listTrunks: () => client.get(`${baseUrl}/trunks`),
4282
4422
 
4283
4423
  mute: (callId ) =>
@@ -5069,6 +5209,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
5069
5209
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
5070
5210
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
5071
5211
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
5212
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
5072
5213
 
5073
5214
  const BLACKLIST_EVENTS = [
5074
5215
  CHAT_MESSAGE_SENT,
@@ -5420,6 +5561,7 @@ WebSocketClient.eventLists = [
5420
5561
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
5421
5562
  CONFERENCE_ADHOC_DELETED,
5422
5563
  MEETING_USER_PROGRESS,
5564
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
5423
5565
  ];
5424
5566
 
5425
5567
  var wazoWebsocket = {
@@ -7036,7 +7178,7 @@ class WebRTCClient extends Emitter {
7036
7178
  });
7037
7179
  }
7038
7180
 
7039
- changeAudioInputDevice(id , session , force ) {
7181
+ async changeAudioInputDevice(id , session , force ) {
7040
7182
  const currentId = this.getAudioDeviceId();
7041
7183
  logger.info('setting audio input device', { id, currentId, session: !!session });
7042
7184
 
@@ -7044,33 +7186,50 @@ class WebRTCClient extends Emitter {
7044
7186
  return null;
7045
7187
  }
7046
7188
 
7189
+ // in order to handle an audio track change for default devices
7190
+ // we need the actual id of the device (not 'default')
7191
+ let deviceId = id;
7192
+ if (id === 'default' && navigator.mediaDevices) {
7193
+ const devices = await navigator.mediaDevices.enumerateDevices();
7194
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
7195
+ if (defaultDevice) {
7196
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
7197
+ const targetDevice = devices.find(device => device.label === deviceLabel);
7198
+ if (targetDevice) {
7199
+ deviceId = targetDevice.deviceId;
7200
+ if (!force && deviceId === currentId) {
7201
+ return null;
7202
+ }
7203
+ }
7204
+ }
7205
+ }
7206
+
7047
7207
  // let's update the local audio value
7048
7208
  if (this.audio) {
7049
7209
  this.audio = {
7050
7210
  deviceId: {
7051
- exact: id,
7211
+ exact: deviceId,
7052
7212
  },
7053
7213
  };
7054
7214
  }
7055
7215
 
7056
- if (session) {
7216
+ if (session && navigator.mediaDevices) {
7057
7217
  const sdh = session.sessionDescriptionHandler;
7058
7218
  const pc = sdh.peerConnection;
7059
7219
 
7060
- // $FlowFixMe
7061
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7062
- const audioTrack = stream.getAudioTracks()[0];
7063
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7220
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
7221
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
7222
+ const audioTrack = stream.getAudioTracks()[0];
7223
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7064
7224
 
7065
- if (sender) {
7066
- if (sender.track) {
7067
- audioTrack.enabled = sender.track.enabled;
7068
- }
7069
- sender.replaceTrack(audioTrack);
7225
+ if (sender) {
7226
+ if (sender.track) {
7227
+ audioTrack.enabled = sender.track.enabled;
7070
7228
  }
7229
+ sender.replaceTrack(audioTrack);
7230
+ }
7071
7231
 
7072
- return stream;
7073
- });
7232
+ return stream;
7074
7233
  }
7075
7234
  }
7076
7235
 
@@ -7090,14 +7249,14 @@ class WebRTCClient extends Emitter {
7090
7249
  return null;
7091
7250
  }
7092
7251
 
7093
- // let's update the local video value
7094
- if (this.video) {
7095
- this.video = {
7096
- deviceId: {
7097
- exact: id,
7098
- },
7099
- };
7100
- }
7252
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
7253
+ const videoObject = typeof this.video === 'object' ? this.video : {};
7254
+ this.video = {
7255
+ ...videoObject,
7256
+ deviceId: {
7257
+ exact: id,
7258
+ },
7259
+ };
7101
7260
  }
7102
7261
 
7103
7262
  changeSessionVideoInputDevice(id , session ) {
@@ -615,6 +615,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
615
615
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
616
616
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
617
617
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
618
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
618
619
 
619
620
  const BLACKLIST_EVENTS = [
620
621
  CHAT_MESSAGE_SENT,
@@ -966,6 +967,7 @@ WebSocketClient.eventLists = [
966
967
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
967
968
  CONFERENCE_ADHOC_DELETED,
968
969
  MEETING_USER_PROGRESS,
970
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
969
971
  ];
970
972
 
971
973
  var wazoWebsocket = {
@@ -3211,6 +3211,70 @@ class ExternalApp {
3211
3211
 
3212
3212
  //
3213
3213
 
3214
+ class MeetingAuthorization {
3215
+
3216
+
3217
+
3218
+
3219
+
3220
+
3221
+ constructor({
3222
+ meetingUuid,
3223
+ uuid,
3224
+ userUuid,
3225
+ userName,
3226
+ } = {}) {
3227
+ this.meetingUuid = meetingUuid;
3228
+ this.uuid = uuid;
3229
+ this.userUuid = userUuid;
3230
+ this.userName = userName;
3231
+ }
3232
+
3233
+ setStatus(status ) {
3234
+ this.status = status;
3235
+ }
3236
+
3237
+ getStatus() {
3238
+ return this.status;
3239
+ }
3240
+
3241
+ static parse(plain ) {
3242
+ const {
3243
+ meeting_uuid: meetingUuid,
3244
+ uuid,
3245
+ guest_uuid: userUuid,
3246
+ guest_name: userName,
3247
+ } = plain;
3248
+
3249
+ return new MeetingAuthorization({
3250
+ meetingUuid,
3251
+ uuid,
3252
+ userUuid,
3253
+ userName,
3254
+ });
3255
+ }
3256
+
3257
+ static parseMany(items ) {
3258
+ if (!items) {
3259
+ return [];
3260
+ }
3261
+ return items.map(MeetingAuthorization.parse);
3262
+ }
3263
+ }
3264
+
3265
+ //
3266
+
3267
+
3268
+
3269
+
3270
+
3271
+
3272
+
3273
+
3274
+
3275
+
3276
+
3277
+
3214
3278
 
3215
3279
 
3216
3280
 
@@ -3221,6 +3285,7 @@ class ExternalApp {
3221
3285
 
3222
3286
 
3223
3287
 
3288
+
3224
3289
 
3225
3290
 
3226
3291
  class Meeting {
@@ -3235,6 +3300,8 @@ class Meeting {
3235
3300
 
3236
3301
 
3237
3302
 
3303
+
3304
+
3238
3305
 
3239
3306
  static parse(plain ) {
3240
3307
  return new Meeting({
@@ -3247,6 +3314,7 @@ class Meeting {
3247
3314
  extension: plain.exten,
3248
3315
  persistent: plain.persistent,
3249
3316
  creationTime: moment__default['default'](plain.creation_time).toDate(),
3317
+ requireAuthorization: plain.require_authorization,
3250
3318
  });
3251
3319
  }
3252
3320
 
@@ -3271,6 +3339,7 @@ class Meeting {
3271
3339
  extension,
3272
3340
  persistent,
3273
3341
  creationTime,
3342
+ requireAuthorization,
3274
3343
  } = {}) {
3275
3344
  this.guestSipAuthorization = guestSipAuthorization;
3276
3345
  this.uri = uri;
@@ -3281,6 +3350,7 @@ class Meeting {
3281
3350
  this.extension = extension;
3282
3351
  this.persistent = persistent;
3283
3352
  this.creationTime = creationTime;
3353
+ this.requireAuthorization = requireAuthorization;
3284
3354
 
3285
3355
  // Useful to compare instead of instanceof with minified code
3286
3356
  this.type = 'Meeting';
@@ -3291,8 +3361,32 @@ class Meeting {
3291
3361
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
3292
3362
  return { username, secret };
3293
3363
  }
3364
+
3294
3365
  }
3295
3366
 
3367
+ //
3368
+
3369
+ const camelToUnderscore = (key ) => {
3370
+ if (typeof key !== 'string') {
3371
+ throw new Error('Input is not a string');
3372
+ }
3373
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
3374
+ };
3375
+
3376
+ //
3377
+
3378
+ const convertKeysFromCamelToUnderscore = (args ) => {
3379
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
3380
+ throw new Error('Input is not an object');
3381
+ }
3382
+
3383
+ return Object.keys(args).reduce((acc, key) => {
3384
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
3385
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
3386
+ return acc;
3387
+ }, {});
3388
+ };
3389
+
3296
3390
  /* */
3297
3391
 
3298
3392
  var confdMethods = (client , baseUrl ) => ({
@@ -3361,8 +3455,18 @@ var confdMethods = (client , baseUrl ) => ({
3361
3455
  getMyMeetings: () =>
3362
3456
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
3363
3457
 
3364
- createMyMeeting: (name , persistent ) =>
3365
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
3458
+ createMyMeeting: (args ) =>
3459
+ client
3460
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
3461
+ .then(Meeting.parse),
3462
+
3463
+ updateMyMeeting: (meetingUuid , data ) =>
3464
+ client.put(
3465
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
3466
+ convertKeysFromCamelToUnderscore(data),
3467
+ null,
3468
+ ApiRequester.successResponseParser,
3469
+ ),
3366
3470
 
3367
3471
  deleteMyMeeting: (meetingUuid ) =>
3368
3472
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -3370,8 +3474,36 @@ var confdMethods = (client , baseUrl ) => ({
3370
3474
  getMeeting: (meetingUuid ) =>
3371
3475
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
3372
3476
 
3477
+ meetingAuthorizations: (meetingUuid ) =>
3478
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
3479
+
3480
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
3481
+ client.put(
3482
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
3483
+ {},
3484
+ null,
3485
+ ApiRequester.successResponseParser,
3486
+ ),
3487
+
3488
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
3489
+ client.put(
3490
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
3491
+ {},
3492
+ null,
3493
+ ApiRequester.successResponseParser,
3494
+ ),
3495
+
3373
3496
  guestGetMeeting: (meetingUuid ) =>
3374
3497
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
3498
+
3499
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
3500
+ client
3501
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
3502
+ .then(MeetingAuthorization.parse),
3503
+
3504
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
3505
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
3506
+
3375
3507
  });
3376
3508
 
3377
3509
  //
@@ -4810,6 +4942,14 @@ var calldMethods = (client , baseUrl ) => ({
4810
4942
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
4811
4943
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
4812
4944
 
4945
+ banMeetingParticipant: (meetingUuid , participantUuid ) =>
4946
+ client.delete(
4947
+ `${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
4948
+ null,
4949
+ null,
4950
+ ApiRequester.successResponseParser,
4951
+ ),
4952
+
4813
4953
  listTrunks: () => client.get(`${baseUrl}/trunks`),
4814
4954
 
4815
4955
  mute: (callId ) =>
@@ -6450,7 +6590,7 @@ class WebRTCClient extends Emitter {
6450
6590
  });
6451
6591
  }
6452
6592
 
6453
- changeAudioInputDevice(id , session , force ) {
6593
+ async changeAudioInputDevice(id , session , force ) {
6454
6594
  const currentId = this.getAudioDeviceId();
6455
6595
  logger.info('setting audio input device', { id, currentId, session: !!session });
6456
6596
 
@@ -6458,33 +6598,50 @@ class WebRTCClient extends Emitter {
6458
6598
  return null;
6459
6599
  }
6460
6600
 
6601
+ // in order to handle an audio track change for default devices
6602
+ // we need the actual id of the device (not 'default')
6603
+ let deviceId = id;
6604
+ if (id === 'default' && navigator.mediaDevices) {
6605
+ const devices = await navigator.mediaDevices.enumerateDevices();
6606
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
6607
+ if (defaultDevice) {
6608
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
6609
+ const targetDevice = devices.find(device => device.label === deviceLabel);
6610
+ if (targetDevice) {
6611
+ deviceId = targetDevice.deviceId;
6612
+ if (!force && deviceId === currentId) {
6613
+ return null;
6614
+ }
6615
+ }
6616
+ }
6617
+ }
6618
+
6461
6619
  // let's update the local audio value
6462
6620
  if (this.audio) {
6463
6621
  this.audio = {
6464
6622
  deviceId: {
6465
- exact: id,
6623
+ exact: deviceId,
6466
6624
  },
6467
6625
  };
6468
6626
  }
6469
6627
 
6470
- if (session) {
6628
+ if (session && navigator.mediaDevices) {
6471
6629
  const sdh = session.sessionDescriptionHandler;
6472
6630
  const pc = sdh.peerConnection;
6473
6631
 
6474
- // $FlowFixMe
6475
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
6476
- const audioTrack = stream.getAudioTracks()[0];
6477
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
6632
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
6633
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
6634
+ const audioTrack = stream.getAudioTracks()[0];
6635
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
6478
6636
 
6479
- if (sender) {
6480
- if (sender.track) {
6481
- audioTrack.enabled = sender.track.enabled;
6482
- }
6483
- sender.replaceTrack(audioTrack);
6637
+ if (sender) {
6638
+ if (sender.track) {
6639
+ audioTrack.enabled = sender.track.enabled;
6484
6640
  }
6641
+ sender.replaceTrack(audioTrack);
6642
+ }
6485
6643
 
6486
- return stream;
6487
- });
6644
+ return stream;
6488
6645
  }
6489
6646
  }
6490
6647
 
@@ -6504,14 +6661,14 @@ class WebRTCClient extends Emitter {
6504
6661
  return null;
6505
6662
  }
6506
6663
 
6507
- // let's update the local video value
6508
- if (this.video) {
6509
- this.video = {
6510
- deviceId: {
6511
- exact: id,
6512
- },
6513
- };
6514
- }
6664
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
6665
+ const videoObject = typeof this.video === 'object' ? this.video : {};
6666
+ this.video = {
6667
+ ...videoObject,
6668
+ deviceId: {
6669
+ exact: id,
6670
+ },
6671
+ };
6515
6672
  }
6516
6673
 
6517
6674
  changeSessionVideoInputDevice(id , session ) {