@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/lib/index.js
CHANGED
|
@@ -2657,6 +2657,70 @@ class ExternalApp {
|
|
|
2657
2657
|
|
|
2658
2658
|
//
|
|
2659
2659
|
|
|
2660
|
+
class MeetingAuthorization {
|
|
2661
|
+
|
|
2662
|
+
|
|
2663
|
+
|
|
2664
|
+
|
|
2665
|
+
|
|
2666
|
+
|
|
2667
|
+
constructor({
|
|
2668
|
+
meetingUuid,
|
|
2669
|
+
uuid,
|
|
2670
|
+
userUuid,
|
|
2671
|
+
userName,
|
|
2672
|
+
} = {}) {
|
|
2673
|
+
this.meetingUuid = meetingUuid;
|
|
2674
|
+
this.uuid = uuid;
|
|
2675
|
+
this.userUuid = userUuid;
|
|
2676
|
+
this.userName = userName;
|
|
2677
|
+
}
|
|
2678
|
+
|
|
2679
|
+
setStatus(status ) {
|
|
2680
|
+
this.status = status;
|
|
2681
|
+
}
|
|
2682
|
+
|
|
2683
|
+
getStatus() {
|
|
2684
|
+
return this.status;
|
|
2685
|
+
}
|
|
2686
|
+
|
|
2687
|
+
static parse(plain ) {
|
|
2688
|
+
const {
|
|
2689
|
+
meeting_uuid: meetingUuid,
|
|
2690
|
+
uuid,
|
|
2691
|
+
guest_uuid: userUuid,
|
|
2692
|
+
guest_name: userName,
|
|
2693
|
+
} = plain;
|
|
2694
|
+
|
|
2695
|
+
return new MeetingAuthorization({
|
|
2696
|
+
meetingUuid,
|
|
2697
|
+
uuid,
|
|
2698
|
+
userUuid,
|
|
2699
|
+
userName,
|
|
2700
|
+
});
|
|
2701
|
+
}
|
|
2702
|
+
|
|
2703
|
+
static parseMany(items ) {
|
|
2704
|
+
if (!items) {
|
|
2705
|
+
return [];
|
|
2706
|
+
}
|
|
2707
|
+
return items.map(MeetingAuthorization.parse);
|
|
2708
|
+
}
|
|
2709
|
+
}
|
|
2710
|
+
|
|
2711
|
+
//
|
|
2712
|
+
|
|
2713
|
+
|
|
2714
|
+
|
|
2715
|
+
|
|
2716
|
+
|
|
2717
|
+
|
|
2718
|
+
|
|
2719
|
+
|
|
2720
|
+
|
|
2721
|
+
|
|
2722
|
+
|
|
2723
|
+
|
|
2660
2724
|
|
|
2661
2725
|
|
|
2662
2726
|
|
|
@@ -2667,6 +2731,7 @@ class ExternalApp {
|
|
|
2667
2731
|
|
|
2668
2732
|
|
|
2669
2733
|
|
|
2734
|
+
|
|
2670
2735
|
|
|
2671
2736
|
|
|
2672
2737
|
class Meeting {
|
|
@@ -2681,6 +2746,8 @@ class Meeting {
|
|
|
2681
2746
|
|
|
2682
2747
|
|
|
2683
2748
|
|
|
2749
|
+
|
|
2750
|
+
|
|
2684
2751
|
|
|
2685
2752
|
static parse(plain ) {
|
|
2686
2753
|
return new Meeting({
|
|
@@ -2693,6 +2760,7 @@ class Meeting {
|
|
|
2693
2760
|
extension: plain.exten,
|
|
2694
2761
|
persistent: plain.persistent,
|
|
2695
2762
|
creationTime: moment__default['default'](plain.creation_time).toDate(),
|
|
2763
|
+
requireAuthorization: plain.require_authorization,
|
|
2696
2764
|
});
|
|
2697
2765
|
}
|
|
2698
2766
|
|
|
@@ -2717,6 +2785,7 @@ class Meeting {
|
|
|
2717
2785
|
extension,
|
|
2718
2786
|
persistent,
|
|
2719
2787
|
creationTime,
|
|
2788
|
+
requireAuthorization,
|
|
2720
2789
|
} = {}) {
|
|
2721
2790
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2722
2791
|
this.uri = uri;
|
|
@@ -2727,6 +2796,7 @@ class Meeting {
|
|
|
2727
2796
|
this.extension = extension;
|
|
2728
2797
|
this.persistent = persistent;
|
|
2729
2798
|
this.creationTime = creationTime;
|
|
2799
|
+
this.requireAuthorization = requireAuthorization;
|
|
2730
2800
|
|
|
2731
2801
|
// Useful to compare instead of instanceof with minified code
|
|
2732
2802
|
this.type = 'Meeting';
|
|
@@ -2737,8 +2807,32 @@ class Meeting {
|
|
|
2737
2807
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
2738
2808
|
return { username, secret };
|
|
2739
2809
|
}
|
|
2810
|
+
|
|
2740
2811
|
}
|
|
2741
2812
|
|
|
2813
|
+
//
|
|
2814
|
+
|
|
2815
|
+
const camelToUnderscore = (key ) => {
|
|
2816
|
+
if (typeof key !== 'string') {
|
|
2817
|
+
throw new Error('Input is not a string');
|
|
2818
|
+
}
|
|
2819
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
2820
|
+
};
|
|
2821
|
+
|
|
2822
|
+
//
|
|
2823
|
+
|
|
2824
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
2825
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
2826
|
+
throw new Error('Input is not an object');
|
|
2827
|
+
}
|
|
2828
|
+
|
|
2829
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
2830
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
2831
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
2832
|
+
return acc;
|
|
2833
|
+
}, {});
|
|
2834
|
+
};
|
|
2835
|
+
|
|
2742
2836
|
/* */
|
|
2743
2837
|
|
|
2744
2838
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -2807,8 +2901,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2807
2901
|
getMyMeetings: () =>
|
|
2808
2902
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2809
2903
|
|
|
2810
|
-
createMyMeeting: (
|
|
2811
|
-
client
|
|
2904
|
+
createMyMeeting: (args ) =>
|
|
2905
|
+
client
|
|
2906
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
2907
|
+
.then(Meeting.parse),
|
|
2908
|
+
|
|
2909
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
2910
|
+
client.put(
|
|
2911
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
2912
|
+
convertKeysFromCamelToUnderscore(data),
|
|
2913
|
+
null,
|
|
2914
|
+
ApiRequester.successResponseParser,
|
|
2915
|
+
),
|
|
2812
2916
|
|
|
2813
2917
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2814
2918
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -2816,8 +2920,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2816
2920
|
getMeeting: (meetingUuid ) =>
|
|
2817
2921
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2818
2922
|
|
|
2923
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
2924
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
2925
|
+
|
|
2926
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
2927
|
+
client.put(
|
|
2928
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
2929
|
+
{},
|
|
2930
|
+
null,
|
|
2931
|
+
ApiRequester.successResponseParser,
|
|
2932
|
+
),
|
|
2933
|
+
|
|
2934
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
2935
|
+
client.put(
|
|
2936
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
2937
|
+
{},
|
|
2938
|
+
null,
|
|
2939
|
+
ApiRequester.successResponseParser,
|
|
2940
|
+
),
|
|
2941
|
+
|
|
2819
2942
|
guestGetMeeting: (meetingUuid ) =>
|
|
2820
2943
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2944
|
+
|
|
2945
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
2946
|
+
client
|
|
2947
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
2948
|
+
.then(MeetingAuthorization.parse),
|
|
2949
|
+
|
|
2950
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
2951
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
2952
|
+
|
|
2821
2953
|
});
|
|
2822
2954
|
|
|
2823
2955
|
//
|
|
@@ -3083,6 +3215,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3083
3215
|
|
|
3084
3216
|
|
|
3085
3217
|
|
|
3218
|
+
|
|
3086
3219
|
|
|
3087
3220
|
|
|
3088
3221
|
|
|
@@ -3093,6 +3226,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3093
3226
|
|
|
3094
3227
|
|
|
3095
3228
|
|
|
3229
|
+
|
|
3096
3230
|
|
|
3097
3231
|
|
|
3098
3232
|
|
|
@@ -3121,6 +3255,7 @@ class Call {
|
|
|
3121
3255
|
|
|
3122
3256
|
|
|
3123
3257
|
|
|
3258
|
+
|
|
3124
3259
|
|
|
3125
3260
|
|
|
3126
3261
|
|
|
@@ -3145,6 +3280,7 @@ class Call {
|
|
|
3145
3280
|
calleeNumber: plain.peer_caller_id_number,
|
|
3146
3281
|
dialedExtension: plain.dialed_extension,
|
|
3147
3282
|
isCaller: plain.is_caller,
|
|
3283
|
+
isVideo: plain.is_video,
|
|
3148
3284
|
muted: plain.muted,
|
|
3149
3285
|
onHold: plain.on_hold,
|
|
3150
3286
|
status: plain.status,
|
|
@@ -3168,6 +3304,7 @@ class Call {
|
|
|
3168
3304
|
calleeNumber,
|
|
3169
3305
|
dialedExtension,
|
|
3170
3306
|
isCaller,
|
|
3307
|
+
isVideo,
|
|
3171
3308
|
lineId,
|
|
3172
3309
|
muted,
|
|
3173
3310
|
onHold,
|
|
@@ -3191,6 +3328,7 @@ class Call {
|
|
|
3191
3328
|
this.startingTime = startingTime;
|
|
3192
3329
|
this.talkingToIds = talkingToIds || [];
|
|
3193
3330
|
this.recording = recording;
|
|
3331
|
+
this.isVideo = !!isVideo;
|
|
3194
3332
|
|
|
3195
3333
|
// Useful to compare instead of instanceof with minified code
|
|
3196
3334
|
this.type = 'Call';
|
|
@@ -3664,7 +3802,7 @@ class CallSession {
|
|
|
3664
3802
|
ringing: call.isRinging(),
|
|
3665
3803
|
answered: call.isUp(),
|
|
3666
3804
|
answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
|
|
3667
|
-
cameraEnabled:
|
|
3805
|
+
cameraEnabled: call.isVideo,
|
|
3668
3806
|
dialedExtension: call.dialedExtension,
|
|
3669
3807
|
call,
|
|
3670
3808
|
conference: false, // @FIXME?
|
|
@@ -5163,6 +5301,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
5163
5301
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
5164
5302
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
5165
5303
|
|
|
5304
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
5305
|
+
client.delete(
|
|
5306
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
5307
|
+
null,
|
|
5308
|
+
null,
|
|
5309
|
+
ApiRequester.successResponseParser,
|
|
5310
|
+
),
|
|
5311
|
+
|
|
5166
5312
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
5167
5313
|
|
|
5168
5314
|
mute: (callId ) =>
|
|
@@ -5730,6 +5876,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
5730
5876
|
return fixed;
|
|
5731
5877
|
};
|
|
5732
5878
|
|
|
5879
|
+
const addIcesInAllBundles = (sdp ) => {
|
|
5880
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
5881
|
+
|
|
5882
|
+
const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
|
|
5883
|
+
if (!mediaWithCandidate) {
|
|
5884
|
+
return sdp;
|
|
5885
|
+
}
|
|
5886
|
+
|
|
5887
|
+
const { candidates } = mediaWithCandidate;
|
|
5888
|
+
|
|
5889
|
+
parsedSdp.media = parsedSdp.media.map(media => ({
|
|
5890
|
+
...media,
|
|
5891
|
+
candidates: media.candidates || candidates,
|
|
5892
|
+
}));
|
|
5893
|
+
|
|
5894
|
+
return sdpParser__default['default'].write(parsedSdp);
|
|
5895
|
+
};
|
|
5896
|
+
|
|
5733
5897
|
/* global RTCSessionDescriptionInit, navigator */
|
|
5734
5898
|
|
|
5735
5899
|
const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
|
|
@@ -5859,7 +6023,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
5859
6023
|
|
|
5860
6024
|
// Check if we got ICEs
|
|
5861
6025
|
if (sdp.indexOf('a=candidate') !== -1) {
|
|
5862
|
-
return
|
|
6026
|
+
return {
|
|
6027
|
+
type: description.type,
|
|
6028
|
+
sdp: addIcesInAllBundles(sdp),
|
|
6029
|
+
};
|
|
5863
6030
|
}
|
|
5864
6031
|
|
|
5865
6032
|
wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
|
|
@@ -7319,41 +7486,58 @@ class WebRTCClient extends Emitter {
|
|
|
7319
7486
|
});
|
|
7320
7487
|
}
|
|
7321
7488
|
|
|
7322
|
-
changeAudioInputDevice(id , session ) {
|
|
7489
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
7323
7490
|
const currentId = this.getAudioDeviceId();
|
|
7324
7491
|
logger$9.info('setting audio input device', { id, currentId, session: !!session });
|
|
7325
7492
|
|
|
7326
|
-
if (id === currentId) {
|
|
7493
|
+
if (!force && id === currentId) {
|
|
7327
7494
|
return null;
|
|
7328
7495
|
}
|
|
7329
7496
|
|
|
7497
|
+
// in order to handle an audio track change for default devices
|
|
7498
|
+
// we need the actual id of the device (not 'default')
|
|
7499
|
+
let deviceId = id;
|
|
7500
|
+
if (id === 'default' && navigator.mediaDevices) {
|
|
7501
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
7502
|
+
const defaultDevice = devices.find(device => device.deviceId === 'default');
|
|
7503
|
+
if (defaultDevice) {
|
|
7504
|
+
const deviceLabel = defaultDevice.label.replace('Default - ', '');
|
|
7505
|
+
const targetDevice = devices.find(device => device.label === deviceLabel);
|
|
7506
|
+
if (targetDevice) {
|
|
7507
|
+
deviceId = targetDevice.deviceId;
|
|
7508
|
+
if (!force && deviceId === currentId) {
|
|
7509
|
+
return null;
|
|
7510
|
+
}
|
|
7511
|
+
}
|
|
7512
|
+
}
|
|
7513
|
+
}
|
|
7514
|
+
|
|
7330
7515
|
// let's update the local audio value
|
|
7331
7516
|
if (this.audio) {
|
|
7332
7517
|
this.audio = {
|
|
7333
7518
|
deviceId: {
|
|
7334
|
-
exact:
|
|
7519
|
+
exact: deviceId,
|
|
7335
7520
|
},
|
|
7336
7521
|
};
|
|
7337
7522
|
}
|
|
7338
7523
|
|
|
7339
|
-
if (session) {
|
|
7524
|
+
if (session && navigator.mediaDevices) {
|
|
7340
7525
|
const sdh = session.sessionDescriptionHandler;
|
|
7341
7526
|
const pc = sdh.peerConnection;
|
|
7342
7527
|
|
|
7343
|
-
|
|
7344
|
-
|
|
7345
|
-
|
|
7346
|
-
|
|
7528
|
+
const constraints = { audio: { deviceId: { exact: deviceId } } };
|
|
7529
|
+
const stream = await navigator.mediaDevices.getUserMedia(constraints);
|
|
7530
|
+
const audioTrack = stream.getAudioTracks()[0];
|
|
7531
|
+
const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
|
|
7347
7532
|
|
|
7348
|
-
|
|
7349
|
-
|
|
7350
|
-
|
|
7351
|
-
}
|
|
7352
|
-
sender.replaceTrack(audioTrack);
|
|
7533
|
+
if (sender) {
|
|
7534
|
+
if (sender.track) {
|
|
7535
|
+
audioTrack.enabled = sender.track.enabled;
|
|
7353
7536
|
}
|
|
7537
|
+
sender.replaceTrack(audioTrack);
|
|
7538
|
+
}
|
|
7354
7539
|
|
|
7355
|
-
|
|
7356
|
-
});
|
|
7540
|
+
return stream;
|
|
7357
7541
|
}
|
|
7358
7542
|
}
|
|
7359
7543
|
|
|
@@ -7373,14 +7557,14 @@ class WebRTCClient extends Emitter {
|
|
|
7373
7557
|
return null;
|
|
7374
7558
|
}
|
|
7375
7559
|
|
|
7376
|
-
// let's
|
|
7377
|
-
|
|
7378
|
-
|
|
7379
|
-
|
|
7380
|
-
|
|
7381
|
-
|
|
7382
|
-
}
|
|
7383
|
-
}
|
|
7560
|
+
// let's make sure we don't lose other video constraints settings -- width, height, frameRate...
|
|
7561
|
+
const videoObject = typeof this.video === 'object' ? this.video : {};
|
|
7562
|
+
this.video = {
|
|
7563
|
+
...videoObject,
|
|
7564
|
+
deviceId: {
|
|
7565
|
+
exact: id,
|
|
7566
|
+
},
|
|
7567
|
+
};
|
|
7384
7568
|
}
|
|
7385
7569
|
|
|
7386
7570
|
changeSessionVideoInputDevice(id , session ) {
|
|
@@ -8553,6 +8737,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
|
|
|
8553
8737
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
8554
8738
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
8555
8739
|
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
8740
|
+
const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
|
|
8556
8741
|
|
|
8557
8742
|
const BLACKLIST_EVENTS = [
|
|
8558
8743
|
CHAT_MESSAGE_SENT,
|
|
@@ -8904,6 +9089,7 @@ WebSocketClient.eventLists = [
|
|
|
8904
9089
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
8905
9090
|
CONFERENCE_ADHOC_DELETED,
|
|
8906
9091
|
MEETING_USER_PROGRESS,
|
|
9092
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
8907
9093
|
];
|
|
8908
9094
|
|
|
8909
9095
|
var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
@@ -8975,6 +9161,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
|
8975
9161
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
8976
9162
|
CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
|
|
8977
9163
|
MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
|
|
9164
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
8978
9165
|
HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
|
|
8979
9166
|
'default': WebSocketClient
|
|
8980
9167
|
});
|
|
@@ -10020,10 +10207,10 @@ class WebRTCPhone extends Emitter {
|
|
|
10020
10207
|
this.audioRingVolume = volume;
|
|
10021
10208
|
}
|
|
10022
10209
|
|
|
10023
|
-
changeAudioInputDevice(id ) {
|
|
10210
|
+
changeAudioInputDevice(id , force ) {
|
|
10024
10211
|
logger$7.info('WebRTC phone - changeAudio input device', { deviceId: id });
|
|
10025
10212
|
|
|
10026
|
-
return this.client.changeAudioInputDevice(id, this.currentSipSession);
|
|
10213
|
+
return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
|
|
10027
10214
|
}
|
|
10028
10215
|
|
|
10029
10216
|
changeVideoInputDevice(id ) {
|
|
@@ -12755,6 +12942,7 @@ class Participant extends Emitter {
|
|
|
12755
12942
|
|
|
12756
12943
|
|
|
12757
12944
|
|
|
12945
|
+
|
|
12758
12946
|
|
|
12759
12947
|
|
|
12760
12948
|
|
|
@@ -12772,6 +12960,7 @@ class Participant extends Emitter {
|
|
|
12772
12960
|
|
|
12773
12961
|
|
|
12774
12962
|
|
|
12963
|
+
|
|
12775
12964
|
|
|
12776
12965
|
/**
|
|
12777
12966
|
* @param room Room The room where the participant is
|
|
@@ -12795,6 +12984,7 @@ class Participant extends Emitter {
|
|
|
12795
12984
|
this.screensharing = false;
|
|
12796
12985
|
this.isOnHold = false;
|
|
12797
12986
|
this.extra = extra;
|
|
12987
|
+
this.banned = false;
|
|
12798
12988
|
|
|
12799
12989
|
this.ON_UPDATED = 'participant/ON_UPDATED';
|
|
12800
12990
|
this.ON_START_TALKING = 'participant/ON_START_TALKING';
|
|
@@ -12811,6 +13001,7 @@ class Participant extends Emitter {
|
|
|
12811
13001
|
this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
|
|
12812
13002
|
this.ON_HOLD = 'participant/ON_HOLD';
|
|
12813
13003
|
this.ON_RESUME = 'participant/ON_RESUME';
|
|
13004
|
+
this.ON_BAN = 'participant/ON_BAN';
|
|
12814
13005
|
}
|
|
12815
13006
|
|
|
12816
13007
|
triggerEvent(name , ...args ) {
|
|
@@ -12851,6 +13042,10 @@ class Participant extends Emitter {
|
|
|
12851
13042
|
status.extra = this.extra;
|
|
12852
13043
|
break;
|
|
12853
13044
|
}
|
|
13045
|
+
case this.ON_BAN: {
|
|
13046
|
+
status.banned = true;
|
|
13047
|
+
break;
|
|
13048
|
+
}
|
|
12854
13049
|
}
|
|
12855
13050
|
|
|
12856
13051
|
if (broadcast) {
|
|
@@ -12953,6 +13148,11 @@ class Participant extends Emitter {
|
|
|
12953
13148
|
this.triggerUpdate(this.ON_RESUME, broadcast);
|
|
12954
13149
|
}
|
|
12955
13150
|
|
|
13151
|
+
onBan(broadcast = true) {
|
|
13152
|
+
this.banned = true;
|
|
13153
|
+
this.triggerUpdate(this.ON_BAN, broadcast);
|
|
13154
|
+
}
|
|
13155
|
+
|
|
12956
13156
|
getStatus() {
|
|
12957
13157
|
return {
|
|
12958
13158
|
callId: this.callId,
|
|
@@ -12999,6 +13199,10 @@ class Participant extends Emitter {
|
|
|
12999
13199
|
}
|
|
13000
13200
|
}
|
|
13001
13201
|
|
|
13202
|
+
if (status.banned) {
|
|
13203
|
+
this.onBan(false);
|
|
13204
|
+
}
|
|
13205
|
+
|
|
13002
13206
|
// Poor man's object comparison
|
|
13003
13207
|
if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
|
|
13004
13208
|
this.extra = { ...this.extra, ...status.extra };
|
|
@@ -13026,6 +13230,28 @@ class Participant extends Emitter {
|
|
|
13026
13230
|
this.streams = streams;
|
|
13027
13231
|
this.videoStreams = streams;
|
|
13028
13232
|
}
|
|
13233
|
+
|
|
13234
|
+
async ban(apiRequestDelay = null) {
|
|
13235
|
+
const { meetingUuid } = this.room;
|
|
13236
|
+
if (!meetingUuid) {
|
|
13237
|
+
throw new Error('Attempting to ban a participant without a `meetingUuid`');
|
|
13238
|
+
}
|
|
13239
|
+
|
|
13240
|
+
// this notifies all that someone is being banned
|
|
13241
|
+
this.onBan(true);
|
|
13242
|
+
|
|
13243
|
+
// this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
|
|
13244
|
+
if (apiRequestDelay) {
|
|
13245
|
+
await this.delay(apiRequestDelay);
|
|
13246
|
+
}
|
|
13247
|
+
|
|
13248
|
+
// proceed with the actual kick
|
|
13249
|
+
return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
|
|
13250
|
+
}
|
|
13251
|
+
|
|
13252
|
+
async delay(ms ) {
|
|
13253
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
13254
|
+
}
|
|
13029
13255
|
}
|
|
13030
13256
|
|
|
13031
13257
|
//
|
|
@@ -13178,7 +13404,7 @@ class Room extends Emitter {
|
|
|
13178
13404
|
logger$1.info('connecting to room', { extension, audioOnly, room: !!room });
|
|
13179
13405
|
|
|
13180
13406
|
if (!room) {
|
|
13181
|
-
await Wazo.Phone.connect();
|
|
13407
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
13182
13408
|
|
|
13183
13409
|
const withCamera = constraints && !!constraints.video;
|
|
13184
13410
|
|
|
@@ -13623,7 +13849,7 @@ class Room extends Emitter {
|
|
|
13623
13849
|
const participant = this._getParticipantFromCallId(status.callId);
|
|
13624
13850
|
|
|
13625
13851
|
if (participant) {
|
|
13626
|
-
// we're
|
|
13852
|
+
// we're receiving, so no need to broadcast
|
|
13627
13853
|
participant.updateStatus(status, false);
|
|
13628
13854
|
}
|
|
13629
13855
|
break;
|
|
@@ -13890,7 +14116,7 @@ class SipRoom extends Room {
|
|
|
13890
14116
|
logger.info('connecting to sip room', { extension, audioOnly, room: !!room });
|
|
13891
14117
|
|
|
13892
14118
|
if (!room) {
|
|
13893
|
-
await Wazo.Phone.connect();
|
|
14119
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
13894
14120
|
|
|
13895
14121
|
const withCamera = constraints && !!constraints.video;
|
|
13896
14122
|
|
|
@@ -452,6 +452,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
452
452
|
return fixed;
|
|
453
453
|
};
|
|
454
454
|
|
|
455
|
+
const addIcesInAllBundles = (sdp ) => {
|
|
456
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
457
|
+
|
|
458
|
+
const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
|
|
459
|
+
if (!mediaWithCandidate) {
|
|
460
|
+
return sdp;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
const { candidates } = mediaWithCandidate;
|
|
464
|
+
|
|
465
|
+
parsedSdp.media = parsedSdp.media.map(media => ({
|
|
466
|
+
...media,
|
|
467
|
+
candidates: media.candidates || candidates,
|
|
468
|
+
}));
|
|
469
|
+
|
|
470
|
+
return sdpParser__default['default'].write(parsedSdp);
|
|
471
|
+
};
|
|
472
|
+
|
|
455
473
|
/* global RTCSessionDescriptionInit, navigator */
|
|
456
474
|
|
|
457
475
|
const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
|
|
@@ -581,7 +599,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
581
599
|
|
|
582
600
|
// Check if we got ICEs
|
|
583
601
|
if (sdp.indexOf('a=candidate') !== -1) {
|
|
584
|
-
return
|
|
602
|
+
return {
|
|
603
|
+
type: description.type,
|
|
604
|
+
sdp: addIcesInAllBundles(sdp),
|
|
605
|
+
};
|
|
585
606
|
}
|
|
586
607
|
|
|
587
608
|
wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
|