@wazo/sdk 0.38.4 → 0.38.7

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 (99) hide show
  1. package/README.md +4 -4
  2. package/dist/wazo-sdk.js +2 -2
  3. package/esm/__tests__/api-client.test.js +6 -0
  4. package/esm/__tests__/web-rtc-client.test.js +88 -3
  5. package/esm/api/calld.js +6 -0
  6. package/esm/api/ctid-ng.js +6 -0
  7. package/esm/api-client.js +6 -0
  8. package/esm/checker/Checker.js +38 -3
  9. package/esm/checker/checks/aor.js +6 -0
  10. package/esm/checker/checks/api.js +6 -0
  11. package/esm/checker/checks/index.js +38 -3
  12. package/esm/checker/checks/webrtc-transport.js +38 -3
  13. package/esm/checker/checks/webrtc.js +38 -3
  14. package/esm/domain/AdHocAPIConference.js +6 -0
  15. package/esm/domain/Call.js +6 -0
  16. package/esm/domain/CallSession.js +1 -1
  17. package/esm/domain/Features.js +6 -0
  18. package/esm/domain/Phone/CTIPhone.js +7 -1
  19. package/esm/domain/Phone/WebRTCPhone.js +3 -3
  20. package/esm/domain/__tests__/Call.test.js +6 -0
  21. package/esm/domain/__tests__/CallSession.test.js +1 -1
  22. package/esm/domain/__tests__/IndirectTransfer.test.js +1 -1
  23. package/esm/domain/__tests__/Line.test.js +5 -5
  24. package/esm/domain/__tests__/Room.test.js +1 -1
  25. package/esm/index.js +42 -8
  26. package/esm/lib/WazoSessionDescriptionHandler.js +30 -1
  27. package/esm/service/CallApi.js +6 -0
  28. package/esm/service/getApiClient.js +6 -0
  29. package/esm/simple/Auth.js +42 -8
  30. package/esm/simple/Configuration.js +42 -8
  31. package/esm/simple/Directory.js +6 -0
  32. package/esm/simple/Phone.js +42 -8
  33. package/esm/simple/Softphone.js +1 -2
  34. package/esm/simple/index.js +42 -8
  35. package/esm/simple/room/LocalParticipant.js +42 -8
  36. package/esm/simple/room/Participant.js +42 -8
  37. package/esm/simple/room/RemoteParticipant.js +42 -8
  38. package/esm/simple/room/Room.js +42 -8
  39. package/esm/simple/room/SipRoom.js +42 -8
  40. package/esm/simple/room/Stream.js +42 -8
  41. package/esm/simple/room/__tests__/RemoteParticipant.test.js +42 -8
  42. package/esm/simple/utils.js +42 -8
  43. package/esm/utils/__tests__/sdp.test.js +50 -0
  44. package/esm/utils/sdp.js +19 -1
  45. package/esm/web-rtc-client.js +38 -3
  46. package/lib/__tests__/api-client.test.js +6 -0
  47. package/lib/__tests__/web-rtc-client.test.js +88 -3
  48. package/lib/api/calld.js +6 -0
  49. package/lib/api/ctid-ng.js +6 -0
  50. package/lib/api-client.js +6 -0
  51. package/lib/checker/Checker.js +38 -3
  52. package/lib/checker/checks/aor.js +6 -0
  53. package/lib/checker/checks/api.js +6 -0
  54. package/lib/checker/checks/index.js +38 -3
  55. package/lib/checker/checks/webrtc-transport.js +38 -3
  56. package/lib/checker/checks/webrtc.js +38 -3
  57. package/lib/domain/AdHocAPIConference.js +6 -0
  58. package/lib/domain/Call.js +6 -0
  59. package/lib/domain/CallSession.js +1 -1
  60. package/lib/domain/Features.js +6 -0
  61. package/lib/domain/Phone/CTIPhone.js +7 -1
  62. package/lib/domain/Phone/WebRTCPhone.js +3 -3
  63. package/lib/domain/__tests__/Call.test.js +6 -0
  64. package/lib/domain/__tests__/CallSession.test.js +1 -1
  65. package/lib/domain/__tests__/IndirectTransfer.test.js +1 -1
  66. package/lib/domain/__tests__/Line.test.js +5 -5
  67. package/lib/domain/__tests__/Room.test.js +1 -1
  68. package/lib/index.js +42 -8
  69. package/lib/lib/WazoSessionDescriptionHandler.js +30 -1
  70. package/lib/service/CallApi.js +6 -0
  71. package/lib/service/getApiClient.js +6 -0
  72. package/lib/simple/Auth.js +42 -8
  73. package/lib/simple/Configuration.js +42 -8
  74. package/lib/simple/Directory.js +6 -0
  75. package/lib/simple/Phone.js +42 -8
  76. package/lib/simple/Softphone.js +1 -2
  77. package/lib/simple/index.js +42 -8
  78. package/lib/simple/room/LocalParticipant.js +42 -8
  79. package/lib/simple/room/Participant.js +42 -8
  80. package/lib/simple/room/RemoteParticipant.js +42 -8
  81. package/lib/simple/room/Room.js +42 -8
  82. package/lib/simple/room/SipRoom.js +42 -8
  83. package/lib/simple/room/Stream.js +42 -8
  84. package/lib/simple/room/__tests__/RemoteParticipant.test.js +42 -8
  85. package/lib/simple/utils.js +42 -8
  86. package/lib/utils/__tests__/sdp.test.js +50 -0
  87. package/lib/utils/sdp.js +19 -0
  88. package/lib/web-rtc-client.js +38 -3
  89. package/package.json +1 -1
  90. package/src/__tests__/web-rtc-client.test.js +50 -0
  91. package/src/domain/Call.js +6 -0
  92. package/src/domain/CallSession.js +1 -1
  93. package/src/domain/Phone/WebRTCPhone.js +2 -2
  94. package/src/domain/__tests__/Line.test.js +5 -5
  95. package/src/lib/WazoSessionDescriptionHandler.js +13 -2
  96. package/src/simple/Softphone.js +1 -2
  97. package/src/utils/__tests__/sdp.test.js +33 -1
  98. package/src/utils/sdp.js +18 -0
  99. package/src/web-rtc-client.js +2 -2
@@ -3051,6 +3051,7 @@ const RECORD_STATE_ACTIVE = 'active';
3051
3051
 
3052
3052
 
3053
3053
 
3054
+
3054
3055
 
3055
3056
 
3056
3057
 
@@ -3061,6 +3062,7 @@ const RECORD_STATE_ACTIVE = 'active';
3061
3062
 
3062
3063
 
3063
3064
 
3065
+
3064
3066
 
3065
3067
 
3066
3068
 
@@ -3089,6 +3091,7 @@ class Call {
3089
3091
 
3090
3092
 
3091
3093
 
3094
+
3092
3095
 
3093
3096
 
3094
3097
 
@@ -3113,6 +3116,7 @@ class Call {
3113
3116
  calleeNumber: plain.peer_caller_id_number,
3114
3117
  dialedExtension: plain.dialed_extension,
3115
3118
  isCaller: plain.is_caller,
3119
+ isVideo: plain.is_video,
3116
3120
  muted: plain.muted,
3117
3121
  onHold: plain.on_hold,
3118
3122
  status: plain.status,
@@ -3136,6 +3140,7 @@ class Call {
3136
3140
  calleeNumber,
3137
3141
  dialedExtension,
3138
3142
  isCaller,
3143
+ isVideo,
3139
3144
  lineId,
3140
3145
  muted,
3141
3146
  onHold,
@@ -3159,6 +3164,7 @@ class Call {
3159
3164
  this.startingTime = startingTime;
3160
3165
  this.talkingToIds = talkingToIds || [];
3161
3166
  this.recording = recording;
3167
+ this.isVideo = !!isVideo;
3162
3168
 
3163
3169
  // Useful to compare instead of instanceof with minified code
3164
3170
  this.type = 'Call';
@@ -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;
@@ -876,6 +894,14 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
876
894
  wazoLogger.trace('onicecandidate', event.candidate ? event.candidate.candidate : { done: true });
877
895
  if (event.candidate) {
878
896
  this.gatheredCandidates.push(parseCandidate(event.candidate.candidate));
897
+
898
+ // When receiving a `srflx` or a `relay` candidate, consider the negotiation done.
899
+ if (event.candidate.candidate.indexOf('srflx') !== -1 || event.candidate.candidate.indexOf('relay') !== -1) {
900
+ wazoLogger.info('A valid ice was found, triggering ice gathering complete callback.', {
901
+ ice: event.candidate.candidate,
902
+ });
903
+ this.iceGatheringComplete();
904
+ }
879
905
  }
880
906
  };
881
907
 
@@ -899,7 +925,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
899
925
 
900
926
  // Check if we got ICEs
901
927
  if (sdp.indexOf('a=candidate') !== -1) {
902
- return description;
928
+ return {
929
+ type: description.type,
930
+ sdp: addIcesInAllBundles(sdp),
931
+ };
903
932
  }
904
933
 
905
934
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -3599,6 +3628,7 @@ const RECORD_STATE_ACTIVE = 'active';
3599
3628
 
3600
3629
 
3601
3630
 
3631
+
3602
3632
 
3603
3633
 
3604
3634
 
@@ -3609,6 +3639,7 @@ const RECORD_STATE_ACTIVE = 'active';
3609
3639
 
3610
3640
 
3611
3641
 
3642
+
3612
3643
 
3613
3644
 
3614
3645
 
@@ -3637,6 +3668,7 @@ class Call {
3637
3668
 
3638
3669
 
3639
3670
 
3671
+
3640
3672
 
3641
3673
 
3642
3674
 
@@ -3661,6 +3693,7 @@ class Call {
3661
3693
  calleeNumber: plain.peer_caller_id_number,
3662
3694
  dialedExtension: plain.dialed_extension,
3663
3695
  isCaller: plain.is_caller,
3696
+ isVideo: plain.is_video,
3664
3697
  muted: plain.muted,
3665
3698
  onHold: plain.on_hold,
3666
3699
  status: plain.status,
@@ -3684,6 +3717,7 @@ class Call {
3684
3717
  calleeNumber,
3685
3718
  dialedExtension,
3686
3719
  isCaller,
3720
+ isVideo,
3687
3721
  lineId,
3688
3722
  muted,
3689
3723
  onHold,
@@ -3707,6 +3741,7 @@ class Call {
3707
3741
  this.startingTime = startingTime;
3708
3742
  this.talkingToIds = talkingToIds || [];
3709
3743
  this.recording = recording;
3744
+ this.isVideo = !!isVideo;
3710
3745
 
3711
3746
  // Useful to compare instead of instanceof with minified code
3712
3747
  this.type = 'Call';
@@ -6406,11 +6441,11 @@ class WebRTCClient extends Emitter {
6406
6441
  });
6407
6442
  }
6408
6443
 
6409
- changeAudioInputDevice(id , session ) {
6444
+ changeAudioInputDevice(id , session , force ) {
6410
6445
  const currentId = this.getAudioDeviceId();
6411
6446
  logger.info('setting audio input device', { id, currentId, session: !!session });
6412
6447
 
6413
- if (id === currentId) {
6448
+ if (!force && id === currentId) {
6414
6449
  return null;
6415
6450
  }
6416
6451
 
@@ -7594,3 +7629,53 @@ describe('WebRTC client', () => {
7594
7629
  expect(client.isAudioMuted(oldKindUnmuted)).toBeFalsy();
7595
7630
  });
7596
7631
  });
7632
+
7633
+ describe('changeAudioInputDevice', () => {
7634
+ const defaultId = 'default';
7635
+ const deviceId = 'device1';
7636
+ const constraints = { audio: { deviceId: { exact: defaultId } }, video: null };
7637
+
7638
+ const session = {
7639
+ sessionDescriptionHandler: {
7640
+ peerConnection: {
7641
+ getSenders: () => [{ track: { kind: 'audio', enabled: true } }],
7642
+ },
7643
+ },
7644
+ };
7645
+
7646
+ const stream = {};
7647
+ const getAudioTracksMock = jest.fn(() => []);
7648
+ Object.defineProperty(stream, 'getAudioTracks', {
7649
+ value: getAudioTracksMock,
7650
+ });
7651
+
7652
+ const getUserMediaMock = jest.fn(async () => {
7653
+ return new Promise(resolve => {
7654
+ resolve(stream);
7655
+ });
7656
+ });
7657
+
7658
+ Object.defineProperty(global.navigator, 'mediaDevices', {
7659
+ value: {
7660
+ getUserMedia: getUserMediaMock,
7661
+ },
7662
+ });
7663
+
7664
+ it('should change the audio input track if the provided id is different', async () => {
7665
+ client.setMediaConstraints(constraints);
7666
+ expect(client.getAudioDeviceId()).toBe(defaultId);
7667
+ expect(client.changeAudioInputDevice(deviceId, session)).toBeTruthy();
7668
+ });
7669
+
7670
+ it('should NOT change the audio input track if the provided id is the same', async () => {
7671
+ client.setMediaConstraints(constraints);
7672
+ expect(client.getAudioDeviceId()).toBe(defaultId);
7673
+ expect(client.changeAudioInputDevice(defaultId, session)).toBeFalsy();
7674
+ });
7675
+
7676
+ it('should change the audio input track if the provided id is the same and force param is TRUE', async () => {
7677
+ client.setMediaConstraints(constraints);
7678
+ expect(client.getAudioDeviceId()).toBe(defaultId);
7679
+ expect(client.changeAudioInputDevice(defaultId, session, true)).toBeTruthy();
7680
+ });
7681
+ });
package/esm/api/calld.js CHANGED
@@ -968,6 +968,7 @@ const RECORD_STATE_ACTIVE = 'active';
968
968
 
969
969
 
970
970
 
971
+
971
972
 
972
973
 
973
974
 
@@ -978,6 +979,7 @@ const RECORD_STATE_ACTIVE = 'active';
978
979
 
979
980
 
980
981
 
982
+
981
983
 
982
984
 
983
985
 
@@ -1006,6 +1008,7 @@ class Call {
1006
1008
 
1007
1009
 
1008
1010
 
1011
+
1009
1012
 
1010
1013
 
1011
1014
 
@@ -1030,6 +1033,7 @@ class Call {
1030
1033
  calleeNumber: plain.peer_caller_id_number,
1031
1034
  dialedExtension: plain.dialed_extension,
1032
1035
  isCaller: plain.is_caller,
1036
+ isVideo: plain.is_video,
1033
1037
  muted: plain.muted,
1034
1038
  onHold: plain.on_hold,
1035
1039
  status: plain.status,
@@ -1053,6 +1057,7 @@ class Call {
1053
1057
  calleeNumber,
1054
1058
  dialedExtension,
1055
1059
  isCaller,
1060
+ isVideo,
1056
1061
  lineId,
1057
1062
  muted,
1058
1063
  onHold,
@@ -1076,6 +1081,7 @@ class Call {
1076
1081
  this.startingTime = startingTime;
1077
1082
  this.talkingToIds = talkingToIds || [];
1078
1083
  this.recording = recording;
1084
+ this.isVideo = !!isVideo;
1079
1085
 
1080
1086
  // Useful to compare instead of instanceof with minified code
1081
1087
  this.type = 'Call';
@@ -971,6 +971,7 @@ const RECORD_STATE_ACTIVE = 'active';
971
971
 
972
972
 
973
973
 
974
+
974
975
 
975
976
 
976
977
 
@@ -981,6 +982,7 @@ const RECORD_STATE_ACTIVE = 'active';
981
982
 
982
983
 
983
984
 
985
+
984
986
 
985
987
 
986
988
 
@@ -1009,6 +1011,7 @@ class Call {
1009
1011
 
1010
1012
 
1011
1013
 
1014
+
1012
1015
 
1013
1016
 
1014
1017
 
@@ -1033,6 +1036,7 @@ class Call {
1033
1036
  calleeNumber: plain.peer_caller_id_number,
1034
1037
  dialedExtension: plain.dialed_extension,
1035
1038
  isCaller: plain.is_caller,
1039
+ isVideo: plain.is_video,
1036
1040
  muted: plain.muted,
1037
1041
  onHold: plain.on_hold,
1038
1042
  status: plain.status,
@@ -1056,6 +1060,7 @@ class Call {
1056
1060
  calleeNumber,
1057
1061
  dialedExtension,
1058
1062
  isCaller,
1063
+ isVideo,
1059
1064
  lineId,
1060
1065
  muted,
1061
1066
  onHold,
@@ -1079,6 +1084,7 @@ class Call {
1079
1084
  this.startingTime = startingTime;
1080
1085
  this.talkingToIds = talkingToIds || [];
1081
1086
  this.recording = recording;
1087
+ this.isVideo = !!isVideo;
1082
1088
 
1083
1089
  // Useful to compare instead of instanceof with minified code
1084
1090
  this.type = 'Call';
package/esm/api-client.js CHANGED
@@ -3051,6 +3051,7 @@ const RECORD_STATE_ACTIVE = 'active';
3051
3051
 
3052
3052
 
3053
3053
 
3054
+
3054
3055
 
3055
3056
 
3056
3057
 
@@ -3061,6 +3062,7 @@ const RECORD_STATE_ACTIVE = 'active';
3061
3062
 
3062
3063
 
3063
3064
 
3065
+
3064
3066
 
3065
3067
 
3066
3068
 
@@ -3089,6 +3091,7 @@ class Call {
3089
3091
 
3090
3092
 
3091
3093
 
3094
+
3092
3095
 
3093
3096
 
3094
3097
 
@@ -3113,6 +3116,7 @@ class Call {
3113
3116
  calleeNumber: plain.peer_caller_id_number,
3114
3117
  dialedExtension: plain.dialed_extension,
3115
3118
  isCaller: plain.is_caller,
3119
+ isVideo: plain.is_video,
3116
3120
  muted: plain.muted,
3117
3121
  onHold: plain.on_hold,
3118
3122
  status: plain.status,
@@ -3136,6 +3140,7 @@ class Call {
3136
3140
  calleeNumber,
3137
3141
  dialedExtension,
3138
3142
  isCaller,
3143
+ isVideo,
3139
3144
  lineId,
3140
3145
  muted,
3141
3146
  onHold,
@@ -3159,6 +3164,7 @@ class Call {
3159
3164
  this.startingTime = startingTime;
3160
3165
  this.talkingToIds = talkingToIds || [];
3161
3166
  this.recording = recording;
3167
+ this.isVideo = !!isVideo;
3162
3168
 
3163
3169
  // Useful to compare instead of instanceof with minified code
3164
3170
  this.type = 'Call';
@@ -3069,6 +3069,7 @@ const RECORD_STATE_ACTIVE = 'active';
3069
3069
 
3070
3070
 
3071
3071
 
3072
+
3072
3073
 
3073
3074
 
3074
3075
 
@@ -3079,6 +3080,7 @@ const RECORD_STATE_ACTIVE = 'active';
3079
3080
 
3080
3081
 
3081
3082
 
3083
+
3082
3084
 
3083
3085
 
3084
3086
 
@@ -3107,6 +3109,7 @@ class Call {
3107
3109
 
3108
3110
 
3109
3111
 
3112
+
3110
3113
 
3111
3114
 
3112
3115
 
@@ -3131,6 +3134,7 @@ class Call {
3131
3134
  calleeNumber: plain.peer_caller_id_number,
3132
3135
  dialedExtension: plain.dialed_extension,
3133
3136
  isCaller: plain.is_caller,
3137
+ isVideo: plain.is_video,
3134
3138
  muted: plain.muted,
3135
3139
  onHold: plain.on_hold,
3136
3140
  status: plain.status,
@@ -3154,6 +3158,7 @@ class Call {
3154
3158
  calleeNumber,
3155
3159
  dialedExtension,
3156
3160
  isCaller,
3161
+ isVideo,
3157
3162
  lineId,
3158
3163
  muted,
3159
3164
  onHold,
@@ -3177,6 +3182,7 @@ class Call {
3177
3182
  this.startingTime = startingTime;
3178
3183
  this.talkingToIds = talkingToIds || [];
3179
3184
  this.recording = recording;
3185
+ this.isVideo = !!isVideo;
3180
3186
 
3181
3187
  // Useful to compare instead of instanceof with minified code
3182
3188
  this.type = 'Call';
@@ -5508,6 +5514,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
5508
5514
  return fixed;
5509
5515
  };
5510
5516
 
5517
+ const addIcesInAllBundles = (sdp ) => {
5518
+ const parsedSdp = sdpParser.parse(sdp);
5519
+
5520
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
5521
+ if (!mediaWithCandidate) {
5522
+ return sdp;
5523
+ }
5524
+
5525
+ const { candidates } = mediaWithCandidate;
5526
+
5527
+ parsedSdp.media = parsedSdp.media.map(media => ({
5528
+ ...media,
5529
+ candidates: media.candidates || candidates,
5530
+ }));
5531
+
5532
+ return sdpParser.write(parsedSdp);
5533
+ };
5534
+
5511
5535
  /* global RTCSessionDescriptionInit, navigator */
5512
5536
 
5513
5537
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -5606,6 +5630,14 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
5606
5630
  wazoLogger.trace('onicecandidate', event.candidate ? event.candidate.candidate : { done: true });
5607
5631
  if (event.candidate) {
5608
5632
  this.gatheredCandidates.push(parseCandidate$1(event.candidate.candidate));
5633
+
5634
+ // When receiving a `srflx` or a `relay` candidate, consider the negotiation done.
5635
+ if (event.candidate.candidate.indexOf('srflx') !== -1 || event.candidate.candidate.indexOf('relay') !== -1) {
5636
+ wazoLogger.info('A valid ice was found, triggering ice gathering complete callback.', {
5637
+ ice: event.candidate.candidate,
5638
+ });
5639
+ this.iceGatheringComplete();
5640
+ }
5609
5641
  }
5610
5642
  };
5611
5643
 
@@ -5629,7 +5661,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
5629
5661
 
5630
5662
  // Check if we got ICEs
5631
5663
  if (sdp.indexOf('a=candidate') !== -1) {
5632
- return description;
5664
+ return {
5665
+ type: description.type,
5666
+ sdp: addIcesInAllBundles(sdp),
5667
+ };
5633
5668
  }
5634
5669
 
5635
5670
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -6991,11 +7026,11 @@ class WebRTCClient extends Emitter {
6991
7026
  });
6992
7027
  }
6993
7028
 
6994
- changeAudioInputDevice(id , session ) {
7029
+ changeAudioInputDevice(id , session , force ) {
6995
7030
  const currentId = this.getAudioDeviceId();
6996
7031
  logger$1.info('setting audio input device', { id, currentId, session: !!session });
6997
7032
 
6998
- if (id === currentId) {
7033
+ if (!force && id === currentId) {
6999
7034
  return null;
7000
7035
  }
7001
7036
 
@@ -3051,6 +3051,7 @@ const RECORD_STATE_ACTIVE = 'active';
3051
3051
 
3052
3052
 
3053
3053
 
3054
+
3054
3055
 
3055
3056
 
3056
3057
 
@@ -3061,6 +3062,7 @@ const RECORD_STATE_ACTIVE = 'active';
3061
3062
 
3062
3063
 
3063
3064
 
3065
+
3064
3066
 
3065
3067
 
3066
3068
 
@@ -3089,6 +3091,7 @@ class Call {
3089
3091
 
3090
3092
 
3091
3093
 
3094
+
3092
3095
 
3093
3096
 
3094
3097
 
@@ -3113,6 +3116,7 @@ class Call {
3113
3116
  calleeNumber: plain.peer_caller_id_number,
3114
3117
  dialedExtension: plain.dialed_extension,
3115
3118
  isCaller: plain.is_caller,
3119
+ isVideo: plain.is_video,
3116
3120
  muted: plain.muted,
3117
3121
  onHold: plain.on_hold,
3118
3122
  status: plain.status,
@@ -3136,6 +3140,7 @@ class Call {
3136
3140
  calleeNumber,
3137
3141
  dialedExtension,
3138
3142
  isCaller,
3143
+ isVideo,
3139
3144
  lineId,
3140
3145
  muted,
3141
3146
  onHold,
@@ -3159,6 +3164,7 @@ class Call {
3159
3164
  this.startingTime = startingTime;
3160
3165
  this.talkingToIds = talkingToIds || [];
3161
3166
  this.recording = recording;
3167
+ this.isVideo = !!isVideo;
3162
3168
 
3163
3169
  // Useful to compare instead of instanceof with minified code
3164
3170
  this.type = 'Call';
@@ -3051,6 +3051,7 @@ const RECORD_STATE_ACTIVE = 'active';
3051
3051
 
3052
3052
 
3053
3053
 
3054
+
3054
3055
 
3055
3056
 
3056
3057
 
@@ -3061,6 +3062,7 @@ const RECORD_STATE_ACTIVE = 'active';
3061
3062
 
3062
3063
 
3063
3064
 
3065
+
3064
3066
 
3065
3067
 
3066
3068
 
@@ -3089,6 +3091,7 @@ class Call {
3089
3091
 
3090
3092
 
3091
3093
 
3094
+
3092
3095
 
3093
3096
 
3094
3097
 
@@ -3113,6 +3116,7 @@ class Call {
3113
3116
  calleeNumber: plain.peer_caller_id_number,
3114
3117
  dialedExtension: plain.dialed_extension,
3115
3118
  isCaller: plain.is_caller,
3119
+ isVideo: plain.is_video,
3116
3120
  muted: plain.muted,
3117
3121
  onHold: plain.on_hold,
3118
3122
  status: plain.status,
@@ -3136,6 +3140,7 @@ class Call {
3136
3140
  calleeNumber,
3137
3141
  dialedExtension,
3138
3142
  isCaller,
3143
+ isVideo,
3139
3144
  lineId,
3140
3145
  muted,
3141
3146
  onHold,
@@ -3159,6 +3164,7 @@ class Call {
3159
3164
  this.startingTime = startingTime;
3160
3165
  this.talkingToIds = talkingToIds || [];
3161
3166
  this.recording = recording;
3167
+ this.isVideo = !!isVideo;
3162
3168
 
3163
3169
  // Useful to compare instead of instanceof with minified code
3164
3170
  this.type = 'Call';
@@ -3069,6 +3069,7 @@ const RECORD_STATE_ACTIVE = 'active';
3069
3069
 
3070
3070
 
3071
3071
 
3072
+
3072
3073
 
3073
3074
 
3074
3075
 
@@ -3079,6 +3080,7 @@ const RECORD_STATE_ACTIVE = 'active';
3079
3080
 
3080
3081
 
3081
3082
 
3083
+
3082
3084
 
3083
3085
 
3084
3086
 
@@ -3107,6 +3109,7 @@ class Call {
3107
3109
 
3108
3110
 
3109
3111
 
3112
+
3110
3113
 
3111
3114
 
3112
3115
 
@@ -3131,6 +3134,7 @@ class Call {
3131
3134
  calleeNumber: plain.peer_caller_id_number,
3132
3135
  dialedExtension: plain.dialed_extension,
3133
3136
  isCaller: plain.is_caller,
3137
+ isVideo: plain.is_video,
3134
3138
  muted: plain.muted,
3135
3139
  onHold: plain.on_hold,
3136
3140
  status: plain.status,
@@ -3154,6 +3158,7 @@ class Call {
3154
3158
  calleeNumber,
3155
3159
  dialedExtension,
3156
3160
  isCaller,
3161
+ isVideo,
3157
3162
  lineId,
3158
3163
  muted,
3159
3164
  onHold,
@@ -3177,6 +3182,7 @@ class Call {
3177
3182
  this.startingTime = startingTime;
3178
3183
  this.talkingToIds = talkingToIds || [];
3179
3184
  this.recording = recording;
3185
+ this.isVideo = !!isVideo;
3180
3186
 
3181
3187
  // Useful to compare instead of instanceof with minified code
3182
3188
  this.type = 'Call';
@@ -5508,6 +5514,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
5508
5514
  return fixed;
5509
5515
  };
5510
5516
 
5517
+ const addIcesInAllBundles = (sdp ) => {
5518
+ const parsedSdp = sdpParser.parse(sdp);
5519
+
5520
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
5521
+ if (!mediaWithCandidate) {
5522
+ return sdp;
5523
+ }
5524
+
5525
+ const { candidates } = mediaWithCandidate;
5526
+
5527
+ parsedSdp.media = parsedSdp.media.map(media => ({
5528
+ ...media,
5529
+ candidates: media.candidates || candidates,
5530
+ }));
5531
+
5532
+ return sdpParser.write(parsedSdp);
5533
+ };
5534
+
5511
5535
  /* global RTCSessionDescriptionInit, navigator */
5512
5536
 
5513
5537
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -5606,6 +5630,14 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
5606
5630
  wazoLogger.trace('onicecandidate', event.candidate ? event.candidate.candidate : { done: true });
5607
5631
  if (event.candidate) {
5608
5632
  this.gatheredCandidates.push(parseCandidate$1(event.candidate.candidate));
5633
+
5634
+ // When receiving a `srflx` or a `relay` candidate, consider the negotiation done.
5635
+ if (event.candidate.candidate.indexOf('srflx') !== -1 || event.candidate.candidate.indexOf('relay') !== -1) {
5636
+ wazoLogger.info('A valid ice was found, triggering ice gathering complete callback.', {
5637
+ ice: event.candidate.candidate,
5638
+ });
5639
+ this.iceGatheringComplete();
5640
+ }
5609
5641
  }
5610
5642
  };
5611
5643
 
@@ -5629,7 +5661,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
5629
5661
 
5630
5662
  // Check if we got ICEs
5631
5663
  if (sdp.indexOf('a=candidate') !== -1) {
5632
- return description;
5664
+ return {
5665
+ type: description.type,
5666
+ sdp: addIcesInAllBundles(sdp),
5667
+ };
5633
5668
  }
5634
5669
 
5635
5670
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -6991,11 +7026,11 @@ class WebRTCClient extends Emitter {
6991
7026
  });
6992
7027
  }
6993
7028
 
6994
- changeAudioInputDevice(id , session ) {
7029
+ changeAudioInputDevice(id , session , force ) {
6995
7030
  const currentId = this.getAudioDeviceId();
6996
7031
  logger.info('setting audio input device', { id, currentId, session: !!session });
6997
7032
 
6998
- if (id === currentId) {
7033
+ if (!force && id === currentId) {
6999
7034
  return null;
7000
7035
  }
7001
7036