@wazo/sdk 0.38.5 → 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 (135) hide show
  1. package/README.md +1 -1
  2. package/dist/wazo-sdk.js +2 -2
  3. package/esm/__tests__/api-client.test.js +148 -2
  4. package/esm/__tests__/web-rtc-client.test.js +303 -26
  5. package/esm/api/calld.js +14 -0
  6. package/esm/api/confd.js +134 -2
  7. package/esm/api/ctid-ng.js +6 -0
  8. package/esm/api-client.js +148 -2
  9. package/esm/checker/Checker.js +212 -26
  10. package/esm/checker/checks/aor.js +148 -2
  11. package/esm/checker/checks/api.js +148 -2
  12. package/esm/checker/checks/index.js +212 -26
  13. package/esm/checker/checks/wazo-websocket.js +2 -0
  14. package/esm/checker/checks/webrtc-transport.js +210 -26
  15. package/esm/checker/checks/webrtc.js +210 -26
  16. package/esm/domain/AdHocAPIConference.js +148 -2
  17. package/esm/domain/Call.js +6 -0
  18. package/esm/domain/CallSession.js +1 -1
  19. package/esm/domain/Features.js +148 -2
  20. package/esm/domain/Meeting.js +18 -0
  21. package/esm/domain/MeetingAuthorization.js +70 -0
  22. package/esm/domain/Phone/CTIPhone.js +149 -3
  23. package/esm/domain/Phone/WebRTCPhone.js +3 -3
  24. package/esm/domain/__tests__/Call.test.js +6 -0
  25. package/esm/domain/__tests__/CallSession.test.js +1 -1
  26. package/esm/domain/__tests__/IndirectTransfer.test.js +1 -1
  27. package/esm/domain/__tests__/Meeting.test.js +87 -1
  28. package/esm/domain/__tests__/MeetingAuthorization.test.js +109 -0
  29. package/esm/domain/__tests__/Room.test.js +1 -1
  30. package/esm/index.js +258 -32
  31. package/esm/lib/WazoSessionDescriptionHandler.js +22 -1
  32. package/esm/service/CallApi.js +148 -2
  33. package/esm/service/getApiClient.js +148 -2
  34. package/esm/simple/Auth.js +258 -32
  35. package/esm/simple/Configuration.js +258 -32
  36. package/esm/simple/Directory.js +148 -2
  37. package/esm/simple/Phone.js +258 -32
  38. package/esm/simple/Websocket.js +3 -0
  39. package/esm/simple/index.js +258 -32
  40. package/esm/simple/room/LocalParticipant.js +258 -32
  41. package/esm/simple/room/Participant.js +258 -32
  42. package/esm/simple/room/RemoteParticipant.js +258 -32
  43. package/esm/simple/room/Room.js +258 -32
  44. package/esm/simple/room/SipRoom.js +258 -32
  45. package/esm/simple/room/Stream.js +258 -32
  46. package/esm/simple/room/__tests__/Participant.test.js +14747 -0
  47. package/esm/simple/room/__tests__/RemoteParticipant.test.js +258 -32
  48. package/esm/simple/utils.js +258 -32
  49. package/esm/utils/__tests__/object.test.js +57 -0
  50. package/esm/utils/__tests__/sdp.test.js +50 -0
  51. package/esm/utils/__tests__/string.test.js +30 -0
  52. package/esm/utils/object.js +24 -0
  53. package/esm/utils/sdp.js +19 -1
  54. package/esm/utils/string.js +10 -0
  55. package/esm/web-rtc-client.js +210 -26
  56. package/esm/websocket-client.js +3 -1
  57. package/lib/__tests__/api-client.test.js +148 -2
  58. package/lib/__tests__/web-rtc-client.test.js +303 -26
  59. package/lib/api/calld.js +14 -0
  60. package/lib/api/confd.js +134 -2
  61. package/lib/api/ctid-ng.js +6 -0
  62. package/lib/api-client.js +148 -2
  63. package/lib/checker/Checker.js +212 -26
  64. package/lib/checker/checks/aor.js +148 -2
  65. package/lib/checker/checks/api.js +148 -2
  66. package/lib/checker/checks/index.js +212 -26
  67. package/lib/checker/checks/wazo-websocket.js +2 -0
  68. package/lib/checker/checks/webrtc-transport.js +210 -26
  69. package/lib/checker/checks/webrtc.js +210 -26
  70. package/lib/domain/AdHocAPIConference.js +148 -2
  71. package/lib/domain/Call.js +6 -0
  72. package/lib/domain/CallSession.js +1 -1
  73. package/lib/domain/Features.js +148 -2
  74. package/lib/domain/Meeting.js +18 -0
  75. package/lib/domain/MeetingAuthorization.js +79 -0
  76. package/lib/domain/Phone/CTIPhone.js +149 -3
  77. package/lib/domain/Phone/WebRTCPhone.js +3 -3
  78. package/lib/domain/__tests__/Call.test.js +6 -0
  79. package/lib/domain/__tests__/CallSession.test.js +1 -1
  80. package/lib/domain/__tests__/IndirectTransfer.test.js +1 -1
  81. package/lib/domain/__tests__/Meeting.test.js +87 -1
  82. package/lib/domain/__tests__/MeetingAuthorization.test.js +111 -0
  83. package/lib/domain/__tests__/Room.test.js +1 -1
  84. package/lib/index.js +258 -32
  85. package/lib/lib/WazoSessionDescriptionHandler.js +22 -1
  86. package/lib/service/CallApi.js +148 -2
  87. package/lib/service/getApiClient.js +148 -2
  88. package/lib/simple/Auth.js +258 -32
  89. package/lib/simple/Configuration.js +258 -32
  90. package/lib/simple/Directory.js +148 -2
  91. package/lib/simple/Phone.js +258 -32
  92. package/lib/simple/Websocket.js +3 -0
  93. package/lib/simple/index.js +258 -32
  94. package/lib/simple/room/LocalParticipant.js +258 -32
  95. package/lib/simple/room/Participant.js +258 -32
  96. package/lib/simple/room/RemoteParticipant.js +258 -32
  97. package/lib/simple/room/Room.js +258 -32
  98. package/lib/simple/room/SipRoom.js +258 -32
  99. package/lib/simple/room/Stream.js +258 -32
  100. package/lib/simple/room/__tests__/Participant.test.js +14757 -0
  101. package/lib/simple/room/__tests__/RemoteParticipant.test.js +258 -32
  102. package/lib/simple/utils.js +258 -32
  103. package/lib/utils/__tests__/object.test.js +59 -0
  104. package/lib/utils/__tests__/sdp.test.js +50 -0
  105. package/lib/utils/__tests__/string.test.js +32 -0
  106. package/lib/utils/object.js +28 -0
  107. package/lib/utils/sdp.js +19 -0
  108. package/lib/utils/string.js +14 -0
  109. package/lib/web-rtc-client.js +210 -26
  110. package/lib/websocket-client.js +3 -0
  111. package/package.json +2 -2
  112. package/src/__tests__/web-rtc-client.test.js +93 -0
  113. package/src/api/calld.js +8 -0
  114. package/src/api/confd.js +43 -2
  115. package/src/domain/Call.js +6 -0
  116. package/src/domain/CallSession.js +1 -1
  117. package/src/domain/Meeting.js +20 -0
  118. package/src/domain/MeetingAuthorization.js +67 -0
  119. package/src/domain/Phone/WebRTCPhone.js +2 -2
  120. package/src/domain/__tests__/Meeting.test.js +70 -1
  121. package/src/domain/__tests__/MeetingAuthorization.test.js +58 -0
  122. package/src/lib/WazoSessionDescriptionHandler.js +5 -2
  123. package/src/simple/room/Participant.js +40 -0
  124. package/src/simple/room/Room.js +2 -2
  125. package/src/simple/room/SipRoom.js +1 -1
  126. package/src/simple/room/__tests__/Participant.test.js +81 -0
  127. package/src/types/WebSocketMessage.js +7 -1
  128. package/src/utils/__tests__/object.test.js +35 -0
  129. package/src/utils/__tests__/sdp.test.js +33 -1
  130. package/src/utils/__tests__/string.test.js +23 -0
  131. package/src/utils/object.js +15 -0
  132. package/src/utils/sdp.js +18 -0
  133. package/src/utils/string.js +8 -0
  134. package/src/web-rtc-client.js +40 -23
  135. package/src/websocket-client.js +2 -0
@@ -778,6 +778,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
778
778
  return fixed;
779
779
  };
780
780
 
781
+ const addIcesInAllBundles = (sdp ) => {
782
+ const parsedSdp = sdpParser.parse(sdp);
783
+
784
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
785
+ if (!mediaWithCandidate) {
786
+ return sdp;
787
+ }
788
+
789
+ const { candidates } = mediaWithCandidate;
790
+
791
+ parsedSdp.media = parsedSdp.media.map(media => ({
792
+ ...media,
793
+ candidates: media.candidates || candidates,
794
+ }));
795
+
796
+ return sdpParser.write(parsedSdp);
797
+ };
798
+
781
799
  /* global RTCSessionDescriptionInit, navigator */
782
800
 
783
801
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -907,7 +925,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
907
925
 
908
926
  // Check if we got ICEs
909
927
  if (sdp.indexOf('a=candidate') !== -1) {
910
- return description;
928
+ return {
929
+ type: description.type,
930
+ sdp: addIcesInAllBundles(sdp),
931
+ };
911
932
  }
912
933
 
913
934
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -3181,6 +3202,70 @@ class ExternalApp {
3181
3202
 
3182
3203
  //
3183
3204
 
3205
+ class MeetingAuthorization {
3206
+
3207
+
3208
+
3209
+
3210
+
3211
+
3212
+ constructor({
3213
+ meetingUuid,
3214
+ uuid,
3215
+ userUuid,
3216
+ userName,
3217
+ } = {}) {
3218
+ this.meetingUuid = meetingUuid;
3219
+ this.uuid = uuid;
3220
+ this.userUuid = userUuid;
3221
+ this.userName = userName;
3222
+ }
3223
+
3224
+ setStatus(status ) {
3225
+ this.status = status;
3226
+ }
3227
+
3228
+ getStatus() {
3229
+ return this.status;
3230
+ }
3231
+
3232
+ static parse(plain ) {
3233
+ const {
3234
+ meeting_uuid: meetingUuid,
3235
+ uuid,
3236
+ guest_uuid: userUuid,
3237
+ guest_name: userName,
3238
+ } = plain;
3239
+
3240
+ return new MeetingAuthorization({
3241
+ meetingUuid,
3242
+ uuid,
3243
+ userUuid,
3244
+ userName,
3245
+ });
3246
+ }
3247
+
3248
+ static parseMany(items ) {
3249
+ if (!items) {
3250
+ return [];
3251
+ }
3252
+ return items.map(MeetingAuthorization.parse);
3253
+ }
3254
+ }
3255
+
3256
+ //
3257
+
3258
+
3259
+
3260
+
3261
+
3262
+
3263
+
3264
+
3265
+
3266
+
3267
+
3268
+
3184
3269
 
3185
3270
 
3186
3271
 
@@ -3191,6 +3276,7 @@ class ExternalApp {
3191
3276
 
3192
3277
 
3193
3278
 
3279
+
3194
3280
 
3195
3281
 
3196
3282
  class Meeting {
@@ -3205,6 +3291,8 @@ class Meeting {
3205
3291
 
3206
3292
 
3207
3293
 
3294
+
3295
+
3208
3296
 
3209
3297
  static parse(plain ) {
3210
3298
  return new Meeting({
@@ -3217,6 +3305,7 @@ class Meeting {
3217
3305
  extension: plain.exten,
3218
3306
  persistent: plain.persistent,
3219
3307
  creationTime: moment(plain.creation_time).toDate(),
3308
+ requireAuthorization: plain.require_authorization,
3220
3309
  });
3221
3310
  }
3222
3311
 
@@ -3241,6 +3330,7 @@ class Meeting {
3241
3330
  extension,
3242
3331
  persistent,
3243
3332
  creationTime,
3333
+ requireAuthorization,
3244
3334
  } = {}) {
3245
3335
  this.guestSipAuthorization = guestSipAuthorization;
3246
3336
  this.uri = uri;
@@ -3251,6 +3341,7 @@ class Meeting {
3251
3341
  this.extension = extension;
3252
3342
  this.persistent = persistent;
3253
3343
  this.creationTime = creationTime;
3344
+ this.requireAuthorization = requireAuthorization;
3254
3345
 
3255
3346
  // Useful to compare instead of instanceof with minified code
3256
3347
  this.type = 'Meeting';
@@ -3261,8 +3352,32 @@ class Meeting {
3261
3352
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
3262
3353
  return { username, secret };
3263
3354
  }
3355
+
3264
3356
  }
3265
3357
 
3358
+ //
3359
+
3360
+ const camelToUnderscore = (key ) => {
3361
+ if (typeof key !== 'string') {
3362
+ throw new Error('Input is not a string');
3363
+ }
3364
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
3365
+ };
3366
+
3367
+ //
3368
+
3369
+ const convertKeysFromCamelToUnderscore = (args ) => {
3370
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
3371
+ throw new Error('Input is not an object');
3372
+ }
3373
+
3374
+ return Object.keys(args).reduce((acc, key) => {
3375
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
3376
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
3377
+ return acc;
3378
+ }, {});
3379
+ };
3380
+
3266
3381
  /* */
3267
3382
 
3268
3383
  var confdMethods = (client , baseUrl ) => ({
@@ -3331,8 +3446,18 @@ var confdMethods = (client , baseUrl ) => ({
3331
3446
  getMyMeetings: () =>
3332
3447
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
3333
3448
 
3334
- createMyMeeting: (name , persistent ) =>
3335
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
3449
+ createMyMeeting: (args ) =>
3450
+ client
3451
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
3452
+ .then(Meeting.parse),
3453
+
3454
+ updateMyMeeting: (meetingUuid , data ) =>
3455
+ client.put(
3456
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
3457
+ convertKeysFromCamelToUnderscore(data),
3458
+ null,
3459
+ ApiRequester.successResponseParser,
3460
+ ),
3336
3461
 
3337
3462
  deleteMyMeeting: (meetingUuid ) =>
3338
3463
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -3340,8 +3465,36 @@ var confdMethods = (client , baseUrl ) => ({
3340
3465
  getMeeting: (meetingUuid ) =>
3341
3466
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
3342
3467
 
3468
+ meetingAuthorizations: (meetingUuid ) =>
3469
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
3470
+
3471
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
3472
+ client.put(
3473
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
3474
+ {},
3475
+ null,
3476
+ ApiRequester.successResponseParser,
3477
+ ),
3478
+
3479
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
3480
+ client.put(
3481
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
3482
+ {},
3483
+ null,
3484
+ ApiRequester.successResponseParser,
3485
+ ),
3486
+
3343
3487
  guestGetMeeting: (meetingUuid ) =>
3344
3488
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
3489
+
3490
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
3491
+ client
3492
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
3493
+ .then(MeetingAuthorization.parse),
3494
+
3495
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
3496
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
3497
+
3345
3498
  });
3346
3499
 
3347
3500
  //
@@ -3607,6 +3760,7 @@ const RECORD_STATE_ACTIVE = 'active';
3607
3760
 
3608
3761
 
3609
3762
 
3763
+
3610
3764
 
3611
3765
 
3612
3766
 
@@ -3617,6 +3771,7 @@ const RECORD_STATE_ACTIVE = 'active';
3617
3771
 
3618
3772
 
3619
3773
 
3774
+
3620
3775
 
3621
3776
 
3622
3777
 
@@ -3645,6 +3800,7 @@ class Call {
3645
3800
 
3646
3801
 
3647
3802
 
3803
+
3648
3804
 
3649
3805
 
3650
3806
 
@@ -3669,6 +3825,7 @@ class Call {
3669
3825
  calleeNumber: plain.peer_caller_id_number,
3670
3826
  dialedExtension: plain.dialed_extension,
3671
3827
  isCaller: plain.is_caller,
3828
+ isVideo: plain.is_video,
3672
3829
  muted: plain.muted,
3673
3830
  onHold: plain.on_hold,
3674
3831
  status: plain.status,
@@ -3692,6 +3849,7 @@ class Call {
3692
3849
  calleeNumber,
3693
3850
  dialedExtension,
3694
3851
  isCaller,
3852
+ isVideo,
3695
3853
  lineId,
3696
3854
  muted,
3697
3855
  onHold,
@@ -3715,6 +3873,7 @@ class Call {
3715
3873
  this.startingTime = startingTime;
3716
3874
  this.talkingToIds = talkingToIds || [];
3717
3875
  this.recording = recording;
3876
+ this.isVideo = !!isVideo;
3718
3877
 
3719
3878
  // Useful to compare instead of instanceof with minified code
3720
3879
  this.type = 'Call';
@@ -4774,6 +4933,14 @@ var calldMethods = (client , baseUrl ) => ({
4774
4933
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
4775
4934
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
4776
4935
 
4936
+ banMeetingParticipant: (meetingUuid , participantUuid ) =>
4937
+ client.delete(
4938
+ `${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
4939
+ null,
4940
+ null,
4941
+ ApiRequester.successResponseParser,
4942
+ ),
4943
+
4777
4944
  listTrunks: () => client.get(`${baseUrl}/trunks`),
4778
4945
 
4779
4946
  mute: (callId ) =>
@@ -6414,41 +6581,58 @@ class WebRTCClient extends Emitter {
6414
6581
  });
6415
6582
  }
6416
6583
 
6417
- changeAudioInputDevice(id , session ) {
6584
+ async changeAudioInputDevice(id , session , force ) {
6418
6585
  const currentId = this.getAudioDeviceId();
6419
6586
  logger.info('setting audio input device', { id, currentId, session: !!session });
6420
6587
 
6421
- if (id === currentId) {
6588
+ if (!force && id === currentId) {
6422
6589
  return null;
6423
6590
  }
6424
6591
 
6592
+ // in order to handle an audio track change for default devices
6593
+ // we need the actual id of the device (not 'default')
6594
+ let deviceId = id;
6595
+ if (id === 'default' && navigator.mediaDevices) {
6596
+ const devices = await navigator.mediaDevices.enumerateDevices();
6597
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
6598
+ if (defaultDevice) {
6599
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
6600
+ const targetDevice = devices.find(device => device.label === deviceLabel);
6601
+ if (targetDevice) {
6602
+ deviceId = targetDevice.deviceId;
6603
+ if (!force && deviceId === currentId) {
6604
+ return null;
6605
+ }
6606
+ }
6607
+ }
6608
+ }
6609
+
6425
6610
  // let's update the local audio value
6426
6611
  if (this.audio) {
6427
6612
  this.audio = {
6428
6613
  deviceId: {
6429
- exact: id,
6614
+ exact: deviceId,
6430
6615
  },
6431
6616
  };
6432
6617
  }
6433
6618
 
6434
- if (session) {
6619
+ if (session && navigator.mediaDevices) {
6435
6620
  const sdh = session.sessionDescriptionHandler;
6436
6621
  const pc = sdh.peerConnection;
6437
6622
 
6438
- // $FlowFixMe
6439
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
6440
- const audioTrack = stream.getAudioTracks()[0];
6441
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
6623
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
6624
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
6625
+ const audioTrack = stream.getAudioTracks()[0];
6626
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
6442
6627
 
6443
- if (sender) {
6444
- if (sender.track) {
6445
- audioTrack.enabled = sender.track.enabled;
6446
- }
6447
- sender.replaceTrack(audioTrack);
6628
+ if (sender) {
6629
+ if (sender.track) {
6630
+ audioTrack.enabled = sender.track.enabled;
6448
6631
  }
6632
+ sender.replaceTrack(audioTrack);
6633
+ }
6449
6634
 
6450
- return stream;
6451
- });
6635
+ return stream;
6452
6636
  }
6453
6637
  }
6454
6638
 
@@ -6468,14 +6652,14 @@ class WebRTCClient extends Emitter {
6468
6652
  return null;
6469
6653
  }
6470
6654
 
6471
- // let's update the local video value
6472
- if (this.video) {
6473
- this.video = {
6474
- deviceId: {
6475
- exact: id,
6476
- },
6477
- };
6478
- }
6655
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
6656
+ const videoObject = typeof this.video === 'object' ? this.video : {};
6657
+ this.video = {
6658
+ ...videoObject,
6659
+ deviceId: {
6660
+ exact: id,
6661
+ },
6662
+ };
6479
6663
  }
6480
6664
 
6481
6665
  changeSessionVideoInputDevice(id , session ) {
@@ -30,6 +30,7 @@ const RECORD_STATE_ACTIVE = 'active';
30
30
 
31
31
 
32
32
 
33
+
33
34
 
34
35
 
35
36
 
@@ -40,6 +41,7 @@ const RECORD_STATE_ACTIVE = 'active';
40
41
 
41
42
 
42
43
 
44
+
43
45
 
44
46
 
45
47
 
@@ -68,6 +70,7 @@ class Call {
68
70
 
69
71
 
70
72
 
73
+
71
74
 
72
75
 
73
76
 
@@ -92,6 +95,7 @@ class Call {
92
95
  calleeNumber: plain.peer_caller_id_number,
93
96
  dialedExtension: plain.dialed_extension,
94
97
  isCaller: plain.is_caller,
98
+ isVideo: plain.is_video,
95
99
  muted: plain.muted,
96
100
  onHold: plain.on_hold,
97
101
  status: plain.status,
@@ -115,6 +119,7 @@ class Call {
115
119
  calleeNumber,
116
120
  dialedExtension,
117
121
  isCaller,
122
+ isVideo,
118
123
  lineId,
119
124
  muted,
120
125
  onHold,
@@ -138,6 +143,7 @@ class Call {
138
143
  this.startingTime = startingTime;
139
144
  this.talkingToIds = talkingToIds || [];
140
145
  this.recording = recording;
146
+ this.isVideo = !!isVideo;
141
147
 
142
148
  // Useful to compare instead of instanceof with minified code
143
149
  this.type = 'Call';
@@ -2834,6 +2840,70 @@ class ExternalApp {
2834
2840
 
2835
2841
  //
2836
2842
 
2843
+ class MeetingAuthorization {
2844
+
2845
+
2846
+
2847
+
2848
+
2849
+
2850
+ constructor({
2851
+ meetingUuid,
2852
+ uuid,
2853
+ userUuid,
2854
+ userName,
2855
+ } = {}) {
2856
+ this.meetingUuid = meetingUuid;
2857
+ this.uuid = uuid;
2858
+ this.userUuid = userUuid;
2859
+ this.userName = userName;
2860
+ }
2861
+
2862
+ setStatus(status ) {
2863
+ this.status = status;
2864
+ }
2865
+
2866
+ getStatus() {
2867
+ return this.status;
2868
+ }
2869
+
2870
+ static parse(plain ) {
2871
+ const {
2872
+ meeting_uuid: meetingUuid,
2873
+ uuid,
2874
+ guest_uuid: userUuid,
2875
+ guest_name: userName,
2876
+ } = plain;
2877
+
2878
+ return new MeetingAuthorization({
2879
+ meetingUuid,
2880
+ uuid,
2881
+ userUuid,
2882
+ userName,
2883
+ });
2884
+ }
2885
+
2886
+ static parseMany(items ) {
2887
+ if (!items) {
2888
+ return [];
2889
+ }
2890
+ return items.map(MeetingAuthorization.parse);
2891
+ }
2892
+ }
2893
+
2894
+ //
2895
+
2896
+
2897
+
2898
+
2899
+
2900
+
2901
+
2902
+
2903
+
2904
+
2905
+
2906
+
2837
2907
 
2838
2908
 
2839
2909
 
@@ -2844,6 +2914,7 @@ class ExternalApp {
2844
2914
 
2845
2915
 
2846
2916
 
2917
+
2847
2918
 
2848
2919
 
2849
2920
  class Meeting {
@@ -2858,6 +2929,8 @@ class Meeting {
2858
2929
 
2859
2930
 
2860
2931
 
2932
+
2933
+
2861
2934
 
2862
2935
  static parse(plain ) {
2863
2936
  return new Meeting({
@@ -2870,6 +2943,7 @@ class Meeting {
2870
2943
  extension: plain.exten,
2871
2944
  persistent: plain.persistent,
2872
2945
  creationTime: moment(plain.creation_time).toDate(),
2946
+ requireAuthorization: plain.require_authorization,
2873
2947
  });
2874
2948
  }
2875
2949
 
@@ -2894,6 +2968,7 @@ class Meeting {
2894
2968
  extension,
2895
2969
  persistent,
2896
2970
  creationTime,
2971
+ requireAuthorization,
2897
2972
  } = {}) {
2898
2973
  this.guestSipAuthorization = guestSipAuthorization;
2899
2974
  this.uri = uri;
@@ -2904,6 +2979,7 @@ class Meeting {
2904
2979
  this.extension = extension;
2905
2980
  this.persistent = persistent;
2906
2981
  this.creationTime = creationTime;
2982
+ this.requireAuthorization = requireAuthorization;
2907
2983
 
2908
2984
  // Useful to compare instead of instanceof with minified code
2909
2985
  this.type = 'Meeting';
@@ -2914,8 +2990,32 @@ class Meeting {
2914
2990
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
2915
2991
  return { username, secret };
2916
2992
  }
2993
+
2917
2994
  }
2918
2995
 
2996
+ //
2997
+
2998
+ const camelToUnderscore = (key ) => {
2999
+ if (typeof key !== 'string') {
3000
+ throw new Error('Input is not a string');
3001
+ }
3002
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
3003
+ };
3004
+
3005
+ //
3006
+
3007
+ const convertKeysFromCamelToUnderscore = (args ) => {
3008
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
3009
+ throw new Error('Input is not an object');
3010
+ }
3011
+
3012
+ return Object.keys(args).reduce((acc, key) => {
3013
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
3014
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
3015
+ return acc;
3016
+ }, {});
3017
+ };
3018
+
2919
3019
  /* */
2920
3020
 
2921
3021
  var confdMethods = (client , baseUrl ) => ({
@@ -2984,8 +3084,18 @@ var confdMethods = (client , baseUrl ) => ({
2984
3084
  getMyMeetings: () =>
2985
3085
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2986
3086
 
2987
- createMyMeeting: (name , persistent ) =>
2988
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
3087
+ createMyMeeting: (args ) =>
3088
+ client
3089
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
3090
+ .then(Meeting.parse),
3091
+
3092
+ updateMyMeeting: (meetingUuid , data ) =>
3093
+ client.put(
3094
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
3095
+ convertKeysFromCamelToUnderscore(data),
3096
+ null,
3097
+ ApiRequester.successResponseParser,
3098
+ ),
2989
3099
 
2990
3100
  deleteMyMeeting: (meetingUuid ) =>
2991
3101
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2993,8 +3103,36 @@ var confdMethods = (client , baseUrl ) => ({
2993
3103
  getMeeting: (meetingUuid ) =>
2994
3104
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
2995
3105
 
3106
+ meetingAuthorizations: (meetingUuid ) =>
3107
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
3108
+
3109
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
3110
+ client.put(
3111
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
3112
+ {},
3113
+ null,
3114
+ ApiRequester.successResponseParser,
3115
+ ),
3116
+
3117
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
3118
+ client.put(
3119
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
3120
+ {},
3121
+ null,
3122
+ ApiRequester.successResponseParser,
3123
+ ),
3124
+
2996
3125
  guestGetMeeting: (meetingUuid ) =>
2997
3126
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
3127
+
3128
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
3129
+ client
3130
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
3131
+ .then(MeetingAuthorization.parse),
3132
+
3133
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
3134
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
3135
+
2998
3136
  });
2999
3137
 
3000
3138
  //
@@ -4201,6 +4339,14 @@ var calldMethods = (client , baseUrl ) => ({
4201
4339
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
4202
4340
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
4203
4341
 
4342
+ banMeetingParticipant: (meetingUuid , participantUuid ) =>
4343
+ client.delete(
4344
+ `${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
4345
+ null,
4346
+ null,
4347
+ ApiRequester.successResponseParser,
4348
+ ),
4349
+
4204
4350
  listTrunks: () => client.get(`${baseUrl}/trunks`),
4205
4351
 
4206
4352
  mute: (callId ) =>
@@ -25,6 +25,7 @@ const RECORD_STATE_ACTIVE = 'active';
25
25
 
26
26
 
27
27
 
28
+
28
29
 
29
30
 
30
31
 
@@ -35,6 +36,7 @@ const RECORD_STATE_ACTIVE = 'active';
35
36
 
36
37
 
37
38
 
39
+
38
40
 
39
41
 
40
42
 
@@ -63,6 +65,7 @@ class Call {
63
65
 
64
66
 
65
67
 
68
+
66
69
 
67
70
 
68
71
 
@@ -87,6 +90,7 @@ class Call {
87
90
  calleeNumber: plain.peer_caller_id_number,
88
91
  dialedExtension: plain.dialed_extension,
89
92
  isCaller: plain.is_caller,
93
+ isVideo: plain.is_video,
90
94
  muted: plain.muted,
91
95
  onHold: plain.on_hold,
92
96
  status: plain.status,
@@ -110,6 +114,7 @@ class Call {
110
114
  calleeNumber,
111
115
  dialedExtension,
112
116
  isCaller,
117
+ isVideo,
113
118
  lineId,
114
119
  muted,
115
120
  onHold,
@@ -133,6 +138,7 @@ class Call {
133
138
  this.startingTime = startingTime;
134
139
  this.talkingToIds = talkingToIds || [];
135
140
  this.recording = recording;
141
+ this.isVideo = !!isVideo;
136
142
 
137
143
  // Useful to compare instead of instanceof with minified code
138
144
  this.type = 'Call';
@@ -414,7 +414,7 @@ class CallSession {
414
414
  ringing: call.isRinging(),
415
415
  answered: call.isUp(),
416
416
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
417
- cameraEnabled: false,
417
+ cameraEnabled: call.isVideo,
418
418
  dialedExtension: call.dialedExtension,
419
419
  call,
420
420
  conference: false, // @FIXME?