@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.
- package/README.md +1 -1
- package/dist/wazo-sdk.js +2 -2
- package/esm/__tests__/api-client.test.js +148 -2
- package/esm/__tests__/web-rtc-client.test.js +303 -26
- package/esm/api/calld.js +14 -0
- package/esm/api/confd.js +134 -2
- package/esm/api/ctid-ng.js +6 -0
- package/esm/api-client.js +148 -2
- package/esm/checker/Checker.js +212 -26
- package/esm/checker/checks/aor.js +148 -2
- package/esm/checker/checks/api.js +148 -2
- package/esm/checker/checks/index.js +212 -26
- package/esm/checker/checks/wazo-websocket.js +2 -0
- package/esm/checker/checks/webrtc-transport.js +210 -26
- package/esm/checker/checks/webrtc.js +210 -26
- package/esm/domain/AdHocAPIConference.js +148 -2
- package/esm/domain/Call.js +6 -0
- package/esm/domain/CallSession.js +1 -1
- package/esm/domain/Features.js +148 -2
- package/esm/domain/Meeting.js +18 -0
- package/esm/domain/MeetingAuthorization.js +70 -0
- package/esm/domain/Phone/CTIPhone.js +149 -3
- 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__/Meeting.test.js +87 -1
- package/esm/domain/__tests__/MeetingAuthorization.test.js +109 -0
- package/esm/domain/__tests__/Room.test.js +1 -1
- package/esm/index.js +258 -32
- package/esm/lib/WazoSessionDescriptionHandler.js +22 -1
- package/esm/service/CallApi.js +148 -2
- package/esm/service/getApiClient.js +148 -2
- package/esm/simple/Auth.js +258 -32
- package/esm/simple/Configuration.js +258 -32
- package/esm/simple/Directory.js +148 -2
- package/esm/simple/Phone.js +258 -32
- package/esm/simple/Websocket.js +3 -0
- package/esm/simple/index.js +258 -32
- package/esm/simple/room/LocalParticipant.js +258 -32
- package/esm/simple/room/Participant.js +258 -32
- package/esm/simple/room/RemoteParticipant.js +258 -32
- package/esm/simple/room/Room.js +258 -32
- package/esm/simple/room/SipRoom.js +258 -32
- package/esm/simple/room/Stream.js +258 -32
- package/esm/simple/room/__tests__/Participant.test.js +14747 -0
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +258 -32
- package/esm/simple/utils.js +258 -32
- package/esm/utils/__tests__/object.test.js +57 -0
- package/esm/utils/__tests__/sdp.test.js +50 -0
- package/esm/utils/__tests__/string.test.js +30 -0
- package/esm/utils/object.js +24 -0
- package/esm/utils/sdp.js +19 -1
- package/esm/utils/string.js +10 -0
- package/esm/web-rtc-client.js +210 -26
- package/esm/websocket-client.js +3 -1
- package/lib/__tests__/api-client.test.js +148 -2
- package/lib/__tests__/web-rtc-client.test.js +303 -26
- package/lib/api/calld.js +14 -0
- package/lib/api/confd.js +134 -2
- package/lib/api/ctid-ng.js +6 -0
- package/lib/api-client.js +148 -2
- package/lib/checker/Checker.js +212 -26
- package/lib/checker/checks/aor.js +148 -2
- package/lib/checker/checks/api.js +148 -2
- package/lib/checker/checks/index.js +212 -26
- package/lib/checker/checks/wazo-websocket.js +2 -0
- package/lib/checker/checks/webrtc-transport.js +210 -26
- package/lib/checker/checks/webrtc.js +210 -26
- package/lib/domain/AdHocAPIConference.js +148 -2
- package/lib/domain/Call.js +6 -0
- package/lib/domain/CallSession.js +1 -1
- package/lib/domain/Features.js +148 -2
- package/lib/domain/Meeting.js +18 -0
- package/lib/domain/MeetingAuthorization.js +79 -0
- package/lib/domain/Phone/CTIPhone.js +149 -3
- 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__/Meeting.test.js +87 -1
- package/lib/domain/__tests__/MeetingAuthorization.test.js +111 -0
- package/lib/domain/__tests__/Room.test.js +1 -1
- package/lib/index.js +258 -32
- package/lib/lib/WazoSessionDescriptionHandler.js +22 -1
- package/lib/service/CallApi.js +148 -2
- package/lib/service/getApiClient.js +148 -2
- package/lib/simple/Auth.js +258 -32
- package/lib/simple/Configuration.js +258 -32
- package/lib/simple/Directory.js +148 -2
- package/lib/simple/Phone.js +258 -32
- package/lib/simple/Websocket.js +3 -0
- package/lib/simple/index.js +258 -32
- package/lib/simple/room/LocalParticipant.js +258 -32
- package/lib/simple/room/Participant.js +258 -32
- package/lib/simple/room/RemoteParticipant.js +258 -32
- package/lib/simple/room/Room.js +258 -32
- package/lib/simple/room/SipRoom.js +258 -32
- package/lib/simple/room/Stream.js +258 -32
- package/lib/simple/room/__tests__/Participant.test.js +14757 -0
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +258 -32
- package/lib/simple/utils.js +258 -32
- package/lib/utils/__tests__/object.test.js +59 -0
- package/lib/utils/__tests__/sdp.test.js +50 -0
- package/lib/utils/__tests__/string.test.js +32 -0
- package/lib/utils/object.js +28 -0
- package/lib/utils/sdp.js +19 -0
- package/lib/utils/string.js +14 -0
- package/lib/web-rtc-client.js +210 -26
- package/lib/websocket-client.js +3 -0
- package/package.json +2 -2
- package/src/__tests__/web-rtc-client.test.js +93 -0
- package/src/api/calld.js +8 -0
- package/src/api/confd.js +43 -2
- package/src/domain/Call.js +6 -0
- package/src/domain/CallSession.js +1 -1
- package/src/domain/Meeting.js +20 -0
- package/src/domain/MeetingAuthorization.js +67 -0
- package/src/domain/Phone/WebRTCPhone.js +2 -2
- package/src/domain/__tests__/Meeting.test.js +70 -1
- package/src/domain/__tests__/MeetingAuthorization.test.js +58 -0
- package/src/lib/WazoSessionDescriptionHandler.js +5 -2
- package/src/simple/room/Participant.js +40 -0
- package/src/simple/room/Room.js +2 -2
- package/src/simple/room/SipRoom.js +1 -1
- package/src/simple/room/__tests__/Participant.test.js +81 -0
- package/src/types/WebSocketMessage.js +7 -1
- package/src/utils/__tests__/object.test.js +35 -0
- package/src/utils/__tests__/sdp.test.js +33 -1
- package/src/utils/__tests__/string.test.js +23 -0
- package/src/utils/object.js +15 -0
- package/src/utils/sdp.js +18 -0
- package/src/utils/string.js +8 -0
- package/src/web-rtc-client.js +40 -23
- package/src/websocket-client.js +2 -0
package/esm/index.js
CHANGED
|
@@ -2646,6 +2646,70 @@ class ExternalApp {
|
|
|
2646
2646
|
|
|
2647
2647
|
//
|
|
2648
2648
|
|
|
2649
|
+
class MeetingAuthorization {
|
|
2650
|
+
|
|
2651
|
+
|
|
2652
|
+
|
|
2653
|
+
|
|
2654
|
+
|
|
2655
|
+
|
|
2656
|
+
constructor({
|
|
2657
|
+
meetingUuid,
|
|
2658
|
+
uuid,
|
|
2659
|
+
userUuid,
|
|
2660
|
+
userName,
|
|
2661
|
+
} = {}) {
|
|
2662
|
+
this.meetingUuid = meetingUuid;
|
|
2663
|
+
this.uuid = uuid;
|
|
2664
|
+
this.userUuid = userUuid;
|
|
2665
|
+
this.userName = userName;
|
|
2666
|
+
}
|
|
2667
|
+
|
|
2668
|
+
setStatus(status ) {
|
|
2669
|
+
this.status = status;
|
|
2670
|
+
}
|
|
2671
|
+
|
|
2672
|
+
getStatus() {
|
|
2673
|
+
return this.status;
|
|
2674
|
+
}
|
|
2675
|
+
|
|
2676
|
+
static parse(plain ) {
|
|
2677
|
+
const {
|
|
2678
|
+
meeting_uuid: meetingUuid,
|
|
2679
|
+
uuid,
|
|
2680
|
+
guest_uuid: userUuid,
|
|
2681
|
+
guest_name: userName,
|
|
2682
|
+
} = plain;
|
|
2683
|
+
|
|
2684
|
+
return new MeetingAuthorization({
|
|
2685
|
+
meetingUuid,
|
|
2686
|
+
uuid,
|
|
2687
|
+
userUuid,
|
|
2688
|
+
userName,
|
|
2689
|
+
});
|
|
2690
|
+
}
|
|
2691
|
+
|
|
2692
|
+
static parseMany(items ) {
|
|
2693
|
+
if (!items) {
|
|
2694
|
+
return [];
|
|
2695
|
+
}
|
|
2696
|
+
return items.map(MeetingAuthorization.parse);
|
|
2697
|
+
}
|
|
2698
|
+
}
|
|
2699
|
+
|
|
2700
|
+
//
|
|
2701
|
+
|
|
2702
|
+
|
|
2703
|
+
|
|
2704
|
+
|
|
2705
|
+
|
|
2706
|
+
|
|
2707
|
+
|
|
2708
|
+
|
|
2709
|
+
|
|
2710
|
+
|
|
2711
|
+
|
|
2712
|
+
|
|
2649
2713
|
|
|
2650
2714
|
|
|
2651
2715
|
|
|
@@ -2656,6 +2720,7 @@ class ExternalApp {
|
|
|
2656
2720
|
|
|
2657
2721
|
|
|
2658
2722
|
|
|
2723
|
+
|
|
2659
2724
|
|
|
2660
2725
|
|
|
2661
2726
|
class Meeting {
|
|
@@ -2670,6 +2735,8 @@ class Meeting {
|
|
|
2670
2735
|
|
|
2671
2736
|
|
|
2672
2737
|
|
|
2738
|
+
|
|
2739
|
+
|
|
2673
2740
|
|
|
2674
2741
|
static parse(plain ) {
|
|
2675
2742
|
return new Meeting({
|
|
@@ -2682,6 +2749,7 @@ class Meeting {
|
|
|
2682
2749
|
extension: plain.exten,
|
|
2683
2750
|
persistent: plain.persistent,
|
|
2684
2751
|
creationTime: moment(plain.creation_time).toDate(),
|
|
2752
|
+
requireAuthorization: plain.require_authorization,
|
|
2685
2753
|
});
|
|
2686
2754
|
}
|
|
2687
2755
|
|
|
@@ -2706,6 +2774,7 @@ class Meeting {
|
|
|
2706
2774
|
extension,
|
|
2707
2775
|
persistent,
|
|
2708
2776
|
creationTime,
|
|
2777
|
+
requireAuthorization,
|
|
2709
2778
|
} = {}) {
|
|
2710
2779
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2711
2780
|
this.uri = uri;
|
|
@@ -2716,6 +2785,7 @@ class Meeting {
|
|
|
2716
2785
|
this.extension = extension;
|
|
2717
2786
|
this.persistent = persistent;
|
|
2718
2787
|
this.creationTime = creationTime;
|
|
2788
|
+
this.requireAuthorization = requireAuthorization;
|
|
2719
2789
|
|
|
2720
2790
|
// Useful to compare instead of instanceof with minified code
|
|
2721
2791
|
this.type = 'Meeting';
|
|
@@ -2726,8 +2796,32 @@ class Meeting {
|
|
|
2726
2796
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
2727
2797
|
return { username, secret };
|
|
2728
2798
|
}
|
|
2799
|
+
|
|
2729
2800
|
}
|
|
2730
2801
|
|
|
2802
|
+
//
|
|
2803
|
+
|
|
2804
|
+
const camelToUnderscore = (key ) => {
|
|
2805
|
+
if (typeof key !== 'string') {
|
|
2806
|
+
throw new Error('Input is not a string');
|
|
2807
|
+
}
|
|
2808
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
2809
|
+
};
|
|
2810
|
+
|
|
2811
|
+
//
|
|
2812
|
+
|
|
2813
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
2814
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
2815
|
+
throw new Error('Input is not an object');
|
|
2816
|
+
}
|
|
2817
|
+
|
|
2818
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
2819
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
2820
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
2821
|
+
return acc;
|
|
2822
|
+
}, {});
|
|
2823
|
+
};
|
|
2824
|
+
|
|
2731
2825
|
/* */
|
|
2732
2826
|
|
|
2733
2827
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -2796,8 +2890,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2796
2890
|
getMyMeetings: () =>
|
|
2797
2891
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2798
2892
|
|
|
2799
|
-
createMyMeeting: (
|
|
2800
|
-
client
|
|
2893
|
+
createMyMeeting: (args ) =>
|
|
2894
|
+
client
|
|
2895
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
2896
|
+
.then(Meeting.parse),
|
|
2897
|
+
|
|
2898
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
2899
|
+
client.put(
|
|
2900
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
2901
|
+
convertKeysFromCamelToUnderscore(data),
|
|
2902
|
+
null,
|
|
2903
|
+
ApiRequester.successResponseParser,
|
|
2904
|
+
),
|
|
2801
2905
|
|
|
2802
2906
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2803
2907
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -2805,8 +2909,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2805
2909
|
getMeeting: (meetingUuid ) =>
|
|
2806
2910
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2807
2911
|
|
|
2912
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
2913
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
2914
|
+
|
|
2915
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
2916
|
+
client.put(
|
|
2917
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
2918
|
+
{},
|
|
2919
|
+
null,
|
|
2920
|
+
ApiRequester.successResponseParser,
|
|
2921
|
+
),
|
|
2922
|
+
|
|
2923
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
2924
|
+
client.put(
|
|
2925
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
2926
|
+
{},
|
|
2927
|
+
null,
|
|
2928
|
+
ApiRequester.successResponseParser,
|
|
2929
|
+
),
|
|
2930
|
+
|
|
2808
2931
|
guestGetMeeting: (meetingUuid ) =>
|
|
2809
2932
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2933
|
+
|
|
2934
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
2935
|
+
client
|
|
2936
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
2937
|
+
.then(MeetingAuthorization.parse),
|
|
2938
|
+
|
|
2939
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
2940
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
2941
|
+
|
|
2810
2942
|
});
|
|
2811
2943
|
|
|
2812
2944
|
//
|
|
@@ -3072,6 +3204,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3072
3204
|
|
|
3073
3205
|
|
|
3074
3206
|
|
|
3207
|
+
|
|
3075
3208
|
|
|
3076
3209
|
|
|
3077
3210
|
|
|
@@ -3082,6 +3215,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3082
3215
|
|
|
3083
3216
|
|
|
3084
3217
|
|
|
3218
|
+
|
|
3085
3219
|
|
|
3086
3220
|
|
|
3087
3221
|
|
|
@@ -3110,6 +3244,7 @@ class Call {
|
|
|
3110
3244
|
|
|
3111
3245
|
|
|
3112
3246
|
|
|
3247
|
+
|
|
3113
3248
|
|
|
3114
3249
|
|
|
3115
3250
|
|
|
@@ -3134,6 +3269,7 @@ class Call {
|
|
|
3134
3269
|
calleeNumber: plain.peer_caller_id_number,
|
|
3135
3270
|
dialedExtension: plain.dialed_extension,
|
|
3136
3271
|
isCaller: plain.is_caller,
|
|
3272
|
+
isVideo: plain.is_video,
|
|
3137
3273
|
muted: plain.muted,
|
|
3138
3274
|
onHold: plain.on_hold,
|
|
3139
3275
|
status: plain.status,
|
|
@@ -3157,6 +3293,7 @@ class Call {
|
|
|
3157
3293
|
calleeNumber,
|
|
3158
3294
|
dialedExtension,
|
|
3159
3295
|
isCaller,
|
|
3296
|
+
isVideo,
|
|
3160
3297
|
lineId,
|
|
3161
3298
|
muted,
|
|
3162
3299
|
onHold,
|
|
@@ -3180,6 +3317,7 @@ class Call {
|
|
|
3180
3317
|
this.startingTime = startingTime;
|
|
3181
3318
|
this.talkingToIds = talkingToIds || [];
|
|
3182
3319
|
this.recording = recording;
|
|
3320
|
+
this.isVideo = !!isVideo;
|
|
3183
3321
|
|
|
3184
3322
|
// Useful to compare instead of instanceof with minified code
|
|
3185
3323
|
this.type = 'Call';
|
|
@@ -3653,7 +3791,7 @@ class CallSession {
|
|
|
3653
3791
|
ringing: call.isRinging(),
|
|
3654
3792
|
answered: call.isUp(),
|
|
3655
3793
|
answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
|
|
3656
|
-
cameraEnabled:
|
|
3794
|
+
cameraEnabled: call.isVideo,
|
|
3657
3795
|
dialedExtension: call.dialedExtension,
|
|
3658
3796
|
call,
|
|
3659
3797
|
conference: false, // @FIXME?
|
|
@@ -5152,6 +5290,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
5152
5290
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
5153
5291
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
5154
5292
|
|
|
5293
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
5294
|
+
client.delete(
|
|
5295
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
5296
|
+
null,
|
|
5297
|
+
null,
|
|
5298
|
+
ApiRequester.successResponseParser,
|
|
5299
|
+
),
|
|
5300
|
+
|
|
5155
5301
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
5156
5302
|
|
|
5157
5303
|
mute: (callId ) =>
|
|
@@ -5719,6 +5865,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
5719
5865
|
return fixed;
|
|
5720
5866
|
};
|
|
5721
5867
|
|
|
5868
|
+
const addIcesInAllBundles = (sdp ) => {
|
|
5869
|
+
const parsedSdp = sdpParser.parse(sdp);
|
|
5870
|
+
|
|
5871
|
+
const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
|
|
5872
|
+
if (!mediaWithCandidate) {
|
|
5873
|
+
return sdp;
|
|
5874
|
+
}
|
|
5875
|
+
|
|
5876
|
+
const { candidates } = mediaWithCandidate;
|
|
5877
|
+
|
|
5878
|
+
parsedSdp.media = parsedSdp.media.map(media => ({
|
|
5879
|
+
...media,
|
|
5880
|
+
candidates: media.candidates || candidates,
|
|
5881
|
+
}));
|
|
5882
|
+
|
|
5883
|
+
return sdpParser.write(parsedSdp);
|
|
5884
|
+
};
|
|
5885
|
+
|
|
5722
5886
|
/* global RTCSessionDescriptionInit, navigator */
|
|
5723
5887
|
|
|
5724
5888
|
const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
|
|
@@ -5848,7 +6012,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
|
|
|
5848
6012
|
|
|
5849
6013
|
// Check if we got ICEs
|
|
5850
6014
|
if (sdp.indexOf('a=candidate') !== -1) {
|
|
5851
|
-
return
|
|
6015
|
+
return {
|
|
6016
|
+
type: description.type,
|
|
6017
|
+
sdp: addIcesInAllBundles(sdp),
|
|
6018
|
+
};
|
|
5852
6019
|
}
|
|
5853
6020
|
|
|
5854
6021
|
wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
|
|
@@ -7308,41 +7475,58 @@ class WebRTCClient extends Emitter {
|
|
|
7308
7475
|
});
|
|
7309
7476
|
}
|
|
7310
7477
|
|
|
7311
|
-
changeAudioInputDevice(id , session ) {
|
|
7478
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
7312
7479
|
const currentId = this.getAudioDeviceId();
|
|
7313
7480
|
logger$9.info('setting audio input device', { id, currentId, session: !!session });
|
|
7314
7481
|
|
|
7315
|
-
if (id === currentId) {
|
|
7482
|
+
if (!force && id === currentId) {
|
|
7316
7483
|
return null;
|
|
7317
7484
|
}
|
|
7318
7485
|
|
|
7486
|
+
// in order to handle an audio track change for default devices
|
|
7487
|
+
// we need the actual id of the device (not 'default')
|
|
7488
|
+
let deviceId = id;
|
|
7489
|
+
if (id === 'default' && navigator.mediaDevices) {
|
|
7490
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
7491
|
+
const defaultDevice = devices.find(device => device.deviceId === 'default');
|
|
7492
|
+
if (defaultDevice) {
|
|
7493
|
+
const deviceLabel = defaultDevice.label.replace('Default - ', '');
|
|
7494
|
+
const targetDevice = devices.find(device => device.label === deviceLabel);
|
|
7495
|
+
if (targetDevice) {
|
|
7496
|
+
deviceId = targetDevice.deviceId;
|
|
7497
|
+
if (!force && deviceId === currentId) {
|
|
7498
|
+
return null;
|
|
7499
|
+
}
|
|
7500
|
+
}
|
|
7501
|
+
}
|
|
7502
|
+
}
|
|
7503
|
+
|
|
7319
7504
|
// let's update the local audio value
|
|
7320
7505
|
if (this.audio) {
|
|
7321
7506
|
this.audio = {
|
|
7322
7507
|
deviceId: {
|
|
7323
|
-
exact:
|
|
7508
|
+
exact: deviceId,
|
|
7324
7509
|
},
|
|
7325
7510
|
};
|
|
7326
7511
|
}
|
|
7327
7512
|
|
|
7328
|
-
if (session) {
|
|
7513
|
+
if (session && navigator.mediaDevices) {
|
|
7329
7514
|
const sdh = session.sessionDescriptionHandler;
|
|
7330
7515
|
const pc = sdh.peerConnection;
|
|
7331
7516
|
|
|
7332
|
-
|
|
7333
|
-
|
|
7334
|
-
|
|
7335
|
-
|
|
7517
|
+
const constraints = { audio: { deviceId: { exact: deviceId } } };
|
|
7518
|
+
const stream = await navigator.mediaDevices.getUserMedia(constraints);
|
|
7519
|
+
const audioTrack = stream.getAudioTracks()[0];
|
|
7520
|
+
const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
|
|
7336
7521
|
|
|
7337
|
-
|
|
7338
|
-
|
|
7339
|
-
|
|
7340
|
-
}
|
|
7341
|
-
sender.replaceTrack(audioTrack);
|
|
7522
|
+
if (sender) {
|
|
7523
|
+
if (sender.track) {
|
|
7524
|
+
audioTrack.enabled = sender.track.enabled;
|
|
7342
7525
|
}
|
|
7526
|
+
sender.replaceTrack(audioTrack);
|
|
7527
|
+
}
|
|
7343
7528
|
|
|
7344
|
-
|
|
7345
|
-
});
|
|
7529
|
+
return stream;
|
|
7346
7530
|
}
|
|
7347
7531
|
}
|
|
7348
7532
|
|
|
@@ -7362,14 +7546,14 @@ class WebRTCClient extends Emitter {
|
|
|
7362
7546
|
return null;
|
|
7363
7547
|
}
|
|
7364
7548
|
|
|
7365
|
-
// let's
|
|
7366
|
-
|
|
7367
|
-
|
|
7368
|
-
|
|
7369
|
-
|
|
7370
|
-
|
|
7371
|
-
}
|
|
7372
|
-
}
|
|
7549
|
+
// let's make sure we don't lose other video constraints settings -- width, height, frameRate...
|
|
7550
|
+
const videoObject = typeof this.video === 'object' ? this.video : {};
|
|
7551
|
+
this.video = {
|
|
7552
|
+
...videoObject,
|
|
7553
|
+
deviceId: {
|
|
7554
|
+
exact: id,
|
|
7555
|
+
},
|
|
7556
|
+
};
|
|
7373
7557
|
}
|
|
7374
7558
|
|
|
7375
7559
|
changeSessionVideoInputDevice(id , session ) {
|
|
@@ -8542,6 +8726,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
|
|
|
8542
8726
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
8543
8727
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
8544
8728
|
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
8729
|
+
const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
|
|
8545
8730
|
|
|
8546
8731
|
const BLACKLIST_EVENTS = [
|
|
8547
8732
|
CHAT_MESSAGE_SENT,
|
|
@@ -8893,6 +9078,7 @@ WebSocketClient.eventLists = [
|
|
|
8893
9078
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
8894
9079
|
CONFERENCE_ADHOC_DELETED,
|
|
8895
9080
|
MEETING_USER_PROGRESS,
|
|
9081
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
8896
9082
|
];
|
|
8897
9083
|
|
|
8898
9084
|
var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
@@ -8964,6 +9150,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
|
8964
9150
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
8965
9151
|
CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
|
|
8966
9152
|
MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
|
|
9153
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
8967
9154
|
HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
|
|
8968
9155
|
'default': WebSocketClient
|
|
8969
9156
|
});
|
|
@@ -10009,10 +10196,10 @@ class WebRTCPhone extends Emitter {
|
|
|
10009
10196
|
this.audioRingVolume = volume;
|
|
10010
10197
|
}
|
|
10011
10198
|
|
|
10012
|
-
changeAudioInputDevice(id ) {
|
|
10199
|
+
changeAudioInputDevice(id , force ) {
|
|
10013
10200
|
logger$7.info('WebRTC phone - changeAudio input device', { deviceId: id });
|
|
10014
10201
|
|
|
10015
|
-
return this.client.changeAudioInputDevice(id, this.currentSipSession);
|
|
10202
|
+
return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
|
|
10016
10203
|
}
|
|
10017
10204
|
|
|
10018
10205
|
changeVideoInputDevice(id ) {
|
|
@@ -12744,6 +12931,7 @@ class Participant extends Emitter {
|
|
|
12744
12931
|
|
|
12745
12932
|
|
|
12746
12933
|
|
|
12934
|
+
|
|
12747
12935
|
|
|
12748
12936
|
|
|
12749
12937
|
|
|
@@ -12761,6 +12949,7 @@ class Participant extends Emitter {
|
|
|
12761
12949
|
|
|
12762
12950
|
|
|
12763
12951
|
|
|
12952
|
+
|
|
12764
12953
|
|
|
12765
12954
|
/**
|
|
12766
12955
|
* @param room Room The room where the participant is
|
|
@@ -12784,6 +12973,7 @@ class Participant extends Emitter {
|
|
|
12784
12973
|
this.screensharing = false;
|
|
12785
12974
|
this.isOnHold = false;
|
|
12786
12975
|
this.extra = extra;
|
|
12976
|
+
this.banned = false;
|
|
12787
12977
|
|
|
12788
12978
|
this.ON_UPDATED = 'participant/ON_UPDATED';
|
|
12789
12979
|
this.ON_START_TALKING = 'participant/ON_START_TALKING';
|
|
@@ -12800,6 +12990,7 @@ class Participant extends Emitter {
|
|
|
12800
12990
|
this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
|
|
12801
12991
|
this.ON_HOLD = 'participant/ON_HOLD';
|
|
12802
12992
|
this.ON_RESUME = 'participant/ON_RESUME';
|
|
12993
|
+
this.ON_BAN = 'participant/ON_BAN';
|
|
12803
12994
|
}
|
|
12804
12995
|
|
|
12805
12996
|
triggerEvent(name , ...args ) {
|
|
@@ -12840,6 +13031,10 @@ class Participant extends Emitter {
|
|
|
12840
13031
|
status.extra = this.extra;
|
|
12841
13032
|
break;
|
|
12842
13033
|
}
|
|
13034
|
+
case this.ON_BAN: {
|
|
13035
|
+
status.banned = true;
|
|
13036
|
+
break;
|
|
13037
|
+
}
|
|
12843
13038
|
}
|
|
12844
13039
|
|
|
12845
13040
|
if (broadcast) {
|
|
@@ -12942,6 +13137,11 @@ class Participant extends Emitter {
|
|
|
12942
13137
|
this.triggerUpdate(this.ON_RESUME, broadcast);
|
|
12943
13138
|
}
|
|
12944
13139
|
|
|
13140
|
+
onBan(broadcast = true) {
|
|
13141
|
+
this.banned = true;
|
|
13142
|
+
this.triggerUpdate(this.ON_BAN, broadcast);
|
|
13143
|
+
}
|
|
13144
|
+
|
|
12945
13145
|
getStatus() {
|
|
12946
13146
|
return {
|
|
12947
13147
|
callId: this.callId,
|
|
@@ -12988,6 +13188,10 @@ class Participant extends Emitter {
|
|
|
12988
13188
|
}
|
|
12989
13189
|
}
|
|
12990
13190
|
|
|
13191
|
+
if (status.banned) {
|
|
13192
|
+
this.onBan(false);
|
|
13193
|
+
}
|
|
13194
|
+
|
|
12991
13195
|
// Poor man's object comparison
|
|
12992
13196
|
if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
|
|
12993
13197
|
this.extra = { ...this.extra, ...status.extra };
|
|
@@ -13015,6 +13219,28 @@ class Participant extends Emitter {
|
|
|
13015
13219
|
this.streams = streams;
|
|
13016
13220
|
this.videoStreams = streams;
|
|
13017
13221
|
}
|
|
13222
|
+
|
|
13223
|
+
async ban(apiRequestDelay = null) {
|
|
13224
|
+
const { meetingUuid } = this.room;
|
|
13225
|
+
if (!meetingUuid) {
|
|
13226
|
+
throw new Error('Attempting to ban a participant without a `meetingUuid`');
|
|
13227
|
+
}
|
|
13228
|
+
|
|
13229
|
+
// this notifies all that someone is being banned
|
|
13230
|
+
this.onBan(true);
|
|
13231
|
+
|
|
13232
|
+
// this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
|
|
13233
|
+
if (apiRequestDelay) {
|
|
13234
|
+
await this.delay(apiRequestDelay);
|
|
13235
|
+
}
|
|
13236
|
+
|
|
13237
|
+
// proceed with the actual kick
|
|
13238
|
+
return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
|
|
13239
|
+
}
|
|
13240
|
+
|
|
13241
|
+
async delay(ms ) {
|
|
13242
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
13243
|
+
}
|
|
13018
13244
|
}
|
|
13019
13245
|
|
|
13020
13246
|
//
|
|
@@ -13167,7 +13393,7 @@ class Room extends Emitter {
|
|
|
13167
13393
|
logger$1.info('connecting to room', { extension, audioOnly, room: !!room });
|
|
13168
13394
|
|
|
13169
13395
|
if (!room) {
|
|
13170
|
-
await Wazo.Phone.connect();
|
|
13396
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
13171
13397
|
|
|
13172
13398
|
const withCamera = constraints && !!constraints.video;
|
|
13173
13399
|
|
|
@@ -13612,7 +13838,7 @@ class Room extends Emitter {
|
|
|
13612
13838
|
const participant = this._getParticipantFromCallId(status.callId);
|
|
13613
13839
|
|
|
13614
13840
|
if (participant) {
|
|
13615
|
-
// we're
|
|
13841
|
+
// we're receiving, so no need to broadcast
|
|
13616
13842
|
participant.updateStatus(status, false);
|
|
13617
13843
|
}
|
|
13618
13844
|
break;
|
|
@@ -13879,7 +14105,7 @@ class SipRoom extends Room {
|
|
|
13879
14105
|
logger.info('connecting to sip room', { extension, audioOnly, room: !!room });
|
|
13880
14106
|
|
|
13881
14107
|
if (!room) {
|
|
13882
|
-
await Wazo.Phone.connect();
|
|
14108
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
13883
14109
|
|
|
13884
14110
|
const withCamera = constraints && !!constraints.video;
|
|
13885
14111
|
|
|
@@ -442,6 +442,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
442
442
|
return fixed;
|
|
443
443
|
};
|
|
444
444
|
|
|
445
|
+
const addIcesInAllBundles = (sdp ) => {
|
|
446
|
+
const parsedSdp = sdpParser.parse(sdp);
|
|
447
|
+
|
|
448
|
+
const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
|
|
449
|
+
if (!mediaWithCandidate) {
|
|
450
|
+
return sdp;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
const { candidates } = mediaWithCandidate;
|
|
454
|
+
|
|
455
|
+
parsedSdp.media = parsedSdp.media.map(media => ({
|
|
456
|
+
...media,
|
|
457
|
+
candidates: media.candidates || candidates,
|
|
458
|
+
}));
|
|
459
|
+
|
|
460
|
+
return sdpParser.write(parsedSdp);
|
|
461
|
+
};
|
|
462
|
+
|
|
445
463
|
/* global RTCSessionDescriptionInit, navigator */
|
|
446
464
|
|
|
447
465
|
const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
|
|
@@ -571,7 +589,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
|
|
|
571
589
|
|
|
572
590
|
// Check if we got ICEs
|
|
573
591
|
if (sdp.indexOf('a=candidate') !== -1) {
|
|
574
|
-
return
|
|
592
|
+
return {
|
|
593
|
+
type: description.type,
|
|
594
|
+
sdp: addIcesInAllBundles(sdp),
|
|
595
|
+
};
|
|
575
596
|
}
|
|
576
597
|
|
|
577
598
|
wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
|