@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.
- package/README.md +4 -4
- package/dist/wazo-sdk.js +2 -2
- package/esm/__tests__/api-client.test.js +6 -0
- package/esm/__tests__/web-rtc-client.test.js +88 -3
- package/esm/api/calld.js +6 -0
- package/esm/api/ctid-ng.js +6 -0
- package/esm/api-client.js +6 -0
- package/esm/checker/Checker.js +38 -3
- package/esm/checker/checks/aor.js +6 -0
- package/esm/checker/checks/api.js +6 -0
- package/esm/checker/checks/index.js +38 -3
- package/esm/checker/checks/webrtc-transport.js +38 -3
- package/esm/checker/checks/webrtc.js +38 -3
- package/esm/domain/AdHocAPIConference.js +6 -0
- package/esm/domain/Call.js +6 -0
- package/esm/domain/CallSession.js +1 -1
- package/esm/domain/Features.js +6 -0
- package/esm/domain/Phone/CTIPhone.js +7 -1
- package/esm/domain/Phone/WebRTCPhone.js +3 -3
- package/esm/domain/__tests__/Call.test.js +6 -0
- package/esm/domain/__tests__/CallSession.test.js +1 -1
- package/esm/domain/__tests__/IndirectTransfer.test.js +1 -1
- package/esm/domain/__tests__/Line.test.js +5 -5
- package/esm/domain/__tests__/Room.test.js +1 -1
- package/esm/index.js +42 -8
- package/esm/lib/WazoSessionDescriptionHandler.js +30 -1
- package/esm/service/CallApi.js +6 -0
- package/esm/service/getApiClient.js +6 -0
- package/esm/simple/Auth.js +42 -8
- package/esm/simple/Configuration.js +42 -8
- package/esm/simple/Directory.js +6 -0
- package/esm/simple/Phone.js +42 -8
- package/esm/simple/Softphone.js +1 -2
- package/esm/simple/index.js +42 -8
- package/esm/simple/room/LocalParticipant.js +42 -8
- package/esm/simple/room/Participant.js +42 -8
- package/esm/simple/room/RemoteParticipant.js +42 -8
- package/esm/simple/room/Room.js +42 -8
- package/esm/simple/room/SipRoom.js +42 -8
- package/esm/simple/room/Stream.js +42 -8
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +42 -8
- package/esm/simple/utils.js +42 -8
- package/esm/utils/__tests__/sdp.test.js +50 -0
- package/esm/utils/sdp.js +19 -1
- package/esm/web-rtc-client.js +38 -3
- package/lib/__tests__/api-client.test.js +6 -0
- package/lib/__tests__/web-rtc-client.test.js +88 -3
- package/lib/api/calld.js +6 -0
- package/lib/api/ctid-ng.js +6 -0
- package/lib/api-client.js +6 -0
- package/lib/checker/Checker.js +38 -3
- package/lib/checker/checks/aor.js +6 -0
- package/lib/checker/checks/api.js +6 -0
- package/lib/checker/checks/index.js +38 -3
- package/lib/checker/checks/webrtc-transport.js +38 -3
- package/lib/checker/checks/webrtc.js +38 -3
- package/lib/domain/AdHocAPIConference.js +6 -0
- package/lib/domain/Call.js +6 -0
- package/lib/domain/CallSession.js +1 -1
- package/lib/domain/Features.js +6 -0
- package/lib/domain/Phone/CTIPhone.js +7 -1
- package/lib/domain/Phone/WebRTCPhone.js +3 -3
- package/lib/domain/__tests__/Call.test.js +6 -0
- package/lib/domain/__tests__/CallSession.test.js +1 -1
- package/lib/domain/__tests__/IndirectTransfer.test.js +1 -1
- package/lib/domain/__tests__/Line.test.js +5 -5
- package/lib/domain/__tests__/Room.test.js +1 -1
- package/lib/index.js +42 -8
- package/lib/lib/WazoSessionDescriptionHandler.js +30 -1
- package/lib/service/CallApi.js +6 -0
- package/lib/service/getApiClient.js +6 -0
- package/lib/simple/Auth.js +42 -8
- package/lib/simple/Configuration.js +42 -8
- package/lib/simple/Directory.js +6 -0
- package/lib/simple/Phone.js +42 -8
- package/lib/simple/Softphone.js +1 -2
- package/lib/simple/index.js +42 -8
- package/lib/simple/room/LocalParticipant.js +42 -8
- package/lib/simple/room/Participant.js +42 -8
- package/lib/simple/room/RemoteParticipant.js +42 -8
- package/lib/simple/room/Room.js +42 -8
- package/lib/simple/room/SipRoom.js +42 -8
- package/lib/simple/room/Stream.js +42 -8
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +42 -8
- package/lib/simple/utils.js +42 -8
- package/lib/utils/__tests__/sdp.test.js +50 -0
- package/lib/utils/sdp.js +19 -0
- package/lib/web-rtc-client.js +38 -3
- package/package.json +1 -1
- package/src/__tests__/web-rtc-client.test.js +50 -0
- package/src/domain/Call.js +6 -0
- package/src/domain/CallSession.js +1 -1
- package/src/domain/Phone/WebRTCPhone.js +2 -2
- package/src/domain/__tests__/Line.test.js +5 -5
- package/src/lib/WazoSessionDescriptionHandler.js +13 -2
- package/src/simple/Softphone.js +1 -2
- package/src/utils/__tests__/sdp.test.js +33 -1
- package/src/utils/sdp.js +18 -0
- 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
|
|
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';
|
package/esm/api/ctid-ng.js
CHANGED
|
@@ -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';
|
package/esm/checker/Checker.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|